1 //cpu_dump, ppu_dump 内で同名の関数を呼んではいけない
\r
2 function cpu_dump(d, pagesize, banksize)
\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
9 cpu_read(d, 0xc000, banksize);
\r
12 function ppu_dump(d, pagesize, banksize)
\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
22 function program_initalize(d, cpu_banksize, ppu_banksize)
\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
34 function cpu_transfer(d, start, end, cpu_banksize)
\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
40 cpu_program(d, 0xc000, cpu_banksize);
\r
43 function ppu_transfer(d, start, end, ppu_banksize)
\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
52 7 data direction 0:FCG3->EEPROM (write), 1:EEPROM->FCG3 (read)
\r
53 6 data, FCG3 -> EEPROM
\r
57 4 data, EEPROM -> FCG3
\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
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
71 function i2c_start(d)
\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
80 function i2c_stop(d)
\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
89 function i2c_ack_wait(d)
\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
99 function send_bit(d, v)
\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
106 function i2c_address_set(d, address, rw)
\r
111 for(local i = 0; i < 7; i++){
\r
112 send_bit(d, a & I2C_SEND_H);
\r
116 }while(i2c_ack_wait(d) != true);
\r
119 function eeprom_address_set(d, address)
\r
121 for(local i = 0; i < 8; i++){
\r
122 local n = I2C_SEND_L;
\r
123 if(address & 0x80){
\r
127 address = address << 1;
\r