Почти полноценная функция printf(). Пока не умеет только пищать после контрольного кода \a :) Выводит строку на экран символ за символом, если вам требуется выводить строку в буфер, измените OutputSymbl. Длинные слова надо сохранять в обратном порядке (сначала младшее слово, затем старшее; байты в словах также должны следовать в обратном порядке).
Ассемблер: z80asm
На входе: HL = адрес форматированной строки завершающейся нулём сразу за которым должны идти параметры в порядке их следования в строке
На выходе: ничего интересного :)
-> 2003 (с) Mac Buster^Extreme Entertainment
; \0 - нуль (конец строки)
; \\ - символ \
; \' - угловая минута, апостроф, одиночная кавычка
; \" - угловая секунда, двойная кавычка
; \a - звонок (не работает)
; \b - backspace - шаг назад
; \n - новая строка
; \r - в начало строки
; \t - горизонтальная табуляция
; \v - вертикальная табуляция
; %% - символ %
; %c - произволный печатный символ
; %s - подстрока (адрес строки), может содержать всё контрольные коды
; %xb - hex байт (a...f)
; %xw - hex слово (a...f)
; %xl - hex длинное слово (a...f)
; %Xb - hex байт (A...F)
; %Xw - hex слово (A...F)
; %Xl - hex длинное слово (A...F)
; %ub - десятичный байт без знака
; %uw - десятичное слово без знака
; %ul - десятичное длинное слово без знака
; %db - десятичный байт со знаком
; %dw - десятичное слово со знаком
; %dl - десятичное длинное слово со знаком
Printf Push Hl
Printf_ Ld A,(Hl)
Inc Hl
Or A
Jr Nz,Printf_
Ex De,Hl
Pop Hl
__Printf Ld A,(Hl)
Inc Hl
Or A
Ret Z
Cp "\"
Jp Z,CtrlSymbol
Cp "%"
Jp Z,CtrlPrefix
Call OutputSymbl
Jp __Printf
CtrlSymbol Ld A,(Hl)
Inc Hl
Call CtrlSymbol_
Jp __Printf
CtrlSymbol_ Cp "\"
Jr Nz,CtrlSymbol0
Call OutputSymbl
Ret
CtrlSymbol0 Cp "n"
Jr Nz,CtrlSymbol1
Ld A,0x0D
Call OutputSymbl
Ld A,0x0A
Call OutputSymbl
Ret
CtrlSymbol1 Cp "t"
Jr Nz,CtrlSymbol2
Ld B,0x08
.CtrlSymbol Ld A,0x20
Call OutputSymbl
Djnz .CtrlSymbol
Ret
CtrlSymbol2 Cp 0x27
Jr Nz,CtrlSymbol3
Call OutputSymbl
Ret
CtrlSymbol3 Cp 0x22
Jr Nz,CtrlSymbol4
Call OutputSymbl
Ret
CtrlSymbol4 Cp "?"
Jr Nz,CtrlSymbol5
Call OutputSymbl
Ret
CtrlSymbol5 Cp "r"
Jr Nz,CtrlSymbol6
Ld A,0x0D
Call OutputSymbl
Ret
CtrlSymbol6 Cp "b"
Jr Nz,CtrlSymbol7
Push Bc
Push De
Push Hl
Ld Bc,0x0053
Rst 0x10
Ld A,E
Or A
Jr Z,.CtrlSymbol
Dec E
Ld Bc,0x0052
Rst 0x10
.CtrlSymbol Pop Hl
Pop De
Pop Bc
Ret
CtrlSymbol7 Cp "a"
Jr Nz,CtrlSymbol8
; Call Bell
Ret
CtrlSymbol8 Cp "0"
Jr Nz,CtrlSymbol9
Pop Af
Ret
CtrlSymbol9 Cp "v"
Ret Nz
Ld B,0x08
.CtrlSymbol Ld A,0x0A
Call OutputSymbl
Djnz .CtrlSymbol
Ret
CtrlPrefix Ld A,(Hl)
Inc Hl
Call CtrlPrefix_
Jp __Printf
CtrlPrefix_ Cp "%"
Jr Nz,CtrlPrefix0
Call OutputSymbl
Ret
CtrlPrefix0 Cp "c"
Jr Nz,CtrlPrefix1
Ld A,(De)
Inc De
Call OutputSymbl
Ret
CtrlPrefix1 Cp "s"
Jr Nz,CtrlPrefix2
Push Hl
Ex De,Hl
Ld E,(Hl)
Inc Hl
Ld D,(Hl)
Inc Hl
Ex De,Hl
Push De
Call Printf
Pop De
Pop Hl
Ret
CtrlPrefix2 Cp "x"
Jr Nz,CtrlPrefix3
Ld C,0x20
Ld A,(Hl)
Inc Hl
Cp "b"
Jr Nz,CtrlPrfx2_0
Call Byte2HEX
Inc De
Ret
CtrlPrfx2_0 Cp "w"
Jr nz,CtrlPrfx2_1
Call Word2HEX
Ret
CtrlPrfx2_1 Cp "l"
Jr Nz,CtrlPrfx2_2
Call Long2HEX
Ret
CtrlPrfx2_2 Dec Hl
Ret
CtrlPrefix3 Cp "X"
Jr Nz,CtrlPrefix4
Ld C,0x00
Ld A,(Hl)
Inc Hl
Cp "b"
Jr Nz,CtrlPrfx3_0
Call Byte2HEX
Inc De
Ret
CtrlPrfx3_0 Cp "w"
Jr nz,CtrlPrfx3_1
Call Word2HEX
Ret
CtrlPrfx3_1 Cp "l"
Jr Nz,CtrlPrfx3_2
Call Long2HEX
Ret
CtrlPrfx3_2 Dec Hl
Ret
CtrlPrefix4 Cp "d"
Jr Nz,CtrlPrefix5
Ld A,(Hl)
Inc Hl
Cp "b"
Jr Nz,CtrlPrfx4_0
Push Hl
Push De
Call Byte2DEC
Pop De
Inc De
Pop Hl
Ret
CtrlPrfx4_0 Cp "w"
Jr Nz,CtrlPrfx4_1
Push Hl
Push De
Call Word2DEC
Pop De
Inc De
Inc De
Pop Hl
Ret
CtrlPrfx4_1 Cp "l"
Jr Nz,CtrlPrfx4_2
Push Hl
Push De
Call Long2DEC
Pop De
Ld Hl,0x0004
Add Hl,De
Ex De,Hl
Pop Hl
Ret
CtrlPrfx4_2 Dec Hl
Ret
CtrlPrefix5 Cp "u"
Jr Nz,CtrlPrefix6
Ld A,(Hl)
Inc Hl
Cp "b"
Jr Nz,CtrlPrfx5_0
Push Hl
Push De
Call uByte2DEC
Pop De
Inc De
Pop Hl
Ret
CtrlPrfx5_0 Cp "w"
Jr Nz,CtrlPrfx5_1
Push Hl
Push De
Call uWord2DEC
Pop De
Inc De
Inc De
Pop Hl
Ret
CtrlPrfx5_1 Cp "l"
Jr Nz,CtrlPrfx5_2
Push Hl
Push De
Call uLong2DEC
Pop De
Ld Hl,0x0004
Add Hl,De
Ex De,Hl
Pop Hl
Ret
CtrlPrfx5_2 Dec Hl
Ret
CtrlPrefix6
Ret
Long2HEX Push De
Call Word2HEX
Pop De
Inc De
Inc De
Call Word2HEX
Ret
Word2HEX Inc De
Call Byte2HEX
Dec De
Call Byte2HEX
Inc De
Inc De
Ret
Byte2HEX Ld A,(De)
Push Af
And 0xF0
Rrca
Rrca
Rrca
Rrca
Call .Byte2HEX
Pop Af
.Byte2HEX And 0x0F
Cp 0x0A
Sbc A,0x69
Daa
Or C
Call OutputSymbl
Ret
Long2DEC Ld IX,Num2DEClong
Ld A,(De)
Ld L,A
Inc De
Ld A,(De)
Ld H,A
Push Hl
Ld A,(De)
Ld L,A
Inc De
Ld A,(De)
Bit 7,A
Jr Z,uLong2DEC_
Res 7,A
Push Af
Ld A,"-"
Call OutputSymbl
Pop Af
Jr uLong2DEC_
Word2DEC Ld IX,Num2DECword
Ld A,(De)
Ld L,A
Inc De
Ld A,(De)
Bit 7,A
Jr Z,uWord2DEC_
Res 7,A
Push Af
Ld A,"-"
Call OutputSymbl
Pop Af
Jr uWord2DEC_
Byte2DEC Ld IX,Num2DECbyte
Ld H,0x00
Ld A,(De)
Bit 7,A
Jr Z,uByte2DEC_
Res 7,A
Push Af
Ld A,"-"
Call OutputSymbl
Pop Af
Jr uByte2DEC_
uLong2DEC Ld IX,Num2DEClong
Ld A,(De)
Ld L,A
Inc De
Ld A,(De)
Ld H,A
Inc De
Push Hl
Ld A,(De)
Ld L,A
Inc De
Ld A,(De)
uLong2DEC_ Ld H,A
Exx
Pop Hl
Exx
Ld B,0x0A
uLong2DEC0 Push Bc
Call uByte2DEC0
Pop Bc
Djnz uLong2DEC0
Ret
uWord2DEC Ld IX,Num2DECword
Ld A,(De)
Ld L,A
Inc De
Ld A,(De)
uWord2DEC_ Ld H,A
Exx
Ld Hl,0x0000
Ld B,0x05
Jp uLong2DEC0
uByte2DEC Ld IX,Num2DECbyte
Ld H,0x00
Ld A,(De)
uByte2DEC_ Ld L,A
Exx
Ld Hl,0x0000
Call uByte2DEC0
Call uByte2DEC0
uByte2DEC0 Ld A,0x2F
Ld E,(IX+00)
Inc IX
Ld D,(IX+00)
Inc IX
Exx
Ld E,(IX+00)
Inc IX
Ld D,(IX+00)
Inc IX
And A
.uByte2DEC Inc A
Sbc Hl,De
Exx
Sbc Hl,De
Exx
Jr Nc,.uByte2DEC
Add Hl,De
Exx
Adc Hl,De
OutputSymbl Push Hl
Push De
Push Bc
Ld Bc,0x005B
Rst 0x10
Pop Bc
Pop De
Pop Hl
Ret
Num2DEClong dw 0x3B9A,0xCA00
dw 0x05F5,0xE100
dw 0x0098,0x9680
dw 0x000F,0x4240
dw 0x0001,0x86A0
Num2DECword dw 0x0000,0x2710
dw 0x0000,0x03E8
Num2DECbyte dw 0x0000,0x0064
dw 0x0000,0x000A
dw 0x0000,0x0001
|