66uint8_t vs23_mem[131072 ];
77struct vs23_int vs23_int;
88
9+ static void wait_bytes (int c) {
10+ delayMicroseconds ((c)*8 /SPI1CLK);
11+ }
12+
913void SpiRamReadBytesFast (uint32_t address, uint8_t *data, uint32_t count) {
1014 // printf("RRBF %08X %p %d\n", address, data, count);
1115 for (int i = 0 ; i < count; ++i)
1216 data[i] = vs23_mem[(address+i) % 131072 ];
17+ wait_bytes (count+4 );
1318}
1419void SpiRamReadBytes (uint32_t address, uint8_t *data, uint32_t count) {
1520 // printf("RRBS %08X %p %d\n", address, data, count);
1621 for (int i = 0 ; i < count; ++i)
1722 data[i] = vs23_mem[(address+i) % 131072 ];
23+ wait_bytes (count+4 );
1824}
1925uint16_t SpiRamReadByte (uint32_t address) {
2026 printf (" RRB %08X\n " , address);
27+ wait_bytes (5 );
2128 return vs23_mem[address % 131072 ];
2229}
2330
2431void SpiRamWriteBytesFast (uint32_t address, uint8_t *data, uint32_t len) {
2532 // printf("RWBF %08X %p %d\n", address, data, len);
2633 for (int i = 0 ; i < len; ++i)
2734 vs23_mem[(address+i) % 131072 ] = data[i];
35+ wait_bytes (len+4 );
2836}
2937void SpiRamWriteWord (uint16_t waddress, uint16_t data) {
3038 // printf("RWW %08X %04X\n", waddress, data);
3139 vs23_mem[(waddress * 2 ) % 131072 ] = data >> 8 ;
3240 vs23_mem[(waddress * 2 + 1 ) % 131072 ] = data;
41+ wait_bytes (6 );
3342}
3443void SpiRamWriteByte (register uint32_t address, uint8_t data) {
3544 // printf("RWB %08X %02X\n", address, data);
3645 vs23_mem[address % 131072 ] = data;
46+ wait_bytes (5 );
3747}
3848void SpiRamWriteBytes (uint32_t address, uint8_t * data, uint32_t len) {
3949 // printf("RWBS %08X %p %d\n", address, data, len);
4050 for (int i = 0 ; i < len; ++i)
4151 vs23_mem[(address+i) % 131072 ] = data[i];
52+ wait_bytes (len+4 );
4253}
4354
4455uint32_t mvsrc, mvtgt;
@@ -51,17 +62,20 @@ void SpiRamWriteBM2Ctrl(uint16_t data1, uint16_t data2, uint16_t data3) {
5162 mvskp = data1;
5263 mvlen = data2;
5364 mvlin = data3;
65+ wait_bytes (5 );
5466}
5567void SpiRamWriteBMCtrl (uint16_t opcode, uint16_t data1, uint16_t data2, uint16_t data3) {
5668 // printf("RWBMC %04X %04X %04X %04X\n", opcode, data1, data2, data3);
5769 mvsrc = (data1 << 1 ) | ((data3 >> 2 ) & 1 );
5870 mvtgt = (data2 << 1 ) | ((data3 >> 1 ) & 1 );
5971 mvdir = data3 & 1 ? -1 : 1 ;
72+ wait_bytes (6 );
6073}
6174void SpiRamWriteBMCtrlFast (uint16_t opcode, uint16_t data1, uint16_t data2) {
6275 printf (" RWBMCF %04X %04X %04X\n " , opcode, data1, data2);
6376 mvsrc = (mvsrc & 1 ) | (data1 << 1 );
6477 mvtgt = (mvtgt & 1 ) | (data2 << 1 );
78+ wait_bytes (5 );
6579}
6680
6781void MoveBlockAddr (uint32_t byteaddress2, uint32_t dest_addr) {
@@ -72,6 +86,7 @@ void MoveBlockAddr(uint32_t byteaddress2, uint32_t dest_addr) {
7286}
7387
7488uint16_t SpiRamReadRegister (register uint16_t opcode) {
89+ wait_bytes (3 );
7590 switch (opcode) {
7691 case CURLINE:
7792 return int (micros () / vs23_int.line_us ) % vs23_int.line_count ;
@@ -83,10 +98,12 @@ uint16_t SpiRamReadRegister(register uint16_t opcode) {
8398
8499uint8_t SpiRamReadRegister8 (uint16_t opcode) {
85100 printf (" RRR8 %04X\n " , opcode);
101+ wait_bytes (2 );
86102 return 0xff ;
87103}
88104
89105void SpiRamWriteRegister (uint16_t opcode, uint16_t data) {
106+ wait_bytes (3 );
90107 switch (opcode) {
91108 case VDCTRL1:
92109 vs23_int.vdctrl1 = data;
@@ -110,14 +127,17 @@ void SpiRamWriteRegister(uint16_t opcode, uint16_t data) {
110127 }
111128}
112129void SpiRamWriteByteRegister (uint16_t opcode, uint16_t data) {
130+ wait_bytes (2 );
113131 printf (" RWBR %04X %04X\n " , opcode, data);
114132}
115133
116134void SpiRamWriteProgram (uint16_t opcode, uint16_t data1, uint16_t data2) {
135+ wait_bytes (5 );
117136 printf (" RWP %04X %04X %04X\n " , opcode, data1, data2);
118137}
119138
120139void SPIClass::write (uint8_t data) {
140+ wait_bytes (1 );
121141 if (data == 0x36 ) {
122142 // printf("mov src %05X tgt %05X dir %d lin %d len %d skp %d\n",
123143 // mvsrc, mvtgt, mvdir, mvlin, mvlen, mvskp);
0 commit comments