FORMAT/Strings.asm
2026-04-25 05:09:47 +10:00

321 lines
4.8 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;-----------------------------------------------------------------------
; 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
;-----------------------------------------------------------------------