;----------------------------------------------------------------------- ; Enin Anton, Anatoliy Belyanskiy ; A:HL':HL - число для перевода ; A:HL:DE - число для перевода ; BC - буфер для текстовой строки PRINT_5BYTES: PUSH BC ; PUSH HL EXX POP HL EXX EX DE,HL ; LD IX,L40BIT.Str ; "00" LD C,#17 EXX LD DE,#4876 EXX LD DE,#E800 ; C:DE':DE = 100,000,000,000 CALL GET_BIG_DIG LD C,#02 EXX LD DE,#540B EXX LD DE,#E400 ; C:DE':DE = 10,000,000,000 CALL GET_BIG_DIG LD C,#00 EXX LD DE,#3B9A EXX LD DE,#CA00 ; C:DE':DE = 1,000,000,000 CALL GET_BIG_DIG ; DE':DE = 100,000,000 CALL .skip_1 ; ; форматирование по разрядам POP DE ; "000.000.000.000" PUSH DE LD HL,L40BIT.Str ; "000000000000" LDI LDI LD A,(HL) LDI CP " " JR Z,1F ; LD A,"." ; разд. разрядов 1: LD (DE),A INC DE LDI LDI LD A,(HL) LDI CP " " JR Z,1F ; LD A,"." ; разд. разрядов 1: LD (DE),A INC DE LDI LDI LD A,(HL) LDI CP " " JR Z,1F ; LD A,"." ; разд. разрядов 1: LD (DE),A INC DE LDI LDI LDI ; POP HL LD D,H LD E,L LD BC,15 + 1 ;!HARDCODE длина выходного буфера с форматированным числом .loop_space: DEC C INC B LD A,(HL) INC HL SUB ' ' JR Z,.loop_space ; DEC HL LD A,B LD B,0 LDIR LD B,A EX DE,HL .loop2: LD (HL),' ' INC HL DJNZ .loop2 RET ; .skip_1: EXX LD DE,#05F5 EXX LD DE,#E100 ; DE':DE = 100,000,000 CALL GET_DIG ; 100,000,000...999,999,999 EXX LD DE,#98 EXX LD DE,#9680 ; DE':DE = 10,000,000 CALL GET_DIG ; 10,000,000...99,999,999 EXX LD DE,#0F EXX LD DE,#4240 ; DE':DE = 1,000,000 CALL GET_DIG ; 1,000,000...9,999,999 EXX LD DE,#01 EXX LD DE,#86A0 ; DE':DE = 100,000 CALL GET_DIG ; 100,000...999,999 EXX LD DE,#00 EXX LD DE,#2710 ; DE':DE = 10,000 CALL GET_DIG ; 10,000...99,999 EXX LD DE,#00 EXX LD DE,#03E8 ; DE':DE = 1,000 CALL GET_DIG ; 1,000...9,999 EXX LD DE,#00 EXX LD DE,#64 ; DE':DE = 100 CALL GET_DIG ; 100..999 EXX LD DE,#00 EXX LD DE,#0A ; DE':DE = 10 CALL GET_DIG ; 10..99 LD A,L ADD A,"0" LD (ix+0),A INC IX RET ; GET_DIG: LD A,"0"-1 AND A .loop: INC A SBC HL,DE EXX SBC HL,DE EXX JR NC,.loop ; ADD HL,DE EXX ADC HL,DE EXX CP "0" JR NZ,.putChar ; LD B,A LD A,(ix-1) CP " " JR Z,.putChar ; LD A,B .putChar: LD (ix+0),A INC IX RET ; GET_BIG_DIG: LD B,"0"-1 AND A .loop: INC B SBC HL,DE EXX SBC HL,DE EXX SBC A,C JR NC,.loop ; ADD HL,DE EXX ADC HL,DE EXX ADC A,C EX AF,AF' LD A,B CP "0" JR NZ,.putChar ; LD A,(ix-1) CP " " JR Z,.putChar ; LD A,B .putChar: LD (ix+0),A EX AF,AF' INC IX RET ; L40BIT: DB " " ; маркер для ix-1 .Str: DB " 0" ; 12 знаков ; ; SIZE_BUFFER: db " " ; маркер для ix-1 ; .high db " " ; "00" ; .low: db " ",0,0 ; "0 000 000 000",0,0 ; .bytes equ SIZE_BUFFER - $ ;----------------------------------------------------------------------- ;----------------------------------------------------------------------- ; Enin Anton ;Процедура преобразования 8битовых чисел в шестнадц. текст ;На вход: ; HL - адрес буфера ; А - байт ;На выход: ; буфер с текст.числом IFUSED PutHexNumb PutHexNumb: PUSH AF RRCA RRCA RRCA RRCA AND #0F ADD A,#90 DAA ADC A,#40 DAA LD (HL),A INC L POP AF AND #0F ADD A,#90 DAA ADC A,#40 DAA LD (HL),A INC L RET ENDIF ;----------------------------------------------------------------------- ;----------------------------------------------------------------------- ; HL - Строка с лишними пробелами ; DE - Буфер новой строки SKIP_DUBLESPACES: LD A,(HL) AND A RET Z ; SUB ' ' JR NZ,.loop ; INC HL JR SKIP_DUBLESPACES ; .loop LDI LD A,(HL) AND A RET Z ; SUB ' ' JR NZ,.loop LDI JR SKIP_DUBLESPACES ;----------------------------------------------------------------------- ;███████████████████████████████████████████████████████████████████████ ;███████████████████████████████████████████████████████████████████████ ;███████████████████████████████████████████████████████████████████████ ;----------------------------------------------------------------------- ; IN: DE - (string decimal) ; OUT: HL - string to word ; DE - addr next after string decimal ;!FIXIT проверка на пустую строку STR_TO_WORD: LD HL,0 .loop: LD B,H LD C,L ; ADD HL,HL ;x2 RET C ADD HL,HL ;x4 RET C ADD HL,BC ;x5 RET C ADD HL,HL ;x10 RET C ; LD B,0 LD C,A ADD HL,BC RET C ; LD A,(DE) OR A RET Z CP ' ' RET Z ; CP '9'+1 CCF RET C SUB '0' RET C ; INC DE JR .loop ;-----------------------------------------------------------------------