Gönderen Konu: Z80 Makine diline meraklı olan?  (Okunma sayısı 104423 defa)

0 Üye ve 3 Ziyaretçi konuyu incelemekte.

Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 179
Oyunlardan Ekran Araklama
« Yanıtla #75 : 27 Nisan 2015, 21:42:07 »
Yazdığım kodları denemek için bazen tam ekran görüntü lazım oluyor. Kullandığım emulator SpecEmu. Bu emulatörde File menüsünde Save Screen seçeneği var ama .scr uzantılı save yaptığı için işime yaramıyor.
Oyunların loading ekranları daha güzel olduğu için bu ekranları alıyorum.
 
1 - Öncelikle tape yükleme normal hızda olmalı.
2 - Loading ekranı tamamlanınca File --> Save Binary File seçip açılan pencerede önce ekranı save edeceğimiz klasörü seçiyoruz. (Ben her zaman kodların olduğu klasörü seçiyorum.)
oyunadı_ekran.bin yazarak kaydet'e basıyoruz.
3 - Save Binary File penceresine geri dönünce "Memory adress" kısmına 16384, "lenght.." kısmına 6912 yazıyoruz ve "save" butonuna basıyoruz.
4 - Kod yazarken
etiket incbin "oyunadı_ekran.bin" komutu yazıyoruz. Böylece ekran görüntüsünü programa ekliyoruz.
5 - Son olarak
ld hl,etiket
ld de,$4000
ld bc,6912
ldir
komutlarını programda kullanarak resmi ekrana çıkartıyoruz. Gerisi ise size kalmış.

Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 179
Yatay ekran genişletici
« Yanıtla #76 : 27 Nisan 2015, 21:58:29 »
5. sayfa #72. numaralı mesajda yazdığım rutinin yeni hali. Eskisinde renklerle ilgili bir işlem yapmıyorduk. Bu versiyonda her şey tamam.

Kod: [Seç]
;==============================================================;
;                 YATAY EKRAN GENİŞLETİCİ                ;
;                 01-02-2015 / HADES                     ;
; UZUNLUK : 170 BYTE                     ;
;==============================================================;
org $8000

ld hl,screen
ld de,$4000
ld bc,6912
ldir
ld b,100
wait halt
djnz wait
call main
uloop jr uloop
;--------------------------------------------------------------;
main ld hl,$400f
ld (source),hl
ld l,$1f
ld (target),hl
ld c,3
loop04 ld b,8
loop03 push bc
ld c,16
ld hl,(source)
ld ix,(target)
loop02 push hl
push ix
ld d,8
loop01 call expand
dec ix
call expand
inc ix
inc h
illegalcommand inc ixh
dec d
jr nz,loop01
pop ix
pop hl
dec ix
dec ix
dec hl
dec c
jr nz,loop02
ld de,$20
ld hl,(source)
add hl,de
ld (source),hl
ld hl,(target)
add hl,de
ld (target),hl
pop bc
djnz loop03
ld de,$0700
ld hl,(source)
add hl,de
ld (source),hl
ld l,$1f
ld (target),hl
dec c
jr nz,loop04

ld hl,$580f
ld de,$581f
ld c,24
loop06 push bc
ld b,16
loop05 ld a,(hl)
ld (de),a
dec de
ld (de),a
dec hl
dec de
djnz loop05

ld bc,48
add hl,bc
ex de,hl
ld c,64
add hl,bc
ex de,hl
pop bc
dec c
jr nz,loop06
ret
;--------------------------------------------------------------;
expand ld b,4
loop00 ld a,(hl)
rr (hl)
rr e
ld (hl),a
rr (hl)
rr e
djnz loop00
ld (ix+0),e
ret
;--------------------------------------------------------------;
source defw 0
target defw 0
;--------------------------------------------------------------;
screen incbin "aticatac_ekran.bin"
;--------------------------------------------------------------;
end $8000
;==============================================================;

Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 179
Dikey Ekran Genişletici
« Yanıtla #77 : 27 Nisan 2015, 22:07:51 »
Ekrandaki görüntüyü renkleriyle birlikte Y ekseninde 2 kat genişletiyoruz.

