annotate tests/emu/mem.c @ 42:792da050d8c4 tip

more dox
author james <jb302@eecs.qmul.ac.uk>
date Tue, 22 Apr 2014 14:25:14 +0100
parents 4411dee34085
children
rev   line source
jb302@34 1 /* mem.c
jb302@34 2 * functions for accessing emulator memory */
jb302@34 3 #include "mem.h"
jb302@34 4
jb302@34 5 /* get flag value
jb302@34 6 * if invalid flag is requested value is 0 */
jb302@34 7 BYTE
jb302@34 8 get_flag(BYTE flag) {
jb302@34 9 if (flag > 7) {
jb302@34 10 return 0;
jb302@34 11 }
jb302@34 12 else {
jb302@34 13 return GBIT(flags, flag);
jb302@34 14 }
jb302@34 15 }
jb302@34 16
jb302@34 17 /* set flag to 0 if on == 0
jb302@34 18 * otherwise set flag to 1 */
jb302@34 19 void
jb302@34 20 set_flag(BYTE flag, BYTE on) {
jb302@34 21 if (flag <= 7) {
jb302@34 22 if (on == 0x00) {
jb302@34 23 flags = CBIT(flags, flag);
jb302@34 24 }
jb302@34 25 else {
jb302@34 26 flags = SBIT(flags, flag);
jb302@34 27 }
jb302@34 28 }
jb302@34 29 }
jb302@34 30
jb302@34 31 /* sets zero and parity flags based on content of byte */
jb302@34 32 void
jb302@34 33 set_zp(BYTE val){
jb302@34 34 if (val == 0) {
jb302@34 35 set_flag(Z, 1);
jb302@34 36 set_flag(P, 0);
jb302@34 37 }
jb302@34 38 else {
jb302@34 39 /* check parity
jb302@34 40 * think of this as folding */
jb302@34 41 val ^= val >> 4;
jb302@34 42 val ^= val >> 2;
jb302@34 43 val ^= val >> 1;
jb302@34 44 val &= 1;
jb302@34 45 if (val == 0) {
jb302@34 46 set_flag(P, 1);
jb302@34 47 }
jb302@34 48 else {
jb302@34 49 set_flag(P, 0);
jb302@34 50 }
jb302@34 51 }
jb302@34 52 }
jb302@34 53
jb302@34 54 WIDE
jb302@34 55 get_wide(BYTE reg) {
jb302@34 56 /* high, low */
jb302@34 57 return MWIDE(regs[reg + 4], regs[reg + 12]);
jb302@34 58 }
jb302@34 59
jb302@34 60 void
jb302@34 61 set_wide(BYTE reg, WIDE val) {
jb302@34 62 regs[reg + 4] = GHIGH(val); /* high */
jb302@34 63 regs[reg + 12] = GLOW(val); /* low */
jb302@34 64 }
jb302@34 65
jb302@34 66 void
jb302@34 67 inc_pc(BYTE n) {
jb302@34 68 if ((regs[PCL] + n) > 0xFF) {
jb302@34 69 regs[PCH]++;
jb302@34 70 }
jb302@34 71 regs[PCL] += n;
jb302@34 72 }
jb302@34 73
jb302@34 74 BYTE
jb302@34 75 fetch(void) {
jb302@34 76 BYTE val = mem[get_wide(PC)];
jb302@34 77 inc_pc(1);
jb302@34 78 return val;
jb302@34 79 }
jb302@34 80
jb302@34 81 WIDE
jb302@34 82 fetch_wide(void) {
jb302@34 83 WIDE val = MWIDE(mem[get_wide(PC)], mem[get_wide(PC) + 1]);
jb302@34 84 inc_pc(2);
jb302@34 85 return val;
jb302@34 86 }
jb302@34 87
jb302@34 88 /* 0b000 = R0
jb302@34 89 * 0b001 = R1
jb302@34 90 * 0b010 = R2
jb302@34 91 * 0b011 = R3
jb302@34 92 * 0b100 = DPH
jb302@34 93 * 0b101 = DPL
jb302@34 94 * 0b110 = SPH
jb302@34 95 * 0b111 = SPL */
jb302@34 96 BYTE
jb302@34 97 get_reg(BYTE reg) {
jb302@34 98 if (reg < 4) {
jb302@34 99 return regs[reg | (get_flag(BS) << 3)];
jb302@34 100 }
jb302@34 101 else {
jb302@34 102 switch (reg) {
jb302@34 103
jb302@34 104 case 4:
jb302@34 105 return regs[DPH];
jb302@34 106 case 5:
jb302@34 107 return regs[DPL];
jb302@34 108 case 6:
jb302@34 109 return regs[SPH];
jb302@34 110 case 7:
jb302@34 111 return regs[SPL];
jb302@34 112 default:
jb302@34 113 return 0;
jb302@34 114 }
jb302@34 115 }
jb302@34 116 }
jb302@34 117
jb302@34 118 void
jb302@34 119 set_reg(BYTE reg, BYTE val) {
jb302@34 120 if (reg < 4) {
jb302@34 121 regs[reg | (get_flag(BS) << 3)] = val;
jb302@34 122 }
jb302@34 123 else {
jb302@34 124 switch (reg) {
jb302@34 125
jb302@34 126 case 4:
jb302@34 127 regs[DPH] = val;
jb302@34 128 break;
jb302@34 129 case 5:
jb302@34 130 regs[DPL] = val;
jb302@34 131 break;
jb302@34 132 case 6:
jb302@34 133 regs[SPH] = val;
jb302@34 134 break;
jb302@34 135 case 7:
jb302@34 136 regs[SPL] = val;
jb302@34 137 break;
jb302@34 138 default:
jb302@34 139 break;
jb302@34 140 }
jb302@34 141 }
jb302@34 142 }