Moins,
ich lerne grade Z80-Assembler am Beispiel eines ROM-Monitors fuer meinen Z80-Selbstbau.
Dabei stosse ich hin&wieder auf Fragen wie man bestimmt Dinge am besten in Z80-Assembler implementiert.
Aktuell: Ich habe eine Kopierfunktion die bekommt drei Adressen uebergeben (Start, Ende und Ziel) und soll jetzt von Start bis Ende laufen.
Wie kann ich am besten das Endekriterium abfragen? Ich habe keine Moeglichkeit gefunden zwei 16-Bit Register mit einander zu vergleichen.
Meine derzeitige Loesung siehtwie unten aus, geht das eleganter? ![]()
Code
; ==========
; USAGE: c <SADDR> <EADDR> <DADDR> = copy bytes from SADDR-EADDR to DADDR
; saddr = BC
; eaddr = DE
; daddr = HL
monitor_copy:
ld a,(hl) ; load second char
CP SPACE ; check if SPACE
jp nz,monitor_usage ; nope -> no parameters?
inc hl ; parameter start
call console_gethex16 ; read addr to
jp c,monitor_usage ; conversion error->usage
push bc ; put saddr to stack
ld a,(hl) ; load next char
CP SPACE ; check if SPACE
jr nz,mc.error1 ; nope -> no parameters?
inc hl ; parameter start
call console_gethex16 ; read addr to
jr c,mc.error1 ; conversion error->usage
push bc ; put eaddr to stack
ld a,(hl) ; load next char
CP SPACE ; check if SPACE
jr nz,mc.error2 ; nope -> no parameters?
inc hl ; parameter start
call console_gethex16 ; read addr to
jr c,mc.error2 ; conversion error->usage
ld h,b ; put daddr to HL
ld l,c
pop de ; get other parameters
pop bc
mc.loop:
ld a,b ; compare upper address bytes
cp d
jr nz,mc.cont ; not equal -> continue
ld a,c ; compare lower address bytes
cp e
jr nz,mc.cont ; not equal -> continue
jp monitor ; both equal -> end reached
mc.cont:
ld a,(bc) ; load byte
ld (hl),a ; store at dest
inc bc ; increment pointers
inc hl
jr mc.loop ; next
mc.error2:
pop bc ; pop second parameter
mc.error1:
pop bc ; pop first parameter
jp monitor_usage
Alles anzeigen