smpc_intback: improve/fix data_size handling

keyboard works (as intended) if it is plugged in to controller port 2.
This commit is contained in:
Zack Buhman 2023-05-11 07:59:36 -07:00
parent e15f0a9eaf
commit 9db0c570d9
2 changed files with 12 additions and 8 deletions

View File

@ -200,9 +200,9 @@ void smpc_int(void) {
- up to 2 controllers may be connected - up to 2 controllers may be connected
- multitaps are not parsed correctly - multitaps are not parsed correctly
*/ */
while (oreg_ix < 31) { while (oreg_ix < 32) {
reg8 const& oreg = smpc.reg.oreg[oreg_ix++]; reg8 const& oreg = smpc.reg.oreg[oreg_ix++];
switch (intback.fsm++) { switch (intback.fsm) {
case PORT_STATUS: case PORT_STATUS:
port_connected = (PORT_STATUS__CONNECTORS(oreg) == 1); port_connected = (PORT_STATUS__CONNECTORS(oreg) == 1);
if (port_connected) { if (port_connected) {
@ -274,11 +274,10 @@ void smpc_int(void) {
} }
break; break;
default: default:
assert(0);
break; break;
} }
if ((intback.fsm >= PERIPHERAL_ID && (data_size--) < 0) || intback.fsm == FSM_NEXT) { if ((intback.fsm >= PERIPHERAL_ID && data_size <= 0) || intback.fsm == FSM_NEXT) {
if (intback.port_ix == 1) if (intback.port_ix == 1)
break; break;
else { else {
@ -286,6 +285,9 @@ void smpc_int(void) {
intback.controller_ix++; intback.controller_ix++;
intback.fsm = PORT_STATUS; intback.fsm = PORT_STATUS;
} }
} else {
intback.fsm++;
data_size--;
} }
} }

View File

@ -89,9 +89,9 @@ void smpc_int(void) {
- multitaps are not parsed correctly - multitaps are not parsed correctly
*/ */
while (oreg_ix < 31) { while (oreg_ix < 32) {
reg8 const& oreg = smpc.reg.oreg[oreg_ix++]; reg8 const& oreg = smpc.reg.oreg[oreg_ix++];
switch (intback.fsm++) { switch (intback.fsm) {
case PORT_STATUS: case PORT_STATUS:
port_connected = (PORT_STATUS__CONNECTORS(oreg) == 1); port_connected = (PORT_STATUS__CONNECTORS(oreg) == 1);
if (port_connected) { if (port_connected) {
@ -142,11 +142,10 @@ void smpc_int(void) {
} }
break; break;
default: default:
assert(0);
break; break;
} }
if ((intback.fsm >= PERIPHERAL_ID && (data_size--) < 0) || intback.fsm == FSM_NEXT) { if ((intback.fsm >= PERIPHERAL_ID && data_size <= 0) || intback.fsm == FSM_NEXT) {
if (intback.port_ix == 1) if (intback.port_ix == 1)
break; break;
else { else {
@ -154,6 +153,9 @@ void smpc_int(void) {
intback.controller_ix++; intback.controller_ix++;
intback.fsm = PORT_STATUS; intback.fsm = PORT_STATUS;
} }
} else {
intback.fsm++;
data_size--;
} }
} }