📄 math.lib
字号:
;;; ARITHMETIC: Integer arithmetic routines.ClearX: ClearLoop: mov @R0, #0 inc R0 djnz R2, ClearLoopretCopyX: CopyLoop: mov A, @R1 inc R1 mov @R0, A inc R0 djnz R2, CopyLoopretCplX: CplLoop: mov A, @R0 cpl A mov @R0, A inc R0 djnz R2, CplLoopretRolX: clr CShiftX: ShiftLoop: mov A, @R0 rlc A mov @R0, A inc R0 djnz R2, ShiftLoopretLessX: clr C LessLoop: mov A, @R0 inc R0 subb A, @R1 inc R1 djnz R2, LessLoopretZeroX: clr C ZeroLoop: mov A, @R0 jnz NotZero inc R0 djnz R2, ZeroLoop setb CNotZero:retIncX: setb CCarryX: CarryLoop: mov A, @R0 addc A, #0 mov @R0, A inc R0 djnz R2, CarryLoopretDecX: setb CBorrowX: BorrowLoop: mov A, @R0 subb A, #0 mov @R0, A inc R0 djnz R2, BorrowLoopretAddX: clr C AddLoop: mov A, @R0 addc A, @R1 inc R1 mov @R0, A inc R0 djnz R2, AddLoopretSubbX: setb Csjmp SubtractLoopSubtractX: clr C SubtractLoop: mov A, @R0 subb A, @R1 inc R1 mov @R0, A inc R0 djnz R2, SubtractLoopretNegX: setb CNegLoop: mov A, @R0 cpl A addc A, #0 mov @R0, A inc R0djnz R2, NegLoopretInc10X: Inc10Loop: inc @R0 mov A, @R0 cjne A, #10, Inc10Break mov @R0, #0 inc R0 djnz R2, Inc10Loop Inc10Break:ret;;; Multiplication RoutinesSizeX equ 30h ;;; 1 byteSizeY equ 31h ;;; 1 byteArgX equ 32h ;;; 1 byteArgY equ 33h ;;; 1 byteArgZ equ 34h ;;; 1 byteMultiplyX: ;;; The new multiplication algorithm R5 is the carry. mov R5, #0MultiplyLoop: mov R0, ArgX mov A, @R0 mov R2, A inc ArgX ;;; R2 = *ArgX++; mov R0, ArgZ inc ArgZ ;;; R0 = ArgZ++; mov R1, ArgY mov R3, SizeY mov R4, #0 jz BreakCarry MulNibble: mov A, R2 mov B, @R1 inc R1 mul AB ;;; B:A = *R1++ * R2; add A, R4 xch A, B addc A, #0 xch A, B ;;; B:A += R4; add A, @R0 mov @R0, A inc R0 mov A, B addc A, #0 mov R4, A ;;; R4:*R0++ = B:A + *R0; djnz R3, MulNibble mov R3, SizeX mov A, R4 CarryBy1: add A, @R0 mov @R0, A inc R0 ;;; C:*R0++ += *R0 + A; jnc BreakCarry mov A, #1 djnz R3, CarryBy1 inc R5BreakCarry:djnz SizeX, MultiplyLoopretMulByR1: ;;; R3:(@R0) = R1*(@R0); mov R3, #0 MulLoop: mov A, @R0 mov B, R1 mul AB add A, R3 mov @R0, A inc R0 mov A, B addc A, #0 mov R3, A djnz R2, MulLoopretOp equ 35h ;;; 8 bytesDivisor equ 3dh ;;; 8 bytesQuo equ 45h ;;; 8 bytesFract equ 4dh ;;; 8 bytesRem equ 55h ;;; 8 bytesDiv1: clr C mov R0, #Op mov R2, SizeX acall ShiftX ;;; C:Op = Op*2; mov R0, #Rem mov R2, SizeX acall ShiftX ;;; Rem = Rem*2 + C; mov R0, #Rem mov R1, #Divisor mov R2, SizeX acall LessX jc Quot ;;; if (Rem >= Divisor) { mov R0, #Rem mov R1, #Divisor mov R2, SizeX acall SubtractX ;;; Rem -= Divisor; Quot: ;;; } cpl C ;;; C = !C;retDivideX: mov R0, #Rem mov R2, SizeX acall ClearX ;;; Rem = 0; mov R0, #Quo mov R2, SizeX acall ClearX ;;; Quo = 0; mov A, SizeX rl A rl A rl A mov R3, A DivLoop: ;;; for (R3 = 8*SizeX; R3 > 0; R3--) { acall Div1 ;;; Rem:Op <<= 1; C = Rem/Divisor; Rem %= Divisor; mov R0, #Quo mov R2, SizeX acall ShiftX ;;; Quo = Quo << 1 | C; djnz R3, DivLoop ;;; } mov R0, #Fract mov R2, SizeX acall ClearX ;;; Fract = 0; mov A, SizeX rl A rl A rl A mov R3, A FractLoop: ;;; for (R3 = 8*SizeX; R3 > 0; R3--) { acall Div1 ;;; Rem:Op <<= 1; C = Rem/Divisor; Rem %= Divisor; mov R0, #Fract mov R2, SizeX acall ShiftX ;;; Fract = Fract << 1 | C; djnz R3, FractLoop ;;; }ret;;; Square root of 64-bit word W returned in 32-bit word Q.Q equ 35h ;;; 8 bytesD equ 3dh ;;; 8 bytesX equ 45h ;;; 8 bytesW equ 4dh ;;; 8 bytesY bit F0 ;;; 1 bitSqrt64: mov R0, #Q mov R2, #4 acall ClearX ;;; Q = 0; mov R0, #D mov R2, #8 acall ClearX ;;; D = 0; mov R0, #X mov R2, #8 acall ClearX ;;; X = 0; mov R3, #32 ;;; for (I = 0; I < 32; I++) { SqrtLoop: mov R0, #W mov R2, #8 acall RolX mov R0, #D mov R2, #8 acall ShiftX mov R0, #W mov R2, #8 acall RolX mov R0, #D mov R2, #8 acall ShiftX ;;; D <<= 2, D += (W&0xc0000000) >> 30, W <<= 2; mov R0, #X mov R1, #D mov R2, #8 acall LessX mov Y, C ;;; Y = (X < D); mov R0, #Q mov R2, #4 acall ShiftX ;;; Q <<= 1; Q |= Y; jnb Y, YY0 ;;; if (Y) { mov R0, #D mov R1, #X mov R2, #8 acall SubbX ;;; D -= (X + 1); YY0: ;;; } mov R0, #X mov R2, #8 acall RolX ;;; X <<= 1; jnb Y, YY1 ;;; if (Y) { orl X, #4 ;;; X |= 0x04; YY1: ;;; } djnz R3, SqrtLoop ;;; }ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -