+2006-08-08 Maarten Brock <sourceforge.brock AT dse.nl>
+
+ * device/lib/gbz80/asm_strings.s,
+ * device/lib/gbz80/crt0_rle.s,
+ * device/lib/gbz80/div.s,
+ * device/lib/gbz80/mul.s,
+ * device/lib/gbz80/shift.s,
+ * device/lib/z80/asm_strings.s,
+ * device/lib/z80/crt0_rle.s,
+ * device/lib/z80/div.s,
+ * device/lib/z80/mul.s,
+ * device/lib/z80/shift.s: changed to all lower case menmonics except the
+ flags which are all upper case
+
2006-08-07 Maarten Brock <sourceforge.brock AT dse.nl>
* as/z80/asm.h: made CASE_SENSITIVE 1
ld l,a
push de
-1$:
+1$:
ld a,(hl+)
ld (de),a
inc de
or a,a
- jr nz,1$
+ jr NZ,1$
pop de
ret
inc de
2$:
dec c
- jr nz,1$
+ jr NZ,1$
dec b
- jr nz,1$
+ jr NZ,1$
pop de
pop bc
ret
-; int strcmp(const char *s1, const char *s2)
+; int strcmp(const char *s1, const char *s2)
_strcmp::
lda hl,2(sp)
ld e,(hl)
ld l,a
jr 1$
-2$:
+2$:
ld a,(de)
sub (hl)
- jr nz,4$
+ jr NZ,4$
;; A == 0
cp (hl)
- jr z,3$
-1$:
+ jr Z,3$
+1$:
inc de
inc hl
jr 2$
ld de,#-1
5$:
ret
-
\ No newline at end of file
.area _CODE
-
+
;; Special RLE decoder used for initing global data
__initrleblock::
;; Pull the destination address out
ld c,l
ld b,h
-
+
;; Pop the return address
pop hl
1$:
inc hl
;; Negative means a run
bit 7,e
- jp z,2$
+ jp Z,2$
;; Code for expanding a run
ld a,(hl)
inc hl
ld (bc),a
inc bc
inc e
- jp nz,3$
+ jp NZ,3$
jp 1$
2$:
;; Zero means end of a block
xor a
or e
- jp z,4$
+ jp Z,4$
;; Code for expanding a block
-5$:
- ld a,(hl)
+5$:
+ ld a,(hl)
inc hl
ld (bc),a
inc bc
dec e
- jp nz,5$
+ jp NZ,5$
jp 1$
-4$:
+4$:
;; Push the return address back onto the stack
push hl
ret
;; Originally from GBDK by Pascal Felber.
.area _CODE
-__divschar_rrx_s::
+__divschar_rrx_s::
ld hl,#2+1
add hl,sp
-
+
ld e,(hl)
dec hl
ld l,(hl)
-
+
;; Fall through
__divschar_rrx_hds::
ld c,l
-
+
call .div8
ld e,c
ld d,b
-
+
ret
-
-__modschar_rrx_s::
+
+__modschar_rrx_s::
ld hl,#2+1
add hl,sp
-
+
ld e,(hl)
dec hl
ld l,(hl)
-
+
;; Fall through
__modschar_rrx_hds::
ld c,l
call .div8
;; Already in DE
-
+
ret
-__divsint_rrx_s::
+__divsint_rrx_s::
ld hl,#2+3
add hl,sp
-
+
ld d,(hl)
dec hl
ld e,(hl)
dec hl
ld l,(hl)
ld h,a
-
+
;; Fall through
__divsint_rrx_hds::
ld b,h
ld e,c
ld d,b
-
+
ret
-
+
__modsint_rrx_s::
ld hl,#2+3
add hl,sp
-
+
ld d,(hl)
dec hl
ld e,(hl)
call .div16
;; Already in DE
-
+
ret
;; Unsigned
-__divuchar_rrx_s::
+__divuchar_rrx_s::
ld hl,#2+1
add hl,sp
-
+
ld e,(hl)
dec hl
ld l,(hl)
-
+
;; Fall through
__divuchar_rrx_hds::
ld c,l
ld e,c
ld d,b
-
+
ret
-
-__moduchar_rrx_s::
+
+__moduchar_rrx_s::
ld hl,#2+1
add hl,sp
-
+
ld e,(hl)
dec hl
ld l,(hl)
-
+
;; Fall through
__moduchar_rrx_hds::
ld c,l
ret
-__divuint_rrx_s::
+__divuint_rrx_s::
ld hl,#2+3
add hl,sp
-
+
ld d,(hl)
dec hl
ld e,(hl)
ld e,c
ld d,b
-
+
ret
-
-__moduint_rrx_s::
+
+__moduint_rrx_s::
ld hl,#2+3
add hl,sp
-
+
ld d,(hl)
dec hl
ld e,(hl)
ld l,(hl)
ld h,a
;; Fall through
-
+
__moduint_rrx_hds::
ld b,h
ld c,l
call .divu16
;; Already in DE
-
+
ret
-
+
.div8::
.mod8::
- LD A,C ; Sign extend
- RLCA
- SBC A
- LD B,A
- LD A,E ; Sign extend
- RLCA
- SBC A
- LD D,A
+ ld a,c ; Sign extend
+ rlca
+ sbc a
+ ld b,a
+ ld a,e ; Sign extend
+ rlca
+ sbc a
+ ld d,a
; Fall through to .div16
-
+
;; 16-bit division
- ;;
+ ;;
;; Entry conditions
;; BC = dividend
;; DE = divisor
- ;;
+ ;;
;; Exit conditions
;; BC = quotient
;; DE = remainder
;; and divisor. Quotient is positive if signs are the same, negative
;; if signs are different
;; Remainder has same sign as dividend
- LD A,B ; Get high byte of dividend
- LD (.srem),A ; Save as sign of remainder
- XOR D ; Xor with high byte of divisor
- LD (.squot),A ; Save sign of quotient
+ ld a,b ; Get high byte of dividend
+ ld (.srem),a ; Save as sign of remainder
+ xor d ; Xor with high byte of divisor
+ ld (.squot),a ; Save sign of quotient
;; Take absolute value of divisor
- BIT 7,D
- JR Z,.chkde ; Jump if divisor is positive
- SUB A ; Substract divisor from 0
- SUB E
- LD E,A
- SBC A ; Propagate borrow (A=0xFF if borrow)
- SUB D
- LD D,A
+ bit 7,d
+ jr Z,.chkde ; Jump if divisor is positive
+ sub a ; Substract divisor from 0
+ sub e
+ ld e,a
+ sbc a ; Propagate borrow (A=0xFF if borrow)
+ sub d
+ ld d,a
;; Take absolute value of dividend
.chkde:
- BIT 7,B
- JR Z,.dodiv ; Jump if dividend is positive
- SUB A ; Substract dividend from 0
- SUB C
- LD C,A
- SBC A ; Propagate borrow (A=0xFF if borrow)
- SUB B
- LD B,A
+ bit 7,b
+ jr Z,.dodiv ; Jump if dividend is positive
+ sub a ; Substract dividend from 0
+ sub c
+ ld c,a
+ sbc a ; Propagate borrow (A=0xFF if borrow)
+ sub b
+ ld b,a
;; Divide absolute values
.dodiv:
- CALL .divu16
- RET C ; Exit if divide by zero
+ call .divu16
+ ret C ; Exit if divide by zero
;; Negate quotient if it is negative
- LD A,(.squot)
- AND #0x80
- JR Z,.dorem ; Jump if quotient is positive
- SUB A ; Substract quotient from 0
- SUB C
- LD C,A
- SBC A ; Propagate borrow (A=0xFF if borrow)
- SUB B
- LD B,A
+ ld a,(.squot)
+ and #0x80
+ jr Z,.dorem ; Jump if quotient is positive
+ sub a ; Substract quotient from 0
+ sub c
+ ld c,a
+ sbc a ; Propagate borrow (A=0xFF if borrow)
+ sub b
+ ld b,a
.dorem:
;; Negate remainder if it is negative
- LD A,(.srem)
- AND #0x80
- RET Z ; Return if remainder is positive
- SUB A ; Substract remainder from 0
- SUB E
- LD E,A
- SBC A ; Propagate remainder (A=0xFF if borrow)
- SUB D
- LD D,A
- RET
+ ld a,(.srem)
+ and #0x80
+ ret Z ; Return if remainder is positive
+ sub a ; Substract remainder from 0
+ sub e
+ ld e,a
+ sbc a ; Propagate remainder (A=0xFF if borrow)
+ sub d
+ ld d,a
+ ret
.divu8::
.modu8::
- LD B,#0x00
- LD D,B
+ ld b,#0x00
+ ld d,b
; Fall through to divu16
.divu16::
.modu16::
;; Check for division by zero
- LD A,E
- OR D
- JR NZ,.divide ; Branch if divisor is non-zero
- LD BC,#0x00 ; Divide by zero error
- LD D,B
- LD E,C
- SCF ; Set carry, invalid result
- RET
+ ld a,e
+ or d
+ jr NZ,.divide ; Branch if divisor is non-zero
+ ld bc,#0x00 ; Divide by zero error
+ ld d,b
+ ld e,c
+ scf ; Set carry, invalid result
+ ret
.divide:
- LD L,C ; L = low byte of dividend/quotient
- LD H,B ; H = high byte of dividend/quotient
- LD BC,#0x00 ; BC = remainder
- OR A ; Clear carry to start
- LD A,#16 ; 16 bits in dividend
+ ld l,c ; L = low byte of dividend/quotient
+ ld h,b ; H = high byte of dividend/quotient
+ ld bc,#0x00 ; BC = remainder
+ or a ; Clear carry to start
+ ld a,#16 ; 16 bits in dividend
.dvloop:
;; Shift next bit of quotient into bit 0 of dividend
;; Shift next MSB of dividend into LSB of remainder
;; HL holds remainder
;; Do a 32-bit left shift, shifting carry to L, L to H,
;; H to C, C to B
- LD (.dcnt),A
- RL L ; Carry (next bit of quotient) to bit 0
- RL H ; Shift remaining bytes
- RL C
- RL B ; Clears carry since BC was 0
+ ld (.dcnt),a
+ rl l ; Carry (next bit of quotient) to bit 0
+ rl h ; Shift remaining bytes
+ rl c
+ rl b ; Clears carry since BC was 0
;; If remainder is >= divisor, next bit of quotient is 1. This
;; bit goes to carry
- PUSH BC ; Save current remainder
- LD A,C ; Substract divisor from remainder
- SBC E
- LD C,A
- LD A,B
- SBC D
- LD B,A
- CCF ; Complement borrow so 1 indicates a
+ push bc ; Save current remainder
+ ld a,c ; Substract divisor from remainder
+ sbc e
+ ld c,a
+ ld a,b
+ sbc d
+ ld b,a
+ ccf ; Complement borrow so 1 indicates a
; successful substraction (this is the
; next bit of quotient)
- JR C,.drop ; Jump if remainder is >= dividend
- POP BC ; Otherwise, restore remainder
- JR .nodrop
+ jr C,.drop ; Jump if remainder is >= dividend
+ pop bc ; Otherwise, restore remainder
+ jr .nodrop
.drop:
- INC SP
- INC SP
+ inc sp
+ inc sp
.nodrop:
- LD A,(.dcnt)
- DEC A ; DEC does not affect carry flag
- JR NZ,.dvloop
+ ld a,(.dcnt)
+ dec a ; DEC does not affect carry flag
+ jr NZ,.dvloop
;; Shift last carry bit into quotient
- LD D,B ; DE = remainder
- LD E,C
- RL L ; Carry to L
- LD C,L ; C = low byte of quotient
- RL H
- LD B,H ; B = high byte of quotient
- OR A ; Clear carry, valid result
- RET
+ ld d,b ; DE = remainder
+ ld e,c
+ rl l ; Carry to L
+ ld c,l ; C = low byte of quotient
+ rl h
+ ld b,h ; B = high byte of quotient
+ or a ; Clear carry, valid result
+ ret
.area _BSS
;; Originally from GBDK by Pascal Felber.
-
+
.area _CODE
__mulschar_rrx_s::
ld e,(hl)
inc hl
- ld l,(hl)
+ ld l,(hl)
;; Fall through
__mulschar_rrx_hds::
;; Need to sign extend before going in.
ld c,l
-
+
ld a,l
rla
sbc a,a
ld e,(hl)
inc hl
- ld c,(hl)
+ ld c,(hl)
;; Clear the top
xor a
ld d,a
ld b,a
-
+
jp .mul16
__mulint_rrx_s::
;; Optimise for the case when this side has 8 bits of data or
;; less. This is often the case with support address calls.
or a
- jp nz,1$
+ jp NZ,1$
ld b,#8
ld a,c
add hl,hl
rl c
rla ;DLE 27/11/98
- jr nc,2$
+ jr NZ,2$
add hl,de
2$:
dec b
- jr nz,1$
+ jr NZ,1$
;; Return in DE
ld e,l
;;
-__rrulong_rrx_s::
+__rrulong_rrx_s::
ld hl,#2
add hl,sp
ld h,b
1$:
or a,a
- ret z
+ ret Z
rr h
rr l
dec a
jp 1$
-__rrslong_rrx_s::
+__rrslong_rrx_s::
ld hl,#2
add hl,sp
-
+
ld e,(hl)
inc hl
ld d,(hl)
ld h,b
1$:
or a,a
- ret z
+ ret Z
sra h
rr l
dec a
jp 1$
-
-__rlslong_rrx_s::
-__rlulong_rrx_s::
+
+__rlslong_rrx_s::
+__rlulong_rrx_s::
ld hl,#2
add hl,sp
-
+
ld e,(hl)
inc hl
ld d,(hl)
ld h,b
1$:
or a,a
- ret z
+ ret Z
rl e
rl d
rl l
rl h
- dec a
+ dec a
jp 1$
ld a,(bc)
ld (de),a
or a
- jp nz,1$
+ jp NZ,1$
ret
;; Notes on strcpy styles:
;; Can't use LDI as need to check for end of string.
;; Above also matches the z88dk version.
.endif
-
+
; void *memcpy(void *dest, const void *source, int count)
-_memcpy::
+_memcpy::
;; Fall through to correct type
-__memcpy_rrf_s::
+__memcpy_rrf_s::
ld a,#5
rst 0x08
-__memcpy_rrx_s::
+__memcpy_rrx_s::
;; Using LDIR
;; LDIR: do; *DE = *HL; HL++; BC--; while BC != 0
-
+
;; All registers are already saved.
pop iy ; iy = return address
pop de ; de = destination pointer
push de
ld a,b
or c
- jr z,1$
+ jr Z,1$
ldir
1$:
pop hl ; return hl = original destination pointer
jp (iy)
ret
-; int strcmp(const char *s1, const char *s2)
+; int strcmp(const char *s1, const char *s2)
_strcmp::
;; Fall through to the correct style
;; Fall through to correct type
-__strcmp_rrf_s::
+__strcmp_rrf_s::
ld a,#5
rst 0x08
-__strcmp_rrx_s::
+__strcmp_rrx_s::
ld hl,#2
add hl,sp
-
+
ld e,(hl)
inc hl
ld d,(hl)
inc hl
ld h,(hl)
ld l,a
-
-1$:
+
+1$:
ld a,(de)
sub (hl)
;; Normally not taken, so use a jr (12/7) instead of jp (10)
- jr nz,2$
+ jr NZ,2$
;; A == 0
cp (hl)
inc hl
;; Normally taken. Flag from the cp above.
jp nz,1$
-2$:
+2$:
;; Sign extend
ld l,a
rla
sbc a
ld h,a
ret
-
+
.area _CODE
-
+
;; Special RLE decoder used for initing global data
__initrleblock::
;; Pull the destination address out
ld c,l
ld b,h
-
+
;; Pop the return address
pop hl
1$:
inc hl
;; Negative means a run
bit 7,e
- jp z,2$
+ jp Z,2$
;; Code for expanding a run
ld a,(hl)
inc hl
ld (bc),a
inc bc
inc e
- jp nz,3$
+ jp NZ,3$
jp 1$
2$:
;; Zero means end of a block
xor a
or e
- jp z,4$
+ jp Z,4$
;; Code for expanding a block
-5$:
- ld a,(hl)
+5$:
+ ld a,(hl)
inc hl
ld (bc),a
inc bc
dec e
- jp nz,5$
+ jp NZ,5$
jp 1$
-4$:
+4$:
;; Push the return address back onto the stack
push hl
ret
- ;; Originally from GBDK by Pascal Felber.
- .area _CODE
+ ;; Originally from GBDK by Pascal Felber.
+ .area _CODE
-__divschar_rrx_s::
+__divschar_rrx_s::
ld hl,#2+1
add hl,sp
-
+
ld e,(hl)
dec hl
ld l,(hl)
-
+
;; Fall through
__divschar_rrx_hds::
ld c,l
-
+
call .div8
- ld l,c
+ ld l,c
ld h,b
-
- ret
-
-__modschar_rrx_s::
+
+ ret
+
+__modschar_rrx_s::
ld hl,#2+1
add hl,sp
-
+
ld e,(hl)
dec hl
ld l,(hl)
-
+
;; Fall through
__modschar_rrx_hds::
ld c,l
- call .div8
+ call .div8
- ld l,e
+ ld l,e
ld h,d
-
- ret
-__divsint_rrx_s::
+ ret
+
+__divsint_rrx_s::
ld hl,#2+3
add hl,sp
-
+
ld d,(hl)
dec hl
ld e,(hl)
dec hl
ld l,(hl)
ld h,a
-
+
;; Fall through
__divsint_rrx_hds::
- ld b,h
- ld c,l
+ ld b,h
+ ld c,l
+
+ call .div16
- call .div16
+ ld l,c
+ ld h,b
+
+ ret
- ld l,c
- ld h,b
-
- ret
-
__modsint_rrx_s::
ld hl,#2+3
add hl,sp
-
+
ld d,(hl)
dec hl
ld e,(hl)
;; Fall through
__modsint_rrx_hds::
- ld b,h
- ld c,l
+ ld b,h
+ ld c,l
- call .div16
+ call .div16
- ld l,e
- ld h,d
-
- ret
+ ld l,e
+ ld h,d
+
+ ret
- ;; Unsigned
-__divuchar_rrx_s::
+ ;; Unsigned
+__divuchar_rrx_s::
ld hl,#2+1
add hl,sp
-
+
ld e,(hl)
dec hl
ld l,(hl)
-
+
;; Fall through
__divuchar_rrx_hds::
ld c,l
- call .divu8
+ call .divu8
- ld l,c
+ ld l,c
ld h,b
-
- ret
-
-__moduchar_rrx_s::
+
+ ret
+
+__moduchar_rrx_s::
ld hl,#2+1
add hl,sp
-
+
ld e,(hl)
dec hl
ld l,(hl)
-
+
;; Fall through
__moduchar_rrx_hds::
ld c,l
- call .divu8
+ call .divu8
- ld l,e
+ ld l,e
ld h,d
ret
-__divuint_rrx_s::
+__divuint_rrx_s::
ld hl,#2+3
add hl,sp
-
+
ld d,(hl)
dec hl
ld e,(hl)
;; Fall through
__divuint_rrx_hds::
- ld b,h
- ld c,l
- call .divu16
-
- ld l,c
- ld h,b
-
- ret
-
-__moduint_rrx_s::
+ ld b,h
+ ld c,l
+ call .divu16
+
+ ld l,c
+ ld h,b
+
+ ret
+
+__moduint_rrx_s::
ld hl,#2+3
add hl,sp
-
+
ld d,(hl)
dec hl
ld e,(hl)
ld l,(hl)
ld h,a
;; Fall through
-
+
__moduint_rrx_hds::
- ld b,h
- ld c,l
+ ld b,h
+ ld c,l
+
+ call .divu16
+
+ ld l,e
+ ld h,d
- call .divu16
+ ret
- ld l,e
- ld h,d
-
- ret
-
.div8::
.mod8::
- LD A,C ; Sign extend
- RLCA
- SBC A
- LD B,A
- LD A,E ; Sign extend
- RLCA
- SBC A
- LD D,A
-
- ; Fall through to .div16
-
- ;; 16-bit division
- ;;
- ;; Entry conditions
- ;; BC = dividend
- ;; DE = divisor
- ;;
- ;; Exit conditions
- ;; BC = quotient
- ;; DE = remainder
- ;; If divisor is non-zero, carry=0
- ;; If divisor is 0, carry=1 and both quotient and remainder are 0
- ;;
- ;; Register used: AF,BC,DE,HL
+ ld a,c ; Sign extend
+ rlca
+ sbc a
+ ld b,a
+ ld a,e ; Sign extend
+ rlca
+ sbc a
+ ld d,a
+
+ ; Fall through to .div16
+
+ ;; 16-bit division
+ ;;
+ ;; Entry conditions
+ ;; BC = dividend
+ ;; DE = divisor
+ ;;
+ ;; Exit conditions
+ ;; BC = quotient
+ ;; DE = remainder
+ ;; If divisor is non-zero, carry=0
+ ;; If divisor is 0, carry=1 and both quotient and remainder are 0
+ ;;
+ ;; Register used: AF,BC,DE,HL
.div16::
.mod16::
- ;; Determine sign of quotient by xor-ing high bytes of dividend
- ;; and divisor. Quotient is positive if signs are the same, negative
- ;; if signs are different
- ;; Remainder has same sign as dividend
- LD A,B ; Get high byte of dividend
- LD (.srem),A ; Save as sign of remainder
- XOR D ; Xor with high byte of divisor
- LD (.squot),A ; Save sign of quotient
- ;; Take absolute value of divisor
- BIT 7,D
- jp Z,.chkde ; Jump if divisor is positive
- SUB A ; Substract divisor from 0
- SUB E
- LD E,A
- SBC A ; Propagate borrow (A=0xFF if borrow)
- SUB D
- LD D,A
- ;; Take absolute value of dividend
+ ;; Determine sign of quotient by xor-ing high bytes of dividend
+ ;; and divisor. Quotient is positive if signs are the same, negative
+ ;; if signs are different
+ ;; Remainder has same sign as dividend
+ ld a,b ; Get high byte of dividend
+ ld (.srem),a ; Save as sign of remainder
+ xor d ; Xor with high byte of divisor
+ ld (.squot),a ; Save sign of quotient
+ ;; Take absolute value of divisor
+ bit 7,d
+ jp Z,.chkde ; Jump if divisor is positive
+ sub a ; Substract divisor from 0
+ sub e
+ ld e,a
+ sbc a ; Propagate borrow (A=0xFF if borrow)
+ sub d
+ ld d,a
+ ;; Take absolute value of dividend
.chkde:
- BIT 7,B
- jp Z,.dodiv ; Jump if dividend is positive
- SUB A ; Substract dividend from 0
- SUB C
- LD C,A
- SBC A ; Propagate borrow (A=0xFF if borrow)
- SUB B
- LD B,A
- ;; Divide absolute values
+ bit 7,b
+ jp Z,.dodiv ; Jump if dividend is positive
+ sub a ; Substract dividend from 0
+ sub c
+ ld c,a
+ sbc a ; Propagate borrow (A=0xFF if borrow)
+ sub b
+ ld b,a
+ ;; Divide absolute values
.dodiv:
- CALL .divu16
- RET C ; Exit if divide by zero
- ;; Negate quotient if it is negative
- LD A,(.squot)
- AND #0x80
- jp Z,.dorem ; Jump if quotient is positive
- SUB A ; Substract quotient from 0
- SUB C
- LD C,A
- SBC A ; Propagate borrow (A=0xFF if borrow)
- SUB B
- LD B,A
+ call .divu16
+ ret C ; Exit if divide by zero
+ ;; Negate quotient if it is negative
+ ld a,(.squot)
+ and #0x80
+ jp Z,.dorem ; Jump if quotient is positive
+ sub a ; Substract quotient from 0
+ sub c
+ ld c,a
+ sbc a ; Propagate borrow (A=0xFF if borrow)
+ sub b
+ ld b,a
.dorem:
- ;; Negate remainder if it is negative
- LD A,(.srem)
- AND #0x80
- RET Z ; Return if remainder is positive
- SUB A ; Substract remainder from 0
- SUB E
- LD E,A
- SBC A ; Propagate remainder (A=0xFF if borrow)
- SUB D
- LD D,A
- RET
+ ;; Negate remainder if it is negative
+ ld a,(.srem)
+ and #0x80
+ ret Z ; Return if remainder is positive
+ sub a ; Substract remainder from 0
+ sub e
+ ld e,a
+ sbc a ; Propagate remainder (A=0xFF if borrow)
+ sub d
+ ld d,a
+ ret
.divu8::
.modu8::
- LD B,#0x00
- LD D,B
- ; Fall through to divu16
+ ld b,#0x00
+ ld d,b
+ ; Fall through to divu16
.divu16::
.modu16::
- ;; Check for division by zero
- LD A,E
- OR D
- jp NZ,.divide ; Branch if divisor is non-zero
- LD BC,#0x00 ; Divide by zero error
- LD D,B
- LD E,C
- SCF ; Set carry, invalid result
- RET
+ ;; Check for division by zero
+ ld a,e
+ or d
+ jp NZ,.divide ; Branch if divisor is non-zero
+ ld bc,#0x00 ; Divide by zero error
+ ld d,b
+ ld e,c
+ scf ; Set carry, invalid result
+ ret
.divide:
- ld hl,#0
-; LD L,C ; L = low byte of dividend/quotient
-; LD H,B ; H = high byte of dividend/quotient
-; LD BC,#0x00 ; BC = remainder
- OR A ; Clear carry to start
- ex af,af
- LD A,#16 ; 16 bits in dividend
+ ld hl,#0
+; ld l,c ; L = low byte of dividend/quotient
+; ld h,b ; H = high byte of dividend/quotient
+; ld bc,#0x00 ; BC = remainder
+ or a ; Clear carry to start
+ ex af,af
+ ld a,#16 ; 16 bits in dividend
.dvloop:
- ;; Shift next bit of quotient into bit 0 of dividend
- ;; Shift next MSB of dividend into LSB of remainder
- ;; BC holds both dividend and quotient. While we shift a bit from
- ;; MSB of dividend, we shift next bit of quotient in from carry
- ;; HL holds remainder
- ;; Do a 32-bit left shift, shifting carry to L, L to H,
- ;; H to C, C to B
- ex af,af'
- RL C ; Carry (next bit of quotient) to bit 0
- RL B ; Clears carry since BC was 0
- adc hl,hl
-
- ;; If remainder is >= divisor, next bit of quotient is 1. This
- ;; bit goes to carry
- PUSH HL ; Save current remainder
- sbc hl,de
-; LD A,C ; Substract divisor from remainder
-; SBC E
-; LD C,A
-; LD A,B
-; SBC D
-; LD B,A
- CCF ; Complement borrow so 1 indicates a
- ; successful substraction (this is the
- ; next bit of quotient)
- jp C,.drop ; Jump if remainder is >= dividend
- POP HL ; Otherwise, restore remainder
- jp .nodrop
+ ;; Shift next bit of quotient into bit 0 of dividend
+ ;; Shift next MSB of dividend into LSB of remainder
+ ;; BC holds both dividend and quotient. While we shift a bit from
+ ;; MSB of dividend, we shift next bit of quotient in from carry
+ ;; HL holds remainder
+ ;; Do a 32-bit left shift, shifting carry to L, L to H,
+ ;; H to C, C to B
+ ex af,af'
+ rl c ; Carry (next bit of quotient) to bit 0
+ rl b ; Clears carry since BC was 0
+ adc hl,hl
+
+ ;; If remainder is >= divisor, next bit of quotient is 1. This
+ ;; bit goes to carry
+ push hl ; Save current remainder
+ sbc hl,de
+; ld a,c ; Substract divisor from remainder
+; sbc e
+; ld c,a
+; ld a,b
+; sbc d
+; ld b,a
+ ccf ; Complement borrow so 1 indicates a
+ ; successful substraction (this is the
+ ; next bit of quotient)
+ jp C,.drop ; Jump if remainder is >= dividend
+ pop hl ; Otherwise, restore remainder
+ jp .nodrop
.drop:
- INC SP
- INC SP
+ inc sp
+ inc sp
.nodrop:
- ex af,af'
- DEC A ; DEC does not affect carry flag
- jp NZ,.dvloop
- ex af,af'
- ;; Shift last carry bit into quotient
- LD D,H ; DE = remainder
- LD E,L
- RL C ; Carry to L
-; LD C,L ; C = low byte of quotient
- RL B
-; LD B,H ; B = high byte of quotient
- OR A ; Clear carry, valid result
- RET
-
- .area _BSS
+ ex af,af'
+ dec a ; DEC does not affect carry flag
+ jp NZ,.dvloop
+ ex af,af'
+ ;; Shift last carry bit into quotient
+ ld d,h ; DE = remainder
+ ld e,l
+ rl c ; Carry to L
+; ld c,l ; C = low byte of quotient
+ rl b
+; ld b,h ; B = high byte of quotient
+ or a ; Clear carry, valid result
+ ret
+
+ .area _BSS
.srem:
- .ds 0x01 ; Sign of quotient
+ .ds 0x01 ; Sign of quotient
.squot:
- .ds 0x01 ; Sign of remainder
+ .ds 0x01 ; Sign of remainder
.dcnt:
- .ds 0x01 ; Counter for division
+ .ds 0x01 ; Counter for division
;; Optimise for the case when this side has 8 bits of data or
;; less. This is often the case with support address calls.
or a
- jp nz,1$
+ jp NZ,1$
ld b,#8
ld a,c
add hl,hl
rl c
rla ;DLE 27/11/98
- jr nc,2$
+ jr NC,2$
add hl,de
2$:
djnz 1$
;;
-__rrulong_rrx_s::
+__rrulong_rrx_s::
ld hl,#2+4
add hl,sp
-
+
ld c,(hl)
dec hl
ld d,(hl)
ld a,c
1$:
or a,a
- ret z
+ ret Z
rr d
rr e
dec a
jp 1$
-__rrslong_rrx_s::
+__rrslong_rrx_s::
ld hl,#2+4
add hl,sp
-
+
ld c,(hl)
dec hl
ld d,(hl)
ld a,c
1$:
or a,a
- ret z
+ ret Z
sra d
rr e
dec a
jp 1$
-
-__rlslong_rrx_s::
-__rlulong_rrx_s::
+
+__rlslong_rrx_s::
+__rlulong_rrx_s::
ld hl,#2+4
add hl,sp
-
+
ld c,(hl)
dec hl
ld d,(hl)
ld a,c
1$:
or a,a
- ret z
+ ret Z
rl l
rl h
rl e
rl d
- dec a
+ dec a
jp 1$