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

0 Üye ve 5 Ziyaretçi konuyu incelemekte.

Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 179
Ekran başaşağı
« Yanıtla #60 : 03 Şubat 2014, 22:40:24 »
Ekrandaki görüntüyü renkleriyle beraber başaşağı çeviriyoruz.

Kod: [Seç]
;-------------------------------------------------------;
; HORIZONTAL FLIP SCREEN ;
; 10-01-2009 hades/ret ;
;-------------------------------------------------------;

org $8000 ;program 32768 (8000h) adresinden başlıyor.

main ld de,$4000 ;ekran belleği başlangıç adresi.
ld hl,$57e0 ;ekran belleği sol alt posizyon adresi.
ld c,$60 ;24 karakter*8pixel=192 pixel satırının yarısı 96.
call loop1 ;alt rutine git.
ld de,$5800 ;renk belleği başlangıç adresi
ld hl,$5ae0 ;renk belleği sol alt pozisyon adresi.
ld c,$0c ;24 karakter satırının yarısı.

loop1 ld b,$20 ;Bir satırdaki karakter sayıcısı (32).
loop0 ld a,(de) ;DE registerinin gösterdiği adresteki değeri oku.
push af ;Aküyü yığına at.
ld a,(hl) ;HL registerinin gösterdiği adresteki değeri oku.
ld (de),a ;Aküdeki değeri DE'deki adrese yaz.
pop af ;Akünün önceki değerini yığından al.
ld (hl),a ;AKüdeki degeri HL'deki adrese yaz.
inc de ;DE'yi 1 arttır.
inc hl ;HL'yi 1 arttır.
djnz loop0 ;Karakter sayıcısını 1 azalt, 0 olmadıysa işlemleri tekrarla.
push de ;DE'yi yığına at.
ld de,$40 ;DE'ye 40h (64) değerini ver.
sbc hl,de ;HL'deki değerden DE'deki değeri çıkart ve sonucu HL'ye yaz.
pop de ;DE'nin önceki değerini yığından al.
dec c ;sayacı 1 azalt.
jr nz,loop1 ;sayaç 0 olmadıysa işlemleri tekrarla.
ret ;geri dön

end $8000

Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 179
Ekran yönünü değiştiriyoruz.
« Yanıtla #61 : 03 Şubat 2014, 22:47:04 »
Kod: [Seç]
;-------------------------------------------------------;
; VERTICAL FLIP SCREEN ;
; 10-01-2009 hades/ret ;
;-------------------------------------------------------;
org $8000

main ld hl,$4000
ld de,$401f
ld c,$c0
loop1 ld b,$10
loop0 push bc
push hl
ld a,(hl)
call rotate
ld (tempa),a
ld a,(de)
call rotate
pop hl
ld a,(tempb)
ld (hl),a
ld a,(tempa)
ld (de),a
inc hl
dec de
pop bc
djnz loop0
call newadr
jr nz,loop1
color ld hl,$5800
ld de,$581f
ld c,$18
loop5 ld b,$10
loop4 ld a,(hl)
push af
ld a,(de)
ld (hl),a
pop af
ld (de),a
inc hl
dec de
djnz loop4
call newadr
jr nz,loop5
ret
rotate ld b,8
ld hl,tempb
loop2 rr a
rl (hl)
djnz loop2
ld a,(hl)
ret
newadr push bc
ld bc,$30
ex de,hl
add hl,bc
ex de,hl
ld bc,$10
add hl,bc
pop bc
dec c
ret
;---------------------------------------------
tempa defb 0
tempb defb 0
end $8000

Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 179
code - code - code
« Yanıtla #62 : 23 Şubat 2014, 15:01:28 »
Daha önce yazmış olduğum bir rutinin düzenlenmiş hali. Ekranın ilk satırındaki yazıyı uzatıyor gibi bir şey.

Kod: [Seç]
;-------------------------------------------------------;
;                  SCREEN  STRECHER ;
;                 23-02-2014 / HADES ;
; (255 byte code + text) ;
;-------------------------------------------------------;
org $8000

