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


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

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-16 15:20 +0200
Organization Noname d.o.o.
Message-ID <MPG.33d58695c85cc16a98afad@news.t-com.hr> (permalink)
References (5 earlier) <oka2n8$unf$1@sunce.iskon.hr> <MPG.33d2e0fa57b3969598afa7@news.t-com.hr> <okak2v$cql$1@sunce.iskon.hr> <MPG.33d2fff662f7988698afa9@news.t-com.hr> <okfc5i$vtn$1@sunce.iskon.hr>

Cross-posted to 2 groups.

Show all headers | View raw


In article <okfc5i$vtn$1@sunce.iskon.hr>, Bruno Babic <a@b.c> says...
> Ne postoji "scramble hardware".


Kako ne, Scramble hardware je baziran na Galaxians hardware-u.


> To je sve u MAME-u neki od baznih 
> emulatora koji je mozda nesto malo izmijenjen sa necime sto je mozda 
> specificno za igru Scramble.
> Dakle, sve sto trebas je saznati koji je to CPU u pitanju i nekakav 
> osnovni memory layout.


MAME je slozen tako da emulira svaki fizicki segment elektronike, od 
processora, EEPROMA, PROM-ova, TTL cipova do diskretnih elektronickih 
sklopova realiziranih s komponentama (tranzistorima, TTL gate-ovima, 
linijama za kasnjenje itd.). S obzirom da su proizvodjaci iste cipove 
koristili u vise aparata ne mora postojati zaseban driver za neki 
aparat a u novijim verzijama MAME-a koje su u C++ je sve organizirano u 
clase Machine, Device i slicno a sve se konfigurira s macro-ima.

U medjuvremenu sam skinuo source od prve verzije MAME-a iz 1997. u 
kojoj je radio samo Pac-Man i jos 4 igre:

http://wiki.mamedev.org/index.php/Previous_MAME_Versions

Prvih par godina je sve bilo pisano u cistom C-u i tu je puno lakse 
pratiti kako emulatori funkcioniraju. MAME je inace zapocet kao 
emulator Pac-Man-a i nastao je od MultiPac emulatora:

http://caesar.logiqx.com/php/emulator.php?id=multipac

U Pac-Man-u recimo sliku iscrtava NVC293 video shifter kojega je Namco 
napravio za Pac-Man-a i Rally X ali on u svakom aparatu radi drukcije.

Ako skines MAME 0.1 (ciji source ima samo 500 KB za razliku od 730 MB 
koliko ima source od najnovije verzije) u file-u common.c ces u 
funkciji:

struct GfxElement *decodegfx(const unsigned char *src,const struct 
GfxLayout *gl)

vidjeti funkciju koja sadrzaj tile i sprite ROM-ova mapira u array za 
iscrtavanje na ekranu kompjutera (koristio se je Allegro library).



> Koliko ja vidim iz scramble.cpp, video RAM je od 0x4800 do 0x4bff, 
> spriteovi su od 0x5040 do 0x505f, itd.
> 

To nije dovoljno jer treba zakljuciti kako su podaci organizirani a 
bili su prilagodnjeni hardware-u za iscrtavanje slike. U Pac-Man 
hardware-u se za boju pixela koriste bit plane-ovi tako da pripadajuci 
bitovi koji kontroliraju boju nisu jedan do drugoga. Po dva bita 
odredjuju koja od 4 boje iz tablice boja ce se koristiti za pojedini 
pixel, tablica boja (colortable) je niz paleta od po 4 boje a svaki 
unos u paletu je index na boje u obliku:

B B G G G R R R

Svaka od tih struktora podataka (paleta, colortable, tile/sprite) je u 
drugom EPROM-u tako da EPROM za paletu ima samo 32 byte-a. U prvim 
verzijama MAME-a su ti podaci bili hardkodirani a u kasnijim verzijama 
se i podaci iz manjih PROM-ova citaju iz ROM file-ova pa je tako paleta 
za Pac-Man hardware u file-u:

