123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- .define Dvi2, Div, Duv
- .sect .text
- .sect .rom
- .sect .data
- .sect .bss
- .sect .text
- ! The subroutine Dvi2 performs a signed division.
- ! Its operands are on the stack.
- ! The subroutine Div performs also a signed division, ecxept that
- ! its operand are already in zeropage.
- ! The subroutine Duv performs a n unsigned division.
- ! For an explanation of the algoritm used see
- ! A. S. Tanenbaum's Structered Computer Organisation. 1976
- Dvi2:
- stx ARTH
- sta ARTH+1 ! store divisor
- jsr Pop
- stx ARTH+2
- sta ARTH+3 ! store dividend
- ldy #1
- sty UNSIGN ! used for result sign
- Div:
- ldy #0
- sty SIGN
- lda ARTH+1
- bpl 1f ! if divisor is negative
- ldx ARTH ! make it positive
- jsr Ngi2
- ldy #1
- sty SIGN
- stx ARTH
- sta ARTH+1
- 1: lda ARTH+3
- bpl 1f ! if dividend is negative
- ldx ARTH+2 ! make it positive
- jsr Ngi2
- pha
- lda SIGN
- eor #1 ! excusive or with sign of divisor
- sta SIGN
- lda #1
- sta NBYTES
- pla
- stx ARTH+2
- sta ARTH+3
- Duv:
- 1: ldy #0
- sty ARTH+4
- sty ARTH+5
- ldy #17
- 4: lda ARTH+5
- cmp ARTH+1
- bcc 1f ! no subtraction
- bne 2f ! divisor goes into dividend
- lda ARTH+4
- cmp ARTH
- bcc 1f ! no subtraction
- 2: sec ! divisor goes into dividend
- lda ARTH+4
- sbc ARTH
- sta ARTH+4
- lda ARTH+5
- sbc ARTH+1
- sta ARTH+5 ! subtract divisor from dividend
- sec
- rol ARTH+2 ! a subtraction so shift in a 1
- bne 3f
- 1: asl ARTH+2 ! no subtraction so shift in a 0
- 3: rol ARTH+3
- rol ARTH+4
- rol ARTH+5 ! shift dividend
- dey
- bne 4b
- ldx ARTH+2
- lda ARTH+3
- ldy UNSIGN ! is it an unsigned division
- beq 1f
- ldy SIGN ! is the result negative
- beq 1f
- jsr Ngi2
- 1: rts
|