Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > hr.comp.programiranje.java > #23
| 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.
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 | 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