Kod: [Seç]
;==============================================================;
;                 DİKEY EKRAN GENİŞLETİCİ                ;
;                 30-01-2015 / HADES                     ;
; UZUNLUK : 220 BYTE                     ;
;==============================================================;
org $8000

ld hl,screen
ld de,$4000
ld bc,6912
ldir
ld b,100
wait halt
djnz wait
call main
uloop jr uloop
;--------------------------------------------------------------;
main ld b,11
ld iy,srctab
tabloop push bc
ld l,(iy+0)
ld h,(iy+1)
ld e,(iy+22)
ld d,(iy+23)
push de
pop ix
call uzat
inc iy
inc iy
pop bc
djnz tabloop
ld hl,$4400
ld ix,$4020
call uzat1
ld hl,$4200
ld ix,$4400
ld c,2
call loop01
ld hl,$4100
ld ix,$4200
ld c,1
call loop01
ld hl,$4000
ld de,$4100
ld bc,$20
ldir

ld b,12
ld hl,$5960
ld de,$5ac0
loop02 push bc
ld bc,32
push hl
push bc
ldir
pop bc
pop hl
ldir
ld bc,64
sbc hl,bc
ex de,hl
sla c
sbc hl,bc
ex de,hl
pop bc
djnz loop02
ret
;--------------------------------------------------------------;
uzat push ix
call uzat1
ld de,$20
pop ix
add ix,de
uzat1 ld c,4
loop01 ld b,$20
loop00 ld a,(hl)
ld (ix+0),a
inc ixh
ld (ix+0),a
dec ixh
inc hl
inc ix
djnz loop00
ld de,$e0
add hl,de
inc d
add ix,de
dec c
jr nz,loop01
ret
;--------------------------------------------------------------;
srctab defw $4860,$4840,$4820,$4800
defw $40e0,$40c0,$40a0,$4080
defw $4060,$4040,$4020
destab defw $50c0,$5080,$5040,$5000
defw $48c0,$4880,$4840,$4800
defw $40c0,$4080,$4040
;--------------------------------------------------------------;
screen incbin "aticatac_ekran.bin"
;--------------------------------------------------------------;
end $8000
;==============================================================;

Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 179
Simetrik Ekran
« Yanıtla #78 : 27 Nisan 2015, 22:11:46 »
Ekranın üst yarısını alıyoruz ve alt yarısına simetrik olarak kopyalıyoruz.

Kod: [Seç]
;==============================================================;
;                 YATAY SİMETRİK EKRAN                   ;
;                 01-02-2015 / HADES                     ;
 ; UZUNLUK : 111 BYTE                     ;
;==============================================================;
org $8000

ld hl,screen
ld de,$4000
ld bc,6912
ldir
ld b,100
wait halt
djnz wait
call main
uloop jr uloop
;--------------------------------------------------------------;
main ld b,64
ld hl,$4000
ld de,$57e0
loop00 push bc
ld bc,$20
ldir
ld bc,$40
ex de,hl
sbc hl,bc
ex de,hl
pop bc
djnz loop00
call copy
call copy
call copy
call copy

ld b,12
ld hl,$5800
ld de,$5ae0
loop02 push bc
ld bc,32
ldir
ld bc,64
ex de,hl
sbc hl,bc
ex de,hl
pop bc
djnz loop02
ret
;--------------------------------------------------------------;
copy push hl
push de
ld b,8
loop01 push bc
push hl
push de
ld bc,$20
ldir
pop de
pop hl
inc h
dec d
pop bc
djnz loop01
pop de
pop hl
ld bc,$20
add hl,bc
ex de,hl
sbc hl,bc
ex de,hl
ret
;--------------------------------------------------------------;
screen incbin "aticatac_ekran.bin"
;--------------------------------------------------------------;
end $8000
;==============================================================;

Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 179
Bir Daha Simetrik Ekran
« Yanıtla #79 : 27 Nisan 2015, 22:14:25 »
Bu kez ekranın sol yarısını simetrik olarak sağ tarafa kopyalıyoruz.

