Implemented some task control portio
This commit is contained in:
@@ -388,17 +388,45 @@ ushort persistOp(FILE *pfd, ushort maddr, ushort dataLen, ushort blk, uchar isWr
|
|||||||
void portIO(ushort port, ushort p2, ushort p1) {
|
void portIO(ushort port, ushort p2, ushort p1) {
|
||||||
ushort r1 = 0, r2 = 0, status = 0;
|
ushort r1 = 0, r2 = 0, status = 0;
|
||||||
switch(port) {
|
switch(port) {
|
||||||
|
/* Echo port (for testing): r1 = p1, r2 = p2 */
|
||||||
case PORT_ECHO:
|
case PORT_ECHO:
|
||||||
r1 = p1;
|
r1 = p1;
|
||||||
r2 = p2;
|
r2 = p2;
|
||||||
break;
|
break;
|
||||||
|
/* Random number generator port: p1 = from, p2 = to, r1 and r2 = rand(from, to) */
|
||||||
case PORT_RANDOM:
|
case PORT_RANDOM:
|
||||||
r1 = (ushort) (p1 + (rand()%p2));
|
r1 = (ushort) (p1 + (rand()%p2));
|
||||||
r2 = (ushort) (p1 + (rand()%p2));
|
r2 = (ushort) (p1 + (rand()%p2));
|
||||||
break;
|
break;
|
||||||
|
/* Checksum port: p1 = address, p2 = length, r1 = CRC-16-CCITT value */
|
||||||
case PORT_CHECKSUM:
|
case PORT_CHECKSUM:
|
||||||
r1 = crc16(&flatram[p1], p2);
|
r1 = crc16(&flatram[p1], p2);
|
||||||
break;
|
break;
|
||||||
|
/* Task control port: p1 = task ID, p2 = operation code */
|
||||||
|
/* Operations: 0 - get status, 1 - set active status, 2 - unset active status, 3 - get privilege status */
|
||||||
|
/* Only privileged tasks can change status of other tasks, otherwise fail silently */
|
||||||
|
case PORT_TASKCTL:
|
||||||
|
if(p1 >= EQUI_TASKS_MAX) {
|
||||||
|
trapout(OUT_OF_BOUNDS_JUMP);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
switch(p2) {
|
||||||
|
case 0:
|
||||||
|
r1 = ram.tasks[p1].active;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
if(curtask->privileged)
|
||||||
|
ram.tasks[p1].active = 1;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
if(curtask->privileged)
|
||||||
|
ram.tasks[p1].active = 0;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
r1 = ram.tasks[p1].privileged;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
fprintf(stderr, "[PORTIO] Unimplemented call to port 0x%X with P1=%X and P2=%X\n", port, p1, p2);
|
fprintf(stderr, "[PORTIO] Unimplemented call to port 0x%X with P1=%X and P2=%X\n", port, p1, p2);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user