Skip to content

Commit 0069fc2

Browse files
committed
Updated SP-over-SLIP protocol.
Note: This is an incompatible protocol change. It requires a companion change in fujinet-firmware. FujiNet makes use of command list bytes there weren't used so far. This only works with CBus because CBus alwaways tranports all possible command list bytes no matter what command is given. Now the SP-over-SLIP protocol shows exactly the same behavior CBus protocol.
1 parent 21239bf commit 0069fc2

30 files changed

+121
-206
lines changed

AppleWin-VS2022.vcxproj

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
<ClInclude Include="source\devrelay\commands\Open.h" />
3535
<ClInclude Include="source\devrelay\commands\Read.h" />
3636
<ClInclude Include="source\devrelay\commands\ReadBlock.h" />
37-
<ClInclude Include="source\devrelay\commands\Reset.h" />
3837
<ClInclude Include="source\devrelay\commands\Status.h" />
3938
<ClInclude Include="source\devrelay\commands\Write.h" />
4039
<ClInclude Include="source\devrelay\commands\WriteBlock.h" />
@@ -195,9 +194,6 @@
195194
<ClCompile Include="source\devrelay\commands\ReadBlock.cpp">
196195
<PrecompiledHeader>NotUsing</PrecompiledHeader>
197196
</ClCompile>
198-
<ClCompile Include="source\devrelay\commands\Reset.cpp">
199-
<PrecompiledHeader>NotUsing</PrecompiledHeader>
200-
</ClCompile>
201197
<ClCompile Include="source\devrelay\commands\Status.cpp">
202198
<PrecompiledHeader>NotUsing</PrecompiledHeader>
203199
</ClCompile>

AppleWin-VS2022.vcxproj.filters

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,6 @@
282282
<ClCompile Include="source\devrelay\commands\Open.cpp" />
283283
<ClCompile Include="source\devrelay\commands\Read.cpp" />
284284
<ClCompile Include="source\devrelay\commands\ReadBlock.cpp" />
285-
<ClCompile Include="source\devrelay\commands\Reset.cpp" />
286285
<ClCompile Include="source\devrelay\commands\Status.cpp" />
287286
<ClCompile Include="source\devrelay\commands\Write.cpp" />
288287
<ClCompile Include="source\devrelay\commands\WriteBlock.cpp" />
@@ -647,7 +646,6 @@
647646
<ClInclude Include="source\devrelay\commands\Open.h" />
648647
<ClInclude Include="source\devrelay\commands\Read.h" />
649648
<ClInclude Include="source\devrelay\commands\ReadBlock.h" />
650-
<ClInclude Include="source\devrelay\commands\Reset.h" />
651649
<ClInclude Include="source\devrelay\commands\Status.h" />
652650
<ClInclude Include="source\devrelay\commands\Write.h" />
653651
<ClInclude Include="source\devrelay\commands\WriteBlock.h" />

source/SmartPortOverSlip.cpp

Lines changed: 31 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
4545
#include "devrelay/commands/Open.h"
4646
#include "devrelay/commands/ReadBlock.h"
4747
#include "devrelay/commands/Read.h"
48-
#include "devrelay/commands/Reset.h"
4948
#include "devrelay/commands/Status.h"
5049
#include "devrelay/commands/WriteBlock.h"
5150
#include "devrelay/commands/Write.h"
@@ -70,7 +69,6 @@ SmartPortOverSlip::SmartPortOverSlip(const UINT slot) : Card(CT_SmartPortOverSli
7069
active_instances++;
7170

7271
LogFileOutput("SmartPortOverSlip ctor, slot: %d\n", slot);
73-
// SmartPortOverSlip::Reset(true);
7472
}
7573

