home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The C Users' Group Library 1994 August
/
wc-cdrom-cusersgrouplibrary-1994-08.iso
/
vol_100
/
112_01
/
ddoclib
< prev
next >
Wrap
Text File
|
1985-08-21
|
4KB
|
281 lines
#asm
;
; Library specially tailored for Diskdoc
;
;
;Fetch a single byte from the address in HL and
; sign extend into HL
CCGCHAR: MOV A,M
CCSXT: MOV L,A
RLC
SBB A
MOV H,A
RET
;Fetch a full 16-bit integer from the address in HL
CCGINT: MOV A,M
INX H
MOV H,M
MOV L,A
RET
;Store a single byte from HL at the address in DE
CCPCHAR: MOV A,L
STAX D
RET
;Store a 16-bit integer in HL at the address in DE
CCPINT: MOV A,L
STAX D
INX D
MOV A,H
STAX D
RET
;Inclusive "or" HL and DE into HL
CCOR: MOV A,L
ORA E
MOV L,A
MOV A,H
ORA D
MOV H,A
RET
;Exclusive "or" HL and DE into HL
CCXOR: MOV A,L
XRA E
MOV L,A
MOV A,H
XRA D
MOV H,A
RET
;"And" HL and DE into HL
CCAND: MOV A,L
ANA E
MOV L,A
MOV A,H
ANA D
MOV H,A
RET
;Test if HL = DE and set HL = 1 if true else 0
CCEQ: CALL CCCMP
RZ
DCX H
RET
;Test if DE ~= HL
CCNE: CALL CCCMP
RNZ
DCX H
RET
;Test if DE > HL (signed)
CCGT: XCHG
CALL CCCMP
RC
DCX H
RET
;Test if DE <= HL (signed)
CCLE: CALL CCCMP
RZ
RC
DCX H
RET
;Test if DE >= HL (signed)
CCGE: CALL CCCMP
RNC
DCX H
RET
;Test if DE < HL (signed)
CCLT: CALL CCCMP
RC
DCX H
RET
;Common routine to perform a signed compare
; of DE and HL
;This routine performs DE - HL and sets the conditions:
; Carry reflects sign of difference (set means DE < HL)
; Zero/non-zero set according to equality.
CCCMP: MOV A,E
SUB L
MOV E,A
MOV A,D
SBB H
LXI H,1 ;preset true condition
JM CCCMP1
ORA E ;"OR" resets carry
RET
CCCMP1: ORA E
STC ;set carry to signal minus
RET
;
;Test if DE >= HL (unsigned)
CCUGE: CALL CCUCMP
RNC
DCX H
RET
;
;Test if DE < HL (unsigned)
CCULT: CALL CCUCMP
RC
DCX H
RET
;
;Test if DE > HL (unsigned)
CCUGT: XCHG
CALL CCUCMP
RC
DCX H
RET
;
;Test if DE <= HL (unsigned)
CCULE: CALL CCUCMP
RZ
RC
DCX H
RET
;
;Common routine to perform unsigned compare
;carry set if DE < HL
;zero/nonzero set accordingly
CCUCMP: MOV A,D
CMP H
JNZ $+5
MOV A,E
CMP L
LXI H,1
RET
;
;Shift DE arithmetically right by HL and return in HL
CCASR: XCHG
MOV A,H
RAL
MOV A,H
RAR
MOV H,A
MOV A,L
RAR
MOV L,A
DCR E
JNZ CCASR+1
RET
;Shift DE arithmetically left by HL and return in HL
CCASL: XCHG
DAD H
DCR E
JNZ CCASL+1
RET
;Subtract HL from DE and return in HL
CCSUB: MOV A,E
SUB L
MOV L,A
MOV A,D
SBB H
MOV H,A
RET
;Form the two's complement of HL
CCNEG: CALL CCCOM
INX H
RET
;Form the one's complement of HL
CCCOM: MOV A,H
CMA
MOV H,A
MOV A,L
CMA
MOV L,A
RET
;Multiply DE by HL and return in HL
CCMULT: MOV B,H
MOV C,L
LXI H,0
CCMULT1: MOV A,C
RRC
JNC $+4
DAD D
XRA A
MOV A,B
RAR
MOV B,A
MOV A,C
RAR
MOV C,A
ORA B
RZ
XRA A
MOV A,E
RAL
MOV E,A
MOV A,D
RAL
MOV D,A
ORA E
RZ
JMP CCMULT1
;Divide DE by HL and return quotient in HL, remainder in DE
CCDIV: MOV B,H
MOV C,L
MOV A,D
XRA B
PUSH PSW
MOV A,D
ORA A
CM CCDENEG
MOV A,B
ORA A
CM CCBCNEG
MVI A,16
PUSH PSW
XCHG
LXI D,0
CCDIV1: DAD H
CALL CCRDEL
JZ CCDIV2
CALL CCCMPBCDE
JM CCDIV2
MOV A,L
ORI 1
MOV L,A
MOV A,E
SUB C
MOV E,A
MOV A,D
SBB B
MOV D,A
CCDIV2: POP PSW
DCR A
JZ CCDIV3
PUSH PSW
JMP CCDIV1
CCDIV3: POP PSW
RP
CALL CCDENEG
XCHG
CALL CCDENEG
XCHG
RET
CCDENEG: MOV A,D
CMA
MOV D,A
MOV A,E
CMA
MOV E,A
INX D
RET
CCBCNEG: MOV A,B
CMA
MOV B,A
MOV A,C
CMA
MOV C,A
INX B
RET
CCRDEL: MOV A,E
RAL
MOV E,A
MOV A,D
RAL
MOV D,A
ORA E
RET
CCCMPBCDE: MOV A,E
SUB C
MOV A,D
SBB B
RET
;
#endasm