main call $0d6b ;CLS command
ld a,2 ;S(creen) kanalını
call $1601 ;açıyoruz.
ld b,endmsg-msg
ld hl,msg
loop0 ld a,(hl)
rst $10 ;PRINT command
inc hl
djnz loop0
ld b,60 ;efekt başlangıç gecikmesi
call delay01
;------------------------------------------
line7 call la47004020
;------------------------------------------
line6 call la46004700
call la40204120
;------------------------------------------
line5 call la45004600
call la47004020
call la41204220
;------------------------------------------
line4 call la44004500
call la46004700
call la40204120
call la42204320
;------------------------------------------
line3 call la43004400
call la45004600
call la47004020
call la41204220
call la43204420
;------------------------------------------
line2 call la42004300
call la44004500
call la46004700
call la40204120
call la42204320
call la44204520
;------------------------------------------
line1 call la41004200
call la43004400
call la45004600
call la47004020
call la41204220
call la43204420
call la45204620
;------------------------------------------
line0 ;; call la42004300
call la44004500
call la46004700
call la40204120
call la42204320
call la44204520
call la46204720
;------------------------------------------
ld b,80 ;efekt bitiş gecikmesi
call delay01
xx jp main
;------------------------------------------
la41004200 ld hl,$4100
ld de,$4200
jr transfer
;------------------------------------------
la42004300 ld hl,$4200
ld de,$4300
jr transfer
;------------------------------------------
la43004400 ld hl,$4300
ld de,$4400
jr transfer
;------------------------------------------
la44004500 ld hl,$4400
ld de,$4500
jr transfer
;------------------------------------------
la45004600 ld hl,$4500
ld de,$4600
jr transfer
;------------------------------------------
la46004700 ld hl,$4600
ld de,$4700
jr transfer
;------------------------------------------
la47004020 ld hl,$4700
ld de,$4020
jr transfer
;------------------------------------------
la40204120 ld hl,$4020
ld de,$4120
jr transfer
;------------------------------------------
la41204220 ld hl,$4120
ld de,$4220
jr transfer
;------------------------------------------
la42204320 ld hl,$4220
ld de,$4320
jr transfer
;------------------------------------------
la43204420 ld hl,$4320
ld de,$4420
jr transfer
;------------------------------------------
la44204520 ld hl,$4420
ld de,$4520
jr transfer
;------------------------------------------
la45204620 ld hl,$4520
ld de,$4620
jr transfer
;------------------------------------------
la46204720 ld hl,$4620
ld de,$4720
;------------------------------------------
transfer ld bc,$20
ldir
;------------------------------------------
delay ld b,1 ;efekt gecikmesi
delay01 halt
djnz delay01
ret
;------------------------------------------
msg defb 22,0,0 ;AT 0,0
defb 16,2 ;INK 2
defm "SCREEN STRECHER-23.02.2014-HADES"
;------------------------------------------
endmsg end $8000
;------------------------------------------

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2882
  • Advanced User Simulator
    • ae unutmadan
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #63 : 24 Şubat 2014, 14:42:49 »
yukarıdaki kodun sonucu şunun gibi bişey:



gibi bişey çünkü yumuşak bir animasyon var.

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2882
  • Advanced User Simulator
    • ae unutmadan
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #64 : 09 Mart 2014, 12:10:00 »

LDIR komutu, bellekteki herhangi bir alani baska bir alana kopyalamak icin kullanilan dongusel komutlardan birisidir. (Bir digeri icin bkz. LDDR)

Calisma sekli:
...

@memrah, açıklamalarını wiki'ye ekledim, istemezsen düzeltebiliriz (ya da düzeltebilirsin).

http://zx.gen.tr/wiki/index.php?title=LDIR

Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 179
İlk ekran satırında bir efekt.
« Yanıtla #65 : 09 Mart 2014, 16:32:27 »
Kod: [Seç]
;---------------------------------------------------------------;
; SCREEN EFFECT ;
; 09-03-2014 / HADES ;
; CODE + TEXT 155 BYTE ;
;---------------------------------------------------------------;

org $8000

main xor a
out (254),a
call $0d6b
ld a,2
call $1601

ld hl,$5800
ld de,$5801
ld bc,767
ld (hl),%00000111
ldir

text ld b,endmsg-msg
ld hl,msg
loop00 ld a,(hl)
rst $10
inc hl
djnz loop00

ld b,80 ;efekt başlangıç
delay00 halt ;gecikmesi
djnz delay00

