Skip to content

Commit d567c43

Browse files
committed
Merge remote-tracking branch 'upstream/master' into linux
2 parents 626b8e6 + 5f4be29 commit d567c43

File tree

8 files changed

+49
-30
lines changed

8 files changed

+49
-30
lines changed

source/SmartPortOverSlip.cpp

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,10 @@ void SmartPortOverSlip::handle_smartport_call()
9999
WORD rts_location = static_cast<WORD>(mem[regs.sp + 1]) + static_cast<WORD>(mem[regs.sp + 2] << 8);
100100
const BYTE command = mem[rts_location + 1];
101101
const WORD cmd_list_loc = mem[rts_location + 2] + (mem[rts_location + 3] << 8);
102-
// BYTE paramCount = mem[cmdListLoc]; // parameter count not used
102+
const BYTE param_count = mem[cmd_list_loc];
103103
const BYTE unit_number = mem[cmd_list_loc + 1];
104104
const WORD sp_payload_loc = static_cast<WORD>(mem[cmd_list_loc + 2]) + static_cast<WORD>(mem[cmd_list_loc + 3] << 8);
105-
const WORD params_loc = cmd_list_loc + 4;
105+
const WORD params_loc = cmd_list_loc + 2; // we are ONLY skipping the count and destination bytes (used to skip the payload bytes, but that's only certain commands)
106106

107107
// LogFileOutput("SmartPortOverSlip processing SP command: 0x%02x, unit: "
108108
// "0x%02x, cmdList: 0x%04x, spPayLoad: 0x%04x, p1: 0x%02x\n",
@@ -119,8 +119,8 @@ void SmartPortOverSlip::handle_smartport_call()
119119
memdirty[dirty_page_end] = 0xFF;
120120

121121

