OSDN Git Service

a9e9e1944e7968c20ecc3bbf19734490fb8115f0
[unagi/old-svn-converted.git] / client / trunk / anago / lz93d50.ai
1 //cpu_dump, ppu_dump 内で同名の関数を呼んではいけない\r
2 function cpu_dump(d, pagesize, banksize)\r
3 {\r
4         \r
5         for(local i = 0; i < pagesize - 1; i += 1){\r
6                 cpu_write(d, register_offset + 8, i);\r
7                 cpu_read(d, 0x8000, banksize);\r
8         }\r
9         cpu_read(d, 0xc000, banksize);\r
10 }\r
11 \r
12 function ppu_dump(d, pagesize, banksize)\r
13 {\r
14         for(local i = 0; i < pagesize; i += 8){\r
15                 for(local j = 0; j < 8; j += 1){\r
16                         cpu_write(d, register_offset + j, i + j);\r
17                         ppu_read(d, j * banksize, banksize);\r
18                 }\r
19         }\r
20 }\r
21 \r
22 function program_initalize(d, cpu_banksize, ppu_banksize)\r
23 {\r
24         cpu_write(d, 0x8008, 0x00);\r
25         cpu_command(d, 0x0000, 0x8000, cpu_banksize);\r
26         cpu_command(d, 0x02aa, 0xc000, cpu_banksize);\r
27         cpu_command(d, 0x0555, 0xc000, cpu_banksize);\r
28         cpu_write(d, 0x8000, [0x0a, 0x15, 0]);\r
29         ppu_command(d, 0x2aaa, 0, ppu_banksize);\r
30         ppu_command(d, 0x5555, 0x0400, ppu_banksize);\r
31         ppu_command(d, 0, 0x0800, ppu_banksize);\r
32 }\r
33 \r
34 function cpu_transfer(d, start, end, cpu_banksize)\r
35 {\r
36         for(local i = start; i < end - 1; i +=1){\r
37                 cpu_write(d, 0x8008, i);\r
38                 cpu_program(d, 0x8000, cpu_banksize);\r
39         }\r
40         cpu_program(d, 0xc000, cpu_banksize);\r
41 }\r
42 \r
43 function ppu_transfer(d, start, end, ppu_banksize)\r
44 {\r
45         for(local i = start; i < end; i +=4){\r
46                 cpu_write(d, 0x8004, [i, i+1, i+2, i+3]);\r
47                 ppu_program(d, 0x1000, ppu_banksize * 4);\r
48         }\r
49 }\r
50 /*\r
51 $800d\r
52 7 data direction 0:FCG3->EEPROM (write), 1:EEPROM->FCG3 (read)\r
53 6 data, FCG3 -> EEPROM\r
54 5 clock\r
55 \r
56 $6000-$7fff\r
57 4 data, EEPROM -> FCG3\r
58 */\r
59 const I2C_READBIT = 4;\r
60 const I2C_DIRBIT = 7;\r
61 const I2C_WRITEBIT = 6;\r
62 const I2C_CLOCKBIT = 5;\r
63 \r
64 I2C_DIR_READ <- 1 << I2C_DIRBIT;\r
65 I2C_DIR_WRITE <- 0 << I2C_DIRBIT;\r
66 I2C_SEND_H <- 1 << I2C_WRITEBIT;\r
67 I2C_SEND_L <- 0 << I2C_WRITEBIT;\r
68 I2C_CLOCK_H <- 1 << I2C_CLOCKBIT;\r
69 I2C_CLOCK_L <- 0 << I2C_CLOCKBIT;\r
70 \r
71 function i2c_start(d)\r
72 {\r
73         cpu_write(d, 0x800d, I2C_DIR_WRITE | I2C_CLOCK_L | I2C_SEND_L);\r
74         cpu_write(d, 0x800d, I2C_DIR_WRITE | I2C_CLOCK_L | I2C_SEND_H);\r
75         cpu_write(d, 0x800d, I2C_DIR_WRITE | I2C_CLOCK_H | I2C_SEND_H);\r
76         cpu_write(d, 0x800d, I2C_DIR_WRITE | I2C_CLOCK_H | I2C_SEND_L);\r
77         cpu_write(d, 0x800d, I2C_DIR_WRITE | I2C_CLOCK_L | I2C_SEND_L);\r
78 }\r
79 \r
80 function i2c_stop(d)\r
81 {\r
82         cpu_write(d, 0x800d, I2C_DIR_WRITE | I2C_CLOCK_L | I2C_SEND_L);\r
83         cpu_write(d, 0x800d, I2C_DIR_WRITE | I2C_CLOCK_H | I2C_SEND_L);\r
84         cpu_write(d, 0x800d, I2C_DIR_WRITE | I2C_CLOCK_H | I2C_SEND_H);\r
85         cpu_write(d, 0x800d, I2C_DIR_WRITE | I2C_CLOCK_L | I2C_SEND_H);\r
86         cpu_write(d, 0x800d, I2C_DIR_READ | I2C_CLOCK_L | I2C_SEND_H);\r
87 }\r
88 \r
89 function i2c_ack_wait(d)\r
90 {\r
91         cpu_write(d, 0x800d, I2C_DIR_WRITE | I2C_CLOCK_L | I2C_SEND_H);\r
92         cpu_write(d, 0x800d, I2C_DIR_READ | I2C_CLOCK_H | I2C_SEND_L);\r
93         local n = cpu_read_register(d, 0x6000, 0);\r
94         n = n & (1 << I2C_READBIT);\r
95         return n == 0;\r
96 }\r
97 \r
98 \r
99 function send_bit(d, v)\r
100 {\r
101         cpu_write(d, 0x800d, I2C_DIR_WRITE | I2C_CLOCK_L | I2C_SEND_L);\r
102         cpu_write(d, 0x800d, I2C_DIR_WRITE | I2C_CLOCK_L | v);\r
103         cpu_write(d, 0x800d, I2C_DIR_WRITE | I2C_CLOCK_H | v);\r
104 }\r
105 \r
106 function i2c_address_set(d, address, rw)\r
107 {\r
108         do{\r
109                 local a = address;\r
110                 i2c_start(d);\r
111                 for(local i = 0; i < 7; i++){\r
112                         send_bit(d, a & I2C_SEND_H);\r
113                         a = a << 1;\r
114                 }\r
115                 send_bit(d, rw);\r
116         }while(i2c_ack_wait(d) != true);\r
117 }\r
118 \r
119 function eeprom_address_set(d, address)\r
120 {\r
121         for(local i = 0; i < 8; i++){\r
122                 local n = I2C_SEND_L;\r
123                 if(address & 0x80){\r
124                         n = I2C_SEND_H;\r
125                 }\r
126                 send_bit(d, n);\r
127                 address = address << 1;\r
128         }\r
129         i2c_ack_wait(d);\r
130 }\r