NewsProductsSprinterSupportDownloadSprinter ForumAbout usLinksSite map Russian site

Russian
   >> Программирование для компьютера Sprinter
Thread views: 573 View all threadsNext thread*Threaded Mode

Pages in this thread: 1 | 2 | 3 | 4 | 5 | 6 | (show all)
MacBuster
(Registered Developer)
2003/05/22 09:58
Re: _printf() -- atof, ftoa new [re: Vasil]Reply to this post

> Откопал у себя еще процедурки.

Большое спасибо! Как раз то что надо. Осталось только переделать исходник в синтаксис Z80. В выходные сделаю.



MacBuster
(Registered Developer)
2003/05/22 11:25
printf() new [re: MacBuster]Reply to this post

Почти полноценная функция 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





Vasil
(Registered Developer)
2003/05/24 14:17
Re: _printf() -- atof, ftoa new [re: MacBuster]Reply to this post

>> Откопал у себя еще процедурки.
> Большое спасибо! Как раз то что надо.

Да не за что, общее дело делаем ;).

> Осталось только переделать исходник в синтаксис Z80. В выходные сделаю.

Давай дерзай ;).

P.S. Спасибо за printf(), молодец, хорошо по-работал. Мне определенно она понравилась ;).

P.S.S. Если тебе не шибко влом, кидани сюда свои процедурки плавающей арифметики ?.




MacBuster
(Registered Developer)
2003/05/26 10:41
Re: _printf() -- atof, ftoa new [re: Vasil]Reply to this post

Переделать исходники в синтаксис z80 пока не удалось, ассемблер упорно не желает их компилировать (я хотел их потом дизассемблировать). Попробую еще раз попозже.

> P.S.S. Если тебе не шибко влом, кидани сюда свои процедурки плавающей арифметики ?.

Я тебе лучше на e-mail их пошлю, т.к. они представляют собой часть статьи :)

P.S. Спасибо за отзыв, а то уже не знал что думать, все молчат ;)



cr0acker
(member)
2003/06/01 14:40
Re: _printf() -- atof, ftoa new [re: MacBuster]Reply to this post

может я не сюды задаю этот вопрос, но ч то в Аласме значит
LD h,'crc_tab



MacBuster
(Registered Developer)
2003/06/02 09:27
Re: _printf() -- atof, ftoa new [re: cr0acker]Reply to this post

> что в Аласме значит LD h,'crc_tab

Похоже на загрузку старшего байта адреса crc_tab в регистр H.



cr0acker
(member)
2003/06/02 09:52
Re: _printf() -- atof, ftoa new [re: MacBuster]Reply to this post

Да всеё верно 'crc_tab, загрузка старшего байта, .crc_tab загрузка младшего байта



Shaos
(Registered Developer)
2003/06/02 09:58
Re: printf() new [re: MacBuster]Reply to this post

> Почти полноценная функция printf().

Я не совсем понял как ентой функции аргюменты передавать

Alexander Shabarshin (shaos@mail.ru)
NedoPC Project

MacBuster
(Registered Developer)
2003/06/02 14:02
Re: printf() new [re: Shaos]Reply to this post

Перед вызовом необходимо поместить в регистровую пару HL адрес выводимой
строки. Например такой:


StrMessage db "A = %Xb\n",0x00
db 0xFF ; параметр для %Xb


На экране должно появиться следующее:A = FF

Shaos
(Registered Developer)
2003/06/02 15:04
Re: printf() new [re: MacBuster]Reply to this post

> StrMessage db "A = %Xb"\n,0x00
> db 0xFF ; параметр для %Xb

теперь понял :)



Alexander Shabarshin (shaos@mail.ru)
NedoPC Project


Pages in this thread: 1 | 2 | 3 | 4 | 5 | 6 | (show all)
View all threadsNext thread*Threaded Mode
Jump to