122-
// Deal with unit 0, status 0 call to return device count, doesn't need connection details.
123-
if (unit_number == 0 && mem[params_loc] == 0)
122+
// Deal with status call (command == 0) with params unit == 0, status_code == 0 to return device count, doesn't need connection details.
123+
if (command == 0 && unit_number == 0 && mem[params_loc + 2] == 0)
124124
{
125125
device_count(sp_payload_loc);
126126
return;
@@ -142,19 +142,22 @@ void SmartPortOverSlip::handle_smartport_call()
142142
switch (command)
143143
{
144144
case CMD_STATUS:
145-
status_sp(device_id, connection, sp_payload_loc, mem[params_loc]);
145+
status_sp(device_id, connection, sp_payload_loc, param_count, params_loc); // we are including the payload params and count part now too
146146
break;
147147
case CMD_READ_BLOCK:
148-
read_block(device_id, connection, sp_payload_loc, params_loc);
148+
// TODO: fix the fact params_loc has changed from +4 to +2
149+
read_block(device_id, connection, sp_payload_loc, params_loc + 2);
149150
break;
150151
case CMD_WRITE_BLOCK:
151-
write_block(device_id, connection, sp_payload_loc, params_loc);
152+
// TODO: fix the fact params_loc has changed from +4 to +2
153+
write_block(device_id, connection, sp_payload_loc, params_loc + 2);
152154
break;
153155
case CMD_FORMAT:
154156
format(device_id, connection);
155157
break;
156158
case CMD_CONTROL:
157-
control(device_id, connection, sp_payload_loc, mem[params_loc]);
159+
// TODO: fix the fact params_loc has changed from +4 to +2
160+
control(device_id, connection, sp_payload_loc, param_count, params_loc);
158161
break;
159162
case CMD_INIT:
160163
init(device_id, connection);
@@ -166,10 +169,12 @@ void SmartPortOverSlip::handle_smartport_call()
166169
close(device_id, connection);
167170
break;
168171
case CMD_READ:
169-
read(device_id, connection, sp_payload_loc, params_loc);
172+
// TODO: fix the fact params_loc has changed from +4 to +2
173+
read(device_id, connection, sp_payload_loc, params_loc + 2);
170174
break;
171175
case CMD_WRITE:
172-
write(device_id, connection, sp_payload_loc, params_loc);
176+
// TODO: fix the fact params_loc has changed from +4 to +2
177+
write(device_id, connection, sp_payload_loc, params_loc + 2);
173178
break;
174179
case CMD_RESET:
175180
reset(device_id, connection);
@@ -480,9 +485,11 @@ void SmartPortOverSlip::write(const BYTE unit_number, Connection *connection, co
480485
handle_simple_response<WriteResponse>(std::move(response));
481486
}
482487

483-
void SmartPortOverSlip::status_sp(const BYTE unit_number, Connection *connection, const WORD sp_payload_loc, const BYTE status_code)
488+
void SmartPortOverSlip::status_sp(const BYTE unit_number, Connection *connection, const WORD sp_payload_loc, const BYTE params_count, const WORD params_loc)
484489
{
485-
auto response = status(unit_number, connection, status_code);
490+
const BYTE status_code = mem[params_loc + 2];
491+
const BYTE network_unit = params_count > 3 ? mem[params_loc + 3] : 0;
492+
auto response = status(unit_number, connection, status_code, network_unit);
486493
handle_response<StatusResponse>(std::move(response), [sp_payload_loc](const StatusResponse *sr) {
487494
const auto response_size = sr->get_data().size();
488495
memcpy(mem + sp_payload_loc, sr->get_data().data(), response_size);
@@ -499,16 +506,16 @@ void SmartPortOverSlip::status_sp(const BYTE unit_number, Connection *connection
499506
});
500507
}
501508

502-
std::unique_ptr<Response> SmartPortOverSlip::status(const BYTE unit_number, Connection *connection, const BYTE status_code)
509+
std::unique_ptr<Response> SmartPortOverSlip::status(const BYTE unit_number, Connection *connection, const BYTE status_code, const BYTE network_unit)
503510
{
504511
// see https://www.1000bit.it/support/manuali/apple/technotes/smpt/tn.smpt.2.html
505-
const StatusRequest request(Requestor::next_request_number(), unit_number, status_code);
512+
const StatusRequest request(Requestor::next_request_number(), unit_number, status_code, network_unit);
506513
return Requestor::send_request(request, connection);
507514
}
508515

509516
std::unique_ptr<StatusResponse> SmartPortOverSlip::status_pd(const BYTE unit_number, Connection *connection, const BYTE status_code)
510517
{
511-
auto response = status(unit_number, connection, status_code);
518+
auto response = status(unit_number, connection, status_code, 0);
512519

513520
// Cast the Response to a StatusResponse. We need to release ownership. As ChatGPT explains:
514521
/*
@@ -519,13 +526,15 @@ std::unique_ptr<StatusResponse> SmartPortOverSlip::status_pd(const BYTE unit_num
519526
return std::unique_ptr<StatusResponse>(static_cast<StatusResponse *>(response.release()));
520527
}
521528

522-
void SmartPortOverSlip::control(const BYTE unit_number, Connection *connection, const WORD sp_payload_loc, const BYTE control_code)
529+
void SmartPortOverSlip::control(const BYTE unit_number, Connection *connection, const WORD sp_payload_loc, const BYTE params_count, const WORD params_loc)
523530
{
531+
const BYTE control_code = mem[params_loc + 2]; // skip the payload location bytes
532+
const BYTE network_unit = params_count > 3 ? mem[params_loc + 3] : 0;
524533
const auto length = mem[sp_payload_loc] + (mem[sp_payload_loc + 1] << 8) + 2;
525534
uint8_t *start_ptr = &mem[sp_payload_loc];
526535
std::vector<uint8_t> payload(start_ptr, start_ptr + length);
527536

528-
const ControlRequest request(Requestor::next_request_number(), unit_number, control_code, payload);
537+
const ControlRequest request(Requestor::next_request_number(), unit_number, control_code, network_unit, payload);
529538
auto response = Requestor::send_request(request, connection);
530539
handle_simple_response<ControlResponse>(std::move(response));
531540
}

source/SmartPortOverSlip.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ 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, BYTE control_code);
35+
void control(BYTE unit_number, Connection *connection, WORD sp_payload_loc, const BYTE params_count, const WORD params_loc);
3636
void init(BYTE unit_number, Connection *connection);
3737
void open(BYTE unit_number, Connection *connection);
3838
void close(BYTE unit_number, Connection *connection);
@@ -43,9 +43,9 @@ class SmartPortOverSlip : public Card
4343
void read(BYTE unit_number, Connection *connection, WORD sp_payload_loc, WORD params_loc);
4444
void write(BYTE unit_number, Connection *connection, WORD sp_payload_loc, WORD params_loc);
4545

46-
std::unique_ptr<Response> status(BYTE unit_number, Connection *connection, BYTE status_code);
46+
std::unique_ptr<Response> status(BYTE unit_number, Connection *connection, const BYTE status_code, const BYTE network_unit);
4747
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 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);
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/Control.cpp

Lines changed: 4 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, std::vector<uint8_t> &data)
7-
: Request(request_sequence_number, CMD_CONTROL, device_id), control_code_(control_code), data_(std::move(data))
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))
88
{
99
}
1010

@@ -15,6 +15,7 @@ std::vector<uint8_t> ControlRequest::serialize() const
1515
request_data.push_back(this->get_command_number());
1616
request_data.push_back(this->get_device_id());
1717
request_data.push_back(this->get_control_code());
18+
request_data.push_back(this->get_network_unit());
1819
request_data.insert(request_data.end(), get_data().begin(), get_data().end());
1920
return request_data;
2021
}
@@ -36,6 +37,7 @@ void ControlRequest::create_command(uint8_t* cmd_data) const
3637
init_command(cmd_data);
3738
// The control byte is at params[2], or cmd_data[4], it is then followed by the payload, see serialize above.
3839
cmd_data[4] = control_code_;
40+
cmd_data[5] = network_unit_;
3941
}
4042

4143
void ControlRequest::copy_payload(uint8_t* data) const {

source/devrelay/commands/Control.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,21 @@
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, std::vector<uint8_t> &data);
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);
1313
std::vector<uint8_t> serialize() const override;
1414
std::unique_ptr<Response> deserialize(const std::vector<uint8_t> &data) const override;
1515

1616
const std::vector<uint8_t> &get_data() const { return data_; }
1717
uint8_t get_control_code() const { return control_code_; }
18+
uint8_t get_network_unit() const { return network_unit_; }
1819
void create_command(uint8_t* output_data) const override;
1920
void copy_payload(uint8_t* data) const override;
2021
size_t payload_size() const override;
2122
std::unique_ptr<Response> create_response(uint8_t source, uint8_t status, const uint8_t* data, uint16_t num) const override;
2223

2324
private:
2425
uint8_t control_code_;
26+
uint8_t network_unit_;
2527
std::vector<uint8_t> data_;
2628
};
2729

source/devrelay/commands/Status.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
#include "Status.h"
77

8-
StatusRequest::StatusRequest(const uint8_t request_sequence_number, const uint8_t device_id, const uint8_t status_code) : Request(request_sequence_number, CMD_STATUS, device_id), status_code_(status_code)
8+
StatusRequest::StatusRequest(const uint8_t request_sequence_number, const uint8_t device_id, const uint8_t status_code, const uint8_t network_unit) : Request(request_sequence_number, CMD_STATUS, device_id), status_code_(status_code), network_unit_(network_unit)
99
{
1010
}
1111

@@ -16,6 +16,7 @@ std::vector<uint8_t> StatusRequest::serialize() const
1616
request_data.push_back(this->get_command_number());
1717
request_data.push_back(this->get_device_id());
1818
request_data.push_back(this->get_status_code());
19+
request_data.push_back(this->get_network_unit());
1920

2021
return request_data;
2122
}
@@ -45,6 +46,7 @@ void StatusRequest::create_command(uint8_t* cmd_data) const
4546
{
4647
init_command(cmd_data);
4748
cmd_data[4] = status_code_;
49+
cmd_data[5] = network_unit_;
4850
}
4951

5052
std::unique_ptr<Response> StatusRequest::create_response(uint8_t source, uint8_t status, const uint8_t* data, uint16_t num) const

source/devrelay/commands/Status.h

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

1616
uint8_t get_status_code() const { return status_code_; }
17+
uint8_t get_network_unit() const { return network_unit_; }
1718

1819
void create_command(uint8_t* output_data) const override;
1920
void copy_payload(uint8_t* data) const override {}
@@ -22,6 +23,7 @@ class StatusRequest : public Request
2223

2324
private:
2425
uint8_t status_code_;
26+
uint8_t network_unit_;
2527
};
2628

2729

source/devrelay/service/Listener.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ std::pair<int, int> Listener::first_two_disk_devices(std::function<bool(const st
294294
const uint8_t unit_number = id_and_connection.first;
295295

296296
// DIB request to get information block. We need the device id the target understands here, not the unit_number from the ids maintained by host
297-
const StatusRequest request(Requestor::next_request_number(), id_and_connection.first, 3);
297+
const StatusRequest request(Requestor::next_request_number(), id_and_connection.first, 3, 0); // no network unit here
298298

299299
std::unique_ptr<Response> response = Requestor::send_request(request, id_and_connection.second);
300300

source/devrelay/types/Request.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,16 @@ std::unique_ptr<Request> Request::from_packet(const std::vector<uint8_t>& packet
3535
switch(command) {
3636

3737
case CMD_STATUS: {
38-
request = std::make_unique<StatusRequest>(packet[0], packet[2], packet[3]);
38+
uint8_t network_unit = packet.size() > 4 ? packet[4] : 0;
39+
request = std::make_unique<StatusRequest>(packet[0], packet[2], packet[3], network_unit);
3940
break;
4041
}
4142

4243
case CMD_CONTROL: {
43-
// +6 = 3 for "header", 1 for control code, 2 for length bytes we need to skip
44-
std::vector<uint8_t> payload(packet.begin() + 6, packet.end());
45-
request = std::make_unique<ControlRequest>(packet[0], packet[2], packet[3], payload);
44+
uint8_t network_unit = packet.size() > 4 ? packet[4] : 0;
45+
// +7 = 3 for "header", 1 for control code, 1 for network unit, 2 for length bytes we need to skip
46+
std::vector<uint8_t> payload(packet.begin() + 7, packet.end());
47+
request = std::make_unique<ControlRequest>(packet[0], packet[2], packet[3], network_unit, payload);
4648
break;
4749
}
4850

0 commit comments

Comments
 (0)