; 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 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 MUL100TBL_H EQU WORK_BASE_H BCDTBL_H EQU WORK_BASE_H+2 ; 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 HL,WORK2 LD D,H LD E,L LD IX,5 CALL MPDIV15 LD HL,WORK2 LD DE,WORK1 LD BC,(PBIN_SIZE) LDIR LD IY,1 CALC1_L1: LD HL,WORK2 CALL CHECK_WORK JR C,CALC1_END LD (PWORK2_SKIP),BC LD HL,WORK2 LD D,H LD E,L LD IX,5*5 CALL MPDIV15 LD HL,WORK2 CALL CHECK_WORK JR C,CALC1_END LD (PWORK2_SKIP),BC INC IY INC IY LD HL,WORK2 LD DE,WORK3 PUSH IY POP IX CALL MPDIV15 LD HL,WORK3 CALL CHECK_WORK JR C,CALC1_END PUSH IY POP BC LD A,C LD HL,WORK3 LD DE,WORK1 AND 02H 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 HL,WORK2 LD D,H LD E,L LD IX,239 CALL MPDIV15 LD HL,WORK2 LD DE,WORK1 CALL MPSUB LD IY,1 CALC2_L1: LD HL,WORK2 CALL CHECK_WORK JR C,CALC2_END LD (PWORK2_SKIP),BC LD HL,WORK2 LD D,H LD E,L LD IX,239*239 CALL MPDIV16 LD HL,WORK2 CALL CHECK_WORK JR C,CALC2_END LD (PWORK2_SKIP),BC INC IY INC IY LD HL,WORK2 LD DE,WORK3 PUSH IY POP IX CALL MPDIV15 LD HL,WORK3 CALL CHECK_WORK JR C,CALC2_END PUSH IY POP BC LD A,C LD HL,WORK3 LD DE,WORK1 AND 02H 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 ; check [HL..HL+(PBIN_SIZE)-1] ; out: if []==0 CF=1 else CF=0,BC=WORK2_SKIP CHECK_WORK: LD DE,(PBIN_SIZE) LD BC,(PWORK2_SKIP) ADD HL,BC EX DE,HL SBC HL,BC JR CHECK_WORK_L2 CHECK_WORK_L1: LD A,(DE) OR A RET NZ INC DE DEC HL INC BC CHECK_WORK_L2: LD A,H OR L JP NZ,CHECK_WORK_L1 SCF RET ; [DE..DE+(PBIN_SIZE)-1] += [HL..HL+(PBIN_SIZE)-1] MPADD: LD BC,(PBIN_SIZE) ADD HL,BC DEC HL EX DE,HL ADD HL,BC DEC HL EX DE,HL PUSH HL LD H,B LD L,C LD BC,(PWORK2_SKIP) SBC HL,BC DEC HL INC L INC H LD C,H LD B,L POP HL MPADD_L1: LD A,(DE) ADC A,(HL) LD (DE),A DEC DE DEC HL 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: LD BC,(PBIN_SIZE) ADD HL,BC DEC HL EX DE,HL ADD HL,BC DEC HL EX DE,HL PUSH HL LD H,B LD L,C LD BC,(PWORK2_SKIP) SBC HL,BC DEC HL INC L INC H LD C,H LD B,L POP HL MPSUB_L1: LD A,(DE) SBC A,(HL) LD (DE),A DEC DE DEC HL DJNZ MPSUB_L1 DEC C JR NZ,MPSUB_L1 RET NC WSUB_L2: LD A,(DE) DEC A LD (DE),A DEC DE INC A JR Z,WSUB_L2 RET ; [DE..DE+(PBIN_SIZE)-1] = [HL..HL+(PBIN_SIZE)-1] / IX (IX < 8000H) MPDIV15: LD BC,(PWORK2_SKIP) ADD HL,BC EX DE,HL ADD HL,BC EX DE,HL PUSH HL LD HL,(PBIN_SIZE) SBC HL,BC DEC HL INC L INC H LD C,H LD B,L POP HL PUSH IX EXX POP DE LD HL,0 EXX MPDIV15_L1: LD A,(HL) INC HL EXX ADD A,A ADC HL,HL SBC HL,DE JR NC,MPDIV15_LB1 ADD HL,DE MPDIV15_LB1: ADC A,A ADC HL,HL SBC HL,DE JR NC,MPDIV15_LB2 ADD HL,DE MPDIV15_LB2: ADC A,A ADC HL,HL SBC HL,DE JR NC,MPDIV15_LB3 ADD HL,DE MPDIV15_LB3: ADC A,A ADC HL,HL SBC HL,DE JR NC,MPDIV15_LB4 ADD HL,DE MPDIV15_LB4: ADC A,A ADC HL,HL SBC HL,DE JR NC,MPDIV15_LB5 ADD HL,DE MPDIV15_LB5: ADC A,A ADC HL,HL SBC HL,DE JR NC,MPDIV15_LB6 ADD HL,DE MPDIV15_LB6: ADC A,A ADC HL,HL SBC HL,DE JR NC,MPDIV15_LB7 ADD HL,DE MPDIV15_LB7: ADC A,A ADC HL,HL SBC HL,DE JR NC,MPDIV15_LB8 ADD HL,DE MPDIV15_LB8: ADC A,A CPL EXX LD (DE),A INC DE DJNZ MPDIV15_L1 DEC C JR NZ,MPDIV15_L1 RET ; [DE..DE+(PBIN_SIZE)-1] = [HL..HL+(PBIN_SIZE)-1] / IX MPDIV16: LD BC,(PWORK2_SKIP) ADD HL,BC EX DE,HL ADD HL,BC EX DE,HL PUSH HL LD HL,(PBIN_SIZE) SBC HL,BC DEC HL INC L INC H LD C,H LD B,L POP HL 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 MPDIV16_L1: LD A,(HL) INC HL EXX ADD A,A ADC HL,HL JR NC,MPDIV16_LB1_1 ADD HL,BC JP MPDIV16_LB1_2 MPDIV16_LB1_1: SBC HL,DE JR NC,MPDIV16_LB1_2 ADD HL,DE MPDIV16_LB1_2: ADC A,A ADC HL,HL JR NC,MPDIV16_LB2_1 ADD HL,BC JP MPDIV16_LB2_2 MPDIV16_LB2_1: SBC HL,DE JR NC,MPDIV16_LB2_2 ADD HL,DE MPDIV16_LB2_2: ADC A,A ADC HL,HL JR NC,MPDIV16_LB3_1 ADD HL,BC JP MPDIV16_LB3_2 MPDIV16_LB3_1: SBC HL,DE JR NC,MPDIV16_LB3_2 ADD HL,DE MPDIV16_LB3_2: ADC A,A ADC HL,HL JR NC,MPDIV16_LB4_1 ADD HL,BC JP MPDIV16_LB4_2 MPDIV16_LB4_1: SBC HL,DE JR NC,MPDIV16_LB4_2 ADD HL,DE MPDIV16_LB4_2: ADC A,A ADC HL,HL JR NC,MPDIV16_LB5_1 ADD HL,BC JP MPDIV16_LB5_2 MPDIV16_LB5_1: SBC HL,DE JR NC,MPDIV16_LB5_2 ADD HL,DE MPDIV16_LB5_2: ADC A,A ADC HL,HL JR NC,MPDIV16_LB6_1 ADD HL,BC JP MPDIV16_LB6_2 MPDIV16_LB6_1: SBC HL,DE JR NC,MPDIV16_LB6_2 ADD HL,DE MPDIV16_LB6_2: ADC A,A ADC HL,HL JR NC,MPDIV16_LB7_1 ADD HL,BC JP MPDIV16_LB7_2 MPDIV16_LB7_1: SBC HL,DE JR NC,MPDIV16_LB7_2 ADD HL,DE MPDIV16_LB7_2: ADC A,A ADC HL,HL JR NC,MPDIV16_LB8_1 ADD HL,BC JP MPDIV16_LB8_2 MPDIV16_LB8_1: SBC HL,DE JR NC,MPDIV16_LB8_2 ADD HL,DE MPDIV16_LB8_2: ADC A,A CPL EXX LD (DE),A INC DE DJNZ MPDIV16_L1 DEC C JR NZ,MPDIV16_L1 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