ld d,0
loop01 ld hl,$471f
ld b,8
call scroll
dec h ;$461f
ld b,7
call scroll
dec h ;$451f
ld b,6
call scroll
dec h ;$441f
ld b,5
call scroll
dec h ;$431f
ld b,4
call scroll
dec h ;$421f
ld b,3
call scroll
dec h ;$411f
ld b,2
call scroll
dec h ;$401f
ld b,1
call scroll
dec d
jr nz,loop01
jr text ;başa dön
;------------------------------------------------------------------
scroll push hl
ld c,32
or a
newbyte rl (hl)
dec hl
ld e,3 ;efekt gecikmesi
delay01 dec e
jr nz,delay01
dec c
jr nz,newbyte
pop hl
djnz scroll
ret
;-----------------------------------------------------------------
msg defb 22,0,0 ;AT 0,0
defm "SCREEN EFFECT -09.03.2014- HADES"
;-----------------------------------------------------------------
endmsg end $8000
;-----------------------------------------------------------------


Bu kodları "Spectrum için kod örnekleri" isimli bir başlık açıp oraya taşısak nasıl olur?

Çevrimdışı memrah

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 188
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #66 : 09 Mart 2014, 22:04:25 »
@memrah, açıklamalarını wiki'ye ekledim, istemezsen düzeltebiliriz (ya da düzeltebilirsin).

http://zx.gen.tr/wiki/index.php?title=LDIR

Hades'in mesajlarinin bir araya getirildigi bir dokuman var mi? Saka maka ciddi bir Turkce Z-80 (+ZX Spectrum) kaynagina donusmeye basladi olay.
Eline saglik Hades.

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2882
  • Advanced User Simulator
    • ae unutmadan
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #67 : 09 Mart 2014, 22:41:38 »

Hades'in mesajlarinin bir araya getirildigi bir dokuman var mi? Saka maka ciddi bir Turkce Z-80 (+ZX Spectrum) kaynagina donusmeye basladi olay.
Eline saglik Hades.

wiki'deki başlıklar hades'in yazdıklarından hareketle, birkaç kaynağı daha buluşturuyor. Ama daha yolun çok başındayız. Şimdilik bir avuç komut var, ama bunu çok uzun soluklu bir proje olarak düşünelim, ayda bir bile olsa konut açıklasak 1-2 sene içinde tamamlanır.

http://zx.gen.tr/wiki/index.php?title=Kategori:Z80_İşlemci_Komutları

El atmaktan çekinmeyiniz.

Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 179
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #68 : 04 Temmuz 2014, 21:55:48 »
Bir süredir kod yazmıyordum. 1-2 gün önce kodları karıştırırken bulduğum kodu adam ettim. Asıl yapmak istediğim hafızadaki bir texti 8x8 scroll yapmaktı. Fakat gözüm yemedi. Bunun üzerine kodda biraz değişiklik yaptım. Program listesindeki "retrojen" yazısını 8x8 karakter büyüklüğünde renk belleğine basıyor.

Kod: [Seç]
;---------------------------------------------------------------;
; 8x8 TEXT ;
; 04-07-2014 / HADES ;
; CODE + TEXT 104 BYTE ;
;---------------------------------------------------------------;

org $8000

main ld hl,$4000
ld de,$4001
ld bc,6143
ld (hl),255
ldir

ld b,textend-text
ld hl,$5800
ld ix,text
ld c,4
nextchar push bc
push ix
ld a,(ix+0)
ld ix,(23606) ;charset base
ld de,0
ld c,a
loop01 ld b,8
loop00 inc de
djnz loop00
dec c
jr nz,loop01
add ix,de ;karakter data adresi

ld c,8
nextbyte ld b,8
ld a,(ix+0)
nextbit rla
jr nc,nocolor
ld (hl),6 ;renk
jr cont
nocolor ld (hl),0
cont inc hl
djnz nextbit
inc ix
ld de,24
add hl,de
dec c
jr nz,nextbyte
ld de,$f8
sbc hl,de
pop ix
inc ix
pop bc
dec c
jr nz,next
ld c,4
ld hl,$5900
next djnz nextchar
ret

text defm "rEtRoJeN"
textend

end $8000

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2882
  • Advanced User Simulator
    • ae unutmadan
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #69 : 06 Temmuz 2014, 01:39:15 »


