Annotation of nono/util/runx/iocscall.cpp, revision 1.1.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.