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

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 179
1x1 Dıştan İçe Mirror Text Scroll
« Yanıtla #90 : 16 Eylül 2015, 22:44:16 »
Kod: [Seç]
;==============================================================;
; 1X1 MIRROR TEXT SCROLL - 1 (DIŞTAN İÇE);
;                 15-09-2015 / HADES                     ;
; UZUNLUK : 183 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_r),hl
ld (base_l),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_r),a
sub $1f
ld (base_l),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_r
copy_r ld a,(hl)
ld (de),a
inc hl
inc de
djnz copy_r

ld b,8
ld hl,temp_r
copy_l ld a,(hl)
ld (de),a
inc hl
inc de
djnz copy_l
;--------------------------------------------------------------;
; 8 ekran satırını 8 kez 1 pixel sola kaydır.
;--------------------------------------------------------------;
ld e,8
loop05 push de
ld ix,(base_r) ;ekran satırının son adresi
ld iy,(base_l) ;ekran satırının ilk adresi
;--------------------------------------------------------------;
; 8 Ekran satırını 1 pixel sola kaydır.
;--------------------------------------------------------------;
ld c,8
ld de,temp_r
ld hl,temp_l
loop04 push ix
push iy
;--------------------------------------------------------------;
; 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,16 ;32
ld a,(de)
rl a
ld (de),a
loop03_l rl (ix+0)
dec ix
djnz loop03_l
;--------------------------------------------------------------;
; Font datasının 1 bit sağa kaydır ve ekrana bas.
; O anki ekran satırını bir piksel sağa kaydır.
;--------------------------------------------------------------;
ld b,16 ;32
ld a,(hl)
rl a
ld (hl),a
loop03_r rr (iy+0)
inc iy
djnz loop03_r
;--------------------------------------------------------------;
pop iy
pop ix
inc de
inc hl
inc ixh
inc iyh
dec c
jr nz,loop04
;--------------------------------------------------------------;
; Scroll hızını ayarla.
; İstenirse sadece HALT komutları kullanılabilir.
;--------------------------------------------------------------;
ld de,4555
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ı
;--------------------------------------------------------------;
base_r defw 0
base_l defw 0
temp_r defb 0,0,0,0,0,0,0,0
temp_l defb 0,0,0,0,0,0,0,0
;--------------------------------------------------------------;
text defm " ...Herhangi bir satirda 1x1 "
defm "mirror text scroll rutini "
defm "16-09-2015 / HADES"

;--------------------------------------------------------------;
tend end $8000
;==============================================================;

Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 179
1x1 İçten Dışa Mirror Text Scroll
« Yanıtla #91 : 16 Eylül 2015, 22:47:51 »
Bir üstteki rutinde ufak bir değişiklikle scroll yönü değişiyor.

Kod: [Seç]
;==============================================================;
; 1X1 MIRROR TEXT SCROLL - 2 (İÇTEN DIŞA);
;                 15-09-2015 / HADES                     ;
; UZUNLUK : 182 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,$400f
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,$480f
jr devam
;--------------------------------------------------------------;
; Scroll yapılacak satır 16-23 arasında ise
; ekran adresi $501f.
;--------------------------------------------------------------;
line_1623 ld hl,$500f
devam ld (base_r),hl
ld (base_l),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_r),a
inc a
ld (base_l),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_r
copy_r ld a,(hl)
ld (de),a
inc hl
inc de
djnz copy_r

ld b,8
ld hl,temp_r
copy_l ld a,(hl)
ld (de),a
inc hl
inc de
djnz copy_l
;--------------------------------------------------------------;
; 8 ekran satırını 8 kez 1 pixel sola kaydır.
;--------------------------------------------------------------;
ld e,8
loop05 push de
ld ix,(base_r) ;ekran satırının son adresi
ld iy,(base_l) ;ekran satırının ilk adresi
;--------------------------------------------------------------;
; 8 Ekran satırını 1 pixel sola kaydır.
;--------------------------------------------------------------;
ld c,8
ld de,temp_r
ld hl,temp_l
loop04 push ix
push iy
;--------------------------------------------------------------;
; 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,16 ;32
ld a,(de)
rl a
ld (de),a
loop03_l rl (ix+0)
dec ix
djnz loop03_l
;--------------------------------------------------------------;
; Font datasının 1 bit sağa kaydır ve ekrana bas.
; O anki ekran satırını bir piksel sağa kaydır.
;--------------------------------------------------------------;
ld b,16 ;32
ld a,(hl)
rl a
ld (hl),a
loop03_r rr (iy+0)
inc iy
djnz loop03_r
;--------------------------------------------------------------;
pop iy
pop ix
inc de
inc hl
inc ixh
inc iyh
dec c
jr nz,loop04
;--------------------------------------------------------------;
; Scroll hızını ayarla.
; İstenirse sadece HALT komutları kullanılabilir.
;--------------------------------------------------------------;
ld de,4555
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ı
;--------------------------------------------------------------;
base_r defw 0
base_l defw 0
temp_r defb 0,0,0,0,0,0,0,0
temp_l defb 0,0,0,0,0,0,0,0
;--------------------------------------------------------------;
text defm " ...Herhangi bir satirda 1x1 "
defm "mirror text scroll rutini "
defm "16-09-2015 / HADES"

