PISC Assembeller v1.0 Program: /home/stephen/Pascal/piscasm Param 1: ./pmon-dev.asm Opening file: ./pmon-dev.asm Compiled: 16-01-2021 17:11:15 Pass 0 - Optimisation/Find Target Symbols --- Symbol Table Pass 0 --- Number Symbol Line Address Type Loop Count Length Comment 1 NULL 28 0000 8 FALSE 0 0 2 FALSE 29 0000 8 FALSE 0 0 3 TRUE 30 0000 8 FALSE 0 0 4 BUFFER1 32 0000 8 FALSE 0 0 5 BUFFER2 33 0000 8 FALSE 0 0 6 VAR1 35 0000 8 FALSE 0 0 7 VAR2 36 0000 8 FALSE 0 0 8 VAR3 37 0000 8 FALSE 0 0 9 VAR4 38 0000 8 FALSE 0 0 10 VAR1TXT 40 0000 8 FALSE 0 0 11 VAR2TXT 41 0000 8 FALSE 0 0 12 VAR3TXT 42 0000 8 FALSE 0 0 13 VAR4TXT 43 0000 8 FALSE 0 0 14 VCOUNT 45 0000 8 FALSE 0 0 15 VFLAG 46 0000 8 FALSE 0 0 16 DPTR 48 0000 8 FALSE 0 0 17 CKSUM 50 0000 8 FALSE 0 0 18 XDATA 51 0000 8 FALSE 0 0 19 XADDR 52 0000 8 FALSE 0 0 20 XTYPE 53 0000 8 FALSE 0 0 21 VAR5 55 0000 8 FALSE 0 0 22 RINGB 57 0000 8 FALSE 0 0 23 RBWPTR 59 0000 8 FALSE 0 0 24 RBRPTR 60 0000 8 FALSE 0 0 25 RBOVFL 61 0000 8 FALSE 0 0 26 SIOMR1 65 0000 8 FALSE 0 0 27 SIOMR2 66 0000 8 FALSE 0 0 28 SIOCR 67 0000 8 FALSE 0 0 29 SIODAT 71 0000 8 FALSE 0 0 30 SIOSTA 72 0000 8 FALSE 0 0 31 SIOMOD 73 0000 8 FALSE 0 0 32 SIOCMD 74 0000 8 FALSE 0 0 33 MDAT0 76 0000 8 FALSE 0 0 34 MDAT1 77 0000 8 FALSE 0 0 35 MDAT2 78 0000 8 FALSE 0 0 36 MDAT3 79 0000 8 FALSE 0 0 37 BKADDR 81 0000 8 FALSE 0 0 38 BKINST 82 0000 8 FALSE 0 0 39 BKSAVE 83 0000 8 FALSE 0 0 40 BKFLAG 84 0000 8 FALSE 0 0 41 IRQVEC 86 0000 8 FALSE 0 0 42 PMAIN 91 0000 1 FALSE 0 0 43 BIOS 109 0009 1 FALSE 0 0 44 FLAGTBL 122 000D 31 FALSE 0 0 45 COLD 143 0015 1 FALSE 0 0 46 COLD:CONT 161 0035 1 FALSE 0 0 47 JPTBL 179 0047 31 FALSE 0 0 48 IRQREQ 201 0054 1 FALSE 0 0 49 IRQJMP 253 0076 1 FALSE 0 0 50 NOIRQ 314 0091 1 FALSE 0 0 51 IRQ7SG 326 009D 1 FALSE 0 0 52 RINGWR 333 00A6 1 FALSE 0 0 53 RINGWR:OVRFL 352 00C3 1 FALSE 0 0 54 RINGWR:GETCHR 364 00DC 1 FALSE 0 0 55 RINGWR:QUIT 375 00EF 1 FALSE 0 0 56 RINGWR:EXIT 380 00F7 1 FALSE 0 0 57 BREAK 405 00FA 1 FALSE 0 0 58 COLDNXT 499 0140 1 FALSE 0 0 59 COLDNXT:SKIP 550 0190 1 FALSE 0 0 60 WARM 564 019B 1 FALSE 0 0 61 START 581 01C6 1 FALSE 0 0 62 START:LOOP1 616 01FF 1 FALSE 0 0 63 HEXFILE 698 026B 1 FALSE 0 0 64 HEXFILE:RXEOF 720 02AA 1 FALSE 0 0 65 HEXFILE:RXHEX 733 02CF 1 FALSE 0 0 66 HEXFILE:LOOP 737 02D8 1 FALSE 0 0 67 HEXFILE:LOOP2 754 0302 1 FALSE 0 0 68 HEXFILE:HEXERR 760 030C 1 FALSE 0 0 69 HEXFILE:LOOPY 768 0326 1 FALSE 0 0 70 HEXFILE:EXIT 770 0329 1 FALSE 0 0 71 DUMP 773 032C 1 FALSE 0 0 72 DUMP:NEXT1 783 0345 1 FALSE 0 0 73 DUMP:NEXT2 790 0356 1 FALSE 0 0 74 DUMP:DISP 796 0364 1 FALSE 0 0 75 DUMP:LOOP 807 0383 1 FALSE 0 0 76 DUMP:EXIT 824 03B5 1 FALSE 0 0 77 WRITE 831 03C6 1 FALSE 0 0 78 READ 849 03FF 1 FALSE 0 0 79 ENTER 867 0437 1 FALSE 0 0 80 ENTER:LOOP 870 0441 1 FALSE 0 0 81 ENTER:SKIP 897 0494 1 FALSE 0 0 82 FILL 902 0499 1 FALSE 0 0 83 FILL:LOOP 911 04B4 1 FALSE 0 0 84 COPY 917 04BC 1 FALSE 0 0 85 COPY:LOOP 926 04D7 1 FALSE 0 0 86 JUMP 933 04E0 1 FALSE 0 0 87 MEMBNK 944 04FA 1 FALSE 0 0 88 BKPOINT 955 0512 1 FALSE 0 0 89 BKPOINT:CONT1 970 052A 1 FALSE 0 0 90 BKPOINT:CONT2 984 0540 1 FALSE 0 0 91 BKPOINT:LOOP3 1004 057D 1 FALSE 0 0 92 BKPCONT 1027 05C8 1 FALSE 0 0 93 BKPCONT:CONT 1053 05E3 1 FALSE 0 0 94 BKPCONT:EXIT 1055 05E6 1 FALSE 0 0 95 BKPSTEP 1060 05F0 1 FALSE 0 0 96 BKPSTEP:EXIT 1082 060D 1 FALSE 0 0 97 BKPSTEP:CONT 1085 0610 1 FALSE 0 0 98 ERROR 1091 061A 1 FALSE 0 0 99 ADD2CRC 1104 0624 1 FALSE 0 0 100 HEX2WRD 1130 0631 1 FALSE 0 0 101 HEX2WRD:CBYTE 1144 0648 1 FALSE 0 0 102 HEX2WRD:EXIT 1168 066D 1 FALSE 0 0 103 STR2BN 1180 0670 1 FALSE 0 0 104 STR2BN:LOOP 1185 0677 1 FALSE 0 0 105 STR2BN:EXIT 1211 069F 1 FALSE 0 0 106 WRD2HEX 1228 06A6 1 FALSE 0 0 107 PRTVARS 1249 06C0 1 FALSE 0 0 108 PRTVARS:LOOP 1256 06CA 1 FALSE 0 0 109 BN2HEX 1283 06F1 1 FALSE 0 0 110 NIB2ASC 1314 0711 1 FALSE 0 0 111 NIB2ASC:CONT 1324 071A 1 FALSE 0 0 112 HEX2BN 1336 0720 1 FALSE 0 0 113 A2HEX 1362 0739 1 FALSE 0 0 114 A2HEX1 1375 074A 1 FALSE 0 0 115 TOUPPER 1391 074F 1 FALSE 0 0 116 TOUPPER:LOOP 1395 0755 1 FALSE 0 0 117 TOUPPER:EXIT 1406 0767 1 FALSE 0 0 118 EXPSTR 1424 076D 1 FALSE 0 0 119 EXPSTR:LOOP 1432 0775 1 FALSE 0 0 120 EXPSTR:EXIT 1448 078F 1 FALSE 0 0 121 PKDSTR 1468 0799 1 FALSE 0 0 122 PKDSTR:LOOP 1474 07A2 1 FALSE 0 0 123 PKDSTR:WRITE 1491 07C5 1 FALSE 0 0 124 PKDSTR:EXIT 1498 07D0 1 FALSE 0 0 125 SETVARS 1520 07D8 1 FALSE 0 0 126 SETVARS:LOOP 1545 07F7 1 FALSE 0 0 127 SETVARS:CONT1 1558 0810 1 FALSE 0 0 128 SETVARS:SETPTR 1569 0824 1 FALSE 0 0 129 SETVARS:EXIT 1584 0837 1 FALSE 0 0 130 PRINT 1596 083E 1 FALSE 0 0 131 PRINT:LOOP 1605 0846 1 FALSE 0 0 132 PRINT:EXIT 1624 0864 1 FALSE 0 0 133 PRINT16 1635 086B 1 FALSE 0 0 134 PRINT16:LOOP 1642 0875 1 FALSE 0 0 135 PRINT16:DOT 1660 0899 1 FALSE 0 0 136 PRINT16:EXIT 1676 08A9 1 FALSE 0 0 137 INPUT 1692 08B0 1 FALSE 0 0 138 INPUT:LOOP 1698 08B8 1 FALSE 0 0 139 INPUT:LOWCHR 1713 08D5 1 FALSE 0 0 140 INPUT:BKSP0 1726 08EF 1 FALSE 0 0 141 INPUT:BKSP1 1735 0904 1 FALSE 0 0 142 INPUT:EXIT 1739 090E 1 FALSE 0 0 143 NEWLN 1755 0919 1 FALSE 0 0 144 PRTWRD 1768 0926 1 FALSE 0 0 145 INKEY 1787 0935 1 FALSE 0 0 146 INKEY:EXIT 1799 0949 1 FALSE 0 0 147 RINGRD 1813 094F 1 FALSE 0 0 148 RINGRD:WAIT 1833 097C 1 FALSE 0 0 149 RINGRD:CONT 1840 0984 1 FALSE 0 0 150 RINGRD:CKCHR 1848 0995 1 FALSE 0 0 151 RINGRD:EXIT 1857 09A1 1 FALSE 0 0 152 SIORX 1871 09A7 1 FALSE 0 0 153 SIORX:LOOP 1877 09B2 1 FALSE 0 0 154 SIOTX 1906 09D1 1 FALSE 0 0 155 SIOTX:LOOP 1912 09DC 1 FALSE 0 0 156 SIOINIT 1935 09ED 1 FALSE 0 0 157 RTSOFF 1963 0A03 1 FALSE 0 0 158 RTSON 1986 0A14 1 FALSE 0 0 159 DSPSGN 2023 0A32 1 FALSE 0 0 160 DSPSGN:DISP 2039 0A4C 1 FALSE 0 0 161 DSPNUM 2052 0A55 1 FALSE 0 0 162 DSPNUM:START 2063 0A6B 1 FALSE 0 0 163 DSPNUM:QUIT 2075 0A8F 1 FALSE 0 0 164 DSPNUM:NUM1 2080 0A95 1 FALSE 0 0 165 DSPNUM:NUM2 2081 0A97 1 FALSE 0 0 166 DSPNUM:EXIT 2091 0AAE 1 FALSE 0 0 167 DSPHEX 2102 0AB1 1 FALSE 0 0 168 DEC2BN 2117 0AC1 1 FALSE 0 0 169 DEC2BN:PLUS 2135 0ADD 1 FALSE 0 0 170 DEC2BN:CNVERT 2138 0AE4 1 FALSE 0 0 171 DEC2BN:CHKDIG 2142 0AEC 1 FALSE 0 0 172 DEC2BN:ERROR 2158 0B04 1 FALSE 0 0 173 DEC2BN:SIGN 2162 0B09 1 FALSE 0 0 174 DEC2BN:EXIT 2169 0B12 1 FALSE 0 0 175 MSG1 2177 0B17 1 FALSE 0 0 176 _DB2177 2177 0000 30 FALSE 0 25 ..PISC Monitor v1.0 b8... 177 MSG2 2178 0B24 1 FALSE 0 0 178 _DB2178 2178 0000 30 FALSE 0 32 Copyright 2019 Stephen Arnold... 179 MSG3 2179 0B34 1 FALSE 0 0 180 _DB2179 2179 0000 30 FALSE 0 24 *** FAILSAFE BOOT ***... 181 MSGERR 2180 0B40 1 FALSE 0 0 182 _DB2180 2180 0000 30 FALSE 0 16 Syntax Error.... 183 IRQERR 2181 0B48 1 FALSE 0 0 184 _DB2181 2181 0000 30 FALSE 0 23 ..Unhandled IRQ from: . 185 IRQM1 2182 0B54 1 FALSE 0 0 186 _DB2182 2182 0000 30 FALSE 0 19 ..2651 IRQ Char = . 187 MSGDU 2183 0B5E 1 FALSE 0 0 188 _DB2183 2183 0000 30 FALSE 0 8 Dump ... 189 MSGRD 2184 0B62 1 FALSE 0 0 190 _DB2184 2184 0000 30 FALSE 0 8 Read ... 191 MSGEN 2185 0B66 1 FALSE 0 0 192 _DB2185 2185 0000 30 FALSE 0 8 Enter... 193 MSGWR 2186 0B6A 1 FALSE 0 0 194 _DB2186 2186 0000 30 FALSE 0 8 Write... 195 MSGFL 2187 0B6E 1 FALSE 0 0 196 _DB2187 2187 0000 30 FALSE 0 8 Fill ... 197 MSGCP 2188 0B72 1 FALSE 0 0 198 _DB2188 2188 0000 30 FALSE 0 8 Copy ... 199 MSGJP 2189 0B76 1 FALSE 0 0 200 _DB2189 2189 0000 30 FALSE 0 5 Jump 201 MSGMBK 2190 0B79 1 FALSE 0 0 202 _DB2190 2190 0000 30 FALSE 0 12 Mem Bank ... 203 MSGHEX 2191 0B7F 1 FALSE 0 0 204 _DB2191 2191 0000 30 FALSE 0 15 Hex Transfer... 205 CRCERR 2192 0B87 1 FALSE 0 0 206 _DB2192 2192 0000 30 FALSE 0 12 CRC Error... 207 XERROR 2193 0B8D 1 FALSE 0 0 208 _DB2193 2193 0000 30 FALSE 0 15 Record Error... 209 XTRANS 2194 0B95 1 FALSE 0 0 210 _DB2194 2194 0000 30 FALSE 0 10 Transfer . 211 XOK 2195 0B9A 1 FALSE 0 0 212 _DB2195 2195 0000 30 FALSE 0 13 Successful... 213 XFAIL 2196 0BA1 1 FALSE 0 0 214 _DB2196 2196 0000 30 FALSE 0 9 Failed... 215 MSGBRK 2197 0BA6 1 FALSE 0 0 216 _DB2197 2197 0000 30 FALSE 0 8 Break @. 217 MSGBK2 2198 0BAA 1 FALSE 0 0 218 _DB2198 2198 0000 30 FALSE 0 7 Flags . 219 MSGBKH 2199 0BAE 1 FALSE 0 0 220 _DB2199 2199 0000 30 FALSE 0 21 ..Register Values:... 221 BRKERR 2200 0BB9 1 FALSE 0 0 222 _DB2200 2200 0000 30 FALSE 0 21 No breakpoint set.... 223 MSGHLP 2201 0BC4 1 FALSE 0 0 224 _DB2201 2201 0000 30 FALSE 0 24 ..Available Commands: .. 225 _DB2202 2202 0000 30 FALSE 0 40 (D)ump (W)rite (R)ead .. 226 _DB2203 2203 0000 30 FALSE 0 40 (E)nter (F)ill (C)opy .. 227 _DB2204 2204 0000 30 FALSE 0 26 (J)ump (M)emory .. 228 _DB2205 2205 0000 30 FALSE 0 40 (B)reakpoint (K)ontinue (S)tep .. 229 _DB2206 2206 0000 30 FALSE 0 3 ... Pass 1 - Build Symbol Table --- Symbol Table Pass 1 --- Number Symbol Line Address Type Loop Count Length Comment 1 NULL 28 0000 8 FALSE 0 0 2 FALSE 29 0000 8 FALSE 0 0 3 TRUE 30 0000 8 FALSE 0 0 4 BUFFER1 32 0000 8 FALSE 7 0 5 BUFFER2 33 0000 8 FALSE 5 0 6 VAR1 35 0000 8 FALSE 2 0 7 VAR2 36 0000 8 FALSE 10 0 8 VAR3 37 0000 8 FALSE 4 0 9 VAR4 38 0000 8 FALSE 2 0 10 VAR1TXT 40 0000 8 FALSE 3 0 11 VAR2TXT 41 0000 8 FALSE 1 0 12 VAR3TXT 42 0000 8 FALSE 0 0 13 VAR4TXT 43 0000 8 FALSE 0 0 14 VCOUNT 45 0000 8 FALSE 12 0 15 VFLAG 46 0000 8 FALSE 3 0 16 DPTR 48 0000 8 FALSE 3 0 17 CKSUM 50 0000 8 FALSE 4 0 18 XDATA 51 0000 8 FALSE 3 0 19 XADDR 52 0000 8 FALSE 2 0 20 XTYPE 53 0000 8 FALSE 1 0 21 VAR5 55 0000 8 FALSE 0 0 22 RINGB 57 0000 8 FALSE 3 0 23 RBWPTR 59 0000 8 FALSE 5 0 24 RBRPTR 60 0000 8 FALSE 0 0 25 RBOVFL 61 0000 8 FALSE 2 0 26 SIOMR1 65 0000 8 FALSE 1 0 27 SIOMR2 66 0000 8 FALSE 1 0 28 SIOCR 67 0000 8 FALSE 1 0 29 SIODAT 71 0000 8 FALSE 4 0 30 SIOSTA 72 0000 8 FALSE 2 0 31 SIOMOD 73 0000 8 FALSE 1 0 32 SIOCMD 74 0000 8 FALSE 6 0 33 MDAT0 76 0000 8 FALSE 3 0 34 MDAT1 77 0000 8 FALSE 0 0 35 MDAT2 78 0000 8 FALSE 0 0 36 MDAT3 79 0000 8 FALSE 0 0 37 BKADDR 81 0000 8 FALSE 8 0 38 BKINST 82 0000 8 FALSE 0 0 39 BKSAVE 83 0000 8 FALSE 4 0 40 BKFLAG 84 0000 8 FALSE 2 0 41 IRQVEC 86 0000 8 FALSE 2 0 42 PMAIN 91 0000 1 FALSE 0 0 43 BIOS 109 0009 1 FALSE 3 0 44 FLAGTBL 122 000D 31 FALSE 2 0 45 COLD 143 0015 1 FALSE 1 0 46 COLD:CONT 161 0035 1 FALSE 1 0 47 JPTBL 179 0047 31 FALSE 1 0 48 IRQREQ 201 0054 1 FALSE 1 0 49 IRQJMP 253 0076 1 FALSE 1 0 50 NOIRQ 314 0091 1 FALSE 7 0 51 IRQ7SG 326 009D 1 FALSE 1 0 52 RINGWR 333 00A6 1 FALSE 1 0 53 RINGWR:OVRFL 352 00C3 1 FALSE 1 0 54 RINGWR:GETCHR 364 00DC 1 FALSE 2 0 55 RINGWR:QUIT 375 00EF 1 FALSE 1 0 56 RINGWR:EXIT 380 00F7 1 FALSE 3 0 57 BREAK 405 00FA 1 FALSE 1 0 58 COLDNXT 499 0140 1 FALSE 1 0 59 COLDNXT:SKIP 550 0190 1 FALSE 1 0 60 WARM 564 019B 1 FALSE 1 0 61 START 581 01C6 1 FALSE 20 0 62 START:LOOP1 616 01FF 1 FALSE 1 0 63 HEXFILE 698 026B 1 FALSE 1 0 64 HEXFILE:RXEOF 720 02AA 1 FALSE 1 0 65 HEXFILE:RXHEX 733 02CF 1 FALSE 1 0 66 HEXFILE:LOOP 737 02D8 1 FALSE 1 0 67 HEXFILE:LOOP2 754 0302 1 FALSE 1 0 68 HEXFILE:HEXERR 760 030C 1 FALSE 2 0 69 HEXFILE:LOOPY 768 0326 1 FALSE 1 0 70 HEXFILE:EXIT 770 0329 1 FALSE 3 0 71 DUMP 773 032C 1 FALSE 1 0 72 DUMP:NEXT1 783 0345 1 FALSE 1 0 73 DUMP:NEXT2 790 0356 1 FALSE 1 0 74 DUMP:DISP 796 0364 1 FALSE 3 0 75 DUMP:LOOP 807 0383 1 FALSE 1 0 76 DUMP:EXIT 824 03B5 1 FALSE 1 0 77 WRITE 831 03C6 1 FALSE 1 0 78 READ 849 03FF 1 FALSE 1 0 79 ENTER 867 0437 1 FALSE 1 0 80 ENTER:LOOP 870 0441 1 FALSE 1 0 81 ENTER:SKIP 897 0494 1 FALSE 1 0 82 FILL 902 0499 1 FALSE 1 0 83 FILL:LOOP 911 04B4 1 FALSE 1 0 84 COPY 917 04BC 1 FALSE 1 0 85 COPY:LOOP 926 04D7 1 FALSE 1 0 86 JUMP 933 04E0 1 FALSE 1 0 87 MEMBNK 944 04FA 1 FALSE 1 0 88 BKPOINT 955 0512 1 FALSE 2 0 89 BKPOINT:CONT1 970 052A 1 FALSE 1 0 90 BKPOINT:CONT2 984 0540 1 FALSE 1 0 91 BKPOINT:LOOP3 1004 057D 1 FALSE 1 0 92 BKPCONT 1027 05C8 1 FALSE 1 0 93 BKPCONT:CONT 1053 05E3 1 FALSE 1 0 94 BKPCONT:EXIT 1055 05E6 1 FALSE 1 0 95 BKPSTEP 1060 05F0 1 FALSE 1 0 96 BKPSTEP:EXIT 1082 060D 1 FALSE 0 0 97 BKPSTEP:CONT 1085 0610 1 FALSE 1 0 98 ERROR 1091 061A 1 FALSE 4 0 99 ADD2CRC 1104 0624 1 FALSE 6 0 100 HEX2WRD 1130 0631 1 FALSE 6 0 101 HEX2WRD:CBYTE 1144 0648 1 FALSE 2 0 102 HEX2WRD:EXIT 1168 066D 1 FALSE 2 0 103 STR2BN 1180 0670 1 FALSE 2 0 104 STR2BN:LOOP 1185 0677 1 FALSE 1 0 105 STR2BN:EXIT 1211 069F 1 FALSE 2 0 106 WRD2HEX 1228 06A6 1 FALSE 14 0 107 PRTVARS 1249 06C0 1 FALSE 0 0 108 PRTVARS:LOOP 1256 06CA 1 FALSE 1 0 109 BN2HEX 1283 06F1 1 FALSE 2 0 110 NIB2ASC 1314 0711 1 FALSE 2 0 111 NIB2ASC:CONT 1324 071A 1 FALSE 1 0 112 HEX2BN 1336 0720 1 FALSE 0 0 113 A2HEX 1362 0739 1 FALSE 6 0 114 A2HEX1 1375 074A 1 FALSE 1 0 115 TOUPPER 1391 074F 1 FALSE 1 0 116 TOUPPER:LOOP 1395 0755 1 FALSE 1 0 117 TOUPPER:EXIT 1406 0767 1 FALSE 1 0 118 EXPSTR 1424 076D 1 FALSE 2 0 119 EXPSTR:LOOP 1432 0775 1 FALSE 1 0 120 EXPSTR:EXIT 1448 078F 1 FALSE 2 0 121 PKDSTR 1468 0799 1 FALSE 1 0 122 PKDSTR:LOOP 1474 07A2 1 FALSE 2 0 123 PKDSTR:WRITE 1491 07C5 1 FALSE 1 0 124 PKDSTR:EXIT 1498 07D0 1 FALSE 1 0 125 SETVARS 1520 07D8 1 FALSE 1 0 126 SETVARS:LOOP 1545 07F7 1 FALSE 3 0 127 SETVARS:CONT1 1558 0810 1 FALSE 1 0 128 SETVARS:SETPTR 1569 0824 1 FALSE 1 0 129 SETVARS:EXIT 1584 0837 1 FALSE 3 0 130 PRINT 1596 083E 1 FALSE 38 0 131 PRINT:LOOP 1605 0846 1 FALSE 1 0 132 PRINT:EXIT 1624 0864 1 FALSE 2 0 133 PRINT16 1635 086B 1 FALSE 2 0 134 PRINT16:LOOP 1642 0875 1 FALSE 1 0 135 PRINT16:DOT 1660 0899 1 FALSE 2 0 136 PRINT16:EXIT 1676 08A9 1 FALSE 1 0 137 INPUT 1692 08B0 1 FALSE 3 0 138 INPUT:LOOP 1698 08B8 1 FALSE 3 0 139 INPUT:LOWCHR 1713 08D5 1 FALSE 1 0 140 INPUT:BKSP0 1726 08EF 1 FALSE 1 0 141 INPUT:BKSP1 1735 0904 1 FALSE 1 0 142 INPUT:EXIT 1739 090E 1 FALSE 3 0 143 NEWLN 1755 0919 1 FALSE 12 0 144 PRTWRD 1768 0926 1 FALSE 4 0 145 INKEY 1787 0935 1 FALSE 1 0 146 INKEY:EXIT 1799 0949 1 FALSE 1 0 147 RINGRD 1813 094F 1 FALSE 3 0 148 RINGRD:WAIT 1833 097C 1 FALSE 2 0 149 RINGRD:CONT 1840 0984 1 FALSE 1 0 150 RINGRD:CKCHR 1848 0995 1 FALSE 2 0 151 RINGRD:EXIT 1857 09A1 1 FALSE 2 0 152 SIORX 1871 09A7 1 FALSE 1 0 153 SIORX:LOOP 1877 09B2 1 FALSE 1 0 154 SIOTX 1906 09D1 1 FALSE 28 0 155 SIOTX:LOOP 1912 09DC 1 FALSE 1 0 156 SIOINIT 1935 09ED 1 FALSE 1 0 157 RTSOFF 1963 0A03 1 FALSE 0 0 158 RTSON 1986 0A14 1 FALSE 2 0 159 DSPSGN 2023 0A32 1 FALSE 1 0 160 DSPSGN:DISP 2039 0A4C 1 FALSE 1 0 161 DSPNUM 2052 0A55 1 FALSE 2 0 162 DSPNUM:START 2063 0A6B 1 FALSE 1 0 163 DSPNUM:QUIT 2075 0A8F 1 FALSE 1 0 164 DSPNUM:NUM1 2080 0A95 1 FALSE 5 0 165 DSPNUM:NUM2 2081 0A97 1 FALSE 1 0 166 DSPNUM:EXIT 2091 0AAE 1 FALSE 1 0 167 DSPHEX 2102 0AB1 1 FALSE 1 0 168 DEC2BN 2117 0AC1 1 FALSE 1 0 169 DEC2BN:PLUS 2135 0ADD 1 FALSE 1 0 170 DEC2BN:CNVERT 2138 0AE4 1 FALSE 2 0 171 DEC2BN:CHKDIG 2142 0AEC 1 FALSE 1 0 172 DEC2BN:ERROR 2158 0B04 1 FALSE 2 0 173 DEC2BN:SIGN 2162 0B09 1 FALSE 1 0 174 DEC2BN:EXIT 2169 0B12 1 FALSE 2 0 175 MSG1 2177 0B17 1 FALSE 1 0 176 _DB2177 2177 0000 30 FALSE 0 25 ..PISC Monitor v1.0 b8... 177 MSG2 2178 0B24 1 FALSE 1 0 178 _DB2178 2178 0000 30 FALSE 0 32 Copyright 2019 Stephen Arnold... 179 MSG3 2179 0B34 1 FALSE 1 0 180 _DB2179 2179 0000 30 FALSE 0 24 *** FAILSAFE BOOT ***... 181 MSGERR 2180 0B40 1 FALSE 1 0 182 _DB2180 2180 0000 30 FALSE 0 16 Syntax Error.... 183 IRQERR 2181 0B48 1 FALSE 0 0 184 _DB2181 2181 0000 30 FALSE 0 23 ..Unhandled IRQ from: . 185 IRQM1 2182 0B54 1 FALSE 0 0 186 _DB2182 2182 0000 30 FALSE 0 19 ..2651 IRQ Char = . 187 MSGDU 2183 0B5E 1 FALSE 1 0 188 _DB2183 2183 0000 30 FALSE 0 8 Dump ... 189 MSGRD 2184 0B62 1 FALSE 1 0 190 _DB2184 2184 0000 30 FALSE 0 8 Read ... 191 MSGEN 2185 0B66 1 FALSE 1 0 192 _DB2185 2185 0000 30 FALSE 0 8 Enter... 193 MSGWR 2186 0B6A 1 FALSE 1 0 194 _DB2186 2186 0000 30 FALSE 0 8 Write... 195 MSGFL 2187 0B6E 1 FALSE 1 0 196 _DB2187 2187 0000 30 FALSE 0 8 Fill ... 197 MSGCP 2188 0B72 1 FALSE 1 0 198 _DB2188 2188 0000 30 FALSE 0 8 Copy ... 199 MSGJP 2189 0B76 1 FALSE 1 0 200 _DB2189 2189 0000 30 FALSE 0 5 Jump 201 MSGMBK 2190 0B79 1 FALSE 1 0 202 _DB2190 2190 0000 30 FALSE 0 12 Mem Bank ... 203 MSGHEX 2191 0B7F 1 FALSE 0 0 204 _DB2191 2191 0000 30 FALSE 0 15 Hex Transfer... 205 CRCERR 2192 0B87 1 FALSE 1 0 206 _DB2192 2192 0000 30 FALSE 0 12 CRC Error... 207 XERROR 2193 0B8D 1 FALSE 1 0 208 _DB2193 2193 0000 30 FALSE 0 15 Record Error... 209 XTRANS 2194 0B95 1 FALSE 1 0 210 _DB2194 2194 0000 30 FALSE 0 10 Transfer . 211 XOK 2195 0B9A 1 FALSE 1 0 212 _DB2195 2195 0000 30 FALSE 0 13 Successful... 213 XFAIL 2196 0BA1 1 FALSE 1 0 214 _DB2196 2196 0000 30 FALSE 0 9 Failed... 215 MSGBRK 2197 0BA6 1 FALSE 1 0 216 _DB2197 2197 0000 30 FALSE 0 8 Break @. 217 MSGBK2 2198 0BAA 1 FALSE 1 0 218 _DB2198 2198 0000 30 FALSE 0 7 Flags . 219 MSGBKH 2199 0BAE 1 FALSE 1 0 220 _DB2199 2199 0000 30 FALSE 0 21 ..Register Values:... 221 BRKERR 2200 0BB9 1 FALSE 3 0 222 _DB2200 2200 0000 30 FALSE 0 21 No breakpoint set.... 223 MSGHLP 2201 0BC4 1 FALSE 1 0 224 _DB2201 2201 0000 30 FALSE 0 24 ..Available Commands: .. 225 _DB2202 2202 0000 30 FALSE 0 40 (D)ump (W)rite (R)ead .. 226 _DB2203 2203 0000 30 FALSE 0 40 (E)nter (F)ill (C)opy .. 227 _DB2204 2204 0000 30 FALSE 0 26 (J)ump (M)emory .. 228 _DB2205 2205 0000 30 FALSE 0 40 (B)reakpoint (K)ontinue (S)tep .. 229 _DB2206 2206 0000 30 FALSE 0 3 ... 230 COLD 93 0002 2 FALSE 0 0 231 WARM 96 0005 2 FALSE 0 0 232 BREAK 99 0008 2 FALSE 0 0 233 JPTBL 109 000A 2 FALSE 0 0 234 COLD:CONT 158 001E 2 FALSE 0 0 235 MDAT0 172 0025 2 FALSE 0 0 236 COLDNXT 173 0028 2 FALSE 0 0 237 SIOTX 179 0028 2 FALSE 0 0 238 SIORX 180 0028 2 FALSE 0 0 239 NEWLN 181 0028 2 FALSE 0 0 240 PRINT 182 0028 2 FALSE 0 0 241 INPUT 183 0028 2 FALSE 0 0 242 DSPNUM 184 0028 2 FALSE 0 0 243 DSPSGN 185 0028 2 FALSE 0 0 244 DSPHEX 186 0028 2 FALSE 0 0 245 EXPSTR 187 0028 2 FALSE 0 0 246 WRD2HEX 188 0028 2 FALSE 0 0 247 DEC2BN 189 0028 2 FALSE 0 0 248 INKEY 190 0028 2 FALSE 0 0 249 IRQVEC 207 0030 2 FALSE 0 0 250 FLAGTBL 224 0039 2 FALSE 0 0 251 IRQREQ 309 005E 2 FALSE 0 0 252 RBWPTR 333 006F 2 FALSE 0 0 253 RINGB 338 0074 2 FALSE 0 0 254 RINGWR:OVRFL 340 0078 2 FALSE 0 0 255 RINGWR:GETCHR 342 007E 2 FALSE 0 0 256 RINGWR:EXIT 343 0081 2 FALSE 0 0 257 RINGWR:EXIT 346 0086 2 FALSE 0 0 258 SIOCMD 352 0087 2 FALSE 0 0 259 RINGWR:GETCHR 357 008F 2 FALSE 0 0 260 RINGWR:QUIT 358 0092 2 FALSE 0 0 261 RBOVFL 359 0094 2 FALSE 0 0 262 RINGWR:EXIT 362 0099 2 FALSE 0 0 263 SIODAT 365 009C 2 FALSE 0 0 264 SIOCMD 375 00A7 2 FALSE 0 0 265 BKFLAG 405 00AF 2 FALSE 0 0 266 BKADDR 426 00C0 2 FALSE 0 0 267 BKADDR 447 00C3 2 FALSE 0 0 268 VCOUNT 453 00C9 2 FALSE 0 0 269 BKPOINT 454 00CE 2 FALSE 0 0 270 BKFLAG 459 00D0 2 FALSE 0 0 271 FLAGTBL 462 00D4 2 FALSE 0 0 272 BKSAVE 474 00DB 2 FALSE 0 0 273 SIODAT 507 00EF 2 FALSE 0 0 274 SIOINIT 516 00FD 2 FALSE 0 0 275 RBWPTR 525 0104 2 FALSE 0 0 276 RINGB 526 0105 2 FALSE 0 0 277 IRQJMP 531 0108 2 FALSE 0 0 278 IRQVEC 532 010A 2 FALSE 0 0 279 NOIRQ 534 010B 2 FALSE 0 0 280 IRQ7SG 535 010C 2 FALSE 0 0 281 NOIRQ 536 010D 2 FALSE 0 0 282 NOIRQ 537 010E 2 FALSE 0 0 283 NOIRQ 538 010F 2 FALSE 0 0 284 NOIRQ 539 0110 2 FALSE 0 0 285 RINGWR 540 0111 2 FALSE 0 0 286 NOIRQ 541 0112 2 FALSE 0 0 287 NOIRQ 542 0113 2 FALSE 0 0 288 MDAT0 544 0114 2 FALSE 0 0 289 COLDNXT:SKIP 546 0118 2 FALSE 0 0 290 BKADDR 550 011B 2 FALSE 0 0 291 NEWLN 568 012A 2 FALSE 0 0 292 MSG1 569 012C 2 FALSE 0 0 293 PRINT 570 0131 2 FALSE 0 0 294 DPTR 572 0133 2 FALSE 0 0 295 CKSUM 573 0134 2 FALSE 0 0 296 MDAT0 574 0135 2 FALSE 0 0 297 START 576 013A 2 FALSE 0 0 298 MSG3 577 013C 2 FALSE 0 0 299 PRINT 578 0141 2 FALSE 0 0 300 SIOTX 582 0148 2 FALSE 0 0 301 BUFFER1 585 014A 2 FALSE 0 0 302 BUFFER2 586 014C 2 FALSE 0 0 303 INPUT 587 0151 2 FALSE 0 0 304 NEWLN 590 0156 2 FALSE 0 0 305 HEXFILE 594 015B 2 FALSE 0 0 306 TOUPPER 595 0160 2 FALSE 0 0 307 EXPSTR 596 0165 2 FALSE 0 0 308 PKDSTR 597 016A 2 FALSE 0 0 309 SETVARS 600 016F 2 FALSE 0 0 310 VAR1TXT 608 0171 2 FALSE 0 0 311 VAR1 609 0173 2 FALSE 0 0 312 STR2BN 617 017E 2 FALSE 0 0 313 START:LOOP1 624 0186 2 FALSE 0 0 314 VCOUNT 655 0187 2 FALSE 0 0 315 START 657 018B 2 FALSE 0 0 316 VAR1 659 018C 2 FALSE 0 0 317 DUMP 665 0194 2 FALSE 0 0 318 WRITE 667 0198 2 FALSE 0 0 319 READ 669 019C 2 FALSE 0 0 320 ENTER 671 01A0 2 FALSE 0 0 321 FILL 673 01A4 2 FALSE 0 0 322 COPY 675 01A8 2 FALSE 0 0 323 JUMP 677 01AC 2 FALSE 0 0 324 MEMBNK 679 01B0 2 FALSE 0 0 325 BKPOINT 681 01B4 2 FALSE 0 0 326 BKPCONT 683 01B8 2 FALSE 0 0 327 BKPSTEP 685 01BC 2 FALSE 0 0 328 MSGHLP 687 01BE 2 FALSE 0 0 329 PRINT 688 01C3 2 FALSE 0 0 330 START 690 01C6 2 FALSE 0 0 331 HEX2WRD 699 01CC 2 FALSE 0 0 332 XDATA 700 01CD 2 FALSE 0 0 333 ADD2CRC 701 01D2 2 FALSE 0 0 334 HEX2WRD 702 01D7 2 FALSE 0 0 335 XADDR 703 01D8 2 FALSE 0 0 336 ADD2CRC 704 01DD 2 FALSE 0 0 337 HEX2WRD 705 01E2 2 FALSE 0 0 338 XTYPE 706 01E3 2 FALSE 0 0 339 ADD2CRC 708 01E9 2 FALSE 0 0 340 HEXFILE:RXHEX 710 01ED 2 FALSE 0 0 341 HEXFILE:RXEOF 712 01F1 2 FALSE 0 0 342 XERROR 714 01F3 2 FALSE 0 0 343 PRINT 715 01F8 2 FALSE 0 0 344 HEXFILE:EXIT 716 01FB 2 FALSE 0 0 345 HEX2WRD 720 0200 2 FALSE 0 0 346 ADD2CRC 721 0205 2 FALSE 0 0 347 XTRANS 722 0207 2 FALSE 0 0 348 PRINT 723 020C 2 FALSE 0 0 349 XFAIL 724 020E 2 FALSE 0 0 350 XOK 725 0210 2 FALSE 0 0 351 PRINT 728 0217 2 FALSE 0 0 352 CKSUM 730 0219 2 FALSE 0 0 353 HEXFILE:EXIT 731 021C 2 FALSE 0 0 354 XDATA 733 021D 2 FALSE 0 0 355 HEXFILE:HEXERR 735 0221 2 FALSE 0 0 356 BUFFER2 736 0223 2 FALSE 0 0 357 HEX2WRD 737 0228 2 FALSE 0 0 358 ADD2CRC 739 022E 2 FALSE 0 0 359 HEXFILE:LOOP 741 0233 2 FALSE 0 0 360 HEX2WRD 743 0238 2 FALSE 0 0 361 ADD2CRC 744 023D 2 FALSE 0 0 362 HEXFILE:HEXERR 746 0242 2 FALSE 0 0 363 XDATA 750 0243 2 FALSE 0 0 364 BUFFER2 752 0246 2 FALSE 0 0 365 XADDR 753 0247 2 FALSE 0 0 366 HEXFILE:LOOP2 757 024E 2 FALSE 0 0 367 HEXFILE:EXIT 758 0251 2 FALSE 0 0 368 CRCERR 765 0259 2 FALSE 0 0 369 PRINT 766 025E 2 FALSE 0 0 370 RTSON 767 0263 2 FALSE 0 0 371 HEXFILE:LOOPY 768 0266 2 FALSE 0 0 372 START 770 0269 2 FALSE 0 0 373 MSGDU 773 026B 2 FALSE 0 0 374 PRINT 774 0270 2 FALSE 0 0 375 DPTR 775 0271 2 FALSE 0 0 376 VCOUNT 778 0274 2 FALSE 0 0 377 DUMP:NEXT1 780 0279 2 FALSE 0 0 378 DUMP:NEXT2 784 027F 2 FALSE 0 0 379 VAR2 785 0280 2 FALSE 0 0 380 VAR3 786 0281 2 FALSE 0 0 381 DUMP:DISP 788 0285 2 FALSE 0 0 382 DUMP:DISP 791 028A 2 FALSE 0 0 383 VAR2 792 028B 2 FALSE 0 0 384 WRD2HEX 798 0295 2 FALSE 0 0 385 PRINT 799 029A 2 FALSE 0 0 386 SIOTX 801 02A1 2 FALSE 0 0 387 SIOTX 803 02A8 2 FALSE 0 0 388 VFLAG 805 02AA 2 FALSE 0 0 389 WRD2HEX 808 02B0 2 FALSE 0 0 390 PRINT 809 02B5 2 FALSE 0 0 391 SIOTX 811 02BC 2 FALSE 0 0 392 DUMP:EXIT 813 02C0 2 FALSE 0 0 393 VFLAG 814 02C1 2 FALSE 0 0 394 VFLAG 816 02C3 2 FALSE 0 0 395 DUMP:LOOP 818 02C8 2 FALSE 0 0 396 PRINT16 820 02CE 2 FALSE 0 0 397 NEWLN 821 02D3 2 FALSE 0 0 398 DUMP:DISP 822 02D6 2 FALSE 0 0 399 PRINT16 825 02DC 2 FALSE 0 0 400 NEWLN 826 02E1 2 FALSE 0 0 401 DPTR 827 02E2 2 FALSE 0 0 402 START 828 02E5 2 FALSE 0 0 403 MSGWR 831 02E7 2 FALSE 0 0 404 PRINT 832 02EC 2 FALSE 0 0 405 VAR2 833 02ED 2 FALSE 0 0 406 VAR3 834 02EE 2 FALSE 0 0 407 WRD2HEX 836 02F4 2 FALSE 0 0 408 PRINT 837 02F9 2 FALSE 0 0 409 SIOTX 839 0300 2 FALSE 0 0 410 SIOTX 841 0307 2 FALSE 0 0 411 WRD2HEX 843 030D 2 FALSE 0 0 412 PRINT 844 0312 2 FALSE 0 0 413 NEWLN 845 0317 2 FALSE 0 0 414 START 846 031A 2 FALSE 0 0 415 MSGRD 849 031C 2 FALSE 0 0 416 PRINT 850 0321 2 FALSE 0 0 417 VAR2 851 0322 2 FALSE 0 0 418 WRD2HEX 853 0329 2 FALSE 0 0 419 PRINT 854 032E 2 FALSE 0 0 420 SIOTX 856 0335 2 FALSE 0 0 421 SIOTX 858 033C 2 FALSE 0 0 422 WRD2HEX 861 0343 2 FALSE 0 0 423 PRINT 862 0348 2 FALSE 0 0 424 NEWLN 863 034D 2 FALSE 0 0 425 START 864 0350 2 FALSE 0 0 426 MSGEN 867 0352 2 FALSE 0 0 427 PRINT 868 0357 2 FALSE 0 0 428 VAR2 869 0358 2 FALSE 0 0 429 WRD2HEX 871 035F 2 FALSE 0 0 430 PRINT 872 0364 2 FALSE 0 0 431 SIOTX 874 036B 2 FALSE 0 0 432 SIOTX 876 0372 2 FALSE 0 0 433 WRD2HEX 879 0379 2 FALSE 0 0 434 PRINT 880 037E 2 FALSE 0 0 435 SIOTX 882 0385 2 FALSE 0 0 436 BUFFER1 883 0387 2 FALSE 0 0 437 BUFFER2 884 0389 2 FALSE 0 0 438 INPUT 885 038E 2 FALSE 0 0 439 NEWLN 886 0393 2 FALSE 0 0 440 ENTER:SKIP 891 039A 2 FALSE 0 0 441 START 893 039E 2 FALSE 0 0 442 STR2BN 895 03A4 2 FALSE 0 0 443 ENTER:LOOP 899 03AA 2 FALSE 0 0 444 MSGFL 902 03AC 2 FALSE 0 0 445 PRINT 903 03B1 2 FALSE 0 0 446 VCOUNT 904 03B2 2 FALSE 0 0 447 ERROR 906 03B7 2 FALSE 0 0 448 VAR2 907 03B8 2 FALSE 0 0 449 VAR3 908 03B9 2 FALSE 0 0 450 VAR4 909 03BA 2 FALSE 0 0 451 START 913 03C0 2 FALSE 0 0 452 FILL:LOOP 914 03C3 2 FALSE 0 0 453 MSGCP 917 03C5 2 FALSE 0 0 454 PRINT 918 03CA 2 FALSE 0 0 455 VCOUNT 919 03CB 2 FALSE 0 0 456 ERROR 921 03D0 2 FALSE 0 0 457 VAR2 922 03D1 2 FALSE 0 0 458 VAR3 923 03D2 2 FALSE 0 0 459 VAR4 924 03D3 2 FALSE 0 0 460 START 929 03DA 2 FALSE 0 0 461 COPY:LOOP 930 03DD 2 FALSE 0 0 462 MSGJP 933 03DF 2 FALSE 0 0 463 PRINT 934 03E4 2 FALSE 0 0 464 VCOUNT 935 03E5 2 FALSE 0 0 465 ERROR 937 03EA 2 FALSE 0 0 466 VAR2 938 03EB 2 FALSE 0 0 467 START 941 03F1 2 FALSE 0 0 468 MSGMBK 944 03F3 2 FALSE 0 0 469 PRINT 945 03F8 2 FALSE 0 0 470 VCOUNT 946 03F9 2 FALSE 0 0 471 ERROR 948 03FE 2 FALSE 0 0 472 VAR2 949 03FF 2 FALSE 0 0 473 START 952 0403 2 FALSE 0 0 474 VCOUNT 955 0404 2 FALSE 0 0 475 BKPOINT:CONT1 957 0409 2 FALSE 0 0 476 BKADDR 958 040B 2 FALSE 0 0 477 VAR2 959 040C 2 FALSE 0 0 478 START 968 0415 2 FALSE 0 0 479 BKADDR 970 0417 2 FALSE 0 0 480 BKPOINT:CONT2 977 0421 2 FALSE 0 0 481 BRKERR 978 0423 2 FALSE 0 0 482 PRINT 979 0428 2 FALSE 0 0 483 START 980 042B 2 FALSE 0 0 484 MSGBRK 986 0430 2 FALSE 0 0 485 PRINT 987 0435 2 FALSE 0 0 486 WRD2HEX 988 043A 2 FALSE 0 0 487 PRINT 989 043F 2 FALSE 0 0 488 PRTWRD 991 0446 2 FALSE 0 0 489 WRD2HEX 994 044D 2 FALSE 0 0 490 PRINT 995 0452 2 FALSE 0 0 491 NEWLN 996 0457 2 FALSE 0 0 492 START 998 045B 2 FALSE 0 0 493 MSGBKH 1000 045D 2 FALSE 0 0 494 PRINT 1001 0462 2 FALSE 0 0 495 BKSAVE 1003 0466 2 FALSE 0 0 496 SIOTX 1005 046D 2 FALSE 0 0 497 SIOTX 1008 0475 2 FALSE 0 0 498 SIOTX 1010 047C 2 FALSE 0 0 499 WRD2HEX 1012 0482 2 FALSE 0 0 500 PRINT 1013 0487 2 FALSE 0 0 501 SIOTX 1015 048E 2 FALSE 0 0 502 BKPOINT:LOOP3 1017 0492 2 FALSE 0 0 503 NEWLN 1018 0497 2 FALSE 0 0 504 MSGBK2 1019 0499 2 FALSE 0 0 505 PRINT 1020 049E 2 FALSE 0 0 506 WRD2HEX 1022 04A4 2 FALSE 0 0 507 PRINT 1023 04A9 2 FALSE 0 0 508 NEWLN 1024 04AE 2 FALSE 0 0 509 START 1025 04B1 2 FALSE 0 0 510 BKSAVE 1027 04B3 2 FALSE 0 0 511 BKPCONT:CONT 1035 04BA 2 FALSE 0 0 512 BKADDR 1036 04BC 2 FALSE 0 0 513 BKPCONT:EXIT 1039 04C1 2 FALSE 0 0 514 BKADDR 1045 04C3 2 FALSE 0 0 515 START 1050 04CA 2 FALSE 0 0 516 BRKERR 1055 04CF 2 FALSE 0 0 517 PRINT 1056 04D4 2 FALSE 0 0 518 START 1057 04D7 2 FALSE 0 0 519 BKSAVE 1060 04D9 2 FALSE 0 0 520 BKPSTEP:CONT 1068 04DF 2 FALSE 0 0 521 BKADDR 1076 04E8 2 FALSE 0 0 522 BRKERR 1085 04F3 2 FALSE 0 0 523 PRINT 1086 04F8 2 FALSE 0 0 524 START 1087 04FB 2 FALSE 0 0 525 MSGERR 1091 04FD 2 FALSE 0 0 526 PRINT 1092 0502 2 FALSE 0 0 527 START 1093 0505 2 FALSE 0 0 528 CKSUM 1105 0508 2 FALSE 0 0 529 CKSUM 1107 050A 2 FALSE 0 0 530 HEX2WRD:CBYTE 1135 0519 2 FALSE 0 0 531 HEX2WRD:CBYTE 1137 051F 2 FALSE 0 0 532 HEX2WRD:EXIT 1152 0531 2 FALSE 0 0 533 A2HEX 1153 0536 2 FALSE 0 0 534 HEX2WRD:EXIT 1164 0543 2 FALSE 0 0 535 A2HEX 1165 0548 2 FALSE 0 0 536 STR2BN:EXIT 1190 055D 2 FALSE 0 0 537 A2HEX 1195 0566 2 FALSE 0 0 538 STR2BN:EXIT 1202 056F 2 FALSE 0 0 539 A2HEX 1207 0578 2 FALSE 0 0 540 STR2BN:LOOP 1209 057C 2 FALSE 0 0 541 BUFFER1 1230 0588 2 FALSE 0 0 542 BN2HEX 1231 058D 2 FALSE 0 0 543 BN2HEX 1234 0594 2 FALSE 0 0 544 BUFFER1 1237 0598 2 FALSE 0 0 545 VAR1TXT 1254 05A5 2 FALSE 0 0 546 SIOTX 1258 05AD 2 FALSE 0 0 547 PRINT 1259 05B2 2 FALSE 0 0 548 SIOTX 1261 05B9 2 FALSE 0 0 549 NEWLN 1262 05BE 2 FALSE 0 0 550 PRTVARS:LOOP 1266 05C3 2 FALSE 0 0 551 NIB2ASC 1292 05D8 2 FALSE 0 0 552 NIB2ASC 1299 05E1 2 FALSE 0 0 553 NIB2ASC:CONT 1320 05EA 2 FALSE 0 0 554 A2HEX 1340 05F8 2 FALSE 0 0 555 A2HEX 1347 0603 2 FALSE 0 0 556 A2HEX1 1371 0610 2 FALSE 0 0 557 TOUPPER:EXIT 1397 0621 2 FALSE 0 0 558 TOUPPER:LOOP 1404 062A 2 FALSE 0 0 559 EXPSTR:EXIT 1437 0641 2 FALSE 0 0 560 EXPSTR:EXIT 1444 064A 2 FALSE 0 0 561 EXPSTR:LOOP 1446 064E 2 FALSE 0 0 562 PKDSTR:EXIT 1476 0664 2 FALSE 0 0 563 PKDSTR:WRITE 1486 0672 2 FALSE 0 0 564 PKDSTR:LOOP 1489 0678 2 FALSE 0 0 565 PKDSTR:LOOP 1496 067F 2 FALSE 0 0 566 VCOUNT 1526 0691 2 FALSE 0 0 567 VAR1TXT 1532 0693 2 FALSE 0 0 568 VAR2TXT 1537 0699 2 FALSE 0 0 569 SETVARS:EXIT 1541 069E 2 FALSE 0 0 570 VCOUNT 1543 06A0 2 FALSE 0 0 571 SETVARS:EXIT 1550 06A9 2 FALSE 0 0 572 SETVARS:CONT1 1552 06AE 2 FALSE 0 0 573 SETVARS:SETPTR 1556 06B5 2 FALSE 0 0 574 SETVARS:EXIT 1563 06BD 2 FALSE 0 0 575 SETVARS:LOOP 1565 06C2 2 FALSE 0 0 576 VCOUNT 1573 06C8 2 FALSE 0 0 577 SETVARS:LOOP 1575 06CC 2 FALSE 0 0 578 VCOUNT 1577 06CE 2 FALSE 0 0 579 SETVARS:LOOP 1579 06D2 2 FALSE 0 0 580 PRINT:EXIT 1610 06EA 2 FALSE 0 0 581 SIOTX 1612 06EF 2 FALSE 0 0 582 PRINT:EXIT 1618 06F7 2 FALSE 0 0 583 SIOTX 1620 06FC 2 FALSE 0 0 584 PRINT:LOOP 1622 06FF 2 FALSE 0 0 585 PRINT16:DOT 1646 071A 2 FALSE 0 0 586 SIOTX 1647 071F 2 FALSE 0 0 587 PRINT16:DOT 1652 0728 2 FALSE 0 0 588 SIOTX 1653 072D 2 FALSE 0 0 589 PRINT16:EXIT 1656 0731 2 FALSE 0 0 590 PRINT16:LOOP 1657 0734 2 FALSE 0 0 591 BUFFER1 1696 074A 2 FALSE 0 0 592 RINGRD 1699 074F 2 FALSE 0 0 593 SIOTX 1700 0754 2 FALSE 0 0 594 INPUT:EXIT 1705 075B 2 FALSE 0 0 595 INPUT:BKSP0 1707 075F 2 FALSE 0 0 596 INPUT:EXIT 1711 0763 2 FALSE 0 0 597 RINGRD 1714 0768 2 FALSE 0 0 598 SIOTX 1715 076D 2 FALSE 0 0 599 INPUT:EXIT 1719 0773 2 FALSE 0 0 600 INPUT:BKSP1 1722 0777 2 FALSE 0 0 601 INPUT:LOOP 1724 077B 2 FALSE 0 0 602 BUFFER1 1726 077C 2 FALSE 0 0 603 INPUT:LOOP 1727 077F 2 FALSE 0 0 604 PRTWRD 1732 0789 2 FALSE 0 0 605 INPUT:LOWCHR 1733 078C 2 FALSE 0 0 606 PRTWRD 1736 0793 2 FALSE 0 0 607 INPUT:LOOP 1737 0796 2 FALSE 0 0 608 BUFFER1 1742 079B 2 FALSE 0 0 609 PRTWRD 1757 07AA 2 FALSE 0 0 610 SIOTX 1769 07B4 2 FALSE 0 0 611 SIOTX 1771 07BA 2 FALSE 0 0 612 RBWPTR 1792 07C6 2 FALSE 0 0 613 INKEY:EXIT 1796 07CC 2 FALSE 0 0 614 RINGRD 1797 07D1 2 FALSE 0 0 615 RBWPTR 1817 07DF 2 FALSE 0 0 616 RINGRD:CONT 1821 07E6 2 FALSE 0 0 617 RBOVFL 1822 07E8 2 FALSE 0 0 618 RINGRD:WAIT 1826 07EF 2 FALSE 0 0 619 RINGRD:CKCHR 1829 07F6 2 FALSE 0 0 620 RTSON 1830 07FB 2 FALSE 0 0 621 RINGRD:EXIT 1831 07FE 2 FALSE 0 0 622 RBWPTR 1833 0800 2 FALSE 0 0 623 RINGRD:WAIT 1837 0806 2 FALSE 0 0 624 RINGRD:CKCHR 1841 080C 2 FALSE 0 0 625 RINGB 1844 080F 2 FALSE 0 0 626 RINGRD:EXIT 1846 0813 2 FALSE 0 0 627 SIOSTA 1875 0828 2 FALSE 0 0 628 SIORX:LOOP 1880 0831 2 FALSE 0 0 629 SIODAT 1883 0832 2 FALSE 0 0 630 SIOTX 1893 083D 2 FALSE 0 0 631 SIOSTA 1910 084A 2 FALSE 0 0 632 SIOTX:LOOP 1915 0853 2 FALSE 0 0 633 SIODAT 1918 0854 2 FALSE 0 0 634 SIOCMD 1935 085C 2 FALSE 0 0 635 SIOMOD 1938 085E 2 FALSE 0 0 636 SIOMR1 1939 0860 2 FALSE 0 0 637 SIOMR2 1942 0863 2 FALSE 0 0 638 SIOCMD 1945 0865 2 FALSE 0 0 639 SIOCR 1946 0867 2 FALSE 0 0 640 SIOCMD 1966 0870 2 FALSE 0 0 641 SIOCMD 1989 087D 2 FALSE 0 0 642 MSG2 2009 0889 2 FALSE 0 0 643 PRINT 2010 088E 2 FALSE 0 0 644 DSPSGN:DISP 2028 089B 2 FALSE 0 0 645 BIOS 2033 08A5 2 FALSE 0 0 646 DSPNUM 2039 08AD 2 FALSE 0 0 647 DSPNUM:START 2058 08BD 2 FALSE 0 0 648 SIOTX 2060 08C4 2 FALSE 0 0 649 DSPNUM:QUIT 2061 08C7 2 FALSE 0 0 650 DSPNUM:NUM1 2065 08CF 2 FALSE 0 0 651 DSPNUM:NUM1 2067 08D6 2 FALSE 0 0 652 DSPNUM:NUM1 2069 08DD 2 FALSE 0 0 653 DSPNUM:NUM1 2071 08E4 2 FALSE 0 0 654 DSPNUM:NUM1 2073 08EB 2 FALSE 0 0 655 DSPNUM:NUM2 2083 08F8 2 FALSE 0 0 656 DSPNUM:EXIT 2087 08FE 2 FALSE 0 0 657 BIOS 2090 0906 2 FALSE 0 0 658 WRD2HEX 2103 0910 2 FALSE 0 0 659 PRINT 2104 0915 2 FALSE 0 0 660 BUFFER2 2121 0921 2 FALSE 0 0 661 BIOS 2122 0926 2 FALSE 0 0 662 DEC2BN:PLUS 2131 092F 2 FALSE 0 0 663 DEC2BN:CNVERT 2133 0933 2 FALSE 0 0 664 DEC2BN:CHKDIG 2136 0938 2 FALSE 0 0 665 DEC2BN:SIGN 2141 093E 2 FALSE 0 0 666 DEC2BN:ERROR 2143 0943 2 FALSE 0 0 667 DEC2BN:ERROR 2145 0947 2 FALSE 0 0 668 DEC2BN:CNVERT 2156 0952 2 FALSE 0 0 669 DEC2BN:EXIT 2160 0957 2 FALSE 0 0 670 DEC2BN:EXIT 2163 095C 2 FALSE 0 0 Pass 2 - Generate Object Code 1: ; PMON - PISC Monitor 2: ; Monitor Program for the PISC 1.0c 3: ; Stephen Arnold 22-03-2020 4: ; 5: ;---------------------- EQUATES ----------------------------------------------- 6: ; 7: ; PISC v1.0c Memory Map - Note: All memory slots have an entire 16k block 8: ; of address space. 9: ; 10: ; MEM Slot 0 = $0000 - $3FFF 11: ; MEM Slot 1 = $4000 - $7FFF 12: ; MEM Slot 2 = $8000 - $BFFF 13: ; MEM Slot 3 = $C000 - $FFFF 14: ; 15: ; PISC Register Use - The PISC has 8 x Registers R0..R7 16: ; 17: ; R0 = General Purpose - Typical use as input to (and possible output from) a function 18: ; R1 = General Purpose - Typical use as output from function if we do not wish to destroy R0 19: ; R2 = General Purpose 20: ; R3 = General Purpose 21: ; 22: ; R4 = PISC ASM Working - Used by PISC Assembeller as a tempory working varible. Use with care! 23: ; R5 = Stack Pointer - Used by CALL, RETurn, POP and PUSH instructions 24: ; R6 = Interrupt Vector - May be used if interrupts are disabled 25: ; R7 = Program Counter - Post incremented after each hardware encoded fetch instruction 26: ; 27: ; 28: NULL EQU $0000 ;Set NULL value 29: FALSE EQU $0000 ;Set FALSE value 30: TRUE EQU $FFFF ;Set TRUE value 31: ; 32: BUFFER1 EQU $FD00 ;Start of RAM used for keyboard buffer. 32 words 64 characters 33: BUFFER2 EQU $FD20 ;Start of RAM used for keyboard buffer. 64 words 128 characters 34: ; 35: VAR1 EQU $FD60 ;Actual binary variable data. 36: VAR2 EQU $FD61 37: VAR3 EQU $FD62 38: VAR4 EQU $FD63 39: ; 40: VAR1TXT EQU $FD64 ;Text string for each variable extracted 41: VAR2TXT EQU $FD65 ;from command line. 42: VAR3TXT EQU $FD66 43: VAR4TXT EQU $FD67 44: ; 45: VCOUNT EQU $FD68 ;Varible count 46: VFLAG EQU $FD69 ;General purpose Flag variable 47: ; 48: DPTR EQU $FD70 ;Dump routine pointer. Used to track last memory dump location 49: ; 50: CKSUM EQU $FD71 ;16 bit CRC for Hex file transfer routine 51: XDATA EQU $FD72 ;Hex Tranfer Data Count (Number of Words to recieve) 52: XADDR EQU $FD73 ;Hex Tranfer Memory Address 53: XTYPE EQU $FD74 ;Hex Tranfer Record Type 54: ; 55: VAR5 EQU $FD75 ;General purpose short term storage variable 56: ; 57: RINGB EQU $FE40 ;Start Address for SIO Ring Buffer. 58: ;64 x Words. AND with $3F. Ends $FE9F 59: RBWPTR EQU $FE80 ;Ring Buffer Write Pointer 60: RBRPTR EQU $FE81 ;Ring Buffer Read Pointer 61: RBOVFL EQU $FE82 ;Ring Buffer Overflow (High = $0F for Over Flow flag, Low = Char) 62: ; 63: ; 2651 Serial UART Program Bitmap Data 64: ; 65: SIOMR1 EQU %01001110 ;Mode Register 1 = 01 1-Stop, 0 Odd-Parity, 0 Parity-Off, 11 8-Data, 10 16xBaud-Clk 66: SIOMR2 EQU %00111110 ;Mode Register 2 = 00 Not Used, 11 Internal-TX&RX-Clk,1110 9600 Baud 67: SIOCR EQU %00100111 ;Command Register = 00 Normal Operation, 1 RTS-On, 0 Reset-Err, 0 Force-Brk, 1 RX-EN, 1 DTR-On, 1 TX-EN 68: ; 69: ; RAM Addresses for 2651 Serial UART Port locations 70: ; 71: SIODAT EQU $FE83 ;Data Port 72: SIOSTA EQU $FE84 ;Status Port, SYN/DLE Registers - Read=Status, 3 x Write=SYN1/SYN2/DLE 73: SIOMOD EQU $FE85 ;Mode Port 1&2 - 2 x Read/Write. 74: SIOCMD EQU $FE86 ;Command Port 75: ; 76: MDAT0 EQU $FEA6 ;Memory Banking Slot Config Data 0 77: MDAT1 EQU $FEA7 ;Memory Banking Slot Config Data 1 78: MDAT2 EQU $FEA8 ;Memory Banking Slot Config Data 2 79: MDAT3 EQU $FEA9 ;Memory Banking Slot Config Data 3 80: ; 81: BKADDR EQU $FEAA ;Breakpoint Address 82: BKINST EQU $FEAB ;Original Breakpoint Instruction (x1) 83: BKSAVE EQU $FEAC ;Breakpoint Registers R7 to R0 (8 words) 84: BKFLAG EQU $FEB4 ;Breakpoint Flags (1 word) 85: ; 86: IRQVEC EQU $FEB5 ;Start of IRQ Routine Vector Table x 8 words 87: ; 88: ; 89: ;---------------------- MONITOR CODE STARTS HERE ------------------------------ 90: ; 91: PMAIN ORG $0000 ;Start of ROM memory for PISC 92: LOAD $8000 ;Build Hex output file for loading to $8000 0000: BC80 + ld r4,$0015 0001: 0015 0002: 3C9A 93: JMP COLD ;Jump past jump vector and flags tables 94: ;to COLD boot location. Address $0000 95: ; 0003: BC80 + ld r4,$019B 0004: 019B 0005: 3C9A 96: JMP WARM ;Jump past jump vector and flags tables 97: ;to WARM boot location. Address $0003 98: ; 0006: BC80 + ld r4,$00FA 0007: 00FA 0008: 3C9A 99: JMP BREAK ;Known fixed address for entry into Breakpoint 100: ;Routine. Address $0006 101: ; 102: ;---------------------- BIOS CALL STARTS HERE --------------------------------- 103: ; BIOS calls sould enter with R0 containing optional data 104: ; and R1 containing the BIOS function number starting at 0 105: ; Address of BIOS fixed at $0009 and called with jump to 106: ; this location. 107: ; *** NOTE: BIOS Calls destroy R4! 108: ; 0009: BC80 109: BIOS LD R4,JPTBL ;Load base address of Jump Table into R4 000A: 0047 000B: 21E9 110: ADD R4,R1 ;Add function number to Jump Table Offset 000C: A79F 111: RD R4,R7 ;Read function Address into R7 112: ;Causes a JMP to the function address 113: ;Functions RET will return to BIOS caller 114: ; 115: ;---------------------- FLAGS DATA TABLE -------------------------------------- 116: ; 117: ; Flags Data Table 118: ; Used for restoring Flags EQ & CY after IRQ routine 119: ; 120: ;Fixme: Bug! DW $0000,$0000 is not valid. Location counter only set +1 121: ; 000D: 0000 122: FLAGTBL DW $0000 000E: 0000 123: DW $0000 ; EQ = 0, CY = 0 124: ; 000F: FFFF 125: DW $FFFF 0010: 0000 126: DW $0000 ; EQ = 0, CY = 1 127: ; 0011: 0000 128: DW $0000 0012: FFFF 129: DW $FFFF ; EQ = 1, CY = 0 130: ; 0013: FFFF 131: DW $FFFF 0014: FFFF 132: DW $FFFF ; EQ = 1, CY = 1 133: ; 134: ;---------------------- COLD BOOT STARTS HERE --------------------------------- 135: ; 136: ; The following Bank Memory setup always boots from Slot 0 ORG $0000 137: ; to the Monitor BIOS. Slot 0 is normally mapped to ROM Bank #1 (2nd ROM Bank) 138: ; Unless the last key pressed on the keypad was an asterix '*' 139: ; In which case it will boot from ROM Bank #0 (1st ROM Bank) 140: ; This arrangement makes it possible to have a development BIOS in Bank #1 141: ; and a fail-safe BIOS in Bank #0 142: ; 0015: BC80 + ld r4,$0000 0016: 0000 0017: E49F 143: COLD IRQ 0 ; Disable IRQ (Should already be off due to reset) 144: ; 0018: BA80 145: LD R2,$FF10 ;Clear 7-Seg Display to 0000 0000 0019: FF10 001A: 0093 146: ZERO R0 ;Set R0 to zero 001B: 5080 147: WRI R2,R0 ;Hex digit #1 0000 00## to zero. Value from R0-L 001C: 5080 148: WRI R2,R0 ;Hex digit #2 0000 ##00 to zero. Value from R0-H 001D: 5080 149: WRI R2,R0 ;Hex digit #3 00## 0000 to zero. Value from R0-L 001E: 5080 150: WRI R2,R0 ;Hex digit #4 ##00 0000 to zero. Value from R0-H 001F: 509F 151: WR R2 ;Clear 8 x LED's. Value from R0-L 152: ; 0020: BC80 + ld r4,$0100 0021: 0100 0022: E39F 153: MEM $100 ; Turn Memory Banking Off - Probably not required after reboot but... 0023: BC80 + ld r4,$0001 0024: 0001 0025: E39F 154: MEM $01 ; Memory Slot 0 -> Bank 1 (ROM 2nd Bank) 0026: 0C9A 155: MOV R1,R4 ; Save Memory Slot Config 0 in R1. R4 set instr above. 0027: BC80 + ld r4,$FF10 0028: FF10 0029: A09F 156: RD $FF10,R0 ; Read last key pressed on keypad 002A: BC80 + ld r4,$FFEC 002B: FFEC 002C: 0479 157: CMP R0,$FFEC ; FFEC = '*' key 002D: BC80 + ld r4,$0035 002E: 0035 002F: C29F + inf { invert flags } 0030: 3CDA 158: JNE :CONT ; Skip next two instructions if '*' pressed 0031: BC80 + ld r4,$0000 0032: 0000 0033: E39F 159: MEM $00 ; Memory Slot 0 -> Bank 0 (ROM 1st Bank) 0034: 0C9A 160: MOV R1,R4 ; Save Memory Slot Config 0 in R1 (again, overwrite) 0035: BC80 + ld r4,$0019 0036: 0019 0037: E39F 161: :CONT MEM $19 ; Memory Slot 1 -> Bank 9 (RAM 2nd Bank) 0038: BC80 + ld r4,$002A 0039: 002A 003A: E39F 162: MEM $2A ; Memory Slot 2 -> Bank 10 (RAM 3rd Bank) 003B: BC80 + ld r4,$003B 003C: 003B 003D: E39F 163: MEM $3B ; Memory Slot 3 -> Bank 11 (RAM 4th Bank) 003E: BC80 + ld r4,$0300 003F: 0300 0040: E39F 164: MEM $300 ; Slots defined - Now turn Memory Banking On 165: ; 166: ;**** WARNING! Nothing in the BIOS from $0000 to here should be changed! 167: ; As once we have turned on Bank Switching (above) the next instruction could 168: ; flick from being executed in Bank 0 (Boot/Failsafe) to Bank 1. 169: ; The Program Counter remains unchanged so code execution will 170: ; continue in Bank 1 (non-failsafe) from the next instruction. 171: ; 0041: BC80 + ld r4,$FEA6 0042: FEA6 0043: 619F 172: WR MDAT0,R1 ;Save Slot 0 config 0044: BC80 + ld r4,$0140 0045: 0140 0046: 3C9A 173: JMP COLDNXT ;Jump past BIOS jump vector table and ISR routines 174: ;and continue the COLD Boot below 175: ; 176: ;---------------------- BIOS CALLS JUMP VECTOR TABLE ------------------------------------- 177: ; BIOS Calls Jump Vector Table 178: ; 0047: 09D1 179: JPTBL DW SIOTX ;Fn= 0 TX serial Char via SIO 0048: 09A7 180: DW SIORX ;Fn= 1 RX serial Char via SIO 0049: 0919 181: DW NEWLN ;Fn= 2 Output a CR+LF New Line sequence 004A: 083E 182: DW PRINT ;Fn= 3 Print routine 004B: 08B0 183: DW INPUT ;Fn= 4 Input routine 004C: 0A55 184: DW DSPNUM ;Fn= 5 Display 16 bit unsigned number 004D: 0A32 185: DW DSPSGN ;Fn= 6 Display 16 bit signed number 004E: 0AB1 186: DW DSPHEX ;Fn= 7 Display 16 bit value as 4 digit hex number 004F: 076D 187: DW EXPSTR ;Fn= 8 Expand 8 bit ASCII packed string to a string of words 0050: 06A6 188: DW WRD2HEX ;Fn= 9 Convert word in R0 to ASCII R2 -> Hex string 0051: 0AC1 189: DW DEC2BN ;Fn=10 Convert ASCII decimal string to 16 bit binary 0052: 0935 190: DW INKEY ;Fn=11 Check and return char in Read Buffer, Null if none 0053: 0000 191: DW $0000 192: ; 193: ;---------------------- IRQ SERVICE ROUTINES STARTS HERE --------------------------------- 194: ; 195: ISR ;Switch assembeller to using R6 for Program Counter 196: ; 197: ;---------------------- PROCESS IRQ REQUEST ---------------------------------------------- 198: ; IRQ Service Routines *MUST* keep the Stack balanced 199: ; *MUST NOT* alter the contents of R7, R6 or R5 200: ; 0054: B480 + ld r4,$FF00 0055: FF00 0056: A09F 201: IRQREQ RD $FF00,R0 ;Read slot IO base address for IRQ generating card 0057: B480 + ld r4,$00FF 0058: 00FF 0059: 049B 202: AND R0,$00FF ;We only want the lower 8 bits 005A: C09F 203: SHR R0 ;Move upper nibble to lower nibble 005B: C09F 204: SHR R0 ; NB: Five instructions could be removed from ISR 005C: C09F 205: SHR R0 ; if the IRQ hardware returned $0002 005D: C09F 206: SHR R0 ; instead of $FF20 005E: B180 207: LD R1,IRQVEC ;Load R1 with the addr of the IRQ Vector Table 005F: FEB5 0060: 08E9 208: ADD R1,R0 ;Add the computed IRQ card offset into table to R1 0061: 889F 209: RD R1,R0 ;Read IRQ vector for card into R0 210: ; 211: ;Fixme: Bug! CALL function hard coded to 4 words. But CALL R0 with no prior load is only 212: ; two words. 213: ; 214: ; Second bug(?): R7 not being transformed to R6 inside ISR-EISR pseudo ops 215: ; 216: ; CALL R0 ;Call IRQ handler 0062: 2880 + inc r5 0063: 6E9F 217: PUSH R6 ;Simulate CALL instruction for now 0064: 309A 218: MOV R6,R0 219: ; 220: ;---------------------- RETURN FROM IRQ SERVICE ROUTINE ---------------------------------- 221: ; Start by restoring Flags. 0065: A8EF 222: POP R0 ;Flags are now in R0 bits 1&0 as EQ&CY 0066: 00EC 223: SHL R0 ;R0 = R0 * 2 0067: B180 224: LD R1,FLAGTBL ;R1 -> Start of Flag Table 0068: 000D 0069: 08E9 225: ADD R1,R0 ;Add offset into table equal to flag settings 006A: 8A80 226: RDI R1,R2 ;Read 1st control variable into R2 006B: 8B9F 227: RD R1,R3 ;Read 2nd control variable into R3 006C: B480 + ld r4,$FFFF 006D: FFFF 006E: 1479 228: CMP R2,$FFFF ;Is R2 equal to $FFFF? Used to store EQ flag 229: ; 006F: 1349 230: ADC R2,R3 EQ SF ;Add with Carry. CY-IN=EQ, Store Flags 231: ;Flags now restored to previous values 232: ;ADC is F=A+B+CY where ADD is F=A+B+(CY=0) 233: ; 234: ; Next is only for Diags. Write Flags to 7-Seg LED #3 235: ; ZERO R0 ;Clear contents R0 236: ; SLC R0 EQ ;Shift Left with Carry. F=R0+R0+(EQ status in bit 0) 237: ; SLC R0 CY ;Shift Left with Carry. F=R0+R0+(CY status in bit 0) 238: ; WR $FF12,R0 ;Display Flags Value 239: ; 240: ; Now Restore Saved Registers from Stack 241: ; 0070: A8EF 242: POP R0 0071: A9EF 243: POP R1 0072: AAEF 244: POP R2 0073: ABEF 245: POP R3 0074: ACEF 246: POP R4 247: ; 0075: C59F 248: IRQC ;Clear IRQ latch. Returns from IRQ routine. Fetch now from PC in R7 249: ;R6 now -> IRQJMP for the start of the next IRQ call 250: ; 251: ;Start of IRQ request location. IRQ Vector in R6 should point here! 252: ; 253: IRQJMP ;PUSH R7 ;Start by saving machine state, all registers and flags to stack 254: ;PUSH R6 ;But not R7, R6 or R5 255: ;PUSH R5 0076: 2880 + inc r5 0077: 6C9F 256: PUSH R4 ;We must save R4 before its contents get destroyed by the next jump instruction 0078: 2880 + inc r5 0079: 6B9F 257: PUSH R3 007A: 2880 + inc r5 007B: 6A9F 258: PUSH R2 007C: 2880 + inc r5 007D: 699F 259: PUSH R1 007E: 2880 + inc r5 007F: 689F 260: PUSH R0 261: ; 262: ; Now save the two Flags EQ and CY. 263: ; 0080: 0093 264: ZERO R0 ;Clear contents R0 0081: 00CC 265: SLC R0 EQ ;Shift Left with Carry. F=R0+R0+(EQ status in bit 0) 0082: 00AC 266: SLC R0 CY ;Shift Left with Carry. F=R0+R0+(CY status in bit 0) 0083: 2880 + inc r5 0084: 689F 267: PUSH R0 ;Save R0 now containing flags in bits 1&0 as EQ&CY 268: ; 269: ; Next is only for Diags. Write Flags to 7-Seg LED #4 270: ; *** WARNING! Can't do this here as we may be using R7 as PC 271: ; If we are then the auto-added instruction 272: ; ld r4,$FF13 273: ; post increments R6 not R7 and then the machine 274: ; tries to execute data $FF13 as an opcode. 275: ; 276: ; SWP R0 ;Flags need to be in R0-H 277: ; WR $FF13,R0 ;Display Flags Value 278: ; 279: ; Machine state including all registers and flags now saved. 280: ; But did we arrive here by a Breakpoint Jump rather than 281: ; an actual interrupt? 282: ; 283: ; *** WARNING! We can't use LD explicitly or by assembeller expansion 284: ; of something like "MOV R7,BREAK" at this point. As we 285: ; do not know if this code is being executed by R7 or R6 286: ; acting as the program counter. The LD operand makes 287: ; explicit use of one or the other! Dependant on the 288: ; status of the assembeller ISR flag (Pseudo Ops ISR & EISR). 289: ; At this point we are inside the ISR code so R6 is hard coded 290: ; into the LD instruction. But if the machine jumpped into this location 291: ; via a Breakpoint rather than entering because of an 292: ; Interrupt we will be using R7. 293: ; 294: ; So we have to arrive at the Breakpoint vector address without 295: ; using a LD (Load) operand. 296: ; 0085: 0093 297: ZERO R0 0086: 0080 298: INC R0 0087: 0080 299: INC R0 0088: 0080 300: INC R0 0089: 00EC 301: SHL R0 ;R0 should now be 6 = BIOS Breakpoint Vector 302: ; 008A: 279A 303: MOV R4,R7 ;Testing if we are using R7 for the Program Counter? 008B: 2779 304: CMP R4,R7 ;This will NOT be equal if we are! 008C: C29F + inf { invert flags } 008D: 38DA 305: MOV R7,R0 IFN EQ ;This will jump to Break if using R7 as PC 306: ; 307: ; We must be using R6 as PC. So continue to the actual IRQ Request handler 308: ; 008E: B480 + ld r4,$0054 008F: 0054 0090: 349A 309: JMP IRQREQ ;Jump to start of IRQ Request Service Routine 310: ; 311: ;---------------------- NOIRQ - Invalid IRQ Request --------------------------- 312: ; An unsupported/unexpected card raised an IRQ service request 313: ; 0091: B480 + ld r4,$FF00 0092: FF00 0093: A09F 314: NOIRQ RD $FF00,R0 ;Read card address into R0 (again) 0094: B180 315: LD R1,$FF10 ;Port Addr of 7-Seg Display 0095: FF10 0096: 4880 316: WRI R1,R0 ;Display R0-L on digit #1 0097: 4880 317: WRI R1,R0 ;Display R0-H on digit #2 0098: B080 318: LD R0,$E001 ;Error 001 = Invalid IRQ 0099: E001 009A: 4880 319: WRI R1,R0 ;Display R0-H on digit #3 009B: 4880 320: WRI R1,R0 ;Display R0-H on digit #4 009C: C79F 321: HLT ;Halt CPU with R0 on the Addr Bus 322: ; 323: ;---------------------- IRQ7SG - IRQ 7-Seg LED Display Board ------------------ 324: ; Slot $FF10 7 Segment LED display PCB and Keypad. 325: ; 009D: B480 + ld r4,$FF10 009E: FF10 009F: A09F 326: IRQ7SG RD $FF10,R0 ;Read keypad key into R0 00A0: B480 + ld r4,$FF10 00A1: FF10 00A2: 609F 327: WR $FF10,R0 ;Write key value to digit 0 00A3: ACEF 328: RET { rdd r5,r4 } 00A4: 2080 + inc r4 00A5: 349A + jmp r4 329: ; 330: ;---------------------- RINGWR - Ring Buffer Write Routine IRQ Slot #6 -------- 331: ; Slot $FF60 contains 2651 Serial Card 332: ; 00A6: B280 333: RINGWR LD R2,RBWPTR ;Ring Buffer Write Pointer 00A7: FE80 00A8: 9180 334: RDI R2,R1 ;R1 -> Write Head of ring buffer 00A9: 93EF 335: RDD R2,R3 ;R3 -> Read Tail of ring buffer 00AA: 0880 336: INC R1 ;Move Write Head forward one word 00AB: B480 + ld r4,$003F 00AC: 003F 00AD: 0C9B 337: AND R1,$3F ;Constrain Buffer to 64 words cyclic 00AE: B480 + ld r4,$FE40 00AF: FE40 00B0: 0CE9 338: ADD R1,RINGB ;Add back the Ring Buffer base address 00B1: 0B79 339: CMP R1,R3 ;Does the Head = Tail? 00B2: B480 + ld r4,$00C3 00B3: 00C3 00B4: 34DA 340: JEQ :OVRFL ;Yes? Buffer Full. Overflow Char lost! 00B5: 939F 341: RD R2,R3 ;Get back current Write Head Ptr in R3 00B6: 2880 + inc r5 00B7: B480 + ld r4,$00DC 00B8: 00DC 00B9: 6E9F 342: CALL :GETCHR ;Get Char from Serial Port into R0 00BA: 349A + jmp r4 00BB: B480 + ld r4,$00F7 00BC: 00F7 00BD: 34DA 343: JEQ :EXIT ;Was char Ctrl-C? Yes, then Exit 00BE: 589F 344: WR R3,R0 ;Write char to ring buffer. NB: This will store 00## 00BF: 519F 345: WR R2,R1 ;Write new Write Head Pointer to RBWPTR 00C0: B480 + ld r4,$00F7 00C1: 00F7 00C2: 349A 346: JMP :EXIT 347: ; 348: ; Buffer Over Flow Logic. 349: ; Start by turning 'Off' RTS which disables CTS at PC end and stops 350: ; further characters from arriving at the serial port. 351: ; 00C3: B480 + ld r4,$FE86 00C4: FE86 00C5: A09F 352: :OVRFL RD SIOCMD,R0 ;SIO Command Port 00C6: 819F 353: RD R0,R1 ;Read current Command Register settings 00C7: B480 + ld r4,$00DF 00C8: 00DF 00C9: 0C9B 354: AND R1,%11011111 ;RTS Mask for bit 5 00CA: 419F 355: WR R0,R1 ;Write Command Register - Turn OFF RTS 356: ; 00CB: 2880 + inc r5 00CC: B480 + ld r4,$00DC 00CD: 00DC 00CE: 6E9F 357: CALL :GETCHR ;Get Char from Serial Port into R0 00CF: 349A + jmp r4 00D0: B480 + ld r4,$00EF 00D1: 00EF 00D2: 34DA 358: JEQ :QUIT ;Was char Ctrl-C? Yes, then Quit 00D3: B280 359: LD R2,RBOVFL ;Address of Overflow Flag-H/Char-L data 00D4: FE82 00D5: B480 + ld r4,$0F00 00D6: 0F00 00D7: 049E 360: OR R0,$0F00 ;OR Char with high byte OverFlow flag 00D8: 509F 361: WR R2,R0 ;Save Char and Flag to OverFlow word 00D9: B480 + ld r4,$00F7 00DA: 00F7 00DB: 349A 362: JMP :EXIT ;We're done return via exit 363: ; 00DC: 2880 + inc r5 00DD: 699F 364: :GETCHR PUSH R1 ;Save R1 for later 00DE: B480 + ld r4,$FE83 00DF: FE83 00E0: A19F 365: RD SIODAT,R1 ;2651 Data Register 00E1: 889F 366: RD R1,R0 ;RX Char in R0. 00E2: B180 367: LD R1,$00FF ;Mask for low byte only 00E3: 00FF 00E4: 019B 368: AND R0,R1 ;Only keep R0-low 00E5: B480 + ld r4,$0003 00E6: 0003 00E7: 0479 369: CMP R0,$03 ;Is char ETX (aka Ctrl-C)? 00E8: B480 + ld r4,$0003 00E9: 0003 00EA: 3CDA 370: MOV R7,$0003 IF EQ ;Yes? Then set R7 to Jump to Warm Boot Vector 371: ;.. after ISR completes (using R6 at the moment) 00EB: A9EF 372: POP R1 ;Restore R1 00EC: ACEF 373: RET ;Return to caller { rdd r5,r4 } 00ED: 2080 + inc r4 00EE: 349A + jmp r4 374: ; 00EF: B480 + ld r4,$FE86 00F0: FE86 00F1: A09F 375: :QUIT RD SIOCMD,R0 ;Turn on RTS again as Ctrl-C not saved to buffer 00F2: 819F 376: RD R0,R1 ;Read current Command Register settings 00F3: B480 + ld r4,$0020 00F4: 0020 00F5: 0C9E 377: OR R1,%00100000 ;RTS Mask for bit 5 00F6: 419F 378: WR R0,R1 ;Write Command Register - Turn ON RTS 379: 00F7: ACEF 380: :EXIT RET { rdd r5,r4 } 00F8: 2080 + inc r4 00F9: 349A + jmp r4 381: ; 382: ;---------------------- IRQ SERVICE ROUTINES ENDS HERE ------------------------ 383: 384: EISR ;End Interrupt Service Routine 385: ;Switch Assembeller back to R7 for Program Counter 386: ; 387: ;---------------------- BREAKPOINT ROUTINE ------------------------------------ 388: ; 389: ; Arriving here from start of the IRQ Service Routine the stack will look 390: ; like this:- 391: ; 392: ; ;TOS location at time of breakpoint 393: ; R4 394: ; R3 395: ; R2 396: ; R1 397: ; R0 398: ; R5 -> Flags (Top Of Stack Now). 399: ; Free (New location to store next PUSH/CALL data to) 400: ; 401: ;Start by saving all Registers and Flags to the Breakpoint Save area. 402: ;Most values have been pushed to the stack by the ISR routine 403: ;before we arrived here (see above). 404: ; 00FA: BC80 405: BREAK LD R4,BKFLAG ;Bottom of Register & Flags Save area (R7 -> R0, Flags) 00FB: FEB4 00FC: A8EF 406: POP R0 ;R0 now contains flags value 00FD: 60EF 407: WRD R4,R0 ;Save flags 00FE: A8EF 408: POP R0 ;R0 now contains breakpoint R0 value 00FF: 60EF 409: WRD R4,R0 ;Save R0 0100: A8EF 410: POP R0 ;R0 now contains breakpoint R1 value 0101: 60EF 411: WRD R4,R0 ;Save R1 0102: A8EF 412: POP R0 ;R0 now contains breakpoint R2 value 0103: 60EF 413: WRD R4,R0 ;Save R2 0104: A8EF 414: POP R0 ;R0 now contains breakpoint R3 value 0105: 60EF 415: WRD R4,R0 ;Save R3 0106: A8EF 416: POP R0 ;R0 now contains breakpoint R4 value 0107: 60EF 417: WRD R4,R0 ;Save R4 0108: 059A 418: MOV R0,R5 ;Place current R5 value into R0 0109: 60EF 419: WRD R4,R0 ;Save R5. Corrected to time of breakpoint 010A: 66EF 420: WRD R4,R6 ;Save R6. Not changed directly by ISR code 010B: 0C9A 421: MOV R1,R4 ;Save current R4 to R1 as pisc-asm 422: ; needs R4 for internal loads 423: ; 424: ; Now sort out correct value for R7 425: ; 010C: BC80 + ld r4,$FEAA 010D: FEAA 010E: A09F 426: RD BKADDR,R0 ;Retrieve actual breakpoint address 010F: 489F 427: WR R1,R0 ;Save R7 address used to trigger breakpoint 428: ; 429: ; NB: A value of $0000 for BKADDR would indicate that no breakpoint was set 430: ; so we should NOT be here executing this code! 431: ; 432: ;** NB: I don't believe this code block is needed as the actual BKPOINT 433: ; does exactly this at the start of that routine 434: ; 435: ; CMP R0,$0000 ;Is the breakpoint address zero? 436: ; JNE :CONT ;Continue as it is not zero 437: ; LD R2,BRKERR ;Invalid Breakpoint Address 438: ; CALL PRINT 439: ; HLT ;Halt CPU 440: ; 441: ; Breakpoint Save Table values are now all correct. Jump into Monitor 442: ; at the BKPOINT routine 443: ; 444: ; Reset breakpoint instruction back into its original location 445: ; and clear the breakpoint address (flag) 446: ; 0110: B980 447: LD R1,BKADDR ;R1 -> Mem loc. for Breakpoint address 0111: FEAA 0112: 8A9F 448: RD R1,R2 ;R2 -> Mem loc. for Original opcode 0113: BC80 + ld r4,$0000 0114: 0000 0115: 4C80 449: WRI R1,$0000 ;Breakpoint now address erased/cleared 0116: 889F 450: RD R1,R0 ;Read original opcode 0117: 509F 451: WR R2,R0 ;Original opcode restored 0118: 0893 452: ZERO R1 ;Set variable count to "0" for BKPOINT routine 0119: BC80 + ld r4,$FD68 011A: FD68 011B: 619F 453: WR VCOUNT,R1 ;Write variable count 011C: 2880 + inc r5 011D: BC80 + ld r4,$0512 011E: 0512 011F: 6F9F 454: CALL BKPOINT ;Enter monitor by call starting at Breakpoint routine 0120: 3C9A + jmp r4 455: ; 456: ; Now exiting Breakpoint with Kontinue. Start by restoring Flags. 457: ; do restore everything and carry on. 458: ; 0121: BC80 459: LD R4,BKFLAG ;Saved registers and flags table 0122: FEB4 0123: A09F 460: RD R4,R0 ;Flags are now in R0 0124: 00EC 461: SHL R0 ;R0 = R0 * 2 0125: B980 462: LD R1,FLAGTBL ;R1 -> Start of Flag Table 0126: 000D 0127: 08E9 463: ADD R1,R0 ;Add offset into table equal to flag settings 0128: 8A80 464: RDI R1,R2 ;Read 1st control variable into R2 0129: 8B9F 465: RD R1,R3 ;Read 2nd control variable into R3 012A: BC80 + ld r4,$FFFF 012B: FFFF 012C: 1479 466: CMP R2,$FFFF ;Is R2 equal to $FFFF? Used to store EQ flag 467: ; 012D: 1349 468: ADC R2,R3 EQ SF ;Add with Carry. CY-IN=EQ, Store Flags 469: ;Flags now restored to previous values 470: ;ADC is F=A+B+CY where ADD is F=A+B+(CY=0) 471: ; 472: ; Now restore Registers R7 to R0 473: ; 012E: BC80 474: LD R4,BKSAVE ;Saved registers and flags table 012F: FEAC 0130: A09F 475: RD R4,R0 ;R7 now in R0 0131: 2880 + inc r5 0132: 689F 476: PUSH R0 ;Save R7 to stack. 0133: 0093 477: ZERO R0 ;Clear R0 to $0000 0134: 6080 478: WRI R4,R0 ;Write $0000 to R7 in Save Area. Clears Breakpoint Flag 0135: A680 479: RDI R4,R6 ;R6 as IRQ should not change. Unless not using IRQ? 0136: 2080 480: INC R4 ;Skip past Stack Pointer. 0137: A380 481: RDI R4,R3 ;R3 now contains value for R4 at breakpoint 0138: 2880 + inc r5 0139: 6B9F 482: PUSH R3 ;Place the R4 value on the stack 013A: A380 483: RDI R4,R3 ;Restore values for R3 013B: A280 484: RDI R4,R2 ;R2 013C: A180 485: RDI R4,R1 ;R1 013D: A09F 486: RD R4,R0 ;and R0 013E: ACEF 487: POP R4 ;Get correct value of R4 back again 013F: AFEF 488: POP R7 ;Restore R7 value from Stack 489: ;Execution will now jump to instruction 490: ;at original R7 breakpoint address. 491: ;Stack R5 balanced back to correct 492: ;value at time of breakpoint. 493: ; 494: ;---------------------- COLD BOOT CONTINUES HERE ------------------------------ 495: ; 496: ; Only now do we have RAM memory up high to store data 497: ; and establish a stack 498: ; 0140: BD80 499: COLDNXT LD R5,$FEC0 ;R5 used as Stack pointer 0141: FEC0 500: ;Start of Stack set just below top of RAM 501: ;Stack size 64 words = $40 502: ;So start starts at $FF00-$40 = $FEC0 503: ;** Stack grows UP! ** 504: ; 505: ; Set RAM location values for 2651 Serial UART Ports - COM1 506: ; 0142: B880 507: LD R0,SIODAT ;R0 -> Addr holding SIODAT (Start of SIO Port Data Structure) 0143: FE83 0144: BC80 + ld r4,$FF60 0145: FF60 0146: 4480 508: WRI R0,$FF60 ;Data Port 0147: BC80 + ld r4,$FF62 0148: FF62 0149: 4480 509: WRI R0,$FF62 ;Status Port, SYN/DLE Registers - Read=Status, 3 x Write=SYN1/SYN2/DLE 014A: BC80 + ld r4,$FF64 014B: FF64 014C: 4480 510: WRI R0,$FF64 ;Mode Port 1&2 - 2 x Read/Write. 014D: BC80 + ld r4,$FF66 014E: FF66 014F: 4480 511: WRI R0,$FF66 ;Command Port 512: ; 0150: BA80 513: LD R2,$FF10 ;7-Seg Display digit #1 0151: FF10 0152: B880 514: LD R0,$B1 ;Display B1 Hex 0153: 00B1 0154: 5080 515: WRI R2,R0 ;Hex digit #1 0000 00## to 01. Value from R0-L 0155: 2880 + inc r5 0156: BC80 + ld r4,$09ED 0157: 09ED 0158: 6F9F 516: CALL SIOINIT ;Initialize the 2651 Serial UART 0159: 3C9A + jmp r4 015A: BA80 517: LD R2,$FF10 ;7-Seg Display digit #1 015B: FF10 015C: B880 518: LD R0,$B2 ;Display B2 Hex 015D: 00B2 015E: 5080 519: WRI R2,R0 ;Hex digit #1 0000 00## to 01. Value from R0-L 520: ; 521: ; Next we must setup the SIO Ring Buffer Head and Tail Pointers 522: ; Because as soon as we enable IRQ at the end of this next section the 523: ; IRQ SIO Service Routine could start trying to use these pointers! 524: ; 015F: B980 525: LD R1,RBWPTR ; R1 -> Ring Buffer Write Pointer 0160: FE80 0161: BC80 + ld r4,$FE40 0162: FE40 0163: 4C80 526: WRI R1,RINGB ; Buffer Head points to start of ring 0164: 4C9F 527: WR R1,R4 ; Buffer Tail points to start of ring. R4 Set instr above. 528: ; 529: ; Setup for Interrupt Service Requests (IRQ) and then Enable 530: ; 0165: BE80 531: LD R6,IRQJMP ;Init R6 with IRQ jump location 0166: 0076 0167: B880 532: LD R0,IRQVEC ;Load R0 with start of IRQ vector table 0168: FEB5 533: ; 0169: BC80 + ld r4,$0091 016A: 0091 016B: 4480 534: WRI R0,NOIRQ ;IRQ Service routine for card slot 0 $FF00 016C: BC80 + ld r4,$009D 016D: 009D 016E: 4480 535: WRI R0,IRQ7SG ;IRQ Service routine for card slot 1 $FF10 016F: BC80 + ld r4,$0091 0170: 0091 0171: 4480 536: WRI R0,NOIRQ ;IRQ Service routine for card slot 2 $FF20 0172: BC80 + ld r4,$0091 0173: 0091 0174: 4480 537: WRI R0,NOIRQ ;IRQ Service routine for card slot 3 $FF30 0175: BC80 + ld r4,$0091 0176: 0091 0177: 4480 538: WRI R0,NOIRQ ;IRQ Service routine for card slot 4 $FF40 0178: BC80 + ld r4,$0091 0179: 0091 017A: 4480 539: WRI R0,NOIRQ ;IRQ Service routine for card slot 5 $FF50 017B: BC80 + ld r4,$00A6 017C: 00A6 017D: 4480 540: WRI R0,RINGWR ;IRQ Service routine for card slot 6 $FF60 017E: BC80 + ld r4,$0091 017F: 0091 0180: 4480 541: WRI R0,NOIRQ ;IRQ Service routine for card slot 7 $FF70 0181: BC80 + ld r4,$0091 0182: 0091 0183: 4480 542: WRI R0,NOIRQ ;IRQ Service routine for card slot 8 $FF80 543: ; 0184: BC80 + ld r4,$FEA6 0185: FEA6 0186: A19F 544: RD MDAT0,R1 ;Read Slot 0 config data into R1 0187: BC80 + ld r4,$0000 0188: 0000 0189: 0C79 545: CMP R1,$00 ;Are we running FailSafe BIOS? 018A: BC80 + ld r4,$0190 018B: 0190 018C: 3CDA 546: JEQ :SKIP ;Failsafe BIOS - Do NOT enable IRQ 547: ; 018D: BC80 + ld r4,$0001 018E: 0001 018F: E49F 548: IRQ 1 ;Normal BIOS setup all done. Enable IRQ 549: ; 0190: B880 550: :SKIP LD R0,BKADDR ;Clear key breakpoint values 0191: FEAA 0192: BC80 + ld r4,$0000 0193: 0000 0194: 4480 551: WRI R0,$0000 ;BKADDR - Breakpoint address 0195: BC80 + ld r4,$0000 0196: 0000 0197: 4480 552: WRI R0,$0000 ;BKINST - Original instrauction at breakpoint 0198: BC80 + ld r4,$0000 0199: 0000 019A: 4480 553: WRI R0,$0000 ;BKSAVE - Top of Register save area -> R7 554: ; Also used as flag. 555: ; Non-Zero = Breakpoint Triggered. 556: ; 557: ;Note: R7 in save area should always be equal to BKADDR. You cannot set 558: ; memory location $0000 as a valid breakpoint address. 559: ; As this indicates no breakpoint has been set. 560: ; By default this location is a ROM address in any case. 561: ; 562: ;---------------- WARM BOOT/MAIN PROGRAM STARTS HERE -------------------------- 563: ; 019B: BA80 564: WARM LD R2,$FF10 ;7-Seg Display digit #1 019C: FF10 019D: B880 565: LD R0,$B3 ;Display B3 Hex 019E: 00B3 019F: 5080 566: WRI R2,R0 ;Hex digit #1 0000 00## to 01. Value from R0-L 01A0: BD80 567: LD R5,$FEC0 ;Reset R5 Stack pointer to TOS on Warm Boot 01A1: FEC0 01A2: 2880 + inc r5 01A3: BC80 + ld r4,$0919 01A4: 0919 01A5: 6F9F 568: CALL NEWLN ;Start by printing new line CR+LF 01A6: 3C9A + jmp r4 01A7: BA80 569: LD R2,MSG1 ;Signon version message 01A8: 0B17 01A9: 2880 + inc r5 01AA: BC80 + ld r4,$083E 01AB: 083E 01AC: 6F9F 570: CALL PRINT 01AD: 3C9A + jmp r4 01AE: 0093 571: ZERO R0 ;Set R0 to zero 01AF: BC80 + ld r4,$FD70 01B0: FD70 01B1: 609F 572: WR DPTR,R0 ;Init DPTR to Zero 01B2: BC80 + ld r4,$FD71 01B3: FD71 01B4: 609F 573: WR CKSUM,R0 ;Init Checksum to Zero 01B5: BC80 + ld r4,$FEA6 01B6: FEA6 01B7: A09F 574: RD MDAT0,R0 ;Read config data for memory slot 0 01B8: BC80 + ld r4,$0000 01B9: 0000 01BA: 0479 575: CMP R0,$0000 ;Are we running fail-safe BIOS from ROM Bank 0? 01BB: BC80 + ld r4,$01C6 01BC: 01C6 01BD: C29F + inf { invert flags } 01BE: 3CDA 576: JNE START ;No? Just jump to start 01BF: BA80 577: LD R2,MSG3 ;Print Failsafe message 01C0: 0B34 01C1: 2880 + inc r5 01C2: BC80 + ld r4,$083E 01C3: 083E 01C4: 6F9F 578: CALL PRINT 01C5: 3C9A + jmp r4 579: ; 580: ; 01C6: B880 581: START LD R0,'>' ;Display prompt symbol 01C7: 003E 01C8: 2880 + inc r5 01C9: BC80 + ld r4,$09D1 01CA: 09D1 01CB: 6F9F 582: CALL SIOTX 01CC: 3C9A + jmp r4 583: ; 584: ; CALL RTSON ;Turn ON RTS to host to start serial data 01CD: BA80 585: LD R2,BUFFER1 ;Set R2 to 8 bit string buffer 01CE: FD00 01CF: BB80 586: LD R3,BUFFER2 ;Set R3 to 16 bit string buffer 01D0: FD20 01D1: 2880 + inc r5 01D2: BC80 + ld r4,$08B0 01D3: 08B0 01D4: 6F9F 587: CALL INPUT ;Input a line of text 01D5: 3C9A + jmp r4 588: ; 589: ; CALL RTSOFF ;Turn OFF RTS to host to halt serial data 01D6: 2880 + inc r5 01D7: BC80 + ld r4,$0919 01D8: 0919 01D9: 6F9F 590: CALL NEWLN ;Print newline 01DA: 3C9A + jmp r4 591: ; 01DB: 909F 592: RD R2,R0 ;Read command field into R0 01DC: BC80 + ld r4,$3A3A 01DD: 3A3A 01DE: 0479 593: CMP R0,$3A3A ;Hex for '::' Hex file start code 01DF: BC80 + ld r4,$026B 01E0: 026B 01E1: 3CDA 594: JEQ HEXFILE ;RX Hex File line 01E2: 2880 + inc r5 01E3: BC80 + ld r4,$074F 01E4: 074F 01E5: 6F9F 595: CALL TOUPPER ;Convert packed string to all upper case ASCII 01E6: 3C9A + jmp r4 01E7: 2880 + inc r5 01E8: BC80 + ld r4,$076D 01E9: 076D 01EA: 6F9F 596: CALL EXPSTR ;Expand 8 bit char string to 16 bit buffer 01EB: 3C9A + jmp r4 01EC: 2880 + inc r5 01ED: BC80 + ld r4,$0799 01EE: 0799 01EF: 6F9F 597: CALL PKDSTR ;Pack 16 bit into 8 bit string with field delimiters word aligned 01F0: 3C9A + jmp r4 598: ;CALL PRINT ;Print 8 bit buffer now with '$' field delimitors 599: ;CALL NEWLN 01F1: 2880 + inc r5 01F2: BC80 + ld r4,$07D8 01F3: 07D8 01F4: 6F9F 600: CALL SETVARS ;Set pointer values for VAR1TXT..VAR4TXT 01F5: 3C9A + jmp r4 601: ; 602: ;CALL PRTVARS ;Print variables - Diagnostics only 603: ; 604: ; Next logic fills four variables at locations VAR1..VAR4 605: ; VAR1 will contain two ASCII character command. Could single char with null i.e. hh00 606: ; VAR2..4 will be converted from hex string to 16 bit binary value 607: ; 01F6: B980 608: LD R1,VAR1TXT ;Pointer to VAR1TXT string location 01F7: FD64 01F8: BB80 609: LD R3,VAR1 ;Addr in memory where we wish to store VAR1 01F9: FD60 01FA: 8A9F 610: RD R1,R2 01FB: 909F 611: RD R2,R0 ;Read first word from location in VAR?TXT PTR into R0 01FC: 589F 612: WR R3,R0 ;Write R0 unmodified to first variable. This is the two char command 01FD: 0880 613: INC R1 ;Point to next variable text VAR?TXT 01FE: 1880 614: INC R3 ;Point to next variable bit value VAR? 615: ; 01FF: 8A9F 616: :LOOP1 RD R1,R2 ;Read VAR?TXT pointer contents into R2 0200: 2880 + inc r5 0201: BC80 + ld r4,$0670 0202: 0670 0203: 6F9F 617: CALL STR2BN ;Convert string at location R2 into 16 bit binary 0204: 3C9A + jmp r4 0205: 589F 618: WR R3,R0 ;R0 should now contain the binary value. Write it to mem variable 0206: 0880 619: INC R1 ;Point to next variable text VAR?TXT 0207: 1880 620: INC R3 ;Point to next variable bit value VAR? 0208: BC80 + ld r4,$FD64 0209: FD64 020A: 2379 621: CMP $FD64,R3 ;Have we now filled all four variables? 622: ;Fixme: Bug! VAR4+1 emits ld r4,$fd63 and then another 623: ; ld r4,fd64. Probably mucks up Location Counter. 020B: BC80 + ld r4,$01FF 020C: 01FF 020D: C29F + inf { invert flags } 020E: 3CDA 624: JNE :LOOP1 ;..No? Then loop again 625: ; 626: ;------------------------ TEST PRINT VARIABLES ------------------------------ 627: ; 628: ; LD R3,VAR1 ;Reset R3 for test printing to.. 629: ; ;Addr in memory where VAR1 is stored 630: ;:LOOP2 RD R3,R0 ;Read VAR? straight back in for testing 631: ; CALL WRD2HEX ;Convert this value to 4 digit HExidecimal string 632: ; LD R0,'*' ;Print a separator 633: ; CALL SIOTX 634: ; CALL PRINT ;Print value in buffer 635: ; LD R0,'*' ;Print a separator 636: ; CALL SIOTX 637: ; CALL NEWLN ;Print newline 638: ; INC R3 ;Point to next variable bit value VAR? 639: ; CMP $FD64,R3 ;Have we displayed all four variables? 640: ; ;Fixme: Bug! VAR4+1 emits ld r4,$fd63 and then another 641: ; ; ld r4,fd64. Probably mucks up Location Counter. 642: ; JNE :LOOP2 ;..No? Then loop again 643: ; 644: ; RD VCOUNT,R0 ;Read count value into R0 for the next routine 645: ; CALL WRD2HEX ;Convert this value to 4 digit Hexidecimal string 646: ; LD R0,'#' ;Print a separator 647: ; CALL SIOTX 648: ; CALL PRINT ;Print value in buffer 649: ; LD R0,'#' ;Print a separator 650: ; CALL SIOTX 651: ; CALL NEWLN 652: ; 653: ;------------------------------------------------------------------------------ 654: ; 020F: BC80 + ld r4,$FD68 0210: FD68 0211: A09F 655: RD VCOUNT,R0 ;Read current value of VCOUNT 0212: BC80 + ld r4,$0000 0213: 0000 0214: 0479 656: CMP R0,$0000 ;Nothing entered on command line? 0215: BC80 + ld r4,$01C6 0216: 01C6 0217: 3CDA 657: JEQ START ;..Then just go back to the start again 658: ; 0218: BC80 + ld r4,$FD60 0219: FD60 021A: A09F 659: RD VAR1,R0 ;Read command value into R0 021B: B980 660: LD R1,$DF00 ;Only want the first char and in UPPER case 021C: DF00 021D: 089B 661: AND R1,R0 021E: C99F 662: SWP R1 ;R1 now holds 00hh where hh is the command letter 663: ; 021F: BC80 + ld r4,$0044 0220: 0044 0221: 0C79 664: CMP R1,'D' ;Dump command? 0222: BC80 + ld r4,$032C 0223: 032C 0224: 3CDA 665: JEQ DUMP ;..Yes then goto Dump routine 0225: BC80 + ld r4,$0057 0226: 0057 0227: 0C79 666: CMP R1,'W' ;Write command? 0228: BC80 + ld r4,$03C6 0229: 03C6 022A: 3CDA 667: JEQ WRITE ;..Yes then goto Write routine 022B: BC80 + ld r4,$0052 022C: 0052 022D: 0C79 668: CMP R1,'R' ;Read command? 022E: BC80 + ld r4,$03FF 022F: 03FF 0230: 3CDA 669: JEQ READ ;..Yes then goto Read routine 0231: BC80 + ld r4,$0045 0232: 0045 0233: 0C79 670: CMP R1,'E' ;Enter command? 0234: BC80 + ld r4,$0437 0235: 0437 0236: 3CDA 671: JEQ ENTER ;..Yes then goto Enter routine 0237: BC80 + ld r4,$0046 0238: 0046 0239: 0C79 672: CMP R1,'F' ;Fill command? 023A: BC80 + ld r4,$0499 023B: 0499 023C: 3CDA 673: JEQ FILL ;..Yes then goto Fill routine 023D: BC80 + ld r4,$0043 023E: 0043 023F: 0C79 674: CMP R1,'C' ;Copy command? 0240: BC80 + ld r4,$04BC 0241: 04BC 0242: 3CDA 675: JEQ COPY ;..Yes then goto Copy routine 0243: BC80 + ld r4,$004A 0244: 004A 0245: 0C79 676: CMP R1,'J' ;Jump command? 0246: BC80 + ld r4,$04E0 0247: 04E0 0248: 3CDA 677: JEQ JUMP ;..Yes then goto Jump routine 0249: BC80 + ld r4,$004D 024A: 004D 024B: 0C79 678: CMP R1,'M' ;Memory Banking command? 024C: BC80 + ld r4,$04FA 024D: 04FA 024E: 3CDA 679: JEQ MEMBNK ;..Yes then goto Memory Bank routine 024F: BC80 + ld r4,$0042 0250: 0042 0251: 0C79 680: CMP R1,'B' ;Breakpoint command? 0252: BC80 + ld r4,$0512 0253: 0512 0254: 3CDA 681: JEQ BKPOINT ;..Yes then goto Breakpoint routine 0255: BC80 + ld r4,$004B 0256: 004B 0257: 0C79 682: CMP R1,'K' ;Breakpoint Kontinue command? 0258: BC80 + ld r4,$05C8 0259: 05C8 025A: 3CDA 683: JEQ BKPCONT ;..Yes then goto Breakpoint Kontinue routine 025B: BC80 + ld r4,$0053 025C: 0053 025D: 0C79 684: CMP R1,'S' ;Breakpoint Step command? 025E: BC80 + ld r4,$05F0 025F: 05F0 0260: 3CDA 685: JEQ BKPSTEP ;..Yes then goto Breakpoint Step routine 686: ; 0261: BA80 687: LD R2,MSGHLP ;Non valid command. Display help message 0262: 0BC4 0263: 2880 + inc r5 0264: BC80 + ld r4,$083E 0265: 083E 0266: 6F9F 688: CALL PRINT 0267: 3C9A + jmp r4 689: 0268: BC80 + ld r4,$01C6 0269: 01C6 026A: 3C9A 690: JMP START ;Repeat main program forever 691: ; 692: ;-------------------------- Hex File Receive ---------------------------------- 693: ; 694: ; We hack serial comms here to slow things down by Turning OFF RTS at start 695: ; and back on again at the end of line processing. 696: ; A more general "fix" in Serial IRQ ISR routine is needed! 697: ; 026B: 1080 698: HEXFILE INC R2 ;Move R2 past the '::' Start Code 026C: 2880 + inc r5 026D: BC80 + ld r4,$0631 026E: 0631 026F: 6F9F 699: CALL HEX2WRD ;Convert first 4 hex digits to 16 bit word 0270: 3C9A + jmp r4 0271: BC80 + ld r4,$FD72 0272: FD72 0273: 609F 700: WR XDATA,R0 ;Save returned value to Data word count 0274: 2880 + inc r5 0275: BC80 + ld r4,$0624 0276: 0624 0277: 6F9F 701: CALL ADD2CRC ;Add R0 to cumulative CRC value 0278: 3C9A + jmp r4 0279: 2880 + inc r5 027A: BC80 + ld r4,$0631 027B: 0631 027C: 6F9F 702: CALL HEX2WRD ;Convert next 4 hex digits to 16 bit word 027D: 3C9A + jmp r4 027E: BC80 + ld r4,$FD73 027F: FD73 0280: 609F 703: WR XADDR,R0 ;Save returned value to load memory Address 0281: 2880 + inc r5 0282: BC80 + ld r4,$0624 0283: 0624 0284: 6F9F 704: CALL ADD2CRC ;Add R0 to cumulative CRC value 0285: 3C9A + jmp r4 0286: 2880 + inc r5 0287: BC80 + ld r4,$0631 0288: 0631 0289: 6F9F 705: CALL HEX2WRD ;Convert next 4 hex digits to 16 bit word 028A: 3C9A + jmp r4 028B: BC80 + ld r4,$FD74 028C: FD74 028D: 609F 706: WR XTYPE,R0 ;Save returned value to record Type 028E: 089A 707: MOV R1,R0 ;Grab copy of R0 before ADD2CRC changes it 028F: 2880 + inc r5 0290: BC80 + ld r4,$0624 0291: 0624 0292: 6F9F 708: CALL ADD2CRC ;Add R0 to cumulative CRC value 0293: 3C9A + jmp r4 0294: BC80 + ld r4,$0010 0295: 0010 0296: 0C79 709: CMP R1,$0010 ;Is this a data record? 0297: BC80 + ld r4,$02CF 0298: 02CF 0299: 3CDA 710: JEQ :RXHEX ;..Yes? Then jump to Hex Data 029A: BC80 + ld r4,$0011 029B: 0011 029C: 0C79 711: CMP R1,$0011 ;Is this a End Of File record? 029D: BC80 + ld r4,$02AA 029E: 02AA 029F: 3CDA 712: JEQ :RXEOF ;Process EOF record 713: ; 02A0: BA80 714: LD R2,XERROR ;Bin file record type unknown 02A1: 0B8D 02A2: 2880 + inc r5 02A3: BC80 + ld r4,$083E 02A4: 083E 02A5: 6F9F 715: CALL PRINT ;Display error 02A6: 3C9A + jmp r4 02A7: BC80 + ld r4,$0329 02A8: 0329 02A9: 3C9A 716: JMP :EXIT ;Exit this routine 717: ; 718: ;Process EOF Record 719: ; 02AA: 2880 + inc r5 02AB: BC80 + ld r4,$0631 02AC: 0631 02AD: 6F9F 720: :RXEOF CALL HEX2WRD ;This should be the checksum 02AE: 3C9A + jmp r4 02AF: 2880 + inc r5 02B0: BC80 + ld r4,$0624 02B1: 0624 02B2: 6F9F 721: CALL ADD2CRC ;Add R0 to cumulative CRC value 02B3: 3C9A + jmp r4 02B4: BA80 722: LD R2,XTRANS ;Display "Transfer" message 02B5: 0B95 02B6: 2880 + inc r5 02B7: BC80 + ld r4,$083E 02B8: 083E 02B9: 6F9F 723: CALL PRINT 02BA: 3C9A + jmp r4 02BB: BA80 724: LD R2,XFAIL ;Setup for "Failed" message 02BC: 0BA1 02BD: B980 725: LD R1,XOK ;R1 now holds address of XOK message 02BE: 0B9A 02BF: BC80 + ld r4,$0000 02C0: 0000 02C1: 0479 726: CMP R0,$0000 ;Valid record? Store EQ flag 02C2: 11DA 727: MOV R2,R1 IF EQ ;Setup R2 for "Success" message if Checksum zero 02C3: 2880 + inc r5 02C4: BC80 + ld r4,$083E 02C5: 083E 02C6: 6F9F 728: CALL PRINT ;Print transfer result 02C7: 3C9A + jmp r4 02C8: 0093 729: ZERO R0 ;Reset Checksum for next time 02C9: BC80 + ld r4,$FD71 02CA: FD71 02CB: 609F 730: WR CKSUM,R0 ;Init Checksum to Zero 02CC: BC80 + ld r4,$0329 02CD: 0329 02CE: 3C9A 731: JMP :EXIT ;Exit this routine 732: ; 02CF: BC80 + ld r4,$FD72 02D0: FD72 02D1: A19F 733: :RXHEX RD XDATA,R1 ;Load number of data words into R1 02D2: 086F 734: DEC R1 SF ;Offset by one as test below aborts at -1 02D3: BC80 + ld r4,$030C 02D4: 030C 02D5: 3CDA 735: JEQ :HEXERR ;Number of bytes set to zero. Jump to error 02D6: BB80 736: LD R3,BUFFER2 ;Use BUFFER2 for output memory data 02D7: FD20 02D8: 2880 + inc r5 02D9: BC80 + ld r4,$0631 02DA: 0631 02DB: 6F9F 737: :LOOP CALL HEX2WRD ;Convert next 4 hex digits to 16 bit word 02DC: 3C9A + jmp r4 02DD: 5880 738: WRI R3,R0 ;Save output to BUFFER2 02DE: 2880 + inc r5 02DF: BC80 + ld r4,$0624 02E0: 0624 02E1: 6F9F 739: CALL ADD2CRC ;Add R0 to cumulative CRC value 02E2: 3C9A + jmp r4 02E3: 086F 740: DEC R1 SF ;Decrement data word count and Store Flags 02E4: BC80 + ld r4,$02D8 02E5: 02D8 02E6: C29F + inf { invert flags } 02E7: 3CDA 741: JNE :LOOP ;Keep going until all data processed 742: ; 02E8: 2880 + inc r5 02E9: BC80 + ld r4,$0631 02EA: 0631 02EB: 6F9F 743: CALL HEX2WRD ;Next word should be checksum returned in R0 02EC: 3C9A + jmp r4 02ED: 2880 + inc r5 02EE: BC80 + ld r4,$0624 02EF: 0624 02F0: 6F9F 744: CALL ADD2CRC ;Add R0 to cumulative CRC value 02F1: 3C9A + jmp r4 02F2: BC80 + ld r4,$0000 02F3: 0000 02F4: 0479 745: CMP R0,$0000 ;Checksum should always be zero if successful! 02F5: BC80 + ld r4,$030C 02F6: 030C 02F7: C29F + inf { invert flags } 02F8: 3CDA 746: JNE :HEXERR ;..We have a transfer error 747: ; 748: ;CRC Pass - Successful data transfer - Now write data to memory 749: ; 02F9: BC80 + ld r4,$FD72 02FA: FD72 02FB: A19F 750: RD XDATA,R1 ;Load number of data words into R1 02FC: 08EF 751: DEC R1 ;Offset by one as test below aborts at -1 02FD: BB80 752: LD R3,BUFFER2 ;Point R3 to start of BUFFER2 again 02FE: FD20 02FF: BC80 + ld r4,$FD73 0300: FD73 0301: A29F 753: RD XADDR,R2 ;Point R2 to memory location to load data 0302: 9880 754: :LOOP2 RDI R3,R0 ;Read R3 -> source data into R0 0303: 5080 755: WRI R2,R0 ;Write data to R2 -> Memory 0304: 086F 756: DEC R1 SF ;Decrement data word count and Store Flags 0305: BC80 + ld r4,$0302 0306: 0302 0307: C29F + inf { invert flags } 0308: 3CDA 757: JNE :LOOP2 ;Keep going until all data processed 0309: BC80 + ld r4,$0329 030A: 0329 030B: 3C9A 758: JMP :EXIT ;Exit this routine 759: ; 030C: BC80 + ld r4,$FF10 030D: FF10 030E: 609F 760: :HEXERR WR $FF10,R0 ;Display R0 030F: BC80 + ld r4,$FF11 0310: FF11 0311: 609F 761: WR $FF11,R0 0312: B880 762: LD R0,$E002 ;Error 2 0313: E002 0314: BC80 + ld r4,$FF12 0315: FF12 0316: 609F 763: WR $FF12,R0 0317: BC80 + ld r4,$FF13 0318: FF13 0319: 609F 764: WR $FF13,R0 031A: BA80 765: LD R2,CRCERR ;Display CRC Error message 031B: 0B87 031C: 2880 + inc r5 031D: BC80 + ld r4,$083E 031E: 083E 031F: 6F9F 766: CALL PRINT 0320: 3C9A + jmp r4 0321: 2880 + inc r5 0322: BC80 + ld r4,$0A14 0323: 0A14 0324: 6F9F 767: CALL RTSON ;Turn ON RTS to host to start serial data 0325: 3C9A + jmp r4 0326: BC80 + ld r4,$0326 0327: 0326 0328: 3C9A 768: :LOOPY JMP :LOOPY ;Hang here. Ctrl-C warm boot may get out? 769: ; 0329: BC80 + ld r4,$01C6 032A: 01C6 032B: 3C9A 770: :EXIT JMP START ;Jump to start again 771: ; 772: ;------------------------------------------------------------------------------ 032C: BA80 773: DUMP LD R2,MSGDU 032D: 0B5E 032E: 2880 + inc r5 032F: BC80 + ld r4,$083E 0330: 083E 0331: 6F9F 774: CALL PRINT 0332: 3C9A + jmp r4 0333: BC80 + ld r4,$FD70 0334: FD70 0335: A19F 775: RD DPTR,R1 ;R1 now equal to last dump location 0336: 199A 776: MOV R3,R1 ;R3 end location now the same 0337: BC80 + ld r4,$0080 0338: 0080 0339: 1CE9 777: ADD R3,$0080 ;R3 now + $0080 above start 033A: BC80 + ld r4,$FD68 033B: FD68 033C: A09F 778: RD VCOUNT,R0 ;R0 now equal to number of parameters 033D: BC80 + ld r4,$0004 033E: 0004 033F: 0479 779: CMP R0,4 ;Were four (or more) parameters supplied? 0340: BC80 + ld r4,$0345 0341: 0345 0342: C29F + inf { invert flags } 0343: 3CDA 780: JNE :NEXT1 ;..No? keep going 0344: 00EF 781: DEC R0 ;We don't need 4 so ignore the last 782: ; 0345: BC80 + ld r4,$0003 0346: 0003 0347: 0479 783: :NEXT1 CMP R0,3 ;Three parameters? 0348: BC80 + ld r4,$0356 0349: 0356 034A: C29F + inf { invert flags } 034B: 3CDA 784: JNE :NEXT2 ;..No? Jump next test 034C: BC80 + ld r4,$FD61 034D: FD61 034E: A19F 785: RD VAR2,R1 ;Start addr in R1 034F: BC80 + ld r4,$FD62 0350: FD62 0351: A39F 786: RD VAR3,R3 ;End addr in R3 0352: 1880 787: INC R3 ;Adjust +1 because display loop uses postincrement 0353: BC80 + ld r4,$0364 0354: 0364 0355: 3C9A 788: JMP :DISP 789: ; 0356: BC80 + ld r4,$0002 0357: 0002 0358: 0479 790: :NEXT2 CMP R0,2 ;Were two parameters passed? 0359: BC80 + ld r4,$0364 035A: 0364 035B: C29F + inf { invert flags } 035C: 3CDA 791: JNE :DISP ;..No? We'll run with defaults 035D: BC80 + ld r4,$FD61 035E: FD61 035F: A19F 792: RD VAR2,R1 ;Start addr supplied we'll use it 0360: 199A 793: MOV R3,R1 ;No end addr so we'll use start 0361: BC80 + ld r4,$0080 0362: 0080 0363: 1CE9 794: ADD R3,$0080 ;..with $0080 hex added as end addr 795: ; 0364: 2880 + inc r5 0365: 699F 796: :DISP PUSH R1 ;Save the line start mem location for later 0366: 019A 797: MOV R0,R1 ;R0 now equal to current memory location 0367: 2880 + inc r5 0368: BC80 + ld r4,$06A6 0369: 06A6 036A: 6F9F 798: CALL WRD2HEX ;Convert this value to 4 digit Hexidecimal string 036B: 3C9A + jmp r4 036C: 2880 + inc r5 036D: BC80 + ld r4,$083E 036E: 083E 036F: 6F9F 799: CALL PRINT ;Print value in buffer 0370: 3C9A + jmp r4 0371: B880 800: LD R0,':' ;Print a separator 0372: 003A 0373: 2880 + inc r5 0374: BC80 + ld r4,$09D1 0375: 09D1 0376: 6F9F 801: CALL SIOTX 0377: 3C9A + jmp r4 0378: B880 802: LD R0,$20 0379: 0020 037A: 2880 + inc r5 037B: BC80 + ld r4,$09D1 037C: 09D1 037D: 6F9F 803: CALL SIOTX 037E: 3C9A + jmp r4 037F: 0093 804: ZERO R0 ;VFLAG used to track 8 values (0..7) to display per line 0380: BC80 + ld r4,$FD69 0381: FD69 0382: 609F 805: WR VFLAG,R0 ;Ran out of Registers. 806: ; 0383: 8880 807: :LOOP RDI R1,R0 ;Word to display in R0 0384: 2880 + inc r5 0385: BC80 + ld r4,$06A6 0386: 06A6 0387: 6F9F 808: CALL WRD2HEX ;Convert this value to 4 digit Hexidecimal string 0388: 3C9A + jmp r4 0389: 2880 + inc r5 038A: BC80 + ld r4,$083E 038B: 083E 038C: 6F9F 809: CALL PRINT ;Print value in buffer 038D: 3C9A + jmp r4 038E: B880 810: LD R0,$20 ;Print a space separator 038F: 0020 0390: 2880 + inc r5 0391: BC80 + ld r4,$09D1 0392: 09D1 0393: 6F9F 811: CALL SIOTX 0394: 3C9A + jmp r4 0395: 1979 812: CMP R3,R1 ;Reached the end? 0396: BC80 + ld r4,$03B5 0397: 03B5 0398: 3CDA 813: JEQ :EXIT ;..Yes? Then exit dump 0399: BC80 + ld r4,$FD69 039A: FD69 039B: A09F 814: RD VFLAG,R0 ;Retrieve number of values displayed this line 039C: 0080 815: INC R0 ;Increase by one 039D: BC80 + ld r4,$FD69 039E: FD69 039F: 609F 816: WR VFLAG,R0 ;Update the vflag variable 03A0: BC80 + ld r4,$0008 03A1: 0008 03A2: 0479 817: CMP R0,8 ;Have we displayed 8 values? 03A3: BC80 + ld r4,$0383 03A4: 0383 03A5: C29F + inf { invert flags } 03A6: 3CDA 818: JNE :LOOP ;..No? Then loop again for another value 03A7: AAEF 819: POP R2 ;Retrieve the start location of this line 03A8: 2880 + inc r5 03A9: BC80 + ld r4,$086B 03AA: 086B 03AB: 6F9F 820: CALL PRINT16 ;Now display the ASCII version of the data 03AC: 3C9A + jmp r4 03AD: 2880 + inc r5 03AE: BC80 + ld r4,$0919 03AF: 0919 03B0: 6F9F 821: CALL NEWLN ;Terminate the line with CR+LF 03B1: 3C9A + jmp r4 03B2: BC80 + ld r4,$0364 03B3: 0364 03B4: 3C9A 822: JMP :DISP ;Now start a new line 823: ; 03B5: AAEF 824: :EXIT POP R2 ;Retrieve the start location of this line 03B6: 2880 + inc r5 03B7: BC80 + ld r4,$086B 03B8: 086B 03B9: 6F9F 825: CALL PRINT16 ;Now display the last line of ASCII data 03BA: 3C9A + jmp r4 03BB: 2880 + inc r5 03BC: BC80 + ld r4,$0919 03BD: 0919 03BE: 6F9F 826: CALL NEWLN ;Terminate the line with CR+LF 03BF: 3C9A + jmp r4 03C0: BC80 + ld r4,$FD70 03C1: FD70 03C2: 619F 827: WR DPTR,R1 ;DPTR now equal to last dump Addr+1 03C3: BC80 + ld r4,$01C6 03C4: 01C6 03C5: 3C9A 828: JMP START 829: ; 830: ;------------------------------------------------------------------------------ 03C6: BA80 831: WRITE LD R2,MSGWR 03C7: 0B6A 03C8: 2880 + inc r5 03C9: BC80 + ld r4,$083E 03CA: 083E 03CB: 6F9F 832: CALL PRINT 03CC: 3C9A + jmp r4 03CD: BC80 + ld r4,$FD61 03CE: FD61 03CF: A09F 833: RD VAR2,R0 ;Addr in R0 03D0: BC80 + ld r4,$FD62 03D1: FD62 03D2: A19F 834: RD VAR3,R1 ;Data in R1 03D3: 419F 835: WR R0,R1 ;Write data to address 03D4: 2880 + inc r5 03D5: BC80 + ld r4,$06A6 03D6: 06A6 03D7: 6F9F 836: CALL WRD2HEX ;Convert this value to 4 digit Hexidecimal string 03D8: 3C9A + jmp r4 03D9: 2880 + inc r5 03DA: BC80 + ld r4,$083E 03DB: 083E 03DC: 6F9F 837: CALL PRINT ;Print value in buffer 03DD: 3C9A + jmp r4 03DE: B880 838: LD R0,':' ;Print a separator 03DF: 003A 03E0: 2880 + inc r5 03E1: BC80 + ld r4,$09D1 03E2: 09D1 03E3: 6F9F 839: CALL SIOTX 03E4: 3C9A + jmp r4 03E5: B880 840: LD R0,$20 03E6: 0020 03E7: 2880 + inc r5 03E8: BC80 + ld r4,$09D1 03E9: 09D1 03EA: 6F9F 841: CALL SIOTX 03EB: 3C9A + jmp r4 03EC: 019A 842: MOV R0,R1 ;Copy Data value to R0 03ED: 2880 + inc r5 03EE: BC80 + ld r4,$06A6 03EF: 06A6 03F0: 6F9F 843: CALL WRD2HEX ;Convert this value to 4 digit Hexidecimal string 03F1: 3C9A + jmp r4 03F2: 2880 + inc r5 03F3: BC80 + ld r4,$083E 03F4: 083E 03F5: 6F9F 844: CALL PRINT ;Print value in buffer 03F6: 3C9A + jmp r4 03F7: 2880 + inc r5 03F8: BC80 + ld r4,$0919 03F9: 0919 03FA: 6F9F 845: CALL NEWLN 03FB: 3C9A + jmp r4 03FC: BC80 + ld r4,$01C6 03FD: 01C6 03FE: 3C9A 846: JMP START 847: ; 848: ;------------------------------------------------------------------------------ 03FF: BA80 849: READ LD R2,MSGRD 0400: 0B62 0401: 2880 + inc r5 0402: BC80 + ld r4,$083E 0403: 083E 0404: 6F9F 850: CALL PRINT 0405: 3C9A + jmp r4 0406: BC80 + ld r4,$FD61 0407: FD61 0408: A09F 851: RD VAR2,R0 ;Addr in R0 0409: 2880 + inc r5 040A: 689F 852: PUSH R0 ;Save for later 040B: 2880 + inc r5 040C: BC80 + ld r4,$06A6 040D: 06A6 040E: 6F9F 853: CALL WRD2HEX ;Convert this value to 4 digit Hex string 040F: 3C9A + jmp r4 0410: 2880 + inc r5 0411: BC80 + ld r4,$083E 0412: 083E 0413: 6F9F 854: CALL PRINT ;Print value in buffer 0414: 3C9A + jmp r4 0415: B880 855: LD R0,':' ;Print a separator 0416: 003A 0417: 2880 + inc r5 0418: BC80 + ld r4,$09D1 0419: 09D1 041A: 6F9F 856: CALL SIOTX 041B: 3C9A + jmp r4 041C: B880 857: LD R0,$20 041D: 0020 041E: 2880 + inc r5 041F: BC80 + ld r4,$09D1 0420: 09D1 0421: 6F9F 858: CALL SIOTX 0422: 3C9A + jmp r4 0423: A9EF 859: POP R1 ;Restore Addr to read 0424: 889F 860: RD R1,R0 ;Data read into R0 0425: 2880 + inc r5 0426: BC80 + ld r4,$06A6 0427: 06A6 0428: 6F9F 861: CALL WRD2HEX ;Convert this value to 4 digit Hex string 0429: 3C9A + jmp r4 042A: 2880 + inc r5 042B: BC80 + ld r4,$083E 042C: 083E 042D: 6F9F 862: CALL PRINT ;Print value in buffer 042E: 3C9A + jmp r4 042F: 2880 + inc r5 0430: BC80 + ld r4,$0919 0431: 0919 0432: 6F9F 863: CALL NEWLN 0433: 3C9A + jmp r4 0434: BC80 + ld r4,$01C6 0435: 01C6 0436: 3C9A 864: JMP START 865: ; 866: ;------------------------------------------------------------------------------ 0437: BA80 867: ENTER LD R2,MSGEN 0438: 0B66 0439: 2880 + inc r5 043A: BC80 + ld r4,$083E 043B: 083E 043C: 6F9F 868: CALL PRINT 043D: 3C9A + jmp r4 043E: BC80 + ld r4,$FD61 043F: FD61 0440: A09F 869: RD VAR2,R0 ;Addr in R0 0441: 2880 + inc r5 0442: 689F 870: :LOOP PUSH R0 ;Save for later 0443: 2880 + inc r5 0444: BC80 + ld r4,$06A6 0445: 06A6 0446: 6F9F 871: CALL WRD2HEX ;Convert this value to 4 digit Hex string 0447: 3C9A + jmp r4 0448: 2880 + inc r5 0449: BC80 + ld r4,$083E 044A: 083E 044B: 6F9F 872: CALL PRINT ;Print value in buffer 044C: 3C9A + jmp r4 044D: B880 873: LD R0,':' ;Print a separator 044E: 003A 044F: 2880 + inc r5 0450: BC80 + ld r4,$09D1 0451: 09D1 0452: 6F9F 874: CALL SIOTX 0453: 3C9A + jmp r4 0454: B880 875: LD R0,$20 0455: 0020 0456: 2880 + inc r5 0457: BC80 + ld r4,$09D1 0458: 09D1 0459: 6F9F 876: CALL SIOTX 045A: 3C9A + jmp r4 045B: A9EF 877: POP R1 ;Restore Addr to read 045C: 889F 878: RD R1,R0 ;Data read into R0 045D: 2880 + inc r5 045E: BC80 + ld r4,$06A6 045F: 06A6 0460: 6F9F 879: CALL WRD2HEX ;Convert this value to 4 digit Hex string 0461: 3C9A + jmp r4 0462: 2880 + inc r5 0463: BC80 + ld r4,$083E 0464: 083E 0465: 6F9F 880: CALL PRINT ;Print value in buffer 0466: 3C9A + jmp r4 0467: B880 881: LD R0,$20 0468: 0020 0469: 2880 + inc r5 046A: BC80 + ld r4,$09D1 046B: 09D1 046C: 6F9F 882: CALL SIOTX 046D: 3C9A + jmp r4 046E: BA80 883: LD R2,BUFFER1 ;Set R2 to 8 bit string buffer 046F: FD00 0470: BB80 884: LD R3,BUFFER2 ;Set R3 to 16 bit string buffer 0471: FD20 0472: 2880 + inc r5 0473: BC80 + ld r4,$08B0 0474: 08B0 0475: 6F9F 885: CALL INPUT ;Input a line of text 0476: 3C9A + jmp r4 0477: 2880 + inc r5 0478: BC80 + ld r4,$0919 0479: 0919 047A: 6F9F 886: CALL NEWLN ;Print newline 047B: 3C9A + jmp r4 047C: 909F 887: RD R2,R0 ;Read command field into R0 047D: C19F 888: SWP R0 ;Only interested in first character 047E: BC80 + ld r4,$00FF 047F: 00FF 0480: 049B 889: AND R0,$00FF ;Mask for Low Byte Only 0481: BC80 + ld r4,$0000 0482: 0000 0483: 0479 890: CMP R0,$0000 ;Nothing entered? 0484: BC80 + ld r4,$0494 0485: 0494 0486: 3CDA 891: JEQ :SKIP ;Then skip to the next word 0487: BC80 + ld r4,$002E 0488: 002E 0489: 0479 892: CMP R0,'.' ;Period entered? 048A: BC80 + ld r4,$01C6 048B: 01C6 048C: 3CDA 893: JEQ START ;Yes? We're done. Jump to monitor Start loop 048D: 909F 894: RD R2,R0 ;Some other value. Read data into R0 again 048E: 2880 + inc r5 048F: BC80 + ld r4,$0670 0490: 0670 0491: 6F9F 895: CALL STR2BN ;Convert string at location R2 into 16 bit binary 0492: 3C9A + jmp r4 0493: 489F 896: WR R1,R0 ;R0 should now contain the binary value. Write it to memory 0494: 0880 897: :SKIP INC R1 ;Point to next word location 0495: 019A 898: MOV R0,R1 ;Save it back to R0 for next cycle 0496: BC80 + ld r4,$0441 0497: 0441 0498: 3C9A 899: JMP :LOOP ;Go do it again all over again 900: ; 901: ;------------------------------------------------------------------------------ 0499: BA80 902: FILL LD R2,MSGFL 049A: 0B6E 049B: 2880 + inc r5 049C: BC80 + ld r4,$083E 049D: 083E 049E: 6F9F 903: CALL PRINT 049F: 3C9A + jmp r4 04A0: BC80 + ld r4,$FD68 04A1: FD68 04A2: A09F 904: RD VCOUNT,R0 ;Check that we have all four parameters 04A3: BC80 + ld r4,$0004 04A4: 0004 04A5: 0479 905: CMP R0,4 ;Four parameters supplied? 04A6: BC80 + ld r4,$061A 04A7: 061A 04A8: C29F + inf { invert flags } 04A9: 3CDA 906: JNE ERROR ;We have the wrong number of parameters 04AA: BC80 + ld r4,$FD61 04AB: FD61 04AC: A19F 907: RD VAR2,R1 ;Start Addr in R1 04AD: BC80 + ld r4,$FD62 04AE: FD62 04AF: A29F 908: RD VAR3,R2 ;Stop Addr in R2 04B0: BC80 + ld r4,$FD63 04B1: FD63 04B2: A39F 909: RD VAR4,R3 ;Fill Data in R3 04B3: 1080 910: INC R2 ;Because we post increment bump end addr up one 04B4: 4B80 911: :LOOP WRI R1,R3 ;Write data to dest at R1 04B5: 0A79 912: CMP R1,R2 ;Have we reach the end? 04B6: BC80 + ld r4,$01C6 04B7: 01C6 04B8: 3CDA 913: JEQ START ;..Yes? The we are done 04B9: BC80 + ld r4,$04B4 04BA: 04B4 04BB: 3C9A 914: JMP :LOOP ;Loop until complete 915: ; 916: ;------------------------------------------------------------------------------ 04BC: BA80 917: COPY LD R2,MSGCP 04BD: 0B72 04BE: 2880 + inc r5 04BF: BC80 + ld r4,$083E 04C0: 083E 04C1: 6F9F 918: CALL PRINT 04C2: 3C9A + jmp r4 04C3: BC80 + ld r4,$FD68 04C4: FD68 04C5: A09F 919: RD VCOUNT,R0 ;Check that we have all four parameters 04C6: BC80 + ld r4,$0004 04C7: 0004 04C8: 0479 920: CMP R0,4 04C9: BC80 + ld r4,$061A 04CA: 061A 04CB: C29F + inf { invert flags } 04CC: 3CDA 921: JNE ERROR ;We have the wrong number of parameters 04CD: BC80 + ld r4,$FD61 04CE: FD61 04CF: A19F 922: RD VAR2,R1 ;Source Addr in R1 04D0: BC80 + ld r4,$FD62 04D1: FD62 04D2: A29F 923: RD VAR3,R2 ;Dest Addr in R2 04D3: BC80 + ld r4,$FD63 04D4: FD63 04D5: A39F 924: RD VAR4,R3 ;Length in R3 04D6: 18EF 925: DEC R3 ;Loop terminates at -1 so we adjust by one 04D7: 8880 926: :LOOP RDI R1,R0 ;Read source data into R0 04D8: 5080 927: WRI R2,R0 ;Write data to dest at R2 04D9: 186F 928: DEC R3 SF ;Decrement the word count and store flags 04DA: BC80 + ld r4,$01C6 04DB: 01C6 04DC: 3CDA 929: JEQ START ;We are done 04DD: BC80 + ld r4,$04D7 04DE: 04D7 04DF: 3C9A 930: JMP :LOOP ;Loop until complete 931: ; 932: ;------------------------------------------------------------------------------ 04E0: BA80 933: JUMP LD R2,MSGJP 04E1: 0B76 04E2: 2880 + inc r5 04E3: BC80 + ld r4,$083E 04E4: 083E 04E5: 6F9F 934: CALL PRINT 04E6: 3C9A + jmp r4 04E7: BC80 + ld r4,$FD68 04E8: FD68 04E9: A09F 935: RD VCOUNT,R0 ;Check that we have exactly two parameters 04EA: BC80 + ld r4,$0002 04EB: 0002 04EC: 0479 936: CMP R0,2 04ED: BC80 + ld r4,$061A 04EE: 061A 04EF: C29F + inf { invert flags } 04F0: 3CDA 937: JNE ERROR ;We have the wrong number of parameters 04F1: BC80 + ld r4,$FD61 04F2: FD61 04F3: A19F 938: RD VAR2,R1 ;Target jump Addr in R1 04F4: 2880 + inc r5 04F5: 6F9F 939: PUSH R7 ;Set this up as if it were a CALL 04F6: 399A 940: MOV R7,R1 ;Update R7 aka PC to new Addr - Do it! 04F7: BC80 + ld r4,$01C6 04F8: 01C6 04F9: 3C9A 941: JMP START ;On the off chance we return then back to start 942: ; 943: ;------------------------------------------------------------------------------ 04FA: BA80 944: MEMBNK LD R2,MSGMBK 04FB: 0B79 04FC: 2880 + inc r5 04FD: BC80 + ld r4,$083E 04FE: 083E 04FF: 6F9F 945: CALL PRINT 0500: 3C9A + jmp r4 0501: BC80 + ld r4,$FD68 0502: FD68 0503: A09F 946: RD VCOUNT,R0 ;Check that we have exactly two parameters 0504: BC80 + ld r4,$0002 0505: 0002 0506: 0479 947: CMP R0,2 0507: BC80 + ld r4,$061A 0508: 061A 0509: C29F + inf { invert flags } 050A: 3CDA 948: JNE ERROR ;We have the wrong number of parameters 050B: BC80 + ld r4,$FD61 050C: FD61 050D: A19F 949: RD VAR2,R1 ;Variable 2 now in R1 050E: CB9F 950: MEM R1 ;Use VAR2 to set Slot Memory Banking 951: ; Example VAR2 = $19 would be Memory Slot 1 -> Bank 9 (RAM 2nd Bank) 050F: BC80 + ld r4,$01C6 0510: 01C6 0511: 3C9A 952: JMP START 953: ; 954: ;------------------------------------------------------------------------------ 0512: BC80 + ld r4,$FD68 0513: FD68 0514: A09F 955: BKPOINT RD VCOUNT,R0 ;Check that we have exactly two parameters 0515: BC80 + ld r4,$0002 0516: 0002 0517: 0479 956: CMP R0,2 0518: BC80 + ld r4,$052A 0519: 052A 051A: C29F + inf { invert flags } 051B: 3CDA 957: JNE :CONT1 ;We're not setting a breakpoint. Carry on. 051C: BA80 958: LD R2,BKADDR ;R2 -> Stored Breakpoint Address 051D: FEAA 051E: BC80 + ld r4,$FD61 051F: FD61 0520: A19F 959: RD VAR2,R1 ;New Breakpoint Addr to set in R1 0521: 5180 960: WRI R2,R1 ;Breakpoint Addr Stored 0522: 889F 961: RD R1,R0 ;Read original opcode 0523: 5080 962: WRI R2,R0 ;Save original opcode 963: ; WR R2,$0000 ;Clear R7 data value at top of BKSAVE area 964: ; this is used as a flag to track trigger 965: ; of the breakpoint 0524: BA80 966: LD R2,$3E9A ;Replace opcode with 'MOV R7,R6' 0525: 3E9A 0526: 4A9F 967: WR R1,R2 ;Write Break Opcode to Breakpoint Addr 0527: BC80 + ld r4,$01C6 0528: 01C6 0529: 3C9A 968: JMP START ;Back to monitor 969: ; 052A: BA80 970: :CONT1 LD R2,BKADDR ;Read breakpoint set address 052B: FEAA 052C: 9080 971: RDI R2,R0 ; saved in Register save area 052D: 1080 972: INC R2 ;Skip over original opcode word 052E: 919F 973: RD R2,R1 ;Read triggered address from R7 in save area 052F: 119A 974: MOV R2,R1 ;Save R1 into R2 0530: 109E 975: OR R2,R0 ;Combine both values with OR 0531: 106F 976: DEC R2 SF ;Was R2=Zero? Now equal to -1 two's complement if it was. 0532: BC80 + ld r4,$0540 0533: 0540 0534: C29F + inf { invert flags } 0535: 3CDA 977: JNE :CONT2 ;We have have either a set or triggered breakpoint 0536: BA80 978: LD R2,BRKERR ;Invalid Breakpoint Address 0537: 0BB9 0538: 2880 + inc r5 0539: BC80 + ld r4,$083E 053A: 083E 053B: 6F9F 979: CALL PRINT 053C: 3C9A + jmp r4 053D: BC80 + ld r4,$01C6 053E: 01C6 053F: 3C9A 980: JMP START ;Stay in monitor 981: ; 982: ; NB: A value of $0000 for BKSAVE would indicate that no breakpoint has been triggered 983: ; 0540: 019E 984: :CONT2 OR R0,R1 ;Not sure if Break Set or Triggered. So just OR them. 0541: 2880 + inc r5 0542: 689F 985: PUSH R0 ;Save break address in R0 for later 0543: BA80 986: LD R2,MSGBRK ;Display Break message and location 0544: 0BA6 0545: 2880 + inc r5 0546: BC80 + ld r4,$083E 0547: 083E 0548: 6F9F 987: CALL PRINT 0549: 3C9A + jmp r4 054A: 2880 + inc r5 054B: BC80 + ld r4,$06A6 054C: 06A6 054D: 6F9F 988: CALL WRD2HEX ;Convert R0 to 4 digit Hexidecimal string 054E: 3C9A + jmp r4 054F: 2880 + inc r5 0550: BC80 + ld r4,$083E 0551: 083E 0552: 6F9F 989: CALL PRINT ;Print value in buffer 0553: 3C9A + jmp r4 0554: B880 990: LD R0,$3A20 ;Set R0 = ": " 0555: 3A20 0556: 2880 + inc r5 0557: BC80 + ld r4,$0926 0558: 0926 0559: 6F9F 991: CALL PRTWRD 055A: 3C9A + jmp r4 055B: AAEF 992: POP R2 ;Get back break address into R2 055C: 909F 993: RD R2,R0 ;Read current opcode at addr R2 into R0 055D: 2880 + inc r5 055E: BC80 + ld r4,$06A6 055F: 06A6 0560: 6F9F 994: CALL WRD2HEX ;Convert R0 to 4 digit Hexidecimal string 0561: 3C9A + jmp r4 0562: 2880 + inc r5 0563: BC80 + ld r4,$083E 0564: 083E 0565: 6F9F 995: CALL PRINT ;Print value in buffer 0566: 3C9A + jmp r4 0567: 2880 + inc r5 0568: BC80 + ld r4,$0919 0569: 0919 056A: 6F9F 996: CALL NEWLN ;Print new line CR+LF combo 056B: 3C9A + jmp r4 056C: BC80 + ld r4,$0000 056D: 0000 056E: 0C79 997: CMP R1,$0000 ;Breakpoint Triggered? i.e. Saved R7 address non-zero? 056F: BC80 + ld r4,$01C6 0570: 01C6 0571: 3CDA 998: JEQ START ;No! Jump back to monitor. 999: ; 0572: BA80 1000: LD R2,MSGBKH ;Load Breakpoint Header Message 0573: 0BAE 0574: 2880 + inc r5 0575: BC80 + ld r4,$083E 0576: 083E 0577: 6F9F 1001: CALL PRINT 0578: 3C9A + jmp r4 0579: B980 1002: LD R1,7 ;0-7 Registers 057A: 0007 057B: BB80 1003: LD R3,BKSAVE ;Display breakpoint saved registers and flags 057C: FEAC 057D: B880 1004: :LOOP3 LD R0,'R' ;Display 'R' lead-in for Register number 057E: 0052 057F: 2880 + inc r5 0580: BC80 + ld r4,$09D1 0581: 09D1 0582: 6F9F 1005: CALL SIOTX 0583: 3C9A + jmp r4 0584: B880 1006: LD R0,$30 ;ASCII '0' 0585: 0030 0586: 01E9 1007: ADD R0,R1 ;Adjust R0 for Register number 0587: 2880 + inc r5 0588: BC80 + ld r4,$09D1 0589: 09D1 058A: 6F9F 1008: CALL SIOTX ;Print register number 058B: 3C9A + jmp r4 058C: B880 1009: LD R0,'=' ;Print an '=' sign 058D: 003D 058E: 2880 + inc r5 058F: BC80 + ld r4,$09D1 0590: 09D1 0591: 6F9F 1010: CALL SIOTX 0592: 3C9A + jmp r4 0593: 9880 1011: RDI R3,R0 0594: 2880 + inc r5 0595: BC80 + ld r4,$06A6 0596: 06A6 0597: 6F9F 1012: CALL WRD2HEX ;Convert this value to 4 digit Hexidecimal string 0598: 3C9A + jmp r4 0599: 2880 + inc r5 059A: BC80 + ld r4,$083E 059B: 083E 059C: 6F9F 1013: CALL PRINT ;Print value in buffer 059D: 3C9A + jmp r4 059E: B880 1014: LD R0,$20 ;Print a space separator character. Fixme: ' ' returns Null 059F: 0020 05A0: 2880 + inc r5 05A1: BC80 + ld r4,$09D1 05A2: 09D1 05A3: 6F9F 1015: CALL SIOTX 05A4: 3C9A + jmp r4 05A5: 086F 1016: DEC R1 SF ;Decrement R1 and store flags 05A6: BC80 + ld r4,$057D 05A7: 057D 05A8: 3CBA 1017: JCY :LOOP3 05A9: 2880 + inc r5 05AA: BC80 + ld r4,$0919 05AB: 0919 05AC: 6F9F 1018: CALL NEWLN 05AD: 3C9A + jmp r4 05AE: BA80 1019: LD R2,MSGBK2 ;Flags message 05AF: 0BAA 05B0: 2880 + inc r5 05B1: BC80 + ld r4,$083E 05B2: 083E 05B3: 6F9F 1020: CALL PRINT 05B4: 3C9A + jmp r4 05B5: 989F 1021: RD R3,R0 05B6: 2880 + inc r5 05B7: BC80 + ld r4,$06A6 05B8: 06A6 05B9: 6F9F 1022: CALL WRD2HEX ;Convert this value to 4 digit Hexidecimal string 05BA: 3C9A + jmp r4 05BB: 2880 + inc r5 05BC: BC80 + ld r4,$083E 05BD: 083E 05BE: 6F9F 1023: CALL PRINT ;Print value in buffer 05BF: 3C9A + jmp r4 05C0: 2880 + inc r5 05C1: BC80 + ld r4,$0919 05C2: 0919 05C3: 6F9F 1024: CALL NEWLN 05C4: 3C9A + jmp r4 05C5: BC80 + ld r4,$01C6 05C6: 01C6 05C7: 3C9A 1025: JMP START ;Jump back to START of monitor 1026: ;------------------------------------------------------------------------------ 05C8: BA80 1027: BKPCONT LD R2,BKSAVE ;Retrieve actual breakpoint address from 05C9: FEAC 05CA: 909F 1028: RD R2,R0 ;save area R7 at break now in R0 1029: ; 1030: ; NB: A value of $0000 for BKSAVE would indicate that no breakpoint event 1031: ; was triggered. 1032: ; 05CB: 0893 1033: ZERO R1 ;Set R1 to zero 05CC: 0179 1034: CMP R0,R1 ;Is the triggered breakpoint address zero? 05CD: BC80 + ld r4,$05E3 05CE: 05E3 05CF: C29F + inf { invert flags } 05D0: 3CDA 1035: JNE :CONT ;No? Then Continue back to suspended program 05D1: BA80 1036: LD R2,BKADDR ;Retrieve current set breakpoint address 05D2: FEAA 05D3: 909F 1037: RD R2,R0 05D4: 0179 1038: CMP R0,R1 ;Is the set breakpoint address zero? 05D5: BC80 + ld r4,$05E6 05D6: 05E6 05D7: 3CDA 1039: JEQ :EXIT ;Yes? No breakpoint set. Display error and exit 1040: ; 1041: ; Flow to here means Breakpoint set but not triggered. So just clear it 1042: ; Reset current breakpoint instruction back into its original location 1043: ; and clear the breakpoint address (flag) 1044: ; 05D8: B980 1045: LD R1,BKADDR ;R1 -> Mem loc. for Breakpoint address 05D9: FEAA 05DA: 8A9F 1046: RD R1,R2 ;R2 -> Mem loc. for Original opcode 05DB: BC80 + ld r4,$0000 05DC: 0000 05DD: 4C80 1047: WRI R1,$0000 ;Breakpoint now address erased/cleared 05DE: 889F 1048: RD R1,R0 ;Read original opcode 05DF: 509F 1049: WR R2,R0 ;Original opcode restored 05E0: BC80 + ld r4,$01C6 05E1: 01C6 05E2: 3C9A 1050: JMP START ;Stay in monitor 1051: ; 1052: ; 05E3: ACEF 1053: :CONT RET ;Exit Monitor by Return to breakpoint caller { rdd r5,r4 } 05E4: 2080 + inc r4 05E5: 3C9A + jmp r4 1054: ; 05E6: BA80 1055: :EXIT LD R2,BRKERR ;No Breakpoint address currently set 05E7: 0BB9 05E8: 2880 + inc r5 05E9: BC80 + ld r4,$083E 05EA: 083E 05EB: 6F9F 1056: CALL PRINT 05EC: 3C9A + jmp r4 05ED: BC80 + ld r4,$01C6 05EE: 01C6 05EF: 3C9A 1057: JMP START ;Stay in monitor 1058: ; 1059: ;------------------------------------------------------------------------------ 05F0: BA80 1060: BKPSTEP LD R2,BKSAVE ;Retrieve actual breakpoint address from 05F1: FEAC 05F2: 919F 1061: RD R2,R1 ;Save area R7 at break now in R0 1062: ; 1063: ; NB: A value of $0000 for BKSAVE would indicate that no breakpoint event 1064: ; was triggered. 1065: ; 05F3: 0093 1066: ZERO R0 ;Set R0 to zero 05F4: 0879 1067: CMP R1,R0 ;Is the triggered breakpoint address zero? 05F5: BC80 + ld r4,$0610 05F6: 0610 05F7: 3CDA 1068: JEQ :CONT ;Continue to error as no breakpoint triggered 05F8: 889F 1069: RD R1,R0 ;R0 now contains opcode at breakpoint 05F9: BC80 + ld r4,$F8FF 05FA: F8FF 05FB: 049B 1070: AND R0,%1111100011111111 ;Mask for the LD (load) opcode 05FC: BC80 + ld r4,$B880 05FD: B880 05FE: 0479 1071: CMP R0,%1011100010000000 ;LD opcode 05FF: 0093 1072: ZERO R0 ;R0 now zero 0600: BC80 + ld r4,$0001 0601: 0001 0602: 04DA 1073: MOV R0,$0001 IF EQ ;R0 now '1' only if this is a LD opcode 0603: 08E9 1074: ADD R1,R0 ;Add R0 to R1. Increments by one if LD command 0604: 0880 1075: INC R1 ;Point to next executable memory opcode word 0605: BA80 1076: LD R2,BKADDR ;R2 -> Stored Breakpoint Address 0606: FEAA 0607: 5180 1077: WRI R2,R1 ;Breakpoint Addr Stored 0608: 889F 1078: RD R1,R0 ;Read original opcode 0609: 5080 1079: WRI R2,R0 ;Save original opcode 060A: BA80 1080: LD R2,$3E9A ;Replace opcode with 'MOV R7,R6' 060B: 3E9A 060C: 4A9F 1081: WR R1,R2 ;Write Break Opcode to Breakpoint Addr 060D: ACEF 1082: :EXIT RET ;Step out of Monitor by return to breakpoint caller { rdd r5,r4 } 060E: 2080 + inc r4 060F: 3C9A + jmp r4 1083: ; should now step to the next instruction 1084: ; 0610: BA80 1085: :CONT LD R2,BRKERR ;No Breakpoint address currently set 0611: 0BB9 0612: 2880 + inc r5 0613: BC80 + ld r4,$083E 0614: 083E 0615: 6F9F 1086: CALL PRINT 0616: 3C9A + jmp r4 0617: BC80 + ld r4,$01C6 0618: 01C6 0619: 3C9A 1087: JMP START ;Stay in monitor 1088: ; 1089: ; 1090: ;------------------------------------------------------------------------------ 061A: BA80 1091: ERROR LD R2,MSGERR ;Display error message 061B: 0B40 061C: 2880 + inc r5 061D: BC80 + ld r4,$083E 061E: 083E 061F: 6F9F 1092: CALL PRINT 0620: 3C9A + jmp r4 0621: BC80 + ld r4,$01C6 0622: 01C6 0623: 3C9A 1093: JMP START 1094: ; 1095: ;============================================================================== 1096: ;Name : ADD2CRC 1097: ; Build 16 bit CRC (Cyclic Redundancy Check) Value 1098: ; Entry: R0 = 16 bit value to add to Checksum 1099: ; Exit: CKSUM Memory address updated with new checksum 1100: ; R0 = Current checksum value 1101: ; 1102: ; Destroyed: R0 as return value 1103: ;============================================================================== 0624: 2880 + inc r5 0625: 699F 1104: ADD2CRC PUSH R1 ;Save R1 0626: BC80 + ld r4,$FD71 0627: FD71 0628: A19F 1105: RD CKSUM,R1 ;Read current checksum value 0629: 01E9 1106: ADD R0,R1 ;Add current to new R0 value 062A: BC80 + ld r4,$FD71 062B: FD71 062C: 609F 1107: WR CKSUM,R0 ;Write R0 value back to memory 062D: A9EF 1108: POP R1 ;Restore R1 062E: ACEF 1109: RET { rdd r5,r4 } 062F: 2080 + inc r4 0630: 3C9A + jmp r4 1110: ; 1111: ;============================================================================== 1112: ;Name : HEX2WRD 1113: ; Convert four Hexidecimal characters to a 16 bit binary word 1114: ; Entry: R2 -> two consecutive words containing 4 x Hex chars 1115: ; Exit: R0 contains 16 bit value 1116: ; R2 -> next unread word in buffer 1117: ; (NB: R2 would normally return as R2+2 but may be less 1118: ; as it will halt at any Null encountered) 1119: ; 1120: ; Destroyed: R0 1121: ; 1122: ; *** NB: This code nearly identical to the STR2BN function. 1123: ; STR2BN converts arbitary length hex strings to binary 1124: ; value max size 16 bits. While HEW2WRD is fixed at four hex digits 1125: ; and does not check validity of the input hex chars. 1126: ; Functions HEX2WRD and STR2BN should be refactored combining 1127: ; common elements. 1128: ;============================================================================== 1129: ; 0631: 2880 + inc r5 0632: 699F 1130: HEX2WRD PUSH R1 0633: 2880 + inc r5 0634: 6B9F 1131: PUSH R3 1132: ; 0635: 1893 1133: ZERO R3 ;Used to hold binary return value 0636: 909F 1134: RD R2,R0 ;Read first word 0637: 2880 + inc r5 0638: BC80 + ld r4,$0648 0639: 0648 063A: 6F9F 1135: CALL :CBYTE ;Convert first word to high byte 063B: 3C9A + jmp r4 063C: 909F 1136: RD R2,R0 ;Read second word 063D: 2880 + inc r5 063E: BC80 + ld r4,$0648 063F: 0648 0640: 6F9F 1137: CALL :CBYTE ;Convert second word to low byte 0641: 3C9A + jmp r4 1138: ; 0642: 039A 1139: MOV R0,R3 ;Move return value back into R0 0643: ABEF 1140: POP R3 0644: A9EF 1141: POP R1 0645: ACEF 1142: RET ;Return to caller { rdd r5,r4 } 0646: 2080 + inc r4 0647: 3C9A + jmp r4 1143: ; 0648: 18EC 1144: :CBYTE SHL R3 ;Move value up ready for next char 0649: 18EC 1145: SHL R3 ;First time through loop this is a total 064A: 18EC 1146: SHL R3 ;..waste of time as R3 = Null 064B: 18EC 1147: SHL R3 ;..But it keeps the code simpler! 064C: C19F 1148: SWP R0 ;Place high nibble at R0-L 064D: B980 1149: LD R1,$00FF ;Test if Null string termination reached 064E: 00FF 064F: 089B 1150: AND R1,R0 0650: 086F 1151: DEC R1 SF 0651: BC80 + ld r4,$066D 0652: 066D 0653: 3CDA 1152: JEQ :EXIT 0654: 2880 + inc r5 0655: BC80 + ld r4,$0739 0656: 0739 0657: 6F9F 1153: CALL A2HEX ;Convert high character 0658: 3C9A + jmp r4 0659: 199E 1154: OR R3,R1 ;Store R1 value into low nibble R3 1155: ; 065A: 18EC 1156: SHL R3 ;Move value up ready for next char 065B: 18EC 1157: SHL R3 ;First time through loop this is a total 065C: 18EC 1158: SHL R3 ;..waste of time as R3 = Null 065D: 18EC 1159: SHL R3 ;..But it keeps the code simpler! 065E: C19F 1160: SWP R0 ;Switch low nibble back into R0-L 065F: B980 1161: LD R1,$00FF ;Test if Null string termination reached 0660: 00FF 0661: 089B 1162: AND R1,R0 0662: 086F 1163: DEC R1 SF 0663: BC80 + ld r4,$066D 0664: 066D 0665: 3CDA 1164: JEQ :EXIT 0666: 2880 + inc r5 0667: BC80 + ld r4,$0739 0668: 0739 0669: 6F9F 1165: CALL A2HEX ;We have a valid character 066A: 3C9A + jmp r4 066B: 199E 1166: OR R3,R1 ;Store R1 value into low nibble R3 066C: 1080 1167: INC R2 ;Increment R2 to point at next ASCII hex byte 066D: ACEF 1168: :EXIT RET ;Return to HEX2WRD call { rdd r5,r4 } 066E: 2080 + inc r4 066F: 3C9A + jmp r4 1169: ; 1170: ;============================================================================== 1171: ;Name : STR2BN 1172: ; Convert string to 16 bit word binary value 1173: ; Entry: R2 -> Buffer containing hexidecimal string 1174: ; Exit: R0 contains 16 bit value 1175: ; 1176: ; 1177: ; Destroyed: 1178: ;============================================================================== 1179: ; 0670: 2880 + inc r5 0671: 699F 1180: STR2BN PUSH R1 0672: 2880 + inc r5 0673: 6A9F 1181: PUSH R2 0674: 2880 + inc r5 0675: 6B9F 1182: PUSH R3 1183: ; 0676: 1893 1184: ZERO R3 ;Used to hold binary return value 0677: 9080 1185: :LOOP RDI R2,R0 0678: C19F 1186: SWP R0 0679: B980 1187: LD R1,$00FF 067A: 00FF 067B: 089B 1188: AND R1,R0 067C: 086F 1189: DEC R1 SF 067D: BC80 + ld r4,$069F 067E: 069F 067F: 3CDA 1190: JEQ :EXIT 0680: 18EC 1191: SHL R3 ;Move value up ready for next char 0681: 18EC 1192: SHL R3 ;First time through loop this is a total 0682: 18EC 1193: SHL R3 ;..waste of time as R3 = Null 0683: 18EC 1194: SHL R3 ;..But it keeps the code simpler! 0684: 2880 + inc r5 0685: BC80 + ld r4,$0739 0686: 0739 0687: 6F9F 1195: CALL A2HEX ;We have a valid character 0688: 3C9A + jmp r4 0689: 199E 1196: OR R3,R1 ;Store R1 value into low nibble R3 1197: ; 068A: C19F 1198: SWP R0 068B: B980 1199: LD R1,$00FF 068C: 00FF 068D: 089B 1200: AND R1,R0 068E: 086F 1201: DEC R1 SF 068F: BC80 + ld r4,$069F 0690: 069F 0691: 3CDA 1202: JEQ :EXIT 0692: 18EC 1203: SHL R3 ;Move value up ready for next char 0693: 18EC 1204: SHL R3 ;First time through loop this is a total 0694: 18EC 1205: SHL R3 ;..waste of time as R3 = Null 0695: 18EC 1206: SHL R3 ;..But it keeps the code simpler! 0696: 2880 + inc r5 0697: BC80 + ld r4,$0739 0698: 0739 0699: 6F9F 1207: CALL A2HEX ;We have a valid character 069A: 3C9A + jmp r4 069B: 199E 1208: OR R3,R1 ;Store R1 value into low nibble R3 069C: BC80 + ld r4,$0677 069D: 0677 069E: 3C9A 1209: JMP :LOOP 1210: ; 069F: 039A 1211: :EXIT MOV R0,R3 ;Move return value back into R0 06A0: ABEF 1212: POP R3 06A1: AAEF 1213: POP R2 06A2: A9EF 1214: POP R1 06A3: ACEF 1215: RET { rdd r5,r4 } 06A4: 2080 + inc r4 06A5: 3C9A + jmp r4 1216: ; 1217: ;============================================================================== 1218: ;Name : WRD2HEX 1219: ; Convert 16 bit word to four Hexidecimal characters 1220: ; Entry: R0 contains 16 bit value 1221: ; Exit: R2 -> Buffer containing 3 x words with 4 x Hex chars + Null 1222: ; Termination 1223: ; 1224: ; 1225: ; Destroyed: R2 1226: ;============================================================================== 1227: ; 06A6: 2880 + inc r5 06A7: 689F 1228: WRD2HEX PUSH R0 ;Save R0 for later 06A8: C19F 1229: SWP R0 ;Process high byte first 06A9: BA80 1230: LD R2,BUFFER1 ;Set R2 -> BUFFER1 06AA: FD00 06AB: 2880 + inc r5 06AC: BC80 + ld r4,$06F1 06AD: 06F1 06AE: 6F9F 1231: CALL BN2HEX ;Convert high byte in R0-L to 2 hex digits 06AF: 3C9A + jmp r4 06B0: 5080 1232: WRI R2,R0 ;Hex digits returned in R0 store in buffer 06B1: A8EF 1233: POP R0 ;Restore R0 to original value 06B2: 2880 + inc r5 06B3: BC80 + ld r4,$06F1 06B4: 06F1 06B5: 6F9F 1234: CALL BN2HEX ;Now process low byte in R0-L 06B6: 3C9A + jmp r4 06B7: 5080 1235: WRI R2,R0 ;Store low byte Hex digits in buffer 06B8: BC80 + ld r4,$0000 06B9: 0000 06BA: 5480 1236: WRI R2,$0000 ;Make sure buffer string is Null terminated 06BB: BA80 1237: LD R2,BUFFER1 ;Point to start of buffer again R2 -> BUFFER1 06BC: FD00 06BD: ACEF 1238: RET { rdd r5,r4 } 06BE: 2080 + inc r4 06BF: 3C9A + jmp r4 1239: ; 1240: ;============================================================================== 1241: ;Name : PRTVARS 1242: ; Print four variables VAR1TXT..VAR2TXT 1243: ; Entry: 1244: ; Exit: 1245: ; 1246: ; Destroyed: 1247: ;============================================================================== 1248: ; 06C0: 2880 + inc r5 06C1: 689F 1249: PRTVARS PUSH R0 ;Save stack 06C2: 2880 + inc r5 06C3: 699F 1250: PUSH R1 06C4: 2880 + inc r5 06C5: 6A9F 1251: PUSH R2 06C6: 2880 + inc r5 06C7: 6B9F 1252: PUSH R3 1253: ; 06C8: BB80 1254: LD R3,VAR1TXT ;R3 now the Address of VAR1TXT 06C9: FD64 1255: ; 06CA: 9A80 1256: :LOOP RDI R3,R2 ;Read contents of VAR?TXT pointer into R2 06CB: B880 1257: LD R0,'>' 06CC: 003E 06CD: 2880 + inc r5 06CE: BC80 + ld r4,$09D1 06CF: 09D1 06D0: 6F9F 1258: CALL SIOTX 06D1: 3C9A + jmp r4 06D2: 2880 + inc r5 06D3: BC80 + ld r4,$083E 06D4: 083E 06D5: 6F9F 1259: CALL PRINT 06D6: 3C9A + jmp r4 06D7: B880 1260: LD R0,'<' 06D8: 003C 06D9: 2880 + inc r5 06DA: BC80 + ld r4,$09D1 06DB: 09D1 06DC: 6F9F 1261: CALL SIOTX 06DD: 3C9A + jmp r4 06DE: 2880 + inc r5 06DF: BC80 + ld r4,$0919 06E0: 0919 06E1: 6F9F 1262: CALL NEWLN 06E2: 3C9A + jmp r4 06E3: BC80 + ld r4,$FD68 06E4: FD68 06E5: 1C79 1263: CMP R3,$FD68 ;All four variables printed? 1264: ;Fixme: Bug This should be VAR4TXT+1 1265: ; but PISCASM fails to add +1 here! 06E6: BC80 + ld r4,$06CA 06E7: 06CA 06E8: C29F + inf { invert flags } 06E9: 3CDA 1266: JNE :LOOP ;..No? Then loop again 1267: ; 06EA: ABEF 1268: POP R3 ;Restore stack 06EB: AAEF 1269: POP R2 06EC: A9EF 1270: POP R1 06ED: A8EF 1271: POP R0 06EE: ACEF 1272: RET { rdd r5,r4 } 06EF: 2080 + inc r4 06F0: 3C9A + jmp r4 1273: ; 1274: ;============================================================================== 1275: ;Name : BN2HEX 1276: ; 8 bit Binary to ASCII hex 1277: ; Entry: R0-Low = 8 Bits of binary data 1278: ; Exit: R1 = Two digit ASCII hex representation of binary data 1279: ; R1-High is upper 4 bit nibble in ASCII hex 1280: ; R1-Low is lower 4 bit nibble in ASCII hex 1281: ;============================================================================== 1282: ; 1283: BN2HEX ;Convert High Nibble 06F1: 2880 + inc r5 06F2: 699F 1284: PUSH R1 06F3: 2880 + inc r5 06F4: 689F 1285: PUSH R0 ;Save original binary value 1286: ; 06F5: BC80 + ld r4,$00F0 06F6: 00F0 06F7: 049B 1287: AND R0,$00F0 ;Get high nibble 06F8: C09F 1288: SHR R0 ;Move high nibble to low nibble (Bitwise Shift-Right) 06F9: C09F 1289: SHR R0 06FA: C09F 1290: SHR R0 06FB: C09F 1291: SHR R0 06FC: 2880 + inc r5 06FD: BC80 + ld r4,$0711 06FE: 0711 06FF: 6F9F 1292: CALL NIB2ASC ;Convert high nibble to ASCII 0700: 3C9A + jmp r4 0701: 089A 1293: MOV R1,R0 ;Save high nibble char in R1-L 0702: C99F 1294: SWP R1 ;Move high nibble char in R1-L to R1-H 1295: ; 1296: ;Convert Low Nibble 0703: A8EF 1297: POP R0 ;Restore original R0 binary value 0704: BC80 + ld r4,$000F 0705: 000F 0706: 049B 1298: AND R0,$000F ;Get low nibble 0707: 2880 + inc r5 0708: BC80 + ld r4,$0711 0709: 0711 070A: 6F9F 1299: CALL NIB2ASC ;Convert low nibble to ASCII 070B: 3C9A + jmp r4 070C: 019E 1300: OR R0,R1 ;Return both ASCII chars in R0 1301: ; 070D: A9EF 1302: POP R1 ;Restore stack 070E: ACEF 1303: RET { rdd r5,r4 } 070F: 2080 + inc r4 0710: 3C9A + jmp r4 1304: ; 1305: ;============================================================================== 1306: ;Name: NIB2ASC 1307: ; Convert a hexadecimal Nibble (Lower 4 bits R0-L 0..F digit) to ASCII 1308: ; Entry: R0 = Binary data in lower 4 bits nibble 1309: ; Exit: R0 = ASCII Character representation of binary nibble 1310: ; 1311: ; Destroyed: 1312: ;============================================================================== 1313: ; 0711: BC80 + ld r4,$0009 0712: 0009 0713: 2006 1314: NIB2ASC SUB 9,R0 SF ;Is R0 > 9 ? 1315: ;..Subtract R0 from 9. 1316: ;..9 -> R4, R4 destroyed by result, don't care. 1317: ;NB: Subtraction actually 1's complement addition. 1318: ; So Carry means borrow -> No underflow 1319: ; No Carry -> Underflow 0714: BC80 + ld r4,$071A 0715: 071A 0716: 3CBA 1320: JCY :CONT ;..No? Then jump past the addition 0717: BC80 + ld r4,$0007 0718: 0007 0719: 04E9 1321: ADD R0,7 ;..Yes? Then add 7 so after adding '0' the 1322: ;..character will be in range 'A'..'F' 1323: ; 071A: BC80 + ld r4,$0030 071B: 0030 071C: 04E9 1324: :CONT ADD R0,'0' ;Add ASCII '0' to make it a character 071D: ACEF 1325: RET { rdd r5,r4 } 071E: 2080 + inc r4 071F: 3C9A + jmp r4 1326: ; 1327: ;============================================================================== 1328: ;Name : HEX2BN 1329: ; Two digit hex ASCII characters to 8 bit Binary 1330: ; Entry: R0 = 16 bit 2 hex digit ASCII characters ('00'..'FF') 1331: ; Exit: R1-low = 8 bit binary data value (0-255) 1332: ; 1333: ; Destroyed: 1334: ;============================================================================== 1335: ; 0720: 2880 + inc r5 0721: 6A9F 1336: HEX2BN PUSH R2 ;Save R2 to stack 1337: ; 0722: 0893 1338: ZERO R1 ;Make sure R1 starts as at zero 0723: C19F 1339: SWP R0 ;Switch high char to R0-low 0724: 2880 + inc r5 0725: BC80 + ld r4,$0739 0726: 0739 0727: 6F9F 1340: CALL A2HEX ;Convert R0-low char to hexadecimal 0728: 3C9A + jmp r4 0729: 08EC 1341: SHL R1 ;Shift returned value to upper 4 bits 072A: 08EC 1342: SHL R1 072B: 08EC 1343: SHL R1 072C: 08EC 1344: SHL R1 072D: 119A 1345: MOV R2,R1 ;Save high hex digit value in R2 072E: C19F 1346: SWP R0 ;Switch low char back to R0-low 072F: 2880 + inc r5 0730: BC80 + ld r4,$0739 0731: 0739 0732: 6F9F 1347: CALL A2HEX ;Convert it to hexadecimal 0733: 3C9A + jmp r4 0734: 0A9E 1348: OR R1,R2 ;OR in the saved high hex digit value 1349: ; 0735: AAEF 1350: POP R2 ;Restore stack 0736: ACEF 1351: RET { rdd r5,r4 } 0737: 2080 + inc r4 0738: 3C9A + jmp r4 1352: ; 1353: ;============================================================================== 1354: ;Name : A2HEX 1355: ; Convert single ASCII Hex character to a 8 bit Hex binary value 1356: ; Entry: R0-low = ASCII Hex Digit (0-F) 1357: ; Exit: R1-low = 4 bit binary data value (low nibble) 1358: ; 1359: ; Destroyed: 1360: ;============================================================================== 1361: ; 0739: 2880 + inc r5 073A: 689F 1362: A2HEX PUSH R0 ;Save R0 to stack 073B: BC80 + ld r4,$00FF 073C: 00FF 073D: 049B 1363: AND R0,$00FF ;Mask for low byte only 073E: BC80 + ld r4,$0030 073F: 0030 0740: 0486 1364: SUB R0,'0' ;Subtract ASCII offset 0741: BC80 + ld r4,$0009 0742: 0009 0743: 2006 1365: SUB 9,R0 SF ;Is R1 > 9 ? 1366: ;.. Subtract R0 from 9. 9->R4 working register 1367: ;.. R4 then destroyed by result but we don't care. 1368: ;NB: Subtraction actually 1's complement addition. 1369: ; So Carry means borrow -> No underflow 1370: ; No Carry -> Underflow 0744: BC80 + ld r4,$074A 0745: 074A 0746: 3CBA 1371: JCY A2HEX1 ;..Yes? Jump if carry set. 1372: ;..Meaning R0 (low nibble) <= 9 1373: ; 0747: BC80 + ld r4,$0007 0748: 0007 0749: 0486 1374: SUB R0,7 ;..else subtract offset for letters 074A: 089A 1375: A2HEX1 MOV R1,R0 ;Copy return result into R1 074B: A8EF 1376: POP R0 ;Restore original R0 074C: ACEF 1377: RET { rdd r5,r4 } 074D: 2080 + inc r4 074E: 3C9A + jmp r4 1378: ; 1379: ;============================================================================== 1380: ;Name : TOUPPER 1381: ; Convert 8-bit packed ASCII string to all upper case. 1382: ; 1383: ; Entry: R2 -> First char of Null terminated String 8 bit packed source 1384: ; 1385: ; Exit: R2 -> Same first word of Null terminated String 8 bit packed 1386: ; after conversion of all lower case to upper case 1387: ; 1388: ; Destroyed: None 1389: ;============================================================================== 1390: ; 074F: 2880 + inc r5 0750: 689F 1391: TOUPPER PUSH R0 ;Save registers to stack 0751: 2880 + inc r5 0752: 699F 1392: PUSH R1 0753: 2880 + inc r5 0754: 6A9F 1393: PUSH R2 1394: ; 0755: 909F 1395: :LOOP RD R2,R0 ;Get two packed chars into R0 0756: BC80 + ld r4,$0000 0757: 0000 0758: 0479 1396: CMP R0,$0000 ;Have we reach the end? 0759: BC80 + ld r4,$0767 075A: 0767 075B: 3CDA 1397: JEQ :EXIT ;Yes? Then exit 075C: 089A 1398: MOV R1,R0 ;Save two chars in R1 075D: BC80 + ld r4,$4040 075E: 4040 075F: 0C9B 1399: AND R1,$4040 ;Mask for upper case bytes only 0760: C89F 1400: SHR R1 ;Shift bits in mask one place right 0761: 0890 1401: NOT R1 ;Invert R1 to create upper case mask 0762: 019B 1402: AND R0,R1 ;Turn off upper case 0763: 5080 1403: WRI R2,R0 ;Write characters back again 0764: BC80 + ld r4,$0755 0765: 0755 0766: 3C9A 1404: JMP :LOOP ;Keep going to next two characters 1405: ; 0767: AAEF 1406: :EXIT POP R2 ;Restore modified registers 0768: A9EF 1407: POP R1 0769: A8EF 1408: POP R0 076A: ACEF 1409: RET { rdd r5,r4 } 076B: 2080 + inc r4 076C: 3C9A + jmp r4 1410: 1411: ;============================================================================== 1412: ;Name : EXPSTR 1413: ; Expand string from 8 bit packed format to 16 bit per character 1414: ; format. 1415: ; Entry: R2 -> First char of Null terminated String 8 bit packed source 1416: ; R3 -> First char of String buffer for 16 bit destination 1417: ; NB: R3 Must be twice the size of R2 to prevent buffer overflow 1418: ; 1419: ; Exit: R3 contains 16 unpacked version of R2 null terminated 1420: ; 1421: ; Destroyed: 1422: ;============================================================================== 1423: ; 076D: 2880 + inc r5 076E: 689F 1424: EXPSTR PUSH R0 ;PUSH stack here 076F: 2880 + inc r5 0770: 699F 1425: PUSH R1 0771: 2880 + inc r5 0772: 6A9F 1426: PUSH R2 0773: 2880 + inc r5 0774: 6B9F 1427: PUSH R3 1428: ; 1429: ;LD R2,BUFFER1 1430: ;LD R3,BUFFER2 1431: ; 0775: 9080 1432: :LOOP RDI R2,R0 ;Process high byte 0776: C19F 1433: SWP R0 0777: B980 1434: LD R1,$00FF 0778: 00FF 0779: 089B 1435: AND R1,R0 077A: BC80 + ld r4,$0000 077B: 0000 077C: 0C79 1436: CMP R1,$0000 ;Null end of string detected? 077D: BC80 + ld r4,$078F 077E: 078F 077F: 3CDA 1437: JEQ :EXIT ;Yes? Then exit 0780: 5980 1438: WRI R3,R1 ;Write high byte to output $00hh 1439: ; 0781: C19F 1440: SWP R0 ;Swap back to low byte 0782: B980 1441: LD R1,$00FF 0783: 00FF 0784: 089B 1442: AND R1,R0 0785: BC80 + ld r4,$0000 0786: 0000 0787: 0C79 1443: CMP R1,$0000 ;Null end of string detected? 0788: BC80 + ld r4,$078F 0789: 078F 078A: 3CDA 1444: JEQ :EXIT ;Yes? Then exit 078B: 5980 1445: WRI R3,R1 078C: BC80 + ld r4,$0775 078D: 0775 078E: 3C9A 1446: JMP :LOOP 1447: ; 078F: BC80 + ld r4,$0000 0790: 0000 0791: 5C80 1448: :EXIT WRI R3,$0000 ;Terminate string 0792: ABEF 1449: POP R3 ;POP stack here 0793: AAEF 1450: POP R2 0794: A9EF 1451: POP R1 0795: A8EF 1452: POP R0 0796: ACEF 1453: RET { rdd r5,r4 } 0797: 2080 + inc r4 0798: 3C9A + jmp r4 1454: ; 1455: ;============================================================================== 1456: ;Name : PKDSTR 1457: ; Pack 16 bit sting to 8 bit and Null delimit fields 1458: ; Entry: R3 -> First char of String buffer for 16 bit input format $00hh 1459: ; High bits always null 1460: ; R2 -> First char of destination 8 bit Null terminated String 1461: ; NB: R3 Should be twice the size of R2 1462: ; Exit: R2 contains 8 packed string with fields separated by one or 1463: ; more ASCII Unit Separator bytes (US) $1F 1464: ; 1465: ; Destroyed: 1466: ;============================================================================== 1467: ; 0799: 2880 + inc r5 079A: 689F 1468: PKDSTR PUSH R0 ;PUSH stack here 079B: 2880 + inc r5 079C: 699F 1469: PUSH R1 079D: 2880 + inc r5 079E: 6A9F 1470: PUSH R2 079F: 2880 + inc r5 07A0: 6B9F 1471: PUSH R3 1472: ; 07A1: 0893 1473: ZERO R1 ;Clear R1. Used to hold two chars to be written 07A2: 9880 1474: :LOOP RDI R3,R0 ;Read 16 bit char into R0 = $00hh 07A3: BC80 + ld r4,$0000 07A4: 0000 07A5: 0479 1475: CMP R0,$0000 ;Have we reached the end of the string? 07A6: BC80 + ld r4,$07D0 07A7: 07D0 07A8: 3CDA 1476: JEQ :EXIT ;Yes? Then exit 07A9: BC80 + ld r4,$0020 07AA: 0020 07AB: 0479 1477: CMP R0,$0020 ;Is char a [SPACE]? 1478: ; MOV R0,$001F IF EQ ;Yes? Then change [SPACE] to a US $1F 07AC: BC80 + ld r4,$0024 07AD: 0024 07AE: 04DA 1479: MOV R0,$0024 IF EQ ;Yes? Temp change to '$' while debugging 07AF: 089E 1480: OR R1,R0 ;Always place new char in R1-low 07B0: 2880 + inc r5 07B1: 689F 1481: PUSH R0 ;Save R0 to stack - Ran out of registers 07B2: B880 1482: LD R0,$FF00 ;Mask for high char 07B3: FF00 07B4: 019B 1483: AND R0,R1 ;R0 now has $hh00 07B5: BC80 + ld r4,$0000 07B6: 0000 07B7: 0479 1484: CMP R0,$0000 ;Is the high char still free? 07B8: A8EF 1485: POP R0 ;Restore R0 from stack 07B9: BC80 + ld r4,$07C5 07BA: 07C5 07BB: C29F + inf { invert flags } 07BC: 3CDA 1486: JNE :WRITE ;No? Two chars filled go and write to buffer 07BD: C99F 1487: SWP R1 ;Yes? Then move char from low to high byte 07BE: BC80 + ld r4,$0024 07BF: 0024 07C0: 0479 1488: CMP R0,$0024 ;Was the char changed to US $1F? 07C1: BC80 + ld r4,$07A2 07C2: 07A2 07C3: C29F + inf { invert flags } 07C4: 3CDA 1489: JNE :LOOP ;No? Then go and get the next char 1490: ; 07C5: BC80 + ld r4,$2400 07C6: 2400 07C7: 0C79 1491: :WRITE CMP R1,$2400 ;Is the high byte a unit separator? 1492: ; CMP R1,$1F00 ;Is the high byte a unit separator? 07C8: BC80 + ld r4,$2424 07C9: 2424 07CA: 0CDA 1493: MOV R1,$2424 IF EQ ;Yes? Then make both bytes $1F 07CB: 5180 1494: WRI R2,R1 07CC: 0893 1495: ZERO R1 07CD: BC80 + ld r4,$07A2 07CE: 07A2 07CF: 3C9A 1496: JMP :LOOP 1497: 07D0: 5180 1498: :EXIT WRI R2,R1 ;Make sure output string is Null terminated 1499: ;R1 could be $0000 or $hh00 1500: ;..Ok either way. 1501: ; 07D1: ABEF 1502: POP R3 ;POP stack here 07D2: AAEF 1503: POP R2 07D3: A9EF 1504: POP R1 07D4: A8EF 1505: POP R0 07D5: ACEF 1506: RET { rdd r5,r4 } 07D6: 2080 + inc r4 07D7: 3C9A + jmp r4 1507: ; 1508: ;============================================================================== 1509: ;Name : SETVARS 1510: ; Set variable pointers routine 1511: ; Read 8 bit packed string buffer and set next variable pointer to 1512: ; word location one cell after a Null is detected. 1513: ; Entry: R2 -> First char of 8 bit Unit Separated (US) $1F and Null 1514: ; terminated String being the output of PKDSTR 1515: ; Exit: All four VAR?TXT pointers set (is sufficient fields provided) 1516: ; VCOUNT is set to the number of fields provided. 1517: ; 1518: ; Destroyed: 1519: ;============================================================================== 07D8: 2880 + inc r5 07D9: 689F 1520: SETVARS PUSH R0 ;PUSH stack here 07DA: 2880 + inc r5 07DB: 699F 1521: PUSH R1 07DC: 2880 + inc r5 07DD: 6A9F 1522: PUSH R2 07DE: 2880 + inc r5 07DF: 6B9F 1523: PUSH R3 1524: ; 07E0: 0093 1525: ZERO R0 ;Set VCOUNT to zero 07E1: BC80 + ld r4,$FD68 07E2: FD68 07E3: 609F 1526: WR VCOUNT,R0 1527: ; 1528: ; Now set ALL four VAR?TXT pointers to start of BUFFER1 1529: ; 1530: ; LD R2,BUFFER1 ;This should not be required! 1531: ; 07E4: BB80 1532: LD R3,VAR1TXT ;Pointer R3 set to address of first variable 07E5: FD64 07E6: 5A80 1533: WRI R3,R2 ;VAR1TXT will allways be the start of buffer 07E7: 5A80 1534: WRI R3,R2 ;VAR2TXT initially points to start of buffer 07E8: 5A80 1535: WRI R3,R2 ;VAR2TXT initially points to start of buffer 07E9: 5A80 1536: WRI R3,R2 ;VAR2TXT initially points to start of buffer 07EA: BB80 1537: LD R3,VAR2TXT ;Pointer R3 set to address of second variable 07EB: FD65 1538: ; 07EC: 919F 1539: RD R2,R1 ;Read first two chars 07ED: BC80 + ld r4,$0000 07EE: 0000 07EF: 0C79 1540: CMP R1,$0000 ;Null string? 07F0: BC80 + ld r4,$0837 07F1: 0837 07F2: 3CDA 1541: JEQ :EXIT ;..Yes? Then nothing to do so exit 07F3: 0080 1542: INC R0 ;Not null? Then VCOUNT now equal to "One" 07F4: BC80 + ld r4,$FD68 07F5: FD68 07F6: 609F 1543: WR VCOUNT,R0 ;Write updated VCOUNT 1544: ; 07F7: 9080 1545: :LOOP RDI R2,R0 ;Read two chars from 8 bit buffer into R0 07F8: C19F 1546: SWP R0 ;Swap R0 to process R1-High byte 07F9: B980 1547: LD R1,$00FF 07FA: 00FF 07FB: 089B 1548: AND R1,R0 07FC: BC80 + ld r4,$0000 07FD: 0000 07FE: 0C79 1549: CMP R1,$0000 ;Have we reached the end of string Null? 07FF: BC80 + ld r4,$0837 0800: 0837 0801: 3CDA 1550: JEQ :EXIT 0802: BC80 + ld r4,$0024 0803: 0024 0804: 0C79 1551: CMP R1,$0024 ;Have we found a field Unit Separator? 0805: BC80 + ld r4,$0810 0806: 0810 0807: C29F + inf { invert flags } 0808: 3CDA 1552: JNE :CONT1 ;No? Carry on and process Low Byte 0809: B980 1553: LD R1,$FF00 ;Yes? Mask for high byte 080A: FF00 080B: 019B 1554: AND R0,R1 ;Retain R0-High char but Null terminate R0-Low 080C: C19F 1555: SWP R0 ;Swap bytes back to correct order 080D: BC80 + ld r4,$0824 080E: 0824 080F: 3C9A 1556: JMP :SETPTR 1557: ; 0810: C19F 1558: :CONT1 SWP R0 ;Swap R0 again to process R1-Low byte 0811: B980 1559: LD R1,$00FF 0812: 00FF 1560: 0813: 089B 1561: AND R1,R0 0814: BC80 + ld r4,$0000 0815: 0000 0816: 0C79 1562: CMP R1,$0000 ;Have we reached the end of string Null? 0817: BC80 + ld r4,$0837 0818: 0837 0819: 3CDA 1563: JEQ :EXIT 081A: BC80 + ld r4,$0024 081B: 0024 081C: 0C79 1564: CMP R1,$0024 ;Have we found a field Unit Separator? 081D: BC80 + ld r4,$07F7 081E: 07F7 081F: C29F + inf { invert flags } 0820: 3CDA 1565: JNE :LOOP ;No? Loop again. Go get next two chars 0821: B980 1566: LD R1,$FF00 ;Yes? Mask for upper byte 0822: FF00 0823: 019B 1567: AND R0,R1 ;Retain R0-High char Null terminate R0-Low 1568: ; 0824: 10EF 1569: :SETPTR DEC R2 ;Move 8 bit buffer pointer back to original word 0825: 5080 1570: WRI R2,R0 ;Write back R0 containing the $1F to $00 conversion 1571: ;This could result in $001F in 8 bit buffer 1572: ;Is this a problem?? 0826: BC80 + ld r4,$FD68 0827: FD68 0828: A09F 1573: RD VCOUNT,R0 ;Read current value of VCOUNT 0829: BC80 + ld r4,$0004 082A: 0004 082B: 0479 1574: CMP R0,$04 ;All four pointers already filled? 082C: BC80 + ld r4,$07F7 082D: 07F7 082E: 3CDA 1575: JEQ :LOOP ;..Yes? Then loop. Keep processing string to end. 082F: 0080 1576: INC R0 ;No? Then increment the variable count 0830: BC80 + ld r4,$FD68 0831: FD68 0832: 609F 1577: WR VCOUNT,R0 ;Write the new VCOUNT value 0833: 5A80 1578: WRI R3,R2 ;Set next VAR?TXT pointer 0834: BC80 + ld r4,$07F7 0835: 07F7 0836: 3C9A 1579: JMP :LOOP ;Keep processing all fields even in excess of the 1580: ;four max. As we need to null terminate each field. 1581: ;Required for field #4 if additional fields supplied 1582: ;Routine will exit at the null string termination 1583: ; 0837: ABEF 1584: :EXIT POP R3 ;POP stack here 0838: AAEF 1585: POP R2 0839: A9EF 1586: POP R1 083A: A8EF 1587: POP R0 083B: ACEF 1588: RET { rdd r5,r4 } 083C: 2080 + inc r4 083D: 3C9A + jmp r4 1589: ; 1590: ; 1591: ;============================================================================== 1592: ; Print String Routine 1593: ; Entry: R2 -> First char of 8 bit packed Null terminated String 1594: ;============================================================================== 1595: ; 083E: 2880 + inc r5 083F: 689F 1596: PRINT PUSH R0 0840: 2880 + inc r5 0841: 699F 1597: PUSH R1 0842: 2880 + inc r5 0843: 6A9F 1598: PUSH R2 0844: 2880 + inc r5 0845: 6B9F 1599: PUSH R3 1600: ; 1601: ; LD R6,PIO ;For testing only display chars on PIO 1602: ; LD R0,$0000 1603: ; WR R6,R0 ;Clear LEDs from previous display 1604: ; 0846: 9080 1605: :LOOP RDI R2,R0 0847: C19F 1606: SWP R0 0848: B980 1607: LD R1,$00FF 0849: 00FF 084A: 089B 1608: AND R1,R0 084B: 086F 1609: DEC R1 SF 084C: BC80 + ld r4,$0864 084D: 0864 084E: 3CDA 1610: JEQ :EXIT 1611: ; WR R6,R0 ;Display char on PIO LEDs 084F: 2880 + inc r5 0850: BC80 + ld r4,$09D1 0851: 09D1 0852: 6F9F 1612: CALL SIOTX ;TX High Byte char in R0 0853: 3C9A + jmp r4 1613: ; 0854: C19F 1614: SWP R0 0855: B980 1615: LD R1,$00FF 0856: 00FF 0857: 089B 1616: AND R1,R0 0858: 086F 1617: DEC R1 SF 0859: BC80 + ld r4,$0864 085A: 0864 085B: 3CDA 1618: JEQ :EXIT 1619: ; WR R6,R0 ;Display char on PIO LEDs 085C: 2880 + inc r5 085D: BC80 + ld r4,$09D1 085E: 09D1 085F: 6F9F 1620: CALL SIOTX ;TX Low Byte char in R0 0860: 3C9A + jmp r4 1621: ; 0861: BC80 + ld r4,$0846 0862: 0846 0863: 3C9A 1622: JMP :LOOP 1623: ; 0864: ABEF 1624: :EXIT POP R3 0865: AAEF 1625: POP R2 0866: A9EF 1626: POP R1 0867: A8EF 1627: POP R0 0868: ACEF 1628: RET { rdd r5,r4 } 0869: 2080 + inc r4 086A: 3C9A + jmp r4 1629: ; 1630: ;============================================================================== 1631: ; Print 16 String Routine - ignores Nulls displays exactly 16 bytes 1632: ; Entry: R2 -> First char of 8 bit packed Null terminated String 1633: ;============================================================================== 1634: ; 086B: 2880 + inc r5 086C: 689F 1635: PRINT16 PUSH R0 086D: 2880 + inc r5 086E: 699F 1636: PUSH R1 086F: 2880 + inc r5 0870: 6A9F 1637: PUSH R2 0871: 2880 + inc r5 0872: 6B9F 1638: PUSH R3 1639: ; 0873: BB80 1640: LD R3,7 ;Used to count the number of words displayed 0874: 0007 1641: ; 0875: 9180 1642: :LOOP RDI R2,R1 0876: C99F 1643: SWP R1 0877: B880 1644: LD R0,$00FF 0878: 00FF 0879: 019B 1645: AND R0,R1 087A: 2880 + inc r5 087B: BC80 + ld r4,$0899 087C: 0899 087D: 6F9F 1646: CALL :DOT ;Convert R0-Low to '.' if non ASCII 087E: 3C9A + jmp r4 087F: 2880 + inc r5 0880: BC80 + ld r4,$09D1 0881: 09D1 0882: 6F9F 1647: CALL SIOTX ;TX High Byte char in R0 0883: 3C9A + jmp r4 1648: ; 0884: C99F 1649: SWP R1 0885: B880 1650: LD R0,$00FF 0886: 00FF 0887: 019B 1651: AND R0,R1 0888: 2880 + inc r5 0889: BC80 + ld r4,$0899 088A: 0899 088B: 6F9F 1652: CALL :DOT ;Convert R0-Low to '.' if non ASCII 088C: 3C9A + jmp r4 088D: 2880 + inc r5 088E: BC80 + ld r4,$09D1 088F: 09D1 0890: 6F9F 1653: CALL SIOTX ;TX Low Byte char in R0 0891: 3C9A + jmp r4 1654: ; 0892: 186F 1655: DEC R3 SF ;Decrement display count by one 0893: BC80 + ld r4,$08A9 0894: 08A9 0895: 3CDA 1656: JEQ :EXIT ;Have we reached zero? Yes, then exit 0896: BC80 + ld r4,$0875 0897: 0875 0898: 3C9A 1657: JMP :LOOP 1658: ; 1659: ;Convert R0-Low to '.' if non ASCII 0899: BC80 + ld r4,$001F 089A: 001F 089B: 2006 1660: :DOT SUB $1F,R0 SF ;Is R0 < $1F ? 1661: ;.. Subtract R0 from $1F. $1F->R4 working register 1662: ;.. R4 destroyed by result but we don't care. 1663: ;NB: Subtraction actually 1's complement addition. 1664: ; So Carry means borrow -> No underflow 1665: ; No Carry -> Underflow 089C: BC80 + ld r4,$002E 089D: 002E 089E: 04BA 1666: MOV R0,'.' IF CY ;.. Yes? Then change R0 to a dot '.' 089F: BC80 + ld r4,$007E 08A0: 007E 08A1: 2006 1667: SUB $7E,R0 SF ;Is R0 > $7E ? 1668: ;.. Subtract R0 from $7E. $7E->R4 working register 1669: ;.. R4 destroyed by result but we don't care. 1670: ;NB: Subtraction actually 1's complement addition. 1671: ; So Carry means borrow -> No underflow 1672: ; No Carry -> Underflow 08A2: BC80 + ld r4,$002E 08A3: 002E 08A4: C29F + inf { invert flags } 08A5: 04BA 1673: MOV R0,'.' IFN CY ;.. Yes? Then change R0 to a dot '.' 08A6: ACEF 1674: RET { rdd r5,r4 } 08A7: 2080 + inc r4 08A8: 3C9A + jmp r4 1675: ; 08A9: ABEF 1676: :EXIT POP R3 08AA: AAEF 1677: POP R2 08AB: A9EF 1678: POP R1 08AC: A8EF 1679: POP R0 08AD: ACEF 1680: RET { rdd r5,r4 } 08AE: 2080 + inc r4 08AF: 3C9A + jmp r4 1681: ; 1682: ;============================================================================== 1683: ;Name : INPUT 1684: ;Desc : Input String Routine 1685: ;Entry: 1686: ;Exit : R2 -> Start of chars typed into BUFFER1 null terminated 1687: ; Termination could be ##$00,$0000 or $####,$0000 1688: ; where ## is valid char data but either way the last word 1689: ; in the buffer is set to $0000. 1690: ;============================================================================== 1691: ; 08B0: 2880 + inc r5 08B1: 689F 1692: INPUT PUSH R0 08B2: 2880 + inc r5 08B3: 699F 1693: PUSH R1 08B4: 2880 + inc r5 08B5: 6B9F 1694: PUSH R3 1695: ; 08B6: BA80 1696: LD R2,BUFFER1 ;Load R1 with the addr of BUFFER1 08B7: FD00 1697: ; 1698: :LOOP ;CALL SIORX ;Get character from serial port into R0-Low 08B8: 2880 + inc r5 08B9: BC80 + ld r4,$094F 08BA: 094F 08BB: 6F9F 1699: CALL RINGRD ;Get character from Ring Buffer into R0-Low 08BC: 3C9A + jmp r4 08BD: 2880 + inc r5 08BE: BC80 + ld r4,$09D1 08BF: 09D1 08C0: 6F9F 1700: CALL SIOTX ;Display typed character to terminal 08C1: 3C9A + jmp r4 08C2: C19F 1701: SWP R0 ;Byte returned now in R0-high byte 08C3: 089A 1702: MOV R1,R0 ;Char now in R1 high byte 08C4: 1893 1703: ZERO R3 ;Set R3 to $0000 08C5: 0379 1704: CMP R0,R3 ;Was character returned a null? 08C6: BC80 + ld r4,$090E 08C7: 090E 08C8: 3CDA 1705: JEQ :EXIT ;Y? Then call write character to buffer 08C9: BC80 + ld r4,$0800 08CA: 0800 08CB: 0479 1706: CMP R0,$0800 ;Is the char a Backspace? 08CC: BC80 + ld r4,$08EF 08CD: 08EF 08CE: 3CDA 1707: JEQ :BKSP0 ;Yes jump to backspace routine 08CF: BC80 + ld r4,$FD1E 08D0: FD1E 08D1: 1479 1708: CMP R2,$FD1E ;Is pointer R2 at second last word in buffer? 1709: ;Fixme: Bug This should be BUFFER1+31 1710: ; but PISCASM fails to add +31 here! 08D2: BC80 + ld r4,$090E 08D3: 090E 08D4: 3CDA 1711: JEQ :EXIT ;Y? End of buffer reached so bail out 1712: ; 1713: :LOWCHR ;CALL SIORX ;Get character from serial port into R0-Low 08D5: 2880 + inc r5 08D6: BC80 + ld r4,$094F 08D7: 094F 08D8: 6F9F 1714: CALL RINGRD ;Get character from Ring Buffer into R0-Low 08D9: 3C9A + jmp r4 08DA: 2880 + inc r5 08DB: BC80 + ld r4,$09D1 08DC: 09D1 08DD: 6F9F 1715: CALL SIOTX ;Display typed character to terminal 08DE: 3C9A + jmp r4 08DF: 089E 1716: OR R1,R0 ;Place this char in R1-low byte keeping R1-high 08E0: 1893 1717: ZERO R3 ;Set R3 to $0000 08E1: 0379 1718: CMP R0,R3 ;Was character returned a null? 08E2: BC80 + ld r4,$090E 08E3: 090E 08E4: 3CDA 1719: JEQ :EXIT ;Y? Then call write character to buffer 1720: ;We have two chars in R1 now write them to buffer 08E5: BC80 + ld r4,$0008 08E6: 0008 08E7: 0479 1721: CMP R0,$08 ;Is the char a Backspace? 08E8: BC80 + ld r4,$0904 08E9: 0904 08EA: 3CDA 1722: JEQ :BKSP1 ;Yes then start again on this word 08EB: 5180 1723: WRI R2,R1 ;Write R1 into R2->memory addr, post INC R2 08EC: BC80 + ld r4,$08B8 08ED: 08B8 08EE: 3C9A 1724: JMP :LOOP ;Go get another two characters 1725: ; 08EF: BC80 + ld r4,$FD00 08F0: FD00 08F1: 1479 1726: :BKSP0 CMP R2,BUFFER1 ;Is R2 -> to start of buffer? 08F2: BC80 + ld r4,$08B8 08F3: 08B8 08F4: 3CDA 1727: JEQ :LOOP ;Yes? Nothing to do jump to loop 08F5: 10EF 1728: DEC R2 ;Move R2 buffer pointer back one position 08F6: 919F 1729: RD R2,R1 ;Get last two chars back again 08F7: BC80 + ld r4,$FF00 08F8: FF00 08F9: 0C9B 1730: AND R1,$FF00 ;Erase low character 08FA: B880 1731: LD R0,$2008 ;Print + 08FB: 2008 08FC: 2880 + inc r5 08FD: BC80 + ld r4,$0926 08FE: 0926 08FF: 6F9F 1732: CALL PRTWRD 0900: 3C9A + jmp r4 0901: BC80 + ld r4,$08D5 0902: 08D5 0903: 3C9A 1733: JMP :LOWCHR ;Go process low char again 1734: ; 0904: B880 1735: :BKSP1 LD R0,$2008 ;Print + 0905: 2008 0906: 2880 + inc r5 0907: BC80 + ld r4,$0926 0908: 0926 0909: 6F9F 1736: CALL PRTWRD 090A: 3C9A + jmp r4 090B: BC80 + ld r4,$08B8 090C: 08B8 090D: 3C9A 1737: JMP :LOOP ;Start this word over again 1738: ; 090E: 5180 1739: :EXIT WRI R2,R1 ;Write R1 into R2->memory addr, post INC R2 090F: 0893 1740: ZERO R1 ;Set R1 to $0000 0910: 519F 1741: WR R2,R1 ;Make sure the buffer is terminated with $0000 0911: BA80 1742: LD R2,BUFFER1 ;R2 now -> Start of null terminated input string 0912: FD00 0913: ABEF 1743: POP R3 0914: A9EF 1744: POP R1 0915: A8EF 1745: POP R0 0916: ACEF 1746: RET { rdd r5,r4 } 0917: 2080 + inc r4 0918: 3C9A + jmp r4 1747: ; 1748: ;============================================================================== 1749: ;Name : NEWLN 1750: ; Print CR LF to serial port for a new line 1751: ; Entry: None 1752: ; 1753: ; Destroyed: None 1754: ;============================================================================== 0919: 2880 + inc r5 091A: 689F 1755: NEWLN PUSH R0 ;Save current R0 091B: B880 1756: LD R0,$0A0D ;CR+LF in hex 091C: 0A0D 091D: 2880 + inc r5 091E: BC80 + ld r4,$0926 091F: 0926 0920: 6F9F 1757: CALL PRTWRD ;Print it 0921: 3C9A + jmp r4 0922: A8EF 1758: POP R0 ;Restore R0 0923: ACEF 1759: RET { rdd r5,r4 } 0924: 2080 + inc r4 0925: 3C9A + jmp r4 1760: ; 1761: ;============================================================================== 1762: ;Name : PRTWRD 1763: ; Print 16 Bit Word as two characters ASCII 1764: ; Entry: R0 = Binary data to print 1765: ; 1766: ; Destroyed: None 1767: ;============================================================================== 0926: C19F 1768: PRTWRD SWP R0 ;Swap high-byte into low-byte 0927: 2880 + inc r5 0928: BC80 + ld r4,$09D1 0929: 09D1 092A: 6F9F 1769: CALL SIOTX 092B: 3C9A + jmp r4 092C: C19F 1770: SWP R0 ;Swap back again 092D: 2880 + inc r5 092E: BC80 + ld r4,$09D1 092F: 09D1 0930: 6F9F 1771: CALL SIOTX 0931: 3C9A + jmp r4 0932: ACEF 1772: RET { rdd r5,r4 } 0933: 2080 + inc r4 0934: 3C9A + jmp r4 1773: ; 1774: ;============================================================================== 1775: ;Name : INKEY - Read and return character from Ring Buffer if available 1776: ; return Null if none available. 1777: ; 1778: ;Desc : Read character from SIO Ring Buffer if one exists. Return Null 1779: ; : Otherwise. Does NOT wait for character. Returns Null if none available 1780: ; : Calls RINGRD to collect character if after checking one exists in 1781: ; : buffer 1782: ;Entry: 1783: ;Exit : R0-Low = Single character from SIO Ring Buffer 1784: ; : CR char ASCII 13 returned as NULL ASCII 0 1785: ;============================================================================== 1786: ; 0935: 2880 + inc r5 0936: 699F 1787: INKEY PUSH R1 0937: 2880 + inc r5 0938: 6A9F 1788: PUSH R2 0939: 2880 + inc r5 093A: 6B9F 1789: PUSH R3 1790: ; 093B: 0093 1791: ZERO R0 ;Make sure R0 is Null 093C: BA80 1792: LD R2,RBWPTR ;Ring Buffer Write Pointer 093D: FE80 093E: 9180 1793: RDI R2,R1 ;R1 -> Write Head of ring buffer 093F: 939F 1794: RD R2,R3 ;R3 -> Read Tail of ring buffer 0940: 1979 1795: CMP R3,R1 ;Does the Tail = Head? 0941: BC80 + ld r4,$0949 0942: 0949 0943: 3CDA 1796: JEQ :EXIT ;Yes? Buffer empty. Just return. 0944: 2880 + inc r5 0945: BC80 + ld r4,$094F 0946: 094F 0947: 6F9F 1797: CALL RINGRD ;Character available call Ring Buffer Read 0948: 3C9A + jmp r4 1798: ; 0949: ABEF 1799: :EXIT POP R3 ;Clean up and exit 094A: AAEF 1800: POP R2 094B: A9EF 1801: POP R1 094C: ACEF 1802: RET { rdd r5,r4 } 094D: 2080 + inc r4 094E: 3C9A + jmp r4 1803: ; 1804: ;============================================================================== 1805: ;Name : RINGRD - Waits for a character and returns it 1806: ; 1807: ;Desc : Read character from SIO Ring Buffer 1808: ;Entry: 1809: ;Exit : R0-Low = Single character from SIO Ring Buffer 1810: ; : CR char ASCII 13 returned as NULL ASCII 0 1811: ;============================================================================== 1812: ; 094F: 2880 + inc r5 0950: 699F 1813: RINGRD PUSH R1 0951: 2880 + inc r5 0952: 6A9F 1814: PUSH R2 0953: 2880 + inc r5 0954: 6B9F 1815: PUSH R3 1816: ; 0955: BA80 1817: LD R2,RBWPTR ;Ring Buffer Write Pointer 0956: FE80 0957: 9180 1818: RDI R2,R1 ;R1 -> Write Head of ring buffer 0958: 939F 1819: RD R2,R3 ;R3 -> Read Tail of ring buffer 0959: 1979 1820: CMP R3,R1 ;Does the Tail = Head? 095A: BC80 + ld r4,$0984 095B: 0984 095C: C29F + inf { invert flags } 095D: 3CDA 1821: JNE :CONT ;No? Buffer not empty. Carry on. 095E: B980 1822: LD R1,RBOVFL ;Check for any Ring Buffer overflow 095F: FE82 0960: 889F 1823: RD R1,R0 ;Overflow Flag and Char (if any) in R0 0961: BC80 + ld r4,$FF00 0962: FF00 0963: 049B 1824: AND R0,$FF00 ;Mask for Flag in high byte only 0964: BC80 + ld r4,$0F00 0965: 0F00 0966: 0479 1825: CMP R0,$0F00 ;Overflow marked? 0967: BC80 + ld r4,$097C 0968: 097C 0969: C29F + inf { invert flags } 096A: 3CDA 1826: JNE :WAIT ;No? No Overflow condition. Go wait for Char. 096B: 889F 1827: RD R1,R0 ;Get Mask and Char back in R0 again 096C: BC80 + ld r4,$0000 096D: 0000 096E: 4C9F 1828: WR R1,$0000 ;Clear both Mask and Char for next time 096F: 2880 + inc r5 0970: BC80 + ld r4,$0995 0971: 0995 0972: 6F9F 1829: CALL :CKCHR ;Check Char for 0973: 3C9A + jmp r4 0974: 2880 + inc r5 0975: BC80 + ld r4,$0A14 0976: 0A14 0977: 6F9F 1830: CALL RTSON ;Turn on CTS to PC so Chars can flow again 0978: 3C9A + jmp r4 0979: BC80 + ld r4,$09A1 097A: 09A1 097B: 3C9A 1831: JMP :EXIT ;All Done. Jump to exit. Char in R0. 1832: ; 097C: BA80 1833: :WAIT LD R2,RBWPTR ;Ring Buffer Write Pointer 097D: FE80 097E: 9180 1834: RDI R2,R1 ;R1 -> Write Head of ring buffer 097F: 939F 1835: RD R2,R3 ;R3 -> Read Tail of ring buffer 0980: 1979 1836: CMP R3,R1 ;Does the Tail = Head? 0981: BC80 + ld r4,$097C 0982: 097C 0983: 3CDA 1837: JEQ :WAIT ;Loop around until Char arrives 1838: ;Warning this could hang forever! 1839: ; 0984: 989F 1840: :CONT RD R3,R0 ;Ring Buffer Tail Char now in R0. 0985: 2880 + inc r5 0986: BC80 + ld r4,$0995 0987: 0995 0988: 6F9F 1841: CALL :CKCHR ;Check Char for 0989: 3C9A + jmp r4 098A: 1880 1842: INC R3 ;Move Read Tail forward one word 098B: BC80 + ld r4,$003F 098C: 003F 098D: 1C9B 1843: AND R3,$3F ;Constrain Buffer to 64 words cyclic 098E: BC80 + ld r4,$FE40 098F: FE40 0990: 1CE9 1844: ADD R3,RINGB ;Add back the Ring Buffer base address 0991: 539F 1845: WR R2,R3 ;Write new Read Tail Pointer to RBRPTR 0992: BC80 + ld r4,$09A1 0993: 09A1 0994: 3C9A 1846: JMP :EXIT ;All Done. Jump to exit. Char in R0. 1847: ; 0995: B980 1848: :CKCHR LD R1,$00FF ;Mask for low byte only 0996: 00FF 0997: 019B 1849: AND R0,R1 ;Only keep R0-low 0998: BC80 + ld r4,$000D 0999: 000D 099A: 0479 1850: CMP R0,$0D ;Is char a CR (ASCII 13) key? 099B: BC80 + ld r4,$0000 099C: 0000 099D: 04DA 1851: MOV R0,$00 IF EQ ;Yes? Then change it to a NULL 099E: ACEF 1852: RET { rdd r5,r4 } 099F: 2080 + inc r4 09A0: 3C9A + jmp r4 1853: ; 1854: ; We should test if character is visible here before we echo 1855: ; But for the moment we'll just display it regardless 1856: ; 1857: :EXIT ;CALL SIOTX ;Display typed character to terminal 09A1: ABEF 1858: POP R3 ;Clean up and exit 09A2: AAEF 1859: POP R2 09A3: A9EF 1860: POP R1 09A4: ACEF 1861: RET { rdd r5,r4 } 09A5: 2080 + inc r4 09A6: 3C9A + jmp r4 1862: ; 1863: ;============================================================================== 1864: ;Name : SIORX 1865: ;Desc : Get character from serial port 1866: ;Entry: 1867: ;Exit : R0-Low = Single character from serial port 1868: ; : CR char ASCII 13 returned as NULL ASCII 0 1869: ;============================================================================== 1870: ; 09A7: 2880 + inc r5 09A8: 699F 1871: SIORX PUSH R1 09A9: 2880 + inc r5 09AA: 6A9F 1872: PUSH R2 09AB: 2880 + inc r5 09AC: 6B9F 1873: PUSH R3 1874: ; 09AD: BC80 + ld r4,$FE84 09AE: FE84 09AF: A19F 1875: RD SIOSTA,R1 ;Check Status Register 09B0: BA80 1876: LD R2,%00000010 ;Mask for RxRDY 09B1: 0002 09B2: 8B9F 1877: :LOOP RD R1,R3 ;Read Status 09B3: 1A9B 1878: AND R3,R2 ;Only RX ready status remains 09B4: 1A79 1879: CMP R3,R2 ;Are they equal? 09B5: BC80 + ld r4,$09B2 09B6: 09B2 09B7: C29F + inf { invert flags } 09B8: 3CDA 1880: JNE :LOOP ;No? Then RX char not available. Loop until ready 1881: ;Warning! This could hang forever 1882: ; 09B9: BC80 + ld r4,$FE83 09BA: FE83 09BB: A19F 1883: RD SIODAT,R1 ;2651 Data Register 09BC: 889F 1884: RD R1,R0 ;RX Char in R0 09BD: B980 1885: LD R1,$00FF ;Mask for low byte only 09BE: 00FF 09BF: 019B 1886: AND R0,R1 ;Only keep R0-low 09C0: BC80 + ld r4,$000D 09C1: 000D 09C2: 0479 1887: CMP R0,$0D ;Is char a CR (ASCII 13) key? 09C3: BC80 + ld r4,$0000 09C4: 0000 09C5: 04DA 1888: MOV R0,$00 IF EQ ;Yes? Then change it to a NULL 1889: ; 1890: ; We should test if character is visible here before we echo 1891: ; But for the moment we'll just display it regardless 1892: ; 09C6: 2880 + inc r5 09C7: BC80 + ld r4,$09D1 09C8: 09D1 09C9: 6F9F 1893: CALL SIOTX ;Display typed character to terminal 09CA: 3C9A + jmp r4 1894: ; 09CB: ABEF 1895: POP R3 ;Clean up and exit 09CC: AAEF 1896: POP R2 09CD: A9EF 1897: POP R1 09CE: ACEF 1898: RET { rdd r5,r4 } 09CF: 2080 + inc r4 09D0: 3C9A + jmp r4 1899: ; 1900: ;============================================================================== 1901: ;Name : SIOTX 1902: ; Serial 2651 TX Character Routine 1903: ; Entry: R0 = Char to TX 1904: ;============================================================================== 1905: ; 09D1: 2880 + inc r5 09D2: 699F 1906: SIOTX PUSH R1 09D3: 2880 + inc r5 09D4: 6A9F 1907: PUSH R2 09D5: 2880 + inc r5 09D6: 6B9F 1908: PUSH R3 1909: ; 09D7: BC80 + ld r4,$FE84 09D8: FE84 09D9: A19F 1910: RD SIOSTA,R1 ;Check Status Register 09DA: BA80 1911: LD R2,%00000001 ;Mask for TX Register holding buffer 09DB: 0001 09DC: 8B9F 1912: :LOOP RD R1,R3 ;Read Status 09DD: 1A9B 1913: AND R3,R2 ;Only TX buffer status remains 09DE: 1A79 1914: CMP R3,R2 ;Are they equal? 09DF: BC80 + ld r4,$09DC 09E0: 09DC 09E1: C29F + inf { invert flags } 09E2: 3CDA 1915: JNE :LOOP ;No? Then TX is busy. Loop until ready 1916: ;Warning! This could hang forever 1917: ; 09E3: BC80 + ld r4,$FE83 09E4: FE83 09E5: A19F 1918: RD SIODAT,R1 ;2651 Data Register 09E6: 489F 1919: WR R1,R0 ;TX Char 1920: ; 09E7: ABEF 1921: POP R3 ;We're done. Clean up stack 09E8: AAEF 1922: POP R2 ;and Return 09E9: A9EF 1923: POP R1 09EA: ACEF 1924: RET { rdd r5,r4 } 09EB: 2080 + inc r4 09EC: 3C9A + jmp r4 1925: ; 1926: ;============================================================================== 1927: ;Name : SIOINIT 1928: ; Initialize the 2651 Serial UART 1929: ; Entry: None 1930: ; Exit: None 1931: ; 1932: ; Destroyed: R0, R1 1933: ;============================================================================== 1934: ; 09ED: BC80 + ld r4,$FE86 09EE: FE86 09EF: A09F 1935: SIOINIT RD SIOCMD,R0 ;Need to start by reading the Command Register 09F0: 819F 1936: RD R0,R1 ;to reset the internal 2651 state. 1937: ;Should really stop the TX & RX at this point 09F1: BC80 + ld r4,$FE85 09F2: FE85 09F3: A09F 1938: RD SIOMOD,R0 09F4: B980 1939: LD R1,SIOMR1 09F5: 004E 09F6: 419F 1940: WR R0,R1 ;Write Mode Register 1 1941: ; 09F7: B980 1942: LD R1,SIOMR2 09F8: 003E 09F9: 419F 1943: WR R0,R1 ;Write Mode Register 2 1944: ; 09FA: BC80 + ld r4,$FE86 09FB: FE86 09FC: A09F 1945: RD SIOCMD,R0 09FD: B980 1946: LD R1,SIOCR 09FE: 0027 09FF: 419F 1947: WR R0,R1 ;Write Command Register 1948: ; 1949: ; 2651 should now be good to go! 0A00: ACEF 1950: RET { rdd r5,r4 } 0A01: 2080 + inc r4 0A02: 3C9A + jmp r4 1951: ; 1952: ;============================================================================== 1953: ;Name : RTSOFF 1954: ; Set Request To Send (RTS) used for hardware handshake with PC to OFF. 1955: ; This will disable the Clear To Send signal to the PC halting data 1956: ; transfer. 1957: ; 1958: ; Entry: None 1959: ; Exit: None 1960: ; 1961: ; Destroyed: R0, R1 1962: ;============================================================================== 0A03: 2880 + inc r5 0A04: 689F 1963: RTSOFF PUSH R0 ;Save registers 0A05: 2880 + inc r5 0A06: 699F 1964: PUSH R1 1965: ; 0A07: BC80 + ld r4,$FE86 0A08: FE86 0A09: A09F 1966: RD SIOCMD,R0 0A0A: 819F 1967: RD R0,R1 ;Read current Command Register settings 0A0B: BC80 + ld r4,$00DF 0A0C: 00DF 0A0D: 0C9B 1968: AND R1,%11011111 ;RTS Mask for bit 5 0A0E: 419F 1969: WR R0,R1 ;Write Command Register - Turn OFF RTS 1970: ; 0A0F: A9EF 1971: POP R1 ;Clean up stack and exit 0A10: A8EF 1972: POP R0 0A11: ACEF 1973: RET { rdd r5,r4 } 0A12: 2080 + inc r4 0A13: 3C9A + jmp r4 1974: ; 1975: ;============================================================================== 1976: ;Name : RTSON 1977: ; Set Request To Send (RTS) used for hardware handshake with PC to ON. 1978: ; This will enable the Clear To Send signal to the PC starting data 1979: ; transfer again. 1980: ; 1981: ; Entry: None 1982: ; Exit: None 1983: ; 1984: ; Destroyed: None 1985: ;============================================================================== 0A14: 2880 + inc r5 0A15: 689F 1986: RTSON PUSH R0 ;Save registers 0A16: 2880 + inc r5 0A17: 699F 1987: PUSH R1 1988: ; 0A18: BC80 + ld r4,$FE86 0A19: FE86 0A1A: A09F 1989: RD SIOCMD,R0 0A1B: 819F 1990: RD R0,R1 ;Read current Command Register settings 0A1C: BC80 + ld r4,$0020 0A1D: 0020 0A1E: 0C9E 1991: OR R1,%00100000 ;RTS Mask for bit 5 0A1F: 419F 1992: WR R0,R1 ;Write Command Register - Turn ON RTS 1993: ; 0A20: A9EF 1994: POP R1 ;Clean up stack and exit 0A21: A8EF 1995: POP R0 0A22: ACEF 1996: RET { rdd r5,r4 } 0A23: 2080 + inc r4 0A24: 3C9A + jmp r4 1997: ; 1998: ;============================================================================== 1999: ;Name : Copyright Message 2000: ; Displays a copyright message. 2001: ; This is really just for testing the Jump command. 2002: ; Entry: None 2003: ; Exit: None 2004: ; 2005: ; Destroyed: R0, R1 2006: ;============================================================================== 2007: ; 0A25: 2880 + inc r5 0A26: 6A9F 2008: PUSH R2 0A27: BA80 2009: LD R2,MSG2 0A28: 0B24 0A29: 2880 + inc r5 0A2A: BC80 + ld r4,$083E 0A2B: 083E 0A2C: 6F9F 2010: CALL PRINT 0A2D: 3C9A + jmp r4 0A2E: AAEF 2011: POP R2 0A2F: ACEF 2012: RET { rdd r5,r4 } 0A30: 2080 + inc r4 0A31: 3C9A + jmp r4 2013: ; 2014: ;============================================================================== 2015: ;Name : DSPSGN & DSPCUR 2016: ; Display 16 bit signed number in ASCII 2017: ; Entry: R0 = 16 bit value to display 2018: ; Exit: 2019: ; 2020: ; Destroyed: R0 2021: ;============================================================================== 2022: ; 0A32: 2880 + inc r5 0A33: 699F 2023: DSPSGN PUSH R1 2024: ; 0A34: B980 2025: LD R1,%1000000000000000 0A35: 8000 0A36: 089B 2026: AND R1,R0 0A37: BC80 + ld r4,$0000 0A38: 0000 0A39: 0C79 2027: CMP R1,$0000 0A3A: BC80 + ld r4,$0A4C 0A3B: 0A4C 0A3C: 3CDA 2028: JEQ :DISP ;Positive number so just display it 2029: ; 0A3D: 2880 + inc r5 0A3E: 689F 2030: PUSH R0 ;Save R0 0A3F: BC80 + ld r4,$002D 0A40: 002D 0A41: 049A 2031: MOV R0,'-' ;Display negative sign 0A42: B980 2032: LD R1,0 ;Function 0 = SIOTX routine 0A43: 0000 0A44: 2880 + inc r5 0A45: BC80 + ld r4,$0009 0A46: 0009 0A47: 6F9F 2033: CALL BIOS ;Call into the PISC BIOS 0A48: 3C9A + jmp r4 0A49: A8EF 2034: POP R0 ;Restore R0 2035: ; 0A4A: 0090 2036: NOT R0 ;Convert number to positive 0A4B: 0080 2037: INC R0 ;by two's complement inversion, plus 1 2038: ; 0A4C: 2880 + inc r5 0A4D: BC80 + ld r4,$0A55 0A4E: 0A55 0A4F: 6F9F 2039: :DISP CALL DSPNUM 0A50: 3C9A + jmp r4 2040: ; 0A51: A9EF 2041: POP R1 0A52: ACEF 2042: RET { rdd r5,r4 } 0A53: 2080 + inc r4 0A54: 3C9A + jmp r4 2043: ; 2044: ;============================================================================== 2045: ;Name : DSPNUM 2046: ; Display 16 bit unsigned number in ASCII 2047: ; Entry: R0 = 16 bit value to display 2048: ; Exit: 2049: ; 2050: ; Destroyed: R0 2051: ;============================================================================== 0A55: 2880 + inc r5 0A56: 699F 2052: DSPNUM PUSH R1 0A57: 2880 + inc r5 0A58: 6A9F 2053: PUSH R2 0A59: 2880 + inc r5 0A5A: 6B9F 2054: PUSH R3 2055: ; 0A5B: 1893 2056: ZERO R3 0A5C: 0379 2057: CMP R0,R3 ;Is the value to display zero? 0A5D: BC80 + ld r4,$0A6B 0A5E: 0A6B 0A5F: C29F + inf { invert flags } 0A60: 3CDA 2058: JNE :START ;No? Then start display routine 0A61: B880 2059: LD R0,'0' ;Yes? Then just display a zero 0A62: 0030 0A63: 2880 + inc r5 0A64: BC80 + ld r4,$09D1 0A65: 09D1 0A66: 6F9F 2060: CALL SIOTX ;Display zero 0A67: 3C9A + jmp r4 0A68: BC80 + ld r4,$0A8F 0A69: 0A8F 0A6A: 3C9A 2061: JMP :QUIT ;Jump to quit 2062: ; 0A6B: 109A 2063: :START MOV R2,R0 0A6C: B980 2064: LD R1,-10000 0A6D: D8F0 0A6E: 2880 + inc r5 0A6F: BC80 + ld r4,$0A95 0A70: 0A95 0A71: 6F9F 2065: CALL :NUM1 0A72: 3C9A + jmp r4 0A73: B980 2066: LD R1,-1000 0A74: FC18 0A75: 2880 + inc r5 0A76: BC80 + ld r4,$0A95 0A77: 0A95 0A78: 6F9F 2067: CALL :NUM1 0A79: 3C9A + jmp r4 0A7A: B980 2068: LD R1,-100 0A7B: FF9C 0A7C: 2880 + inc r5 0A7D: BC80 + ld r4,$0A95 0A7E: 0A95 0A7F: 6F9F 2069: CALL :NUM1 0A80: 3C9A + jmp r4 0A81: B980 2070: LD R1,-10 0A82: FFF6 0A83: 2880 + inc r5 0A84: BC80 + ld r4,$0A95 0A85: 0A95 0A86: 6F9F 2071: CALL :NUM1 0A87: 3C9A + jmp r4 0A88: B980 2072: LD R1,-1 0A89: FFFF 0A8A: 2880 + inc r5 0A8B: BC80 + ld r4,$0A95 0A8C: 0A95 0A8D: 6F9F 2073: CALL :NUM1 0A8E: 3C9A + jmp r4 2074: ; 0A8F: ABEF 2075: :QUIT POP R3 0A90: AAEF 2076: POP R2 0A91: A9EF 2077: POP R1 0A92: ACEF 2078: RET { rdd r5,r4 } 0A93: 2080 + inc r4 0A94: 3C9A + jmp r4 2079: ; 0A95: B880 2080: :NUM1 LD R0,-1 0A96: FFFF 0A97: 0080 2081: :NUM2 INC R0 0A98: 1169 2082: ADD R2,R1 SF 0A99: BC80 + ld r4,$0A97 0A9A: 0A97 0A9B: 3CBA 2083: JCY :NUM2 0A9C: 1186 2084: SUB R2,R1 0A9D: 18E9 2085: ADD R3,R0 0A9E: BC80 + ld r4,$0000 0A9F: 0000 0AA0: 1C79 2086: CMP R3,$0000 0AA1: BC80 + ld r4,$0AAE 0AA2: 0AAE 0AA3: 3CDA 2087: JEQ :EXIT 0AA4: BC80 + ld r4,$0030 0AA5: 0030 0AA6: 04E9 2088: ADD R0,$30 0AA7: B980 2089: LD R1,0 ;Function 0 = SIOTX routine 0AA8: 0000 0AA9: 2880 + inc r5 0AAA: BC80 + ld r4,$0009 0AAB: 0009 0AAC: 6F9F 2090: CALL BIOS ;Call into the PISC BIOS 0AAD: 3C9A + jmp r4 0AAE: ACEF 2091: :EXIT RET { rdd r5,r4 } 0AAF: 2080 + inc r4 0AB0: 3C9A + jmp r4 2092: ; 2093: ;============================================================================== 2094: ;Name : DSPHEX 2095: ; Display 16 bit value as 4 digit Hexidecimal number 2096: ; Entry: R0 = 16 bit value to display 2097: ; Exit: 2098: ; 2099: ; Destroyed: 2100: ;============================================================================== 2101: ; 0AB1: 2880 + inc r5 0AB2: 6A9F 2102: DSPHEX PUSH R2 ;Save R2 0AB3: 2880 + inc r5 0AB4: BC80 + ld r4,$06A6 0AB5: 06A6 0AB6: 6F9F 2103: CALL WRD2HEX ;Convert R0 value to 4 digit Hexidecimal string 0AB7: 3C9A + jmp r4 0AB8: 2880 + inc r5 0AB9: BC80 + ld r4,$083E 0ABA: 083E 0ABB: 6F9F 2104: CALL PRINT ;Print value in buffer 0ABC: 3C9A + jmp r4 0ABD: AAEF 2105: POP R2 ;Restore R2 0ABE: ACEF 2106: RET { rdd r5,r4 } 0ABF: 2080 + inc r4 0AC0: 3C9A + jmp r4 2107: ; 2108: ; 2109: ;============================================================================== 2110: ;Name : DEC2BN 2111: ; Convert ASCII string to a 16 bit signed number 2112: ; Entry: R2 -> packed ASCII string null terminated 2113: ; Exit: R0 = 16 bit returned value 2114: ; 2115: ; Destroyed: 2116: ;============================================================================== 0AC1: 2880 + inc r5 0AC2: 699F 2117: DEC2BN PUSH R1 ;Save registers 0AC3: 2880 + inc r5 0AC4: 6B9F 2118: PUSH R3 2119: ; 0AC5: B980 2120: LD R1,8 ;Fn=8 Expand 8 bit ASCII packed string to a string of words 0AC6: 0008 0AC7: BB80 2121: LD R3,BUFFER2 ;Address to use for expanded buffer 0AC8: FD20 0AC9: 2880 + inc r5 0ACA: BC80 + ld r4,$0009 0ACB: 0009 0ACC: 6F9F 2122: CALL BIOS ;Call into the PISC BIOS 0ACD: 3C9A + jmp r4 0ACE: 139A 2123: MOV R2,R3 ;Move R3 -> 16 bit unpacked string of words into R2 2124: ; 0ACF: 0093 2125: ZERO R0 ;Used to store return value 0AD0: 0893 2126: ZERO R1 ;Set R1 flag to $0000, used to track sign of value 2127: ; 0AD1: 939F 2128: RD R2,R3 ;First character word in R3 2129: ;Check for zero here? 0AD2: BC80 + ld r4,$002D 0AD3: 002D 0AD4: 1C79 2130: CMP R3,'-' ;Is it a negative sign? 0AD5: BC80 + ld r4,$0ADD 0AD6: 0ADD 0AD7: C29F + inf { invert flags } 0AD8: 3CDA 2131: JNE :PLUS ;No? Then it's positive 0AD9: 089C 2132: HIGH R1 ;Set R1 flag to $FFFF, this is a negative number 0ADA: BC80 + ld r4,$0AE4 0ADB: 0AE4 0ADC: 3C9A 2133: JMP :CNVERT ;Start conversion 2134: ; 0ADD: BC80 + ld r4,$002B 0ADE: 002B 0ADF: 1C79 2135: :PLUS CMP R3,'+' ;Is the first char a positive sign? 0AE0: BC80 + ld r4,$0AEC 0AE1: 0AEC 0AE2: C29F + inf { invert flags } 0AE3: 3CDA 2136: JNE :CHKDIG ;No? The start conversion with 1st digit 2137: ; 0AE4: 1080 2138: :CNVERT INC R2 ;Move to next digit for conversion 0AE5: 939F 2139: RD R2,R3 ;Get next character word 0AE6: BC80 + ld r4,$0000 0AE7: 0000 0AE8: 1C79 2140: CMP R3,$0000 ;Have we reached the end? 0AE9: BC80 + ld r4,$0B09 0AEA: 0B09 0AEB: 3CDA 2141: JEQ :SIGN ;Yes? then deal with the sign 0AEC: BC80 + ld r4,$0030 0AED: 0030 0AEE: 1C06 2142: :CHKDIG SUB R3,'0' SF ;Delete ASCII offset 0AEF: BC80 + ld r4,$0B04 0AF0: 0B04 0AF1: C29F + inf { invert flags } 0AF2: 3CBA 2143: JNC :ERROR ;Error if < 0 (not a digit) 0AF3: BC80 + ld r4,$000A 0AF4: 000A 0AF5: 1C79 2144: CMP R3,9+1 0AF6: BC80 + ld r4,$0B04 0AF7: 0B04 0AF8: 3CBA 2145: JCY :ERROR ;Error if > 9 (not a digit) 2146: ; 2147: ; The word character is a digit so save it 2148: ; 0AF9: 00EC 2149: SHL R0 ;R0 now *2 0AFA: 2880 + inc r5 0AFB: 689F 2150: PUSH R0 ;Save *2 value 0AFC: 00EC 2151: SHL R0 ;R0 now *4 0AFD: 00EC 2152: SHL R0 ;R0 now *8 0AFE: ACEF 2153: POP R4 ;Get the *2 back into R4 0AFF: 04E9 2154: ADD R0,R4 ;R0 is now *10 0B00: 03E9 2155: ADD R0,R3 ;Now add the new digit value 0B01: BC80 + ld r4,$0AE4 0B02: 0AE4 0B03: 3C9A 2156: JMP :CNVERT ;Continue conversion with next char 2157: ; 0B04: 0093 2158: :ERROR ZERO R0 ;Clear Ro back to Zero 0B05: 2073 2159: SNE ;Set NEQ flag to indicate error 0B06: BC80 + ld r4,$0B12 0B07: 0B12 0B08: 3C9A 2160: JMP :EXIT ;Jump to exit 2161: ; 0B09: 087F 2162: :SIGN TST R1 ;Was the sign negative? 0B0A: BC80 + ld r4,$0B12 0B0B: 0B12 0B0C: C29F + inf { invert flags } 0B0D: 3CDA 2163: JNE :EXIT ;No? Then exit 0B0E: 2093 2164: ZERO R4 ;Negative sign.. 0B0F: 2086 2165: SUB R4,R0 ;So subtract from zero 0B10: 049A 2166: MOV R0,R4 ;Move corrected negative value back to R0 0B11: 207C 2167: SEQ ;Set EQ flag to indicate successful conversion 2168: ; 0B12: ABEF 2169: :EXIT POP R3 ;Restore registers 0B13: A9EF 2170: POP R1 0B14: ACEF 2171: RET { rdd r5,r4 } 0B15: 2080 + inc r4 0B16: 3C9A + jmp r4 2172: ; 2173: ;============================================================================== 2174: ; Program Data 2175: ;============================================================================== 2176: ; 0B17: 0A0D 2177: MSG1 DB $0A,$0D,"PISC Monitor v1.0 b8",$0A,$0D,$00 0B18: 5049 5343 204D 6F6E 6974 6F72 2076 312E 3020 6238 0A0D 0000 0B24: 436F 2178: MSG2 DB "Copyright 2019 Stephen Arnold",$0A,$0D,$00 0B25: 7079 7269 6768 7420 3230 3139 2053 7465 7068 656E 2041 726E 6F6C 640A 0D00 0B34: 2A2A 2179: MSG3 DB "*** FAILSAFE BOOT ***",$0A,$0D,$00 0B35: 2A20 4641 494C 5341 4645 2042 4F4F 5420 2A2A 2A0A 0D00 0B40: 5379 2180: MSGERR DB "Syntax Error.",$0A,$0D,$00 0B41: 6E74 6178 2045 7272 6F72 2E0A 0D00 0B48: 0A0D 2181: IRQERR DB $0A,$0D,"Unhandled IRQ from: ",$00 0B49: 556E 6861 6E64 6C65 6420 4952 5120 6672 6F6D 3A20 0000 0B54: 0A0D 2182: IRQM1 DB $0A,$0D,"2651 IRQ Char = ",$00 0B55: 3236 3531 2049 5251 2043 6861 7220 3D20 0000 0B5E: 4475 2183: MSGDU DB "Dump ",$0A,$0D,$00 0B5F: 6D70 200A 0D00 0B62: 5265 2184: MSGRD DB "Read ",$0A,$0D,$00 0B63: 6164 200A 0D00 0B66: 456E 2185: MSGEN DB "Enter",$0A,$0D,$00 0B67: 7465 720A 0D00 0B6A: 5772 2186: MSGWR DB "Write",$0A,$0D,$00 0B6B: 6974 650A 0D00 0B6E: 4669 2187: MSGFL DB "Fill ",$0A,$0D,$00 0B6F: 6C6C 200A 0D00 0B72: 436F 2188: MSGCP DB "Copy ",$0A,$0D,$00 0B73: 7079 200A 0D00 0B76: 4A75 2189: MSGJP DB "Jump ", 0B77: 6D70 2000 0B79: 4D65 2190: MSGMBK DB "Mem Bank ",$0A,$0D,$00 0B7A: 6D20 4261 6E6B 200A 0D00 0B7F: 4865 2191: MSGHEX DB "Hex Transfer",$0A,$0D,$00 0B80: 7820 5472 616E 7366 6572 0A0D 0000 0B87: 4352 2192: CRCERR DB "CRC Error",$0A,$0D,$00 0B88: 4320 4572 726F 720A 0D00 0B8D: 5265 2193: XERROR DB "Record Error",$0A,$0D,$00 0B8E: 636F 7264 2045 7272 6F72 0A0D 0000 0B95: 5472 2194: XTRANS DB "Transfer ",$00 0B96: 616E 7366 6572 2000 0B9A: 5375 2195: XOK DB "Successful",$0A,$0D,$00 0B9B: 6363 6573 7366 756C 0A0D 0000 0BA1: 4661 2196: XFAIL DB "Failed",$0A,$0D,$00 0BA2: 696C 6564 0A0D 0000 0BA6: 4272 2197: MSGBRK DB "Break @",$00 0BA7: 6561 6B20 4000 0BAA: 466C 2198: MSGBK2 DB "Flags ",$00 0BAB: 6167 7320 0000 0BAE: 0A0D 2199: MSGBKH DB $0A,$0D,"Register Values:',$0A,$0D,$00 0BAF: 5265 6769 7374 6572 2056 616C 7565 733A 0A0D 0000 0BB9: 4E6F 2200: BRKERR DB "No breakpoint set.",$0A,$0D,$00 0BBA: 2062 7265 616B 706F 696E 7420 7365 742E 0A0D 0000 0BC4: 0A0D 2201: MSGHLP DB $0A,$0D,"Available Commands: ",$0A,$0D 0BC5: 4176 6169 6C61 626C 6520 436F 6D6D 616E 6473 3A20 0A0D 0BD0: 2844 2202: DB "(D)ump (W)rite (R)ead ",$0A,$0D 0BD1: 2975 6D70 2020 2020 2020 2020 2028 5729 7269 7465 2020 2020 2020 2020 2028 5229 6561 6420 0A0D 0BE4: 2845 2203: DB "(E)nter (F)ill (C)opy ",$0A,$0D 0BE5: 296E 7465 7220 2020 2020 2020 2028 4629 696C 6C20 2020 2020 2020 2020 2028 4329 6F70 7920 0A0D 0BF8: 284A 2204: DB "(J)ump (M)emory ",$0A,$0D 0BF9: 2975 6D70 2020 2020 2020 2020 2028 4D29 656D 6F72 7920 0A0D 0C05: 2842 2205: DB "(B)reakpoint (K)ontinue (S)tep ",$0A,$0D 0C06: 2972 6561 6B70 6F69 6E74 2020 2028 4B29 6F6E 7469 6E75 6520 2020 2020 2028 5329 7465 7020 0A0D 0C19: 0A0D 2206: DB $0A,$0D,$00 0C1A: 0000 2207: ; 2208: ; 2209: END ;Assembeller should stop parsing here. --- Symbol Table Pass 2 --- Number Symbol Line Address Type Loop Count Length Comment 1 NULL 28 0000 8 FALSE 0 0 2 FALSE 29 0000 8 FALSE 0 0 3 TRUE 30 FFFF 8 FALSE 0 0 4 BUFFER1 32 FD00 8 FALSE 7 0 5 BUFFER2 33 FD20 8 FALSE 5 0 6 VAR1 35 FD60 8 FALSE 2 0 7 VAR2 36 FD61 8 FALSE 10 0 8 VAR3 37 FD62 8 FALSE 4 0 9 VAR4 38 FD63 8 FALSE 2 0 10 VAR1TXT 40 FD64 8 FALSE 3 0 11 VAR2TXT 41 FD65 8 FALSE 1 0 12 VAR3TXT 42 FD66 8 FALSE 0 0 13 VAR4TXT 43 FD67 8 FALSE 0 0 14 VCOUNT 45 FD68 8 FALSE 12 0 15 VFLAG 46 FD69 8 FALSE 3 0 16 DPTR 48 FD70 8 FALSE 3 0 17 CKSUM 50 FD71 8 FALSE 4 0 18 XDATA 51 FD72 8 FALSE 3 0 19 XADDR 52 FD73 8 FALSE 2 0 20 XTYPE 53 FD74 8 FALSE 1 0 21 VAR5 55 FD75 8 FALSE 0 0 22 RINGB 57 FE40 8 FALSE 3 0 23 RBWPTR 59 FE80 8 FALSE 5 0 24 RBRPTR 60 FE81 8 FALSE 0 0 25 RBOVFL 61 FE82 8 FALSE 2 0 26 SIOMR1 65 004E 8 FALSE 1 0 27 SIOMR2 66 003E 8 FALSE 1 0 28 SIOCR 67 0027 8 FALSE 1 0 29 SIODAT 71 FE83 8 FALSE 4 0 30 SIOSTA 72 FE84 8 FALSE 2 0 31 SIOMOD 73 FE85 8 FALSE 1 0 32 SIOCMD 74 FE86 8 FALSE 6 0 33 MDAT0 76 FEA6 8 FALSE 3 0 34 MDAT1 77 FEA7 8 FALSE 0 0 35 MDAT2 78 FEA8 8 FALSE 0 0 36 MDAT3 79 FEA9 8 FALSE 0 0 37 BKADDR 81 FEAA 8 FALSE 8 0 38 BKINST 82 FEAB 8 FALSE 0 0 39 BKSAVE 83 FEAC 8 FALSE 4 0 40 BKFLAG 84 FEB4 8 FALSE 2 0 41 IRQVEC 86 FEB5 8 FALSE 2 0 42 PMAIN 91 0000 1 FALSE 0 0 43 BIOS 109 0009 1 FALSE 3 0 44 FLAGTBL 122 000D 31 FALSE 2 0 45 COLD 143 0015 1 FALSE 1 0 46 COLD:CONT 161 0035 1 FALSE 1 0 47 JPTBL 179 0047 31 FALSE 1 0 48 IRQREQ 201 0054 1 FALSE 1 0 49 IRQJMP 253 0076 1 FALSE 1 0 50 NOIRQ 314 0091 1 FALSE 7 0 51 IRQ7SG 326 009D 1 FALSE 1 0 52 RINGWR 333 00A6 1 FALSE 1 0 53 RINGWR:OVRFL 352 00C3 1 FALSE 1 0 54 RINGWR:GETCHR 364 00DC 1 FALSE 2 0 55 RINGWR:QUIT 375 00EF 1 FALSE 1 0 56 RINGWR:EXIT 380 00F7 1 FALSE 3 0 57 BREAK 405 00FA 1 FALSE 1 0 58 COLDNXT 499 0140 1 FALSE 1 0 59 COLDNXT:SKIP 550 0190 1 FALSE 1 0 60 WARM 564 019B 1 FALSE 1 0 61 START 581 01C6 1 FALSE 20 0 62 START:LOOP1 616 01FF 1 FALSE 1 0 63 HEXFILE 698 026B 1 FALSE 1 0 64 HEXFILE:RXEOF 720 02AA 1 FALSE 1 0 65 HEXFILE:RXHEX 733 02CF 1 FALSE 1 0 66 HEXFILE:LOOP 737 02D8 1 FALSE 1 0 67 HEXFILE:LOOP2 754 0302 1 FALSE 1 0 68 HEXFILE:HEXERR 760 030C 1 FALSE 2 0 69 HEXFILE:LOOPY 768 0326 1 FALSE 1 0 70 HEXFILE:EXIT 770 0329 1 FALSE 3 0 71 DUMP 773 032C 1 FALSE 1 0 72 DUMP:NEXT1 783 0345 1 FALSE 1 0 73 DUMP:NEXT2 790 0356 1 FALSE 1 0 74 DUMP:DISP 796 0364 1 FALSE 3 0 75 DUMP:LOOP 807 0383 1 FALSE 1 0 76 DUMP:EXIT 824 03B5 1 FALSE 1 0 77 WRITE 831 03C6 1 FALSE 1 0 78 READ 849 03FF 1 FALSE 1 0 79 ENTER 867 0437 1 FALSE 1 0 80 ENTER:LOOP 870 0441 1 FALSE 1 0 81 ENTER:SKIP 897 0494 1 FALSE 1 0 82 FILL 902 0499 1 FALSE 1 0 83 FILL:LOOP 911 04B4 1 FALSE 1 0 84 COPY 917 04BC 1 FALSE 1 0 85 COPY:LOOP 926 04D7 1 FALSE 1 0 86 JUMP 933 04E0 1 FALSE 1 0 87 MEMBNK 944 04FA 1 FALSE 1 0 88 BKPOINT 955 0512 1 FALSE 2 0 89 BKPOINT:CONT1 970 052A 1 FALSE 1 0 90 BKPOINT:CONT2 984 0540 1 FALSE 1 0 91 BKPOINT:LOOP3 1004 057D 1 FALSE 1 0 92 BKPCONT 1027 05C8 1 FALSE 1 0 93 BKPCONT:CONT 1053 05E3 1 FALSE 1 0 94 BKPCONT:EXIT 1055 05E6 1 FALSE 1 0 95 BKPSTEP 1060 05F0 1 FALSE 1 0 96 BKPSTEP:EXIT 1082 060D 1 FALSE 0 0 97 BKPSTEP:CONT 1085 0610 1 FALSE 1 0 98 ERROR 1091 061A 1 FALSE 4 0 99 ADD2CRC 1104 0624 1 FALSE 6 0 100 HEX2WRD 1130 0631 1 FALSE 6 0 101 HEX2WRD:CBYTE 1144 0648 1 FALSE 2 0 102 HEX2WRD:EXIT 1168 066D 1 FALSE 2 0 103 STR2BN 1180 0670 1 FALSE 2 0 104 STR2BN:LOOP 1185 0677 1 FALSE 1 0 105 STR2BN:EXIT 1211 069F 1 FALSE 2 0 106 WRD2HEX 1228 06A6 1 FALSE 14 0 107 PRTVARS 1249 06C0 1 FALSE 0 0 108 PRTVARS:LOOP 1256 06CA 1 FALSE 1 0 109 BN2HEX 1283 06F1 1 FALSE 2 0 110 NIB2ASC 1314 0711 1 FALSE 2 0 111 NIB2ASC:CONT 1324 071A 1 FALSE 1 0 112 HEX2BN 1336 0720 1 FALSE 0 0 113 A2HEX 1362 0739 1 FALSE 6 0 114 A2HEX1 1375 074A 1 FALSE 1 0 115 TOUPPER 1391 074F 1 FALSE 1 0 116 TOUPPER:LOOP 1395 0755 1 FALSE 1 0 117 TOUPPER:EXIT 1406 0767 1 FALSE 1 0 118 EXPSTR 1424 076D 1 FALSE 2 0 119 EXPSTR:LOOP 1432 0775 1 FALSE 1 0 120 EXPSTR:EXIT 1448 078F 1 FALSE 2 0 121 PKDSTR 1468 0799 1 FALSE 1 0 122 PKDSTR:LOOP 1474 07A2 1 FALSE 2 0 123 PKDSTR:WRITE 1491 07C5 1 FALSE 1 0 124 PKDSTR:EXIT 1498 07D0 1 FALSE 1 0 125 SETVARS 1520 07D8 1 FALSE 1 0 126 SETVARS:LOOP 1545 07F7 1 FALSE 3 0 127 SETVARS:CONT1 1558 0810 1 FALSE 1 0 128 SETVARS:SETPTR 1569 0824 1 FALSE 1 0 129 SETVARS:EXIT 1584 0837 1 FALSE 3 0 130 PRINT 1596 083E 1 FALSE 38 0 131 PRINT:LOOP 1605 0846 1 FALSE 1 0 132 PRINT:EXIT 1624 0864 1 FALSE 2 0 133 PRINT16 1635 086B 1 FALSE 2 0 134 PRINT16:LOOP 1642 0875 1 FALSE 1 0 135 PRINT16:DOT 1660 0899 1 FALSE 2 0 136 PRINT16:EXIT 1676 08A9 1 FALSE 1 0 137 INPUT 1692 08B0 1 FALSE 3 0 138 INPUT:LOOP 1698 08B8 1 FALSE 3 0 139 INPUT:LOWCHR 1713 08D5 1 FALSE 1 0 140 INPUT:BKSP0 1726 08EF 1 FALSE 1 0 141 INPUT:BKSP1 1735 0904 1 FALSE 1 0 142 INPUT:EXIT 1739 090E 1 FALSE 3 0 143 NEWLN 1755 0919 1 FALSE 12 0 144 PRTWRD 1768 0926 1 FALSE 4 0 145 INKEY 1787 0935 1 FALSE 1 0 146 INKEY:EXIT 1799 0949 1 FALSE 1 0 147 RINGRD 1813 094F 1 FALSE 3 0 148 RINGRD:WAIT 1833 097C 1 FALSE 2 0 149 RINGRD:CONT 1840 0984 1 FALSE 1 0 150 RINGRD:CKCHR 1848 0995 1 FALSE 2 0 151 RINGRD:EXIT 1857 09A1 1 FALSE 2 0 152 SIORX 1871 09A7 1 FALSE 1 0 153 SIORX:LOOP 1877 09B2 1 FALSE 1 0 154 SIOTX 1906 09D1 1 FALSE 28 0 155 SIOTX:LOOP 1912 09DC 1 FALSE 1 0 156 SIOINIT 1935 09ED 1 FALSE 1 0 157 RTSOFF 1963 0A03 1 FALSE 0 0 158 RTSON 1986 0A14 1 FALSE 2 0 159 DSPSGN 2023 0A32 1 FALSE 1 0 160 DSPSGN:DISP 2039 0A4C 1 FALSE 1 0 161 DSPNUM 2052 0A55 1 FALSE 2 0 162 DSPNUM:START 2063 0A6B 1 FALSE 1 0 163 DSPNUM:QUIT 2075 0A8F 1 FALSE 1 0 164 DSPNUM:NUM1 2080 0A95 1 FALSE 5 0 165 DSPNUM:NUM2 2081 0A97 1 FALSE 1 0 166 DSPNUM:EXIT 2091 0AAE 1 FALSE 1 0 167 DSPHEX 2102 0AB1 1 FALSE 1 0 168 DEC2BN 2117 0AC1 1 FALSE 1 0 169 DEC2BN:PLUS 2135 0ADD 1 FALSE 1 0 170 DEC2BN:CNVERT 2138 0AE4 1 FALSE 2 0 171 DEC2BN:CHKDIG 2142 0AEC 1 FALSE 1 0 172 DEC2BN:ERROR 2158 0B04 1 FALSE 2 0 173 DEC2BN:SIGN 2162 0B09 1 FALSE 1 0 174 DEC2BN:EXIT 2169 0B12 1 FALSE 2 0 175 MSG1 2177 0B17 1 FALSE 1 0 176 _DB2177 2177 0000 30 FALSE 0 25 ..PISC Monitor v1.0 b8... 177 MSG2 2178 0B24 1 FALSE 1 0 178 _DB2178 2178 0000 30 FALSE 0 32 Copyright 2019 Stephen Arnold... 179 MSG3 2179 0B34 1 FALSE 1 0 180 _DB2179 2179 0000 30 FALSE 0 24 *** FAILSAFE BOOT ***... 181 MSGERR 2180 0B40 1 FALSE 1 0 182 _DB2180 2180 0000 30 FALSE 0 16 Syntax Error.... 183 IRQERR 2181 0B48 1 FALSE 0 0 184 _DB2181 2181 0000 30 FALSE 0 23 ..Unhandled IRQ from: . 185 IRQM1 2182 0B54 1 FALSE 0 0 186 _DB2182 2182 0000 30 FALSE 0 19 ..2651 IRQ Char = . 187 MSGDU 2183 0B5E 1 FALSE 1 0 188 _DB2183 2183 0000 30 FALSE 0 8 Dump ... 189 MSGRD 2184 0B62 1 FALSE 1 0 190 _DB2184 2184 0000 30 FALSE 0 8 Read ... 191 MSGEN 2185 0B66 1 FALSE 1 0 192 _DB2185 2185 0000 30 FALSE 0 8 Enter... 193 MSGWR 2186 0B6A 1 FALSE 1 0 194 _DB2186 2186 0000 30 FALSE 0 8 Write... 195 MSGFL 2187 0B6E 1 FALSE 1 0 196 _DB2187 2187 0000 30 FALSE 0 8 Fill ... 197 MSGCP 2188 0B72 1 FALSE 1 0 198 _DB2188 2188 0000 30 FALSE 0 8 Copy ... 199 MSGJP 2189 0B76 1 FALSE 1 0 200 _DB2189 2189 0000 30 FALSE 0 5 Jump 201 MSGMBK 2190 0B79 1 FALSE 1 0 202 _DB2190 2190 0000 30 FALSE 0 12 Mem Bank ... 203 MSGHEX 2191 0B7F 1 FALSE 0 0 204 _DB2191 2191 0000 30 FALSE 0 15 Hex Transfer... 205 CRCERR 2192 0B87 1 FALSE 1 0 206 _DB2192 2192 0000 30 FALSE 0 12 CRC Error... 207 XERROR 2193 0B8D 1 FALSE 1 0 208 _DB2193 2193 0000 30 FALSE 0 15 Record Error... 209 XTRANS 2194 0B95 1 FALSE 1 0 210 _DB2194 2194 0000 30 FALSE 0 10 Transfer . 211 XOK 2195 0B9A 1 FALSE 1 0 212 _DB2195 2195 0000 30 FALSE 0 13 Successful... 213 XFAIL 2196 0BA1 1 FALSE 1 0 214 _DB2196 2196 0000 30 FALSE 0 9 Failed... 215 MSGBRK 2197 0BA6 1 FALSE 1 0 216 _DB2197 2197 0000 30 FALSE 0 8 Break @. 217 MSGBK2 2198 0BAA 1 FALSE 1 0 218 _DB2198 2198 0000 30 FALSE 0 7 Flags . 219 MSGBKH 2199 0BAE 1 FALSE 1 0 220 _DB2199 2199 0000 30 FALSE 0 21 ..Register Values:... 221 BRKERR 2200 0BB9 1 FALSE 3 0 222 _DB2200 2200 0000 30 FALSE 0 21 No breakpoint set.... 223 MSGHLP 2201 0BC4 1 FALSE 1 0 224 _DB2201 2201 0000 30 FALSE 0 24 ..Available Commands: .. 225 _DB2202 2202 0000 30 FALSE 0 40 (D)ump (W)rite (R)ead .. 226 _DB2203 2203 0000 30 FALSE 0 40 (E)nter (F)ill (C)opy .. 227 _DB2204 2204 0000 30 FALSE 0 26 (J)ump (M)emory .. 228 _DB2205 2205 0000 30 FALSE 0 40 (B)reakpoint (K)ontinue (S)tep .. 229 _DB2206 2206 0000 30 FALSE 0 3 ... 230 COLD 93 0002 2 FALSE 0 0 231 WARM 96 0005 2 FALSE 0 0 232 BREAK 99 0008 2 FALSE 0 0 233 JPTBL 109 000A 2 FALSE 0 0 234 COLD:CONT 158 001E 2 FALSE 0 0 235 MDAT0 172 0025 2 FALSE 0 0 236 COLDNXT 173 0028 2 FALSE 0 0 237 SIOTX 179 0028 2 FALSE 0 0 238 SIORX 180 0028 2 FALSE 0 0 239 NEWLN 181 0028 2 FALSE 0 0 240 PRINT 182 0028 2 FALSE 0 0 241 INPUT 183 0028 2 FALSE 0 0 242 DSPNUM 184 0028 2 FALSE 0 0 243 DSPSGN 185 0028 2 FALSE 0 0 244 DSPHEX 186 0028 2 FALSE 0 0 245 EXPSTR 187 0028 2 FALSE 0 0 246 WRD2HEX 188 0028 2 FALSE 0 0 247 DEC2BN 189 0028 2 FALSE 0 0 248 INKEY 190 0028 2 FALSE 0 0 249 IRQVEC 207 0030 2 FALSE 0 0 250 FLAGTBL 224 0039 2 FALSE 0 0 251 IRQREQ 309 005E 2 FALSE 0 0 252 RBWPTR 333 006F 2 FALSE 0 0 253 RINGB 338 0074 2 FALSE 0 0 254 RINGWR:OVRFL 340 0078 2 FALSE 0 0 255 RINGWR:GETCHR 342 007E 2 FALSE 0 0 256 RINGWR:EXIT 343 0081 2 FALSE 0 0 257 RINGWR:EXIT 346 0086 2 FALSE 0 0 258 SIOCMD 352 0087 2 FALSE 0 0 259 RINGWR:GETCHR 357 008F 2 FALSE 0 0 260 RINGWR:QUIT 358 0092 2 FALSE 0 0 261 RBOVFL 359 0094 2 FALSE 0 0 262 RINGWR:EXIT 362 0099 2 FALSE 0 0 263 SIODAT 365 009C 2 FALSE 0 0 264 SIOCMD 375 00A7 2 FALSE 0 0 265 BKFLAG 405 00AF 2 FALSE 0 0 266 BKADDR 426 00C0 2 FALSE 0 0 267 BKADDR 447 00C3 2 FALSE 0 0 268 VCOUNT 453 00C9 2 FALSE 0 0 269 BKPOINT 454 00CE 2 FALSE 0 0 270 BKFLAG 459 00D0 2 FALSE 0 0 271 FLAGTBL 462 00D4 2 FALSE 0 0 272 BKSAVE 474 00DB 2 FALSE 0 0 273 SIODAT 507 00EF 2 FALSE 0 0 274 SIOINIT 516 00FD 2 FALSE 0 0 275 RBWPTR 525 0104 2 FALSE 0 0 276 RINGB 526 0105 2 FALSE 0 0 277 IRQJMP 531 0108 2 FALSE 0 0 278 IRQVEC 532 010A 2 FALSE 0 0 279 NOIRQ 534 010B 2 FALSE 0 0 280 IRQ7SG 535 010C 2 FALSE 0 0 281 NOIRQ 536 010D 2 FALSE 0 0 282 NOIRQ 537 010E 2 FALSE 0 0 283 NOIRQ 538 010F 2 FALSE 0 0 284 NOIRQ 539 0110 2 FALSE 0 0 285 RINGWR 540 0111 2 FALSE 0 0 286 NOIRQ 541 0112 2 FALSE 0 0 287 NOIRQ 542 0113 2 FALSE 0 0 288 MDAT0 544 0114 2 FALSE 0 0 289 COLDNXT:SKIP 546 0118 2 FALSE 0 0 290 BKADDR 550 011B 2 FALSE 0 0 291 NEWLN 568 012A 2 FALSE 0 0 292 MSG1 569 012C 2 FALSE 0 0 293 PRINT 570 0131 2 FALSE 0 0 294 DPTR 572 0133 2 FALSE 0 0 295 CKSUM 573 0134 2 FALSE 0 0 296 MDAT0 574 0135 2 FALSE 0 0 297 START 576 013A 2 FALSE 0 0 298 MSG3 577 013C 2 FALSE 0 0 299 PRINT 578 0141 2 FALSE 0 0 300 SIOTX 582 0148 2 FALSE 0 0 301 BUFFER1 585 014A 2 FALSE 0 0 302 BUFFER2 586 014C 2 FALSE 0 0 303 INPUT 587 0151 2 FALSE 0 0 304 NEWLN 590 0156 2 FALSE 0 0 305 HEXFILE 594 015B 2 FALSE 0 0 306 TOUPPER 595 0160 2 FALSE 0 0 307 EXPSTR 596 0165 2 FALSE 0 0 308 PKDSTR 597 016A 2 FALSE 0 0 309 SETVARS 600 016F 2 FALSE 0 0 310 VAR1TXT 608 0171 2 FALSE 0 0 311 VAR1 609 0173 2 FALSE 0 0 312 STR2BN 617 017E 2 FALSE 0 0 313 START:LOOP1 624 0186 2 FALSE 0 0 314 VCOUNT 655 0187 2 FALSE 0 0 315 START 657 018B 2 FALSE 0 0 316 VAR1 659 018C 2 FALSE 0 0 317 DUMP 665 0194 2 FALSE 0 0 318 WRITE 667 0198 2 FALSE 0 0 319 READ 669 019C 2 FALSE 0 0 320 ENTER 671 01A0 2 FALSE 0 0 321 FILL 673 01A4 2 FALSE 0 0 322 COPY 675 01A8 2 FALSE 0 0 323 JUMP 677 01AC 2 FALSE 0 0 324 MEMBNK 679 01B0 2 FALSE 0 0 325 BKPOINT 681 01B4 2 FALSE 0 0 326 BKPCONT 683 01B8 2 FALSE 0 0 327 BKPSTEP 685 01BC 2 FALSE 0 0 328 MSGHLP 687 01BE 2 FALSE 0 0 329 PRINT 688 01C3 2 FALSE 0 0 330 START 690 01C6 2 FALSE 0 0 331 HEX2WRD 699 01CC 2 FALSE 0 0 332 XDATA 700 01CD 2 FALSE 0 0 333 ADD2CRC 701 01D2 2 FALSE 0 0 334 HEX2WRD 702 01D7 2 FALSE 0 0 335 XADDR 703 01D8 2 FALSE 0 0 336 ADD2CRC 704 01DD 2 FALSE 0 0 337 HEX2WRD 705 01E2 2 FALSE 0 0 338 XTYPE 706 01E3 2 FALSE 0 0 339 ADD2CRC 708 01E9 2 FALSE 0 0 340 HEXFILE:RXHEX 710 01ED 2 FALSE 0 0 341 HEXFILE:RXEOF 712 01F1 2 FALSE 0 0 342 XERROR 714 01F3 2 FALSE 0 0 343 PRINT 715 01F8 2 FALSE 0 0 344 HEXFILE:EXIT 716 01FB 2 FALSE 0 0 345 HEX2WRD 720 0200 2 FALSE 0 0 346 ADD2CRC 721 0205 2 FALSE 0 0 347 XTRANS 722 0207 2 FALSE 0 0 348 PRINT 723 020C 2 FALSE 0 0 349 XFAIL 724 020E 2 FALSE 0 0 350 XOK 725 0210 2 FALSE 0 0 351 PRINT 728 0217 2 FALSE 0 0 352 CKSUM 730 0219 2 FALSE 0 0 353 HEXFILE:EXIT 731 021C 2 FALSE 0 0 354 XDATA 733 021D 2 FALSE 0 0 355 HEXFILE:HEXERR 735 0221 2 FALSE 0 0 356 BUFFER2 736 0223 2 FALSE 0 0 357 HEX2WRD 737 0228 2 FALSE 0 0 358 ADD2CRC 739 022E 2 FALSE 0 0 359 HEXFILE:LOOP 741 0233 2 FALSE 0 0 360 HEX2WRD 743 0238 2 FALSE 0 0 361 ADD2CRC 744 023D 2 FALSE 0 0 362 HEXFILE:HEXERR 746 0242 2 FALSE 0 0 363 XDATA 750 0243 2 FALSE 0 0 364 BUFFER2 752 0246 2 FALSE 0 0 365 XADDR 753 0247 2 FALSE 0 0 366 HEXFILE:LOOP2 757 024E 2 FALSE 0 0 367 HEXFILE:EXIT 758 0251 2 FALSE 0 0 368 CRCERR 765 0259 2 FALSE 0 0 369 PRINT 766 025E 2 FALSE 0 0 370 RTSON 767 0263 2 FALSE 0 0 371 HEXFILE:LOOPY 768 0266 2 FALSE 0 0 372 START 770 0269 2 FALSE 0 0 373 MSGDU 773 026B 2 FALSE 0 0 374 PRINT 774 0270 2 FALSE 0 0 375 DPTR 775 0271 2 FALSE 0 0 376 VCOUNT 778 0274 2 FALSE 0 0 377 DUMP:NEXT1 780 0279 2 FALSE 0 0 378 DUMP:NEXT2 784 027F 2 FALSE 0 0 379 VAR2 785 0280 2 FALSE 0 0 380 VAR3 786 0281 2 FALSE 0 0 381 DUMP:DISP 788 0285 2 FALSE 0 0 382 DUMP:DISP 791 028A 2 FALSE 0 0 383 VAR2 792 028B 2 FALSE 0 0 384 WRD2HEX 798 0295 2 FALSE 0 0 385 PRINT 799 029A 2 FALSE 0 0 386 SIOTX 801 02A1 2 FALSE 0 0 387 SIOTX 803 02A8 2 FALSE 0 0 388 VFLAG 805 02AA 2 FALSE 0 0 389 WRD2HEX 808 02B0 2 FALSE 0 0 390 PRINT 809 02B5 2 FALSE 0 0 391 SIOTX 811 02BC 2 FALSE 0 0 392 DUMP:EXIT 813 02C0 2 FALSE 0 0 393 VFLAG 814 02C1 2 FALSE 0 0 394 VFLAG 816 02C3 2 FALSE 0 0 395 DUMP:LOOP 818 02C8 2 FALSE 0 0 396 PRINT16 820 02CE 2 FALSE 0 0 397 NEWLN 821 02D3 2 FALSE 0 0 398 DUMP:DISP 822 02D6 2 FALSE 0 0 399 PRINT16 825 02DC 2 FALSE 0 0 400 NEWLN 826 02E1 2 FALSE 0 0 401 DPTR 827 02E2 2 FALSE 0 0 402 START 828 02E5 2 FALSE 0 0 403 MSGWR 831 02E7 2 FALSE 0 0 404 PRINT 832 02EC 2 FALSE 0 0 405 VAR2 833 02ED 2 FALSE 0 0 406 VAR3 834 02EE 2 FALSE 0 0 407 WRD2HEX 836 02F4 2 FALSE 0 0 408 PRINT 837 02F9 2 FALSE 0 0 409 SIOTX 839 0300 2 FALSE 0 0 410 SIOTX 841 0307 2 FALSE 0 0 411 WRD2HEX 843 030D 2 FALSE 0 0 412 PRINT 844 0312 2 FALSE 0 0 413 NEWLN 845 0317 2 FALSE 0 0 414 START 846 031A 2 FALSE 0 0 415 MSGRD 849 031C 2 FALSE 0 0 416 PRINT 850 0321 2 FALSE 0 0 417 VAR2 851 0322 2 FALSE 0 0 418 WRD2HEX 853 0329 2 FALSE 0 0 419 PRINT 854 032E 2 FALSE 0 0 420 SIOTX 856 0335 2 FALSE 0 0 421 SIOTX 858 033C 2 FALSE 0 0 422 WRD2HEX 861 0343 2 FALSE 0 0 423 PRINT 862 0348 2 FALSE 0 0 424 NEWLN 863 034D 2 FALSE 0 0 425 START 864 0350 2 FALSE 0 0 426 MSGEN 867 0352 2 FALSE 0 0 427 PRINT 868 0357 2 FALSE 0 0 428 VAR2 869 0358 2 FALSE 0 0 429 WRD2HEX 871 035F 2 FALSE 0 0 430 PRINT 872 0364 2 FALSE 0 0 431 SIOTX 874 036B 2 FALSE 0 0 432 SIOTX 876 0372 2 FALSE 0 0 433 WRD2HEX 879 0379 2 FALSE 0 0 434 PRINT 880 037E 2 FALSE 0 0 435 SIOTX 882 0385 2 FALSE 0 0 436 BUFFER1 883 0387 2 FALSE 0 0 437 BUFFER2 884 0389 2 FALSE 0 0 438 INPUT 885 038E 2 FALSE 0 0 439 NEWLN 886 0393 2 FALSE 0 0 440 ENTER:SKIP 891 039A 2 FALSE 0 0 441 START 893 039E 2 FALSE 0 0 442 STR2BN 895 03A4 2 FALSE 0 0 443 ENTER:LOOP 899 03AA 2 FALSE 0 0 444 MSGFL 902 03AC 2 FALSE 0 0 445 PRINT 903 03B1 2 FALSE 0 0 446 VCOUNT 904 03B2 2 FALSE 0 0 447 ERROR 906 03B7 2 FALSE 0 0 448 VAR2 907 03B8 2 FALSE 0 0 449 VAR3 908 03B9 2 FALSE 0 0 450 VAR4 909 03BA 2 FALSE 0 0 451 START 913 03C0 2 FALSE 0 0 452 FILL:LOOP 914 03C3 2 FALSE 0 0 453 MSGCP 917 03C5 2 FALSE 0 0 454 PRINT 918 03CA 2 FALSE 0 0 455 VCOUNT 919 03CB 2 FALSE 0 0 456 ERROR 921 03D0 2 FALSE 0 0 457 VAR2 922 03D1 2 FALSE 0 0 458 VAR3 923 03D2 2 FALSE 0 0 459 VAR4 924 03D3 2 FALSE 0 0 460 START 929 03DA 2 FALSE 0 0 461 COPY:LOOP 930 03DD 2 FALSE 0 0 462 MSGJP 933 03DF 2 FALSE 0 0 463 PRINT 934 03E4 2 FALSE 0 0 464 VCOUNT 935 03E5 2 FALSE 0 0 465 ERROR 937 03EA 2 FALSE 0 0 466 VAR2 938 03EB 2 FALSE 0 0 467 START 941 03F1 2 FALSE 0 0 468 MSGMBK 944 03F3 2 FALSE 0 0 469 PRINT 945 03F8 2 FALSE 0 0 470 VCOUNT 946 03F9 2 FALSE 0 0 471 ERROR 948 03FE 2 FALSE 0 0 472 VAR2 949 03FF 2 FALSE 0 0 473 START 952 0403 2 FALSE 0 0 474 VCOUNT 955 0404 2 FALSE 0 0 475 BKPOINT:CONT1 957 0409 2 FALSE 0 0 476 BKADDR 958 040B 2 FALSE 0 0 477 VAR2 959 040C 2 FALSE 0 0 478 START 968 0415 2 FALSE 0 0 479 BKADDR 970 0417 2 FALSE 0 0 480 BKPOINT:CONT2 977 0421 2 FALSE 0 0 481 BRKERR 978 0423 2 FALSE 0 0 482 PRINT 979 0428 2 FALSE 0 0 483 START 980 042B 2 FALSE 0 0 484 MSGBRK 986 0430 2 FALSE 0 0 485 PRINT 987 0435 2 FALSE 0 0 486 WRD2HEX 988 043A 2 FALSE 0 0 487 PRINT 989 043F 2 FALSE 0 0 488 PRTWRD 991 0446 2 FALSE 0 0 489 WRD2HEX 994 044D 2 FALSE 0 0 490 PRINT 995 0452 2 FALSE 0 0 491 NEWLN 996 0457 2 FALSE 0 0 492 START 998 045B 2 FALSE 0 0 493 MSGBKH 1000 045D 2 FALSE 0 0 494 PRINT 1001 0462 2 FALSE 0 0 495 BKSAVE 1003 0466 2 FALSE 0 0 496 SIOTX 1005 046D 2 FALSE 0 0 497 SIOTX 1008 0475 2 FALSE 0 0 498 SIOTX 1010 047C 2 FALSE 0 0 499 WRD2HEX 1012 0482 2 FALSE 0 0 500 PRINT 1013 0487 2 FALSE 0 0 501 SIOTX 1015 048E 2 FALSE 0 0 502 BKPOINT:LOOP3 1017 0492 2 FALSE 0 0 503 NEWLN 1018 0497 2 FALSE 0 0 504 MSGBK2 1019 0499 2 FALSE 0 0 505 PRINT 1020 049E 2 FALSE 0 0 506 WRD2HEX 1022 04A4 2 FALSE 0 0 507 PRINT 1023 04A9 2 FALSE 0 0 508 NEWLN 1024 04AE 2 FALSE 0 0 509 START 1025 04B1 2 FALSE 0 0 510 BKSAVE 1027 04B3 2 FALSE 0 0 511 BKPCONT:CONT 1035 04BA 2 FALSE 0 0 512 BKADDR 1036 04BC 2 FALSE 0 0 513 BKPCONT:EXIT 1039 04C1 2 FALSE 0 0 514 BKADDR 1045 04C3 2 FALSE 0 0 515 START 1050 04CA 2 FALSE 0 0 516 BRKERR 1055 04CF 2 FALSE 0 0 517 PRINT 1056 04D4 2 FALSE 0 0 518 START 1057 04D7 2 FALSE 0 0 519 BKSAVE 1060 04D9 2 FALSE 0 0 520 BKPSTEP:CONT 1068 04DF 2 FALSE 0 0 521 BKADDR 1076 04E8 2 FALSE 0 0 522 BRKERR 1085 04F3 2 FALSE 0 0 523 PRINT 1086 04F8 2 FALSE 0 0 524 START 1087 04FB 2 FALSE 0 0 525 MSGERR 1091 04FD 2 FALSE 0 0 526 PRINT 1092 0502 2 FALSE 0 0 527 START 1093 0505 2 FALSE 0 0 528 CKSUM 1105 0508 2 FALSE 0 0 529 CKSUM 1107 050A 2 FALSE 0 0 530 HEX2WRD:CBYTE 1135 0519 2 FALSE 0 0 531 HEX2WRD:CBYTE 1137 051F 2 FALSE 0 0 532 HEX2WRD:EXIT 1152 0531 2 FALSE 0 0 533 A2HEX 1153 0536 2 FALSE 0 0 534 HEX2WRD:EXIT 1164 0543 2 FALSE 0 0 535 A2HEX 1165 0548 2 FALSE 0 0 536 STR2BN:EXIT 1190 055D 2 FALSE 0 0 537 A2HEX 1195 0566 2 FALSE 0 0 538 STR2BN:EXIT 1202 056F 2 FALSE 0 0 539 A2HEX 1207 0578 2 FALSE 0 0 540 STR2BN:LOOP 1209 057C 2 FALSE 0 0 541 BUFFER1 1230 0588 2 FALSE 0 0 542 BN2HEX 1231 058D 2 FALSE 0 0 543 BN2HEX 1234 0594 2 FALSE 0 0 544 BUFFER1 1237 0598 2 FALSE 0 0 545 VAR1TXT 1254 05A5 2 FALSE 0 0 546 SIOTX 1258 05AD 2 FALSE 0 0 547 PRINT 1259 05B2 2 FALSE 0 0 548 SIOTX 1261 05B9 2 FALSE 0 0 549 NEWLN 1262 05BE 2 FALSE 0 0 550 PRTVARS:LOOP 1266 05C3 2 FALSE 0 0 551 NIB2ASC 1292 05D8 2 FALSE 0 0 552 NIB2ASC 1299 05E1 2 FALSE 0 0 553 NIB2ASC:CONT 1320 05EA 2 FALSE 0 0 554 A2HEX 1340 05F8 2 FALSE 0 0 555 A2HEX 1347 0603 2 FALSE 0 0 556 A2HEX1 1371 0610 2 FALSE 0 0 557 TOUPPER:EXIT 1397 0621 2 FALSE 0 0 558 TOUPPER:LOOP 1404 062A 2 FALSE 0 0 559 EXPSTR:EXIT 1437 0641 2 FALSE 0 0 560 EXPSTR:EXIT 1444 064A 2 FALSE 0 0 561 EXPSTR:LOOP 1446 064E 2 FALSE 0 0 562 PKDSTR:EXIT 1476 0664 2 FALSE 0 0 563 PKDSTR:WRITE 1486 0672 2 FALSE 0 0 564 PKDSTR:LOOP 1489 0678 2 FALSE 0 0 565 PKDSTR:LOOP 1496 067F 2 FALSE 0 0 566 VCOUNT 1526 0691 2 FALSE 0 0 567 VAR1TXT 1532 0693 2 FALSE 0 0 568 VAR2TXT 1537 0699 2 FALSE 0 0 569 SETVARS:EXIT 1541 069E 2 FALSE 0 0 570 VCOUNT 1543 06A0 2 FALSE 0 0 571 SETVARS:EXIT 1550 06A9 2 FALSE 0 0 572 SETVARS:CONT1 1552 06AE 2 FALSE 0 0 573 SETVARS:SETPTR 1556 06B5 2 FALSE 0 0 574 SETVARS:EXIT 1563 06BD 2 FALSE 0 0 575 SETVARS:LOOP 1565 06C2 2 FALSE 0 0 576 VCOUNT 1573 06C8 2 FALSE 0 0 577 SETVARS:LOOP 1575 06CC 2 FALSE 0 0 578 VCOUNT 1577 06CE 2 FALSE 0 0 579 SETVARS:LOOP 1579 06D2 2 FALSE 0 0 580 PRINT:EXIT 1610 06EA 2 FALSE 0 0 581 SIOTX 1612 06EF 2 FALSE 0 0 582 PRINT:EXIT 1618 06F7 2 FALSE 0 0 583 SIOTX 1620 06FC 2 FALSE 0 0 584 PRINT:LOOP 1622 06FF 2 FALSE 0 0 585 PRINT16:DOT 1646 071A 2 FALSE 0 0 586 SIOTX 1647 071F 2 FALSE 0 0 587 PRINT16:DOT 1652 0728 2 FALSE 0 0 588 SIOTX 1653 072D 2 FALSE 0 0 589 PRINT16:EXIT 1656 0731 2 FALSE 0 0 590 PRINT16:LOOP 1657 0734 2 FALSE 0 0 591 BUFFER1 1696 074A 2 FALSE 0 0 592 RINGRD 1699 074F 2 FALSE 0 0 593 SIOTX 1700 0754 2 FALSE 0 0 594 INPUT:EXIT 1705 075B 2 FALSE 0 0 595 INPUT:BKSP0 1707 075F 2 FALSE 0 0 596 INPUT:EXIT 1711 0763 2 FALSE 0 0 597 RINGRD 1714 0768 2 FALSE 0 0 598 SIOTX 1715 076D 2 FALSE 0 0 599 INPUT:EXIT 1719 0773 2 FALSE 0 0 600 INPUT:BKSP1 1722 0777 2 FALSE 0 0 601 INPUT:LOOP 1724 077B 2 FALSE 0 0 602 BUFFER1 1726 077C 2 FALSE 0 0 603 INPUT:LOOP 1727 077F 2 FALSE 0 0 604 PRTWRD 1732 0789 2 FALSE 0 0 605 INPUT:LOWCHR 1733 078C 2 FALSE 0 0 606 PRTWRD 1736 0793 2 FALSE 0 0 607 INPUT:LOOP 1737 0796 2 FALSE 0 0 608 BUFFER1 1742 079B 2 FALSE 0 0 609 PRTWRD 1757 07AA 2 FALSE 0 0 610 SIOTX 1769 07B4 2 FALSE 0 0 611 SIOTX 1771 07BA 2 FALSE 0 0 612 RBWPTR 1792 07C6 2 FALSE 0 0 613 INKEY:EXIT 1796 07CC 2 FALSE 0 0 614 RINGRD 1797 07D1 2 FALSE 0 0 615 RBWPTR 1817 07DF 2 FALSE 0 0 616 RINGRD:CONT 1821 07E6 2 FALSE 0 0 617 RBOVFL 1822 07E8 2 FALSE 0 0 618 RINGRD:WAIT 1826 07EF 2 FALSE 0 0 619 RINGRD:CKCHR 1829 07F6 2 FALSE 0 0 620 RTSON 1830 07FB 2 FALSE 0 0 621 RINGRD:EXIT 1831 07FE 2 FALSE 0 0 622 RBWPTR 1833 0800 2 FALSE 0 0 623 RINGRD:WAIT 1837 0806 2 FALSE 0 0 624 RINGRD:CKCHR 1841 080C 2 FALSE 0 0 625 RINGB 1844 080F 2 FALSE 0 0 626 RINGRD:EXIT 1846 0813 2 FALSE 0 0 627 SIOSTA 1875 0828 2 FALSE 0 0 628 SIORX:LOOP 1880 0831 2 FALSE 0 0 629 SIODAT 1883 0832 2 FALSE 0 0 630 SIOTX 1893 083D 2 FALSE 0 0 631 SIOSTA 1910 084A 2 FALSE 0 0 632 SIOTX:LOOP 1915 0853 2 FALSE 0 0 633 SIODAT 1918 0854 2 FALSE 0 0 634 SIOCMD 1935 085C 2 FALSE 0 0 635 SIOMOD 1938 085E 2 FALSE 0 0 636 SIOMR1 1939 0860 2 FALSE 0 0 637 SIOMR2 1942 0863 2 FALSE 0 0 638 SIOCMD 1945 0865 2 FALSE 0 0 639 SIOCR 1946 0867 2 FALSE 0 0 640 SIOCMD 1966 0870 2 FALSE 0 0 641 SIOCMD 1989 087D 2 FALSE 0 0 642 MSG2 2009 0889 2 FALSE 0 0 643 PRINT 2010 088E 2 FALSE 0 0 644 DSPSGN:DISP 2028 089B 2 FALSE 0 0 645 BIOS 2033 08A5 2 FALSE 0 0 646 DSPNUM 2039 08AD 2 FALSE 0 0 647 DSPNUM:START 2058 08BD 2 FALSE 0 0 648 SIOTX 2060 08C4 2 FALSE 0 0 649 DSPNUM:QUIT 2061 08C7 2 FALSE 0 0 650 DSPNUM:NUM1 2065 08CF 2 FALSE 0 0 651 DSPNUM:NUM1 2067 08D6 2 FALSE 0 0 652 DSPNUM:NUM1 2069 08DD 2 FALSE 0 0 653 DSPNUM:NUM1 2071 08E4 2 FALSE 0 0 654 DSPNUM:NUM1 2073 08EB 2 FALSE 0 0 655 DSPNUM:NUM2 2083 08F8 2 FALSE 0 0 656 DSPNUM:EXIT 2087 08FE 2 FALSE 0 0 657 BIOS 2090 0906 2 FALSE 0 0 658 WRD2HEX 2103 0910 2 FALSE 0 0 659 PRINT 2104 0915 2 FALSE 0 0 660 BUFFER2 2121 0921 2 FALSE 0 0 661 BIOS 2122 0926 2 FALSE 0 0 662 DEC2BN:PLUS 2131 092F 2 FALSE 0 0 663 DEC2BN:CNVERT 2133 0933 2 FALSE 0 0 664 DEC2BN:CHKDIG 2136 0938 2 FALSE 0 0 665 DEC2BN:SIGN 2141 093E 2 FALSE 0 0 666 DEC2BN:ERROR 2143 0943 2 FALSE 0 0 667 DEC2BN:ERROR 2145 0947 2 FALSE 0 0 668 DEC2BN:CNVERT 2156 0952 2 FALSE 0 0 669 DEC2BN:EXIT 2160 0957 2 FALSE 0 0 670 DEC2BN:EXIT 2163 095C 2 FALSE 0 0 Start = 0000 End = 0C1A Length = 0C1B (3099 words) Errors : 0 Warnings: 0 Press to quit