|
|
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.