Kod: [Seç]
;==============================================================;
;                 DİKEY SİMETRİK EKRAN                   ;
;                 30-01-2015 / HADES                     ;
; UZUNLUK : 94 BYTE                      ;
;==============================================================;
org $8000

ld hl,screen
ld de,$4000
ld bc,6912
ldir
ld b,100
wait halt
djnz wait
call main
uloop jr uloop
;--------------------------------------------------------------;
main ld ix,$4000
ld hl,$401f
ld c,192
loop02 push bc
ld b,$10
loop01 ld a,(ix+0)
ld c,8
loop00 rra
rl (hl)
dec c
jr nz,loop00
inc ix
dec hl
djnz loop01
ld de,16
add ix,de
ld de,48
add hl,de
pop bc
dec c
jr nz,loop02
color ld hl,$5800
ld ix,$581f
ld c,$18
loop04 ld b,$10
loop03 ld a,(hl)
ld (ix+0),a
inc hl
dec ix
djnz loop03
ld de,16
add hl,de
ld de,48
add ix,de
dec c
jr nz,loop04
ret
;--------------------------------------------------------------;
screen incbin "aticatac_ekran.bin"
;--------------------------------------------------------------;
end $8000
;==============================================================;

i_r_on

  • Ziyaretçi
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #80 : 28 Nisan 2015, 00:55:11 »
Z80'i merak ettiğim zamanlarda hali hazırda x86 assembly bilgim vardı. Kitabı açıp kurcaladığımda mimarisinin, komut setlerinin neredeyse aynı olduğunu gördüğümde uygulama yapmak için bende fazla heyecan uyandırmamıştı. Zaten bildiğiniz üzere Zilog'un kurucusu Federico Faggin'in eli her iki işe de değmiş. 6502'de de benzer bir hikaye var, oradaki ana kahraman da Chuck Peddle sanırım. Intel vs Zilog ve Motorola vs MOS.

Yazılımdan girmedik giremedik derken geçenlerde ebay'den 5 adet Z80 sipariş etmeye çalıştım. Aliexpress'te güzelce kullandığım karta ebay nanik yaptı. O iş de böylece yarım kaldı.

Şimdi buradaki kod örneklerini görünce şu blok transfer olayı bana baya bir değişik geldi. Bu LDIR komutunun eşleniği bildiğiniz başka bir işlemcide var mı acep? x86'da olduğunu hatırlamıyorum.

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2882
  • Advanced User Simulator
    • ae unutmadan
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #81 : 29 Nisan 2015, 20:24:41 »
Şimdi buradaki kod örneklerini görünce şu blok transfer olayı bana baya bir değişik geldi. Bu LDIR komutunun eşleniği bildiğiniz başka bir işlemcide var mı acep? x86'da olduğunu hatırlamıyorum.

Birkaç kural var,
-tüm 8080A komutları Z80'de bulunuyor.
-tüm 8080A yazmaçları Z80'de bulunuyor.
-tüm 8080A programları z80 üzerinde çalışabilir ("çalışabilir"=8080A'nın 11 adet kullanılmayan komut kodları z80'de başka komutlara karşılık gelir.)
-z80 programları genellikle 8080A üzerinde çalışmaz.

 z80 geri yönde 8080'e benzerken aslında bir üst modeli gibi düşünülebilir. z80'de 3 katı fazla yazmaç, 2 adet ekstra bayrak, iki katı fazla komutvar, bu ekstra komutlardan biri de LDI/LDIR.  Lazımsa Wiki'de LDIR'in 8080A karşılığı var ve bir hayli şişkin bir kod: http://en.wikipedia.org/wiki/Zilog_Z80#Example_code