;--------------------------------------------------------------;
tend end $8000
;==============================================================;

Çevrimdışı Alco

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2133
  • "Kahraman olmak, dürüst olmaktan kolaydır" Luigi P
    • Sizin Amstrad
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #92 : 20 Nisan 2022, 23:29:17 »
@hades İlerleme var mı? Yeni teknikler paylaşmayacak mısın bizimle? Hep ecnebilerle paylaşıyorsun örneklerini. Yerli ve milli ortamları da unutma. Belki @matahari 'den optimizasyon desteği de alırız.

Çevrimdışı Skate

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 175
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #93 : 20 Nisan 2022, 23:35:57 »
Z80 olsun, ne olursa olsun mu, platform tercihi var mı bu başlıkta? Hani arada ben de bir şeyler karalayacak olursam nede karalayayım, onu bileyim en azından. :)

Çevrimdışı Alco

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2133
  • "Kahraman olmak, dürüst olmaktan kolaydır" Luigi P
    • Sizin Amstrad
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #94 : 20 Nisan 2022, 23:40:52 »
Z80 olsun, ne olursa olsun mu, platform tercihi var mı bu başlıkta? Hani arada ben de bir şeyler karalayacak olursam nede karalayayım, onu bileyim en azından. :)
Süreklilik arz edecekse ayrı açmakta fayda var. Ama tek gecelik birşey ise burası da olur. Konu dallanırsa taşırız da. Çok da dert değil.

Çevrimdışı Skate

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 175
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #95 : 20 Nisan 2022, 23:47:24 »
Nasıl başlasak peki? Kar mı yağdıralım? Kamerayı kar tanelerinden birine mi koysam değişiklik olsun diye? :D

Çevrimdışı Alco

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2133
  • "Kahraman olmak, dürüst olmaktan kolaydır" Luigi P
    • Sizin Amstrad
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #96 : 20 Nisan 2022, 23:55:26 »
Kar tavsiye ederim zira Z80 dünyası için bir nevi Hello World demek  ;D

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2882
  • Advanced User Simulator
    • ae unutmadan
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #97 : 21 Nisan 2022, 09:09:52 »
Z80 olsun, ne olursa olsun mu, platform tercihi var mı bu başlıkta? Hani arada ben de bir şeyler karalayacak olursam nede karalayayım, onu bileyim en azından. :)

hadesin örnekleri zx spectrum örnekleri. Bu sebepten görüntü spectruma göre üretiliyor.

ama doğrusu itirazım yok, z80 tek başına daha güçlü gibi, bir sürü tek byte'lık zıplama komutu zx spectrum rom'una sıkıştığı için heba oluyor. Belki z80'i özgür bıraksak daha iyi bir makine bile tasarlayabileceğizdir :D

Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 179
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #98 : 21 Nisan 2022, 12:16:49 »
Kaldığımız yerden ufak tefek kodlar paylaşmaya devam. Bir süredir farklı ekran silme rutinleri karalıyordum. 7-8 tane var. Bazen daha önce yazdığım rutinlerde optimizasyon yapıyorum veya farklı bir kod ile yeniden yazıyorum.
İlk örnek ekranı yukarıdan ve aşağıdan başlayarak ekranın ortasına doğru pixel satırları şeklinde siliyor.


Kod: [Seç]
;========================================
;    CLS ROUTINE #01-a
;   22.02.2022 / HADES
; CODE LENGHT: 107 BYTES
; (MAIN CODE : 89 BYTES)
;========================================
org $8000
;----------------------------------------
; setup 18 bytes
;----------------------------------------
setup ld hl,$4000
ld de,$4001
ld bc,6143
ld (hl),255 ; fill value
ldir
ld b,40
wait halt
djnz wait
;----------------------------------------
maincode ld b,$08
ld de,$4000
ld hl,$57e0
call common

ld b,$04
ld de,$4800
ld hl,$4fe0

common ld (top),de
ld (bot),hl

loop02 push bc
ld c,$08

loop01 ld b,32
xor a ;cls value
ld hl,(top)
ld de,(bot)

loop00 ld (hl),a
ld (de),a
inc hl
inc de
djnz loop00

halt

ld hl,(top)
inc h
ld (top),hl
ld hl,(bot)
dec h
ld (bot),hl
dec c
jr nz,loop01

ld bc,$f820
ld hl,(top)
add hl,bc
ld (top),hl

ld hl,(bot)
sbc hl,bc
inc hl
ld (bot),hl
pop bc
djnz loop02
ret
;----------------------------------------
top dw 0
bot dw 0
;----------------------------------------
  end $8000
;========================================


