; ; MAKE A BCD NUMBER FROM A BINARY NUMBER ; 32 BIT BINARY NUMBER IN HL:BC, RESULT STORED AT (DE) ; DE IS PRESERVED, ALL OTHER REGS DESTROYED ; BIN2BCD: PUSH IX ; SAVE IX PUSH BC ; MOVE BC POP IX ; ... TO IX LD C,32 ; LOOP FOR 32 BITS OF BINARY DWORD ; BIN2BCD0: ; OUTER LOOP (ONCE FOR EACH BIT IN BINARY NUMBER) LD B,5 ; LOOP FOR 5 BYTES OF RESULT PUSH DE ; SAVE DE ADD IX,IX ; LEFT SHIFT NEXT BIT FROM HL:IX ADC HL,HL ; ... INTO CARRY ; BIN2BCD1: ; INNER LOOP (ONCE FOR EACH BYTE OF BCD NUMBER) LD A,(DE) ; GET IT ADC A,A ; DOUBLE IT W/ CARRY DAA ; DECIMAL ADJUST LD (DE),A ; SAVE IT INC DE ; POINT TO NEXT BCD BYTE DJNZ BIN2BCD1 ; LOOP THRU ALL BCD BYTES ; ; REMAINDER OF OUTER LOOP POP DE ; RECOVER DE DEC C ; DEC BIT COUNTER JR NZ,BIN2BCD0 ; LOOP TILL DONE WITH ALL BITS POP IX ; RESTORE IX RET ; ; PRINT CONTENTS OF 5 BYTE BCD NUMBER AT (HL) ; WITH LEADING ZERO SUPPRESSION ; ALL REGS DESTROYED ; PRTBCD: INC HL ; BUMP HL TO POINT TO INC HL ; ... INC HL ; ... INC HL ; ... LAST BYTE OF BCD LD B,5 ; LOOP FOR 5 BYTES LD C,0 ; START BY SUPPRESSING LEADING ZEROES ; PRTBCD1: ; LOOP TO PRINT ONE BCD BYTE (TWO DIGITS) XOR A ; CLEAR ACCUM RLD ; ROTATE FIRST NIBBLE INTO A CALL PRTBCD2 ; PRINT IT XOR A ; CLEAR ACCUM RLD ; ROTATE SECOND NIBBLE INTO A CALL PRTBCD2 ; PRINT IT DEC HL ; POINT TO PRIOR BYTE DJNZ PRTBCD1 ; LOOP TILL DONE RET ; RETURN ; PRTBCD2: ; SUBROUTINE TO PRINT A DIGIT IN A CP C ; COMPARE INCOMING TO C RET Z ; IF EQUAL, SUPPRESSING, ABORT DEC C ; MAKE C NEGATIVE TO STOP SUPPRESSION ADD A,'0' ; OFFSET TO PRINTABLE VALUE JP COUT ; EXIT VIA CHARACTER OUT