edit:
kendi mesajımı okuduğumda sorulan soruya cevap vermediğimi farkettim, ldir'e benzer bir komut var mı bilmiyorum :) ama z80'de de ldir pek kullanılmaz lakin çok yavaş bir komut: 21 ts. ram az, zaman bol ise kullanılır genelde.

i_r_on

  • Ziyaretçi
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #82 : 30 Nisan 2015, 01:06:08 »
@Ref : Ciddi hız kazandırsaydı işe yarardı ancak bu şekilde silikon israfı olmuş. LDIR'ı interrupt kesebiliyor mu diye baktım da, kesebiliyormuş. Tüy dikmemişler en azından :) Tek avantajı herhalde basit kod yazılmasını sağlamak, daha az komut ve bu sayede ram kazanmak.

Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 179
Herhangi bir satırda 1x1 scroll rutini.
« Yanıtla #83 : 02 Mayıs 2015, 22:31:59 »
Spectrumun Vic gibi bir grafik çipi olmadığı için basit bir text scroll yapmak bile ekran belleğinin garip yapısından dolayı biraz uğraştırıcıdır.
Aşağıdaki rutinde scroll yapacak satırın numarası değiştirilerek istenilen satırda 1x1 scroll yapılmaktadır.

Kod: [Seç]
;==============================================================;
;                 1X1 TEXT SCROLL        ;
;                 01-05-2015 / HADES                     ;
; UZUNLUK : 129 BYTE CODE + TEXT         ;
;==============================================================;
org $8000

;--------------------------------------------------------------;
; Borderi siyah yap.
;--------------------------------------------------------------;
xor a
out (254),a
again call main
jr again
;--------------------------------------------------------------;
; Scroll yapılacak satır numarasını al ve
; ekran adresini hesapla.
;--------------------------------------------------------------;
; Scroll yapılacak satır 0-7 arasında ise
; ekran adresi $401f.
;--------------------------------------------------------------;
main ld a,(line_nr)
line_0007 cp 8
jr nc,line_0815
ld hl,$401f
jr devam
;--------------------------------------------------------------;
; Scroll yapılacak satır 8-15 arasında ise
; ekran adresi $481f.
;--------------------------------------------------------------;
line_0815 cp 16
jr nc,line_1623
ld hl,$481f
jr devam
;--------------------------------------------------------------;
; Scroll yapılacak satır 16-23 arasında ise
; ekran adresi $501f.
;--------------------------------------------------------------;
line_1623 ld hl,$501f
devam ld (base),hl
;--------------------------------------------------------------;
; Satır numarasına göre son kolonun adresini
; hesapla ve asıl ekran adresini elde et.
;--------------------------------------------------------------;
sla a
sla a
sla a
sla a
sla a
or l
ld (base),a
;--------------------------------------------------------------;
ld b,tend-text ;text uzunluğu max.256
ld hl,text
nextchar push bc
push hl
;--------------------------------------------------------------;
; Okunan karakterin data adresini hesapla.
;--------------------------------------------------------------;
ld a,(hl)
ld hl,(23606)
ld de,0
loop01 ld b,8
loop00 inc de
djnz loop00
dec a
jr nz,loop01
add hl,de ;font data adresi
;--------------------------------------------------------------;
; Font datalarını kopyala.
;--------------------------------------------------------------;
ld b,8
ld de,temp
copy ld a,(hl)
ld (de),a
inc hl
inc de
djnz copy
;--------------------------------------------------------------;
; 8 ekran satırını 8 kez 1 pixel sola kaydır.
;--------------------------------------------------------------;
ld e,8
loop05 push de
ld hl,(base) ;ekran satırının son adresi
;--------------------------------------------------------------;
; 8 Ekran satırını 1 pixel sola kaydır.
;--------------------------------------------------------------;
ld c,8
ld de,temp
loop04 push hl
;--------------------------------------------------------------;
; Font datasının 1 bit sola kaydır ve ekrana bas.
; O anki ekran satırını bir piksel sola kaydır.
;--------------------------------------------------------------;
ld b,32
ld a,(de)
rl a
ld (de),a
loop03 rl (hl)
dec hl
djnz loop03
;--------------------------------------------------------------;
pop hl
inc de
inc h
dec c
jr nz,loop04
;--------------------------------------------------------------;
; Scroll hızını ayarla.
; İstenirse sadece HALT komutları kullanılabilir.
;--------------------------------------------------------------;
ld de,5555
delay dec de
ld a,d
or e
jr nz,delay
; halt
; halt
;--------------------------------------------------------------;
pop de
dec e
jr nz,loop05
;--------------------------------------------------------------;
pop hl
inc hl
pop bc
djnz nextchar
ret
;--------------------------------------------------------------;
line_nr defb 23 ;satır numarası
;--------------------------------------------------------------;
temp defb 0,0,0,0,0,0,0,0
base defw 0
;--------------------------------------------------------------;
text defm " ...Herhangi bir satirda 1x1 "
defm "text scroll rutini 02-05-2015"
defm " FALAN FILAN INTER MILAN !'^+"
defm "%&/()=?_£#${[]}\|.;,:  "
;--------------------------------------------------------------;
tend end $8000
;==============================================================;


Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 179
Aynı satırda 2x1 ve 1x1 text scroll rutini
« Yanıtla #84 : 13 Eylül 2015, 15:09:18 »
Bir üstteki 1x1 scroll rutinine eklediğim bir kaç komut ile istenilen satırda sadece 2x1 veya 2x1-1x1 scroll yapıyoruz. 2x1 scroll yapılacak kolon sayısını ayarlamak mümkün.

