0% found this document useful (0 votes)
377 views24 pages

ZX81 Assembly

This document provides an introduction and guide to assembly language programming on the ZX81 home computer. It includes examples of short assembly language programs that demonstrate basic concepts like printing characters, moving a character on the screen, and performing mathematical operations like multiplication and division. The guide references additional online resources for further information on ZX81 assembly programming.

Uploaded by

derhornochse
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
377 views24 pages

ZX81 Assembly

This document provides an introduction and guide to assembly language programming on the ZX81 home computer. It includes examples of short assembly language programs that demonstrate basic concepts like printing characters, moving a character on the screen, and performing mathematical operations like multiplication and division. The guide references additional online resources for further information on ZX81 assembly programming.

Uploaded by

derhornochse
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 24

Assembly Language on the ZX81

An Updated Getting Started Guide

By
Timothy Swenson
http://home.comcast.net/~tasm/

ftp://ftp.worldofspectrum.org/pub/sinclair/books/
http://www.users.waitrose.com/~thunor/mmcoyzx81/index.html

notepad-plus-
plus.org
line0.asm
line1.asm
main.asm
sysvars.asm
charcode.asm

line0.asm
line1.asm main.asm
sysvars.asm
charcode.asm

LD A,1 ; start with 1


loop ; label used for jump
RST $10 ; PRINT
INC A ; increment A
CP 36 ; stop at 36
JP NZ,loop ; if not 36, then goto/jump to LOOP
RET ; Return to BASIC

10 LET A = 1
20 PRINT CHR$(A)
30 LET A = A + 1
40 IF A <> 36 THEN GOTO 20
50 STOP

main.asm

tasm -80 -b -s main.asm test.p

main.asm test.p
main.asm main.asm

eightyone.exe

test.p
test.p
rst $10

LD A,$08 ; grey square character


CALL PRINT ; print character

LD B,16
LD C,16
CALL PRINTAT ; set cursor to position 16,16

printat.asm.

LD A,$16
CALL hprint
LD A,$CD
CALL hprint
LD A,$FF
CALL hprint
RET

hprint PUSH AF ;store the original value of A for later


AND $F0 ; isolate the first digit
RRA
RRA
RRA
RRA
ADD A,$1C ; add 28 to the character code
CALL PRINT ;
POP AF ; retrieve original value of A
AND $0F ; isolate the second digit
ADD A,$1C ; add 28 to the character code
CALL PRINT
LD A,$00
CALL PRINT ; print a space character
RET

SQUARE .equ $08

LD A,SQUARE
CALL PRINT
.byte
line:

sysvar.asm _H

line

hello.asm:
LD HL,line ;load HL with address of line
pline LD A,(HL) ;load A with a character at HL
CP $ff ;The end of the string?
JP Z,end ;if so, then jump to end
CALL PRINT ;print character
INC HL ;increment HL to get to next character
JP pline ;jump to beginning of loop
end RET ;exit

line: .byte _H,_E,_L,_L,_O,$00,_W,_O,_R,_L,_D,$ff

LD B,10 ; Store Y in B
LD C,10 ; Store X in C
LD HL,($4030) ; Get T-ADDR
PUSH HL ;SAVE T-ADDR
LD A,$98 ;Less than $9E to plot
LD ($4030),A
CALL PLOT
POP HL
LD ($4030),HL ;RESTORE T-ADDR
RET

type.asm:

wait CALL KSCAN ; get a key from the keyboard


LD B,H
LD C,L
LD D,C
INC D
LD A,1 ; If no key entered
JR Z,wait ; then loop
CALL FINDCHAR ;Translate keyboard result to character
LD A,(HL) ; Put results into reg a
CP $18 ; Is character a / (slash)
JR Z,end ; If so, jump to END
CALL PRINT ; Print character
LD BC,$1200 ; Set pause to $1200
delay DEC BC ; Pause routine
LD A,B
OR C
JR NZ,delay

JP wait
end
RET
LD HL,$FFFF ; how long to pause
LD (FRAMES),HL ; store it in FRAMES
CALL PAUSE ;call the PAUSE routine

CALL SCROLL

CALL CLS

CALL CLS
ld hl,(D_FILE) ; Get start of display
ld c,22 ; line counter (22 lines)
LOOP1 inc hl ; get past EOL
ld b,32 ; character counter (32 rows)
LOOP2 ld (HL),$08 ; print grey square character
inc hl ; move to next print position
djnz LOOP2 ; Do it again until B=0
dec c ; next line
JR nz,LOOP1
DONE RET ; exit

CALL CLS
LD HL,(D_FILE) ; Get start of display
LD DE,screen ; Get start of string
inc hl ; get past first EOL
loop LD A,(DE)
CP $FF
JP Z,done
LD (HL),A ; print character stored in A
INC HL ; move to next print position
INC DE ; move to next character in string
JP loop
done RET ; exit

screen:

.byte _H,_E,_L,_L,_O,$00,_W,_O,_R,_L,_D,$FF
matt.west.co.tt/demoscene/zxpaintyone/

x_pos .byte 16
y_pos .byte 16

LD A,(x_pos)
LD B,A
LD A,(y_pos)

LD (x_pos),A
LD (y_pos),A
movechar.asm:

x_pos .byte 16
y_pos .byte 16

START LD A,(X_POS) ;Get starting location of Char


