|
|
1.1 root 1: // vi:set ts=4:
2:
3: //
4: // nono
5: // Copyright (C) 2024 nono project
6: // Licensed under nono-license.txt
7: //
8:
9: #include "runx.h"
10:
11: int
12: iocscall(pid_t pid, struct reg *reg)
13: {
14: uint32 callno = (RegD(0) & 0xff);
15: DEBUG(2, "iocscall $%02x", callno);
16:
17: // IOCS コールは TRAP 命令なので、ここに来た時点で TRAP 命令実行後。
18: // RegPC の1ワード手前が TRAP #15 のはずで、
19: // そのもう1ワード手前は大抵 moveq.l #nn,d0 だが、違う可能性はある。
20:
21: // TRAP 命令のもう1ワード手前からの2ワードを取得して、
22: // moveq.l #nn,d0; trap #15 の組み合わせならここを IOCS コールの
23: // アドレスとする。
24: // そうでなければ、仕方ないので trap #15 の番地だけを指す。
25: // (前の命令が1ワード命令とは限らない)
26: uint32 pc = RegPC - 4;
27: uint32 inst = readmem4(pc);
28: if ((inst & 0xff00ffff) != 0x70004e4f) {
29: pc += 2;
30: }
31:
32: int have_fpu = 1; // XXX
33:
34: switch (callno) {
35: case 0x82: // _B_BPEEK
36: {
37: uint32 addr = RegA(1);
38: uint32 data = readmem1(addr);
39:
40: TRACE(pc, "IOCS _B_BPEEK($%06x) -> $%02x", addr, data);
41: RegD(0) = (RegD(0) & 0xffffff00) | data;
42: RegA(1)++;
43: break;
44: }
45:
46: case 0xac: // _SYS_STAT (ROM1.3)
47: TRACE(pc, "IOCS _SYS_STAT(%u)", RegD(1));
48: switch (RegD(1)) {
49: case 0:
50: // MPU 状態の取得。
51: RegD(0) =
52: (250 << 16) // 25.0MHz
53: | (have_fpu << 15) // FPU
54: | (0 << 14) // MMU
55: | (3 << 0); // MPU Type
56: break;
57: case 1:
58: // キャッシュ状態の取得。
59: RegD(0) = 0;
60: break;
61: case 2:
62: // キャッシュを SRAM の設定値に設定。
63: RegD(0) = 0;
64: break;
65: case 3:
66: // キャッシュの消去。
67: RegD(0) = 0;
68: break;
69: case 4:
70: // キャッシュの設定。
71: RegD(0) = 0;
72: break;
73: default:
74: break;
75: }
76: break;
77:
78: default:
79: warnx("%06x: Unknown IOCS call $%02x", RegPC, callno);
80: break;
81: }
82:
83: return 0;
84: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.