ORCA-Pascal/dag.asm

1 line
6.3 KiB
NASM
Raw Normal View History

mcopy dag.macros **************************************************************** * * function udiv(x,y: longint): longint; * * Inputs: * num1 - numerator * num2 - denominator * * Outputs: * ans - result * **************************************************************** * udiv start ans equ 0 answer rem equ 4 remainder subroutine (4:num1,4:num2),8 ; ; Initialize ; stz rem rem = 0 stz rem+2 move4 num1,ans ans = num1 lda num2 check for division by zero ora num2+2 beq dv9 lda num2+2 do 16 bit divides separately ora ans+2 beq dv5 ; ; 32 bit divide ; ldy #32 32 bits to go dv3 asl ans roll up the next number rol ans+2 rol ans+4 rol ans+6 sec subtract for this digit lda ans+4 sbc num1 tax lda ans+6 sbc num2+2 bcc dv4 branch if minus stx ans+4 turn the bit on sta ans+6 inc ans dv4 dey next bit bne dv3 bra dv9 go do the sign ; ; 16 bit divide ; dv5 lda #0 initialize the remainder ldy #16 16 bits to go dv6 asl ans roll up the next number rol a sec subtract the digit sbc num2 bcs dv7 adc num2 digit is 0 dey bne dv6 bra dv8 dv7 inc ans digit is 1 dey bne dv6 dv8 sta ans+4 save the remainder ; ; Return the result ; dv9 return 4:ans move answer end **************************************************************** * * function umod(x,y: longint): longint; * * Inputs: * num1 - numerator * num2 - denominator * * Outputs: * ans+4 - result * **************************************************************** * umod start ans equ 0 answer rem equ 4 remainder subroutine (4:num1,4:num2),8 ; ; Initialize ; stz rem rem = 0 stz rem+2 move4 num1,ans ans = num1 lda num2 check for division by zero ora num2+2 beq dv9 lda num2+2 do 16 bit divides separately ora ans+2 beq dv5 ; ; 32 bit divide ; ldy #32 32 bits to go dv3 asl ans roll up the next number rol ans+2 rol ans+4 rol ans+6 sec subtract for this digit lda ans+4 sbc num1 tax lda ans+6 sbc num2+2 bcc dv4 branch if minus stx ans+4 turn the bit on sta ans+6 inc ans dv4 dey next bit bne dv3 bra dv9 go do the sign ; ; 16 bit divide ; dv5 lda #0 initialize the remainder ldy #16 16 bits to go dv6 asl ans roll up the next number rol a sec subtract the digit sbc num2 bcs dv7 adc num2 digit is 0 dey bne dv6 bra dv8 dv7 inc ans digit is 1 dey bne dv6 dv8 sta ans+4 save the remainder ; ; R