home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
SIMTEL
/
CPMUG
/
CPMUG051.ARK
/
STG2MATH.ASM
< prev
next >
Wrap
Assembly Source File
|
1984-04-29
|
5KB
|
266 lines
%MREV: DB 32H ; 06/08/79 R. CURTISS FIX DMUL10 MOV D,H
%;
%;MREV: DB 31H ; 05/31/79 R. CURTISS SIGNED OPERATIONS
%;
%; DOUBLE SUBTRACT (HL) = (HL) - (DE)
%;
%DSUB: MOV A,L
% SUB E ; SUBTRACT LOW BYTE
% MOV L,A
% MOV A,H
% SBB D ; SUBTRACT HIGH BYTE WITH BORROW
% MOV H,A
% RET
%;
%; ---------------------------------------- CMPEQ
%; DOUBLE COMPARE (HL) - (DE)
%;
%; IF HL = DE THEN Z=1
%;
%CMPEQ: MOV A,H
% CMP D
% RNZ
%
% MOV A,L
% CMP E
% RET
%;
%;
%; IF HL < DE THEN CY=1 -- SIGNED
%;
%CMPLT: MOV A,H
% XRA D
% MOV A,H
% RLC ; SET CY = SIGN OF HL
% RM ; RETURN IF SIGNS DIFFERENT
%;
%; IF HL < DE THEN CY=1 -- UNSIGNED
%;
%UCMPLT: MOV A,H
% CMP D
% RNZ
%
% MOV A,L
% CMP E
% RET
%;
%; ----------------------------------------- SPECIAL
%; SPECIAL MULTIPLY AND DIVIDE
%;
%; HL = HL * 10 -- SIGNED
%;
%DMUL10: MVI B,0 ; MINUS SIGN COUNTER
% CALL ICOMP ; COMPLEMENT IF NECESSARY
% MOV D,H
% MOV E,L
% DAD H
% DAD H
% DAD D
% DAD H
% DCR B
% RNZ ; RETURN IF POSITIVE
%
% JMP COMP ; COMPLEMENT RESULT
%;
%;
%; HL = HL / 10 -- SIGNED
%;
%DDIV10: MVI B,0 ; MINUS SIGN COUNTER
% CALL ICOMP
% PUSH B
% CALL UDIV10
% POP B
% DCR B
% RNZ ; RETURN IF POSITIVE
%
% XCHG
% CALL COMP
% XCHG
% JMP COMP
%;
%;
%; HL = HL / 10 -- UNSIGNED
%; DE = HL MOD 10
%;
%UDIV10: LXI D,0
% LXI B,05000H+12 ; B=10 C=LOOP COUNT
% JMP UDV10B
%
%UDV10A: XCHG
% DAD H ; SHIFT DE LEFT 1 BIT
% XCHG
% DAD H ; SHIFT HL LEFT 1 BIT
%
%UDV10B: MOV A,H
% SUB B
% JC UDV10C ; JUMP IF CAN'T SUBTRACT 10
%
% MOV H,A
% INR E ; SET LSB OF DE TO 1
%
%UDV10C: DCR C ; LOOP COUNT
% JNZ UDV10A
%
% XCHG
% MOV A,D
% RRC
% RRC
% RRC
% RRC
% ANI 0FH
% MOV E,A ; REMAINDER
% MVI D,0
% RET
%;
%;
%; HL = HL / 4 -- UNSIGNED
%;
%UDIV4: MOV A,H
% DAD H
% DAD H
% DAD H
% DAD H
% DAD H
% DAD H
% MOV L,H
% RRC
% RRC
% ANI 3FH
% MOV H,A
% RET
%;
%; ------------------------------------------ NORMAL
%; NORMAL MULTIPLY AND DIVIDE
%;
%; HL = HL * DE -- SIGNED
%;
%DMULT: MVI B,0 ; MINUS SIGN COUNTER
% XCHG
% CALL ICOMP
% XCHG
% CALL ICOMP
% PUSH B ; SAVE MINUS SIGN COUNTER
% CALL UMULT
% POP PSW ; RECALL MINUS SIGN COUNTER
% ANI 1
% RZ ; RETURN IF RESULT POSITIVE
%
% JMP COMP
%;
%;
%; DOUBLE MULTIPLY (HL) = (HL) * (DE) -- UNSIGNED
%;
%UMULT: MOV B,H ; MOVE MULTIPLICAND TO BC
% MOV C,L
% LXI H,0 ; INITIALIZE RESULT
% MVI A,16 ; INITIALIZE LOOP COUNT
% ORA A ; CLEAR CARRY
% PUSH PSW ; SAVE COUNT AND ZERO CARRY
%;
%MLOOP: MOV A,D ; GET MULTIPLIER BIT
% RLC
% JNC OVER ; JUMP IF BIT ZERO
%
% DAD B
%
%OVER: POP PSW ; RECALL LOOP COUNT AND CLEAR CARRY
% DCR A ; DECREMENT LOOP COUNT
% RZ ; RETURN IF COUNT ZERO
%
% PUSH PSW ; SAVE COUNT AND ZERO CARRY
% DAD H ; SHIFT RESULT LEFT
% XCHG
% DAD H ; SHIFT MULTIPLIER LEFT
% XCHG
% JMP MLOOP
%;
%;
%; HL = HL / DE -- SIGNED
%; DE = HL MOD DE
%;
%DDIV: MVI B,0 ; MINUS SIGN COUNTER
% CALL ICOMP
% XCHG
% CALL ICOMP
% PUSH B
% CALL DIV80
% XCHG
% POP PSW
% ANI 1
% RZ ; RETURN IF RESULT POSITIVE
%
% XCHG
% CALL COMP
% XCHG
% JMP COMP
%;
%;
%; DOUBLE DIVIDE (HL) = (HL) / (DE)
%;
%UDIV: XCHG
% CALL DIV80
% XCHG
% RET
%;
%;
%DIV80: SHLD TEMP ; SAVE DIVIDEND IN TEMPORARY
% LXI H,BNUM ; STORE
% MVI M,17 ; BIT COUNT
% LXI B,0 ; INITIALIZE RESULT
% PUSH B ; SAVE RESULT ON STACK
%;
%LOOP: MOV A,E ; GET LOW DIVISOR BYTE
% RAL
% MOV E,A ; SHIFT DIVISOR LEFT ONE BIT
% MOV A,D
% RAL
% MOV D,A
% DCR M ; DECREMENT BIT COUNT
% POP H ; RESTORE TEMP RESULT
% RZ ; RETURN IF COUNT ZERO
%
% MVI A,0 ; ADD IN CARRY
% ACI 0
% DAD H ; SHIFT TEMP RESULT LEFT
% MOV B,H ; COPY HL TO AC
% ADD L
% LHLD TEMP ; GET DIVIDEND
% SUB L ; SUBTRACT FROM
% MOV C,A
% MOV A,B
% SBB H ; TEMPORARY RESULT
% MOV B,A
% PUSH B ; SAVE TEMP RESULT ON STACK
% JNC SKIP ; NO BORROW FROM SUBRRACT
%;
% DAD B ; ADD DIVIDEND BACK IN
% XTHL ; REPLACE TEMP RESULT ON STACK
%;
%SKIP: LXI H,BNUM ; RESTORE HL
% CMC ; COMPLEMENT CARRY
% JMP LOOP
%;
%;
%TEMP: DS 2 ; FOR M DIVIDE
%BNUM: DS 1 ; FOR DIVIDE
%;
%; ------------------------------------------- ICOMP, COMP
%; TWO'S COMPLEMENT ROUTINE FOR (HL)
%;
%ICOMP: MOV A,H ; CHECK SIGN BIT
% ORA A
% RP ; RETURN IF POSITIVE
%
% INR B ; COUNT NEGATIVE
%;
%COMP: MOV A,H
% CMA ; COMPLEMENT HIGH BYTE
% MOV H,A
% MOV A,L
% CMA ; COMPLEMENT LOW BYTE
% MOV L,A
% INX H ; TWO'S COMPLEMENT
% RET
%;
%;