diff options
Diffstat (limited to 'src/mame/video/midzeus.c')
-rw-r--r-- | src/mame/video/midzeus.c | 1365 |
1 files changed, 1029 insertions, 336 deletions
diff --git a/src/mame/video/midzeus.c b/src/mame/video/midzeus.c index ce44dda519e..b9f1e84c93a 100644 --- a/src/mame/video/midzeus.c +++ b/src/mame/video/midzeus.c @@ -51,7 +51,7 @@ UINT32 *zeusbase; static poly_manager *poly; -static UINT32 zeuscmd_buffer[8]; +static UINT32 zeuscmd_buffer[20]; static UINT8 zeuscmd_buffer_words; static UINT8 zeuscmd_buffer_expected_words; static INT16 zeus_matrix[3][3]; @@ -62,11 +62,15 @@ static UINT32 zeus_blend; static UINT32 zeus_texdata; static UINT32 zeus_objdata; -static UINT32 last_tex[1000][2]; -static int last_tex_index; - static UINT32 *waveram; +static UINT8 single_step; +static poly_extra_data single_step_extra; +static UINT32 single_step_val1; +static UINT32 single_step_val2; +static INT32 single_step_dx, single_step_dy; +static UINT8 single_step_advance; + /************************************* @@ -77,6 +81,12 @@ static UINT32 *waveram; static void exit_handler(running_machine *machine); +static void zeus_write_16bit(offs_t offset, UINT16 data, int logit); +static void zeus_write_32bit(offs_t offset, UINT32 data, int logit); +static void zeus_process_write(offs_t offset); +static void zeuscmd_execute(int words); +static UINT8 zeuscmd_length(UINT32 word); + /************************************* @@ -249,6 +259,37 @@ VIDEO_UPDATE( midzeus ) src += 2; } } + + if (single_step) + { + int texwshift = ((single_step_val2 >> 6) + single_step_dx) & 7; + const UINT32 *texbase = &waveram[(single_step_val1 << ((7 + single_step_dy) - texwshift)) & 0x3fffff]; + int texwidth = 512 >> texwshift; + int texdepth = (single_step_val2 & 0x20) ? 8 : 4; + int x, y; + + for (y = 0; y < 256; y++) + { + UINT16 *dest = (UINT16 *)bitmap->base + y * bitmap->rowpixels + 400; + for (x = 0; x < 256; x++) + { + if (x < texwidth) + dest[x] = single_step_extra.palbase[(texdepth == 8) ? + get_texel_8bit(texbase, y, x, texwidth) : + get_texel_4bit(texbase, y, x, texwidth)]; + else + dest[x] = 0; + } + } + + popmessage("val1=%08X val2=%08X\nwidth=%d depth=%d", single_step_val1, single_step_val2, texwidth, texdepth); + + if (input_code_pressed(KEYCODE_UP)) { single_step_dy--; while (input_code_pressed(KEYCODE_UP)) ; } + if (input_code_pressed(KEYCODE_DOWN)) { single_step_dy++; while (input_code_pressed(KEYCODE_DOWN)) ; } + if (input_code_pressed(KEYCODE_LEFT)) { single_step_dx--; while (input_code_pressed(KEYCODE_LEFT)) ; } + if (input_code_pressed(KEYCODE_RIGHT)) { single_step_dx++; while (input_code_pressed(KEYCODE_RIGHT)) ; } + if (input_code_pressed(KEYCODE_LSHIFT)) { single_step_advance = TRUE; while (input_code_pressed(KEYCODE_LSHIFT)) ; } + } } /* waveram drawing case */ @@ -278,164 +319,11 @@ VIDEO_UPDATE( midzeus ) popmessage("offs = %06X", yoffs << 12); } - if (input_code_pressed(KEYCODE_T) && last_tex_index != 0) - { - int i; - printf("----\n"); - for (i = 0; i < last_tex_index; i++) - printf("%06X %03X (w=%d)\n", last_tex[i][0], last_tex[i][1], 512 >> ((last_tex[i][1] >> 6) & 7)); - last_tex_index = 0; - } - return 0; } -/* - - New analysis: - - Offset - ------ - - $58 W Usually written after $5A; after writing, waits for $F6 bit 4 to be cleared - - $5A W Usually written first, followed by $58 - - $68 W Written at startup: - $00030000 = toggled on then off at startup - - $76 W - - $7C W - - $80 W Master control - - $40000000 = set along with $02000000 when enabling FIFO empty interrupt - $02000000 = enable internal data FIFO empty interrupt - $01000000 = cleared along with $02000000 when disabling FIFO empty interrupt - $00020000 = 16-bit (0) or 32-bit (1) mode - $00000008 = cleared just before writing to offsets $200-$3FF - - $82 W - $84 W - $86 W - $88 W - $8A W - $8C W - $8E W - - $B0 R/W Data port for direct RAM access - $B2 R/W Data port for direct RAM access - - $B4 W Address for direct RAM access - - $07FF0100 = mask for Y coordinate - $000000FF = mask for X coordinate - - $B6 W Direct RAM access control - - $80000000 = enable writes to wave RAM 0 - $40000000 = enable writes to wave RAM 1 - $02000000 = perform access on write to B0(0) or B2(1) ????? - $00800000 = enable writes from [$B2] to depth buffer - $00400000 = enable writes from [$B0] to depth buffer - $00200000 = enable writes from [$B2] to RAM buffer - $00100000 = enable writes from [$B0] to RAM buffer - $00020000 = auto increment the address - $00010000 = perform a read when the address is written - $00000001 = enable direct RAM access - - Examples: - $80A00000 when writing a single pixel (address written each time) - $80A20001 when writing the right pixel of a pair (autoinc assumed) - $80F60001 when writing the middle pairs of pixels (autoinc assumed) - $80520001 when writing the left pixel of a pair (autoinc assumed) - $82F00001 when testing wave RAM page 1 (address written each pair) - $42F00001 when testing wave RAM page 0 (address written each pair) - $82F60001 when uploading to wave RAM page 1 (autoinc assumed) - $42F60001 when uploading to wave RAM page 0 (autoinc assumed) - - $C0 W Written at startup = $801F2500 - $C2 W Written at startup = $0015E591 - $C4 W Written at startup = $000C0042 (HSYNC start/HSYNC end?) - $C6 W Written at startup = $0211007F (HTOTAL/HBLANK end?) - $C8 W Written at startup = $010300FF (VSYNC start/VBLANK start?) - $CA W Written at startup = $01160107 (VTOTAL/VSYNC end?) - $CC W Written at startup = $00000000 - $CE W Written at startup = $00C87620 - - $E0 W Internal data FIFO - - $F2 R Looped on until it returns a stable value; must change frequently; PRNG? - - $F4 R Status register - - $00000800 = VBLANK? code waits for it to clear to 0 and then reset to 1 - $00000140 = tested together in tight loop until both are 0 - $00000008 = internal data FIFO full - $00000004 = tested in tight loop along with $00000002 until at least one is set - $00000002 = tested in tight loop after handling FIFO interrupt until set - - $F6 R Status register 2 - - $00000010 = tested in tight loop after writing 5A/59/58 until set to 0 - - $200- W Unknown, but written in a loop with master control bit $00000008 cleared - $3FF Possible fast buffer clear? One set of writes stores $7F7F to all entries. - A second set writes $E00,$25,$E01,$25,...,$E7F,$25. A third set writes - $52,$A0000000,... - -Notes: - - In 16-bit mode, writes to $E0 are done via $E1 first then $E0 - -------------------------------------------------------- - -Old info: - - offset B7 = control.... - - 8000 = page 1 enable - 4000 = page 0 enable - - 0080 = 2nd pixel enable (maybe Z buff?) - 0040 = 1st pixel enable (maybe Z buff?) - 0020 = 2nd pixel enable - 0010 = 1st pixel enable - - - writes 80a2 to write an odd pixel at startup - writes 80f6 to write the middle pixels - writes 8052 to write an odd pixel at the end - - writes 8050 before writing an odd pixel - writes 80a0 before writing an even pixel - - writes 44f1 before reading from page 0 of wave ram - writes 84f1 before reading from page 1 of wave ram - - writes 42f0 before writing to page 0 of wave ram - writes 82f0 before writing to page 1 of wave ram - -*/ - -/* - zeus data notes: - - Data from $1000-1A20 - Palettes at $2000,$2200,$2400 - Data from $2600-27C7 - Palettes at $27C8,$29C8,$2BC8,$2DC8 - Palettes up through $5A000 - - Interesting data at $5A000-5BFFF - - Common sequence: - $8000 xxxx $0C01 $3805 - x = matches address of next data * 8 -*/ @@ -473,6 +361,16 @@ Old info: $0000C040 = set palette to 'yyyyyyyy' + $01rrxxxx = another type of register set? + yyyyyyyy + + $01008000 = set object pointer (equivalent to word 2 of command $67) + $0100C0B0 = set texture data (equivalent to word 1 of command $67) + $0100C09C + $0100C0A3 + $0100C0F0 + $0100C040 = set palette base + $17rrxxxx = 16-bit write 'xxxx' to register 'rr' $1752xxxx = write 'xxxx' to something that reflects back through $B2 @@ -480,7 +378,7 @@ Old info: $1772xxxx = write 'xxxx' to upper 16 bits of Y coordinate $1774xxxx = write 'xxxx' to upper 16 bits of Z coordinate - $18rr0000 = 32-bit write 'xxxxxxxx' to register 'rr' + $18rr0000 = 32-bit write 'xxxxxxxx' to register ('rr' & 0x7f) xxxxxxxx $1A000000 = pipeline synchronize (guess) @@ -500,6 +398,9 @@ Old info: */ /* + +MK4: + Zeus cmd 18 : 18D60000 500A00FF Zeus cmd 00 : 0005C0A5 21001125 Zeus cmd 25 : 25000000 007F0018 01000400 B0F60008 @@ -602,7 +503,434 @@ Zeus cmd 1C : ( 4000 0000 0000 ) ( 0000 4000 0000 ) ( 0000 0000 4000 ) -101.00 08000000 00000000 */ +/* + +Note this sequence: +Zeus cmd 17 : 1757500A +Zeus cmd 17 : 175600FF +Zeus cmd 17 : 176F0032 +Zeus cmd 17 : 176E0031 +Zeus cmd 17 : 176D003B +Zeus cmd 17 : 176C002F +Appears to do the same thing as: +Zeus cmd 18 : 18D60000 500A00FF +Zeus cmd 18 : 18EE0000 00320031 +Zeus cmd 18 : 18EC0000 003B002F + + + +Also this sequence: +Zeus cmd 17 : 176940C4 +Zeus cmd 17 : 17681370 + +Seems to have the same purpose as this part of the command stream: + 19E80000 40C41370 + + + +Invasion startup: + +00CC86:zeus16_w(81) = 0000 [00000000] +00CC86:zeus16_w(80) = 0000 [00000000] +00CC86:zeus16_w(4B) = 018F [018F0000] +00CC86:zeus16_w(4A) = 01FE [018F01FE] +00CC86:zeus16_w(49) = 018F [018F0000] +00CC86:zeus16_w(48) = 01FE [018F01FE] +00CC86:zeus16_w(CE) = 7620 [00007620] +00CC86:zeus16_w(CD) = 0000 [00000000] +00CC86:zeus16_w(CC) = 0000 [00000000] +00CC86:zeus16_w(CB) = 0116 [01160000] +00CC86:zeus16_w(CA) = 0107 [01160107] +00CC86:zeus16_w(C9) = 0103 [01030000] +00CC86:zeus16_w(C8) = 00FF [010300FF] +00CC86:zeus16_w(C7) = 0211 [02110000] +00CC86:zeus16_w(C6) = 007F [0211007F] +00CC86:zeus16_w(C5) = 000C [000C0000] +00CC86:zeus16_w(C4) = 004C [000C004C] +00CC86:zeus16_w(C3) = 001F [001F0000] +00CC86:zeus16_w(C2) = E591 [001FE591] +00CC86:zeus16_w(C1) = 801F [801F0000] +00CC86:zeus16_w(C0) = 2500 [801F2500] +00CC86:zeus16_w(86) = 8003 [00008003] +00CC86:zeus16_w(80) = 0C05 [00000C05] +00CC86:zeus16_w(8F) = 0206 [02060000] +00CC86:zeus16_w(8E) = 0000 [02060000] +00CC86:zeus16_w(8D) = 0226 [02260000] +00CC86:zeus16_w(8C) = 0000 [02260000] +00CC86:zeus16_w(8B) = 0000 [00000000] +00CC86:zeus16_w(8A) = FAFA [0000FAFA] +00CC86:zeus16_w(89) = 0000 [00000000] +00CC86:zeus16_w(88) = FAFA [0000FAFA] +00CC86:zeus16_w(80) = 0001 [00000001] +00CC86:zeus16_w(8F) = 0207 [02070000] +00CC86:zeus16_w(8E) = BFFF [0207BFFF] +00CC86:zeus16_w(8F) = 0206 [0206BFFF] +00CC86:zeus16_w(8E) = 0000 [02060000] +00CC86:zeus16_w(8D) = 0227 [02270000] +00CC86:zeus16_w(8C) = BFFF [0227BFFF] +00CC86:zeus16_w(8D) = 0226 [0226BFFF] +00CC86:zeus16_w(8C) = 0000 [02260000] +00CC86:zeus16_w(8F) = 0207 [02070000] +00CC86:zeus16_w(8E) = F020 [0207F020] +00CC86:zeus16_w(8F) = 0206 [0206F020] +00CC86:zeus16_w(8E) = 0000 [02060000] +00CC86:zeus16_w(8D) = 0227 [02270000] +00CC86:zeus16_w(8C) = F020 [0227F020] +00CC86:zeus16_w(8D) = 0226 [0226F020] +00CC86:zeus16_w(8C) = 0000 [02260000] +00CC86:zeus16_w(8F) = 0207 [02070000] +00CC86:zeus16_w(8E) = DFFF [0207DFFF] +00CC86:zeus16_w(8F) = 0206 [0206DFFF] +00CC86:zeus16_w(8E) = 0000 [02060000] +00CC86:zeus16_w(8D) = 0227 [02270000] +00CC86:zeus16_w(8C) = DFFF [0227DFFF] +00CC86:zeus16_w(8D) = 0226 [0226DFFF] +00CC86:zeus16_w(8C) = 0000 [02260000] +00CC86:zeus16_w(8F) = 0207 [02070000] +00CC86:zeus16_w(8E) = DFFF [0207DFFF] +00CC86:zeus16_w(8F) = 0206 [0206DFFF] +00CC86:zeus16_w(8E) = 0000 [02060000] +00CC86:zeus16_w(8D) = 0227 [02270000] +00CC86:zeus16_w(8C) = DFFF [0227DFFF] +00CC86:zeus16_w(8D) = 0226 [0226DFFF] +00CC86:zeus16_w(8C) = 0000 [02260000] +00CC86:zeus16_w(8F) = 0206 [02060000] +00CC86:zeus16_w(8E) = 0000 [02060000] +00CC86:zeus16_w(8D) = 0226 [02260000] +00CC86:zeus16_w(8C) = 0000 [02260000] +00CC86:zeus16_w(8B) = 0000 [0000FAFA] +00CC86:zeus16_w(8A) = D254 [0000D254] +00CC86:zeus16_w(89) = 8FFF [8FFFFAFA] +00CC86:zeus16_w(88) = D794 [8FFFD794] +00CC86:zeus16_w(85) = 0000 [00000000] +00CC86:zeus16_w(84) = 0000 [00000000] +00CC86:zeus16_w(83) = 1F1F [1F1F0000] +00CC86:zeus16_w(82) = 2011 [1F1F2011] +00CC86:zeus16_w(69) = 0003 [00030000] +00CC86:zeus16_w(69) = 0000 [00000000] +00CC86:zeus16_w(68) = 0100 [00000100] +00CC92:zeus16_w(200) = 0100 [00000100] +00CC92:zeus16_w(201) = 0000 [00000100] +00CC92:zeus16_w(202) = 0000 [00000000] +00CC92:zeus16_w(203) = 0000 [00000000] +00CC92:zeus16_w(204) = 00D4 [000000D4] +00CC92:zeus16_w(205) = 0000 [000000D4] +00CC92:zeus16_w(206) = 0000 [00000000] +00CC92:zeus16_w(207) = A000 [A0000000] +00CC92:zeus16_w(208) = 0050 [00000050] +00CC92:zeus16_w(209) = 0000 [00000050] +00CC92:zeus16_w(20A) = 0000 [00000000] +00CC92:zeus16_w(20B) = A000 [A0000000] +00CC92:zeus16_w(20C) = 0703 [00000703] +00CC92:zeus16_w(20D) = 0000 [00000703] +00CC92:zeus16_w(20E) = 0000 [00000000] +00CC92:zeus16_w(20F) = 0000 [00000000] +00CC92:zeus16_w(210) = 0050 [00000050] +00CC92:zeus16_w(211) = 0000 [00000050] +00CC92:zeus16_w(212) = 0000 [00000000] +00CC92:zeus16_w(213) = A000 [A0000000] +00CC92:zeus16_w(214) = 005A [0000005A] +00CC92:zeus16_w(215) = 01C0 [01C0005A] +00CC92:zeus16_w(216) = 0000 [00000000] +00CC92:zeus16_w(217) = B000 [B0000000] +00CC92:zeus16_w(218) = 00D8 [000000D8] +00CC92:zeus16_w(219) = 0000 [000000D8] +00CC92:zeus16_w(21A) = 0000 [00000000] +00CC92:zeus16_w(21B) = 9000 [90000000] +00CC92:zeus16_w(21C) = 0607 [00000607] +00CC92:zeus16_w(21D) = 0000 [00000607] +00CC92:zeus16_w(21E) = 0000 [00000000] +00CC92:zeus16_w(21F) = 0000 [00000000] +00CC92:zeus16_w(220) = C000 [0000C000] +00CC92:zeus16_w(221) = 0008 [0008C000] +00CC92:zeus16_w(222) = 0000 [00000000] +00CC92:zeus16_w(223) = 003F [003F0000] +00CC92:zeus16_w(224) = 006A [0000006A] +00CC92:zeus16_w(225) = 01D0 [01D0006A] +00CC92:zeus16_w(226) = 0025 [00000025] +00CC92:zeus16_w(227) = B000 [B0000025] +00CC92:zeus16_w(228) = 0F00 [00000F00] +00CC92:zeus16_w(229) = 0000 [00000F00] +00CC92:zeus16_w(22A) = 0001 [00000001] +00CC92:zeus16_w(22B) = 0000 [00000001] +00CC92:zeus16_w(22C) = 0E08 [00000E08] +00CC92:zeus16_w(22D) = 0000 [00000E08] +00CC92:zeus16_w(22E) = 0000 [00000000] +00CC92:zeus16_w(22F) = 0000 [00000000] +00CC92:zeus16_w(230) = 00D4 [000000D4] +00CC92:zeus16_w(231) = 0000 [000000D4] +00CC92:zeus16_w(232) = 0000 [00000000] +00CC92:zeus16_w(233) = A000 [A0000000] +00CC92:zeus16_w(234) = 0050 [00000050] +00CC92:zeus16_w(235) = 0000 [00000050] +00CC92:zeus16_w(236) = 0000 [00000000] +00CC92:zeus16_w(237) = A000 [A0000000] +00CC92:zeus16_w(238) = 070E [0000070E] +00CC92:zeus16_w(239) = 0000 [0000070E] +00CC92:zeus16_w(23A) = 0000 [00000000] +00CC92:zeus16_w(23B) = 0000 [00000000] +00CC92:zeus16_w(23C) = 0050 [00000050] +00CC92:zeus16_w(23D) = 0000 [00000050] +00CC92:zeus16_w(23E) = 0000 [00000000] +00CC92:zeus16_w(23F) = A000 [A0000000] +00CC92:zeus16_w(240) = 005A [0000005A] +00CC92:zeus16_w(241) = 01C0 [01C0005A] +00CC92:zeus16_w(242) = 0000 [00000000] +00CC92:zeus16_w(243) = B000 [B0000000] +00CC92:zeus16_w(244) = 00D8 [000000D8] +00CC92:zeus16_w(245) = 0000 [000000D8] +00CC92:zeus16_w(246) = 0000 [00000000] +00CC92:zeus16_w(247) = 8CC0 [8CC00000] +00CC92:zeus16_w(248) = 0612 [00000612] +00CC92:zeus16_w(249) = 0000 [00000612] +00CC92:zeus16_w(24A) = 0000 [00000000] +00CC92:zeus16_w(24B) = 0000 [00000000] +00CC92:zeus16_w(24C) = D000 [0000D000] +00CC92:zeus16_w(24D) = 0008 [0008D000] +00CC92:zeus16_w(24E) = 8000 [00008000] +00CC92:zeus16_w(24F) = 003E [003E8000] +00CC92:zeus16_w(250) = 006A [0000006A] +00CC92:zeus16_w(251) = 01D0 [01D0006A] +00CC92:zeus16_w(252) = 0025 [00000025] +00CC92:zeus16_w(253) = B000 [B0000025] +00CC92:zeus16_w(254) = 0F00 [00000F00] +00CC92:zeus16_w(255) = 0000 [00000F00] +00CC92:zeus16_w(256) = 0001 [00000001] +00CC92:zeus16_w(257) = 0000 [00000001] +00CC92:zeus16_w(258) = 0E13 [00000E13] +00CC92:zeus16_w(259) = 0000 [00000E13] +00CC92:zeus16_w(25A) = 0000 [00000000] +00CC92:zeus16_w(25B) = 0000 [00000000] +00CC92:zeus16_w(25C) = 0F00 [00000F00] +00CC92:zeus16_w(25D) = 05C0 [05C00F00] +00CC92:zeus16_w(25E) = 0000 [00000000] +00CC92:zeus16_w(25F) = B000 [B0000000] +00CC92:zeus16_w(260) = 0F80 [00000F80] +00CC92:zeus16_w(261) = 0400 [04000F80] +00CC92:zeus16_w(262) = 0000 [00000000] +00CC92:zeus16_w(263) = 9000 [90000000] +00CC92:zeus16_w(264) = 0F80 [00000F80] +00CC92:zeus16_w(265) = 0400 [04000F80] +00CC92:zeus16_w(266) = 0000 [00000000] +00CC92:zeus16_w(267) = 8CC0 [8CC00000] +00CC92:zeus16_w(268) = 011A [0000011A] +00CC92:zeus16_w(269) = 0000 [0000011A] +00CC92:zeus16_w(26A) = 0000 [00000000] +00CC92:zeus16_w(26B) = 0000 [00000000] +00CC92:zeus16_w(26C) = 0F00 [00000F00] +00CC92:zeus16_w(26D) = 0000 [00000F00] +00CC92:zeus16_w(26E) = 0000 [00000000] +00CC92:zeus16_w(26F) = 0000 [00000000] +00CC92:zeus16_w(270) = A001 [0000A001] +00CC92:zeus16_w(271) = 0003 [0003A001] +00CC92:zeus16_w(272) = 0025 [00000025] +00CC92:zeus16_w(273) = 0000 [00000025] +00CC92:zeus16_w(274) = 0000 [00000000] +00CC92:zeus16_w(275) = 40F3 [40F30000] +00CC92:zeus16_w(276) = 0000 [00000000] +00CC92:zeus16_w(277) = 0000 [00000000] +00CC92:zeus16_w(278) = 4000 [00004000] +00CC92:zeus16_w(279) = 0803 [08034000] +00CC92:zeus16_w(27A) = 2000 [00002000] +00CC92:zeus16_w(27B) = 0013 [00132000] +00CC92:zeus16_w(27C) = 8000 [00008000] +00CC92:zeus16_w(27D) = 0003 [00038000] +00CC92:zeus16_w(27E) = 1000 [00001000] +00CC92:zeus16_w(27F) = 003E [003E1000] +00CC92:zeus16_w(280) = 20F0 [000020F0] +00CC92:zeus16_w(281) = 0001 [000120F0] +00CC92:zeus16_w(282) = 0000 [00000000] +00CC92:zeus16_w(283) = 93C0 [93C00000] +00CC92:zeus16_w(284) = 60F2 [000060F2] +00CC92:zeus16_w(285) = 0001 [000160F2] +00CC92:zeus16_w(286) = 0000 [00000000] +00CC92:zeus16_w(287) = 9380 [93800000] +00CC92:zeus16_w(288) = FFF4 [0000FFF4] +00CC92:zeus16_w(289) = 0001 [0001FFF4] +00CC92:zeus16_w(28A) = 0000 [00000000] +00CC92:zeus16_w(28B) = 90C0 [90C00000] +00CC92:zeus16_w(28C) = 0000 [00000000] +00CC92:zeus16_w(28D) = 0000 [00000000] +00CC92:zeus16_w(28E) = 0000 [00000000] +00CC92:zeus16_w(28F) = 0000 [00000000] +00CC92:zeus16_w(290) = 0000 [00000000] +00CC92:zeus16_w(291) = 0000 [00000000] +00CC92:zeus16_w(292) = 0000 [00000000] +00CC92:zeus16_w(293) = 0000 [00000000] +00CC92:zeus16_w(294) = 0000 [00000000] +00CC92:zeus16_w(295) = 0000 [00000000] +00CC92:zeus16_w(296) = 0000 [00000000] +00CC92:zeus16_w(297) = 0000 [00000000] +00CC92:zeus16_w(298) = 0000 [00000000] +00CC92:zeus16_w(299) = 0000 [00000000] +00CC92:zeus16_w(29A) = 0000 [00000000] +00CC92:zeus16_w(29B) = 0000 [00000000] +00CC92:zeus16_w(29C) = 0000 [00000000] +00CC92:zeus16_w(29D) = 0000 [00000000] +00CC92:zeus16_w(29E) = 0000 [00000000] +00CC92:zeus16_w(29F) = 0000 [00000000] +00CC92:zeus16_w(2A0) = 0000 [00000000] +00CC92:zeus16_w(2A1) = 0000 [00000000] +00CC92:zeus16_w(2A2) = 0000 [00000000] +00CC92:zeus16_w(2A3) = 0000 [00000000] +00CC92:zeus16_w(2A4) = 0000 [00000000] +00CC92:zeus16_w(2A5) = 0000 [00000000] +00CC92:zeus16_w(2A6) = 0000 [00000000] +00CC92:zeus16_w(2A7) = 0000 [00000000] +00CC92:zeus16_w(2A8) = 0000 [00000000] +00CC92:zeus16_w(2A9) = 0000 [00000000] +00CC92:zeus16_w(2AA) = 0000 [00000000] +00CC92:zeus16_w(2AB) = 0000 [00000000] +00CC92:zeus16_w(2AC) = 0000 [00000000] +00CC92:zeus16_w(2AD) = 0000 [00000000] +00CC92:zeus16_w(2AE) = 0000 [00000000] +00CC92:zeus16_w(2AF) = 0000 [00000000] +00CC92:zeus16_w(2B0) = 0000 [00000000] +00CC92:zeus16_w(2B1) = 0000 [00000000] +00CC92:zeus16_w(2B2) = 0000 [00000000] +00CC92:zeus16_w(2B3) = 0000 [00000000] +00CC92:zeus16_w(2B4) = 7F00 [00007F00] +00CC92:zeus16_w(2B5) = 0001 [00017F00] +00CC92:zeus16_w(2B6) = 0000 [00000000] +00CC92:zeus16_w(2B7) = 03C0 [03C00000] +00CC92:zeus16_w(2B8) = C000 [0000C000] +00CC92:zeus16_w(2B9) = 0003 [0003C000] +00CC92:zeus16_w(2BA) = 0000 [00000000] +00CC92:zeus16_w(2BB) = 0000 [00000000] +00CC92:zeus16_w(2BC) = EF00 [0000EF00] +00CC92:zeus16_w(2BD) = 0001 [0001EF00] +00CC92:zeus16_w(2BE) = 0000 [00000000] +00CC92:zeus16_w(2BF) = 03C0 [03C00000] +00CC92:zeus16_w(2C0) = 0007 [00000007] +00CC86:zeus16_w(68) = 0008 [00000008] +00CC86:zeus16_w(80) = 0C01 [00000C01] +00CC86:zeus16_w(80) = 0C1D [00000C1D] +00CC86:zeus16_w(69) = 0003 [00030008] +00CC86:zeus16_w(69) = 0000 [00000008] +00CC86:zeus16_w(80) = 0C01 [00000C01] +00CC86:zeus16_w(80) = FC1D [0000FC1D] +00CC86:zeus16_w(81) = 0022 [0022FC1D] +Zeus cmd 1A : 1A000000 +00CFDC:zeus32_w(86) = 00008020 +00CFE0:zeus32_w(8E) = 0207F440 +00CFE1:zeus32_w(100) = 00000000 +00CFE5:zeus32_w(86) = 00008000 +00CFE7:zeus32_w(8E) = 02060000 +00D0FC:zeus32_w(CE) = 00C97020 +00D09A:zeus32_w(80) = 0022FC3F +00D104:zeus32_w(CE) = 00C87020 +00D034:zeus32_w(84) = 00000100 +00D0C9:zeus32_w(68) = 00000100 +00D0CA:zeus32_w(00) = 0000C3F0 +00D0CC:zeus32_w(5C) = 00000000 +00D0CE:zeus32_w(06) = FFFF0030 +00D0D0:zeus32_w(02) = 000C0000 +00D0D2:zeus32_w(04) = 00000E01 +00D0D4:zeus32_w(4C) = 00808080 +00D0D5:zeus32_w(4E) = 00808080 +00D0D6:zeus32_w(08) = 00000000 +00D0D7:zeus32_w(0C) = 00FF018F +00D0DD:zeus32_w(0A) = 0000018F +00D0E3:zeus32_w(0E) = 00FF0000 +00D0E5:zeus32_w(1E) = FFFFFFFF +00D0E6:zeus32_w(1C) = FFFFFFFF +00D0E7:zeus32_w(1A) = FFFFFFFF +00D0E8:zeus32_w(18) = FFFFFFFF +00D0EA:zeus32_w(46) = 00000000 +00D0EB:zeus32_w(44) = 00000000 +00D0EC:zeus32_w(42) = 00000000 +00D0ED:zeus32_w(40) = 00000000 +00D0EE:zeus32_w(26) = 00000000 +00D0EF:zeus32_w(24) = 00000000 +00D0F0:zeus32_w(22) = 00000000 +00D0F1:zeus32_w(20) = 00000000 +00D09A:zeus32_w(80) = 0022FCFF +00D0F6:zeus32_w(60) = 00000001 +00D09A:zeus32_w(80) = 0022FC3F +00D01E:zeus32_w(76) = F8800000 +00D020:zeus32_w(CC) = 00000000 +00D034:zeus32_w(84) = 00000080 +00D0FC:zeus32_w(CE) = 00C97020 +00D09A:zeus32_w(80) = 0022FC3F +00D104:zeus32_w(CE) = 00C87020 +Zeus cmd 1A : 1A000000 +Zeus cmd 18 : 187E0000 0000FFFF +Zeus cmd 18 : 187C0000 FFFFFFE0 +Zeus cmd 18 : 187A0000 00800000 +Zeus cmd 18 : 18780000 000000C7 +Zeus cmd 18 : 18760000 F8800000 +Zeus cmd 17 : 176F0032 +Zeus cmd 17 : 176E0031 +Zeus cmd 17 : 176D003B +Zeus cmd 17 : 176C002B +Zeus cmd 18 : 184E0000 00808080 +Zeus cmd 18 : 184C0000 00808080 +Zeus cmd 18 : 184A0000 00FF018E +Zeus cmd 18 : 18480000 00FF018E +Zeus cmd 17 : 176940C4 +Zeus cmd 17 : 17681370 +Zeus cmd 17 : 1707FFFF +Zeus cmd 17 : 17060030 +Zeus cmd 17 : 17010000 +Zeus cmd 2D : 2D007FFF +Zeus cmd 2E : 2E000800 00000000 +Zeus cmd 17 : 1757500A +Zeus cmd 17 : 175600FF +Zeus cmd 17 : 17524321 +Zeus cmd 17 : 1752BCDE +Zeus cmd 01 : 0100C0B0 3F001059 +00D09A:zeus32_w(80) = 0222FC3F +.... +Zeus cmd 1A : 1A000000 +Zeus cmd 1A : 1A000000 +.... +Zeus cmd 1A : 1A000000 +Zeus cmd 1A : 1A000000 +.... +Zeus cmd 01 : 0100C0B0 3F001059 +00D09A:zeus32_w(80) = 0222FC3F +.... +Zeus cmd 1A : 1A000000 +Zeus cmd 1A : 1A000000 +.... +00D09A:zeus32_w(80) = FB22FC3F +00D01E:zeus32_w(76) = F8800000 +00D020:zeus32_w(CC) = 00800000 +00D034:zeus32_w(84) = 00000000 +00D0C9:zeus32_w(68) = 00000100 +00D0CA:zeus32_w(00) = 00000000 +00D0CC:zeus32_w(5C) = 00000000 +00D0CE:zeus32_w(06) = FFFF0030 +00D0D0:zeus32_w(02) = 000C0000 +00D0D2:zeus32_w(04) = 00000E01 +00D0D4:zeus32_w(4C) = 00808080 +00D0D5:zeus32_w(4E) = 00808080 +00D0D6:zeus32_w(08) = 00000000 +00D0D7:zeus32_w(0C) = 00FF018F +00D0DD:zeus32_w(0A) = 0000018F +00D0E3:zeus32_w(0E) = 00FF0000 +00D0E5:zeus32_w(1E) = FFFFFFFF +00D0E6:zeus32_w(1C) = FFFFFFFF +00D0E7:zeus32_w(1A) = FFFFFFFF +00D0E8:zeus32_w(18) = FFFFFFFF +00D0EA:zeus32_w(46) = 00000000 +00D0EB:zeus32_w(44) = 00000000 +00D0EC:zeus32_w(42) = 00000000 +00D0ED:zeus32_w(40) = 00000000 +00D0EE:zeus32_w(26) = 00000000 +00D0EF:zeus32_w(24) = 00000000 +00D0F0:zeus32_w(22) = 00000000 +00D0F1:zeus32_w(20) = 00000000 +00D09A:zeus32_w(80) = FB22FCFF +00D0F6:zeus32_w(60) = 00000001 +00D09A:zeus32_w(80) = FB22FC3F +Zeus cmd 17 : 1757500A +Zeus cmd 17 : 175600FF +00D09A:zeus32_w(80) = 0222FC3F + + +*/ static void render_poly_4bit(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid) { const poly_extra_data *extra = extradata; @@ -618,6 +946,9 @@ static void render_poly_4bit(void *dest, INT32 scanline, const poly_extent *exte int texwidth = extra->texwidth; int x; +if (extra->alpha < 0x80) + return; + for (x = extent->startx; x < extent->stopx; x++) { float z = recip_approx(ooz); @@ -655,6 +986,9 @@ static void render_poly_8bit(void *dest, INT32 scanline, const poly_extent *exte int texwidth = extra->texwidth; int x; +if (extra->alpha < 0x80) + return; + for (x = extent->startx; x < extent->stopx; x++) { float z = recip_approx(ooz); @@ -677,7 +1011,7 @@ static void render_poly_8bit(void *dest, INT32 scanline, const poly_extent *exte } -static void zeus_draw_polys(UINT32 addr_and_count, UINT32 texdata, int logcmd) +static void zeus_draw_model(UINT32 addr_and_count, UINT32 texdata, int logcmd) { static UINT32 *loglist[1000]; static int loglist_last = 0; @@ -694,24 +1028,15 @@ static void zeus_draw_polys(UINT32 addr_and_count, UINT32 texdata, int logcmd) if (logcmd) { int texwshift = (val2 >> 6) & 7; - logerror("Zeus cmd 67 : %08X %08X %03X %06X (w=%d adj=%03X%03X)\n", - zeuscmd_buffer[0], addr_and_count, val2, val1, + logerror(" -- model @ %08X val2=%03X val1=%06X (w=%d bpp=%d adj=%03X%03X)\n", + addr_and_count, val2, val1, 512 >> texwshift, + (val2 & 0x20) ? 8 : 4, ((val1 << (7 - texwshift)) >> 10) & 0xfff, ((val1 << (7 - texwshift)) >> 1) & 0x1ff ); } - for (i = 0; i < last_tex_index; i++) - if (last_tex[i][0] == val1 && last_tex[i][1] == val2) - break; - if (i == last_tex_index) - { - last_tex[i][0] = val1; - last_tex[i][1] = val2; - last_tex_index++; - } - if (logcmd) { for (i = 0; i < loglist_last; i++) @@ -790,19 +1115,29 @@ static void zeus_draw_polys(UINT32 addr_and_count, UINT32 texdata, int logcmd) vert[i].y += 128.0f; } - val1 <<= 7 - texwshift; - extra = poly_get_extra_data(poly); extra->transcolor = 0x100; - extra->texbase = &waveram[val1 & 0x3fffff]; + extra->texbase = &waveram[(val1 << (7 - texwshift)) & 0x3fffff]; extra->texwidth = 512 >> texwshift; extra->palbase = zeus_palbase; extra->alpha = zeus_blend; - poly_render_quad(poly, NULL, &Machine->screen[0].visarea, callback, 3, &vert[0], &vert[1], &vert[2], &vert[3]); + if (single_step) + { + single_step_extra = *extra; + single_step_val1 = val1; + single_step_val2 = val2; + single_step_dx = single_step_dy = 0; + single_step_advance = FALSE; + } + + poly_render_quad(poly, NULL, &Machine->screen[0].visarea, callback, 3, &vert[0], &vert[1], &vert[2], &vert[3]); poly_wait(poly, "Normal"); + + if (single_step) + while (!single_step_advance) video_frame_update(TRUE); } - else if (data[datanum] == 0x0c018000) + else if (data[datanum] == 0x0c018000/* mk4 */ || data[datanum] == 0x0c008000/* invasn */) next_addr_and_count = data[datanum + 1]; } if (datanum != count) @@ -816,142 +1151,6 @@ static void zeus_draw_polys(UINT32 addr_and_count, UINT32 texdata, int logcmd) } -static void zeuscmd_execute(void) -{ - static int colorcount; - int logcmd = input_code_pressed(KEYCODE_L); - int wordnum; - - switch (zeuscmd_buffer[0] >> 24) - { - case 0x1c: - if (logcmd) - logerror("Zeus cmd 1C : ( %04X %04X %04X ) ( %04X %04X %04X ) ( %04X %04X %04X ) %8.2f %8.2f %8.5f\n", - zeuscmd_buffer[2] & 0xffff, - zeuscmd_buffer[2] >> 16, - zeuscmd_buffer[0] & 0xffff, - zeuscmd_buffer[3] & 0xffff, - zeuscmd_buffer[3] >> 16, - zeuscmd_buffer[1] >> 16, - zeuscmd_buffer[4] & 0xffff, - zeuscmd_buffer[4] >> 16, - zeuscmd_buffer[1] & 0xffff, - (float)(INT32)zeuscmd_buffer[5] * (1.0f / 65536.0f), - (float)(INT32)zeuscmd_buffer[6] * (1.0f / 65536.0f), - (float)(INT32)zeuscmd_buffer[7] * (1.0f / (65536.0f * 512.0f))); - - zeus_matrix[0][0] = zeuscmd_buffer[2]; - zeus_matrix[0][1] = zeuscmd_buffer[2] >> 16; - zeus_matrix[0][2] = zeuscmd_buffer[0]; - zeus_matrix[1][0] = zeuscmd_buffer[3]; - zeus_matrix[1][1] = zeuscmd_buffer[3] >> 16; - zeus_matrix[1][2] = zeuscmd_buffer[1] >> 16; - zeus_matrix[2][0] = zeuscmd_buffer[4]; - zeus_matrix[2][1] = zeuscmd_buffer[4] >> 16; - zeus_matrix[2][2] = zeuscmd_buffer[1]; - zeus_point[0] = zeuscmd_buffer[5]; - zeus_point[1] = zeuscmd_buffer[6]; - zeus_point[2] = zeuscmd_buffer[7]; - break; - - case 0x13: /* invasn */ - zeus_draw_polys(zeus_objdata, zeus_texdata, logcmd); - break; - - case 0x67: - zeus_draw_polys(zeuscmd_buffer[1], zeuscmd_buffer[2], logcmd); - break; - - case 0x01: /* invasn */ - if (logcmd) - logerror("Zeus cmd %02X : %08X %08X\n", zeuscmd_buffer[0] >> 24, zeuscmd_buffer[0], zeuscmd_buffer[1]); - if (zeuscmd_buffer[0] == 0x01008000) - zeus_objdata = zeuscmd_buffer[1]; - else if (zeuscmd_buffer[0] == 0x0100c0b0) - zeus_texdata = zeuscmd_buffer[1]; - else if (zeuscmd_buffer[0] == 0x0100C040) - zeus_palbase = waveram_ptr_from_addr(zeuscmd_buffer[1]); - break; - - default: - if ((zeuscmd_buffer[0] >> 16) == 0x1752) - { - zeusbase[0xb2] = zeuscmd_buffer[0]; -// zeus_enable_logging = 1; - } - if ((zeuscmd_buffer[0] >> 16) == 0x1770) - zeus_point[0] = zeuscmd_buffer[0] << 16; - if ((zeuscmd_buffer[0] >> 16) == 0x1772) - zeus_point[1] = zeuscmd_buffer[0] << 16; - if ((zeuscmd_buffer[0] >> 16) == 0x1774) - zeus_point[2] = zeuscmd_buffer[0] << 16; - if ((zeuscmd_buffer[0] >> 16) == 0x18ce) - zeus_blend = zeuscmd_buffer[1]; - - if (zeuscmd_buffer[0] == 0x0000c040) - zeus_palbase = waveram_ptr_from_addr(zeuscmd_buffer[1]); - - if (zeuscmd_buffer[0] == 0x0080C0A5) - { - /* not right -- just a hack */ - int x, y; - for (y = 0; y <= 255; y++) - for (x = 0; x <= 399; x++) - waveram_plot_depth(y, x, 0, 0x7fff); - colorcount = 0; - last_tex_index = 0; - } - - if (logcmd) - { - logerror("Zeus cmd %02X : %08X", zeuscmd_buffer[0] >> 24, zeuscmd_buffer[0]); - for (wordnum = 1; wordnum < zeuscmd_buffer_expected_words; wordnum++) - logerror(" %08X", zeuscmd_buffer[wordnum]); - logerror("\n"); - } - break; - } -} - - -static UINT8 zeuscmd_length(UINT32 word) -{ - switch (word >> 24) - { - case 0x00: - case 0x01: - return (word == 0) ? 1 : 2; - - case 0x13: - case 0x17: - case 0x1a: - case 0x2d: /* invasn */ - case 0x70: - return 1; - - case 0x18: - case 0x23: - case 0x2e: /* invasn */ - return 2; - - case 0x67: - return 3; - - case 0x25: - case 0x30: /* invasn */ - return 4; /* ??? */ - - case 0x1c: - return 8; - - default: - printf("Unknown command %02X\n", zeusbase[0xe0] >> 24); - break; - } - return 1; -} - - READ32_HANDLER( zeus_r ) { int logit = (offset < 0xb0 || offset > 0xb7); @@ -1026,34 +1225,211 @@ WRITE32_HANDLER( zeus_w ) { int logit = zeus_enable_logging || ((offset < 0xb0 || offset > 0xb7) && (offset < 0xe0 || offset > 0xe1)); + if (logit) + logerror("%06X:zeus_w", activecpu_get_pc()); + /* 32-bit mode */ if (zeusbase[0x80] & 0x00020000) - { - zeusbase[offset & ~1] = data; - - if (logit) - { - if (offset & 1) - logerror("%06X:zeus32_w(%02X) = %08X -- unexpected in 32-bit mode\n", activecpu_get_pc(), offset, data); - else if (offset != 0xe0) - logerror("%06X:zeus32_w(%02X) = %08X\n", activecpu_get_pc(), offset, data); - else - logerror("%06X:zeus32_w(%02X) = %08X\n", activecpu_get_pc(), offset, data); - } - } + zeus_write_32bit(offset, data, logit); /* 16-bit mode */ else + zeus_write_16bit(offset, data, logit); +} + + +READ32_HANDLER( zeus2_r ) +{ + return zeus_r(offset * 2, 0); +} + + +WRITE32_HANDLER( zeus2_w ) +{ + zeus_w(offset * 2, data, mem_mask); +} + + +static void zeus_write_16bit(offs_t offset, UINT16 data, int logit) +{ + /* write to high part on odd addresses */ + if (offset & 1) + zeusbase[offset & ~1] = (zeusbase[offset & ~1] & 0x0000ffff) | (data << 16); + + /* write to low part on event addresses */ + else + zeusbase[offset & ~1] = (zeusbase[offset & ~1] & 0xffff0000) | (data & 0xffff); + + /* log appropriately */ + if (logit) + logerror("(%02X) = %04X [%08X]\n", offset, data & 0xffff, zeusbase[offset & ~1]); + + /* handle the update */ + if ((offset & 1) == 0) + zeus_process_write(offset); +} + + +static void zeus_write_32bit(offs_t offset, UINT32 data, int logit) +{ + /* always write to low word? */ + zeusbase[offset & ~1] = data; + + /* log appropriately */ + if (logit) { if (offset & 1) - zeusbase[offset & ~1] = (zeusbase[offset & ~1] & 0x0000ffff) | (data << 16); + logerror("(%02X) = %08X -- unexpected in 32-bit mode\n", offset, data); + else if (offset != 0xe0) + logerror("(%02X) = %08X\n", offset, data); else - zeusbase[offset & ~1] = (zeusbase[offset & ~1] & 0xffff0000) | (data & 0xffff); - - if (logit) - logerror("%06X:zeus16_w(%02X) = %04X [%08X]\n", activecpu_get_pc(), offset, data & 0xffff, zeusbase[offset & ~1]); + logerror("(%02X) = %08X\n", offset, data); } + /* handle the update */ + if ((offset & 1) == 0) + zeus_process_write(offset); +} + + +/* + + New analysis: + + Offset + ------ + + $06 W Low 16 bits = texture mode + + $58 W Usually written after $5A; after writing, waits for $F6 bit 4 to be cleared + + $5A W Usually written first, followed by $58 + + $68 W Written at startup: + $00030000 = toggled on then off at startup + + $76 W + + $7C W + + $80 W Master control + + $40000000 = set along with $02000000 when enabling FIFO empty interrupt + $02000000 = enable internal data FIFO empty interrupt + $01000000 = cleared along with $02000000 when disabling FIFO empty interrupt + $00020000 = 16-bit (0) or 32-bit (1) mode + $00000080 = set just before writing direct command to $60 + $00000040 = set just before writing direct command to $60 + $00000008 = cleared just before writing to offsets $200-$3FF + + $82 W + $84 W + + $00000080 = render page? (generally set when $CC is set to $000000 and clear when $CC is set to $800000) + + $86 W + $88 W + $8A W + $8C W + $8E W + + $B0 R/W Data port for direct RAM access + $B2 R/W Data port for direct RAM access + + $B4 W Address for direct RAM access + + $07FF0100 = mask for Y coordinate + $000000FF = mask for X coordinate + + $B6 W Direct RAM access control + + $80000000 = enable writes to wave RAM 0 + $40000000 = enable writes to wave RAM 1 + $02000000 = perform access on write to B0(0) or B2(1) ????? + $00800000 = enable writes from [$B2] to depth buffer + $00400000 = enable writes from [$B0] to depth buffer + $00200000 = enable writes from [$B2] to RAM buffer + $00100000 = enable writes from [$B0] to RAM buffer + $00020000 = auto increment the address + $00010000 = perform a read when the address is written + $00000001 = enable direct RAM access + + Examples: + $80A00000 when writing a single pixel (address written each time) + $80A20001 when writing the right pixel of a pair (autoinc assumed) + $80F60001 when writing the middle pairs of pixels (autoinc assumed) + $80520001 when writing the left pixel of a pair (autoinc assumed) + $82F00001 when testing wave RAM page 1 (address written each pair) + $42F00001 when testing wave RAM page 0 (address written each pair) + $82F60001 when uploading to wave RAM page 1 (autoinc assumed) + $42F60001 when uploading to wave RAM page 0 (autoinc assumed) + + $C0 W Written at startup = $801F2500 + $C2 W Written at startup = $0015E591 + $C4 W Written at startup = $000C0042 (HSYNC start/HSYNC end?) + $C6 W Written at startup = $0211007F (HTOTAL/HBLANK end?) + $C8 W Written at startup = $010300FF (VSYNC start/VBLANK start?) + $CA W Written at startup = $01160107 (VTOTAL/VSYNC end?) + $CC W Written at startup = $00000000 (display start address? switches to $00800000) + $CE W Written at startup = $00C87620 + + $E0 W Internal data FIFO + + $F2 R Looped on until it returns a stable value; must change frequently; PRNG? + + $F4 R Status register + + $00000800 = VBLANK? code waits for it to clear to 0 and then reset to 1 + $00000140 = tested together in tight loop until both are 0 + $00000008 = internal data FIFO full + $00000004 = tested in tight loop along with $00000002 until at least one is set + $00000002 = tested in tight loop after handling FIFO interrupt until set + + $F6 R Status register 2 + + $00000010 = tested in tight loop after writing 5A/59/58 until set to 0 + + $200- W Unknown, but written in a loop with master control bit $00000008 cleared + $3FF Possible fast buffer clear? One set of writes stores $7F7F to all entries. + A second set writes $E00,$25,$E01,$25,...,$E7F,$25. A third set writes + $52,$A0000000,... + +Notes: + + In 16-bit mode, writes to $E0 are done via $E1 first then $E0 + +------------------------------------------------------- + +Old info: + + offset B7 = control.... + + 8000 = page 1 enable + 4000 = page 0 enable + + 0080 = 2nd pixel enable (maybe Z buff?) + 0040 = 1st pixel enable (maybe Z buff?) + 0020 = 2nd pixel enable + 0010 = 1st pixel enable + + + writes 80a2 to write an odd pixel at startup + writes 80f6 to write the middle pixels + writes 8052 to write an odd pixel at the end + + writes 8050 before writing an odd pixel + writes 80a0 before writing an even pixel + + writes 44f1 before reading from page 0 of wave ram + writes 84f1 before reading from page 1 of wave ram + + writes 42f0 before writing to page 0 of wave ram + writes 82f0 before writing to page 1 of wave ram + +*/ + +static void zeus_process_write(offs_t offset) +{ /* handle the writes; only trigger on low accesses */ switch (offset) { @@ -1061,7 +1437,7 @@ WRITE32_HANDLER( zeus_w ) /* invasn writes here to execute a command (?) */ if (zeusbase[0x60] & 1) { - if (zeusbase[0x80] == 0x0022FCFF) + if ((zeusbase[0x80] & 0xffffff) == 0x22FCFF) { int startx, stopx, starty, stopy; int x, y; @@ -1094,6 +1470,9 @@ WRITE32_HANDLER( zeus_w ) for (y = starty; y <= stopy; y++) for (x = startx; x <= stopx; x++) waveram[(1 * WAVERAM_HEIGHT + (y % WAVERAM_HEIGHT)) * WAVERAM_WIDTH + x] = zeusbase[0x00]; + single_step = input_code_pressed(KEYCODE_S); + if (single_step) + popmessage("Single Step"); } else logerror("Execute unknown command\n"); @@ -1131,13 +1510,55 @@ WRITE32_HANDLER( zeus_w ) } break; + case 0x84: + /* MK4: Written in tandem with 0xcc */ + /* MK4: Writes either 0x80 (and 0x000000 to 0xcc) or 0x00 (and 0x800000 to 0xcc) */ + break; + + case 0xcc: + /* see 0x84 above */ + break; + + case 0x70: + zeus_point[0] = zeusbase[0x70] << 16; + break; + + case 0x72: + zeus_point[1] = zeusbase[0x72] << 16; + break; + + case 0x74: + zeus_point[2] = zeusbase[0x74] << 16; + break; + + case 0x4e: + zeus_blend = zeusbase[0x4e]; + break; +// if ((zeuscmd_buffer[0] >> 16) == 0x1770) +// zeus_point[0] = zeuscmd_buffer[0] << 16; +// if ((zeuscmd_buffer[0] >> 16) == 0x1772) +// zeus_point[1] = zeuscmd_buffer[0] << 16; +// if ((zeuscmd_buffer[0] >> 16) == 0x1774) +// zeus_point[2] = zeuscmd_buffer[0] << 16; +// if ((zeuscmd_buffer[0] >> 16) == 0x18ce) +// zeus_blend = zeuscmd_buffer[1]; + + case 0x52: + zeusbase[0xb2] = zeusbase[0x52]; + break; +// if ((zeuscmd_buffer[0] >> 16) == 0x1752) +// { +// zeusbase[0xb2] = zeuscmd_buffer[0]; +// zeus_enable_logging = 1; +// } + case 0xe0: zeuscmd_buffer[zeuscmd_buffer_words++] = zeusbase[0xe0]; if (zeuscmd_buffer_words == 1) zeuscmd_buffer_expected_words = zeuscmd_length(zeusbase[0xe0]); if (zeuscmd_buffer_words == zeuscmd_buffer_expected_words) { - zeuscmd_execute(); + zeuscmd_execute(zeuscmd_buffer_expected_words); zeuscmd_buffer_words = 0; } break; @@ -1145,13 +1566,285 @@ WRITE32_HANDLER( zeus_w ) } -READ32_HANDLER( zeus2_r ) +static void log_waveram(UINT32 length_and_base) { - return zeus_r(offset * 2, 0); + static struct + { + UINT32 lab, checksum; + } recent_entries[100]; + + UINT32 numoctets = (length_and_base >> 24) + 1; + const UINT32 *ptr = waveram_ptr_from_addr(length_and_base); + UINT32 checksum = length_and_base; + int foundit = FALSE; + int i; + + for (i = 0; i < numoctets; i++) + checksum += ptr[i * 2 + 0] + ptr[i * 2 + 1]; + + for (i = 0; i < ARRAY_LENGTH(recent_entries); i++) + if (recent_entries[i].lab == length_and_base && recent_entries[i].checksum == checksum) + { + foundit = TRUE; + break; + } + + if (i == ARRAY_LENGTH(recent_entries)) + i--; + if (i != 0) + { + memmove(&recent_entries[1], &recent_entries[0], i * sizeof(recent_entries[0])); + recent_entries[0].lab = length_and_base; + recent_entries[0].checksum = checksum; + } + if (foundit) + return; + + for (i = 0; i < numoctets; i++) + logerror("\t%02X: %08X %08X\n", i, ptr[i * 2 + 0], ptr[i * 2 + 1]); } -WRITE32_HANDLER( zeus2_w ) +static void zeuscmd_execute(int words) { - zeus_w(offset * 2, data, mem_mask); + static int colorcount; + int logcmd = 1;//input_code_pressed(KEYCODE_L); + int wordnum; + +/* command observations: + + 0x18800000 | (reg << 16), <data>: + + 18F80000 00000C88 -- similar to write to $78 = 00000C78 + 18FA0000 00808000 -- similar to write to $7A = 00800000 + 18C80000 00FF018E -- similar to write to $48 = 00FF0190 + 18CA0000 00FF18E0 -- similar to write to $4A = 00FF1900 + + -- during setup/text screen + 187E0000 0000FFFF FF980000 + 18C80000 01FF01FF 00FF018E + 18CA0000 01FF1FF0 00FF18E0 + 18CC0000 00808080 + 18CE0000 00000080 00FFFFFF + 18D60000 500A00FF + 18EC0000 003B002F + 18EE0000 00320031 + 18F80000 00000C88 + 18FA0000 00808000 + + -- after text screen + 187E0000 0000FFFF FF980000 + 18CE0000 0000007B(ramp down to 0) 00FFFFFF + 18D60000 500A00FF + + 0x17: + + 1707FFFF + 1752159D + 17680070 17681370 + 176940C4 + 1770xxxx - set x coordinate + 1772yyyy - set y coordinate + 1774zzzz - set z coordinate + + 0x00: + + 0004C09C 08001026 + 0002C0E7 0800101C + 0003C0F0 00001025 + 0080C0A5 3F00102F + 0005C0A5 21001125 + 0000C040 0318E132 - set palette base + + command 25: + + 25000000 007F0018 01000400 B0F60008 -- during diagnostics screen + 25000080 007F0018 01000400 B0F60008 -- alternate frames during text screen + + + write to ($60) = 1 after setting up: + + +*/ + + if (logcmd) + { + logerror("Zeus cmd %02X :", zeuscmd_buffer[0] >> 24); + for (wordnum = 0; wordnum < words; wordnum++) + logerror(" %08X", zeuscmd_buffer[wordnum]); + } + + switch (zeuscmd_buffer[0] >> 24) + { + /* 0x00/0x01: set pointer */ + /* in model data, this is 0x0C */ + case 0x00: + case 0x01: + switch (zeuscmd_buffer[0] & 0xffffff) + { + case 0x008000: + /* in model data, case 0x018000 is a goto */ + if (logcmd) + logerror(" -- setptr(objdata)\n"); + zeus_objdata = zeuscmd_buffer[1]; + break; + + case 0x00c0b0: + if (logcmd) + logerror(" -- setptr(texdata)\n"); + zeus_texdata = zeuscmd_buffer[1]; + break; + + case 0x00c040: + if (logcmd) + logerror(" -- setptr(palbase)\n"); + zeus_palbase = waveram_ptr_from_addr(zeuscmd_buffer[1]); + break; + + case 0x80c0a5: + if (logcmd) + logerror(" -- setptr(hack clear screen)\n"); + { + /* not right -- just a hack */ + int x, y; + for (y = 0; y <= 255; y++) + for (x = 0; x <= 399; x++) + waveram_plot_depth(y, x, 0, 0x7fff); + colorcount = 0; + } + break; + + default: + if (logcmd) + logerror(" -- setptr(%06X)\n", zeuscmd_buffer[0] & 0xffffff); + break; + } + + if (logcmd) + log_waveram(zeuscmd_buffer[1]); + break; + + /* 0x13: render model based on previously set information */ + case 0x13: /* invasn */ + zeus_draw_model(zeus_objdata, zeus_texdata, logcmd); + break; + + /* 0x17: write 16-bit value to low registers */ + case 0x17: + if (logcmd) + logerror(" -- reg16"); + zeus_write_16bit((zeuscmd_buffer[0] >> 16) & 0x7f, zeuscmd_buffer[0], logcmd); + break; + + /* 0x18: write 32-bit value to low registers */ + /* in model data, this is 0x19 */ + case 0x18: + if (logcmd) + logerror(" -- reg32"); + zeus_write_32bit((zeuscmd_buffer[0] >> 16) & 0x7f, zeuscmd_buffer[1], logcmd); + break; + + /* 0x1A: sync pipeline(?) */ + case 0x1a: + if (logcmd) + logerror(" -- sync\n"); + break; + + /* 0x1C: write matrix and translation vector */ + case 0x1c: + if (logcmd) + logerror(" -- matrix ( %04X %04X %04X ) ( %04X %04X %04X ) ( %04X %04X %04X ) vector %8.2f %8.2f %8.5f\n", + zeuscmd_buffer[2] & 0xffff, + zeuscmd_buffer[2] >> 16, + zeuscmd_buffer[0] & 0xffff, + zeuscmd_buffer[3] & 0xffff, + zeuscmd_buffer[3] >> 16, + zeuscmd_buffer[1] >> 16, + zeuscmd_buffer[4] & 0xffff, + zeuscmd_buffer[4] >> 16, + zeuscmd_buffer[1] & 0xffff, + (float)(INT32)zeuscmd_buffer[5] * (1.0f / 65536.0f), + (float)(INT32)zeuscmd_buffer[6] * (1.0f / 65536.0f), + (float)(INT32)zeuscmd_buffer[7] * (1.0f / (65536.0f * 512.0f))); + + zeus_matrix[0][0] = zeuscmd_buffer[2]; + zeus_matrix[0][1] = zeuscmd_buffer[2] >> 16; + zeus_matrix[0][2] = zeuscmd_buffer[0]; + zeus_matrix[1][0] = zeuscmd_buffer[3]; + zeus_matrix[1][1] = zeuscmd_buffer[3] >> 16; + zeus_matrix[1][2] = zeuscmd_buffer[1] >> 16; + zeus_matrix[2][0] = zeuscmd_buffer[4]; + zeus_matrix[2][1] = zeuscmd_buffer[4] >> 16; + zeus_matrix[2][2] = zeuscmd_buffer[1]; + zeus_point[0] = zeuscmd_buffer[5]; + zeus_point[1] = zeuscmd_buffer[6]; + zeus_point[2] = zeuscmd_buffer[7]; + break; + + /* 0x23: some additional X,Y,Z coordinates */ + case 0x23: + if (logcmd) + logerror(" -- additional xyz = %d,%d,%d\n", (INT16)zeuscmd_buffer[0], (INT16)(zeuscmd_buffer[1] >> 16), (INT16)zeuscmd_buffer[1]); + break; + + /* 0x25: display control? */ + /* 0x30: same for invasn */ + case 0x25: + case 0x30: + if (logcmd) + logerror(" -- unknown control\n"); + break; + + /* 0x67: render model with inline texture info */ + case 0x67: + zeus_draw_model(zeuscmd_buffer[1], zeuscmd_buffer[2], logcmd); + break; + + default: + if (logcmd) + logerror("\n"); + break; + } +} + + +static UINT8 zeuscmd_length(UINT32 word) +{ + switch (word >> 24) + { + case 0x00: + case 0x01: + return (word == 0) ? 1 : 2; + + case 0x13: + case 0x17: + case 0x1a: + case 0x2d: /* invasn */ + case 0x70: + return 1; + + case 0x18: + case 0x23: + case 0x2e: /* invasn */ + return 2; + + case 0x67: + return 3; + + case 0x25: + case 0x30: /* invasn */ + return 4; /* ??? */ + + case 0x1c: + if ((word & 0xffffff) == 0x7fff) /* invasn */ + return 8+5; + return 8; + + default: + printf("Unknown command %02X\n", zeusbase[0xe0] >> 24); + break; + } + return 1; } + + |