Kod: [Seç]
;==============================================================;
;                 2X1 VE 1X1 TEXT SCROLL        ;
;                 13-09-2015 / HADES                     ;
; UZUNLUK : 141 BYTE CODE + TEXT         ;
;==============================================================;
org $8000

;--------------------------------------------------------------;
; Borderi siyah yap.
;--------------------------------------------------------------;
xor a
out (254),a
again call main
jr again
;--------------------------------------------------------------;
; Scroll yapılacak satır numarasını al ve
; ekran adresini hesapla.
;--------------------------------------------------------------;
; Scroll yapılacak satır 0-7 arasında ise
; ekran adresi $401f.
;--------------------------------------------------------------;
main ld a,(line_nr)
line_0007 cp 8
jr nc,line_0815
ld hl,$401f
jr devam
;--------------------------------------------------------------;
; Scroll yapılacak satır 8-15 arasında ise
; ekran adresi $481f.
;--------------------------------------------------------------;
line_0815 cp 16
jr nc,line_1623
ld hl,$481f
jr devam
;--------------------------------------------------------------;
; Scroll yapılacak satır 16-23 arasında ise
; ekran adresi $501f.
;--------------------------------------------------------------;
line_1623 ld hl,$501f
devam ld (base),hl
;--------------------------------------------------------------;
; Satır numarasına göre son kolonun adresini
; hesapla ve asıl ekran adresini elde et.
;--------------------------------------------------------------;
sla a
sla a
sla a
sla a
sla a
or l
ld (base),a
;--------------------------------------------------------------;
ld b,tend-text ;text uzunluğu max.256
ld hl,text
nextchar push bc
push hl
;--------------------------------------------------------------;
; Okunan karakterin data adresini hesapla.
;--------------------------------------------------------------;
ld a,(hl)
ld hl,(23606)
ld de,0
loop01 ld b,8
loop00 inc de
djnz loop00
dec a
jr nz,loop01
add hl,de ;font data adresi
;--------------------------------------------------------------;
; Font datalarını kopyala.
;--------------------------------------------------------------;
ld b,8
ld de,temp
copy ld a,(hl)
ld (de),a
inc hl
inc de
djnz copy
;--------------------------------------------------------------;
; 8 ekran satırını 8 kez 1 pixel sola kaydır.
;--------------------------------------------------------------;
ld e,8
loop05 push de
ld hl,(base) ;ekran satırının son adresi
;--------------------------------------------------------------;
; 8 Ekran satırını 1 pixel sola kaydır.
;--------------------------------------------------------------;
ld c,8
ld de,temp
loop04 push hl
;--------------------------------------------------------------;
; Font datasının 1 bit sola kaydır ve ekrana bas.
; O anki ekran satırını bir piksel sola kaydır.
;--------------------------------------------------------------;
ld b,32
ld a,(de)
;--------------------------------------------------------------;
                        push    af              ;eklendi
                        push    hl              ;eklendi
