; PI=16arctan(1/5)-4arctan(1/239) ORG 0000H ; 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 WORK1 EQU 01000H WORK2 EQU 06000H WORK3 EQU 0B000H BCD_RESULT EQU 06000H WORK_BASE_H EQU 0AH WORK_BASE EQU WORK_BASE_H*100H PBIN_SIZE EQU WORK_BASE-2 PBCD_SIZE EQU WORK_BASE-4 PWORK2_SKIP EQU WORK_BASE-6 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: LD HL,WORK2 LD A,16 CALL SET_WORK LD C,5 LD H,DIVTBL_H CALL MAKE_DIVTBL LD HL,WORK2 CALL MPDIV8T LD HL,WORK2 LD DE,WORK1 LD BC,(PBIN_SIZE) LDIR LD C,5*5 LD H,DIVTBL_H CALL MAKE_DIVTBL LD IY,1 CALC1_L1: LD HL,WORK2 CALL MPDIV8T JR C,CALC1_END INC IY INC IY CALL DIV_ODD JR C,CALC1_END PUSH IY POP BC LD HL,WORK3 LD DE,WORK1 BIT 1,C JR NZ,CALC1_L2 CALL MPADD JR CALC1_L1 CALC1_L2: CALL MPSUB JR CALC1_L1 CALC1_END: CALC2: LD HL,WORK2 LD A,4 CALL SET_WORK LD C,239 LD H,DIVTBL_H CALL MAKE_DIVTBL LD HL,WORK2 CALL MPDIV8T LD HL,WORK2 LD DE,WORK1 CALL MPSUB LD IY,1 CALC2_L1: LD HL,WORK2 CALL MPDIV8T JR C,CALC2_END LD HL,WORK2 CALL MPDIV8T JR C,CALC2_END INC IY INC IY CALL DIV_ODD JR C,CALC2_END PUSH IY POP BC LD HL,WORK3 LD DE,WORK1 BIT 1,C JR NZ,CALC2_L2 CALL MPSUB JR CALC2_L1 CALC2_L2: CALL MPADD JR CALC2_L1 CALC2_END: CONVERT: CALL MAKE_BCDTBL LD HL,WORK1 LD DE,BCD_RESULT LD BC,(PBIN_SIZE) LD IX,(PBCD_SIZE) CALL BIN2BCD EI RET ; [HL..HL+(PBIN_SIZE)-1] = A SET_WORK: 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: 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: LD H,DIVTBL2_H CALL MAKE_DIVTBL16 LD HL,WORK2 LD DE,WORK3 JP MPDIV16T2 ; [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 ; [HL] /= N (use DIVTBL) MPDIV8T: 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 ; [DE] = [HL] / divisor (use DIVTBL2) MPDIV8T2: 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: 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 LD H,A LD L,A LD A,B CPL LD B,A LD A,C CPL LD C,A INC BC EXX RET ; in : IX=divisor (8000H <= IX < 10000H), H=Table addr.H MAKE_DIVTBL16: LD A,H EX AF,AF' PUSH IX POP BC INC BC SRL B RR C LD A,B OR C JR NZ,MKDIVT16_L1 SET 7,B MKDIVT16_L1: PUSH BC XOR A LD H,A LD L,A EXX POP BC LD D,A LD E,A LD L,A MKDIVT16_L2: EX AF,AF' LD H,A EX AF,AF' LD (HL),E INC H LD (HL),D INC H LD (HL),A INC L EXX SET 7,H JR MKDIVT16_L4 MKDIVT16_L3: INC A RET Z EXX EX DE,HL ADD HL,BC EX DE,HL EXX MKDIVT16_L4: OR A SBC HL,BC JR NC,MKDIVT16_L3 ADD HL,BC EXX JR MKDIVT16_L2 ; [DE] = [HL] / IX (8000H <= IX < 10000H, use DIVTBL2) MPDIV16T2: CALL CHECK_WORK RET C EXX PUSH IX POP BC LD HL,0 EXX MPDIV16T2_L1: LD A,(HL) INC HL EXX LD D,L LD E,A PUSH DE LD L,H SRL H RR D RRA 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) EX DE,HL POP DE EX AF,AF' XOR A SRL E ADC HL,HL ADC A,A BIT 0,C JR Z,MPDIV16T2_L3 EX AF,AF' LD D,A ADD A,L LD L,A LD A,D JR NC,MPDIV16T2_L2 INC H JR NZ,MPDIV16T2_L2 EX AF,AF' INC A EX AF,AF' MPDIV16T2_L2: EX AF,AF' MPDIV16T2_L3: OR A JR Z,MPDIV16T2_L5 MPDIV16T2_L4: SBC HL,BC SBC A,0 EX AF,AF' INC A EX AF,AF' JP NZ,MPDIV16T2_L4 MPDIV16T2_L5: EX AF,AF' OR A MPDIV16T2_L6: INC A SBC HL,BC JR NC,MPDIV16T2_L6 ADD HL,BC DEC A EXX LD (DE),A INC DE DJNZ MPDIV16T2_L1 DEC C JP NZ,MPDIV16T2_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 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