* = $801 a = 8000 b = 8004 rs = 8006 ;decimal locations used by basic byte $07,$08,$02,$00,$99,$00,$1B,$08,$05,$00,$85,$22,$44,$49,$56,$49,$44,$45,$4E,$44,$3A byte $20,$22,$3B,$41,$00,$50,$08,$08,$00,$8B,$41,$B1,$28,$32,$AE,$33,$31,$29,$AB,$31,$B0 byte $20,$41,$B3,$30,$20,$A7,$20,$99,$20,$22,$56,$41,$4C,$55,$45,$20,$4F,$55,$54,$20,$4F byte $46,$20,$52,$41,$4E,$47,$45,$2E,$22,$3A,$99,$3A,$89,$20,$35,$00,$9C,$08,$09,$00,$41 byte $53,$B2,$B5,$28,$41,$AD,$32,$AE,$32,$34,$29,$3A,$41,$48,$B2,$B5,$28,$28,$41,$AB,$28 byte $41,$53,$AC,$32,$AE,$32,$34,$29,$29,$AD,$36,$35,$35,$33,$36,$29,$3A,$41,$4D,$B2,$B5 byte $28,$28,$41,$AB,$28,$41,$53,$AC,$32,$AE,$32,$34,$29,$AB,$41,$48,$AC,$36,$35,$35,$33 byte $36,$29,$AD,$32,$35,$36,$29,$00,$BF,$08,$0A,$00,$41,$4C,$B2,$28,$41,$AB,$41,$53,$AC byte $32,$AE,$32,$34,$AB,$41,$48,$AC,$36,$35,$35,$33,$36,$29,$AB,$41,$4D,$AC,$32,$35,$36 byte $00,$D3,$08,$14,$00,$85,$20,$22,$44,$49,$56,$49,$53,$4F,$52,$3A,$20,$22,$3B,$42,$00 byte $0F,$09,$16,$00,$8B,$20,$42,$20,$B1,$20,$28,$32,$AE,$31,$35,$29,$AB,$31,$20,$B0,$20 byte $42,$B3,$B2,$30,$20,$20,$A7,$20,$99,$20,$22,$56,$41,$4C,$55,$45,$20,$4F,$55,$54,$20 byte $4F,$46,$20,$52,$41,$4E,$47,$45,$2E,$22,$3A,$99,$3A,$89,$20,$32,$30,$00,$2B,$09,$19 byte $00,$42,$48,$B2,$B5,$28,$42,$AD,$32,$35,$36,$29,$3A,$42,$4C,$B2,$42,$AB,$32,$35,$36 byte $AC,$42,$48,$00,$55,$09,$1E,$00,$97,$20,$38,$30,$30,$30,$2C,$41,$53,$3A,$97,$38,$30 byte $30,$31,$2C,$41,$48,$3A,$97,$20,$38,$30,$30,$32,$2C,$41,$4D,$3A,$97,$38,$30,$30,$33 byte $2C,$41,$4C,$00,$6D,$09,$28,$00,$97,$20,$38,$30,$30,$34,$2C,$42,$48,$3A,$97,$20,$38 byte $30,$30,$35,$2C,$42,$4C,$00,$78,$09,$32,$00,$9E,$20,$32,$35,$34,$38,$00,$96,$09,$37 byte $00,$99,$20,$22,$52,$45,$53,$55,$4C,$54,$20,$4F,$46,$20,$44,$49,$56,$49,$53,$49,$4F byte $4E,$20,$22,$3A,$99,$00,$D2,$09,$3C,$00,$99,$20,$22,$4D,$4C,$3A,$20,$22,$3B,$C2,$28 byte $38,$30,$30,$36,$29,$AC,$32,$AE,$32,$34,$AA,$C2,$28,$38,$30,$30,$37,$29,$AC,$36,$35 byte $35,$33,$36,$AA,$C2,$28,$38,$30,$30,$38,$29,$AC,$32,$35,$36,$AA,$C2,$28,$38,$30,$30 byte $39,$29,$00,$EA,$09,$46,$00,$99,$20,$22,$42,$41,$53,$49,$43,$3A,$20,$22,$3B,$41,$AD byte $42,$3A,$99,$3A,$99,$00,$F2,$09,$50,$00,$89,$20,$35,$00,$00,$00 ; 31 bit by 15 bit divide (two billions etc... maximum value for a, 32767 for b) lda #$00 sta rs sta rs+1 ;rs = 0 sta rs+2 sta rs+3 sta k sta k+1 ;k = 0 sta k+2 sta k+3 lda a sta oa lda a+1 sta oa+1 ;oa = a lda a+2 sta oa+2 lda a+3 sta oa+3 lda a bmi skip_ab_check_close lda b bmi skip_ab_check_close ;exits if b >32767 or a > 2 billions etc... jmp label_40 skip_ab_check_close rts label_40 sec lda a+3 sbc k+3 sta a+3 lda a+2 sbc k+2 sta a+2 lda a+1 sbc k+1 sta a+1 lda a sbc k sta a ;a = a-k lda a cmp #$00 bcc label_50 bne label_48 lda a+1 cmp #$00 bcc label_50 bne label_48 lda a+2 cmp b bcc label_50 bne label_48 lda a+3 cmp b+1 bcc label_50 ;if a < b then goto 50 label_48 jsr routine_1000 clc lda rs+3 adc q+3 sta rs+3 lda rs+2 adc q+2 sta rs+2 lda rs+1 adc q+1 sta rs+1 lda rs adc q sta rs ;rs=rs+q jmp label_40 label_50 lda a cmp #$00 bne skip_ab_check lda a+1 cmp #$00 bne skip_ab_check lda a+2 cmp b bne skip_ab_check lda a+3 cmp b+1 beq inc_rs_low ;if a = b then rs = 1 skip_ab_check rts inc_rs_low inc rs+3 rts routine_1000 lda #$00 sta k lda #$00 sta k+1 lda b sta k+2 lda b+1 sta k+3 ;k = b lda b bne skip_b_0_check lda b+1 beq end ;return to caller of main program if b = 0 skip_b_0_check lda #$00 sta ct ;ct = 0 label_1010 asl k+3 rol k+2 rol k+1 rol k ;k = k * 2 lda k+3 bne skip_check_k lda k+2 bne skip_check_k lda k+1 bne skip_check_k lda k beq end ;if k = 0 (low and hi byte) then return to caller of main program ;overflow condition skip_check_k lda k cmp a bcc inc_ct bne label_1020 lda k+1 cmp a+1 bcc inc_ct bne label_1020 lda k+2 cmp a+2 bcc inc_ct bne label_1020 lda k+3 cmp a+3 bcc inc_ct label_1020 lsr k ror k+1 ror k+2 ror k+3 ;a = a/2 ldx ct lda power,x sta q inx lda power,x sta q+1 inx lda power,x sta q+2 inx lda power,x sta q+3 ; q = 2 ^ ct rts end pla pla rts inc_ct inc ct inc ct inc ct inc ct ;four times because power table is 32 bit jmp label_1010 power byte 0,0,0,1,0,0,0,2,0,0,0,4,0,0,0,8,0,0,0,16,0,0,0,32,0,0,0,64,0,0,0,128 byte 0,0,1,0,0,0,2,0,0,0,4,0,0,0,8,0,0,0,16,0,0,0,32,0,0,0,64,0,0,0,128,0 byte 0,1,0,0,0,2,0,0,0,4,0,0,0,8,0,0,0,16,0,0,0,32,0,0,0,64,0,0,0,128,0,0 byte 1,0,0,0,2,0,0,0,4,0,0,0,8,0,0,0,16,0,0,0,32,0,0,0,64,0,0,0,128,0,0,0 ct byte 0 q byte 0,0,0,0 k byte 0,0,0,0 oa byte 0,0,0,0 ;a byte 0,0,0,0 ;b byte 0,0 ;rs byte 0,0,0,0