;--------------------------------------------------------------;
rl a
ld (de),a
loop03 rl (hl)
                        dec     hl
djnz loop03
;--------------------------------------------------------------;
;                       Aşağıdaki Komutlar Eklendi
;--------------------------------------------------------------;
                        pop     hl
                        pop     af
ld      b,16     ;2x1 scroll yapacak kolon sayısı
rl      a
loop030 rl      (hl)
                        dec     hl
                        djnz    loop030
;--------------------------------------------------------------;
pop hl
inc de
inc h
dec c
jr nz,loop04
;--------------------------------------------------------------;
; Scroll hızını ayarla.
; İstenirse sadece HALT komutları kullanılabilir.
;--------------------------------------------------------------;
ld de,5555
delay dec de
ld a,d
or e
jr nz,delay
; halt
; halt
;--------------------------------------------------------------;
pop de
dec e
jr nz,loop05
;--------------------------------------------------------------;
pop hl
inc hl
pop bc
djnz nextchar
ret
;--------------------------------------------------------------;
line_nr defb 23 ;satır numarası
;--------------------------------------------------------------;
temp defb 0,0,0,0,0,0,0,0
base defw 0
;--------------------------------------------------------------;
text defm " ...Herhangi bir satirda 2x1 "
                        defm    "ve 1x1 mixed "
defm "text scroll rutini 13-09-2015"
defm " FALAN FILAN INTER MILAN !'^+"
defm "%&/()=?_£#${[]}\|.;,:  "
;--------------------------------------------------------------;
tend end $8000
;==============================================================;


Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 179
1x2 Scroll Rutini
« Yanıtla #85 : 13 Eylül 2015, 20:58:34 »
Text Scroll yapmaya devam ediyoruz. Yazıyı Y ekseninde 2 kat büyüterek kaydırıyoruz.
Not : Programdaki loop030 rl (hl) ve loop032 rl (ix+$20) komutlarını nop ile değiştirip tekrar deneyin.

Kod: [Seç]
;==============================================================;
;                 1X2 TEXT SCROLL        ;
;                 13-09-2015 / HADES                     ;
; UZUNLUK : 194 BYTE CODE + TEXT         ;
;==============================================================;
org $8000

