|
|
1.1 root 1: //
2: // nono
1.1.1.2 root 3: // Copyright (C) 2020 nono project
4: // Licensed under nono-license.txt
1.1 root 5: //
1.1.1.2 root 6:
1.1 root 7: // EA
8:
9: #pragma once
10:
1.1.1.3 ! root 11: // 命令ワードの下位6ビット mmmrrr のうち mmm の部分を取り出す
! 12: static inline int eamode(uint x) { return (x >> 3) & 7; }
! 13: // 命令ワードの下位6ビット mmmrrr のうち rrr の部分を取り出す
! 14: static inline int eanum(uint x) { return x & 7; }
! 15:
! 16: // internal_ea_*() は EA を計算だけする部分。CYCLE はここでは加算しない。
! 17: // MOVE の DST 側からも呼ばれる。
! 18:
! 19: // (An)
! 20: inline uint32 internal_ea_anin(int n)
! 21: {
! 22: return reg.A[n];
! 23: }
! 24:
! 25: // (An)+ .B
! 26: inline uint32 internal_ea_anpi_8(int n)
! 27: {
! 28: save_reg_pi(n);
! 29: if (n == 7) {
! 30: reg.A[n] += 2;
! 31: return reg.A[n] - 2;
! 32: } else {
! 33: reg.A[n] += 1;
! 34: return reg.A[n] - 1;
! 35: }
! 36: }
! 37:
! 38: // (An)+ .W
! 39: inline uint32 internal_ea_anpi_16(int n)
! 40: {
! 41: save_reg_pi(n);
! 42: reg.A[n] += 2;
! 43: return reg.A[n] - 2;
! 44: }
! 45:
! 46: // (An)+ .L
! 47: inline uint32 internal_ea_anpi_32(int n)
! 48: {
! 49: save_reg_pi(n);
! 50: reg.A[n] += 4;
! 51: return reg.A[n] - 4;
! 52: }
! 53:
! 54: // -(An) .B
! 55: inline uint32 internal_ea_anpd_8(int n)
! 56: {
! 57: save_reg_pd(n);
! 58: if (n == 7) {
! 59: reg.A[n] -= 2;
! 60: } else {
! 61: reg.A[n] -= 1;
! 62: }
! 63: return reg.A[n];
! 64: }
! 65:
! 66: // -(An) .W
! 67: inline uint32 internal_ea_anpd_16(int n)
! 68: {
! 69: save_reg_pd(n);
! 70: reg.A[n] -= 2;
! 71: return reg.A[n];
! 72: }
! 73:
! 74: // -(An) .L
! 75: inline uint32 internal_ea_anpd_32(int n)
! 76: {
! 77: save_reg_pd(n);
! 78: reg.A[n] -= 4;
! 79: return reg.A[n];
! 80: }
! 81:
! 82: // d16(An)
! 83: inline uint32 internal_ea_andi(int n)
! 84: {
! 85: int32 disp = (int32)(int16)fetch_16();
! 86: return reg.A[n] + disp;
! 87: }
! 88:
! 89: // (An,IX)
! 90: inline uint32 internal_ea_anix(int n)
! 91: {
! 92: return internal_ea_ix(reg.A[n]);
! 93: }
! 94:
! 95: // Abs.W
! 96: inline uint32 internal_ea_absw()
! 97: {
! 98: return (int32)(int16)fetch_16();
! 99: }
! 100:
! 101: // Abs.L
! 102: inline uint32 internal_ea_absl()
! 103: {
! 104: return fetch_32();
! 105: }
! 106:
! 107: // d16(PC)
! 108: inline uint32 internal_ea_pcdi()
! 109: {
! 110: int32 origin = reg.pc;
! 111: int32 disp = (int32)(int16)fetch_16();
! 112: return origin + disp;
! 113: }
! 114:
! 115: // (PC,IX)
! 116: inline uint32 internal_ea_pcix()
! 117: {
! 118: return internal_ea_ix(reg.pc);
! 119: }
! 120:
! 121: uint32 internal_ea_ix(uint32);
! 122:
! 123: // CEA (個別)
! 124: uint32 cea_anin(int n);
! 125: uint32 cea_anpi_8(int n);
! 126: uint32 cea_anpi_16(int n);
! 127: uint32 cea_anpi_32(int n);
! 128: uint32 cea_anpd_8(int n);
! 129: uint32 cea_anpd_16(int n);
! 130: uint32 cea_anpd_32(int n);
! 131: uint32 cea_andi(int n);
! 132: uint32 cea_anix(int n);
! 133: uint32 cea_absw();
! 134: uint32 cea_absl();
! 135: uint32 cea_pcdi();
! 136: uint32 cea_pcix();
! 137:
! 138: // FEA (個別)
! 139: uint32 fea_anin();
! 140: uint32 fea_anpi_8();
! 141: uint32 fea_anpi_16();
! 142: uint32 fea_anpi_32();
! 143: uint32 fea_anpd_8();
! 144: uint32 fea_anpd_16();
! 145: uint32 fea_anpd_32();
! 146: uint32 fea_andi();
! 147: uint32 fea_anix();
! 148: uint32 fea_absw();
! 149: uint32 fea_absl();
! 150: uint32 fea_pcdi();
! 151: uint32 fea_pcix();
! 152: void fea_imm_16();
! 153: void fea_imm_32();
! 154:
! 155: // CEA (グループ)
! 156: uint32 cea_ctrl();
! 157: uint32 cea_data_8();
! 158: uint32 cea_data_16();
! 159: uint32 cea_data_32();
! 160: uint32 cea_copro();
! 161:
! 162: // FEA (グループ)
! 163: uint32 fea_data_8();
! 164: uint32 fea_data_16();
! 165: uint32 fea_data_32();
! 166: uint32 fea_all_8();
! 167: uint32 fea_all_16();
! 168: uint32 fea_all_32();
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.