7674
SmartPortOverSlip::~SmartPortOverSlip()
@@ -82,15 +80,6 @@ SmartPortOverSlip::~SmartPortOverSlip()
8280
void SmartPortOverSlip::Reset(const bool powerCycle)
8381
{
8482
LogFileOutput("SmartPortOverSlip Bridge Initialization, reset called\n");
85-
if (powerCycle)
86-
{
87-
// send RESET to all devices
88-
const auto connections = GetCommandListener().get_all_connections();
89-
for (const auto &id_and_connection : connections)
90-
{
91-
reset(id_and_connection.first, id_and_connection.second);
92-
}
93-
}
9483
}
9584

9685
void SmartPortOverSlip::handle_smartport_call()
@@ -146,38 +135,35 @@ void SmartPortOverSlip::handle_smartport_call()
146135
break;
147136
case CMD_READ_BLOCK:
148137
// TODO: fix the fact params_loc has changed from +4 to +2
149-
read_block(device_id, connection, sp_payload_loc, params_loc + 2);
138+
read_block(device_id, connection, sp_payload_loc, param_count, params_loc + 2);
150139
break;
151140
case CMD_WRITE_BLOCK:
152141
// TODO: fix the fact params_loc has changed from +4 to +2
153-
write_block(device_id, connection, sp_payload_loc, params_loc + 2);
142+
write_block(device_id, connection, sp_payload_loc, param_count, params_loc + 2);
154143
break;
155144
case CMD_FORMAT:
156-
format(device_id, connection);
145+
format(device_id, connection, param_count);
157146
break;
158147
case CMD_CONTROL:
159148
// TODO: fix the fact params_loc has changed from +4 to +2
160149
control(device_id, connection, sp_payload_loc, param_count, params_loc);
161150
break;
162151
case CMD_INIT:
163-
init(device_id, connection);
152+
init(device_id, connection, param_count);
164153
break;
165154
case CMD_OPEN:
166-
open(device_id, connection);
155+
open(device_id, connection, param_count);
167156
break;
168157
case CMD_CLOSE:
169-
close(device_id, connection);
158+
close(device_id, connection, param_count);
170159
break;
171160
case CMD_READ:
172161
// TODO: fix the fact params_loc has changed from +4 to +2
173-
read(device_id, connection, sp_payload_loc, params_loc + 2);
162+
read(device_id, connection, sp_payload_loc, param_count, params_loc + 2);
174163
break;
175164
case CMD_WRITE:
176165
// TODO: fix the fact params_loc has changed from +4 to +2
177-
write(device_id, connection, sp_payload_loc, params_loc + 2);
178-
break;
179-
case CMD_RESET:
180-
reset(device_id, connection);
166+
write(device_id, connection, sp_payload_loc, param_count, params_loc + 2);
181167
break;
182168
default:
183169
break;
@@ -334,7 +320,7 @@ void SmartPortOverSlip::handle_prodos_read(uint8_t drive_num, std::pair<int, int
334320
auto id_connection = GetCommandListener().find_connection_with_device(device_id);
335321

336322
// Do a ReadRequest, and shove the 512 byte block into the required memory
337-
ReadBlockRequest request(Requestor::next_request_number(), id_connection.first);
323+
ReadBlockRequest request(Requestor::next_request_number(), 3, id_connection.first);
338324
// $46-47 = Block Number
339325
request.set_block_number_from_bytes(mem[0x46], mem[0x47], 0);
340326
auto response = Requestor::send_request(request, id_connection.second.get());
@@ -360,7 +346,7 @@ void SmartPortOverSlip::handle_prodos_write(uint8_t drive_num, std::pair<int, in
360346
auto device_id = drive_num == 1 ? disk_devices.first : disk_devices.second;
361347
auto id_connection = GetCommandListener().find_connection_with_device(device_id);
362348

363-
WriteBlockRequest request(Requestor::next_request_number(), id_connection.first);
349+
WriteBlockRequest request(Requestor::next_request_number(), 3, id_connection.first);
364350
// $46-47 = Block Number
365351
request.set_block_number_from_bytes(mem[0x46], mem[0x47], 0);
366352
// put data into the request we're sending
@@ -418,9 +404,9 @@ void SmartPortOverSlip::device_count(const WORD sp_payload_loc)
418404
set_processor_status(AF_ZERO);
419405
}
420406

421-
void SmartPortOverSlip::read_block(const BYTE unit_number, Connection *connection, const WORD buffer_location, const WORD block_count_address)
407+
void SmartPortOverSlip::read_block(const BYTE unit_number, Connection *connection, const WORD buffer_location, const BYTE params_count, const WORD block_count_address)
422408
{
423-
ReadBlockRequest request(Requestor::next_request_number(), unit_number);
409+
ReadBlockRequest request(Requestor::next_request_number(), params_count, unit_number);
424410
// Assume that (cmd_list_loc + 4 == block_count_address) holds 3 bytes for the block number. If it's in the payload, this is wrong and will have to be fixed.
425411
request.set_block_number_from_ptr(mem, block_count_address);
426412
auto response = Requestor::send_request(request, connection);
@@ -438,9 +424,9 @@ void SmartPortOverSlip::read_block(const BYTE unit_number, Connection *connectio
438424
});
439425
}
440426

