Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > hr.comp.programiranje.java > #33

Re: Citanje color offset-a za svaki pixel u indexed color .bmp file-u?

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.

Show all headers | View raw


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 | NextPrevious in thread | Next in thread | Find similar


Thread

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