LD B,A
LD A,(Y_POS)
LD C,A
CALL PRINTAT ; set cusor to position 16,16
LD A,$08 ; grey square character
CALL PRINT ; print character
WAIT CALL KEYBOARD ; ROM call to read keyboard
LD B,H ; Get output from HL
LD C,L ; and put into B and C
LD D,C
INC D
LD a,01h
JR Z, WAIT
CALL DECODE ; ROM routine to get character
LD A,(HL) ; Get results of DECODE
CP $21 ; 5 or LEFT key
JP Z, LEFT
CP $22 ; 6 or DOWN key
JP Z, DOWN
CP $23 ; 7 or UP key
JP Z, UP
CP $24 ; 8 or RIGHT key
JP Z, RIGHT
CP $26 ; 0 or zero key (use to Quit)
JP Z, DONE
JP WAIT

LEFT LD A,(x_pos) ; print space at x_pos,y_pos


LD B,A
LD A,(y_pos)
LD C,A
CALL PRINTAT
LD A,00h
CALL PRINT
LD A,(x_pos) ; get x_pos
DEC A ; decrement it
LD (x_pos),A ; store x_pos
JP PAUSE
RIGHT LD A,(x_pos) ; print space at x_pos,y_pos
LD B,A
LD A,(y_pos)
LD C,A
CALL PRINTAT
LD A,00h
CALL PRINT
LD A,(x_pos) ; get x_pos
INC A ; increment it
LD (x_pos),A ; store x_pos
JP PAUSE1

UP LD A,(x_pos) ; print space at x_pos,y_pos


LD B,A
LD A,(y_pos)
LD C,A
CALL PRINTAT
LD A,00h
CALL PRINT
LD A,(y_pos) ; get y_pos
DEC A ; increment it
LD (y_pos),A ; store y_pos
JP PAUSE1

DOWN LD A,(x_pos) ; print space at x_pos,y_pos


LD B,A
LD A,(y_pos)
LD C,A
CALL PRINTAT
LD A,00h
CALL PRINT
LD A,(y_pos) ; get y_pos
INC A ; increment it
LD (y_pos),A ; store y_pos

PAUSE1 LD BC,$1200 ; Set pause to $1200


DELAY DEC BC ; Pause routine
LD A,B
OR C
JR NZ,DELAY ; loop until 0
JP START
DONE
RET ; Return to BASIC
LD B,X
LD C,X

multiply:
LD HL,0 ; zero out HL
LD A,B
CP 0 ; Is B zero?
RET Z ; If so, return and HL=0
LD A,C
CP 0 ; Is C zero?
RET Z ; If so, return and HL=0
LD D,0 ; Zero out D
LD E,C ; load C in E
loop:
ADD HL,DE
DJNZ loop
RET ; result is in HL

divide:
LD A,E
CP 0
RET Z
LD B,0
LD D,0
loop:
SBC HL,DE
INC B
JR NC,loop
DEC B

array: .byte 0,0,0,0,0,0,0,0

LD BC,4
DEC BC
LD HL,(array)
ADD HL,BC
LD A,(HL)
CALL PRINT
RET

array .byte _A,_B,_C,_D,_E,_F,_G


LD B,3 ; X into B
DEC B ; (x-1)
LD C,col
multiply: ; (x-1)*col
LD HL,0 ; zero out HL
LD A,B
CP 0 ; Is B zero?
RET Z ; If so, return and HL=0
LD A,C
CP 0 ; Is C zero?
RET Z ; If so, return and HL=0
LD D,0 ; Zero out D
LD E,C ; load C in E
loop:
ADD HL,DE ; add DE to HL, B times
DJNZ loop
; X * col is now in HL
LD DE,3 ; Y into DE
DEC DE ; (Y-1)
ADD HL,DE ; add result of multiplication and (Y-1)
LD DE,array ; Get start of array
ADD HL,DE ; add offset to array
LD A,(HL)
CALL PRINT
RET

array .byte _A,_B,_C,_D


.byte _E,_F,_G,_H
.byte _I,_J,_K,_L
.byte _M,_N,_O,_P
VERSN: DEFB 0
E_PPC: DEFW 2

KEYBOARD EQU $02BB


DECODE EQU $07BD

#define DEFB .BYTE


#define DEFW .WORD
#define DEFM .TEXT
#define ORG .ORG
#define EQU .EQU
DEFB .byte
CALL CLS

CALL KEYBOARD
LD B,H
LD C,L
CALL DECODE
LD A,(HL)

CALL FAST

LD BC,$0200
CALL PAUSE
LD B,11
LD C,11
LD HL,(T_ADDR) ;T_ADDR = $4030
PUSH HL ;SAVE T-ADDR
LD A,$98
LD (T_ADDR),A
CALL PLOT
POP HL
LD (T_ADDR),HL ;RESTORE T-ADDR

LD A,XX
CALL PRINT

LD B,$10
LD C,$10
CALL PRINTAT

CALL SCROLL

CALL SLOW
array1d.asm - test of 1 dim array
array2d.asm - test of 2 dim array
divide.asm - test of division
hello.asm - Hello World
hexprt.asm - print hex number
movechar.asm - Keyboard input, PRINT AT
multiply.asm - test of mulitplication
pause.asm - Testing PAUSE call
plot.asm - PLOT and UNPLOT
print.asm - PRINT
printat.asm - PRINT AT
rnd.asm - Simple random number generator
screen1.asm - Write directly to screen
screen2.asm - Write directly to screen with string
scroll.asm - Testing SCROLL call
type.asm - Keyboard input

You might also like