; 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 PDIV_TMP EQU WORK_BASE-8 DIVTBL_H EQU WORK_BASE_H DIVTBL2_H EQU WORK_BASE_H+3 MUL100TBL_H EQU WORK_BASE_H BCDTBL_H EQU MUL100TBL_H+2 DIV9_15_MINSIZE EQU 125 ; ENTRY: LD HL,BIN_SIZE LD (PBIN_SIZE),HL LD HL,BCD_SIZE LD (PBCD_SIZE),HL ENTRY2: DI CALC1: LD A,16 CALL SET_WORK2 LD C,5 LD H,DIVTBL_H CALL MAKE_DIVTBL CALL MPDIV8T LD HL,WORK2 LD DE,WORK1 LD BC,(PBIN_SIZE) LDIR LD C,5*5 LD H,DIVTBL_H CALL MAKE_DIVTBL CALC1_L1: CALL MPDIV8T JR C,CALC1_END CALL DIV_ODD JR C,CALC1_END CALL MPADDSUB JR CALC1_L1 CALC1_END: CALC2: LD A,4 CALL SET_WORK2 LD C,239 LD H,DIVTBL_H CALL MAKE_DIVTBL CALL MPDIV8T LD HL,WORK2 CALL MPSUB LD IX,239*239 LD H,DIVTBL_H CALL MAKE_DIVTBL16 CALC2_L1: LD IX,239*239 CALL MPDIV16T JR C,CALC2_END CALL DIV_ODD JR C,CALC2_END CALL MPSUBADD 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 ; [WORK2] = A, IY = 1 SET_WORK2: LD HL,WORK2 LD (HL),A INC HL LD DE,WORK2+2 LD BC,(PBIN_SIZE) DEC BC DEC BC LD (HL),0 LDIR LD (PWORK2_SKIP),BC LD IY,1 RET ; in : DE=dest top ; out : HL=src(WORK2), DE=dest, BC=loop param ; if [WORK2]==0 CF=1 else CF=0 CHECK_WORK: LD HL,WORK2 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 DE,WORK3 JP NC,MPDIV9_15 JP MPDIV15 DIV_ODD_L1: LD H,DIVTBL2_H CALL MAKE_DIVTBL JP MPDIV8T2 DIV_ODD_L2: LD H,DIVTBL2_H CALL MAKE_DIVTBL16 JP MPDIV16T2 ; [WORK1] +-= [WORK3] MPADDSUB: PUSH IY POP BC LD HL,WORK3 BIT 1,C JR Z,MPADD JR MPSUB ; [WORK1] -+= [WORK3] MPSUBADD: PUSH IY POP BC LD HL,WORK3 BIT 1,C JR Z,MPSUB ; [WORK1] += [HL] 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 ; [WORK1] -= [HL] 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 DE,WORK1 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] = [WORK2] / IX (IX < 8000H) MPDIV15: CALL CHECK_WORK RET C PUSH IX EXX POP DE XOR A LD H,A LD L,A SBC HL,DE LD B,H LD C,L LD H,A LD L,A 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 D,A LD E,A LD B,A MKDIVT_L1: SBC HL,BC INC A JR NC,MKDIVT_L1 DEC A ADD HL,BC LD (MKDIVT_Q+1),A LD A,L LD (MKDIVT_R+1),A LD L,D MKDIVT_L2: EX AF,AF' LD H,A EX AF,AF' LD (HL),D INC H LD (HL),E INC H LD (HL),B LD A,E MKDIVT_Q: ADD A,0 LD E,A JR NC,MKDIVT_L3 INC D MKDIVT_L3: LD A,B MKDIVT_R: ADD A,0 CP C JR C,MKDIVT_L4 SUB C INC DE MKDIVT_L4: LD B,A INC L JR NZ,MKDIVT_L2 RET ; [WORK2] /= N (use DIVTBL) ; out : if [WORK2]==0 CF=1 else CF=0 MPDIV8T: LD DE,WORK2 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 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 RET ; CF=0 ; [WORK3] = [WORK2] / divisor (use DIVTBL2) ; out : if [WORK2]==0 CF=1 else CF=0 MPDIV8T2: 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 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 RET ; CF=0 ; [DE] = [WORK2] / IX (0100H <= IX < 8000H) ; out : if [WORK2]==0 CF=1 else CF=0 MPDIV9_15: CALL CHECK_WORK RET C PUSH HL PUSH DE PUSH BC PUSH IX POP BC LD H,B LD L,C LD E,01H LD A,B CP 40H JP NC,MPDIV9_15_7 ADD HL,HL CP 20H JP NC,MPDIV9_15_6 ADD HL,HL CP 10H JP NC,MPDIV9_15_5 ADD HL,HL CP 08H JP NC,MPDIV9_15_4 ADD HL,HL CP 04H JP NC,MPDIV9_15_3 ADD HL,HL CP 02H JR NC,MPDIV9_15_2 ADD HL,HL MPDIV9_15_1: CALL MPDIV9_15_MAKETBL EX DE,HL EXX MPDIV9_15_1_L1: LD A,(HL) INC HL EXX LD D,L SRA H RR L MPDIV9_15_1_TBL: LD H,DIVTBL2_H ADD A,(HL) LD E,A INC H LD A,D ADC A,(HL) LD D,A INC H LD A,(HL) EX DE,HL JR NC,MPDIV9_15_1_L3 ADD HL,SP JR C,MPDIV9_15_1_L4 ADD HL,BC EXX LD (DE),A INC DE DJNZ MPDIV9_15_1_L1 MPDIV9_15_1_L2: DEC C JR NZ,MPDIV9_15_1_L1 LD SP,(PDIV_TMP) OR A RET MPDIV9_15_1_L3: DEC A ADD HL,BC EXX LD (DE),A INC DE DJNZ MPDIV9_15_1_L1 JR MPDIV9_15_1_L2 MPDIV9_15_1_L4: INC A EXX LD (DE),A INC DE DJNZ MPDIV9_15_1_L1 JR MPDIV9_15_1_L2 MPDIV9_15_2: LD E,04H LD A,0FCH MPDIV9_15_2_JUMP: LD (MPDIV9_15_2_AND+1),A CALL MPDIV9_15_MAKETBL EX DE,HL LD D,L EXX MPDIV9_15_2_L1: LD A,(HL) INC HL EXX MPDIV9_15_2_TBL: LD H,DIVTBL2_H ADD A,(HL) LD E,A INC H LD A,D ADC A,(HL) LD D,A INC H LD L,(HL) EX DE,HL MPDIV9_15_2_AND: LD A,0FCH JR NC,MPDIV9_15_2_L3 ADD HL,SP JR C,MPDIV9_15_2_L4 ADD HL,BC LD D,L AND L OR H LD L,A LD A,E EXX LD (DE),A INC DE DJNZ MPDIV9_15_2_L1 MPDIV9_15_2_L2: DEC C JR NZ,MPDIV9_15_2_L1 LD SP,(PDIV_TMP) OR A RET MPDIV9_15_2_L3: DEC E ADD HL,BC LD D,L AND L OR H LD L,A LD A,E EXX LD (DE),A INC DE DJNZ MPDIV9_15_2_L1 JR MPDIV9_15_2_L2 MPDIV9_15_2_L4: INC E LD D,L AND L OR H LD L,A LD A,E EXX LD (DE),A INC DE DJNZ MPDIV9_15_2_L1 JR MPDIV9_15_2_L2 MPDIV9_15_3: LD E,08H LD A,0F8H JR MPDIV9_15_2_JUMP MPDIV9_15_4: LD E,10H LD A,0F0H JR MPDIV9_15_2_JUMP MPDIV9_15_5: LD E,20H LD A,0E0H JR MPDIV9_15_2_JUMP MPDIV9_15_6: LD E,40H LD A,0C0H JR MPDIV9_15_2_JUMP MPDIV9_15_7: CALL MPDIV9_15_MAKETBL EX DE,HL EXX MPDIV9_15_7_L1: LD A,(HL) INC HL EXX LD D,L ADD HL,HL LD L,H MPDIV9_15_7_TBL: LD H,DIVTBL2_H ADD A,(HL) LD E,A INC H LD A,D ADC A,(HL) LD D,A INC H LD A,(HL) EX DE,HL JR NC,MPDIV9_15_7_L3 ADD HL,SP JR C,MPDIV9_15_7_L4 ADD HL,BC EXX LD (DE),A INC DE DJNZ MPDIV9_15_7_L1 MPDIV9_15_7_L2: DEC C JR NZ,MPDIV9_15_7_L1 LD SP,(PDIV_TMP) OR A RET MPDIV9_15_7_L3: DEC A ADD HL,BC EXX LD (DE),A INC DE DJNZ MPDIV9_15_7_L1 JR MPDIV9_15_7_L2 MPDIV9_15_7_L4: INC A EXX LD (DE),A INC DE DJNZ MPDIV9_15_7_L1 JR MPDIV9_15_7_L2 ; in : HL=normalized divisor(4000H..7FFFH), BC=divisor, E=inc pat ; out : BC=divisor, DE=0, SP=-divisor ; POP BC',DE',HL' MPDIV9_15_MAKETBL: PUSH BC LD A,E EX AF,AF' XOR A EX DE,HL LD H,A LD L,A SBC HL,BC PUSH HL LD (PDIV_TMP),SP LD SP,HL XOR A LD H,A LD L,A SBC HL,DE LD B,H LD C,L LD H,A LD L,A EXX EX AF,AF' LD C,A XOR A LD B,A LD H,A LD L,A MPDIV9_15_MT_L1: ADD HL,SP EXX ADD HL,BC RES 7,H EXX JR C,MPDIV9_15_MT_L2 EX DE,HL EX AF,AF' LD L,A ADD A,C ADC A,B EX AF,AF' MPDIV9_15_MT_TBL: LD H,DIVTBL2_H LD (HL),E INC H LD (HL),D INC H INC A LD (HL),A EX DE,HL JR NZ,MPDIV9_15_MT_L1 JR MPDIV9_15_MT_L3 MPDIV9_15_MT_L2: INC A JR NZ,MPDIV9_15_MT_L1 MPDIV9_15_MT_L3: LD SP,(PDIV_TMP) POP HL POP BC POP DE EXX POP BC POP DE POP HL EXX LD (PDIV_TMP),SP LD SP,HL LD H,A LD L,A EX DE,HL JP (HL) ; in : IX=divisor (8000H <= IX < 10000H), H=Table addr.H ; keep IX MAKE_DIVTBL16: LD B,H PUSH IX POP DE XOR A LD H,A LD L,A SBC HL,DE LD (PDIV_TMP),SP LD SP,HL LD H,A LD L,A LD E,A MKDIVT16_L1: INC A ADD HL,SP JR C,MKDIVT16_L2 EX DE,HL LD H,B LD (HL),E INC H LD (HL),D INC H LD (HL),A INC L EX DE,HL MKDIVT16_L2: OR A JR NZ,MKDIVT16_L1 LD SP,(PDIV_TMP) RET ; [WORK2] /= IX (8000H <= IX < 10000H, use DIVTBL) ; out : if [WORK2]==0 CF=1 else CF=0 MPDIV16T: LD DE,WORK2 CALL CHECK_WORK RET C EXX PUSH IX POP BC XOR A LD H,A LD L,A SBC HL,BC LD (PDIV_TMP),SP LD SP,HL LD H,A LD L,A EXX MPDIV16T_L1: LD A,(DE) EXX LD D,L LD L,H LD H,DIVTBL_H ADD A,(HL) LD E,A INC H LD A,D ADC A,(HL) LD D,A INC H LD A,(HL) EX DE,HL JR NC,MPDIV16T_L3 ADD HL,SP JR C,MPDIV16T_L4 ADD HL,BC EXX LD (DE),A INC DE DJNZ MPDIV16T_L1 MPDIV16T_L2: DEC C JR NZ,MPDIV16T_L1 LD SP,(PDIV_TMP) OR A RET MPDIV16T_L3: DEC A ADD HL,BC EXX LD (DE),A INC DE DJNZ MPDIV16T_L1 JR MPDIV16T_L2 MPDIV16T_L4: INC A EXX LD (DE),A INC DE DJNZ MPDIV16T_L1 JR MPDIV16T_L2 ; [WORK3] = [WORK2] / IX (8000H <= IX < 10000H, use DIVTBL2) ; out : if [WORK2]==0 CF=1 else CF=0 MPDIV16T2: LD DE,WORK3 CALL CHECK_WORK RET C EXX PUSH IX POP BC XOR A LD H,A LD L,A SBC HL,BC LD (PDIV_TMP),SP LD SP,HL LD H,A LD L,A EXX MPDIV16T2_L1: LD A,(HL) INC HL EXX LD D,L LD L,H LD H,DIVTBL2_H ADD A,(HL) LD E,A INC H LD A,D ADC A,(HL) LD D,A INC H LD A,(HL) EX DE,HL JR NC,MPDIV16T2_L3 ADD HL,SP JR C,MPDIV16T2_L4 ADD HL,BC EXX LD (DE),A INC DE DJNZ MPDIV16T2_L1 MPDIV16T2_L2: DEC C JR NZ,MPDIV16T2_L1 LD SP,(PDIV_TMP) OR A RET MPDIV16T2_L3: DEC A ADD HL,BC EXX LD (DE),A INC DE DJNZ MPDIV16T2_L1 JR MPDIV16T2_L2 MPDIV16T2_L4: INC A EXX LD (DE),A INC DE DJNZ MPDIV16T2_L1 JR MPDIV16T2_L2 ; 100”{ƒe[ƒuƒ‹‚ÆBCD•ÏŠ·ƒe[ƒuƒ‹‚ðì¬ MAKE_BCDTBL: XOR A LD L,A LD D,A LD E,A LD BC,100 MKBCDT_L1: LD H,MUL100TBL_H LD (HL),E INC H LD (HL),D INC H LD (HL),A EX DE,HL ADD HL,BC EX DE,HL ADD A,1 DAA INC L JR NZ,MKBCDT_L1 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: PUSH BC 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 ADD A,A ADD A,A ADD A,A 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 PUSH BC EXX POP BC EXX LD IX,BIN2BCD_L4 ADD IX,DE ; IX+=((-count)&7)*8 LD D,MUL100TBL_H LD B,MUL100TBL_H+1 XOR A JP (IX) BIN2BCD_L3: EXX BIN2BCD_L4: LD E,(HL) LD C,E EX DE,HL ADC A,(HL) EX DE,HL LD (HL),A DEC HL LD A,(BC) ; 8Bytes LD E,(HL) LD C,E EX DE,HL ADC A,(HL) EX DE,HL LD (HL),A DEC HL LD A,(BC) ; LD E,(HL) LD C,E EX DE,HL ADC A,(HL) EX DE,HL LD (HL),A DEC HL LD A,(BC) ; LD E,(HL) LD C,E EX DE,HL ADC A,(HL) EX DE,HL LD (HL),A DEC HL LD A,(BC) ; LD E,(HL) LD C,E EX DE,HL ADC A,(HL) EX DE,HL LD (HL),A DEC HL LD A,(BC) ; LD E,(HL) LD C,E EX DE,HL ADC A,(HL) EX DE,HL LD (HL),A DEC HL LD A,(BC) ; LD E,(HL) LD C,E EX DE,HL ADC A,(HL) EX DE,HL LD (HL),A DEC HL LD A,(BC) ; LD E,(HL) LD C,E EX DE,HL ADC A,(HL) EX DE,HL LD (HL),A DEC HL LD A,(BC) ; EXX DJNZ BIN2BCD_L3 DEC C JR NZ,BIN2BCD_L3 ADC A,B ADD HL,DE EXX INC B LD C,A LD A,(BC) POP DE LD (DE),A INC DE POP BC POP HL JR NC,BIN2BCD_L5 DEC HL DEC BC BIN2BCD_L5: EXX POP BC DEC BC LD A,B OR C JP NZ,BIN2BCD_L1 RET BIN2BCD_L6: POP BC 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