Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > hr.comp.programiranje.java > #33
| From | Chupo <bad_n_mad@yahoo.com> |
|---|---|
| Newsgroups | hr.comp.programiranje, hr.comp.programiranje.java |
| Subject | Re: Citanje color offset-a za svaki pixel u indexed color .bmp file-u? |
| Date | 2017-07-20 20:42 +0200 |
| Organization | Noname d.o.o. |
| Message-ID | <MPG.33db1810b8d453c098afb4@news.t-com.hr> (permalink) |
| References | (13 earlier) <okl956$h69$1@sunce.iskon.hr> <MPG.33d8b3d68ccdbc5698afaf@news.t-com.hr> <oknm0i$cnp$1@sunce.iskon.hr> <MPG.33d989586fd9d64198afb0@news.t-com.hr> <okqk9n$la5$1@sunce.iskon.hr> |
Cross-posted to 2 groups.
In article <okqk9n$la5$1@sunce.iskon.hr>, Bruno Babic <a@b.c> says...
> Ovo i mene zanima. Rado bih da vidim kako tocno Z80 radi, pa ako imas
> volje i zivaca da pomalo usput objasnjavas sto, kako i zasto radis, ja
> cu te rado poslusati (a pretpostavljam i ostali lurkeri na grupi).
Evo za pocetak kako sam si slozio razvojnu okolinu:
U jedan folder sam raspakirao najnoviji MAME (mame0187b_32bit.exe) i tu
sam stavio .bat file sa sadrzajem:
REM mame.exe -window -debug pacman
REM mame.exe -window pacman
mame.exe pacman
Ako je aktivna prva linija onda se pokrece debuggiranje, druga linija
pokrece emulaciju u prozoru a treca u full screen. Da bi se pokrenuli
ROM-ovi koji ne prolaze CRC i hash provjeru se MAME mora pokrenuti iz
komandne linije, ako se isti modificirani ROM-ovi pokrenu iz MAME
launcher-a onda pokretanje nece biti dozvoljeno.
U pacman.zip file-u za tu verziju MAME-a mora biti 10 ROM file-a i taj
file treba skinuti posebno jer distribucija ROM-ova s MAME-om nije
dozvoljena.
Nakon toga sam slozio radni folder za pisanje programa za Pac-Man
aparat i kreiranje pacman.6e ROM file-a u kojem se nalazi prvih 4 KB
koda za processor Z80. U taj sam folder stavio i originalni pacman.zip
file u kojem se nalazi svih 10 ROM file-ova.
Extenzija u imenu svakog od file-a inace oznacava fizicku lokaciju ROM
cipa na originalnoj maticnoj ploci od aparata. Na elektricnoj shemi
uredjaja su na svakoj strani oznake i cip u kojem se nalazi prvih 4 KB
koda je na lokaciji 6-E pa zato takva extenzija. ROM file-ovi su cisti
binarni file-ovi bez ikakvog header-a.
U tom folderu sam kreirao file pacman_src.zx i compile.bat file sa
sadrzajem:
@echo off
::echo Pocetak compile-iranja...
::echo.
sjasmplus.exe pacman_src.zx --lst=listing.zx
echo.
::echo Kraj compile-iranja
::echo.
pause
Extenziju .zx sam koristio zato jer sam SjASMPlus ranije koristio za
generiranje koda za ZX Spectrum pa sam naviko na tu extenziju. Za
editiranje source-a koristim staru verziju ConTEXT editora od Edena
Kirina (koji je godinama bio ovdje na news-ima na grupama za
programiranje) s dodanom definicijom za Z80 highlighter (jedino mi se
cini da sam negdje dodao i extenziju .zx tako da se highligter izabere
automatski).
Nakon sta kliknem na compile.bat se u istom folderu kreiraju file-ovi
pacman.6e duzine 4096 byte-ova i listing.zx u kojem je originalni
listing zajedno s opcode-ovima instrukcija i adresama koje je generirao
compiler a sta je jako korisno za debuggiranje napisanog koda s
debugger-om koji je ugradjen u MAME.
Nakon toga jednostano s drag'n'drop file pacman.6e povucem na file
pacman.zip a onda file pacman.zip samo povucem na folder roms unutar
foldera u kojem je instaliran MAME (normalno, kad kopiram .zip file
drzim Ctrl tako da Windows-i umjesto move naprave copy). To bi se lako
moglo automatizirati ali sve skupa traje jednu sekundu pa nisam za to
isao raditi skriptu ali kada ce mi generirani kod zauzimati vise ROM
file-ova cu u SjASMPlus dodati Lua skriptu za automatizaciju cijelog
procesa tako da ce se onda nakon compile ROM iste sekunde moci
pokrenuti u emulatoru.
I na kraju ostaje jos samo testni kod za Z80. Ovdje sam slozio rutine
za horizontalni i vertikalni ispis texta u centralnom dijelu ekrana i
za ispis u gornjem i donjem dijelu ekrana. Iako je organizacija video
memorije za ta dva podrucja drukcija (u centralnom cijelu su tile-ovi
organizirani u vertikalne blokove koji idu zdesna na lijevo a u gornjem
i donjem podrucju su ogranizirani u horizontalne blokove koji isto od
gore prema dole) sam za pisanje u jedan i drugi dio ekrana slozio istu
rutinu jer se moze primijetiti da pomak izmedju adresa u video RAM-u
koji u centralnom dijelu uzrokuje hozizontalni pomak - u gornjem i
donjem dijelu ekrana uzrokuje vertikalni pomak i obratno. S obzirom da
vertikalni pomak koji u centralnom dijelu ekrana uzorkuje pomak prema
dolje, u gornjem i donjem dijelu ekrana uzrokuje pomak prema lijevo,
morao sam u rutini uvesti jos jedan slucaj jer bi se text u gornjem i
donjem dijelu inace ispisivao zdesna na lijevo. Zvuci komlicirano ali
svakome tko ce analizirati organizaciju video RAM-a ce biti jasno o
cemu govorim.
U programu je i rutina za ispisivanje hex vrijednosti, placeholder-i za
RST rutine, interrupt rutina u kojoj se broje i ispicuju tick-ovi i
rutina za scroll jednog po jednog sprite-a na dnu ekrana jedan za
drugim preko ekrana prelaze tresnja, jagoda, breskva, zvono itd.) koji
su definirani u ROM-u pacman.5f
Ispod tick-ova se ispisuje i hex vrijednost s porta za ocitavanje
joystick-a i coin slot-ova (vrijednost se nece mijenjati prilikom
ubacivanja zetona jer sam byte maskirao tako da se mijenjaju samo
bitovi preko kojih se ocitava joystick).
Za one kojima ce kod biti cudan, SjASMPlus omogucava koristenje
lokalnih labela tako da se iste (brojcane) labele u kodu pojavljuju
vise puta a kada se koriste takve labele onda se smjer skoka oznacava s
dodatnim slovom - B(ack) ili F(orward).
Ovo je samo testni kod koji nije optimiziran:
TAB width = 10 karaktera
OUTPUT pacman.6e
wdg equ #50c0 ; watchdog timer
irqen equ #5000 ; interrupt request enable
ram equ #4c00 ; pocetak RAM-a
ramtop equ #4ff0 ; kraj RAM-a (zadnjih 16 byte-ova je
sprctrl)
vram equ #4000 ; video RAM
colram equ #4400 ; color RAM
sprctrl equ #4ff0 ; 8x2 byte-a nnnnnnxy (number - flip) <--
kraj RAM-a
sprcoords equ #5060 ; 8x2 bytes (x, y)
; sprctrl se moze i citati
; sprcoords se NE moze citati!!
in0 equ #5000 ; coin3 coin2 coin1 rack down right left
up
in1 equ #5040 ; upright start2 start1 service down right left
up
topleft equ vram + #03a0 ; gornji lijevi kut
; ************
; * variable *
; ************
; xpos equ ram ; #4c00
; ypos equ ram + #01
; col equ ram + #02 ; boja (paleta)
; printmode equ ram + #03 ; 0 = horizontalno, ostalo = vertikalno
; ticks equ ram + #04 ; 2 byte-a
; ; ram + #05
; tickslast equ ram + #06 ; 2 byte-a
; ; ram + #07
; c1 equ ram + #08 ; counter 1
; c1init equ ram + #09 ; counter 1 init
; drugi nacin definiranja variabli u RAM-u
map #4c00
x0 # 1
y0 # 1
col # 1 ; boja (paleta)
printmode # 1 ; 0 = horizontalno, 1 = vertikalno, 2 = vrh i
dno ekrana
ticks # 2 ; 2 byte-a
tickslast # 2 ; 2 byte-a
c1 # 1 ; counter 1
c1init # 1 ; counter 1 init
endvar # 1
DISPLAY " "
DISPLAY "KRAJ VARIABLI : ", /h, endvar, ", DUZINA : ", /d,
endvar - #4c00
; *************
; * konstante *
; *************
C1_INIT equ 2 ; counter za brzinu pomaka
org #0000
pocetak di
xor a
ld (irqen),a ; iskljuci vanjski interrupt
jr start
; **************
; * RST adrese *
; **************
; RST #08
FPOS #0008
org #0008
ret
; RST #10
FPOS #0010
org #0010
ret
; RST #18
FPOS #0018
org #0018
ret
; RST #20
FPOS #0020
org #0020
ret
; RST #28
FPOS #0028
org #0028
ret
; RST #30
FPOS #0030
org #0030
ret
; ********************
; * INTERRUPT RUTINA *
; ********************
; RST #38
FPOS #0038
org #0038
push hl
push de
push bc
push af
ld hl,ticks+1 ; nizi byte
ld a,(hl)
inc a ; povecaj broj tick-ova
ld (hl),a
jr nz,1F ; ako je 256
dec hl
inc (hl) ; povecaj i visi byte
1 ld hl,c1 ; counter 1
dec (hl)
jr nz,2F
ld a,(c1init)
ld (c1),a ; ponovo inicijaliziraj c1
ld hl,x0
dec (hl) ; pomakni sprite
ld a,(x0)
ld (sprcoords),a ; upisi novu koordinatu
or a ; ako je nula
jr nz,2F
ld a,(sprctrl)
add a,#04 ; sljedeci sprite
ld (sprctrl),a
call sprnum ; ispisi broj sprite-a
2 call joystick ; prikazi ulaz sa joystick-a
pop af
pop bc
pop de
pop hl
ei
reti ; vrati se iz interrupt rutine
; *********
; * START *
; *********
; nakon zadnje RST adrese
start ld sp,ramtop ; stack pointer na kraj RAM-a
ld hl,irqen ; resetiranje 74ls259
ld b,#08
xor a
loop1 ld (hl),a
inc l
djnz loop1
; resetiraj brojac tick-ova
ld hl,ticks
ld (hl),a
inc l
ld (hl),a
; reset counter-a
ld a,C1_INIT
ld (c1init),a ; inicijalna vrijednost brojaca
ld (c1),a ; trenutna vrijednost brojaca
ld a,#01 ; aktiviranje interrupt-a
ld (irqen),a ; ukljuci vanjski interrupt
im 1
ei
; kraj inicijalizacije
ld hl,topleft ; koordinate
ld de,msg ; pointer na text
xor a
ld (printmode),a ; horizontalno
inc a
ld (col),a ; paleta #01
push hl
push de
call print ; ispisi text
pop de ; jos jedanput isti text
pop hl ; na istom mjestu
ld a,#01
ld (printmode),a ; okomito
call print ; ispisi text
xor a
ld (printmode),a ; vrati na horizontalno
ld hl,vram + #0362 ; koordinate
ld c,#c9
call printhex ; ispisi broj
call movright
ld c,#af
call printhex
call sprtest ; prikazi sprite
jr loop
ld hl,vram ; fill video memorije
ld b,#04
loop3 ld (wdg),a
;ld a,#40
xor a
loop2 ld (hl),a
inc a
and #0f
inc l
jr nz,loop2
inc h
djnz loop3
ld b,#04 ; fill color memorije
loop5 ld (wdg),a
;ld a,#0f
ld a,#01
loop4 ld (hl),a
;inc a
inc l
jr nz,loop4
inc h
djnz loop5
loop call wdg_res
ld hl,vram + #0364
ld a,(ticks)
ld c,a
call printhex
call movright
ld a,(ticks+1)
ld c,a
call printhex
;call sprtest
jr loop ; kraj programa
; *************
; * subrutine *
; *************
; reset watchdog timer-a
wdg_res xor a
ld (wdg),a
ret
; print
; hl = adresa u video RAM-u
; de = pointer na text (#ff = kraj)
print ld a,(de) ; procitaj byte
cp #ff
ret z ; vrati se ako je kraj
ld (hl),a ; upisi byte u video RAM
;ld bc,#0400 ; offset do color RAM-a
;push hl
;add hl,bc ; izracunaj adresu
set 2,h ; 'izracunaj' adresu u color RAM-u
ld a,(col)
ld (hl),a ; podesi boju (paleta)
;pop hl
res 2,h ; hl opet pokazuje na video RAM
ld a,(printmode)
or a
jr z,2F ; ako je 0
dec a
jr z,3F ; ako je 1
inc l
jr 1F ; ako je 2 (vrh i dno ekrana)
3 inc l ; vertikalni pomak
jr 1F
2 ld a,l ; horizontalni pomak (hl -= #20)
sub #20
ld l,a
jr nc,1F
dec h
1 inc de
call wdg_res
jr print
; end print
; print hex
; hl = adresa u video RAM-u
; c = broj (registar se ne mijenja)
; hl na izlazu pokazuje na sljedecu lokaciju
printhex ld a,c
rra
rra
rra
rra
and #0f
ld (hl),a
;ld de,#0400
;push hl
;add hl,de
set 2,h ; adresa u color RAM-u
ld a,(col)
ld (hl),a
;pop hl
res 2,h ; hl opet pokazuje na video RAM
ld a,(printmode)
or a
jr z,1F
dec a
jr z,3F
dec l ; printmode 2 (vrh i dno ekrana)
jr 2F
3 inc l ; vertikalni pomak
jr 2F
1 call movright
2 ld a,c ; ponovo ucitaj broj
and #0f
ld (hl),a
;ld de,#0400
;push hl
;add hl,de
set 2,h ; color RAM
ld a,(col)
ld (hl),a
;pop hl
res 2,h ; video RAM (ako ce se pisati dalje)
ret
; end printhex
; movright
; horizontalni pomak (hl -= #20)
movright ld a,l
sub #20
ld l,a
jr nc,1F
dec h
1 ret
;sprite test
sprtest xor a ; nulti sprite
;ld a,#3e << 2 ; predzadnji sprite
;ld a,#10 << 2 ; sprite pune sirine
ld (sprctrl),a ; sprite 0
ld a,#01
ld (sprctrl+1),a ; paleta #01
ld a,239
ld (x0),a
ld (sprcoords),a
ld a,16
ld (y0),a
ld (sprcoords+1),a
; debug
;ld a,231
;ld (sprcoords),a
ret
; end sprite test
; joystick
joystick ld a,(in0) ; procitaj port 1
and #0f ; maskiraj down right left i right
ld c,a ; za printhex
ld hl,vram + #0366
jr printhex ; ret je u printhex
; end joystick
; print sprite number
sprnum or a ; obrisi carry flag
rra
rra
ld c,a ; za printhex
ld a,2 ; vrh ili dno ekrana
ld (printmode),a ; vertikalno je na dnu horizontalno
ld hl,vram + #0010 ; drugi red sredina na dnu
call printhex
xor a
ld (printmode),a ; horizontalno pisanje po glavnom ekranu
ret
msg byte "CHUPO@WAS@HERE"
defb #ff
kraj
; **************************************************
FPOS #0fff ; ROM ima 4096 byte-ova
org #0fff
last byte #c9
romend
display " "
display "GRESAKA : ", /d, _ERRORS
display "UPOZORENJA : ", /d, _WARNINGS
display "DUZINA PROGRAMA: ", /a, kraj - pocetak, " bytes"
display "DUZINA ROM-a : ", /a, romend - pocetak, " bytes"
display " "
--
Let There Be Light
Custom LED driveri prema specifikacijama
http://tinyurl.com/customleddriver
Chupo
Back to hr.comp.programiranje.java | Previous | Next — Previous in thread | Next in thread | Find similar
Citanje color offset-a za svaki pixel u indexed color .bmp file-u? Chupo <bad_n_mad@yahoo.com> - 2017-07-10 05:46 +0200
Re: Citanje color offset-a za svaki pixel u indexed color .bmp file-u? Bruno Babic <a@b.c> - 2017-07-10 14:16 +0200
Re: Citanje color offset-a za svaki pixel u indexed color .bmp file-u? Chupo <bad_n_mad@yahoo.com> - 2017-07-10 15:18 +0200
Re: Citanje color offset-a za svaki pixel u indexed color .bmp file-u? Bruno Babic <a@b.c> - 2017-07-12 09:32 +0200
Re: Citanje color offset-a za svaki pixel u indexed color .bmp file-u? Chupo <bad_n_mad@yahoo.com> - 2017-07-12 23:08 +0200
Re: Citanje color offset-a za svaki pixel u indexed color .bmp file-u? Bruno Babic <a@b.c> - 2017-07-14 11:25 +0200
Re: Citanje color offset-a za svaki pixel u indexed color .bmp file-u? Bruno Babic <a@b.c> - 2017-07-14 11:27 +0200
Re: Citanje color offset-a za svaki pixel u indexed color .bmp file-u? Chupo <bad_n_mad@yahoo.com> - 2017-07-14 15:09 +0200
Re: Citanje color offset-a za svaki pixel u indexed color .bmp file-u? Bruno Babic <a@b.c> - 2017-07-14 16:22 +0200
Re: Citanje color offset-a za svaki pixel u indexed color .bmp file-u? Chupo <bad_n_mad@yahoo.com> - 2017-07-14 17:21 +0200
Re: Citanje color offset-a za svaki pixel u indexed color .bmp file-u? Bruno Babic <a@b.c> - 2017-07-16 11:37 +0200
Re: Citanje color offset-a za svaki pixel u indexed color .bmp file-u? Chupo <bad_n_mad@yahoo.com> - 2017-07-16 15:20 +0200
Re: Citanje color offset-a za svaki pixel u indexed color .bmp file-u? Bruno Babic <a@b.c> - 2017-07-17 12:36 +0200
Re: Citanje color offset-a za svaki pixel u indexed color .bmp file-u? Chupo <bad_n_mad@yahoo.com> - 2017-07-18 00:37 +0200
Re: Citanje color offset-a za svaki pixel u indexed color .bmp file-u? Bruno Babic <a@b.c> - 2017-07-18 17:23 +0200
Re: Citanje color offset-a za svaki pixel u indexed color .bmp file-u? Chupo <bad_n_mad@yahoo.com> - 2017-07-19 01:10 +0200
Re: Citanje color offset-a za svaki pixel u indexed color .bmp file-u? Bruno Babic <a@b.c> - 2017-07-19 15:14 +0200
Re: Citanje color offset-a za svaki pixel u indexed color .bmp file-u? Chupo <bad_n_mad@yahoo.com> - 2017-07-19 16:21 +0200
Re: Citanje color offset-a za svaki pixel u indexed color .bmp file-u? Nikolaj Lazic <nlazicBEZ_OVOGA@mudrac.ffzg.hr> - 2017-07-19 17:08 +0000
Re: Citanje color offset-a za svaki pixel u indexed color .bmp file-u? Bruno Babic <a@b.c> - 2017-07-20 18:04 +0200
Re: Citanje color offset-a za svaki pixel u indexed color .bmp file-u? Chupo <bad_n_mad@yahoo.com> - 2017-07-20 19:17 +0200
Re: Citanje color offset-a za svaki pixel u indexed color .bmp file-u? Chupo <bad_n_mad@yahoo.com> - 2017-07-20 20:42 +0200
Re: Citanje color offset-a za svaki pixel u indexed color .bmp file-u? Chupo <bad_n_mad@yahoo.com> - 2017-07-21 03:58 +0200
Re: Citanje color offset-a za svaki pixel u indexed color .bmp file-u? Chupo <bad_n_mad@yahoo.com> - 2017-07-21 05:14 +0200
Re: Citanje color offset-a za svaki pixel u indexed color .bmp file-u? Bruno Babic <a@b.c> - 2017-07-21 12:04 +0200
Re: Citanje color offset-a za svaki pixel u indexed color .bmp file-u? Chupo <bad_n_mad@yahoo.com> - 2017-07-21 17:24 +0200
Re: Citanje color offset-a za svaki pixel u indexed color .bmp file-u? Bruno Babic <a@b.c> - 2017-08-04 13:10 +0200
Re: Citanje color offset-a za svaki pixel u indexed color .bmp file-u? Chupo <bad_n_mad@yahoo.com> - 2017-08-04 17:21 +0200
Re: Citanje color offset-a za svaki pixel u indexed color .bmp file-u? Bruno Babic <a@b.c> - 2017-08-07 17:30 +0200
Re: Citanje color offset-a za svaki pixel u indexed color .bmp file-u? Chupo <bad_n_mad@yahoo.com> - 2017-08-07 18:30 +0200
Re: Citanje color offset-a za svaki pixel u indexed color .bmp file-u? Chupo <bad_n_mad@yahoo.com> - 2017-08-07 18:35 +0200
Re: Citanje color offset-a za svaki pixel u indexed color .bmp file-u? Chupo <bad_n_mad@yahoo.com> - 2017-07-16 01:04 +0200
Re: Citanje color offset-a za svaki pixel u indexed color .bmp file-u? Bruno Babic <a@b.c> - 2017-07-16 11:32 +0200
csiph-web