Shared_Includes/printf.asm
2024-08-15 04:23:15 +10:00

405 lines
5.4 KiB
NASM
Executable File
Raw Blame History

MODULE printf#
cmd EQU 16
;universal color print to console procedure like printf()
;in: IY
str: PUSH IY
LD C,Dss.Cursor
RST ToDSS
LD (coords),DE
POP IY
;
LD L,(IY) ; at iy we have pointer to format string
LD H,(IY+1)
loop: LD A,(HL)
INC HL
OR A
RET Z
CP '%'
JR Z,loc3
loc4: CALL outch
JP loop
loc3: LD A,(HL)
INC HL
CP '%'
JR Z,loc4
DEC HL
CALL scan_length ; scan [-][0][0-9*][lL]
loop1: LD A,(HL)
INC HL
CP 'x'
JP Z,prt_x1
CP 'X'
JP Z,prt_x2 ; hexadecimal
;
AND %1101'1111
;
CP 'D'
JP Z,prt_d ; signed decimal
CP 'U'
JP Z,prt_u ; unsigned decimal
CP 'L'
JP Z,prt_l ; long
CP 'C'
JP Z,prt_c ; print single character
CP 'O'
JP Z,prt_o ; octal
CP 'S'
JP Z,prt_s ; string
JP loop
; %l - long
prt_l: LD (flong),A
INC HL
JP loop1
; %c symbol
prt_c: LD A,(iy+2)
CALL outch
; ld de,(nprtd+1)
; inc de
; ld (nprtd+1),de
prt_q: INC IY
INC IY
LD A,(flong)
OR A
JP Z,loop ; false
INC IY
INC IY
JP loop
; %s string
prt_s: LD A,' '
LD (padch),A
PUSH HL
PUSH IY
LD L,(iy+2)
LD H,(iy+3)
fmt0: PUSH HL
CALL _strlen
EX DE,HL
LD HL,(flen)
LD A,H
OR L
JR Z,fmt01
; call _pad
; or a
SBC HL,DE
LD (flen),HL
LD A,(fladj)
OR A
CALL Z,_pad
fmt01:
POP HL
fmt1: LD A,(HL)
INC HL
OR A
JR Z,fmt21
CALL outch
; ld de,(nprtd+1)
; inc de
; ld (nprtd+1),de
JP fmt1
fmt2:
LD HL,(flen)
LD A,(fladj)
OR A
CALL NZ,_pad
fmt21: POP IY
POP HL
JP prt_q
; %u unsigned decimal
prt_u: PUSH HL
PUSH IY
CALL getnum
JR fmt4
; %d signed decimal
prt_d: PUSH HL
PUSH IY
CALL getnum
LD A,(flong)
OR A
JR NZ,fmt3 ; true
BIT 7,H
JR Z,fmt3
LD DE,-1
fmt3: BIT 7,D
JR Z,fmt4
LD A,'-'
LD (sign),A
XOR A
SUB L
LD L,A
LD A,0
SBC A,H
LD H,A
LD A,0
SBC A,E
LD E,A
LD A,0
SBC A,D
LD D,A
fmt4: LD A,10 ; base
LD BC,char1
CALL mk_num
JP fmt0
; %o octal
prt_o: PUSH HL
PUSH IY
CALL getnum
LD A,8 ; base
LD BC,char1
CALL mk_num
JP fmt0
; %X hex
prt_x2: LD BC,char1
prt_x: PUSH HL
PUSH IY
CALL getnum
LD A,16 ; base
CALL mk_num
JP fmt0
; %x hex
prt_x1: LD BC,char2
JR prt_x
;---------------------------------------
getnum: XOR A
LD (sign),A
LD L,(iy+2)
LD H,(iy+3)
LD A,(flong)
OR A
JR Z,gnu1 ; false
LD E,(iy+4)
LD D,(iy+5)
RET
gnu1: LD DE,0
RET
mk_num: LD (mn0+1),A ; base
LD (chars),BC
EXX
LD HL,number
EXX
CALL mn0
EXX
LD (HL),0
EXX
LD HL,number
LD A,(sign)
OR A
RET Z
DEC HL
RET
mn0: LD BC,0x200a
XOR A
mn1: ADD HL,HL
RL E
RL D
RLA
CP C
JR C,mn2
SUB C
INC L
mn2: DJNZ mn1
; DEHL-quot; A-rem
PUSH AF
LD A,D
OR E
OR H
OR L
CALL NZ,mn0
POP AF
PUSH HL
chars+1: LD HL,char1 ; save char1 or char2
LD C,A
LD B,0
ADD HL,BC
LD A,(HL)
POP HL
EXX
LD (HL),A
INC HL
EXX
RET
scan_length:
XOR A
LD (flong),A ; false
LD (fladj),A
LD (flen+0),A ; make length = 0
LD (flen+1),A
LD A,' '
LD (padch),A ; space padding by default
LD A,(HL)
CP '-'
JR NZ,.sl1
LD (fladj),A ; all will be LEFT adjusted, not right
INC HL
.sl1: LD A,(HL)
CP '0'
JR NZ,sl2
LD A,(fladj)
OR A
JR NZ,sl1a
LD A,'0'
LD (padch),A ; pad numbers with '0's, not spaces
sl1a: INC HL
sl2: LD DE,0
sl2a: LD A,(HL)
SUB '0'
JR C,sl3
CP 9+1
JR NC,sl3
EX DE,HL
LD C,L
LD B,H
ADD HL,HL
ADD HL,HL
ADD HL,BC
ADD HL,HL
LD B,0
LD C,A
ADD HL,BC
EX DE,HL
INC HL
JR sl2a
sl3: LD (flen),DE ; set explicit length
LD A,(HL)
CP 'l'
JR Z,sl4
CP 'L'
RET NZ
sl4: LD (flong),A ; true
INC HL
RET
_pad: DEC HL
BIT 7,H
RET NZ
PUSH HL
LD A,(padch)
CALL outch
POP HL
; ld de,(nprtd+1)
; inc de
; ld (nprtd+1),de
JP _pad
_strlen: EX DE,HL
LD HL,0
.loop0: LD A,(DE)
OR A
RET Z
INC HL
INC DE
JR .loop0
;---------------------------------------
outch: PUSH IY
PUSH HL
CP "\r"
JP Z,.new_line
CP "\n"
JP Z,.prtNullX
CP "\t"
JP Z,.tabpr
CP cmd
JP Z,.set_attr
.next0: EX AF,AF
LD DE,(coords)
LD A,(print_attr)
LD B,A
EX AF,AF'
LD C,Dss.WrChar
RST ToDSS
LD A,(coords)
INC A
CP 80 ;<3B><><EFBFBD><EFBFBD><E0A4A8><EFBFBD><EFBFBD> <20><> X 0..79 (<28><EFBFBD> 80)
JR NC,.new_line ;<3B><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>.
LD (coords),A
.end_pr: POP HL
POP IY
RET
.new_line: LD A,(coords+1) ;Y
CP 31
JR C,.noscroll
CALL .ScrollUP
JR .prtNullX
.noscroll: INC A
LD (coords+1),A ;y
.prtNullX: XOR A
LD (coords),A ;x
JR .end_pr
.ScrollUP: XOR A
LD D,A
LD E,A
LD HL,0x2050
LD BC,Dss.Scroll.Up
XOR A
RST ToDSS
RET
.tabpr: LD C,Dss.Cursor
RST ToDSS
INC E ;x++
LD A,E
ADD A,8
AND 0x78
LD E,A
LD (coords),DE
LD C,Dss.Locate
RST ToDSS
JP .end_pr
;Set attribute
.set_attr: LD A,(HL)
LD (print_attr),A
POP HL
POP IY
INC HL
RET
; jp .end_pr
char1: DB '0123456789ABCDEF'
char2: DB '0123456789abcdef'
flen: DW 0
fladj: DB 0
flong: DB 0 ; false/true
padch: DB ' '
sign: DB 0 ; <20><><EFBFBD><EFBFBD> <20><>
number: DS 16 ; <20><><EFBFBD><EFBFBD><EFBFBD> <20><>
coords: DW 0000
print_attr: DB 7
ENDMODULE