annotate emu52/main.lst @ 42:792da050d8c4 tip

more dox
author james <jb302@eecs.qmul.ac.uk>
date Tue, 22 Apr 2014 14:25:14 +0100
parents 8205f1734ff2
children
rev   line source
jb302@36 1 C51 COMPILER V9.02 MAIN 04/17/2014 15:17:33 PAGE 1
jb302@36 2
jb302@36 3
jb302@36 4 C51 COMPILER V9.02, COMPILATION OF MODULE MAIN
jb302@36 5 OBJECT MODULE PLACED IN main.obj
jb302@36 6 COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE src\main.c OMF2 BROWSE DEBUG PRINT(.\main.lst) OBJECT(main.obj)
jb302@36 7
jb302@36 8 line level source
jb302@36 9
jb302@36 10 1 #include <stdio.h>
jb302@36 11 2 #include <reg52.h>
jb302@36 12 3
jb302@36 13 4 #define MAIN
jb302@36 14 5 #include "mem.h"
jb302@36 15 6 #include "iset.h"
jb302@36 16 7
jb302@36 17 8 /* fill instruction table
jb302@36 18 9 * MCS-51 - this needs to be stored in code memory */
jb302@36 19 10
jb302@36 20 11 FUNCTION_TABLE const code iset = {
jb302@36 21 12 NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
jb302@36 22 13 SET, CLR, SET, CLR, SET, CLR, CPL, CPL,
jb302@36 23 14 XCSD, SFA, LAF, MOV, MOV, MOV, MOV, MOV,
jb302@36 24 15 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
jb302@36 25 16 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
jb302@36 26 17 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
jb302@36 27 18 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
jb302@36 28 19 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
jb302@36 29 20 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
jb302@36 30 21 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
jb302@36 31 22 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
jb302@36 32 23 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
jb302@36 33 24 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
jb302@36 34 25 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
jb302@36 35 26 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
jb302@36 36 27 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
jb302@36 37 28 ANL, ANL, ANL, ANL, ANL, ANL, ANL, ANL,
jb302@36 38 29 ORL, ORL, ORL, ORL, ORL, ORL, ORL, ORL,
jb302@36 39 30 XRL, XRL, XRL, XRL, XRL, XRL, XRL, XRL,
jb302@36 40 31 RL, RLC, RR, RRC, INC, DEC, INC, DEC,
jb302@36 41 32 ADD, ADD, ADD, ADD, ADD, ADD, ADD, ADD,
jb302@36 42 33 ADDC, ADDC, ADDC, ADDC, ADDC, ADDC, ADDC, ADDC,
jb302@36 43 34 SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB,
jb302@36 44 35 SUBB, SUBB, SUBB, SUBB, SUBB, SUBB, SUBB, SUBB,
jb302@36 45 36 PJMP, PJMP, PJMP, PJMP, PJMP, PJMP, PJMP, PJMP,
jb302@36 46 37 PCALL, PCALL, PCALL, PCALL, PCALL, PCALL, PCALL, PCALL,
jb302@36 47 38 DJNZ, DJNZ, DJNZ, DJNZ, CJNE, CJNE, CJNE, CJNE,
jb302@36 48 39 LJMP, LCALL, RET, RETI, SJMP, JMP, JMP, CJNE,
jb302@36 49 40 JZ, JNZ, JC, JNC, JPO, JPE, JS, JNS,
jb302@36 50 41 PUSH, PUSH, PUSH, PUSH, PUSH, PUSH, PUSH, PUSH,
jb302@36 51 42 POP, POP, POP, POP, POP, POP, POP, POP,
jb302@36 52 43 MUL, DIV, DA, NOP, IN, OUT, INT, HLT
jb302@36 53 44 };
jb302@36 54 45
jb302@36 55 46 BYTE pause; /* becomes 1 when we hit a break point in run mode */
jb302@36 56 47 BYTE free_run; /* free run if not 0 */
jb302@36 57 48 BYTE pause; /* pause flag */
jb302@36 58 49 WIDE addrc; /* address counter */
jb302@36 59 50 BYTE args[4]; /* dbg args */
jb302@36 60 51
jb302@36 61 52 WIDE bp[8] = { 0xFFFF,
jb302@36 62 53 0xFFFF,
jb302@36 63 54 0xFFFF,
jb302@36 64 55 0xFFFF,
jb302@36 65 C51 COMPILER V9.02 MAIN 04/17/2014 15:17:33 PAGE 2
jb302@36 66
jb302@36 67 56 0xFFFF,
jb302@36 68 57 0xFFFF,
jb302@36 69 58 0xFFFF,
jb302@36 70 59 0xFFFF
jb302@36 71 60 };
jb302@36 72 61
jb302@36 73 62
jb302@36 74 63 void
jb302@36 75 64 snd(BYTE c) {
jb302@36 76 65 1 putchar(c);
jb302@36 77 66 1 }
jb302@36 78 67
jb302@36 79 68 BYTE
jb302@36 80 69 rcv(void) {
jb302@36 81 70 1 return getchar();
jb302@36 82 71 1 }
jb302@36 83 72
jb302@36 84 73 void
jb302@36 85 74 step(void) {
jb302@36 86 75 1 IR = fetch();
jb302@36 87 76 1 iset.ops[IR]();
jb302@36 88 77 1 }
jb302@36 89 78
jb302@36 90 79 void
jb302@36 91 80 run(void) {
jb302@36 92 81 1 while (pause != 1) {
jb302@36 93 82 2 step();
jb302@36 94 83 2 for (addrc = 0; addrc < 8; addrc++) {
jb302@36 95 84 3 if (bp[addrc] == get_wide(PC)) {
jb302@36 96 85 4 pause = 1;
jb302@36 97 86 4 }
jb302@36 98 87 3 }
jb302@36 99 88 2 }
jb302@36 100 89 1 }
jb302@36 101 90
jb302@36 102 91 void controller() {
jb302@36 103 92 1 if (free_run == 0) {
jb302@36 104 93 2 switch (rcv()) {
jb302@36 105 94 3
jb302@36 106 95 3 /* step */
jb302@36 107 96 3 case 0x00:
jb302@36 108 97 3 step();
jb302@36 109 98 3 break;
jb302@36 110 99 3
jb302@36 111 100 3 /* run for length steps*/
jb302@36 112 101 3 case 0x01:
jb302@36 113 102 3 run();
jb302@36 114 103 3 break;
jb302@36 115 104 3
jb302@36 116 105 3 /* set reg */
jb302@36 117 106 3 case 0x02:
jb302@36 118 107 3 args[0] = rcv(); /* reg */
jb302@36 119 108 3 args[1] = rcv(); /* val */
jb302@36 120 109 3 regs[args[0]] = args[1];
jb302@36 121 110 3 break;
jb302@36 122 111 3
jb302@36 123 112 3 /* get reg */
jb302@36 124 113 3 case 0x03:
jb302@36 125 114 3 args[0] = rcv(); /* reg */
jb302@36 126 115 3 snd(regs[args[0]]);
jb302@36 127 116 3 break;
jb302@36 128 117 3
jb302@36 129 C51 COMPILER V9.02 MAIN 04/17/2014 15:17:33 PAGE 3
jb302@36 130
jb302@36 131 118 3 /* set flag */
jb302@36 132 119 3 case 0x04:
jb302@36 133 120 3 args[0] = rcv(); /* flag */
jb302@36 134 121 3 args[1] = rcv(); /* on? */
jb302@36 135 122 3 set_flag(args[0], args[1]);
jb302@36 136 123 3 break;
jb302@36 137 124 3
jb302@36 138 125 3 /* get flag */
jb302@36 139 126 3 case 0x05:
jb302@36 140 127 3 args[0] = rcv(); /* flag */
jb302@36 141 128 3 snd(get_flag(args[0]));
jb302@36 142 129 3 break;
jb302@36 143 130 3
jb302@36 144 131 3 /* write mem block */
jb302@36 145 132 3 case 0x06:
jb302@36 146 133 3 args[0] = rcv(); /* addr high */
jb302@36 147 134 3 args[1] = rcv(); /* addr low */
jb302@36 148 135 3 args[2] = rcv(); /* length high */
jb302@36 149 136 3 args[3] = rcv(); /* length low */
jb302@36 150 137 3 tmpw = MWIDE(args[0], args[1]);
jb302@36 151 138 3 for (addrc = tmpw; addrc < tmpw + MWIDE(args[2], args[3]); addrc++) {
jb302@36 152 139 4 if (addrc >= 0xFFFF) {
jb302@36 153 140 5 break;
jb302@36 154 141 5 }
jb302@36 155 142 4 mem[addrc] = rcv();
jb302@36 156 143 4 }
jb302@36 157 144 3 break;
jb302@36 158 145 3
jb302@36 159 146 3 /* read mem block */
jb302@36 160 147 3 case 0x07:
jb302@36 161 148 3 args[0] = rcv(); /* addr high */
jb302@36 162 149 3 args[1] = rcv(); /* addr low */
jb302@36 163 150 3 args[2] = rcv(); /* length high */
jb302@36 164 151 3 args[3] = rcv(); /* length low */
jb302@36 165 152 3 tmpw = MWIDE(args[0], args[1]);
jb302@36 166 153 3 for (addrc = tmpw; addrc < tmpw + MWIDE(args[2], args[3]); addrc++) {
jb302@36 167 154 4 if (addrc >= 0xFFFF) {
jb302@36 168 155 5 break;
jb302@36 169 156 5 }
jb302@36 170 157 4 snd(mem[addrc]);
jb302@36 171 158 4 }
jb302@36 172 159 3 break;
jb302@36 173 160 3
jb302@36 174 161 3 /* get A */
jb302@36 175 162 3 case 0x09:
jb302@36 176 163 3 snd(A);
jb302@36 177 164 3 break;
jb302@36 178 165 3
jb302@36 179 166 3 /* get flags */
jb302@36 180 167 3 case 0x0A:
jb302@36 181 168 3 snd(flags);
jb302@36 182 169 3 break;
jb302@36 183 170 3
jb302@36 184 171 3 /* get instruction register */
jb302@36 185 172 3 case 0x0B:
jb302@36 186 173 3 snd(IR);
jb302@36 187 174 3 break;
jb302@36 188 175 3
jb302@36 189 176 3 case 0x0C:
jb302@36 190 177 3 args[0] = rcv(); /* length high */
jb302@36 191 178 3 args[1] = rcv(); /* length low */
jb302@36 192 179 3 tmpw = get_wide(PC);
jb302@36 193 C51 COMPILER V9.02 MAIN 04/17/2014 15:17:33 PAGE 4
jb302@36 194
jb302@36 195 180 3 for (addrc = tmpw ; addrc < tmpw + MWIDE(args[0], args[1]) ; addrc++) {
jb302@36 196 181 4 if (addrc == 0xFFFF) {
jb302@36 197 182 5 break;
jb302@36 198 183 5 }
jb302@36 199 184 4 step();
jb302@36 200 185 4 }
jb302@36 201 186 3 break;
jb302@36 202 187 3
jb302@36 203 188 3 case 0x0D:
jb302@36 204 189 3 free_run = 1;
jb302@36 205 190 3 break;
jb302@36 206 191 3
jb302@36 207 192 3 /* set break point */
jb302@36 208 193 3 case 0x0E:
jb302@36 209 194 3 args[0] = rcv(); /* bp index */
jb302@36 210 195 3 args[1] = rcv(); /* address high */
jb302@36 211 196 3 args[2] = rcv(); /* address low */
jb302@36 212 197 3 if (args[0] > 7) {
jb302@36 213 198 4 break;
jb302@36 214 199 4 }
jb302@36 215 200 3 bp[args[0]] = MWIDE(args[1], args[2]);
jb302@36 216 201 3 break;
jb302@36 217 202 3
jb302@36 218 203 3 /* test cmd */
jb302@36 219 204 3 case 0x54:
jb302@36 220 205 3 snd('A');
jb302@36 221 206 3 break;
jb302@36 222 207 3 }
jb302@36 223 208 2 }
jb302@36 224 209 1 else {
jb302@36 225 210 2 step();
jb302@36 226 211 2 }
jb302@36 227 212 1 }
jb302@36 228 213
jb302@36 229 214 void
jb302@36 230 215 main(void) {
jb302@36 231 216 1 /* serial set up
jb302@36 232 217 1 * SCON - mode 1, 8-bit UART, enable rcvr
jb302@36 233 218 1 * TMOD - timer 1, mode 2, 8-bit reload
jb302@36 234 219 1 * TH1 - reload value for 1200 baud @ 12MHz
jb302@36 235 220 1 * TR1 - timer 1 run
jb302@36 236 221 1 * TI - set TI to send first char of UART */
jb302@36 237 222 1 /* dont go into free run on restart */
jb302@36 238 223 1 free_run = 0;
jb302@36 239 224 1 SCON = 0x50;
jb302@36 240 225 1 TMOD |= 0x20;
jb302@36 241 226 1 TH1 = 0xE8;
jb302@36 242 227 1 TR1 = 1;
jb302@36 243 228 1 TI = 1;
jb302@36 244 229 1 for (;;) {
jb302@36 245 230 2 controller();
jb302@36 246 231 2 }
jb302@36 247 232 1 }
jb302@36 248 233
jb302@36 249
jb302@36 250
jb302@36 251 MODULE INFORMATION: STATIC OVERLAYABLE
jb302@36 252 CODE SIZE = 600 ----
jb302@36 253 CONSTANT SIZE = 768 ----
jb302@36 254 XDATA SIZE = 32767 ----
jb302@36 255 PDATA SIZE = ---- ----
jb302@36 256 DATA SIZE = 46 ----
jb302@36 257 C51 COMPILER V9.02 MAIN 04/17/2014 15:17:33 PAGE 5
jb302@36 258
jb302@36 259 IDATA SIZE = ---- ----
jb302@36 260 BIT SIZE = ---- ----
jb302@36 261 EDATA SIZE = ---- ----
jb302@36 262 HDATA SIZE = ---- ----
jb302@36 263 XDATA CONST SIZE = ---- ----
jb302@36 264 FAR CONST SIZE = ---- ----
jb302@36 265 END OF MODULE INFORMATION.
jb302@36 266
jb302@36 267
jb302@36 268 C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)