home *** CD-ROM | disk | FTP | other *** search
- ;************************************************************************
- ;* *
- ;* formatiere Strings *
- ;* IY ist Adresse der Ausgaberoutine *
- ;* alle Register werden gerettet *
- ;* B holds number of used arguments *
- ;* *
- ;************************************************************************
-
- .z80 ;
- entry _printf ;
-
- cr equ 13 ;
- lf equ 10 ;
-
- getarg macro ;
- inc hl ;
- inc b ;
- ex (sp),hl ;
- pop de ;
- ex (sp),hl ;
- push de ;
- endm ;
-
- _printf: ld b,0 ;
- printf_main: ld a,(hl) ; Zeichen
- or a ; 0 = Ende!
- ret z ;
- inc hl ; point to next char
- cp '\' ; DataLinkEscape?
- jr z,special_char ;
- cp '%' ; insert-Byte?
- jr z,insrt_number ;
- cp '^' ; ctrl-char?
- jr z,ctrl_char ;
- out_this: call _iy ; output Akku
- jr printf_main ;
-
- ctrl_char: ld a,(hl) ;
- sub '@' ;
- cp ' ' ; must be less...
- jr nc,printf_main ; then try again
- inc hl ;
- jr out_this ;
-
- special_char: ld a,(hl) ;
- cp ' ' ; must be greater
- jr c,printf_main ;
- inc hl ;
- cp 'n' ; for cr,lf
- jr nz,out_this ;
- ld a,cr ;
- call _iy ;
- ld a,lf ;
- jr out_this ;
-
- insrt_number: ld ix,tab_base ;
- call _parms## ; get base & other spec. values
- ; returns carry, if error
- jr c,printf_main ; printout: ignore error
-
- jp p,calc_base ;
- cp 0ffh ; 's' = string
- jr z,prstring ;
- cp 0feh ;
- jr nz,printf_main ;
-
- prchar: getarg ;
- ld a,(n_digit) ;
- ld c,1 ;
- cp 0ffh ;
- jr z,many_c ;
- ld c,a ;
- many_c: ld a,l ;
- call _iy ;
- dec c ;
- jr nz,many_c ;
- ende_str: pop hl ;
- jp printf_main ;
-
- prstring: getarg ;
- loop_str: ld a,(n_digit) ;
- cp 0ffh ;
- jr nz,n_str ;
- long_str: ld a,(hl) ;
- or a ;
- jr z,ende_str ;
- call _iy ;
- inc hl ;
- jr long_str ;
-
- n_str: ld c,a ;
- out_str: ld a,(hl) ;
- or a ;
- jr z,n_ende ;
- call _iy ;
- inc hl ;
- dec c ;
- jr nz,out_str ;
- jr ende_str ;
- n_ende: ld l,' ' ;
- jr many_c ;
-
- calc_base: push hl ;
- ld c,1 ;
- ld l,a ;
- ld h,0 ;
- calc_loop: ld (ix+0),l ;
- inc ix ;
- ld (ix+0),h ;
- inc ix ;
- inc c ;
- push bc ;
- ld c,a ;
- call _multa## ;
- ld a,c ;
- pop bc ;
- jr nc,calc_loop ;
- pop hl ;
- ld a,c ;
- ld (noch_digit),a ;
-
- getarg ;
-
- ld a,(mask_h) ;
- and h ; do not use top Byte
- ld h,a ;
- push bc ; Unterprogramm, druckt HL dezimal aus
- ld a,(noch_digit) ; Anzahl der Stellen
- dec a ;
- ld b,a ;
- one_digit: push de ;
- dec ix ;
- ld d,(ix+0) ;
- dec ix ;
- ld e,(ix+0) ;
- ld a,-1 ;
- einen_mehr: or a ;
- sbc hl,de ;
- inc a ;
- jr nc,einen_mehr ;
- add hl,de ; letzten ung}ltig machen
- pop de ;
- call nib_out ; Ausgabe des Zeichens
- djnz one_digit ; n{chste Stelle ausrechnen
- pop bc ;
- ld a,l ; Einer
- call nib_out ;
- pop hl ;
- jp printf_main ;
-
- nib_out: cp 10 ;
- jr c,digit ;
- add a,' '+7 ; Char offset
- digit: add a,'0' ;
- ld c,a ;
- ld a,(noch_digit) ;
- dec a ;
- ld (noch_digit),a ;
- ld a,c ;
- jr z,_iy ; letzte Ziffer immer ganz raus
- ld a,(n_digit) ;
- cp 0ffh ;
- jr nz,no_long ;
- ld a,c ;
- cp '0' ; keine L{ngenangabe, unterschlage f}hrende Nullen
- ret z ;
- call _iy ;
- ld a,(noch_digit) ;
- ld (n_digit),a ;
- ld a,'0' ;
- ld (leading),a ; sind n{mlich nicht mehr leading...
- ret ;
- no_long: dec a ;
- sub 0 ;
- noch_digit equ $-1 ;
- ret c ; wenn zu lang...
- ld a,c ;
- cp '0' ;
- jr nz,no_zero ;
- ld a,(leading) ;
- jr _iy ;
- no_zero: ld a,'0' ;
- ld (leading),a ;
- ld a,c ;
- _iy: jp (iy) ;
-
- dseg ;
- mask_h: db 0 ;
- n_digit: db 0ffh ;
- leading: db ' ' ;
- tab_base: dw 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15;f}r base 2 reicht es
- cseg ;
-
- end ;
-