Çevrimdışı Alco

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2133
  • "Kahraman olmak, dürüst olmaktan kolaydır" Luigi P
    • Sizin Amstrad
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #99 : 21 Nisan 2022, 15:12:11 »
@hades ve @Ref

Bunları hızlıca denemek için en pratik Speccy emulator hangisi? En uyumlu olması falan değil de kodu deneyip sonuç görebileceğim. Hatta bunu bu başlığın ilk mesajını editleyip ekleyin de bence. Birkaç kaynak eki de olursa epey faydalı olur.

Bir de hades, bize arada soru da sorsana. Belki katılmak isteyenler olur. Hatta Z80 tips&tricks de öğretsene.

Çevrimdışı Skate

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 175
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #100 : 21 Nisan 2022, 17:18:07 »
Ben az önce development platformumu kurdum. Ben ZXSpin'de kalmışım. Modern development tool chain diye aratınca emülatör olarak ZEsarUX tavsiye etti. Bazı gariplikleri var, her defasında "tekrar gösterme" dediğim halde çıkan popupları vs ama remote debugging için ayarları yerli yerinde gözüküyor.
Bu arada indirdiğim Visual Studio Code pluginleri bir tane de embedded emülatöre sahipler, doğrudan Visual Studio Code içinde de derleyip çalıştırabiliyorum projerleri.

Edit: Ekran görüntüsü ekledim.

ZEsarUX'u derlemekle uğraşmak istemeyenler için binaryler şu URL'den bulunabiliyor.

https://github.com/chernandezba/zesarux/releases

Assets kısmına tıklayın.

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2882
  • Advanced User Simulator
    • ae unutmadan
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #101 : 21 Nisan 2022, 20:12:06 »
vscode güzel olmuş bunu nasıl oluşturacağımızı adım adım anlatabilmen mümkün müdür?
sanırım şurda bir benzeri var:

https://dotneteer.github.io/spectnetide/

edit:
önemli not: bu VS code tabanlı emülatörler demo kalitesinde ürün üretmek için gerekli keskinlikte değillermiş
şu anda demo yazmak için halen pasmo+specemu öneriyorum. En azından orjinal makinede çalışacağı garanti gibi olur.

zesarux'u yapan adam aktif olarak uğraşıyor, güzel emülatördür, ama gui rezalet geliyor bana. alışana iyi. Zamanlaması falan da %98 iyi. bildiğim kadarıyla bir tek HALT contention'u desteklemiyor, onu da bozmak çok zor, sorun yaratmıyor.

edit2:
ZX Spectrum zamanlama testlerini iliştirdim, kullandığınız emülatörde çalıştırıp deneyebilirsiniz.

FPGA testi çok zorlu bir test, onu geçen emülatörü time critical demo kodlamak için kullanabiliriz sanırım.
https://spectrumcomputing.co.uk/forums/viewtopic.php?t=3666

Çevrimdışı matahari

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 209
    • The Blog of Mert Börü
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #102 : 21 Nisan 2022, 21:03:20 »
Bunları hızlıca denemek için en pratik Speccy emulator hangisi?

@Alcofribas, bu soruyu sadece Windows PC için değil, aynı zamanda Intel/Apple Silicon Mac için de sordun, değil mi? ;)

Çevrimdışı Alco

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2133
  • "Kahraman olmak, dürüst olmaktan kolaydır" Luigi P
    • Sizin Amstrad
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #103 : 21 Nisan 2022, 21:24:13 »
Bunları hızlıca denemek için en pratik Speccy emulator hangisi?

@Alcofribas, bu soruyu sadece Windows PC için değil, aynı zamanda Intel/Apple Silicon Mac için de sordun, değil mi? ;)
:) Evet evet... MAC ortamını da ihmal etmeden herkes bildiği platformu yazsın. Hatta bilhassa MAC ortamına ağırlık verelim.

@hades Sen sadece kendini yazdığın ortamı söylesen yeter. Bak mesela bana Amstrad için sorsan WinApe emulatörü yükle derim fazla detaya girmeden. F6'ya bas ve Assembler'ı aç, kodunu yaz, sonra F9 ile compile et ve gerekince F8 ile debugging i de ihmal etme derdim.

Çevrimdışı Skate

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 175
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #104 : 21 Nisan 2022, 21:31:56 »
vscode güzel olmuş bunu nasıl oluşturacağımızı adım adım anlatabilmen mümkün müdür?

Çok fazla benzerini gördüm. Benim ilerlediğim yol şu oldu. Önce şuradan ilk teknoloji isimlerini gördüm.

http://www.breakintoprogram.co.uk/computers/zx-spectrum/assembly-language/z80-development-toolchain

Sonra Visual Studio Code'un içindeki extensions bölümüne çeşitli extensionlar ekledim. O extensionları da VS Code kullanan bazı örnek z80 projelerinin config dosyalarından görüp denedim.

Ekte kırmızı ile işaretlediğim ikisi en önemlileri, syntax highlighting ve debugging için lazım olanlar. Diğerleri olmasa da olurduk tayfası. :)