"27 text lines" kodundaki pixel_print bölümüne bir "inc a" komutu ekleyerek ekrana iki karakter yüksekliğinde ama birer pixel satırı boş kalacak şekilde yazı yazdırıyoruz. Ancak döngü kullanmayıp bunun yerine yazının ekranda bulunan yerin border rengini değiştirecek şekilde bir ilave yaptım. Yazıyı 0...176 pixel satırları arasında yazdırıyoruz. Kod üzerinde biraz uğraşarak renk belleğinde border/paper veya border/ink rengi eşitlenebilir.
;========================================
; Double Height Text On Any Pixel Line
; 22.05.2022 - HADES/RET
;========================================
org $8000
defs 257,$81
;----------------------------------------
; Ekran Piksel Satır Adres Üreteci
;----------------------------------------
adr_gen ld de,$4000
ld hl,tablo
loop02 ld c,8
loop01 ld b,8
loop00 ld (hl),e
inc hl
ld (hl),d
inc d
inc hl
djnz loop00
ld a,e
add a,$20
ld e,a
ld a,d
sub 8
ld d,a
dec c
jr nz,loop01
add a,8
ld d,a
cp $58
jr nz,loop02
call $0db6 ; ekranı sil
;-----------------------------------------
; 32 karakterlik yazıyı ekrana bas.
;-----------------------------------------
pixel_print ld b,32 ; text uzunluğu. Kolon numarası 0'dan
; büyükse text uzunluğu daha az olmalıdır.
ld hl,text
loop03 push bc ; yazı uzunluğunu yığına at
push hl ; text adresini yığına at
;----------------------------------------
; Y pixel pozisyonuna bir karakter bas.
; Önce fontun data adresini hesapla.
;----------------------------------------
print ld a,(hl)
ld d,0
rla
rl d
rla
rl d
rla
rl d
ld e,a
ld ix,(23606) ; karakter setinin başlangıç adresi
add ix,de ; IX registerinde font data adresi var
;----------------------------------------
; y_pixel değerine göre pixel satır
; adresini hesapla ve tablodaki yerini bul
; pixel satırının adresi=y_pixel*2 + tablo başlangıç adresi
;----------------------------------------
ld b,8
ld a,(y_pixel)
loop04 ld c,a
ld h,0
rla
rl h
ld l,a
ld de,tablo
add hl,de
ld e,(hl) ; E'de pixel satır adresinin LO baytı var
inc hl
ld d,(hl) ; D'de pixel satır adresinin HI baytı var
ld a,(kolon)
adc a,e
ld e,a
;----------------------------------------
; Font datasını ekrana bas.
;----------------------------------------
ld a,(ix+0)
ld (de),a
inc d
inc ix
ld a,c
inc a ; bir sonraki y_pixel değeri
;----------------------------------------
inc a ; bu komut eklendi
;----------------------------------------
djnz loop04
;----------------------------------------
; Bir sonraki karakterin yerini ayarla
;----------------------------------------
ld hl,kolon
inc (hl)
pop hl
inc hl ; textin bir sonraki karakteri
pop bc
djnz loop03 ; karakter sayacı
;----------------------------------------
; IM 2 setup
;----------------------------------------
di
ld a,$80
ld i,a
im 2
ei
;----------------------------------------
halt
zzz jr zzz
;----------------------------------------
org $8181
ld bc,548
delay dec bc
ld a,b
or c
jr nz,delay
ld a,(y_pixel)
cp 0
jr z,cont
ld c,a
wait1 ld b,16
wait djnz wait
dec c
jr nz,wait1
cont ld a,4 ; border yeşil
out (254),a
ld b,0
wait2 djnz wait2
ld b,30
wait3 djnz wait3
ld a,0 ; border siyah
out (254),a
ei
ret
;----------------------------------------
text defm "DoubleHeightText On AnyPixelLinE"
;----------------------------------------
y_pixel defb 107 ; Yazının yazılacağı pixel satırı
kolon defb 0
;----------------------------------------
tablo
;----------------------------------------
end $8000
;========================================