; PI=176arctan(1/57)+28arctan(1/239)-48arctan(1/682)+96arctan(1/12943) ; 682=2*11*31 ; 12943=7*43*43 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 186 ; ENTRY: LD HL,BIN_SIZE LD (PBIN_SIZE),HL LD HL,BCD_SIZE LD (PBCD_SIZE),HL ENTRY2: DI CALC1: XOR A LD (MKTBL_SKIP),A LD A,176 CALL SET_WORK LD C,57 LD H,DIVTBL_H CALL MAKE_DIVTBL CALL MPDIV8T LD HL,WORK2 LD DE,WORK1 LD BC,(PBIN_SIZE) LDIR LD IY,1 CALC1_L1: CALL MPDIV8T JR C,CALC1_END CALL MPDIV8T JR C,CALC1_END CALL DIV_ODD JR C,CALC1_END CALL MPADDSUB JR CALC1_L1 CALC1_END: CALC2: LD A,28 CALL SET_WORK LD C,239 LD H,DIVTBL_H CALL MAKE_DIVTBL CALL MPDIV8T LD HL,WORK2 LD DE,WORK1 CALL MPADD LD IY,1 CALC2_L1: CALL MPDIV8T JR C,CALC2_END CALL MPDIV8T JR C,CALC2_END CALL DIV_ODD JR C,CALC2_END CALL MPADDSUB JR CALC2_L1 CALC2_END: CALC3: LD A,48 CALL SET_WORK LD HL,WORK2 LD DE,WORK2 LD IX,682 CALL MPDIV9_15 LD HL,WORK2 LD DE,WORK1 CALL MPSUB LD C,22 LD H,DIVTBL_H CALL MAKE_DIVTBL LD IY,1 CALC3_L1: LD HL,WORK2 LD DE,WORK2 LD IX,21142 ; 682*682/22 CALL MPDIV9_15 JR C,CALC3_END CALL MPDIV8T JR C,CALC3_END CALL DIV_ODD JR C,CALC3_END CALL MPSUBADD JR CALC3_L1 CALC3_END: CALC4: LD A,96 CALL SET_WORK LD HL,WORK2 LD DE,WORK2 LD IX,12943 CALL MPDIV9_15 LD HL,WORK2 LD DE,WORK1 CALL MPADD LD IY,1 CALC4_L1: LD HL,WORK2 LD DE,WORK2 LD IX,12943 CALL MPDIV9_15 JR C,CALC4_END LD A,1 LD (MKTBL_SKIP),A LD HL,WORK2 LD DE,WORK2 LD IX,12943 CALL MPDIV9_15 JR C,CALC4_END XOR A LD (MKTBL_SKIP),A CALL DIV_ODD JR C,CALC4_END CALL MPADDSUB JR CALC4_L1 CALC4_END: XOR A LD (MKTBL_SKIP),A 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 SET_WORK: LD HL,WORK2 LD BC,(PBIN_SIZE) PUSH HL LD D,H LD E,L INC DE DEC BC LD (HL),0 LDIR POP HL LD (HL),A LD HL,0 LD (PWORK2_SKIP),HL 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 JR CHECK_WORK_L2 CHECK_WORK_L1: LD A,(DE) OR A JR NZ,CHECK_WORK_L3 INC DE DEC HL INC BC CHECK_WORK_L2: LD A,H OR L JR NZ,CHECK_WORK_L1 POP DE SCF RET CHECK_WORK_L3: LD (PWORK2_SKIP),BC DEC HL INC L INC H LD C,H LD B,L POP HL PUSH BC LD BC,(PWORK2_SKIP) ADD HL,BC EX DE,HL POP BC RET ; DIV_ODD: INC IY INC IY PUSH IY POP BC LD A,B OR A JR Z,DIV_ODD_L1 PUSH BC POP IX 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 MPADDSUB: PUSH IY POP BC LD HL,WORK3 LD DE,WORK1 BIT 1,C JP Z,MPADD JP MPSUB MPSUBADD: PUSH IY POP BC LD HL,WORK3 LD DE,WORK1 BIT 1,C JP Z,MPSUB JP MPADD ; [DE..DE+(PBIN_SIZE)-1] += [HL..HL+(PBIN_SIZE)-1] MPADD: LD IX,MPADD_JTBL CALL MPADDSUB_SETUP RET C JP (IX) MPADD_L1: MPADD_J8: LD A,(DE) ADC A,(HL) LD (DE),A DEC HL DEC DE MPADD_J7: LD A,(DE) ADC A,(HL) LD (DE),A DEC HL DEC DE MPADD_J6: LD A,(DE) ADC A,(HL) LD (DE),A DEC HL DEC DE MPADD_J5: LD A,(DE) ADC A,(HL) LD (DE),A DEC HL DEC DE MPADD_J4: LD A,(DE) ADC A,(HL) LD (DE),A DEC HL DEC DE MPADD_J3: LD A,(DE) ADC A,(HL) LD (DE),A DEC HL DEC DE MPADD_J2: LD A,(DE) ADC A,(HL) LD (DE),A DEC HL DEC DE MPADD_J1: 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 MPADD_JTBL: DW MPADD_J8,MPADD_J1,MPADD_J2,MPADD_J3 DW MPADD_J4,MPADD_J5,MPADD_J6,MPADD_J7 ; [DE..DE+(PBIN_SIZE)-1] -= [HL..HL+(PBIN_SIZE)-1] MPSUB: LD IX,MPSUB_JTBL CALL MPADDSUB_SETUP RET C JP (IX) MPSUB_L1: MPSUB_J8: LD A,(DE) SBC A,(HL) LD (DE),A DEC HL DEC DE MPSUB_J7: LD A,(DE) SBC A,(HL) LD (DE),A DEC HL DEC DE MPSUB_J6: LD A,(DE) SBC A,(HL) LD (DE),A DEC HL DEC DE MPSUB_J5: LD A,(DE) SBC A,(HL) LD (DE),A DEC HL DEC DE MPSUB_J4: LD A,(DE) SBC A,(HL) LD (DE),A DEC HL DEC DE MPSUB_J3: LD A,(DE) SBC A,(HL) LD (DE),A DEC HL DEC DE MPSUB_J2: LD A,(DE) SBC A,(HL) LD (DE),A DEC HL DEC DE MPSUB_J1: 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 MPSUB_JTBL: DW MPSUB_J8,MPSUB_J1,MPSUB_J2,MPSUB_J3 DW MPSUB_J4,MPSUB_J5,MPSUB_J6,MPSUB_J7 ; MPADDSUB_SETUP: LD BC,(PBIN_SIZE) DEC BC ADD HL,BC EX DE,HL ADD HL,BC EX DE,HL PUSH DE PUSH HL LD HL,(PBIN_SIZE) LD BC,(PWORK2_SKIP) SBC HL,BC JR Z,MPADDSUB_SETUP_RET EX DE,HL LD A,E AND 7 ADD A,A PUSH IX POP HL LD C,A LD B,0 ADD HL,BC LD C,(HL) INC HL LD B,(HL) PUSH BC POP IX LD BC,7 EX DE,HL ADD HL,BC LD A,L SRL H RRA SRL H RRA SRL H RRA LD C,H OR A JR Z,MPADDSUB_SETUP_L1 INC C MPADDSUB_SETUP_L1: LD B,A POP HL POP DE RET MPADDSUB_SETUP_RET: POP HL POP DE SCF RET ; [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 B,0 LD HL,100H XOR A MKDIVT_L1: SBC HL,BC INC A JP NC,MKDIVT_L1 DEC A ADD HL,BC LD D,A LD E,L EXX EX AF,AF' LD H,A LD L,0 LD D,L LD E,L LD C,L LD B,L MKDIVT_L2: LD (HL),D INC H LD (HL),E INC H LD (HL),C DEC H DEC H INC L EXX LD A,D EXX ADD A,E LD E,A JR NC,MKDIVT_L3 INC D MKDIVT_L3: LD A,C EXX ADD A,E CP C JR C,MKDIVT_L4 SUB C EXX LD C,A INC DE DJNZ MKDIVT_L2 RET MKDIVT_L4: EXX LD C,A DJNZ 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 JP MPDIV9_15_1 MPDIV9_15_1: LD L,B LD A,C SRL L RRA RR L RRA RR L LD H,A 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_L5 MPDIV9_15_1_L2: EX DE,HL MPDIV9_15_1_L3: EXX LD (DE),A INC DE DJNZ MPDIV9_15_1_L1 MPDIV9_15_1_L4: DEC C JR NZ,MPDIV9_15_1_L1 OR A RET MPDIV9_15_1_L5: INC A EXX LD (DE),A INC DE DJNZ MPDIV9_15_1_L1 JR MPDIV9_15_1_L4 MPDIV9_15_2: LD L,B LD A,C SRL L RRA RR L RRA RR L RRA RR L LD H,A CALL MPDIV9_15_MAKETBL POP BC POP DE POP HL MPDIV9_15_2_L1: LD A,(HL) INC HL EXX LD D,L SRL H RR L SRL 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_2_L2 INC A LD D,H LD E,L ADD HL,BC JR C,MPDIV9_15_2_L5 MPDIV9_15_2_L2: EX DE,HL MPDIV9_15_2_L3: EXX LD (DE),A INC DE DJNZ MPDIV9_15_2_L1 MPDIV9_15_2_L4: DEC C JR NZ,MPDIV9_15_2_L1 OR A RET MPDIV9_15_2_L5: INC A EXX LD (DE),A INC DE DJNZ MPDIV9_15_2_L1 JR MPDIV9_15_2_L4 MPDIV9_15_3: LD L,B LD A,C SRL L RRA RR L RRA RR L RRA RR L RRA RR L LD H,A CALL MPDIV9_15_MAKETBL POP BC POP DE POP HL MPDIV9_15_3_L1: LD A,(HL) INC HL EXX LD D,L LD E,A LD A,H RRA RR L RRA RR L RRA RR L LD H,DIVTBL2_H LD A,E 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_3_L2 INC A LD D,H LD E,L ADD HL,BC JR C,MPDIV9_15_3_L5 MPDIV9_15_3_L2: EX DE,HL MPDIV9_15_3_L3: EXX LD (DE),A INC DE DJNZ MPDIV9_15_3_L1 MPDIV9_15_3_L4: DEC C JR NZ,MPDIV9_15_3_L1 OR A RET MPDIV9_15_3_L5: INC A EXX LD (DE),A INC DE DJNZ MPDIV9_15_3_L1 JR MPDIV9_15_3_L4 MPDIV9_15_4: LD H,B LD L,C ADD HL,HL ADD HL,HL ADD HL,HL CALL MPDIV9_15_MAKETBL POP BC POP DE POP HL MPDIV9_15_4_L1: LD A,(HL) INC HL EXX LD D,L ADD HL,HL ADD HL,HL 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_4_L2 INC A LD D,H LD E,L ADD HL,BC JR C,MPDIV9_15_4_L5 MPDIV9_15_4_L2: EX DE,HL MPDIV9_15_4_L3: EXX LD (DE),A INC DE DJNZ MPDIV9_15_4_L1 MPDIV9_15_4_L4: DEC C JR NZ,MPDIV9_15_4_L1 OR A RET MPDIV9_15_4_L5: INC A EXX LD (DE),A INC DE DJNZ MPDIV9_15_4_L1 JR MPDIV9_15_4_L4 MPDIV9_15_5: LD H,B LD L,C ADD HL,HL ADD HL,HL CALL MPDIV9_15_MAKETBL POP BC POP DE POP HL MPDIV9_15_5_L1: LD A,(HL) INC HL EXX LD D,L ADD HL,HL 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_5_L2 INC A LD D,H LD E,L ADD HL,BC JR C,MPDIV9_15_5_L5 MPDIV9_15_5_L2: EX DE,HL MPDIV9_15_5_L3: EXX LD (DE),A INC DE DJNZ MPDIV9_15_5_L1 MPDIV9_15_5_L4: DEC C JR NZ,MPDIV9_15_5_L1 OR A RET MPDIV9_15_5_L5: INC A EXX LD (DE),A INC DE DJNZ MPDIV9_15_5_L1 JR MPDIV9_15_5_L4 MPDIV9_15_6: LD H,B LD L,C ADD HL,HL 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_L5 MPDIV9_15_6_L2: EX DE,HL MPDIV9_15_6_L3: EXX LD (DE),A INC DE DJNZ MPDIV9_15_6_L1 MPDIV9_15_6_L4: DEC C JR NZ,MPDIV9_15_6_L1 OR A RET MPDIV9_15_6_L5: INC A EXX LD (DE),A INC DE DJNZ MPDIV9_15_6_L1 JR MPDIV9_15_6_L4 MPDIV9_15_7: LD H,B LD L,C 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_L5 MPDIV9_15_7_L2: EX DE,HL MPDIV9_15_7_L3: EXX LD (DE),A INC DE DJNZ MPDIV9_15_7_L1 MPDIV9_15_7_L4: DEC C JR NZ,MPDIV9_15_7_L1 OR A RET MPDIV9_15_7_L5: INC A EXX LD (DE),A INC DE DJNZ MPDIV9_15_7_L1 JR MPDIV9_15_7_L4 ; in : HL=normalized divisor(4000H..7FFFH) BC=divisor ; out : BC'=-divisor HL'=0 MPDIV9_15_MAKETBL: LD A,(MKTBL_SKIP) OR A JR NZ,MPDIV9_15_MAKETBL_SKIP EX DE,HL XOR A LD H,A LD L,A PUSH BC EXX POP BC LD D,A LD E,A LD L,A MPDIV9_15_MT_L1: LD H,DIVTBL2_H LD (HL),E INC H LD (HL),D INC H LD (HL),A INC L EXX SET 7,H JR MPDIV9_15_MT_L3 MPDIV9_15_MT_L2: INC A JR Z,MPDIV9_15_MT_L4 EXX EX DE,HL ADD HL,BC EX DE,HL EXX MPDIV9_15_MT_L3: OR A SBC HL,DE JR NC,MPDIV9_15_MT_L2 ADD HL,DE EXX JR MPDIV9_15_MT_L1 MPDIV9_15_MT_L4: EXX MPDIV9_15_MT_L5: 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_L5 ; 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 DEC BC INC C INC B LD A,C LD C,B LD B,A XOR A LD D,MUL100TBL_H BIN2BCD_L2: 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_L2 DEC C JR NZ,BIN2BCD_L2 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_L4 EXX DEC HL DEC BC LD A,B OR C JR NZ,BIN2BCD_L3 INC HL INC BC BIN2BCD_L3: EXX BIN2BCD_L4: DEC BC LD A,B OR C JR NZ,BIN2BCD_L1 RET END