title M80 FEATURES
subttl Macros, conditional assembly & repeat blocks
.z80
;.sfcond
IF1
.PRINTX Prvi prehod MACRO-80
PAGE <60>
ENDIF
CSEG
ENTRY START
START:
ld hl,1234
ld c,7
call divl
ret
; rutina deli HL register z C registrom,
;rezultat je v B ostanek pa v H registru
divl: ld a,c ;preveri ali je mo`na prekora~itev (OV)
dec a
sub h
ret c
ld b,0 ;nastavi kvocient na 0
dloop: sla b ;pomakni rezultat v levo za en bit
add hl,hl ;pomakni v levo tudi HL (divident)
ld a,h ;ali je MSB dividenta ve~ji od delitelja
cp c
jr c, nosub ;~e je potem
sub c ;od{tej od MSB dividenta delitelj
ld h,a
inc b ;in pove~aj rezultat za 1
nosub: ld a,l ;ali smo `e vse zdelili
cp 0
jr nz, dloop ;ponavljaj dokler ni LSB ni~en
ret
;podprogram mno`i BC in DE ter rezultat spravi v HL
mull: ld hl,0000 ;postavimo rezultat na 0
while: ld a,d
or e
ret z ;ce je de==0000 je mno`enje kon~ano
sra d ;pomakni drugi mno`itelj (DE) en bit v desno
rr e
jr nc,noadd ;~e je bit, ki je bil porinjen ven 1 (CY=1)
ld a,l ;potem pri{tej rezultatu prvi multiplikand
add a,c
ld l,a
ld a,b
adc a,h
ld h,a
noadd: sla c ;pomakni drugi multiplikand (BC) en bit v levo
rl b
jr while ;ponavljaj, dokler ne bo prvi multiplikand iz~rpan
FLAG EQU 3
IF FLAG GE 3
ld a,b
ENDIF
IFT FLAG NE 5
ld d,e
ELSE
ld l,a
ENDIF
MOVW MACRO dest, sour
IFIDN <dest>,<HL>
IFIDN <sour>,<BC>
ld h,b
ld l,c
EXITM
ELSE
IFIDN <sour>,<DE>
ld h,d
ld l,e
EXITM
ELSE
IF2
ERROR Napacen izvor sour v MOVW
EXITM
ENDIF
ENDIF
ENDIF
ENDIF
IFIDN <dest>,<DE>
IFIDN <sour>,<BC>
ld d,b
ld e,c
EXITM
ELSE
IFIDN <sour>,<HL>
ld d,h
ld e,l
EXITM
ELSE
IF2
ERROR Napacen izvor sour v MOVW
EXITM
ENDIF
ENDIF
ENDIF
ENDIF
IFIDN <dest>,<BC>
IFIDN <sour>,<DE>
ld b,d
ld c,e
EXITM
ELSE
IFIDN <sour>,<HL>
ld b,h
ld c,l
EXITM
ELSE
IF2
ERROR Napacen izvor sour v MOVW
ENDIF
ENDIF
ENDIF
ENDIF
ENDM
MOVW HL,BC
REPT 4
RRA
ENDM
IRP x,<AF, BC, DE, HL>
push x
ENDM
IRPC x,<ABCDE>
ld x,0
ENDM
END