OSDN Git Service

namco 108系を追加, bandai の fcg3系名称を lz93d50 に変更
[unagi/old-svn-converted.git] / client / trunk / anago / bandai_lz93d50_x24c01.ag
1 /*
2 BANDAI FCG-3 + X24C01 style cartridge
3
4 SDガンダム外伝 ナイトガンダム物語
5         1990-08-11 B50EEP, LZ93D50+X24C01
6 ドラゴンボールZ 強襲!サイヤ人
7         1990-10-27 DRAGON BALLZ, LZ93D50+X24C01
8 まじかる☆タルるートくん ファンタスティックワールド
9         1991-03-21 DRAGON BALLZ-B, LZ93D50+X24C01
10 まじかる☆タルるートくん2
11         1992-06-19 DRAGON BALLZ-B, LZ93D50+X24C01 ← 24C02 ではない
12 */
13 board <- {
14         mappernum = 16, 
15         cpu_rom = {
16                 size_base = 2 * mega, size_max = 2 * mega,
17                 banksize = 0x4000
18         }, 
19         cpu_ram = {
20                 size_base = 0x0080, size_max = 0x0080,
21                 banksize = 0x0080
22         },
23         ppu_rom = {
24                 size_base = 1 * mega, size_max = 2 * mega,
25                 banksize = 0x0400
26         },
27         ppu_ramfind = false,
28         vram_mirrorfind = false
29 };
30
31 const register_offset = 0x8000;
32 dofile("lz93d50.ai");
33
34 /*
35 =====================
36 X24C01 frame sequence
37 =====================
38 <START>[EEPROM address+RW]<A-ACK>[data]<D-ACK><STOP>
39
40 <> is 1bit, [] is 8bit, A-ACK is address acknowledge, 
41 D-ACK is data acknowledge, R is 1, W is 0
42
43 8bit data send MSB to LSB (bit7 to bit0)
44 Dragon Ball Z1's program send address LSB to MSB (bug).
45
46 slave address does not exist.
47
48 --current address read--
49 <START>[EEPROM address,R]<A-ACK>[EEPROM data]<D-ACK><STOP>
50
51 --sequenctial read--
52 <START>[EEPROM address,R]<A-ACK>|[EEPROM data]<D-ACK>|<STOP>
53                                 |<- loop any times ->|
54
55 --page write---
56 |<START>[EEPROM address,W]<A-ACK>|[EEPROM data]<D-ACK>|<STOP>
57 |<-     loop A-ACK is H        ->|<- loop 1to4times ->|
58 */
59
60 function cpu_ram_access(d, pagesize, banksize)
61 {
62         local I2C_WRITE = I2C_SEND_L;
63         local I2C_READ = I2C_SEND_H;
64
65         if(mode_is_read(d) == true){
66                 //sequential read
67                 i2c_address_set(d, 0, I2C_READ);
68                 for(local i = 0; i < pagesize * banksize; i++){
69                         for(local bit = 0; bit < 8; bit++){
70                                 cpu_write(d, 0x800d, I2C_DIR_WRITE | I2C_CLOCK_L | I2C_SEND_H);
71                                 cpu_write(d, 0x800d, I2C_DIR_READ | I2C_CLOCK_H | I2C_SEND_H);
72                                 cpu_read_bit_msb(d, 0x6000, 4);
73                         }
74                         //send ack
75                         send_bit(d, I2C_SEND_L);
76                 }
77                 i2c_stop(d);
78         }else{
79                 //page write (4byte)
80                 for(local i = 0; i < pagesize * banksize; i+=4){
81                         i2c_address_set(d, i, I2C_WRITE);
82                         for(local j = 0; j < 4; j++){
83                                 for(local bit = 0; bit < 8; bit++){
84                                         local n = I2C_SEND_L;
85                                         if(cpu_fetch_bit_msb(d) != 0){
86                                                 n = I2C_SEND_H;
87                                         }
88                                         send_bit(d, n);
89                                 }
90                                 i2c_ack_wait(d);
91                         }
92                         i2c_stop(d);
93                 }
94         }
95 }