;--------------------------------------------------------------;
; Borderi siyah yap.
;--------------------------------------------------------------;
xor a
out (254),a
again call main
jr again
;--------------------------------------------------------------;
; Scroll yapılacak satır numarasını al ve
; ekran adresini hesapla.
;--------------------------------------------------------------;
; Scroll yapılacak satır 0-7 arasında ise
; ekran adresi $401f.
;--------------------------------------------------------------;
main ld a,(line_nr)
and 22 ;max line number
line_0007 cp 8
jr nc,line_0815
ld hl,$401f
jr devam
;--------------------------------------------------------------;
; Scroll yapılacak satır 8-15 arasında ise
; ekran adresi $481f.
;--------------------------------------------------------------;
line_0815 cp 16
jr nc,line_1623
ld hl,$481f
jr devam
;--------------------------------------------------------------;
; Scroll yapılacak satır 16-23 arasında ise
; ekran adresi $501f.
;--------------------------------------------------------------;
line_1623 ld hl,$501f
devam ld (scrbase),hl
;--------------------------------------------------------------;
; Satır numarasına göre son kolonun adresini
; hesapla ve asıl ekran adresini elde et.
;--------------------------------------------------------------;
sla a
sla a
sla a
sla a
sla a
or l
ld (scrbase),a
;--------------------------------------------------------------;
ld b,tend-text ;text uzunluğu max.256
ld hl,text
nextchar push bc
push hl
;--------------------------------------------------------------;
; Okunan karakterin data adresini hesapla.
;--------------------------------------------------------------;
ld a,(hl)
ld hl,(23606)
ld de,0
loop01 ld b,8
loop00 inc de
djnz loop00
dec a
jr nz,loop01
add hl,de ;font data adresi
;--------------------------------------------------------------;
; Font datalarını kopyala.
;--------------------------------------------------------------;
ld b,8
ld de,fontdata
copy ld a,(hl)
ld (de),a
inc hl
inc de
djnz copy
;--------------------------------------------------------------;
; 8 ekran satırını 8 kez 1 pixel sola kaydır.
;--------------------------------------------------------------;
ld e,8
loop05 push de
ld hl,(scrbase) ;ekran satırının son adresi
push hl
pop ix
;--------------------------------------------------------------;
; 8 Ekran satırını 1 pixel sola kaydır.
;--------------------------------------------------------------;
ld c,4
ld iy,fontdata
loop04 push ix
push hl
;--------------------------------------------------------------;
; Font datasını 1 bit sola kaydır ve ekrana bas.
; O anki ekran satırını bir piksel sola kaydır.
;--------------------------------------------------------------;
ld b,32
ld a,(iy+0)
ld d,a
rl a
ld (iy+0),a
loop03 rl (hl)
dec hl
djnz loop03
pop hl
push hl
ld b,32
ld a,d
inc h
rl a
loop030 rl (hl)  ;nop
dec hl
djnz loop030

ld b,32
ld a,(iy+4)
ld d,a
rl a
ld (iy+4),a
loop031 rl (ix+$20)
dec ix
djnz loop031
pop ix
push ix
ld b,32
ld a,d
inc ixh
rl a
loop032 rl (ix+$20) ;nop
dec ix
djnz loop032
;--------------------------------------------------------------;
go pop ix
pop hl
inc iy
inc h
inc h
inc ixh
inc ixh
dec c
jr nz,loop04
;--------------------------------------------------------------;
; Scroll hızını ayarla.
; İstenirse sadece HALT komutları kullanılabilir.
;--------------------------------------------------------------;
ld de,5555
delay dec de
ld a,d
or e
jr nz,delay
; halt
; halt
;--------------------------------------------------------------;
pop de
dec e
jr nz,loop05
;--------------------------------------------------------------;
pop hl
inc hl
pop bc
djnz next
ret
next jp nextchar
;--------------------------------------------------------------;
line_nr defb 22 ;satır numarası
;--------------------------------------------------------------;
fontdata defb 0,0,0,0,0,0,0,0
scrbase defw 0
;--------------------------------------------------------------;
text defm " ...Herhangi bir satirda 1x2 "
defm "text scroll rutini 13-09-2015"
defm " FALAN FILAN INTER MILAN !'^+"
defm "%&/()=?_£#${[]}\|.;,:  "
;--------------------------------------------------------------;
tend end $8000
;==============================================================;

Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 179
Makine Dilinde Daire Çizdirmek
« Yanıtla #86 : 13 Eylül 2015, 22:59:58 »
Kod: [Seç]
;===============================================================;
; CIRCLES EXAMPLE ;
; 13-09-2015 / HADES ;
; UZUNLUK : 51 BYTE CODE ;
;===============================================================;

org $8000

call $0d6b ;ekranı sil
out (254),a
ld b,27
loop00 push bc
call circle
ld a,(yaricap)
sbc a,3
ld (yaricap),a
pop bc
djnz loop00
ret
;--------------------------------------------------------------;
circle ld a,(x_koor) ;x koordinat değeri
call $2d28
ld a,(y_koor) ;y koordinat değeri
call $2d28
ld a,(yaricap) ;r yarıçap değeri
call $2d28
call $232d ;daire çiz
ld hl,$2758
exx
ret
;--------------------------------------------------------------;
x_koor defb $7f
y_koor defb $50
yaricap defb $50

