Skip to content

Commit 7c6a23e

Browse files
committed
Can successfully send a reply packet
1 parent 07d7743 commit 7c6a23e

File tree

12 files changed

+205
-103
lines changed

12 files changed

+205
-103
lines changed

include/fuji_commands.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,8 @@ enum FujiCommandID {
131131
FUJICMD_LOAD_RELOCATOR = 0x21, // !
132132
FUJICMD_FORMAT = 0x21, // !
133133
FUJICMD_RENAME = 0x20,
134+
FUJICMD_NAK = 0x15, // ASCII NAK
135+
FUJICMD_ACK = 0x06, // ASCII ACK
134136
FUJICMD_SEND_ERROR = 0x02,
135137
FUJICMD_SEND_RESPONSE = 0x01,
136138
FUJICMD_DEVICE_READY = 0x00,

lib/bus/rs232/FujiBusPacket.cpp

Lines changed: 36 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#include "FujiBusPacket.h"
22

3+
#include "../../include/debug.h"
4+
35
typedef struct {
46
uint8_t device; /* Destination Device */
57
uint8_t command; /* Command */
@@ -15,17 +17,14 @@ typedef struct {
1517
static uint8_t fieldSizeTable[] = {0, 1, 1, 1, 1, 2, 2, 4};
1618
static uint8_t numFieldsTable[] = {0, 1, 2, 3, 4, 1, 2, 1};
1719

18-
FujiBusPacket::FujiBusPacket(const std::string &input)
20+
FujiBusPacket::FujiBusPacket(const std::string &slipEncoded)
1921
{
20-
if (!parse(input))
22+
if (!parse(slipEncoded))
2123
throw std::invalid_argument("Invalid FujiBusPacket data");
2224

2325
return;
2426
}
2527

26-
#include <string>
27-
#include <string_view>
28-
2928
std::string FujiBusPacket::decodeSLIP(const std::string &input)
3029
{
3130
unsigned int idx;
@@ -128,68 +127,73 @@ bool FujiBusPacket::parse(const std::string &input)
128127
if (ck1 != ck2)
129128
return false;
130129

131-
device = static_cast<FujiDeviceID>(hdr->device);
132-
command = static_cast<FujiCommandID>(hdr->command);
130+
_device = static_cast<FujiDeviceID>(hdr->device);
131+
_command = static_cast<FujiCommandID>(hdr->command);
133132

134133
offset = sizeof(*hdr);
135134
fieldCount = numFieldsTable[hdr->fields & FUJI_FIELD_COUNT_MASK];
136135
if (fieldCount)
137136
{
138-
fieldSize = fieldSizeTable[fieldCount];
137+
_fieldSize = fieldSizeTable[fieldCount];
139138
for (idx = 0; idx < fieldCount; idx++)
140139
{
141-
for (val = jdx = 0; jdx < fieldSize; jdx++)
140+
for (val = jdx = 0; jdx < _fieldSize; jdx++)
142141
{
143-
bt = decoded[offset + idx * fieldSize + jdx];
142+
bt = decoded[offset + idx * _fieldSize + jdx];
144143
val |= bt << (8 * jdx);
145144
}
146-
fields.push_back(val);
145+
_params.push_back(val);
147146
}
148147

149-
offset += idx * fieldSize;
148+
offset += idx * _fieldSize;
150149
}
151150

152151
if (offset < decoded.size())
153-
data = decoded.substr(offset);
152+
_data = decoded.substr(offset);
154153

155154
return true;
156155
}
157156

158157
std::string FujiBusPacket::serialize()
159158
{
160-
fujibus_header *hdr;
161-
std::string output;
159+
fujibus_header hdr, *hptr;
162160
unsigned int idx, jdx;
163161
uint32_t val;
164162

165-
output.resize(sizeof(*hdr));
166-
hdr = (fujibus_header *) output.data();
167-
hdr->device = device;
168-
hdr->command = command;
169-
hdr->checksum = 0;
163+
hdr.device = _device;
164+
hdr.command = _command;
165+
hdr.length = sizeof(hdr);
166+
hdr.checksum = 0;
167+
168+
std::string output(sizeof(hdr), '\0');
170169

171-
if (fields.size())
170+
if (_params.size())
172171
{
173-
hdr->fields = fields.size() - 1;
174-
if (fieldSize > 1)
172+
hdr.fields = _params.size() - 1;
173+
if (_fieldSize > 1)
175174
{
176-
hdr->fields |= FUJI_FIELD_16_OR_32_MASK;
177-
if (fieldSize == 4)
178-
hdr->fields |= FUJI_FIELD_32_MASK;
179-
hdr->fields++;
175+
hdr.fields |= FUJI_FIELD_16_OR_32_MASK;
176+
if (_fieldSize == 4)
177+
hdr.fields |= FUJI_FIELD_32_MASK;
178+
hdr.fields++;
180179
}
181180

182-
for (idx = 0; idx < fields.size(); idx++)
181+
for (idx = 0; idx < _params.size(); idx++)
183182
{
184-
for (jdx = 0, val = fields[idx]; jdx < fieldSize; jdx++, val >>= 8)
183+
for (jdx = 0, val = _params[idx]; jdx < _fieldSize; jdx++, val >>= 8)
185184
output.push_back(val & 0xFF);
186185
}
187186
}
188187

189-
if (data)
190-
output += *data;
188+
if (_data)
189+
output += *_data;
191190

192-
hdr->checksum = calcChecksum(output);
191+
hdr.length = output.size();
192+
hptr = (fujibus_header *) output.data();
193+
*hptr = hdr;
194+
hptr->checksum = calcChecksum(output);
195+
Debug_printv("Packet header: dev:%02x cmd:%02x len:%d chk:%02x fld:%02x",
196+
hptr->device, hptr->command, hptr->length, hptr->checksum, hptr->fields);
193197
return encodeSLIP(output);
194198
}
195199

lib/bus/rs232/FujiBusPacket.h

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,30 @@ enum {
1919
class FujiBusPacket
2020
{
2121
private:
22+
FujiDeviceID _device;
23+
FujiCommandID _command;
24+
unsigned int _fieldSize;
25+
std::vector<unsigned int> _params;
26+
std::optional<std::string> _data = std::nullopt;
27+
2228
std::string decodeSLIP(const std::string &input);
2329
std::string encodeSLIP(const std::string &input);
2430
bool parse(const std::string &input);
2531
uint8_t calcChecksum(const std::string &buf);
2632

2733
public:
28-
FujiDeviceID device;
29-
FujiCommandID command;
30-
unsigned int fieldSize;
31-
std::vector<unsigned int> fields;
32-
std::optional<std::string> data = std::nullopt;
34+
FujiBusPacket(const std::string &slipEncoded);
35+
FujiBusPacket(FujiDeviceID dev, FujiCommandID cmd, const std::string &dbuf) :
36+
_device(dev), _command(cmd), _data(dbuf) {}
3337

34-
FujiBusPacket(const std::string &input);
35-
std::string serialize();
3638
static std::unique_ptr<FujiBusPacket> fromSerialized(const std::string &input);
39+
40+
std::string serialize();
41+
42+
FujiDeviceID device() { return _device; }
43+
FujiCommandID command() { return _command; }
44+
unsigned int param(unsigned int index) { return _params[index]; }
45+
std::optional<std::string> data() const { return _data; }
3746
};
3847

3948
#endif /* FUJIBUSPACKET_H */

lib/bus/rs232/rs232.cpp

Lines changed: 88 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,12 @@ uint8_t rs232_checksum(uint8_t *buf, unsigned short len)
5555
}
5656

5757
/*
58-
RS232 WRITE to ATARI from DEVICE
58+
RS232 WRITE to COMPUTER from DEVICE
5959
buf = buffer to send to Atari
6060
len = length of buffer
6161
err = along with data, send ERROR status to Atari rather than COMPLETE
6262
*/
63+
#ifdef OBSOLETE
6364
void virtualDevice::bus_to_computer(uint8_t *buf, uint16_t len, bool err)
6465
{
6566
// Write data frame to computer
@@ -82,6 +83,13 @@ void virtualDevice::bus_to_computer(uint8_t *buf, uint16_t len, bool err)
8283

8384
SYSTEM_BUS.flushOutput();
8485
}
86+
#else /* ! OBSOLETE */
87+
void virtualDevice::bus_to_computer(uint8_t *buf, uint16_t len, bool err)
88+
{
89+
SYSTEM_BUS.sendReplyPacket(_devnum, !err, buf, len);
90+
return;
91+
}
92+
#endif /* OBSOLETE */
8593

8694
/*
8795
RS232 READ from ATARI by DEVICE
@@ -134,10 +142,12 @@ void virtualDevice::rs232_nak()
134142
// RS232 ACK
135143
void virtualDevice::rs232_ack()
136144
{
145+
#ifdef OBSOLETE
137146
SYSTEM_BUS.write('A');
138147
fnSystem.delay_microseconds(DELAY_T5); //?
139148
SYSTEM_BUS.flushOutput();
140149
Debug_println("ACK!");
150+
#endif /* OBSOLETE */
141151
}
142152

143153
// RS232 COMPLETE
@@ -151,18 +161,21 @@ void virtualDevice::rs232_complete()
151161
// RS232 ERROR
152162
void virtualDevice::rs232_error()
153163
{
164+
abort();
154165
fnSystem.delay_microseconds(DELAY_T5);
155166
SYSTEM_BUS.write('E');
156167
Debug_println("ERROR!");
157168
}
158169

170+
#ifdef OBSOLETE
159171
// RS232 HIGH SPEED REQUEST
160172
void virtualDevice::rs232_high_speed()
161173
{
162174
Debug_print("rs232 HRS232 INDEX\n");
163175
uint8_t hsd = SYSTEM_BUS.getHighSpeedIndex();
164176
bus_to_computer((uint8_t *)&hsd, 1, false);
165177
}
178+
#endif /* OBSOLETE */
166179

167180
// Read and process a command frame from RS232
168181
void systemBus::_rs232_process_cmd()
@@ -198,12 +211,11 @@ void systemBus::_rs232_process_cmd()
198211
// Turn on the RS232 indicator LED
199212
fnLedManager.set(eLed::LED_BUS, true);
200213

201-
Debug_printf("\nCF: dev:%02x cmd:%02x fsz:%d fld:%d dlen:%d\n",
202-
tempFrame->device, tempFrame->command,
203-
tempFrame->fieldSize, tempFrame->fields.size(),
204-
tempFrame->data ? tempFrame->data->size() : -1);
214+
Debug_printf("\nCF: dev:%02x cmd:%02x dlen:%d\n",
215+
tempFrame->device(), tempFrame->command(),
216+
tempFrame->data() ? tempFrame->data()->size() : -1);
205217

206-
if (tempFrame->device == FUJI_DEVICEID_DISK && _fujiDev != nullptr
218+
if (tempFrame->device() == FUJI_DEVICEID_DISK && _fujiDev != nullptr
207219
&& _fujiDev->boot_config)
208220
{
209221
_activeDev = &_fujiDev->bootdisk;
@@ -218,7 +230,7 @@ void systemBus::_rs232_process_cmd()
218230
// or go back to WAIT
219231
for (auto devicep : _daisyChain)
220232
{
221-
if (tempFrame->device == devicep->_devnum)
233+
if (tempFrame->device() == devicep->_devnum)
222234
{
223235
_activeDev = devicep;
224236
// handle command
@@ -404,6 +416,7 @@ void systemBus::shutdown()
404416
Debug_printf("All devices shut down.\n");
405417
}
406418

419+
#ifdef OBSOLETE
407420
void systemBus::toggleBaudrate()
408421
{
409422
int baudrate = _rs232Baud == RS232_BAUDRATE ? _rs232BaudHigh : RS232_BAUDRATE;
@@ -415,6 +428,7 @@ void systemBus::toggleBaudrate()
415428
_rs232Baud = baudrate;
416429
_port.setBaudrate(_rs232Baud);
417430
}
431+
#endif /* OBSOLETE */
418432

419433
int systemBus::getBaudrate()
420434
{
@@ -434,6 +448,7 @@ void systemBus::setBaudrate(int baud)
434448
_port.setBaudrate(baud);
435449
}
436450

451+
#ifdef OBSOLETE
437452
// Set HRS232 index. Sets high speed RS232 baud and also returns that value.
438453
int systemBus::setHighSpeedIndex(int hrs232_index)
439454
{
@@ -457,4 +472,70 @@ void systemBus::setUDPHost(const char *hostname, int port)
457472
void systemBus::setUltraHigh(bool _enable, int _ultraHighBaud)
458473
{
459474
}
475+
#endif /* OBSOLETE */
476+
477+
void systemBus::sendReplyPacket(FujiDeviceID source, bool ack, void *data, size_t length)
478+
{
479+
FujiBusPacket packet(source, ack ? FUJICMD_ACK : FUJICMD_NAK,
480+
ack ? std::string(static_cast<const char*>(data), length) : nullptr);
481+
std::string encoded = packet.serialize();
482+
_port.write(encoded.data(), encoded.size());
483+
return;
484+
}
485+
486+
/* Convert direct bus access into bus packets? */
487+
size_t systemBus::read(void *buffer, size_t length)
488+
{
489+
abort();
490+
return _port.read(buffer, length);
491+
}
492+
493+
size_t systemBus::read()
494+
{
495+
abort();
496+
return _port.read();
497+
}
498+
499+
size_t systemBus::write(const void *buffer, size_t length)
500+
{
501+
abort();
502+
return _port.write(buffer, length);
503+
}
504+
505+
size_t systemBus::write(int n)
506+
{
507+
abort();
508+
return _port.write(n);
509+
}
510+
511+
size_t systemBus::available()
512+
{
513+
abort();
514+
return _port.available();
515+
}
516+
517+
void systemBus::flushOutput()
518+
{
519+
abort();
520+
_port.flushOutput();
521+
}
522+
523+
size_t systemBus::print(int n, int base)
524+
{
525+
abort();
526+
return _port.print(n, base);
527+
}
528+
529+
size_t systemBus::print(const char *str)
530+
{
531+
abort();
532+
return _port.print(str);
533+
}
534+
535+
size_t systemBus::print(const std::string &str)
536+
{
537+
abort();
538+
return _port.print(str);
539+
}
540+
460541
#endif /* BUILD_RS232 */

0 commit comments

Comments
 (0)