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