82s123.7f

U ovom dokumentu mozes vidjeti kako su organizirani podaci u tile i 
sprite ROM-u za Pac-Man hardware:

https://www.lomont.org/Software/Games/PacMan/PacmanEmulation.pdf

ali ti podaci nazalost nisu tocni. Tocno mapiranje podataka iz sprite 
ROM-a koje je u tom dokumentu pogresno mozes iscitati iz moje rutine za 
generiranje sprite ROM-a:

package pacman;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;

import javax.imageio.ImageIO;

public class Spritegen {

	// vraca byte koji opisuje stupac od 4 pixela na poziciji i (0 - 
63)
	public static int get4px(int i, int data[][]) {
		int x;
		int y;
		int  out = 0;

		x = 15 - ((i % 8) + (i / 32)*8);		// x koordinata u 
array-u
		y = (15 + (i / 8)*4) % 16;				// y 
koordinata u array-u
		System.out.println(x + ", " + y);

		// bit 0 i 4 (bit 0 i bit 1 pomaknut na mjesto 4)
		out |= (data[x][y] & 0x01) | ((data[x][y] & 0x02) << 3); 
		// bit 1 i 5 (bit 0 pomaknut na mjesto 1 i bit 1 pomaknut 
na mjesto 5)
		out |= ((data[x][y-1] & 0x01) << 1) | ((data[x][y-1] & 
0x02) << 4);
		// bit 2 i 6 (bit 0 pomaknut na mjesto 2 i bit 1 pomaknut 
na mjesto 6)
		out |= ((data[x][y-2] & 0x01) << 2) | ((data[x][y-2] & 
0x02) << 5);
		// bit 3 i 7 (bit 0 pomaknut na mjesto 3 i bit 1 pomaknut 
na mjesto 7)
		out |= ((data[x][y-3] & 0x01) << 3) | ((data[x][y-3] & 
0x02) << 6);

		return out;
	}

	public static void main(String[] args) throws IOException {

		final File file = new File("sprite.bmp");			
					// slika
		final BufferedImage image = ImageIO.read(file);
		final FileOutputStream outfile = new FileOutputStream
("output.bin");	// izlazni file
		final File romfile = new File("pacman.5f");		
						// ROM file
		final RandomAccessFile tilerom = new RandomAccessFile
(romfile, "rw");	// citanje i pisanje
		tilerom.seek(0L);

		int data[][] = new int[16][16];		// za direktno 
upisivanje podataka iz slike
		int out;

		for (int y=0; y < image.getHeight(); y++) {
			for (int x=0; x < image.getWidth(); x++) {
				final int boja = image.getRGB(x, y);
				final int red = ((boja & 0x00ff0000) >> 16);
				final int green = ((boja & 0x0000ff00) >> 8);
				final int blue = boja & 0x000000ff;

				if ((red == 0xff) && (green == 0xff) && (blue 
== 0xff)) {
					//System.out.print("1 ");		// 
bijela je 1
					out = 1;
				} else if (red == 0xff) {
					//System.out.print("3 ");		// 
crvena je 3
					out = 3;
				} else if (blue == 0xff) {
					//System.out.print("2 ");		// 
plava je 2
					out = 2;
				} else {
					//System.out.print("0 ");		// 
crna je 0
					out = 0;
				}
				System.out.print(out + " ");
				data[x][y] = out & 0xff;
			}
			System.out.println();
		}

		System.out.println();
		// ovdje treba procitane vrijednosti mapirati u ispravnom 
rasporedu za tile ROM
		for (int i=0; i < 64; i++) {
			out = get4px(i, data);
			//System.out.println(out + " ");
			outfile.write(out);			// upisi byte u 
izlazni file
			tilerom.write(out);			// promijeni byte 
u ROM file-u
		}

		tilerom.close();
		outfile.close();

	} // main

} // class

