Mercurial > repos > blastem
annotate megawifi.c @ 1513:8f3b6a64b658
Initial work on MegaWiFi support
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 15 Jan 2018 09:04:43 -0800 |
parents | |
children | 4f94e0f90c83 |
rev | line source |
---|---|
1513
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1 #include <stdlib.h> |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2 #include <stdint.h> |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
3 #include <string.h> |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
4 #include "genesis.h" |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
5 |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
6 enum { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
7 TX_IDLE, |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
8 TX_LEN1, |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
9 TX_LEN2, |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
10 TX_PAYLOAD, |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
11 TX_WAIT_ETX |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
12 }; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
13 #define STX 0x7E |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
14 #define ETX 0x7E |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
15 |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
16 #define E(N) N |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
17 enum { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
18 #include "mw_commands.c" |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
19 CMD_ERROR = 255 |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
20 }; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
21 #undef E |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
22 #define E(N) #N |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
23 static const char *cmd_names[] = { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
24 #include "mw_commands.c" |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
25 [255] = "CMD_ERROR" |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
26 }; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
27 |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
28 enum { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
29 STATE_IDLE=1, |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
30 STATE_AP_JOIN, |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
31 STATE_SCAN, |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
32 STATE_READY, |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
33 STATE_TRANSPARENT |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
34 }; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
35 |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
36 #define FLAG_ONLINE |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
37 |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
38 typedef struct { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
39 uint32_t transmit_bytes; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
40 uint32_t expected_bytes; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
41 uint32_t receive_bytes; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
42 uint32_t receive_read; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
43 uint16_t channel_flags; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
44 uint8_t scratchpad; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
45 uint8_t transmit_channel; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
46 uint8_t transmit_state; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
47 uint8_t module_state; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
48 uint8_t flags; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
49 uint8_t transmit_buffer[4096]; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
50 uint8_t receive_buffer[4096]; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
51 } megawifi; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
52 |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
53 static megawifi *get_megawifi(void *context) |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
54 { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
55 m68k_context *m68k = context; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
56 genesis_context *gen = m68k->system; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
57 if (!gen->extra) { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
58 gen->extra = calloc(1, sizeof(megawifi)); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
59 ((megawifi *)gen->extra)->module_state = STATE_IDLE; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
60 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
61 return gen->extra; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
62 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
63 |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
64 static void mw_putc(megawifi *mw, uint8_t v) |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
65 { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
66 if (mw->receive_bytes == sizeof(mw->receive_buffer)) { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
67 return; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
68 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
69 mw->receive_buffer[mw->receive_bytes++] = v; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
70 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
71 |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
72 static void mw_puts(megawifi *mw, char *s) |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
73 { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
74 uint32_t len = strlen(s); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
75 if ((mw->receive_bytes + len) > sizeof(mw->receive_buffer)) { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
76 return; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
77 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
78 memcpy(mw->receive_buffer + mw->receive_bytes, s, len); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
79 mw->receive_bytes += len; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
80 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
81 |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
82 static void process_packet(megawifi *mw) |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
83 { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
84 if (mw->transmit_channel == 0) { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
85 uint32_t command = mw->transmit_buffer[0] << 8 | mw->transmit_buffer[1]; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
86 uint32_t size = mw->transmit_buffer[2] << 8 | mw->transmit_buffer[3]; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
87 if (size > mw->transmit_bytes - 4) { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
88 size = mw->transmit_bytes - 4; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
89 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
90 mw->receive_read = mw->receive_bytes = 0; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
91 switch (command) |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
92 { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
93 case CMD_VERSION: |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
94 //LSD header |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
95 mw_putc(mw, 0x7E); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
96 mw_putc(mw, 0); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
97 mw->receive_bytes += 1; //reserve space for LSB of len |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
98 //cmd |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
99 mw_putc(mw, 0); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
100 mw_putc(mw, CMD_OK); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
101 //length |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
102 mw_putc(mw, 0); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
103 mw->receive_bytes += 1; //reserve space for LSB of len |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
104 mw_putc(mw, 1); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
105 mw_putc(mw, 0); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
106 mw_puts(mw, "blastem"); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
107 mw->receive_buffer[2] = mw->receive_bytes - 3; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
108 mw->receive_buffer[6] = mw->receive_bytes - 7; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
109 mw_putc(mw, 0x7E); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
110 break; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
111 case CMD_ECHO: |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
112 mw->receive_bytes = mw->transmit_bytes; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
113 memcpy(mw->receive_buffer, mw->transmit_buffer, mw->transmit_bytes); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
114 break; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
115 case CMD_AP_JOIN: |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
116 mw->module_state = STATE_READY; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
117 mw_putc(mw, 0x7E); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
118 mw_putc(mw, 0); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
119 mw_putc(mw, 4); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
120 //cmd |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
121 mw_putc(mw, 0); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
122 mw_putc(mw, CMD_OK); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
123 //length |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
124 mw_putc(mw, 0); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
125 mw_putc(mw, 0); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
126 mw_putc(mw, 0x7E); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
127 break; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
128 case CMD_SYS_STAT: |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
129 //LSD header |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
130 mw_putc(mw, 0x7E); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
131 mw_putc(mw, 0); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
132 mw_putc(mw, 8); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
133 //cmd |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
134 mw_putc(mw, 0); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
135 mw_putc(mw, CMD_OK); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
136 //length |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
137 mw_putc(mw, 0); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
138 mw_putc(mw, 4); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
139 mw_putc(mw, mw->module_state); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
140 mw_putc(mw, mw->flags); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
141 mw_putc(mw, mw->channel_flags >> 8); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
142 mw_putc(mw, mw->channel_flags); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
143 mw_putc(mw, 0x7E); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
144 break; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
145 default: |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
146 printf("Unhandled MegaWiFi command %s(%d) with length %X\n", cmd_names[command], command, size); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
147 break; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
148 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
149 } else { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
150 printf("Unhandled receive of MegaWiFi data on channel %d\n", mw->transmit_channel); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
151 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
152 mw->transmit_bytes = mw->expected_bytes = 0; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
153 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
154 |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
155 void *megawifi_write_b(uint32_t address, void *context, uint8_t value) |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
156 { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
157 if (!(address & 1)) { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
158 return context; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
159 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
160 megawifi *mw = get_megawifi(context); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
161 address = address >> 1 & 7; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
162 switch (address) |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
163 { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
164 case 0: |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
165 switch (mw->transmit_state) |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
166 { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
167 case TX_IDLE: |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
168 if (value == STX) { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
169 mw->transmit_state = TX_LEN1; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
170 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
171 break; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
172 case TX_LEN1: |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
173 mw->transmit_channel = value >> 4; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
174 mw->expected_bytes = value << 8 & 0xF00; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
175 mw->transmit_state = TX_LEN2; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
176 break; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
177 case TX_LEN2: |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
178 mw->expected_bytes |= value; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
179 mw->transmit_state = TX_PAYLOAD; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
180 break; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
181 case TX_PAYLOAD: |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
182 mw->transmit_buffer[mw->transmit_bytes++] = value; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
183 if (mw->transmit_bytes == mw->expected_bytes) { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
184 mw->transmit_state = TX_WAIT_ETX; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
185 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
186 break; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
187 case TX_WAIT_ETX: |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
188 if (value == ETX) { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
189 mw->transmit_state = TX_IDLE; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
190 process_packet(mw); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
191 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
192 break; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
193 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
194 break; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
195 case 7: |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
196 mw->scratchpad = value; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
197 break; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
198 default: |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
199 printf("Unhandled write to MegaWiFi UART register %X: %X\n", address, value); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
200 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
201 return context; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
202 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
203 |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
204 void *megawifi_write_w(uint32_t address, void *context, uint16_t value) |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
205 { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
206 return megawifi_write_b(address | 1, context, value); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
207 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
208 |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
209 uint8_t megawifi_read_b(uint32_t address, void *context) |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
210 { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
211 |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
212 if (!(address & 1)) { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
213 return 0xFF; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
214 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
215 megawifi *mw = get_megawifi(context); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
216 address = address >> 1 & 7; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
217 switch (address) |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
218 { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
219 case 0: |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
220 if (mw->receive_read < mw->receive_bytes) { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
221 return mw->receive_buffer[mw->receive_read++]; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
222 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
223 return 0xFF; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
224 case 5: |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
225 //line status |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
226 return 0x60 | (mw->receive_read < mw->receive_bytes); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
227 case 7: |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
228 return mw->scratchpad; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
229 default: |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
230 printf("Unhandled read from MegaWiFi UART register %X\n", address); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
231 return 0xFF; |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
232 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
233 } |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
234 |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
235 uint16_t megawifi_read_w(uint32_t address, void *context) |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
236 { |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
237 return 0xFF00 | megawifi_read_b(address | 1, context); |
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
238 } |