Bu sefer basinç ile derledim, sonuç böyle oldu :D

Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 179
8x8 text scroll
« Yanıtla #70 : 11 Temmuz 2014, 00:17:48 »
Hafızadaki bir texti 8x8 büyüklüğünde kaydıran program.

Kod: [Seç]
;-------------------------------------------------------;
;                  8x8 TEXT SCROLL ;
;                 10-07-2014 / HADES ;
; (153 bytes code) + text ;
;-------------------------------------------------------;
org $8000

main call $0d6b ;CLS command
ld a,2 ;S(creen) kanalını
call $1601 ;açıyoruz.

ld a,17
rst $10
xor a
out (254),a
rst $10

ld hl,22528
ld de,22529
ld bc,767
ld (hl),%00000101
ldir

again ld b,textend-text
ld ix,text
loop03 push bc
push ix
ld a,(ix+0)
ld ix,(23606) ;charset base
ld de,0
ld c,a
loop01 ld b,8
loop00 inc de
djnz loop00
dec c
jr nz,loop01
add ix,de ;karakter data adresi

ld b,8
ld de,temp
loop02 ld a,(ix+0)
ld (de),a
inc ix
inc de
djnz loop02

ld c,8 ;7 ;karakter data bit sayacı
nextbit ld b,8 ;karakter satır yüksekliği
ld de,temp
nextpos ld a,22 ;AT komutu
rst $10

ld hl,(pos)
ld a,h ;satır numarası (0)
rst $10
ld a,l ;sütun numarası (31)
rst $10
inc h
ld (pos),hl
ld a,(de)
rla ;karakterin 7.biti
ld (de),a
jr nc,space
ld a,$2e ;ekrana nokta basıyoruz
jr cont
space ld a,$20
cont rst $10
inc de
djnz nextpos
call scroll
ld hl,31
ld (pos),hl
dec c
jr nz,nextbit
nextchar pop ix
pop bc
inc ix
djnz loop03
jr again
;-----------------------------------------------------------------------------
scroll push bc
ld d,8
repeat ld hl,18431
ld c,64
nextline ld b,32
or a
nextbyte rl (hl)
dec hl
djnz nextbyte
dec c
jr nz,nextline
halt ;scroll delay
; halt ;delay
dec d
jr nz,repeat
pop bc
ret
;-----------------------------------------------------------------------------
pos defw 31
temp defb 0,0,0,0,0,0,0,0
text defm "8x8 text scroll by HADES/RET. "
defm "10-07-2014 "
textend
end $8000

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2882
  • Advanced User Simulator
    • ae unutmadan
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #71 : 22 Temmuz 2014, 12:59:56 »
Bugün wiki'ye birkaç yeni başlık ekledim, ama bir tanesini buraya duyurmaya değer,

http://zx.gen.tr/wiki/index.php?title=Z80_Bayraklar%C4%B1

Z80 Flag'lerini daha iyi anlamak adına fazladan birkaç cümle içeriyor.

Kaynakça geniş ama Türkçeleştirme için kütüphanemizde bulunan "Spectrum Basic ve Makine Kodu" isimli kitaptan yararlandım.

Bir de bir z80 komut tablosu koydum, buradaki başlıkların kırmızı olanlarını doldurmak isterseniz buyrun:

http://zx.gen.tr/wiki/index.php?title=Z80_Komut_Tablosu

Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 179
Ynt: Z80 Makine diline meraklı olan? - Ekran Genişletici
« Yanıtla #72 : 03 Ağustos 2014, 17:31:24 »
İki gün önce iş yerinde beyin kıvrımlarımın derinliklerinde birden ortaya çıkan bir fikir dün birkaç saat içinde hayat buldu. Bugün ise biraz optimizasyon yaptım.
Program ekranın sol yarısında ne varsa X yönünde 2 kat genişletiyor. Renklerle ilgili bir işlem yapmıyoruz. Çünkü kafam basmadı :) 
Güle güle kullanın.

Kod: [Seç]
;-------------------------------------------------------;
;                 EKRAN GENİŞLETİCİ ;
;                 03-08-2014 / HADES ;
; 123 bytes code ;
;-------------------------------------------------------;
org $8000

; ld hl,ekran
; ld de,$4000
; ld bc,6144
; ldir

setup ld hl,$400f
ld (source),hl
ld l,$1f
ld (target),hl ;hl=$401f