Do toga kako su podaci u sprite ROM-u mapirani sam doso editiranjem 
ROM-ova pa iscrtavanjem sprite-ove i zakljucivanjem kako su razbacani 
bitovi a iz ovih nekoliko clanaka se moze vidjeti da su isti nacin 
koristili i autori MAME drivera:

http://aarongiles.com/old-stuff/mame-memories/

Trebalo je zapaziti da svaki byte kontrolira 4 pixela s tim da su 
parovi bitova za svaki pixel svaki u svojem nibble-u, recimo prvi pixel 
kontroliraju nulti i cetvrti bit, drugi pixel prvi i peti bit, treci 
pixel kontroliraju drugi i sesti bit a cetvrti pixel treci i sedmi bit.

Sprite ima 16x16 pixela a svaki byte kontrolira 4 pixela pa sam gledao 
kako se mijenjaju x i y koordinate od baznog pixela u grupama od po 4 
pixela koje kontrolira jedan byte iz sprite ROM-a. Takvih grupa ima 64 
pa ako se brojac krece od 0 do 63 onda se x koordinata mijenja ovako:

x = 15 - ((i % 8) + (i / 32)*8);

Slicno tome, ako se y izracuna kao:

y = (15 + (i / 8)*4) % 16;

onda se dobije sljedeci niz koordinata:

15, 15
14, 15
13, 15
12, 15
11, 15
10, 15
9, 15
8, 15
15, 3
14, 3
13, 3
12, 3
11, 3
10, 3
9, 3
8, 3
15, 7
14, 7
13, 7
12, 7
11, 7
10, 7
9, 7
8, 7
15, 11
14, 11
13, 11
12, 11
11, 11
10, 11
9, 11
8, 11
7, 15
6, 15
5, 15
4, 15
3, 15
2, 15
1, 15
0, 15
7, 3
6, 3
5, 3
4, 3
3, 3
2, 3
1, 3
0, 3
7, 7
6, 7
5, 7
4, 7
3, 7
2, 7
1, 7
0, 7
7, 11
6, 11
5, 11
4, 11
3, 11
2, 11
1, 11
0, 11

a to su upravo koordinate najdoljnjeg pixela u svakoj grupi od po 4 
pixela koju kontrolira jedan byte podataka. To su koortidnate dna 
svakog od 64 stupca koji sadrzi 4 pixela u onom redosljedu u kojem su 
podaci iz ROM-a mapirani unutar sprite-a.

Ako se nacrta mreza u kojoj se oznaci koje pixele koji byte kontrolira 
onda se relativno lako moze uociti taj uzorak. Logicno je da se 
mapiranje mora moci zapisati s par logickih operacija jer su podaci 
prilagodjeni hardware-u za iscrtavanje slike.

Umjesto (i % 8) se moze pisati (i & 7) a umjesto (i / 16) se moze 
pisati (i >> 4) a to su upravo operacije koje je radio hardware za 
prikaz videa.

Medjutim, niti samo ti podaci nisu dovoljni nego ima jos cijeli niz 
podataka koje treba znati da bi se moglo poceti pisati program za 
hardware od nekog od tih starijih aparata. Jer svaki je imao jos 
nekoliko vanjskih slopova s kojima se je komuniciralo preko memorijski 
mapiranih portova ili OUT instrukcija (na Pac-Man-u se koristi i jedno 
i drugo). Dodatno sve skupa otezava cinjenica da na nekim portovima 
citanje ima jednu funkciju a pisanje drugu. Recimo kad se port cita se 
dobiju podaci s joystick-a i slotova od zetonjere, a kad se u taj isti 
port pise onda se kontrolira vanjski hardware za generiranje 
interrupta. Da bi stvari bile jos kompliciranij, neka pisanja se izvode 
tako da se ne koristi data bus nego se pise preko adresnih linija preko 
bitova koji su u hardware-u za dekodiranje adrese maskirani.
-- 
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