end $8000
;=============================================================;

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2882
  • Advanced User Simulator
    • ae unutmadan
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #87 : 14 Eylül 2015, 23:10:09 »
Bu son paylaştığın çember rutini ROM'u kullanıyor. Dolayısı ile Sinclair Basic diyebiliriz :D ve tebrikler, sbasic'deki en yavaş rutini bulabilmişsin :) Bu çizgi çizdirme yöntemi (söylenenin aksine yüzlerce farklı rutin gördüm şimdiye kadar) pek de hızlı sayılmaz ama eğrileri destekliyor. Aslında çizilen şekil bir daireden çok, bir eğri. Aynı rutini düz çizgiler çizmek için kullanılan DRAW komutu da paylaşıyor. Şöyle ki, normalde draw komutu bir noktadan diğerine düz bir çizgi çekerken, sonuna eklediğiniz opsiyonel bir parametre sayesinde eğri de çizebiliyor.

örnek:
1 PLOT 100,100
2 DRAW 50,50,30  <- buradaki 30 değeri çizginin düz değil çok çok eğrilmiş halidir ve üst üste birkaç çember çizer

Yani çizgi çizmenin bol fonksiyonlu ama çoooook yavaş bir yolu. Fakat, eğri çizmenin en güzel yolu Bresenham abimizin yöntemi. Çizgi çizmek isteyen herkes bu yöntemi ezberden bilmeli. Elimin altında kendi yazdığım bir kod yok, bu sebepten bir sonraki en iyi şeye siz çemberfili insanları yönlendireyim:

https://bitbucket.org/boriel/zxbasic/src/4dedae817cc97aec7ff25d787acc85ff8db69e77/library-asm/circle.asm?at=default&fileviewer=file-view-default

Bu boriel's basicde kullanılan Bresenham algoritması direkt compile edip çalıştırılabilecek birşey değil, lakin koordinatları buluyor ama noktalama için başka bir rutine ihtiyacı var, üşenmeyen onu da yazıp güzel bir çember çizdirebilir. Elbette ki çember çizmenin daha hızlı yöntemleri de var, ama bu tartışma akademik bir tabana kaymaya başladı, susuyorum :)




Çevrimdışı witchdoktor

  • RAAT
  • Normalleşmiş Retroman
  • *
  • İleti: 757
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #88 : 16 Eylül 2015, 15:01:57 »
Elbette ki çember çizmenin daha hızlı yöntemleri de var, ama bu tartışma akademik bir tabana kaymaya başladı, susuyorum :)

İşin ilginci 8/16-bit bilgisayarlarda hep çember çizmenin nasıl olduğunu bulmaya çalışırız ama bir programda çember çizme gereksinimi çok istisnai bir durumdur; bir paint programı ya da benchmarking amaçlı değilse çember çizimi çok fuzulidir...

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2882
  • Advanced User Simulator
    • ae unutmadan
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #89 : 16 Eylül 2015, 18:49:22 »
Elbette ki çember çizmenin daha hızlı yöntemleri de var, ama bu tartışma akademik bir tabana kaymaya başladı, susuyorum :)

İşin ilginci 8/16-bit bilgisayarlarda hep çember çizmenin nasıl olduğunu bulmaya çalışırız ama bir programda çember çizme gereksinimi çok istisnai bir durumdur; bir paint programı ya da benchmarking amaçlı değilse çember çizimi çok fuzulidir...

Çemberi çizdirmek konusunda katılıyorum, belki bu sebepten CIRCLE komutunun yavaşlığı hiç rahatsız etmedi beni, demekki hiç lazım birşey değilmiş :) Ama ekranda dairesel hareketler yapan spritelar varsa küçük bir ihtimal de olsa işe yarayabilir gidecekleri yolun hesabı yapılması gerekiyor ve tablo tutmak için ram'de yer kalmadıysa.