Annotation of nono/util/runx/iocscall.cpp, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.