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