; PI=24arctan(1/8)+8arctan(1/57)+4arctan(1/239) ORG 0F965H ; 1–œŒ… ;BIN_SIZE EQU 4153+4 ; 10000 * log(10) / log(100H) ;BCD_SIZE EQU (10000+10)/2 ; 猅 ;BIN_SIZE EQU 416+4 ; 1000 * log(10) / log(100H) ;BCD_SIZE EQU (1000+10)/2 ; 4–œ5猅 ;BIN_SIZE EQU 18686+4 ; 45000 * log(10) / log(100H) ;BCD_SIZE EQU (45000+10)/2 ; 5–œŒ… BIN_SIZE EQU 20763+4 ; 50000 * log(10) / log(100H) BCD_SIZE EQU (50000+10)/2 WORK1 EQU 00608H WORK2 EQU 05727H WORK3 EQU 0A846H BCD_RESULT EQU 06000H WORK_BASE_H EQU 00H WORK_BASE EQU WORK_BASE_H*100H PBIN_SIZE EQU WORK_BASE+600H PBCD_SIZE EQU WORK_BASE+602H PWORK2_SKIP EQU WORK_BASE+604H MKTBL_SKIP EQU WORK_BASE+606H DIVTBL_H EQU WORK_BASE_H DIVTBL2_H EQU WORK_BASE_H+3 MUL100TBL_H EQU WORK_BASE_H BCDTBL_H EQU WORK_BASE_H+2 DIV9_15_MINSIZE EQU 156 DIV16_MINSIZE EQU 3320 ; ENTRY: LD HL,BIN_SIZE LD (PBIN_SIZE),HL LD HL,BCD_SIZE LD (PBCD_SIZE),HL ENTRY2: DI XOR A LD (MKTBL_SKIP),A CALC1: LD A,3 CALL SET_WORK2 LD HL,WORK2 LD DE,WORK1 LD BC,(PBIN_SIZE) LDIR CALC1_L1: LD HL,WORK2 LD BC,(PWORK2_SKIP) ADD HL,BC LD A,(HL) RLCA RLCA JR C,CALC1_L2 INC BC LD (PWORK2_SKIP),BC EX DE,HL LD HL,(PBIN_SIZE) SCF SBC HL,BC JR Z,CALC1_END EX DE,HL LD (HL),0 INC HL CALC1_L2: LD (HL),A CALL DIV_ODD JR C,CALC1_END CALL MPADDSUB JR CALC1_L1 CALC1_END: CALC2: LD A,8 CALL SET_WORK2 LD C,57 LD H,DIVTBL_H CALL MAKE_DIVTBL CALL MPDIV8T LD HL,WORK2 LD DE,WORK1 CALL MPADD CALC2_L1: LD HL,WORK2 LD D,H LD E,L LD IX,57*57 LD A,DIVTBL_H LD (MPDIV9_15_2_TBL+1),A LD (MPDIV9_15_MT_TBL+1),A CALL MPDIV9_15 LD A,DIVTBL2_H LD (MPDIV9_15_2_TBL+1),A LD (MPDIV9_15_MT_TBL+1),A LD A,0 LD (MKTBL_SKIP),A JR C,CALC2_END CALL DIV_ODD JR C,CALC2_END CALL MPADDSUB LD A,1 LD (MKTBL_SKIP),A JR CALC2_L1 CALC2_END: CALC3: LD A,4 CALL SET_WORK2 LD C,239 LD H,DIVTBL_H CALL MAKE_DIVTBL CALL MPDIV8T LD HL,WORK2 LD DE,WORK1 CALL MPADD CALC3_L1: LD HL,(PWORK2_SKIP) LD DE,DIV16_MINSIZE ADD HL,DE EX DE,HL LD HL,(PBIN_SIZE) SBC HL,DE JR C,CALC3_L2 LD IX,239*239 CALL MAKE_DIVTBL16 LD HL,WORK2 LD D,H LD E,L CALL MPDIV16T JR C,CALC3_END CALL DIV_ODD JR C,CALC3_END CALL MPADDSUB JR CALC3_L1 CALC3_L2: LD C,239 LD H,DIVTBL_H CALL MAKE_DIVTBL CALC3_L3: CALL MPDIV8T JR C,CALC3_END CALL MPDIV8T JR C,CALC3_END CALL DIV_ODD JR C,CALC3_END CALL MPADDSUB JR CALC3_L3 CALC3_END: CONVERT: CALL MAKE_BCDTBL LD HL,WORK1 LD DE,BCD_RESULT LD BC,(PBIN_SIZE) LD IX,(PBCD_SIZE) CALL BIN2BCD EI RET ; [WORK2] = A, IY = 1 SET_WORK2: LD HL,WORK2 LD (HL),A INC HL LD D,H LD E,L INC DE LD BC,(PBIN_SIZE) DEC BC DEC BC LD (HL),0 LDIR LD (PWORK2_SKIP),BC LD IY,1 RET ; in : HL=src top, DE=dest top ; out : HL=src, DE=dest, BC=loop param ; if [src]==0 CF=1 else CF=0 CHECK_WORK: PUSH DE LD BC,(PWORK2_SKIP) ADD HL,BC EX DE,HL LD HL,(PBIN_SIZE) SBC HL,BC CHECK_WORK_L1: LD A,(DE) OR A JR NZ,CHECK_WORK_L2 INC DE DEC HL INC BC LD A,H OR L JR NZ,CHECK_WORK_L1 POP DE SCF RET CHECK_WORK_L2: LD (PWORK2_SKIP),BC EX (SP),HL ADD HL,BC EX DE,HL POP BC DEC BC INC C INC B LD A,C LD C,B LD B,A RET ; [WORK3] = [WORK2] / (2n+1) ; IY=2n+1 DIV_ODD: INC IY INC IY PUSH IY POP BC LD A,B OR A JR Z,DIV_ODD_L1 PUSH BC POP IX JP M,DIV_ODD_L2 LD HL,(PWORK2_SKIP) LD DE,DIV9_15_MINSIZE ADD HL,DE EX DE,HL LD HL,(PBIN_SIZE) SBC HL,DE LD HL,WORK2 LD DE,WORK3 JP NC,MPDIV9_15 JP MPDIV15 DIV_ODD_L1: LD H,DIVTBL2_H CALL MAKE_DIVTBL LD HL,WORK2 LD DE,WORK3 JP MPDIV8T2 DIV_ODD_L2: CALL MAKE_DIVTBL16 LD HL,WORK2 LD DE,WORK3 JP MPDIV16T ; [WORK1] +-= [WORK3] MPADDSUB: PUSH IY POP BC LD HL,WORK3 LD DE,WORK1 BIT 1,C JR Z,MPADD JR MPSUB ; [WORK1] -+= [WORK3] MPSUBADD: PUSH IY POP BC LD HL,WORK3 LD DE,WORK1 BIT 1,C JR Z,MPSUB ; [DE..DE+(PBIN_SIZE)-1] += [HL..HL+(PBIN_SIZE)-1] MPADD: CALL MPADDSUB_SETUP MPADD_L1: LD A,(DE) ADC A,(HL) LD (DE),A DEC HL DEC DE ; 5Bytes LD A,(DE) ADC A,(HL) LD (DE),A DEC HL DEC DE ; LD A,(DE) ADC A,(HL) LD (DE),A DEC HL DEC DE ; LD A,(DE) ADC A,(HL) LD (DE),A DEC HL DEC DE ; LD A,(DE) ADC A,(HL) LD (DE),A DEC HL DEC DE ; LD A,(DE) ADC A,(HL) LD (DE),A DEC HL DEC DE ; LD A,(DE) ADC A,(HL) LD (DE),A DEC HL DEC DE ; LD A,(DE) ADC A,(HL) LD (DE),A DEC HL DEC DE ; DJNZ MPADD_L1 DEC C JR NZ,MPADD_L1 RET NC EX DE,HL MPADD_L2: INC (HL) DEC HL JR Z,MPADD_L2 RET ; [DE..DE+(PBIN_SIZE)-1] -= [HL..HL+(PBIN_SIZE)-1] MPSUB: CALL MPADDSUB_SETUP MPSUB_L1: LD A,(DE) SBC A,(HL) LD (DE),A DEC HL DEC DE ; 5Bytes LD A,(DE) SBC A,(HL) LD (DE),A DEC HL DEC DE ; LD A,(DE) SBC A,(HL) LD (DE),A DEC HL DEC DE ; LD A,(DE) SBC A,(HL) LD (DE),A DEC HL DEC DE ; LD A,(DE) SBC A,(HL) LD (DE),A DEC HL DEC DE ; LD A,(DE) SBC A,(HL) LD (DE),A DEC HL DEC DE ; LD A,(DE) SBC A,(HL) LD (DE),A DEC HL DEC DE ; LD A,(DE) SBC A,(HL) LD (DE),A DEC HL DEC DE ; DJNZ MPSUB_L1 DEC C JR NZ,MPSUB_L1 RET NC MPSUB_L2: LD A,(DE) DEC A LD (DE),A DEC DE INC A JR Z,MPSUB_L2 RET ; MPADDSUB_SETUP: POP IX LD BC,(PBIN_SIZE) DEC BC ADD HL,BC EX DE,HL ADD HL,BC EX DE,HL PUSH HL LD H,B LD L,C LD BC,(PWORK2_SKIP) XOR A SBC HL,BC LD B,A DEC A SUB L AND 7 LD C,A ADD A,A ADD A,A ADD A,C LD C,A ADD IX,BC ; IX+=((-count)&7)*5 LD A,L SRL H RRA SRL H RRA SRL H RRA INC A INC H LD C,H LD B,A POP HL JP (IX) ; [DE..DE+(PBIN_SIZE)-1] = [HL..HL+(PBIN_SIZE)-1] / IX (IX < 8000H) MPDIV15: CALL CHECK_WORK RET C PUSH IX EXX POP DE LD A,E CPL LD C,A LD A,D CPL LD B,A INC BC LD HL,0 EXX MPDIV15_L1: LD A,(HL) INC HL EXX ADD A,A ADC HL,HL ADD HL,BC ADD A,A ADC HL,HL JR C,MPDIV15_LM1 MPDIV15_LP1: ADD HL,BC ADD A,A ADC HL,HL JR C,MPDIV15_LM2 MPDIV15_LP2: ADD HL,BC ADD A,A ADC HL,HL JR C,MPDIV15_LM3 MPDIV15_LP3: ADD HL,BC ADD A,A ADC HL,HL JR C,MPDIV15_LM4 MPDIV15_LP4: ADD HL,BC ADD A,A ADC HL,HL JR C,MPDIV15_LM5 MPDIV15_LP5: ADD HL,BC ADD A,A ADC HL,HL JR C,MPDIV15_LM6 MPDIV15_LP6: ADD HL,BC ADD A,A ADC HL,HL JR C,MPDIV15_LM7 MPDIV15_LP7: ADD A,A SBC HL,DE JP MPDIV15_L2 MPDIV15_LM1: INC A ADD HL,DE ADD A,A ADC HL,HL JR NC,MPDIV15_LP2 MPDIV15_LM2: INC A ADD HL,DE ADD A,A ADC HL,HL JR NC,MPDIV15_LP3 MPDIV15_LM3: INC A ADD HL,DE ADD A,A ADC HL,HL JR NC,MPDIV15_LP4 MPDIV15_LM4: INC A ADD HL,DE ADD A,A ADC HL,HL JR NC,MPDIV15_LP5 MPDIV15_LM5: INC A ADD HL,DE ADD A,A ADC HL,HL JR NC,MPDIV15_LP6 MPDIV15_LM6: INC A ADD HL,DE ADD A,A ADC HL,HL JR NC,MPDIV15_LP7 MPDIV15_LM7: INC A ADD A,A ADC HL,DE MPDIV15_L2: JP P,MPDIV15_L3 ADD HL,DE INC A MPDIV15_L3: CPL EXX LD (DE),A INC DE DJNZ MPDIV15_L1 DEC C JR NZ,MPDIV15_L1 OR A RET ; in : C=divisor, H=Table addr.H MAKE_DIVTBL: LD A,H EX AF,AF' LD HL,100H XOR A LD B,A MKDIVT_L1: SBC HL,BC INC A JR NC,MKDIVT_L1 DEC A ADD HL,BC LD E,L EXX LD B,A EX AF,AF' LD H,A LD L,0 LD D,L LD E,L LD C,L MKDIVT_L2: LD (HL),D INC H LD (HL),E INC H LD (HL),C DEC H DEC H LD A,B ADD A,E LD E,A JR NC,MKDIVT_L3 INC D MKDIVT_L3: LD A,C EXX ADD A,E CP C JR NC,MKDIVT_L4 EXX LD C,A INC L JR NZ,MKDIVT_L2 RET MKDIVT_L4: SUB C EXX LD C,A INC DE INC L JR NZ,MKDIVT_L2 RET ; [WORK2] /= N (use DIVTBL) MPDIV8T: LD HL,WORK2 LD D,H LD E,L CALL CHECK_WORK RET C EXX LD HL,(DIVTBL_H+1)*100H+1 LD B,(HL) INC H LD C,(HL) LD DE,0 EXX MPDIV8T_L1: LD A,(HL) EXX LD H,DIVTBL_H ADD A,E JR C,MPDIV8T_L2 LD L,A LD A,D ADD A,(HL) INC H LD D,(HL) INC H LD E,(HL) EXX LD (HL),A INC HL DJNZ MPDIV8T_L1 DEC C JR NZ,MPDIV8T_L1 OR A RET MPDIV8T_L2: ADD A,C LD L,A LD A,D ADD A,B ADD A,(HL) INC H LD D,(HL) INC H LD E,(HL) EXX LD (HL),A INC HL DJNZ MPDIV8T_L1 DEC C JR NZ,MPDIV8T_L1 OR A RET ; [WORK3] = [WORK2] / divisor (use DIVTBL2) MPDIV8T2: LD HL,WORK2 LD DE,WORK3 CALL CHECK_WORK RET C EXX LD HL,(DIVTBL2_H+1)*100H+1 LD B,(HL) INC H LD C,(HL) LD DE,0 EXX MPDIV8T2_L1: LD A,(HL) INC HL EXX LD H,DIVTBL2_H ADD A,E JR C,MPDIV8T2_L2 LD L,A LD A,D ADD A,(HL) INC H LD D,(HL) INC H LD E,(HL) EXX LD (DE),A INC DE DJNZ MPDIV8T2_L1 DEC C JR NZ,MPDIV8T2_L1 OR A RET MPDIV8T2_L2: ADD A,C LD L,A LD A,D ADD A,B ADD A,(HL) INC H LD D,(HL) INC H LD E,(HL) EXX LD (DE),A INC DE DJNZ MPDIV8T2_L1 DEC C JR NZ,MPDIV8T2_L1 OR A RET ; [DE..DE+(PBIN_SIZE)-1] = [HL..HL+(PBIN_SIZE)-1] / IX (0100H <= IX < 8000H) MPDIV9_15: CALL CHECK_WORK RET C PUSH HL PUSH DE PUSH BC PUSH IX POP BC LD A,B CP 40H JP NC,MPDIV9_15_7 CP 20H JP NC,MPDIV9_15_6 CP 10H JP NC,MPDIV9_15_5 CP 08H JP NC,MPDIV9_15_4 CP 04H JP NC,MPDIV9_15_3 CP 02H JP NC,MPDIV9_15_2 MPDIV9_15_1: LD L,B LD A,C SRL L RRA RR L RRA RR L LD H,A LD E,01H CALL MPDIV9_15_MAKETBL POP BC POP DE POP HL MPDIV9_15_1_L1: LD A,(HL) INC HL EXX LD D,L SRA H RR L LD H,DIVTBL2_H SUB (HL) LD E,A INC H LD A,D SBC A,(HL) LD D,A INC H LD A,(HL) LD H,D LD L,E ADD HL,BC JR NC,MPDIV9_15_1_L2 INC A LD D,H LD E,L ADD HL,BC JR C,MPDIV9_15_1_L4 MPDIV9_15_1_L2: EX DE,HL EXX LD (DE),A INC DE DJNZ MPDIV9_15_1_L1 MPDIV9_15_1_L3: DEC C JR NZ,MPDIV9_15_1_L1 OR A RET MPDIV9_15_1_L4: INC A EXX LD (DE),A INC DE DJNZ MPDIV9_15_1_L1 JR MPDIV9_15_1_L3 MPDIV9_15_2: LD L,B LD A,C SRL L RRA RR L RRA RR L RRA RR L LD H,A LD E,04H LD A,0FCH MPDIV9_15_2_JUMP: LD (MPDIV9_15_2_AND+1),A CALL MPDIV9_15_MAKETBL POP BC POP DE POP HL MPDIV9_15_2_L1: LD A,(HL) INC HL EXX LD D,L EX AF,AF' LD A,L MPDIV9_15_2_AND: AND 0FCH OR H LD L,A EX AF,AF' MPDIV9_15_2_TBL: LD H,DIVTBL2_H SUB (HL) LD E,A INC H LD A,D SBC A,(HL) LD D,A INC H LD A,(HL) LD H,D LD L,E ADD HL,BC JR NC,MPDIV9_15_2_L2 INC A LD D,H LD E,L ADD HL,BC JR C,MPDIV9_15_2_L4 MPDIV9_15_2_L2: EX DE,HL EXX LD (DE),A INC DE DJNZ MPDIV9_15_2_L1 MPDIV9_15_2_L3: DEC C JR NZ,MPDIV9_15_2_L1 OR A RET MPDIV9_15_2_L4: INC A EXX LD (DE),A INC DE DJNZ MPDIV9_15_2_L1 JR MPDIV9_15_2_L3 MPDIV9_15_3: LD H,B LD L,C ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL LD E,08H LD A,0F8H JP MPDIV9_15_2_JUMP MPDIV9_15_4: LD H,B LD L,C ADD HL,HL ADD HL,HL ADD HL,HL LD E,10H LD A,0F0H JP MPDIV9_15_2_JUMP MPDIV9_15_5: LD H,B LD L,C ADD HL,HL ADD HL,HL LD E,20H LD A,0E0H JP MPDIV9_15_2_JUMP MPDIV9_15_6: LD H,B LD L,C ADD HL,HL LD E,01H CALL MPDIV9_15_MAKETBL POP BC POP DE POP HL MPDIV9_15_6_L1: ; 160..200 clk LD A,(HL) INC HL EXX LD D,L ADD HL,HL ADD HL,HL LD L,H LD H,DIVTBL2_H SUB (HL) LD E,A INC H LD A,D SBC A,(HL) LD D,A INC H LD A,(HL) LD H,D LD L,E ADD HL,BC JR NC,MPDIV9_15_6_L2 INC A LD D,H LD E,L ADD HL,BC JR C,MPDIV9_15_6_L4 MPDIV9_15_6_L2: EX DE,HL EXX LD (DE),A INC DE DJNZ MPDIV9_15_6_L1 MPDIV9_15_6_L3: DEC C JR NZ,MPDIV9_15_6_L1 OR A RET MPDIV9_15_6_L4: INC A EXX LD (DE),A INC DE DJNZ MPDIV9_15_6_L1 JR MPDIV9_15_6_L3 MPDIV9_15_7: LD H,B LD L,C LD E,01H CALL MPDIV9_15_MAKETBL POP BC POP DE POP HL MPDIV9_15_7_L1: LD A,(HL) INC HL EXX LD D,L ADD HL,HL LD L,H LD H,DIVTBL2_H SUB (HL) LD E,A INC H LD A,D SBC A,(HL) LD D,A INC H LD A,(HL) LD H,D LD L,E ADD HL,BC JR NC,MPDIV9_15_7_L2 INC A LD D,H LD E,L ADD HL,BC JR C,MPDIV9_15_7_L4 MPDIV9_15_7_L2: EX DE,HL EXX LD (DE),A INC DE DJNZ MPDIV9_15_7_L1 MPDIV9_15_7_L3: DEC C JR NZ,MPDIV9_15_7_L1 OR A RET MPDIV9_15_7_L4: INC A EXX LD (DE),A INC DE DJNZ MPDIV9_15_7_L1 JR MPDIV9_15_7_L3 ; in : HL=normalized divisor(4000H..7FFFH), BC=divisor, E=inc pat ; out : BC'=-divisor, HL'=0 MPDIV9_15_MAKETBL: LD A,(MKTBL_SKIP) OR A JR NZ,MPDIV9_15_MAKETBL_SKIP PUSH BC LD A,H CPL LD B,A LD A,L CPL LD C,A INC BC LD H,B LD L,C RES 7,H XOR A LD D,A EXX POP BC LD D,A LD E,A LD L,A EX AF,AF' XOR A MPDIV9_15_MT_TBL: MPDIV9_15_MT_L1: LD H,DIVTBL2_H LD (HL),E INC H LD (HL),D INC H LD (HL),A EX AF,AF' EXX ADD A,E ADC A,D EXX LD L,A EX AF,AF' EXX MPDIV9_15_MT_L2: INC A JR Z,MPDIV9_15_MT_L3 EXX EX DE,HL ADD HL,BC EX DE,HL EXX ADD HL,BC JR C,MPDIV9_15_MT_L2 RES 7,H EXX JR MPDIV9_15_MT_L1 MPDIV9_15_MT_L3: EXX MPDIV9_15_MT_L4: LD H,A LD L,A LD A,B CPL LD B,A LD A,C CPL LD C,A INC BC EXX RET MPDIV9_15_MAKETBL_SKIP: XOR A JR MPDIV9_15_MT_L4 ; in : IX=divisor (8000H <= IX < 10000H) MAKE_DIVTBL16: PUSH IX POP BC LD HL,0FFFFH LD A,L EX AF,AF' XOR A LD E,A MKDIVT16_L1: ADD HL,BC JR NC,MKDIVT16_L4 PUSH AF OR A SBC HL,BC INC HL EX DE,HL LD H,DIVTBL_H LD (HL),E INC H LD (HL),D INC H LD A,D OR E JR NZ,MKDIVT16_L2 EX AF,AF' INC A LD (HL),A JR MKDIVT16_L3 MKDIVT16_L2: EX AF,AF' LD (HL),A INC A MKDIVT16_L3: EX AF,AF' INC H POP AF LD (HL),A INC L EX DE,HL DEC HL ADD HL,BC MKDIVT16_L4: INC A JR NZ,MKDIVT16_L1 RET ; [DE] = [HL] / IX (8000H <= IX < 10000H, use DIVTBL) MPDIV16T: CALL CHECK_WORK RET C EXX PUSH IX POP BC LD HL,0 EXX MPDIV16T_L1: LD A,(HL) INC HL EXX LD D,L LD L,H LD H,DIVTBL_H SUB (HL) LD E,A INC H LD A,D SBC A,(HL) LD D,A INC H LD A,L SBC A,(HL) INC H LD H,(HL) EX DE,HL SBC HL,BC SBC A,0 JR C,MPDIV16T_L2 INC D SBC HL,BC SBC A,0 INC D JR NC,MPDIV16T_L3 DEC D MPDIV16T_L2: ADD HL,BC MPDIV16T_L3: LD A,D EXX LD (DE),A INC DE DJNZ MPDIV16T_L1 DEC C JP NZ,MPDIV16T_L1 OR A RET ; 100”{ƒe[ƒuƒ‹‚ÆBCD•ÏŠ·ƒe[ƒuƒ‹‚ðì¬ MAKE_BCDTBL: LD HL,MUL100TBL_H*100H LD D,L LD E,L LD BC,100 MKBCDT_L1: LD (HL),E INC H LD (HL),D DEC H EX DE,HL ADD HL,BC EX DE,HL INC L JR NZ,MKBCDT_L1 LD HL,BCDTBL_H*100H XOR A MKBCDT_L2: LD (HL),A INC L ADD A,1 DAA JR NC,MKBCDT_L2 RET ; [DE..DE+IX] = packed BCD([HL..HL+BC-1]) BIN2BCD: LD A,(HL) LD (DE),A INC DE DEC BC ADD HL,BC EXX PUSH IX POP BC LD DE,54426 ; floor(10000H * log(100) / log(100H)) LD HL,0 BIN2BCD_L1: EXX PUSH HL PUSH BC PUSH DE XOR A LD D,A SUB C SRL B RR C SRL B RR C SRL B RR C AND 7 LD E,A ADD A,A ADD A,A ADD A,A ADD A,E LD E,A JR NZ,BIN2BCD_L2 DEC BC BIN2BCD_L2: INC C INC B LD A,C LD C,B LD B,A OR C JR Z,BIN2BCD_L6 LD IX,BIN2BCD_L3 ADD IX,DE ; IX+=((-count)&7)*9 LD D,MUL100TBL_H XOR A JP (IX) BIN2BCD_L3: LD E,(HL) EX DE,HL ADC A,(HL) EX DE,HL LD (HL),A DEC HL INC D LD A,(DE) DEC D ; 9Bytes LD E,(HL) EX DE,HL ADC A,(HL) EX DE,HL LD (HL),A DEC HL INC D LD A,(DE) DEC D ; LD E,(HL) EX DE,HL ADC A,(HL) EX DE,HL LD (HL),A DEC HL INC D LD A,(DE) DEC D ; LD E,(HL) EX DE,HL ADC A,(HL) EX DE,HL LD (HL),A DEC HL INC D LD A,(DE) DEC D ; LD E,(HL) EX DE,HL ADC A,(HL) EX DE,HL LD (HL),A DEC HL INC D LD A,(DE) DEC D ; LD E,(HL) EX DE,HL ADC A,(HL) EX DE,HL LD (HL),A DEC HL INC D LD A,(DE) DEC D ; LD E,(HL) EX DE,HL ADC A,(HL) EX DE,HL LD (HL),A DEC HL INC D LD A,(DE) DEC D ; LD E,(HL) EX DE,HL ADC A,(HL) EX DE,HL LD (HL),A DEC HL INC D LD A,(DE) DEC D ; DJNZ BIN2BCD_L3 DEC C JR NZ,BIN2BCD_L3 ADC A,B LD D,BCDTBL_H LD E,A LD A,(DE) POP DE LD (DE),A INC DE POP BC POP HL EXX ADD HL,DE JR NC,BIN2BCD_L5 EXX DEC HL DEC BC EXX BIN2BCD_L5: DEC BC LD A,B OR C JP NZ,BIN2BCD_L1 RET BIN2BCD_L6: EXX POP HL POP DE POP DE BIN2BCD_L7: LD (HL),0 INC HL DEC BC LD A,B OR C JR NZ,BIN2BCD_L7 RET END