441-
void SmartPortOverSlip::write_block(const BYTE unit_number, Connection *connection, const WORD sp_payload_loc, const WORD params_loc)
427+
void SmartPortOverSlip::write_block(const BYTE unit_number, Connection *connection, const WORD sp_payload_loc, const BYTE params_count, const WORD params_loc)
442428
{
443-
WriteBlockRequest request(Requestor::next_request_number(), unit_number);
429+
WriteBlockRequest request(Requestor::next_request_number(), params_count, unit_number);
444430
// Assume that (cmd_list_loc + 4 == params_loc) holds 3 bytes for the block number. The payload contains the data to write
445431
request.set_block_number_from_ptr(mem, params_loc);
446432
request.set_block_data_from_ptr(mem, sp_payload_loc);
@@ -449,9 +435,9 @@ void SmartPortOverSlip::write_block(const BYTE unit_number, Connection *connecti
449435
handle_simple_response<WriteBlockResponse>(std::move(response));
450436
}
451437

452-
void SmartPortOverSlip::read(const BYTE unit_number, Connection *connection, const WORD sp_payload_loc, const WORD params_loc)
438+
void SmartPortOverSlip::read(const BYTE unit_number, Connection *connection, const WORD sp_payload_loc, const BYTE params_count, const WORD params_loc)
453439
{
454-
ReadRequest request(Requestor::next_request_number(), unit_number);
440+
ReadRequest request(Requestor::next_request_number(), params_count, unit_number);
455441
request.set_byte_count_from_ptr(mem, params_loc);
456442
request.set_address_from_ptr(mem, params_loc + 2); // move along by byte_count size. would be better to get its size rather than hard code it here.
457443
auto response = Requestor::send_request(request, connection);
@@ -472,9 +458,9 @@ void SmartPortOverSlip::read(const BYTE unit_number, Connection *connection, con
472458
});
473459
}
474460

