home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
assemblr
/
library
/
tasmswan
/
bcd.asm
< prev
next >
Wrap
Assembly Source File
|
1989-07-17
|
5KB
|
211 lines
%TITLE "Binary-Coded-Decimal (BCD) routines"
IDEAL
DOSSEG
MODEL small
;------ Equates
ASCIINull EQU 0
PackedSize EQU 10
UnpackedSize EQU 20
UDATASEG
TempUPBCD dt ?, ?
CODESEG
PUBLIC BCDAdd, BCDSubtract, PackedToUnpacked
PUBLIC UnpackedToPacked, BCDToASCII, BCDCopy
%NEWPAGE
;------------------------------------------------------------------------
; BCDAdd - adds two packed BCD numbers
;------------------------------------------------------------------------
; Input: si = address of source BCD value (10 bytes)
; di = address of destination BCD value (10 bytes)
; Output: destinationBCD <- destinationBCD + sourceBCD
; cf = 0 : NO error
; cf = 1 : OVERFLOW error occurred
; Registers: none
;------------------------------------------------------------------------
PROC BCDAdd
push ax
push cx
push di
push si
cld
clc
mov cx, PackedSize
@@10:
lodsb
adc al,[byte di]
daa
stosb
loop @@10
pop si
pop di
pop cx
pop ax
ret
ENDP BCDAdd
%NEWPAGE
;------------------------------------------------------------------------
; BCDSubtract - subtracts two packed BCD numbers
;------------------------------------------------------------------------
; Input: si = address of source BCD value (10 bytes)
; di = address of destination BCD value (10 bytes)
; Output: destinationBCD <- destinationBCD - sourceBCD
; cf = 0 : NO error
; cf = 1 : UNDERFLOW error occurred
; Registers: none
;------------------------------------------------------------------------
PROC BCDSubtract
push ax
push cx
push di
push si
cld
clc
mov cx, PackedSize
@@10:
lodsb
sbb [byte di],al
mov al,[byte di]
das
stosb
loop @@10
pop si
pop di
pop cx
pop ax
ret
ENDP BCDSubtract
%NEWPAGE
;------------------------------------------------------------------------
; PackedToUnpacked - convert packed BCD to Unpacked BCD
;------------------------------------------------------------------------
; Input: si = address of source packed BCD value (10 bytes)
; di = address of destination unpacked BCD value (20 bytes)
; Output: destinationBCD <- unpacked(sourceBCD)
; Registers: none
;------------------------------------------------------------------------
PROC PackedToUnpacked
push ax
push cx
push di
push si
cld
mov cx,PackedSize
@@10:
lodsb
mov ah,al
shr ah,1
shr ah,1
shr ah,1
shr ah,1
and al,0Fh
stosw
loop @@10
pop si
pop di
pop cx
pop ax
ret
ENDP PackedToUnpacked
%NEWPAGE
;------------------------------------------------------------------------
; UnpackedToPacked - convert Unpacked BCD to packed BCD
;------------------------------------------------------------------------
; Input: si = address of source unpacked BCD value (20 bytes)
; di = address of destination packed BCD value (10 bytes)
; Output: destinationBCD <- packed(sourceBCD)
; Registers: none
;------------------------------------------------------------------------
PROC UnpackedToPacked
push ax
push cx
push di
push si
cld
mov cx,PackedSize
@@10:
lodsw
shr ah,1
shr ah,1
shr ah,1
shr ah,1
or al,ah
stosb
loop @@10
pop si
pop di
pop cx
pop ax
ret
ENDP UnpackedToPacked
%NEWPAGE
;------------------------------------------------------------------------
; BCDToASCII - convert packed BCD value to ASCII
;------------------------------------------------------------------------
; Input: si = address of source packed BCD value (10 bytes)
; di = address of destination ASCIIZ string (21 bytes)
; Output: ASCIIZ <- ASCII(sourceBCD) + null character
; Registers: none
;------------------------------------------------------------------------
PROC BCDToASCII
push ax
push cx
push di
push si
push di
mov di, offset TempUPBCD
call PackedToUnpacked
pop di
mov si,offset TempUPBCD + UnpackedSize - 2
mov cx,PackedSize
@@10:
std
lodsw
or ax,03030h
xchg ah,al
cld
stosw
loop @@10
mov [byte,di],ASCIINull
pop si
pop di
pop cx
pop ax
ret
ENDP BCDToASCII
%NEWPAGE
;------------------------------------------------------------------------
; BCDCopy - copy a packed BCD value
;------------------------------------------------------------------------
; Input: si = address of source BCD value (10 bytes)
; di = address of destination BCD value (10 bytes)
; Output: destinationBCD <- sourceBCD
; Registers: none
;------------------------------------------------------------------------
PROC BCDCopy
push cx
push di
push si
cld
mov cx,PackedSize/2
rep movsw
pop si
pop di
pop cx
ret
ENDP BCDCopy
END