mirror of
https://github.com/Tolik-Trek/FORMAT.git
synced 2026-06-15 09:21:40 +03:00
321 lines
4.8 KiB
NASM
321 lines
4.8 KiB
NASM
;-----------------------------------------------------------------------
|
||
; 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
|
||
;<3B>à®æ¥¤ãà ¯à¥®¡à §®¢ ¨ï 8¡¨â®¢ëå ç¨á¥« ¢ è¥áâ ¤æ. ⥪áâ
|
||
;<3B> ¢å®¤:
|
||
; HL - ¤à¥á ¡ãä¥à
|
||
; € - ¡ ©â
|
||
;<3B> ¢ë室:
|
||
; ¡ãä¥à á ⥪áâ.ç¨á«®¬
|
||
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 - <20>ãä¥à ®¢®© áâப¨
|
||
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
|
||
;----------------------------------------------------------------------- |