475-
void SmartPortOverSlip::write(const BYTE unit_number, Connection *connection, const WORD sp_payload_loc, const WORD params_loc)
461+
void SmartPortOverSlip::write(const BYTE unit_number, Connection *connection, const WORD sp_payload_loc, const BYTE params_count, const WORD params_loc)
476462
{
477-
WriteRequest request(Requestor::next_request_number(), unit_number);
463+
WriteRequest request(Requestor::next_request_number(), params_count, unit_number);
478464
request.set_byte_count_from_ptr(mem, params_loc);
479465
request.set_address_from_ptr(mem, params_loc + 2); // move along by byte_count size. would be better to get its size rather than hard code it here.
480466
const auto byte_count = request.get_byte_count();
@@ -489,7 +475,7 @@ void SmartPortOverSlip::status_sp(const BYTE unit_number, Connection *connection
489475
{
490476
const BYTE status_code = mem[params_loc + 2];
491477
const BYTE network_unit = params_count > 3 ? mem[params_loc + 3] : 0;
492-
auto response = status(unit_number, connection, status_code, network_unit);
478+
auto response = status(unit_number, connection, params_count, status_code, network_unit);
493479
handle_response<StatusResponse>(std::move(response), [sp_payload_loc](const StatusResponse *sr) {
494480
const auto response_size = sr->get_data().size();
495481
memcpy(mem + sp_payload_loc, sr->get_data().data(), response_size);
@@ -506,16 +492,16 @@ void SmartPortOverSlip::status_sp(const BYTE unit_number, Connection *connection
506492
});
507493
}
508494

509-
std::unique_ptr<Response> SmartPortOverSlip::status(const BYTE unit_number, Connection *connection, const BYTE status_code, const BYTE network_unit)
495+
std::unique_ptr<Response> SmartPortOverSlip::status(const BYTE unit_number, Connection *connection, const BYTE params_count, const BYTE status_code, const BYTE network_unit)
510496
{
511497
// see https://www.1000bit.it/support/manuali/apple/technotes/smpt/tn.smpt.2.html
512-
const StatusRequest request(Requestor::next_request_number(), unit_number, status_code, network_unit);
498+
const StatusRequest request(Requestor::next_request_number(), params_count, unit_number, status_code, network_unit);
513499
return Requestor::send_request(request, connection);
514500
}
515501

516502
std::unique_ptr<StatusResponse> SmartPortOverSlip::status_pd(const BYTE unit_number, Connection *connection, const BYTE status_code)
517503
{
518-
auto response = status(unit_number, connection, status_code, 0);
504+
auto response = status(unit_number, connection, status_code, 3, 0);
519505

520506
// Cast the Response to a StatusResponse. We need to release ownership. As ChatGPT explains:
521507
/*
@@ -534,42 +520,35 @@ void SmartPortOverSlip::control(const BYTE unit_number, Connection *connection,
534520
uint8_t *start_ptr = &mem[sp_payload_loc];
535521
std::vector<uint8_t> payload(start_ptr, start_ptr + length);
536522

537-
const ControlRequest request(Requestor::next_request_number(), unit_number, control_code, network_unit, payload);
523+
const ControlRequest request(Requestor::next_request_number(), params_count, unit_number, control_code, network_unit, payload);
538524
auto response = Requestor::send_request(request, connection);
539525
handle_simple_response<ControlResponse>(std::move(response));
540526
}
541527

542-
void SmartPortOverSlip::init(const BYTE unit_number, Connection *connection)
528+
void SmartPortOverSlip::init(const BYTE unit_number, Connection *connection, const BYTE params_count)
543529
{
544-
const InitRequest request(Requestor::next_request_number(), unit_number);
530+
const InitRequest request(Requestor::next_request_number(), params_count, unit_number);
545531
auto response = Requestor::send_request(request, connection);
546532
handle_simple_response<InitResponse>(std::move(response));
547533
}
548534

549-
void SmartPortOverSlip::open(const BYTE unit_number, Connection *connection)
535+
void SmartPortOverSlip::open(const BYTE unit_number, Connection *connection, const BYTE params_count)
550536
{
551-
const OpenRequest request(Requestor::next_request_number(), unit_number);
537+
const OpenRequest request(Requestor::next_request_number(), params_count, unit_number);
552538
auto response = Requestor::send_request(request, connection);
553539
handle_simple_response<OpenResponse>(std::move(response));
554540
}
555541

556-
void SmartPortOverSlip::close(const BYTE unit_number, Connection *connection)
542+
void SmartPortOverSlip::close(const BYTE unit_number, Connection *connection, const BYTE params_count)
557543
{
558-
const CloseRequest request(Requestor::next_request_number(), unit_number);
544+
const CloseRequest request(Requestor::next_request_number(), params_count, unit_number);
559545
auto response = Requestor::send_request(request, connection);
560546
handle_simple_response<CloseResponse>(std::move(response));
561547
}
562548

563-
void SmartPortOverSlip::reset(const BYTE unit_number, Connection *connection)
564-
{
565-
const ResetRequest request(Requestor::next_request_number(), unit_number);
566-
auto response = Requestor::send_request(request, connection);
567-
handle_simple_response<ResetResponse>(std::move(response));
568-
}
569-
570-
void SmartPortOverSlip::format(const BYTE unit_number, Connection *connection)
549+
void SmartPortOverSlip::format(const BYTE unit_number, Connection *connection, const BYTE params_count)
571550
{
572-
const FormatRequest request(Requestor::next_request_number(), unit_number);
551+
const FormatRequest request(Requestor::next_request_number(), params_count, unit_number);
573552
auto response = Requestor::send_request(request, connection);
574553
handle_simple_response<FormatResponse>(std::move(response));
575554
}

source/SmartPortOverSlip.h

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -32,20 +32,20 @@ class SmartPortOverSlip : public Card
3232
static void device_count(WORD sp_payload_loc);
3333
void handle_smartport_call();
3434
void handle_prodos_call();
35-
void control(BYTE unit_number, Connection *connection, WORD sp_payload_loc, const BYTE params_count, const WORD params_loc);
36-
void init(BYTE unit_number, Connection *connection);
37-
void open(BYTE unit_number, Connection *connection);
38-
void close(BYTE unit_number, Connection *connection);
39-
void format(BYTE unit_number, Connection *connection);
40-
void reset(BYTE unit_number, Connection *connection);
41-
void read_block(BYTE unit_number, Connection *connection, WORD sp_payload_loc, WORD params_loc);
42-
void write_block(BYTE unit_number, Connection *connection, WORD sp_payload_loc, WORD params_loc);
43-
void read(BYTE unit_number, Connection *connection, WORD sp_payload_loc, WORD params_loc);
44-
void write(BYTE unit_number, Connection *connection, WORD sp_payload_loc, WORD params_loc);
45-
46-
std::unique_ptr<Response> status(BYTE unit_number, Connection *connection, const BYTE status_code, const BYTE network_unit);
47-
std::unique_ptr<StatusResponse> status_pd(const BYTE unit_number, Connection *connection, const BYTE status_code);
48-
void status_sp(const BYTE unit_number, Connection *connection, const WORD sp_payload_loc, const BYTE params_count, const WORD params_loc);
35+
void control(BYTE unit_number, Connection *connection, WORD sp_payload_loc, BYTE params_count, WORD params_loc);
36+
void init(BYTE unit_number, Connection *connection, BYTE params_count);
37+
void open(BYTE unit_number, Connection *connection, BYTE params_count);
38+
void close(BYTE unit_number, Connection *connection, BYTE params_count);
39+
void format(BYTE unit_number, Connection *connection, BYTE params_count);
40+
void reset(BYTE unit_number, Connection *connection, BYTE params_count);
41+
void read_block(BYTE unit_number, Connection *connection, WORD sp_payload_loc, BYTE params_count, WORD params_loc);
42+
void write_block(BYTE unit_number, Connection *connection, WORD sp_payload_loc, BYTE params_count, WORD params_loc);
43+
void read(BYTE unit_number, Connection *connection, WORD sp_payload_loc, BYTE params_count, WORD params_loc);
44+
void write(BYTE unit_number, Connection *connection, WORD sp_payload_loc, BYTE params_count, WORD params_loc);
45+
46+
std::unique_ptr<Response> status(BYTE unit_number, Connection *connection, BYTE params_count, BYTE status_code, BYTE network_unit);
47+
std::unique_ptr<StatusResponse> status_pd(BYTE unit_number, Connection *connection, BYTE status_code);
48+
void status_sp(BYTE unit_number, Connection *connection, WORD sp_payload_loc, BYTE params_count, WORD params_loc);
4949

5050
void handle_prodos_status(uint8_t drive_num, std::pair<int, int> disk_devices);
5151
void handle_prodos_read(uint8_t drive_num, std::pair<int, int> disk_devices);

source/devrelay/commands/Close.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,16 @@
33
#include <iostream>
44
#include "Close.h"
55

6-
CloseRequest::CloseRequest(const uint8_t request_sequence_number, const uint8_t device_id) : Request(request_sequence_number, CMD_CLOSE, device_id) {}
6+
CloseRequest::CloseRequest(const uint8_t request_sequence_number, const uint8_t param_count, const uint8_t device_id) : Request(request_sequence_number, CMD_CLOSE, param_count, device_id) {}
77

88
std::vector<uint8_t> CloseRequest::serialize() const
99
{
1010
std::vector<uint8_t> request_data;
1111
request_data.push_back(this->get_request_sequence_number());
1212
request_data.push_back(this->get_command_number());
13+
request_data.push_back(this->get_param_count());
1314
request_data.push_back(this->get_device_id());
15+
request_data.resize(11);
1416
return request_data;
1517
}
1618

source/devrelay/commands/Close.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
class CloseRequest : public Request
1010
{
1111
public:
12-
CloseRequest(uint8_t request_sequence_number, uint8_t device_id);
12+
CloseRequest(uint8_t request_sequence_number, uint8_t param_count, uint8_t device_id);
1313
std::vector<uint8_t> serialize() const override;
1414
std::unique_ptr<Response> deserialize(const std::vector<uint8_t> &data) const override;
1515
void create_command(uint8_t* output_data) const override;

source/devrelay/commands/Control.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
#include <iostream>
44
#include "Control.h"
55

6-
ControlRequest::ControlRequest(const uint8_t request_sequence_number, const uint8_t device_id, const uint8_t control_code, const uint8_t network_unit, std::vector<uint8_t> &data)
7-
: Request(request_sequence_number, CMD_CONTROL, device_id), control_code_(control_code), network_unit_(network_unit), data_(std::move(data))
6+
ControlRequest::ControlRequest(const uint8_t request_sequence_number, const uint8_t param_count, const uint8_t device_id, const uint8_t control_code, const uint8_t network_unit, std::vector<uint8_t> &data)
7+
: Request(request_sequence_number, CMD_CONTROL, param_count, device_id), control_code_(control_code), network_unit_(network_unit), data_(std::move(data))
88
{
99
}
1010

@@ -13,9 +13,12 @@ std::vector<uint8_t> ControlRequest::serialize() const
1313
std::vector<uint8_t> request_data;
1414
request_data.push_back(this->get_request_sequence_number());
1515
request_data.push_back(this->get_command_number());
16+
request_data.push_back(this->get_param_count());
1617
request_data.push_back(this->get_device_id());
18+
request_data.resize(6);
1719
request_data.push_back(this->get_control_code());
1820
request_data.push_back(this->get_network_unit());
21+
request_data.resize(11);
1922
request_data.insert(request_data.end(), get_data().begin(), get_data().end());
2023
return request_data;
2124
}

source/devrelay/commands/Control.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
class ControlRequest : public Request
1010
{
1111
public:
12-
ControlRequest(const uint8_t request_sequence_number, const uint8_t device_id, const uint8_t control_code, const uint8_t network_unit, std::vector<uint8_t> &data);
12+
ControlRequest(const uint8_t request_sequence_number, const uint8_t param_count, const uint8_t device_id, const uint8_t control_code, const uint8_t network_unit, std::vector<uint8_t> &data);
1313
std::vector<uint8_t> serialize() const override;
1414
std::unique_ptr<Response> deserialize(const std::vector<uint8_t> &data) const override;
1515

0 commit comments

Comments
 (0)