(подсмотрено на ZXDB):
device zxspectrum128
ORG #6000
begin
;org 32179
_main:
ld hl,_txt
ld de,18432+(3*32) ; start pos
call _loop
jr $
_loop:
ld a,(hl) ; get text -> A=0x41
sub 0x20
ret c
push hl
add a,a ; x2
ld l,a
ld h,0
add hl,hl ; x4
add hl,hl ; x8
ld bc,0x3d00 ; rom font
add hl,bc ; hl now correct graphic
; plot font
push de
ld b,8
ld c,b ; c=8
_pltloop:
ld a,(hl)
inc hl
ld (de),a
inc d
; what to plot on 2nd line
push bc
push de
push hl
ld d,a
ld b,c ; b=8
ld e,(hl)
xor a
ld c,a
ld l,1
_testloop:
rrc d
jr nc,_testloop100
add a,l
inc l ; penalty for continuous bits +1
jr _testloop110
_testloop100:
ld l,1 ; reset cumulative counter
_testloop110:
rrc e
jr nc,_testloop120
inc c
_testloop120:
djnz _testloop
pop hl
cp c
ld a,d
jr z,_plotc
jr c,_plotc
ld a,(hl)
_plotc:
pop de
pop bc
ld (de),a
inc d
; over char line?
ld a,d
and %00000111
jr nz,_inchar
ld a,e
add a,32
ld e,a
ld a,d
sub c ; sub 8
ld d,a
_inchar:
djnz _pltloop
; onto next
pop de
pop hl
inc hl
inc e
jr _loop
;
_txt:
defb "Loading ",0x22,"ChuckieEgg",0x22," Please Wait",0
end
display /d,end-begin
savesna "!void.sna",begin
ORG #6000
begin
;org 32179
_main:
ld hl,_txt
ld de,18432+(3*32) ; start pos
call _loop
jr $
_loop:
ld a,(hl) ; get text -> A=0x41
sub 0x20
ret c
push hl
add a,a ; x2
ld l,a
ld h,0
add hl,hl ; x4
add hl,hl ; x8
ld bc,0x3d00 ; rom font
add hl,bc ; hl now correct graphic
; plot font
push de
ld b,8
ld c,b ; c=8
_pltloop:
ld a,(hl)
inc hl
ld (de),a
inc d
; what to plot on 2nd line
push bc
push de
push hl
ld d,a
ld b,c ; b=8
ld e,(hl)
xor a
ld c,a
ld l,1
_testloop:
rrc d
jr nc,_testloop100
add a,l
inc l ; penalty for continuous bits +1
jr _testloop110
_testloop100:
ld l,1 ; reset cumulative counter
_testloop110:
rrc e
jr nc,_testloop120
inc c
_testloop120:
djnz _testloop
pop hl
cp c
ld a,d
jr z,_plotc
jr c,_plotc
ld a,(hl)
_plotc:
pop de
pop bc
ld (de),a
inc d
; over char line?
ld a,d
and %00000111
jr nz,_inchar
ld a,e
add a,32
ld e,a
ld a,d
sub c ; sub 8
ld d,a
_inchar:
djnz _pltloop
; onto next
pop de
pop hl
inc hl
inc e
jr _loop
;
_txt:
defb "Loading ",0x22,"ChuckieEgg",0x22," Please Wait",0
end
display /d,end-begin
savesna "!void.sna",begin
Естественно, часть можно оптимизировать:
or a;sub 0x20
ret z;ret c
push hl
add a,a ; x2
ld l,a
ld h,0
add hl,hl ; x4
add hl,hl ; x8
ld bc,0x3C00 ; rom font-32*8
Дополнение. Программа немного оптимизирована. Добавлена версия на Бейсике:
10 LET a$="Loading "+CHR$ 34+"ChuckieEgg"+CHR$ 34+" Please Wait"
20 DIM n(256): FOR i=1 TO 21: READ x: FOR j=0 TO 2+(i<14): LET n(x+j)=1: NEXT j: NEXT i: DATA 1,9,17,33,41,65,73,81,129,137,145,161,169,5,21,37,69,85,133,149,165
30 LET u=USR "a": FOR i=1 TO LEN a$: LET q=15360+8* CODE a$(i): LET e=0: LET t=0: FOR k=0 TO 1: FOR b=0 TO 3: LET d=PEEK (q+b): LET n=n(d+1)
40 IF n=1 THEN LET e=t*d
50 LET r=u+b+b: POKE r,e: POKE r+1,d: LET e=d: IF e>0 THEN LET t=1
60 NEXT b: PRINT AT 5+k,i-1;"\a": LET q=q+4: NEXT k: NEXT i
20 DIM n(256): FOR i=1 TO 21: READ x: FOR j=0 TO 2+(i<14): LET n(x+j)=1: NEXT j: NEXT i: DATA 1,9,17,33,41,65,73,81,129,137,145,161,169,5,21,37,69,85,133,149,165
30 LET u=USR "a": FOR i=1 TO LEN a$: LET q=15360+8* CODE a$(i): LET e=0: LET t=0: FOR k=0 TO 1: FOR b=0 TO 3: LET d=PEEK (q+b): LET n=n(d+1)
40 IF n=1 THEN LET e=t*d
50 LET r=u+b+b: POKE r,e: POKE r+1,d: LET e=d: IF e>0 THEN LET t=1
60 NEXT b: PRINT AT 5+k,i-1;"\a": LET q=q+4: NEXT k: NEXT i
Дополнение 2. Еще вариант
device zxspectrum48
org $8000
drawtext:
ld hl,text
ld de,18432+(3*32) ; start pos
textloop:
ld a,(hl)
and a
ret z
push hl ; store text address
ld bc,$3C00 ; rom font
ld h,c
add a,a
ld l,a
add hl,hl
add hl,hl
add hl,bc
; keep screen address
push de
ld b,8
charloop:
ld a,(hl) ; value
ld c,a ; keep for later
;look for 2 contiguous bits
bitloop:
cp #C0
jr nc,twobits
add a,a
jr nz,bitloop
scf
jr secondline
twobits: ; found two bits together, display previous line
dec hl
ld c,(hl) ; get next line above instead
inc hl
secondline:
ld a,c
ld (de),a ; write
call linedown
ld a,(hl)
ld (de),a
call linedown
linedone:
inc hl ; next byte
djnz charloop
pop de
inc de
pop hl
inc hl
jr textloop
linedown:
inc d ; one line down
ld a,d
and 7
ret nz
ld a,e ; else add 32
add a,32
ld e,a
ret c
ld a,d ; else sub 8 from h
sub 8
ld d,a
ret
text:
defb "Loading ",0x22,"ChuckieEgg",0x22," Please Wait",0
savetap "bitfont.tap",drawtext
org $8000
drawtext:
ld hl,text
ld de,18432+(3*32) ; start pos
textloop:
ld a,(hl)
and a
ret z
push hl ; store text address
ld bc,$3C00 ; rom font
ld h,c
add a,a
ld l,a
add hl,hl
add hl,hl
add hl,bc
; keep screen address
push de
ld b,8
charloop:
ld a,(hl) ; value
ld c,a ; keep for later
;look for 2 contiguous bits
bitloop:
cp #C0
jr nc,twobits
add a,a
jr nz,bitloop
scf
jr secondline
twobits: ; found two bits together, display previous line
dec hl
ld c,(hl) ; get next line above instead
inc hl
secondline:
ld a,c
ld (de),a ; write
call linedown
ld a,(hl)
ld (de),a
call linedown
linedone:
inc hl ; next byte
djnz charloop
pop de
inc de
pop hl
inc hl
jr textloop
linedown:
inc d ; one line down
ld a,d
and 7
ret nz
ld a,e ; else add 32
add a,32
ld e,a
ret c
ld a,d ; else sub 8 from h
sub 8
ld d,a
ret
text:
defb "Loading ",0x22,"ChuckieEgg",0x22," Please Wait",0
savetap "bitfont.tap",drawtext
Комментарии
Отправить комментарий