wait ld b,h ;efekt başlangıç gecikme sayacı ($40)
delay halt
djnz delay

ld c,3 ;ekran blok sayacı
loop04 ld b,8 ;blok satır sayacı
loop03 push bc
ld c,16 ;satır karakter sayacı
ld hl,(source)
ld ix,(target)
loop02 push hl
push ix
ld d,8 ;karakterin dikey pixel sayacı
loop01 call expand
dec ix
call expand
inc ix
inc h ;hl=hl+256
illegalcommand inc ixh ;ix=ix+256
dec d
jr nz,loop01
pop ix
pop hl
dec ix
dec ix
dec hl
dec c
jr nz,loop02

ld de,$20 ;bir alttaki pixel satırının
ld hl,(source) ;adresini hesapla
add hl,de
ld (source),hl
ld hl,(target)
add hl,de
ld (target),hl
pop bc
djnz loop03

ld de,$0700 ;sonraki blok adres hesapla
ld hl,(source)
add hl,de
ld (source),hl
ld l,$1f
ld (target),hl
dec c
jr nz,loop04
ret

expand ld b,4 ;karakter bit sayacı
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

;ekran incbin "aticatac_ekran.bin"

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

Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 179
IM 2 (Interrupt Mode 2) SETUP
« Yanıtla #73 : 21 Şubat 2015, 01:14:33 »
Z80'de interrupt kurulumu biraz karışıktır. (Benim anlamam bile uzun sürdü. :) )
Bu işlemi aşağıdaki kod ile oldukça basit bir hale getirdim. İnterrupt vektör tablosu ile programın çalışma adresi aynı olup hiç bir sorun çıkmamaktadır. Vektör tablosu $8000 - $8101 arasında olup, bu aralığı 257 adet $81 ile dolduruyoruz. $81 değeri aynı zamanda ADD A,C komutuna karşılık gelmektedir. Dolayısıyla USR 32768 yazdığımızda sanki normal bir program varmış gibi ADD A,C komutları çalışmakta ve $8101'e gelindiğinde IM 2 ayarlama programı çalışmaktadır.

Kod: [Seç]
;==============================================================;
; Z80 IM2 (INTERRUPT MODE 2) SETUP        ;
;==============================================================;
org $8000
;--------------------------------------------------------------;
vectab defs 257,$81 ;$81 ADD A,C komutu
;--------------------------------------------------------------;
start di ;interruptı durdur
ld a,$80 ;vektör tablosunun
ld i,a ;yüksek baytını yaz
im 2 ;mod 2'ye geç
ei ;interruptı başlat
halt ;1/50 saniye bekle
;--------------------------------------------------------------;
; Buradan itibaren $8181'e kadar 119 baytlık yer var.    ;
;--------------------------------------------------------------;
normalkod_example ld hl,22528
loop00 inc (hl)
jr loop00
;==============================================================;
org $8181
;--------------------------------------------------------------;
interrupt push af
push bc
push de
push hl
push ix
push iy
;--------------------------------------------------------------;
interrupt_example xor a
out (254),a
ld bc,545
delay dec bc
ld a,b
or c
jr nz,delay
inc a
out (254),a
;--------------------------------------------------------------;
pop iy
pop ix
pop hl
pop de
pop bc
pop af
;--------------------------------------------------------------;
ei
ret
;--------------------------------------------------------------;
end $8000
; end start
;==============================================================;

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2882
  • Advanced User Simulator
    • ae unutmadan
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #74 : 21 Şubat 2015, 19:42:32 »
interrupt rutininin başına ve sonuna pushlar ve poplar eklemek 131 ts'yi boşa harcamak oluyor, onu rutini tasarlayacak kişiye bırakmak gerek. Kodu olabildiğince dökümante edersek iyi olur, hiç bilmeyenler bir bakışta amacın ne olduğunu anlar. Örneğin, interrupt_example sembolü sonrasındaki kod nasıl bir iş yapıyor, neden o işi yapıyor? Neden delay veriyorsun mesela? Spectrumu bilmeyenler için güzel açıklamalar içerebilir.

Bir dipnot, HALT 1/50s beklemez, sonraki interrupta kadar bekler, bu 1 cycle da olabilir, sonsuza kadar da sürebilir.