Skip to content

Commit ab1a968

Browse files
authored
Merge pull request #3 from oliverschmidt/linux
Updated SP-over-SLIP protocol on Linux.
2 parents 21239bf + e78a290 commit ab1a968

31 files changed

+121
-208
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/CMakeLists.txt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,6 @@ set(SOURCE_FILES
137137
devrelay/commands/Open.cpp
138138
devrelay/commands/ReadBlock.cpp
139139
devrelay/commands/Read.cpp
140-
devrelay/commands/Reset.cpp
141140
devrelay/commands/Status.cpp
142141
devrelay/commands/WriteBlock.cpp
143142
devrelay/commands/Write.cpp
@@ -255,7 +254,6 @@ set(HEADER_FILES
255254
devrelay/commands/Open.h
256255
devrelay/commands/ReadBlock.h
257256
devrelay/commands/Read.h
258-
devrelay/commands/Reset.h
259257
devrelay/commands/Status.h
260258
devrelay/commands/WriteBlock.h
261259
devrelay/commands/Write.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)