OpenCores
URL https://opencores.org/ocsvn/raptor64/raptor64/trunk

Subversion Repositories raptor64

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /raptor64
    from Rev 45 to Rev 46
    Reverse comparison

Rev 45 → Rev 46

/trunk/software/sample code/sieve.v
0,0 → 1,302
rommem[64] = 65'h132200285544F4F42;
rommem[65] = 65'h00000000000000000;
rommem[66] = 65'h0FFFFFFFFFFFFFFFF;
rommem[67] = 65'h0FFFFFFFFFFFFFFFF;
rommem[68] = 65'h0FFFFFFFFFFFFFFFF;
rommem[69] = 65'h0FFFFFFFFFFFFFFFF;
rommem[70] = 65'h0FFFFFFFFFFFFFFFF;
rommem[71] = 65'h0FFFFFFFFFFFFFFFF;
rommem[72] = 65'h0FFFFFFFFFFFFFFFF;
rommem[73] = 65'h0FFFFFFFFFFFFFFFF;
rommem[74] = 65'h0FFFFFFFFFFFFFFFF;
rommem[75] = 65'h0FFFFFFFFFFFFFFFF;
rommem[76] = 65'h0FFFFFFFFFFFFFFFF;
rommem[77] = 65'h0FFFFFFFFFFFFFFFF;
rommem[78] = 65'h0FFFFFFFFFFFFFFFF;
rommem[79] = 65'h0FFFFFFFFFFFFFFFF;
rommem[80] = 65'h0FFFFFFFFFFFFFFFF;
rommem[81] = 65'h0FFFFFFFFFFFFFFFF;
rommem[82] = 65'h0FFFFFFFFFFFFFFFF;
rommem[83] = 65'h0FFFFFFFFFFFFFFFF;
rommem[84] = 65'h0FFFFFFFFFFFFFFFF;
rommem[85] = 65'h0FFFFFFFFFFFFFFFF;
rommem[86] = 65'h0FFFFFFFFFFFFFFFF;
rommem[87] = 65'h0FFFFFFFFFFFFFFFF;
rommem[88] = 65'h0FFFFFFFFFFFFFFFF;
rommem[89] = 65'h0FFFFFFFFFFFFFFFF;
rommem[90] = 65'h0FFFFFFFFFFFFFFFF;
rommem[91] = 65'h0FFFFFFFFFFFFFFFF;
rommem[92] = 65'h0FFFFFFFFFFFFFFFF;
rommem[93] = 65'h0FFFFFFFFFFFFFFFF;
rommem[94] = 65'h0FFFFFFFFFFFFFFFF;
rommem[95] = 65'h0FFFFFFFFFFFFFFFF;
rommem[96] = 65'h0FFFFFFFFFFFFFFFF;
rommem[97] = 65'h0FFFFFFFFFFFFFFFF;
rommem[98] = 65'h0FFFFFFFFFFFFFFFF;
rommem[99] = 65'h0FFFFFFFFFFFFFFFF;
rommem[100] = 65'h0FFFFFFFFFFFFFFFF;
rommem[101] = 65'h0FFFFFFFFFFFFFFFF;
rommem[102] = 65'h0FFFFFFFFFFFFFFFF;
rommem[103] = 65'h0FFFFFFFFFFFFFFFF;
rommem[104] = 65'h0FFFFFFFFFFFFFFFF;
rommem[105] = 65'h0FFFFFFFFFFFFFFFF;
rommem[106] = 65'h0FFFFFFFFFFFFFFFF;
rommem[107] = 65'h0FFFFFFFFFFFFFFFF;
rommem[108] = 65'h0FFFFFFFFFFFFFFFF;
rommem[109] = 65'h0FFFFFFFFFFFFFFFF;
rommem[110] = 65'h0FFFFFFFFFFFFFFFF;
rommem[111] = 65'h0FFFFFFFFFFFFFFFF;
rommem[112] = 65'h0FFFFFFFFFFFFFFFF;
rommem[113] = 65'h0FFFFFFFFFFFFFFFF;
rommem[114] = 65'h0FFFFFFFFFFFFFFFF;
rommem[115] = 65'h0FFFFFFFFFFFFFFFF;
rommem[116] = 65'h0FFFFFFFFFFFFFFFF;
rommem[117] = 65'h0FFFFFFFFFFFFFFFF;
rommem[118] = 65'h0FFFFFFFFFFFFFFFF;
rommem[119] = 65'h0FFFFFFFFFFFFFFFF;
rommem[120] = 65'h0FFFFFFFFFFFFFFFF;
rommem[121] = 65'h0FFFFFFFFFFFFFFFF;
rommem[122] = 65'h0FFFFFFFFFFFFFFFF;
rommem[123] = 65'h0FFFFFFFFFFFFFFFF;
rommem[124] = 65'h0FFFFFFFFFFFFFFFF;
rommem[125] = 65'h0FFFFFFFFFFFFFFFF;
rommem[126] = 65'h0FFFFFFFFFFFFFFFF;
rommem[127] = 65'h0FFFFFFFFFFFFFFFF;
rommem[128] = 65'h0FFFFFFFFFFFFFFFF;
rommem[129] = 65'h0FFFFFFFFFFFFFFFF;
rommem[130] = 65'h167ED80000FEF0018;
rommem[131] = 65'h067EF801067EE0008;
rommem[132] = 65'h0EE800402E6800747;
rommem[133] = 65'h103ED80096A0D702D;
rommem[134] = 65'h1EE800003E6835028;
rommem[135] = 65'h00FEF003805ED7805;
rommem[136] = 65'h067E6000867E58000;
rommem[137] = 65'h167E7001867E68010;
rommem[138] = 65'h067E8002867E78020;
rommem[139] = 65'h01607FFFF67E88030;
rommem[140] = 65'h1EEBFFFFDE688E4F0;
rommem[141] = 65'h1023800096BBD0C2D;
rommem[142] = 65'h0E69C0600160080AB;
rommem[143] = 65'h16A0D0428EE800003;
rommem[144] = 65'h0021180093020027D;
rommem[145] = 65'h1160080AC02388009;
rommem[146] = 65'h0EE800003E69C0600;
rommem[147] = 65'h0160080176A0D0428;
rommem[148] = 65'h00181CD1703E10009;
rommem[149] = 65'h0000000140FEF0008;
rommem[150] = 65'h0DE000000DE000000;
rommem[151] = 65'h0DE000000DE000000;
rommem[152] = 65'h0160080AE67E20000;
rommem[153] = 65'h0EE800003E69C0600;
rommem[154] = 65'h0DE0000006A0D0428;
rommem[155] = 65'h0DE000000DE000000;
rommem[156] = 65'h0DE000000DE000000;
rommem[157] = 65'h0000000140FEF0010;
rommem[158] = 65'h0DE000000DE000000;
rommem[159] = 65'h0DE000000DE000000;
rommem[160] = 65'h167E88008DE000000;
rommem[161] = 65'h0DE00000000000014;
rommem[162] = 65'h0DE000000DE000000;
rommem[163] = 65'h0DE000000DE000000;
rommem[164] = 65'h0EE800402E6800412;
rommem[165] = 65'h000000014040D0C09;
rommem[166] = 65'h0DE000000DE000000;
rommem[167] = 65'h0DE000000DE000000;
rommem[168] = 65'h067E18000DE000000;
rommem[169] = 65'h0DE000000DE000000;
rommem[170] = 65'h0DE000000DE000000;
rommem[171] = 65'h1160080AEDE000000;
rommem[172] = 65'h0EE800003E69C0600;
rommem[173] = 65'h0000000286A0D0428;
rommem[174] = 65'h10BEF0010302001D4;
rommem[175] = 65'h10BEF000847E20000;
rommem[176] = 65'h1160080AD02118009;
rommem[177] = 65'h0EE800003E69C0600;
rommem[178] = 65'h1000000406A0D0428;
rommem[179] = 65'h0040D0C09E696E360;
rommem[180] = 65'h11601800002370009;
rommem[181] = 65'h1BEB700A102358009;
rommem[182] = 65'h06B058F1308B18002;
rommem[183] = 65'h1BE007F8A0AB58001;
rommem[184] = 65'h10235800916018000;
rommem[185] = 65'h06B058F03BEB701C1;
rommem[186] = 65'h16B058F03BE378148;
rommem[187] = 65'h00C41800206320200;
rommem[188] = 65'h1BEC700A102360009;
rommem[189] = 65'h06B058F036B063F13;
rommem[190] = 65'h0BE007F8A04C1B002;
rommem[191] = 65'h1BE007E6A0AB58001;
rommem[192] = 65'h00236000916018000;
rommem[193] = 65'h10235800916018000;
rommem[194] = 65'h0E68186A0BEB701A1;
rommem[195] = 65'h16B058F03BECD0161;
rommem[196] = 65'h06B058F03BE3780E8;
rommem[197] = 65'h0E6BCAFF008C60001;
rommem[198] = 65'h16BBD102DEEBFFFFC;
rommem[199] = 65'h10AB580016A460F13;
rommem[200] = 65'h10FEF0010BE007E8A;
rommem[201] = 65'h067E2800067E20008;
rommem[202] = 65'h147E200083020027D;
rommem[203] = 65'h00BEF001047E28000;
rommem[204] = 65'h00236800902118009;
rommem[205] = 65'h067E200080FEF0010;
rommem[206] = 65'h00FEF001067E28000;
rommem[207] = 65'h067E1800804D88C04;
rommem[208] = 65'h0EE800402E6800412;
rommem[209] = 65'h067E18000040D0C09;
rommem[210] = 65'h10BEF0010302001D4;
rommem[211] = 65'h047E2800047E20008;
rommem[212] = 65'h1021180090BEF0010;
rommem[213] = 65'h10235800916018000;
rommem[214] = 65'h0BEBD02C1E68186A0;
rommem[215] = 65'h067E200080FEF0010;
rommem[216] = 65'h00FEF001067E28000;
rommem[217] = 65'h1EEBFFFFCE6BCAFF0;
rommem[218] = 65'h16A3593036BBD0C2D;
rommem[219] = 65'h1E680041267E20008;
rommem[220] = 65'h0040D1009EE800402;
rommem[221] = 65'h1302001D467E20000;
rommem[222] = 65'h047E200080BEF0010;
rommem[223] = 65'h00BEF001047E28000;
rommem[224] = 65'h00AB5800102120009;
rommem[225] = 65'h116008000BE007D4A;
rommem[226] = 65'h147E8002847E88030;
rommem[227] = 65'h047E7001847E78020;
rommem[228] = 65'h147E6000847E68010;
rommem[229] = 65'h10BEF003847E58000;
rommem[230] = 65'h047ED800003BF0009;
rommem[231] = 65'h047EF801047EE0008;
rommem[232] = 65'h047BF800837EF8018;
rommem[233] = 65'h1BE007E2A67BF8010;
rommem[234] = 65'h0E69C0600160080B0;
rommem[235] = 65'h16A0D0428EE800003;
rommem[236] = 65'h167ED80000FEF0018;
rommem[237] = 65'h067EF801067EE0008;
rommem[238] = 65'h0EE800402E6800937;
rommem[239] = 65'h103ED80096A0D702D;
rommem[240] = 65'h10FEF00180FEF0008;
rommem[241] = 65'h067E6000867E58000;
rommem[242] = 65'h147B1801867E68010;
rommem[243] = 65'h0E680094302360009;
rommem[244] = 65'h0040D3409EE800402;
rommem[245] = 65'h0E69C0600160080AE;
rommem[246] = 65'h16A0D0428EE800003;
rommem[247] = 65'h0023580099BB18018;
rommem[248] = 65'h1BE300A6842C18000;
rommem[249] = 65'h1B230422542C18000;
rommem[250] = 65'h142C180000AC60002;
rommem[251] = 65'h00430040902318015;
rommem[252] = 65'h1B0101163B0100525;
rommem[253] = 65'h0B0102B73B0101E64;
rommem[254] = 65'h10FEF0010BE00070A;
rommem[255] = 65'h067E2800067E20008;
rommem[256] = 65'h0160180250FEF0008;
rommem[257] = 65'h134DF800067E18000;
rommem[258] = 65'h047E200080BEF0008;
rommem[259] = 65'h00BEF001047E28000;
rommem[260] = 65'h0BE00056A02118009;
rommem[261] = 65'h10FEF00100AB58008;
rommem[262] = 65'h067E2800067E20008;
rommem[263] = 65'h046B180000FEF0008;
rommem[264] = 65'h134DF800067E18000;
rommem[265] = 65'h047E200080BEF0008;
rommem[266] = 65'h00BEF001047E28000;
rommem[267] = 65'h0BE0003AA02118009;
rommem[268] = 65'h10FEF00100AB58008;
rommem[269] = 65'h067E2800067E20008;
rommem[270] = 65'h046B180000FEF0008;
rommem[271] = 65'h13020026267E18000;
rommem[272] = 65'h047E200080BEF0008;
rommem[273] = 65'h00BEF001047E28000;
rommem[274] = 65'h0BE0001EA02118009;
rommem[275] = 65'h10FEF00100AB58008;
rommem[276] = 65'h067E2800067E20008;
rommem[277] = 65'h046B180000FEF0008;
rommem[278] = 65'h03020027467E18000;
rommem[279] = 65'h047E200080BEF0008;
rommem[280] = 65'h00BEF001047E28000;
rommem[281] = 65'h1BE00002A02118009;
rommem[282] = 65'h10FEF0010BE0001CA;
rommem[283] = 65'h067E2800067E20008;
rommem[284] = 65'h042C180000FEF0008;
rommem[285] = 65'h067E1800002318015;
rommem[286] = 65'h00BEF000834DF8000;
rommem[287] = 65'h047E2800047E20008;
rommem[288] = 65'h1021180090BEF0010;
rommem[289] = 65'h0BE0075AA0AC60002;
rommem[290] = 65'h147E6000847E68010;
rommem[291] = 65'h00BEF001847E58000;
rommem[292] = 65'h047ED800003BF0009;
rommem[293] = 65'h047EF801047EE0008;
rommem[294] = 65'h047BF800837EF8018;
rommem[295] = 65'h0BE007EAA67BF8010;
rommem[296] = 65'h167ED80000FEF0018;
rommem[297] = 65'h1160080AF03ED8009;
rommem[298] = 65'h0EE800003E69C0600;
rommem[299] = 65'h01600800A6A0D0428;
rommem[300] = 65'h01601800147B10018;
rommem[301] = 65'h1160080B00181CD17;
rommem[302] = 65'h0EE800003E69C0600;
rommem[303] = 65'h103BF00096A0D0428;
rommem[304] = 65'h037EF801847ED8000;
rommem[305] = 65'h167ED80000FEF0018;
rommem[306] = 65'h1160080B103ED8009;
rommem[307] = 65'h0EE800003E69C0600;
rommem[308] = 65'h1160080156A0D0428;
rommem[309] = 65'h11601800547B10018;
rommem[310] = 65'h0160080B20181CD17;
rommem[311] = 65'h0EE800003E69C0600;
rommem[312] = 65'h103BF00096A0D0428;
rommem[313] = 65'h037EF801847ED8000;
rommem[314] = 65'h167ED80000FEF0018;
rommem[315] = 65'h11600801403ED8009;
rommem[316] = 65'h00181CD1747B10018;
rommem[317] = 65'h047ED800003BF0009;
rommem[318] = 65'h00FEF001837EF8018;
rommem[319] = 65'h103ED800967ED8000;
rommem[320] = 65'h00181D01716008000;
rommem[321] = 65'h047ED800003BF0009;
rommem[322] = 65'h00FEF001837EF8018;
rommem[323] = 65'h067EE000867ED8000;
rommem[324] = 65'h1E6800ADF67EF8010;
rommem[325] = 65'h16A0D702DEE800402;
rommem[326] = 65'h1160080AA03ED8009;
rommem[327] = 65'h0EE800003E69C0600;
rommem[328] = 65'h0E68002086A0D0428;
rommem[329] = 65'h16A0D7813EE800402;
rommem[330] = 65'h0EE80041FE6BFFFF8;
rommem[331] = 65'h016008017040D7809;
rommem[332] = 65'h00181CD1703E10009;
rommem[333] = 65'h1EE800402E6800A8B;
rommem[334] = 65'h1302001046A0D702D;
rommem[335] = 65'h1EE800402E6800208;
rommem[336] = 65'h1BE00022A6A0D7803;
rommem[337] = 65'h067E200080FEF0010;
rommem[338] = 65'h00FEF000867E28000;
rommem[339] = 65'h0EE800402E6800412;
rommem[340] = 65'h067E18000040D0C09;
rommem[341] = 65'h10BEF000830200274;
rommem[342] = 65'h047E2800047E20008;
rommem[343] = 65'h1E68002080BEF0010;
rommem[344] = 65'h06A0D7803EE800402;
rommem[345] = 65'h047ED800003BF0009;
rommem[346] = 65'h047EF801047EE0008;
rommem[347] = 65'h047BF800837EF8018;
rommem[348] = 65'h0BE007F2A67BF8010;
rommem[349] = 65'h00000000000000000;
rommem[350] = 65'h10067006F00720050;
rommem[351] = 65'h10020006D00610072;
rommem[352] = 65'h00072006F00620061;
rommem[353] = 65'h00020006400650074;
rommem[354] = 65'h1006F006E00620061;
rommem[355] = 65'h0006C0061006D0072;
rommem[356] = 65'h00025002E0079006C;
rommem[357] = 65'h0006C0043000A0064;
rommem[358] = 65'h00020006B0063006F;
rommem[359] = 65'h1006B006300690074;
rommem[360] = 65'h00064002500200073;
rommem[361] = 65'h100740053000A000D;
rommem[362] = 65'h00020007400720061;
rommem[363] = 65'h1006B006300690074;
rommem[364] = 65'h0000D006400250020;
rommem[365] = 65'h00000000000000000;
/trunk/software/sample code/sieve.lis
0,0 → 1,259
1 /*#include <stdio.h>*/
2
3 #define LIMIT 1500000 /*size of integers array*/
4 #define PRIMES 100000 /*size of primes array*/
5
6 nocall my_org() {
7 asm {
8 org 0x100800200
9 db "BOOT"
10 jmp crt_start
11 .align 8
12 sp_save:
13 dw 0
14 }
15 }
16
 
 
*** local symbol table ***
 
 
 
 
17 int main(){
18 int i,j,numbers[LIMIT];
19 int primes[PRIMES];
20 int limit;
21 int start_tick,end_tick;
22
23 asm {
24 sei
25 lw r1,#0xAB
26 outb r1,0xdc0600
27 }
28 start_tick = get_tick();
29 asm {
30 lw r1,#0xAC
31 outb r1,0xdc0600
32 }
33 printf("Start tick %d\r\n", start_tick);
34 asm {
35 lw r1,#0xAD
36 outb r1,0xdc0600
37 cli
38 }
39
40 limit=LIMIT;
41
42 /*fill the array with natural numbers*/
43 for (i=0;i<limit;i++){
44 numbers[i]=i+2;
45 }
46
47 /*sieve the non-primes*/
48 for (i=0;i<limit;i++){
49 if (numbers[i]!=-1){
50 for (j=2*numbers[i]-2;j<limit;j+=numbers[i])
51 numbers[j]=-1;
52 }
53 }
54
55 /*transfer the primes to their own array*/
56 j = 0;
57 for (i=0;i<limit&&j<PRIMES;i++)
58 if (numbers[i]!=-1)
59 primes[j++] = numbers[i];
60
61 end_tick = get_tick();
62 printf("Clock ticks %d\r\n", end_tick-start_tick);
63
64 /*print*/
65 for (i=0;i<PRIMES;i++)
66 printf("%d\n",primes[i]);
67
68 return 0;
69 }
70
 
 
*** local symbol table ***
 
i =fffffff8 - Auto Long
j =fffffff0 - Auto Long
numbers =ff48e4f0 - Auto Array of Long
primes =ff3caff0 - Auto Array of Long
limit =ff3cafe8 - Auto Long
start_tick =ff3cafe0 - Auto Long
end_tick =ff3cafd8 - Auto Long
 
 
 
71 int printf(char *p)
72 {
73 int *q;
74 asm {
75 lw r1,#0xAE
76 outb r1,0xdc0600
77 }
78 q = &p;
79
80 for (; *p; p++) {
81 if (*p=='%') {
82 p++;
83 switch(*p) {
84 case '%':
85 putch('%');
86 break;
87 case 'c':
88 q++;
89 putch(*q);
90 break;
91 case 'd':
92 q++;
93 putnum(*q);
94 break;
95 case 's':
96 q++;
97 putstr(*q);
98 break;
99 }
100 }
101 else
102 putch(*p);
103 }
104 }
105
 
 
*** local symbol table ***
 
p =000018 - Auto Pointer to Char
q =fffffff8 - Auto Pointer to Long
 
 
 
106 void putch(char ch)
107 {
108 asm {
109 lw r1,#0xAF
110 outb r1,0xdc0600
111 }
112 asm {
113 lw r1,#0x0a
114 lw r2,24[bp]
115 lw r3,#1
116 syscall #410
117 }
118 asm {
119 lw r1,#0xB0
120 outb r1,0xdc0600
121 }
122 }
123
 
 
*** local symbol table ***
 
ch =000018 - Auto Char
 
 
 
124 void putnum(int num)
125 {
126 asm {
127 lw r1,#0xB1
128 outb r1,0xdc0600
129 }
130 asm {
131 lw r1,#0x15
132 lw r2,24[bp]
133 lw r3,#5
134 syscall #410
135 }
136 asm {
137 lw r1,#0xB2
138 outb r1,0xdc0600
139 }
140 }
141
 
 
*** local symbol table ***
 
num =000018 - Auto Long
 
 
 
142 void putstr(char *p)
143 {
144 asm {
145 lw r1,#0x14
146 lw r2,24[bp]
147 syscall #410
148 }
149 }
150
 
 
*** local symbol table ***
 
p =000018 - Auto Pointer to Char
 
 
 
151 int get_tick()
152 {
153 asm {
154 lw r1,#0
155 syscall #416
156 }
157 }
158
 
 
*** local symbol table ***
 
 
 
 
159 void crt_start()
160 {
161 asm {
162 lw r1,#0xAA
163 outb r1,0xdc0600
164 sw sp,sp_save
165 lw sp,#0x1_07FFFFF8
166 lea xlr,prog_abort
167 call main
168 lw sp,sp_save
169 bra retcode
170 prog_abort:
171 }
172 putstr("Program aborted abnormally.");
173 asm {
174 lw sp,sp_save
175 retcode:
176 }
177 }
 
 
*** local symbol table ***
 
 
 
 
*** global scope typedef symbol table ***
 
putch =000000 - Global Function returning
get_tick =000000 - Global Function returning Long
my_org =000000 - Global Function returning
printf =000000 - Global Function returning Long
main =000000 - Global Function returning Long
putnum =000000 - Global Function returning
putstr =000000 - Global Function returning
crt_start =000000 - Global Function returning
 
*** structures and unions ***
 
/trunk/software/sample code/bootrom.lst
1,7 → 1,10
; ============================================================================
; (C) 2012,2013 Robert Finch, Stratford
; All Rights Reserved.
; robfinch<remove>@opencores.org
; __
; \\__/ o\ (C) 2012-2013 Robert Finch, Stratford
; \ __ / All rights reserved.
; \/_// robfinch<remove>@opencores.org
; ||
;
;
; This source file is free software: you can redistribute it and/or modify
; it under the terms of the GNU Lesser General Public License as published
23,11 → 26,17
TAB EQU 0x09
CTRLC EQU 0x03
CTRLH EQU 0x08
CTRLI EQU 0x09
CTRLJ EQU 0x0A
CTRLK EQU 0x0B
CTRLM EQU 0x0D
CTRLS EQU 0x13
CTRLX EQU 0x18
XON EQU 0x11
XOFF EQU 0x13
EX_IRQ EQU 449
DATA_PRESENT EQU 0x01 ; there is data preset at the serial port bc_uart3
XMIT_NOT_FULL EQU 0x20
90,15 → 99,19
TCBr30 EQU 0xE8
TCBr31 EQU 0xF0
SCREENGATE EQU 0x00
KEYBDGATE EQU 0x01
VIDEOGATE EQU 0x02
CARDGATE EQU 0x03
warmStart EQU 0x1020
usrJmp EQU 0x1028
TickIRQAddr EQU 0x1030
TaskBlock EQU 0x1038
tencount EQU 0x13F8
Milliseconds EQU 0x1400
Lastloc EQU 0x1408
CharColor EQU 0x1410
ScreenColor EQU 0x1414
CursorRow EQU 0x1416
CursorRow EQU 0x1417
CursorCol EQU 0x1418
CursorFlash EQU 0x141A
KeybdEcho EQU 0x141C
105,6 → 118,11
KeybdBuffer EQU 0x1440
KeybdHead EQU 0x1450
KeybdTail EQU 0x1451
sp_save EQU 0x1460
lr_save EQU 0x1468
r1_save EQU 0x1470
r2_save EQU 0x1478
r26_save EQU 0x1480
Score EQU 0x1500
Manpos EQU 0x1508
MissileActive EQU 0x1510
148,11 → 166,34
r2save EQU 0x20B8
AXCstart EQU 0x20C0
; Context startup address table
;
ctx0start EQU 0x20D0
ctx1start EQU 0x20D8
ctx2start EQU 0x20E0
ctx3start EQU 0x20E8
ctx4start EQU 0x20F0
ctx5start EQU 0x20F8
ctx6start EQU 0x2100
ctx7start EQU 0x2108
ctx8start EQU 0x2110
ctx9start EQU 0x2118
ctx10start EQU 0x2120
ctx11start EQU 0x2128
ctx12start EQU 0x2130
ctx13start EQU 0x2138
ctx14start EQU 0x2140
ctx15start EQU 0x2148
sp_saves EQU 0x2200
sp_saves_end EQU 0x2280
p100IRQvec EQU 0x3000
keybdIRQvec EQU 0x3008
serialIRQvec EQU 0x3010
rasterIRQvec EQU 0x3018
startSector EQU 0x30F8
BPB EQU 0x3100
TEXTSCR EQU 0xD0_0000
COLORSCR EQU 0xD1_0000
TEXTREG EQU 0xDA_0000
169,6 → 210,34
UART_IE EQU 0xDC_0A04
UART_MC EQU 0xDC_0A06
DATETIME EQU 0xDC_0400
SPIMASTER EQU 0xDC_0500
SPI_MASTER_VERSION_REG EQU 0x00
SPI_MASTER_CONTROL_REG EQU 0x01
SPI_TRANS_TYPE_REG EQU 0x02
SPI_TRANS_CTRL_REG EQU 0x03
SPI_TRANS_STATUS_REG EQU 0x04
SPI_TRANS_ERROR_REG EQU 0x05
SPI_DIRECT_ACCESS_DATA_REG EQU 0x06
SPI_SD_ADDR_7_0_REG EQU 0x07
SPI_SD_ADDR_15_8_REG EQU 0x08
SPI_SD_ADDR_23_16_REG EQU 0x09
SPI_SD_ADDR_31_24_REG EQU 0x0a
SPI_RX_FIFO_DATA_REG EQU 0x10
SPI_RX_FIFO_DATA_COUNT_MSB EQU 0x12
SPI_RX_FIFO_DATA_COUNT_LSB EQU 0x13
SPI_RX_FIFO_CTRL_REG EQU 0x14
SPI_TX_FIFO_DATA_REG EQU 0x20
SPI_TX_FIFO_CTRL_REG EQU 0x24
SPI_INIT_SD EQU 0x01
SPI_TRANS_START EQU 0x01
SPI_TRANS_BUSY EQU 0x01
SPI_INIT_NO_ERROR EQU 0x00
SPI_READ_NO_ERROR EQU 0x00
RW_READ_SD_BLOCK EQU 0x02
RW_WRITE_SD_BLOCK EQU 0x03
PIC EQU 0xDC_0FF0
PIC_IE EQU 0xDC_0FF2
180,7 → 249,12
SPRRAM EQU 0xD8_0000
AC97 EQU 0xDC_1000
TMP EQU 0xDC_0300
LED EQU 0xDC_0600
ETHMAC EQU 0xDC_2000
CONFIGREC EQU 0xDC_FFFF
MIIMODER EQU 0x28
MIIADDRESS EQU 0x30
GACCEL EQU 0xDA_E000
RASTERIRQ EQU 0xDA_0100
BOOT_STACK EQU 0xFFFF_FFFF_FFFE_FFF8
187,6 → 261,8
SPRITEREGS EQU 0xDA_D000
BITMAPSCR EQU 0x00000001_00200000
BOOTJMP EQU 0x100800204
txempty EQU 0x40
rxfull EQU 0x01
194,17 → 270,15
; Internal variables follow:
;
0000000100600000 bss
0000000000001038 org 0x1038
0000000000001048 org 0x1048
0000000000000000 pos dh 0 ; text screen position
0000000000001040 org 0x1040
1040 0000000000000000 lineLinkTbl fill.b 25,0 ; screen line link table
1048 0000000000000000
1050 0000000000000000
1050 0000000000000000 lineLinkTbl fill.b 47,0 ; screen line link table
1058 0000000000000000
0000000000001068 align 8
0000000000001080 org 0x1080
1060 0000000000000000
1068 0000000000000000
1070 0000000000000000
1078 0000000000000000
0000000000001088 align 8
0000000000001088 0000000000000001 OSSP dw 1 ; OS value of sp
0000000000001090 0000000000000001 CURRNT dw 1 ; Current line pointer
254,33 → 328,63
; jump table
;
FFFFFFFFFFFFB000 33FFED54 jmp SerialGetChar
FFFFFFFFFFFFB004 33FFED0C jmp SerialPutChar
FFFFFFFFFFFFB008 33FFEE06 jmp SetKeyboardEcho
FFFFFFFFFFFFB00C 33FFEE1D jmp KeybdCheckForKey
FFFFFFFFFFFFB010 33FFEE08 jmp KeybdGetChar
FFFFFFFFFFFFB014 33FFEF47 jmp DisplayChar
FFFFFFFFFFFFB018 33FFEFE7 jmp DisplayString
FFFFFFFFFFFFB000 33FFEDA4 jmp SerialGetChar
FFFFFFFFFFFFB004 33FFED5C jmp SerialPutChar
FFFFFFFFFFFFB008 33FFEF05 jmp SetKeyboardEcho
FFFFFFFFFFFFB00C 33FFEF1C jmp KeybdCheckForKey
FFFFFFFFFFFFB010 33FFEF07 jmp KeybdGetChar
FFFFFFFFFFFFB014 33FFF07F jmp DisplayChar
FFFFFFFFFFFFB018 33FFF122 jmp DisplayString
FFFFFFFFFFFFB01C 33FFF13F jmp DisplayNum
FFFFFFFFFFFFB020 33FFF06F jmp CalcScreenLoc
FFFFFFFFFFFFB024 33FFF011 jmp ClearScreen
FFFFFFFFFFFFB028 33FFF169 jmp DisplayWord
FFFFFFFFFFFFB01C start:
FFFFFFFFFFFFB02C start:
; lea MSGRAM,a1
; jsr DisplayString
FFFFFFFFFFFFB01C ColdStart:
FFFFFFFFFFFFB01C 0000000A icache_on ; turn on the ICache
FFFFFFFFFFFFB020 0000000D dcache_off ; turn on the DCache
FFFFFFFFFFFFB02C ColdStart:
FFFFFFFFFFFFB02C 0000000B icache_off ; turn on the ICache
FFFFFFFFFFFFB030 0000000D dcache_off ; turn on the DCache
; Make sure semaphores are available by closing the gates.
; We don't know what power up state is.
FFFFFFFFFFFFB034 02000075 cmgi #KEYBDGATE
FFFFFFFFFFFFB038 020000B5 cmgi #VIDEOGATE
; Initialize the context startup address table with NULL
FFFFFFFFFFFFB03C 0410840A xor r1,r1,r1
FFFFFFFFFFFFB040 6600A0D0 sw r1,ctx0start
FFFFFFFFFFFFB044 6600A0D8 sw r1,ctx1start
FFFFFFFFFFFFB048 6600A0E0 sw r1,ctx2start
FFFFFFFFFFFFB04C 6600A0E8 sw r1,ctx3start
FFFFFFFFFFFFB050 6600A0F0 sw r1,ctx4start
FFFFFFFFFFFFB054 6600A0F8 sw r1,ctx5start
FFFFFFFFFFFFB058 6600A100 sw r1,ctx6start
FFFFFFFFFFFFB05C 6600A108 sw r1,ctx7start
FFFFFFFFFFFFB060 6600A110 sw r1,ctx8start
FFFFFFFFFFFFB064 6600A118 sw r1,ctx9start
FFFFFFFFFFFFB068 6600A120 sw r1,ctx10start
FFFFFFFFFFFFB06C 6600A128 sw r1,ctx11start
FFFFFFFFFFFFB070 6600A130 sw r1,ctx12start
FFFFFFFFFFFFB074 6600A138 sw r1,ctx13start
FFFFFFFFFFFFB078 6600A140 sw r1,ctx14start
FFFFFFFFFFFFB07C 6600A148 sw r1,ctx15start
; Initialize the context schedule with all contexts treated equally
; There are only 16 contexts, but 256 schedule slots. Each context is
; given 16 slots distributed evenly throughout the execution pattern
; table.
;
FFFFFFFFFFFFB024 0410840A xor r1,r1,r1 ; r1 = 0
FFFFFFFFFFFFB028 ict1:
FFFFFFFFFFFFB028 0410803A mtep r1,r1 ; only the low order four bits of r1 will move to the pattern table
FFFFFFFFFFFFB02C 0A108001 addui r1,r1,#1
FFFFFFFFFFFFB030 101100FF cmpi r2,r1,#255
FFFFFFFFFFFFB034 BE207FA9 bne r2,r0,ict1
FFFFFFFFFFFFB080 0410840A xor r1,r1,r1 ; r1 = 0
FFFFFFFFFFFFB084 ict1:
FFFFFFFFFFFFB084 0410803A mtep r1,r1 ; only the low order four bits of r1 will move to the pattern table
FFFFFFFFFFFFB088 0A108001 addui r1,r1,#1
FFFFFFFFFFFFB08C 101100FF cmpi r2,r1,#255
FFFFFFFFFFFFB090 BE207FA9 bne r2,r0,ict1
; Point the interrupt return address register of the context to the
; context startup code. The context will start up when an interrupt return
288,133 → 392,115
;
; We cannot use a loop for this. Fortunately there's only 16 contexts.
;
FFFFFFFFFFFFB038 E6BFB214 ; SETLO
FFFFFFFFFFFFB03C 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB040 E6BEFFF8 ; SETLO
FFFFFFFFFFFFB044 6A0D782D lea r30,STACKTOP0
FFFFFFFFFFFFB048 0000000F iepp
FFFFFFFFFFFFB04C DE000000 nop
FFFFFFFFFFFFB050 DE000000 nop
FFFFFFFFFFFFB054 E6BFB214 ; SETLO
FFFFFFFFFFFFB058 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB05C E6BEFBF8 ; SETLO
FFFFFFFFFFFFB060 6A0D782D lea r30,STACKTOP1
FFFFFFFFFFFFB064 0000000F iepp
FFFFFFFFFFFFB068 DE000000 nop
FFFFFFFFFFFFB06C DE000000 nop
FFFFFFFFFFFFB070 E6BFB214 ; SETLO
FFFFFFFFFFFFB074 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB078 E6BEF7F8 ; SETLO
FFFFFFFFFFFFB07C 6A0D782D lea r30,STACKTOP2
FFFFFFFFFFFFB080 0000000F iepp
FFFFFFFFFFFFB084 DE000000 nop
FFFFFFFFFFFFB088 DE000000 nop
FFFFFFFFFFFFB08C E6BFB214 ; SETLO
FFFFFFFFFFFFB090 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB094 E6BEF3F8 ; SETLO
FFFFFFFFFFFFB098 6A0D782D lea r30,STACKTOP3
FFFFFFFFFFFFB09C 0000000F iepp
FFFFFFFFFFFFB0A0 DE000000 nop
FFFFFFFFFFFFB0A4 DE000000 nop
FFFFFFFFFFFFB0A8 E6BFB214 ; SETLO
FFFFFFFFFFFFB0AC 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB0B0 E6BEEFF8 ; SETLO
FFFFFFFFFFFFB0B4 6A0D782D lea r30,STACKTOP4
FFFFFFFFFFFFB0B8 0000000F iepp
FFFFFFFFFFFFB0BC DE000000 nop
FFFFFFFFFFFFB0C0 DE000000 nop
FFFFFFFFFFFFB0C4 E6BFB214 ; SETLO
FFFFFFFFFFFFB094 E6BFB228 ; SETLO
FFFFFFFFFFFFB098 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB09C 03900869 mtspr IPC,r25
FFFFFFFFFFFFB0A0 E6BEFFF8 ; SETLO
FFFFFFFFFFFFB0A4 6A0D782D lea r30,STACKTOP0
FFFFFFFFFFFFB0A8 0000000F iepp
FFFFFFFFFFFFB0AC E6BFB228 ; SETLO
FFFFFFFFFFFFB0B0 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB0B4 03900869 mtspr IPC,r25
FFFFFFFFFFFFB0B8 E6BEFBF8 ; SETLO
FFFFFFFFFFFFB0BC 6A0D782D lea r30,STACKTOP1
FFFFFFFFFFFFB0C0 0000000F iepp
FFFFFFFFFFFFB0C4 E6BFB228 ; SETLO
FFFFFFFFFFFFB0C8 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB0CC E6BEEBF8 ; SETLO
FFFFFFFFFFFFB0D0 6A0D782D lea r30,STACKTOP5
FFFFFFFFFFFFB0D4 0000000F iepp
FFFFFFFFFFFFB0D8 DE000000 nop
FFFFFFFFFFFFB0DC DE000000 nop
FFFFFFFFFFFFB0E0 E6BFB214 ; SETLO
FFFFFFFFFFFFB0E4 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB0E8 E6BEE7F8 ; SETLO
FFFFFFFFFFFFB0EC 6A0D782D lea r30,STACKTOP6
FFFFFFFFFFFFB0CC 03900869 mtspr IPC,r25
FFFFFFFFFFFFB0D0 E6BEF7F8 ; SETLO
FFFFFFFFFFFFB0D4 6A0D782D lea r30,STACKTOP2
FFFFFFFFFFFFB0D8 0000000F iepp
FFFFFFFFFFFFB0DC E6BFB228 ; SETLO
FFFFFFFFFFFFB0E0 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB0E4 03900869 mtspr IPC,r25
FFFFFFFFFFFFB0E8 E6BEF3F8 ; SETLO
FFFFFFFFFFFFB0EC 6A0D782D lea r30,STACKTOP3
FFFFFFFFFFFFB0F0 0000000F iepp
FFFFFFFFFFFFB0F4 DE000000 nop
FFFFFFFFFFFFB0F8 DE000000 nop
FFFFFFFFFFFFB0FC E6BFB214 ; SETLO
FFFFFFFFFFFFB100 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB104 E6BEE3F8 ; SETLO
FFFFFFFFFFFFB108 6A0D782D lea r30,STACKTOP7
FFFFFFFFFFFFB10C 0000000F iepp
FFFFFFFFFFFFB110 DE000000 nop
FFFFFFFFFFFFB114 DE000000 nop
FFFFFFFFFFFFB0F4 E6BFB228 ; SETLO
FFFFFFFFFFFFB0F8 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB0FC 03900869 mtspr IPC,r25
FFFFFFFFFFFFB100 E6BEEFF8 ; SETLO
FFFFFFFFFFFFB104 6A0D782D lea r30,STACKTOP4
FFFFFFFFFFFFB108 0000000F iepp
FFFFFFFFFFFFB10C E6BFB228 ; SETLO
FFFFFFFFFFFFB110 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB114 03900869 mtspr IPC,r25
FFFFFFFFFFFFB118 E6BEEBF8 ; SETLO
FFFFFFFFFFFFB11C 6A0D782D lea r30,STACKTOP5
FFFFFFFFFFFFB120 0000000F iepp
FFFFFFFFFFFFB124 E6BFB228 ; SETLO
FFFFFFFFFFFFB128 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB12C 03900869 mtspr IPC,r25
FFFFFFFFFFFFB130 E6BEE7F8 ; SETLO
FFFFFFFFFFFFB134 6A0D782D lea r30,STACKTOP6
FFFFFFFFFFFFB138 0000000F iepp
FFFFFFFFFFFFB13C E6BFB228 ; SETLO
FFFFFFFFFFFFB140 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB144 03900869 mtspr IPC,r25
FFFFFFFFFFFFB148 E6BEE3F8 ; SETLO
FFFFFFFFFFFFB14C 6A0D782D lea r30,STACKTOP7
FFFFFFFFFFFFB150 0000000F iepp
FFFFFFFFFFFFB118 E6BFB214 ; SETLO
FFFFFFFFFFFFB11C 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB120 E6BEDFF8 ; SETLO
FFFFFFFFFFFFB124 6A0D782D lea r30,STACKTOP8
FFFFFFFFFFFFB128 0000000F iepp
FFFFFFFFFFFFB12C DE000000 nop
FFFFFFFFFFFFB130 DE000000 nop
FFFFFFFFFFFFB134 E6BFB214 ; SETLO
FFFFFFFFFFFFB138 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB13C E6BEDBF8 ; SETLO
FFFFFFFFFFFFB140 6A0D782D lea r30,STACKTOP9
FFFFFFFFFFFFB144 0000000F iepp
FFFFFFFFFFFFB148 DE000000 nop
FFFFFFFFFFFFB14C DE000000 nop
FFFFFFFFFFFFB150 E6BFB214 ; SETLO
FFFFFFFFFFFFB154 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB158 E6BED7F8 ; SETLO
FFFFFFFFFFFFB15C 6A0D782D lea r30,STACKTOP10
FFFFFFFFFFFFB160 0000000F iepp
FFFFFFFFFFFFB164 DE000000 nop
FFFFFFFFFFFFB168 DE000000 nop
FFFFFFFFFFFFB16C E6BFB214 ; SETLO
FFFFFFFFFFFFB154 E6BFB228 ; SETLO
FFFFFFFFFFFFB158 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB15C 03900869 mtspr IPC,r25
FFFFFFFFFFFFB160 E6BEDFF8 ; SETLO
FFFFFFFFFFFFB164 6A0D782D lea r30,STACKTOP8
FFFFFFFFFFFFB168 0000000F iepp
FFFFFFFFFFFFB16C E6BFB228 ; SETLO
FFFFFFFFFFFFB170 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB174 E6BED3F8 ; SETLO
FFFFFFFFFFFFB178 6A0D782D lea r30,STACKTOP11
FFFFFFFFFFFFB17C 0000000F iepp
FFFFFFFFFFFFB180 DE000000 nop
FFFFFFFFFFFFB184 DE000000 nop
FFFFFFFFFFFFB174 03900869 mtspr IPC,r25
FFFFFFFFFFFFB178 E6BEDBF8 ; SETLO
FFFFFFFFFFFFB17C 6A0D782D lea r30,STACKTOP9
FFFFFFFFFFFFB180 0000000F iepp
FFFFFFFFFFFFB184 E6BFB228 ; SETLO
FFFFFFFFFFFFB188 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB18C 03900869 mtspr IPC,r25
FFFFFFFFFFFFB190 E6BED7F8 ; SETLO
FFFFFFFFFFFFB194 6A0D782D lea r30,STACKTOP10
FFFFFFFFFFFFB198 0000000F iepp
FFFFFFFFFFFFB19C E6BFB228 ; SETLO
FFFFFFFFFFFFB1A0 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB1A4 03900869 mtspr IPC,r25
FFFFFFFFFFFFB1A8 E6BED3F8 ; SETLO
FFFFFFFFFFFFB1AC 6A0D782D lea r30,STACKTOP11
FFFFFFFFFFFFB1B0 0000000F iepp
FFFFFFFFFFFFB188 E6BFB214 ; SETLO
FFFFFFFFFFFFB18C 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB190 E6BECFF8 ; SETLO
FFFFFFFFFFFFB194 6A0D782D lea r30,STACKTOP12
FFFFFFFFFFFFB198 0000000F iepp
FFFFFFFFFFFFB19C DE000000 nop
FFFFFFFFFFFFB1A0 DE000000 nop
FFFFFFFFFFFFB1A4 E6BFB214 ; SETLO
FFFFFFFFFFFFB1A8 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB1AC E6BECBF8 ; SETLO
FFFFFFFFFFFFB1B0 6A0D782D lea r30,STACKTOP13
FFFFFFFFFFFFB1B4 0000000F iepp
FFFFFFFFFFFFB1B8 DE000000 nop
FFFFFFFFFFFFB1BC DE000000 nop
FFFFFFFFFFFFB1C0 E6BFB214 ; SETLO
FFFFFFFFFFFFB1C4 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB1C8 E6BEC7F8 ; SETLO
FFFFFFFFFFFFB1CC 6A0D782D lea r30,STACKTOP14
FFFFFFFFFFFFB1D0 0000000F iepp
FFFFFFFFFFFFB1D4 DE000000 nop
FFFFFFFFFFFFB1D8 DE000000 nop
FFFFFFFFFFFFB1DC E6BFB214 ; SETLO
FFFFFFFFFFFFB1E0 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB1E4 E6BEC3F8 ; SETLO
FFFFFFFFFFFFB1E8 6A0D782D lea r30,STACKTOP15
FFFFFFFFFFFFB1EC 0000000F iepp
FFFFFFFFFFFFB1F0 DE000000 nop
FFFFFFFFFFFFB1F4 DE000000 nop
FFFFFFFFFFFFB1B4 E6BFB228 ; SETLO
FFFFFFFFFFFFB1B8 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB1BC 03900869 mtspr IPC,r25
FFFFFFFFFFFFB1C0 E6BECFF8 ; SETLO
FFFFFFFFFFFFB1C4 6A0D782D lea r30,STACKTOP12
FFFFFFFFFFFFB1C8 0000000F iepp
FFFFFFFFFFFFB1CC E6BFB228 ; SETLO
FFFFFFFFFFFFB1D0 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB1D4 03900869 mtspr IPC,r25
FFFFFFFFFFFFB1D8 E6BECBF8 ; SETLO
FFFFFFFFFFFFB1DC 6A0D782D lea r30,STACKTOP13
FFFFFFFFFFFFB1E0 0000000F iepp
FFFFFFFFFFFFB1E4 E6BFB228 ; SETLO
FFFFFFFFFFFFB1E8 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB1EC 03900869 mtspr IPC,r25
FFFFFFFFFFFFB1F0 E6BEC7F8 ; SETLO
FFFFFFFFFFFFB1F4 6A0D782D lea r30,STACKTOP14
FFFFFFFFFFFFB1F8 0000000F iepp
FFFFFFFFFFFFB1FC E6BFB228 ; SETLO
FFFFFFFFFFFFB200 6A0D642D lea r25,ctxstart
FFFFFFFFFFFFB204 03900869 mtspr IPC,r25
FFFFFFFFFFFFB208 E6BEC3F8 ; SETLO
FFFFFFFFFFFFB20C 6A0D782D lea r30,STACKTOP15
FFFFFFFFFFFFB210 0000000F iepp
; Ensure that context zero is the active context
;
FFFFFFFFFFFFB1F8 ctxstart3:
FFFFFFFFFFFFB1F8 02008568 mfspr r1,AXC
FFFFFFFFFFFFB1FC BE1000A8 beq r1,r0,ctxstart2
FFFFFFFFFFFFB200 0000000F iepp
FFFFFFFFFFFFB204 DE000000 nop
FFFFFFFFFFFFB208 DE000000 nop
FFFFFFFFFFFFB20C BE007F6A bra ctxstart3
FFFFFFFFFFFFB210 ctxstart2:
FFFFFFFFFFFFB210 6000A0C0 sb r1,AXCstart ; save off the startup context which should be context zero
FFFFFFFFFFFFB214 ctxstart3:
FFFFFFFFFFFFB214 02008568 mfspr r1,AXC
FFFFFFFFFFFFB218 BE100068 beq r1,r0,ctxstart2
FFFFFFFFFFFFB21C 0000000F iepp
FFFFFFFFFFFFB220 BE007FAA bra ctxstart3
FFFFFFFFFFFFB224 ctxstart2:
FFFFFFFFFFFFB224 6000A0C0 sb r1,AXCstart ; save off the startup context which should be context zero
; Entry point for context startup
;
421,153 → 507,274
; Avoid repeating all the system initialization when a context starts up by testing whether
; or not the context is the starting context.
;
FFFFFFFFFFFFB214 ctxstart:
FFFFFFFFFFFFB214 02008568 mfspr r1,AXC
FFFFFFFFFFFFB218 4A0120C0 lbu r2,AXCstart
FFFFFFFFFFFFB21C BE1107E9 bne r1,r2,ctxstart1
FFFFFFFFFFFFB228 ctxstart:
FFFFFFFFFFFFB228 02008568 mfspr r1,AXC
FFFFFFFFFFFFB22C 4A0120C0 lbu r2,AXCstart
FFFFFFFFFFFFB230 BE110E69 bne r1,r2,ctxstart1
;
; set system vectors
; TBA defaults to zero on reset
;
FFFFFFFFFFFFB220 E0C00000 setlo r3,#0
FFFFFFFFFFFFB224 E08001FF setlo r2,#511
FFFFFFFFFFFFB228 9A00EA20 lea r1,nmirout
FFFFFFFFFFFFB22C csj5:
FFFFFFFFFFFFB22C 66308000 sw r1,[r3]
FFFFFFFFFFFFB230 0A318008 addui r3,r3,#8
FFFFFFFFFFFFB234 BE017FCF loop r2,csj5
FFFFFFFFFFFFB238 E6BFB768 ; SETLO
FFFFFFFFFFFFB23C 6A0D042D lea r1,KeybdSC ; keyboard BIOS vector
FFFFFFFFFFFFB240 66008D08 sw r1,0xD08
FFFFFFFFFFFFB244 9A00E950 lea r1,irqrout
FFFFFFFFFFFFB248 66008E08 sw r1,0xE08 ; set IRQ vector
FFFFFFFFFFFFB24C 9A00E8BC lea r1,dberr_rout
FFFFFFFFFFFFB250 66008FE0 sw r1,0xFE0 ; set Bus error vector
FFFFFFFFFFFFB254 9A00E8A4 lea r1,iberr_rout
FFFFFFFFFFFFB258 66008FE8 sw r1,0xFE8 ; set Bus error vector
FFFFFFFFFFFFB25C 9A00EA20 lea r1,nmirout
FFFFFFFFFFFFB260 66008FF0 sw r1,0xFF0 ; set NMI vector
FFFFFFFFFFFFB264 E6BFB7C4 ; SETLO
FFFFFFFFFFFFB268 6A0D042D lea r1,KeybdIRQ
FFFFFFFFFFFFB26C 6600B008 sw r1,keybdIRQvec
FFFFFFFFFFFFB270 E6BFB8EC ; SETLO
FFFFFFFFFFFFB274 6A0D042D lea r1,Pulse100
FFFFFFFFFFFFB278 6600B000 sw r1,p100IRQvec
FFFFFFFFFFFFB27C E6BFB628 ; SETLO
FFFFFFFFFFFFB280 6A0D042D lea r1,SerialIRQ
FFFFFFFFFFFFB284 6600B010 sw r1,serialIRQvec
FFFFFFFFFFFFB288 9A00CAC4 lea r1,RasterIRQfn
FFFFFFFFFFFFB28C 6600B018 sw r1,rasterIRQvec
FFFFFFFFFFFFB234 E0C00000 setlo r3,#0
FFFFFFFFFFFFB238 E08001FF setlo r2,#511
FFFFFFFFFFFFB23C 9A00FB38 lea r1,nmirout
FFFFFFFFFFFFB240 csj5:
FFFFFFFFFFFFB240 66308000 sw r1,[r3]
FFFFFFFFFFFFB244 0A318008 addui r3,r3,#8
FFFFFFFFFFFFB248 BE017FCF loop r2,csj5
FFFFFFFFFFFFB24C E6BFB8A8 ; SETLO
FFFFFFFFFFFFB250 6A0D042D lea r1,VideoSC ; Video BIOS vector
FFFFFFFFFFFFB254 66008CD0 sw r1,0xCD0
FFFFFFFFFFFFB258 9A008000 lea r1,SCCARDSC ; SD Card BIOS vector
FFFFFFFFFFFFB25C 66008CE8 sw r1,0xCE8
FFFFFFFFFFFFB260 E6BFBAA8 ; SETLO
FFFFFFFFFFFFB264 6A0D042D lea r1,RTCSC ; Real time clock vector
FFFFFFFFFFFFB268 66008D00 sw r1,0xD00
FFFFFFFFFFFFB26C E6BFBB14 ; SETLO
FFFFFFFFFFFFB270 6A0D042D lea r1,KeybdSC ; keyboard BIOS vector
FFFFFFFFFFFFB274 66008D08 sw r1,0xD08
FFFFFFFFFFFFB278 9A00FA5C lea r1,irqrout
FFFFFFFFFFFFB27C 66008E08 sw r1,0xE08 ; set IRQ vector
FFFFFFFFFFFFB280 9A00FB94 lea r1,ui_irout
FFFFFFFFFFFFB284 66008F78 sw r1,0xF78 ; set unimplemented instruction vector
FFFFFFFFFFFFB288 9A00F9BC lea r1,dberr_rout
FFFFFFFFFFFFB28C 66008FE0 sw r1,0xFE0 ; set Bus error vector
FFFFFFFFFFFFB290 9A00F9A4 lea r1,iberr_rout
FFFFFFFFFFFFB294 66008FE8 sw r1,0xFE8 ; set Bus error vector
FFFFFFFFFFFFB298 9A00FB38 lea r1,nmirout
FFFFFFFFFFFFB29C 66008FF0 sw r1,0xFF0 ; set NMI vector
; set system interrupt hook vectors
FFFFFFFFFFFFB2A0 E6BFBBC0 ; SETLO
FFFFFFFFFFFFB2A4 6A0D042D lea r1,KeybdIRQ
FFFFFFFFFFFFB2A8 6600B008 sw r1,keybdIRQvec
FFFFFFFFFFFFB2AC E6BFBDCC ; SETLO
FFFFFFFFFFFFB2B0 6A0D042D lea r1,Pulse100
FFFFFFFFFFFFB2B4 6600B000 sw r1,p100IRQvec
FFFFFFFFFFFFB2B8 E6BFB768 ; SETLO
FFFFFFFFFFFFB2BC 6A0D042D lea r1,SerialIRQ
FFFFFFFFFFFFB2C0 6600B010 sw r1,serialIRQvec
FFFFFFFFFFFFB2C4 9A00D1AC lea r1,RasterIRQfn
FFFFFFFFFFFFB2C8 6600B018 sw r1,rasterIRQvec
;-------------------------------
; Initialize I/O devices
;-------------------------------
FFFFFFFFFFFFB290 31FFECEC call SerialInit
FFFFFFFFFFFFB294 31FFEDEC call KeybdInit
FFFFFFFFFFFFB298 31FFECE4 call PICInit
FFFFFFFFFFFFB29C 31FFF299 call SetupRasterIRQ
FFFFFFFFFFFFB2A0 00000040 cli ; enable interrupts
FFFFFFFFFFFFB2CC E69CFFFF ; SETLO
FFFFFFFFFFFFB2D0 EE800003 ; SETMID
FFFFFFFFFFFFB2D4 6A0D0424 inbu r1,CONFIGREC
FFFFFFFFFFFFB2D8 2A108824 bfext r1,r1,#4,#4
FFFFFFFFFFFFB2DC BE100048 beq r1,r0,skip5
FFFFFFFFFFFFB2E0 31FFEF3A call tmp_init
FFFFFFFFFFFFB2E4 skip5:
FFFFFFFFFFFFB2E4 E69CFFFF ; SETLO
FFFFFFFFFFFFB2E8 EE800003 ; SETMID
FFFFFFFFFFFFB2EC 6A0D0424 inbu r1,CONFIGREC
FFFFFFFFFFFFB2F0 2A108A2C bfext r1,r1,#5,#5
FFFFFFFFFFFFB2F4 BE100048 beq r1,r0,skip4
FFFFFFFFFFFFB2F8 31FFED3C call SerialInit
FFFFFFFFFFFFB2FC skip4:
FFFFFFFFFFFFB2FC 31FFEEEB call KeybdInit
FFFFFFFFFFFFB300 31FFED34 call PICInit
FFFFFFFFFFFFB304 31FFF453 call SetupRasterIRQ
FFFFFFFFFFFFB308 00000040 cli ; enable interrupts
; call HelloWorld
FFFFFFFFFFFFB2A4 E0C000CE setlo r3,#0xCE ; blue on blue
FFFFFFFFFFFFB2A8 62019414 sc r3,ScreenColor
FFFFFFFFFFFFB2AC 42019414 lc r3,0x1414
FFFFFFFFFFFFB2B0 E0C00020 setlo r3,#32
FFFFFFFFFFFFB2B4 62019416 sc r3,0x1416 ; we do a store, then a load through the dcache
FFFFFFFFFFFFB2B8 42011416 lc r2,0x1416 ;
FFFFFFFFFFFFB2BC BE218048 beq r2,r3,dcokay
FFFFFFFFFFFFB2C0 0000000D dcache_off ; data cache failed
FFFFFFFFFFFFB2C4 dcokay:
FFFFFFFFFFFFB2C4 620020A8 sc r0,NextToRunTCB
FFFFFFFFFFFFB2C8 620020A6 sc r0,RunningTCB
FFFFFFFFFFFFB2CC 31FFEED9 call ClearScreen
FFFFFFFFFFFFB2D0 31FFEEC4 call ClearBmpScreen
FFFFFFFFFFFFB2D4 31FFF1ED call RandomizeSprram
FFFFFFFFFFFFB2D8 62001416 sc r0,CursorRow
FFFFFFFFFFFFB2DC 62001418 sc r0,CursorCol
FFFFFFFFFFFFB2E0 E0400001 setlo r1,#1
FFFFFFFFFFFFB2E4 6000941A sb r1,CursorFlash
FFFFFFFFFFFFB2E8 E6BFB36D ; SETLO
FFFFFFFFFFFFB2EC 6A0D042D lea r1,MSGSTART
FFFFFFFFFFFFB2F0 31FFEFF5 call DisplayStringCRLF
FFFFFFFFFFFFB2F4 33FFF096 jmp Monitor
FFFFFFFFFFFFB2F8 31FFF1F7 call SetupAC97 ; and Beep
FFFFFFFFFFFFB2FC E0C00004 setlo r3,#4
FFFFFFFFFFFFB300 E69C0600 ; SETLO
FFFFFFFFFFFFB304 EE800003 ; SETMID
FFFFFFFFFFFFB308 6A0D0C28 outb r3,LED
FFFFFFFFFFFFB30C 31FFF221 call Beep
FFFFFFFFFFFFB30C E0C000CE setlo r3,#0xCE ; blue on blue
FFFFFFFFFFFFB310 62019414 sc r3,ScreenColor
FFFFFFFFFFFFB314 62019410 sc r3,CharColor
FFFFFFFFFFFFB318 42019414 lc r3,0x1414
FFFFFFFFFFFFB31C E0C00020 setlo r3,#32
FFFFFFFFFFFFB320 62019416 sc r3,0x1416 ; we do a store, then a load through the dcache
FFFFFFFFFFFFB324 42011416 lc r2,0x1416 ;
FFFFFFFFFFFFB328 BE218048 beq r2,r3,dcokay
FFFFFFFFFFFFB32C 0000000D dcache_off ; data cache failed
FFFFFFFFFFFFB330 dcokay:
FFFFFFFFFFFFB330 620020A8 sc r0,NextToRunTCB
FFFFFFFFFFFFB334 620020A6 sc r0,RunningTCB
FFFFFFFFFFFFB338 16008002 lw r1,#2 ; get rid of startup keyboard glitchs by trying to get a character
FFFFFFFFFFFFB33C 0181D097 syscall #417
FFFFFFFFFFFFB340 16008002 lw r1,#2 ; get rid of startup keyboard glitchs by trying to get a character
FFFFFFFFFFFFB344 0181D097 syscall #417
FFFFFFFFFFFFB310 j4:
FFFFFFFFFFFFB310 33FFF096 jmp Monitor
FFFFFFFFFFFFB314 BE007FEA bra j4
; wait for screen to be available
FFFFFFFFFFFFB348 31FFF011 call ClearScreen
FFFFFFFFFFFFB34C 31FFEFFC call ClearBmpScreen
; for now hang the contexts
; Test whether or not the sprite controller is present. Skip
; Initialization if it isn't.
FFFFFFFFFFFFB350 E69CFFFF ; SETLO
FFFFFFFFFFFFB354 EE800003 ; SETMID
FFFFFFFFFFFFB358 6A0D0420 inb r1,CONFIGREC
FFFFFFFFFFFFB35C 2A108004 bfext r1,r1,#0,#0
FFFFFFFFFFFFB360 BE100048 beq r1,r0,skip1
FFFFFFFFFFFFB364 31FFF3A7 call RandomizeSprram
FFFFFFFFFFFFB368 skip1:
FFFFFFFFFFFFB368 60001417 sb r0,CursorRow
FFFFFFFFFFFFB36C 60001418 sb r0,CursorCol
FFFFFFFFFFFFB370 16008001 lw r1,#1
FFFFFFFFFFFFB374 6000941A sb r1,CursorFlash
FFFFFFFFFFFFB378 E6BFB4AD ; SETLO
FFFFFFFFFFFFB37C 6A0D042D lea r1,MSGSTART
FFFFFFFFFFFFB380 31FFF130 call DisplayStringCRLF
; Test whether or not sound generator is present
; skip initialization and beep if not present
FFFFFFFFFFFFB384 E69CFFFF ; SETLO
FFFFFFFFFFFFB388 EE800003 ; SETMID
FFFFFFFFFFFFB38C 6A0D0420 inb r1,CONFIGREC
FFFFFFFFFFFFB390 2A108414 bfext r1,r1,#2,#2
FFFFFFFFFFFFB394 BE1000E8 beq r1,r0,skip2
FFFFFFFFFFFFB398 31FFF3B1 call SetupAC97 ; and Beep
FFFFFFFFFFFFB39C 16008004 lw r1,#4
FFFFFFFFFFFFB3A0 E69C0600 ; SETLO
FFFFFFFFFFFFB3A4 EE800003 ; SETMID
FFFFFFFFFFFFB3A8 6A0D0428 outb r1,LED
FFFFFFFFFFFFB3AC 31FFF3DB call Beep
FFFFFFFFFFFFB3B0 skip2:
FFFFFFFFFFFFB3B0 E6BFB428 ; SETLO
FFFFFFFFFFFFB3B4 6A0D042D lea r1,context1disp ; start a display
FFFFFFFFFFFFB3B8 6600A0D8 sw r1,ctx1start
; Startup Ethernet access ?
;
FFFFFFFFFFFFB318 ctxstart1:
FFFFFFFFFFFFB318 BE00000A bra ctxstart1
FFFFFFFFFFFFB3BC E69CFFFF ; SETLO
FFFFFFFFFFFFB3C0 EE800003 ; SETMID
FFFFFFFFFFFFB3C4 6A0D0420 inb r1,CONFIGREC
FFFFFFFFFFFFB3C8 2A10820C bfext r1,r1,#1,#1
FFFFFFFFFFFFB3CC BE100068 beq r1,r0,skip3
FFFFFFFFFFFFB3D0 9A00DD3C lea r1,eth_main
FFFFFFFFFFFFB3D4 6600A0E0 sw r1,ctx2start
FFFFFFFFFFFFB3D8 skip3:
FFFFFFFFFFFFB3D8 9A00CDD0 lea r1,RandomLines
FFFFFFFFFFFFB3DC 6600A0E8 sw r1,ctx3start
FFFFFFFFFFFFB3E0 31FFF54E call spi_init
FFFFFFFFFFFFB3E4 BE100069 bne r1,r0,skip_spi_read
FFFFFFFFFFFFB3E8 31FFF59D call spi_read_boot
FFFFFFFFFFFFB3EC 31FFF605 call loadBootFile
FFFFFFFFFFFFB3F0 skip_spi_read:
FFFFFFFFFFFFB3F0 33FFF20A jmp Monitor
FFFFFFFFFFFFB3F4 j4:
FFFFFFFFFFFFB3F4 33FFF20A jmp Monitor
FFFFFFFFFFFFB3F8 BE007FEA bra j4
; The contexts wait for a context startup address to be placed in the
; startup table. Once an address is in the table, a call to the context
; code will be made. The default is a NULL pointer, which
; causes the context to loop around back to here while waiting for a
; code to run.
;
FFFFFFFFFFFFB3FC ctxstart1:
FFFFFFFFFFFFB3FC 9A00A0D0 lea r1,ctx0start ; r1 = context start table base
FFFFFFFFFFFFB400 02010568 mfspr r2,AXC ; r2 = index into start table
FFFFFFFFFFFFB404 6A110703 lw r1,[r1+r2*8] ; r1 = context start address
FFFFFFFFFFFFB408 BE100048 beq r1,r0,ctx12
FFFFFFFFFFFFB40C 341F8000 jal lr,[r1] ; perform a call to the context code
; We might as well move to the next context, since there's nothing
; to do. This can be accomplished by tirggering a IRQ interrupt.
; We can't just increment the excution pattern pointer, because that
; would only switch the register set and not the program counter.
; An interrupt saves the program counter, and restores it from the
; IPC context register.
;
FFFFFFFFFFFFB410 ctx12:
FFFFFFFFFFFFB410 00000040 sei ; causes a priv violation. don't allow interrupts during syscall
FFFFFFFFFFFFB414 DE000000 nop ; wait for sei to take effect
FFFFFFFFFFFFB418 DE000000 nop
FFFFFFFFFFFFB41C DE000000 nop
FFFFFFFFFFFFB420 0181E097 syscall #EX_IRQ
FFFFFFFFFFFFB424 BE007ECA bra ctxstart1
; call ramtest
FFFFFFFFFFFFB428 context1disp:
; once we've started, clear the start vector so that the context
; isn't continuously restarted.
;
FFFFFFFFFFFFB428 660020D8 sw r0,ctx1start
FFFFFFFFFFFFB42C E6900000 ; SETLO
FFFFFFFFFFFFB430 EE800003 ; SETMID
FFFFFFFFFFFFB434 6A0D0C2D lea r3,TEXTSCR
FFFFFFFFFFFFB438 16008056 lw r1,#'V'
FFFFFFFFFFFFB43C 1601014A lw r2,#330
FFFFFFFFFFFFB440 1602002F lw r4,#47
FFFFFFFFFFFFB444 31FFF063 call AsciiToScreen
FFFFFFFFFFFFB448 ctx11:
FFFFFFFFFFFFB448 6A310421 inch r1,[r3+r2]
FFFFFFFFFFFFB44C 0A108001 addui r1,r1,#1
FFFFFFFFFFFFB450 6A310429 outc r1,[r3+r2]
FFFFFFFFFFFFB454 0A2100A8 addui r2,r2,#168
FFFFFFFFFFFFB458 BE027F8F loop r4,ctx11
FFFFFFFFFFFFB45C BE007E6A bra context1disp
;-----------------------------------------
; Hello World!
;-----------------------------------------
FFFFFFFFFFFFB31C HelloWorld:
FFFFFFFFFFFFB31C 0FEF0018 subui r30,r30,#24
FFFFFFFFFFFFB320 67E08000 sw r1,[sp]
FFFFFFFFFFFFB324 67E10008 sw r2,8[sp]
FFFFFFFFFFFFB328 67EF8010 sw lr,16[sp]
FFFFFFFFFFFFB32C E6BFB360 ; SETLO
FFFFFFFFFFFFB330 6A0D082D lea r2,MSG
FFFFFFFFFFFFB334 j3:
FFFFFFFFFFFFB334 40208000 lb r1,[r2]
FFFFFFFFFFFFB338 BE100088 beq r1,r0,j2
FFFFFFFFFFFFB33C 31FFED0C call SerialPutChar
FFFFFFFFFFFFB340 0A210001 addui r2,r2,#1
FFFFFFFFFFFFB344 BE007F8A bra j3
FFFFFFFFFFFFB348 j2:
FFFFFFFFFFFFB348 67EF8010 sw lr,16[sp]
FFFFFFFFFFFFB34C 67E10008 sw r2,8[sp]
FFFFFFFFFFFFB350 67E08000 sw r1,[sp]
FFFFFFFFFFFFB354 37EF8018 ret #24
FFFFFFFFFFFFB460 HelloWorld:
FFFFFFFFFFFFB460 0FEF0018 subui r30,r30,#24
FFFFFFFFFFFFB464 67E08000 sw r1,[sp]
FFFFFFFFFFFFB468 67E10008 sw r2,8[sp]
FFFFFFFFFFFFB46C 67EF8010 sw lr,16[sp]
FFFFFFFFFFFFB470 E6BFB4A0 ; SETLO
FFFFFFFFFFFFB474 6A0D082D lea r2,MSG
FFFFFFFFFFFFB478 j3:
FFFFFFFFFFFFB478 40208000 lb r1,[r2]
FFFFFFFFFFFFB47C BE100088 beq r1,r0,j2
FFFFFFFFFFFFB480 31FFED5C call SerialPutChar
FFFFFFFFFFFFB484 0A210001 addui r2,r2,#1
FFFFFFFFFFFFB488 BE007F8A bra j3
FFFFFFFFFFFFB48C j2:
FFFFFFFFFFFFB48C 67EF8010 sw lr,16[sp]
FFFFFFFFFFFFB490 67E10008 sw r2,8[sp]
FFFFFFFFFFFFB494 67E08000 sw r1,[sp]
FFFFFFFFFFFFB498 37EF8018 ret #24
FFFFFFFFFFFFB358 0000000000000000 align 16
FFFFFFFFFFFFB360 align 16
FFFFFFFFFFFFB360 MSG:
FFFFFFFFFFFFB360 6F57206F6C6C6548 db "Hello World!",0
FFFFFFFFFFFFB36D MSGSTART:
FFFFFFFFFFFFB368 7061520021646C72 db "Raptor64 system starting....",0
FFFFFFFFFFFFB370 7973203436726F74
FFFFFFFFFFFFB378 617473206D657473
FFFFFFFFFFFFB380 2E2E2E676E697472
FFFFFFFFFFFFB498 0000000037EF8018 align 16
FFFFFFFFFFFFB4A0 align 16
FFFFFFFFFFFFB4A0 MSG:
FFFFFFFFFFFFB4A0 6F57206F6C6C6548 db "Hello World!",0
FFFFFFFFFFFFB4AD MSGSTART:
FFFFFFFFFFFFB4A8 7061520021646C72 db "Raptor64 system starting....",0
FFFFFFFFFFFFB4B0 7973203436726F74
FFFFFFFFFFFFB4B8 617473206D657473
FFFFFFFFFFFFB4C0 2E2E2E676E697472
FFFFFFFFFFFFB388 000000000000002E align 16
FFFFFFFFFFFFB390 align 16
FFFFFFFFFFFFB4C8 000000000000002E align 16
FFFFFFFFFFFFB4D0 align 16
;----------------------------------------------------------
; Initialize programmable interrupt controller (PIC)
; 0 = nmi
; 0 = nmi (parity error)
; 1 = keyboard reset
; 2 = 1000Hz pulse (context switcher)
; 3 = 100Hz pulse (cursor flash)
; 4 = ethmac
; 8 = uart
; 13 = raster interrupt
; 15 = keyboard char
;----------------------------------------------------------
FFFFFFFFFFFFB390 PICInit:
FFFFFFFFFFFFB390 E6BFB3AC ; SETLO
FFFFFFFFFFFFB394 6A0D042D lea r1,PICret
FFFFFFFFFFFFB398 66009030 sw r1,TickIRQAddr
FFFFFFFFFFFFB4D0 PICInit:
FFFFFFFFFFFFB4D0 E6BFB4EC ; SETLO
FFFFFFFFFFFFB4D4 6A0D042D lea r1,PICret
FFFFFFFFFFFFB4D8 66009030 sw r1,TickIRQAddr
; enable: raster irq,
FFFFFFFFFFFFB39C E07FA00F setlo r1,#0xA00F ; enable nmi,kbd_rst,and kbd_irq
FFFFFFFFFFFFB4DC E07F800F setlo r1,#0x800F ; enable nmi,kbd_rst,and kbd_irq
; A10F enable serial IRQ
FFFFFFFFFFFFB3A0 E69C0FF2 ; SETLO
FFFFFFFFFFFFB3A4 EE800003 ; SETMID
FFFFFFFFFFFFB3A8 6A0D0429 outc r1,PIC_IE
FFFFFFFFFFFFB3AC PICret:
FFFFFFFFFFFFB3AC 37EF8000 ret
FFFFFFFFFFFFB4E0 E69C0FF2 ; SETLO
FFFFFFFFFFFFB4E4 EE800003 ; SETMID
FFFFFFFFFFFFB4E8 6A0D0429 outc r1,PIC_IE
FFFFFFFFFFFFB4EC PICret:
FFFFFFFFFFFFB4EC 37EF8000 ret
;==============================================================================
; Serial port
576,40 → 783,40
; Initialize the serial port
;-----------------------------------------
;
FFFFFFFFFFFFB3B0 SerialInit:
FFFFFFFFFFFFB3B0 62001800 sc r0,Uart_rxhead ; reset buffer indexes
FFFFFFFFFFFFB3B4 62001802 sc r0,Uart_rxtail
FFFFFFFFFFFFB3B8 E04001F0 setlo r1,#0x1f0
FFFFFFFFFFFFB3BC 62009810 sc r1,Uart_foff ; set threshold for XOFF
FFFFFFFFFFFFB3C0 E0400010 setlo r1,#0x010
FFFFFFFFFFFFB3C4 6200980E sc r1,Uart_fon ; set threshold for XON
FFFFFFFFFFFFB3C8 E0400001 setlo r1,#1
FFFFFFFFFFFFB3CC E69C0A04 ; SETLO
FFFFFFFFFFFFB3D0 EE800003 ; SETMID
FFFFFFFFFFFFB3D4 6A0D0428 outb r1,UART_IE ; enable receive interrupt only
FFFFFFFFFFFFB3D8 60001809 sb r0,Uart_rxrts ; no RTS/CTS signals available
FFFFFFFFFFFFB3DC 60001812 sb r0,Uart_txrts ; no RTS/CTS signals available
FFFFFFFFFFFFB3E0 60001813 sb r0,Uart_txdtr ; no DTR signals available
FFFFFFFFFFFFB3E4 6000180A sb r0,Uart_rxdtr ; no DTR signals available
FFFFFFFFFFFFB3E8 E0400001 setlo r1,#1
FFFFFFFFFFFFB3EC 60009814 sb r1,Uart_txxon ; for now
FFFFFFFFFFFFB3F0 37EF8000 ret
FFFFFFFFFFFFB4F0 SerialInit:
FFFFFFFFFFFFB4F0 62001800 sc r0,Uart_rxhead ; reset buffer indexes
FFFFFFFFFFFFB4F4 62001802 sc r0,Uart_rxtail
FFFFFFFFFFFFB4F8 E04001F0 setlo r1,#0x1f0
FFFFFFFFFFFFB4FC 62009810 sc r1,Uart_foff ; set threshold for XOFF
FFFFFFFFFFFFB500 E0400010 setlo r1,#0x010
FFFFFFFFFFFFB504 6200980E sc r1,Uart_fon ; set threshold for XON
FFFFFFFFFFFFB508 E0400001 setlo r1,#1
FFFFFFFFFFFFB50C E69C0A04 ; SETLO
FFFFFFFFFFFFB510 EE800003 ; SETMID
FFFFFFFFFFFFB514 6A0D0428 outb r1,UART_IE ; enable receive interrupt only
FFFFFFFFFFFFB518 60001809 sb r0,Uart_rxrts ; no RTS/CTS signals available
FFFFFFFFFFFFB51C 60001812 sb r0,Uart_txrts ; no RTS/CTS signals available
FFFFFFFFFFFFB520 60001813 sb r0,Uart_txdtr ; no DTR signals available
FFFFFFFFFFFFB524 6000180A sb r0,Uart_rxdtr ; no DTR signals available
FFFFFFFFFFFFB528 E0400001 setlo r1,#1
FFFFFFFFFFFFB52C 60009814 sb r1,Uart_txxon ; for now
FFFFFFFFFFFFB530 37EF8000 ret
;---------------------------------------------------------------------------------
; Get character directly from serial port. Blocks until a character is available.
;---------------------------------------------------------------------------------
;
FFFFFFFFFFFFB3F4 SerialGetCharDirect:
FFFFFFFFFFFFB3F4 sgc1:
FFFFFFFFFFFFB3F4 E69C0A01 ; SETLO
FFFFFFFFFFFFB3F8 EE800003 ; SETMID
FFFFFFFFFFFFB3FC 6A0D0420 inb r1,UART_LS ; uart status
FFFFFFFFFFFFB400 14108001 andi r1,r1,#rxfull ; is there a char available ?
FFFFFFFFFFFFB404 BE107F88 beq r1,r0,sgc1
FFFFFFFFFFFFB408 E69C0A00 ; SETLO
FFFFFFFFFFFFB40C EE800003 ; SETMID
FFFFFFFFFFFFB410 6A0D0420 inb r1,UART
FFFFFFFFFFFFB414 37EF8000 ret
FFFFFFFFFFFFB534 SerialGetCharDirect:
FFFFFFFFFFFFB534 sgc1:
FFFFFFFFFFFFB534 E69C0A01 ; SETLO
FFFFFFFFFFFFB538 EE800003 ; SETMID
FFFFFFFFFFFFB53C 6A0D0420 inb r1,UART_LS ; uart status
FFFFFFFFFFFFB540 14108001 andi r1,r1,#rxfull ; is there a char available ?
FFFFFFFFFFFFB544 BE107F88 beq r1,r0,sgc1
FFFFFFFFFFFFB548 E69C0A00 ; SETLO
FFFFFFFFFFFFB54C EE800003 ; SETMID
FFFFFFFFFFFFB550 6A0D0420 inb r1,UART
FFFFFFFFFFFFB554 37EF8000 ret
;------------------------------------------------
; Check for a character at the serial port
616,13 → 823,13
; returns r1 = 1 if char available, 0 otherwise
;------------------------------------------------
;
FFFFFFFFFFFFB418 SerialCheckForCharDirect:
FFFFFFFFFFFFB418 E69C0A01 ; SETLO
FFFFFFFFFFFFB41C EE800003 ; SETMID
FFFFFFFFFFFFB420 6A0D0420 inb r1,UART_LS ; uart status
FFFFFFFFFFFFB424 14108001 andi r1,r1,#rxfull ; is there a char available ?
FFFFFFFFFFFFB428 04100439 sne r1,r1,r0
FFFFFFFFFFFFB42C 37EF8000 ret
FFFFFFFFFFFFB558 SerialCheckForCharDirect:
FFFFFFFFFFFFB558 E69C0A01 ; SETLO
FFFFFFFFFFFFB55C EE800003 ; SETMID
FFFFFFFFFFFFB560 6A0D0420 inb r1,UART_LS ; uart status
FFFFFFFFFFFFB564 14108001 andi r1,r1,#rxfull ; is there a char available ?
FFFFFFFFFFFFB568 04100439 sne r1,r1,r0
FFFFFFFFFFFFB56C 37EF8000 ret
;-----------------------------------------
; Put character to serial port
629,95 → 836,95
; r1 = char to put
;-----------------------------------------
;
FFFFFFFFFFFFB430 SerialPutChar:
FFFFFFFFFFFFB430 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFB434 67E10000 sw r2,[sp]
FFFFFFFFFFFFB438 67E18008 sw r3,8[sp]
FFFFFFFFFFFFB43C 67E20010 sw r4,16[sp]
FFFFFFFFFFFFB440 67E28018 sw r5,24[sp]
FFFFFFFFFFFFB444 E69C0A06 ; SETLO
FFFFFFFFFFFFB448 EE800003 ; SETMID
FFFFFFFFFFFFB44C 6A0D0820 inb r2,UART_MC
FFFFFFFFFFFFB450 16210003 ori r2,r2,#3 ; assert DTR / RTS
FFFFFFFFFFFFB454 E69C0A06 ; SETLO
FFFFFFFFFFFFB458 EE800003 ; SETMID
FFFFFFFFFFFFB45C 6A0D0828 outb r2,UART_MC
FFFFFFFFFFFFB460 40011812 lb r2,Uart_txrts
FFFFFFFFFFFFB464 BE200168 beq r2,r0,spcb1
FFFFFFFFFFFFB468 46021400 lw r4,Milliseconds
FFFFFFFFFFFFB46C E0C00064 setlo r3,#100 ; delay count (1 s)
FFFFFFFFFFFFB470 spcb3:
FFFFFFFFFFFFB470 80011808 inb r2,UART_MS
FFFFFFFFFFFFB474 1421000A andi r2,r2,#10 ; is CTS asserted ?
FFFFFFFFFFFFB478 BE2000C9 bne r2,r0,spcb1
FFFFFFFFFFFFB47C 46029400 lw r5,Milliseconds
FFFFFFFFFFFFB480 BE42FF88 beq r4,r5,spcb3
FFFFFFFFFFFFB484 02520009 mov r4,r5
FFFFFFFFFFFFB488 BE01FF4F loop r3,spcb3
FFFFFFFFFFFFB48C BE00046A bra spcabort
FFFFFFFFFFFFB490 spcb1:
FFFFFFFFFFFFB490 40011813 lb r2,Uart_txdtr
FFFFFFFFFFFFB494 BE200168 beq r2,r0,spcb2
FFFFFFFFFFFFB498 46021400 lw r4,Milliseconds
FFFFFFFFFFFFB49C E0C00064 setlo r3,#100 ; delay count
FFFFFFFFFFFFB4A0 spcb4:
FFFFFFFFFFFFB4A0 80011808 inb r2,UART_MS
FFFFFFFFFFFFB4A4 14210014 andi r2,r2,#20 ; is DSR asserted ?
FFFFFFFFFFFFB4A8 BE2000C9 bne r2,r0,spcb2
FFFFFFFFFFFFB4AC 46029400 lw r5,Milliseconds
FFFFFFFFFFFFB4B0 BE42FF88 beq r4,r5,spcb4
FFFFFFFFFFFFB4B4 02520009 mov r4,r5
FFFFFFFFFFFFB4B8 BE01FF4F loop r3,spcb4
FFFFFFFFFFFFB4BC BE0002EA bra spcabort
FFFFFFFFFFFFB4C0 spcb2:
FFFFFFFFFFFFB4C0 40011814 lb r2,Uart_txxon
FFFFFFFFFFFFB4C4 BE2000C8 beq r2,r0,spcb5
FFFFFFFFFFFFB4C8 spcb6:
FFFFFFFFFFFFB4C8 40011815 lb r2,Uart_txxonoff
FFFFFFFFFFFFB4CC BE200088 beq r2,r0,spcb5
FFFFFFFFFFFFB4D0 80021808 inb r4,UART_MS
FFFFFFFFFFFFB4D4 14420080 andi r4,r4,#0x80 ; DCD ?
FFFFFFFFFFFFB4D8 BE407F89 bne r4,r0,spcb6
FFFFFFFFFFFFB4DC spcb5:
FFFFFFFFFFFFB4DC 46021400 lw r4,Milliseconds
FFFFFFFFFFFFB4E0 E0C00064 setlo r3,#100 ; wait up to 1s
FFFFFFFFFFFFB4E4 spcb8:
FFFFFFFFFFFFB4E4 E69C0A01 ; SETLO
FFFFFFFFFFFFB4E8 EE800003 ; SETMID
FFFFFFFFFFFFB4EC 6A0D0820 inb r2,UART_LS
FFFFFFFFFFFFB4F0 14210020 andi r2,r2,#0x20 ; tx not full ?
FFFFFFFFFFFFB4F4 BE2000C9 bne r2,r0,spcb7
FFFFFFFFFFFFB4F8 46029400 lw r5,Milliseconds
FFFFFFFFFFFFB4FC BE42FF48 beq r4,r5,spcb8
FFFFFFFFFFFFB500 02520009 mov r4,r5
FFFFFFFFFFFFB504 BE01FF0F loop r3,spcb8
FFFFFFFFFFFFB508 BE00008A bra spcabort
FFFFFFFFFFFFB50C spcb7:
FFFFFFFFFFFFB50C E69C0A00 ; SETLO
FFFFFFFFFFFFB510 EE800003 ; SETMID
FFFFFFFFFFFFB514 6A0D0428 outb r1,UART
FFFFFFFFFFFFB518 spcabort:
FFFFFFFFFFFFB518 47E10000 lw r2,[sp]
FFFFFFFFFFFFB51C 47E18008 lw r3,8[sp]
FFFFFFFFFFFFB520 47E20010 lw r4,16[sp]
FFFFFFFFFFFFB524 47E28018 lw r5,24[sp]
FFFFFFFFFFFFB528 37EF8020 ret #32
FFFFFFFFFFFFB570 SerialPutChar:
FFFFFFFFFFFFB570 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFB574 67E10000 sw r2,[sp]
FFFFFFFFFFFFB578 67E18008 sw r3,8[sp]
FFFFFFFFFFFFB57C 67E20010 sw r4,16[sp]
FFFFFFFFFFFFB580 67E28018 sw r5,24[sp]
FFFFFFFFFFFFB584 E69C0A06 ; SETLO
FFFFFFFFFFFFB588 EE800003 ; SETMID
FFFFFFFFFFFFB58C 6A0D0820 inb r2,UART_MC
FFFFFFFFFFFFB590 16210003 ori r2,r2,#3 ; assert DTR / RTS
FFFFFFFFFFFFB594 E69C0A06 ; SETLO
FFFFFFFFFFFFB598 EE800003 ; SETMID
FFFFFFFFFFFFB59C 6A0D0828 outb r2,UART_MC
FFFFFFFFFFFFB5A0 40011812 lb r2,Uart_txrts
FFFFFFFFFFFFB5A4 BE200168 beq r2,r0,spcb1
FFFFFFFFFFFFB5A8 46021400 lw r4,Milliseconds
FFFFFFFFFFFFB5AC E0C00064 setlo r3,#100 ; delay count (1 s)
FFFFFFFFFFFFB5B0 spcb3:
FFFFFFFFFFFFB5B0 80011808 inb r2,UART_MS
FFFFFFFFFFFFB5B4 1421000A andi r2,r2,#10 ; is CTS asserted ?
FFFFFFFFFFFFB5B8 BE2000C9 bne r2,r0,spcb1
FFFFFFFFFFFFB5BC 46029400 lw r5,Milliseconds
FFFFFFFFFFFFB5C0 BE42FF88 beq r4,r5,spcb3
FFFFFFFFFFFFB5C4 02520009 mov r4,r5
FFFFFFFFFFFFB5C8 BE01FF4F loop r3,spcb3
FFFFFFFFFFFFB5CC BE00046A bra spcabort
FFFFFFFFFFFFB5D0 spcb1:
FFFFFFFFFFFFB5D0 40011813 lb r2,Uart_txdtr
FFFFFFFFFFFFB5D4 BE200168 beq r2,r0,spcb2
FFFFFFFFFFFFB5D8 46021400 lw r4,Milliseconds
FFFFFFFFFFFFB5DC E0C00064 setlo r3,#100 ; delay count
FFFFFFFFFFFFB5E0 spcb4:
FFFFFFFFFFFFB5E0 80011808 inb r2,UART_MS
FFFFFFFFFFFFB5E4 14210014 andi r2,r2,#20 ; is DSR asserted ?
FFFFFFFFFFFFB5E8 BE2000C9 bne r2,r0,spcb2
FFFFFFFFFFFFB5EC 46029400 lw r5,Milliseconds
FFFFFFFFFFFFB5F0 BE42FF88 beq r4,r5,spcb4
FFFFFFFFFFFFB5F4 02520009 mov r4,r5
FFFFFFFFFFFFB5F8 BE01FF4F loop r3,spcb4
FFFFFFFFFFFFB5FC BE0002EA bra spcabort
FFFFFFFFFFFFB600 spcb2:
FFFFFFFFFFFFB600 40011814 lb r2,Uart_txxon
FFFFFFFFFFFFB604 BE2000C8 beq r2,r0,spcb5
FFFFFFFFFFFFB608 spcb6:
FFFFFFFFFFFFB608 40011815 lb r2,Uart_txxonoff
FFFFFFFFFFFFB60C BE200088 beq r2,r0,spcb5
FFFFFFFFFFFFB610 80021808 inb r4,UART_MS
FFFFFFFFFFFFB614 14420080 andi r4,r4,#0x80 ; DCD ?
FFFFFFFFFFFFB618 BE407F89 bne r4,r0,spcb6
FFFFFFFFFFFFB61C spcb5:
FFFFFFFFFFFFB61C 46021400 lw r4,Milliseconds
FFFFFFFFFFFFB620 E0C00064 setlo r3,#100 ; wait up to 1s
FFFFFFFFFFFFB624 spcb8:
FFFFFFFFFFFFB624 E69C0A01 ; SETLO
FFFFFFFFFFFFB628 EE800003 ; SETMID
FFFFFFFFFFFFB62C 6A0D0820 inb r2,UART_LS
FFFFFFFFFFFFB630 14210020 andi r2,r2,#0x20 ; tx not full ?
FFFFFFFFFFFFB634 BE2000C9 bne r2,r0,spcb7
FFFFFFFFFFFFB638 46029400 lw r5,Milliseconds
FFFFFFFFFFFFB63C BE42FF48 beq r4,r5,spcb8
FFFFFFFFFFFFB640 02520009 mov r4,r5
FFFFFFFFFFFFB644 BE01FF0F loop r3,spcb8
FFFFFFFFFFFFB648 BE00008A bra spcabort
FFFFFFFFFFFFB64C spcb7:
FFFFFFFFFFFFB64C E69C0A00 ; SETLO
FFFFFFFFFFFFB650 EE800003 ; SETMID
FFFFFFFFFFFFB654 6A0D0428 outb r1,UART
FFFFFFFFFFFFB658 spcabort:
FFFFFFFFFFFFB658 47E10000 lw r2,[sp]
FFFFFFFFFFFFB65C 47E18008 lw r3,8[sp]
FFFFFFFFFFFFB660 47E20010 lw r4,16[sp]
FFFFFFFFFFFFB664 47E28018 lw r5,24[sp]
FFFFFFFFFFFFB668 37EF8020 ret #32
;-------------------------------------------------
; Compute number of characters in recieve buffer.
; r4 = number of chars
;-------------------------------------------------
FFFFFFFFFFFFB52C CharsInRxBuf:
FFFFFFFFFFFFB52C 42021800 lc r4,Uart_rxhead
FFFFFFFFFFFFB530 42011802 lc r2,Uart_rxtail
FFFFFFFFFFFFB534 04411005 subu r4,r4,r2
FFFFFFFFFFFFB538 BE4000A3 bgt r4,r0,cirxb1
FFFFFFFFFFFFB53C E1000200 setlo r4,#0x200
FFFFFFFFFFFFB540 04411003 addu r4,r4,r2
FFFFFFFFFFFFB544 42011800 lc r2,Uart_rxhead
FFFFFFFFFFFFB548 04411005 subu r4,r4,r2
FFFFFFFFFFFFB54C cirxb1:
FFFFFFFFFFFFB54C 37EF8000 ret
FFFFFFFFFFFFB66C CharsInRxBuf:
FFFFFFFFFFFFB66C 42021800 lc r4,Uart_rxhead
FFFFFFFFFFFFB670 42011802 lc r2,Uart_rxtail
FFFFFFFFFFFFB674 04411005 subu r4,r4,r2
FFFFFFFFFFFFB678 BE4000A3 bgt r4,r0,cirxb1
FFFFFFFFFFFFB67C E1000200 setlo r4,#0x200
FFFFFFFFFFFFB680 04411003 addu r4,r4,r2
FFFFFFFFFFFFB684 42011800 lc r2,Uart_rxhead
FFFFFFFFFFFFB688 04411005 subu r4,r4,r2
FFFFFFFFFFFFB68C cirxb1:
FFFFFFFFFFFFB68C 37EF8000 ret
;----------------------------------------------
; Get character from rx fifo
724,214 → 931,477
; If the fifo is empty enough then send an XON
;----------------------------------------------
;
FFFFFFFFFFFFB550 SerialGetChar:
FFFFFFFFFFFFB550 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFB554 67E10000 sw r2,[sp]
FFFFFFFFFFFFB558 67E18008 sw r3,8[sp]
FFFFFFFFFFFFB55C 67E20010 sw r4,16[sp]
FFFFFFFFFFFFB560 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFB564 42019800 lc r3,Uart_rxhead
FFFFFFFFFFFFB568 42011802 lc r2,Uart_rxtail
FFFFFFFFFFFFB56C BE218528 beq r2,r3,sgcfifo1 ; is there a char available ?
FFFFFFFFFFFFB570 9A019600 lea r3,Uart_rxfifo
FFFFFFFFFFFFB574 6A218400 lb r1,[r2+r3] ; get the char from the fifo into r1
FFFFFFFFFFFFB578 0A210001 addui r2,r2,#1 ; increment the fifo pointer
FFFFFFFFFFFFB57C 142101FF andi r2,r2,#0x1ff
FFFFFFFFFFFFB580 62011802 sc r2,Uart_rxtail
FFFFFFFFFFFFB584 4001180C lb r2,Uart_rxflow ; using flow control ?
FFFFFFFFFFFFB588 BE2003A8 beq r2,r0,sgcfifo2
FFFFFFFFFFFFB58C 4201980E lc r3,Uart_fon ; enough space in Rx buffer ?
FFFFFFFFFFFFB590 31FFED4B call CharsInRxBuf
FFFFFFFFFFFFB594 BE418343 bgt r4,r3,sgcfifo2
FFFFFFFFFFFFB598 6000180C sb r0,Uart_rxflow ; flow off
FFFFFFFFFFFFB59C 40021809 lb r4,Uart_rxrts
FFFFFFFFFFFFB5A0 BE400108 beq r4,r0,sgcfifo3
FFFFFFFFFFFFB5A4 E69C0A06 ; SETLO
FFFFFFFFFFFFB5A8 EE800003 ; SETMID
FFFFFFFFFFFFB5AC 6A0D1020 inb r4,UART_MC ; set rts bit in MC
FFFFFFFFFFFFB5B0 16420002 ori r4,r4,#2
FFFFFFFFFFFFB5B4 E69C0A06 ; SETLO
FFFFFFFFFFFFB5B8 EE800003 ; SETMID
FFFFFFFFFFFFB5BC 6A0D1028 outb r4,UART_MC
FFFFFFFFFFFFB5C0 sgcfifo3:
FFFFFFFFFFFFB5C0 4002180A lb r4,Uart_rxdtr
FFFFFFFFFFFFB5C4 BE400108 beq r4,r0,sgcfifo4
FFFFFFFFFFFFB5C8 E69C0A06 ; SETLO
FFFFFFFFFFFFB5CC EE800003 ; SETMID
FFFFFFFFFFFFB5D0 6A0D1020 inb r4,UART_MC ; set DTR
FFFFFFFFFFFFB5D4 16420001 ori r4,r4,#1
FFFFFFFFFFFFB5D8 E69C0A06 ; SETLO
FFFFFFFFFFFFB5DC EE800003 ; SETMID
FFFFFFFFFFFFB5E0 6A0D1028 outb r4,UART_MC
FFFFFFFFFFFFB5E4 sgcfifo4:
FFFFFFFFFFFFB5E4 4002180B lb r4,Uart_rxxon
FFFFFFFFFFFFB5E8 BE4000A8 beq r4,r0,sgcfifo5
FFFFFFFFFFFFB5EC E1000011 setlo r4,#XON
FFFFFFFFFFFFB5F0 E69C0A00 ; SETLO
FFFFFFFFFFFFB5F4 EE800003 ; SETMID
FFFFFFFFFFFFB5F8 6A0D1028 outb r4,UART
FFFFFFFFFFFFB5FC sgcfifo5:
FFFFFFFFFFFFB5FC sgcfifo2: ; return with char in r1
FFFFFFFFFFFFB5FC 47E10000 lw r2,[sp]
FFFFFFFFFFFFB600 47E18008 lw r3,8[sp]
FFFFFFFFFFFFB604 47E20010 lw r4,16[sp]
FFFFFFFFFFFFB608 47EF8018 lw lr,24[sp]
FFFFFFFFFFFFB60C 37EF8020 ret #32
FFFFFFFFFFFFB610 sgcfifo1:
FFFFFFFFFFFFB610 E07FFFFF setlo r1,#-1 ; no char available
FFFFFFFFFFFFB614 47E10000 lw r2,[sp]
FFFFFFFFFFFFB618 47E18008 lw r3,8[sp]
FFFFFFFFFFFFB61C 47E20010 lw r4,16[sp]
FFFFFFFFFFFFB620 47EF8018 lw lr,24[sp]
FFFFFFFFFFFFB624 37EF8020 ret #32
FFFFFFFFFFFFB690 SerialGetChar:
FFFFFFFFFFFFB690 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFB694 67E10000 sw r2,[sp]
FFFFFFFFFFFFB698 67E18008 sw r3,8[sp]
FFFFFFFFFFFFB69C 67E20010 sw r4,16[sp]
FFFFFFFFFFFFB6A0 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFB6A4 42019800 lc r3,Uart_rxhead
FFFFFFFFFFFFB6A8 42011802 lc r2,Uart_rxtail
FFFFFFFFFFFFB6AC BE218528 beq r2,r3,sgcfifo1 ; is there a char available ?
FFFFFFFFFFFFB6B0 9A019600 lea r3,Uart_rxfifo
FFFFFFFFFFFFB6B4 6A218400 lb r1,[r2+r3] ; get the char from the fifo into r1
FFFFFFFFFFFFB6B8 0A210001 addui r2,r2,#1 ; increment the fifo pointer
FFFFFFFFFFFFB6BC 142101FF andi r2,r2,#0x1ff
FFFFFFFFFFFFB6C0 62011802 sc r2,Uart_rxtail
FFFFFFFFFFFFB6C4 4001180C lb r2,Uart_rxflow ; using flow control ?
FFFFFFFFFFFFB6C8 BE2003A8 beq r2,r0,sgcfifo2
FFFFFFFFFFFFB6CC 4201980E lc r3,Uart_fon ; enough space in Rx buffer ?
FFFFFFFFFFFFB6D0 31FFED9B call CharsInRxBuf
FFFFFFFFFFFFB6D4 BE418343 bgt r4,r3,sgcfifo2
FFFFFFFFFFFFB6D8 6000180C sb r0,Uart_rxflow ; flow off
FFFFFFFFFFFFB6DC 40021809 lb r4,Uart_rxrts
FFFFFFFFFFFFB6E0 BE400108 beq r4,r0,sgcfifo3
FFFFFFFFFFFFB6E4 E69C0A06 ; SETLO
FFFFFFFFFFFFB6E8 EE800003 ; SETMID
FFFFFFFFFFFFB6EC 6A0D1020 inb r4,UART_MC ; set rts bit in MC
FFFFFFFFFFFFB6F0 16420002 ori r4,r4,#2
FFFFFFFFFFFFB6F4 E69C0A06 ; SETLO
FFFFFFFFFFFFB6F8 EE800003 ; SETMID
FFFFFFFFFFFFB6FC 6A0D1028 outb r4,UART_MC
FFFFFFFFFFFFB700 sgcfifo3:
FFFFFFFFFFFFB700 4002180A lb r4,Uart_rxdtr
FFFFFFFFFFFFB704 BE400108 beq r4,r0,sgcfifo4
FFFFFFFFFFFFB708 E69C0A06 ; SETLO
FFFFFFFFFFFFB70C EE800003 ; SETMID
FFFFFFFFFFFFB710 6A0D1020 inb r4,UART_MC ; set DTR
FFFFFFFFFFFFB714 16420001 ori r4,r4,#1
FFFFFFFFFFFFB718 E69C0A06 ; SETLO
FFFFFFFFFFFFB71C EE800003 ; SETMID
FFFFFFFFFFFFB720 6A0D1028 outb r4,UART_MC
FFFFFFFFFFFFB724 sgcfifo4:
FFFFFFFFFFFFB724 4002180B lb r4,Uart_rxxon
FFFFFFFFFFFFB728 BE4000A8 beq r4,r0,sgcfifo5
FFFFFFFFFFFFB72C E1000011 setlo r4,#XON
FFFFFFFFFFFFB730 E69C0A00 ; SETLO
FFFFFFFFFFFFB734 EE800003 ; SETMID
FFFFFFFFFFFFB738 6A0D1028 outb r4,UART
FFFFFFFFFFFFB73C sgcfifo5:
FFFFFFFFFFFFB73C sgcfifo2: ; return with char in r1
FFFFFFFFFFFFB73C 47E10000 lw r2,[sp]
FFFFFFFFFFFFB740 47E18008 lw r3,8[sp]
FFFFFFFFFFFFB744 47E20010 lw r4,16[sp]
FFFFFFFFFFFFB748 47EF8018 lw lr,24[sp]
FFFFFFFFFFFFB74C 37EF8020 ret #32
FFFFFFFFFFFFB750 sgcfifo1:
FFFFFFFFFFFFB750 E07FFFFF setlo r1,#-1 ; no char available
FFFFFFFFFFFFB754 47E10000 lw r2,[sp]
FFFFFFFFFFFFB758 47E18008 lw r3,8[sp]
FFFFFFFFFFFFB75C 47E20010 lw r4,16[sp]
FFFFFFFFFFFFB760 47EF8018 lw lr,24[sp]
FFFFFFFFFFFFB764 37EF8020 ret #32
;-----------------------------------------
; Serial port IRQ
;-----------------------------------------
;
FFFFFFFFFFFFB628 SerialIRQ:
FFFFFFFFFFFFB628 0FEF0028 subui sp,sp,#40
FFFFFFFFFFFFB62C 67E08000 sw r1,[sp]
FFFFFFFFFFFFB630 67E10008 sw r2,8[sp]
FFFFFFFFFFFFB634 67E18010 sw r3,16[sp]
FFFFFFFFFFFFB638 67E20018 sw r4,24[sp]
FFFFFFFFFFFFB63C 67EF8020 sw lr,32[sp]
FFFFFFFFFFFFB640 E69C0A03 ; SETLO
FFFFFFFFFFFFB644 EE800003 ; SETMID
FFFFFFFFFFFFB648 6A0D0420 inb r1,UART_IS ; get interrupt status
FFFFFFFFFFFFB64C BE1000A1 bge r1,r0,sirq1
FFFFFFFFFFFFB650 1410807F andi r1,r1,#0x7f ; switch on interrupt type
FFFFFFFFFFFFB654 B0100D04 beqi r1,#4,srxirq
FFFFFFFFFFFFB658 B0100B0C beqi r1,#0xC,stxirq
FFFFFFFFFFFFB65C B0100710 beqi r1,#0x10,smsirq
FFFFFFFFFFFFB660 sirq1:
FFFFFFFFFFFFB660 47E08000 lw r1,[sp]
FFFFFFFFFFFFB664 47E10008 lw r2,8[sp]
FFFFFFFFFFFFB668 47E18010 lw r3,16[sp]
FFFFFFFFFFFFB66C 47E20018 lw r4,24[sp]
FFFFFFFFFFFFB670 47EF8020 lw lr,32[sp]
FFFFFFFFFFFFB674 37EF8028 ret #40
FFFFFFFFFFFFB768 SerialIRQ:
FFFFFFFFFFFFB768 0FEF0028 subui sp,sp,#40
FFFFFFFFFFFFB76C 67E08000 sw r1,[sp]
FFFFFFFFFFFFB770 67E10008 sw r2,8[sp]
FFFFFFFFFFFFB774 67E18010 sw r3,16[sp]
FFFFFFFFFFFFB778 67E20018 sw r4,24[sp]
FFFFFFFFFFFFB77C 67EF8020 sw lr,32[sp]
FFFFFFFFFFFFB780 E69C0A03 ; SETLO
FFFFFFFFFFFFB784 EE800003 ; SETMID
FFFFFFFFFFFFB788 6A0D0420 inb r1,UART_IS ; get interrupt status
FFFFFFFFFFFFB78C BE1000A1 bge r1,r0,sirq1
FFFFFFFFFFFFB790 1410807F andi r1,r1,#0x7f ; switch on interrupt type
FFFFFFFFFFFFB794 B0100D04 beqi r1,#4,srxirq
FFFFFFFFFFFFB798 B0100B0C beqi r1,#0xC,stxirq
FFFFFFFFFFFFB79C B0100710 beqi r1,#0x10,smsirq
FFFFFFFFFFFFB7A0 sirq1:
FFFFFFFFFFFFB7A0 47E08000 lw r1,[sp]
FFFFFFFFFFFFB7A4 47E10008 lw r2,8[sp]
FFFFFFFFFFFFB7A8 47E18010 lw r3,16[sp]
FFFFFFFFFFFFB7AC 47E20018 lw r4,24[sp]
FFFFFFFFFFFFB7B0 47EF8020 lw lr,32[sp]
FFFFFFFFFFFFB7B4 37EF8028 ret #40
; Get the modem status and record it
FFFFFFFFFFFFB678 smsirq:
FFFFFFFFFFFFB678 80009808 inb r1,UART_MS
FFFFFFFFFFFFB67C 60009808 sb r1,Uart_ms
FFFFFFFFFFFFB680 BE007F0A bra sirq1
FFFFFFFFFFFFB7B8 smsirq:
FFFFFFFFFFFFB7B8 80009808 inb r1,UART_MS
FFFFFFFFFFFFB7BC 60009808 sb r1,Uart_ms
FFFFFFFFFFFFB7C0 BE007F0A bra sirq1
FFFFFFFFFFFFB684 stxirq:
FFFFFFFFFFFFB684 BE007EEA bra sirq1
FFFFFFFFFFFFB7C4 stxirq:
FFFFFFFFFFFFB7C4 BE007EEA bra sirq1
; Get a character from the uart and store it in the rx fifo
FFFFFFFFFFFFB688 srxirq:
FFFFFFFFFFFFB688 srxirq1:
FFFFFFFFFFFFB688 E69C0A00 ; SETLO
FFFFFFFFFFFFB68C EE800003 ; SETMID
FFFFFFFFFFFFB690 6A0D0420 inb r1,UART ; get the char (clears interrupt)
FFFFFFFFFFFFB694 40011814 lb r2,Uart_txxon
FFFFFFFFFFFFB698 BE200108 beq r2,r0,srxirq3
FFFFFFFFFFFFB69C B2100413 bnei r1,#XOFF,srxirq2
FFFFFFFFFFFFB6A0 E0400001 setlo r1,#1
FFFFFFFFFFFFB6A4 60009815 sb r1,Uart_txxonoff
FFFFFFFFFFFFB6A8 BE00016A bra srxirq5
FFFFFFFFFFFFB6AC srxirq2:
FFFFFFFFFFFFB6AC B2100311 bnei r1,#XON,srxirq3
FFFFFFFFFFFFB6B0 60001815 sb r0,Uart_txxonoff
FFFFFFFFFFFFB6B4 BE00010A bra srxirq5
FFFFFFFFFFFFB6B8 srxirq3:
FFFFFFFFFFFFB6B8 60001815 sb r0,Uart_txxonoff
FFFFFFFFFFFFB6BC 42011800 lc r2,Uart_rxhead
FFFFFFFFFFFFB6C0 9A019600 lea r3,Uart_rxfifo
FFFFFFFFFFFFB6C4 6A310410 sb r1,[r3+r2] ; store in buffer
FFFFFFFFFFFFB6C8 0A210001 addui r2,r2,#1
FFFFFFFFFFFFB6CC 142101FF andi r2,r2,#0x1ff
FFFFFFFFFFFFB6D0 62011800 sc r2,Uart_rxhead
FFFFFFFFFFFFB6D4 srxirq5:
FFFFFFFFFFFFB6D4 E69C0A01 ; SETLO
FFFFFFFFFFFFB6D8 EE800003 ; SETMID
FFFFFFFFFFFFB6DC 6A0D0420 inb r1,UART_LS ; check for another ready character
FFFFFFFFFFFFB6E0 14108001 andi r1,r1,#rxfull
FFFFFFFFFFFFB6E4 BE107D29 bne r1,r0,srxirq1
FFFFFFFFFFFFB6E8 4000980C lb r1,Uart_rxflow ; are we using flow controls?
FFFFFFFFFFFFB6EC BE1003C9 bne r1,r0,srxirq8
FFFFFFFFFFFFB6F0 31FFED4B call CharsInRxBuf
FFFFFFFFFFFFB6F4 42009810 lc r1,Uart_foff
FFFFFFFFFFFFB6F8 BE408360 blt r4,r1,srxirq8
FFFFFFFFFFFFB6FC E0400001 setlo r1,#1
FFFFFFFFFFFFB700 6000980C sb r1,Uart_rxflow
FFFFFFFFFFFFB704 40009809 lb r1,Uart_rxrts
FFFFFFFFFFFFB708 BE100108 beq r1,r0,srxirq6
FFFFFFFFFFFFB70C E69C0A06 ; SETLO
FFFFFFFFFFFFB710 EE800003 ; SETMID
FFFFFFFFFFFFB714 6A0D0420 inb r1,UART_MC
FFFFFFFFFFFFB718 141080FD andi r1,r1,#0xFD ; turn off RTS
FFFFFFFFFFFFB71C E69C0A06 ; SETLO
FFFFFFFFFFFFB720 EE800003 ; SETMID
FFFFFFFFFFFFB724 6A0D0428 outb r1,UART_MC
FFFFFFFFFFFFB728 srxirq6:
FFFFFFFFFFFFB728 4000980A lb r1,Uart_rxdtr
FFFFFFFFFFFFB72C BE100108 beq r1,r0,srxirq7
FFFFFFFFFFFFB730 E69C0A06 ; SETLO
FFFFFFFFFFFFB734 EE800003 ; SETMID
FFFFFFFFFFFFB738 6A0D0420 inb r1,UART_MC
FFFFFFFFFFFFB73C 141080FE andi r1,r1,#0xFE ; turn off DTR
FFFFFFFFFFFFB740 E69C0A06 ; SETLO
FFFFFFFFFFFFB744 EE800003 ; SETMID
FFFFFFFFFFFFB748 6A0D0428 outb r1,UART_MC
FFFFFFFFFFFFB74C srxirq7:
FFFFFFFFFFFFB74C 4000980B lb r1,Uart_rxxon
FFFFFFFFFFFFB750 BE1000A8 beq r1,r0,srxirq8
FFFFFFFFFFFFB754 E0400013 setlo r1,#XOFF
FFFFFFFFFFFFB758 E69C0A00 ; SETLO
FFFFFFFFFFFFB75C EE800003 ; SETMID
FFFFFFFFFFFFB760 6A0D0428 outb r1,UART
FFFFFFFFFFFFB764 srxirq8:
FFFFFFFFFFFFB764 BE0077EA bra sirq1
FFFFFFFFFFFFB7C8 srxirq:
FFFFFFFFFFFFB7C8 srxirq1:
FFFFFFFFFFFFB7C8 E69C0A00 ; SETLO
FFFFFFFFFFFFB7CC EE800003 ; SETMID
FFFFFFFFFFFFB7D0 6A0D0420 inb r1,UART ; get the char (clears interrupt)
FFFFFFFFFFFFB7D4 40011814 lb r2,Uart_txxon
FFFFFFFFFFFFB7D8 BE200108 beq r2,r0,srxirq3
FFFFFFFFFFFFB7DC B2100413 bnei r1,#XOFF,srxirq2
FFFFFFFFFFFFB7E0 E0400001 setlo r1,#1
FFFFFFFFFFFFB7E4 60009815 sb r1,Uart_txxonoff
FFFFFFFFFFFFB7E8 BE00016A bra srxirq5
FFFFFFFFFFFFB7EC srxirq2:
FFFFFFFFFFFFB7EC B2100311 bnei r1,#XON,srxirq3
FFFFFFFFFFFFB7F0 60001815 sb r0,Uart_txxonoff
FFFFFFFFFFFFB7F4 BE00010A bra srxirq5
FFFFFFFFFFFFB7F8 srxirq3:
FFFFFFFFFFFFB7F8 60001815 sb r0,Uart_txxonoff
FFFFFFFFFFFFB7FC 42011800 lc r2,Uart_rxhead
FFFFFFFFFFFFB800 9A019600 lea r3,Uart_rxfifo
FFFFFFFFFFFFB804 6A310410 sb r1,[r3+r2] ; store in buffer
FFFFFFFFFFFFB808 0A210001 addui r2,r2,#1
FFFFFFFFFFFFB80C 142101FF andi r2,r2,#0x1ff
FFFFFFFFFFFFB810 62011800 sc r2,Uart_rxhead
FFFFFFFFFFFFB814 srxirq5:
FFFFFFFFFFFFB814 E69C0A01 ; SETLO
FFFFFFFFFFFFB818 EE800003 ; SETMID
FFFFFFFFFFFFB81C 6A0D0420 inb r1,UART_LS ; check for another ready character
FFFFFFFFFFFFB820 14108001 andi r1,r1,#rxfull
FFFFFFFFFFFFB824 BE107D29 bne r1,r0,srxirq1
FFFFFFFFFFFFB828 4000980C lb r1,Uart_rxflow ; are we using flow controls?
FFFFFFFFFFFFB82C BE1003C9 bne r1,r0,srxirq8
FFFFFFFFFFFFB830 31FFED9B call CharsInRxBuf
FFFFFFFFFFFFB834 42009810 lc r1,Uart_foff
FFFFFFFFFFFFB838 BE408360 blt r4,r1,srxirq8
FFFFFFFFFFFFB83C E0400001 setlo r1,#1
FFFFFFFFFFFFB840 6000980C sb r1,Uart_rxflow
FFFFFFFFFFFFB844 40009809 lb r1,Uart_rxrts
FFFFFFFFFFFFB848 BE100108 beq r1,r0,srxirq6
FFFFFFFFFFFFB84C E69C0A06 ; SETLO
FFFFFFFFFFFFB850 EE800003 ; SETMID
FFFFFFFFFFFFB854 6A0D0420 inb r1,UART_MC
FFFFFFFFFFFFB858 141080FD andi r1,r1,#0xFD ; turn off RTS
FFFFFFFFFFFFB85C E69C0A06 ; SETLO
FFFFFFFFFFFFB860 EE800003 ; SETMID
FFFFFFFFFFFFB864 6A0D0428 outb r1,UART_MC
FFFFFFFFFFFFB868 srxirq6:
FFFFFFFFFFFFB868 4000980A lb r1,Uart_rxdtr
FFFFFFFFFFFFB86C BE100108 beq r1,r0,srxirq7
FFFFFFFFFFFFB870 E69C0A06 ; SETLO
FFFFFFFFFFFFB874 EE800003 ; SETMID
FFFFFFFFFFFFB878 6A0D0420 inb r1,UART_MC
FFFFFFFFFFFFB87C 141080FE andi r1,r1,#0xFE ; turn off DTR
FFFFFFFFFFFFB880 E69C0A06 ; SETLO
FFFFFFFFFFFFB884 EE800003 ; SETMID
FFFFFFFFFFFFB888 6A0D0428 outb r1,UART_MC
FFFFFFFFFFFFB88C srxirq7:
FFFFFFFFFFFFB88C 4000980B lb r1,Uart_rxxon
FFFFFFFFFFFFB890 BE1000A8 beq r1,r0,srxirq8
FFFFFFFFFFFFB894 E0400013 setlo r1,#XOFF
FFFFFFFFFFFFB898 E69C0A00 ; SETLO
FFFFFFFFFFFFB89C EE800003 ; SETMID
FFFFFFFFFFFFB8A0 6A0D0428 outb r1,UART
FFFFFFFFFFFFB8A4 srxirq8:
FFFFFFFFFFFFB8A4 BE0077EA bra sirq1
;==============================================================================
; Video BIOS
; Video interrupt #410
;
; Function in R1
; 0x02 = Set Cursor Position r2 = row, r3 = col
; 0x03 = Get Cursor position returns r1 = row, r2 = col
; 0x06 = Scroll screen up
; 0x09 = Display character+attribute, r2=char, r3=attrib, r4=#times
; 0x0A = Display character, r2 = char, r3 = # times
; 0x0C = Display Pixel r2 = x, r3 = y, r4 = color
; 0x0D = Get pixel r2 = x, r3 = y
; 0x14 = Display String r2 = pointer to string
; 0x15 = Display number r2 = number, r3 = # digits
; 0x16 = Display String + CRLF r2 = pointer to string
; 0x17 = Display Word r2 as hex = word
; 0x18 = Display Half word as hex r2 = half word
; 0x19 = Display Charr char in hex r2 = char
; 0x1A = Display Byte in hex r2 = byte
;==============================================================================
;
FFFFFFFFFFFFB8A8 VideoSC:
FFFFFFFFFFFFB8A8 020D0568 mfspr r26,AXC ; get context
FFFFFFFFFFFFB8AC 07AD0606 shlui r26,r26,#3 ; *8
FFFFFFFFFFFFB8B0 67AF2200 sw sp,sp_saves[r26] ; save sp in save area
FFFFFFFFFFFFB8B4 07AD1006 shlui r26,r26,#8 ; 2k for stack
FFFFFFFFFFFFB8B8 03AF0009 mov sp,r26
FFFFFFFFFFFFB8BC E6808000 ; SETLO
FFFFFFFFFFFFB8C0 EE800400 ; SETMID
FFFFFFFFFFFFB8C4 05ED7803 addui sp,sp,#0x100008000 ; base stacks address
FFFFFFFFFFFFB8C8 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFB8CC 67EF8000 sw lr,[sp]
FFFFFFFFFFFFB8D0 Video1:
FFFFFFFFFFFFB8D0 020F80B4 omgi lr,#VIDEOGATE
FFFFFFFFFFFFB8D4 BFF07FE9 bne lr,r0,Video1
FFFFFFFFFFFFB8D8 B0100D02 beqi r1,#0x02,Video_x02
FFFFFFFFFFFFB8DC B0101003 beqi r1,#0x03,Video_x03
FFFFFFFFFFFFB8E0 B0101206 beqi r1,#0x06,Video_x06
FFFFFFFFFFFFB8E4 B0101309 beqi r1,#0x09,Video_x09
FFFFFFFFFFFFB8E8 B010170A beqi r1,#0x0A,Video_x0A
FFFFFFFFFFFFB8EC B0101A0C beqi r1,#0x0C,Video_x0C
FFFFFFFFFFFFB8F0 B010270C beqi r1,#0x0C,Video_x0D
FFFFFFFFFFFFB8F4 B0103B14 beqi r1,#0x14,Video_x14
FFFFFFFFFFFFB8F8 B0103D15 beqi r1,#0x15,Video_x15
FFFFFFFFFFFFB8FC B0104016 beqi r1,#0x16,Video_x16
FFFFFFFFFFFFB900 B0104217 beqi r1,#0x17,Video_x17
FFFFFFFFFFFFB904 B010441A beqi r1,#0x1A,Video_x1A
FFFFFFFFFFFFB908 BE0008CA bra VideoRet
FFFFFFFFFFFFB90C Video_x02:
FFFFFFFFFFFFB90C 60011417 sb r2,CursorRow
FFFFFFFFFFFFB910 60019418 sb r3,CursorCol
FFFFFFFFFFFFB914 31FFF06F call CalcScreenLoc
FFFFFFFFFFFFB918 BE00084A bra VideoRet
FFFFFFFFFFFFB91C Video_x03:
FFFFFFFFFFFFB91C 4A009417 lbu r1,CursorRow
FFFFFFFFFFFFB920 4A011418 lbu r2,CursorCol
FFFFFFFFFFFFB924 BE0007EA bra VideoRet
FFFFFFFFFFFFB928 Video_x06:
FFFFFFFFFFFFB928 31FFF02E call ScrollUp
FFFFFFFFFFFFB92C BE0007AA bra VideoRet
FFFFFFFFFFFFB930 Video_x09:
FFFFFFFFFFFFB930 62019410 sc r3,CharColor
FFFFFFFFFFFFB934 02208009 mov r1,r2
FFFFFFFFFFFFB938 Video_x09a:
FFFFFFFFFFFFB938 31FFF07F call DisplayChar
FFFFFFFFFFFFB93C BE027FEF loop r4,Video_x09a
FFFFFFFFFFFFB940 BE00070A bra VideoRet
FFFFFFFFFFFFB944 Video_x0A:
FFFFFFFFFFFFB944 02208009 mov r1,r2
FFFFFFFFFFFFB948 Video_x0Aa:
FFFFFFFFFFFFB948 31FFF07F call DisplayChar
FFFFFFFFFFFFB94C BE01FFEF loop r3,Video_x0Aa
FFFFFFFFFFFFB950 BE00068A bra VideoRet
FFFFFFFFFFFFB954 Video_x0C:
FFFFFFFFFFFFB954 E69AE008 ; SETLO
FFFFFFFFFFFFB958 EE800003 ; SETMID
FFFFFFFFFFFFB95C 6A0D0812 sh r2,GACCEL+8 ; x0
FFFFFFFFFFFFB960 E69AE00C ; SETLO
FFFFFFFFFFFFB964 EE800003 ; SETMID
FFFFFFFFFFFFB968 6A0D0C12 sh r3,GACCEL+12 ; y0
FFFFFFFFFFFFB96C E69AE000 ; SETLO
FFFFFFFFFFFFB970 EE800003 ; SETMID
FFFFFFFFFFFFB974 6A0D1012 sh r4,GACCEL+0 ; color
FFFFFFFFFFFFB978 16008001 lw r1,#1
FFFFFFFFFFFFB97C E69AE03C ; SETLO
FFFFFFFFFFFFB980 EE800003 ; SETMID
FFFFFFFFFFFFB984 6A0D0412 sh r1,GACCEL+60 ; DRAW PIXEL command
FFFFFFFFFFFFB988 BE0004CA bra VideoRet
FFFFFFFFFFFFB98C Video_x0D:
FFFFFFFFFFFFB98C E69AE008 ; SETLO
FFFFFFFFFFFFB990 EE800003 ; SETMID
FFFFFFFFFFFFB994 6A0D0812 sh r2,GACCEL+8 ; x0
FFFFFFFFFFFFB998 E69AE00C ; SETLO
FFFFFFFFFFFFB99C EE800003 ; SETMID
FFFFFFFFFFFFB9A0 6A0D0C12 sh r3,GACCEL+12 ; y0
FFFFFFFFFFFFB9A4 16008008 lw r1,#8
FFFFFFFFFFFFB9A8 E69AE03C ; SETLO
FFFFFFFFFFFFB9AC EE800003 ; SETMID
FFFFFFFFFFFFB9B0 6A0D0412 sh r1,GACCEL+60 ; GET PIXEL command
FFFFFFFFFFFFB9B4 DE000000 nop ; let command start
FFFFFFFFFFFFB9B8 DE000000 nop
FFFFFFFFFFFFB9BC DE000000 nop
FFFFFFFFFFFFB9C0 vxd1:
FFFFFFFFFFFFB9C0 E69AE038 ; SETLO
FFFFFFFFFFFFB9C4 EE800003 ; SETMID
FFFFFFFFFFFFB9C8 6A0D0407 lhu r1,GACCEL+56 ; wait for state = IDLE
FFFFFFFFFFFFB9CC BE107FA9 bne r1,r0,vxd1
FFFFFFFFFFFFB9D0 E69AE034 ; SETLO
FFFFFFFFFFFFB9D4 EE800003 ; SETMID
FFFFFFFFFFFFB9D8 6A0D0407 lhu r1,GACCEL+52
FFFFFFFFFFFFB9DC BE00022A bra VideoRet
FFFFFFFFFFFFB9E0 Video_x14:
FFFFFFFFFFFFB9E0 02208009 mov r1,r2
FFFFFFFFFFFFB9E4 31FFF122 call DisplayString
FFFFFFFFFFFFB9E8 BE0001CA bra VideoRet
FFFFFFFFFFFFB9EC Video_x15:
FFFFFFFFFFFFB9EC 02208009 mov r1,r2
FFFFFFFFFFFFB9F0 02310009 mov r2,r3
FFFFFFFFFFFFB9F4 31FFF13F call DisplayNum
FFFFFFFFFFFFB9F8 BE00014A bra VideoRet
FFFFFFFFFFFFB9FC Video_x16:
FFFFFFFFFFFFB9FC 02208009 mov r1,r2
FFFFFFFFFFFFBA00 31FFF130 call DisplayStringCRLF
FFFFFFFFFFFFBA04 BE0000EA bra VideoRet
FFFFFFFFFFFFBA08 Video_x17:
FFFFFFFFFFFFBA08 02208009 mov r1,r2
FFFFFFFFFFFFBA0C 31FFF169 call DisplayWord
FFFFFFFFFFFFBA10 BE00008A bra VideoRet
FFFFFFFFFFFFBA14 Video_x1A:
FFFFFFFFFFFFBA14 02208009 mov r1,r2
FFFFFFFFFFFFBA18 31FFF14B call DisplayByte
FFFFFFFFFFFFBA1C BE00002A bra VideoRet
FFFFFFFFFFFFBA20 VideoRet:
FFFFFFFFFFFFBA20 020000B5 cmgi #VIDEOGATE
FFFFFFFFFFFFBA24 47EF8000 lw lr,[sp]
FFFFFFFFFFFFBA28 020D0568 mfspr r26,AXC ; get context
FFFFFFFFFFFFBA2C 07AD0606 shlui r26,r26,#3 ; *8
FFFFFFFFFFFFBA30 47AF2200 lw sp,sp_saves[r26] ; get back the stack
FFFFFFFFFFFFBA34 01800021 eret
;==============================================================================
; BIOS interrupt #413
; 0x00 initialize
; 0x01 read sector r2 = sector #, r3 = pointer to buffer
; 0x02 write sector
;==============================================================================
;
FFFFFFFFFFFFBA38 SDCARDSC:
FFFFFFFFFFFFBA38 020D0568 mfspr r26,AXC ; get context
FFFFFFFFFFFFBA3C 07AD0606 shlui r26,r26,#3 ; *8
FFFFFFFFFFFFBA40 67AF2200 sw sp,sp_saves[r26] ; save sp in save area
FFFFFFFFFFFFBA44 07AD1006 shlui r26,r26,#8 ; 2k for stack
FFFFFFFFFFFFBA48 03AF0009 mov sp,r26
FFFFFFFFFFFFBA4C E6808000 ; SETLO
FFFFFFFFFFFFBA50 EE800400 ; SETMID
FFFFFFFFFFFFBA54 05ED7803 addui sp,sp,#0x100008000 ; base stacks address
FFFFFFFFFFFFBA58 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFBA5C 67EF8000 sw lr,[sp]
FFFFFFFFFFFFBA60 SDC_1:
FFFFFFFFFFFFBA60 020F80F4 omgi lr,#CARDGATE
FFFFFFFFFFFFBA64 BFF07FE9 bne lr,r0,SDC_1
FFFFFFFFFFFFBA68 B0100400 beqi r1,#0,SDC_x00
FFFFFFFFFFFFBA6C B0100501 beqi r1,#1,SDC_x01
FFFFFFFFFFFFBA70 B0100802 beqi r1,#2,SDC_x02
FFFFFFFFFFFFBA74 BE0000EA bra SDCRet
FFFFFFFFFFFFBA78 SDC_x00:
FFFFFFFFFFFFBA78 31FFF54E call spi_init
FFFFFFFFFFFFBA7C BE0000AA bra SDCRet
FFFFFFFFFFFFBA80 SDC_x01:
FFFFFFFFFFFFBA80 02208009 mov r1,r2
FFFFFFFFFFFFBA84 02310009 mov r2,r3
FFFFFFFFFFFFBA88 31FFF56D call spi_read_sector
FFFFFFFFFFFFBA8C BE00002A bra SDCRet
FFFFFFFFFFFFBA90 SDC_x02:
FFFFFFFFFFFFBA90 SDCRet:
FFFFFFFFFFFFBA90 020000F5 cmgi #CARDGATE
FFFFFFFFFFFFBA94 47EF8000 lw lr,[sp]
FFFFFFFFFFFFBA98 020D0568 mfspr r26,AXC ; get context
FFFFFFFFFFFFBA9C 07AD0606 shlui r26,r26,#3 ; *8
FFFFFFFFFFFFBAA0 47AF2200 lw sp,sp_saves[r26] ; get back the stack
FFFFFFFFFFFFBAA4 01800021 eret
;==============================================================================
; Real time clock BIOS
; BIOS interrupt #416
;
; Function
; 0x00 = get system tick
; 0x01 = get date/time
; 0x02 = set date/time
;==============================================================================
;
FFFFFFFFFFFFBAA8 RTCSC:
FFFFFFFFFFFFBAA8 020D0568 mfspr r26,AXC ; get context
FFFFFFFFFFFFBAAC 07AD0606 shlui r26,r26,#3 ; *8
FFFFFFFFFFFFBAB0 67AF2200 sw sp,sp_saves[r26] ; save sp in save area
FFFFFFFFFFFFBAB4 07AD1006 shlui r26,r26,#8 ; 2k for stack
FFFFFFFFFFFFBAB8 03AF0009 mov sp,r26
FFFFFFFFFFFFBABC E6808000 ; SETLO
FFFFFFFFFFFFBAC0 EE800400 ; SETMID
FFFFFFFFFFFFBAC4 05ED7803 addui sp,sp,#0x100008000 ; base stacks address
FFFFFFFFFFFFBAC8 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFBACC 67EF8000 sw lr,[sp]
;
FFFFFFFFFFFFBAD0 B0100200 beqi r1,#0x00,RTC_x00
FFFFFFFFFFFFBAD4 B0100301 beqi r1,#0x01,RTC_x01
FFFFFFFFFFFFBAD8 RTC_x00:
FFFFFFFFFFFFBAD8 020085A8 mfspr r1,TICK
FFFFFFFFFFFFBADC BE00012A bra RTCRet
FFFFFFFFFFFFBAE0 RTC_x01:
FFFFFFFFFFFFBAE0 E69C0418 ; SETLO
FFFFFFFFFFFFBAE4 EE800003 ; SETMID
FFFFFFFFFFFFBAE8 6A0D002B outw r0,DATETIME+24 ; trigger a snapshot
FFFFFFFFFFFFBAEC DE000000 nop
FFFFFFFFFFFFBAF0 E69C0400 ; SETLO
FFFFFFFFFFFFBAF4 EE800003 ; SETMID
FFFFFFFFFFFFBAF8 6A0D0423 inw r1,DATETIME ; get the snapshotted date and time
FFFFFFFFFFFFBAFC BE00002A bra RTCRet
FFFFFFFFFFFFBB00 RTCRet:
FFFFFFFFFFFFBB00 47EF8000 lw lr,[sp]
FFFFFFFFFFFFBB04 020D0568 mfspr r26,AXC ; get context
FFFFFFFFFFFFBB08 07AD0606 shlui r26,r26,#3 ; *8
FFFFFFFFFFFFBB0C 47AF2200 lw sp,sp_saves[r26] ; get back the stack
FFFFFFFFFFFFBB10 01800021 eret
;==============================================================================
; Keyboard BIOS
; BIOS interrupt #417
;
; Function in R1
; 0 = initialize keyboard
; 1 = set keyboard echo
; 2 = get keyboard character
; 3 = check for key available
; 0x00 = initialize keyboard
; 0x01 = set keyboard echo
; 0x02 = get keyboard character from buffer
; 0x03 = check for key available in buffer
; 0x04 = check for key directly at keyboard port
; 0x05 = get keyboard character directly from keyboard port (blocks)
;==============================================================================
;
FFFFFFFFFFFFB768 KeybdSC:
FFFFFFFFFFFFB768 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFB76C 67EF8000 sw lr,[sp]
FFFFFFFFFFFFB770 B2100300 bnei r1,#0,kbdsc1
FFFFFFFFFFFFB774 31FFEDEC call KeybdInit
FFFFFFFFFFFFB778 BE00016A bra kbdscRet
FFFFFFFFFFFFB77C kbdsc1:
FFFFFFFFFFFFB77C B2100401 bnei r1,#1,kbdsc2
FFFFFFFFFFFFB780 02208009 mov r1,r2
FFFFFFFFFFFFB784 31FFEE06 call SetKeyboardEcho
FFFFFFFFFFFFB788 BE0000EA bra kbdscRet
FFFFFFFFFFFFB78C kbdsc2:
FFFFFFFFFFFFB78C B2100302 bnei r1,#2,kbdsc3
FFFFFFFFFFFFB790 31FFEE08 call KeybdGetChar
FFFFFFFFFFFFB794 BE00008A bra kbdscRet
FFFFFFFFFFFFB798 kbdsc3:
FFFFFFFFFFFFB798 B2100303 bnei r1,#3,kbdsc4
FFFFFFFFFFFFB79C 31FFEE1D call KeybdCheckForKey
FFFFFFFFFFFFB7A0 BE00002A bra kbdscRet
FFFFFFFFFFFFB7A4 kbdsc4:
FFFFFFFFFFFFB7A4 kbdscRet:
FFFFFFFFFFFFB7A4 47EF8000 lw lr,[sp]
FFFFFFFFFFFFB7A8 0BEF0008 addui sp,sp,#8
FFFFFFFFFFFFB7AC 01800021 eret
FFFFFFFFFFFFBB14 KeybdSC:
FFFFFFFFFFFFBB14 020D0568 mfspr r26,AXC ; get context
FFFFFFFFFFFFBB18 07AD0606 shlui r26,r26,#3 ; *8
FFFFFFFFFFFFBB1C 67AF2200 sw sp,sp_saves[r26] ; save sp in save area
FFFFFFFFFFFFBB20 07AD1006 shlui r26,r26,#8 ; 2k for stack
FFFFFFFFFFFFBB24 03AF0009 mov sp,r26
FFFFFFFFFFFFBB28 E6808000 ; SETLO
FFFFFFFFFFFFBB2C EE800400 ; SETMID
FFFFFFFFFFFFBB30 05ED7803 addui sp,sp,#0x100008000 ; base stacks address
FFFFFFFFFFFFBB34 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFBB38 67EF8000 sw lr,[sp]
FFFFFFFFFFFFBB3C kbdsc5:
FFFFFFFFFFFFBB3C 020F8074 omgi lr,#KEYBDGATE
FFFFFFFFFFFFBB40 BFF07FE9 bne lr,r0,kbdsc5
FFFFFFFFFFFFBB44 B0100700 beqi r1,#0,kbd_x00
FFFFFFFFFFFFBB48 B0100801 beqi r1,#1,kbd_x01
FFFFFFFFFFFFBB4C B0100A02 beqi r1,#2,kbd_x02
FFFFFFFFFFFFBB50 B0100B03 beqi r1,#3,kbd_x03
FFFFFFFFFFFFBB54 B0100C04 beqi r1,#4,kbd_x04
FFFFFFFFFFFFBB58 B0100D05 beqi r1,#5,kbd_x05
FFFFFFFFFFFFBB5C BE0001CA bra kbdscRet
FFFFFFFFFFFFBB60 kbd_x00:
FFFFFFFFFFFFBB60 31FFEEEB call KeybdInit
FFFFFFFFFFFFBB64 BE00018A bra kbdscRet
FFFFFFFFFFFFBB68 kbd_x01:
FFFFFFFFFFFFBB68 02208009 mov r1,r2
FFFFFFFFFFFFBB6C 31FFEF05 call SetKeyboardEcho
FFFFFFFFFFFFBB70 BE00012A bra kbdscRet
FFFFFFFFFFFFBB74 kbd_x02:
FFFFFFFFFFFFBB74 31FFEF07 call KeybdGetChar
FFFFFFFFFFFFBB78 BE0000EA bra kbdscRet
FFFFFFFFFFFFBB7C kbd_x03:
FFFFFFFFFFFFBB7C 31FFEF1C call KeybdCheckForKey
FFFFFFFFFFFFBB80 BE0000AA bra kbdscRet
FFFFFFFFFFFFBB84 kbd_x04:
FFFFFFFFFFFFBB84 31FFEF20 call KeybdCheckForKeyDirect
FFFFFFFFFFFFBB88 BE00006A bra kbdscRet
FFFFFFFFFFFFBB8C kbd_x05:
FFFFFFFFFFFFBB8C 31FFEF25 call KeybdGetCharDirect
FFFFFFFFFFFFBB90 BE00002A bra kbdscRet
FFFFFFFFFFFFBB94 kbdscRet:
FFFFFFFFFFFFBB94 02000075 cmgi #KEYBDGATE
FFFFFFFFFFFFBB98 47EF8000 lw lr,[sp]
FFFFFFFFFFFFBB9C 020D0568 mfspr r26,AXC ; get context
FFFFFFFFFFFFBBA0 07AD0606 shlui r26,r26,#3 ; *8
FFFFFFFFFFFFBBA4 47AF2200 lw sp,sp_saves[r26] ; get back the stack
FFFFFFFFFFFFBBA8 01800021 eret
;------------------------------------------------------------------------------
; Initialize keyboard
;------------------------------------------------------------------------------
FFFFFFFFFFFFB7B0 KeybdInit:
FFFFFFFFFFFFB7B0 60001450 sb r0,KeybdHead
FFFFFFFFFFFFB7B4 60001451 sb r0,KeybdTail
FFFFFFFFFFFFB7B8 E0400001 setlo r1,#1 ; turn on keyboard echo
FFFFFFFFFFFFB7BC 6000941C sb r1,KeybdEcho
FFFFFFFFFFFFB7C0 37EF8000 ret
FFFFFFFFFFFFBBAC KeybdInit:
FFFFFFFFFFFFBBAC 60001450 sb r0,KeybdHead
FFFFFFFFFFFFBBB0 60001451 sb r0,KeybdTail
FFFFFFFFFFFFBBB4 E0400001 setlo r1,#1 ; turn on keyboard echo
FFFFFFFFFFFFBBB8 6000941C sb r1,KeybdEcho
FFFFFFFFFFFFBBBC 37EF8000 ret
;------------------------------------------------------------------------------
; Normal keyboard interrupt, the lowest priority interrupt in the system.
938,77 → 1408,77
; Grab the character from the keyboard device and store it in a buffer.
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFB7C4 KeybdIRQ:
FFFFFFFFFFFFB7C4 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFB7C8 67E10000 sw r2,[sp]
FFFFFFFFFFFFB7CC 4A009450 lbu r1,KeybdHead
FFFFFFFFFFFFB7D0 1410800F andi r1,r1,#0x0f ; r1 = index into buffer
FFFFFFFFFFFFB7D4 KeybdIRQa:
FFFFFFFFFFFFB7D4 E69C0000 ; SETLO
FFFFFFFFFFFFB7D8 EE800003 ; SETMID
FFFFFFFFFFFFB7DC 6A0D0821 inch r2,KEYBD ; get keyboard character
FFFFFFFFFFFFB7E0 E69C0002 ; SETLO
FFFFFFFFFFFFB7E4 EE800003 ; SETMID
FFFFFFFFFFFFB7E8 6A0D0029 outc r0,KEYBD+2 ; clear keyboard strobe (turns off the IRQ)
FFFFFFFFFFFFB7EC 60111440 sb r2,KeybdBuffer[r1] ; store character in buffer
FFFFFFFFFFFFB7F0 0A108001 addui r1,r1,#1 ; increment head index
FFFFFFFFFFFFB7F4 1410800F andi r1,r1,#0x0f
FFFFFFFFFFFFB7F8 60009450 sb r1,KeybdHead
FFFFFFFFFFFFB7FC KeybdIRQb:
FFFFFFFFFFFFB7FC 4A011451 lbu r2,KeybdTail ; check to see if we've collided
FFFFFFFFFFFFB800 BE110089 bne r1,r2,KeybdIRQc ; with the tail
FFFFFFFFFFFFB804 0A210001 addui r2,r2,#1 ; if so, increment the tail index
FFFFFFFFFFFFB808 1421000F andi r2,r2,#0x0f ; the oldest character will be lost
FFFFFFFFFFFFB80C 60011451 sb r2,KeybdTail
FFFFFFFFFFFFB810 KeybdIRQc:
FFFFFFFFFFFFB810 47E10000 lw r2,[sp]
FFFFFFFFFFFFB814 37EF8008 ret #8
FFFFFFFFFFFFBBC0 KeybdIRQ:
FFFFFFFFFFFFBBC0 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFBBC4 67E10000 sw r2,[sp]
FFFFFFFFFFFFBBC8 4A009450 lbu r1,KeybdHead
FFFFFFFFFFFFBBCC 1410800F andi r1,r1,#0x0f ; r1 = index into buffer
FFFFFFFFFFFFBBD0 KeybdIRQa:
FFFFFFFFFFFFBBD0 E69C0000 ; SETLO
FFFFFFFFFFFFBBD4 EE800003 ; SETMID
FFFFFFFFFFFFBBD8 6A0D0821 inch r2,KEYBD ; get keyboard character
FFFFFFFFFFFFBBDC E69C0002 ; SETLO
FFFFFFFFFFFFBBE0 EE800003 ; SETMID
FFFFFFFFFFFFBBE4 6A0D0029 outc r0,KEYBD+2 ; clear keyboard strobe (turns off the IRQ)
FFFFFFFFFFFFBBE8 60111440 sb r2,KeybdBuffer[r1] ; store character in buffer
FFFFFFFFFFFFBBEC 0A108001 addui r1,r1,#1 ; increment head index
FFFFFFFFFFFFBBF0 1410800F andi r1,r1,#0x0f
FFFFFFFFFFFFBBF4 60009450 sb r1,KeybdHead
FFFFFFFFFFFFBBF8 KeybdIRQb:
FFFFFFFFFFFFBBF8 4A011451 lbu r2,KeybdTail ; check to see if we've collided
FFFFFFFFFFFFBBFC BE110089 bne r1,r2,KeybdIRQc ; with the tail
FFFFFFFFFFFFBC00 0A210001 addui r2,r2,#1 ; if so, increment the tail index
FFFFFFFFFFFFBC04 1421000F andi r2,r2,#0x0f ; the oldest character will be lost
FFFFFFFFFFFFBC08 60011451 sb r2,KeybdTail
FFFFFFFFFFFFBC0C KeybdIRQc:
FFFFFFFFFFFFBC0C 47E10000 lw r2,[sp]
FFFFFFFFFFFFBC10 37EF8008 ret #8
;------------------------------------------------------------------------------
; r1 0=echo off, non-zero = echo on
;------------------------------------------------------------------------------
FFFFFFFFFFFFB818 SetKeyboardEcho:
FFFFFFFFFFFFB818 6000941C sb r1,KeybdEcho
FFFFFFFFFFFFB81C 37EF8000 ret
FFFFFFFFFFFFBC14 SetKeyboardEcho:
FFFFFFFFFFFFBC14 6000941C sb r1,KeybdEcho
FFFFFFFFFFFFBC18 37EF8000 ret
;-----------------------------------------
; Get character from keyboard buffer
;-----------------------------------------
FFFFFFFFFFFFB820 KeybdGetChar:
FFFFFFFFFFFFB820 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFB824 67E10000 sw r2,[sp]
FFFFFFFFFFFFB828 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFB82C 4A011451 lbu r2,KeybdTail
FFFFFFFFFFFFB830 4A009450 lbu r1,KeybdHead
FFFFFFFFFFFFB834 BE110188 beq r1,r2,nochar
FFFFFFFFFFFFB838 4A209440 lbu r1,KeybdBuffer[r2]
FFFFFFFFFFFFB83C 0A210001 addui r2,r2,#1
FFFFFFFFFFFFB840 1421000F andi r2,r2,#0x0f
FFFFFFFFFFFFB844 60011451 sb r2,KeybdTail
FFFFFFFFFFFFB848 4001141C lb r2,KeybdEcho
FFFFFFFFFFFFB84C BE2000E8 beq r2,r0,kgc3
FFFFFFFFFFFFB850 B210030D bnei r1,#CR,kgc2
FFFFFFFFFFFFB854 31FFF93F call CRLF ; convert CR keystroke into CRLF
FFFFFFFFFFFFB858 BE00008A bra kgc3
FFFFFFFFFFFFB85C kgc2:
FFFFFFFFFFFFB85C 31FFEF47 call DisplayChar
FFFFFFFFFFFFB860 BE00004A bra kgc3
FFFFFFFFFFFFB864 nochar:
FFFFFFFFFFFFB864 E07FFFFF setlo r1,#-1
FFFFFFFFFFFFB868 kgc3:
FFFFFFFFFFFFB868 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFB86C 47E10000 lw r2,[sp]
FFFFFFFFFFFFB870 37EF8010 ret #16
FFFFFFFFFFFFBC1C KeybdGetChar:
FFFFFFFFFFFFBC1C 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFBC20 67E10000 sw r2,[sp]
FFFFFFFFFFFFBC24 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFBC28 4A011451 lbu r2,KeybdTail
FFFFFFFFFFFFBC2C 4A009450 lbu r1,KeybdHead
FFFFFFFFFFFFBC30 BE110188 beq r1,r2,nochar
FFFFFFFFFFFFBC34 4A209440 lbu r1,KeybdBuffer[r2]
FFFFFFFFFFFFBC38 0A210001 addui r2,r2,#1
FFFFFFFFFFFFBC3C 1421000F andi r2,r2,#0x0f
FFFFFFFFFFFFBC40 60011451 sb r2,KeybdTail
FFFFFFFFFFFFBC44 4001141C lb r2,KeybdEcho
FFFFFFFFFFFFBC48 BE2000E8 beq r2,r0,kgc3
FFFFFFFFFFFFBC4C B210030D bnei r1,#CR,kgc2
FFFFFFFFFFFFBC50 31FFFD80 call CRLF ; convert CR keystroke into CRLF
FFFFFFFFFFFFBC54 BE00008A bra kgc3
FFFFFFFFFFFFBC58 kgc2:
FFFFFFFFFFFFBC58 31FFF07F call DisplayChar
FFFFFFFFFFFFBC5C BE00004A bra kgc3
FFFFFFFFFFFFBC60 nochar:
FFFFFFFFFFFFBC60 E07FFFFF setlo r1,#-1
FFFFFFFFFFFFBC64 kgc3:
FFFFFFFFFFFFBC64 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFBC68 47E10000 lw r2,[sp]
FFFFFFFFFFFFBC6C 37EF8010 ret #16
;------------------------------------------------------------------------------
; Check if there is a keyboard character available in the keyboard buffer.
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFB874 KeybdCheckForKey:
FFFFFFFFFFFFB874 4A009451 lbu r1,KeybdTail
FFFFFFFFFFFFB878 4A011450 lbu r2,KeybdHead
FFFFFFFFFFFFB87C 04110439 sne r1,r1,r2
FFFFFFFFFFFFB880 37EF8000 ret
FFFFFFFFFFFFBC70 KeybdCheckForKey:
FFFFFFFFFFFFBC70 4A009451 lbu r1,KeybdTail
FFFFFFFFFFFFBC74 4A011450 lbu r2,KeybdHead
FFFFFFFFFFFFBC78 04110439 sne r1,r1,r2
FFFFFFFFFFFFBC7C 37EF8000 ret
;------------------------------------------------------------------------------
; Check if there is a keyboard character available. If so return true (1)
1015,12 → 1485,12
; otherwise return false (0) in r1.
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFB884 KeybdCheckForKeyDirect:
FFFFFFFFFFFFB884 E69C0000 ; SETLO
FFFFFFFFFFFFB888 EE800003 ; SETMID
FFFFFFFFFFFFB88C 6A0D0421 inch r1,KEYBD
FFFFFFFFFFFFB890 04100430 slt r1,r1,r0
FFFFFFFFFFFFB894 37EF8000 ret
FFFFFFFFFFFFBC80 KeybdCheckForKeyDirect:
FFFFFFFFFFFFBC80 E69C0000 ; SETLO
FFFFFFFFFFFFBC84 EE800003 ; SETMID
FFFFFFFFFFFFBC88 6A0D0421 inch r1,KEYBD
FFFFFFFFFFFFBC8C 04100430 slt r1,r1,r0
FFFFFFFFFFFFBC90 37EF8000 ret
;------------------------------------------------------------------------------
; Get character directly from keyboard. This routine blocks until a key is
1027,53 → 1497,137
; available.
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFB898 KeybdGetCharDirect:
FFFFFFFFFFFFB898 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFB89C 67E10000 sw r2,[sp]
FFFFFFFFFFFFB8A0 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFB8A4 E09C0000 setlo r2,KEYBD
FFFFFFFFFFFFB8A8 kgc1:
FFFFFFFFFFFFB8A8 E69C0000 ; SETLO
FFFFFFFFFFFFB8AC EE800003 ; SETMID
FFFFFFFFFFFFB8B0 6A0D0421 inch r1,KEYBD
FFFFFFFFFFFFB8B4 BE107FA1 bge r1,r0,kgc1
FFFFFFFFFFFFB8B8 E69C0002 ; SETLO
FFFFFFFFFFFFB8BC EE800003 ; SETMID
FFFFFFFFFFFFB8C0 6A0D0029 outc r0,KEYBD+2 ; clear keyboard strobe
FFFFFFFFFFFFB8C4 141080FF andi r1,r1,#0xff ; remove strobe bit
FFFFFFFFFFFFB8C8 4001141C lb r2,KeybdEcho ; is keyboard echo on ?
FFFFFFFFFFFFB8CC BE2000A8 beq r2,r0,gk1
FFFFFFFFFFFFB8D0 B210030D bnei r1,#'\r',gk2 ; convert CR keystroke into CRLF
FFFFFFFFFFFFB8D4 31FFF93F call CRLF
FFFFFFFFFFFFB8D8 BE00004A bra gk1
FFFFFFFFFFFFB8DC gk2:
FFFFFFFFFFFFB8DC 31FFEF47 call DisplayChar
FFFFFFFFFFFFB8E0 gk1:
FFFFFFFFFFFFB8E0 47E10000 lw r2,[sp]
FFFFFFFFFFFFB8E4 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFB8E8 37EF8010 ret #16
FFFFFFFFFFFFBC94 KeybdGetCharDirect:
FFFFFFFFFFFFBC94 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFBC98 67E10000 sw r2,[sp]
FFFFFFFFFFFFBC9C 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFBCA0 E09C0000 setlo r2,KEYBD
FFFFFFFFFFFFBCA4 kgc1:
FFFFFFFFFFFFBCA4 E69C0000 ; SETLO
FFFFFFFFFFFFBCA8 EE800003 ; SETMID
FFFFFFFFFFFFBCAC 6A0D0421 inch r1,KEYBD
FFFFFFFFFFFFBCB0 BE107FA1 bge r1,r0,kgc1
FFFFFFFFFFFFBCB4 E69C0002 ; SETLO
FFFFFFFFFFFFBCB8 EE800003 ; SETMID
FFFFFFFFFFFFBCBC 6A0D0029 outc r0,KEYBD+2 ; clear keyboard strobe
FFFFFFFFFFFFBCC0 141080FF andi r1,r1,#0xff ; remove strobe bit
FFFFFFFFFFFFBCC4 4001141C lb r2,KeybdEcho ; is keyboard echo on ?
FFFFFFFFFFFFBCC8 BE2000A8 beq r2,r0,gk1
FFFFFFFFFFFFBCCC B210030D bnei r1,#'\r',gk2 ; convert CR keystroke into CRLF
FFFFFFFFFFFFBCD0 31FFFD80 call CRLF
FFFFFFFFFFFFBCD4 BE00004A bra gk1
FFFFFFFFFFFFBCD8 gk2:
FFFFFFFFFFFFBCD8 31FFF07F call DisplayChar
FFFFFFFFFFFFBCDC gk1:
FFFFFFFFFFFFBCDC 47E10000 lw r2,[sp]
FFFFFFFFFFFFBCE0 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFBCE4 37EF8010 ret #16
;==============================================================================
;==============================================================================
FFFFFFFFFFFFBCE8 tmp_init:
; wait for the rst1626 to go low
FFFFFFFFFFFFBCE8 E6989680 ; SETLO
FFFFFFFFFFFFBCEC EE800002 ; SETMID
FFFFFFFFFFFFBCF0 040D0809 lw r2,#10000000 ; retry for up to several seconds
FFFFFFFFFFFFBCF4 tmp_init4:
FFFFFFFFFFFFBCF4 BE2000C8 beq r2,r0,tmp_init5
FFFFFFFFFFFFBCF8 0E210001 subui r2,r2,#1
FFFFFFFFFFFFBCFC E69C0302 ; SETLO
FFFFFFFFFFFFBD00 EE800003 ; SETMID
FFFFFFFFFFFFBD04 6A0D0421 inch r1,TMP+2 ; read the status reg
FFFFFFFFFFFFBD08 BE107F60 blt r1,r0,tmp_init4
FFFFFFFFFFFFBD0C tmp_init5:
FFFFFFFFFFFFBD0C 16008051 lw r1,#0x51 ; Start temperature conversion
FFFFFFFFFFFFBD10 E69C0300 ; SETLO
FFFFFFFFFFFFBD14 EE800003 ; SETMID
FFFFFFFFFFFFBD18 6A0D0429 outc r1,TMP
; wait a bit for the trigger to take effect
FFFFFFFFFFFFBD1C 160089C4 lw r1,#2500
FFFFFFFFFFFFBD20 tmp_init1:
FFFFFFFFFFFFBD20 BE00800F loop r1,tmp_init1
; wait for the rst1626 to go low
FFFFFFFFFFFFBD24 E6989680 ; SETLO
FFFFFFFFFFFFBD28 EE800002 ; SETMID
FFFFFFFFFFFFBD2C 040D0809 lw r2,#10000000 ; retry for up to several seconds
FFFFFFFFFFFFBD30 tmp_init2:
FFFFFFFFFFFFBD30 BE2000C8 beq r2,r0,tmp_init3
FFFFFFFFFFFFBD34 0E210001 subui r2,r2,#1
FFFFFFFFFFFFBD38 E69C0302 ; SETLO
FFFFFFFFFFFFBD3C EE800003 ; SETMID
FFFFFFFFFFFFBD40 6A0D0421 inch r1,TMP+2 ; read the status reg
FFFFFFFFFFFFBD44 BE107F60 blt r1,r0,tmp_init2
FFFFFFFFFFFFBD48 tmp_init3:
FFFFFFFFFFFFBD48 37EF8000 ret
FFFFFFFFFFFFBD4C tmp_read:
FFFFFFFFFFFFBD4C 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFBD50 67EF8000 sw lr,[sp]
FFFFFFFFFFFFBD54 67E08008 sw r1,8[sp]
FFFFFFFFFFFFBD58 67E10010 sw r2,16[sp]
FFFFFFFFFFFFBD5C E6BD7840 ; SETLO
FFFFFFFFFFFFBD60 EE800005 ; SETMID
FFFFFFFFFFFFBD64 040D0409 lw r1,#25000000 ; wait about 1 second or so
FFFFFFFFFFFFBD68 tmp_read1:
FFFFFFFFFFFFBD68 BE00800F loop r1,tmp_read1
FFFFFFFFFFFFBD6C 160080AC lw r1,#0xAC ; issue read temperature conversion
FFFFFFFFFFFFBD70 E69C0300 ; SETLO
FFFFFFFFFFFFBD74 EE800003 ; SETMID
FFFFFFFFFFFFBD78 6A0D0429 outc r1,TMP
; wait a bit for the trigger to take effect
FFFFFFFFFFFFBD7C 160089C4 lw r1,#2500
FFFFFFFFFFFFBD80 tmp_read3:
FFFFFFFFFFFFBD80 BE00800F loop r1,tmp_read3
; wait for the rst1626 to go low
FFFFFFFFFFFFBD84 E6989680 ; SETLO
FFFFFFFFFFFFBD88 EE800002 ; SETMID
FFFFFFFFFFFFBD8C 040D0809 lw r2,#10000000
FFFFFFFFFFFFBD90 tmp_read2:
FFFFFFFFFFFFBD90 E69C0302 ; SETLO
FFFFFFFFFFFFBD94 EE800003 ; SETMID
FFFFFFFFFFFFBD98 6A0D0421 inch r1,TMP+2 ; read the status reg
FFFFFFFFFFFFBD9C BE200068 beq r2,r0,tmp_read4
FFFFFFFFFFFFBDA0 0E210001 subui r2,r2,#1
FFFFFFFFFFFFBDA4 BE107F60 blt r1,r0,tmp_read2
FFFFFFFFFFFFBDA8 tmp_read4:
FFFFFFFFFFFFBDA8 E69C0302 ; SETLO
FFFFFFFFFFFFBDAC EE800003 ; SETMID
FFFFFFFFFFFFBDB0 6A0D0421 inch r1,TMP+2 ; read the temperature
FFFFFFFFFFFFBDB4 16010005 lw r2,#5 ; five digits
FFFFFFFFFFFFBDB8 31FFF13F call DisplayNum
FFFFFFFFFFFFBDBC 47EF8000 lw lr,[sp]
FFFFFFFFFFFFBDC0 47E08008 lw r1,8[sp]
FFFFFFFFFFFFBDC4 47E10010 lw r2,16[sp]
FFFFFFFFFFFFBDC8 37EF8018 ret #24
;==============================================================================
;==============================================================================
;------------------------------------------------------------------------------
; 100 Hz interrupt
; - takes care of "flashing" the cursor
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFB8EC Pulse100:
FFFFFFFFFFFFB8EC 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFB8F0 67EF8000 sw lr,[sp]
FFFFFFFFFFFFB8F4 E6900000 ; SETLO
FFFFFFFFFFFFB8F8 EE800003 ; SETMID
FFFFFFFFFFFFB8FC 6A0D082D lea r2,TEXTSCR
FFFFFFFFFFFFB900 8220814E inch r1,334[r2]
FFFFFFFFFFFFB904 0A108001 addui r1,r1,#1
FFFFFFFFFFFFB908 9220814E outc r1,334[r2]
FFFFFFFFFFFFB90C 31FFF2D8 call DisplayDatetime
FFFFFFFFFFFFB910 31FFEE4A call SelectNextToRunTCB
FFFFFFFFFFFFB914 31FFEE4C call SwitchTask
FFFFFFFFFFFFB918 E6BF0010 ; SETLO
FFFFFFFFFFFFB91C 6A0D0010 sb r0,0xFFFF_FFFF_FFFF_0010 ; clear interrupt
FFFFFFFFFFFFBDCC Pulse100:
FFFFFFFFFFFFBDCC 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFBDD0 67EF8000 sw lr,[sp]
FFFFFFFFFFFFBDD4 E6900000 ; SETLO
FFFFFFFFFFFFBDD8 EE800003 ; SETMID
FFFFFFFFFFFFBDDC 6A0D082D lea r2,TEXTSCR
FFFFFFFFFFFFBDE0 8220814E inch r1,334[r2]
FFFFFFFFFFFFBDE4 0A108001 addui r1,r1,#1
FFFFFFFFFFFFBDE8 9220814E outc r1,334[r2]
; call DisplayDatetime
FFFFFFFFFFFFBDEC 31FFEF82 call SelectNextToRunTCB
FFFFFFFFFFFFBDF0 31FFEF84 call SwitchTask
FFFFFFFFFFFFBDF4 E69CFFFC ; SETLO
FFFFFFFFFFFFBDF8 EE800003 ; SETMID
FFFFFFFFFFFFBDFC 6A0D0028 outb r0,0xDCFFFC ; clear interrupt
; lw r1,TickIRQAddr
; jal r31,[r1]
; lw r1,Milliseconds
1080,183 → 1634,183
; andi r1,r1,#0x0f
; bnei r1,#5,p1001
; call FlashCursor
FFFFFFFFFFFFB920 p1001:
FFFFFFFFFFFFB920 47EF8000 lw lr,[sp]
FFFFFFFFFFFFB924 37EF8008 ret #8
FFFFFFFFFFFFBE00 p1001:
FFFFFFFFFFFFBE00 47EF8000 lw lr,[sp]
FFFFFFFFFFFFBE04 37EF8008 ret #8
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
FFFFFFFFFFFFB928 SelectNextToRunTCB:
FFFFFFFFFFFFB928 620020A8 sc r0,NextToRunTCB
FFFFFFFFFFFFB92C 37EF8000 ret
FFFFFFFFFFFFBE08 SelectNextToRunTCB:
FFFFFFFFFFFFBE08 620020A8 sc r0,NextToRunTCB
FFFFFFFFFFFFBE0C 37EF8000 ret
;------------------------------------------------------------------------------
; Switch from the RunningTCB to the NextToRunTCB
;------------------------------------------------------------------------------
FFFFFFFFFFFFB930 SwitchTask:
FFFFFFFFFFFFB930 6600A0B0 sw r1,r1save
FFFFFFFFFFFFB934 660120B8 sw r2,r2save
FFFFFFFFFFFFB938 4C00A0A8 lcu r1,NextToRunTCB
FFFFFFFFFFFFB93C 4C0120A6 lcu r2,RunningTCB
FFFFFFFFFFFFB940 BE110089 bne r1,r2,swtsk1 ; are we already running this TCB ?
FFFFFFFFFFFFB944 4600A0B0 lw r1,r1save
FFFFFFFFFFFFB948 460120B8 lw r2,r2save
FFFFFFFFFFFFB94C 37EF8000 ret
FFFFFFFFFFFFB950 swtsk1:
FFFFFFFFFFFFB950 142101FF andi r2,r2,#0x1ff ; max 512 TCB's
FFFFFFFFFFFFB954 1A210200 mului r2,r2,#TCBSize
FFFFFFFFFFFFB958 E6800000 ; SETLO
FFFFFFFFFFFFB95C EE800400 ; SETMID
FFFFFFFFFFFFB960 042D0803 addui r2,r2,#TCBBase
FFFFFFFFFFFFB964 4600A0B0 lw r1,r1save ; get back r1
FFFFFFFFFFFFB968 66208000 sw r1,TCBr1[r2]
FFFFFFFFFFFFB96C 4600A0B8 lw r1,r2save ; get back r2
FFFFFFFFFFFFB970 66208008 sw r1,TCBr2[r2]
FFFFFFFFFFFFB974 66218010 sw r3,TCBr3[r2]
FFFFFFFFFFFFB978 66220018 sw r4,TCBr4[r2]
FFFFFFFFFFFFB97C 66228020 sw r5,TCBr5[r2]
FFFFFFFFFFFFB980 66230028 sw r6,TCBr6[r2]
FFFFFFFFFFFFB984 66238030 sw r7,TCBr7[r2]
FFFFFFFFFFFFB988 66240038 sw r8,TCBr8[r2]
FFFFFFFFFFFFB98C 66248040 sw r9,TCBr9[r2]
FFFFFFFFFFFFB990 66250048 sw r10,TCBr10[r2]
FFFFFFFFFFFFB994 66258050 sw r11,TCBr11[r2]
FFFFFFFFFFFFB998 66260058 sw r12,TCBr12[r2]
FFFFFFFFFFFFB99C 66268060 sw r13,TCBr13[r2]
FFFFFFFFFFFFB9A0 66270068 sw r14,TCBr14[r2]
FFFFFFFFFFFFB9A4 66278070 sw r15,TCBr15[r2]
FFFFFFFFFFFFB9A8 66280078 sw r16,TCBr16[r2]
FFFFFFFFFFFFB9AC 66288080 sw r17,TCBr17[r2]
FFFFFFFFFFFFB9B0 66290088 sw r18,TCBr18[r2]
FFFFFFFFFFFFB9B4 66298090 sw r19,TCBr19[r2]
FFFFFFFFFFFFB9B8 662A0098 sw r20,TCBr20[r2]
FFFFFFFFFFFFB9BC 662A80A0 sw r21,TCBr21[r2]
FFFFFFFFFFFFB9C0 662B00A8 sw r22,TCBr22[r2]
FFFFFFFFFFFFB9C4 662B80B0 sw r23,TCBr23[r2]
FFFFFFFFFFFFB9C8 662C00B8 sw r24,TCBr24[r2]
FFFFFFFFFFFFB9CC 662C80C0 sw r25,TCBr25[r2]
FFFFFFFFFFFFB9D0 662D00C8 sw r26,TCBr26[r2]
FFFFFFFFFFFFB9D4 662D80D0 sw r27,TCBr27[r2]
FFFFFFFFFFFFB9D8 662E00D8 sw r28,TCBr28[r2]
FFFFFFFFFFFFB9DC 662E80E0 sw r29,TCBr29[r2]
FFFFFFFFFFFFB9E0 662F00E8 sw r30,TCBr30[r2]
FFFFFFFFFFFFB9E4 662F80F0 sw r31,TCBr31[r2]
FFFFFFFFFFFFBE10 SwitchTask:
FFFFFFFFFFFFBE10 6600A0B0 sw r1,r1save
FFFFFFFFFFFFBE14 660120B8 sw r2,r2save
FFFFFFFFFFFFBE18 4C00A0A8 lcu r1,NextToRunTCB
FFFFFFFFFFFFBE1C 4C0120A6 lcu r2,RunningTCB
FFFFFFFFFFFFBE20 BE110089 bne r1,r2,swtsk1 ; are we already running this TCB ?
FFFFFFFFFFFFBE24 4600A0B0 lw r1,r1save
FFFFFFFFFFFFBE28 460120B8 lw r2,r2save
FFFFFFFFFFFFBE2C 37EF8000 ret
FFFFFFFFFFFFBE30 swtsk1:
FFFFFFFFFFFFBE30 142101FF andi r2,r2,#0x1ff ; max 512 TCB's
FFFFFFFFFFFFBE34 1A210200 mului r2,r2,#TCBSize
FFFFFFFFFFFFBE38 E6800000 ; SETLO
FFFFFFFFFFFFBE3C EE800400 ; SETMID
FFFFFFFFFFFFBE40 042D0803 addui r2,r2,#TCBBase
FFFFFFFFFFFFBE44 4600A0B0 lw r1,r1save ; get back r1
FFFFFFFFFFFFBE48 66208000 sw r1,TCBr1[r2]
FFFFFFFFFFFFBE4C 4600A0B8 lw r1,r2save ; get back r2
FFFFFFFFFFFFBE50 66208008 sw r1,TCBr2[r2]
FFFFFFFFFFFFBE54 66218010 sw r3,TCBr3[r2]
FFFFFFFFFFFFBE58 66220018 sw r4,TCBr4[r2]
FFFFFFFFFFFFBE5C 66228020 sw r5,TCBr5[r2]
FFFFFFFFFFFFBE60 66230028 sw r6,TCBr6[r2]
FFFFFFFFFFFFBE64 66238030 sw r7,TCBr7[r2]
FFFFFFFFFFFFBE68 66240038 sw r8,TCBr8[r2]
FFFFFFFFFFFFBE6C 66248040 sw r9,TCBr9[r2]
FFFFFFFFFFFFBE70 66250048 sw r10,TCBr10[r2]
FFFFFFFFFFFFBE74 66258050 sw r11,TCBr11[r2]
FFFFFFFFFFFFBE78 66260058 sw r12,TCBr12[r2]
FFFFFFFFFFFFBE7C 66268060 sw r13,TCBr13[r2]
FFFFFFFFFFFFBE80 66270068 sw r14,TCBr14[r2]
FFFFFFFFFFFFBE84 66278070 sw r15,TCBr15[r2]
FFFFFFFFFFFFBE88 66280078 sw r16,TCBr16[r2]
FFFFFFFFFFFFBE8C 66288080 sw r17,TCBr17[r2]
FFFFFFFFFFFFBE90 66290088 sw r18,TCBr18[r2]
FFFFFFFFFFFFBE94 66298090 sw r19,TCBr19[r2]
FFFFFFFFFFFFBE98 662A0098 sw r20,TCBr20[r2]
FFFFFFFFFFFFBE9C 662A80A0 sw r21,TCBr21[r2]
FFFFFFFFFFFFBEA0 662B00A8 sw r22,TCBr22[r2]
FFFFFFFFFFFFBEA4 662B80B0 sw r23,TCBr23[r2]
FFFFFFFFFFFFBEA8 662C00B8 sw r24,TCBr24[r2]
FFFFFFFFFFFFBEAC 662C80C0 sw r25,TCBr25[r2]
FFFFFFFFFFFFBEB0 662D00C8 sw r26,TCBr26[r2]
FFFFFFFFFFFFBEB4 662D80D0 sw r27,TCBr27[r2]
FFFFFFFFFFFFBEB8 662E00D8 sw r28,TCBr28[r2]
FFFFFFFFFFFFBEBC 662E80E0 sw r29,TCBr29[r2]
FFFFFFFFFFFFBEC0 662F00E8 sw r30,TCBr30[r2]
FFFFFFFFFFFFBEC4 662F80F0 sw r31,TCBr31[r2]
FFFFFFFFFFFFB9E8 4C0120A8 lcu r2,NextToRunTCB
FFFFFFFFFFFFB9EC 620120A6 sc r2,RunningTCB
FFFFFFFFFFFFB9F0 1A210200 mului r2,r2,#TCBSize
FFFFFFFFFFFFB9F4 E6800000 ; SETLO
FFFFFFFFFFFFB9F8 EE800400 ; SETMID
FFFFFFFFFFFFB9FC 042D0803 addui r2,r2,#TCBBase
FFFFFFFFFFFFBEC8 4C0120A8 lcu r2,NextToRunTCB
FFFFFFFFFFFFBECC 620120A6 sc r2,RunningTCB
FFFFFFFFFFFFBED0 1A210200 mului r2,r2,#TCBSize
FFFFFFFFFFFFBED4 E6800000 ; SETLO
FFFFFFFFFFFFBED8 EE800400 ; SETMID
FFFFFFFFFFFFBEDC 042D0803 addui r2,r2,#TCBBase
FFFFFFFFFFFFBA00 46208000 lw r1,TCBr1[r2]
FFFFFFFFFFFFBA04 46218010 lw r3,TCBr3[r2]
FFFFFFFFFFFFBA08 46220018 lw r4,TCBr4[r2]
FFFFFFFFFFFFBA0C 46228020 lw r5,TCBr5[r2]
FFFFFFFFFFFFBA10 46230028 lw r6,TCBr6[r2]
FFFFFFFFFFFFBA14 46238030 lw r7,TCBr7[r2]
FFFFFFFFFFFFBA18 46240038 lw r8,TCBr8[r2]
FFFFFFFFFFFFBA1C 46248040 lw r9,TCBr9[r2]
FFFFFFFFFFFFBA20 46250048 lw r10,TCBr10[r2]
FFFFFFFFFFFFBA24 46258050 lw r11,TCBr11[r2]
FFFFFFFFFFFFBA28 46260058 lw r12,TCBr12[r2]
FFFFFFFFFFFFBA2C 46268060 lw r13,TCBr13[r2]
FFFFFFFFFFFFBA30 46270068 lw r14,TCBr14[r2]
FFFFFFFFFFFFBA34 46278070 lw r15,TCBr15[r2]
FFFFFFFFFFFFBA38 46280078 lw r16,TCBr16[r2]
FFFFFFFFFFFFBA3C 46288080 lw r17,TCBr17[r2]
FFFFFFFFFFFFBA40 46290088 lw r18,TCBr18[r2]
FFFFFFFFFFFFBA44 46298090 lw r19,TCBr19[r2]
FFFFFFFFFFFFBA48 462A0098 lw r20,TCBr20[r2]
FFFFFFFFFFFFBA4C 462A80A0 lw r21,TCBr21[r2]
FFFFFFFFFFFFBA50 462B00A8 lw r22,TCBr22[r2]
FFFFFFFFFFFFBA54 462B80B0 lw r23,TCBr23[r2]
FFFFFFFFFFFFBA58 462C00B8 lw r24,TCBr24[r2]
FFFFFFFFFFFFBA5C 462C80C0 lw r25,TCBr25[r2]
FFFFFFFFFFFFBA60 462D00C8 lw r26,TCBr26[r2]
FFFFFFFFFFFFBA64 462D80D0 lw r27,TCBr27[r2]
FFFFFFFFFFFFBA68 462E00D8 lw r28,TCBr28[r2]
FFFFFFFFFFFFBA6C 462E80E0 lw r29,TCBr29[r2]
FFFFFFFFFFFFBA70 462F00E8 lw r30,TCBr30[r2]
FFFFFFFFFFFFBA74 462F80F0 lw r31,TCBr31[r2]
FFFFFFFFFFFFBA78 46210008 lw r2,TCBr2[r2]
FFFFFFFFFFFFBA7C 37EF8000 ret
FFFFFFFFFFFFBEE0 46208000 lw r1,TCBr1[r2]
FFFFFFFFFFFFBEE4 46218010 lw r3,TCBr3[r2]
FFFFFFFFFFFFBEE8 46220018 lw r4,TCBr4[r2]
FFFFFFFFFFFFBEEC 46228020 lw r5,TCBr5[r2]
FFFFFFFFFFFFBEF0 46230028 lw r6,TCBr6[r2]
FFFFFFFFFFFFBEF4 46238030 lw r7,TCBr7[r2]
FFFFFFFFFFFFBEF8 46240038 lw r8,TCBr8[r2]
FFFFFFFFFFFFBEFC 46248040 lw r9,TCBr9[r2]
FFFFFFFFFFFFBF00 46250048 lw r10,TCBr10[r2]
FFFFFFFFFFFFBF04 46258050 lw r11,TCBr11[r2]
FFFFFFFFFFFFBF08 46260058 lw r12,TCBr12[r2]
FFFFFFFFFFFFBF0C 46268060 lw r13,TCBr13[r2]
FFFFFFFFFFFFBF10 46270068 lw r14,TCBr14[r2]
FFFFFFFFFFFFBF14 46278070 lw r15,TCBr15[r2]
FFFFFFFFFFFFBF18 46280078 lw r16,TCBr16[r2]
FFFFFFFFFFFFBF1C 46288080 lw r17,TCBr17[r2]
FFFFFFFFFFFFBF20 46290088 lw r18,TCBr18[r2]
FFFFFFFFFFFFBF24 46298090 lw r19,TCBr19[r2]
FFFFFFFFFFFFBF28 462A0098 lw r20,TCBr20[r2]
FFFFFFFFFFFFBF2C 462A80A0 lw r21,TCBr21[r2]
FFFFFFFFFFFFBF30 462B00A8 lw r22,TCBr22[r2]
FFFFFFFFFFFFBF34 462B80B0 lw r23,TCBr23[r2]
FFFFFFFFFFFFBF38 462C00B8 lw r24,TCBr24[r2]
FFFFFFFFFFFFBF3C 462C80C0 lw r25,TCBr25[r2]
FFFFFFFFFFFFBF40 462D00C8 lw r26,TCBr26[r2]
FFFFFFFFFFFFBF44 462D80D0 lw r27,TCBr27[r2]
FFFFFFFFFFFFBF48 462E00D8 lw r28,TCBr28[r2]
FFFFFFFFFFFFBF4C 462E80E0 lw r29,TCBr29[r2]
FFFFFFFFFFFFBF50 462F00E8 lw r30,TCBr30[r2]
FFFFFFFFFFFFBF54 462F80F0 lw r31,TCBr31[r2]
FFFFFFFFFFFFBF58 46210008 lw r2,TCBr2[r2]
FFFFFFFFFFFFBF5C 37EF8000 ret
;------------------------------------------------------------------------------
; Flash Cursor
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFBA80 FlashCursor:
FFFFFFFFFFFFBA80 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFBA84 67E08000 sw r1,[sp]
FFFFFFFFFFFFBA88 67E10008 sw r2,8[sp]
FFFFFFFFFFFFBA8C 67E18010 sw r3,16[sp]
FFFFFFFFFFFFBA90 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFBA94 31FFEF37 call CalcScreenLoc
FFFFFFFFFFFFBA98 E6810000 ; SETLO
FFFFFFFFFFFFBA9C 041D0403 addui r1,r1,#0x10000
FFFFFFFFFFFFBAA0 4001141A lb r2,CursorFlash
FFFFFFFFFFFFBAA4 BE2001C8 beq r2,r0,flshcrsr2
FFFFFFFFFFFFBF60 FlashCursor:
FFFFFFFFFFFFBF60 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFBF64 67E08000 sw r1,[sp]
FFFFFFFFFFFFBF68 67E10008 sw r2,8[sp]
FFFFFFFFFFFFBF6C 67E18010 sw r3,16[sp]
FFFFFFFFFFFFBF70 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFBF74 31FFF06F call CalcScreenLoc
FFFFFFFFFFFFBF78 E6810000 ; SETLO
FFFFFFFFFFFFBF7C 041D0403 addui r1,r1,#0x10000
FFFFFFFFFFFFBF80 4001141A lb r2,CursorFlash
FFFFFFFFFFFFBF84 BE2001C8 beq r2,r0,flshcrsr2
; causes screen colors to flip around
FFFFFFFFFFFFBAA8 82110000 inch r2,[r1]
FFFFFFFFFFFFBAAC 0A210001 addui r2,r2,#1
FFFFFFFFFFFFBAB0 92110000 outc r2,[r1]
FFFFFFFFFFFFBAB4 flshcrsr3:
FFFFFFFFFFFFBAB4 46011408 lw r2,Lastloc
FFFFFFFFFFFFBAB8 BE110088 beq r1,r2,flshcrsr1
FFFFFFFFFFFFBF88 82110000 inch r2,[r1]
FFFFFFFFFFFFBF8C 0A210001 addui r2,r2,#1
FFFFFFFFFFFFBF90 92110000 outc r2,[r1]
FFFFFFFFFFFFBF94 flshcrsr3:
FFFFFFFFFFFFBF94 46011408 lw r2,Lastloc
FFFFFFFFFFFFBF98 BE110088 beq r1,r2,flshcrsr1
; restore the screen colors of the previous cursor location
FFFFFFFFFFFFBABC 42019414 lc r3,ScreenColor
FFFFFFFFFFFFBAC0 92218000 outc r3,[r2]
FFFFFFFFFFFFBAC4 66009408 sw r1,Lastloc
FFFFFFFFFFFFBAC8 flshcrsr1:
FFFFFFFFFFFFBAC8 47E08000 lw r1,[sp]
FFFFFFFFFFFFBACC 47E10008 lw r2,8[sp]
FFFFFFFFFFFFBAD0 47E18010 lw r3,16[sp]
FFFFFFFFFFFFBAD4 47EF8018 lw lr,24[sp]
FFFFFFFFFFFFBAD8 37EF8020 ret #32
FFFFFFFFFFFFBADC flshcrsr2:
FFFFFFFFFFFFBADC 42019414 lc r3,ScreenColor
FFFFFFFFFFFFBAE0 92118000 outc r3,[r1]
FFFFFFFFFFFFBAE4 BE007E8A bra flshcrsr3
FFFFFFFFFFFFBF9C 42019414 lc r3,ScreenColor
FFFFFFFFFFFFBFA0 92218000 outc r3,[r2]
FFFFFFFFFFFFBFA4 66009408 sw r1,Lastloc
FFFFFFFFFFFFBFA8 flshcrsr1:
FFFFFFFFFFFFBFA8 47E08000 lw r1,[sp]
FFFFFFFFFFFFBFAC 47E10008 lw r2,8[sp]
FFFFFFFFFFFFBFB0 47E18010 lw r3,16[sp]
FFFFFFFFFFFFBFB4 47EF8018 lw lr,24[sp]
FFFFFFFFFFFFBFB8 37EF8020 ret #32
FFFFFFFFFFFFBFBC flshcrsr2:
FFFFFFFFFFFFBFBC 42019414 lc r3,ScreenColor
FFFFFFFFFFFFBFC0 92118000 outc r3,[r1]
FFFFFFFFFFFFBFC4 BE007E8A bra flshcrsr3
FFFFFFFFFFFFBAE8 CursorOff:
FFFFFFFFFFFFBAE8 160080A0 lw r1,#0xA0
FFFFFFFFFFFFBAEC E69A0010 ; SETLO
FFFFFFFFFFFFBAF0 EE800003 ; SETMID
FFFFFFFFFFFFBAF4 6A0D0429 outc r1,TEXTREG+16 ; turn off cursor
FFFFFFFFFFFFBAF8 37EF8000 ret
FFFFFFFFFFFFBAFC CursorOn:
FFFFFFFFFFFFBAFC 160080E0 lw r1,#0xE0
FFFFFFFFFFFFBB00 E69A0010 ; SETLO
FFFFFFFFFFFFBB04 EE800003 ; SETMID
FFFFFFFFFFFFBB08 6A0D0429 outc r1,TEXTREG+16 ; turn on cursor
FFFFFFFFFFFFBB0C 37EF8000 ret
FFFFFFFFFFFFBFC8 CursorOff:
FFFFFFFFFFFFBFC8 160080A0 lw r1,#0xA0
FFFFFFFFFFFFBFCC E69A0010 ; SETLO
FFFFFFFFFFFFBFD0 EE800003 ; SETMID
FFFFFFFFFFFFBFD4 6A0D0429 outc r1,TEXTREG+16 ; turn off cursor
FFFFFFFFFFFFBFD8 37EF8000 ret
FFFFFFFFFFFFBFDC CursorOn:
FFFFFFFFFFFFBFDC 160080E0 lw r1,#0xE0
FFFFFFFFFFFFBFE0 E69A0010 ; SETLO
FFFFFFFFFFFFBFE4 EE800003 ; SETMID
FFFFFFFFFFFFBFE8 6A0D0429 outc r1,TEXTREG+16 ; turn on cursor
FFFFFFFFFFFFBFEC 37EF8000 ret
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
FFFFFFFFFFFFBB10 ClearBmpScreen:
FFFFFFFFFFFFBB10 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFBB14 67E08000 sw r1,[sp]
FFFFFFFFFFFFBB18 67E10008 sw r2,8[sp]
FFFFFFFFFFFFBB1C 67E18010 sw r3,16[sp]
FFFFFFFFFFFFBB20 E68FFC00 ; SETLO
FFFFFFFFFFFFBB24 040D0809 lw r2,#1364*768
FFFFFFFFFFFFBB28 06210601 shrui r2,r2,#3 ; r2 = # words to clear
FFFFFFFFFFFFBB2C E6A92929 ; SETLO
FFFFFFFFFFFFBB30 EEA4A4A4 ; SETMID
FFFFFFFFFFFFBB34 F6829292 ; SETHI
FFFFFFFFFFFFBB38 6A0D042D lea r1,0x2929292929292929 ; r1 = color for eight pixels
FFFFFFFFFFFFBB3C E6A00000 ; SETLO
FFFFFFFFFFFFBB40 EE800400 ; SETMID
FFFFFFFFFFFFBB44 6A0D0C2D lea r3,BITMAPSCR ; r3 = screen address
FFFFFFFFFFFFBB48 csj4:
FFFFFFFFFFFFBB48 66308000 sw r1,[r3] ; store pixel data
FFFFFFFFFFFFBB4C 0A318008 addui r3,r3,#8 ; advance screen address by eight
FFFFFFFFFFFFBB50 BE017FCF loop r2,csj4 ; decrement pixel count and loop back
FFFFFFFFFFFFBB54 47E08000 lw r1,[sp]
FFFFFFFFFFFFBB58 47E10008 lw r2,8[sp]
FFFFFFFFFFFFBB5C 47E18010 lw r3,16[sp]
FFFFFFFFFFFFBB60 37EF8018 ret #24
FFFFFFFFFFFFBFF0 ClearBmpScreen:
FFFFFFFFFFFFBFF0 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFBFF4 67E08000 sw r1,[sp]
FFFFFFFFFFFFBFF8 67E10008 sw r2,8[sp]
FFFFFFFFFFFFBFFC 67E18010 sw r3,16[sp]
FFFFFFFFFFFFC000 E68FFC00 ; SETLO
FFFFFFFFFFFFC004 040D0809 lw r2,#1364*768
FFFFFFFFFFFFC008 06210601 shrui r2,r2,#3 ; r2 = # words to clear
FFFFFFFFFFFFC00C E6A92929 ; SETLO
FFFFFFFFFFFFC010 EEA4A4A4 ; SETMID
FFFFFFFFFFFFC014 F6829292 ; SETHI
FFFFFFFFFFFFC018 6A0D042D lea r1,0x2929292929292929 ; r1 = color for eight pixels
FFFFFFFFFFFFC01C E6A00000 ; SETLO
FFFFFFFFFFFFC020 EE800400 ; SETMID
FFFFFFFFFFFFC024 6A0D0C2D lea r3,BITMAPSCR ; r3 = screen address
FFFFFFFFFFFFC028 csj4:
FFFFFFFFFFFFC028 66308000 sw r1,[r3] ; store pixel data
FFFFFFFFFFFFC02C 0A318008 addui r3,r3,#8 ; advance screen address by eight
FFFFFFFFFFFFC030 BE017FCF loop r2,csj4 ; decrement pixel count and loop back
FFFFFFFFFFFFC034 47E08000 lw r1,[sp]
FFFFFFFFFFFFC038 47E10008 lw r2,8[sp]
FFFFFFFFFFFFC03C 47E18010 lw r3,16[sp]
FFFFFFFFFFFFC040 37EF8018 ret #24
;------------------------------------------------------------------------------
; Clear the screen and the screen color memory
1264,77 → 1818,77
; is working at all.
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFBB64 ClearScreen:
FFFFFFFFFFFFBB64 0FEF0028 subui sp,sp,#40
FFFFFFFFFFFFBB68 67E08000 sw r1,[sp]
FFFFFFFFFFFFBB6C 67E10008 sw r2,8[sp]
FFFFFFFFFFFFBB70 67E18010 sw r3,16[sp]
FFFFFFFFFFFFBB74 67E20018 sw r4,24[sp]
FFFFFFFFFFFFBB78 67EF8020 sw lr,32[sp]
FFFFFFFFFFFFBB7C E69A0000 ; SETLO
FFFFFFFFFFFFBB80 EE800003 ; SETMID
FFFFFFFFFFFFBB84 6A0D0C2D lea r3,TEXTREG
FFFFFFFFFFFFBB88 82308000 inch r1,TEXT_COLS[r3] ; calc number to clear
FFFFFFFFFFFFBB8C 82310002 inch r2,TEXT_ROWS[r3]
FFFFFFFFFFFFBB90 04110818 mulu r2,r1,r2 ; r2 = # chars to clear
FFFFFFFFFFFFBB94 E0400020 setlo r1,#32 ; space char
FFFFFFFFFFFFBB98 42021414 lc r4,ScreenColor
FFFFFFFFFFFFBB9C 31FFEF2B call AsciiToScreen
FFFFFFFFFFFFBBA0 E6900000 ; SETLO
FFFFFFFFFFFFBBA4 EE800003 ; SETMID
FFFFFFFFFFFFBBA8 6A0D0C2D lea r3,TEXTSCR ; text screen address
FFFFFFFFFFFFBBAC csj4:
FFFFFFFFFFFFBBAC 92308000 outc r1,[r3]
FFFFFFFFFFFFBBB0 E6810000 ; SETLO
FFFFFFFFFFFFBBB4 6A3D1029 outc r4,0x10000[r3] ; color screen is 0x10000 higher
FFFFFFFFFFFFBBB8 0A318002 addui r3,r3,#2
FFFFFFFFFFFFBBBC BE017F8F loop r2,csj4
FFFFFFFFFFFFBBC0 47EF8020 lw lr,32[sp]
FFFFFFFFFFFFBBC4 47E20018 lw r4,24[sp]
FFFFFFFFFFFFBBC8 47E18010 lw r3,16[sp]
FFFFFFFFFFFFBBCC 47E10008 lw r2,8[sp]
FFFFFFFFFFFFBBD0 47E08000 lw r1,[sp]
FFFFFFFFFFFFBBD4 37EF8028 ret #40
FFFFFFFFFFFFC044 ClearScreen:
FFFFFFFFFFFFC044 0FEF0028 subui sp,sp,#40
FFFFFFFFFFFFC048 67E08000 sw r1,[sp]
FFFFFFFFFFFFC04C 67E10008 sw r2,8[sp]
FFFFFFFFFFFFC050 67E18010 sw r3,16[sp]
FFFFFFFFFFFFC054 67E20018 sw r4,24[sp]
FFFFFFFFFFFFC058 67EF8020 sw lr,32[sp]
FFFFFFFFFFFFC05C E69A0000 ; SETLO
FFFFFFFFFFFFC060 EE800003 ; SETMID
FFFFFFFFFFFFC064 6A0D0C2D lea r3,TEXTREG
FFFFFFFFFFFFC068 82308000 inch r1,TEXT_COLS[r3] ; calc number to clear
FFFFFFFFFFFFC06C 82310002 inch r2,TEXT_ROWS[r3]
FFFFFFFFFFFFC070 04110818 mulu r2,r1,r2 ; r2 = # chars to clear
FFFFFFFFFFFFC074 E0400020 setlo r1,#32 ; space char
FFFFFFFFFFFFC078 42021414 lc r4,ScreenColor
FFFFFFFFFFFFC07C 31FFF063 call AsciiToScreen
FFFFFFFFFFFFC080 E6900000 ; SETLO
FFFFFFFFFFFFC084 EE800003 ; SETMID
FFFFFFFFFFFFC088 6A0D0C2D lea r3,TEXTSCR ; text screen address
FFFFFFFFFFFFC08C csj4:
FFFFFFFFFFFFC08C 92308000 outc r1,[r3]
FFFFFFFFFFFFC090 E6810000 ; SETLO
FFFFFFFFFFFFC094 6A3D1029 outc r4,0x10000[r3] ; color screen is 0x10000 higher
FFFFFFFFFFFFC098 0A318002 addui r3,r3,#2
FFFFFFFFFFFFC09C BE017F8F loop r2,csj4
FFFFFFFFFFFFC0A0 47EF8020 lw lr,32[sp]
FFFFFFFFFFFFC0A4 47E20018 lw r4,24[sp]
FFFFFFFFFFFFC0A8 47E18010 lw r3,16[sp]
FFFFFFFFFFFFC0AC 47E10008 lw r2,8[sp]
FFFFFFFFFFFFC0B0 47E08000 lw r1,[sp]
FFFFFFFFFFFFC0B4 37EF8028 ret #40
;------------------------------------------------------------------------------
; Scroll text on the screen upwards
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFBBD8 ScrollUp:
FFFFFFFFFFFFBBD8 0FEF0028 subui sp,sp,#40
FFFFFFFFFFFFBBDC 67E08000 sw r1,[sp]
FFFFFFFFFFFFBBE0 67E10008 sw r2,8[sp]
FFFFFFFFFFFFBBE4 67E18010 sw r3,16[sp]
FFFFFFFFFFFFBBE8 67E20018 sw r4,24[sp]
FFFFFFFFFFFFBBEC 67EF8020 sw lr,32[sp]
FFFFFFFFFFFFBBF0 E69A0000 ; SETLO
FFFFFFFFFFFFBBF4 EE800003 ; SETMID
FFFFFFFFFFFFBBF8 6A0D0C2D lea r3,TEXTREG
FFFFFFFFFFFFBBFC 82308000 inch r1,TEXT_COLS[r3] ; r1 = # text columns
FFFFFFFFFFFFBC00 82310002 inch r2,TEXT_ROWS[r3]
FFFFFFFFFFFFBC04 04110818 mulu r2,r1,r2 ; calc number of chars to scroll
FFFFFFFFFFFFBC08 04208805 subu r2,r2,r1 ; one less row
FFFFFFFFFFFFBC0C E6900000 ; SETLO
FFFFFFFFFFFFBC10 EE800003 ; SETMID
FFFFFFFFFFFFBC14 6A0D0C2D lea r3,TEXTSCR
FFFFFFFFFFFFBC18 scrup1:
FFFFFFFFFFFFBC18 6A309021 inch r4,[r3+r1] ; indexed addressing example
FFFFFFFFFFFFBC1C 92320000 outc r4,[r3]
FFFFFFFFFFFFBC20 0A318002 addui r3,r3,#2
FFFFFFFFFFFFBC24 BE017FAF loop r2,scrup1
FFFFFFFFFFFFC0B8 ScrollUp:
FFFFFFFFFFFFC0B8 0FEF0028 subui sp,sp,#40
FFFFFFFFFFFFC0BC 67E08000 sw r1,[sp]
FFFFFFFFFFFFC0C0 67E10008 sw r2,8[sp]
FFFFFFFFFFFFC0C4 67E18010 sw r3,16[sp]
FFFFFFFFFFFFC0C8 67E20018 sw r4,24[sp]
FFFFFFFFFFFFC0CC 67EF8020 sw lr,32[sp]
FFFFFFFFFFFFC0D0 E69A0000 ; SETLO
FFFFFFFFFFFFC0D4 EE800003 ; SETMID
FFFFFFFFFFFFC0D8 6A0D0C2D lea r3,TEXTREG
FFFFFFFFFFFFC0DC 82308000 inch r1,TEXT_COLS[r3] ; r1 = # text columns
FFFFFFFFFFFFC0E0 82310002 inch r2,TEXT_ROWS[r3]
FFFFFFFFFFFFC0E4 04110818 mulu r2,r1,r2 ; calc number of chars to scroll
FFFFFFFFFFFFC0E8 04208805 subu r2,r2,r1 ; one less row
FFFFFFFFFFFFC0EC E6900000 ; SETLO
FFFFFFFFFFFFC0F0 EE800003 ; SETMID
FFFFFFFFFFFFC0F4 6A0D0C2D lea r3,TEXTSCR
FFFFFFFFFFFFC0F8 scrup1:
FFFFFFFFFFFFC0F8 6A309121 inch r4,[r3+r1*2] ; indexed addressing example
FFFFFFFFFFFFC0FC 92320000 outc r4,[r3]
FFFFFFFFFFFFC100 0A318002 addui r3,r3,#2
FFFFFFFFFFFFC104 BE017FAF loop r2,scrup1
FFFFFFFFFFFFBC28 E69A0000 ; SETLO
FFFFFFFFFFFFBC2C EE800003 ; SETMID
FFFFFFFFFFFFBC30 6A0D0C2D lea r3,TEXTREG
FFFFFFFFFFFFBC34 82308002 inch r1,TEXT_ROWS[r3]
FFFFFFFFFFFFBC38 0E108001 subui r1,r1,#1
FFFFFFFFFFFFBC3C 31FFEF16 call BlankLine
FFFFFFFFFFFFBC40 47E08000 lw r1,[sp]
FFFFFFFFFFFFBC44 47E10008 lw r2,8[sp]
FFFFFFFFFFFFBC48 47E18010 lw r3,16[sp]
FFFFFFFFFFFFBC4C 47E20018 lw r4,24[sp]
FFFFFFFFFFFFBC50 47EF8020 lw lr,32[sp]
FFFFFFFFFFFFBC54 37EF8028 ret #40
FFFFFFFFFFFFC108 E69A0000 ; SETLO
FFFFFFFFFFFFC10C EE800003 ; SETMID
FFFFFFFFFFFFC110 6A0D0C2D lea r3,TEXTREG
FFFFFFFFFFFFC114 82308002 inch r1,TEXT_ROWS[r3]
FFFFFFFFFFFFC118 0E108001 subui r1,r1,#1
FFFFFFFFFFFFC11C 31FFF04E call BlankLine
FFFFFFFFFFFFC120 47E08000 lw r1,[sp]
FFFFFFFFFFFFC124 47E10008 lw r2,8[sp]
FFFFFFFFFFFFC128 47E18010 lw r3,16[sp]
FFFFFFFFFFFFC12C 47E20018 lw r4,24[sp]
FFFFFFFFFFFFC130 47EF8020 lw lr,32[sp]
FFFFFFFFFFFFC134 37EF8028 ret #40
;------------------------------------------------------------------------------
; Blank out a line on the display
1341,55 → 1895,55
; line number to blank is in r1
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFBC58 BlankLine:
FFFFFFFFFFFFBC58 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFBC5C 67E08000 sw r1,[sp]
FFFFFFFFFFFFBC60 67E10008 sw r2,8[sp]
FFFFFFFFFFFFBC64 67E18010 sw r3,16[sp]
FFFFFFFFFFFFBC68 E69A0000 ; SETLO
FFFFFFFFFFFFBC6C EE800003 ; SETMID
FFFFFFFFFFFFBC70 6A0D0C2D lea r3,TEXTREG ; r3 = text register address
FFFFFFFFFFFFBC74 82310000 inch r2,TEXT_COLS[r3] ; r2 = # chars to blank out
FFFFFFFFFFFFBC78 04208C18 mulu r3,r2,r1
FFFFFFFFFFFFBC7C 06318200 shli r3,r3,#1
FFFFFFFFFFFFBC80 E6900000 ; SETLO
FFFFFFFFFFFFBC84 EE800003 ; SETMID
FFFFFFFFFFFFBC88 043D0C03 addui r3,r3,#TEXTSCR ; r3 = screen address
FFFFFFFFFFFFBC8C E0400020 setlo r1,#' '
FFFFFFFFFFFFBC90 blnkln1:
FFFFFFFFFFFFBC90 92308000 outc r1,[r3]
FFFFFFFFFFFFBC94 0A318002 addui r3,r3,#2
FFFFFFFFFFFFBC98 BE017FCF loop r2,blnkln1
FFFFFFFFFFFFBC9C 47E08000 lw r1,[sp]
FFFFFFFFFFFFBCA0 47E10008 lw r2,8[sp]
FFFFFFFFFFFFBCA4 47E18010 lw r3,16[sp]
FFFFFFFFFFFFBCA8 37EF8018 ret #24
FFFFFFFFFFFFC138 BlankLine:
FFFFFFFFFFFFC138 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFC13C 67E08000 sw r1,[sp]
FFFFFFFFFFFFC140 67E10008 sw r2,8[sp]
FFFFFFFFFFFFC144 67E18010 sw r3,16[sp]
FFFFFFFFFFFFC148 E69A0000 ; SETLO
FFFFFFFFFFFFC14C EE800003 ; SETMID
FFFFFFFFFFFFC150 6A0D0C2D lea r3,TEXTREG ; r3 = text register address
FFFFFFFFFFFFC154 82310000 inch r2,TEXT_COLS[r3] ; r2 = # chars to blank out
FFFFFFFFFFFFC158 04208C18 mulu r3,r2,r1
FFFFFFFFFFFFC15C 06318200 shli r3,r3,#1
FFFFFFFFFFFFC160 E6900000 ; SETLO
FFFFFFFFFFFFC164 EE800003 ; SETMID
FFFFFFFFFFFFC168 043D0C03 addui r3,r3,#TEXTSCR ; r3 = screen address
FFFFFFFFFFFFC16C E0400020 setlo r1,#' '
FFFFFFFFFFFFC170 blnkln1:
FFFFFFFFFFFFC170 92308000 outc r1,[r3]
FFFFFFFFFFFFC174 0A318002 addui r3,r3,#2
FFFFFFFFFFFFC178 BE017FCF loop r2,blnkln1
FFFFFFFFFFFFC17C 47E08000 lw r1,[sp]
FFFFFFFFFFFFC180 47E10008 lw r2,8[sp]
FFFFFFFFFFFFC184 47E18010 lw r3,16[sp]
FFFFFFFFFFFFC188 37EF8018 ret #24
;------------------------------------------------------------------------------
; Convert ASCII character to screen display character.
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFBCAC AsciiToScreen:
FFFFFFFFFFFFBCAC 141080FF andi r1,r1,#0x00ff
FFFFFFFFFFFFBCB0 A8100541 bltui r1,#'A',atoscr1
FFFFFFFFFFFFBCB4 AC10045A bleui r1,#'Z',atoscr1
FFFFFFFFFFFFBCB8 AE10037A bgtui r1,#'z',atoscr1
FFFFFFFFFFFFBCBC A8100261 bltui r1,#'a',atoscr1
FFFFFFFFFFFFBCC0 0C108060 subi r1,r1,#0x60
FFFFFFFFFFFFBCC4 atoscr1:
FFFFFFFFFFFFBCC4 16108100 ori r1,r1,#0x100
FFFFFFFFFFFFBCC8 37EF8000 ret
FFFFFFFFFFFFC18C AsciiToScreen:
FFFFFFFFFFFFC18C 141080FF andi r1,r1,#0x00ff
FFFFFFFFFFFFC190 A8100541 bltui r1,#'A',atoscr1
FFFFFFFFFFFFC194 AC10045A bleui r1,#'Z',atoscr1
FFFFFFFFFFFFC198 AE10037A bgtui r1,#'z',atoscr1
FFFFFFFFFFFFC19C A8100261 bltui r1,#'a',atoscr1
FFFFFFFFFFFFC1A0 0E108060 subui r1,r1,#0x60
FFFFFFFFFFFFC1A4 atoscr1:
FFFFFFFFFFFFC1A4 16108100 ori r1,r1,#0x100
FFFFFFFFFFFFC1A8 37EF8000 ret
;------------------------------------------------------------------------------
; Convert screen character to ascii character
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFBCCC ScreenToAscii:
FFFFFFFFFFFFBCCC 141080FF andi r1,r1,#0xff
FFFFFFFFFFFFBCD0 AE10021A bgtui r1,#26,stasc1
FFFFFFFFFFFFBCD4 0A10803C addui r1,r1,#60
FFFFFFFFFFFFBCD8 stasc1:
FFFFFFFFFFFFBCD8 37EF8000 ret
FFFFFFFFFFFFC1AC ScreenToAscii:
FFFFFFFFFFFFC1AC 141080FF andi r1,r1,#0xff
FFFFFFFFFFFFC1B0 AE10021A bgtui r1,#26,stasc1
FFFFFFFFFFFFC1B4 0A10803C addui r1,r1,#60
FFFFFFFFFFFFC1B8 stasc1:
FFFFFFFFFFFFC1B8 37EF8000 ret
;------------------------------------------------------------------------------
; Calculate screen memory location from CursorRow,CursorCol.
1398,23 → 1952,23
; r1 = screen location
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFBCDC CalcScreenLoc:
FFFFFFFFFFFFBCDC 42009416 lc r1,CursorRow
FFFFFFFFFFFFBCE0 1410807F andi r1,r1,#0x7f
FFFFFFFFFFFFBCE4 E69A0000 ; SETLO
FFFFFFFFFFFFBCE8 EE800003 ; SETMID
FFFFFFFFFFFFBCEC 6A0D0C2D lea r3,TEXTREG
FFFFFFFFFFFFBCF0 82310000 inch r2,TEXT_COLS[r3]
FFFFFFFFFFFFBCF4 04208818 mulu r2,r2,r1
FFFFFFFFFFFFBCF8 42009418 lc r1,CursorCol
FFFFFFFFFFFFBCFC 1410807F andi r1,r1,#0x7f
FFFFFFFFFFFFBD00 04208803 addu r2,r2,r1
FFFFFFFFFFFFBD04 92310016 outc r2,TEXT_CURPOS[r3]
FFFFFFFFFFFFBD08 06210200 shli r2,r2,#1
FFFFFFFFFFFFBD0C E6900000 ; SETLO
FFFFFFFFFFFFBD10 EE800003 ; SETMID
FFFFFFFFFFFFBD14 042D0403 addui r1,r2,#TEXTSCR ; r1 = screen location
FFFFFFFFFFFFBD18 37EF8000 ret
FFFFFFFFFFFFC1BC CalcScreenLoc:
FFFFFFFFFFFFC1BC 4A009417 lbu r1,CursorRow
FFFFFFFFFFFFC1C0 1410807F andi r1,r1,#0x7f
FFFFFFFFFFFFC1C4 E69A0000 ; SETLO
FFFFFFFFFFFFC1C8 EE800003 ; SETMID
FFFFFFFFFFFFC1CC 6A0D0C2D lea r3,TEXTREG
FFFFFFFFFFFFC1D0 82310000 inch r2,TEXT_COLS[r3]
FFFFFFFFFFFFC1D4 04208818 mulu r2,r2,r1
FFFFFFFFFFFFC1D8 4A009418 lbu r1,CursorCol
FFFFFFFFFFFFC1DC 1410807F andi r1,r1,#0x7f
FFFFFFFFFFFFC1E0 04208803 addu r2,r2,r1
FFFFFFFFFFFFC1E4 92310016 outc r2,TEXT_CURPOS[r3]
FFFFFFFFFFFFC1E8 06210206 shlui r2,r2,#1
FFFFFFFFFFFFC1EC E6900000 ; SETLO
FFFFFFFFFFFFC1F0 EE800003 ; SETMID
FFFFFFFFFFFFC1F4 042D0403 addui r1,r2,#TEXTSCR ; r1 = screen location
FFFFFFFFFFFFC1F8 37EF8000 ret
;------------------------------------------------------------------------------
; Display a character on the screen
1421,145 → 1975,156
; d1.b = char to display
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFBD1C DisplayChar:
FFFFFFFFFFFFBD1C B210080D bnei r1,#'\r',dccr ; carriage return ?
FFFFFFFFFFFFBD20 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFBD24 67E08000 sw r1,[sp]
FFFFFFFFFFFFBD28 67E10008 sw r2,8[sp]
FFFFFFFFFFFFBD2C 67E18010 sw r3,16[sp]
FFFFFFFFFFFFBD30 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFBD34 62001418 sc r0,CursorCol ; just set cursor column to zero on a CR
FFFFFFFFFFFFBD38 BE00018A bra dcx7
FFFFFFFFFFFFBD3C dccr:
FFFFFFFFFFFFBD3C E6800091 ; SETLO
FFFFFFFFFFFFBD40 BE1D0209 bnei r1,#0x91,dcx6 ; cursor right ?
FFFFFFFFFFFFBD44 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFBD48 67E08000 sw r1,[sp]
FFFFFFFFFFFFBD4C 67E10008 sw r2,8[sp]
FFFFFFFFFFFFBD50 67E18010 sw r3,16[sp]
FFFFFFFFFFFFBD54 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFBD58 42011418 lc r2,CursorCol
FFFFFFFFFFFFBD5C B0200338 beqi r2,#56,dcx7
FFFFFFFFFFFFBD60 0A210001 addui r2,r2,#1
FFFFFFFFFFFFBD64 62011418 sc r2,CursorCol
FFFFFFFFFFFFBD68 dcx7:
FFFFFFFFFFFFBD68 31FFEF37 call CalcScreenLoc
FFFFFFFFFFFFBD6C 47EF8018 lw lr,24[sp]
FFFFFFFFFFFFBD70 47E18010 lw r3,16[sp]
FFFFFFFFFFFFBD74 47E10008 lw r2,8[sp]
FFFFFFFFFFFFBD78 47E08000 lw r1,[sp]
FFFFFFFFFFFFBD7C 37EF8020 ret #32
FFFFFFFFFFFFBD80 dcx6:
FFFFFFFFFFFFBD80 E6800090 ; SETLO
FFFFFFFFFFFFBD84 BE1D0169 bnei r1,#0x90,dcx8 ; cursor up ?
FFFFFFFFFFFFBD88 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFBD8C 67E08000 sw r1,[sp]
FFFFFFFFFFFFBD90 67E10008 sw r2,8[sp]
FFFFFFFFFFFFBD94 67E18010 sw r3,16[sp]
FFFFFFFFFFFFBD98 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFBD9C 42011416 lc r2,CursorRow
FFFFFFFFFFFFBDA0 B02FF200 beqi r2,#0,dcx7
FFFFFFFFFFFFBDA4 0E210001 subui r2,r2,#1
FFFFFFFFFFFFBDA8 62011416 sc r2,CursorRow
FFFFFFFFFFFFBDAC BE007DEA bra dcx7
FFFFFFFFFFFFBDB0 dcx8:
FFFFFFFFFFFFBDB0 E6800093 ; SETLO
FFFFFFFFFFFFBDB4 BE1D0169 bnei r1,#0x93,dcx9 ; cursor left ?
FFFFFFFFFFFFBDB8 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFBDBC 67E08000 sw r1,[sp]
FFFFFFFFFFFFBDC0 67E10008 sw r2,8[sp]
FFFFFFFFFFFFBDC4 67E18010 sw r3,16[sp]
FFFFFFFFFFFFBDC8 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFBDCC 42011418 lc r2,CursorCol
FFFFFFFFFFFFBDD0 B02FE600 beqi r2,#0,dcx7
FFFFFFFFFFFFBDD4 0E210001 subui r2,r2,#1
FFFFFFFFFFFFBDD8 62011418 sc r2,CursorCol
FFFFFFFFFFFFBDDC BE007C6A bra dcx7
FFFFFFFFFFFFBDE0 dcx9:
FFFFFFFFFFFFBDE0 E6800092 ; SETLO
FFFFFFFFFFFFBDE4 BE1D0169 bnei r1,#0x92,dcx10 ; cursor down ?
FFFFFFFFFFFFBDE8 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFBDEC 67E08000 sw r1,[sp]
FFFFFFFFFFFFBDF0 67E10008 sw r2,8[sp]
FFFFFFFFFFFFBDF4 67E18010 sw r3,16[sp]
FFFFFFFFFFFFBDF8 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFBDFC 42011416 lc r2,CursorRow
FFFFFFFFFFFFBE00 B02FDA1E beqi r2,#30,dcx7
FFFFFFFFFFFFBE04 0A210001 addui r2,r2,#1
FFFFFFFFFFFFBE08 62011416 sc r2,CursorRow
FFFFFFFFFFFFBE0C BE007AEA bra dcx7
FFFFFFFFFFFFBE10 dcx10:
FFFFFFFFFFFFBE10 E6800094 ; SETLO
FFFFFFFFFFFFBE14 BE1D0189 bnei r1,#0x94,dcx11 ; cursor home ?
FFFFFFFFFFFFBE18 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFBE1C 67E08000 sw r1,[sp]
FFFFFFFFFFFFBE20 67E10008 sw r2,8[sp]
FFFFFFFFFFFFBE24 67E18010 sw r3,16[sp]
FFFFFFFFFFFFBE28 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFBE2C 42011418 lc r2,CursorCol
FFFFFFFFFFFFBE30 BE200068 beq r2,r0,dcx12
FFFFFFFFFFFFBE34 62001418 sc r0,CursorCol
FFFFFFFFFFFFBE38 BE00798A bra dcx7
FFFFFFFFFFFFBE3C dcx12:
FFFFFFFFFFFFBE3C 62001416 sc r0,CursorRow
FFFFFFFFFFFFBE40 BE00794A bra dcx7
FFFFFFFFFFFFBE44 dcx11:
FFFFFFFFFFFFBE44 0FEF0030 subui sp,sp,#48
FFFFFFFFFFFFBE48 67E08000 sw r1,[sp]
FFFFFFFFFFFFBE4C 67E10008 sw r2,8[sp]
FFFFFFFFFFFFBE50 67E18010 sw r3,16[sp]
FFFFFFFFFFFFBE54 67E20018 sw r4,24[sp]
FFFFFFFFFFFFBE58 67E28020 sw r5,32[sp]
FFFFFFFFFFFFBE5C 67EF8028 sw lr,40[sp]
FFFFFFFFFFFFBE60 E6800099 ; SETLO
FFFFFFFFFFFFBE64 BE1D00A9 bnei r1,#0x99,dcx13 ; delete ?
FFFFFFFFFFFFBE68 31FFEF37 call CalcScreenLoc
FFFFFFFFFFFFBE6C 04008C09 or r3,r0,r1 ; r3 = screen location
FFFFFFFFFFFFBE70 42009418 lc r1,CursorCol ; r1 = cursor column
FFFFFFFFFFFFBE74 BE00012A bra dcx5
FFFFFFFFFFFFBE78 dcx13:
FFFFFFFFFFFFBE78 B2101508 bnei r1,#CTRLH,dcx3 ; backspace ?
FFFFFFFFFFFFBE7C 42011418 lc r2,CursorCol
FFFFFFFFFFFFBE80 BE2003A8 beq r2,r0,dcx4
FFFFFFFFFFFFBE84 0E210001 subui r2,r2,#1
FFFFFFFFFFFFBE88 62011418 sc r2,CursorCol
FFFFFFFFFFFFBE8C 31FFEF37 call CalcScreenLoc ; a0 = screen location
FFFFFFFFFFFFBE90 04008C09 or r3,r0,r1 ; r3 = screen location
FFFFFFFFFFFFBE94 42009418 lc r1,CursorCol
FFFFFFFFFFFFBE98 dcx5:
FFFFFFFFFFFFBE98 82310002 inch r2,2[r3]
FFFFFFFFFFFFBE9C 92310000 outc r2,[r3]
FFFFFFFFFFFFBEA0 0A318002 addui r3,r3,#2
FFFFFFFFFFFFBEA4 0A108001 addui r1,r1,#1
FFFFFFFFFFFFBEA8 E69A0000 ; SETLO
FFFFFFFFFFFFBEAC EE800003 ; SETMID
FFFFFFFFFFFFBEB0 6A0D102D lea r4,TEXTREG
FFFFFFFFFFFFBEB4 82428000 inch r5,TEXT_COLS[r4]
FFFFFFFFFFFFBEB8 BE12FF04 bltu r1,r5,dcx5
FFFFFFFFFFFFBEBC E0400020 setlo r1,#' '
FFFFFFFFFFFFBEC0 31FFEF2B call AsciiToScreen
FFFFFFFFFFFFBEC4 9230FFFE outc r1,-2[r3]
FFFFFFFFFFFFBEC8 BE00016A bra dcx4
FFFFFFFFFFFFBECC dcx3:
FFFFFFFFFFFFBECC B010090A beqi r1,#'\n',dclf ; linefeed ?
FFFFFFFFFFFFBED0 04009009 or r4,r0,r1 ; save r1 in r4
FFFFFFFFFFFFBED4 31FFEF37 call CalcScreenLoc ; r1 = screen location
FFFFFFFFFFFFBED8 04008C09 or r3,r0,r1 ; r3 = screen location
FFFFFFFFFFFFBEDC 04020409 or r1,r0,r4 ; restore r1
FFFFFFFFFFFFBEE0 31FFEF2B call AsciiToScreen ; convert ascii char to screen char
FFFFFFFFFFFFBEE4 92308000 outc r1,[r3]
FFFFFFFFFFFFBEE8 31FFEFC4 call IncCursorPos
FFFFFFFFFFFFBEEC BE00004A bra dcx4
FFFFFFFFFFFFBEF0 dclf:
FFFFFFFFFFFFBEF0 31FFEFD2 call IncCursorRow
FFFFFFFFFFFFBEF4 dcx4:
FFFFFFFFFFFFBEF4 47EF8028 lw lr,40[sp]
FFFFFFFFFFFFBEF8 47E28020 lw r5,32[sp]
FFFFFFFFFFFFBEFC 47E20018 lw r4,24[sp]
FFFFFFFFFFFFBF00 47E18010 lw r3,16[sp]
FFFFFFFFFFFFBF04 47E10008 lw r2,8[sp]
FFFFFFFFFFFFBF08 47E08000 lw r1,[sp]
FFFFFFFFFFFFBF0C 37EF8030 ret #48
FFFFFFFFFFFFC1FC DisplayChar:
FFFFFFFFFFFFC1FC B210080D bnei r1,#'\r',dccr ; carriage return ?
FFFFFFFFFFFFC200 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFC204 67E08000 sw r1,[sp]
FFFFFFFFFFFFC208 67E10008 sw r2,8[sp]
FFFFFFFFFFFFC20C 67E18010 sw r3,16[sp]
FFFFFFFFFFFFC210 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFC214 60001418 sb r0,CursorCol ; just set cursor column to zero on a CR
FFFFFFFFFFFFC218 BE00018A bra dcx7
FFFFFFFFFFFFC21C dccr:
; beqi r1,#CTRLK,dccr1
FFFFFFFFFFFFC21C E6800091 ; SETLO
FFFFFFFFFFFFC220 BE1D0209 bnei r1,#0x91,dcx6 ; cursor right ?
FFFFFFFFFFFFC224 dccr1:
FFFFFFFFFFFFC224 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFC228 67E08000 sw r1,[sp]
FFFFFFFFFFFFC22C 67E10008 sw r2,8[sp]
FFFFFFFFFFFFC230 67E18010 sw r3,16[sp]
FFFFFFFFFFFFC234 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFC238 4A011418 lbu r2,CursorCol
FFFFFFFFFFFFC23C B0200338 beqi r2,#56,dcx7
FFFFFFFFFFFFC240 0A210001 addui r2,r2,#1
FFFFFFFFFFFFC244 60011418 sb r2,CursorCol
FFFFFFFFFFFFC248 dcx7:
FFFFFFFFFFFFC248 31FFF06F call CalcScreenLoc
FFFFFFFFFFFFC24C 47EF8018 lw lr,24[sp]
FFFFFFFFFFFFC250 47E18010 lw r3,16[sp]
FFFFFFFFFFFFC254 47E10008 lw r2,8[sp]
FFFFFFFFFFFFC258 47E08000 lw r1,[sp]
FFFFFFFFFFFFC25C 37EF8020 ret #32
FFFFFFFFFFFFC260 dcx6:
; beqi r1,#CTRLI,dccu1
FFFFFFFFFFFFC260 E6800090 ; SETLO
FFFFFFFFFFFFC264 BE1D0169 bnei r1,#0x90,dcx8 ; cursor up ?
FFFFFFFFFFFFC268 dccu1:
FFFFFFFFFFFFC268 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFC26C 67E08000 sw r1,[sp]
FFFFFFFFFFFFC270 67E10008 sw r2,8[sp]
FFFFFFFFFFFFC274 67E18010 sw r3,16[sp]
FFFFFFFFFFFFC278 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFC27C 4A011417 lbu r2,CursorRow
FFFFFFFFFFFFC280 B02FF200 beqi r2,#0,dcx7
FFFFFFFFFFFFC284 0E210001 subui r2,r2,#1
FFFFFFFFFFFFC288 60011417 sb r2,CursorRow
FFFFFFFFFFFFC28C BE007DEA bra dcx7
FFFFFFFFFFFFC290 dcx8:
; beqi r1,#CTRLJ,dccl1
FFFFFFFFFFFFC290 E6800093 ; SETLO
FFFFFFFFFFFFC294 BE1D0169 bnei r1,#0x93,dcx9 ; cursor left ?
FFFFFFFFFFFFC298 dccl1:
FFFFFFFFFFFFC298 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFC29C 67E08000 sw r1,[sp]
FFFFFFFFFFFFC2A0 67E10008 sw r2,8[sp]
FFFFFFFFFFFFC2A4 67E18010 sw r3,16[sp]
FFFFFFFFFFFFC2A8 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFC2AC 4A011418 lbu r2,CursorCol
FFFFFFFFFFFFC2B0 B02FE600 beqi r2,#0,dcx7
FFFFFFFFFFFFC2B4 0E210001 subui r2,r2,#1
FFFFFFFFFFFFC2B8 60011418 sb r2,CursorCol
FFFFFFFFFFFFC2BC BE007C6A bra dcx7
FFFFFFFFFFFFC2C0 dcx9:
; beqi r1,#CTRLM,dccd1
FFFFFFFFFFFFC2C0 E6800092 ; SETLO
FFFFFFFFFFFFC2C4 BE1D0169 bnei r1,#0x92,dcx10 ; cursor down ?
FFFFFFFFFFFFC2C8 dccd1:
FFFFFFFFFFFFC2C8 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFC2CC 67E08000 sw r1,[sp]
FFFFFFFFFFFFC2D0 67E10008 sw r2,8[sp]
FFFFFFFFFFFFC2D4 67E18010 sw r3,16[sp]
FFFFFFFFFFFFC2D8 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFC2DC 4A011417 lbu r2,CursorRow
FFFFFFFFFFFFC2E0 B02FDA1E beqi r2,#30,dcx7
FFFFFFFFFFFFC2E4 0A210001 addui r2,r2,#1
FFFFFFFFFFFFC2E8 60011417 sb r2,CursorRow
FFFFFFFFFFFFC2EC BE007AEA bra dcx7
FFFFFFFFFFFFC2F0 dcx10:
FFFFFFFFFFFFC2F0 E6800094 ; SETLO
FFFFFFFFFFFFC2F4 BE1D0189 bnei r1,#0x94,dcx11 ; cursor home ?
FFFFFFFFFFFFC2F8 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFC2FC 67E08000 sw r1,[sp]
FFFFFFFFFFFFC300 67E10008 sw r2,8[sp]
FFFFFFFFFFFFC304 67E18010 sw r3,16[sp]
FFFFFFFFFFFFC308 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFC30C 4A011418 lbu r2,CursorCol
FFFFFFFFFFFFC310 BE200068 beq r2,r0,dcx12
FFFFFFFFFFFFC314 60001418 sb r0,CursorCol
FFFFFFFFFFFFC318 BE00798A bra dcx7
FFFFFFFFFFFFC31C dcx12:
FFFFFFFFFFFFC31C 60001417 sb r0,CursorRow
FFFFFFFFFFFFC320 BE00794A bra dcx7
FFFFFFFFFFFFC324 dcx11:
FFFFFFFFFFFFC324 0FEF0030 subui sp,sp,#48
FFFFFFFFFFFFC328 67E08000 sw r1,[sp]
FFFFFFFFFFFFC32C 67E10008 sw r2,8[sp]
FFFFFFFFFFFFC330 67E18010 sw r3,16[sp]
FFFFFFFFFFFFC334 67E20018 sw r4,24[sp]
FFFFFFFFFFFFC338 67E28020 sw r5,32[sp]
FFFFFFFFFFFFC33C 67EF8028 sw lr,40[sp]
FFFFFFFFFFFFC340 E6800099 ; SETLO
FFFFFFFFFFFFC344 BE1D00A9 bnei r1,#0x99,dcx13 ; delete ?
FFFFFFFFFFFFC348 31FFF06F call CalcScreenLoc
FFFFFFFFFFFFC34C 02118009 mov r3,r1 ; r3 = screen location
FFFFFFFFFFFFC350 4A009418 lbu r1,CursorCol ; r1 = cursor column
FFFFFFFFFFFFC354 BE00012A bra dcx5
FFFFFFFFFFFFC358 dcx13:
FFFFFFFFFFFFC358 B2101508 bnei r1,#CTRLH,dcx3 ; backspace ?
FFFFFFFFFFFFC35C 4A011418 lbu r2,CursorCol
FFFFFFFFFFFFC360 BE200408 beq r2,r0,dcx4
FFFFFFFFFFFFC364 0E210001 subui r2,r2,#1
FFFFFFFFFFFFC368 60011418 sb r2,CursorCol
FFFFFFFFFFFFC36C 31FFF06F call CalcScreenLoc ; a0 = screen location
FFFFFFFFFFFFC370 02118009 mov r3,r1 ; r3 = screen location
FFFFFFFFFFFFC374 4A009418 lbu r1,CursorCol
FFFFFFFFFFFFC378 dcx5:
FFFFFFFFFFFFC378 82310002 inch r2,2[r3]
FFFFFFFFFFFFC37C 92310000 outc r2,[r3]
FFFFFFFFFFFFC380 0A318002 addui r3,r3,#2
FFFFFFFFFFFFC384 0A108001 addui r1,r1,#1
FFFFFFFFFFFFC388 E69A0000 ; SETLO
FFFFFFFFFFFFC38C EE800003 ; SETMID
FFFFFFFFFFFFC390 6A0D102D lea r4,TEXTREG
FFFFFFFFFFFFC394 82428000 inch r5,TEXT_COLS[r4]
FFFFFFFFFFFFC398 BE12FF04 bltu r1,r5,dcx5
FFFFFFFFFFFFC39C E0400020 setlo r1,#' '
FFFFFFFFFFFFC3A0 31FFF063 call AsciiToScreen
FFFFFFFFFFFFC3A4 9230FFFE outc r1,-2[r3]
FFFFFFFFFFFFC3A8 BE0001CA bra dcx4
FFFFFFFFFFFFC3AC dcx3:
FFFFFFFFFFFFC3AC B0100C0A beqi r1,#'\n',dclf ; linefeed ?
FFFFFFFFFFFFC3B0 02120009 mov r4,r1 ; save r1 in r4
FFFFFFFFFFFFC3B4 31FFF06F call CalcScreenLoc ; r1 = screen location
FFFFFFFFFFFFC3B8 02118009 mov r3,r1 ; r3 = screen location
FFFFFFFFFFFFC3BC 02408009 mov r1,r4 ; restore r1
FFFFFFFFFFFFC3C0 31FFF063 call AsciiToScreen ; convert ascii char to screen char
FFFFFFFFFFFFC3C4 92308000 outc r1,[r3]
FFFFFFFFFFFFC3C8 42009410 lc r1,CharColor
FFFFFFFFFFFFC3CC E6810000 ; SETLO
FFFFFFFFFFFFC3D0 6A3D0429 outc r1,0x10000[r3]
FFFFFFFFFFFFC3D4 31FFF0FF call IncCursorPos
FFFFFFFFFFFFC3D8 BE00004A bra dcx4
FFFFFFFFFFFFC3DC dclf:
FFFFFFFFFFFFC3DC 31FFF10D call IncCursorRow
FFFFFFFFFFFFC3E0 dcx4:
FFFFFFFFFFFFC3E0 47EF8028 lw lr,40[sp]
FFFFFFFFFFFFC3E4 47E28020 lw r5,32[sp]
FFFFFFFFFFFFC3E8 47E20018 lw r4,24[sp]
FFFFFFFFFFFFC3EC 47E18010 lw r3,16[sp]
FFFFFFFFFFFFC3F0 47E10008 lw r2,8[sp]
FFFFFFFFFFFFC3F4 47E08000 lw r1,[sp]
FFFFFFFFFFFFC3F8 37EF8030 ret #48
;------------------------------------------------------------------------------
1566,139 → 2131,176
; Increment the cursor position, scroll the screen if needed.
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFBF10 IncCursorPos:
FFFFFFFFFFFFBF10 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFBF14 67E08000 sw r1,[sp]
FFFFFFFFFFFFBF18 67E10008 sw r2,8[sp]
FFFFFFFFFFFFBF1C 67E18010 sw r3,16[sp]
FFFFFFFFFFFFBF20 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFBF24 42009418 lc r1,CursorCol
FFFFFFFFFFFFBF28 0A108001 addui r1,r1,#1
FFFFFFFFFFFFBF2C 62009418 sc r1,CursorCol
FFFFFFFFFFFFBF30 E69A0000 ; SETLO
FFFFFFFFFFFFBF34 EE800003 ; SETMID
FFFFFFFFFFFFBF38 6A0D0821 inch r2,TEXTREG+TEXT_COLS
FFFFFFFFFFFFBF3C BE110246 bleu r1,r2,icc1
FFFFFFFFFFFFBF40 62001418 sc r0,CursorCol ; column = 0
FFFFFFFFFFFFBF44 BE0000CA bra icr1
FFFFFFFFFFFFBF48 IncCursorRow:
FFFFFFFFFFFFBF48 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFBF4C 67E08000 sw r1,[sp]
FFFFFFFFFFFFBF50 67E10008 sw r2,8[sp]
FFFFFFFFFFFFBF54 67E18010 sw r3,16[sp]
FFFFFFFFFFFFBF58 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFBF5C icr1:
FFFFFFFFFFFFBF5C 42009416 lc r1,CursorRow
FFFFFFFFFFFFBF60 0A108001 addui r1,r1,#1
FFFFFFFFFFFFBF64 62009416 sc r1,CursorRow
FFFFFFFFFFFFBF68 E69A0002 ; SETLO
FFFFFFFFFFFFBF6C EE800003 ; SETMID
FFFFFFFFFFFFBF70 6A0D0821 inch r2,TEXTREG+TEXT_ROWS
FFFFFFFFFFFFBF74 BE110086 bleu r1,r2,icc1
FFFFFFFFFFFFBF78 0E210001 subui r2,r2,#1 ; backup the cursor row, we are scrolling up
FFFFFFFFFFFFBF7C 62011416 sc r2,CursorRow
FFFFFFFFFFFFBF80 31FFEEF6 call ScrollUp
FFFFFFFFFFFFBF84 icc1:
FFFFFFFFFFFFBF84 31FFEF37 call CalcScreenLoc
FFFFFFFFFFFFBF88 47EF8018 lw lr,24[sp]
FFFFFFFFFFFFBF8C 47E18010 lw r3,16[sp]
FFFFFFFFFFFFBF90 47E10008 lw r2,8[sp]
FFFFFFFFFFFFBF94 47E08000 lw r1,[sp]
FFFFFFFFFFFFBF98 37EF8020 ret #32
FFFFFFFFFFFFC3FC IncCursorPos:
FFFFFFFFFFFFC3FC 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFC400 67E08000 sw r1,[sp]
FFFFFFFFFFFFC404 67E10008 sw r2,8[sp]
FFFFFFFFFFFFC408 67E18010 sw r3,16[sp]
FFFFFFFFFFFFC40C 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFC410 4A009418 lbu r1,CursorCol
FFFFFFFFFFFFC414 0A108001 addui r1,r1,#1
FFFFFFFFFFFFC418 60009418 sb r1,CursorCol
FFFFFFFFFFFFC41C E69A0000 ; SETLO
FFFFFFFFFFFFC420 EE800003 ; SETMID
FFFFFFFFFFFFC424 6A0D0821 inch r2,TEXTREG+TEXT_COLS
FFFFFFFFFFFFC428 BE110246 bleu r1,r2,icc1
FFFFFFFFFFFFC42C 60001418 sb r0,CursorCol ; column = 0
FFFFFFFFFFFFC430 BE0000CA bra icr1
FFFFFFFFFFFFC434 IncCursorRow:
FFFFFFFFFFFFC434 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFC438 67E08000 sw r1,[sp]
FFFFFFFFFFFFC43C 67E10008 sw r2,8[sp]
FFFFFFFFFFFFC440 67E18010 sw r3,16[sp]
FFFFFFFFFFFFC444 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFC448 icr1:
FFFFFFFFFFFFC448 4A009417 lbu r1,CursorRow
FFFFFFFFFFFFC44C 0A108001 addui r1,r1,#1
FFFFFFFFFFFFC450 60009417 sb r1,CursorRow
FFFFFFFFFFFFC454 E69A0002 ; SETLO
FFFFFFFFFFFFC458 EE800003 ; SETMID
FFFFFFFFFFFFC45C 6A0D0821 inch r2,TEXTREG+TEXT_ROWS
FFFFFFFFFFFFC460 BE110086 bleu r1,r2,icc1
FFFFFFFFFFFFC464 0E210001 subui r2,r2,#1 ; backup the cursor row, we are scrolling up
FFFFFFFFFFFFC468 60011417 sb r2,CursorRow
FFFFFFFFFFFFC46C 31FFF02E call ScrollUp
FFFFFFFFFFFFC470 icc1:
FFFFFFFFFFFFC470 31FFF06F call CalcScreenLoc
FFFFFFFFFFFFC474 47EF8018 lw lr,24[sp]
FFFFFFFFFFFFC478 47E18010 lw r3,16[sp]
FFFFFFFFFFFFC47C 47E10008 lw r2,8[sp]
FFFFFFFFFFFFC480 47E08000 lw r1,[sp]
FFFFFFFFFFFFC484 37EF8020 ret #32
;------------------------------------------------------------------------------
; Display a string on the screen.
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFBF9C DisplayString:
FFFFFFFFFFFFBF9C 0DEF0018 subi sp,sp,#24
FFFFFFFFFFFFBFA0 67E08000 sw r1,[sp]
FFFFFFFFFFFFBFA4 67E10008 sw r2,8[sp]
FFFFFFFFFFFFBFA8 67EF8010 sw lr,16[sp]
FFFFFFFFFFFFBFAC 02110009 mov r2,r1 ; r2 = pointer to string
FFFFFFFFFFFFBFB0 dspj1:
FFFFFFFFFFFFBFB0 4A208000 lbu r1,[r2] ; move string char into r1
FFFFFFFFFFFFBFB4 0A210001 addui r2,r2,#1 ; increment pointer
FFFFFFFFFFFFBFB8 BE100068 beq r1,r0,dsret ; is it end of string ?
FFFFFFFFFFFFBFBC 31FFEF47 call DisplayChar ; display character
FFFFFFFFFFFFBFC0 BE007F8A bra dspj1 ; go back for next character
FFFFFFFFFFFFBFC4 dsret:
FFFFFFFFFFFFBFC4 47EF8010 lw lr,16[sp]
FFFFFFFFFFFFBFC8 47E10008 lw r2,8[sp]
FFFFFFFFFFFFBFCC 47E08000 lw r1,[sp]
FFFFFFFFFFFFBFD0 37EF8018 ret #24
FFFFFFFFFFFFC488 DisplayString:
FFFFFFFFFFFFC488 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFC48C 67E08000 sw r1,[sp]
FFFFFFFFFFFFC490 67E10008 sw r2,8[sp]
FFFFFFFFFFFFC494 67EF8010 sw lr,16[sp]
FFFFFFFFFFFFC498 02110009 mov r2,r1 ; r2 = pointer to string
FFFFFFFFFFFFC49C dspj1:
FFFFFFFFFFFFC49C 4A208000 lbu r1,[r2] ; move string char into r1
FFFFFFFFFFFFC4A0 0A210001 addui r2,r2,#1 ; increment pointer
FFFFFFFFFFFFC4A4 BE100068 beq r1,r0,dsret ; is it end of string ?
FFFFFFFFFFFFC4A8 31FFF07F call DisplayChar ; display character
FFFFFFFFFFFFC4AC BE007F8A bra dspj1 ; go back for next character
FFFFFFFFFFFFC4B0 dsret:
FFFFFFFFFFFFC4B0 47EF8010 lw lr,16[sp]
FFFFFFFFFFFFC4B4 47E10008 lw r2,8[sp]
FFFFFFFFFFFFC4B8 47E08000 lw r1,[sp]
FFFFFFFFFFFFC4BC 37EF8018 ret #24
FFFFFFFFFFFFBFD4 DisplayStringCRLF:
FFFFFFFFFFFFBFD4 0FEF0008 subui r30,r30,#8
FFFFFFFFFFFFBFD8 67EF8000 sw r31,[r30]
FFFFFFFFFFFFBFDC 31FFEFE7 call DisplayString
FFFFFFFFFFFFBFE0 47EF8000 lw r31,[r30]
FFFFFFFFFFFFBFE4 0BEF0008 addui r30,r30,#8
FFFFFFFFFFFFC4C0 DisplayStringCRLF:
FFFFFFFFFFFFC4C0 0FEF0008 subui r30,r30,#8
FFFFFFFFFFFFC4C4 67EF8000 sw r31,[r30]
FFFFFFFFFFFFC4C8 31FFF122 call DisplayString
FFFFFFFFFFFFC4CC 47EF8000 lw r31,[r30]
FFFFFFFFFFFFC4D0 0BEF0008 addui r30,r30,#8
FFFFFFFFFFFFBFE8 CRLF:
FFFFFFFFFFFFBFE8 0FEF0010 subui r30,r30,#16
FFFFFFFFFFFFBFEC 67E08000 sw r1,[sp]
FFFFFFFFFFFFBFF0 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFBFF4 E040000D setlo r1,#'\r'
FFFFFFFFFFFFBFF8 31FFEF47 call DisplayChar
FFFFFFFFFFFFBFFC E040000A setlo r1,#'\n'
FFFFFFFFFFFFC000 31FFEF47 call DisplayChar
FFFFFFFFFFFFC004 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFC008 47E08000 lw r1,[sp]
FFFFFFFFFFFFC00C 37EF8010 ret #16
FFFFFFFFFFFFC4D4 CRLF:
FFFFFFFFFFFFC4D4 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFC4D8 67E08000 sw r1,[sp]
FFFFFFFFFFFFC4DC 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFC4E0 E040000D setlo r1,#'\r'
FFFFFFFFFFFFC4E4 31FFF07F call DisplayChar
FFFFFFFFFFFFC4E8 E040000A setlo r1,#'\n'
FFFFFFFFFFFFC4EC 31FFF07F call DisplayChar
FFFFFFFFFFFFC4F0 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFC4F4 47E08000 lw r1,[sp]
FFFFFFFFFFFFC4F8 37EF8010 ret #16
; Call the Tiny BASIC routine to display a number
;
FFFFFFFFFFFFC4FC DisplayNum:
FFFFFFFFFFFFC4FC 33FFFCCC jmp PRTNUM
;------------------------------------------------------------------------------
; Display nybble in r1
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFC010 DisplayNybble:
FFFFFFFFFFFFC010 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFC014 67E08000 sw r1,[sp]
FFFFFFFFFFFFC018 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFC01C 1410800F andi r1,r1,#0x0F
FFFFFFFFFFFFC020 0A108030 addui r1,r1,#'0'
FFFFFFFFFFFFC024 AC100239 bleui r1,#'9',dispnyb1
FFFFFFFFFFFFC028 0A108007 addui r1,r1,#7
FFFFFFFFFFFFC02C dispnyb1:
FFFFFFFFFFFFC02C 31FFEF47 call DisplayChar
FFFFFFFFFFFFC030 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFC034 47E08000 lw r1,[sp]
FFFFFFFFFFFFC038 37EF8010 ret #16
FFFFFFFFFFFFC500 DisplayNybble:
FFFFFFFFFFFFC500 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFC504 67E08000 sw r1,[sp]
FFFFFFFFFFFFC508 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFC50C 1410800F andi r1,r1,#0x0F
FFFFFFFFFFFFC510 0A108030 addui r1,r1,#'0'
FFFFFFFFFFFFC514 AC100239 bleui r1,#'9',dispnyb1
FFFFFFFFFFFFC518 0A108007 addui r1,r1,#7
FFFFFFFFFFFFC51C dispnyb1:
FFFFFFFFFFFFC51C 31FFF07F call DisplayChar
FFFFFFFFFFFFC520 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFC524 47E08000 lw r1,[sp]
FFFFFFFFFFFFC528 37EF8010 ret #16
;------------------------------------------------------------------------------
; Display the byte in r1
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFC03C DisplayByte:
FFFFFFFFFFFFC03C 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFC040 67E08000 sw r1,[sp]
FFFFFFFFFFFFC044 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFC048 06108804 rori r1,r1,#4
FFFFFFFFFFFFC04C 31FFF004 call DisplayNybble
FFFFFFFFFFFFC050 06108802 roli r1,r1,#4
FFFFFFFFFFFFC054 31FFF004 call DisplayNybble
FFFFFFFFFFFFC058 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFC05C 47E08000 lw r1,[sp]
FFFFFFFFFFFFC060 37EF8010 ret #16
FFFFFFFFFFFFC52C DisplayByte:
FFFFFFFFFFFFC52C 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFC530 67E08000 sw r1,[sp]
FFFFFFFFFFFFC534 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFC538 06108804 rori r1,r1,#4
FFFFFFFFFFFFC53C 31FFF140 call DisplayNybble
FFFFFFFFFFFFC540 06108802 roli r1,r1,#4
FFFFFFFFFFFFC544 31FFF140 call DisplayNybble
FFFFFFFFFFFFC548 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFC54C 47E08000 lw r1,[sp]
FFFFFFFFFFFFC550 37EF8010 ret #16
;------------------------------------------------------------------------------
; Display the char in r1
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFC554 DisplayCharr:
FFFFFFFFFFFFC554 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFC558 67E08000 sw r1,[sp]
FFFFFFFFFFFFC55C 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFC560 06109004 rori r1,r1,#8
FFFFFFFFFFFFC564 31FFF14B call DisplayByte
FFFFFFFFFFFFC568 06109002 roli r1,r1,#8
FFFFFFFFFFFFC56C 31FFF14B call DisplayByte
FFFFFFFFFFFFC570 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFC574 47E08000 lw r1,[sp]
FFFFFFFFFFFFC578 37EF8010 ret #16
;------------------------------------------------------------------------------
; Display the half-word in r1
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFC57C DisplayHalf:
FFFFFFFFFFFFC57C 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFC580 67E08000 sw r1,[sp]
FFFFFFFFFFFFC584 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFC588 0610A004 rori r1,r1,#16
FFFFFFFFFFFFC58C 31FFF155 call DisplayCharr
FFFFFFFFFFFFC590 0610A002 roli r1,r1,#16
FFFFFFFFFFFFC594 31FFF155 call DisplayCharr
FFFFFFFFFFFFC598 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFC59C 47E08000 lw r1,[sp]
FFFFFFFFFFFFC5A0 37EF8010 ret #16
;------------------------------------------------------------------------------
; Display the 64 bit word in r1
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFC064 DisplayWord:
FFFFFFFFFFFFC064 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFC068 67E08000 sw r1,[sp]
FFFFFFFFFFFFC06C 67E18008 sw r3,8[sp]
FFFFFFFFFFFFC070 67EF8010 sw lr,16[sp]
FFFFFFFFFFFFC074 E0C00007 setlo r3,#7
FFFFFFFFFFFFC078 dspwd1:
FFFFFFFFFFFFC078 06109002 roli r1,r1,#8
FFFFFFFFFFFFC07C 31FFF00F call DisplayByte
FFFFFFFFFFFFC080 BE01FFCF loop r3,dspwd1
FFFFFFFFFFFFC084 47EF8010 lw lr,16[sp]
FFFFFFFFFFFFC088 47E18008 lw r3,8[sp]
FFFFFFFFFFFFC08C 47E08000 lw r1,[sp]
FFFFFFFFFFFFC090 37EF8018 ret #24
FFFFFFFFFFFFC5A4 DisplayWord:
FFFFFFFFFFFFC5A4 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFC5A8 67E08000 sw r1,[sp]
FFFFFFFFFFFFC5AC 67E18008 sw r3,8[sp]
FFFFFFFFFFFFC5B0 67EF8010 sw lr,16[sp]
FFFFFFFFFFFFC5B4 E0C00007 setlo r3,#7
FFFFFFFFFFFFC5B8 dspwd1:
FFFFFFFFFFFFC5B8 06109002 roli r1,r1,#8
FFFFFFFFFFFFC5BC 31FFF14B call DisplayByte
FFFFFFFFFFFFC5C0 BE01FFCF loop r3,dspwd1
FFFFFFFFFFFFC5C4 47EF8010 lw lr,16[sp]
FFFFFFFFFFFFC5C8 47E18008 lw r3,8[sp]
FFFFFFFFFFFFC5CC 47E08000 lw r1,[sp]
FFFFFFFFFFFFC5D0 37EF8018 ret #24
;------------------------------------------------------------------------------
; Display memory pointed to by r2.
1705,96 → 2307,137
; destroys r1,r3
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFC094 DisplayMem:
FFFFFFFFFFFFC094 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFC098 67E08000 sw r1,[sp]
FFFFFFFFFFFFC09C 67E18008 sw r3,8[sp]
FFFFFFFFFFFFC0A0 67EF8010 sw lr,16[sp]
FFFFFFFFFFFFC0A4 E040003A setlo r1,#':'
FFFFFFFFFFFFC0A8 31FFEF47 call DisplayChar
FFFFFFFFFFFFC0AC 02208009 mov r1,r2
FFFFFFFFFFFFC0B0 31FFF019 call DisplayWord
FFFFFFFFFFFFC0B4 E0C00007 setlo r3,#7
FFFFFFFFFFFFC0B8 dspmem1:
FFFFFFFFFFFFC0B8 E0400020 setlo r1,#' '
FFFFFFFFFFFFC0BC 31FFEF47 call DisplayChar
FFFFFFFFFFFFC0C0 40208000 lb r1,[r2]
FFFFFFFFFFFFC0C4 31FFF00F call DisplayByte
FFFFFFFFFFFFC0C8 0A210001 addui r2,r2,#1
FFFFFFFFFFFFC0CC BE01FF6F loop r3,dspmem1
FFFFFFFFFFFFC0D0 31FFEFFA call CRLF
FFFFFFFFFFFFC0D4 47EF8010 lw lr,16[sp]
FFFFFFFFFFFFC0D8 47E18008 lw r3,8[sp]
FFFFFFFFFFFFC0DC 47E08000 lw r1,[sp]
FFFFFFFFFFFFC0E0 37EF8018 ret #24
FFFFFFFFFFFFC5D4 DisplayMemB:
FFFFFFFFFFFFC5D4 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFC5D8 67E08000 sw r1,[sp]
FFFFFFFFFFFFC5DC 67E18008 sw r3,8[sp]
FFFFFFFFFFFFC5E0 67EF8010 sw lr,16[sp]
FFFFFFFFFFFFC5E4 E040003A setlo r1,#':'
FFFFFFFFFFFFC5E8 31FFF07F call DisplayChar
FFFFFFFFFFFFC5EC 02208009 mov r1,r2
FFFFFFFFFFFFC5F0 31FFF169 call DisplayWord
FFFFFFFFFFFFC5F4 E0C00007 setlo r3,#7
FFFFFFFFFFFFC5F8 dspmem1:
FFFFFFFFFFFFC5F8 E0400020 setlo r1,#' '
FFFFFFFFFFFFC5FC 31FFF07F call DisplayChar
FFFFFFFFFFFFC600 4A208000 lbu r1,[r2]
FFFFFFFFFFFFC604 31FFF14B call DisplayByte
FFFFFFFFFFFFC608 0A210001 addui r2,r2,#1
FFFFFFFFFFFFC60C BE01FF6F loop r3,dspmem1
FFFFFFFFFFFFC610 31FFF135 call CRLF
FFFFFFFFFFFFC614 47EF8010 lw lr,16[sp]
FFFFFFFFFFFFC618 47E18008 lw r3,8[sp]
FFFFFFFFFFFFC61C 47E08000 lw r1,[sp]
FFFFFFFFFFFFC620 37EF8018 ret #24
FFFFFFFFFFFFC624 DisplayMemC:
FFFFFFFFFFFFC624 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFC628 67E08000 sw r1,[sp]
FFFFFFFFFFFFC62C 67E18008 sw r3,8[sp]
FFFFFFFFFFFFC630 67EF8010 sw lr,16[sp]
FFFFFFFFFFFFC634 E040003A setlo r1,#':'
FFFFFFFFFFFFC638 31FFF07F call DisplayChar
FFFFFFFFFFFFC63C 02208009 mov r1,r2
FFFFFFFFFFFFC640 31FFF169 call DisplayWord
FFFFFFFFFFFFC644 E0C00003 setlo r3,#3
FFFFFFFFFFFFC648 dspmemc1:
FFFFFFFFFFFFC648 E0400020 setlo r1,#' '
FFFFFFFFFFFFC64C 31FFF07F call DisplayChar
FFFFFFFFFFFFC650 4C208000 lcu r1,[r2]
FFFFFFFFFFFFC654 31FFF155 call DisplayCharr
FFFFFFFFFFFFC658 0A210002 addui r2,r2,#2
FFFFFFFFFFFFC65C BE01FF6F loop r3,dspmemc1
FFFFFFFFFFFFC660 31FFF135 call CRLF
FFFFFFFFFFFFC664 47EF8010 lw lr,16[sp]
FFFFFFFFFFFFC668 47E18008 lw r3,8[sp]
FFFFFFFFFFFFC66C 47E08000 lw r1,[sp]
FFFFFFFFFFFFC670 37EF8018 ret #24
FFFFFFFFFFFFC674 DisplayMemW:
FFFFFFFFFFFFC674 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFC678 67E08000 sw r1,[sp]
FFFFFFFFFFFFC67C 67EF8010 sw lr,16[sp]
FFFFFFFFFFFFC680 E040003A setlo r1,#':'
FFFFFFFFFFFFC684 31FFF07F call DisplayChar
FFFFFFFFFFFFC688 02208009 mov r1,r2
FFFFFFFFFFFFC68C 31FFF169 call DisplayWord
FFFFFFFFFFFFC690 E0400020 setlo r1,#' '
FFFFFFFFFFFFC694 31FFF07F call DisplayChar
FFFFFFFFFFFFC698 46208000 lw r1,[r2]
FFFFFFFFFFFFC69C 31FFF169 call DisplayWord
FFFFFFFFFFFFC6A0 0A210008 addui r2,r2,#8
FFFFFFFFFFFFC6A4 31FFF135 call CRLF
FFFFFFFFFFFFC6A8 47EF8010 lw lr,16[sp]
FFFFFFFFFFFFC6AC 47E08000 lw r1,[sp]
FFFFFFFFFFFFC6B0 37EF8018 ret #24
;------------------------------------------------------------------------------
; Converts binary number in r1 into BCD number in r2 and r1.
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFC0E4 BinToBCD:
FFFFFFFFFFFFC0E4 0FEF0030 subui sp,sp,#48
FFFFFFFFFFFFC0E8 67E18000 sw r3,[sp]
FFFFFFFFFFFFC0EC 67E20008 sw r4,8[sp]
FFFFFFFFFFFFC0F0 67E28010 sw r5,16[sp]
FFFFFFFFFFFFC0F4 67E30018 sw r6,24[sp]
FFFFFFFFFFFFC0F8 67E38020 sw r7,32[sp]
FFFFFFFFFFFFC0FC 67E40028 sw r8,40[sp]
FFFFFFFFFFFFC100 E080000A setlo r2,#10
FFFFFFFFFFFFC104 E2000013 setlo r8,#19 ; number of digits to produce - 1
FFFFFFFFFFFFC108 bta1:
FFFFFFFFFFFFC108 04110C1C mod r3,r1,r2
FFFFFFFFFFFFC10C 0631F800 shli r3,r3,#60 ; shift result to uppermost bits
FFFFFFFFFFFFC110 0653F800 shli r7,r5,#60 ; copy low order nybble of r5 to r4 topmost nybble
FFFFFFFFFFFFC114 06420801 shrui r4,r4,#4
FFFFFFFFFFFFC118 04439009 or r4,r4,r7
FFFFFFFFFFFFC11C 06528801 shrui r5,r5,#4
FFFFFFFFFFFFC120 04519409 or r5,r5,r3 ; copy new bcd digit into uppermost bits of r5
FFFFFFFFFFFFC124 1C108000 divui r1,r1,r2 ; r1=r1/10
FFFFFFFFFFFFC128 BE047F0F loop r8,bta1
FFFFFFFFFFFFC12C 06426001 shrui r4,r4,#48 ; right align number in register
FFFFFFFFFFFFC130 06532000 shli r6,r5,#16
FFFFFFFFFFFFC134 04431009 or r4,r4,r6 ; copy bits into r4
FFFFFFFFFFFFC138 0652E001 shrui r5,r5,#48
FFFFFFFFFFFFC13C 02408009 mov r1,r4
FFFFFFFFFFFFC140 02510009 mov r2,r5
FFFFFFFFFFFFC144 47E18000 lw r3,[sp]
FFFFFFFFFFFFC148 47E20008 lw r4,8[sp]
FFFFFFFFFFFFC14C 47E28010 lw r5,16[sp]
FFFFFFFFFFFFC150 47E30018 lw r6,24[sp]
FFFFFFFFFFFFC154 47E38020 lw r7,32[sp]
FFFFFFFFFFFFC158 47E40028 lw r8,40[sp]
FFFFFFFFFFFFC15C 37EF8030 ret #48
FFFFFFFFFFFFC6B4 BinToBCD:
FFFFFFFFFFFFC6B4 0FEF0030 subui sp,sp,#48
FFFFFFFFFFFFC6B8 67E18000 sw r3,[sp]
FFFFFFFFFFFFC6BC 67E20008 sw r4,8[sp]
FFFFFFFFFFFFC6C0 67E28010 sw r5,16[sp]
FFFFFFFFFFFFC6C4 67E30018 sw r6,24[sp]
FFFFFFFFFFFFC6C8 67E38020 sw r7,32[sp]
FFFFFFFFFFFFC6CC 67E40028 sw r8,40[sp]
FFFFFFFFFFFFC6D0 E080000A setlo r2,#10
FFFFFFFFFFFFC6D4 E2000013 setlo r8,#19 ; number of digits to produce - 1
FFFFFFFFFFFFC6D8 bta1:
FFFFFFFFFFFFC6D8 04110C1C modu r3,r1,r2
FFFFFFFFFFFFC6DC 0631F800 shli r3,r3,#60 ; shift result to uppermost bits
FFFFFFFFFFFFC6E0 0653F800 shli r7,r5,#60 ; copy low order nybble of r5 to r4 topmost nybble
FFFFFFFFFFFFC6E4 06420801 shrui r4,r4,#4
FFFFFFFFFFFFC6E8 04439009 or r4,r4,r7
FFFFFFFFFFFFC6EC 06528801 shrui r5,r5,#4
FFFFFFFFFFFFC6F0 04519409 or r5,r5,r3 ; copy new bcd digit into uppermost bits of r5
FFFFFFFFFFFFC6F4 1E108000 divui r1,r1,r2 ; r1=r1/10
FFFFFFFFFFFFC6F8 BE047F0F loop r8,bta1
FFFFFFFFFFFFC6FC 06426001 shrui r4,r4,#48 ; right align number in register
FFFFFFFFFFFFC700 06532000 shli r6,r5,#16
FFFFFFFFFFFFC704 04431009 or r4,r4,r6 ; copy bits into r4
FFFFFFFFFFFFC708 0652E001 shrui r5,r5,#48
FFFFFFFFFFFFC70C 02408009 mov r1,r4
FFFFFFFFFFFFC710 02510009 mov r2,r5
FFFFFFFFFFFFC714 47E18000 lw r3,[sp]
FFFFFFFFFFFFC718 47E20008 lw r4,8[sp]
FFFFFFFFFFFFC71C 47E28010 lw r5,16[sp]
FFFFFFFFFFFFC720 47E30018 lw r6,24[sp]
FFFFFFFFFFFFC724 47E38020 lw r7,32[sp]
FFFFFFFFFFFFC728 47E40028 lw r8,40[sp]
FFFFFFFFFFFFC72C 37EF8030 ret #48
;------------------------------------------------------------------------------
; Converts BCD number in r1 into Ascii number in r2 and r1.
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFC160 BCDToAscii:
FFFFFFFFFFFFC160 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFC164 67E18000 sw r3,[sp]
FFFFFFFFFFFFC168 67E20008 sw r4,8[sp]
FFFFFFFFFFFFC16C 67E28010 sw r5,16[sp]
FFFFFFFFFFFFC170 67E40018 sw r8,24[sp]
FFFFFFFFFFFFC174 E200000F setlo r8,#15
FFFFFFFFFFFFC178 bta2:
FFFFFFFFFFFFC178 1411000F andi r2,r1,#0x0F
FFFFFFFFFFFFC17C 16210030 ori r2,r2,#0x30
FFFFFFFFFFFFC180 06217000 shli r2,r2,#56
FFFFFFFFFFFFC184 06421001 shrui r4,r4,#8
FFFFFFFFFFFFC188 0632F000 shli r5,r3,#56
FFFFFFFFFFFFC18C 04429009 or r4,r4,r5
FFFFFFFFFFFFC190 06319001 shrui r3,r3,#8
FFFFFFFFFFFFC194 04310C09 or r3,r3,r2
FFFFFFFFFFFFC198 06108801 shrui r1,r1,#4
FFFFFFFFFFFFC19C BE047EEF loop r8,bta2
FFFFFFFFFFFFC1A0 02408009 mov r1,r4
FFFFFFFFFFFFC1A4 02310009 mov r2,r3
FFFFFFFFFFFFC1A8 47E18000 lw r3,[sp]
FFFFFFFFFFFFC1AC 47E20008 lw r4,8[sp]
FFFFFFFFFFFFC1B0 47E28010 lw r5,16[sp]
FFFFFFFFFFFFC1B4 47E40018 lw r8,24[sp]
FFFFFFFFFFFFC1B8 37EF8020 ret #32
FFFFFFFFFFFFC730 BCDToAscii:
FFFFFFFFFFFFC730 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFC734 67E18000 sw r3,[sp]
FFFFFFFFFFFFC738 67E20008 sw r4,8[sp]
FFFFFFFFFFFFC73C 67E28010 sw r5,16[sp]
FFFFFFFFFFFFC740 67E40018 sw r8,24[sp]
FFFFFFFFFFFFC744 E200000F setlo r8,#15
FFFFFFFFFFFFC748 bta2:
FFFFFFFFFFFFC748 1411000F andi r2,r1,#0x0F
FFFFFFFFFFFFC74C 16210030 ori r2,r2,#0x30
FFFFFFFFFFFFC750 06217000 shli r2,r2,#56
FFFFFFFFFFFFC754 06421001 shrui r4,r4,#8
FFFFFFFFFFFFC758 0632F000 shli r5,r3,#56
FFFFFFFFFFFFC75C 04429009 or r4,r4,r5
FFFFFFFFFFFFC760 06319001 shrui r3,r3,#8
FFFFFFFFFFFFC764 04310C09 or r3,r3,r2
FFFFFFFFFFFFC768 06108801 shrui r1,r1,#4
FFFFFFFFFFFFC76C BE047EEF loop r8,bta2
FFFFFFFFFFFFC770 02408009 mov r1,r4
FFFFFFFFFFFFC774 02310009 mov r2,r3
FFFFFFFFFFFFC778 47E18000 lw r3,[sp]
FFFFFFFFFFFFC77C 47E20008 lw r4,8[sp]
FFFFFFFFFFFFC780 47E28010 lw r5,16[sp]
FFFFFFFFFFFFC784 47E40018 lw r8,24[sp]
FFFFFFFFFFFFC788 37EF8020 ret #32
;------------------------------------------------------------------------------
; Convert a binary number into a 20 character ascii string.
1802,153 → 2445,176
; r2 = address of string buffer
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFC1BC BinToStr:
FFFFFFFFFFFFC1BC 0FEF0038 subui sp,sp,#56
FFFFFFFFFFFFC1C0 67E18000 sw r3,[sp]
FFFFFFFFFFFFC1C4 67E38008 sw r7,8[sp]
FFFFFFFFFFFFC1C8 67E40010 sw r8,16[sp]
FFFFFFFFFFFFC1CC 67E48018 sw r9,24[sp]
FFFFFFFFFFFFC1D0 67E50020 sw r10,32[sp]
FFFFFFFFFFFFC1D4 67E58028 sw r11,40[sp]
FFFFFFFFFFFFC1D8 67EF8030 sw lr,48[sp]
FFFFFFFFFFFFC1DC 02258009 mov r11,r2
FFFFFFFFFFFFC1E0 31FFF039 call BinToBCD
FFFFFFFFFFFFC1E4 02250009 mov r10,r2 ; save off r2
FFFFFFFFFFFFC1E8 31FFF058 call BCDToAscii
FFFFFFFFFFFFC1EC E2400001 setlo r9,#1
FFFFFFFFFFFFC1F0 btos3:
FFFFFFFFFFFFC1F0 E2000007 setlo r8,#7
FFFFFFFFFFFFC1F4 btos1:
FFFFFFFFFFFFC1F4 06938600 shli r7,r9,#3
FFFFFFFFFFFFC1F8 0A738000 addui r7,r7,r8
FFFFFFFFFFFFC1FC 0A738004 addui r7,r7,#4
FFFFFFFFFFFFC200 141180FF andi r3,r1,#0xff
FFFFFFFFFFFFC204 6A758C10 sb r3,[r7+r11]
FFFFFFFFFFFFC208 06109001 shrui r1,r1,#8
FFFFFFFFFFFFC20C BE047F4F loop r8,btos1
FFFFFFFFFFFFC210 02208009 mov r1,r2
FFFFFFFFFFFFC214 BE04FEEF loop r9,btos3
FFFFFFFFFFFFC78C BinToStr:
FFFFFFFFFFFFC78C 0FEF0038 subui sp,sp,#56
FFFFFFFFFFFFC790 67E18000 sw r3,[sp]
FFFFFFFFFFFFC794 67E38008 sw r7,8[sp]
FFFFFFFFFFFFC798 67E40010 sw r8,16[sp]
FFFFFFFFFFFFC79C 67E48018 sw r9,24[sp]
FFFFFFFFFFFFC7A0 67E50020 sw r10,32[sp]
FFFFFFFFFFFFC7A4 67E58028 sw r11,40[sp]
FFFFFFFFFFFFC7A8 67EF8030 sw lr,48[sp]
FFFFFFFFFFFFC7AC 02258009 mov r11,r2
FFFFFFFFFFFFC7B0 31FFF1AD call BinToBCD
FFFFFFFFFFFFC7B4 02250009 mov r10,r2 ; save off r2
FFFFFFFFFFFFC7B8 31FFF1CC call BCDToAscii
FFFFFFFFFFFFC7BC E2400001 setlo r9,#1
FFFFFFFFFFFFC7C0 btos3:
FFFFFFFFFFFFC7C0 E2000007 setlo r8,#7
FFFFFFFFFFFFC7C4 btos1:
FFFFFFFFFFFFC7C4 06938600 shli r7,r9,#3
FFFFFFFFFFFFC7C8 0A738000 addui r7,r7,r8
FFFFFFFFFFFFC7CC 0A738004 addui r7,r7,#4
FFFFFFFFFFFFC7D0 141180FF andi r3,r1,#0xff
FFFFFFFFFFFFC7D4 6A758C10 sb r3,[r7+r11]
FFFFFFFFFFFFC7D8 06109001 shrui r1,r1,#8
FFFFFFFFFFFFC7DC BE047F4F loop r8,btos1
FFFFFFFFFFFFC7E0 02208009 mov r1,r2
FFFFFFFFFFFFC7E4 BE04FEEF loop r9,btos3
; the last four digits
FFFFFFFFFFFFC218 02A08009 mov r1,r10 ; get back r2
FFFFFFFFFFFFC21C 31FFF058 call BCDToAscii
FFFFFFFFFFFFC220 E2000003 setlo r8,#3
FFFFFFFFFFFFC224 btos2:
FFFFFFFFFFFFC224 141180FF andi r3,r1,#0xff
FFFFFFFFFFFFC228 6A858C10 sb r3,[r8+r11]
FFFFFFFFFFFFC22C 06109001 shrui r1,r1,#8
FFFFFFFFFFFFC230 BE047FAF loop r8,btos2
FFFFFFFFFFFFC234 60B00014 sb r0,20[r11] ; null terminate
FFFFFFFFFFFFC238 47E18000 lw r3,[sp]
FFFFFFFFFFFFC23C 47E38008 lw r7,8[sp]
FFFFFFFFFFFFC240 47E40010 lw r8,16[sp]
FFFFFFFFFFFFC244 47E48018 lw r9,24[sp]
FFFFFFFFFFFFC248 47E50020 lw r10,32[sp]
FFFFFFFFFFFFC24C 47E58028 lw r11,40[sp]
FFFFFFFFFFFFC250 47EF8030 lw lr,48[sp]
FFFFFFFFFFFFC254 37EF8038 ret #56
FFFFFFFFFFFFC7E8 02A08009 mov r1,r10 ; get back r2
FFFFFFFFFFFFC7EC 31FFF1CC call BCDToAscii
FFFFFFFFFFFFC7F0 E2000003 setlo r8,#3
FFFFFFFFFFFFC7F4 btos2:
FFFFFFFFFFFFC7F4 141180FF andi r3,r1,#0xff
FFFFFFFFFFFFC7F8 6A858C10 sb r3,[r8+r11]
FFFFFFFFFFFFC7FC 06109001 shrui r1,r1,#8
FFFFFFFFFFFFC800 BE047FAF loop r8,btos2
FFFFFFFFFFFFC804 60B00014 sb r0,20[r11] ; null terminate
FFFFFFFFFFFFC808 47E18000 lw r3,[sp]
FFFFFFFFFFFFC80C 47E38008 lw r7,8[sp]
FFFFFFFFFFFFC810 47E40010 lw r8,16[sp]
FFFFFFFFFFFFC814 47E48018 lw r9,24[sp]
FFFFFFFFFFFFC818 47E50020 lw r10,32[sp]
FFFFFFFFFFFFC81C 47E58028 lw r11,40[sp]
FFFFFFFFFFFFC820 47EF8030 lw lr,48[sp]
FFFFFFFFFFFFC824 37EF8038 ret #56
;==============================================================================
; System Monitor Program
;==============================================================================
FFFFFFFFFFFFC258 Monitor:
FFFFFFFFFFFFC258 E6BEFFF8 ; SETLO
FFFFFFFFFFFFC25C 6A0D782D lea sp,STACKTOP0 ; top of stack; reset the stack pointer
FFFFFFFFFFFFC260 6000141C sb r0,KeybdEcho ; turn off keyboard echo
FFFFFFFFFFFFC264 PromptLn:
FFFFFFFFFFFFC264 31FFEFFA call CRLF
FFFFFFFFFFFFC268 E0400024 setlo r1,#'$'
FFFFFFFFFFFFC26C 31FFEF47 call DisplayChar
;
FFFFFFFFFFFFC828 Monitor:
FFFFFFFFFFFFC828 E6BEFFF8 ; SETLO
FFFFFFFFFFFFC82C 6A0D782D lea sp,STACKTOP0 ; top of stack; reset the stack pointer
FFFFFFFFFFFFC830 6000141C sb r0,KeybdEcho ; turn off keyboard echo
FFFFFFFFFFFFC834 PromptLn:
FFFFFFFFFFFFC834 31FFF135 call CRLF
FFFFFFFFFFFFC838 E0400024 setlo r1,#'$'
FFFFFFFFFFFFC83C 31FFF07F call DisplayChar
; Get characters until a CR is keyed
;
FFFFFFFFFFFFC270 Prompt3:
FFFFFFFFFFFFC270 31FFEE08 call KeybdGetChar
FFFFFFFFFFFFC274 B01FFFFF beqi r1,#-1,Prompt3 ; wait for a character
FFFFFFFFFFFFC278 B010030D beqi r1,#CR,Prompt1
FFFFFFFFFFFFC27C 31FFEF47 call DisplayChar
FFFFFFFFFFFFC280 BE007F8A bra Prompt3
FFFFFFFFFFFFC840 Prompt3:
; lw r1,#2 ; get keyboard character
; syscall #417
FFFFFFFFFFFFC840 31FFEF07 call KeybdGetChar
FFFFFFFFFFFFC844 B01FFFFF beqi r1,#-1,Prompt3 ; wait for a character
FFFFFFFFFFFFC848 B010030D beqi r1,#CR,Prompt1
FFFFFFFFFFFFC84C 31FFF07F call DisplayChar
FFFFFFFFFFFFC850 BE007F8A bra Prompt3
; Process the screen line that the CR was keyed on
;
FFFFFFFFFFFFC284 Prompt1:
FFFFFFFFFFFFC284 62001418 sc r0,CursorCol ; go back to the start of the line
FFFFFFFFFFFFC288 31FFEF37 call CalcScreenLoc ; r1 = screen memory location
FFFFFFFFFFFFC28C 04100C09 or r3,r1,r0
FFFFFFFFFFFFC290 82308000 inch r1,[r3]
FFFFFFFFFFFFC294 0A318002 addui r3,r3,#2
FFFFFFFFFFFFC298 31FFEF33 call ScreenToAscii
FFFFFFFFFFFFC29C B2100424 bnei r1,#'$',Prompt2 ; skip over '$' prompt character
FFFFFFFFFFFFC2A0 82308000 inch r1,[r3]
FFFFFFFFFFFFC2A4 0A318002 addui r3,r3,#2
FFFFFFFFFFFFC2A8 31FFEF33 call ScreenToAscii
FFFFFFFFFFFFC854 Prompt1:
FFFFFFFFFFFFC854 60001418 sb r0,CursorCol ; go back to the start of the line
FFFFFFFFFFFFC858 31FFF06F call CalcScreenLoc ; r1 = screen memory location
FFFFFFFFFFFFC85C 02118009 mov r3,r1
FFFFFFFFFFFFC860 82308000 inch r1,[r3]
FFFFFFFFFFFFC864 0A318002 addui r3,r3,#2
FFFFFFFFFFFFC868 31FFF06B call ScreenToAscii
FFFFFFFFFFFFC86C B2100424 bnei r1,#'$',Prompt2 ; skip over '$' prompt character
FFFFFFFFFFFFC870 82308000 inch r1,[r3]
FFFFFFFFFFFFC874 0A318002 addui r3,r3,#2
FFFFFFFFFFFFC878 31FFF06B call ScreenToAscii
; Dispatch based on command character
;
FFFFFFFFFFFFC2AC Prompt2:
FFFFFFFFFFFFC2AC B010563A beqi r1,#':',Editmem ; $: - edit memory
FFFFFFFFFFFFC2B0 B0106344 beqi r1,#'D',Dumpmem ; $D - dump memory
FFFFFFFFFFFFC2B4 B012EF42 beqi r1,#'B',CSTART ; $B - start tiny basic
FFFFFFFFFFFFC2B8 B0105D4A beqi r1,#'J',ExecuteCode ; $J - execute code
FFFFFFFFFFFFC2BC B010914C beqi r1,#'L',LoadS19 ; $L - load S19 file
FFFFFFFFFFFFC2C0 B010153F beqi r1,#'?',DisplayHelp ; $? - display help
FFFFFFFFFFFFC2C4 B0100743 beqi r1,#'C',TestCLS ; $C - clear screen
FFFFFFFFFFFFC2C8 B0100452 beqi r1,#'R',RandomLinesCall
FFFFFFFFFFFFC2CC B012B849 beqi r1,#'I',Invaders
FFFFFFFFFFFFC2D0 B011A350 beqi r1,#'P',Piano
FFFFFFFFFFFFC2D4 BE007C2A bra Monitor
FFFFFFFFFFFFC87C Prompt2:
FFFFFFFFFFFFC87C B0106A3A beqi r1,#':',Editmem ; $: - edit memory
FFFFFFFFFFFFC880 B0107C44 beqi r1,#'D',Dumpmem ; $D - dump memory
FFFFFFFFFFFFC884 B0109446 beqi r1,#'F',Fillmem ; $F - fill memory
FFFFFFFFFFFFC888 Prompt7:
FFFFFFFFFFFFC888 B2100242 bnei r1,#'B',Prompt4 ; $B - start tiny basic
FFFFFFFFFFFFC88C 33FFF7E0 jmp CSTART
FFFFFFFFFFFFC890 Prompt4:
FFFFFFFFFFFFC890 B0106F4A beqi r1,#'J',ExecuteCode ; $J - execute code
FFFFFFFFFFFFC894 B210024C bnei r1,#'L',Prompt9 ; $L - load S19 file
FFFFFFFFFFFFC898 33FFF297 jmp LoadSector
FFFFFFFFFFFFC89C Prompt9:
FFFFFFFFFFFFC89C B210043F bnei r1,#'?',Prompt10 ; $? - display help
FFFFFFFFFFFFC8A0 9A00C910 lea r1,HelpMsg
FFFFFFFFFFFFC8A4 31FFF122 call DisplayString
FFFFFFFFFFFFC8A8 33FFF20A jmp Monitor
FFFFFFFFFFFFC8AC Prompt10:
FFFFFFFFFFFFC8AC B0100C43 beqi r1,#'C',TestCLS ; $C - clear screen
FFFFFFFFFFFFC8B0 B2100252 bnei r1,#'R',Prompt12
FFFFFFFFFFFFC8B4 33FFF235 jmp RandomLinesCall
FFFFFFFFFFFFC8B8 Prompt12:
FFFFFFFFFFFFC8B8 B2100249 bnei r1,#'I',Prompt13
FFFFFFFFFFFFC8BC 33FFF528 jmp Invaders
FFFFFFFFFFFFC8C0 Prompt13:
FFFFFFFFFFFFC8C0 B2100250 bnei r1,#'P',Prompt14
FFFFFFFFFFFFC8C4 33FFF411 jmp Piano
FFFFFFFFFFFFC8C8 Prompt14:
FFFFFFFFFFFFC8C8 B2100254 bnei r1,#'T',Prompt15
FFFFFFFFFFFFC8CC 31FFEF53 call tmp_read
FFFFFFFFFFFFC8D0 Prompt15:
FFFFFFFFFFFFC8D0 33FFF20A jmp Monitor
FFFFFFFFFFFFC2D8 RandomLinesCall:
FFFFFFFFFFFFC2D8 31FFF1BC call RandomLines
FFFFFFFFFFFFC2DC BE007BEA bra Monitor
FFFFFFFFFFFFC8D4 RandomLinesCall:
FFFFFFFFFFFFC8D4 31FFF374 call RandomLines
FFFFFFFFFFFFC8D8 33FFF20A jmp Monitor
FFFFFFFFFFFFC2E0 TestCLS:
FFFFFFFFFFFFC2E0 82308000 inch r1,[r3]
FFFFFFFFFFFFC2E4 0A318002 addui r3,r3,#2
FFFFFFFFFFFFC2E8 31FFEF33 call ScreenToAscii
FFFFFFFFFFFFC2EC B21FDB4C bnei r1,#'L',Monitor
FFFFFFFFFFFFC2F0 82308000 inch r1,[r3]
FFFFFFFFFFFFC2F4 0A318002 addui r3,r3,#2
FFFFFFFFFFFFC2F8 31FFEF33 call ScreenToAscii
FFFFFFFFFFFFC2FC B21FD753 bnei r1,#'S',Monitor
FFFFFFFFFFFFC300 31FFEED9 call ClearScreen
FFFFFFFFFFFFC304 60001418 sb r0,CursorCol
FFFFFFFFFFFFC308 60001416 sb r0,CursorRow
FFFFFFFFFFFFC30C 31FFEF37 call CalcScreenLoc
FFFFFFFFFFFFC310 BE007A4A bra Monitor
FFFFFFFFFFFFC8DC TestCLS:
FFFFFFFFFFFFC8DC 82308000 inch r1,[r3]
FFFFFFFFFFFFC8E0 0A318002 addui r3,r3,#2
FFFFFFFFFFFFC8E4 31FFF06B call ScreenToAscii
FFFFFFFFFFFFC8E8 B21FD04C bnei r1,#'L',Monitor
FFFFFFFFFFFFC8EC 82308000 inch r1,[r3]
FFFFFFFFFFFFC8F0 0A318002 addui r3,r3,#2
FFFFFFFFFFFFC8F4 31FFF06B call ScreenToAscii
FFFFFFFFFFFFC8F8 B21FCC53 bnei r1,#'S',Monitor
FFFFFFFFFFFFC8FC 31FFF011 call ClearScreen
FFFFFFFFFFFFC900 60001418 sb r0,CursorCol
FFFFFFFFFFFFC904 60001417 sb r0,CursorRow
FFFFFFFFFFFFC908 31FFF06F call CalcScreenLoc
FFFFFFFFFFFFC90C 33FFF20A jmp Monitor
FFFFFFFFFFFFC314 DisplayHelp:
FFFFFFFFFFFFC314 E07FC320 setlo r1,HelpMsg
FFFFFFFFFFFFC318 31FFEFE7 call DisplayString
FFFFFFFFFFFFC31C BE0079EA bra Monitor
FFFFFFFFFFFFC910 HelpMsg:
FFFFFFFFFFFFC910 70736944203D203F db "? = Display help",CR,LF
FFFFFFFFFFFFC918 706C65682079616C
FFFFFFFFFFFFC920 203D20534C430A0D db "CLS = clear screen",CR,LF
FFFFFFFFFFFFC928 6373207261656C63
FFFFFFFFFFFFC930 203A0A0D6E656572 db ": = Edit memory bytes",CR,LF
FFFFFFFFFFFFC938 6D2074696445203D
FFFFFFFFFFFFC940 79622079726F6D65
FFFFFFFFFFFFC948 3D204C0A0D736574 db "L = Load S19 file",CR,LF
FFFFFFFFFFFFC950 31532064616F4C20
FFFFFFFFFFFFC958 0A0D656C69662039
FFFFFFFFFFFFC960 7C487C437C425B44 db "D[B|C|H|W] = Dump memory",CR,LF
FFFFFFFFFFFFC968 6D7544203D205D57
FFFFFFFFFFFFC970 79726F6D656D2070
FFFFFFFFFFFFC978 7C437C425B460A0D db "F[B|C|H|W] = Fill memory",CR,LF
FFFFFFFFFFFFC980 46203D205D577C48
FFFFFFFFFFFFC988 6F6D656D206C6C69
FFFFFFFFFFFFC990 203D20420A0D7972 db "B = start tiny basic",CR,LF
FFFFFFFFFFFFC998 6974207472617473
FFFFFFFFFFFFC9A0 636973616220796E
FFFFFFFFFFFFC9A8 754A203D204A0A0D db "J = Jump to code",CR,LF
FFFFFFFFFFFFC9B0 6F63206F7420706D
FFFFFFFFFFFFC9B8 203D20490A0D6564 db "I = Invaders",CR,LF
FFFFFFFFFFFFC9C0 7372656461766E49
FFFFFFFFFFFFC9C8 6152203D20520A0D db "R = Random lines",CR,LF
FFFFFFFFFFFFC9D0 6E696C206D6F646E
FFFFFFFFFFFFC9D8 203D20540A0D7365 db "T = get temperature",CR,LF
FFFFFFFFFFFFC9E0 706D657420746567
FFFFFFFFFFFFC9E8 0D65727574617265
FFFFFFFFFFFFC9F0 616950203D20500A db "P = Piano",CR,LF,0
FFFFFFFFFFFFC9F8 000000000A0D6F6E align 4
FFFFFFFFFFFFCA00 align 4
FFFFFFFFFFFFC320 align 16
FFFFFFFFFFFFC320 HelpMsg:
FFFFFFFFFFFFC320 70736944203D203F db "? = Display help",CR,LF
FFFFFFFFFFFFC328 706C65682079616C
FFFFFFFFFFFFC330 203D20534C430A0D db "CLS = clear screen",CR,LF
FFFFFFFFFFFFC338 6373207261656C63
FFFFFFFFFFFFC340 203A0A0D6E656572 db ": = Edit memory bytes",CR,LF
FFFFFFFFFFFFC348 6D2074696445203D
FFFFFFFFFFFFC350 79622079726F6D65
FFFFFFFFFFFFC358 3D204C0A0D736574 db "L = Load S19 file",CR,LF
FFFFFFFFFFFFC360 31532064616F4C20
FFFFFFFFFFFFC368 0A0D656C69662039
FFFFFFFFFFFFC370 706D7544203D2044 db "D = Dump memory",CR,LF
FFFFFFFFFFFFC378 0D79726F6D656D20
FFFFFFFFFFFFC380 617473203D20420A db "B = start tiny basic",CR,LF
FFFFFFFFFFFFC388 20796E6974207472
FFFFFFFFFFFFC390 4A0A0D6369736162 db "J = Jump to code",CR,LF
FFFFFFFFFFFFC398 20706D754A203D20
FFFFFFFFFFFFC3A0 0D65646F63206F74
FFFFFFFFFFFFC3A8 766E49203D20490A db "I = Invaders",CR,LF
FFFFFFFFFFFFC3B0 520A0D7372656461 db "R = Random lines",CR,LF
FFFFFFFFFFFFC3B8 6F646E6152203D20
FFFFFFFFFFFFC3C0 0D73656E696C206D
FFFFFFFFFFFFC3C8 616950203D20500A db "P = Piano",CR,LF,0
FFFFFFFFFFFFC3D0 000000000A0D6F6E align 16
FFFFFFFFFFFFC3D8 0000000000000000
FFFFFFFFFFFFC3E0 align 16
;------------------------------------------------------------------------------
; Ignore blanks in the input
; r3 = text pointer
1955,64 → 2621,133
; r1 destroyed
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFC3E0 ignBlanks:
FFFFFFFFFFFFC3E0 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFC3E4 67EF8000 sw r31,[sp]
FFFFFFFFFFFFC3E8 ignBlanks1:
FFFFFFFFFFFFC3E8 82308000 inch r1,[r3]
FFFFFFFFFFFFC3EC 0A318002 addui r3,r3,#2
FFFFFFFFFFFFC3F0 31FFEF33 call ScreenToAscii
FFFFFFFFFFFFC3F4 B01FFD20 beqi r1,#' ',ignBlanks1
FFFFFFFFFFFFC3F8 0E318002 subui r3,r3,#2
FFFFFFFFFFFFC3FC 47EF8000 lw r31,[sp]
FFFFFFFFFFFFC400 37EF8008 ret #8
FFFFFFFFFFFFCA00 ignBlanks:
FFFFFFFFFFFFCA00 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFCA04 67EF8000 sw r31,[sp]
FFFFFFFFFFFFCA08 ignBlanks1:
FFFFFFFFFFFFCA08 82308000 inch r1,[r3]
FFFFFFFFFFFFCA0C 0A318002 addui r3,r3,#2
FFFFFFFFFFFFCA10 31FFF06B call ScreenToAscii
FFFFFFFFFFFFCA14 B01FFD20 beqi r1,#' ',ignBlanks1
FFFFFFFFFFFFCA18 0E318002 subui r3,r3,#2
FFFFFFFFFFFFCA1C 47EF8000 lw r31,[sp]
FFFFFFFFFFFFCA20 37EF8008 ret #8
;------------------------------------------------------------------------------
; Edit memory byte(s).
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFC404 EditMem:
FFFFFFFFFFFFC404 31FFF0F8 call ignBlanks
FFFFFFFFFFFFC408 31FFF11C call GetHexNumber
FFFFFFFFFFFFC40C 04101409 or r5,r1,r0
FFFFFFFFFFFFC410 E1000007 setlo r4,#7
FFFFFFFFFFFFC414 edtmem1:
FFFFFFFFFFFFC414 31FFF0F8 call ignBlanks
FFFFFFFFFFFFC418 31FFF11C call GetHexNumber
FFFFFFFFFFFFC41C 60508000 sb r1,[r5]
FFFFFFFFFFFFC420 0A528001 addui r5,r5,#1
FFFFFFFFFFFFC424 BE027F8F loop r4,edtmem1
FFFFFFFFFFFFC428 BE00718A bra Monitor
FFFFFFFFFFFFCA24 EditMem:
FFFFFFFFFFFFCA24 31FFF280 call ignBlanks
FFFFFFFFFFFFCA28 31FFF2D4 call GetHexNumber
FFFFFFFFFFFFCA2C 04101409 or r5,r1,r0
FFFFFFFFFFFFCA30 E1000007 setlo r4,#7
FFFFFFFFFFFFCA34 edtmem1:
FFFFFFFFFFFFCA34 31FFF280 call ignBlanks
FFFFFFFFFFFFCA38 31FFF2D4 call GetHexNumber
FFFFFFFFFFFFCA3C 60508000 sb r1,[r5]
FFFFFFFFFFFFCA40 0A528001 addui r5,r5,#1
FFFFFFFFFFFFCA44 BE027F8F loop r4,edtmem1
FFFFFFFFFFFFCA48 33FFF20A jmp Monitor
;------------------------------------------------------------------------------
; Execute code at the specified address.
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFC42C ExecuteCode:
FFFFFFFFFFFFC42C 31FFF0F8 call ignBlanks
FFFFFFFFFFFFC430 31FFF11C call GetHexNumber
FFFFFFFFFFFFC434 341F8000 jal r31,[r1]
FFFFFFFFFFFFC438 BE00710A bra Monitor
FFFFFFFFFFFFCA4C ExecuteCode:
FFFFFFFFFFFFCA4C 31FFF280 call ignBlanks
FFFFFFFFFFFFCA50 31FFF2D4 call GetHexNumber
FFFFFFFFFFFFCA54 341F8000 jal r31,[r1]
FFFFFFFFFFFFCA58 33FFF20A jmp Monitor
FFFFFFFFFFFFCA5C LoadSector:
FFFFFFFFFFFFCA5C 31FFF280 call ignBlanks
FFFFFFFFFFFFCA60 31FFF2D4 call GetHexNumber
FFFFFFFFFFFFCA64 16013800 lw r2,#0x3800
FFFFFFFFFFFFCA68 31FFF56D call spi_read_sector
FFFFFFFFFFFFCA6C 33FFF20A jmp Monitor
;------------------------------------------------------------------------------
; Do a memory dump of the requested location.
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFC43C DumpMem:
FFFFFFFFFFFFC43C 31FFF0F8 call ignBlanks
FFFFFFFFFFFFC440 31FFF11C call GetHexNumber
FFFFFFFFFFFFC444 02110009 mov r2,r1
FFFFFFFFFFFFC448 31FFEFFA call CRLF
FFFFFFFFFFFFC44C 31FFF025 call DisplayMem
FFFFFFFFFFFFC450 31FFF025 call DisplayMem
FFFFFFFFFFFFC454 31FFF025 call DisplayMem
FFFFFFFFFFFFC458 31FFF025 call DisplayMem
FFFFFFFFFFFFC45C 31FFF025 call DisplayMem
FFFFFFFFFFFFC460 31FFF025 call DisplayMem
FFFFFFFFFFFFC464 31FFF025 call DisplayMem
FFFFFFFFFFFFC468 31FFF025 call DisplayMem
FFFFFFFFFFFFC46C BE006F6A bra Monitor
FFFFFFFFFFFFCA70 DumpMem:
FFFFFFFFFFFFCA70 82308000 inch r1,[r3]
FFFFFFFFFFFFCA74 0A318002 addui r3,r3,#2
FFFFFFFFFFFFCA78 31FFF06B call ScreenToAscii
FFFFFFFFFFFFCA7C 02130009 mov r6,r1 ; r6 = fill type character
FFFFFFFFFFFFCA80 31FFF280 call ignBlanks
FFFFFFFFFFFFCA84 31FFF2D4 call GetHexNumber ; get start address of dump
FFFFFFFFFFFFCA88 02110009 mov r2,r1
FFFFFFFFFFFFCA8C 31FFF280 call ignBlanks
FFFFFFFFFFFFCA90 31FFF2D4 call GetHexNumber ; get number of bytes to dump
FFFFFFFFFFFFCA94 06108601 shrui r1,r1,#3 ; 1/8 as many dump rows
FFFFFFFFFFFFCA98 B2100200 bnei r1,#0,Dumpmem2
FFFFFFFFFFFFCA9C 16008001 lw r1,#1 ; dump at least one row
FFFFFFFFFFFFCAA0 Dumpmem2:
FFFFFFFFFFFFCAA0 31FFF135 call CRLF
FFFFFFFFFFFFCAA4 B0600857 beqi r6,#'W',DumpmemW
; beqi r6,#'H',DumpmemH
FFFFFFFFFFFFCAA8 B0600443 beqi r6,#'C',DumpmemC
FFFFFFFFFFFFCAAC DumpmemB:
FFFFFFFFFFFFCAAC 31FFF175 call DisplayMemB
FFFFFFFFFFFFCAB0 BE00FFEF loop r1,DumpmemB
FFFFFFFFFFFFCAB4 33FFF20A jmp Monitor
FFFFFFFFFFFFCAB8 DumpmemC:
FFFFFFFFFFFFCAB8 31FFF189 call DisplayMemC
FFFFFFFFFFFFCABC BE00FFEF loop r1,DumpmemC
FFFFFFFFFFFFCAC0 33FFF20A jmp Monitor
FFFFFFFFFFFFCAC4 DumpmemW:
FFFFFFFFFFFFCAC4 31FFF19D call DisplayMemW
FFFFFFFFFFFFCAC8 BE00FFEF loop r1,DumpmemW
FFFFFFFFFFFFCACC 33FFF20A jmp Monitor
; call DisplayMem
; call DisplayMem
; call DisplayMem
; call DisplayMem
; call DisplayMem
; call DisplayMem
; call DisplayMem
FFFFFFFFFFFFCAD0 BE006ACA bra Monitor
FFFFFFFFFFFFCAD4 Fillmem:
FFFFFFFFFFFFCAD4 82308000 inch r1,[r3]
FFFFFFFFFFFFCAD8 0A318002 addui r3,r3,#2
FFFFFFFFFFFFCADC 31FFF06B call ScreenToAscii
FFFFFFFFFFFFCAE0 02130009 mov r6,r1 ; r6 = fill type character
FFFFFFFFFFFFCAE4 31FFF280 call ignBlanks
FFFFFFFFFFFFCAE8 31FFF2D4 call GetHexNumber ; get start address of dump
FFFFFFFFFFFFCAEC 02110009 mov r2,r1
FFFFFFFFFFFFCAF0 31FFF280 call ignBlanks
FFFFFFFFFFFFCAF4 31FFF2D4 call GetHexNumber ; get number of bytes to fill
FFFFFFFFFFFFCAF8 02128009 mov r5,r1
FFFFFFFFFFFFCAFC 31FFF280 call ignBlanks
FFFFFFFFFFFFCB00 31FFF2D4 call GetHexNumber ; get the fill byte
FFFFFFFFFFFFCB04 B0600743 beqi r6,#'C',FillmemC
FFFFFFFFFFFFCB08 B0600A48 beqi r6,#'H',FillmemH
FFFFFFFFFFFFCB0C B0600D57 beqi r6,#'W',FillmemW
FFFFFFFFFFFFCB10 FillmemB:
FFFFFFFFFFFFCB10 60208000 sb r1,[r2]
FFFFFFFFFFFFCB14 0A210001 addui r2,r2,#1
FFFFFFFFFFFFCB18 BE02FFCF loop r5,FillmemB
FFFFFFFFFFFFCB1C 33FFF20A jmp Monitor
FFFFFFFFFFFFCB20 FillmemC:
FFFFFFFFFFFFCB20 62208000 sc r1,[r2]
FFFFFFFFFFFFCB24 0A210002 addui r2,r2,#2
FFFFFFFFFFFFCB28 BE02FFCF loop r5,FillmemC
FFFFFFFFFFFFCB2C 33FFF20A jmp Monitor
FFFFFFFFFFFFCB30 FillmemH:
FFFFFFFFFFFFCB30 64208000 sh r1,[r2]
FFFFFFFFFFFFCB34 0A210004 addui r2,r2,#4
FFFFFFFFFFFFCB38 BE02FFCF loop r5,FillmemH
FFFFFFFFFFFFCB3C 33FFF20A jmp Monitor
FFFFFFFFFFFFCB40 FillmemW:
FFFFFFFFFFFFCB40 66208000 sw r1,[r2]
FFFFFFFFFFFFCB44 0A210008 addui r2,r2,#8
FFFFFFFFFFFFCB48 BE02FFCF loop r5,FillmemW
FFFFFFFFFFFFCB4C 33FFF20A jmp Monitor
;------------------------------------------------------------------------------
; Get a hexidecimal number. Maximum of sixteen digits.
; R3 = text pointer (updated)
2019,29 → 2754,29
; R1 = hex number
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFC470 GetHexNumber:
FFFFFFFFFFFFC470 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFC474 67E10000 sw r2,[sp]
FFFFFFFFFFFFC478 67E20008 sw r4,8[sp]
FFFFFFFFFFFFC47C 67EF8010 sw lr,16[sp]
FFFFFFFFFFFFC480 E0800000 setlo r2,#0
FFFFFFFFFFFFC484 E100000F setlo r4,#15
FFFFFFFFFFFFC488 gthxn2:
FFFFFFFFFFFFC488 82308000 inch r1,[r3]
FFFFFFFFFFFFC48C 0A318002 addui r3,r3,#2
FFFFFFFFFFFFC490 31FFEF33 call ScreenToAscii
FFFFFFFFFFFFC494 31FFF130 call AsciiToHexNybble
FFFFFFFFFFFFC498 B01005FF beqi r1,#-1,gthxn1
FFFFFFFFFFFFC49C 06210800 shli r2,r2,#4
FFFFFFFFFFFFC4A0 1410800F andi r1,r1,#0x0f
FFFFFFFFFFFFC4A4 04208809 or r2,r2,r1
FFFFFFFFFFFFC4A8 BE027F0F loop r4,gthxn2
FFFFFFFFFFFFC4AC gthxn1:
FFFFFFFFFFFFC4AC 02208009 mov r1,r2
FFFFFFFFFFFFC4B0 47EF8010 lw lr,16[sp]
FFFFFFFFFFFFC4B4 47E20008 lw r4,8[sp]
FFFFFFFFFFFFC4B8 47E10000 lw r2,[sp]
FFFFFFFFFFFFC4BC 37EF8018 ret #24
FFFFFFFFFFFFCB50 GetHexNumber:
FFFFFFFFFFFFCB50 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFCB54 67E10000 sw r2,[sp]
FFFFFFFFFFFFCB58 67E20008 sw r4,8[sp]
FFFFFFFFFFFFCB5C 67EF8010 sw lr,16[sp]
FFFFFFFFFFFFCB60 E0800000 setlo r2,#0
FFFFFFFFFFFFCB64 E100000F setlo r4,#15
FFFFFFFFFFFFCB68 gthxn2:
FFFFFFFFFFFFCB68 82308000 inch r1,[r3]
FFFFFFFFFFFFCB6C 0A318002 addui r3,r3,#2
FFFFFFFFFFFFCB70 31FFF06B call ScreenToAscii
FFFFFFFFFFFFCB74 31FFF2E8 call AsciiToHexNybble
FFFFFFFFFFFFCB78 B01005FF beqi r1,#-1,gthxn1
FFFFFFFFFFFFCB7C 06210800 shli r2,r2,#4
FFFFFFFFFFFFCB80 1410800F andi r1,r1,#0x0f
FFFFFFFFFFFFCB84 04208809 or r2,r2,r1
FFFFFFFFFFFFCB88 BE027F0F loop r4,gthxn2
FFFFFFFFFFFFCB8C gthxn1:
FFFFFFFFFFFFCB8C 02208009 mov r1,r2
FFFFFFFFFFFFCB90 47EF8010 lw lr,16[sp]
FFFFFFFFFFFFCB94 47E20008 lw r4,8[sp]
FFFFFFFFFFFFCB98 47E10000 lw r2,[sp]
FFFFFFFFFFFFCB9C 37EF8018 ret #24
;------------------------------------------------------------------------------
; Convert ASCII character in the range '0' to '9', 'a' to 'f' or 'A' to 'F'
2048,167 → 2783,167
; to a hex nybble.
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFC4C0 AsciiToHexNybble:
FFFFFFFFFFFFC4C0 A8100E30 bltui r1,#'0',gthx3
FFFFFFFFFFFFC4C4 AE100339 bgtui r1,#'9',gthx5
FFFFFFFFFFFFC4C8 0E108030 subui r1,r1,#'0'
FFFFFFFFFFFFC4CC 37EF8000 ret
FFFFFFFFFFFFC4D0 gthx5:
FFFFFFFFFFFFC4D0 A8100A41 bltui r1,#'A',gthx3
FFFFFFFFFFFFC4D4 AE100446 bgtui r1,#'F',gthx6
FFFFFFFFFFFFC4D8 0E108041 subui r1,r1,#'A'
FFFFFFFFFFFFC4DC 0A10800A addui r1,r1,#10
FFFFFFFFFFFFC4E0 37EF8000 ret
FFFFFFFFFFFFC4E4 gthx6:
FFFFFFFFFFFFC4E4 A8100561 bltui r1,#'a',gthx3
FFFFFFFFFFFFC4E8 AE100466 bgtui r1,#'f',gthx3
FFFFFFFFFFFFC4EC 0E108061 subui r1,r1,#'a'
FFFFFFFFFFFFC4F0 0A10800A addui r1,r1,#10
FFFFFFFFFFFFC4F4 37EF8000 ret
FFFFFFFFFFFFC4F8 gthx3:
FFFFFFFFFFFFC4F8 E07FFFFF setlo r1,#-1 ; not a hex number
FFFFFFFFFFFFC4FC 37EF8000 ret
FFFFFFFFFFFFCBA0 AsciiToHexNybble:
FFFFFFFFFFFFCBA0 A8100E30 bltui r1,#'0',gthx3
FFFFFFFFFFFFCBA4 AE100339 bgtui r1,#'9',gthx5
FFFFFFFFFFFFCBA8 0E108030 subui r1,r1,#'0'
FFFFFFFFFFFFCBAC 37EF8000 ret
FFFFFFFFFFFFCBB0 gthx5:
FFFFFFFFFFFFCBB0 A8100A41 bltui r1,#'A',gthx3
FFFFFFFFFFFFCBB4 AE100446 bgtui r1,#'F',gthx6
FFFFFFFFFFFFCBB8 0E108041 subui r1,r1,#'A'
FFFFFFFFFFFFCBBC 0A10800A addui r1,r1,#10
FFFFFFFFFFFFCBC0 37EF8000 ret
FFFFFFFFFFFFCBC4 gthx6:
FFFFFFFFFFFFCBC4 A8100561 bltui r1,#'a',gthx3
FFFFFFFFFFFFCBC8 AE100466 bgtui r1,#'f',gthx3
FFFFFFFFFFFFCBCC 0E108061 subui r1,r1,#'a'
FFFFFFFFFFFFCBD0 0A10800A addui r1,r1,#10
FFFFFFFFFFFFCBD4 37EF8000 ret
FFFFFFFFFFFFCBD8 gthx3:
FFFFFFFFFFFFCBD8 E07FFFFF setlo r1,#-1 ; not a hex number
FFFFFFFFFFFFCBDC 37EF8000 ret
;==============================================================================
; Load an S19 format file
;==============================================================================
;
FFFFFFFFFFFFC500 LoadS19:
FFFFFFFFFFFFC500 BE00006A bra ProcessRec
FFFFFFFFFFFFC504 NextRec:
FFFFFFFFFFFFC504 31FFF1B2 call sGetChar
FFFFFFFFFFFFC508 B21FFF0A bne r1,#LF,NextRec
FFFFFFFFFFFFC50C ProcessRec:
FFFFFFFFFFFFC50C 31FFF1B2 call sGetChar
FFFFFFFFFFFFC510 B01F521A beqi r1,#26,Monitor ; CTRL-Z ?
FFFFFFFFFFFFC514 B21FFC53 bnei r1,#'S',NextRec
FFFFFFFFFFFFC518 31FFF1B2 call sGetChar
FFFFFFFFFFFFC51C A01FFA30 blt r1,#'0',NextRec
FFFFFFFFFFFFC520 A61FF939 bgt r1,#'9',NextRec
FFFFFFFFFFFFC524 04101009 or r4,r1,r0 ; r4 = record type
FFFFFFFFFFFFC528 31FFF1B2 call sGetChar
FFFFFFFFFFFFC52C 31FFF130 call AsciiToHexNybble
FFFFFFFFFFFFC530 04100809 or r2,r1,r0
FFFFFFFFFFFFC534 31FFF1B2 call sGetChar
FFFFFFFFFFFFC538 31FFF130 call AsciiToHexNybble
FFFFFFFFFFFFC53C 06210800 shli r2,r2,#4
FFFFFFFFFFFFC540 04208809 or r2,r2,r1 ; r2 = byte count
FFFFFFFFFFFFC544 04208C09 or r3,r2,r1 ; r3 = byte count
FFFFFFFFFFFFC548 B04FEF30 beqi r4,#'0',NextRec ; manufacturer ID record, ignore
FFFFFFFFFFFFC54C B0401E31 beqi r4,#'1',ProcessS1
FFFFFFFFFFFFC550 B0401F32 beqi r4,#'2',ProcessS2
FFFFFFFFFFFFC554 B0402033 beqi r4,#'3',ProcessS3
FFFFFFFFFFFFC558 B04FEB35 beqi r4,#'5',NextRec ; record count record, ignore
FFFFFFFFFFFFC55C B0402037 beqi r4,#'7',ProcessS7
FFFFFFFFFFFFC560 B0402238 beqi r4,#'8',ProcessS8
FFFFFFFFFFFFC564 B0402439 beqi r4,#'9',ProcessS9
FFFFFFFFFFFFC568 BE007CEA bra NextRec
FFFFFFFFFFFFCBE0 LoadS19:
FFFFFFFFFFFFCBE0 BE00006A bra ProcessRec
FFFFFFFFFFFFCBE4 NextRec:
FFFFFFFFFFFFCBE4 31FFF36A call sGetChar
FFFFFFFFFFFFCBE8 B21FFF0A bne r1,#LF,NextRec
FFFFFFFFFFFFCBEC ProcessRec:
FFFFFFFFFFFFCBEC 31FFF36A call sGetChar
FFFFFFFFFFFFCBF0 B01F0E1A beqi r1,#26,Monitor ; CTRL-Z ?
FFFFFFFFFFFFCBF4 B21FFC53 bnei r1,#'S',NextRec
FFFFFFFFFFFFCBF8 31FFF36A call sGetChar
FFFFFFFFFFFFCBFC A01FFA30 blt r1,#'0',NextRec
FFFFFFFFFFFFCC00 A61FF939 bgt r1,#'9',NextRec
FFFFFFFFFFFFCC04 04101009 or r4,r1,r0 ; r4 = record type
FFFFFFFFFFFFCC08 31FFF36A call sGetChar
FFFFFFFFFFFFCC0C 31FFF2E8 call AsciiToHexNybble
FFFFFFFFFFFFCC10 04100809 or r2,r1,r0
FFFFFFFFFFFFCC14 31FFF36A call sGetChar
FFFFFFFFFFFFCC18 31FFF2E8 call AsciiToHexNybble
FFFFFFFFFFFFCC1C 06210800 shli r2,r2,#4
FFFFFFFFFFFFCC20 04208809 or r2,r2,r1 ; r2 = byte count
FFFFFFFFFFFFCC24 04208C09 or r3,r2,r1 ; r3 = byte count
FFFFFFFFFFFFCC28 B04FEF30 beqi r4,#'0',NextRec ; manufacturer ID record, ignore
FFFFFFFFFFFFCC2C B0401E31 beqi r4,#'1',ProcessS1
FFFFFFFFFFFFCC30 B0401F32 beqi r4,#'2',ProcessS2
FFFFFFFFFFFFCC34 B0402033 beqi r4,#'3',ProcessS3
FFFFFFFFFFFFCC38 B04FEB35 beqi r4,#'5',NextRec ; record count record, ignore
FFFFFFFFFFFFCC3C B0402037 beqi r4,#'7',ProcessS7
FFFFFFFFFFFFCC40 B0402238 beqi r4,#'8',ProcessS8
FFFFFFFFFFFFCC44 B0402439 beqi r4,#'9',ProcessS9
FFFFFFFFFFFFCC48 BE007CEA bra NextRec
FFFFFFFFFFFFC56C pcssxa:
FFFFFFFFFFFFC56C 143180FF andi r3,r3,#0xff
FFFFFFFFFFFFC570 0E318001 subui r3,r3,#1 ; one less for loop
FFFFFFFFFFFFC574 pcss1a:
FFFFFFFFFFFFC574 31FFF1B2 call sGetChar
FFFFFFFFFFFFC578 31FFF130 call AsciiToHexNybble
FFFFFFFFFFFFC57C 06210800 shli r2,r2,#4
FFFFFFFFFFFFC580 04208809 or r2,r2,r1
FFFFFFFFFFFFC584 31FFF1B2 call sGetChar
FFFFFFFFFFFFC588 31FFF130 call AsciiToHexNybble
FFFFFFFFFFFFC58C 06210800 shli r2,r2,#4
FFFFFFFFFFFFC590 04208809 or r2,r2,r1
FFFFFFFFFFFFC594 60510000 sb r2,[r5]
FFFFFFFFFFFFC598 0A528001 addui r5,r5,#1
FFFFFFFFFFFFC59C BE01FECF loop r3,pcss1a
FFFFFFFFFFFFCC4C pcssxa:
FFFFFFFFFFFFCC4C 143180FF andi r3,r3,#0xff
FFFFFFFFFFFFCC50 0E318001 subui r3,r3,#1 ; one less for loop
FFFFFFFFFFFFCC54 pcss1a:
FFFFFFFFFFFFCC54 31FFF36A call sGetChar
FFFFFFFFFFFFCC58 31FFF2E8 call AsciiToHexNybble
FFFFFFFFFFFFCC5C 06210800 shli r2,r2,#4
FFFFFFFFFFFFCC60 04208809 or r2,r2,r1
FFFFFFFFFFFFCC64 31FFF36A call sGetChar
FFFFFFFFFFFFCC68 31FFF2E8 call AsciiToHexNybble
FFFFFFFFFFFFCC6C 06210800 shli r2,r2,#4
FFFFFFFFFFFFCC70 04208809 or r2,r2,r1
FFFFFFFFFFFFCC74 60510000 sb r2,[r5]
FFFFFFFFFFFFCC78 0A528001 addui r5,r5,#1
FFFFFFFFFFFFCC7C BE01FECF loop r3,pcss1a
; Get the checksum byte
FFFFFFFFFFFFC5A0 31FFF1B2 call sGetChar
FFFFFFFFFFFFC5A4 31FFF130 call AsciiToHexNybble
FFFFFFFFFFFFC5A8 06210800 shli r2,r2,#4
FFFFFFFFFFFFC5AC 04208809 or r2,r2,r1
FFFFFFFFFFFFC5B0 31FFF1B2 call sGetChar
FFFFFFFFFFFFC5B4 31FFF130 call AsciiToHexNybble
FFFFFFFFFFFFC5B8 06210800 shli r2,r2,#4
FFFFFFFFFFFFC5BC 04208809 or r2,r2,r1
FFFFFFFFFFFFC5C0 BE007A2A bra NextRec
FFFFFFFFFFFFCC80 31FFF36A call sGetChar
FFFFFFFFFFFFCC84 31FFF2E8 call AsciiToHexNybble
FFFFFFFFFFFFCC88 06210800 shli r2,r2,#4
FFFFFFFFFFFFCC8C 04208809 or r2,r2,r1
FFFFFFFFFFFFCC90 31FFF36A call sGetChar
FFFFFFFFFFFFCC94 31FFF2E8 call AsciiToHexNybble
FFFFFFFFFFFFCC98 06210800 shli r2,r2,#4
FFFFFFFFFFFFCC9C 04208809 or r2,r2,r1
FFFFFFFFFFFFCCA0 BE007A2A bra NextRec
FFFFFFFFFFFFC5C4 ProcessS1:
FFFFFFFFFFFFC5C4 31FFF180 call S19Get16BitAddress
FFFFFFFFFFFFC5C8 BE007D2A bra pcssxa
FFFFFFFFFFFFC5CC ProcessS2:
FFFFFFFFFFFFC5CC 31FFF186 call S19Get24BitAddress
FFFFFFFFFFFFC5D0 BE007CEA bra pcssxa
FFFFFFFFFFFFC5D4 ProcessS3:
FFFFFFFFFFFFC5D4 31FFF18C call S19Get32BitAddress
FFFFFFFFFFFFC5D8 BE007CAA bra pcssxa
FFFFFFFFFFFFC5DC ProcessS7:
FFFFFFFFFFFFC5DC 31FFF18C call S19Get32BitAddress
FFFFFFFFFFFFC5E0 66028000 sw r5,S19StartAddress
FFFFFFFFFFFFC5E4 BE0063AA bra Monitor
FFFFFFFFFFFFC5E8 ProcessS8:
FFFFFFFFFFFFC5E8 31FFF186 call S19Get24BitAddress
FFFFFFFFFFFFC5EC 66028000 sw r5,S19StartAddress
FFFFFFFFFFFFC5F0 BE00634A bra Monitor
FFFFFFFFFFFFC5F4 ProcessS9:
FFFFFFFFFFFFC5F4 31FFF180 call S19Get16BitAddress
FFFFFFFFFFFFC5F8 66028000 sw r5,S19StartAddress
FFFFFFFFFFFFC5FC BE0062EA bra Monitor
FFFFFFFFFFFFCCA4 ProcessS1:
FFFFFFFFFFFFCCA4 31FFF338 call S19Get16BitAddress
FFFFFFFFFFFFCCA8 BE007D2A bra pcssxa
FFFFFFFFFFFFCCAC ProcessS2:
FFFFFFFFFFFFCCAC 31FFF33E call S19Get24BitAddress
FFFFFFFFFFFFCCB0 BE007CEA bra pcssxa
FFFFFFFFFFFFCCB4 ProcessS3:
FFFFFFFFFFFFCCB4 31FFF344 call S19Get32BitAddress
FFFFFFFFFFFFCCB8 BE007CAA bra pcssxa
FFFFFFFFFFFFCCBC ProcessS7:
FFFFFFFFFFFFCCBC 31FFF344 call S19Get32BitAddress
FFFFFFFFFFFFCCC0 66028000 sw r5,S19StartAddress
FFFFFFFFFFFFCCC4 BE005B2A bra Monitor
FFFFFFFFFFFFCCC8 ProcessS8:
FFFFFFFFFFFFCCC8 31FFF33E call S19Get24BitAddress
FFFFFFFFFFFFCCCC 66028000 sw r5,S19StartAddress
FFFFFFFFFFFFCCD0 BE005ACA bra Monitor
FFFFFFFFFFFFCCD4 ProcessS9:
FFFFFFFFFFFFCCD4 31FFF338 call S19Get16BitAddress
FFFFFFFFFFFFCCD8 66028000 sw r5,S19StartAddress
FFFFFFFFFFFFCCDC 33FFF20A jmp Monitor
FFFFFFFFFFFFC600 S19Get16BitAddress:
FFFFFFFFFFFFC600 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFC604 67EF8000 sw r31,[sp]
FFFFFFFFFFFFC608 31FFF1B2 call sGetChar
FFFFFFFFFFFFC60C 31FFF130 call AsciiToHexNybble
FFFFFFFFFFFFC610 04100809 or r2,r1,r0
FFFFFFFFFFFFC614 BE00038A bra S1932b
FFFFFFFFFFFFCCE0 S19Get16BitAddress:
FFFFFFFFFFFFCCE0 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFCCE4 67EF8000 sw r31,[sp]
FFFFFFFFFFFFCCE8 31FFF36A call sGetChar
FFFFFFFFFFFFCCEC 31FFF2E8 call AsciiToHexNybble
FFFFFFFFFFFFCCF0 04100809 or r2,r1,r0
FFFFFFFFFFFFCCF4 BE00038A bra S1932b
FFFFFFFFFFFFC618 S19Get24BitAddress:
FFFFFFFFFFFFC618 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFC61C 67EF8000 sw r31,[sp]
FFFFFFFFFFFFC620 31FFF1B2 call sGetChar
FFFFFFFFFFFFC624 31FFF130 call AsciiToHexNybble
FFFFFFFFFFFFC628 04100809 or r2,r1,r0
FFFFFFFFFFFFC62C BE0001CA bra S1932a
FFFFFFFFFFFFCCF8 S19Get24BitAddress:
FFFFFFFFFFFFCCF8 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFCCFC 67EF8000 sw r31,[sp]
FFFFFFFFFFFFCD00 31FFF36A call sGetChar
FFFFFFFFFFFFCD04 31FFF2E8 call AsciiToHexNybble
FFFFFFFFFFFFCD08 04100809 or r2,r1,r0
FFFFFFFFFFFFCD0C BE0001CA bra S1932a
FFFFFFFFFFFFC630 S19Get32BitAddress:
FFFFFFFFFFFFC630 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFC634 67EF8000 sw r31,[sp]
FFFFFFFFFFFFC638 31FFF1B2 call sGetChar
FFFFFFFFFFFFC63C 31FFF130 call AsciiToHexNybble
FFFFFFFFFFFFC640 04100809 or r2,r1,r0
FFFFFFFFFFFFC644 31FFF1B2 call sGetChar
FFFFFFFFFFFFC648 31FFF130 call AsciiToHexNybble
FFFFFFFFFFFFC64C 06210800 shli r2,r2,#4
FFFFFFFFFFFFC650 04110809 or r2,r1,r2
FFFFFFFFFFFFC654 31FFF1B2 call sGetChar
FFFFFFFFFFFFC658 31FFF130 call AsciiToHexNybble
FFFFFFFFFFFFC65C 06210800 shli r2,r2,#4
FFFFFFFFFFFFC660 04208809 or r2,r2,r1
FFFFFFFFFFFFC664 S1932a:
FFFFFFFFFFFFC664 31FFF1B2 call sGetChar
FFFFFFFFFFFFC668 31FFF130 call AsciiToHexNybble
FFFFFFFFFFFFC66C 06210800 shli r2,r2,#4
FFFFFFFFFFFFC670 04208809 or r2,r2,r1
FFFFFFFFFFFFC674 31FFF1B2 call sGetChar
FFFFFFFFFFFFC678 31FFF130 call AsciiToHexNybble
FFFFFFFFFFFFC67C 06210800 shli r2,r2,#4
FFFFFFFFFFFFC680 04208809 or r2,r2,r1
FFFFFFFFFFFFC684 S1932b:
FFFFFFFFFFFFC684 31FFF1B2 call sGetChar
FFFFFFFFFFFFC688 31FFF130 call AsciiToHexNybble
FFFFFFFFFFFFC68C 06210800 shli r2,r2,#4
FFFFFFFFFFFFC690 04208809 or r2,r2,r1
FFFFFFFFFFFFC694 31FFF1B2 call sGetChar
FFFFFFFFFFFFC698 31FFF130 call AsciiToHexNybble
FFFFFFFFFFFFC69C 06210800 shli r2,r2,#4
FFFFFFFFFFFFC6A0 04208809 or r2,r2,r1
FFFFFFFFFFFFC6A4 31FFF1B2 call sGetChar
FFFFFFFFFFFFC6A8 31FFF130 call AsciiToHexNybble
FFFFFFFFFFFFC6AC 06210800 shli r2,r2,#4
FFFFFFFFFFFFC6B0 04208809 or r2,r2,r1
FFFFFFFFFFFFC6B4 0442100A xor r4,r4,r4
FFFFFFFFFFFFC6B8 04201409 or r5,r2,r0
FFFFFFFFFFFFC6BC 47EF8000 lw r31,[sp]
FFFFFFFFFFFFC6C0 0BEF0008 addui sp,sp,#8
FFFFFFFFFFFFC6C4 37EF8000 ret
FFFFFFFFFFFFCD10 S19Get32BitAddress:
FFFFFFFFFFFFCD10 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFCD14 67EF8000 sw r31,[sp]
FFFFFFFFFFFFCD18 31FFF36A call sGetChar
FFFFFFFFFFFFCD1C 31FFF2E8 call AsciiToHexNybble
FFFFFFFFFFFFCD20 04100809 or r2,r1,r0
FFFFFFFFFFFFCD24 31FFF36A call sGetChar
FFFFFFFFFFFFCD28 31FFF2E8 call AsciiToHexNybble
FFFFFFFFFFFFCD2C 06210800 shli r2,r2,#4
FFFFFFFFFFFFCD30 04110809 or r2,r1,r2
FFFFFFFFFFFFCD34 31FFF36A call sGetChar
FFFFFFFFFFFFCD38 31FFF2E8 call AsciiToHexNybble
FFFFFFFFFFFFCD3C 06210800 shli r2,r2,#4
FFFFFFFFFFFFCD40 04208809 or r2,r2,r1
FFFFFFFFFFFFCD44 S1932a:
FFFFFFFFFFFFCD44 31FFF36A call sGetChar
FFFFFFFFFFFFCD48 31FFF2E8 call AsciiToHexNybble
FFFFFFFFFFFFCD4C 06210800 shli r2,r2,#4
FFFFFFFFFFFFCD50 04208809 or r2,r2,r1
FFFFFFFFFFFFCD54 31FFF36A call sGetChar
FFFFFFFFFFFFCD58 31FFF2E8 call AsciiToHexNybble
FFFFFFFFFFFFCD5C 06210800 shli r2,r2,#4
FFFFFFFFFFFFCD60 04208809 or r2,r2,r1
FFFFFFFFFFFFCD64 S1932b:
FFFFFFFFFFFFCD64 31FFF36A call sGetChar
FFFFFFFFFFFFCD68 31FFF2E8 call AsciiToHexNybble
FFFFFFFFFFFFCD6C 06210800 shli r2,r2,#4
FFFFFFFFFFFFCD70 04208809 or r2,r2,r1
FFFFFFFFFFFFCD74 31FFF36A call sGetChar
FFFFFFFFFFFFCD78 31FFF2E8 call AsciiToHexNybble
FFFFFFFFFFFFCD7C 06210800 shli r2,r2,#4
FFFFFFFFFFFFCD80 04208809 or r2,r2,r1
FFFFFFFFFFFFCD84 31FFF36A call sGetChar
FFFFFFFFFFFFCD88 31FFF2E8 call AsciiToHexNybble
FFFFFFFFFFFFCD8C 06210800 shli r2,r2,#4
FFFFFFFFFFFFCD90 04208809 or r2,r2,r1
FFFFFFFFFFFFCD94 0442100A xor r4,r4,r4
FFFFFFFFFFFFCD98 04201409 or r5,r2,r0
FFFFFFFFFFFFCD9C 47EF8000 lw r31,[sp]
FFFFFFFFFFFFCDA0 0BEF0008 addui sp,sp,#8
FFFFFFFFFFFFCDA4 37EF8000 ret
;------------------------------------------------------------------------------
; Get a character from auxillary input, checking the keyboard status for a
2215,96 → 2950,101
; CTRL-C
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFC6C8 sGetChar:
FFFFFFFFFFFFC6C8 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFC6CC 67EF8000 sw r31,[sp]
FFFFFFFFFFFFC6D0 sgc2:
FFFFFFFFFFFFC6D0 31FFEE1D call KeybdCheckForKey
FFFFFFFFFFFFC6D4 BE106908 beq r1,r0,sgc1
FFFFFFFFFFFFC6D8 31FFEE08 call KeybdGetchar
FFFFFFFFFFFFC6DC B01EDF00 beqi r1,#CRTLC,Monitor
FFFFFFFFFFFFC6E0 sgc1:
FFFFFFFFFFFFC6E0 31FFF95C call AUXIN
FFFFFFFFFFFFC6E4 BE107F62 ble r1,r0,sgc2
FFFFFFFFFFFFC6E8 47EF8000 lw r31,[sp]
FFFFFFFFFFFFC6EC 37EF8008 ret #8
FFFFFFFFFFFFCDA8 sGetChar:
FFFFFFFFFFFFCDA8 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFCDAC 67EF8000 sw r31,[sp]
FFFFFFFFFFFFCDB0 sgc2:
FFFFFFFFFFFFCDB0 31FFEF1C call KeybdCheckForKey
FFFFFFFFFFFFCDB4 BE103C08 beq r1,r0,sgc1
FFFFFFFFFFFFCDB8 31FFEF07 call KeybdGetchar
FFFFFFFFFFFFCDBC B01E9B00 beqi r1,#CRTLC,Monitor
FFFFFFFFFFFFCDC0 sgc1:
FFFFFFFFFFFFCDC0 31FFFD9D call AUXIN
FFFFFFFFFFFFCDC4 BE107F62 ble r1,r0,sgc2
FFFFFFFFFFFFCDC8 47EF8000 lw r31,[sp]
FFFFFFFFFFFFCDCC 37EF8008 ret #8
;--------------------------------------------------------------------------
; Draw random lines on the bitmap screen.
;--------------------------------------------------------------------------
FFFFFFFFFFFFC6F0 RandomLines:
FFFFFFFFFFFFC6F0 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFC6F4 67E08000 sw r1,[sp]
FFFFFFFFFFFFC6F8 67E18008 sw r3,8[sp]
FFFFFFFFFFFFC6FC 67EF8010 sw lr,16[sp]
FFFFFFFFFFFFC700 rl5:
FFFFFFFFFFFFC700 00000050 gran
FFFFFFFFFFFFC704 020088A8 mfspr r1,rand ; select a random color
FFFFFFFFFFFFC708 E69AE000 ; SETLO
FFFFFFFFFFFFC70C EE800003 ; SETMID
FFFFFFFFFFFFC710 6A0D042A outh r1,GACCEL
FFFFFFFFFFFFC714 rl1: ; random X0
FFFFFFFFFFFFC714 00000050 gran
FFFFFFFFFFFFC718 020088A8 mfspr r1,rand
FFFFFFFFFFFFC71C 16018554 lw r3,#1364
FFFFFFFFFFFFC720 0411841C mod r1,r1,r3
FFFFFFFFFFFFC724 E69AE008 ; SETLO
FFFFFFFFFFFFC728 EE800003 ; SETMID
FFFFFFFFFFFFC72C 6A0D042A outh r1,GACCEL+8
FFFFFFFFFFFFC730 rl2: ; random X1
FFFFFFFFFFFFC730 00000050 gran
FFFFFFFFFFFFC734 020088A8 mfspr r1,rand
FFFFFFFFFFFFC738 16018554 lw r3,#1364
FFFFFFFFFFFFC73C 0411841C mod r1,r1,r3
FFFFFFFFFFFFC740 E69AE010 ; SETLO
FFFFFFFFFFFFC744 EE800003 ; SETMID
FFFFFFFFFFFFC748 6A0D042A outh r1,GACCEL+16
FFFFFFFFFFFFC74C rl3: ; random Y0
FFFFFFFFFFFFC74C 00000050 gran
FFFFFFFFFFFFC750 020088A8 mfspr r1,rand
FFFFFFFFFFFFC754 16018300 lw r3,#768
FFFFFFFFFFFFC758 0411841C mod r1,r1,r3
FFFFFFFFFFFFC75C E69AE00C ; SETLO
FFFFFFFFFFFFC760 EE800003 ; SETMID
FFFFFFFFFFFFC764 6A0D042A outh r1,GACCEL+12
FFFFFFFFFFFFC768 rl4: ; random Y1
FFFFFFFFFFFFC768 00000050 gran
FFFFFFFFFFFFC76C 020088A8 mfspr r1,rand
FFFFFFFFFFFFC770 16018300 lw r3,#768
FFFFFFFFFFFFC774 0411841C mod r1,r1,r3
FFFFFFFFFFFFC778 E69AE014 ; SETLO
FFFFFFFFFFFFC77C EE800003 ; SETMID
FFFFFFFFFFFFC780 6A0D042A outh r1,GACCEL+20
FFFFFFFFFFFFC784 E0400002 setlo r1,#2 ; draw line command
FFFFFFFFFFFFC788 E69AE03C ; SETLO
FFFFFFFFFFFFC78C EE800003 ; SETMID
FFFFFFFFFFFFC790 6A0D042A outh r1,GACCEL+60
FFFFFFFFFFFFC794 rl8:
FFFFFFFFFFFFC794 31FFEE08 call KeybdGetChar
FFFFFFFFFFFFC798 B0100303 beqi r1,#CTRLC,rl7
FFFFFFFFFFFFC79C B01FD972 beqi r1,#'r',rl5
FFFFFFFFFFFFC7A0 BE007FAA bra rl8
FFFFFFFFFFFFC7A4 rl7:
FFFFFFFFFFFFC7A4 47EF8010 lw lr,16[sp]
FFFFFFFFFFFFC7A8 47E18008 lw r3,8[sp]
FFFFFFFFFFFFC7AC 47E08000 lw r1,[sp]
FFFFFFFFFFFFC7B0 37EF8018 ret #24
;
FFFFFFFFFFFFCDD0 RandomLines:
FFFFFFFFFFFFCDD0 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFCDD4 67E08000 sw r1,[sp]
FFFFFFFFFFFFCDD8 67E18008 sw r3,8[sp]
FFFFFFFFFFFFCDDC 67EF8010 sw lr,16[sp]
FFFFFFFFFFFFCDE0 660020E8 sw r0,ctx3start ; prevent restarting context over and over again
FFFFFFFFFFFFCDE4 rl5:
FFFFFFFFFFFFCDE4 00000050 gran
FFFFFFFFFFFFCDE8 020088A8 mfspr r1,rand ; select a random color
FFFFFFFFFFFFCDEC E69AE000 ; SETLO
FFFFFFFFFFFFCDF0 EE800003 ; SETMID
FFFFFFFFFFFFCDF4 6A0D042A outh r1,GACCEL
FFFFFFFFFFFFCDF8 rl1: ; random X0
FFFFFFFFFFFFCDF8 00000050 gran
FFFFFFFFFFFFCDFC 020088A8 mfspr r1,rand
FFFFFFFFFFFFCE00 16018554 lw r3,#1364
FFFFFFFFFFFFCE04 0411841C modu r1,r1,r3
FFFFFFFFFFFFCE08 E69AE008 ; SETLO
FFFFFFFFFFFFCE0C EE800003 ; SETMID
FFFFFFFFFFFFCE10 6A0D042A outh r1,GACCEL+8
FFFFFFFFFFFFCE14 rl2: ; random X1
FFFFFFFFFFFFCE14 00000050 gran
FFFFFFFFFFFFCE18 020088A8 mfspr r1,rand
FFFFFFFFFFFFCE1C 16018554 lw r3,#1364
FFFFFFFFFFFFCE20 0411841C modu r1,r1,r3
FFFFFFFFFFFFCE24 E69AE010 ; SETLO
FFFFFFFFFFFFCE28 EE800003 ; SETMID
FFFFFFFFFFFFCE2C 6A0D042A outh r1,GACCEL+16
FFFFFFFFFFFFCE30 rl3: ; random Y0
FFFFFFFFFFFFCE30 00000050 gran
FFFFFFFFFFFFCE34 020088A8 mfspr r1,rand
FFFFFFFFFFFFCE38 16018300 lw r3,#768
FFFFFFFFFFFFCE3C 0411841C modu r1,r1,r3
FFFFFFFFFFFFCE40 E69AE00C ; SETLO
FFFFFFFFFFFFCE44 EE800003 ; SETMID
FFFFFFFFFFFFCE48 6A0D042A outh r1,GACCEL+12
FFFFFFFFFFFFCE4C rl4: ; random Y1
FFFFFFFFFFFFCE4C 00000050 gran
FFFFFFFFFFFFCE50 020088A8 mfspr r1,rand
FFFFFFFFFFFFCE54 16018300 lw r3,#768
FFFFFFFFFFFFCE58 0411841C modu r1,r1,r3
FFFFFFFFFFFFCE5C E69AE014 ; SETLO
FFFFFFFFFFFFCE60 EE800003 ; SETMID
FFFFFFFFFFFFCE64 6A0D042A outh r1,GACCEL+20
FFFFFFFFFFFFCE68 E0400002 setlo r1,#2 ; draw line command
FFFFFFFFFFFFCE6C E69AE03C ; SETLO
FFFFFFFFFFFFCE70 EE800003 ; SETMID
FFFFFFFFFFFFCE74 6A0D042A outh r1,GACCEL+60
FFFFFFFFFFFFCE78 rl8:
; call KeybdGetChar
; beqi r1,#CTRLC,rl7
FFFFFFFFFFFFCE78 E69AE038 ; SETLO
FFFFFFFFFFFFCE7C EE800003 ; SETMID
FFFFFFFFFFFFCE80 6A0D0421 inch r1,GACCEL+56 ; ensure controller is in IDLE state
FFFFFFFFFFFFCE84 BE107FA9 bne r1,r0,rl8
FFFFFFFFFFFFCE88 BE007AEA bra rl5
FFFFFFFFFFFFCE8C rl7:
FFFFFFFFFFFFCE8C 47EF8010 lw lr,16[sp]
FFFFFFFFFFFFCE90 47E18008 lw r3,8[sp]
FFFFFFFFFFFFCE94 47E08000 lw r1,[sp]
FFFFFFFFFFFFCE98 37EF8018 ret #24
;--------------------------------------------------------------------------
; Initialize sprite image caches with random data.
;--------------------------------------------------------------------------
FFFFFFFFFFFFC7B4 RandomizeSprram:
FFFFFFFFFFFFC7B4 E6980000 ; SETLO
FFFFFFFFFFFFC7B8 EE800003 ; SETMID
FFFFFFFFFFFFC7BC 6A0D082D lea r2,SPRRAM
FFFFFFFFFFFFC7C0 E10037FF setlo r4,#14335 ; number of chars to initialize
FFFFFFFFFFFFC7C4 rsr1:
FFFFFFFFFFFFC7C4 00000050 gran
FFFFFFFFFFFFC7C8 020088A8 mfspr r1,rand
FFFFFFFFFFFFC7CC 92208000 outc r1,[r2]
FFFFFFFFFFFFC7D0 0A210002 addui r2,r2,#2
FFFFFFFFFFFFC7D4 BE027F8F loop r4,rsr1
FFFFFFFFFFFFC7D8 37EF8000 ret
FFFFFFFFFFFFCE9C RandomizeSprram:
FFFFFFFFFFFFCE9C E6980000 ; SETLO
FFFFFFFFFFFFCEA0 EE800003 ; SETMID
FFFFFFFFFFFFCEA4 6A0D082D lea r2,SPRRAM
FFFFFFFFFFFFCEA8 E10037FF setlo r4,#14335 ; number of chars to initialize
FFFFFFFFFFFFCEAC rsr1:
FFFFFFFFFFFFCEAC 00000050 gran
FFFFFFFFFFFFCEB0 020088A8 mfspr r1,rand
FFFFFFFFFFFFCEB4 92208000 outc r1,[r2]
FFFFFFFFFFFFCEB8 0A210002 addui r2,r2,#2
FFFFFFFFFFFFCEBC BE027F8F loop r4,rsr1
FFFFFFFFFFFFCEC0 37EF8000 ret
;--------------------------------------------------------------------------
; Setup the AC97/LM4550 audio controller. Check keyboard for a CTRL-C
2312,503 → 3052,1339
; responding.
;--------------------------------------------------------------------------
;
FFFFFFFFFFFFC7DC SetupAC97:
FFFFFFFFFFFFC7DC 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFC7E0 67E08000 sw r1,[sp]
FFFFFFFFFFFFC7E4 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFC7E8 sac974:
FFFFFFFFFFFFC7E8 E69C1026 ; SETLO
FFFFFFFFFFFFC7EC EE800003 ; SETMID
FFFFFFFFFFFFC7F0 6A0D0029 outc r0,AC97+0x26 ; trigger a read of register 26 (status reg)
FFFFFFFFFFFFC7F4 sac971: ; wait for status to register 0xF (all ready)
FFFFFFFFFFFFC7F4 31FFEE08 call KeybdGetChar ; see if we needed to CTRL-C
FFFFFFFFFFFFC7F8 B0100A03 beqi r1,#CTRLC,sac973
FFFFFFFFFFFFC7FC E69C1068 ; SETLO
FFFFFFFFFFFFC800 EE800003 ; SETMID
FFFFFFFFFFFFC804 6A0D0429 outc r1,AC97+0x68 ; wait for dirty bit to clear
FFFFFFFFFFFFC808 BE107F69 bne r1,r0,sac971
FFFFFFFFFFFFC80C E69C1026 ; SETLO
FFFFFFFFFFFFC810 EE800003 ; SETMID
FFFFFFFFFFFFC814 6A0D0429 outc r1,AC97+0x26 ; check status at reg h26, wait for
FFFFFFFFFFFFC818 1410800F andi r1,r1,#0x0F ; analogue to be ready
FFFFFFFFFFFFC81C B21FF30F bnei r1,#0x0F,sac974
FFFFFFFFFFFFC820 sac973:
FFFFFFFFFFFFC820 E69C1002 ; SETLO
FFFFFFFFFFFFC824 EE800003 ; SETMID
FFFFFFFFFFFFC828 6A0D0029 outc r0,AC97+2 ; master volume, 0db attenuation, mute off
FFFFFFFFFFFFC82C E69C1004 ; SETLO
FFFFFFFFFFFFC830 EE800003 ; SETMID
FFFFFFFFFFFFC834 6A0D0029 outc r0,AC97+4 ; headphone volume, 0db attenuation, mute off
FFFFFFFFFFFFC838 E69C1018 ; SETLO
FFFFFFFFFFFFC83C EE800003 ; SETMID
FFFFFFFFFFFFC840 6A0D0029 outc r0,AC97+0x18 ; PCM gain (mixer) mute off, no attenuation
FFFFFFFFFFFFC844 E69C100A ; SETLO
FFFFFFFFFFFFC848 EE800003 ; SETMID
FFFFFFFFFFFFC84C 6A0D0029 outc r0,AC97+0x0A ; mute PC beep
FFFFFFFFFFFFC850 E07F8000 setlo r1,#0x8000 ; bypass 3D sound
FFFFFFFFFFFFC854 E69C1020 ; SETLO
FFFFFFFFFFFFC858 EE800003 ; SETMID
FFFFFFFFFFFFC85C 6A0D0429 outc r1,AC97+0x20
FFFFFFFFFFFFC860 sac972:
FFFFFFFFFFFFC860 31FFEE08 call KeybdGetChar
FFFFFFFFFFFFC864 B0100503 beqi r1,#CTRLC,sac975
FFFFFFFFFFFFC868 E69C1068 ; SETLO
FFFFFFFFFFFFC86C EE800003 ; SETMID
FFFFFFFFFFFFC870 6A0D0429 outc r1,AC97+0x68 ; wait for dirty bits to clear
FFFFFFFFFFFFC874 BE107F69 bne r1,r0,sac972 ; wait a while for the settings to take effect
FFFFFFFFFFFFC878 sac975:
FFFFFFFFFFFFC878 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFC87C 47E08000 lw r1,[sp]
FFFFFFFFFFFFC880 37EF8010 ret #16
FFFFFFFFFFFFCEC4 SetupAC97:
FFFFFFFFFFFFCEC4 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFCEC8 67E08000 sw r1,[sp]
FFFFFFFFFFFFCECC 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFCED0 sac974:
FFFFFFFFFFFFCED0 E69C1026 ; SETLO
FFFFFFFFFFFFCED4 EE800003 ; SETMID
FFFFFFFFFFFFCED8 6A0D0029 outc r0,AC97+0x26 ; trigger a read of register 26 (status reg)
FFFFFFFFFFFFCEDC sac971: ; wait for status to register 0xF (all ready)
FFFFFFFFFFFFCEDC 31FFEF07 call KeybdGetChar ; see if we needed to CTRL-C
FFFFFFFFFFFFCEE0 B0100A03 beqi r1,#CTRLC,sac973
FFFFFFFFFFFFCEE4 E69C1068 ; SETLO
FFFFFFFFFFFFCEE8 EE800003 ; SETMID
FFFFFFFFFFFFCEEC 6A0D0421 inch r1,AC97+0x68 ; wait for dirty bit to clear
FFFFFFFFFFFFCEF0 BE107F69 bne r1,r0,sac971
FFFFFFFFFFFFCEF4 E69C1026 ; SETLO
FFFFFFFFFFFFCEF8 EE800003 ; SETMID
FFFFFFFFFFFFCEFC 6A0D0421 inch r1,AC97+0x26 ; check status at reg h26, wait for
FFFFFFFFFFFFCF00 1410800F andi r1,r1,#0x0F ; analogue to be ready
FFFFFFFFFFFFCF04 B21FF30F bnei r1,#0x0F,sac974
FFFFFFFFFFFFCF08 sac973:
FFFFFFFFFFFFCF08 E69C1002 ; SETLO
FFFFFFFFFFFFCF0C EE800003 ; SETMID
FFFFFFFFFFFFCF10 6A0D0029 outc r0,AC97+2 ; master volume, 0db attenuation, mute off
FFFFFFFFFFFFCF14 E69C1004 ; SETLO
FFFFFFFFFFFFCF18 EE800003 ; SETMID
FFFFFFFFFFFFCF1C 6A0D0029 outc r0,AC97+4 ; headphone volume, 0db attenuation, mute off
FFFFFFFFFFFFCF20 E69C1018 ; SETLO
FFFFFFFFFFFFCF24 EE800003 ; SETMID
FFFFFFFFFFFFCF28 6A0D0029 outc r0,AC97+0x18 ; PCM gain (mixer) mute off, no attenuation
FFFFFFFFFFFFCF2C E69C100A ; SETLO
FFFFFFFFFFFFCF30 EE800003 ; SETMID
FFFFFFFFFFFFCF34 6A0D0029 outc r0,AC97+0x0A ; mute PC beep
FFFFFFFFFFFFCF38 E07F8000 setlo r1,#0x8000 ; bypass 3D sound
FFFFFFFFFFFFCF3C E69C1020 ; SETLO
FFFFFFFFFFFFCF40 EE800003 ; SETMID
FFFFFFFFFFFFCF44 6A0D0429 outc r1,AC97+0x20
FFFFFFFFFFFFCF48 sac972:
FFFFFFFFFFFFCF48 31FFEF07 call KeybdGetChar
FFFFFFFFFFFFCF4C B0100503 beqi r1,#CTRLC,sac975
FFFFFFFFFFFFCF50 E69C1068 ; SETLO
FFFFFFFFFFFFCF54 EE800003 ; SETMID
FFFFFFFFFFFFCF58 6A0D0421 inch r1,AC97+0x68 ; wait for dirty bits to clear
FFFFFFFFFFFFCF5C BE107F69 bne r1,r0,sac972 ; wait a while for the settings to take effect
FFFFFFFFFFFFCF60 sac975:
FFFFFFFFFFFFCF60 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFCF64 47E08000 lw r1,[sp]
FFFFFFFFFFFFCF68 37EF8010 ret #16
;--------------------------------------------------------------------------
; Sound a 800 Hz beep
;--------------------------------------------------------------------------
;
FFFFFFFFFFFFC884 Beep:
FFFFFFFFFFFFC884 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFC888 67E08000 sw r1,[sp]
FFFFFFFFFFFFC88C 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFC890 E0400008 setlo r1,#8
FFFFFFFFFFFFC894 E69C0600 ; SETLO
FFFFFFFFFFFFC898 EE800003 ; SETMID
FFFFFFFFFFFFC89C 6A0D0428 outb r1,LED
FFFFFFFFFFFFC8A0 1600800F ori r1,r0,#15 ; master volume to max
FFFFFFFFFFFFC8A4 E6950080 ; SETLO
FFFFFFFFFFFFC8A8 EE800003 ; SETMID
FFFFFFFFFFFFC8AC 6A0D0429 outc r1,PSG+128
FFFFFFFFFFFFC8B0 1600B46E ori r1,r0,#13422 ; 800Hz
FFFFFFFFFFFFC8B4 E6950000 ; SETLO
FFFFFFFFFFFFC8B8 EE800003 ; SETMID
FFFFFFFFFFFFC8BC 6A0D0429 outc r1,PSGFREQ0
FFFFFFFFFFFFC8C0 E0400009 setlo r1,#9
FFFFFFFFFFFFC8C4 E69C0600 ; SETLO
FFFFFFFFFFFFC8C8 EE800003 ; SETMID
FFFFFFFFFFFFC8CC 6A0D0428 outb r1,LED
FFFFFFFFFFFFCF6C Beep:
FFFFFFFFFFFFCF6C 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFCF70 67E08000 sw r1,[sp]
FFFFFFFFFFFFCF74 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFCF78 E0400008 setlo r1,#8
FFFFFFFFFFFFCF7C E69C0600 ; SETLO
FFFFFFFFFFFFCF80 EE800003 ; SETMID
FFFFFFFFFFFFCF84 6A0D0428 outb r1,LED
FFFFFFFFFFFFCF88 1600800F ori r1,r0,#15 ; master volume to max
FFFFFFFFFFFFCF8C E6950080 ; SETLO
FFFFFFFFFFFFCF90 EE800003 ; SETMID
FFFFFFFFFFFFCF94 6A0D0429 outc r1,PSG+128
FFFFFFFFFFFFCF98 1600B46E ori r1,r0,#13422 ; 800Hz
FFFFFFFFFFFFCF9C E6950000 ; SETLO
FFFFFFFFFFFFCFA0 EE800003 ; SETMID
FFFFFFFFFFFFCFA4 6A0D0429 outc r1,PSGFREQ0
FFFFFFFFFFFFCFA8 E0400009 setlo r1,#9
FFFFFFFFFFFFCFAC E69C0600 ; SETLO
FFFFFFFFFFFFCFB0 EE800003 ; SETMID
FFFFFFFFFFFFCFB4 6A0D0428 outb r1,LED
; decay (16.384 ms)2
; attack (8.192 ms)1
; release (1.024 s)A
; sustain level C
FFFFFFFFFFFFC8D0 E07FCA12 setlo r1,#0xCA12
FFFFFFFFFFFFC8D4 E6950006 ; SETLO
FFFFFFFFFFFFC8D8 EE800003 ; SETMID
FFFFFFFFFFFFC8DC 6A0D0429 outc r1,PSGADSR0
FFFFFFFFFFFFC8E0 16009104 ori r1,r0,#0x1104 ; gate, output enable, triangle waveform
FFFFFFFFFFFFC8E4 E6950004 ; SETLO
FFFFFFFFFFFFC8E8 EE800003 ; SETMID
FFFFFFFFFFFFC8EC 6A0D0429 outc r1,PSGCTRL0
FFFFFFFFFFFFC8F0 E6BD7840 ; SETLO
FFFFFFFFFFFFC8F4 EE800005 ; SETMID
FFFFFFFFFFFFC8F8 040D0409 ori r1,r0,#25000000 ; delay about 1s
FFFFFFFFFFFFC8FC beep1:
FFFFFFFFFFFFC8FC BE00800F loop r1,beep1
FFFFFFFFFFFFC900 E040000D setlo r1,#13
FFFFFFFFFFFFC904 E69C0600 ; SETLO
FFFFFFFFFFFFC908 EE800003 ; SETMID
FFFFFFFFFFFFC90C 6A0D0428 outb r1,LED
FFFFFFFFFFFFC910 16008104 ori r1,r0,#0x0104 ; gate off, output enable, triangle waveform
FFFFFFFFFFFFC914 E6950004 ; SETLO
FFFFFFFFFFFFC918 EE800003 ; SETMID
FFFFFFFFFFFFC91C 6A0D0429 outc r1,PSGCTRL0
FFFFFFFFFFFFC920 E6BD7840 ; SETLO
FFFFFFFFFFFFC924 EE800005 ; SETMID
FFFFFFFFFFFFC928 040D0409 ori r1,r0,#25000000 ; delay about 1s
FFFFFFFFFFFFC92C beep2:
FFFFFFFFFFFFC92C BE00800F loop r1,beep2
FFFFFFFFFFFFC930 E0400010 setlo r1,#16
FFFFFFFFFFFFC934 E69C0600 ; SETLO
FFFFFFFFFFFFC938 EE800003 ; SETMID
FFFFFFFFFFFFC93C 6A0D0428 outb r1,LED
FFFFFFFFFFFFC940 16008000 ori r1,r0,#0x0000 ; gate off, output enable off, no waveform
FFFFFFFFFFFFC944 E6950004 ; SETLO
FFFFFFFFFFFFC948 EE800003 ; SETMID
FFFFFFFFFFFFC94C 6A0D0429 outc r1,PSGCTRL0
FFFFFFFFFFFFC950 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFC954 47E08000 lw r1,[sp]
FFFFFFFFFFFFC958 37EF8010 ret #16
FFFFFFFFFFFFCFB8 E07FCA12 setlo r1,#0xCA12
FFFFFFFFFFFFCFBC E6950006 ; SETLO
FFFFFFFFFFFFCFC0 EE800003 ; SETMID
FFFFFFFFFFFFCFC4 6A0D0429 outc r1,PSGADSR0
FFFFFFFFFFFFCFC8 16009104 ori r1,r0,#0x1104 ; gate, output enable, triangle waveform
FFFFFFFFFFFFCFCC E6950004 ; SETLO
FFFFFFFFFFFFCFD0 EE800003 ; SETMID
FFFFFFFFFFFFCFD4 6A0D0429 outc r1,PSGCTRL0
FFFFFFFFFFFFCFD8 E6A625A0 ; SETLO
FFFFFFFFFFFFCFDC EE800000 ; SETMID
FFFFFFFFFFFFCFE0 040D0409 ori r1,r0,#2500000 ; delay about 1s
FFFFFFFFFFFFCFE4 beep1:
FFFFFFFFFFFFCFE4 BE00800F loop r1,beep1
FFFFFFFFFFFFCFE8 E040000D setlo r1,#13
FFFFFFFFFFFFCFEC E69C0600 ; SETLO
FFFFFFFFFFFFCFF0 EE800003 ; SETMID
FFFFFFFFFFFFCFF4 6A0D0428 outb r1,LED
FFFFFFFFFFFFCFF8 16008104 ori r1,r0,#0x0104 ; gate off, output enable, triangle waveform
FFFFFFFFFFFFCFFC E6950004 ; SETLO
FFFFFFFFFFFFD000 EE800003 ; SETMID
FFFFFFFFFFFFD004 6A0D0429 outc r1,PSGCTRL0
FFFFFFFFFFFFD008 E6A625A0 ; SETLO
FFFFFFFFFFFFD00C EE800000 ; SETMID
FFFFFFFFFFFFD010 040D0409 ori r1,r0,#2500000 ; delay about 1s
FFFFFFFFFFFFD014 beep2:
FFFFFFFFFFFFD014 BE00800F loop r1,beep2
FFFFFFFFFFFFD018 E0400010 setlo r1,#16
FFFFFFFFFFFFD01C E69C0600 ; SETLO
FFFFFFFFFFFFD020 EE800003 ; SETMID
FFFFFFFFFFFFD024 6A0D0428 outb r1,LED
FFFFFFFFFFFFD028 16008000 ori r1,r0,#0x0000 ; gate off, output enable off, no waveform
FFFFFFFFFFFFD02C E6950004 ; SETLO
FFFFFFFFFFFFD030 EE800003 ; SETMID
FFFFFFFFFFFFD034 6A0D0429 outc r1,PSGCTRL0
FFFFFFFFFFFFD038 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFD03C 47E08000 lw r1,[sp]
FFFFFFFFFFFFD040 37EF8010 ret #16
;--------------------------------------------------------------------------
;--------------------------------------------------------------------------
;
FFFFFFFFFFFFC95C Piano:
FFFFFFFFFFFFC95C 1600800F ori r1,r0,#15 ; master volume to max
FFFFFFFFFFFFC960 E6950080 ; SETLO
FFFFFFFFFFFFC964 EE800003 ; SETMID
FFFFFFFFFFFFC968 6A0D0429 outc r1,PSG+128
FFFFFFFFFFFFC96C playnt:
FFFFFFFFFFFFC96C 31FFEE08 call KeybdGetChar
FFFFFFFFFFFFC970 B01E3A03 beqi r1,#CTRLC,Monitor
FFFFFFFFFFFFC974 B0100861 beqi r1,#'a',playnt1a
FFFFFFFFFFFFC978 B0100A62 beqi r1,#'b',playnt1b
FFFFFFFFFFFFC97C B0100C63 beqi r1,#'c',playnt1c
FFFFFFFFFFFFC980 B0100E64 beqi r1,#'d',playnt1d
FFFFFFFFFFFFC984 B0101065 beqi r1,#'e',playnt1e
FFFFFFFFFFFFC988 B0101266 beqi r1,#'f',playnt1f
FFFFFFFFFFFFC98C B0101467 beqi r1,#'g',playnt1g
FFFFFFFFFFFFC990 BE007EEA bra playnt
FFFFFFFFFFFFD044 Piano:
FFFFFFFFFFFFD044 1600800F ori r1,r0,#15 ; master volume to max
FFFFFFFFFFFFD048 E6950080 ; SETLO
FFFFFFFFFFFFD04C EE800003 ; SETMID
FFFFFFFFFFFFD050 6A0D0429 outc r1,PSG+128
FFFFFFFFFFFFD054 playnt:
FFFFFFFFFFFFD054 31FFEF07 call KeybdGetChar
FFFFFFFFFFFFD058 B01DF403 beqi r1,#CTRLC,Monitor
FFFFFFFFFFFFD05C B0100861 beqi r1,#'a',playnt1a
FFFFFFFFFFFFD060 B0100A62 beqi r1,#'b',playnt1b
FFFFFFFFFFFFD064 B0100C63 beqi r1,#'c',playnt1c
FFFFFFFFFFFFD068 B0100E64 beqi r1,#'d',playnt1d
FFFFFFFFFFFFD06C B0101065 beqi r1,#'e',playnt1e
FFFFFFFFFFFFD070 B0101266 beqi r1,#'f',playnt1f
FFFFFFFFFFFFD074 B0101467 beqi r1,#'g',playnt1g
FFFFFFFFFFFFD078 BE007EEA bra playnt
FFFFFFFFFFFFC994 playnt1a:
FFFFFFFFFFFFC994 E0401C31 setlo r1,#7217
FFFFFFFFFFFFC998 31FFF27A call Tone
FFFFFFFFFFFFC99C BE007E8A bra playnt
FFFFFFFFFFFFC9A0 playnt1b:
FFFFFFFFFFFFC9A0 E0401FA5 setlo r1,#8101
FFFFFFFFFFFFC9A4 31FFF27A call Tone
FFFFFFFFFFFFC9A8 BE007E2A bra playnt
FFFFFFFFFFFFC9AC playnt1c:
FFFFFFFFFFFFC9AC E04010C3 setlo r1,#4291
FFFFFFFFFFFFC9B0 31FFF27A call Tone
FFFFFFFFFFFFC9B4 BE007DCA bra playnt
FFFFFFFFFFFFC9B8 playnt1d:
FFFFFFFFFFFFC9B8 E04012D1 setlo r1,#4817
FFFFFFFFFFFFC9BC 31FFF27A call Tone
FFFFFFFFFFFFC9C0 BE007D6A bra playnt
FFFFFFFFFFFFC9C4 playnt1e:
FFFFFFFFFFFFC9C4 E040151F setlo r1,#5407
FFFFFFFFFFFFC9C8 31FFF27A call Tone
FFFFFFFFFFFFC9CC BE007D0A bra playnt
FFFFFFFFFFFFC9D0 playnt1f:
FFFFFFFFFFFFC9D0 E0401660 setlo r1,#5728
FFFFFFFFFFFFC9D4 31FFF27A call Tone
FFFFFFFFFFFFC9D8 BE007CAA bra playnt
FFFFFFFFFFFFC9DC playnt1g:
FFFFFFFFFFFFC9DC E040191E setlo r1,#6430
FFFFFFFFFFFFC9E0 31FFF27A call Tone
FFFFFFFFFFFFC9E4 BE007C4A bra playnt
FFFFFFFFFFFFD07C playnt1a:
FFFFFFFFFFFFD07C E0401C31 setlo r1,#7217
FFFFFFFFFFFFD080 31FFF434 call Tone
FFFFFFFFFFFFD084 BE007E8A bra playnt
FFFFFFFFFFFFD088 playnt1b:
FFFFFFFFFFFFD088 E0401FA5 setlo r1,#8101
FFFFFFFFFFFFD08C 31FFF434 call Tone
FFFFFFFFFFFFD090 BE007E2A bra playnt
FFFFFFFFFFFFD094 playnt1c:
FFFFFFFFFFFFD094 E04010C3 setlo r1,#4291
FFFFFFFFFFFFD098 31FFF434 call Tone
FFFFFFFFFFFFD09C BE007DCA bra playnt
FFFFFFFFFFFFD0A0 playnt1d:
FFFFFFFFFFFFD0A0 E04012D1 setlo r1,#4817
FFFFFFFFFFFFD0A4 31FFF434 call Tone
FFFFFFFFFFFFD0A8 BE007D6A bra playnt
FFFFFFFFFFFFD0AC playnt1e:
FFFFFFFFFFFFD0AC E040151F setlo r1,#5407
FFFFFFFFFFFFD0B0 31FFF434 call Tone
FFFFFFFFFFFFD0B4 BE007D0A bra playnt
FFFFFFFFFFFFD0B8 playnt1f:
FFFFFFFFFFFFD0B8 E0401660 setlo r1,#5728
FFFFFFFFFFFFD0BC 31FFF434 call Tone
FFFFFFFFFFFFD0C0 BE007CAA bra playnt
FFFFFFFFFFFFD0C4 playnt1g:
FFFFFFFFFFFFD0C4 E040191E setlo r1,#6430
FFFFFFFFFFFFD0C8 31FFF434 call Tone
FFFFFFFFFFFFD0CC BE007C4A bra playnt
FFFFFFFFFFFFC9E8 Tone:
FFFFFFFFFFFFC9E8 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFC9EC 67E08000 sw r1,[sp]
FFFFFFFFFFFFC9F0 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFC9F4 E6950000 ; SETLO
FFFFFFFFFFFFC9F8 EE800003 ; SETMID
FFFFFFFFFFFFC9FC 6A0D0429 outc r1,PSGFREQ0
FFFFFFFFFFFFD0D0 Tone:
FFFFFFFFFFFFD0D0 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFD0D4 67E08000 sw r1,[sp]
FFFFFFFFFFFFD0D8 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFD0DC E6950000 ; SETLO
FFFFFFFFFFFFD0E0 EE800003 ; SETMID
FFFFFFFFFFFFD0E4 6A0D0429 outc r1,PSGFREQ0
; decay (16.384 ms)2
; attack (8.192 ms)1
; release (1.024 s)A
; sustain level C
FFFFFFFFFFFFCA00 E07FCA12 setlo r1,#0xCA12
FFFFFFFFFFFFCA04 E6950006 ; SETLO
FFFFFFFFFFFFCA08 EE800003 ; SETMID
FFFFFFFFFFFFCA0C 6A0D0429 outc r1,PSGADSR0
FFFFFFFFFFFFCA10 16009104 ori r1,r0,#0x1104 ; gate, output enable, triangle waveform
FFFFFFFFFFFFCA14 E6950004 ; SETLO
FFFFFFFFFFFFCA18 EE800003 ; SETMID
FFFFFFFFFFFFCA1C 6A0D0429 outc r1,PSGCTRL0
FFFFFFFFFFFFCA20 E683D090 ; SETLO
FFFFFFFFFFFFCA24 040D0409 ori r1,r0,#250000 ; delay about 10ms
FFFFFFFFFFFFCA28 tone1:
FFFFFFFFFFFFCA28 BE00800F loop r1,tone1
FFFFFFFFFFFFCA2C 16008104 ori r1,r0,#0x0104 ; gate off, output enable, triangle waveform
FFFFFFFFFFFFCA30 E6950004 ; SETLO
FFFFFFFFFFFFCA34 EE800003 ; SETMID
FFFFFFFFFFFFCA38 6A0D0429 outc r1,PSGCTRL0
FFFFFFFFFFFFCA3C E683D090 ; SETLO
FFFFFFFFFFFFCA40 040D0409 ori r1,r0,#250000 ; delay about 10ms
FFFFFFFFFFFFCA44 tone2:
FFFFFFFFFFFFCA44 BE00800F loop r1,tone2
FFFFFFFFFFFFCA48 16008000 ori r1,r0,#0x0000 ; gate off, output enable off, no waveform
FFFFFFFFFFFFCA4C E6950004 ; SETLO
FFFFFFFFFFFFCA50 EE800003 ; SETMID
FFFFFFFFFFFFCA54 6A0D0429 outc r1,PSGCTRL0
FFFFFFFFFFFFCA58 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFCA5C 47E08000 lw r1,[sp]
FFFFFFFFFFFFCA60 37EF8010 ret #16
FFFFFFFFFFFFD0E8 E07FCA12 setlo r1,#0xCA12
FFFFFFFFFFFFD0EC E6950006 ; SETLO
FFFFFFFFFFFFD0F0 EE800003 ; SETMID
FFFFFFFFFFFFD0F4 6A0D0429 outc r1,PSGADSR0
FFFFFFFFFFFFD0F8 16009104 ori r1,r0,#0x1104 ; gate, output enable, triangle waveform
FFFFFFFFFFFFD0FC E6950004 ; SETLO
FFFFFFFFFFFFD100 EE800003 ; SETMID
FFFFFFFFFFFFD104 6A0D0429 outc r1,PSGCTRL0
FFFFFFFFFFFFD108 E683D090 ; SETLO
FFFFFFFFFFFFD10C 040D0409 ori r1,r0,#250000 ; delay about 10ms
FFFFFFFFFFFFD110 tone1:
FFFFFFFFFFFFD110 BE00800F loop r1,tone1
FFFFFFFFFFFFD114 16008104 ori r1,r0,#0x0104 ; gate off, output enable, triangle waveform
FFFFFFFFFFFFD118 E6950004 ; SETLO
FFFFFFFFFFFFD11C EE800003 ; SETMID
FFFFFFFFFFFFD120 6A0D0429 outc r1,PSGCTRL0
FFFFFFFFFFFFD124 E683D090 ; SETLO
FFFFFFFFFFFFD128 040D0409 ori r1,r0,#250000 ; delay about 10ms
FFFFFFFFFFFFD12C tone2:
FFFFFFFFFFFFD12C BE00800F loop r1,tone2
FFFFFFFFFFFFD130 16008000 ori r1,r0,#0x0000 ; gate off, output enable off, no waveform
FFFFFFFFFFFFD134 E6950004 ; SETLO
FFFFFFFFFFFFD138 EE800003 ; SETMID
FFFFFFFFFFFFD13C 6A0D0429 outc r1,PSGCTRL0
FFFFFFFFFFFFD140 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFD144 47E08000 lw r1,[sp]
FFFFFFFFFFFFD148 37EF8010 ret #16
;==============================================================================
;==============================================================================
FFFFFFFFFFFFCA64 SetupRasterIRQ:
FFFFFFFFFFFFCA64 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFCA68 67E08000 sw r1,[sp]
FFFFFFFFFFFFCA6C E04000C8 setlo r1,#200
FFFFFFFFFFFFCA70 E69A0100 ; SETLO
FFFFFFFFFFFFCA74 EE800003 ; SETMID
FFFFFFFFFFFFCA78 6A0D0429 outc r1,RASTERIRQ
FFFFFFFFFFFFCA7C E04000F0 setlo r1,#240
FFFFFFFFFFFFCA80 E69A0102 ; SETLO
FFFFFFFFFFFFCA84 EE800003 ; SETMID
FFFFFFFFFFFFCA88 6A0D0429 outc r1,RASTERIRQ+2
FFFFFFFFFFFFCA8C E0400118 setlo r1,#280
FFFFFFFFFFFFCA90 E69A0104 ; SETLO
FFFFFFFFFFFFCA94 EE800003 ; SETMID
FFFFFFFFFFFFCA98 6A0D0429 outc r1,RASTERIRQ+4
FFFFFFFFFFFFCA9C E0400140 setlo r1,#320
FFFFFFFFFFFFCAA0 E69A0106 ; SETLO
FFFFFFFFFFFFCAA4 EE800003 ; SETMID
FFFFFFFFFFFFCAA8 6A0D0429 outc r1,RASTERIRQ+6
FFFFFFFFFFFFCAAC E0400168 setlo r1,#360
FFFFFFFFFFFFCAB0 E69A0108 ; SETLO
FFFFFFFFFFFFCAB4 EE800003 ; SETMID
FFFFFFFFFFFFCAB8 6A0D0429 outc r1,RASTERIRQ+8
FFFFFFFFFFFFCABC 47E08000 lw r1,[sp]
FFFFFFFFFFFFCAC0 37EF8008 ret #8
FFFFFFFFFFFFD14C SetupRasterIRQ:
FFFFFFFFFFFFD14C 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFD150 67E08000 sw r1,[sp]
FFFFFFFFFFFFD154 E04000C8 setlo r1,#200
FFFFFFFFFFFFD158 E69A0100 ; SETLO
FFFFFFFFFFFFD15C EE800003 ; SETMID
FFFFFFFFFFFFD160 6A0D0429 outc r1,RASTERIRQ
FFFFFFFFFFFFD164 E04000F0 setlo r1,#240
FFFFFFFFFFFFD168 E69A0102 ; SETLO
FFFFFFFFFFFFD16C EE800003 ; SETMID
FFFFFFFFFFFFD170 6A0D0429 outc r1,RASTERIRQ+2
FFFFFFFFFFFFD174 E0400118 setlo r1,#280
FFFFFFFFFFFFD178 E69A0104 ; SETLO
FFFFFFFFFFFFD17C EE800003 ; SETMID
FFFFFFFFFFFFD180 6A0D0429 outc r1,RASTERIRQ+4
FFFFFFFFFFFFD184 E0400140 setlo r1,#320
FFFFFFFFFFFFD188 E69A0106 ; SETLO
FFFFFFFFFFFFD18C EE800003 ; SETMID
FFFFFFFFFFFFD190 6A0D0429 outc r1,RASTERIRQ+6
FFFFFFFFFFFFD194 E0400168 setlo r1,#360
FFFFFFFFFFFFD198 E69A0108 ; SETLO
FFFFFFFFFFFFD19C EE800003 ; SETMID
FFFFFFFFFFFFD1A0 6A0D0429 outc r1,RASTERIRQ+8
FFFFFFFFFFFFD1A4 47E08000 lw r1,[sp]
FFFFFFFFFFFFD1A8 37EF8008 ret #8
FFFFFFFFFFFFCAC4 RasterIRQfn:
FFFFFFFFFFFFCAC4 E69A011E ; SETLO
FFFFFFFFFFFFCAC8 EE800003 ; SETMID
FFFFFFFFFFFFCACC 6A0D0421 inch r1,RASTERIRQ+30 ; get the raster compare register # (clears IRQ)
FFFFFFFFFFFFCAD0 B0100901 beqi r1,#1,rirq1
FFFFFFFFFFFFCAD4 B0100802 beqi r1,#2,rirq2
FFFFFFFFFFFFCAD8 B0100703 beqi r1,#3,rirq3
FFFFFFFFFFFFCADC B0100604 beqi r1,#4,rirq4
FFFFFFFFFFFFCAE0 B0100505 beqi r1,#5,rirq5
FFFFFFFFFFFFCAE4 B0100406 beqi r1,#6,rirq6
FFFFFFFFFFFFCAE8 B0100307 beqi r1,#7,rirq7
FFFFFFFFFFFFCAEC B0100208 beqi r1,#8,rirq8
FFFFFFFFFFFFCAF0 37EF8000 ret
FFFFFFFFFFFFCAF4 rirq1:
FFFFFFFFFFFFCAF4 rirq2:
FFFFFFFFFFFFCAF4 rirq3:
FFFFFFFFFFFFCAF4 rirq4:
FFFFFFFFFFFFCAF4 rirq5:
FFFFFFFFFFFFCAF4 rirq6:
FFFFFFFFFFFFCAF4 rirq7:
FFFFFFFFFFFFCAF4 rirq8:
FFFFFFFFFFFFCAF4 1A108028 mului r1,r1,#40
FFFFFFFFFFFFCAF8 0A1080CC addui r1,r1,#204
FFFFFFFFFFFFCAFC E69AD002 ; SETLO
FFFFFFFFFFFFCB00 EE800003 ; SETMID
FFFFFFFFFFFFCB04 6A0D0429 outc r1,SPRITEREGS+2
FFFFFFFFFFFFCB08 E69AD012 ; SETLO
FFFFFFFFFFFFCB0C EE800003 ; SETMID
FFFFFFFFFFFFCB10 6A0D0429 outc r1,SPRITEREGS+18
FFFFFFFFFFFFCB14 E69AD022 ; SETLO
FFFFFFFFFFFFCB18 EE800003 ; SETMID
FFFFFFFFFFFFCB1C 6A0D0429 outc r1,SPRITEREGS+34
FFFFFFFFFFFFCB20 E69AD032 ; SETLO
FFFFFFFFFFFFCB24 EE800003 ; SETMID
FFFFFFFFFFFFCB28 6A0D0429 outc r1,SPRITEREGS+50
FFFFFFFFFFFFCB2C E69AD042 ; SETLO
FFFFFFFFFFFFCB30 EE800003 ; SETMID
FFFFFFFFFFFFCB34 6A0D0429 outc r1,SPRITEREGS+66
FFFFFFFFFFFFCB38 E69AD052 ; SETLO
FFFFFFFFFFFFCB3C EE800003 ; SETMID
FFFFFFFFFFFFCB40 6A0D0429 outc r1,SPRITEREGS+82
FFFFFFFFFFFFCB44 E69AD062 ; SETLO
FFFFFFFFFFFFCB48 EE800003 ; SETMID
FFFFFFFFFFFFCB4C 6A0D0429 outc r1,SPRITEREGS+98
FFFFFFFFFFFFCB50 E69AD072 ; SETLO
FFFFFFFFFFFFCB54 EE800003 ; SETMID
FFFFFFFFFFFFCB58 6A0D0429 outc r1,SPRITEREGS+114
FFFFFFFFFFFFCB5C 37EF8000 ret
FFFFFFFFFFFFD1AC RasterIRQfn:
FFFFFFFFFFFFD1AC E69A011E ; SETLO
FFFFFFFFFFFFD1B0 EE800003 ; SETMID
FFFFFFFFFFFFD1B4 6A0D0421 inch r1,RASTERIRQ+30 ; get the raster compare register # (clears IRQ)
FFFFFFFFFFFFD1B8 B0100901 beqi r1,#1,rirq1
FFFFFFFFFFFFD1BC B0100802 beqi r1,#2,rirq2
FFFFFFFFFFFFD1C0 B0100703 beqi r1,#3,rirq3
FFFFFFFFFFFFD1C4 B0100604 beqi r1,#4,rirq4
FFFFFFFFFFFFD1C8 B0100505 beqi r1,#5,rirq5
FFFFFFFFFFFFD1CC B0100406 beqi r1,#6,rirq6
FFFFFFFFFFFFD1D0 B0100307 beqi r1,#7,rirq7
FFFFFFFFFFFFD1D4 B0100208 beqi r1,#8,rirq8
FFFFFFFFFFFFD1D8 37EF8000 ret
FFFFFFFFFFFFD1DC rirq1:
FFFFFFFFFFFFD1DC rirq2:
FFFFFFFFFFFFD1DC rirq3:
FFFFFFFFFFFFD1DC rirq4:
FFFFFFFFFFFFD1DC rirq5:
FFFFFFFFFFFFD1DC rirq6:
FFFFFFFFFFFFD1DC rirq7:
FFFFFFFFFFFFD1DC rirq8:
FFFFFFFFFFFFD1DC 1A108028 mului r1,r1,#40
FFFFFFFFFFFFD1E0 0A1080CC addui r1,r1,#204
FFFFFFFFFFFFD1E4 E69AD002 ; SETLO
FFFFFFFFFFFFD1E8 EE800003 ; SETMID
FFFFFFFFFFFFD1EC 6A0D0429 outc r1,SPRITEREGS+2
FFFFFFFFFFFFD1F0 E69AD012 ; SETLO
FFFFFFFFFFFFD1F4 EE800003 ; SETMID
FFFFFFFFFFFFD1F8 6A0D0429 outc r1,SPRITEREGS+18
FFFFFFFFFFFFD1FC E69AD022 ; SETLO
FFFFFFFFFFFFD200 EE800003 ; SETMID
FFFFFFFFFFFFD204 6A0D0429 outc r1,SPRITEREGS+34
FFFFFFFFFFFFD208 E69AD032 ; SETLO
FFFFFFFFFFFFD20C EE800003 ; SETMID
FFFFFFFFFFFFD210 6A0D0429 outc r1,SPRITEREGS+50
FFFFFFFFFFFFD214 E69AD042 ; SETLO
FFFFFFFFFFFFD218 EE800003 ; SETMID
FFFFFFFFFFFFD21C 6A0D0429 outc r1,SPRITEREGS+66
FFFFFFFFFFFFD220 E69AD052 ; SETLO
FFFFFFFFFFFFD224 EE800003 ; SETMID
FFFFFFFFFFFFD228 6A0D0429 outc r1,SPRITEREGS+82
FFFFFFFFFFFFD22C E69AD062 ; SETLO
FFFFFFFFFFFFD230 EE800003 ; SETMID
FFFFFFFFFFFFD234 6A0D0429 outc r1,SPRITEREGS+98
FFFFFFFFFFFFD238 E69AD072 ; SETLO
FFFFFFFFFFFFD23C EE800003 ; SETMID
FFFFFFFFFFFFD240 6A0D0429 outc r1,SPRITEREGS+114
FFFFFFFFFFFFD244 37EF8000 ret
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
FFFFFFFFFFFFCB60 DisplayDatetime:
FFFFFFFFFFFFCB60 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFCB64 67E08000 sw r1,[sp]
FFFFFFFFFFFFCB68 67E10008 sw r2,8[sp]
FFFFFFFFFFFFCB6C 67E18010 sw r3,16[sp]
FFFFFFFFFFFFCB70 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFCB74 31FFEEBA call CursorOff
FFFFFFFFFFFFCB78 42011416 lc r2,CursorRow
FFFFFFFFFFFFCB7C 42019418 lc r3,CursorCol
FFFFFFFFFFFFCB80 E69C0418 ; SETLO
FFFFFFFFFFFFCB84 EE800003 ; SETMID
FFFFFFFFFFFFCB88 6A0D002B outw r0,DATETIME+24 ; trigger a snapshot
FFFFFFFFFFFFCB8C 1600802E lw r1,#46 ; move cursor down to last display line
FFFFFFFFFFFFCB90 62009416 sc r1,CursorRow
FFFFFFFFFFFFCB94 16008040 lw r1,#64
FFFFFFFFFFFFCB98 62009418 sc r1,CursorCol
FFFFFFFFFFFFCB9C E69C0400 ; SETLO
FFFFFFFFFFFFCBA0 EE800003 ; SETMID
FFFFFFFFFFFFCBA4 6A0D0423 inw r1,DATETIME ; get the snapshotted date and time
FFFFFFFFFFFFCBA8 31FFF019 call DisplayWord ; display on screen
FFFFFFFFFFFFCBAC 62011416 sc r2,CursorRow ; restore cursor position
FFFFFFFFFFFFCBB0 62019418 sc r3,CursorCol
FFFFFFFFFFFFCBB4 31FFEF37 call CalcScreenLoc
FFFFFFFFFFFFCBB8 31FFEEBF call CursorOn
FFFFFFFFFFFFCBBC 47EF8018 lw lr,24[sp]
FFFFFFFFFFFFCBC0 47E18010 lw r3,16[sp]
FFFFFFFFFFFFCBC4 47E10008 lw r2,8[sp]
FFFFFFFFFFFFCBC8 47E08000 lw r1,[sp]
FFFFFFFFFFFFCBCC 37EF8020 ret #32
FFFFFFFFFFFFD248 DisplayDatetime:
FFFFFFFFFFFFD248 0FEF0030 subui sp,sp,#48
FFFFFFFFFFFFD24C 67E08000 sw r1,[sp]
FFFFFFFFFFFFD250 67E10008 sw r2,8[sp]
FFFFFFFFFFFFD254 67E18010 sw r3,16[sp]
FFFFFFFFFFFFD258 67E20018 sw r4,24[sp]
FFFFFFFFFFFFD25C 67E28020 sw r5,32[sp]
FFFFFFFFFFFFD260 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFD264 31FFEFF2 call CursorOff
FFFFFFFFFFFFD268 16008003 lw r1,#3 ; get cursor position
FFFFFFFFFFFFD26C 0181CD17 syscall #410
FFFFFFFFFFFFD270 02120009 mov r4,r1 ; r4 = row
FFFFFFFFFFFFD274 02228009 mov r5,r2 ; r5 = col
FFFFFFFFFFFFD278 16008002 lw r1,#2 ; set cursor position
FFFFFFFFFFFFD27C 1601002E lw r2,#46 ; move cursor down to last display line
FFFFFFFFFFFFD280 16018040 lw r3,#64
FFFFFFFFFFFFD284 0181CD17 syscall #410
FFFFFFFFFFFFD288 16008001 lw r1,#1 ; get the snapshotted date and time
FFFFFFFFFFFFD28C 0181D017 syscall #416
FFFFFFFFFFFFD290 31FFF169 call DisplayWord ; display on screen
FFFFFFFFFFFFD294 16008002 lw r1,#2 ; restore cursor position
FFFFFFFFFFFFD298 02410009 mov r2,r4 ; r2 = row
FFFFFFFFFFFFD29C 02518009 mov r3,r5 ; r3 = col
FFFFFFFFFFFFD2A0 0181CD17 syscall #410
FFFFFFFFFFFFD2A4 31FFEFF7 call CursorOn
FFFFFFFFFFFFD2A8 47EF8018 lw lr,24[sp]
FFFFFFFFFFFFD2AC 47E18010 lw r3,16[sp]
FFFFFFFFFFFFD2B0 47E10008 lw r2,8[sp]
FFFFFFFFFFFFD2B4 47E08000 lw r1,[sp]
FFFFFFFFFFFFD2B8 47E20018 lw r4,24[sp]
FFFFFFFFFFFFD2BC 47E28020 lw r5,32[sp]
FFFFFFFFFFFFD2C0 37EF8030 ret #48
;==============================================================================
;==============================================================================
FFFFFFFFFFFFCBD0 InitializeGame:
FFFFFFFFFFFFCBD0 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFCBD4 27F40000004 sm [sp],r3/lr
FFFFFFFFFFFFCBD8 E0C00140 setlo r3,#320
FFFFFFFFFFFFCBDC 62019508 sc r3,Manpos
FFFFFFFFFFFFCBE0 62001500 sc r0,Score
FFFFFFFFFFFFCBE4 60001510 sb r0,MissileActive
FFFFFFFFFFFFCBE8 62001512 sc r0,MissileX
FFFFFFFFFFFFCBEC 62001514 sc r0,MissileY
FFFFFFFFFFFFCBF0 27740000004 lm [sp],r3/lr
FFFFFFFFFFFFCBF4 37EF8010 ret #16
FFFFFFFFFFFFD2C4 InitializeGame:
FFFFFFFFFFFFD2C4 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFD2C8 27F40000004 sm [sp],r3/lr
FFFFFFFFFFFFD2CC E0C00140 setlo r3,#320
FFFFFFFFFFFFD2D0 62019508 sc r3,Manpos
FFFFFFFFFFFFD2D4 62001500 sc r0,Score
FFFFFFFFFFFFD2D8 60001510 sb r0,MissileActive
FFFFFFFFFFFFD2DC 62001512 sc r0,MissileX
FFFFFFFFFFFFD2E0 62001514 sc r0,MissileY
FFFFFFFFFFFFD2E4 27740000004 lm [sp],r3/lr
FFFFFFFFFFFFD2E8 37EF8010 ret #16
FFFFFFFFFFFFCBF8 DrawScore:
FFFFFFFFFFFFCBF8 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFCBFC 27F40000005 sm [sp],r1/r3/lr
FFFFFFFFFFFFCC00 E0C00001 setlo r3,#1
FFFFFFFFFFFFCC04 60019416 sb r3,CursorRow
FFFFFFFFFFFFCC08 E0C00028 setlo r3,#40
FFFFFFFFFFFFCC0C 60019418 sb r3,CursorCol
FFFFFFFFFFFFCC10 40009500 lb r1,Score
FFFFFFFFFFFFCC14 31FFF00F call DisplayByte
FFFFFFFFFFFFCC18 40009501 lb r1,Score+1
FFFFFFFFFFFFCC1C 31FFF00F call DisplayByte
FFFFFFFFFFFFCC20 27740000005 lm [sp],r1/r3/lr
FFFFFFFFFFFFCC24 37EF8018 ret #24
FFFFFFFFFFFFD2EC DrawScore:
FFFFFFFFFFFFD2EC 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFD2F0 27F40000005 sm [sp],r1/r3/lr
FFFFFFFFFFFFD2F4 E0C00001 setlo r3,#1
FFFFFFFFFFFFD2F8 60019417 sb r3,CursorRow
FFFFFFFFFFFFD2FC E0C00028 setlo r3,#40
FFFFFFFFFFFFD300 60019418 sb r3,CursorCol
FFFFFFFFFFFFD304 40009500 lb r1,Score
FFFFFFFFFFFFD308 31FFF14B call DisplayByte
FFFFFFFFFFFFD30C 40009501 lb r1,Score+1
FFFFFFFFFFFFD310 31FFF14B call DisplayByte
FFFFFFFFFFFFD314 27740000005 lm [sp],r1/r3/lr
FFFFFFFFFFFFD318 37EF8018 ret #24
FFFFFFFFFFFFCC28 DrawMissile:
FFFFFFFFFFFFCC28 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFCC2C 27F40000001 sm [sp],r1/lr
FFFFFFFFFFFFCC30 42009514 lc r1,MissileY
FFFFFFFFFFFFCC34 AC101402 bleu r1,#2,MissileOff
FFFFFFFFFFFFCC38 42009512 lc r1,MissileX
FFFFFFFFFFFFCC3C 06108601 shrui r1,r1,#3
FFFFFFFFFFFFCC40 60009418 sb r1,CursorCol
FFFFFFFFFFFFCC44 42009514 lc r1,MissileY
FFFFFFFFFFFFCC48 60009416 sb r1,CursorRow
FFFFFFFFFFFFCC4C 0E108001 subui r1,r1,#1
FFFFFFFFFFFFCC50 62009514 sc r1,MissileY
FFFFFFFFFFFFCC54 E040005E setlo r1,#'^'
FFFFFFFFFFFFCC58 31FFEF47 call DisplayChar
FFFFFFFFFFFFCC5C 40009418 lb r1,CursorCol
FFFFFFFFFFFFCC60 0E108001 subui r1,r1,#1
FFFFFFFFFFFFCC64 60009418 sb r1,CursorCol
FFFFFFFFFFFFCC68 40009416 lb r1,CursorRow
FFFFFFFFFFFFCC6C 0E108001 subui r1,r1,#1
FFFFFFFFFFFFCC70 60009416 sb r1,CursorRow
FFFFFFFFFFFFCC74 E0400020 setlo r1,#' '
FFFFFFFFFFFFCC78 31FFEF47 call DisplayChar
FFFFFFFFFFFFCC7C 27740000001 lm [sp],r1/lr
FFFFFFFFFFFFCC80 37EF8010 ret #16
FFFFFFFFFFFFCC84 MissileOff:
FFFFFFFFFFFFCC84 60001510 sb r0,MissileActive
FFFFFFFFFFFFCC88 42009512 lc r1,MissileX
FFFFFFFFFFFFCC8C 06108601 shrui r1,r1,#3
FFFFFFFFFFFFCC90 60009418 sb r1,CursorCol
FFFFFFFFFFFFCC94 42009514 lc r1,MissileY
FFFFFFFFFFFFCC98 60009416 sb r1,CursorRow
FFFFFFFFFFFFCC9C E0400020 setlo r1,#' '
FFFFFFFFFFFFCCA0 31FFEF47 call DisplayChar
FFFFFFFFFFFFCCA4 27740000001 lm [sp],r1/lr
FFFFFFFFFFFFCCA8 37EF8010 ret #16
FFFFFFFFFFFFD31C DrawMissile:
FFFFFFFFFFFFD31C 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFD320 27F40000001 sm [sp],r1/lr
FFFFFFFFFFFFD324 42009514 lc r1,MissileY
FFFFFFFFFFFFD328 AC101402 bleu r1,#2,MissileOff
FFFFFFFFFFFFD32C 42009512 lc r1,MissileX
FFFFFFFFFFFFD330 06108601 shrui r1,r1,#3
FFFFFFFFFFFFD334 60009418 sb r1,CursorCol
FFFFFFFFFFFFD338 42009514 lc r1,MissileY
FFFFFFFFFFFFD33C 60009417 sb r1,CursorRow
FFFFFFFFFFFFD340 0E108001 subui r1,r1,#1
FFFFFFFFFFFFD344 62009514 sc r1,MissileY
FFFFFFFFFFFFD348 E040005E setlo r1,#'^'
FFFFFFFFFFFFD34C 31FFF07F call DisplayChar
FFFFFFFFFFFFD350 40009418 lb r1,CursorCol
FFFFFFFFFFFFD354 0E108001 subui r1,r1,#1
FFFFFFFFFFFFD358 60009418 sb r1,CursorCol
FFFFFFFFFFFFD35C 40009417 lb r1,CursorRow
FFFFFFFFFFFFD360 0E108001 subui r1,r1,#1
FFFFFFFFFFFFD364 60009417 sb r1,CursorRow
FFFFFFFFFFFFD368 E0400020 setlo r1,#' '
FFFFFFFFFFFFD36C 31FFF07F call DisplayChar
FFFFFFFFFFFFD370 27740000001 lm [sp],r1/lr
FFFFFFFFFFFFD374 37EF8010 ret #16
FFFFFFFFFFFFD378 MissileOff:
FFFFFFFFFFFFD378 60001510 sb r0,MissileActive
FFFFFFFFFFFFD37C 42009512 lc r1,MissileX
FFFFFFFFFFFFD380 06108601 shrui r1,r1,#3
FFFFFFFFFFFFD384 60009418 sb r1,CursorCol
FFFFFFFFFFFFD388 42009514 lc r1,MissileY
FFFFFFFFFFFFD38C 60009417 sb r1,CursorRow
FFFFFFFFFFFFD390 E0400020 setlo r1,#' '
FFFFFFFFFFFFD394 31FFF07F call DisplayChar
FFFFFFFFFFFFD398 27740000001 lm [sp],r1/lr
FFFFFFFFFFFFD39C 37EF8010 ret #16
FFFFFFFFFFFFCCAC DrawMan:
FFFFFFFFFFFFCCAC 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFCCB0 27F40000005 sm [sp],r1/r3/lr
FFFFFFFFFFFFCCB4 E0C0002E setlo r3,#46
FFFFFFFFFFFFCCB8 60019416 sb r3,CursorRow
FFFFFFFFFFFFCCBC 42019508 lc r3,Manpos
FFFFFFFFFFFFCCC0 06318601 shrui r3,r3,#3
FFFFFFFFFFFFCCC4 60019418 sb r3,CursorCol
FFFFFFFFFFFFCCC8 E0400020 setlo r1,#' '
FFFFFFFFFFFFCCCC 31FFEF47 call DisplayChar
FFFFFFFFFFFFCCD0 E0400023 setlo r1,#'#'
FFFFFFFFFFFFCCD4 31FFEF47 call DisplayChar
FFFFFFFFFFFFCCD8 E0400041 setlo r1,#'A'
FFFFFFFFFFFFCCDC 31FFEF47 call DisplayChar
FFFFFFFFFFFFCCE0 E0400023 setlo r1,#'#'
FFFFFFFFFFFFCCE4 31FFEF47 call DisplayChar
FFFFFFFFFFFFCCE8 E0400020 setlo r1,#' '
FFFFFFFFFFFFCCEC 31FFEF47 call DisplayChar
FFFFFFFFFFFFCCF0 27740000005 lm [sp],r1/r3/lr
FFFFFFFFFFFFCCF4 37EF8018 ret #24
FFFFFFFFFFFFD3A0 DrawMan:
FFFFFFFFFFFFD3A0 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFD3A4 27F40000005 sm [sp],r1/r3/lr
FFFFFFFFFFFFD3A8 E0C0002E setlo r3,#46
FFFFFFFFFFFFD3AC 60019417 sb r3,CursorRow
FFFFFFFFFFFFD3B0 42019508 lc r3,Manpos
FFFFFFFFFFFFD3B4 06318601 shrui r3,r3,#3
FFFFFFFFFFFFD3B8 60019418 sb r3,CursorCol
FFFFFFFFFFFFD3BC E0400020 setlo r1,#' '
FFFFFFFFFFFFD3C0 31FFF07F call DisplayChar
FFFFFFFFFFFFD3C4 E0400023 setlo r1,#'#'
FFFFFFFFFFFFD3C8 31FFF07F call DisplayChar
FFFFFFFFFFFFD3CC E0400041 setlo r1,#'A'
FFFFFFFFFFFFD3D0 31FFF07F call DisplayChar
FFFFFFFFFFFFD3D4 E0400023 setlo r1,#'#'
FFFFFFFFFFFFD3D8 31FFF07F call DisplayChar
FFFFFFFFFFFFD3DC E0400020 setlo r1,#' '
FFFFFFFFFFFFD3E0 31FFF07F call DisplayChar
FFFFFFFFFFFFD3E4 27740000005 lm [sp],r1/r3/lr
FFFFFFFFFFFFD3E8 37EF8018 ret #24
FFFFFFFFFFFFCCF8 DrawInvader:
FFFFFFFFFFFFCCF8 46018000 lw r3,InvaderPos
FFFFFFFFFFFFCCFC 160080E9 lw r1,#233
FFFFFFFFFFFFCD00 62308000 sc r1,[r3]
FFFFFFFFFFFFCD04 160080F2 lw r1,#242
FFFFFFFFFFFFCD08 62308001 sc r1,1[r3]
FFFFFFFFFFFFCD0C 160080DF lw r1,#223
FFFFFFFFFFFFCD10 62308002 sc r1,2[r3]
FFFFFFFFFFFFCD14 37EF8000 ret
FFFFFFFFFFFFD3EC DrawInvader:
FFFFFFFFFFFFD3EC 46018000 lw r3,InvaderPos
FFFFFFFFFFFFD3F0 160080E9 lw r1,#233
FFFFFFFFFFFFD3F4 62308000 sc r1,[r3]
FFFFFFFFFFFFD3F8 160080F2 lw r1,#242
FFFFFFFFFFFFD3FC 62308001 sc r1,1[r3]
FFFFFFFFFFFFD400 160080DF lw r1,#223
FFFFFFFFFFFFD404 62308002 sc r1,2[r3]
FFFFFFFFFFFFD408 37EF8000 ret
FFFFFFFFFFFFCD18 DrawInvaders:
FFFFFFFFFFFFCD18 0FEF0028 subui sp,sp,#40
FFFFFFFFFFFFCD1C 27F4000000F sm [sp],r1/r2/r3/r4/lr
FFFFFFFFFFFFCD20 42009520 lc r1,InvadersRow1
FFFFFFFFFFFFCD24 42021570 lc r4,InvadersColpos
FFFFFFFFFFFFCD28 14110001 andi r2,r1,#1
FFFFFFFFFFFFCD2C BE2003A8 beq r2,r0,dinv1
FFFFFFFFFFFFCD30 40019571 lb r3,InvadersRowpos
FFFFFFFFFFFFCD34 60019416 sb r3,CursorRow
FFFFFFFFFFFFCD38 60021418 sb r4,CursorCol
FFFFFFFFFFFFCD3C E0400020 setlo r1,#' '
FFFFFFFFFFFFCD40 31FFF00F call DisplayByte
FFFFFFFFFFFFCD44 E0400023 setlo r1,#'#'
FFFFFFFFFFFFCD48 31FFF00F call DisplayByte
FFFFFFFFFFFFCD4C E0400023 setlo r1,#'#'
FFFFFFFFFFFFCD50 31FFF00F call DisplayByte
FFFFFFFFFFFFCD54 E0400023 setlo r1,#'#'
FFFFFFFFFFFFCD58 31FFF00F call DisplayByte
FFFFFFFFFFFFCD5C E0400020 setlo r1,#' '
FFFFFFFFFFFFCD60 31FFF00F call DisplayByte
FFFFFFFFFFFFCD64 40009416 lb r1,CursorRow
FFFFFFFFFFFFCD68 0A108001 addui r1,r1,#1
FFFFFFFFFFFFCD6C 60009416 sb r1,CursorRow
FFFFFFFFFFFFCD70 40009418 lb r1,CursorCol
FFFFFFFFFFFFCD74 0E108005 subui r1,r1,#5
FFFFFFFFFFFFCD78 E0400020 setlo r1,#' '
FFFFFFFFFFFFCD7C 31FFF00F call DisplayByte
FFFFFFFFFFFFCD80 E0400058 setlo r1,#'X'
FFFFFFFFFFFFCD84 31FFF00F call DisplayByte
FFFFFFFFFFFFCD88 E0400020 setlo r1,#' '
FFFFFFFFFFFFCD8C 31FFF00F call DisplayByte
FFFFFFFFFFFFCD90 E0400058 setlo r1,#'X'
FFFFFFFFFFFFCD94 31FFF00F call DisplayByte
FFFFFFFFFFFFCD98 E0400020 setlo r1,#' '
FFFFFFFFFFFFCD9C 31FFF00F call DisplayByte
FFFFFFFFFFFFCDA0 dinv1:
FFFFFFFFFFFFCDA0 2774000000F lm [sp],r1/r2/r3/r4/lr
FFFFFFFFFFFFCDA4 37EF8028 ret #40
FFFFFFFFFFFFCDA8 DrawBombs:
FFFFFFFFFFFFCDA8 37EF8000 ret
FFFFFFFFFFFFD40C DrawInvaders:
FFFFFFFFFFFFD40C 0FEF0028 subui sp,sp,#40
FFFFFFFFFFFFD410 27F4000000F sm [sp],r1/r2/r3/r4/lr
FFFFFFFFFFFFD414 42009520 lc r1,InvadersRow1
FFFFFFFFFFFFD418 42021570 lc r4,InvadersColpos
FFFFFFFFFFFFD41C 14110001 andi r2,r1,#1
FFFFFFFFFFFFD420 BE2003A8 beq r2,r0,dinv1
FFFFFFFFFFFFD424 40019571 lb r3,InvadersRowpos
FFFFFFFFFFFFD428 60019417 sb r3,CursorRow
FFFFFFFFFFFFD42C 60021418 sb r4,CursorCol
FFFFFFFFFFFFD430 E0400020 setlo r1,#' '
FFFFFFFFFFFFD434 31FFF14B call DisplayByte
FFFFFFFFFFFFD438 E0400023 setlo r1,#'#'
FFFFFFFFFFFFD43C 31FFF14B call DisplayByte
FFFFFFFFFFFFD440 E0400023 setlo r1,#'#'
FFFFFFFFFFFFD444 31FFF14B call DisplayByte
FFFFFFFFFFFFD448 E0400023 setlo r1,#'#'
FFFFFFFFFFFFD44C 31FFF14B call DisplayByte
FFFFFFFFFFFFD450 E0400020 setlo r1,#' '
FFFFFFFFFFFFD454 31FFF14B call DisplayByte
FFFFFFFFFFFFD458 40009417 lb r1,CursorRow
FFFFFFFFFFFFD45C 0A108001 addui r1,r1,#1
FFFFFFFFFFFFD460 60009417 sb r1,CursorRow
FFFFFFFFFFFFD464 40009418 lb r1,CursorCol
FFFFFFFFFFFFD468 0E108005 subui r1,r1,#5
FFFFFFFFFFFFD46C E0400020 setlo r1,#' '
FFFFFFFFFFFFD470 31FFF14B call DisplayByte
FFFFFFFFFFFFD474 E0400058 setlo r1,#'X'
FFFFFFFFFFFFD478 31FFF14B call DisplayByte
FFFFFFFFFFFFD47C E0400020 setlo r1,#' '
FFFFFFFFFFFFD480 31FFF14B call DisplayByte
FFFFFFFFFFFFD484 E0400058 setlo r1,#'X'
FFFFFFFFFFFFD488 31FFF14B call DisplayByte
FFFFFFFFFFFFD48C E0400020 setlo r1,#' '
FFFFFFFFFFFFD490 31FFF14B call DisplayByte
FFFFFFFFFFFFD494 dinv1:
FFFFFFFFFFFFD494 2774000000F lm [sp],r1/r2/r3/r4/lr
FFFFFFFFFFFFD498 37EF8028 ret #40
FFFFFFFFFFFFD49C DrawBombs:
FFFFFFFFFFFFD49C 37EF8000 ret
FFFFFFFFFFFFCDAC Invaders:
FFFFFFFFFFFFCDAC FFFFFFFFFFFF0000 subui sp,#240
FFFFFFFFFFFFCDB0 27F4000000F sm [sp],r1/r2/r3/r4/lr
FFFFFFFFFFFFCDB4 31FFF2F4 call InitializeGame
FFFFFFFFFFFFCDB8 InvadersLoop:
FFFFFFFFFFFFCDB8 31FFF2FE call DrawScore
FFFFFFFFFFFFCDBC 31FFF346 call DrawInvaders
FFFFFFFFFFFFCDC0 31FFF36A call DrawBombs
FFFFFFFFFFFFCDC4 31FFF30A call DrawMissile
FFFFFFFFFFFFCDC8 31FFF32B call DrawMan
FFFFFFFFFFFFCDCC TestMoveMan:
FFFFFFFFFFFFCDCC 31FFEE08 call KeybdGetChar
FFFFFFFFFFFFCDD0 B010046B beqi r1,#'k',MoveManRight
FFFFFFFFFFFFCDD4 B010096A beqi r1,#'j',MoveManLeft
FFFFFFFFFFFFCDD8 B0100D20 beqi r1,#' ',FireMissile
FFFFFFFFFFFFCDDC BE0002AA bra Invaders1
FFFFFFFFFFFFCDE0 MoveManRight:
FFFFFFFFFFFFCDE0 42011508 lc r2,Manpos
FFFFFFFFFFFFCDE4 E6800280 ; SETLO
FFFFFFFFFFFFCDE8 BE2D0247 bgtu r2,#640,Invaders1
FFFFFFFFFFFFCDEC 0A210008 addui r2,r2,#8
FFFFFFFFFFFFCDF0 62011508 sc r2,Manpos
FFFFFFFFFFFFCDF4 BE0001EA bra Invaders1
FFFFFFFFFFFFCDF8 MoveManLeft:
FFFFFFFFFFFFCDF8 42011508 lc r2,Manpos
FFFFFFFFFFFFCDFC BE2001A2 ble r2,r0,Invaders1
FFFFFFFFFFFFCE00 0E210008 subui r2,r2,#8
FFFFFFFFFFFFCE04 62011508 sc r2,Manpos
FFFFFFFFFFFFCE08 BE00014A bra Invaders1
FFFFFFFFFFFFCE0C FireMissile:
FFFFFFFFFFFFCE0C 40011510 lb r2,MissileActive
FFFFFFFFFFFFCE10 BE200109 bne r2,r0,Invaders1
FFFFFFFFFFFFCE14 E0800001 setlo r2,#1
FFFFFFFFFFFFCE18 60011510 sb r2,MissileActive
FFFFFFFFFFFFCE1C 42011508 lc r2,Manpos
FFFFFFFFFFFFCE20 62011512 sc r2,MissileX
FFFFFFFFFFFFCE24 E080002E setlo r2,#46
FFFFFFFFFFFFCE28 62011514 sc r2,MissileY
FFFFFFFFFFFFCE2C BE00002A bra Invaders1
FFFFFFFFFFFFCE30 Invaders1:
FFFFFFFFFFFFCE30 B0100203 beqi r1,#CTRLC,InvadersEnd
FFFFFFFFFFFFCE34 BE007C2A bra InvadersLoop
FFFFFFFFFFFFCE38 InvadersEnd:
FFFFFFFFFFFFCE38 2774000000F lm [sp],r1/r2/r3/r4/lr
FFFFFFFFFFFFCE3C 0BEF00F0 addui sp,sp,#240
FFFFFFFFFFFFCE40 BE0020CA bra Monitor
FFFFFFFFFFFFD4A0 Invaders:
FFFFFFFFFFFFD4A0 FFFFFFFFFFFF0000 subui sp,#240
FFFFFFFFFFFFD4A4 27F4000000F sm [sp],r1/r2/r3/r4/lr
FFFFFFFFFFFFD4A8 31FFF4B1 call InitializeGame
FFFFFFFFFFFFD4AC InvadersLoop:
FFFFFFFFFFFFD4AC 31FFF4BB call DrawScore
FFFFFFFFFFFFD4B0 31FFF503 call DrawInvaders
FFFFFFFFFFFFD4B4 31FFF527 call DrawBombs
FFFFFFFFFFFFD4B8 31FFF4C7 call DrawMissile
FFFFFFFFFFFFD4BC 31FFF4E8 call DrawMan
FFFFFFFFFFFFD4C0 TestMoveMan:
FFFFFFFFFFFFD4C0 31FFEF07 call KeybdGetChar
FFFFFFFFFFFFD4C4 B010046B beqi r1,#'k',MoveManRight
FFFFFFFFFFFFD4C8 B010096A beqi r1,#'j',MoveManLeft
FFFFFFFFFFFFD4CC B0100D20 beqi r1,#' ',FireMissile
FFFFFFFFFFFFD4D0 BE0002AA bra Invaders1
FFFFFFFFFFFFD4D4 MoveManRight:
FFFFFFFFFFFFD4D4 42011508 lc r2,Manpos
FFFFFFFFFFFFD4D8 E6800280 ; SETLO
FFFFFFFFFFFFD4DC BE2D0247 bgtu r2,#640,Invaders1
FFFFFFFFFFFFD4E0 0A210008 addui r2,r2,#8
FFFFFFFFFFFFD4E4 62011508 sc r2,Manpos
FFFFFFFFFFFFD4E8 BE0001EA bra Invaders1
FFFFFFFFFFFFD4EC MoveManLeft:
FFFFFFFFFFFFD4EC 42011508 lc r2,Manpos
FFFFFFFFFFFFD4F0 BE2001A2 ble r2,r0,Invaders1
FFFFFFFFFFFFD4F4 0E210008 subui r2,r2,#8
FFFFFFFFFFFFD4F8 62011508 sc r2,Manpos
FFFFFFFFFFFFD4FC BE00014A bra Invaders1
FFFFFFFFFFFFD500 FireMissile:
FFFFFFFFFFFFD500 40011510 lb r2,MissileActive
FFFFFFFFFFFFD504 BE200109 bne r2,r0,Invaders1
FFFFFFFFFFFFD508 E0800001 setlo r2,#1
FFFFFFFFFFFFD50C 60011510 sb r2,MissileActive
FFFFFFFFFFFFD510 42011508 lc r2,Manpos
FFFFFFFFFFFFD514 62011512 sc r2,MissileX
FFFFFFFFFFFFD518 E080002E setlo r2,#46
FFFFFFFFFFFFD51C 62011514 sc r2,MissileY
FFFFFFFFFFFFD520 BE00002A bra Invaders1
FFFFFFFFFFFFD524 Invaders1:
FFFFFFFFFFFFD524 B0100203 beqi r1,#CTRLC,InvadersEnd
FFFFFFFFFFFFD528 BE007C2A bra InvadersLoop
FFFFFFFFFFFFD52C InvadersEnd:
FFFFFFFFFFFFD52C 2774000000F lm [sp],r1/r2/r3/r4/lr
FFFFFFFFFFFFD530 0BEF00F0 addui sp,sp,#240
FFFFFFFFFFFFD534 BE0017AA bra Monitor
;==============================================================================
;==============================================================================
;
; Initialize the SD card
; Returns
; r = 0 if successful, 1 otherwise
;
FFFFFFFFFFFFD538 spi_init:
FFFFFFFFFFFFD538 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFD53C 67EF8000 sw lr,[sp]
FFFFFFFFFFFFD540 67E10008 sw r2,8[sp]
FFFFFFFFFFFFD544 67E18010 sw r3,16[sp]
FFFFFFFFFFFFD548 E69C0500 ; SETLO
FFFFFFFFFFFFD54C EE800003 ; SETMID
FFFFFFFFFFFFD550 6A0D0C2D lea r3,SPIMASTER
FFFFFFFFFFFFD554 16008001 lw r1,#SPI_INIT_SD
FFFFFFFFFFFFD558 90308002 outb r1,SPI_TRANS_TYPE_REG[r3]
FFFFFFFFFFFFD55C 16008001 lw r1,#SPI_TRANS_START
FFFFFFFFFFFFD560 90308003 outb r1,SPI_TRANS_CTRL_REG[r3]
FFFFFFFFFFFFD564 DE000000 nop
FFFFFFFFFFFFD568 spi_init1:
FFFFFFFFFFFFD568 80308004 inb r1,SPI_TRANS_STATUS_REG[r3]
FFFFFFFFFFFFD56C 02110009 mov r2,r1 ; note: some time needs to be wasted
FFFFFFFFFFFFD570 02208009 mov r1,r2 ; between status reads.
FFFFFFFFFFFFD574 B01FFD01 beqi r1,#SPI_TRANS_BUSY,spi_init1
FFFFFFFFFFFFD578 80308005 inb r1,SPI_TRANS_ERROR_REG[r3]
FFFFFFFFFFFFD57C 2A108204 bfext r1,r1,#1,#0
FFFFFFFFFFFFD580 B2100500 bne r1,#SPI_INIT_NO_ERROR,spi_error
FFFFFFFFFFFFD584 9A00D946 lea r1,spi_init_ok_msg
FFFFFFFFFFFFD588 31FFF122 call DisplayString
FFFFFFFFFFFFD58C 0410840A xor r1,r1,r1
FFFFFFFFFFFFD590 BE0000AA bra spi_init_exit
FFFFFFFFFFFFD594 spi_error:
FFFFFFFFFFFFD594 31FFF14B call DisplayByte
FFFFFFFFFFFFD598 9A00D960 lea r1,spi_init_error_msg
FFFFFFFFFFFFD59C 31FFF122 call DisplayString
FFFFFFFFFFFFD5A0 16008001 lw r1,#1
FFFFFFFFFFFFD5A4 spi_init_exit:
FFFFFFFFFFFFD5A4 47EF8000 lw lr,[sp]
FFFFFFFFFFFFD5A8 47E10008 lw r2,8[sp]
FFFFFFFFFFFFD5AC 47E18010 lw r3,16[sp]
FFFFFFFFFFFFD5B0 37EF8018 ret #24
; SPI read sector
;
; r1= sector number to read
; r2= address to place read data
; Returns:
; r1 = 0 if successful
;
FFFFFFFFFFFFD5B4 spi_read_sector:
FFFFFFFFFFFFD5B4 0FEF0028 subui sp,sp,#40
FFFFFFFFFFFFD5B8 67EF8000 sw lr,[sp]
FFFFFFFFFFFFD5BC 67E28008 sw r5,8[sp]
FFFFFFFFFFFFD5C0 67E10010 sw r2,16[sp]
FFFFFFFFFFFFD5C4 67E18018 sw r3,24[sp]
FFFFFFFFFFFFD5C8 67E20020 sw r4,32[sp]
FFFFFFFFFFFFD5CC E69C0500 ; SETLO
FFFFFFFFFFFFD5D0 EE800003 ; SETMID
FFFFFFFFFFFFD5D4 6A0D0C2D lea r3,SPIMASTER
; spi master wants a byte address, so we multiply the sector number
; by 512.
FFFFFFFFFFFFD5D8 06109206 shlui r1,r1,#9
FFFFFFFFFFFFD5DC 90308007 outb r1,SPI_SD_ADDR_7_0_REG[r3]
FFFFFFFFFFFFD5E0 06109001 shrui r1,r1,#8
FFFFFFFFFFFFD5E4 90308008 outb r1,SPI_SD_ADDR_15_8_REG[r3]
FFFFFFFFFFFFD5E8 06109001 shrui r1,r1,#8
FFFFFFFFFFFFD5EC 90308009 outb r1,SPI_SD_ADDR_23_16_REG[r3]
FFFFFFFFFFFFD5F0 06109001 shrui r1,r1,#8
FFFFFFFFFFFFD5F4 9030800A outb r1,SPI_SD_ADDR_31_24_REG[r3]
; Force the reciever fifo to be empty, in case a prior error leaves it
; in an unknown state.
FFFFFFFFFFFFD5F8 16008001 lw r1,#1
FFFFFFFFFFFFD5FC 90308014 outb r1,SPI_RX_FIFO_CTRL_REG[r3]
FFFFFFFFFFFFD600 16008002 lw r1,#RW_READ_SD_BLOCK
FFFFFFFFFFFFD604 90308002 outb r1,SPI_TRANS_TYPE_REG[r3]
FFFFFFFFFFFFD608 16008001 lw r1,#SPI_TRANS_START
FFFFFFFFFFFFD60C 90308003 outb r1,SPI_TRANS_CTRL_REG[r3]
FFFFFFFFFFFFD610 DE000000 nop
FFFFFFFFFFFFD614 spi_read_sect1:
FFFFFFFFFFFFD614 80308004 inb r1,SPI_TRANS_STATUS_REG[r3]
FFFFFFFFFFFFD618 02120009 mov r4,r1 ; just a delay between consecutive status reg reads
FFFFFFFFFFFFD61C 02408009 mov r1,r4
FFFFFFFFFFFFD620 B01FFD01 beqi r1,#SPI_TRANS_BUSY,spi_read_sect1
FFFFFFFFFFFFD624 80308005 inb r1,SPI_TRANS_ERROR_REG[r3]
FFFFFFFFFFFFD628 2A108614 bfext r1,r1,#3,#2
FFFFFFFFFFFFD62C B2100800 bnei r1,#SPI_READ_NO_ERROR,spi_read_error
FFFFFFFFFFFFD630 16020200 lw r4,#512 ; read 512 bytes from fifo
FFFFFFFFFFFFD634 spi_read_sect2:
FFFFFFFFFFFFD634 80308010 inb r1,SPI_RX_FIFO_DATA_REG[r3]
FFFFFFFFFFFFD638 60208000 sb r1,[r2]
FFFFFFFFFFFFD63C 0A210001 addui r2,r2,#1
FFFFFFFFFFFFD640 BE027FAF loop r4,spi_read_sect2
FFFFFFFFFFFFD644 0410840A xor r1,r1,r1
FFFFFFFFFFFFD648 BE0000AA bra spi_read_ret
FFFFFFFFFFFFD64C spi_read_error:
FFFFFFFFFFFFD64C 31FFF14B call DisplayByte
FFFFFFFFFFFFD650 9A00D99E lea r1,spi_read_error_msg
FFFFFFFFFFFFD654 31FFF122 call DisplayString
FFFFFFFFFFFFD658 16008001 lw r1,#1
FFFFFFFFFFFFD65C spi_read_ret:
FFFFFFFFFFFFD65C 47EF8000 lw lr,[sp]
FFFFFFFFFFFFD660 47E28008 lw r5,8[sp]
FFFFFFFFFFFFD664 47E10010 lw r2,16[sp]
FFFFFFFFFFFFD668 47E18018 lw r3,24[sp]
FFFFFFFFFFFFD66C 47E20020 lw r4,32[sp]
FFFFFFFFFFFFD670 37EF8028 ret #40
; Read the boot sector from the disk.
; Must find it first by looking for the signature bytes 'EB' and '55AA'.
;
FFFFFFFFFFFFD674 spi_read_boot:
FFFFFFFFFFFFD674 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFD678 67EF8000 sw lr,[sp]
FFFFFFFFFFFFD67C 67E10008 sw r2,8[sp]
FFFFFFFFFFFFD680 67E18010 sw r3,16[sp]
FFFFFFFFFFFFD684 67E28018 sw r5,24[sp]
FFFFFFFFFFFFD688 660030F8 sw r0,startSector ; default starting sector
FFFFFFFFFFFFD68C 160181F4 lw r3,#500 ;1934720 ; number of sectors to read (up to 1GB)
FFFFFFFFFFFFD690 16028000 lw r5,#0 ; r5 = starting address
FFFFFFFFFFFFD694 spi_read_boot1:
FFFFFFFFFFFFD694 02508009 mov r1,r5 ; r1 = sector number
FFFFFFFFFFFFD698 16010008 lw r2,#8 ; eight digits
FFFFFFFFFFFFD69C 60001418 sb r0,CursorCol
FFFFFFFFFFFFD6A0 31FFF13F call DisplayNum ; Display the sector number being checked
FFFFFFFFFFFFD6A4 02508009 mov r1,r5 ; r1 = sector number
FFFFFFFFFFFFD6A8 E6800000 ; SETLO
FFFFFFFFFFFFD6AC EE800402 ; SETMID
FFFFFFFFFFFFD6B0 040D0809 lw r2,#0x100800000 ; r2 = target address
FFFFFFFFFFFFD6B4 31FFF56D call spi_read_sector
; The following displays the contents of the sector
; lw r1,#0x10
; lw r2,#0x3800
;spi_read_boot5:
; call DisplayMemB
; loop r1,spi_read_boot5
FFFFFFFFFFFFD6B8 0A528001 addui r5,r5,#1 ; move to next sector
FFFFFFFFFFFFD6BC E6800000 ; SETLO
FFFFFFFFFFFFD6C0 EE800402 ; SETMID
FFFFFFFFFFFFD6C4 6A0D0405 lbu r1,0x100800000
FFFFFFFFFFFFD6C8 121100EB cmpui r2,r1,#0xEB
FFFFFFFFFFFFD6CC BE200088 beq r2,r0,spi_read_boot2
FFFFFFFFFFFFD6D0 spi_read_boot3:
FFFFFFFFFFFFD6D0 BE01FE2F loop r3,spi_read_boot1
FFFFFFFFFFFFD6D4 16008001 lw r1,#1 ; r1 = 1 for error
FFFFFFFFFFFFD6D8 BE0001EA bra spi_read_boot4
FFFFFFFFFFFFD6DC spi_read_boot2:
FFFFFFFFFFFFD6DC 9A00D728 lea r1,msgFoundEB
FFFFFFFFFFFFD6E0 31FFF122 call DisplayString
FFFFFFFFFFFFD6E4 E68001FE ; SETLO
FFFFFFFFFFFFD6E8 EE800402 ; SETMID
FFFFFFFFFFFFD6EC 6A0D0405 lbu r1,0x1008001FE ; check for 0x55AA signature
FFFFFFFFFFFFD6F0 B21FF855 bnei r1,#0x55,spi_read_boot3
FFFFFFFFFFFFD6F4 E68001FF ; SETLO
FFFFFFFFFFFFD6F8 EE800402 ; SETMID
FFFFFFFFFFFFD6FC 6A0D0405 lbu r1,0x1008001FF
FFFFFFFFFFFFD700 E68000AA ; SETLO
FFFFFFFFFFFFD704 BE1D7E69 bnei r1,#0xAA,spi_read_boot3
FFFFFFFFFFFFD708 0E508001 subui r1,r5,#1
FFFFFFFFFFFFD70C 6600B0F8 sw r1,startSector
FFFFFFFFFFFFD710 0410840A xor r1,r1,r1 ; r1 = 0, for okay status
FFFFFFFFFFFFD714 spi_read_boot4:
FFFFFFFFFFFFD714 47EF8000 lw lr,[sp]
FFFFFFFFFFFFD718 47E10008 lw r2,8[sp]
FFFFFFFFFFFFD71C 47E18010 lw r3,16[sp]
FFFFFFFFFFFFD720 47E28018 lw r5,24[sp]
FFFFFFFFFFFFD724 37EF8020 ret #32
FFFFFFFFFFFFD728 msgFoundEB:
FFFFFFFFFFFFD728 424520646E756F46 db "Found EB code.",CR,LF,0
FFFFFFFFFFFFD730 0A0D2E65646F6320
FFFFFFFFFFFFD73C .align 4
; Load the FAT tables into memory
;
FFFFFFFFFFFFD73C loadFAT:
FFFFFFFFFFFFD73C 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFD740 67EF8000 sw lr,[sp]
FFFFFFFFFFFFD744 E6800016 ; SETLO
FFFFFFFFFFFFD748 EE800402 ; SETMID
FFFFFFFFFFFFD74C 6A0D0C06 lcu r3,0x100800016 ; sectors per FAT
FFFFFFFFFFFFD750 E6800010 ; SETLO
FFFFFFFFFFFFD754 EE800402 ; SETMID
FFFFFFFFFFFFD758 6A0D0805 lbu r2,0x100800010 ; number of FATs
FFFFFFFFFFFFD75C 04310C18 mulu r3,r3,r2 ; offset
FFFFFFFFFFFFD760 E6800200 ; SETLO
FFFFFFFFFFFFD764 EE800402 ; SETMID
FFFFFFFFFFFFD768 6A0D082D lea r2,0x100800200 ; where to place FAT
FFFFFFFFFFFFD76C E680000E ; SETLO
FFFFFFFFFFFFD770 EE800402 ; SETMID
FFFFFFFFFFFFD774 6A0D1406 lcu r5,0x10080000E ; r5 = # reserved sectors before FAT
FFFFFFFFFFFFD778 460330F8 lw r6,startSector
FFFFFFFFFFFFD77C 04531403 addu r5,r5,r6
FFFFFFFFFFFFD780 loadFAT1:
FFFFFFFFFFFFD780 02508009 mov r1,r5 ; r1 = sector #
FFFFFFFFFFFFD784 31FFF56D call spi_read_sector
FFFFFFFFFFFFD788 0A528001 addui r5,r5,#1
FFFFFFFFFFFFD78C 0A210200 addui r2,r2,#512 ; advance 512 bytes
FFFFFFFFFFFFD790 BE01FF8F loop r3,loadFAT1
FFFFFFFFFFFFD794 47EF8000 lw lr,[sp]
FFFFFFFFFFFFD798 37EF8008 ret #8
; Load the root directory from disk
; r2 = where to place root directory in memory
;
FFFFFFFFFFFFD79C loadRootDirectory:
FFFFFFFFFFFFD79C E6800016 ; SETLO
FFFFFFFFFFFFD7A0 EE800402 ; SETMID
FFFFFFFFFFFFD7A4 6A0D0C06 lcu r3,0x100800016 ; sectors per FAT
FFFFFFFFFFFFD7A8 E6800010 ; SETLO
FFFFFFFFFFFFD7AC EE800402 ; SETMID
FFFFFFFFFFFFD7B0 6A0D1005 lbu r4,0x100800010 ; number of FATs
FFFFFFFFFFFFD7B4 04320C18 mulu r3,r3,r4 ; offset
FFFFFFFFFFFFD7B8 E680000E ; SETLO
FFFFFFFFFFFFD7BC EE800402 ; SETMID
FFFFFFFFFFFFD7C0 6A0D1006 lcu r4,0x10080000E ; r2 = # reserved sectors before FAT
FFFFFFFFFFFFD7C4 04320C03 addu r3,r3,r4 ; r3 = root directory sector number
FFFFFFFFFFFFD7C8 460330F8 lw r6,startSector
FFFFFFFFFFFFD7CC 04331403 addu r5,r3,r6 ; r5 = root directory sector number
; we have to use two byte loads here because the number is at an unaligned data address
FFFFFFFFFFFFD7D0 E6800011 ; SETLO
FFFFFFFFFFFFD7D4 EE800402 ; SETMID
FFFFFFFFFFFFD7D8 6A0D1C05 lbu r7,0x100800011 ; r7 <= number of root directory entries
FFFFFFFFFFFFD7DC E6800012 ; SETLO
FFFFFFFFFFFFD7E0 EE800402 ; SETMID
FFFFFFFFFFFFD7E4 6A0D2005 lbu r8,0x100800012
FFFFFFFFFFFFD7E8 06841006 shlui r8,r8,#8
FFFFFFFFFFFFD7EC 04741C09 or r7,r7,r8
FFFFFFFFFFFFD7F0 02740009 mov r8,r7 ; r8 = number of root directory entries
FFFFFFFFFFFFD7F4 06738A06 shlui r7,r7,#5 ; r7 *=32 = size of root directory table (bytes)
FFFFFFFFFFFFD7F8 06739201 shrui r7,r7,#9 ; r7 /= 512 = number of sectors in root directory
FFFFFFFFFFFFD7FC 02718009 mov r3,r7
FFFFFFFFFFFFD800 loadRootDir1:
FFFFFFFFFFFFD800 02508009 mov r1,r5
FFFFFFFFFFFFD804 31FFF56D call spi_read_sector
FFFFFFFFFFFFD808 0A528001 addui r5,r5,#1
FFFFFFFFFFFFD80C 0A210200 addui r2,r2,#512
FFFFFFFFFFFFD810 BE01FF8F loop r3,loadRootDir1
FFFFFFFFFFFFD814 loadBootFile:
; For now we cheat and just go directly to sector 512.
FFFFFFFFFFFFD814 BE0004AA bra loadBootFileTmp
FFFFFFFFFFFFD818 E6800016 ; SETLO
FFFFFFFFFFFFD81C EE800402 ; SETMID
FFFFFFFFFFFFD820 6A0D0C06 lcu r3,0x100800016 ; sectors per FAT
FFFFFFFFFFFFD824 E6800010 ; SETLO
FFFFFFFFFFFFD828 EE800402 ; SETMID
FFFFFFFFFFFFD82C 6A0D0805 lbu r2,0x100800010 ; number of FATs
FFFFFFFFFFFFD830 04310C18 mulu r3,r3,r2 ; offset
FFFFFFFFFFFFD834 E680000E ; SETLO
FFFFFFFFFFFFD838 EE800402 ; SETMID
FFFFFFFFFFFFD83C 6A0D0806 lcu r2,0x10080000E ; r2 = # reserved sectors before FAT
FFFFFFFFFFFFD840 04310C03 addu r3,r3,r2 ; r3 = root directory sector number
; we have to use two byte loads here because the number is at an unaligned data address
FFFFFFFFFFFFD844 E6800011 ; SETLO
FFFFFFFFFFFFD848 EE800402 ; SETMID
FFFFFFFFFFFFD84C 6A0D1C05 lbu r7,0x100800011 ; r7 <= number of root directory entries
FFFFFFFFFFFFD850 E6800012 ; SETLO
FFFFFFFFFFFFD854 EE800402 ; SETMID
FFFFFFFFFFFFD858 6A0D2005 lbu r8,0x100800012
FFFFFFFFFFFFD85C 06841006 shlui r8,r8,#8
FFFFFFFFFFFFD860 04741C09 or r7,r7,r8
FFFFFFFFFFFFD864 02740009 mov r8,r7 ; r8 = number of root directory entries
FFFFFFFFFFFFD868 06738A06 shlui r7,r7,#5 ; r7 *=32 = size of root directory table (bytes)
FFFFFFFFFFFFD86C 06739201 shrui r7,r7,#9 ; r7 /= 512 = number of sectors in root directory
; now we need to fetch the sectors of the root directory and put them somewhere in
; memory
;
FFFFFFFFFFFFD870 loadBootFile4:
FFFFFFFFFFFFD870 46308000 lw r1,[r3] ; get filename
FFFFFFFFFFFFD874 E68F4F42 ; SETLO
FFFFFFFFFFFFD878 EEA51951 ; SETMID
FFFFFFFFFFFFD87C F68454C4 ; SETHI
FFFFFFFFFFFFD880 041D0407 cmpui r1,r1,#0x454C4946544F4F42 ; "BOOTFILE"
FFFFFFFFFFFFD884 BE100068 beq r1,r0,loadBootFile5
FFFFFFFFFFFFD888 loadBootFile3:
FFFFFFFFFFFFD888 0A318020 addui r3,r3,#32 ; move to next directory entry
FFFFFFFFFFFFD88C BE03FF2F loop r7,loadBootFile4
; boot file not found
; here we found the file in the directory
;
FFFFFFFFFFFFD890 loadBootFile5:
FFFFFFFFFFFFD890 4C31001A lcu r2,0x1a[r3] ; get starting cluster
FFFFFFFFFFFFD894 E6800011 ; SETLO
FFFFFFFFFFFFD898 EE800402 ; SETMID
FFFFFFFFFFFFD89C 6A0D1C06 lcu r7,0x100800011 ; r7 = number of root directory entries
FFFFFFFFFFFFD8A0 06738A06 shlui r7,r7,#5 ; r7 *=32 = size of root directory table (bytes)
FFFFFFFFFFFFD8A4 06739201 shrui r7,r7,#9 ; r7 /= 512 = number of sectors in root directory
FFFFFFFFFFFFD8A8 loadBootFileTmp:
; We load the number of sectors per cluster, then load a single cluster of the file.
; This is 16kib
FFFFFFFFFFFFD8A8 E680000D ; SETLO
FFFFFFFFFFFFD8AC EE800402 ; SETMID
FFFFFFFFFFFFD8B0 6A0D0C05 lbu r3,0x10080000D ; sectors per cluster
FFFFFFFFFFFFD8B4 E6800200 ; SETLO
FFFFFFFFFFFFD8B8 EE800402 ; SETMID
FFFFFFFFFFFFD8BC 6A0D082D lea r2,0x100800200 ; where to place FAT in memory
FFFFFFFFFFFFD8C0 4602B0F8 lw r5,startSector ; r5=start sector of disk
FFFFFFFFFFFFD8C4 0A528200 addui r5,r5,#512 ; r5= sector 512
FFFFFFFFFFFFD8C8 loadBootFile1:
FFFFFFFFFFFFD8C8 02508009 mov r1,r5 ; r1=sector to read
FFFFFFFFFFFFD8CC 31FFF56D call spi_read_sector
FFFFFFFFFFFFD8D0 0A528001 addui r5,r5,#1 ; r5 = next sector
FFFFFFFFFFFFD8D4 0A210200 addui r2,r2,#512
FFFFFFFFFFFFD8D8 BE01FF8F loop r3,loadBootFile1
FFFFFFFFFFFFD8DC E6800200 ; SETLO
FFFFFFFFFFFFD8E0 EE800402 ; SETMID
FFFFFFFFFFFFD8E4 6A0D0407 lhu r1,0x100800200 ; make sure it's bootable
FFFFFFFFFFFFD8E8 E68F4F42 ; SETLO
FFFFFFFFFFFFD8EC EE800151 ; SETMID
FFFFFFFFFFFFD8F0 BE1D0129 bnei r1,#0x544F4F42,loadBootFile2
FFFFFFFFFFFFD8F4 16008016 lw r1,#0x16
FFFFFFFFFFFFD8F8 9A00D920 lea r1,msgJumpingToBoot
FFFFFFFFFFFFD8FC 31FFF122 call DisplayString
FFFFFFFFFFFFD900 E6800204 ; SETLO
FFFFFFFFFFFFD904 EE800402 ; SETMID
FFFFFFFFFFFFD908 040D0409 lw r1,#0x100800204
FFFFFFFFFFFFD90C 341F8000 jal lr,[r1]
FFFFFFFFFFFFD910 33FFF20A jmp Monitor
FFFFFFFFFFFFD914 loadBootFile2:
FFFFFFFFFFFFD914 9A00D930 lea r1,msgNotBootable
FFFFFFFFFFFFD918 31FFF122 call DisplayString
FFFFFFFFFFFFD91C 33FFF20A jmp Monitor
FFFFFFFFFFFFD920 msgJumpingToBoot:
FFFFFFFFFFFFD920 20676E69706D754A db "Jumping to boot",0
FFFFFFFFFFFFD928 00746F6F62206F74
FFFFFFFFFFFFD930 msgNotBootable:
FFFFFFFFFFFFD930 2064726163204453 db "SD card not bootable.",0
FFFFFFFFFFFFD938 746F6F6220746F6E
FFFFFFFFFFFFD946 spi_init_ok_msg:
FFFFFFFFFFFFD940 4453002E656C6261 db "SD card initialized okay.",0
FFFFFFFFFFFFD948 6E69206472616320
FFFFFFFFFFFFD950 657A696C61697469
FFFFFFFFFFFFD958 002E79616B6F2064
FFFFFFFFFFFFD960 spi_init_error_msg:
FFFFFFFFFFFFD960 20726F727265203A db ": error occurred initializing the SD card.",0
FFFFFFFFFFFFD968 646572727563636F
FFFFFFFFFFFFD970 6C616974696E6920
FFFFFFFFFFFFD978 687420676E697A69
FFFFFFFFFFFFD980 7261632044532065
FFFFFFFFFFFFD98B spi_boot_error_msg:
FFFFFFFFFFFFD988 6163204453002E64 db "SD card boot error",0
FFFFFFFFFFFFD990 20746F6F62206472
FFFFFFFFFFFFD99E spi_read_error_msg:
FFFFFFFFFFFFD998 445300726F727265 db "SD card read error",0
FFFFFFFFFFFFD9A0 6572206472616320
FFFFFFFFFFFFD9A8 726F727265206461
FFFFFFFFFFFFD9B4 .align 4
;==============================================================================
; Ethernet
;==============================================================================
my_MAC1 EQU 0x00
my_MAC2 EQU 0xFF
my_MAC3 EQU 0xEE
my_MAC4 EQU 0xF0
my_MAC5 EQU 0xDA
my_MAC6 EQU 0x42
FFFFFFFFFFFFD9B4 .bss
FFFFFFFFFFFFD9B4 0000000000000000 eth_unique_id dw 0
FFFFFFFFFFFFD9BC .code
; Initialize the ethmac controller.
; Supply a MAC address, set MD clock
;
FFFFFFFFFFFFD9BC eth_init:
FFFFFFFFFFFFD9BC E69C2000 ; SETLO
FFFFFFFFFFFFD9C0 EE800003 ; SETMID
FFFFFFFFFFFFD9C4 6A0D0C2D lea r3,ETHMAC
FFFFFFFFFFFFD9C8 16008064 lw r1,#0x64 ; 100
FFFFFFFFFFFFD9CC 64308028 sh r1,MIIMODER[r3]
FFFFFFFFFFFFD9D0 16008007 lw r1,#7 ; PHY address
FFFFFFFFFFFFD9D4 64308030 sh r1,MIIADDRESS[r3]
FFFFFFFFFFFFD9D8 E6B0DA42 ; SETLO
FFFFFFFFFFFFD9DC EEBFFFBB ; SETMID
FFFFFFFFFFFFD9E0 040D0409 lw r1,#0xEEF0DA42
FFFFFFFFFFFFD9E4 64308040 sh r1,0x40[r3] ; MAC0
FFFFFFFFFFFFD9E8 160080FF lw r1,#0x00FF
FFFFFFFFFFFFD9EC 64308044 sh r1,0x44[r3] ; MAC1
FFFFFFFFFFFFD9F0 37EF8000 ret
; Request a packet and display on screen
; r1 = address where to put packet
;
FFFFFFFFFFFFD9F4 eth_request_packet:
FFFFFFFFFFFFD9F4 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFD9F8 67E18000 sw r3,[sp]
FFFFFFFFFFFFD9FC 67E10008 sw r2,8[sp]
FFFFFFFFFFFFDA00 67E20010 sw r4,16[sp]
FFFFFFFFFFFFDA04 E69C2000 ; SETLO
FFFFFFFFFFFFDA08 EE800003 ; SETMID
FFFFFFFFFFFFDA0C 6A0D0C2D lea r3,ETHMAC
FFFFFFFFFFFFDA10 16010004 lw r2,#4 ; clear rx interrupt
FFFFFFFFFFFFDA14 64310004 sh r2,4[r3]
FFFFFFFFFFFFDA18 64308604 sh r1,0x604[r3] ; storage address
FFFFFFFFFFFFDA1C 16016000 lw r2,#0xe000 ; enable interrupt
FFFFFFFFFFFFDA20 64310600 sh r2,0x600[r3]
FFFFFFFFFFFFDA24 eth1:
FFFFFFFFFFFFDA24 DE000000 nop
FFFFFFFFFFFFDA28 84310004 inh r2,4[r3]
FFFFFFFFFFFFDA2C 2A210414 bfext r2,r2,#2,#2 ; get bit #2
FFFFFFFFFFFFDA30 BE207FA8 beq r2,r0,eth1
FFFFFFFFFFFFDA34 84310600 inh r2,0x600[r3] ; get from descriptor
FFFFFFFFFFFFDA38 06212001 shrui r2,r2,#16
FFFFFFFFFFFFDA3C 16018000 lw r3,#0
FFFFFFFFFFFFDA40 E6901D88 ; SETLO
FFFFFFFFFFFFDA44 EE800003 ; SETMID
FFFFFFFFFFFFDA48 6A0D102D lea r4,TEXTSCR+7560 ; second last line of screen
FFFFFFFFFFFFDA4C eth20:
FFFFFFFFFFFFDA4C 6A118805 lbu r2,[r1+r3] ; get byte
FFFFFFFFFFFFDA50 6A418911 sc r2,[r4+r3*2] ; store to screen
FFFFFFFFFFFFDA54 0A318001 addui r3,r3,#1
FFFFFFFFFFFFDA58 12310053 cmpui r2,r3,#83
FFFFFFFFFFFFDA5C BE207F89 bne r2,r0,eth20
FFFFFFFFFFFFDA60 47E18000 lw r3,[sp]
FFFFFFFFFFFFDA64 47E10008 lw r2,8[sp]
FFFFFFFFFFFFDA68 47E20010 lw r4,16[sp]
FFFFFFFFFFFFDA6C 37EF8018 ret #24
; r1 = packet address
;
FFFFFFFFFFFFDA70 eth_interpret_packet:
FFFFFFFFFFFFDA70 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFDA74 67E18000 sw r3,[sp]
FFFFFFFFFFFFDA78 67E10008 sw r2,8[sp]
FFFFFFFFFFFFDA7C 4A11000C lbu r2,12[r1]
FFFFFFFFFFFFDA80 4A11800D lbu r3,13[r1]
FFFFFFFFFFFFDA84 B2200608 bnei r2,#8,eth2 ; 0x806 ?
FFFFFFFFFFFFDA88 B2300506 bnei r3,#6,eth2
FFFFFFFFFFFFDA8C 16008002 lw r1,#2 ; return r1 = 2 for ARP
FFFFFFFFFFFFDA90 eth5:
FFFFFFFFFFFFDA90 47E18000 lw r3,[sp]
FFFFFFFFFFFFDA94 47E10008 lw r2,8[sp]
FFFFFFFFFFFFDA98 37EF8010 ret #16
FFFFFFFFFFFFDA9C eth2:
FFFFFFFFFFFFDA9C B2200C08 bnei r2,#8,eth3 ; 0x800 ?
FFFFFFFFFFFFDAA0 B2300B00 bnei r3,#0,eth3
FFFFFFFFFFFFDAA4 4A110017 lbu r2,23[r1]
FFFFFFFFFFFFDAA8 B2200301 bnei r2,#1,eth4
FFFFFFFFFFFFDAAC 16008001 lw r1,#1
FFFFFFFFFFFFDAB0 BE007F0A bra eth5 ; return 1 ICMP
FFFFFFFFFFFFDAB4 eth4:
FFFFFFFFFFFFDAB4 B2200311 bnei r2,#0x11,eth6
FFFFFFFFFFFFDAB8 16008003 lw r1,#3 ; return 3 for UDP
FFFFFFFFFFFFDABC BE007EAA bra eth5
FFFFFFFFFFFFDAC0 eth6:
FFFFFFFFFFFFDAC0 B2200306 bnei r2,#6,eth7
FFFFFFFFFFFFDAC4 16008004 lw r1,#4 ; return 4 for TCP
FFFFFFFFFFFFDAC8 BE007E4A bra eth5
FFFFFFFFFFFFDACC eth7:
FFFFFFFFFFFFDACC eth3:
FFFFFFFFFFFFDACC 0410840A xor r1,r1,r1 ; return zero for unknown
FFFFFFFFFFFFDAD0 47E18000 lw r3,[sp]
FFFFFFFFFFFFDAD4 47E10008 lw r2,8[sp]
FFFFFFFFFFFFDAD8 37EF8010 ret #16
; r1 = address of packet to send
; r2 = packet length
;
FFFFFFFFFFFFDADC eth_send_packet:
FFFFFFFFFFFFDADC 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFDAE0 67E18000 sw r3,[sp]
FFFFFFFFFFFFDAE4 67E20008 sw r4,8[sp]
FFFFFFFFFFFFDAE8 E69C2000 ; SETLO
FFFFFFFFFFFFDAEC EE800003 ; SETMID
FFFFFFFFFFFFDAF0 6A0D0C2D lea r3,ETHMAC
; wait for tx buffer to be clear
FFFFFFFFFFFFDAF4 eth8:
FFFFFFFFFFFFDAF4 84320400 inh r4,0x400[r3]
FFFFFFFFFFFFDAF8 2A421E7C bfext r4,r4,#15,#15
FFFFFFFFFFFFDAFC B04FFE01 beqi r4,#1,eth8
FFFFFFFFFFFFDB00 16020001 lw r4,#1 ; clear tx interrupt
FFFFFFFFFFFFDB04 64320004 sh r4,4[r3]
; set address
FFFFFFFFFFFFDB08 64308404 sh r1,0x404[r3]
; set the packet length field and enable interrupts
FFFFFFFFFFFFDB0C 06212006 shlui r2,r2,#16
FFFFFFFFFFFFDB10 16217000 ori r2,r2,#0xF000
FFFFFFFFFFFFDB14 64310400 sh r2,0x400[r3]
FFFFFFFFFFFFDB18 47E20008 lw r4,8[sp]
FFFFFFFFFFFFDB1C 47E18000 lw r3,[sp]
FFFFFFFFFFFFDB20 37EF8010 ret #16
; Only for IP type packets (not ARP)
; r1 = rx buffer address
; r2 = swap flag
; Returns:
; r1 = data start index
;
FFFFFFFFFFFFDB24 eth_build_packet:
FFFFFFFFFFFFDB24 0FEF0040 subui sp,sp,#64
FFFFFFFFFFFFDB28 67E18000 sw r3,[sp]
FFFFFFFFFFFFDB2C 67E20008 sw r4,8[sp]
FFFFFFFFFFFFDB30 67E28010 sw r5,16[sp]
FFFFFFFFFFFFDB34 67E30018 sw r6,24[sp]
FFFFFFFFFFFFDB38 67E38020 sw r7,32[sp]
FFFFFFFFFFFFDB3C 67E40028 sw r8,40[sp]
FFFFFFFFFFFFDB40 67E48030 sw r9,48[sp]
FFFFFFFFFFFFDB44 67E50038 sw r10,56[sp]
FFFFFFFFFFFFDB48 4A118006 lbu r3,6[r1]
FFFFFFFFFFFFDB4C 4A120007 lbu r4,7[r1]
FFFFFFFFFFFFDB50 4A128008 lbu r5,8[r1]
FFFFFFFFFFFFDB54 4A130009 lbu r6,9[r1]
FFFFFFFFFFFFDB58 4A13800A lbu r7,10[r1]
FFFFFFFFFFFFDB5C 4A14000B lbu r8,11[r1]
; write to destination header
FFFFFFFFFFFFDB60 60118000 sb r3,[r1]
FFFFFFFFFFFFDB64 60120001 sb r4,1[r1]
FFFFFFFFFFFFDB68 60128002 sb r5,2[r1]
FFFFFFFFFFFFDB6C 60130003 sb r6,3[r1]
FFFFFFFFFFFFDB70 60138004 sb r7,4[r1]
FFFFFFFFFFFFDB74 60140005 sb r8,5[r1]
; write to source header
FFFFFFFFFFFFDB78 16018000 lw r3,#my_MAC1
FFFFFFFFFFFFDB7C 60118006 sb r3,6[r1]
FFFFFFFFFFFFDB80 160180FF lw r3,#my_MAC2
FFFFFFFFFFFFDB84 60118007 sb r3,7[r1]
FFFFFFFFFFFFDB88 160180EE lw r3,#my_MAC3
FFFFFFFFFFFFDB8C 60118008 sb r3,8[r1]
FFFFFFFFFFFFDB90 160180F0 lw r3,#my_MAC4
FFFFFFFFFFFFDB94 60118009 sb r3,9[r1]
FFFFFFFFFFFFDB98 160180DA lw r3,#my_MAC5
FFFFFFFFFFFFDB9C 6011800A sb r3,10[r1]
FFFFFFFFFFFFDBA0 16018042 lw r3,#my_MAC6
FFFFFFFFFFFFDBA4 6011800B sb r3,11[r1]
FFFFFFFFFFFFDBA8 B2201101 bnei r2,#1,eth16 // if (swap)
FFFFFFFFFFFFDBAC 4A11801A lbu r3,26[r1]
FFFFFFFFFFFFDBB0 4A12001B lbu r4,27[r1]
FFFFFFFFFFFFDBB4 4A12801C lbu r5,28[r1]
FFFFFFFFFFFFDBB8 4A13001D lbu r6,29[r1]
; read destination
FFFFFFFFFFFFDBBC 4A13801E lbu r7,30[r1]
FFFFFFFFFFFFDBC0 4A14001F lbu r8,31[r1]
FFFFFFFFFFFFDBC4 4A148020 lbu r9,32[r1]
FFFFFFFFFFFFDBC8 4A150021 lbu r10,33[r1]
; write to sender
FFFFFFFFFFFFDBCC 6013801A sb r7,26[r1]
FFFFFFFFFFFFDBD0 6014001B sb r8,27[r1]
FFFFFFFFFFFFDBD4 6014801C sb r9,28[r1]
FFFFFFFFFFFFDBD8 6015001D sb r10,29[r1]
; write destination
FFFFFFFFFFFFDBDC 6011801E sb r3,30[r1]
FFFFFFFFFFFFDBE0 6012001F sb r4,31[r1]
FFFFFFFFFFFFDBE4 60128020 sb r5,32[r1]
FFFFFFFFFFFFDBE8 60130021 sb r6,33[r1]
FFFFFFFFFFFFDBEC eth16:
FFFFFFFFFFFFDBEC 4601D9B4 lw r3,eth_unique_id
FFFFFFFFFFFFDBF0 0A318001 addui r3,r3,#1
FFFFFFFFFFFFDBF4 6601D9B4 sw r3,eth_unique_id
FFFFFFFFFFFFDBF8 60118013 sb r3,19[r1]
FFFFFFFFFFFFDBFC 06319001 shrui r3,r3,#8
FFFFFFFFFFFFDC00 60118012 sb r3,18[r1]
FFFFFFFFFFFFDC04 4A11800E lbu r3,14[r1]
FFFFFFFFFFFFDC08 1431800F andi r3,r3,#0xF
FFFFFFFFFFFFDC0C 06318406 shlui r3,r3,#2 ; *4
FFFFFFFFFFFFDC10 0A30800E addui r1,r3,#14 ; return datastart in r1
FFFFFFFFFFFFDC14 47E18000 lw r3,[sp]
FFFFFFFFFFFFDC18 47E20008 lw r4,8[sp]
FFFFFFFFFFFFDC1C 47E28010 lw r5,16[sp]
FFFFFFFFFFFFDC20 47E30018 lw r6,24[sp]
FFFFFFFFFFFFDC24 47E38020 lw r7,32[sp]
FFFFFFFFFFFFDC28 47E40028 lw r8,40[sp]
FFFFFFFFFFFFDC2C 47E48030 lw r9,48[sp]
FFFFFFFFFFFFDC30 47E50038 lw r10,56[sp]
FFFFFFFFFFFFDC34 37EF8040 ret #64
; Compute IPv4 checksum of header
; r1 = packet address
; r2 = data start
;
FFFFFFFFFFFFDC38 eth_checksum:
FFFFFFFFFFFFDC38 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFDC3C 67E18000 sw r3,[sp]
FFFFFFFFFFFFDC40 67E20008 sw r4,8[sp]
FFFFFFFFFFFFDC44 67E28010 sw r5,16[sp]
; set checksum to zero
FFFFFFFFFFFFDC48 60100018 sb r0,24[r1]
FFFFFFFFFFFFDC4C 60100019 sb r0,25[r1]
FFFFFFFFFFFFDC50 04318C0A xor r3,r3,r3 ; r3 = sum = zero
FFFFFFFFFFFFDC54 1602000E lw r4,#14
FFFFFFFFFFFFDC58 eth15:
FFFFFFFFFFFFDC58 02228009 mov r5,r2
FFFFFFFFFFFFDC5C 0E528001 subui r5,r5,#1 ; r5 = datastart - 1
FFFFFFFFFFFFDC60 BE428101 bge r4,r5,eth14
FFFFFFFFFFFFDC64 6A121405 lbu r5,[r1+r4] ; shi = [rx_addr+i]
FFFFFFFFFFFFDC68 6A121845 lbu r6,1[r1+r4] ; slo = [rx_addr+i+1]
FFFFFFFFFFFFDC6C 06529006 shlui r5,r5,#8
FFFFFFFFFFFFDC70 04531409 or r5,r5,r6 ; shilo
FFFFFFFFFFFFDC74 04328C03 addu r3,r3,r5 ; sum = sum + shilo
FFFFFFFFFFFFDC78 0A420002 addui r4,r4,#2 ; i = i + 2
FFFFFFFFFFFFDC7C BE007EEA bra eth15
FFFFFFFFFFFFDC80 eth14:
FFFFFFFFFFFFDC80 02328009 mov r5,r3 ; r5 = sum
FFFFFFFFFFFFDC84 1431FFFF andi r3,r3,#0xffff
FFFFFFFFFFFFDC88 0652A001 shrui r5,r5,#16
FFFFFFFFFFFFDC8C 04328C03 addu r3,r3,r5
FFFFFFFFFFFFDC90 02318004 com r3,r3
FFFFFFFFFFFFDC94 60118019 sb r3,25[r1] ; low byte
FFFFFFFFFFFFDC98 06319001 shrui r3,r3,#8
FFFFFFFFFFFFDC9C 60118018 sb r3,24[r1] ; high byte
FFFFFFFFFFFFDCA0 67E18000 sw r3,[sp]
FFFFFFFFFFFFDCA4 67E20008 sw r4,8[sp]
FFFFFFFFFFFFDCA8 67E28010 sw r5,16[sp]
FFFFFFFFFFFFDCAC 37EF8018 ret #24
; r1 = packet address
; returns r1 = 1 if this IP
;
FFFFFFFFFFFFDCB0 eth_verifyIP:
FFFFFFFFFFFFDCB0 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFDCB4 67E10000 sw r2,[sp]
FFFFFFFFFFFFDCB8 67E18008 sw r3,8[sp]
FFFFFFFFFFFFDCBC 67E20010 sw r4,16[sp]
FFFFFFFFFFFFDCC0 67E28018 sw r5,24[sp]
FFFFFFFFFFFFDCC4 4A11001E lbu r2,30[r1]
FFFFFFFFFFFFDCC8 4A11801F lbu r3,31[r1]
FFFFFFFFFFFFDCCC 4A120020 lbu r4,32[r1]
FFFFFFFFFFFFDCD0 4A128021 lbu r5,33[r1]
; Check for general broadcast
FFFFFFFFFFFFDCD4 E68000FF ; SETLO
FFFFFFFFFFFFDCD8 BE2D01A9 bnei r2,#0xFF,eth11
FFFFFFFFFFFFDCDC E68000FF ; SETLO
FFFFFFFFFFFFDCE0 BE3D0169 bnei r3,#0xFF,eth11
FFFFFFFFFFFFDCE4 E68000FF ; SETLO
FFFFFFFFFFFFDCE8 BE4D0129 bnei r4,#0xFF,eth11
FFFFFFFFFFFFDCEC E68000FF ; SETLO
FFFFFFFFFFFFDCF0 BE5D00E9 bnei r5,#0xFF,eth11
FFFFFFFFFFFFDCF4 eth12:
FFFFFFFFFFFFDCF4 16008001 lw r1,#1
FFFFFFFFFFFFDCF8 eth13:
FFFFFFFFFFFFDCF8 47E10000 lw r2,[sp]
FFFFFFFFFFFFDCFC 47E18008 lw r3,8[sp]
FFFFFFFFFFFFDD00 47E20010 lw r4,16[sp]
FFFFFFFFFFFFDD04 47E28018 lw r5,24[sp]
FFFFFFFFFFFFDD08 37EF8020 ret #32
FFFFFFFFFFFFDD0C eth11:
FFFFFFFFFFFFDD0C 02208009 mov r1,r2
FFFFFFFFFFFFDD10 06109006 shlui r1,r1,#8
FFFFFFFFFFFFDD14 04118409 or r1,r1,r3
FFFFFFFFFFFFDD18 06109006 shlui r1,r1,#8
FFFFFFFFFFFFDD1C 04120409 or r1,r1,r4
FFFFFFFFFFFFDD20 06109006 shlui r1,r1,#8
FFFFFFFFFFFFDD24 04128409 or r1,r1,r5
FFFFFFFFFFFFDD28 E6A8012A ; SETLO
FFFFFFFFFFFFDD2C EEBFFF02 ; SETMID
FFFFFFFFFFFFDD30 BE1D7E28 beqi r1,#0xC0A8012A,eth12
FFFFFFFFFFFFDD34 0410840A xor r1,r1,r1
FFFFFFFFFFFFDD38 BE007E0A bra eth13
FFFFFFFFFFFFDD3C eth_main:
FFFFFFFFFFFFDD3C 31FFF66F call eth_init
FFFFFFFFFFFFDD40 eth_loop:
FFFFFFFFFFFFDD40 0410840A xor r1,r1,r1
FFFFFFFFFFFFDD44 E6800000 ; SETLO
FFFFFFFFFFFFDD48 EE800400 ; SETMID
FFFFFFFFFFFFDD4C 040D0409 lw r1,#0x1_00000000 ; memory address zero
FFFFFFFFFFFFDD50 31FFF67D call eth_request_packet
FFFFFFFFFFFFDD54 31FFF69C call eth_interpret_packet ; r1 = packet type
FFFFFFFFFFFFDD58 B2102801 bnei r1,#1,eth10
FFFFFFFFFFFFDD5C 02110009 mov r2,r1 ; save off r1, r2 = packet type
FFFFFFFFFFFFDD60 E6800000 ; SETLO
FFFFFFFFFFFFDD64 EE800400 ; SETMID
FFFFFFFFFFFFDD68 040D0409 lw r1,#0x1_00000000 ; memory address zero
FFFFFFFFFFFFDD6C 31FFF72C call eth_verifyIP
FFFFFFFFFFFFDD70 02118009 mov r3,r1
FFFFFFFFFFFFDD74 02208009 mov r1,r2 ; r1 = packet type again
FFFFFFFFFFFFDD78 B2302001 bnei r3,#1,eth10
FFFFFFFFFFFFDD7C E6800000 ; SETLO
FFFFFFFFFFFFDD80 EE800400 ; SETMID
FFFFFFFFFFFFDD84 040D0409 lw r1,#0x1_00000000 ; memory address zero
FFFFFFFFFFFFDD88 16010001 lw r2,#1
FFFFFFFFFFFFDD8C 31FFF6C9 call eth_build_packet
FFFFFFFFFFFFDD90 02118009 mov r3,r1 ; r3 = icmpstart
FFFFFFFFFFFFDD94 E6800000 ; SETLO
FFFFFFFFFFFFDD98 EE800400 ; SETMID
FFFFFFFFFFFFDD9C 040D0409 lw r1,#0x1_00000000 ; memory address zero
FFFFFFFFFFFFDDA0 6A118010 sb r0,[r1+r3] ; [rx_addr+icmpstart] = 0
FFFFFFFFFFFFDDA4 4A110011 lbu r2,17[r1]
FFFFFFFFFFFFDDA8 0A21000E addui r2,r2,#14 ; r2 = len
FFFFFFFFFFFFDDAC 02230009 mov r6,r2 ; r6 = len
FFFFFFFFFFFFDDB0 6A119085 lbu r4,2[r1+r3] ; shi
FFFFFFFFFFFFDDB4 6A1194C5 lbu r5,3[r1+r3] ; slo
FFFFFFFFFFFFDDB8 06421006 shlui r4,r4,#8
FFFFFFFFFFFFDDBC 04429009 or r4,r4,r5 ; sum = {shi,slo};
FFFFFFFFFFFFDDC0 02420004 com r4,r4 ; sum = ~sum
FFFFFFFFFFFFDDC4 0E420800 subui r4,r4,#0x800 ; sum = sum - 0x800
FFFFFFFFFFFFDDC8 02420004 com r4,r4 ; sum = ~sum
FFFFFFFFFFFFDDCC 6A1190D0 sb r4,3[r1+r3]
FFFFFFFFFFFFDDD0 06421001 shrui r4,r4,#8
FFFFFFFFFFFFDDD4 6A119090 sb r4,2[r1+r3]
FFFFFFFFFFFFDDD8 02310009 mov r2,r3
FFFFFFFFFFFFDDDC 31FFF70E call eth_checksum
FFFFFFFFFFFFDDE0 E6800000 ; SETLO
FFFFFFFFFFFFDDE4 EE800400 ; SETMID
FFFFFFFFFFFFDDE8 040D0409 lw r1,#0x1_00000000 ; memory address zero
FFFFFFFFFFFFDDEC 02610009 mov r2,r6
FFFFFFFFFFFFDDF0 31FFF6B7 call eth_send_packet
FFFFFFFFFFFFDDF4 33FFF750 jmp eth_loop
FFFFFFFFFFFFDDF8 eth10:
; r2 = rx_addr
FFFFFFFFFFFFDDF8 B21FD202 bnei r1,#2,eth_loop ; Do we have ARP ?
; xor r2,r2,r2 ; memory address zero
FFFFFFFFFFFFDDFC E6B5E100 ; SETLO
FFFFFFFFFFFFDE00 EE800017 ; SETMID
FFFFFFFFFFFFDE04 040D0809 lw r2,#1_00000000
; get the opcode
FFFFFFFFFFFFDE08 4A268015 lbu r13,21[r2]
FFFFFFFFFFFFDE0C B2DFCD01 bnei r13,#1,eth_loop ; ARP request
; get destination IP address
FFFFFFFFFFFFDE10 4A248026 lbu r9,38[r2]
FFFFFFFFFFFFDE14 4A250027 lbu r10,39[r2]
FFFFFFFFFFFFDE18 4A258028 lbu r11,40[r2]
FFFFFFFFFFFFDE1C 4A260029 lbu r12,41[r2]
; set r15 = destination IP
FFFFFFFFFFFFDE20 02978009 mov r15,r9
FFFFFFFFFFFFDE24 06F79006 shlui r15,r15,#8
FFFFFFFFFFFFDE28 04F53C09 or r15,r15,r10
FFFFFFFFFFFFDE2C 06F79006 shlui r15,r15,#8
FFFFFFFFFFFFDE30 04F5BC09 or r15,r15,r11
FFFFFFFFFFFFDE34 06F79006 shlui r15,r15,#8
FFFFFFFFFFFFDE38 04F63C09 or r15,r15,r12
; Is it our IP ?
FFFFFFFFFFFFDE3C E6A8012A ; SETLO
FFFFFFFFFFFFDE40 EEBFFF02 ; SETMID
FFFFFFFFFFFFDE44 BEFD77E9 bnei r15,#0xC0A8012A,eth_loop; //192.168.1.42
; get source IP address
FFFFFFFFFFFFDE48 4A22801C lbu r5,28[r2]
FFFFFFFFFFFFDE4C 4A23001D lbu r6,29[r2]
FFFFFFFFFFFFDE50 4A23801E lbu r7,30[r2]
FFFFFFFFFFFFDE54 4A24001F lbu r8,31[r2]
; set r14 = source IP
FFFFFFFFFFFFDE58 02570009 mov r14,r5
FFFFFFFFFFFFDE5C 06E71006 shlui r14,r14,#8
FFFFFFFFFFFFDE60 04E33809 or r14,r14,r6
FFFFFFFFFFFFDE64 06E71006 shlui r14,r14,#8
FFFFFFFFFFFFDE68 04E3B809 or r14,r14,r7
FFFFFFFFFFFFDE6C 06E71006 shlui r14,r14,#8
FFFFFFFFFFFFDE70 04E43809 or r14,r14,r8
; Get the source MAC address
FFFFFFFFFFFFDE74 4A280016 lbu r16,22[r2]
FFFFFFFFFFFFDE78 4A288017 lbu r17,23[r2]
FFFFFFFFFFFFDE7C 4A290018 lbu r18,24[r2]
FFFFFFFFFFFFDE80 4A298019 lbu r19,25[r2]
FFFFFFFFFFFFDE84 4A2A001A lbu r20,26[r2]
FFFFFFFFFFFFDE88 4A2A801B lbu r21,27[r2]
; write to destination header
FFFFFFFFFFFFDE8C 60280000 sb r16,[r2]
FFFFFFFFFFFFDE90 60288001 sb r17,1[r2]
FFFFFFFFFFFFDE94 60290002 sb r18,2[r2]
FFFFFFFFFFFFDE98 60298003 sb r19,3[r2]
FFFFFFFFFFFFDE9C 602A0004 sb r20,4[r2]
FFFFFFFFFFFFDEA0 602A8005 sb r21,5[r2]
; and write to ARP destination
FFFFFFFFFFFFDEA4 60280020 sb r16,32[r2]
FFFFFFFFFFFFDEA8 60288021 sb r17,33[r2]
FFFFFFFFFFFFDEAC 60290022 sb r18,34[r2]
FFFFFFFFFFFFDEB0 60298023 sb r19,35[r2]
FFFFFFFFFFFFDEB4 602A0024 sb r20,36[r2]
FFFFFFFFFFFFDEB8 602A8025 sb r21,37[r2]
; write to source header
; stbc #0x00,6[r2]
; stbc #0xFF,7[r2]
; stbc #0xEE,8[r2]
; stbc #0xF0,9[r2]
; stbc #0xDA,10[r2]
; stbc #0x42,11[r2]
FFFFFFFFFFFFDEBC 60200006 sb r0,6[r2]
FFFFFFFFFFFFDEC0 160080FF lw r1,#0xFF
FFFFFFFFFFFFDEC4 60208007 sb r1,7[r2]
FFFFFFFFFFFFDEC8 160080EE lw r1,#0xEE
FFFFFFFFFFFFDECC 60208008 sb r1,8[r2]
FFFFFFFFFFFFDED0 160080F0 lw r1,#0xF0
FFFFFFFFFFFFDED4 60208009 sb r1,9[r2]
FFFFFFFFFFFFDED8 160080DA lw r1,#0xDA
FFFFFFFFFFFFDEDC 6020800A sb r1,10[r2]
FFFFFFFFFFFFDEE0 16008042 lw r1,#0x42
FFFFFFFFFFFFDEE4 6020800B sb r1,11[r2]
; write to ARP source
; stbc #0x00,22[r2]
; stbc #0xFF,23[r2]
; stbc #0xEE,24[r2]
; stbc #0xF0,25[r2]
; stbc #0xDA,26[r2]
; stbc #0x42,27[r2]
FFFFFFFFFFFFDEE8 60200016 sb r0,22[r2]
FFFFFFFFFFFFDEEC 160080FF lw r1,#0xFF
FFFFFFFFFFFFDEF0 60208017 sb r1,23[r2]
FFFFFFFFFFFFDEF4 160080EE lw r1,#0xEE
FFFFFFFFFFFFDEF8 60208018 sb r1,24[r2]
FFFFFFFFFFFFDEFC 160080F0 lw r1,#0xF0
FFFFFFFFFFFFDF00 60208019 sb r1,25[r2]
FFFFFFFFFFFFDF04 160080DA lw r1,#0xDA
FFFFFFFFFFFFDF08 6020801A sb r1,26[r2]
FFFFFFFFFFFFDF0C 16008042 lw r1,#0x42
FFFFFFFFFFFFDF10 6020801B sb r1,27[r2]
; swap sender / destination IP
; write sender
FFFFFFFFFFFFDF14 6024801C sb r9,28[r2]
FFFFFFFFFFFFDF18 6025001D sb r10,29[r2]
FFFFFFFFFFFFDF1C 6025801E sb r11,30[r2]
FFFFFFFFFFFFDF20 6026001F sb r12,31[r2]
; write destination
FFFFFFFFFFFFDF24 60228026 sb r5,38[r2]
FFFFFFFFFFFFDF28 60230027 sb r6,39[r2]
FFFFFFFFFFFFDF2C 60238028 sb r7,40[r2]
FFFFFFFFFFFFDF30 60240029 sb r8,41[r2]
; change request to reply
; stbc #2,21[r2]
FFFFFFFFFFFFDF34 16008002 lw r1,#2
FFFFFFFFFFFFDF38 60208015 sb r1,21[r2]
FFFFFFFFFFFFDF3C 02208009 mov r1,r2 ; r1 = packet address
FFFFFFFFFFFFDF40 1601002A lw r2,#0x2A ; r2 = packet length
FFFFFFFFFFFFDF44 31FFF6B7 call eth_send_packet
FFFFFFFFFFFFDF48 33FFF750 jmp eth_loop
;==============================================================================
;==============================================================================
;****************************************************************;
; ;
; Tiny BASIC for the Raptor64 ;
2845,26 → 4421,26
; Standard jump table. You can change these addresses if you are
; customizing this interpreter for a different environment.
;
FFFFFFFFFFFFCE44 GOSTART:
FFFFFFFFFFFFCE44 33FFF39C jmp CSTART ; Cold Start entry point
FFFFFFFFFFFFCE48 GOWARM:
FFFFFFFFFFFFCE48 33FFF3BE jmp WSTART ; Warm Start entry point
FFFFFFFFFFFFCE4C GOOUT:
FFFFFFFFFFFFCE4C 33FFF95A jmp OUTC ; Jump to character-out routine
FFFFFFFFFFFFCE50 GOIN:
FFFFFFFFFFFFCE50 33FFF95B jmp INC ;Jump to character-in routine
FFFFFFFFFFFFCE54 GOAUXO:
FFFFFFFFFFFFCE54 33FFF962 jmp AUXOUT ; Jump to auxiliary-out routine
FFFFFFFFFFFFCE58 GOAUXI:
FFFFFFFFFFFFCE58 33FFF95C jmp AUXIN ; Jump to auxiliary-in routine
FFFFFFFFFFFFCE5C GOBYE:
FFFFFFFFFFFFCE5C 33FFF9EA jmp BYEBYE ; Jump to monitor, DOS, etc.
FFFFFFFFFFFFDF4C GOSTART:
FFFFFFFFFFFFDF4C 33FFF7E0 jmp CSTART ; Cold Start entry point
FFFFFFFFFFFFDF50 GOWARM:
FFFFFFFFFFFFDF50 33FFF801 jmp WSTART ; Warm Start entry point
FFFFFFFFFFFFDF54 GOOUT:
FFFFFFFFFFFFDF54 33FFFD9B jmp OUTC ; Jump to character-out routine
FFFFFFFFFFFFDF58 GOIN:
FFFFFFFFFFFFDF58 33FFFD9C jmp INC ;Jump to character-in routine
FFFFFFFFFFFFDF5C GOAUXO:
FFFFFFFFFFFFDF5C 33FFFDA3 jmp AUXOUT ; Jump to auxiliary-out routine
FFFFFFFFFFFFDF60 GOAUXI:
FFFFFFFFFFFFDF60 33FFFD9D jmp AUXIN ; Jump to auxiliary-in routine
FFFFFFFFFFFFDF64 GOBYE:
FFFFFFFFFFFFDF64 33FFFE28 jmp BYEBYE ; Jump to monitor, DOS, etc.
;
; Modifiable system constants:
;
FFFFFFFFFFFFCE60 align 8
FFFFFFFFFFFFCE60 0000000010060000 TXTBGN dw 0x000000001_00600000 ;TXT ;beginning of program memory
FFFFFFFFFFFFCE68 00000000107FFFF8 ENDMEM dw 0x000000001_07FFFFF8 ; end of available memory
FFFFFFFFFFFFDF68 align 8
FFFFFFFFFFFFDF68 0000000010060000 TXTBGN dw 0x000000001_00600000 ;TXT ;beginning of program memory
FFFFFFFFFFFFDF70 00000000107FFFF8 ENDMEM dw 0x000000001_07FFFFF8 ; end of available memory
;
; The main interpreter starts here:
;
2873,127 → 4449,129
; r8 = text buffer pointer
; r12 = end of text in text buffer
;
FFFFFFFFFFFFCE70 align 16
FFFFFFFFFFFFCE70 CSTART:
FFFFFFFFFFFFDF78 0000000000000000 align 16
FFFFFFFFFFFFDF80 align 16
FFFFFFFFFFFFDF80 CSTART:
; First save off the link register and OS sp value
FFFFFFFFFFFFCE70 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFCE74 67EF8000 sw lr,[sp]
FFFFFFFFFFFFCE78 660F1088 sw sp,OSSP
FFFFFFFFFFFFCE7C 460F4E68 lw sp,ENDMEM ; initialize stack pointer
FFFFFFFFFFFFCE80 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFCE84 67EF8000 sw lr,[sp] ; save off return address
FFFFFFFFFFFFCE88 62001416 sc r0,CursorRow ; set screen output
FFFFFFFFFFFFCE8C 62001418 sc r0,CursorCol
FFFFFFFFFFFFCE90 6000141A sb r0,CursorFlash
FFFFFFFFFFFFCE94 6600103C sw r0,pos
FFFFFFFFFFFFCE98 E6800020 ; SETLO
FFFFFFFFFFFFCE9C EE800040 ; SETMID
FFFFFFFFFFFFCEA0 040D0809 lw r2,#0x10000020 ; black chars, yellow background
FFFFFFFFFFFFCEA4 64011040 sh r2,charToPrint
FFFFFFFFFFFFCEA8 31FFEED9 call ClearScreen
FFFFFFFFFFFFCEAC 9A00E5C0 lea r1,msgInit ; tell who we are
FFFFFFFFFFFFCEB0 31FFF94D call PRMESGAUX
FFFFFFFFFFFFCEB4 9A00E5C0 lea r1,msgInit ; tell who we are
FFFFFFFFFFFFCEB8 31FFF940 call PRMESG
FFFFFFFFFFFFCEBC 4600CE60 lw r1,TXTBGN ; init. end-of-program pointer
FFFFFFFFFFFFCEC0 660090D0 sw r1,TXTUNF
FFFFFFFFFFFFCEC4 4600CE68 lw r1,ENDMEM ; get address of end of memory
FFFFFFFFFFFFCEC8 0E108800 subui r1,r1,#2048 ; reserve 2K for the stack
FFFFFFFFFFFFCECC 660090F8 sw r1,STKBOT
FFFFFFFFFFFFCED0 0E10A000 subui r1,r1,#8192 ; 1000 vars
FFFFFFFFFFFFCED4 660090D8 sw r1,VARBGN
FFFFFFFFFFFFCED8 31FFF4C3 call clearVars ; clear the variable area
FFFFFFFFFFFFCEDC 460090D8 lw r1,VARBGN ; calculate number of bytes free
FFFFFFFFFFFFCEE0 460190D0 lw r3,TXTUNF
FFFFFFFFFFFFCEE4 04118404 sub r1,r1,r3
FFFFFFFFFFFFCEE8 E0800000 setlo r2,#0
FFFFFFFFFFFFCEEC 31FFF88D call PRTNUM
FFFFFFFFFFFFCEF0 9A00E668 lea r1,msgBytesFree
FFFFFFFFFFFFCEF4 31FFF940 call PRMESG
FFFFFFFFFFFFCEF8 WSTART:
FFFFFFFFFFFFCEF8 660010A8 sw r0,LOPVAR ; initialize internal variables
FFFFFFFFFFFFCEFC 66001098 sw r0,STKGOS
FFFFFFFFFFFFCF00 66001090 sw r0,CURRNT ; current line number pointer = 0
FFFFFFFFFFFFCF04 460F4E68 lw sp,ENDMEM ; init S.P. again, just in case
FFFFFFFFFFFFCF08 9A00E676 lea r1,msgReady ; display "Ready"
FFFFFFFFFFFFCF0C 31FFF940 call PRMESG
FFFFFFFFFFFFCF10 ST3:
FFFFFFFFFFFFCF10 E040003E setlo r1,#'>' ; Prompt with a '>' and
FFFFFFFFFFFFCF14 31FFF7D8 call GETLN ; read a line.
FFFFFFFFFFFFCF18 31FFF91D call TOUPBUF ; convert to upper case
FFFFFFFFFFFFCF1C 02860009 mov r12,r8 ; save pointer to end of line
FFFFFFFFFFFFCF20 9A04111B lea r8,BUFFER ; point to the beginning of line
FFFFFFFFFFFFCF24 31FFF8FF call TSTNUM ; is there a number there?
FFFFFFFFFFFFCF28 31FFF914 call IGNBLK ; skip trailing blanks
FFFFFFFFFFFFDF80 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFDF84 67EF8000 sw lr,[sp]
FFFFFFFFFFFFDF88 660F1088 sw sp,OSSP
FFFFFFFFFFFFDF8C 460F5F70 lw sp,ENDMEM ; initialize stack pointer
FFFFFFFFFFFFDF90 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFDF94 67EF8000 sw lr,[sp] ; save off return address
FFFFFFFFFFFFDF98 60001417 sb r0,CursorRow ; set screen output
FFFFFFFFFFFFDF9C 60001418 sb r0,CursorCol
FFFFFFFFFFFFDFA0 6000141A sb r0,CursorFlash
FFFFFFFFFFFFDFA4 6400104C sh r0,pos
FFFFFFFFFFFFDFA8 E6800020 ; SETLO
FFFFFFFFFFFFDFAC EE800040 ; SETMID
FFFFFFFFFFFFDFB0 040D0809 lw r2,#0x10000020 ; black chars, yellow background
; sh r2,charToPrint
FFFFFFFFFFFFDFB4 31FFF011 call ClearScreen
FFFFFFFFFFFFDFB8 9A00F6B8 lea r1,msgInit ; tell who we are
; call PRMESGAUX
FFFFFFFFFFFFDFBC 9A00F6B8 lea r1,msgInit ; tell who we are
FFFFFFFFFFFFDFC0 31FFFD81 call PRMESG
FFFFFFFFFFFFDFC4 4600DF68 lw r1,TXTBGN ; init. end-of-program pointer
FFFFFFFFFFFFDFC8 660090D0 sw r1,TXTUNF
FFFFFFFFFFFFDFCC 4600DF70 lw r1,ENDMEM ; get address of end of memory
FFFFFFFFFFFFDFD0 0E109000 subui r1,r1,#4096 ; reserve 4K for the stack
FFFFFFFFFFFFDFD4 660090F8 sw r1,STKBOT
FFFFFFFFFFFFDFD8 E6804000 ; SETLO
FFFFFFFFFFFFDFDC 041D0405 subui r1,r1,#16384 ; 1000 vars
FFFFFFFFFFFFDFE0 660090D8 sw r1,VARBGN
FFFFFFFFFFFFDFE4 31FFF905 call clearVars ; clear the variable area
FFFFFFFFFFFFDFE8 460090D8 lw r1,VARBGN ; calculate number of bytes free
FFFFFFFFFFFFDFEC 460190D0 lw r3,TXTUNF
FFFFFFFFFFFFDFF0 04118405 subu r1,r1,r3
FFFFFFFFFFFFDFF4 E0800000 setlo r2,#0
FFFFFFFFFFFFDFF8 31FFFCCC call PRTNUM
FFFFFFFFFFFFDFFC 9A00F760 lea r1,msgBytesFree
FFFFFFFFFFFFE000 31FFFD81 call PRMESG
FFFFFFFFFFFFE004 WSTART:
FFFFFFFFFFFFE004 660010A8 sw r0,LOPVAR ; initialize internal variables
FFFFFFFFFFFFE008 66001098 sw r0,STKGOS
FFFFFFFFFFFFE00C 66001090 sw r0,CURRNT ; current line number pointer = 0
FFFFFFFFFFFFE010 460F5F70 lw sp,ENDMEM ; init S.P. again, just in case
FFFFFFFFFFFFE014 9A00F76E lea r1,msgReady ; display "Ready"
FFFFFFFFFFFFE018 31FFFD81 call PRMESG
FFFFFFFFFFFFE01C ST3:
FFFFFFFFFFFFE01C E040003E setlo r1,#'>' ; Prompt with a '>' and
FFFFFFFFFFFFE020 31FFFC1A call GETLN ; read a line.
FFFFFFFFFFFFE024 31FFFD5E call TOUPBUF ; convert to upper case
FFFFFFFFFFFFE028 02860009 mov r12,r8 ; save pointer to end of line
FFFFFFFFFFFFE02C 9A04111B lea r8,BUFFER ; point to the beginning of line
FFFFFFFFFFFFE030 31FFFD3E call TSTNUM ; is there a number there?
FFFFFFFFFFFFE034 31FFFD55 call IGNBLK ; skip trailing blanks
; does line no. exist? (or nonzero?)
FFFFFFFFFFFFCF2C BE101728 beq r1,r0,DIRECT ; if not, it's a direct statement
FFFFFFFFFFFFCF30 AC1003FF bleu r1,#0xFFFF,ST2 ; see if line no. is <= 16 bits
FFFFFFFFFFFFCF34 9A00E694 lea r1,msgLineRange ; if not, we've overflowed
FFFFFFFFFFFFCF38 BE007F4A bra ERROR
FFFFFFFFFFFFCF3C ST2:
FFFFFFFFFFFFE038 BE101708 beq r1,r0,DIRECT ; if not, it's a direct statement
FFFFFFFFFFFFE03C AC1003FF bleu r1,#0xFFFF,ST2 ; see if line no. is <= 16 bits
FFFFFFFFFFFFE040 9A00F78C lea r1,msgLineRange ; if not, we've overflowed
FFFFFFFFFFFFE044 BE007F2A bra ERROR
FFFFFFFFFFFFE048 ST2:
; ugliness - store a character at potentially an
; odd address (unaligned).
FFFFFFFFFFFFCF3C 02110009 mov r2,r1 ; r2 = line number
FFFFFFFFFFFFCF40 60817FFE sb r2,-2[r8]
FFFFFFFFFFFFCF44 06211001 shrui r2,r2,#8
FFFFFFFFFFFFCF48 60817FFF sb r2,-1[r8] ; store the binary line no.
FFFFFFFFFFFFCF4C 0E840002 subui r8,r8,#2
FFFFFFFFFFFFCF50 31FFF80C call FNDLN ; find this line in save area
FFFFFFFFFFFFCF54 02968009 mov r13,r9 ; save possible line pointer
FFFFFFFFFFFFCF58 BE1001C8 beq r1,r0,ST4 ; if not found, insert
FFFFFFFFFFFFE048 02110009 mov r2,r1 ; r2 = line number
FFFFFFFFFFFFE04C 60817FFE sb r2,-2[r8]
FFFFFFFFFFFFE050 06211001 shrui r2,r2,#8
FFFFFFFFFFFFE054 60817FFF sb r2,-1[r8] ; store the binary line no.
FFFFFFFFFFFFE058 0E840002 subui r8,r8,#2
FFFFFFFFFFFFE05C 31FFFC4E call FNDLN ; find this line in save area
FFFFFFFFFFFFE060 02968009 mov r13,r9 ; save possible line pointer
FFFFFFFFFFFFE064 BE1001C8 beq r1,r0,ST4 ; if not found, insert
; here we found the line, so we're replacing the line
; in the text area
; first step - delete the line
FFFFFFFFFFFFCF5C E0400000 setlo r1,#0
FFFFFFFFFFFFCF60 31FFF820 call FNDNXT ; find the next line (into r9)
FFFFFFFFFFFFCF64 BE100049 bne r1,r0,ST7
FFFFFFFFFFFFCF68 BE900108 beq r9,r0,ST6 ; no more lines
FFFFFFFFFFFFCF6C ST7:
FFFFFFFFFFFFCF6C 02908009 mov r1,r9 ; r1 = pointer to next line
FFFFFFFFFFFFCF70 02D10009 mov r2,r13 ; pointer to line to be deleted
FFFFFFFFFFFFCF74 460190D0 lw r3,TXTUNF ; points to top of save area
FFFFFFFFFFFFCF78 31FFF829 call MVUP ; move up to delete
FFFFFFFFFFFFCF7C 660110D0 sw r2,TXTUNF ; update the end pointer
FFFFFFFFFFFFE068 E0400000 setlo r1,#0
FFFFFFFFFFFFE06C 31FFFC62 call FNDNXT ; find the next line (into r9)
FFFFFFFFFFFFE070 BE100049 bne r1,r0,ST7
FFFFFFFFFFFFE074 BE900108 beq r9,r0,ST6 ; no more lines
FFFFFFFFFFFFE078 ST7:
FFFFFFFFFFFFE078 02908009 mov r1,r9 ; r1 = pointer to next line
FFFFFFFFFFFFE07C 02D10009 mov r2,r13 ; pointer to line to be deleted
FFFFFFFFFFFFE080 460190D0 lw r3,TXTUNF ; points to top of save area
FFFFFFFFFFFFE084 31FFFC6B call MVUP ; move up to delete
FFFFFFFFFFFFE088 660110D0 sw r2,TXTUNF ; update the end pointer
; we moved the lines of text after the line being
; deleted down, so the pointer to the next line
; needs to be reset
FFFFFFFFFFFFCF80 02D48009 mov r9,r13
FFFFFFFFFFFFCF84 BE00006A bra ST4
FFFFFFFFFFFFE08C 02D48009 mov r9,r13
FFFFFFFFFFFFE090 BE00006A bra ST4
; here there were no more lines, so just move the
; end of text pointer down
FFFFFFFFFFFFCF88 ST6:
FFFFFFFFFFFFCF88 660690D0 sw r13,TXTUNF
FFFFFFFFFFFFCF8C 02D48009 mov r9,r13
FFFFFFFFFFFFCF90 ST4:
FFFFFFFFFFFFE094 ST6:
FFFFFFFFFFFFE094 660690D0 sw r13,TXTUNF
FFFFFFFFFFFFE098 02D48009 mov r9,r13
FFFFFFFFFFFFE09C ST4:
; here we're inserting because the line wasn't found
; or it was deleted from the text area
FFFFFFFFFFFFCF90 02C08009 mov r1,r12 ; calculate the length of new line
FFFFFFFFFFFFCF94 04140404 sub r1,r1,r8
FFFFFFFFFFFFCF98 A41FDE03 blei r1,#3,ST3 ; is it just a line no. & CR? if so, it was just a delete
FFFFFFFFFFFFE09C 02C08009 mov r1,r12 ; calculate the length of new line
FFFFFFFFFFFFE0A0 04140404 sub r1,r1,r8
FFFFFFFFFFFFE0A4 A41FDE03 blei r1,#3,ST3 ; is it just a line no. & CR? if so, it was just a delete
FFFFFFFFFFFFCF9C 460590D0 lw r11,TXTUNF ; compute new end of text
FFFFFFFFFFFFCFA0 02B50009 mov r10,r11 ; r10 = old TXTUNF
FFFFFFFFFFFFCFA4 04B0AC02 add r11,r11,r1 ; r11 = new top of TXTUNF (r1=line length)
FFFFFFFFFFFFE0A8 460590D0 lw r11,TXTUNF ; compute new end of text
FFFFFFFFFFFFE0AC 02B50009 mov r10,r11 ; r10 = old TXTUNF
FFFFFFFFFFFFE0B0 04B0AC02 add r11,r11,r1 ; r11 = new top of TXTUNF (r1=line length)
FFFFFFFFFFFFCFA8 460090D8 lw r1,VARBGN ; see if there's enough room
FFFFFFFFFFFFCFAC BEB08064 bltu r11,r1,ST5
FFFFFFFFFFFFCFB0 9A00E76F lea r1,msgTooBig ; if not, say so
FFFFFFFFFFFFCFB4 33FFF7C8 jmp ERROR
FFFFFFFFFFFFE0B4 460090D8 lw r1,VARBGN ; see if there's enough room
FFFFFFFFFFFFE0B8 BEB08064 bltu r11,r1,ST5
FFFFFFFFFFFFE0BC 9A00F867 lea r1,msgTooBig ; if not, say so
FFFFFFFFFFFFE0C0 33FFFC0A jmp ERROR
; open a space in the text area
FFFFFFFFFFFFCFB8 ST5:
FFFFFFFFFFFFCFB8 660590D0 sw r11,TXTUNF ; if so, store new end position
FFFFFFFFFFFFCFBC 02A08009 mov r1,r10 ; points to old end of text
FFFFFFFFFFFFCFC0 02B10009 mov r2,r11 ; points to new end of text
FFFFFFFFFFFFCFC4 02918009 mov r3,r9 ; points to start of line after insert line
FFFFFFFFFFFFCFC8 31FFF82F call MVDOWN ; move things out of the way
FFFFFFFFFFFFE0C4 ST5:
FFFFFFFFFFFFE0C4 660590D0 sw r11,TXTUNF ; if so, store new end position
FFFFFFFFFFFFE0C8 02A08009 mov r1,r10 ; points to old end of text
FFFFFFFFFFFFE0CC 02B10009 mov r2,r11 ; points to new end of text
FFFFFFFFFFFFE0D0 02918009 mov r3,r9 ; points to start of line after insert line
FFFFFFFFFFFFE0D4 31FFFC71 call MVDOWN ; move things out of the way
; copy line into text space
FFFFFFFFFFFFCFCC 02808009 mov r1,r8 ; set up to do the insertion; move from buffer
FFFFFFFFFFFFCFD0 02D10009 mov r2,r13 ; to vacated space
FFFFFFFFFFFFCFD4 02C18009 mov r3,r12 ; until end of buffer
FFFFFFFFFFFFCFD8 31FFF829 call MVUP ; do it
FFFFFFFFFFFFCFDC BE0079AA bra ST3 ; go back and get another line
FFFFFFFFFFFFE0D8 02808009 mov r1,r8 ; set up to do the insertion; move from buffer
FFFFFFFFFFFFE0DC 02D10009 mov r2,r13 ; to vacated space
FFFFFFFFFFFFE0E0 02C18009 mov r3,r12 ; until end of buffer
FFFFFFFFFFFFE0E4 31FFFC6B call MVUP ; do it
FFFFFFFFFFFFE0E8 BE0079AA bra ST3 ; go back and get another line
;******************************************************************
;
3025,98 → 4603,99
; executed if none of the other table items are matched.
;
; Character-matching tables:
FFFFFFFFFFFFCFE0 align 8
FFFFFFFFFFFFCFE0 TAB1:
FFFFFFFFFFFFCFE0 C4414F4CD453494C db "LOA",'D'+0x80
FFFFFFFFFFFFCFE8 4153CE5552D7454E db "SAV",'E'+0x80
FFFFFFFFFFFFCFF2 TAB2:
FFFFFFFFFFFFCFF0 454CD458454EC556 db "LE",'T'+0x80
FFFFFFFFFFFFCFF8 47CF544F47C649D4 db "GOSU",'B'+0x80
FFFFFFFFFFFFD000 55544552C255534F db "RETUR",'N'+0x80
FFFFFFFFFFFFD008 D24F46CD4552CE52 db "FO",'R'+0x80
FFFFFFFFFFFFD010 495250D455504E49 db "PRIN",'T'+0x80
FFFFFFFFFFFFD018 50C3454B4F50D44E db "POKE",'H'+0x80
FFFFFFFFFFFFD020 454B4F50C8454B4F db "POKE",'W'+0x80
FFFFFFFFFFFFD028 4F5453C54B4F50D7 db "STO",'P'+0x80
FFFFFFFFFFFFD030 43D35953C55942D0 db "CL",'S'+0x80
FFFFFFFFFFFFD038 434452D24C43D34C db "RDC",'F'+0x80
FFFFFFFFFFFFD042 TAB4:
FFFFFFFFFFFFD040 50C34B45455000C6 db "PEEK",'H'+0x80 ;Functions
FFFFFFFFFFFFD048 4B454550C84B4545 db "PEEK",'W'+0x80 ;Functions
FFFFFFFFFFFFD050 C44E52CB454550D7 db "RN",'D'+0x80
FFFFFFFFFFFFD058 55C55A4953D34241 db "US",'R'+0x80
FFFFFFFFFFFFD063 TAB5:
FFFFFFFFFFFFD066 TAB6:
FFFFFFFFFFFFD060 545300CF5400D253 db "STE",'P'+0x80 ;"STEP" in "FOR"
FFFFFFFFFFFFD06B TAB8:
FFFFFFFFFFFFD068 BEBE3CBD3E00D045 db '>'+0x80
FFFFFFFFFFFFD075 TAB9:
FFFFFFFFFFFFD070 C44E4100BCBD3CBD db "AN",'D'+0x80
FFFFFFFFFFFFD079 TAB10:
FFFFFFFFFFFFD080 .align 8
FFFFFFFFFFFFE0EC TAB1:
FFFFFFFFFFFFE0E8 D453494CBE0079AA db "LIS",'T'+0x80 ; Direct commands
FFFFFFFFFFFFE0F0 52D7454EC4414F4C db "RU",'N'+0x80
FFFFFFFFFFFFE0FE TAB2:
FFFFFFFFFFFFE0F8 454EC5564153CE55 db "NEX",'T'+0x80 ; Direct / statement
FFFFFFFFFFFFE100 47C649D4454CD458 db "GOT",'O'+0x80
FFFFFFFFFFFFE108 C255534F47CF544F db "GOSU",'B'+0x80
FFFFFFFFFFFFE110 4552CE5255544552 db "RE",'M'+0x80
FFFFFFFFFFFFE118 55504E49D24F46CD db "INPU",'T'+0x80
FFFFFFFFFFFFE120 4F50D44E495250D4 db "POKE",'C'+0x80
FFFFFFFFFFFFE128 C8454B4F50C3454B db "POKE",'H'+0x80
FFFFFFFFFFFFE130 4B4F50D7454B4F50 db "POK",'E'+0x80
FFFFFFFFFFFFE138 C55942D04F5453C5 db "BY",'E'+0x80
FFFFFFFFFFFFE140 4C43D34C43D35953 db "CL",'R'+0x80
FFFFFFFFFFFFE14E TAB4:
FFFFFFFFFFFFE148 455000C6434452D2 db "PEEK",'C'+0x80 ;Functions
FFFFFFFFFFFFE150 C84B454550C34B45 db "PEEK",'H'+0x80 ;Functions
FFFFFFFFFFFFE158 454550D74B454550 db "PEE",'K'+0x80 ;Functions
FFFFFFFFFFFFE160 53D34241C44E52CB db "SIZ",'E'+0x80
FFFFFFFFFFFFE16F TAB5:
FFFFFFFFFFFFE168 5400D25355C55A49 db "T",'O'+0x80 ;"TO" in "FOR"
FFFFFFFFFFFFE172 TAB6:
FFFFFFFFFFFFE177 TAB8:
FFFFFFFFFFFFE170 3E00D045545300CF db '>','='+0x80 ;Relational operators
FFFFFFFFFFFFE178 BCBD3CBDBEBE3CBD db '<'+0x80
FFFFFFFFFFFFE181 TAB9:
FFFFFFFFFFFFE185 TAB10:
FFFFFFFFFFFFE180 00D24F00C44E4100 db 0
FFFFFFFFFFFFE188 .align 8
;* Execution address tables:
FFFFFFFFFFFFD080 TAB1_1:
FFFFFFFFFFFFD080 FFFFFFFFFFFFD338 dw LISTX ;Direct commands
FFFFFFFFFFFFD088 FFFFFFFFFFFFD67C dw LOAD
FFFFFFFFFFFFD090 FFFFFFFFFFFFD284 dw NEW
FFFFFFFFFFFFD098 FFFFFFFFFFFFD29C dw RUN
FFFFFFFFFFFFD0A0 FFFFFFFFFFFFD728 dw SAVE
FFFFFFFFFFFFD0A8 TAB2_1:
FFFFFFFFFFFFD0A8 FFFFFFFFFFFFD508 dw NEXT ; Direct / statement
FFFFFFFFFFFFD0B0 FFFFFFFFFFFFD664 dw LET
FFFFFFFFFFFFD0B8 FFFFFFFFFFFFD578 dw IF
FFFFFFFFFFFFD0C0 FFFFFFFFFFFFD2E4 dw GOTO
FFFFFFFFFFFFD0C8 FFFFFFFFFFFFD418 dw GOSUB
FFFFFFFFFFFFD0D0 FFFFFFFFFFFFD454 dw RETURN
FFFFFFFFFFFFD0D8 FFFFFFFFFFFFD580 dw IF2 ; REM
FFFFFFFFFFFFD0E0 FFFFFFFFFFFFD48C dw FOR
FFFFFFFFFFFFD0E8 FFFFFFFFFFFFD5A8 dw INPUT
FFFFFFFFFFFFD0F0 FFFFFFFFFFFFD380 dw PRINT
FFFFFFFFFFFFD0F8 FFFFFFFFFFFFD83C dw POKEC
FFFFFFFFFFFFD100 FFFFFFFFFFFFD868 dw POKEH
FFFFFFFFFFFFD108 FFFFFFFFFFFFD894 dw POKEW
FFFFFFFFFFFFD110 FFFFFFFFFFFFD808 dw POKE
FFFFFFFFFFFFD118 FFFFFFFFFFFFD294 dw STOP
FFFFFFFFFFFFD120 FFFFFFFFFFFFCE5C dw GOBYE
FFFFFFFFFFFFD128 FFFFFFFFFFFFD8C0 dw SYSX
FFFFFFFFFFFFD130 FFFFFFFFFFFFE58C dw _cls
FFFFFFFFFFFFD138 FFFFFFFFFFFFD304 dw _clr
FFFFFFFFFFFFD140 FFFFFFFFFFFFE5A0 dw _rdcf
FFFFFFFFFFFFD148 FFFFFFFFFFFFD65C dw DEFLT
FFFFFFFFFFFFD150 TAB4_1:
FFFFFFFFFFFFD150 FFFFFFFFFFFFDD3C dw PEEKC
FFFFFFFFFFFFD158 FFFFFFFFFFFFDD50 dw PEEKH
FFFFFFFFFFFFD160 FFFFFFFFFFFFDD64 dw PEEKW
FFFFFFFFFFFFD168 FFFFFFFFFFFFDD2C dw PEEK ;Functions
FFFFFFFFFFFFD170 FFFFFFFFFFFFDD94 dw RND
FFFFFFFFFFFFD178 FFFFFFFFFFFFDE2C dw ABS
FFFFFFFFFFFFD180 FFFFFFFFFFFFDE4C dw SIZEX
FFFFFFFFFFFFD188 FFFFFFFFFFFFDD78 dw USRX
FFFFFFFFFFFFD190 FFFFFFFFFFFFDB50 dw XP40
FFFFFFFFFFFFD198 TAB5_1
FFFFFFFFFFFFD198 FFFFFFFFFFFFD4A4 dw FR1 ;"TO" in "FOR"
FFFFFFFFFFFFD1A0 FFFFFFFFFFFFDF1C dw QWHAT
FFFFFFFFFFFFD1A8 TAB6_1
FFFFFFFFFFFFD1A8 FFFFFFFFFFFFD4B8 dw FR2 ;"STEP" in "FOR"
FFFFFFFFFFFFD1B0 FFFFFFFFFFFFD4C0 dw FR3
FFFFFFFFFFFFD1B8 TAB8_1
FFFFFFFFFFFFD1B8 FFFFFFFFFFFFD9D0 dw XP11 ;>= Relational operators
FFFFFFFFFFFFD1C0 FFFFFFFFFFFFD9E0 dw XP12 ;<>
FFFFFFFFFFFFD1C8 FFFFFFFFFFFFD9F0 dw XP13 ;>
FFFFFFFFFFFFD1D0 FFFFFFFFFFFFDA10 dw XP15 ;=
FFFFFFFFFFFFD1D8 FFFFFFFFFFFFDA00 dw XP14 ;<=
FFFFFFFFFFFFD1E0 FFFFFFFFFFFFDA20 dw XP16 ;<
FFFFFFFFFFFFD1E8 FFFFFFFFFFFFDA48 dw XP17
FFFFFFFFFFFFD1F0 TAB9_1
FFFFFFFFFFFFD1F0 FFFFFFFFFFFFD93C dw XP_AND
FFFFFFFFFFFFD1F8 FFFFFFFFFFFFD94C dw XP_ANDX
FFFFFFFFFFFFD200 TAB10_1
FFFFFFFFFFFFD200 FFFFFFFFFFFFD904 dw XP_OR
FFFFFFFFFFFFD208 FFFFFFFFFFFFD914 dw XP_ORX
FFFFFFFFFFFFE188 TAB1_1:
FFFFFFFFFFFFE188 FFFFFFFFFFFFE440 dw LISTX ;Direct commands
FFFFFFFFFFFFE190 FFFFFFFFFFFFE784 dw LOAD
FFFFFFFFFFFFE198 FFFFFFFFFFFFE38C dw NEW
FFFFFFFFFFFFE1A0 FFFFFFFFFFFFE3A4 dw RUN
FFFFFFFFFFFFE1A8 FFFFFFFFFFFFE830 dw SAVE
FFFFFFFFFFFFE1B0 TAB2_1:
FFFFFFFFFFFFE1B0 FFFFFFFFFFFFE610 dw NEXT ; Direct / statement
FFFFFFFFFFFFE1B8 FFFFFFFFFFFFE76C dw LET
FFFFFFFFFFFFE1C0 FFFFFFFFFFFFE680 dw IF
FFFFFFFFFFFFE1C8 FFFFFFFFFFFFE3EC dw GOTO
FFFFFFFFFFFFE1D0 FFFFFFFFFFFFE520 dw GOSUB
FFFFFFFFFFFFE1D8 FFFFFFFFFFFFE55C dw RETURN
FFFFFFFFFFFFE1E0 FFFFFFFFFFFFE688 dw IF2 ; REM
FFFFFFFFFFFFE1E8 FFFFFFFFFFFFE594 dw FOR
FFFFFFFFFFFFE1F0 FFFFFFFFFFFFE6B0 dw INPUT
FFFFFFFFFFFFE1F8 FFFFFFFFFFFFE488 dw PRINT
FFFFFFFFFFFFE200 FFFFFFFFFFFFE944 dw POKEC
FFFFFFFFFFFFE208 FFFFFFFFFFFFE970 dw POKEH
FFFFFFFFFFFFE210 FFFFFFFFFFFFE99C dw POKEW
FFFFFFFFFFFFE218 FFFFFFFFFFFFE910 dw POKE
FFFFFFFFFFFFE220 FFFFFFFFFFFFE39C dw STOP
FFFFFFFFFFFFE228 FFFFFFFFFFFFDF64 dw GOBYE
FFFFFFFFFFFFE230 FFFFFFFFFFFFE9C8 dw SYSX
FFFFFFFFFFFFE238 FFFFFFFFFFFFF690 dw _cls
FFFFFFFFFFFFE240 FFFFFFFFFFFFE40C dw _clr
FFFFFFFFFFFFE248 FFFFFFFFFFFFF6A4 dw _rdcf
FFFFFFFFFFFFE250 FFFFFFFFFFFFE764 dw DEFLT
FFFFFFFFFFFFE258 TAB4_1:
FFFFFFFFFFFFE258 FFFFFFFFFFFFEE44 dw PEEKC
FFFFFFFFFFFFE260 FFFFFFFFFFFFEE58 dw PEEKH
FFFFFFFFFFFFE268 FFFFFFFFFFFFEE6C dw PEEKW
FFFFFFFFFFFFE270 FFFFFFFFFFFFEE34 dw PEEK ;Functions
FFFFFFFFFFFFE278 FFFFFFFFFFFFEE9C dw RND
FFFFFFFFFFFFE280 FFFFFFFFFFFFEF34 dw ABS
FFFFFFFFFFFFE288 FFFFFFFFFFFFEF54 dw SIZEX
FFFFFFFFFFFFE290 FFFFFFFFFFFFEE80 dw USRX
FFFFFFFFFFFFE298 FFFFFFFFFFFFEC58 dw XP40
FFFFFFFFFFFFE2A0 TAB5_1
FFFFFFFFFFFFE2A0 FFFFFFFFFFFFE5AC dw FR1 ;"TO" in "FOR"
FFFFFFFFFFFFE2A8 FFFFFFFFFFFFF024 dw QWHAT
FFFFFFFFFFFFE2B0 TAB6_1
FFFFFFFFFFFFE2B0 FFFFFFFFFFFFE5C0 dw FR2 ;"STEP" in "FOR"
FFFFFFFFFFFFE2B8 FFFFFFFFFFFFE5C8 dw FR3
FFFFFFFFFFFFE2C0 TAB8_1
FFFFFFFFFFFFE2C0 FFFFFFFFFFFFEAD8 dw XP11 ;>= Relational operators
FFFFFFFFFFFFE2C8 FFFFFFFFFFFFEAE8 dw XP12 ;<>
FFFFFFFFFFFFE2D0 FFFFFFFFFFFFEAF8 dw XP13 ;>
FFFFFFFFFFFFE2D8 FFFFFFFFFFFFEB18 dw XP15 ;=
FFFFFFFFFFFFE2E0 FFFFFFFFFFFFEB08 dw XP14 ;<=
FFFFFFFFFFFFE2E8 FFFFFFFFFFFFEB28 dw XP16 ;<
FFFFFFFFFFFFE2F0 FFFFFFFFFFFFEB50 dw XP17
FFFFFFFFFFFFE2F8 TAB9_1
FFFFFFFFFFFFE2F8 FFFFFFFFFFFFEA44 dw XP_AND
FFFFFFFFFFFFE300 FFFFFFFFFFFFEA54 dw XP_ANDX
FFFFFFFFFFFFE308 TAB10_1
FFFFFFFFFFFFE308 FFFFFFFFFFFFEA0C dw XP_OR
FFFFFFFFFFFFE310 FFFFFFFFFFFFEA1C dw XP_ORX
FFFFFFFFFFFFD210 .align 16
FFFFFFFFFFFFE318 .align 4
;*
; r3 = match flag (trashed)
3123,42 → 4702,42
; r9 = text table
; r10 = exec table
; r11 = trashed
FFFFFFFFFFFFD210 DIRECT:
FFFFFFFFFFFFD210 9A04CFE0 lea r9,TAB1
FFFFFFFFFFFFD214 9A055080 lea r10,TAB1_1
FFFFFFFFFFFFD218 EXEC:
FFFFFFFFFFFFD218 03F58009 mov r11,lr ; save link reg
FFFFFFFFFFFFD21C 31FFF914 call IGNBLK ; ignore leading blanks
FFFFFFFFFFFFD220 02BF8009 mov lr,r11 ; restore link reg
FFFFFFFFFFFFD224 02858009 mov r11,r8 ; save the pointer
FFFFFFFFFFFFD228 E0C00000 setlo r3,#0 ; clear match flag
FFFFFFFFFFFFD22C EXLP:
FFFFFFFFFFFFD22C 4A808000 lbu r1,[r8] ; get the program character
FFFFFFFFFFFFD230 0A840001 addui r8,r8,#1
FFFFFFFFFFFFD234 4A910000 lbu r2,[r9] ; get the table character
FFFFFFFFFFFFD238 BE200069 bne r2,r0,EXNGO ; If end of table,
FFFFFFFFFFFFD23C 02B40009 mov r8,r11 ; restore the text pointer and...
FFFFFFFFFFFFD240 BE0001EA bra EXGO ; execute the default.
FFFFFFFFFFFFD244 EXNGO:
FFFFFFFFFFFFD244 BE1181C8 beq r1,r3,EXGO ; Else check for period... if so, execute
FFFFFFFFFFFFD248 1421007F andi r2,r2,#0x7f ; ignore the table's high bit
FFFFFFFFFFFFD24C BE208108 beq r2,r1,EXMAT; is there a match?
FFFFFFFFFFFFD250 0AA50008 addui r10,r10,#8 ;if not, try the next entry
FFFFFFFFFFFFD254 02B40009 mov r8,r11 ; reset the program pointer
FFFFFFFFFFFFD258 E0C00000 setlo r3,#0 ; sorry, no match
FFFFFFFFFFFFD25C EX1:
FFFFFFFFFFFFD25C 0A948001 addui r9,r9,#1
FFFFFFFFFFFFD260 4090FFFF lb r1,-1[r9] ; get to the end of the entry
FFFFFFFFFFFFD264 BE107FC3 bgt r1,r0,EX1
FFFFFFFFFFFFD268 BE007E2A bra EXLP ; back for more matching
FFFFFFFFFFFFD26C EXMAT:
FFFFFFFFFFFFD26C E0C0002E setlo r3,#'.' ; we've got a match so far
FFFFFFFFFFFFD270 0A948001 addui r9,r9,#1
FFFFFFFFFFFFD274 4090FFFF lb r1,-1[r9] ; end of table entry?
FFFFFFFFFFFFD278 BE107DA3 bgt r1,r0,EXLP ; if not, go back for more
FFFFFFFFFFFFD27C EXGO:
FFFFFFFFFFFFD27C 46A58000 lw r11,[r10] ; execute the appropriate routine
FFFFFFFFFFFFD280 34B00000 jal r0,[r11]
FFFFFFFFFFFFE318 DIRECT:
FFFFFFFFFFFFE318 9A04E0EC lea r9,TAB1
FFFFFFFFFFFFE31C 9A056188 lea r10,TAB1_1
FFFFFFFFFFFFE320 EXEC:
FFFFFFFFFFFFE320 03F58009 mov r11,lr ; save link reg
FFFFFFFFFFFFE324 31FFFD55 call IGNBLK ; ignore leading blanks
FFFFFFFFFFFFE328 02BF8009 mov lr,r11 ; restore link reg
FFFFFFFFFFFFE32C 02858009 mov r11,r8 ; save the pointer
FFFFFFFFFFFFE330 E0C00000 setlo r3,#0 ; clear match flag
FFFFFFFFFFFFE334 EXLP:
FFFFFFFFFFFFE334 4A808000 lbu r1,[r8] ; get the program character
FFFFFFFFFFFFE338 0A840001 addui r8,r8,#1
FFFFFFFFFFFFE33C 4A910000 lbu r2,[r9] ; get the table character
FFFFFFFFFFFFE340 BE200069 bne r2,r0,EXNGO ; If end of table,
FFFFFFFFFFFFE344 02B40009 mov r8,r11 ; restore the text pointer and...
FFFFFFFFFFFFE348 BE0001EA bra EXGO ; execute the default.
FFFFFFFFFFFFE34C EXNGO:
FFFFFFFFFFFFE34C BE1181C8 beq r1,r3,EXGO ; Else check for period... if so, execute
FFFFFFFFFFFFE350 1421007F andi r2,r2,#0x7f ; ignore the table's high bit
FFFFFFFFFFFFE354 BE208108 beq r2,r1,EXMAT; is there a match?
FFFFFFFFFFFFE358 0AA50008 addui r10,r10,#8 ;if not, try the next entry
FFFFFFFFFFFFE35C 02B40009 mov r8,r11 ; reset the program pointer
FFFFFFFFFFFFE360 E0C00000 setlo r3,#0 ; sorry, no match
FFFFFFFFFFFFE364 EX1:
FFFFFFFFFFFFE364 0A948001 addui r9,r9,#1
FFFFFFFFFFFFE368 4090FFFF lb r1,-1[r9] ; get to the end of the entry
FFFFFFFFFFFFE36C BE107FC3 bgt r1,r0,EX1
FFFFFFFFFFFFE370 BE007E2A bra EXLP ; back for more matching
FFFFFFFFFFFFE374 EXMAT:
FFFFFFFFFFFFE374 E0C0002E setlo r3,#'.' ; we've got a match so far
FFFFFFFFFFFFE378 0A948001 addui r9,r9,#1
FFFFFFFFFFFFE37C 4090FFFF lb r1,-1[r9] ; end of table entry?
FFFFFFFFFFFFE380 BE107DA3 bgt r1,r0,EXLP ; if not, go back for more
FFFFFFFFFFFFE384 EXGO:
FFFFFFFFFFFFE384 46A58000 lw r11,[r10] ; execute the appropriate routine
FFFFFFFFFFFFE388 34B00000 jal r0,[r11]
; lb r1,[r8] ; get token from text space
; bpl
3205,70 → 4784,70
; 'GOTO expr<CR>' evaluates the expression, finds the target
; line, and jumps to 'RUNTSL' to do it.
;
FFFFFFFFFFFFD284 NEW:
FFFFFFFFFFFFD284 31FFF7B9 call ENDCHK
FFFFFFFFFFFFD288 4600CE60 lw r1,TXTBGN
FFFFFFFFFFFFD28C 660090D0 sw r1,TXTUNF ; set the end pointer
FFFFFFFFFFFFD290 31FFF4C3 call clearVars
FFFFFFFFFFFFE38C NEW:
FFFFFFFFFFFFE38C 31FFFBFB call ENDCHK
FFFFFFFFFFFFE390 4600DF68 lw r1,TXTBGN
FFFFFFFFFFFFE394 660090D0 sw r1,TXTUNF ; set the end pointer
FFFFFFFFFFFFE398 31FFF905 call clearVars
FFFFFFFFFFFFD294 STOP:
FFFFFFFFFFFFD294 31FFF7B9 call ENDCHK
FFFFFFFFFFFFD298 BE00630A bra WSTART ; WSTART will reset the stack
FFFFFFFFFFFFE39C STOP:
FFFFFFFFFFFFE39C 31FFFBFB call ENDCHK
FFFFFFFFFFFFE3A0 BE00632A bra WSTART ; WSTART will reset the stack
FFFFFFFFFFFFD29C RUN:
FFFFFFFFFFFFD29C 31FFF7B9 call ENDCHK
FFFFFFFFFFFFD2A0 46044E60 lw r8,TXTBGN ; set pointer to beginning
FFFFFFFFFFFFD2A4 66041090 sw r8,CURRNT
FFFFFFFFFFFFD2A8 31FFF4C3 call clearVars
FFFFFFFFFFFFE3A4 RUN:
FFFFFFFFFFFFE3A4 31FFFBFB call ENDCHK
FFFFFFFFFFFFE3A8 46045F68 lw r8,TXTBGN ; set pointer to beginning
FFFFFFFFFFFFE3AC 66041090 sw r8,CURRNT
FFFFFFFFFFFFE3B0 31FFF905 call clearVars
FFFFFFFFFFFFD2AC RUNNXL: ; RUN <next line>
FFFFFFFFFFFFD2AC 46009090 lw r1,CURRNT ; executing a program?
FFFFFFFFFFFFD2B0 BE106248 beq r1,r0,WSTART ; if not, we've finished a direct stat.
FFFFFFFFFFFFD2B4 E0400000 setlo r1,#0 ; else find the next line number
FFFFFFFFFFFFD2B8 02848009 mov r9,r8
FFFFFFFFFFFFD2BC 31FFF810 call FNDLNP ; search for the next line
FFFFFFFFFFFFD2C0 BE100069 bne r1,r0,RUNTSL
FFFFFFFFFFFFD2C4 BE900049 bne r9,r0,RUNTSL
FFFFFFFFFFFFD2C8 BE00618A bra WSTART ; if we've fallen off the end, stop
FFFFFFFFFFFFE3B4 RUNNXL: ; RUN <next line>
FFFFFFFFFFFFE3B4 46009090 lw r1,CURRNT ; executing a program?
FFFFFFFFFFFFE3B8 BE106268 beq r1,r0,WSTART ; if not, we've finished a direct stat.
FFFFFFFFFFFFE3BC E0400000 setlo r1,#0 ; else find the next line number
FFFFFFFFFFFFE3C0 02848009 mov r9,r8
FFFFFFFFFFFFE3C4 31FFFC52 call FNDLNP ; search for the next line
FFFFFFFFFFFFE3C8 BE100069 bne r1,r0,RUNTSL
FFFFFFFFFFFFE3CC BE900049 bne r9,r0,RUNTSL
FFFFFFFFFFFFE3D0 BE0061AA bra WSTART ; if we've fallen off the end, stop
FFFFFFFFFFFFD2CC RUNTSL: ; RUN <this line>
FFFFFFFFFFFFD2CC 66049090 sw r9,CURRNT ; set CURRNT to point to the line no.
FFFFFFFFFFFFD2D0 9A940002 lea r8,2[r9] ; set the text pointer to
FFFFFFFFFFFFE3D4 RUNTSL: ; RUN <this line>
FFFFFFFFFFFFE3D4 66049090 sw r9,CURRNT ; set CURRNT to point to the line no.
FFFFFFFFFFFFE3D8 9A940002 lea r8,2[r9] ; set the text pointer to
FFFFFFFFFFFFD2D4 RUNSML: ; RUN <same line>
FFFFFFFFFFFFD2D4 31FFF936 call CHKIO ; see if a control-C was pressed
FFFFFFFFFFFFD2D8 9A04CFF2 lea r9,TAB2 ; find command in TAB2
FFFFFFFFFFFFD2DC 9A0550A8 lea r10,TAB2_1
FFFFFFFFFFFFD2E0 BE0079CA bra EXEC ; and execute it
FFFFFFFFFFFFE3DC RUNSML: ; RUN <same line>
FFFFFFFFFFFFE3DC 31FFFD77 call CHKIO ; see if a control-C was pressed
FFFFFFFFFFFFE3E0 9A04E0FE lea r9,TAB2 ; find command in TAB2
FFFFFFFFFFFFE3E4 9A0561B0 lea r10,TAB2_1
FFFFFFFFFFFFE3E8 BE0079CA bra EXEC ; and execute it
FFFFFFFFFFFFD2E4 GOTO:
FFFFFFFFFFFFD2E4 31FFF63A call OREXPR ;evaluate the following expression
FFFFFFFFFFFFD2E8 02128009 mov r5,r1
FFFFFFFFFFFFD2EC 31FFF7B9 call ENDCHK ;must find end of line
FFFFFFFFFFFFD2F0 02508009 mov r1,r5
FFFFFFFFFFFFD2F4 31FFF80C call FNDLN ; find the target line
FFFFFFFFFFFFD2F8 BE107EA9 bne r1,r0,RUNTSL ; go do it
FFFFFFFFFFFFD2FC 9A00E73B lea r1,msgBadGotoGosub
FFFFFFFFFFFFD300 BE00610A bra ERROR ; no such line no.
FFFFFFFFFFFFE3EC GOTO:
FFFFFFFFFFFFE3EC 31FFFA7C call OREXPR ;evaluate the following expression
FFFFFFFFFFFFE3F0 02128009 mov r5,r1
FFFFFFFFFFFFE3F4 31FFFBFB call ENDCHK ;must find end of line
FFFFFFFFFFFFE3F8 02508009 mov r1,r5
FFFFFFFFFFFFE3FC 31FFFC4E call FNDLN ; find the target line
FFFFFFFFFFFFE400 BE107EA9 bne r1,r0,RUNTSL ; go do it
FFFFFFFFFFFFE404 9A00F833 lea r1,msgBadGotoGosub
FFFFFFFFFFFFE408 BE00610A bra ERROR ; no such line no.
FFFFFFFFFFFFD304 _clr:
FFFFFFFFFFFFD304 31FFF4C3 call clearVars
FFFFFFFFFFFFD308 BE00084A bra FINISH
FFFFFFFFFFFFE40C _clr:
FFFFFFFFFFFFE40C 31FFF905 call clearVars
FFFFFFFFFFFFE410 BE00084A bra FINISH
; Clear the variable area of memory
FFFFFFFFFFFFD30C clearVars:
FFFFFFFFFFFFD30C 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFD310 67E30000 sw r6,[sp]
FFFFFFFFFFFFD314 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFD318 E1800800 setlo r6,#2048 ; number of words to clear
FFFFFFFFFFFFD31C 460090D8 lw r1,VARBGN
FFFFFFFFFFFFD320 cv1:
FFFFFFFFFFFFD320 66100000 sw r0,[r1]
FFFFFFFFFFFFD324 08108008 add r1,r1,#8
FFFFFFFFFFFFD328 BE037FCF loop r6,cv1
FFFFFFFFFFFFD32C 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFD330 47E30000 lw r6,[sp]
FFFFFFFFFFFFD334 37EF8010 ret #16
FFFFFFFFFFFFE414 clearVars:
FFFFFFFFFFFFE414 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFE418 67E30000 sw r6,[sp]
FFFFFFFFFFFFE41C 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFE420 E1800800 setlo r6,#2048 ; number of words to clear
FFFFFFFFFFFFE424 460090D8 lw r1,VARBGN
FFFFFFFFFFFFE428 cv1:
FFFFFFFFFFFFE428 66100000 sw r0,[r1]
FFFFFFFFFFFFE42C 08108008 add r1,r1,#8
FFFFFFFFFFFFE430 BE037FCF loop r6,cv1
FFFFFFFFFFFFE434 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFE438 47E30000 lw r6,[sp]
FFFFFFFFFFFFE43C 37EF8010 ret #16
;******************************************************************
3280,29 → 4859,29
; Control-S pauses the listing, control-C stops it.
;******************************************************************
;
FFFFFFFFFFFFD338 LISTX:
FFFFFFFFFFFFD338 31FFF8FF call TSTNUM ; see if there's a line no.
FFFFFFFFFFFFD33C 02128009 mov r5,r1
FFFFFFFFFFFFD340 31FFF7B9 call ENDCHK ; if not, we get a zero
FFFFFFFFFFFFD344 02508009 mov r1,r5
FFFFFFFFFFFFD348 31FFF80C call FNDLN ; find this or next line
FFFFFFFFFFFFD34C LS1:
FFFFFFFFFFFFD34C BE100049 bne r1,r0,LS4
FFFFFFFFFFFFD350 BE905D48 beq r9,r0,WSTART ; warm start if we passed the end
FFFFFFFFFFFFD354 LS4:
FFFFFFFFFFFFD354 02908009 mov r1,r9
FFFFFFFFFFFFD358 31FFF8DF call PRTLN ; print the line
FFFFFFFFFFFFD35C 02148009 mov r9,r1 ; set pointer for next
FFFFFFFFFFFFD360 31FFF936 call CHKIO ; check for listing halt request
FFFFFFFFFFFFD364 BE100088 beq r1,r0,LS3
FFFFFFFFFFFFD368 B2100313 bnei r1,#CTRLS,LS3 ; pause the listing?
FFFFFFFFFFFFD36C LS2:
FFFFFFFFFFFFD36C 31FFF936 call CHKIO ; if so, wait for another keypress
FFFFFFFFFFFFD370 BE107FE8 beq r1,r0,LS2
FFFFFFFFFFFFD374 LS3:
FFFFFFFFFFFFD374 E0400000 setlo r1,#0
FFFFFFFFFFFFD378 31FFF810 call FNDLNP ; find the next line
FFFFFFFFFFFFD37C BE007E8A bra LS1
FFFFFFFFFFFFE440 LISTX:
FFFFFFFFFFFFE440 31FFFD3E call TSTNUM ; see if there's a line no.
FFFFFFFFFFFFE444 02128009 mov r5,r1
FFFFFFFFFFFFE448 31FFFBFB call ENDCHK ; if not, we get a zero
FFFFFFFFFFFFE44C 02508009 mov r1,r5
FFFFFFFFFFFFE450 31FFFC4E call FNDLN ; find this or next line
FFFFFFFFFFFFE454 LS1:
FFFFFFFFFFFFE454 BE100049 bne r1,r0,LS4
FFFFFFFFFFFFE458 BE905D68 beq r9,r0,WSTART ; warm start if we passed the end
FFFFFFFFFFFFE45C LS4:
FFFFFFFFFFFFE45C 02908009 mov r1,r9
FFFFFFFFFFFFE460 31FFFD1E call PRTLN ; print the line
FFFFFFFFFFFFE464 02148009 mov r9,r1 ; set pointer for next
FFFFFFFFFFFFE468 31FFFD77 call CHKIO ; check for listing halt request
FFFFFFFFFFFFE46C BE100088 beq r1,r0,LS3
FFFFFFFFFFFFE470 B2100313 bnei r1,#CTRLS,LS3 ; pause the listing?
FFFFFFFFFFFFE474 LS2:
FFFFFFFFFFFFE474 31FFFD77 call CHKIO ; if so, wait for another keypress
FFFFFFFFFFFFE478 BE107FE8 beq r1,r0,LS2
FFFFFFFFFFFFE47C LS3:
FFFFFFFFFFFFE47C E0400000 setlo r1,#0
FFFFFFFFFFFFE480 31FFFC52 call FNDLNP ; find the next line
FFFFFFFFFFFFE484 BE007E8A bra LS1
;******************************************************************
3325,55 → 4904,55
; however, no <CR LF> is generated.
;******************************************************************
;
FFFFFFFFFFFFD380 PRINT:
FFFFFFFFFFFFD380 1602800B lw r5,#11 ; D4 = number of print spaces
FFFFFFFFFFFFD384 E0C0003A setlo r3,#':'
FFFFFFFFFFFFD388 9A025398 lea r4,PR2
FFFFFFFFFFFFD38C 31FFF8F1 call TSTC ; if null list and ":"
FFFFFFFFFFFFD390 31FFEFFA call CRLF ; give CR-LF and continue
FFFFFFFFFFFFD394 BE007A0A bra RUNSML ; execution on the same line
FFFFFFFFFFFFD398 PR2:
FFFFFFFFFFFFD398 E0C0000D setlo r3,#CR
FFFFFFFFFFFFD39C 9A0253AC lea r4,PR0
FFFFFFFFFFFFD3A0 31FFF8F1 call TSTC ;if null list and <CR>
FFFFFFFFFFFFD3A4 31FFEFFA call CRLF ;also give CR-LF and
FFFFFFFFFFFFD3A8 BE00782A bra RUNNXL ;execute the next line
FFFFFFFFFFFFD3AC PR0:
FFFFFFFFFFFFD3AC E0C00023 setlo r3,#'#'
FFFFFFFFFFFFD3B0 9A0253C4 lea r4,PR1
FFFFFFFFFFFFD3B4 31FFF8F1 call TSTC ;else is it a format?
FFFFFFFFFFFFD3B8 31FFF63A call OREXPR ; yes, evaluate expression
FFFFFFFFFFFFD3BC 04101409 lw r5,r1 ; and save it as print width
FFFFFFFFFFFFD3C0 BE00012A bra PR3 ; look for more to print
FFFFFFFFFFFFD3C4 PR1:
FFFFFFFFFFFFD3C4 E0C00024 setlo r3,#'$'
FFFFFFFFFFFFD3C8 9A0253DC lea r4,PR4
FFFFFFFFFFFFD3CC 31FFF8F1 call TSTC ; is character expression? (MRL)
FFFFFFFFFFFFD3D0 31FFF63A call OREXPR ; yep. Evaluate expression (MRL)
FFFFFFFFFFFFD3D4 31FFF393 call GOOUT ; print low byte (MRL)
FFFFFFFFFFFFD3D8 BE00006A bra PR3 ;look for more. (MRL)
FFFFFFFFFFFFD3DC PR4:
FFFFFFFFFFFFD3DC 31FFF867 call QTSTG ; is it a string?
FFFFFFFFFFFFE488 PRINT:
FFFFFFFFFFFFE488 1602800B lw r5,#11 ; D4 = number of print spaces
FFFFFFFFFFFFE48C E0C0003A setlo r3,#':'
FFFFFFFFFFFFE490 9A0264A0 lea r4,PR2
FFFFFFFFFFFFE494 31FFFD30 call TSTC ; if null list and ":"
FFFFFFFFFFFFE498 31FFF135 call CRLF ; give CR-LF and continue
FFFFFFFFFFFFE49C BE007A0A bra RUNSML ; execution on the same line
FFFFFFFFFFFFE4A0 PR2:
FFFFFFFFFFFFE4A0 E0C0000D setlo r3,#CR
FFFFFFFFFFFFE4A4 9A0264B4 lea r4,PR0
FFFFFFFFFFFFE4A8 31FFFD30 call TSTC ;if null list and <CR>
FFFFFFFFFFFFE4AC 31FFF135 call CRLF ;also give CR-LF and
FFFFFFFFFFFFE4B0 BE00782A bra RUNNXL ;execute the next line
FFFFFFFFFFFFE4B4 PR0:
FFFFFFFFFFFFE4B4 E0C00023 setlo r3,#'#'
FFFFFFFFFFFFE4B8 9A0264CC lea r4,PR1
FFFFFFFFFFFFE4BC 31FFFD30 call TSTC ;else is it a format?
FFFFFFFFFFFFE4C0 31FFFA7C call OREXPR ; yes, evaluate expression
FFFFFFFFFFFFE4C4 04101409 lw r5,r1 ; and save it as print width
FFFFFFFFFFFFE4C8 BE00012A bra PR3 ; look for more to print
FFFFFFFFFFFFE4CC PR1:
FFFFFFFFFFFFE4CC E0C00024 setlo r3,#'$'
FFFFFFFFFFFFE4D0 9A0264E4 lea r4,PR4
FFFFFFFFFFFFE4D4 31FFFD30 call TSTC ; is character expression? (MRL)
FFFFFFFFFFFFE4D8 31FFFA7C call OREXPR ; yep. Evaluate expression (MRL)
FFFFFFFFFFFFE4DC 31FFF7D5 call GOOUT ; print low byte (MRL)
FFFFFFFFFFFFE4E0 BE00006A bra PR3 ;look for more. (MRL)
FFFFFFFFFFFFE4E4 PR4:
FFFFFFFFFFFFE4E4 31FFFCA9 call QTSTG ; is it a string?
; the following branch must occupy only two bytes!
FFFFFFFFFFFFD3E0 BE00010A bra PR8 ; if not, must be an expression
FFFFFFFFFFFFD3E4 PR3:
FFFFFFFFFFFFD3E4 E0C0002C setlo r3,#','
FFFFFFFFFFFFD3E8 9A0253F8 lea r4,PR6
FFFFFFFFFFFFD3EC 31FFF8F1 call TSTC ; if ",", go find next
FFFFFFFFFFFFD3F0 31FFF7AA call FIN ;in the list.
FFFFFFFFFFFFD3F4 BE007DCA bra PR0
FFFFFFFFFFFFD3F8 PR6:
FFFFFFFFFFFFD3F8 31FFEFFA call CRLF ;list ends here
FFFFFFFFFFFFD3FC BE0000AA bra FINISH
FFFFFFFFFFFFD400 PR8:
FFFFFFFFFFFFD400 31FFF63A call OREXPR ; evaluate the expression
FFFFFFFFFFFFD404 04500809 lw r2,r5 ; set the width
FFFFFFFFFFFFD408 31FFF88D call PRTNUM ; print its value
FFFFFFFFFFFFD40C BE007ECA bra PR3 ; more to print?
FFFFFFFFFFFFE4E8 BE00010A bra PR8 ; if not, must be an expression
FFFFFFFFFFFFE4EC PR3:
FFFFFFFFFFFFE4EC E0C0002C setlo r3,#','
FFFFFFFFFFFFE4F0 9A026500 lea r4,PR6
FFFFFFFFFFFFE4F4 31FFFD30 call TSTC ; if ",", go find next
FFFFFFFFFFFFE4F8 31FFFBEC call FIN ;in the list.
FFFFFFFFFFFFE4FC BE007DCA bra PR0
FFFFFFFFFFFFE500 PR6:
FFFFFFFFFFFFE500 31FFF135 call CRLF ;list ends here
FFFFFFFFFFFFE504 BE0000AA bra FINISH
FFFFFFFFFFFFE508 PR8:
FFFFFFFFFFFFE508 31FFFA7C call OREXPR ; evaluate the expression
FFFFFFFFFFFFE50C 04500809 lw r2,r5 ; set the width
FFFFFFFFFFFFE510 31FFFCCC call PRTNUM ; print its value
FFFFFFFFFFFFE514 BE007ECA bra PR3 ; more to print?
FFFFFFFFFFFFD410 FINISH:
FFFFFFFFFFFFD410 31FFF7AA call FIN ; Check end of command
FFFFFFFFFFFFD414 33FFF7C7 jmp QWHAT ; print "What?" if wrong
FFFFFFFFFFFFE518 FINISH:
FFFFFFFFFFFFE518 31FFFBEC call FIN ; Check end of command
FFFFFFFFFFFFE51C 33FFFC09 jmp QWHAT ; print "What?" if wrong
;*******************************************************************
3391,23 → 4970,23
; save it as a flag for no further 'RETURN's.
;******************************************************************
;
FFFFFFFFFFFFD418 GOSUB:
FFFFFFFFFFFFD418 31FFF83E call PUSHA ; save the current 'FOR' parameters
FFFFFFFFFFFFD41C 31FFF63A call OREXPR ; get line number
FFFFFFFFFFFFD420 31FFF80C call FNDLN ; find the target line
FFFFFFFFFFFFD424 BE100069 bne r1,r0,gosub1
FFFFFFFFFFFFD428 9A00E73B lea r1,msgBadGotoGosub
FFFFFFFFFFFFD42C BE0057AA bra ERROR ; if not there, say "How?"
FFFFFFFFFFFFD430 gosub1:
FFFFFFFFFFFFD430 0DEF0018 sub sp,sp,#24
FFFFFFFFFFFFD434 67E40000 sw r8,[sp] ; save text pointer
FFFFFFFFFFFFD438 46009090 lw r1,CURRNT
FFFFFFFFFFFFD43C 67E08008 sw r1,8[sp] ; found it, save old 'CURRNT'...
FFFFFFFFFFFFD440 46009098 lw r1,STKGOS
FFFFFFFFFFFFD444 67E08010 sw r1,16[sp] ; and 'STKGOS'
FFFFFFFFFFFFD448 660010A8 sw r0,LOPVAR ; load new values
FFFFFFFFFFFFD44C 660F1098 sw sp,STKGOS
FFFFFFFFFFFFD450 BE0073EA bra RUNTSL
FFFFFFFFFFFFE520 GOSUB:
FFFFFFFFFFFFE520 31FFFC80 call PUSHA ; save the current 'FOR' parameters
FFFFFFFFFFFFE524 31FFFA7C call OREXPR ; get line number
FFFFFFFFFFFFE528 31FFFC4E call FNDLN ; find the target line
FFFFFFFFFFFFE52C BE100069 bne r1,r0,gosub1
FFFFFFFFFFFFE530 9A00F833 lea r1,msgBadGotoGosub
FFFFFFFFFFFFE534 BE0057AA bra ERROR ; if not there, say "How?"
FFFFFFFFFFFFE538 gosub1:
FFFFFFFFFFFFE538 0DEF0018 sub sp,sp,#24
FFFFFFFFFFFFE53C 67E40000 sw r8,[sp] ; save text pointer
FFFFFFFFFFFFE540 46009090 lw r1,CURRNT
FFFFFFFFFFFFE544 67E08008 sw r1,8[sp] ; found it, save old 'CURRNT'...
FFFFFFFFFFFFE548 46009098 lw r1,STKGOS
FFFFFFFFFFFFE54C 67E08010 sw r1,16[sp] ; and 'STKGOS'
FFFFFFFFFFFFE550 660010A8 sw r0,LOPVAR ; load new values
FFFFFFFFFFFFE554 660F1098 sw sp,STKGOS
FFFFFFFFFFFFE558 BE0073EA bra RUNTSL
;******************************************************************
3417,22 → 4996,22
; a 'GOSUB' and is thus an error.
;******************************************************************
;
FFFFFFFFFFFFD454 RETURN:
FFFFFFFFFFFFD454 31FFF7B9 call ENDCHK ; there should be just a <CR>
FFFFFFFFFFFFD458 46009098 lw r1,STKGOS ; get old stack pointer
FFFFFFFFFFFFD45C BE100069 bne r1,r0,return1
FFFFFFFFFFFFD460 9A00E758 lea r1,msgRetWoGosub
FFFFFFFFFFFFD464 BE0055EA bra ERROR ; if zero, it doesn't exist
FFFFFFFFFFFFD468 return1:
FFFFFFFFFFFFD468 021F0009 mov sp,r1 ; else restore it
FFFFFFFFFFFFD46C 47E08010 lw r1,16[sp]
FFFFFFFFFFFFD470 66009098 sw r1,STKGOS ; and the old 'STKGOS'
FFFFFFFFFFFFD474 47E08008 lw r1,8[sp]
FFFFFFFFFFFFD478 66009090 sw r1,CURRNT ; and the old 'CURRNT'
FFFFFFFFFFFFD47C 47E40000 lw r8,[sp] ; and the old text pointer
FFFFFFFFFFFFD480 09EF0018 add sp,sp,#24
FFFFFFFFFFFFD484 31FFF831 call POPA ;and the old 'FOR' parameters
FFFFFFFFFFFFD488 BE007C4A bra FINISH ;and we are back home
FFFFFFFFFFFFE55C RETURN:
FFFFFFFFFFFFE55C 31FFFBFB call ENDCHK ; there should be just a <CR>
FFFFFFFFFFFFE560 46009098 lw r1,STKGOS ; get old stack pointer
FFFFFFFFFFFFE564 BE100069 bne r1,r0,return1
FFFFFFFFFFFFE568 9A00F850 lea r1,msgRetWoGosub
FFFFFFFFFFFFE56C BE0055EA bra ERROR ; if zero, it doesn't exist
FFFFFFFFFFFFE570 return1:
FFFFFFFFFFFFE570 021F0009 mov sp,r1 ; else restore it
FFFFFFFFFFFFE574 47E08010 lw r1,16[sp]
FFFFFFFFFFFFE578 66009098 sw r1,STKGOS ; and the old 'STKGOS'
FFFFFFFFFFFFE57C 47E08008 lw r1,8[sp]
FFFFFFFFFFFFE580 66009090 sw r1,CURRNT ; and the old 'CURRNT'
FFFFFFFFFFFFE584 47E40000 lw r8,[sp] ; and the old text pointer
FFFFFFFFFFFFE588 09EF0018 add sp,sp,#24
FFFFFFFFFFFFE58C 31FFFC73 call POPA ;and the old 'FOR' parameters
FFFFFFFFFFFFE590 BE007C4A bra FINISH ;and we are back home
;******************************************************************
; *** FOR *** & NEXT ***
3453,47 → 5032,47
; 'FOR' loop is deactivated. (i.e. purged from the stack)
;******************************************************************
;
FFFFFFFFFFFFD48C FOR:
FFFFFFFFFFFFD48C 31FFF83E call PUSHA ; save the old 'FOR' save area
FFFFFFFFFFFFD490 31FFF798 call SETVAL ; set the control variable
FFFFFFFFFFFFD494 660090A8 sw r1,LOPVAR ; save its address
FFFFFFFFFFFFD498 9A04D063 lea r9,TAB5
FFFFFFFFFFFFD49C 9A055198 lea r10,TAB5_1; use 'EXEC' to test for 'TO'
FFFFFFFFFFFFD4A0 33FFF486 jmp EXEC
FFFFFFFFFFFFD4A4 FR1:
FFFFFFFFFFFFD4A4 31FFF63A call OREXPR ; evaluate the limit
FFFFFFFFFFFFD4A8 660090B8 sw r1,LOPLMT ; save that
FFFFFFFFFFFFD4AC 9A04D066 lea r9,TAB6
FFFFFFFFFFFFD4B0 9A0551A8 lea r10,TAB6_1 ; use 'EXEC' to test for the word 'STEP
FFFFFFFFFFFFD4B4 33FFF486 jmp EXEC
FFFFFFFFFFFFD4B8 FR2:
FFFFFFFFFFFFD4B8 31FFF63A call OREXPR ; found it, get the step value
FFFFFFFFFFFFD4BC BE00004A bra FR4
FFFFFFFFFFFFD4C0 FR3:
FFFFFFFFFFFFD4C0 E0400001 setlo r1,#1 ; not found, step defaults to 1
FFFFFFFFFFFFD4C4 FR4:
FFFFFFFFFFFFD4C4 660090B0 sw r1,LOPINC ; save that too
FFFFFFFFFFFFD4C8 FR5:
FFFFFFFFFFFFD4C8 46011090 lw r2,CURRNT
FFFFFFFFFFFFD4CC 660110C0 sw r2,LOPLN ; save address of current line number
FFFFFFFFFFFFD4D0 660410C8 sw r8,LOPPT ; and text pointer
FFFFFFFFFFFFD4D4 05E00C09 lw r3,sp ; dig into the stack to find 'LOPVAR'
FFFFFFFFFFFFD4D8 460310A8 lw r6,LOPVAR
FFFFFFFFFFFFD4DC BE00004A bra FR7
FFFFFFFFFFFFD4E0 FR6:
FFFFFFFFFFFFD4E0 0A318028 addui r3,r3,#40 ; look at next stack frame
FFFFFFFFFFFFD4E4 FR7:
FFFFFFFFFFFFD4E4 46310000 lw r2,[r3] ; is it zero?
FFFFFFFFFFFFD4E8 BE2000E8 beq r2,r0,FR8 ; if so, we're done
FFFFFFFFFFFFD4EC BE237FA9 bne r2,r6,FR6 ; same as current LOPVAR? nope, look some more
FFFFFFFFFFFFE594 FOR:
FFFFFFFFFFFFE594 31FFFC80 call PUSHA ; save the old 'FOR' save area
FFFFFFFFFFFFE598 31FFFBDA call SETVAL ; set the control variable
FFFFFFFFFFFFE59C 660090A8 sw r1,LOPVAR ; save its address
FFFFFFFFFFFFE5A0 9A04E16F lea r9,TAB5
FFFFFFFFFFFFE5A4 9A0562A0 lea r10,TAB5_1; use 'EXEC' to test for 'TO'
FFFFFFFFFFFFE5A8 33FFF8C8 jmp EXEC
FFFFFFFFFFFFE5AC FR1:
FFFFFFFFFFFFE5AC 31FFFA7C call OREXPR ; evaluate the limit
FFFFFFFFFFFFE5B0 660090B8 sw r1,LOPLMT ; save that
FFFFFFFFFFFFE5B4 9A04E172 lea r9,TAB6
FFFFFFFFFFFFE5B8 9A0562B0 lea r10,TAB6_1 ; use 'EXEC' to test for the word 'STEP
FFFFFFFFFFFFE5BC 33FFF8C8 jmp EXEC
FFFFFFFFFFFFE5C0 FR2:
FFFFFFFFFFFFE5C0 31FFFA7C call OREXPR ; found it, get the step value
FFFFFFFFFFFFE5C4 BE00004A bra FR4
FFFFFFFFFFFFE5C8 FR3:
FFFFFFFFFFFFE5C8 E0400001 setlo r1,#1 ; not found, step defaults to 1
FFFFFFFFFFFFE5CC FR4:
FFFFFFFFFFFFE5CC 660090B0 sw r1,LOPINC ; save that too
FFFFFFFFFFFFE5D0 FR5:
FFFFFFFFFFFFE5D0 46011090 lw r2,CURRNT
FFFFFFFFFFFFE5D4 660110C0 sw r2,LOPLN ; save address of current line number
FFFFFFFFFFFFE5D8 660410C8 sw r8,LOPPT ; and text pointer
FFFFFFFFFFFFE5DC 05E00C09 lw r3,sp ; dig into the stack to find 'LOPVAR'
FFFFFFFFFFFFE5E0 460310A8 lw r6,LOPVAR
FFFFFFFFFFFFE5E4 BE00004A bra FR7
FFFFFFFFFFFFE5E8 FR6:
FFFFFFFFFFFFE5E8 0A318028 addui r3,r3,#40 ; look at next stack frame
FFFFFFFFFFFFE5EC FR7:
FFFFFFFFFFFFE5EC 46310000 lw r2,[r3] ; is it zero?
FFFFFFFFFFFFE5F0 BE2000E8 beq r2,r0,FR8 ; if so, we're done
FFFFFFFFFFFFE5F4 BE237FA9 bne r2,r6,FR6 ; same as current LOPVAR? nope, look some more
FFFFFFFFFFFFD4F0 04300409 lw r1,r3 ; Else remove 5 long words from...
FFFFFFFFFFFFD4F4 0A310028 addui r2,r3,#40 ; inside the stack.
FFFFFFFFFFFFD4F8 05E00C09 lw r3,sp
FFFFFFFFFFFFD4FC 31FFF82F call MVDOWN
FFFFFFFFFFFFD500 09EF0028 add sp,sp,#40 ; set the SP 5 long words up
FFFFFFFFFFFFD504 FR8:
FFFFFFFFFFFFD504 BE00786A bra FINISH ; and continue execution
FFFFFFFFFFFFE5F8 04300409 lw r1,r3 ; Else remove 5 long words from...
FFFFFFFFFFFFE5FC 0A310028 addui r2,r3,#40 ; inside the stack.
FFFFFFFFFFFFE600 05E00C09 lw r3,sp
FFFFFFFFFFFFE604 31FFFC71 call MVDOWN
FFFFFFFFFFFFE608 09EF0028 add sp,sp,#40 ; set the SP 5 long words up
FFFFFFFFFFFFE60C FR8:
FFFFFFFFFFFFE60C BE00786A bra FINISH ; and continue execution
;******************************************************************
3508,43 → 5087,43
; execution continues.
;******************************************************************
;
FFFFFFFFFFFFD508 NEXT:
FFFFFFFFFFFFD508 E0400000 setlo r1,#0 ; don't allocate it
FFFFFFFFFFFFD50C 31FFF6EC call TSTV ; get address of variable
FFFFFFFFFFFFD510 BE100069 bne r1,r0,NX4
FFFFFFFFFFFFD514 9A00E717 lea r1,msgNextVar
FFFFFFFFFFFFD518 BE00504A bra ERROR ; if no variable, say "What?"
FFFFFFFFFFFFD51C NX4:
FFFFFFFFFFFFD51C 02148009 mov r9,r1 ; save variable's address
FFFFFFFFFFFFD520 NX0:
FFFFFFFFFFFFD520 460090A8 lw r1,LOPVAR ; If 'LOPVAR' is zero, we never...
FFFFFFFFFFFFD524 BE100069 bne r1,r0,NX5 ; had a FOR loop
FFFFFFFFFFFFD528 9A00E704 lea r1,msgNextFor
FFFFFFFFFFFFD52C BE004FAA bra ERROR
FFFFFFFFFFFFD530 NX5:
FFFFFFFFFFFFD530 BE148068 beq r1,r9,NX2 ; else we check them OK, they agree
FFFFFFFFFFFFD534 31FFF831 call POPA ; nope, let's see the next frame
FFFFFFFFFFFFD538 BE007F4A bra NX0
FFFFFFFFFFFFD53C NX2:
FFFFFFFFFFFFD53C 46908000 lw r1,[r9] ; get control variable's value
FFFFFFFFFFFFD540 460110B0 lw r2,LOPINC
FFFFFFFFFFFFD544 04110403 addu r1,r1,r2 ; add in loop increment
FFFFFFFFFFFFE610 NEXT:
FFFFFFFFFFFFE610 E0400000 setlo r1,#0 ; don't allocate it
FFFFFFFFFFFFE614 31FFFB2E call TSTV ; get address of variable
FFFFFFFFFFFFE618 BE100069 bne r1,r0,NX4
FFFFFFFFFFFFE61C 9A00F80F lea r1,msgNextVar
FFFFFFFFFFFFE620 BE00504A bra ERROR ; if no variable, say "What?"
FFFFFFFFFFFFE624 NX4:
FFFFFFFFFFFFE624 02148009 mov r9,r1 ; save variable's address
FFFFFFFFFFFFE628 NX0:
FFFFFFFFFFFFE628 460090A8 lw r1,LOPVAR ; If 'LOPVAR' is zero, we never...
FFFFFFFFFFFFE62C BE100069 bne r1,r0,NX5 ; had a FOR loop
FFFFFFFFFFFFE630 9A00F7FC lea r1,msgNextFor
FFFFFFFFFFFFE634 BE004FAA bra ERROR
FFFFFFFFFFFFE638 NX5:
FFFFFFFFFFFFE638 BE148068 beq r1,r9,NX2 ; else we check them OK, they agree
FFFFFFFFFFFFE63C 31FFFC73 call POPA ; nope, let's see the next frame
FFFFFFFFFFFFE640 BE007F4A bra NX0
FFFFFFFFFFFFE644 NX2:
FFFFFFFFFFFFE644 46908000 lw r1,[r9] ; get control variable's value
FFFFFFFFFFFFE648 460110B0 lw r2,LOPINC
FFFFFFFFFFFFE64C 04110403 addu r1,r1,r2 ; add in loop increment
; BVS.L QHOW say "How?" for 32-bit overflow
FFFFFFFFFFFFD548 66908000 sw r1,[r9] ; save control variable's new value
FFFFFFFFFFFFD54C 460190B8 lw r3,LOPLMT ; get loop's limit value
FFFFFFFFFFFFD550 BE200063 bgt r2,r0,NX1 ; check loop increment, branch if loop increment is positive
FFFFFFFFFFFFD554 BE1180E0 blt r1,r3,NXPurge ; test against limit
FFFFFFFFFFFFD558 BE00004A bra NX3
FFFFFFFFFFFFD55C NX1:
FFFFFFFFFFFFD55C BE1180A3 bgt r1,r3,NXPurge
FFFFFFFFFFFFD560 NX3:
FFFFFFFFFFFFD560 460410C0 lw r8,LOPLN ; Within limit, go back to the...
FFFFFFFFFFFFD564 66041090 sw r8,CURRNT
FFFFFFFFFFFFD568 460410C8 lw r8,LOPPT ; saved 'CURRNT' and text pointer.
FFFFFFFFFFFFD56C BE00752A bra FINISH
FFFFFFFFFFFFD570 NXPurge:
FFFFFFFFFFFFD570 31FFF831 call POPA ; purge this loop
FFFFFFFFFFFFD574 BE0074EA bra FINISH
FFFFFFFFFFFFE650 66908000 sw r1,[r9] ; save control variable's new value
FFFFFFFFFFFFE654 460190B8 lw r3,LOPLMT ; get loop's limit value
FFFFFFFFFFFFE658 BE200063 bgt r2,r0,NX1 ; check loop increment, branch if loop increment is positive
FFFFFFFFFFFFE65C BE1180E0 blt r1,r3,NXPurge ; test against limit
FFFFFFFFFFFFE660 BE00004A bra NX3
FFFFFFFFFFFFE664 NX1:
FFFFFFFFFFFFE664 BE1180A3 bgt r1,r3,NXPurge
FFFFFFFFFFFFE668 NX3:
FFFFFFFFFFFFE668 460410C0 lw r8,LOPLN ; Within limit, go back to the...
FFFFFFFFFFFFE66C 66041090 sw r8,CURRNT
FFFFFFFFFFFFE670 460410C8 lw r8,LOPPT ; saved 'CURRNT' and text pointer.
FFFFFFFFFFFFE674 BE00752A bra FINISH
FFFFFFFFFFFFE678 NXPurge:
FFFFFFFFFFFFE678 31FFFC73 call POPA ; purge this loop
FFFFFFFFFFFFE67C BE0074EA bra FINISH
;******************************************************************
3563,27 → 5142,27
; continues on the next line.
;******************************************************************
;
FFFFFFFFFFFFD578 IF:
FFFFFFFFFFFFD578 31FFF63A call OREXPR ; evaluate the expression
FFFFFFFFFFFFD57C IF1:
FFFFFFFFFFFFD57C BE106AC9 bne r1,r0,RUNSML ; is it zero? if not, continue
FFFFFFFFFFFFD580 IF2:
FFFFFFFFFFFFD580 02848009 mov r9,r8 ; set lookup pointer
FFFFFFFFFFFFD584 E0400000 setlo r1,#0 ; find line #0 (impossible)
FFFFFFFFFFFFD588 31FFF821 call FNDSKP ; if so, skip the rest of the line
FFFFFFFFFFFFD58C BE104B63 bgt r1,r0,WSTART ; if no next line, do a warm start
FFFFFFFFFFFFD590 IF3:
FFFFFFFFFFFFD590 BE0069EA bra RUNTSL ; run the next line
FFFFFFFFFFFFE680 IF:
FFFFFFFFFFFFE680 31FFFA7C call OREXPR ; evaluate the expression
FFFFFFFFFFFFE684 IF1:
FFFFFFFFFFFFE684 BE106AC9 bne r1,r0,RUNSML ; is it zero? if not, continue
FFFFFFFFFFFFE688 IF2:
FFFFFFFFFFFFE688 02848009 mov r9,r8 ; set lookup pointer
FFFFFFFFFFFFE68C E0400000 setlo r1,#0 ; find line #0 (impossible)
FFFFFFFFFFFFE690 31FFFC63 call FNDSKP ; if so, skip the rest of the line
FFFFFFFFFFFFE694 BE104B83 bgt r1,r0,WSTART ; if no next line, do a warm start
FFFFFFFFFFFFE698 IF3:
FFFFFFFFFFFFE698 BE0069EA bra RUNTSL ; run the next line
;******************************************************************
; INPUT is called first and establishes a stack frame
FFFFFFFFFFFFD594 INPERR:
FFFFFFFFFFFFD594 460F10A0 lw sp,STKINP ; restore the old stack pointer
FFFFFFFFFFFFD598 47E40010 lw r8,16[sp]
FFFFFFFFFFFFD59C 66041090 sw r8,CURRNT ; and old 'CURRNT'
FFFFFFFFFFFFD5A0 47E40008 lw r8,8[sp] ; and old text pointer
FFFFFFFFFFFFD5A4 0BEF0028 addui sp,sp,#40 ; fall through will subtract 40
FFFFFFFFFFFFE69C INPERR:
FFFFFFFFFFFFE69C 460F10A0 lw sp,STKINP ; restore the old stack pointer
FFFFFFFFFFFFE6A0 47E40010 lw r8,16[sp]
FFFFFFFFFFFFE6A4 66041090 sw r8,CURRNT ; and old 'CURRNT'
FFFFFFFFFFFFE6A8 47E40008 lw r8,8[sp] ; and old text pointer
FFFFFFFFFFFFE6AC 0BEF0028 addui sp,sp,#40 ; fall through will subtract 40
; 'INPUT' is like the 'PRINT' command, and is followed by a list
; of items. If the item is a string in single or double quotes,
3600,63 → 5179,63
; the prompt and redo the input. The execution will not terminate
; unless you press control-C. This is handled in 'INPERR'.
;
FFFFFFFFFFFFD5A8 INPUT:
FFFFFFFFFFFFD5A8 0FEF0028 subui sp,sp,#40 ; allocate stack frame
FFFFFFFFFFFFD5AC 67E28020 sw r5,32[sp]
FFFFFFFFFFFFD5B0 IP6:
FFFFFFFFFFFFD5B0 67E40000 sw r8,[sp] ; save in case of error
FFFFFFFFFFFFD5B4 31FFF867 call QTSTG ; is next item a string?
FFFFFFFFFFFFD5B8 BE0000CA bra IP2 ; nope - this branch must take only two bytes
FFFFFFFFFFFFD5BC E0400001 setlo r1,#1 ; allocate var
FFFFFFFFFFFFD5C0 31FFF6EC call TSTV ; yes, but is it followed by a variable?
FFFFFFFFFFFFD5C4 BE1003E8 beq r1,r0,IP4 ; if not, brnch
FFFFFFFFFFFFD5C8 02150009 mov r10,r1 ; put away the variable's address
FFFFFFFFFFFFD5CC BE0001AA bra IP3 ; if so, input to variable
FFFFFFFFFFFFD5D0 IP2:
FFFFFFFFFFFFD5D0 67E40008 sw r8,8[sp] ; save for 'PRTSTG'
FFFFFFFFFFFFD5D4 E0400001 setlo r1,#1
FFFFFFFFFFFFD5D8 31FFF6EC call TSTV ; must be a variable now
FFFFFFFFFFFFD5DC BE100069 bne r1,r0,IP7
FFFFFFFFFFFFD5E0 9A00E6E7 lea r1,msgInputVar
FFFFFFFFFFFFD5E4 BE0049EA bra ERROR ; "What?" it isn't?
FFFFFFFFFFFFD5E8 IP7:
FFFFFFFFFFFFD5E8 02150009 mov r10,r1 ; put away the variable's address
FFFFFFFFFFFFD5EC 40828000 lb r5,[r8] ; get ready for 'PRTSTG' by null terminating
FFFFFFFFFFFFD5F0 60800000 sb r0,[r8]
FFFFFFFFFFFFD5F4 47E08008 lw r1,8[sp] ; get back text pointer
FFFFFFFFFFFFD5F8 31FFF851 call PRTSTG ; print string as prompt
FFFFFFFFFFFFD5FC 60828000 sb r5,[r8] ; un-null terminate
FFFFFFFFFFFFD600 IP3
FFFFFFFFFFFFD600 67E40008 sw r8,8[sp] ; save in case of error
FFFFFFFFFFFFD604 46009090 lw r1,CURRNT
FFFFFFFFFFFFD608 67E08010 sw r1,16[sp] ; also save 'CURRNT'
FFFFFFFFFFFFD60C E07FFFFF setlo r1,#-1
FFFFFFFFFFFFD610 66009090 sw r1,CURRNT ; flag that we are in INPUT
FFFFFFFFFFFFD614 660F10A0 sw sp,STKINP ; save the stack pointer too
FFFFFFFFFFFFD618 67E50018 sw r10,24[sp] ; save the variable address
FFFFFFFFFFFFD61C E040003A setlo r1,#':' ; print a colon first
FFFFFFFFFFFFD620 31FFF7D8 call GETLN ; then get an input line
FFFFFFFFFFFFD624 9A04111B lea r8,BUFFER ; point to the buffer
FFFFFFFFFFFFD628 31FFF63A call OREXPR ; evaluate the input
FFFFFFFFFFFFD62C 47E50018 lw r10,24[sp] ; restore the variable address
FFFFFFFFFFFFD630 66A08000 sw r1,[r10] ; save value in variable
FFFFFFFFFFFFD634 47E08010 lw r1,16[sp] ; restore old 'CURRNT'
FFFFFFFFFFFFD638 66009090 sw r1,CURRNT
FFFFFFFFFFFFD63C 47E40008 lw r8,8[sp] ; and the old text pointer
FFFFFFFFFFFFD640 IP4:
FFFFFFFFFFFFD640 E0C0002C setlo r3,#','
FFFFFFFFFFFFD644 9A025650 lea r4,IP5 ; is the next thing a comma?
FFFFFFFFFFFFD648 31FFF8F1 call TSTC
FFFFFFFFFFFFD64C BE007B2A bra IP6 ; yes, more items
FFFFFFFFFFFFD650 IP5:
FFFFFFFFFFFFD650 47E28020 lw r5,32[sp]
FFFFFFFFFFFFD654 09EF0028 add sp,sp,#40 ; clean up the stack
FFFFFFFFFFFFD658 33FFF504 jmp FINISH
FFFFFFFFFFFFE6B0 INPUT:
FFFFFFFFFFFFE6B0 0FEF0028 subui sp,sp,#40 ; allocate stack frame
FFFFFFFFFFFFE6B4 67E28020 sw r5,32[sp]
FFFFFFFFFFFFE6B8 IP6:
FFFFFFFFFFFFE6B8 67E40000 sw r8,[sp] ; save in case of error
FFFFFFFFFFFFE6BC 31FFFCA9 call QTSTG ; is next item a string?
FFFFFFFFFFFFE6C0 BE0000CA bra IP2 ; nope - this branch must take only two bytes
FFFFFFFFFFFFE6C4 E0400001 setlo r1,#1 ; allocate var
FFFFFFFFFFFFE6C8 31FFFB2E call TSTV ; yes, but is it followed by a variable?
FFFFFFFFFFFFE6CC BE1003E8 beq r1,r0,IP4 ; if not, brnch
FFFFFFFFFFFFE6D0 02150009 mov r10,r1 ; put away the variable's address
FFFFFFFFFFFFE6D4 BE0001AA bra IP3 ; if so, input to variable
FFFFFFFFFFFFE6D8 IP2:
FFFFFFFFFFFFE6D8 67E40008 sw r8,8[sp] ; save for 'PRTSTG'
FFFFFFFFFFFFE6DC E0400001 setlo r1,#1
FFFFFFFFFFFFE6E0 31FFFB2E call TSTV ; must be a variable now
FFFFFFFFFFFFE6E4 BE100069 bne r1,r0,IP7
FFFFFFFFFFFFE6E8 9A00F7DF lea r1,msgInputVar
FFFFFFFFFFFFE6EC BE0049EA bra ERROR ; "What?" it isn't?
FFFFFFFFFFFFE6F0 IP7:
FFFFFFFFFFFFE6F0 02150009 mov r10,r1 ; put away the variable's address
FFFFFFFFFFFFE6F4 40828000 lb r5,[r8] ; get ready for 'PRTSTG' by null terminating
FFFFFFFFFFFFE6F8 60800000 sb r0,[r8]
FFFFFFFFFFFFE6FC 47E08008 lw r1,8[sp] ; get back text pointer
FFFFFFFFFFFFE700 31FFFC93 call PRTSTG ; print string as prompt
FFFFFFFFFFFFE704 60828000 sb r5,[r8] ; un-null terminate
FFFFFFFFFFFFE708 IP3
FFFFFFFFFFFFE708 67E40008 sw r8,8[sp] ; save in case of error
FFFFFFFFFFFFE70C 46009090 lw r1,CURRNT
FFFFFFFFFFFFE710 67E08010 sw r1,16[sp] ; also save 'CURRNT'
FFFFFFFFFFFFE714 E07FFFFF setlo r1,#-1
FFFFFFFFFFFFE718 66009090 sw r1,CURRNT ; flag that we are in INPUT
FFFFFFFFFFFFE71C 660F10A0 sw sp,STKINP ; save the stack pointer too
FFFFFFFFFFFFE720 67E50018 sw r10,24[sp] ; save the variable address
FFFFFFFFFFFFE724 E040003A setlo r1,#':' ; print a colon first
FFFFFFFFFFFFE728 31FFFC1A call GETLN ; then get an input line
FFFFFFFFFFFFE72C 9A04111B lea r8,BUFFER ; point to the buffer
FFFFFFFFFFFFE730 31FFFA7C call OREXPR ; evaluate the input
FFFFFFFFFFFFE734 47E50018 lw r10,24[sp] ; restore the variable address
FFFFFFFFFFFFE738 66A08000 sw r1,[r10] ; save value in variable
FFFFFFFFFFFFE73C 47E08010 lw r1,16[sp] ; restore old 'CURRNT'
FFFFFFFFFFFFE740 66009090 sw r1,CURRNT
FFFFFFFFFFFFE744 47E40008 lw r8,8[sp] ; and the old text pointer
FFFFFFFFFFFFE748 IP4:
FFFFFFFFFFFFE748 E0C0002C setlo r3,#','
FFFFFFFFFFFFE74C 9A026758 lea r4,IP5 ; is the next thing a comma?
FFFFFFFFFFFFE750 31FFFD30 call TSTC
FFFFFFFFFFFFE754 BE007B2A bra IP6 ; yes, more items
FFFFFFFFFFFFE758 IP5:
FFFFFFFFFFFFE758 47E28020 lw r5,32[sp]
FFFFFFFFFFFFE75C 09EF0028 add sp,sp,#40 ; clean up the stack
FFFFFFFFFFFFE760 33FFF946 jmp FINISH
FFFFFFFFFFFFD65C DEFLT:
FFFFFFFFFFFFD65C 40808000 lb r1,[r8]
FFFFFFFFFFFFD660 B01F6C0D beq r1,#CR,FINISH ; empty line is OK else it is 'LET'
FFFFFFFFFFFFE764 DEFLT:
FFFFFFFFFFFFE764 40808000 lb r1,[r8]
FFFFFFFFFFFFE768 B01F6C0D beq r1,#CR,FINISH ; empty line is OK else it is 'LET'
;******************************************************************
3667,14 → 5246,14
; 'LET' commands without the word 'LET'. This is done by 'DEFLT'.
;******************************************************************
;
FFFFFFFFFFFFD664 LET:
FFFFFFFFFFFFD664 31FFF798 call SETVAL ; do the assignment
FFFFFFFFFFFFD668 E0C0002C setlo r3,#','
FFFFFFFFFFFFD66C 9A025410 lea r4,FINISH
FFFFFFFFFFFFD670 31FFF8F1 call TSTC ; check for more 'LET' items
FFFFFFFFFFFFD674 BE007F8A bra LET
FFFFFFFFFFFFD678 LT1:
FFFFFFFFFFFFD678 BE006CCA bra FINISH ; until we are finished.
FFFFFFFFFFFFE76C LET:
FFFFFFFFFFFFE76C 31FFFBDA call SETVAL ; do the assignment
FFFFFFFFFFFFE770 E0C0002C setlo r3,#','
FFFFFFFFFFFFE774 9A026518 lea r4,FINISH
FFFFFFFFFFFFE778 31FFFD30 call TSTC ; check for more 'LET' items
FFFFFFFFFFFFE77C BE007F8A bra LET
FFFFFFFFFFFFE780 LT1:
FFFFFFFFFFFFE780 BE006CCA bra FINISH ; until we are finished.
;******************************************************************
3689,53 → 5268,53
; the Butterfly.
;******************************************************************
;
FFFFFFFFFFFFD67C LOAD
FFFFFFFFFFFFD67C 46044E60 lw r8,TXTBGN ; set pointer to start of prog. area
FFFFFFFFFFFFD680 E040000D setlo r1,#CR ; For a CP/M host, tell it we're ready...
FFFFFFFFFFFFD684 31FFF395 call GOAUXO ; by sending a CR to finish PIP command.
FFFFFFFFFFFFD688 LOD1:
FFFFFFFFFFFFD688 31FFF396 call GOAUXI ; look for start of line
FFFFFFFFFFFFD68C BE107FE2 ble r1,r0,LOD1
FFFFFFFFFFFFD690 B0100E40 beq r1,#'@',LODEND ; end of program?
FFFFFFFFFFFFD694 B0100D1A beq r1,#0x1A,LODEND ; or EOF marker
FFFFFFFFFFFFD698 B21FFC3A bne r1,#':',LOD1 ; if not, is it start of line? if not, wait for it
FFFFFFFFFFFFD69C 31FFF5B4 call GCHAR ; get line number
FFFFFFFFFFFFD6A0 60808000 sb r1,[r8] ; store it
FFFFFFFFFFFFD6A4 06109001 shrui r1,r1,#8
FFFFFFFFFFFFD6A8 60808001 sb r1,1[r8]
FFFFFFFFFFFFD6AC 0A840002 addui r8,r8,#2
FFFFFFFFFFFFD6B0 LOD2:
FFFFFFFFFFFFD6B0 31FFF396 call GOAUXI ; get another text char.
FFFFFFFFFFFFD6B4 BE107FE2 ble r1,r0,LOD2
FFFFFFFFFFFFD6B8 60808000 sb r1,[r8]
FFFFFFFFFFFFD6BC 0A840001 addui r8,r8,#1 ; store it
FFFFFFFFFFFFD6C0 B21FFC0D bne r1,#CR,LOD2 ; is it the end of the line? if not, go back for more
FFFFFFFFFFFFD6C4 BE007E2A bra LOD1 ; if so, start a new line
FFFFFFFFFFFFD6C8 LODEND:
FFFFFFFFFFFFD6C8 660410D0 sw r8,TXTUNF ; set end-of program pointer
FFFFFFFFFFFFD6CC BE00416A bra WSTART ; back to direct mode
FFFFFFFFFFFFE784 LOAD
FFFFFFFFFFFFE784 46045F68 lw r8,TXTBGN ; set pointer to start of prog. area
FFFFFFFFFFFFE788 E040000D setlo r1,#CR ; For a CP/M host, tell it we're ready...
FFFFFFFFFFFFE78C 31FFF7D7 call GOAUXO ; by sending a CR to finish PIP command.
FFFFFFFFFFFFE790 LOD1:
FFFFFFFFFFFFE790 31FFF7D8 call GOAUXI ; look for start of line
FFFFFFFFFFFFE794 BE107FE2 ble r1,r0,LOD1
FFFFFFFFFFFFE798 B0100E40 beq r1,#'@',LODEND ; end of program?
FFFFFFFFFFFFE79C B0100D1A beq r1,#0x1A,LODEND ; or EOF marker
FFFFFFFFFFFFE7A0 B21FFC3A bne r1,#':',LOD1 ; if not, is it start of line? if not, wait for it
FFFFFFFFFFFFE7A4 31FFF9F6 call GCHAR ; get line number
FFFFFFFFFFFFE7A8 60808000 sb r1,[r8] ; store it
FFFFFFFFFFFFE7AC 06109001 shrui r1,r1,#8
FFFFFFFFFFFFE7B0 60808001 sb r1,1[r8]
FFFFFFFFFFFFE7B4 0A840002 addui r8,r8,#2
FFFFFFFFFFFFE7B8 LOD2:
FFFFFFFFFFFFE7B8 31FFF7D8 call GOAUXI ; get another text char.
FFFFFFFFFFFFE7BC BE107FE2 ble r1,r0,LOD2
FFFFFFFFFFFFE7C0 60808000 sb r1,[r8]
FFFFFFFFFFFFE7C4 0A840001 addui r8,r8,#1 ; store it
FFFFFFFFFFFFE7C8 B21FFC0D bne r1,#CR,LOD2 ; is it the end of the line? if not, go back for more
FFFFFFFFFFFFE7CC BE007E2A bra LOD1 ; if so, start a new line
FFFFFFFFFFFFE7D0 LODEND:
FFFFFFFFFFFFE7D0 660410D0 sw r8,TXTUNF ; set end-of program pointer
FFFFFFFFFFFFE7D4 BE00418A bra WSTART ; back to direct mode
; get character from input (16 bit value)
FFFFFFFFFFFFD6D0 GCHAR:
FFFFFFFFFFFFD6D0 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFD6D4 67E28000 sw r5,[sp]
FFFFFFFFFFFFD6D8 67E30008 sw r6,8[sp]
FFFFFFFFFFFFD6DC 67EF8010 sw lr,16[sp]
FFFFFFFFFFFFD6E0 E1800003 setlo r6,#3 ; repeat four times
FFFFFFFFFFFFD6E4 E1400000 setlo r5,#0
FFFFFFFFFFFFD6E8 GCHAR1:
FFFFFFFFFFFFD6E8 31FFF396 call GOAUXI ; get a char
FFFFFFFFFFFFD6EC BE107FE2 ble r1,r0,GCHAR1
FFFFFFFFFFFFD6F0 31FFF5C5 call asciiToHex
FFFFFFFFFFFFD6F4 06528800 shli r5,r5,#4
FFFFFFFFFFFFD6F8 04509409 or r5,r5,r1
FFFFFFFFFFFFD6FC BE037F6F loop r6,GCHAR1
FFFFFFFFFFFFD700 02508009 mov r1,r5
FFFFFFFFFFFFD704 47EF8010 lw lr,16[sp]
FFFFFFFFFFFFD708 47E30008 lw r6,8[sp]
FFFFFFFFFFFFD70C 47E28000 lw r5,[sp]
FFFFFFFFFFFFD710 37EF8018 ret #24
FFFFFFFFFFFFE7D8 GCHAR:
FFFFFFFFFFFFE7D8 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFE7DC 67E28000 sw r5,[sp]
FFFFFFFFFFFFE7E0 67E30008 sw r6,8[sp]
FFFFFFFFFFFFE7E4 67EF8010 sw lr,16[sp]
FFFFFFFFFFFFE7E8 E1800003 setlo r6,#3 ; repeat four times
FFFFFFFFFFFFE7EC E1400000 setlo r5,#0
FFFFFFFFFFFFE7F0 GCHAR1:
FFFFFFFFFFFFE7F0 31FFF7D8 call GOAUXI ; get a char
FFFFFFFFFFFFE7F4 BE107FE2 ble r1,r0,GCHAR1
FFFFFFFFFFFFE7F8 31FFFA07 call asciiToHex
FFFFFFFFFFFFE7FC 06528800 shli r5,r5,#4
FFFFFFFFFFFFE800 04509409 or r5,r5,r1
FFFFFFFFFFFFE804 BE037F6F loop r6,GCHAR1
FFFFFFFFFFFFE808 02508009 mov r1,r5
FFFFFFFFFFFFE80C 47EF8010 lw lr,16[sp]
FFFFFFFFFFFFE810 47E30008 lw r6,8[sp]
FFFFFFFFFFFFE814 47E28000 lw r5,[sp]
FFFFFFFFFFFFE818 37EF8018 ret #24
; convert an ascii char to hex code
3742,96 → 5321,96
; input
; r1 = char to convert
FFFFFFFFFFFFD714 asciiToHex:
FFFFFFFFFFFFD714 A4100239 blei r1,#'9',a2h1 ; less than '9'
FFFFFFFFFFFFD718 0E108007 subui r1,r1,#7 ; shift 'A' to '9'+1
FFFFFFFFFFFFD71C a2h1:
FFFFFFFFFFFFD71C 0E108030 subui r1,r1,#'0' ;
FFFFFFFFFFFFD720 1410800F andi r1,r1,#15 ; make sure a nybble
FFFFFFFFFFFFD724 37EF8000 ret
FFFFFFFFFFFFE81C asciiToHex:
FFFFFFFFFFFFE81C A4100239 blei r1,#'9',a2h1 ; less than '9'
FFFFFFFFFFFFE820 0E108007 subui r1,r1,#7 ; shift 'A' to '9'+1
FFFFFFFFFFFFE824 a2h1:
FFFFFFFFFFFFE824 0E108030 subui r1,r1,#'0' ;
FFFFFFFFFFFFE828 1410800F andi r1,r1,#15 ; make sure a nybble
FFFFFFFFFFFFE82C 37EF8000 ret
FFFFFFFFFFFFD728 SAVE:
FFFFFFFFFFFFD728 46044E60 lw r8,TXTBGN ;set pointer to start of prog. area
FFFFFFFFFFFFD72C 460490D0 lw r9,TXTUNF ;set pointer to end of prog. area
FFFFFFFFFFFFD730 SAVE1:
FFFFFFFFFFFFD730 31FFF5E1 call AUXOCRLF ; send out a CR & LF (CP/M likes this)
FFFFFFFFFFFFD734 BE8481C5 bgeu r8,r9,SAVEND ; are we finished?
FFFFFFFFFFFFD738 E040003A setlo r1,#':' ; if not, start a line
FFFFFFFFFFFFD73C 31FFF395 call GOAUXO
FFFFFFFFFFFFD740 4A808000 lbu r1,[r8] ; get line number
FFFFFFFFFFFFD744 4A810001 lbu r2,1[r8]
FFFFFFFFFFFFD748 06211000 shli r2,r2,#8
FFFFFFFFFFFFD74C 04110409 or r1,r1,r2
FFFFFFFFFFFFD750 0A840002 addui r8,r8,#2
FFFFFFFFFFFFD754 31FFF5E9 call PWORD ; output line number as 4-digit hex
FFFFFFFFFFFFD758 SAVE2:
FFFFFFFFFFFFD758 40808000 lb r1,[r8] ; get a text char.
FFFFFFFFFFFFD75C 0A840001 addui r8,r8,#1
FFFFFFFFFFFFD760 B01FF40D beqi r1,#CR,SAVE1 ; is it the end of the line? if so, send CR & LF and start new line
FFFFFFFFFFFFD764 31FFF395 call GOAUXO ; send it out
FFFFFFFFFFFFD768 BE007F8A bra SAVE2 ; go back for more text
FFFFFFFFFFFFD76C SAVEND:
FFFFFFFFFFFFD76C E0400040 setlo r1,#'@' ; send end-of-program indicator
FFFFFFFFFFFFD770 31FFF395 call GOAUXO
FFFFFFFFFFFFD774 31FFF5E1 call AUXOCRLF ; followed by a CR & LF
FFFFFFFFFFFFD778 E040001A setlo r1,#0x1A ; and a control-Z to end the CP/M file
FFFFFFFFFFFFD77C 31FFF395 call GOAUXO
FFFFFFFFFFFFD780 BE003BCA bra WSTART ; then go do a warm start
FFFFFFFFFFFFE830 SAVE:
FFFFFFFFFFFFE830 46045F68 lw r8,TXTBGN ;set pointer to start of prog. area
FFFFFFFFFFFFE834 460490D0 lw r9,TXTUNF ;set pointer to end of prog. area
FFFFFFFFFFFFE838 SAVE1:
FFFFFFFFFFFFE838 31FFFA23 call AUXOCRLF ; send out a CR & LF (CP/M likes this)
FFFFFFFFFFFFE83C BE8481C5 bgeu r8,r9,SAVEND ; are we finished?
FFFFFFFFFFFFE840 E040003A setlo r1,#':' ; if not, start a line
FFFFFFFFFFFFE844 31FFF7D7 call GOAUXO
FFFFFFFFFFFFE848 4A808000 lbu r1,[r8] ; get line number
FFFFFFFFFFFFE84C 4A810001 lbu r2,1[r8]
FFFFFFFFFFFFE850 06211000 shli r2,r2,#8
FFFFFFFFFFFFE854 04110409 or r1,r1,r2
FFFFFFFFFFFFE858 0A840002 addui r8,r8,#2
FFFFFFFFFFFFE85C 31FFFA2B call PWORD ; output line number as 4-digit hex
FFFFFFFFFFFFE860 SAVE2:
FFFFFFFFFFFFE860 40808000 lb r1,[r8] ; get a text char.
FFFFFFFFFFFFE864 0A840001 addui r8,r8,#1
FFFFFFFFFFFFE868 B01FF40D beqi r1,#CR,SAVE1 ; is it the end of the line? if so, send CR & LF and start new line
FFFFFFFFFFFFE86C 31FFF7D7 call GOAUXO ; send it out
FFFFFFFFFFFFE870 BE007F8A bra SAVE2 ; go back for more text
FFFFFFFFFFFFE874 SAVEND:
FFFFFFFFFFFFE874 E0400040 setlo r1,#'@' ; send end-of-program indicator
FFFFFFFFFFFFE878 31FFF7D7 call GOAUXO
FFFFFFFFFFFFE87C 31FFFA23 call AUXOCRLF ; followed by a CR & LF
FFFFFFFFFFFFE880 E040001A setlo r1,#0x1A ; and a control-Z to end the CP/M file
FFFFFFFFFFFFE884 31FFF7D7 call GOAUXO
FFFFFFFFFFFFE888 BE003BEA bra WSTART ; then go do a warm start
; output a CR LF sequence to auxillary output
; Registers Affected
; r3 = LF
FFFFFFFFFFFFD784 AUXOCRLF:
FFFFFFFFFFFFD784 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFD788 67EF8000 sw lr,[sp]
FFFFFFFFFFFFD78C E040000D setlo r1,#CR
FFFFFFFFFFFFD790 31FFF395 call GOAUXO
FFFFFFFFFFFFD794 E040000A setlo r1,#LF
FFFFFFFFFFFFD798 31FFF395 call GOAUXO
FFFFFFFFFFFFD79C 47EF8000 lw lr,[sp]
FFFFFFFFFFFFD7A0 37EF8008 ret #8
FFFFFFFFFFFFE88C AUXOCRLF:
FFFFFFFFFFFFE88C 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFE890 67EF8000 sw lr,[sp]
FFFFFFFFFFFFE894 E040000D setlo r1,#CR
FFFFFFFFFFFFE898 31FFF7D7 call GOAUXO
FFFFFFFFFFFFE89C E040000A setlo r1,#LF
FFFFFFFFFFFFE8A0 31FFF7D7 call GOAUXO
FFFFFFFFFFFFE8A4 47EF8000 lw lr,[sp]
FFFFFFFFFFFFE8A8 37EF8008 ret #8
; output a word in hex format
; tricky because of the need to reverse the order of the chars
FFFFFFFFFFFFD7A4 PWORD:
FFFFFFFFFFFFD7A4 0DEF0010 sub sp,sp,#16
FFFFFFFFFFFFD7A8 67EF8000 sw lr,[sp]
FFFFFFFFFFFFD7AC 67E28008 sw r5,8[sp]
FFFFFFFFFFFFD7B0 9A02910F lea r5,NUMWKA+15
FFFFFFFFFFFFD7B4 02120009 mov r4,r1 ; r4 = value
FFFFFFFFFFFFD7B8 pword1:
FFFFFFFFFFFFD7B8 02408009 mov r1,r4 ; r1 = value
FFFFFFFFFFFFD7BC 06420801 shrui r4,r4,#4 ; shift over to next nybble
FFFFFFFFFFFFD7C0 31FFF5FD call toAsciiHex ; convert LS nybble to ascii hex
FFFFFFFFFFFFD7C4 60508000 sb r1,[r5] ; save in work area
FFFFFFFFFFFFD7C8 0E528001 subui r5,r5,#1
FFFFFFFFFFFFD7CC 12509100 cmpui r1,r5,#NUMWKA
FFFFFFFFFFFFD7D0 BE107F41 bge r1,r0,pword1
FFFFFFFFFFFFD7D4 pword2:
FFFFFFFFFFFFD7D4 0A528001 addui r5,r5,#1
FFFFFFFFFFFFD7D8 40508000 lb r1,[r5] ; get char to output
FFFFFFFFFFFFD7DC 31FFF395 call GOAUXO ; send it
FFFFFFFFFFFFD7E0 1250910F cmpui r1,r5,#NUMWKA+15
FFFFFFFFFFFFD7E4 BE107F80 blt r1,r0,pword2
FFFFFFFFFFFFD7E8 47E28008 lw r5,8[sp]
FFFFFFFFFFFFD7EC 47EF8000 lw lr,[sp]
FFFFFFFFFFFFD7F0 37EF8010 ret #16
FFFFFFFFFFFFE8AC PWORD:
FFFFFFFFFFFFE8AC 0DEF0010 sub sp,sp,#16
FFFFFFFFFFFFE8B0 67EF8000 sw lr,[sp]
FFFFFFFFFFFFE8B4 67E28008 sw r5,8[sp]
FFFFFFFFFFFFE8B8 9A02910F lea r5,NUMWKA+15
FFFFFFFFFFFFE8BC 02120009 mov r4,r1 ; r4 = value
FFFFFFFFFFFFE8C0 pword1:
FFFFFFFFFFFFE8C0 02408009 mov r1,r4 ; r1 = value
FFFFFFFFFFFFE8C4 06420801 shrui r4,r4,#4 ; shift over to next nybble
FFFFFFFFFFFFE8C8 31FFFA3F call toAsciiHex ; convert LS nybble to ascii hex
FFFFFFFFFFFFE8CC 60508000 sb r1,[r5] ; save in work area
FFFFFFFFFFFFE8D0 0E528001 subui r5,r5,#1
FFFFFFFFFFFFE8D4 12509100 cmpui r1,r5,#NUMWKA
FFFFFFFFFFFFE8D8 BE107F41 bge r1,r0,pword1
FFFFFFFFFFFFE8DC pword2:
FFFFFFFFFFFFE8DC 0A528001 addui r5,r5,#1
FFFFFFFFFFFFE8E0 40508000 lb r1,[r5] ; get char to output
FFFFFFFFFFFFE8E4 31FFF7D7 call GOAUXO ; send it
FFFFFFFFFFFFE8E8 1250910F cmpui r1,r5,#NUMWKA+15
FFFFFFFFFFFFE8EC BE107F80 blt r1,r0,pword2
FFFFFFFFFFFFE8F0 47E28008 lw r5,8[sp]
FFFFFFFFFFFFE8F4 47EF8000 lw lr,[sp]
FFFFFFFFFFFFE8F8 37EF8010 ret #16
; convert nybble in r2 to ascii hex char2
; r2 = character to convert
FFFFFFFFFFFFD7F4 toAsciiHex:
FFFFFFFFFFFFD7F4 1410800F andi r1,r1,#15 ; make sure it's a nybble
FFFFFFFFFFFFD7F8 A010020A blti r1,#10,tah1 ; > 10 ?
FFFFFFFFFFFFD7FC 08108007 addi r1,r1,#7 ; bump it up to the letter 'A'
FFFFFFFFFFFFD800 tah1:
FFFFFFFFFFFFD800 0A108030 addui r1,r1,#'0' ; bump up to ascii '0'
FFFFFFFFFFFFD804 37EF8000 ret
FFFFFFFFFFFFE8FC toAsciiHex:
FFFFFFFFFFFFE8FC 1410800F andi r1,r1,#15 ; make sure it's a nybble
FFFFFFFFFFFFE900 A010020A blti r1,#10,tah1 ; > 10 ?
FFFFFFFFFFFFE904 08108007 addi r1,r1,#7 ; bump it up to the letter 'A'
FFFFFFFFFFFFE908 tah1:
FFFFFFFFFFFFE908 0A108030 addui r1,r1,#'0' ; bump up to ascii '0'
FFFFFFFFFFFFE90C 37EF8000 ret
3847,73 → 5426,73
; The subroutine returns to the interpreter by executing an RET.
;******************************************************************
;
FFFFFFFFFFFFD808 POKE:
FFFFFFFFFFFFD808 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFD80C 31FFF63A call OREXPR ; get the memory address
FFFFFFFFFFFFD810 E0C0002C setlo r3,#','
FFFFFFFFFFFFD814 9A025834 lea r4,PKER ; it must be followed by a comma
FFFFFFFFFFFFD818 31FFF8F1 call TSTC ; it must be followed by a comma
FFFFFFFFFFFFD81C 67E08000 sw r1,[sp] ; save the address
FFFFFFFFFFFFD820 31FFF63A call OREXPR ; get the byte to be POKE'd
FFFFFFFFFFFFD824 47E10000 lw r2,[sp] ; get the address back
FFFFFFFFFFFFD828 60208000 sb r1,[r2] ; store the byte in memory
FFFFFFFFFFFFD82C 0BEF0008 addui sp,sp,#8
FFFFFFFFFFFFD830 BE005F0A bra FINISH
FFFFFFFFFFFFD834 PKER:
FFFFFFFFFFFFD834 9A00E680 lea r1,msgComma
FFFFFFFFFFFFD838 BE00374A bra ERROR ; if no comma, say "What?"
FFFFFFFFFFFFE910 POKE:
FFFFFFFFFFFFE910 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFE914 31FFFA7C call OREXPR ; get the memory address
FFFFFFFFFFFFE918 E0C0002C setlo r3,#','
FFFFFFFFFFFFE91C 9A02693C lea r4,PKER ; it must be followed by a comma
FFFFFFFFFFFFE920 31FFFD30 call TSTC ; it must be followed by a comma
FFFFFFFFFFFFE924 67E08000 sw r1,[sp] ; save the address
FFFFFFFFFFFFE928 31FFFA7C call OREXPR ; get the byte to be POKE'd
FFFFFFFFFFFFE92C 47E10000 lw r2,[sp] ; get the address back
FFFFFFFFFFFFE930 60208000 sb r1,[r2] ; store the byte in memory
FFFFFFFFFFFFE934 0BEF0008 addui sp,sp,#8
FFFFFFFFFFFFE938 BE005F0A bra FINISH
FFFFFFFFFFFFE93C PKER:
FFFFFFFFFFFFE93C 9A00F778 lea r1,msgComma
FFFFFFFFFFFFE940 BE00374A bra ERROR ; if no comma, say "What?"
FFFFFFFFFFFFD83C POKEC:
FFFFFFFFFFFFD83C 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFD840 31FFF63A call OREXPR ; get the memory address
FFFFFFFFFFFFD844 E0C0002C setlo r3,#','
FFFFFFFFFFFFD848 9A025834 lea r4,PKER ; it must be followed by a comma
FFFFFFFFFFFFD84C 31FFF8F1 call TSTC ; it must be followed by a comma
FFFFFFFFFFFFD850 67E08000 sw r1,[sp] ; save the address
FFFFFFFFFFFFD854 31FFF63A call OREXPR ; get the byte to be POKE'd
FFFFFFFFFFFFD858 47E10000 lw r2,[sp] ; get the address back
FFFFFFFFFFFFD85C 62208000 sc r1,[r2] ; store the char in memory
FFFFFFFFFFFFD860 0BEF0008 addui sp,sp,#8
FFFFFFFFFFFFD864 33FFF504 jmp FINISH
FFFFFFFFFFFFE944 POKEC:
FFFFFFFFFFFFE944 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFE948 31FFFA7C call OREXPR ; get the memory address
FFFFFFFFFFFFE94C E0C0002C setlo r3,#','
FFFFFFFFFFFFE950 9A02693C lea r4,PKER ; it must be followed by a comma
FFFFFFFFFFFFE954 31FFFD30 call TSTC ; it must be followed by a comma
FFFFFFFFFFFFE958 67E08000 sw r1,[sp] ; save the address
FFFFFFFFFFFFE95C 31FFFA7C call OREXPR ; get the byte to be POKE'd
FFFFFFFFFFFFE960 47E10000 lw r2,[sp] ; get the address back
FFFFFFFFFFFFE964 62208000 sc r1,[r2] ; store the char in memory
FFFFFFFFFFFFE968 0BEF0008 addui sp,sp,#8
FFFFFFFFFFFFE96C 33FFF946 jmp FINISH
FFFFFFFFFFFFD868 POKEH:
FFFFFFFFFFFFD868 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFD86C 31FFF63A call OREXPR ; get the memory address
FFFFFFFFFFFFD870 E0C0002C setlo r3,#','
FFFFFFFFFFFFD874 9A025834 lea r4,PKER ; it must be followed by a comma
FFFFFFFFFFFFD878 31FFF8F1 call TSTC
FFFFFFFFFFFFD87C 67E08000 sw r1,[sp] ; save the address
FFFFFFFFFFFFD880 31FFF63A call OREXPR ; get the byte to be POKE'd
FFFFFFFFFFFFD884 47E10000 lw r2,[sp] ; get the address back
FFFFFFFFFFFFD888 64208000 sh r1,[r2] ; store the word in memory
FFFFFFFFFFFFD88C 0BEF0008 addui sp,sp,#8
FFFFFFFFFFFFD890 33FFF504 jmp FINISH
FFFFFFFFFFFFE970 POKEH:
FFFFFFFFFFFFE970 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFE974 31FFFA7C call OREXPR ; get the memory address
FFFFFFFFFFFFE978 E0C0002C setlo r3,#','
FFFFFFFFFFFFE97C 9A02693C lea r4,PKER ; it must be followed by a comma
FFFFFFFFFFFFE980 31FFFD30 call TSTC
FFFFFFFFFFFFE984 67E08000 sw r1,[sp] ; save the address
FFFFFFFFFFFFE988 31FFFA7C call OREXPR ; get the byte to be POKE'd
FFFFFFFFFFFFE98C 47E10000 lw r2,[sp] ; get the address back
FFFFFFFFFFFFE990 64208000 sh r1,[r2] ; store the word in memory
FFFFFFFFFFFFE994 0BEF0008 addui sp,sp,#8
FFFFFFFFFFFFE998 33FFF946 jmp FINISH
FFFFFFFFFFFFD894 POKEW:
FFFFFFFFFFFFD894 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFD898 31FFF63A call OREXPR ; get the memory address
FFFFFFFFFFFFD89C E0C0002C setlo r3,#','
FFFFFFFFFFFFD8A0 9A025834 lea r4,PKER ; it must be followed by a comma
FFFFFFFFFFFFD8A4 31FFF8F1 call TSTC
FFFFFFFFFFFFD8A8 67E08000 sw r1,[sp] ; save the address
FFFFFFFFFFFFD8AC 31FFF63A call OREXPR ; get the word to be POKE'd
FFFFFFFFFFFFD8B0 47E10000 lw r2,[sp] ; get the address back
FFFFFFFFFFFFD8B4 66208000 sw r1,[r2] ; store the word in memory
FFFFFFFFFFFFD8B8 0BEF0008 addui sp,sp,#8
FFFFFFFFFFFFD8BC 33FFF504 jmp FINISH
FFFFFFFFFFFFE99C POKEW:
FFFFFFFFFFFFE99C 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFE9A0 31FFFA7C call OREXPR ; get the memory address
FFFFFFFFFFFFE9A4 E0C0002C setlo r3,#','
FFFFFFFFFFFFE9A8 9A02693C lea r4,PKER ; it must be followed by a comma
FFFFFFFFFFFFE9AC 31FFFD30 call TSTC
FFFFFFFFFFFFE9B0 67E08000 sw r1,[sp] ; save the address
FFFFFFFFFFFFE9B4 31FFFA7C call OREXPR ; get the word to be POKE'd
FFFFFFFFFFFFE9B8 47E10000 lw r2,[sp] ; get the address back
FFFFFFFFFFFFE9BC 66208000 sw r1,[r2] ; store the word in memory
FFFFFFFFFFFFE9C0 0BEF0008 addui sp,sp,#8
FFFFFFFFFFFFE9C4 33FFF946 jmp FINISH
FFFFFFFFFFFFD8C0 SYSX:
FFFFFFFFFFFFD8C0 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFD8C4 31FFF63A call OREXPR ; get the subroutine's address
FFFFFFFFFFFFD8C8 BE100069 bne r1,r0,sysx1 ; make sure we got a valid address
FFFFFFFFFFFFD8CC 9A00E6D5 lea r1,msgSYSBad
FFFFFFFFFFFFD8D0 BE00328A bra ERROR
FFFFFFFFFFFFD8D4 sysx1:
FFFFFFFFFFFFD8D4 67E40000 sw r8,[sp] ; save the text pointer
FFFFFFFFFFFFD8D8 341F8000 jal r31,[r1] ; jump to the subroutine
FFFFFFFFFFFFD8DC 47E40000 lw r8,[sp] ; restore the text pointer
FFFFFFFFFFFFD8E0 0BEF0008 addui sp,sp,#8
FFFFFFFFFFFFD8E4 BE00596A bra FINISH
FFFFFFFFFFFFE9C8 SYSX:
FFFFFFFFFFFFE9C8 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFE9CC 31FFFA7C call OREXPR ; get the subroutine's address
FFFFFFFFFFFFE9D0 BE100069 bne r1,r0,sysx1 ; make sure we got a valid address
FFFFFFFFFFFFE9D4 9A00F7CD lea r1,msgSYSBad
FFFFFFFFFFFFE9D8 BE00328A bra ERROR
FFFFFFFFFFFFE9DC sysx1:
FFFFFFFFFFFFE9DC 67E40000 sw r8,[sp] ; save the text pointer
FFFFFFFFFFFFE9E0 341F8000 jal r31,[r1] ; jump to the subroutine
FFFFFFFFFFFFE9E4 47E40000 lw r8,[sp] ; restore the text pointer
FFFFFFFFFFFFE9E8 0BEF0008 addui sp,sp,#8
FFFFFFFFFFFFE9EC BE00596A bra FINISH
;******************************************************************
; *** EXPR ***
3938,46 → 5517,46
; <OREXPR>::=<ANDEXPR> OR <ANDEXPR> ...
;
FFFFFFFFFFFFD8E8 OREXPR:
FFFFFFFFFFFFD8E8 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFD8EC 67EF8000 sw lr,[sp]
FFFFFFFFFFFFD8F0 31FFF648 call ANDEXPR ; get first <ANDEXPR>
FFFFFFFFFFFFD8F4 XP_OR1:
FFFFFFFFFFFFD8F4 67E08004 sw r1,4[sp] ; save <ANDEXPR> value
FFFFFFFFFFFFD8F8 9A04D079 lea r9,TAB10 ; look up a logical operator
FFFFFFFFFFFFD8FC 9A055200 lea r10,TAB10_1
FFFFFFFFFFFFD900 33FFF486 jmp EXEC ; go do it
FFFFFFFFFFFFD904 XP_OR:
FFFFFFFFFFFFD904 31FFF648 call ANDEXPR
FFFFFFFFFFFFD908 47E10008 lw r2,8[sp]
FFFFFFFFFFFFD90C 04110409 or r1,r1,r2
FFFFFFFFFFFFD910 BE007F2A bra XP_OR1
FFFFFFFFFFFFD914 XP_ORX:
FFFFFFFFFFFFD914 47E08008 lw r1,8[sp]
FFFFFFFFFFFFD918 47EF8000 lw lr,[sp]
FFFFFFFFFFFFD91C 37EF8010 ret #16
FFFFFFFFFFFFE9F0 OREXPR:
FFFFFFFFFFFFE9F0 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFE9F4 67EF8000 sw lr,[sp]
FFFFFFFFFFFFE9F8 31FFFA8A call ANDEXPR ; get first <ANDEXPR>
FFFFFFFFFFFFE9FC XP_OR1:
FFFFFFFFFFFFE9FC 67E08004 sw r1,4[sp] ; save <ANDEXPR> value
FFFFFFFFFFFFEA00 9A04E185 lea r9,TAB10 ; look up a logical operator
FFFFFFFFFFFFEA04 9A056308 lea r10,TAB10_1
FFFFFFFFFFFFEA08 33FFF8C8 jmp EXEC ; go do it
FFFFFFFFFFFFEA0C XP_OR:
FFFFFFFFFFFFEA0C 31FFFA8A call ANDEXPR
FFFFFFFFFFFFEA10 47E10008 lw r2,8[sp]
FFFFFFFFFFFFEA14 04110409 or r1,r1,r2
FFFFFFFFFFFFEA18 BE007F2A bra XP_OR1
FFFFFFFFFFFFEA1C XP_ORX:
FFFFFFFFFFFFEA1C 47E08008 lw r1,8[sp]
FFFFFFFFFFFFEA20 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEA24 37EF8010 ret #16
; <ANDEXPR>::=<EXPR> AND <EXPR> ...
;
FFFFFFFFFFFFD920 ANDEXPR:
FFFFFFFFFFFFD920 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFD924 67EF8000 sw lr,[sp]
FFFFFFFFFFFFD928 31FFF66D call EXPR ; get first <EXPR>
FFFFFFFFFFFFD92C XP_AND1:
FFFFFFFFFFFFD92C 67E08008 sw r1,8[sp] ; save <EXPR> value
FFFFFFFFFFFFD930 9A04D075 lea r9,TAB9 ; look up a logical operator
FFFFFFFFFFFFD934 9A0551F0 lea r10,TAB9_1
FFFFFFFFFFFFD938 33FFF486 jmp EXEC ; go do it
FFFFFFFFFFFFD93C XP_AND:
FFFFFFFFFFFFD93C 31FFF66D call EXPR
FFFFFFFFFFFFD940 47E10008 lw r2,8[sp]
FFFFFFFFFFFFD944 04110408 and r1,r1,r2
FFFFFFFFFFFFD948 BE007F2A bra XP_AND1
FFFFFFFFFFFFD94C XP_ANDX:
FFFFFFFFFFFFD94C 47E08008 lw r1,8[sp]
FFFFFFFFFFFFD950 47EF8000 lw lr,[sp]
FFFFFFFFFFFFD954 37EF8010 ret #16
FFFFFFFFFFFFEA28 ANDEXPR:
FFFFFFFFFFFFEA28 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFEA2C 67EF8000 sw lr,[sp]
FFFFFFFFFFFFEA30 31FFFAAF call EXPR ; get first <EXPR>
FFFFFFFFFFFFEA34 XP_AND1:
FFFFFFFFFFFFEA34 67E08008 sw r1,8[sp] ; save <EXPR> value
FFFFFFFFFFFFEA38 9A04E181 lea r9,TAB9 ; look up a logical operator
FFFFFFFFFFFFEA3C 9A0562F8 lea r10,TAB9_1
FFFFFFFFFFFFEA40 33FFF8C8 jmp EXEC ; go do it
FFFFFFFFFFFFEA44 XP_AND:
FFFFFFFFFFFFEA44 31FFFAAF call EXPR
FFFFFFFFFFFFEA48 47E10008 lw r2,8[sp]
FFFFFFFFFFFFEA4C 04110408 and r1,r1,r2
FFFFFFFFFFFFEA50 BE007F2A bra XP_AND1
FFFFFFFFFFFFEA54 XP_ANDX:
FFFFFFFFFFFFEA54 47E08008 lw r1,8[sp]
FFFFFFFFFFFFEA58 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEA5C 37EF8010 ret #16
; Determine if the character is a digit
3986,14 → 5565,14
; Returns
; r1 = 1 if digit, otherwise 0
;
FFFFFFFFFFFFD958 isDigit:
FFFFFFFFFFFFD958 A0100430 blt r1,#'0',isDigitFalse
FFFFFFFFFFFFD95C A6100339 bgt r1,#'9',isDigitFalse
FFFFFFFFFFFFD960 E0400001 setlo r1,#1
FFFFFFFFFFFFD964 37EF8000 ret
FFFFFFFFFFFFD968 isDigitFalse:
FFFFFFFFFFFFD968 E0400000 setlo r1,#0
FFFFFFFFFFFFD96C 37EF8000 ret
FFFFFFFFFFFFEA60 isDigit:
FFFFFFFFFFFFEA60 A0100430 blt r1,#'0',isDigitFalse
FFFFFFFFFFFFEA64 A6100339 bgt r1,#'9',isDigitFalse
FFFFFFFFFFFFEA68 E0400001 setlo r1,#1
FFFFFFFFFFFFEA6C 37EF8000 ret
FFFFFFFFFFFFEA70 isDigitFalse:
FFFFFFFFFFFFEA70 E0400000 setlo r1,#0
FFFFFFFFFFFFEA74 37EF8000 ret
; Determine if the character is a alphabetic
4002,17 → 5581,17
; Returns
; r1 = 1 if alpha, otherwise 0
;
FFFFFFFFFFFFD970 isAlpha:
FFFFFFFFFFFFD970 A0100641 blt r1,#'A',isAlphaFalse
FFFFFFFFFFFFD974 A410035A ble r1,#'Z',isAlphaTrue
FFFFFFFFFFFFD978 A0100461 blt r1,#'a',isAlphaFalse
FFFFFFFFFFFFD97C A610037A bgt r1,#'z',isAlphaFalse
FFFFFFFFFFFFD980 isAlphaTrue:
FFFFFFFFFFFFD980 E0400001 setlo r1,#1
FFFFFFFFFFFFD984 37EF8000 ret
FFFFFFFFFFFFD988 isAlphaFalse:
FFFFFFFFFFFFD988 E0400000 setlo r1,#0
FFFFFFFFFFFFD98C 37EF8000 ret
FFFFFFFFFFFFEA78 isAlpha:
FFFFFFFFFFFFEA78 A0100641 blt r1,#'A',isAlphaFalse
FFFFFFFFFFFFEA7C A410035A ble r1,#'Z',isAlphaTrue
FFFFFFFFFFFFEA80 A0100461 blt r1,#'a',isAlphaFalse
FFFFFFFFFFFFEA84 A610037A bgt r1,#'z',isAlphaFalse
FFFFFFFFFFFFEA88 isAlphaTrue:
FFFFFFFFFFFFEA88 E0400001 setlo r1,#1
FFFFFFFFFFFFEA8C 37EF8000 ret
FFFFFFFFFFFFEA90 isAlphaFalse:
FFFFFFFFFFFFEA90 E0400000 setlo r1,#0
FFFFFFFFFFFFEA94 37EF8000 ret
; Determine if the character is a alphanumeric
4021,150 → 5600,150
; Returns
; r1 = 1 if alpha, otherwise 0
;
FFFFFFFFFFFFD990 isAlnum:
FFFFFFFFFFFFD990 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFD994 67EF8000 sw lr,[sp]
FFFFFFFFFFFFD998 04100809 or r2,r1,r0 ; save test char
FFFFFFFFFFFFD99C 31FFF656 call isDigit
FFFFFFFFFFFFD9A0 BE100069 bne r1,r0,isDigitx ; if it is a digit
FFFFFFFFFFFFD9A4 04200409 or r1,r2,r0 ; get back test char
FFFFFFFFFFFFD9A8 31FFF65C call isAlpha
FFFFFFFFFFFFD9AC isDigitx:
FFFFFFFFFFFFD9AC 47EF8000 lw lr,[sp]
FFFFFFFFFFFFD9B0 37EF8008 ret #8
FFFFFFFFFFFFEA98 isAlnum:
FFFFFFFFFFFFEA98 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFEA9C 67EF8000 sw lr,[sp]
FFFFFFFFFFFFEAA0 04100809 or r2,r1,r0 ; save test char
FFFFFFFFFFFFEAA4 31FFFA98 call isDigit
FFFFFFFFFFFFEAA8 BE100069 bne r1,r0,isDigitx ; if it is a digit
FFFFFFFFFFFFEAAC 04200409 or r1,r2,r0 ; get back test char
FFFFFFFFFFFFEAB0 31FFFA9E call isAlpha
FFFFFFFFFFFFEAB4 isDigitx:
FFFFFFFFFFFFEAB4 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEAB8 37EF8008 ret #8
FFFFFFFFFFFFD9B4 EXPR:
FFFFFFFFFFFFD9B4 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFD9B8 67EF8000 sw lr,[sp]
FFFFFFFFFFFFD9BC 31FFF69C call EXPR2
FFFFFFFFFFFFD9C0 67E08008 sw r1,8[sp] ; save <EXPR2> value
FFFFFFFFFFFFD9C4 9A04D06B lea r9,TAB8 ; look up a relational operator
FFFFFFFFFFFFD9C8 9A0551B8 lea r10,TAB8_1
FFFFFFFFFFFFD9CC 33FFF486 jmp EXEC ; go do it
FFFFFFFFFFFFD9D0 XP11:
FFFFFFFFFFFFD9D0 47E08008 lw r1,8[sp]
FFFFFFFFFFFFD9D4 31FFF695 call XP18 ; is it ">="?
FFFFFFFFFFFFD9D8 BE208321 bge r2,r1,XPRT1 ; no, return r2=1
FFFFFFFFFFFFD9DC BE0002AA bra XPRT0 ; else return r2=0
FFFFFFFFFFFFD9E0 XP12:
FFFFFFFFFFFFD9E0 47E08008 lw r1,8[sp]
FFFFFFFFFFFFD9E4 31FFF695 call XP18 ; is it "<>"?
FFFFFFFFFFFFD9E8 BE2082A9 bne r2,r1,XPRT1 ; no, return r2=1
FFFFFFFFFFFFD9EC BE00022A bra XPRT0 ; else return r2=0
FFFFFFFFFFFFD9F0 XP13:
FFFFFFFFFFFFD9F0 47E08008 lw r1,8[sp]
FFFFFFFFFFFFD9F4 31FFF695 call XP18 ; is it ">"?
FFFFFFFFFFFFD9F8 BE208223 bgt r2,r1,XPRT1 ; no, return r2=1
FFFFFFFFFFFFD9FC BE0001AA bra XPRT0 ; else return r2=0
FFFFFFFFFFFFDA00 XP14:
FFFFFFFFFFFFDA00 47E08008 lw r1,8[sp]
FFFFFFFFFFFFDA04 31FFF695 call XP18 ; is it "<="?
FFFFFFFFFFFFDA08 BE2081A2 ble r2,r1,XPRT1 ; no, return r2=1
FFFFFFFFFFFFDA0C BE00012A bra XPRT0 ; else return r2=0
FFFFFFFFFFFFDA10 XP15:
FFFFFFFFFFFFDA10 47E08008 lw r1,8[sp]
FFFFFFFFFFFFDA14 31FFF695 call XP18 ; is it "="?
FFFFFFFFFFFFDA18 BE208128 beq r2,r1,XPRT1 ; if not, return r2=1
FFFFFFFFFFFFDA1C BE0000AA bra XPRT0 ; else return r2=0
FFFFFFFFFFFFDA20 XP16:
FFFFFFFFFFFFDA20 47E08008 lw r1,8[sp]
FFFFFFFFFFFFDA24 31FFF695 call XP18 ; is it "<"?
FFFFFFFFFFFFDA28 BE2080A0 blt r2,r1,XPRT1 ; if not, return r2=1
FFFFFFFFFFFFDA2C BE00002A bra XPRT0 ; else return r2=0
FFFFFFFFFFFFDA30 XPRT0:
FFFFFFFFFFFFDA30 47EF8000 lw lr,[sp]
FFFFFFFFFFFFDA34 E0400000 setlo r1,#0 ; return r1=0 (false)
FFFFFFFFFFFFDA38 37EF8010 ret #16
FFFFFFFFFFFFDA3C XPRT1:
FFFFFFFFFFFFDA3C 47EF8000 lw lr,[sp]
FFFFFFFFFFFFDA40 E0400001 setlo r1,#1 ; return r1=1 (true)
FFFFFFFFFFFFDA44 37EF8010 ret #16
FFFFFFFFFFFFEABC EXPR:
FFFFFFFFFFFFEABC 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFEAC0 67EF8000 sw lr,[sp]
FFFFFFFFFFFFEAC4 31FFFADE call EXPR2
FFFFFFFFFFFFEAC8 67E08008 sw r1,8[sp] ; save <EXPR2> value
FFFFFFFFFFFFEACC 9A04E177 lea r9,TAB8 ; look up a relational operator
FFFFFFFFFFFFEAD0 9A0562C0 lea r10,TAB8_1
FFFFFFFFFFFFEAD4 33FFF8C8 jmp EXEC ; go do it
FFFFFFFFFFFFEAD8 XP11:
FFFFFFFFFFFFEAD8 47E08008 lw r1,8[sp]
FFFFFFFFFFFFEADC 31FFFAD7 call XP18 ; is it ">="?
FFFFFFFFFFFFEAE0 BE208321 bge r2,r1,XPRT1 ; no, return r2=1
FFFFFFFFFFFFEAE4 BE0002AA bra XPRT0 ; else return r2=0
FFFFFFFFFFFFEAE8 XP12:
FFFFFFFFFFFFEAE8 47E08008 lw r1,8[sp]
FFFFFFFFFFFFEAEC 31FFFAD7 call XP18 ; is it "<>"?
FFFFFFFFFFFFEAF0 BE2082A9 bne r2,r1,XPRT1 ; no, return r2=1
FFFFFFFFFFFFEAF4 BE00022A bra XPRT0 ; else return r2=0
FFFFFFFFFFFFEAF8 XP13:
FFFFFFFFFFFFEAF8 47E08008 lw r1,8[sp]
FFFFFFFFFFFFEAFC 31FFFAD7 call XP18 ; is it ">"?
FFFFFFFFFFFFEB00 BE208223 bgt r2,r1,XPRT1 ; no, return r2=1
FFFFFFFFFFFFEB04 BE0001AA bra XPRT0 ; else return r2=0
FFFFFFFFFFFFEB08 XP14:
FFFFFFFFFFFFEB08 47E08008 lw r1,8[sp]
FFFFFFFFFFFFEB0C 31FFFAD7 call XP18 ; is it "<="?
FFFFFFFFFFFFEB10 BE2081A2 ble r2,r1,XPRT1 ; no, return r2=1
FFFFFFFFFFFFEB14 BE00012A bra XPRT0 ; else return r2=0
FFFFFFFFFFFFEB18 XP15:
FFFFFFFFFFFFEB18 47E08008 lw r1,8[sp]
FFFFFFFFFFFFEB1C 31FFFAD7 call XP18 ; is it "="?
FFFFFFFFFFFFEB20 BE208128 beq r2,r1,XPRT1 ; if not, return r2=1
FFFFFFFFFFFFEB24 BE0000AA bra XPRT0 ; else return r2=0
FFFFFFFFFFFFEB28 XP16:
FFFFFFFFFFFFEB28 47E08008 lw r1,8[sp]
FFFFFFFFFFFFEB2C 31FFFAD7 call XP18 ; is it "<"?
FFFFFFFFFFFFEB30 BE2080A0 blt r2,r1,XPRT1 ; if not, return r2=1
FFFFFFFFFFFFEB34 BE00002A bra XPRT0 ; else return r2=0
FFFFFFFFFFFFEB38 XPRT0:
FFFFFFFFFFFFEB38 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEB3C E0400000 setlo r1,#0 ; return r1=0 (false)
FFFFFFFFFFFFEB40 37EF8010 ret #16
FFFFFFFFFFFFEB44 XPRT1:
FFFFFFFFFFFFEB44 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEB48 E0400001 setlo r1,#1 ; return r1=1 (true)
FFFFFFFFFFFFEB4C 37EF8010 ret #16
FFFFFFFFFFFFDA48 XP17: ; it's not a rel. operator
FFFFFFFFFFFFDA48 47E08008 lw r1,8[sp] ; return r2=<EXPR2>
FFFFFFFFFFFFDA4C 47EF8000 lw lr,[sp]
FFFFFFFFFFFFDA50 37EF8010 ret #16
FFFFFFFFFFFFEB50 XP17: ; it's not a rel. operator
FFFFFFFFFFFFEB50 47E08008 lw r1,8[sp] ; return r2=<EXPR2>
FFFFFFFFFFFFEB54 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEB58 37EF8010 ret #16
FFFFFFFFFFFFDA54 XP18:
FFFFFFFFFFFFDA54 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFDA58 67EF8000 sw lr,[sp]
FFFFFFFFFFFFDA5C 67E08008 sw r1,8[sp]
FFFFFFFFFFFFDA60 31FFF69C call EXPR2 ; do a second <EXPR2>
FFFFFFFFFFFFDA64 47E10008 lw r2,8[sp]
FFFFFFFFFFFFDA68 47EF8000 lw lr,[sp]
FFFFFFFFFFFFDA6C 37EF8010 ret #16
FFFFFFFFFFFFEB5C XP18:
FFFFFFFFFFFFEB5C 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFEB60 67EF8000 sw lr,[sp]
FFFFFFFFFFFFEB64 67E08008 sw r1,8[sp]
FFFFFFFFFFFFEB68 31FFFADE call EXPR2 ; do a second <EXPR2>
FFFFFFFFFFFFEB6C 47E10008 lw r2,8[sp]
FFFFFFFFFFFFEB70 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEB74 37EF8010 ret #16
; <EXPR2>::=(+ or -)<EXPR3>(+ or -)<EXPR3>(...
FFFFFFFFFFFFDA70 EXPR2:
FFFFFFFFFFFFDA70 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFDA74 67EF8000 sw lr,[sp]
FFFFFFFFFFFFDA78 E0C0002D setlo r3,#'-'
FFFFFFFFFFFFDA7C 9A025A90 lea r4,XP21
FFFFFFFFFFFFDA80 31FFF8F1 call TSTC ; negative sign?
FFFFFFFFFFFFDA84 E0400000 setlo r1,#0 ; yes, fake '0-'
FFFFFFFFFFFFDA88 67E00008 sw r0,8[sp]
FFFFFFFFFFFFDA8C BE00020A bra XP26
FFFFFFFFFFFFDA90 XP21:
FFFFFFFFFFFFDA90 E0C0002B setlo r3,#'+'
FFFFFFFFFFFFDA94 9A025A9C lea r4,XP22
FFFFFFFFFFFFDA98 31FFF8F1 call TSTC ; positive sign? ignore it
FFFFFFFFFFFFDA9C XP22:
FFFFFFFFFFFFDA9C 31FFF6B9 call EXPR3 ; first <EXPR3>
FFFFFFFFFFFFDAA0 XP23:
FFFFFFFFFFFFDAA0 67E08008 sw r1,8[sp] ; yes, save the value
FFFFFFFFFFFFDAA4 E0C0002B setlo r3,#'+'
FFFFFFFFFFFFDAA8 9A025AC0 lea r4,XP25
FFFFFFFFFFFFDAAC 31FFF8F1 call TSTC ; add?
FFFFFFFFFFFFDAB0 31FFF6B9 call EXPR3 ; get the second <EXPR3>
FFFFFFFFFFFFDAB4 XP24:
FFFFFFFFFFFFDAB4 47E10008 lw r2,8[sp]
FFFFFFFFFFFFDAB8 04110402 add r1,r1,r2 ; add it to the first <EXPR3>
FFFFFFFFFFFFEB78 EXPR2:
FFFFFFFFFFFFEB78 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFEB7C 67EF8000 sw lr,[sp]
FFFFFFFFFFFFEB80 E0C0002D setlo r3,#'-'
FFFFFFFFFFFFEB84 9A026B98 lea r4,XP21
FFFFFFFFFFFFEB88 31FFFD30 call TSTC ; negative sign?
FFFFFFFFFFFFEB8C E0400000 setlo r1,#0 ; yes, fake '0-'
FFFFFFFFFFFFEB90 67E00008 sw r0,8[sp]
FFFFFFFFFFFFEB94 BE00020A bra XP26
FFFFFFFFFFFFEB98 XP21:
FFFFFFFFFFFFEB98 E0C0002B setlo r3,#'+'
FFFFFFFFFFFFEB9C 9A026BA4 lea r4,XP22
FFFFFFFFFFFFEBA0 31FFFD30 call TSTC ; positive sign? ignore it
FFFFFFFFFFFFEBA4 XP22:
FFFFFFFFFFFFEBA4 31FFFAFB call EXPR3 ; first <EXPR3>
FFFFFFFFFFFFEBA8 XP23:
FFFFFFFFFFFFEBA8 67E08008 sw r1,8[sp] ; yes, save the value
FFFFFFFFFFFFEBAC E0C0002B setlo r3,#'+'
FFFFFFFFFFFFEBB0 9A026BC8 lea r4,XP25
FFFFFFFFFFFFEBB4 31FFFD30 call TSTC ; add?
FFFFFFFFFFFFEBB8 31FFFAFB call EXPR3 ; get the second <EXPR3>
FFFFFFFFFFFFEBBC XP24:
FFFFFFFFFFFFEBBC 47E10008 lw r2,8[sp]
FFFFFFFFFFFFEBC0 04110402 add r1,r1,r2 ; add it to the first <EXPR3>
; BVS.L QHOW brnch if there's an overflow
FFFFFFFFFFFFDABC BE007F2A bra XP23 ; else go back for more operations
FFFFFFFFFFFFDAC0 XP25:
FFFFFFFFFFFFDAC0 E0C0002D setlo r3,#'-'
FFFFFFFFFFFFDAC4 9A025AD8 lea r4,XP45
FFFFFFFFFFFFDAC8 31FFF8F1 call TSTC ; subtract?
FFFFFFFFFFFFDACC XP26:
FFFFFFFFFFFFDACC 31FFF6B9 call EXPR3 ; get second <EXPR3>
FFFFFFFFFFFFDAD0 02108006 neg r1,r1 ; change its sign
FFFFFFFFFFFFDAD4 BE007F0A bra XP24 ; and do an addition
FFFFFFFFFFFFDAD8 XP45:
FFFFFFFFFFFFDAD8 47E08008 lw r1,8[sp]
FFFFFFFFFFFFDADC 47EF8000 lw lr,[sp]
FFFFFFFFFFFFDAE0 37EF8010 ret #16
FFFFFFFFFFFFEBC4 BE007F2A bra XP23 ; else go back for more operations
FFFFFFFFFFFFEBC8 XP25:
FFFFFFFFFFFFEBC8 E0C0002D setlo r3,#'-'
FFFFFFFFFFFFEBCC 9A026BE0 lea r4,XP45
FFFFFFFFFFFFEBD0 31FFFD30 call TSTC ; subtract?
FFFFFFFFFFFFEBD4 XP26:
FFFFFFFFFFFFEBD4 31FFFAFB call EXPR3 ; get second <EXPR3>
FFFFFFFFFFFFEBD8 02108006 neg r1,r1 ; change its sign
FFFFFFFFFFFFEBDC BE007F0A bra XP24 ; and do an addition
FFFFFFFFFFFFEBE0 XP45:
FFFFFFFFFFFFEBE0 47E08008 lw r1,8[sp]
FFFFFFFFFFFFEBE4 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEBE8 37EF8010 ret #16
; <EXPR3>::=<EXPR4>( <* or /><EXPR4> )(...
FFFFFFFFFFFFDAE4 EXPR3:
FFFFFFFFFFFFDAE4 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFDAE8 67EF8000 sw lr,[sp]
FFFFFFFFFFFFDAEC 31FFF6CF call EXPR4 ; get first <EXPR4>
FFFFFFFFFFFFDAF0 XP31:
FFFFFFFFFFFFDAF0 67E08008 sw r1,8[sp] ; yes, save that first result
FFFFFFFFFFFFDAF4 E0C0002A setlo r3,#'*'
FFFFFFFFFFFFDAF8 9A025B10 lea r4,XP34
FFFFFFFFFFFFDAFC 31FFF8F1 call TSTC ; multiply?
FFFFFFFFFFFFDB00 31FFF6CF call EXPR4 ; get second <EXPR4>
FFFFFFFFFFFFDB04 47E10008 lw r2,8[sp]
FFFFFFFFFFFFDB08 04110419 muls r1,r1,r2 ; multiply the two
FFFFFFFFFFFFDB0C BE007F2A bra XP31 ; then look for more terms
FFFFFFFFFFFFDB10 XP34:
FFFFFFFFFFFFDB10 E0C0002F setlo r3,#'/'
FFFFFFFFFFFFDB14 9A025B30 lea r4,XP47
FFFFFFFFFFFFDB18 31FFF8F1 call TSTC ; divide?
FFFFFFFFFFFFDB1C 31FFF6CF call EXPR4 ; get second <EXPR4>
FFFFFFFFFFFFDB20 04100809 or r2,r1,r0
FFFFFFFFFFFFDB24 47E08008 lw r1,8[sp]
FFFFFFFFFFFFDB28 0411041B divs r1,r1,r2 ; do the division
FFFFFFFFFFFFDB2C BE007E2A bra XP31 ; go back for any more terms
FFFFFFFFFFFFDB30 XP47:
FFFFFFFFFFFFDB30 47E08008 lw r1,8[sp]
FFFFFFFFFFFFDB34 47EF8000 lw lr,[sp]
FFFFFFFFFFFFDB38 37EF8010 ret #16
FFFFFFFFFFFFEBEC EXPR3:
FFFFFFFFFFFFEBEC 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFEBF0 67EF8000 sw lr,[sp]
FFFFFFFFFFFFEBF4 31FFFB11 call EXPR4 ; get first <EXPR4>
FFFFFFFFFFFFEBF8 XP31:
FFFFFFFFFFFFEBF8 67E08008 sw r1,8[sp] ; yes, save that first result
FFFFFFFFFFFFEBFC E0C0002A setlo r3,#'*'
FFFFFFFFFFFFEC00 9A026C18 lea r4,XP34
FFFFFFFFFFFFEC04 31FFFD30 call TSTC ; multiply?
FFFFFFFFFFFFEC08 31FFFB11 call EXPR4 ; get second <EXPR4>
FFFFFFFFFFFFEC0C 47E10008 lw r2,8[sp]
FFFFFFFFFFFFEC10 04110419 muls r1,r1,r2 ; multiply the two
FFFFFFFFFFFFEC14 BE007F2A bra XP31 ; then look for more terms
FFFFFFFFFFFFEC18 XP34:
FFFFFFFFFFFFEC18 E0C0002F setlo r3,#'/'
FFFFFFFFFFFFEC1C 9A026C38 lea r4,XP47
FFFFFFFFFFFFEC20 31FFFD30 call TSTC ; divide?
FFFFFFFFFFFFEC24 31FFFB11 call EXPR4 ; get second <EXPR4>
FFFFFFFFFFFFEC28 04100809 or r2,r1,r0
FFFFFFFFFFFFEC2C 47E08008 lw r1,8[sp]
FFFFFFFFFFFFEC30 0411041B divs r1,r1,r2 ; do the division
FFFFFFFFFFFFEC34 BE007E2A bra XP31 ; go back for any more terms
FFFFFFFFFFFFEC38 XP47:
FFFFFFFFFFFFEC38 47E08008 lw r1,8[sp]
FFFFFFFFFFFFEC3C 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEC40 37EF8010 ret #16
; Functions are called through EXPR4
4172,45 → 5751,45
; <function>
; (<EXPR>)
FFFFFFFFFFFFDB3C EXPR4:
FFFFFFFFFFFFDB3C 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFDB40 67EF8000 sw lr,[sp]
FFFFFFFFFFFFDB44 9A04D042 lea r9,TAB4 ; find possible function
FFFFFFFFFFFFDB48 9A055150 lea r10,TAB4_1
FFFFFFFFFFFFDB4C 33FFF486 jmp EXEC ; branch to function which does subsequent ret for EXPR4
FFFFFFFFFFFFDB50 XP40: ; we get here if it wasn't a function
FFFFFFFFFFFFDB50 E0400000 setlo r1,#0
FFFFFFFFFFFFDB54 31FFF6EC call TSTV
FFFFFFFFFFFFDB58 BE100088 beq r1,r0,XP41 ; nor a variable
FFFFFFFFFFFFDB5C 46108000 lw r1,[r1] ; if a variable, return its value in r1
FFFFFFFFFFFFDB60 47EF8000 lw lr,[sp]
FFFFFFFFFFFFDB64 37EF8018 ret #24
FFFFFFFFFFFFDB68 XP41:
FFFFFFFFFFFFDB68 31FFF8FF call TSTNUM ; or is it a number?
FFFFFFFFFFFFDB6C BE200049 bne r2,r0,XP46 ; (if not, # of digits will be zero) if so, return it in r1
FFFFFFFFFFFFDB70 31FFF6DF call PARN ; check for (EXPR)
FFFFFFFFFFFFDB74 XP46:
FFFFFFFFFFFFDB74 47EF8000 lw lr,[sp]
FFFFFFFFFFFFDB78 37EF8018 ret #24
FFFFFFFFFFFFEC44 EXPR4:
FFFFFFFFFFFFEC44 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFEC48 67EF8000 sw lr,[sp]
FFFFFFFFFFFFEC4C 9A04E14E lea r9,TAB4 ; find possible function
FFFFFFFFFFFFEC50 9A056258 lea r10,TAB4_1
FFFFFFFFFFFFEC54 33FFF8C8 jmp EXEC ; branch to function which does subsequent ret for EXPR4
FFFFFFFFFFFFEC58 XP40: ; we get here if it wasn't a function
FFFFFFFFFFFFEC58 E0400000 setlo r1,#0
FFFFFFFFFFFFEC5C 31FFFB2E call TSTV
FFFFFFFFFFFFEC60 BE100088 beq r1,r0,XP41 ; nor a variable
FFFFFFFFFFFFEC64 46108000 lw r1,[r1] ; if a variable, return its value in r1
FFFFFFFFFFFFEC68 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEC6C 37EF8018 ret #24
FFFFFFFFFFFFEC70 XP41:
FFFFFFFFFFFFEC70 31FFFD3E call TSTNUM ; or is it a number?
FFFFFFFFFFFFEC74 BE200049 bne r2,r0,XP46 ; (if not, # of digits will be zero) if so, return it in r1
FFFFFFFFFFFFEC78 31FFFB21 call PARN ; check for (EXPR)
FFFFFFFFFFFFEC7C XP46:
FFFFFFFFFFFFEC7C 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEC80 37EF8018 ret #24
; Check for a parenthesized expression
FFFFFFFFFFFFDB7C PARN:
FFFFFFFFFFFFDB7C 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFDB80 67EF8000 sw lr,[sp]
FFFFFFFFFFFFDB84 E0C00028 setlo r3,#'('
FFFFFFFFFFFFDB88 9A025BA8 lea r4,XP43
FFFFFFFFFFFFDB8C 31FFF8F1 call TSTC ; else look for ( OREXPR )
FFFFFFFFFFFFDB90 31FFF63A call OREXPR
FFFFFFFFFFFFDB94 E0C00029 setlo r3,#')'
FFFFFFFFFFFFDB98 9A025BA8 lea r4,XP43
FFFFFFFFFFFFDB9C 31FFF8F1 call TSTC
FFFFFFFFFFFFDBA0 XP42:
FFFFFFFFFFFFDBA0 47EF8000 lw lr,[sp]
FFFFFFFFFFFFDBA4 37EF8008 ret #8
FFFFFFFFFFFFDBA8 XP43:
FFFFFFFFFFFFDBA8 9A00E5FD lea r1,msgWhat
FFFFFFFFFFFFDBAC BE001BAA bra ERROR
FFFFFFFFFFFFEC84 PARN:
FFFFFFFFFFFFEC84 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFEC88 67EF8000 sw lr,[sp]
FFFFFFFFFFFFEC8C E0C00028 setlo r3,#'('
FFFFFFFFFFFFEC90 9A026CB0 lea r4,XP43
FFFFFFFFFFFFEC94 31FFFD30 call TSTC ; else look for ( OREXPR )
FFFFFFFFFFFFEC98 31FFFA7C call OREXPR
FFFFFFFFFFFFEC9C E0C00029 setlo r3,#')'
FFFFFFFFFFFFECA0 9A026CB0 lea r4,XP43
FFFFFFFFFFFFECA4 31FFFD30 call TSTC
FFFFFFFFFFFFECA8 XP42:
FFFFFFFFFFFFECA8 47EF8000 lw lr,[sp]
FFFFFFFFFFFFECAC 37EF8008 ret #8
FFFFFFFFFFFFECB0 XP43:
FFFFFFFFFFFFECB0 9A00F6F5 lea r1,msgWhat
FFFFFFFFFFFFECB4 BE001BAA bra ERROR
; ===== Test for a valid variable name. Returns Z=1 if not
4221,105 → 5800,105
; Returns
; r1 = address of variable, zero if not found
FFFFFFFFFFFFDBB0 TSTV:
FFFFFFFFFFFFDBB0 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFDBB4 67EF8000 sw lr,[sp]
FFFFFFFFFFFFDBB8 67E28008 sw r5,8[sp]
FFFFFFFFFFFFDBBC 04101409 or r5,r1,r0 ; allocate flag
FFFFFFFFFFFFDBC0 31FFF914 call IGNBLK
FFFFFFFFFFFFDBC4 4A808000 lbu r1,[r8] ; look at the program text
FFFFFFFFFFFFDBC8 A0101740 blt r1,#'@',tstv_notfound ; C=1: not a variable
FFFFFFFFFFFFDBCC B2100F40 bne r1,#'@',TV1 ; brnch if not "@" array
FFFFFFFFFFFFDBD0 0A840001 addui r8,r8,#1 ; If it is, it should be
FFFFFFFFFFFFDBD4 31FFF6DF call PARN ; followed by (EXPR) as its index.
FFFFFFFFFFFFDBD8 06108600 shli r1,r1,#3
FFFFFFFFFFFFECB8 TSTV:
FFFFFFFFFFFFECB8 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFECBC 67EF8000 sw lr,[sp]
FFFFFFFFFFFFECC0 67E28008 sw r5,8[sp]
FFFFFFFFFFFFECC4 04101409 or r5,r1,r0 ; allocate flag
FFFFFFFFFFFFECC8 31FFFD55 call IGNBLK
FFFFFFFFFFFFECCC 4A808000 lbu r1,[r8] ; look at the program text
FFFFFFFFFFFFECD0 A0101740 blt r1,#'@',tstv_notfound ; C=1: not a variable
FFFFFFFFFFFFECD4 B2100F40 bne r1,#'@',TV1 ; brnch if not "@" array
FFFFFFFFFFFFECD8 0A840001 addui r8,r8,#1 ; If it is, it should be
FFFFFFFFFFFFECDC 31FFFB21 call PARN ; followed by (EXPR) as its index.
FFFFFFFFFFFFECE0 06108600 shli r1,r1,#3
; BCS.L QHOW say "How?" if index is too big
FFFFFFFFFFFFDBDC 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFDBE0 67E08008 sw r1,8[sp] ; save the index
FFFFFFFFFFFFDBE4 67EF8000 sw lr,[sp]
FFFFFFFFFFFFDBE8 31FFF793 call SIZEX ; get amount of free memory
FFFFFFFFFFFFDBEC 47EF8000 lw lr,[sp]
FFFFFFFFFFFFDBF0 47E10008 lw r2,8[sp] ; get back the index
FFFFFFFFFFFFDBF4 BE208044 bltu r2,r1,TV2 ; see if there's enough memory
FFFFFFFFFFFFDBF8 33FFF7C5 jmp QSORRY ; if not, say "Sorry"
FFFFFFFFFFFFDBFC TV2:
FFFFFFFFFFFFDBFC 9A0090D8 lea r1,VARBGN ; put address of array element...
FFFFFFFFFFFFDC00 04110405 subu r1,r1,r2 ; into r1 (neg. offset is used)
FFFFFFFFFFFFDC04 BE0000AA bra TSTVRT
FFFFFFFFFFFFDC08 TV1:
FFFFFFFFFFFFDC08 31FFF70D call getVarName ; get variable name
FFFFFFFFFFFFDC0C BE100068 beq r1,r0,TSTVRT ; if not, return r1=0
FFFFFFFFFFFFDC10 02510009 mov r2,r5
FFFFFFFFFFFFDC14 31FFF733 call findVar ; find or allocate
FFFFFFFFFFFFDC18 TSTVRT:
FFFFFFFFFFFFDC18 47E28008 lw r5,8[sp]
FFFFFFFFFFFFDC1C 47EF8000 lw lr,[sp]
FFFFFFFFFFFFDC20 37EF8018 ret #24 ; r1<>0 (found)
FFFFFFFFFFFFDC24 tstv_notfound:
FFFFFFFFFFFFDC24 47E28008 lw r5,8[sp]
FFFFFFFFFFFFDC28 47EF8000 lw lr,[sp]
FFFFFFFFFFFFDC2C E0400000 setlo r1,#0 ; r1=0 if not found
FFFFFFFFFFFFDC30 37EF8018 ret #24
FFFFFFFFFFFFECE4 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFECE8 67E08008 sw r1,8[sp] ; save the index
FFFFFFFFFFFFECEC 67EF8000 sw lr,[sp]
FFFFFFFFFFFFECF0 31FFFBD5 call SIZEX ; get amount of free memory
FFFFFFFFFFFFECF4 47EF8000 lw lr,[sp]
FFFFFFFFFFFFECF8 47E10008 lw r2,8[sp] ; get back the index
FFFFFFFFFFFFECFC BE208044 bltu r2,r1,TV2 ; see if there's enough memory
FFFFFFFFFFFFED00 33FFFC07 jmp QSORRY ; if not, say "Sorry"
FFFFFFFFFFFFED04 TV2:
FFFFFFFFFFFFED04 9A0090D8 lea r1,VARBGN ; put address of array element...
FFFFFFFFFFFFED08 04110405 subu r1,r1,r2 ; into r1 (neg. offset is used)
FFFFFFFFFFFFED0C BE0000AA bra TSTVRT
FFFFFFFFFFFFED10 TV1:
FFFFFFFFFFFFED10 31FFFB4F call getVarName ; get variable name
FFFFFFFFFFFFED14 BE100068 beq r1,r0,TSTVRT ; if not, return r1=0
FFFFFFFFFFFFED18 02510009 mov r2,r5
FFFFFFFFFFFFED1C 31FFFB75 call findVar ; find or allocate
FFFFFFFFFFFFED20 TSTVRT:
FFFFFFFFFFFFED20 47E28008 lw r5,8[sp]
FFFFFFFFFFFFED24 47EF8000 lw lr,[sp]
FFFFFFFFFFFFED28 37EF8018 ret #24 ; r1<>0 (found)
FFFFFFFFFFFFED2C tstv_notfound:
FFFFFFFFFFFFED2C 47E28008 lw r5,8[sp]
FFFFFFFFFFFFED30 47EF8000 lw lr,[sp]
FFFFFFFFFFFFED34 E0400000 setlo r1,#0 ; r1=0 if not found
FFFFFFFFFFFFED38 37EF8018 ret #24
; Returns
; r1 = 6 character variable name + type
;
FFFFFFFFFFFFDC34 getVarName:
FFFFFFFFFFFFDC34 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFDC38 67EF8000 sw lr,[sp]
FFFFFFFFFFFFDC3C 67E28010 sw r5,16[sp]
FFFFFFFFFFFFED3C getVarName:
FFFFFFFFFFFFED3C 0FEF0018 subui sp,sp,#24
FFFFFFFFFFFFED40 67EF8000 sw lr,[sp]
FFFFFFFFFFFFED44 67E28010 sw r5,16[sp]
FFFFFFFFFFFFDC40 40808000 lb r1,[r8] ; get first character
FFFFFFFFFFFFDC44 67E08008 sw r1,8[sp] ; save off current name
FFFFFFFFFFFFDC48 31FFF65C call isAlpha
FFFFFFFFFFFFDC4C BE100388 beq r1,r0,gvn1
FFFFFFFFFFFFDC50 E1400005 setlo r5,#5 ; loop six more times
FFFFFFFFFFFFED48 40808000 lb r1,[r8] ; get first character
FFFFFFFFFFFFED4C 67E08008 sw r1,8[sp] ; save off current name
FFFFFFFFFFFFED50 31FFFA9E call isAlpha
FFFFFFFFFFFFED54 BE100388 beq r1,r0,gvn1
FFFFFFFFFFFFED58 E1400005 setlo r5,#5 ; loop six more times
; check for second/third character
FFFFFFFFFFFFDC54 gvn4:
FFFFFFFFFFFFDC54 0A840001 addui r8,r8,#1
FFFFFFFFFFFFDC58 40808000 lb r1,[r8] ; do we have another char ?
FFFFFFFFFFFFDC5C 31FFF664 call isAlnum
FFFFFFFFFFFFDC60 BE100168 beq r1,r0,gvn2 ; nope
FFFFFFFFFFFFDC64 47E08008 lw r1,8[sp] ; get varname
FFFFFFFFFFFFDC68 06109000 shli r1,r1,#8
FFFFFFFFFFFFDC6C 40810000 lb r2,[r8]
FFFFFFFFFFFFDC70 04110409 or r1,r1,r2 ; add in new char
FFFFFFFFFFFFDC74 67E08008 sw r1,8[sp] ; save off name again
FFFFFFFFFFFFDC78 BE02FEEF loop r5,gvn4
FFFFFFFFFFFFED5C gvn4:
FFFFFFFFFFFFED5C 0A840001 addui r8,r8,#1
FFFFFFFFFFFFED60 40808000 lb r1,[r8] ; do we have another char ?
FFFFFFFFFFFFED64 31FFFAA6 call isAlnum
FFFFFFFFFFFFED68 BE100168 beq r1,r0,gvn2 ; nope
FFFFFFFFFFFFED6C 47E08008 lw r1,8[sp] ; get varname
FFFFFFFFFFFFED70 06109000 shli r1,r1,#8
FFFFFFFFFFFFED74 40810000 lb r2,[r8]
FFFFFFFFFFFFED78 04110409 or r1,r1,r2 ; add in new char
FFFFFFFFFFFFED7C 67E08008 sw r1,8[sp] ; save off name again
FFFFFFFFFFFFED80 BE02FEEF loop r5,gvn4
; now ignore extra variable name characters
FFFFFFFFFFFFDC7C gvn6:
FFFFFFFFFFFFDC7C 0A840001 addui r8,r8,#1
FFFFFFFFFFFFDC80 40808000 lb r1,[r8]
FFFFFFFFFFFFDC84 31FFF664 call isAlnum
FFFFFFFFFFFFDC88 BE107FA9 bne r1,r0,gvn6 ; keep looping as long as we have identifier chars
FFFFFFFFFFFFED84 gvn6:
FFFFFFFFFFFFED84 0A840001 addui r8,r8,#1
FFFFFFFFFFFFED88 40808000 lb r1,[r8]
FFFFFFFFFFFFED8C 31FFFAA6 call isAlnum
FFFFFFFFFFFFED90 BE107FA9 bne r1,r0,gvn6 ; keep looping as long as we have identifier chars
; check for a variable type
FFFFFFFFFFFFDC8C gvn2:
FFFFFFFFFFFFDC8C 40808000 lb r1,[r8]
FFFFFFFFFFFFDC90 B0100425 beq r1,#'%',gvn3
FFFFFFFFFFFFDC94 B0100324 beq r1,#'$',gvn3
FFFFFFFFFFFFDC98 E0400000 setlo r1,#0
FFFFFFFFFFFFDC9C 0E840001 subui r8,r8,#1
FFFFFFFFFFFFED94 gvn2:
FFFFFFFFFFFFED94 40808000 lb r1,[r8]
FFFFFFFFFFFFED98 B0100425 beq r1,#'%',gvn3
FFFFFFFFFFFFED9C B0100324 beq r1,#'$',gvn3
FFFFFFFFFFFFEDA0 E0400000 setlo r1,#0
FFFFFFFFFFFFEDA4 0E840001 subui r8,r8,#1
; insert variable type indicator and return
FFFFFFFFFFFFDCA0 gvn3:
FFFFFFFFFFFFDCA0 0A840001 addui r8,r8,#1
FFFFFFFFFFFFDCA4 47E10008 lw r2,8[sp]
FFFFFFFFFFFFDCA8 06211000 shli r2,r2,#8
FFFFFFFFFFFFDCAC 04110409 or r1,r1,r2 ; add in variable type
FFFFFFFFFFFFDCB0 47EF8000 lw lr,[sp]
FFFFFFFFFFFFDCB4 47E28010 lw r5,16[sp]
FFFFFFFFFFFFDCB8 37EF8018 ret #24 ; return Z = 0, r1 = varname
FFFFFFFFFFFFEDA8 gvn3:
FFFFFFFFFFFFEDA8 0A840001 addui r8,r8,#1
FFFFFFFFFFFFEDAC 47E10008 lw r2,8[sp]
FFFFFFFFFFFFEDB0 06211000 shli r2,r2,#8
FFFFFFFFFFFFEDB4 04110409 or r1,r1,r2 ; add in variable type
FFFFFFFFFFFFEDB8 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEDBC 47E28010 lw r5,16[sp]
FFFFFFFFFFFFEDC0 37EF8018 ret #24 ; return Z = 0, r1 = varname
; not a variable name
FFFFFFFFFFFFDCBC gvn1:
FFFFFFFFFFFFDCBC 47EF8000 lw lr,[sp]
FFFFFFFFFFFFDCC0 47E28010 lw r5,16[sp]
FFFFFFFFFFFFDCC4 E0400000 setlo r1,#0 ; return Z = 1 if not a varname
FFFFFFFFFFFFDCC8 37EF8018 ret #24
FFFFFFFFFFFFEDC4 gvn1:
FFFFFFFFFFFFEDC4 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEDC8 47E28010 lw r5,16[sp]
FFFFFFFFFFFFEDCC E0400000 setlo r1,#0 ; return Z = 1 if not a varname
FFFFFFFFFFFFEDD0 37EF8018 ret #24
; Find variable
4328,24 → 5907,24
; Returns
; r1 = variable address, Z =0 if found / allocated, Z=1 if not found
FFFFFFFFFFFFDCCC findVar:
FFFFFFFFFFFFDCCC 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFDCD0 67EF8000 sw lr,[sp]
FFFFFFFFFFFFDCD4 67E38008 sw r7,8[sp]
FFFFFFFFFFFFDCD8 460190D8 lw r3,VARBGN
FFFFFFFFFFFFDCDC fv4:
FFFFFFFFFFFFDCDC 46338000 lw r7,[r3] ; get varname / type
FFFFFFFFFFFFDCE0 BE700108 beq r7,r0,fv3 ; no more vars ?
FFFFFFFFFFFFDCE4 BE138128 beq r1,r7,fv1 ; match ?
FFFFFFFFFFFFDCE8 08318008 add r3,r3,#8 ; move to next var
FFFFFFFFFFFFDCEC 460390F8 lw r7,STKBOT
FFFFFFFFFFFFDCF0 BE33FF60 blt r3,r7,fv4 ; loop back to look at next var
FFFFFFFFFFFFEDD4 findVar:
FFFFFFFFFFFFEDD4 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFEDD8 67EF8000 sw lr,[sp]
FFFFFFFFFFFFEDDC 67E38008 sw r7,8[sp]
FFFFFFFFFFFFEDE0 460190D8 lw r3,VARBGN
FFFFFFFFFFFFEDE4 fv4:
FFFFFFFFFFFFEDE4 46338000 lw r7,[r3] ; get varname / type
FFFFFFFFFFFFEDE8 BE700108 beq r7,r0,fv3 ; no more vars ?
FFFFFFFFFFFFEDEC BE138128 beq r1,r7,fv1 ; match ?
FFFFFFFFFFFFEDF0 08318008 add r3,r3,#8 ; move to next var
FFFFFFFFFFFFEDF4 460390F8 lw r7,STKBOT
FFFFFFFFFFFFEDF8 BE33FF60 blt r3,r7,fv4 ; loop back to look at next var
; variable not found
; no more memory
FFFFFFFFFFFFDCF4 E07FE650 setlo r1,#<msgVarSpace
FFFFFFFFFFFFDCF8 F04FFFFF sethi r1,#>msgVarSpace
FFFFFFFFFFFFDCFC BE00112A bra ERROR
FFFFFFFFFFFFEDFC E07FF748 setlo r1,#<msgVarSpace
FFFFFFFFFFFFEE00 F04FFFFF sethi r1,#>msgVarSpace
FFFFFFFFFFFFEE04 BE00112A bra ERROR
; lw lr,[sp]
; lw r7,4[sp]
; add sp,sp,#8
4354,24 → 5933,24
; variable not found
; allocate new ?
FFFFFFFFFFFFDD00 fv3:
FFFFFFFFFFFFDD00 BE2000C8 beq r2,r0,fv2
FFFFFFFFFFFFDD04 66308000 sw r1,[r3] ; save varname / type
FFFFFFFFFFFFEE08 fv3:
FFFFFFFFFFFFEE08 BE2000C8 beq r2,r0,fv2
FFFFFFFFFFFFEE0C 66308000 sw r1,[r3] ; save varname / type
; found variable
; return address
FFFFFFFFFFFFDD08 fv1:
FFFFFFFFFFFFDD08 0A308008 addui r1,r3,#8
FFFFFFFFFFFFDD0C 47EF8000 lw lr,[sp]
FFFFFFFFFFFFDD10 47E38008 lw r7,8[sp]
FFFFFFFFFFFFDD14 37EF8010 ret #16 ; Z = 0, r1 = address
FFFFFFFFFFFFEE10 fv1:
FFFFFFFFFFFFEE10 0A308008 addui r1,r3,#8
FFFFFFFFFFFFEE14 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEE18 47E38008 lw r7,8[sp]
FFFFFFFFFFFFEE1C 37EF8010 ret #16 ; Z = 0, r1 = address
; didn't find var and not allocating
FFFFFFFFFFFFDD18 fv2:
FFFFFFFFFFFFDD18 47EF8000 lw lr,[sp]
FFFFFFFFFFFFDD1C 47E38008 lw r7,8[sp]
FFFFFFFFFFFFDD20 0BEF0010 addui sp,sp,#16 ; Z = 0, r1 = address
FFFFFFFFFFFFDD24 E0400000 setlo r1,#0 ; Z = 1, r1 = 0
FFFFFFFFFFFFDD28 37EF8000 ret
FFFFFFFFFFFFEE20 fv2:
FFFFFFFFFFFFEE20 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEE24 47E38008 lw r7,8[sp]
FFFFFFFFFFFFEE28 0BEF0010 addui sp,sp,#16 ; Z = 0, r1 = address
FFFFFFFFFFFFEE2C E0400000 setlo r1,#0 ; Z = 1, r1 = 0
FFFFFFFFFFFFEE30 37EF8000 ret
; ===== Multiplies the 32 bit values in r1 and r2, returning
4397,76 → 5976,76
; ===== The PEEK function returns the byte stored at the address
; contained in the following expression.
;
FFFFFFFFFFFFDD2C PEEK:
FFFFFFFFFFFFDD2C 31FFF6DF call PARN ; get the memory address
FFFFFFFFFFFFDD30 4A108000 lbu r1,[r1] ; get the addressed byte
FFFFFFFFFFFFDD34 47EF8000 lw lr,[sp] ; and return it
FFFFFFFFFFFFDD38 37EF8018 ret #24
FFFFFFFFFFFFEE34 PEEK:
FFFFFFFFFFFFEE34 31FFFB21 call PARN ; get the memory address
FFFFFFFFFFFFEE38 4A108000 lbu r1,[r1] ; get the addressed byte
FFFFFFFFFFFFEE3C 47EF8000 lw lr,[sp] ; and return it
FFFFFFFFFFFFEE40 37EF8018 ret #24
; ===== The PEEK function returns the byte stored at the address
; contained in the following expression.
;
FFFFFFFFFFFFDD3C PEEKC:
FFFFFFFFFFFFDD3C 31FFF6DF call PARN ; get the memory address
FFFFFFFFFFFFDD40 1410FFFE andi r1,r1,#-2 ; align to char address
FFFFFFFFFFFFDD44 4C108000 lcu r1,[r1] ; get the addressed char
FFFFFFFFFFFFDD48 47EF8000 lw lr,[sp] ; and return it
FFFFFFFFFFFFDD4C 37EF8018 ret #24
FFFFFFFFFFFFEE44 PEEKC:
FFFFFFFFFFFFEE44 31FFFB21 call PARN ; get the memory address
FFFFFFFFFFFFEE48 1410FFFE andi r1,r1,#-2 ; align to char address
FFFFFFFFFFFFEE4C 4C108000 lcu r1,[r1] ; get the addressed char
FFFFFFFFFFFFEE50 47EF8000 lw lr,[sp] ; and return it
FFFFFFFFFFFFEE54 37EF8018 ret #24
; ===== The PEEK function returns the byte stored at the address
; contained in the following expression.
;
FFFFFFFFFFFFDD50 PEEKH:
FFFFFFFFFFFFDD50 31FFF6DF call PARN ; get the memory address
FFFFFFFFFFFFDD54 1410FFFC andi r1,r1,#-4 ; align to half-word address
FFFFFFFFFFFFDD58 4E108000 lhu r1,[r1] ; get the addressed char
FFFFFFFFFFFFDD5C 47EF8000 lw lr,[sp] ; and return it
FFFFFFFFFFFFDD60 37EF8018 ret #24
FFFFFFFFFFFFEE58 PEEKH:
FFFFFFFFFFFFEE58 31FFFB21 call PARN ; get the memory address
FFFFFFFFFFFFEE5C 1410FFFC andi r1,r1,#-4 ; align to half-word address
FFFFFFFFFFFFEE60 4E108000 lhu r1,[r1] ; get the addressed char
FFFFFFFFFFFFEE64 47EF8000 lw lr,[sp] ; and return it
FFFFFFFFFFFFEE68 37EF8018 ret #24
; ===== The PEEK function returns the byte stored at the address
; contained in the following expression.
;
FFFFFFFFFFFFDD64 PEEKW:
FFFFFFFFFFFFDD64 31FFF6DF call PARN ; get the memory address
FFFFFFFFFFFFDD68 1410FFF8 andi r1,r1,#-8 ; align to word address
FFFFFFFFFFFFDD6C 46108000 lw r1,[r1] ; get the addressed word
FFFFFFFFFFFFDD70 47EF8000 lw lr,[sp] ; and return it
FFFFFFFFFFFFDD74 37EF8018 ret #24
FFFFFFFFFFFFEE6C PEEKW:
FFFFFFFFFFFFEE6C 31FFFB21 call PARN ; get the memory address
FFFFFFFFFFFFEE70 1410FFF8 andi r1,r1,#-8 ; align to word address
FFFFFFFFFFFFEE74 46108000 lw r1,[r1] ; get the addressed word
FFFFFFFFFFFFEE78 47EF8000 lw lr,[sp] ; and return it
FFFFFFFFFFFFEE7C 37EF8018 ret #24
; user function call
; call the user function with argument in r1
FFFFFFFFFFFFDD78 USRX:
FFFFFFFFFFFFDD78 31FFF6DF call PARN ; get expression value
FFFFFFFFFFFFDD7C 67E40008 sw r8,8[sp] ; save the text pointer
FFFFFFFFFFFFDD80 46011028 lw r2,usrJmp ; get usr vector
FFFFFFFFFFFFDD84 342F8000 jal r31,[r2] ; jump to the subroutine
FFFFFFFFFFFFDD88 47E40008 lw r8,8[sp] ; restore the text pointer
FFFFFFFFFFFFDD8C 47EF8000 lw lr,[sp]
FFFFFFFFFFFFDD90 37EF8018 ret #24
FFFFFFFFFFFFEE80 USRX:
FFFFFFFFFFFFEE80 31FFFB21 call PARN ; get expression value
FFFFFFFFFFFFEE84 67E40008 sw r8,8[sp] ; save the text pointer
FFFFFFFFFFFFEE88 46011028 lw r2,usrJmp ; get usr vector
FFFFFFFFFFFFEE8C 342F8000 jal r31,[r2] ; jump to the subroutine
FFFFFFFFFFFFEE90 47E40008 lw r8,8[sp] ; restore the text pointer
FFFFFFFFFFFFEE94 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEE98 37EF8018 ret #24
; ===== The RND function returns a random number from 1 to
; the value of the following expression in D0.
;
FFFFFFFFFFFFDD94 RND:
FFFFFFFFFFFFDD94 31FFF6DF call PARN ; get the upper limit
FFFFFFFFFFFFDD98 BE100168 beq r1,r0,rnd2 ; it must be positive and non-zero
FFFFFFFFFFFFDD9C BE100100 blt r1,r0,rnd1
FFFFFFFFFFFFDDA0 04100809 lw r2,r1
FFFFFFFFFFFFDDA4 00000050 gran ; generate a random number
FFFFFFFFFFFFDDA8 020088A8 mfspr r1,rand ; get the number
FFFFFFFFFFFFDDAC 31FFF775 call modu4 ; RND(n)=MOD(number,n)+1
FFFFFFFFFFFFDDB0 0A108001 addui r1,r1,#1
FFFFFFFFFFFFDDB4 47EF8000 lw lr,[sp]
FFFFFFFFFFFFDDB8 37EF8018 ret #24
FFFFFFFFFFFFDDBC rnd1:
FFFFFFFFFFFFDDBC 9A00E6C1 lea r1,msgRNDBad
FFFFFFFFFFFFDDC0 BE000B0A bra ERROR
FFFFFFFFFFFFDDC4 rnd2:
FFFFFFFFFFFFDDC4 00000050 gran
FFFFFFFFFFFFDDC8 020088A8 mfspr r1,rand
FFFFFFFFFFFFDDCC 47EF8000 lw lr,[sp]
FFFFFFFFFFFFDDD0 37EF8018 ret #24
FFFFFFFFFFFFEE9C RND:
FFFFFFFFFFFFEE9C 31FFFB21 call PARN ; get the upper limit
FFFFFFFFFFFFEEA0 BE100168 beq r1,r0,rnd2 ; it must be positive and non-zero
FFFFFFFFFFFFEEA4 BE100100 blt r1,r0,rnd1
FFFFFFFFFFFFEEA8 04100809 lw r2,r1
FFFFFFFFFFFFEEAC 00000050 gran ; generate a random number
FFFFFFFFFFFFEEB0 020088A8 mfspr r1,rand ; get the number
FFFFFFFFFFFFEEB4 31FFFBB7 call modu4 ; RND(n)=MOD(number,n)+1
FFFFFFFFFFFFEEB8 0A108001 addui r1,r1,#1
FFFFFFFFFFFFEEBC 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEEC0 37EF8018 ret #24
FFFFFFFFFFFFEEC4 rnd1:
FFFFFFFFFFFFEEC4 9A00F7B9 lea r1,msgRNDBad
FFFFFFFFFFFFEEC8 BE000B0A bra ERROR
FFFFFFFFFFFFEECC rnd2:
FFFFFFFFFFFFEECC 00000050 gran
FFFFFFFFFFFFEED0 020088A8 mfspr r1,rand
FFFFFFFFFFFFEED4 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEED8 37EF8018 ret #24
; r = a mod b
4473,57 → 6052,57
; a = r1
; b = r2
; r = r6
FFFFFFFFFFFFDDD4 modu4:
FFFFFFFFFFFFDDD4 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFDDD8 67E18000 sw r3,[sp]
FFFFFFFFFFFFDDDC 67E28008 sw r5,8[sp]
FFFFFFFFFFFFDDE0 67E30010 sw r6,16[sp]
FFFFFFFFFFFFDDE4 67E38018 sw r7,24[sp]
FFFFFFFFFFFFDDE8 1603803F lw r7,#63 ; n = 64
FFFFFFFFFFFFDDEC 0452940A xor r5,r5,r5 ; w = 0
FFFFFFFFFFFFDDF0 0463180A xor r6,r6,r6 ; r = 0
FFFFFFFFFFFFDDF4 mod2:
FFFFFFFFFFFFDDF4 06108202 roli r1,r1,#1 ; a <<= 1
FFFFFFFFFFFFDDF8 14118001 andi r3,r1,#1
FFFFFFFFFFFFDDFC 06630200 shli r6,r6,#1 ; r <<= 1
FFFFFFFFFFFFDE00 04619809 or r6,r6,r3
FFFFFFFFFFFFDE04 1410FFFE andi r1,r1,#-2
FFFFFFFFFFFFDE08 BE230047 bgtu r2,r6,mod1 ; b < r ?
FFFFFFFFFFFFDE0C 04611805 subu r6,r6,r2 ; r -= b
FFFFFFFFFFFFDE10 mod1:
FFFFFFFFFFFFDE10 BE03FF2F loop r7,mod2 ; n--
FFFFFFFFFFFFDE14 02608009 mov r1,r6
FFFFFFFFFFFFDE18 47E18000 lw r3,[sp]
FFFFFFFFFFFFDE1C 47E28008 lw r5,8[sp]
FFFFFFFFFFFFDE20 47E30010 lw r6,16[sp]
FFFFFFFFFFFFDE24 47E38018 lw r7,24[sp]
FFFFFFFFFFFFDE28 37EF8020 ret #32
FFFFFFFFFFFFEEDC modu4:
FFFFFFFFFFFFEEDC 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFEEE0 67E18000 sw r3,[sp]
FFFFFFFFFFFFEEE4 67E28008 sw r5,8[sp]
FFFFFFFFFFFFEEE8 67E30010 sw r6,16[sp]
FFFFFFFFFFFFEEEC 67E38018 sw r7,24[sp]
FFFFFFFFFFFFEEF0 1603803F lw r7,#63 ; n = 64
FFFFFFFFFFFFEEF4 0452940A xor r5,r5,r5 ; w = 0
FFFFFFFFFFFFEEF8 0463180A xor r6,r6,r6 ; r = 0
FFFFFFFFFFFFEEFC mod2:
FFFFFFFFFFFFEEFC 06108202 roli r1,r1,#1 ; a <<= 1
FFFFFFFFFFFFEF00 14118001 andi r3,r1,#1
FFFFFFFFFFFFEF04 06630200 shli r6,r6,#1 ; r <<= 1
FFFFFFFFFFFFEF08 04619809 or r6,r6,r3
FFFFFFFFFFFFEF0C 1410FFFE andi r1,r1,#-2
FFFFFFFFFFFFEF10 BE230047 bgtu r2,r6,mod1 ; b < r ?
FFFFFFFFFFFFEF14 04611805 subu r6,r6,r2 ; r -= b
FFFFFFFFFFFFEF18 mod1:
FFFFFFFFFFFFEF18 BE03FF2F loop r7,mod2 ; n--
FFFFFFFFFFFFEF1C 02608009 mov r1,r6
FFFFFFFFFFFFEF20 47E18000 lw r3,[sp]
FFFFFFFFFFFFEF24 47E28008 lw r5,8[sp]
FFFFFFFFFFFFEF28 47E30010 lw r6,16[sp]
FFFFFFFFFFFFEF2C 47E38018 lw r7,24[sp]
FFFFFFFFFFFFEF30 37EF8020 ret #32
; ===== The ABS function returns an absolute value in r2.
;
FFFFFFFFFFFFDE2C ABS:
FFFFFFFFFFFFDE2C 31FFF6DF call PARN ; get the following expr.'s value
FFFFFFFFFFFFDE30 02108007 abs r1,r1
FFFFFFFFFFFFDE34 47EF8000 lw lr,[sp]
FFFFFFFFFFFFDE38 37EF8018 ret #24
FFFFFFFFFFFFEF34 ABS:
FFFFFFFFFFFFEF34 31FFFB21 call PARN ; get the following expr.'s value
FFFFFFFFFFFFEF38 02108007 abs r1,r1
FFFFFFFFFFFFEF3C 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEF40 37EF8018 ret #24
; ===== The SGN function returns the sign in r1. +1,0, or -1
;
FFFFFFFFFFFFDE3C SGN:
FFFFFFFFFFFFDE3C 31FFF6DF call PARN ; get the following expr.'s value
FFFFFFFFFFFFDE40 02108008 sgn r1,r1
FFFFFFFFFFFFDE44 47EF8000 lw lr,[sp]
FFFFFFFFFFFFDE48 37EF8018 ret #24
FFFFFFFFFFFFEF44 SGN:
FFFFFFFFFFFFEF44 31FFFB21 call PARN ; get the following expr.'s value
FFFFFFFFFFFFEF48 02108008 sgn r1,r1
FFFFFFFFFFFFEF4C 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEF50 37EF8018 ret #24
; ===== The SIZE function returns the size of free memory in r1.
;
FFFFFFFFFFFFDE4C SIZEX:
FFFFFFFFFFFFDE4C 460090D8 lw r1,VARBGN ; get the number of free bytes...
FFFFFFFFFFFFDE50 460110D0 lw r2,TXTUNF ; between 'TXTUNF' and 'VARBGN'
FFFFFFFFFFFFDE54 04110405 subu r1,r1,r2
FFFFFFFFFFFFDE58 47EF8000 lw lr,[sp]
FFFFFFFFFFFFDE5C 37EF8018 ret #24 ; return the number in r2
FFFFFFFFFFFFEF54 SIZEX:
FFFFFFFFFFFFEF54 460090D8 lw r1,VARBGN ; get the number of free bytes...
FFFFFFFFFFFFEF58 460110D0 lw r2,TXTUNF ; between 'TXTUNF' and 'VARBGN'
FFFFFFFFFFFFEF5C 04110405 subu r1,r1,r2
FFFFFFFFFFFFEF60 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEF64 37EF8018 ret #24 ; return the number in r2
;******************************************************************
4560,47 → 6139,47
; returns
; r2 = variable's address
;
FFFFFFFFFFFFDE60 SETVAL:
FFFFFFFFFFFFDE60 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFDE64 67EF8000 sw lr,[sp]
FFFFFFFFFFFFDE68 E0400001 setlo r1,#1 ; allocate var
FFFFFFFFFFFFDE6C 31FFF6EC call TSTV ; variable name?
FFFFFFFFFFFFDE70 BE100069 bne r1,r0,sv2
FFFFFFFFFFFFDE74 9A00E6AA lea r1,msgVar
FFFFFFFFFFFFDE78 BE00054A bra ERROR
FFFFFFFFFFFFDE7C sv2:
FFFFFFFFFFFFDE7C 67E08008 sw r1,8[sp] ; save the variable's address
FFFFFFFFFFFFDE80 E0C0003D setlo r3,#'='
FFFFFFFFFFFFDE84 9A025EA4 lea r4,SV1
FFFFFFFFFFFFDE88 31FFF8F1 call TSTC ; get past the "=" sign
FFFFFFFFFFFFDE8C 31FFF63A call OREXPR ; evaluate the expression
FFFFFFFFFFFFDE90 47E10008 lw r2,8[sp] ; get back the variable's address
FFFFFFFFFFFFDE94 66208000 sw r1,[r2] ; and save value in the variable
FFFFFFFFFFFFDE98 04200409 lw r1,r2 ; return r1 = variable address
FFFFFFFFFFFFDE9C 47EF8000 lw lr,[sp]
FFFFFFFFFFFFDEA0 37EF8010 ret #16
FFFFFFFFFFFFDEA4 SV1:
FFFFFFFFFFFFDEA4 BE0003CA bra QWHAT ; if no "=" sign
FFFFFFFFFFFFEF68 SETVAL:
FFFFFFFFFFFFEF68 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFEF6C 67EF8000 sw lr,[sp]
FFFFFFFFFFFFEF70 E0400001 setlo r1,#1 ; allocate var
FFFFFFFFFFFFEF74 31FFFB2E call TSTV ; variable name?
FFFFFFFFFFFFEF78 BE100069 bne r1,r0,sv2
FFFFFFFFFFFFEF7C 9A00F7A2 lea r1,msgVar
FFFFFFFFFFFFEF80 BE00054A bra ERROR
FFFFFFFFFFFFEF84 sv2:
FFFFFFFFFFFFEF84 67E08008 sw r1,8[sp] ; save the variable's address
FFFFFFFFFFFFEF88 E0C0003D setlo r3,#'='
FFFFFFFFFFFFEF8C 9A026FAC lea r4,SV1
FFFFFFFFFFFFEF90 31FFFD30 call TSTC ; get past the "=" sign
FFFFFFFFFFFFEF94 31FFFA7C call OREXPR ; evaluate the expression
FFFFFFFFFFFFEF98 47E10008 lw r2,8[sp] ; get back the variable's address
FFFFFFFFFFFFEF9C 66208000 sw r1,[r2] ; and save value in the variable
FFFFFFFFFFFFEFA0 04200409 lw r1,r2 ; return r1 = variable address
FFFFFFFFFFFFEFA4 47EF8000 lw lr,[sp]
FFFFFFFFFFFFEFA8 37EF8010 ret #16
FFFFFFFFFFFFEFAC SV1:
FFFFFFFFFFFFEFAC BE0003CA bra QWHAT ; if no "=" sign
FFFFFFFFFFFFDEA8 FIN:
FFFFFFFFFFFFDEA8 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFDEAC 67EF8000 sw lr,[sp]
FFFFFFFFFFFFDEB0 E0C0003A setlo r3,#':'
FFFFFFFFFFFFDEB4 9A025EC4 lea r4,FI1
FFFFFFFFFFFFDEB8 31FFF8F1 call TSTC ; *** FIN ***
FFFFFFFFFFFFDEBC 0BEF0008 addui sp,sp,#8 ; if ":", discard return address
FFFFFFFFFFFFDEC0 BE0020AA bra RUNSML ; continue on the same line
FFFFFFFFFFFFDEC4 FI1:
FFFFFFFFFFFFDEC4 E0C0000D setlo r3,#CR
FFFFFFFFFFFFDEC8 9A025EDC lea r4,FI2
FFFFFFFFFFFFDECC 31FFF8F1 call TSTC ; not ":", is it a CR?
FFFFFFFFFFFFDED0 47EF8000 lw lr,[sp] ; else return to the caller
FFFFFFFFFFFFDED4 0BEF0008 addui sp,sp,#8 ; yes, purge return address
FFFFFFFFFFFFDED8 BE001EAA bra RUNNXL ; execute the next line
FFFFFFFFFFFFDEDC FI2:
FFFFFFFFFFFFDEDC 47EF8000 lw lr,[sp] ; else return to the caller
FFFFFFFFFFFFDEE0 37EF8008 ret #8
FFFFFFFFFFFFEFB0 FIN:
FFFFFFFFFFFFEFB0 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFEFB4 67EF8000 sw lr,[sp]
FFFFFFFFFFFFEFB8 E0C0003A setlo r3,#':'
FFFFFFFFFFFFEFBC 9A026FCC lea r4,FI1
FFFFFFFFFFFFEFC0 31FFFD30 call TSTC ; *** FIN ***
FFFFFFFFFFFFEFC4 0BEF0008 addui sp,sp,#8 ; if ":", discard return address
FFFFFFFFFFFFEFC8 BE0020AA bra RUNSML ; continue on the same line
FFFFFFFFFFFFEFCC FI1:
FFFFFFFFFFFFEFCC E0C0000D setlo r3,#CR
FFFFFFFFFFFFEFD0 9A026FE4 lea r4,FI2
FFFFFFFFFFFFEFD4 31FFFD30 call TSTC ; not ":", is it a CR?
FFFFFFFFFFFFEFD8 47EF8000 lw lr,[sp] ; else return to the caller
FFFFFFFFFFFFEFDC 0BEF0008 addui sp,sp,#8 ; yes, purge return address
FFFFFFFFFFFFEFE0 BE001EAA bra RUNNXL ; execute the next line
FFFFFFFFFFFFEFE4 FI2:
FFFFFFFFFFFFEFE4 47EF8000 lw lr,[sp] ; else return to the caller
FFFFFFFFFFFFEFE8 37EF8008 ret #8
; Check that there is nothing else on the line
4607,45 → 6186,45
; Registers Affected
; r1
;
FFFFFFFFFFFFDEE4 ENDCHK:
FFFFFFFFFFFFDEE4 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFDEE8 67EF8000 sw lr,[sp]
FFFFFFFFFFFFDEEC 31FFF914 call IGNBLK
FFFFFFFFFFFFDEF0 40808000 lb r1,[r8]
FFFFFFFFFFFFDEF4 B010040D beq r1,#CR,ec1 ; does it end with a CR?
FFFFFFFFFFFFDEF8 E07FE784 setlo r1,#<msgExtraChars
FFFFFFFFFFFFDEFC F04FFFFF sethi r1,#>msgExtraChars
FFFFFFFFFFFFDF00 33FFF7C8 jmp ERROR
FFFFFFFFFFFFDF04 ec1:
FFFFFFFFFFFFDF04 47EF8000 lw lr,[sp]
FFFFFFFFFFFFDF08 37EF8008 ret #8
FFFFFFFFFFFFEFEC ENDCHK:
FFFFFFFFFFFFEFEC 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFEFF0 67EF8000 sw lr,[sp]
FFFFFFFFFFFFEFF4 31FFFD55 call IGNBLK
FFFFFFFFFFFFEFF8 40808000 lb r1,[r8]
FFFFFFFFFFFFEFFC B010040D beq r1,#CR,ec1 ; does it end with a CR?
FFFFFFFFFFFFF000 E07FF87C setlo r1,#<msgExtraChars
FFFFFFFFFFFFF004 F04FFFFF sethi r1,#>msgExtraChars
FFFFFFFFFFFFF008 33FFFC0A jmp ERROR
FFFFFFFFFFFFF00C ec1:
FFFFFFFFFFFFF00C 47EF8000 lw lr,[sp]
FFFFFFFFFFFFF010 37EF8008 ret #8
FFFFFFFFFFFFDF0C TOOBIG:
FFFFFFFFFFFFDF0C 9A00E76F lea r1,msgTooBig
FFFFFFFFFFFFDF10 BE00008A bra ERROR
FFFFFFFFFFFFDF14 QSORRY:
FFFFFFFFFFFFDF14 9A00E605 lea r1,SRYMSG
FFFFFFFFFFFFDF18 BE00004A bra ERROR
FFFFFFFFFFFFDF1C QWHAT:
FFFFFFFFFFFFDF1C 9A00E5FD lea r1,msgWhat
FFFFFFFFFFFFDF20 ERROR:
FFFFFFFFFFFFDF20 31FFF940 call PRMESG ; display the error message
FFFFFFFFFFFFDF24 46009090 lw r1,CURRNT ; get the current line number
FFFFFFFFFFFFDF28 BE107E88 beq r1,r0,WSTART ; if zero, do a warm start
FFFFFFFFFFFFDF2C B01D9AFF beq r1,#-1,INPERR ; is the line no. pointer = -1? if so, redo input
FFFFFFFFFFFFDF30 40828000 lb r5,[r8] ; save the char. pointed to
FFFFFFFFFFFFDF34 60800000 sb r0,[r8] ; put a zero where the error is
FFFFFFFFFFFFDF38 46009090 lw r1,CURRNT ; point to start of current line
FFFFFFFFFFFFDF3C 31FFF8DF call PRTLN ; display the line in error up to the 0
FFFFFFFFFFFFDF40 04101809 or r6,r1,r0 ; save off end pointer
FFFFFFFFFFFFDF44 60828000 sb r5,[r8] ; restore the character
FFFFFFFFFFFFDF48 E040003F setlo r1,#'?' ; display a "?"
FFFFFFFFFFFFDF4C 31FFF393 call GOOUT
FFFFFFFFFFFFDF50 E0800000 setlo r2,#0 ; stop char = 0
FFFFFFFFFFFFDF54 0E608001 subui r1,r6,#1 ; point back to the error char.
FFFFFFFFFFFFDF58 31FFF851 call PRTSTG ; display the rest of the line
FFFFFFFFFFFFDF5C 33FFF3BE jmp WSTART ; and do a warm start
FFFFFFFFFFFFF014 TOOBIG:
FFFFFFFFFFFFF014 9A00F867 lea r1,msgTooBig
FFFFFFFFFFFFF018 BE00008A bra ERROR
FFFFFFFFFFFFF01C QSORRY:
FFFFFFFFFFFFF01C 9A00F6FD lea r1,SRYMSG
FFFFFFFFFFFFF020 BE00004A bra ERROR
FFFFFFFFFFFFF024 QWHAT:
FFFFFFFFFFFFF024 9A00F6F5 lea r1,msgWhat
FFFFFFFFFFFFF028 ERROR:
FFFFFFFFFFFFF028 31FFFD81 call PRMESG ; display the error message
FFFFFFFFFFFFF02C 46009090 lw r1,CURRNT ; get the current line number
FFFFFFFFFFFFF030 BE107EA8 beq r1,r0,WSTART ; if zero, do a warm start
FFFFFFFFFFFFF034 B01D9AFF beq r1,#-1,INPERR ; is the line no. pointer = -1? if so, redo input
FFFFFFFFFFFFF038 40828000 lb r5,[r8] ; save the char. pointed to
FFFFFFFFFFFFF03C 60800000 sb r0,[r8] ; put a zero where the error is
FFFFFFFFFFFFF040 46009090 lw r1,CURRNT ; point to start of current line
FFFFFFFFFFFFF044 31FFFD1E call PRTLN ; display the line in error up to the 0
FFFFFFFFFFFFF048 04101809 or r6,r1,r0 ; save off end pointer
FFFFFFFFFFFFF04C 60828000 sb r5,[r8] ; restore the character
FFFFFFFFFFFFF050 E040003F setlo r1,#'?' ; display a "?"
FFFFFFFFFFFFF054 31FFF7D5 call GOOUT
FFFFFFFFFFFFF058 E0800000 setlo r2,#0 ; stop char = 0
FFFFFFFFFFFFF05C 0E608001 subui r1,r6,#1 ; point back to the error char.
FFFFFFFFFFFFF060 31FFFC93 call PRTSTG ; display the rest of the line
FFFFFFFFFFFFF064 33FFF801 jmp WSTART ; and do a warm start
;******************************************************************
;
4660,66 → 6239,66
; and causes 'GETLN' to return.
;
;
FFFFFFFFFFFFDF60 GETLN:
FFFFFFFFFFFFDF60 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFDF64 67EF8000 sw lr,[sp]
FFFFFFFFFFFFDF68 67E28008 sw r5,8[sp]
FFFFFFFFFFFFDF6C 31FFF393 call GOOUT ; display the prompt
FFFFFFFFFFFFDF70 E0400001 setlo r1,#1 ; turn on cursor flash
FFFFFFFFFFFFDF74 60009046 sb r1,cursFlash
FFFFFFFFFFFFDF78 E0400020 setlo r1,#' ' ; and a space
FFFFFFFFFFFFDF7C 31FFF393 call GOOUT
FFFFFFFFFFFFDF80 E200111B setlo r8,#<BUFFER ; r8 is the buffer pointer
FFFFFFFFFFFFDF84 F2000000 sethi r8,#>BUFFER
FFFFFFFFFFFFDF88 GL1:
FFFFFFFFFFFFDF88 31FFF936 call CHKIO ; check keyboard
FFFFFFFFFFFFDF8C BE107FE8 beq r1,r0,GL1 ; wait for a char. to come in
FFFFFFFFFFFFDF90 B0100B08 beq r1,#CTRLH,GL3 ; delete last character? if so
FFFFFFFFFFFFDF94 B0101418 beq r1,#CTRLX,GL4 ; delete the whole line?
FFFFFFFFFFFFDF98 B010020D beq r1,#CR,GL2 ; accept a CR
FFFFFFFFFFFFDF9C A81FFB20 bltu r1,#' ',GL1 ; if other control char., discard it
FFFFFFFFFFFFDFA0 GL2:
FFFFFFFFFFFFDFA0 60808000 sb r1,[r8] ; save the char.
FFFFFFFFFFFFDFA4 08840001 add r8,r8,#1
FFFFFFFFFFFFDFA8 31FFF393 call GOOUT ; echo the char back out
FFFFFFFFFFFFDFAC 4080FFFF lb r1,-1[r8] ; get char back (GOOUT destroys r1)
FFFFFFFFFFFFDFB0 B010190D beq r1,#CR,GL7 ; if it's a CR, end the line
FFFFFFFFFFFFDFB4 1280916A cmpui r1,r8,#BUFFER+BUFLEN-1 ; any more room?
FFFFFFFFFFFFDFB8 BE107E80 blt r1,r0,GL1 ; yes: get some more, else delete last char.
FFFFFFFFFFFFDFBC GL3:
FFFFFFFFFFFFDFBC E0400008 setlo r1,#CTRLH ; delete a char. if possible
FFFFFFFFFFFFDFC0 31FFF393 call GOOUT
FFFFFFFFFFFFDFC4 E0400020 setlo r1,#' '
FFFFFFFFFFFFDFC8 31FFF393 call GOOUT
FFFFFFFFFFFFDFCC 1280911B cmpui r1,r8,#BUFFER ; any char.'s left?
FFFFFFFFFFFFDFD0 BE107DC2 ble r1,r0,GL1 ; if not
FFFFFFFFFFFFDFD4 E0400008 setlo r1,#CTRLH ; if so, finish the BS-space-BS sequence
FFFFFFFFFFFFDFD8 31FFF393 call GOOUT
FFFFFFFFFFFFDFDC 0C840001 sub r8,r8,#1 ; decrement the text pointer
FFFFFFFFFFFFDFE0 BE007D4A bra GL1 ; back for more
FFFFFFFFFFFFDFE4 GL4:
FFFFFFFFFFFFDFE4 04800409 or r1,r8,r0 ; delete the whole line
FFFFFFFFFFFFDFE8 0E12911B subui r5,r1,#BUFFER ; figure out how many backspaces we need
FFFFFFFFFFFFDFEC BE500108 beq r5,r0,GL6 ; if none needed, brnch
FFFFFFFFFFFFDFF0 GL5:
FFFFFFFFFFFFDFF0 E0400008 setlo r1,#CTRLH ; and display BS-space-BS sequences
FFFFFFFFFFFFDFF4 31FFF393 call GOOUT
FFFFFFFFFFFFDFF8 E0400020 setlo r1,#' '
FFFFFFFFFFFFDFFC 31FFF393 call GOOUT
FFFFFFFFFFFFE000 E0400008 setlo r1,#CTRLH
FFFFFFFFFFFFE004 31FFF393 call GOOUT
FFFFFFFFFFFFE008 BE02FF4F loop r5,GL5
FFFFFFFFFFFFE00C GL6:
FFFFFFFFFFFFE00C 9A04111B lea r8,BUFFER ; reinitialize the text pointer
FFFFFFFFFFFFE010 BE007BCA bra GL1 ; and go back for more
FFFFFFFFFFFFE014 GL7:
FFFFFFFFFFFFE014 E0400000 setlo r1,#0 ; turn off cursor flash
FFFFFFFFFFFFE018 60009046 sb r1,cursFlash
FFFFFFFFFFFFE01C E040000A setlo r1,#LF ; echo a LF for the CR
FFFFFFFFFFFFE020 31FFF393 call GOOUT
FFFFFFFFFFFFE024 47EF8000 lw lr,[sp]
FFFFFFFFFFFFE028 47E28008 lw r5,8[sp]
FFFFFFFFFFFFE02C 37EF8010 ret #16
FFFFFFFFFFFFF068 GETLN:
FFFFFFFFFFFFF068 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFF06C 67EF8000 sw lr,[sp]
FFFFFFFFFFFFF070 67E28008 sw r5,8[sp]
FFFFFFFFFFFFF074 31FFF7D5 call GOOUT ; display the prompt
FFFFFFFFFFFFF078 E0400001 setlo r1,#1 ; turn on cursor flash
FFFFFFFFFFFFF07C 60009052 sb r1,cursFlash
FFFFFFFFFFFFF080 E0400020 setlo r1,#' ' ; and a space
FFFFFFFFFFFFF084 31FFF7D5 call GOOUT
FFFFFFFFFFFFF088 E200111B setlo r8,#<BUFFER ; r8 is the buffer pointer
FFFFFFFFFFFFF08C F2000000 sethi r8,#>BUFFER
FFFFFFFFFFFFF090 GL1:
FFFFFFFFFFFFF090 31FFFD77 call CHKIO ; check keyboard
FFFFFFFFFFFFF094 BE107FE8 beq r1,r0,GL1 ; wait for a char. to come in
FFFFFFFFFFFFF098 B0100B08 beq r1,#CTRLH,GL3 ; delete last character? if so
FFFFFFFFFFFFF09C B0101418 beq r1,#CTRLX,GL4 ; delete the whole line?
FFFFFFFFFFFFF0A0 B010020D beq r1,#CR,GL2 ; accept a CR
FFFFFFFFFFFFF0A4 A81FFB20 bltu r1,#' ',GL1 ; if other control char., discard it
FFFFFFFFFFFFF0A8 GL2:
FFFFFFFFFFFFF0A8 60808000 sb r1,[r8] ; save the char.
FFFFFFFFFFFFF0AC 08840001 add r8,r8,#1
FFFFFFFFFFFFF0B0 31FFF7D5 call GOOUT ; echo the char back out
FFFFFFFFFFFFF0B4 4080FFFF lb r1,-1[r8] ; get char back (GOOUT destroys r1)
FFFFFFFFFFFFF0B8 B010190D beq r1,#CR,GL7 ; if it's a CR, end the line
FFFFFFFFFFFFF0BC 1280916A cmpui r1,r8,#BUFFER+BUFLEN-1 ; any more room?
FFFFFFFFFFFFF0C0 BE107E80 blt r1,r0,GL1 ; yes: get some more, else delete last char.
FFFFFFFFFFFFF0C4 GL3:
FFFFFFFFFFFFF0C4 E0400008 setlo r1,#CTRLH ; delete a char. if possible
FFFFFFFFFFFFF0C8 31FFF7D5 call GOOUT
FFFFFFFFFFFFF0CC E0400020 setlo r1,#' '
FFFFFFFFFFFFF0D0 31FFF7D5 call GOOUT
FFFFFFFFFFFFF0D4 1280911B cmpui r1,r8,#BUFFER ; any char.'s left?
FFFFFFFFFFFFF0D8 BE107DC2 ble r1,r0,GL1 ; if not
FFFFFFFFFFFFF0DC E0400008 setlo r1,#CTRLH ; if so, finish the BS-space-BS sequence
FFFFFFFFFFFFF0E0 31FFF7D5 call GOOUT
FFFFFFFFFFFFF0E4 0C840001 sub r8,r8,#1 ; decrement the text pointer
FFFFFFFFFFFFF0E8 BE007D4A bra GL1 ; back for more
FFFFFFFFFFFFF0EC GL4:
FFFFFFFFFFFFF0EC 04800409 or r1,r8,r0 ; delete the whole line
FFFFFFFFFFFFF0F0 0E12911B subui r5,r1,#BUFFER ; figure out how many backspaces we need
FFFFFFFFFFFFF0F4 BE500108 beq r5,r0,GL6 ; if none needed, brnch
FFFFFFFFFFFFF0F8 GL5:
FFFFFFFFFFFFF0F8 E0400008 setlo r1,#CTRLH ; and display BS-space-BS sequences
FFFFFFFFFFFFF0FC 31FFF7D5 call GOOUT
FFFFFFFFFFFFF100 E0400020 setlo r1,#' '
FFFFFFFFFFFFF104 31FFF7D5 call GOOUT
FFFFFFFFFFFFF108 E0400008 setlo r1,#CTRLH
FFFFFFFFFFFFF10C 31FFF7D5 call GOOUT
FFFFFFFFFFFFF110 BE02FF4F loop r5,GL5
FFFFFFFFFFFFF114 GL6:
FFFFFFFFFFFFF114 9A04111B lea r8,BUFFER ; reinitialize the text pointer
FFFFFFFFFFFFF118 BE007BCA bra GL1 ; and go back for more
FFFFFFFFFFFFF11C GL7:
FFFFFFFFFFFFF11C E0400000 setlo r1,#0 ; turn off cursor flash
FFFFFFFFFFFFF120 60009052 sb r1,cursFlash
FFFFFFFFFFFFF124 E040000A setlo r1,#LF ; echo a LF for the CR
FFFFFFFFFFFFF128 31FFF7D5 call GOOUT
FFFFFFFFFFFFF12C 47EF8000 lw lr,[sp]
FFFFFFFFFFFFF130 47E28008 lw r5,8[sp]
FFFFFFFFFFFFF134 37EF8010 ret #16
; 'FNDLN' finds a line with a given line no. (in r1) in the
4750,42 → 6329,42
; Parameters
; r1 = line number to find
;
FFFFFFFFFFFFE030 FNDLN:
FFFFFFFFFFFFE030 AC1003FF bleui r1,#0xFFFF,fl1 ; line no. must be < 65535
FFFFFFFFFFFFE034 9A00E694 lea r1,msgLineRange
FFFFFFFFFFFFE038 BE00774A bra ERROR
FFFFFFFFFFFFE03C fl1:
FFFFFFFFFFFFE03C 4604CE60 lw r9,TXTBGN ; init. the text save pointer
FFFFFFFFFFFFF138 FNDLN:
FFFFFFFFFFFFF138 AC1003FF bleui r1,#0xFFFF,fl1 ; line no. must be < 65535
FFFFFFFFFFFFF13C 9A00F78C lea r1,msgLineRange
FFFFFFFFFFFFF140 BE00774A bra ERROR
FFFFFFFFFFFFF144 fl1:
FFFFFFFFFFFFF144 4604DF68 lw r9,TXTBGN ; init. the text save pointer
FFFFFFFFFFFFE040 FNDLNP:
FFFFFFFFFFFFE040 460510D0 lw r10,TXTUNF ; check if we passed the end
FFFFFFFFFFFFE044 0EA50001 subui r10,r10,#1
FFFFFFFFFFFFE048 BE950127 bgtu r9,r10,FNDRET1 ; if so, return with r9=0,r1=0
FFFFFFFFFFFFE04C 4A918000 lbu r3,[r9] ; get low order byte of line number
FFFFFFFFFFFFE050 4A910001 lbu r2,1[r9] ; get high order byte
FFFFFFFFFFFFE054 06211000 shli r2,r2,#8
FFFFFFFFFFFFE058 04218809 or r2,r2,r3 ; build whole line number
FFFFFFFFFFFFE05C BE110127 bgtu r1,r2,FNDNXT ; is this the line we want? no, not there yet
FFFFFFFFFFFFE060 BE1100C8 beq r1,r2,FNDRET2
FFFFFFFFFFFFE064 FNDRET:
FFFFFFFFFFFFE064 0410840A xor r1,r1,r1 ; line not found, but r9=next line pointer
FFFFFFFFFFFFE068 37EF8000 ret ; return the cond. codes
FFFFFFFFFFFFE06C FNDRET1:
FFFFFFFFFFFFE06C 0494A40A xor r9,r9,r9 ; no higher line
FFFFFFFFFFFFE070 0410840A xor r1,r1,r1 ; line not found
FFFFFFFFFFFFE074 37EF8000 ret
FFFFFFFFFFFFE078 FNDRET2:
FFFFFFFFFFFFE078 E0400001 setlo r1,#1 ; line found
FFFFFFFFFFFFE07C 37EF8000 ret
FFFFFFFFFFFFF148 FNDLNP:
FFFFFFFFFFFFF148 460510D0 lw r10,TXTUNF ; check if we passed the end
FFFFFFFFFFFFF14C 0EA50001 subui r10,r10,#1
FFFFFFFFFFFFF150 BE950127 bgtu r9,r10,FNDRET1 ; if so, return with r9=0,r1=0
FFFFFFFFFFFFF154 4A918000 lbu r3,[r9] ; get low order byte of line number
FFFFFFFFFFFFF158 4A910001 lbu r2,1[r9] ; get high order byte
FFFFFFFFFFFFF15C 06211000 shli r2,r2,#8
FFFFFFFFFFFFF160 04218809 or r2,r2,r3 ; build whole line number
FFFFFFFFFFFFF164 BE110127 bgtu r1,r2,FNDNXT ; is this the line we want? no, not there yet
FFFFFFFFFFFFF168 BE1100C8 beq r1,r2,FNDRET2
FFFFFFFFFFFFF16C FNDRET:
FFFFFFFFFFFFF16C 0410840A xor r1,r1,r1 ; line not found, but r9=next line pointer
FFFFFFFFFFFFF170 37EF8000 ret ; return the cond. codes
FFFFFFFFFFFFF174 FNDRET1:
FFFFFFFFFFFFF174 0494A40A xor r9,r9,r9 ; no higher line
FFFFFFFFFFFFF178 0410840A xor r1,r1,r1 ; line not found
FFFFFFFFFFFFF17C 37EF8000 ret
FFFFFFFFFFFFF180 FNDRET2:
FFFFFFFFFFFFF180 E0400001 setlo r1,#1 ; line found
FFFFFFFFFFFFF184 37EF8000 ret
FFFFFFFFFFFFE080 FNDNXT:
FFFFFFFFFFFFE080 0A948002 addui r9,r9,#2 ; find the next line
FFFFFFFFFFFFF188 FNDNXT:
FFFFFFFFFFFFF188 0A948002 addui r9,r9,#2 ; find the next line
FFFFFFFFFFFFE084 FNDSKP:
FFFFFFFFFFFFE084 4A910000 lbu r2,[r9]
FFFFFFFFFFFFE088 0A948001 addui r9,r9,#1
FFFFFFFFFFFFE08C B22FFE0D bnei r2,#CR,FNDSKP ; try to find a CR, keep looking
FFFFFFFFFFFFE090 BE007D8A bra FNDLNP ; check if end of text
FFFFFFFFFFFFF18C FNDSKP:
FFFFFFFFFFFFF18C 4A910000 lbu r2,[r9]
FFFFFFFFFFFFF190 0A948001 addui r9,r9,#1
FFFFFFFFFFFFF194 B22FFE0D bnei r2,#CR,FNDSKP ; try to find a CR, keep looking
FFFFFFFFFFFFF198 BE007D8A bra FNDLNP ; check if end of text
;******************************************************************
4792,28 → 6371,28
; 'MVUP' moves a block up from where r1 points to where r2 points
; until r1=r3
;
FFFFFFFFFFFFE094 MVUP1:
FFFFFFFFFFFFE094 40120000 lb r4,[r1]
FFFFFFFFFFFFE098 60220000 sb r4,[r2]
FFFFFFFFFFFFE09C 08108001 add r1,r1,#1
FFFFFFFFFFFFE0A0 08210001 add r2,r2,#1
FFFFFFFFFFFFE0A4 MVUP:
FFFFFFFFFFFFE0A4 BE11FF89 bne r1,r3,MVUP1
FFFFFFFFFFFFE0A8 MVRET:
FFFFFFFFFFFFE0A8 37EF8000 ret
FFFFFFFFFFFFF19C MVUP1:
FFFFFFFFFFFFF19C 40120000 lb r4,[r1]
FFFFFFFFFFFFF1A0 60220000 sb r4,[r2]
FFFFFFFFFFFFF1A4 08108001 add r1,r1,#1
FFFFFFFFFFFFF1A8 08210001 add r2,r2,#1
FFFFFFFFFFFFF1AC MVUP:
FFFFFFFFFFFFF1AC BE11FF89 bne r1,r3,MVUP1
FFFFFFFFFFFFF1B0 MVRET:
FFFFFFFFFFFFF1B0 37EF8000 ret
; 'MVDOWN' moves a block down from where r1 points to where r2
; points until r1=r3
;
FFFFFFFFFFFFE0AC MVDOWN1:
FFFFFFFFFFFFE0AC 0C108001 sub r1,r1,#1
FFFFFFFFFFFFE0B0 0C210001 sub r2,r2,#1
FFFFFFFFFFFFE0B4 40120000 lb r4,[r1]
FFFFFFFFFFFFE0B8 60220000 sb r4,[r2]
FFFFFFFFFFFFE0BC MVDOWN:
FFFFFFFFFFFFE0BC BE11FF89 bne r1,r3,MVDOWN1
FFFFFFFFFFFFE0C0 37EF8000 ret
FFFFFFFFFFFFF1B4 MVDOWN1:
FFFFFFFFFFFFF1B4 0C108001 sub r1,r1,#1
FFFFFFFFFFFFF1B8 0C210001 sub r2,r2,#1
FFFFFFFFFFFFF1BC 40120000 lb r4,[r1]
FFFFFFFFFFFFF1C0 60220000 sb r4,[r2]
FFFFFFFFFFFFF1C4 MVDOWN:
FFFFFFFFFFFFF1C4 BE11FF89 bne r1,r3,MVDOWN1
FFFFFFFFFFFFF1C8 37EF8000 ret
; 'POPA' restores the 'FOR' loop variable save area from the stack
4824,44 → 6403,44
; case that no FOR loops need to be saved. This needs to be
; done because PUSHA / POPA is called all the time.
FFFFFFFFFFFFE0C4 POPA:
FFFFFFFFFFFFE0C4 47E08000 lw r1,[sp] ; restore LOPVAR, but zero means no more
FFFFFFFFFFFFE0C8 660090A8 sw r1,LOPVAR
FFFFFFFFFFFFE0CC BE100148 beq r1,r0,PP1
FFFFFFFFFFFFE0D0 47E08020 lw r1,32[sp] ; if not zero, restore the rest
FFFFFFFFFFFFE0D4 660090C8 sw r1,LOPPT
FFFFFFFFFFFFE0D8 47E08018 lw r1,24[sp]
FFFFFFFFFFFFE0DC 660090C0 sw r1,LOPLN
FFFFFFFFFFFFE0E0 47E08010 lw r1,16[sp]
FFFFFFFFFFFFE0E4 660090B8 sw r1,LOPLMT
FFFFFFFFFFFFE0E8 47E08008 lw r1,8[sp]
FFFFFFFFFFFFE0EC 660090B0 sw r1,LOPINC
FFFFFFFFFFFFE0F0 37EF8028 ret #40
FFFFFFFFFFFFE0F4 PP1:
FFFFFFFFFFFFE0F4 37EF8008 ret #8
FFFFFFFFFFFFF1CC POPA:
FFFFFFFFFFFFF1CC 47E08000 lw r1,[sp] ; restore LOPVAR, but zero means no more
FFFFFFFFFFFFF1D0 660090A8 sw r1,LOPVAR
FFFFFFFFFFFFF1D4 BE100148 beq r1,r0,PP1
FFFFFFFFFFFFF1D8 47E08020 lw r1,32[sp] ; if not zero, restore the rest
FFFFFFFFFFFFF1DC 660090C8 sw r1,LOPPT
FFFFFFFFFFFFF1E0 47E08018 lw r1,24[sp]
FFFFFFFFFFFFF1E4 660090C0 sw r1,LOPLN
FFFFFFFFFFFFF1E8 47E08010 lw r1,16[sp]
FFFFFFFFFFFFF1EC 660090B8 sw r1,LOPLMT
FFFFFFFFFFFFF1F0 47E08008 lw r1,8[sp]
FFFFFFFFFFFFF1F4 660090B0 sw r1,LOPINC
FFFFFFFFFFFFF1F8 37EF8028 ret #40
FFFFFFFFFFFFF1FC PP1:
FFFFFFFFFFFFF1FC 37EF8008 ret #8
FFFFFFFFFFFFE0F8 PUSHA:
FFFFFFFFFFFFE0F8 460090F8 lw r1,STKBOT ; Are we running out of stack room?
FFFFFFFFFFFFE0FC 0A108028 addui r1,r1,#40 ; we might need this many bytes
FFFFFFFFFFFFE100 BFE0F0A4 bltu sp,r1,QSORRY ; out of stack space
FFFFFFFFFFFFE104 460090A8 lw r1,LOPVAR ; save loop variables
FFFFFFFFFFFFE108 BE100188 beq r1,r0,PU1 ; if LOPVAR is zero, that's all
FFFFFFFFFFFFE10C 0FEF0028 subui sp,sp,#40
FFFFFFFFFFFFE110 67E08000 sw r1,[sp]
FFFFFFFFFFFFE114 460090C8 lw r1,LOPPT
FFFFFFFFFFFFE118 67E08020 sw r1,32[sp] ; else save all the others
FFFFFFFFFFFFE11C 460090C0 lw r1,LOPLN
FFFFFFFFFFFFE120 67E08018 sw r1,24[sp]
FFFFFFFFFFFFE124 460090B8 lw r1,LOPLMT
FFFFFFFFFFFFE128 67E08010 sw r1,16[sp]
FFFFFFFFFFFFE12C 460090B0 lw r1,LOPINC
FFFFFFFFFFFFE130 67E08008 sw r1,8[sp]
FFFFFFFFFFFFE134 37EF8000 ret
FFFFFFFFFFFFE138 PU1:
FFFFFFFFFFFFE138 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFE13C 67E08000 sw r1,[sp]
FFFFFFFFFFFFE140 37EF8000 ret
FFFFFFFFFFFFF200 PUSHA:
FFFFFFFFFFFFF200 460090F8 lw r1,STKBOT ; Are we running out of stack room?
FFFFFFFFFFFFF204 0A108028 addui r1,r1,#40 ; we might need this many bytes
FFFFFFFFFFFFF208 BFE0F0A4 bltu sp,r1,QSORRY ; out of stack space
FFFFFFFFFFFFF20C 460090A8 lw r1,LOPVAR ; save loop variables
FFFFFFFFFFFFF210 BE100188 beq r1,r0,PU1 ; if LOPVAR is zero, that's all
FFFFFFFFFFFFF214 0FEF0028 subui sp,sp,#40
FFFFFFFFFFFFF218 67E08000 sw r1,[sp]
FFFFFFFFFFFFF21C 460090C8 lw r1,LOPPT
FFFFFFFFFFFFF220 67E08020 sw r1,32[sp] ; else save all the others
FFFFFFFFFFFFF224 460090C0 lw r1,LOPLN
FFFFFFFFFFFFF228 67E08018 sw r1,24[sp]
FFFFFFFFFFFFF22C 460090B8 lw r1,LOPLMT
FFFFFFFFFFFFF230 67E08010 sw r1,16[sp]
FFFFFFFFFFFFF234 460090B0 lw r1,LOPINC
FFFFFFFFFFFFF238 67E08008 sw r1,8[sp]
FFFFFFFFFFFFF23C 37EF8000 ret
FFFFFFFFFFFFF240 PU1:
FFFFFFFFFFFFF240 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFF244 67E08000 sw r1,[sp]
FFFFFFFFFFFFF248 37EF8000 ret
;******************************************************************
4894,82 → 6473,79
; r2 = stop character
; return r1 = pointer to end of line + 1
FFFFFFFFFFFFE144 PRTSTG:
FFFFFFFFFFFFE144 0DEF0020 sub sp,sp,#32
FFFFFFFFFFFFE148 67E28000 sw r5,[sp]
FFFFFFFFFFFFE14C 67E28008 sw r5,8[sp]
FFFFFFFFFFFFE150 67E38010 sw r7,16[sp]
FFFFFFFFFFFFE154 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFE158 02128009 mov r5,r1 ; r5 = pointer
FFFFFFFFFFFFE15C 02230009 mov r6,r2 ; r6 = stop char
FFFFFFFFFFFFE160 PS1:
FFFFFFFFFFFFE160 4A538000 lbu r7,[r5] ; get a text character
FFFFFFFFFFFFE164 0A528001 addui r5,r5,#1
FFFFFFFFFFFFE168 BE7300C8 beq r7,r6,PRTRET ; same as stop character? if so, return
FFFFFFFFFFFFE16C 02708009 mov r1,r7
FFFFFFFFFFFFE170 31FFF393 call GOOUT ; display the char.
FFFFFFFFFFFFE174 B27FFB0D bnei r7,#CR,PS1 ; is it a C.R.? no, go back for more
FFFFFFFFFFFFE178 E040000A setlo r1,#LF ; yes, add a L.F.
FFFFFFFFFFFFE17C 31FFF393 call GOOUT
FFFFFFFFFFFFE180 PRTRET:
FFFFFFFFFFFFE180 02710009 mov r2,r7 ; return r2 = stop char
FFFFFFFFFFFFE184 02508009 mov r1,r5 ; return r1 = line pointer
FFFFFFFFFFFFE188 47EF8018 lw lr,24[sp]
FFFFFFFFFFFFE18C 47E38010 lw r7,16[sp]
FFFFFFFFFFFFE190 47E28008 lw r5,8[sp]
FFFFFFFFFFFFE194 47E28000 lw r5,[sp]
FFFFFFFFFFFFE198 37EF8020 ret #32 ; then return
FFFFFFFFFFFFF24C PRTSTG:
FFFFFFFFFFFFF24C 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFF250 67E28000 sw r5,[sp]
FFFFFFFFFFFFF254 67E28008 sw r5,8[sp]
FFFFFFFFFFFFF258 67E38010 sw r7,16[sp]
FFFFFFFFFFFFF25C 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFF260 02128009 mov r5,r1 ; r5 = pointer
FFFFFFFFFFFFF264 02230009 mov r6,r2 ; r6 = stop char
FFFFFFFFFFFFF268 PS1:
FFFFFFFFFFFFF268 4A538000 lbu r7,[r5] ; get a text character
FFFFFFFFFFFFF26C 0A528001 addui r5,r5,#1
FFFFFFFFFFFFF270 BE7300C8 beq r7,r6,PRTRET ; same as stop character? if so, return
FFFFFFFFFFFFF274 02708009 mov r1,r7
FFFFFFFFFFFFF278 31FFF7D5 call GOOUT ; display the char.
FFFFFFFFFFFFF27C B27FFB0D bnei r7,#CR,PS1 ; is it a C.R.? no, go back for more
FFFFFFFFFFFFF280 E040000A setlo r1,#LF ; yes, add a L.F.
FFFFFFFFFFFFF284 31FFF7D5 call GOOUT
FFFFFFFFFFFFF288 PRTRET:
FFFFFFFFFFFFF288 02710009 mov r2,r7 ; return r2 = stop char
FFFFFFFFFFFFF28C 02508009 mov r1,r5 ; return r1 = line pointer
FFFFFFFFFFFFF290 47EF8018 lw lr,24[sp]
FFFFFFFFFFFFF294 47E38010 lw r7,16[sp]
FFFFFFFFFFFFF298 47E28008 lw r5,8[sp]
FFFFFFFFFFFFF29C 47E28000 lw r5,[sp]
FFFFFFFFFFFFF2A0 37EF8020 ret #32 ; then return
FFFFFFFFFFFFE19C QTSTG:
FFFFFFFFFFFFE19C 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFE1A0 67EF8000 sw lr,[sp]
FFFFFFFFFFFFE1A4 E0C00022 setlo r3,#'"'
FFFFFFFFFFFFE1A8 E13FE1D0 setlo r4,#<QT3
FFFFFFFFFFFFE1AC F10FFFFF sethi r4,#>QT3
FFFFFFFFFFFFE1B0 31FFF8F1 call TSTC ; *** QTSTG ***
FFFFFFFFFFFFE1B4 E0800022 setlo r2,#'"' ; it is a "
FFFFFFFFFFFFE1B8 QT1:
FFFFFFFFFFFFE1B8 04800409 or r1,r8,r0
FFFFFFFFFFFFE1BC 31FFF851 call PRTSTG ; print until another
FFFFFFFFFFFFE1C0 04102009 lw r8,r1
FFFFFFFFFFFFE1C4 B2200F0A bne r2,#LF,QT2 ; was last one a CR?
FFFFFFFFFFFFE1C8 0BEF0008 addui sp,sp,#8
FFFFFFFFFFFFE1CC BE00070A bra RUNNXL ; if so, run next line
FFFFFFFFFFFFE1D0 QT3:
FFFFFFFFFFFFE1D0 E0C00027 setlo r3,#''''
FFFFFFFFFFFFE1D4 E13FE1E8 setlo r4,#<QT4
FFFFFFFFFFFFE1D8 F10FFFFF sethi r4,#>QT4
FFFFFFFFFFFFE1DC 31FFF8F1 call TSTC ; is it a single quote?
FFFFFFFFFFFFE1E0 E0800027 setlo r2,#'''' ; if so, do same as above
FFFFFFFFFFFFE1E4 BE007EAA bra QT1
FFFFFFFFFFFFE1E8 QT4:
FFFFFFFFFFFFE1E8 E0C0005F setlo r3,#'_'
FFFFFFFFFFFFE1EC E13FE20C setlo r4,#<QT5
FFFFFFFFFFFFE1F0 F10FFFFF sethi r4,#>QT5
FFFFFFFFFFFFE1F4 31FFF8F1 call TSTC ; is it an underline?
FFFFFFFFFFFFE1F8 E040000D setlo r1,#CR ; if so, output a CR without LF
FFFFFFFFFFFFE1FC 31FFF393 call GOOUT
FFFFFFFFFFFFE200 QT2:
FFFFFFFFFFFFE200 47EF8000 lw lr,[sp]
FFFFFFFFFFFFE204 0BEF0008 addui sp,sp,#8
FFFFFFFFFFFFE208 35F00004 jal r0,4[lr] ; skip over next i-word when returning
FFFFFFFFFFFFE20C QT5: ; not " ' or _
FFFFFFFFFFFFE20C 47EF8000 lw lr,[sp]
FFFFFFFFFFFFE210 37EF8008 ret #8
FFFFFFFFFFFFF2A4 QTSTG:
FFFFFFFFFFFFF2A4 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFF2A8 67EF8000 sw lr,[sp]
FFFFFFFFFFFFF2AC E0C00022 setlo r3,#'"'
FFFFFFFFFFFFF2B0 9A0272D4 lea r4,QT3
FFFFFFFFFFFFF2B4 31FFFD30 call TSTC ; *** QTSTG ***
FFFFFFFFFFFFF2B8 E0800022 setlo r2,#'"' ; it is a "
FFFFFFFFFFFFF2BC QT1:
FFFFFFFFFFFFF2BC 04800409 or r1,r8,r0
FFFFFFFFFFFFF2C0 31FFFC93 call PRTSTG ; print until another
FFFFFFFFFFFFF2C4 04102009 lw r8,r1
FFFFFFFFFFFFF2C8 B2200D0A bne r2,#LF,QT2 ; was last one a CR?
FFFFFFFFFFFFF2CC 0BEF0008 addui sp,sp,#8
FFFFFFFFFFFFF2D0 BE00072A bra RUNNXL ; if so, run next line
FFFFFFFFFFFFF2D4 QT3:
FFFFFFFFFFFFF2D4 E0C00027 setlo r3,#''''
FFFFFFFFFFFFF2D8 9A0272E8 lea r4,QT4
FFFFFFFFFFFFF2DC 31FFFD30 call TSTC ; is it a single quote?
FFFFFFFFFFFFF2E0 E0800027 setlo r2,#'''' ; if so, do same as above
FFFFFFFFFFFFF2E4 BE007ECA bra QT1
FFFFFFFFFFFFF2E8 QT4:
FFFFFFFFFFFFF2E8 E0C0005F setlo r3,#'_'
FFFFFFFFFFFFF2EC 9A027308 lea r4,QT5
FFFFFFFFFFFFF2F0 31FFFD30 call TSTC ; is it an underline?
FFFFFFFFFFFFF2F4 E040000D setlo r1,#CR ; if so, output a CR without LF
FFFFFFFFFFFFF2F8 31FFF7D5 call GOOUT
FFFFFFFFFFFFF2FC QT2:
FFFFFFFFFFFFF2FC 47EF8000 lw lr,[sp]
FFFFFFFFFFFFF300 0BEF0008 addui sp,sp,#8
FFFFFFFFFFFFF304 35F00004 jal r0,4[lr] ; skip over next i-word when returning
FFFFFFFFFFFFF308 QT5: ; not " ' or _
FFFFFFFFFFFFF308 47EF8000 lw lr,[sp]
FFFFFFFFFFFFF30C 37EF8008 ret #8
; Output a CR LF sequence
;
FFFFFFFFFFFFE214 prCRLF:
FFFFFFFFFFFFE214 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFE218 67EF8000 sw lr,[sp]
FFFFFFFFFFFFE21C E040000D setlo r1,#CR
FFFFFFFFFFFFE220 31FFF393 call GOOUT
FFFFFFFFFFFFE224 E040000A setlo r1,#LF
FFFFFFFFFFFFE228 31FFF393 call GOOUT
FFFFFFFFFFFFE22C 47EF8000 lw lr,[sp]
FFFFFFFFFFFFE230 37EF8008 ret #8
FFFFFFFFFFFFF310 prCRLF:
FFFFFFFFFFFFF310 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFF314 67EF8000 sw lr,[sp]
FFFFFFFFFFFFF318 E040000D setlo r1,#CR
FFFFFFFFFFFFF31C 31FFF7D5 call GOOUT
FFFFFFFFFFFFF320 E040000A setlo r1,#LF
FFFFFFFFFFFFF324 31FFF7D5 call GOOUT
FFFFFFFFFFFFF328 47EF8000 lw lr,[sp]
FFFFFFFFFFFFF32C 37EF8008 ret #8
; r1 = number to print
4976,132 → 6552,132
; r2 = number of digits
; Register Usage
; r5 = number of padding spaces
FFFFFFFFFFFFE234 PRTNUM:
FFFFFFFFFFFFE234 0FEF0028 subui sp,sp,#40
FFFFFFFFFFFFE238 67E18000 sw r3,[sp]
FFFFFFFFFFFFE23C 67E28008 sw r5,8[sp]
FFFFFFFFFFFFE240 67E30010 sw r6,16[sp]
FFFFFFFFFFFFE244 67E38018 sw r7,24[sp]
FFFFFFFFFFFFE248 67EF8020 sw lr,32[sp]
FFFFFFFFFFFFE24C 16039100 ori r7,r0,#NUMWKA ; r7 = pointer to numeric work area
FFFFFFFFFFFFE250 02130009 mov r6,r1 ; save number for later
FFFFFFFFFFFFE254 02228009 mov r5,r2 ; r5 = min number of chars
FFFFFFFFFFFFE258 BE100063 bgt r1,r0,PN1 ; is it negative? if not
FFFFFFFFFFFFE25C 02108006 neg r1,r1 ; else make it positive
FFFFFFFFFFFFE260 0E528001 subui r5,r5,#1 ; one less for width count
FFFFFFFFFFFFE264 PN1:
FFFFFFFFFFFFE264 1601800A lw r3,#10
FFFFFFFFFFFFE268 0411881C mod r2,r1,r3 ; r2 = r1 mod 10
FFFFFFFFFFFFE26C 1C10800A divui r1,r1,#10 ; r1 /= 10 divide by 10
FFFFFFFFFFFFE270 0A210030 addui r2,r2,#'0' ; convert remainder to ascii
FFFFFFFFFFFFE274 60710000 sb r2,[r7] ; and store in buffer
FFFFFFFFFFFFE278 0A738001 addui r7,r7,#1
FFFFFFFFFFFFE27C 0E528001 subui r5,r5,#1 ; decrement width
FFFFFFFFFFFFE280 BE107F29 bne r1,r0,PN1
FFFFFFFFFFFFE284 PN6:
FFFFFFFFFFFFE284 BE500082 ble r5,r0,PN4 ; test pad count, skip padding if not needed
FFFFFFFFFFFFE288 PN3:
FFFFFFFFFFFFE288 E0400020 setlo r1,#' ' ; display the required leading spaces
FFFFFFFFFFFFE28C 31FFF393 call GOOUT
FFFFFFFFFFFFE290 BE02FFCF loop r5,PN3
FFFFFFFFFFFFE294 PN4:
FFFFFFFFFFFFE294 BE600063 bgt r6,r0,PN5 ; is number negative?
FFFFFFFFFFFFE298 E040002D setlo r1,#'-' ; if so, display the sign
FFFFFFFFFFFFE29C 31FFF393 call GOOUT
FFFFFFFFFFFFE2A0 PN5:
FFFFFFFFFFFFE2A0 0E738001 subui r7,r7,#1
FFFFFFFFFFFFE2A4 40708000 lb r1,[r7] ; now unstack the digits and display
FFFFFFFFFFFFE2A8 31FFF393 call GOOUT
FFFFFFFFFFFFE2AC 12709100 cmpui r1,r7,#NUMWKA
FFFFFFFFFFFFE2B0 BE107F87 bgtu r1,r0,PN5
FFFFFFFFFFFFE2B4 PNRET:
FFFFFFFFFFFFE2B4 47EF8020 lw lr,32[sp]
FFFFFFFFFFFFE2B8 47E38018 lw r7,24[sp]
FFFFFFFFFFFFE2BC 47E30010 lw r6,16[sp]
FFFFFFFFFFFFE2C0 47E28008 lw r5,8[sp]
FFFFFFFFFFFFE2C4 47E18000 lw r3,[sp]
FFFFFFFFFFFFE2C8 37EF8028 ret #40
FFFFFFFFFFFFF330 PRTNUM:
FFFFFFFFFFFFF330 0FEF0028 subui sp,sp,#40
FFFFFFFFFFFFF334 67E18000 sw r3,[sp]
FFFFFFFFFFFFF338 67E28008 sw r5,8[sp]
FFFFFFFFFFFFF33C 67E30010 sw r6,16[sp]
FFFFFFFFFFFFF340 67E38018 sw r7,24[sp]
FFFFFFFFFFFFF344 67EF8020 sw lr,32[sp]
FFFFFFFFFFFFF348 9A039100 lea r7,NUMWKA ; r7 = pointer to numeric work area
FFFFFFFFFFFFF34C 02130009 mov r6,r1 ; save number for later
FFFFFFFFFFFFF350 02228009 mov r5,r2 ; r5 = min number of chars
FFFFFFFFFFFFF354 BE100063 bgt r1,r0,PN2 ; is it negative? if not
FFFFFFFFFFFFF358 02108006 neg r1,r1 ; else make it positive
FFFFFFFFFFFFF35C 0E528001 subui r5,r5,#1 ; one less for width count
FFFFFFFFFFFFF360 PN2:
FFFFFFFFFFFFF360 1601800A lw r3,#10
FFFFFFFFFFFFF364 PN1:
FFFFFFFFFFFFF364 0411881C modu r2,r1,r3 ; r2 = r1 mod 10
FFFFFFFFFFFFF368 1E10800A divui r1,r1,#10 ; r1 /= 10 divide by 10
FFFFFFFFFFFFF36C 0A210030 addui r2,r2,#'0' ; convert remainder to ascii
FFFFFFFFFFFFF370 60710000 sb r2,[r7] ; and store in buffer
FFFFFFFFFFFFF374 0A738001 addui r7,r7,#1
FFFFFFFFFFFFF378 0E528001 subui r5,r5,#1 ; decrement width
FFFFFFFFFFFFF37C BE107F49 bne r1,r0,PN1
FFFFFFFFFFFFF380 PN6:
FFFFFFFFFFFFF380 BE500082 ble r5,r0,PN4 ; test pad count, skip padding if not needed
FFFFFFFFFFFFF384 PN3:
FFFFFFFFFFFFF384 E0400020 setlo r1,#' ' ; display the required leading spaces
FFFFFFFFFFFFF388 31FFF7D5 call GOOUT
FFFFFFFFFFFFF38C BE02FFCF loop r5,PN3
FFFFFFFFFFFFF390 PN4:
FFFFFFFFFFFFF390 BE600061 bge r6,r0,PN5 ; is number negative?
FFFFFFFFFFFFF394 E040002D setlo r1,#'-' ; if so, display the sign
FFFFFFFFFFFFF398 31FFF7D5 call GOOUT
FFFFFFFFFFFFF39C PN5:
FFFFFFFFFFFFF39C 0E738001 subui r7,r7,#1
FFFFFFFFFFFFF3A0 40708000 lb r1,[r7] ; now unstack the digits and display
FFFFFFFFFFFFF3A4 31FFF7D5 call GOOUT
FFFFFFFFFFFFF3A8 12709100 cmpui r1,r7,#NUMWKA
FFFFFFFFFFFFF3AC BE107F87 bgtu r1,r0,PN5
FFFFFFFFFFFFF3B0 PNRET:
FFFFFFFFFFFFF3B0 47EF8020 lw lr,32[sp]
FFFFFFFFFFFFF3B4 47E38018 lw r7,24[sp]
FFFFFFFFFFFFF3B8 47E30010 lw r6,16[sp]
FFFFFFFFFFFFF3BC 47E28008 lw r5,8[sp]
FFFFFFFFFFFFF3C0 47E18000 lw r3,[sp]
FFFFFFFFFFFFF3C4 37EF8028 ret #40
; r1 = number to print
; r2 = number of digits
FFFFFFFFFFFFE2CC PRTHEXNUM:
FFFFFFFFFFFFE2CC 0FEF0028 subui sp,sp,#40
FFFFFFFFFFFFE2D0 67E28000 sw r5,[sp]
FFFFFFFFFFFFE2D4 67E30008 sw r6,8[sp]
FFFFFFFFFFFFE2D8 67E38010 sw r7,16[sp]
FFFFFFFFFFFFE2DC 67E40018 sw r8,24[sp]
FFFFFFFFFFFFE2E0 67EF8020 sw lr,32[sp]
FFFFFFFFFFFFE2E4 E1C01100 setlo r7,#<NUMWKA ; r7 = pointer to numeric work area
FFFFFFFFFFFFE2E8 F1C00000 sethi r7,#>NUMWKA
FFFFFFFFFFFFE2EC 04101809 or r6,r1,r0 ; save number for later
FFFFFFFFFFFFE2F0 E1400014 setlo r5,#20 ; r5 = min number of chars
FFFFFFFFFFFFE2F4 04101009 or r4,r1,r0
FFFFFFFFFFFFE2F8 BE400083 bgt r4,r0,PHN1 ; is it negative? if not
FFFFFFFFFFFFE2FC 02420006 neg r4,r4 ; else make it positive
FFFFFFFFFFFFE300 0C528001 sub r5,r5,#1 ; one less for width count
FFFFFFFFFFFFE304 E2000014 setlo r8,#20 ; maximum of 10 digits
FFFFFFFFFFFFE308 PHN1:
FFFFFFFFFFFFE308 04400409 or r1,r4,r0
FFFFFFFFFFFFE30C 1410800F andi r1,r1,#15
FFFFFFFFFFFFE310 A010030A blt r1,#10,PHN7
FFFFFFFFFFFFE314 0A108037 addui r1,r1,#'A'-10
FFFFFFFFFFFFE318 BE00004A bra PHN8
FFFFFFFFFFFFE31C PHN7:
FFFFFFFFFFFFE31C 08108030 add r1,r1,#'0' ; convert remainder to ascii
FFFFFFFFFFFFE320 PHN8:
FFFFFFFFFFFFE320 60708000 sb r1,[r7] ; and store in buffer
FFFFFFFFFFFFE324 08738001 add r7,r7,#1
FFFFFFFFFFFFE328 0C528001 sub r5,r5,#1 ; decrement width
FFFFFFFFFFFFE32C shru r4,r4,#4
FFFFFFFFFFFFE32C BE400048 beq r4,r0,PHN6 ; is it zero yet ?
FFFFFFFFFFFFE330 BE047ECF loop r8,PHN1 ; safety
FFFFFFFFFFFFE334 PHN6: ; test pad count
FFFFFFFFFFFFE334 BE500082 ble r5,r0,PHN4 ; skip padding if not needed
FFFFFFFFFFFFE338 PHN3:
FFFFFFFFFFFFE338 E0400020 setlo r1,#' ' ; display the required leading spaces
FFFFFFFFFFFFE33C 31FFF393 call GOOUT
FFFFFFFFFFFFE340 BE02FFCF loop r5,PHN3
FFFFFFFFFFFFE344 PHN4:
FFFFFFFFFFFFE344 BE600063 bgt r6,r0,PHN5 ; is number negative?
FFFFFFFFFFFFE348 E040002D setlo r1,#'-' ; if so, display the sign
FFFFFFFFFFFFE34C 31FFF393 call GOOUT
FFFFFFFFFFFFE350 PHN5:
FFFFFFFFFFFFE350 0C738001 sub r7,r7,#1
FFFFFFFFFFFFE354 40708000 lb r1,[r7] ; now unstack the digits and display
FFFFFFFFFFFFE358 31FFF393 call GOOUT
FFFFFFFFFFFFE35C 12709100 cmpui r1,r7,#NUMWKA
FFFFFFFFFFFFE360 BE107F83 bgt r1,r0,PHN5
FFFFFFFFFFFFE364 PHNRET:
FFFFFFFFFFFFE364 47EF8020 lw lr,32[sp]
FFFFFFFFFFFFE368 47E40018 lw r8,24[sp]
FFFFFFFFFFFFE36C 47E38010 lw r7,16[sp]
FFFFFFFFFFFFE370 47E30008 lw r6,8[sp]
FFFFFFFFFFFFE374 47E28000 lw r5,[sp]
FFFFFFFFFFFFE378 37EF8028 ret #40
FFFFFFFFFFFFF3C8 PRTHEXNUM:
FFFFFFFFFFFFF3C8 0FEF0028 subui sp,sp,#40
FFFFFFFFFFFFF3CC 67E28000 sw r5,[sp]
FFFFFFFFFFFFF3D0 67E30008 sw r6,8[sp]
FFFFFFFFFFFFF3D4 67E38010 sw r7,16[sp]
FFFFFFFFFFFFF3D8 67E40018 sw r8,24[sp]
FFFFFFFFFFFFF3DC 67EF8020 sw lr,32[sp]
FFFFFFFFFFFFF3E0 9A039100 lea r7,NUMWKA ; r7 = pointer to numeric work area
FFFFFFFFFFFFF3E4 04101809 or r6,r1,r0 ; save number for later
FFFFFFFFFFFFF3E8 E1400014 setlo r5,#20 ; r5 = min number of chars
FFFFFFFFFFFFF3EC 02120009 mov r4,r1
FFFFFFFFFFFFF3F0 BE400083 bgt r4,r0,PHN1 ; is it negative? if not
FFFFFFFFFFFFF3F4 02420006 neg r4,r4 ; else make it positive
FFFFFFFFFFFFF3F8 0E528001 subui r5,r5,#1 ; one less for width count
FFFFFFFFFFFFF3FC E2000014 setlo r8,#20 ; maximum of 10 digits
FFFFFFFFFFFFF400 PHN1:
FFFFFFFFFFFFF400 02408009 mov r1,r4
FFFFFFFFFFFFF404 1410800F andi r1,r1,#15
FFFFFFFFFFFFF408 A010030A blt r1,#10,PHN7
FFFFFFFFFFFFF40C 0A108037 addui r1,r1,#'A'-10
FFFFFFFFFFFFF410 BE00004A bra PHN8
FFFFFFFFFFFFF414 PHN7:
FFFFFFFFFFFFF414 08108030 add r1,r1,#'0' ; convert remainder to ascii
FFFFFFFFFFFFF418 PHN8:
FFFFFFFFFFFFF418 60708000 sb r1,[r7] ; and store in buffer
FFFFFFFFFFFFF41C 0A738001 addui r7,r7,#1
FFFFFFFFFFFFF420 0E528001 subui r5,r5,#1 ; decrement width
FFFFFFFFFFFFF424 06420801 shrui r4,r4,#4
FFFFFFFFFFFFF428 BE400048 beq r4,r0,PHN6 ; is it zero yet ?
FFFFFFFFFFFFF42C BE047EAF loop r8,PHN1 ; safety
FFFFFFFFFFFFF430 PHN6: ; test pad count
FFFFFFFFFFFFF430 BE500082 ble r5,r0,PHN4 ; skip padding if not needed
FFFFFFFFFFFFF434 PHN3:
FFFFFFFFFFFFF434 E0400020 setlo r1,#' ' ; display the required leading spaces
FFFFFFFFFFFFF438 31FFF7D5 call GOOUT
FFFFFFFFFFFFF43C BE02FFCF loop r5,PHN3
FFFFFFFFFFFFF440 PHN4:
FFFFFFFFFFFFF440 BE600063 bgt r6,r0,PHN5 ; is number negative?
FFFFFFFFFFFFF444 E040002D setlo r1,#'-' ; if so, display the sign
FFFFFFFFFFFFF448 31FFF7D5 call GOOUT
FFFFFFFFFFFFF44C PHN5:
FFFFFFFFFFFFF44C 0E738001 subui r7,r7,#1
FFFFFFFFFFFFF450 40708000 lb r1,[r7] ; now unstack the digits and display
FFFFFFFFFFFFF454 31FFF7D5 call GOOUT
FFFFFFFFFFFFF458 12709100 cmpui r1,r7,#NUMWKA
FFFFFFFFFFFFF45C BE107F83 bgt r1,r0,PHN5
FFFFFFFFFFFFF460 PHNRET:
FFFFFFFFFFFFF460 47EF8020 lw lr,32[sp]
FFFFFFFFFFFFF464 47E40018 lw r8,24[sp]
FFFFFFFFFFFFF468 47E38010 lw r7,16[sp]
FFFFFFFFFFFFF46C 47E30008 lw r6,8[sp]
FFFFFFFFFFFFF470 47E28000 lw r5,[sp]
FFFFFFFFFFFFF474 37EF8028 ret #40
; r1 = pointer to line
; returns r1 = pointer to end of line + 1
FFFFFFFFFFFFE37C PRTLN:
FFFFFFFFFFFFE37C 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFE380 67E28000 sw r5,[sp]
FFFFFFFFFFFFE384 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFE388 08128002 addi r5,r1,#2
FFFFFFFFFFFFE38C 4A50FFFE lbu r1,-2[r5] ; get the binary line number
FFFFFFFFFFFFE390 4A517FFF lbu r2,-1[r5]
FFFFFFFFFFFFE394 06211000 shli r2,r2,#8
FFFFFFFFFFFFE398 04110409 or r1,r1,r2
FFFFFFFFFFFFE39C E0800000 setlo r2,#0 ; display a 0 or more digit line no.
FFFFFFFFFFFFE3A0 31FFF88D call PRTNUM
FFFFFFFFFFFFE3A4 E0400020 setlo r1,#' ' ; followed by a blank
FFFFFFFFFFFFE3A8 31FFF393 call GOOUT
FFFFFFFFFFFFE3AC E0800000 setlo r2,#0 ; stop char. is a zero
FFFFFFFFFFFFE3B0 04500409 or r1,r5,r0
FFFFFFFFFFFFE3B4 31FFF851 call PRTSTG ; display the rest of the line
FFFFFFFFFFFFE3B8 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFE3BC 47E28000 lw r5,[sp]
FFFFFFFFFFFFE3C0 37EF8010 ret #16
FFFFFFFFFFFFF478 PRTLN:
FFFFFFFFFFFFF478 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFF47C 67E28000 sw r5,[sp]
FFFFFFFFFFFFF480 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFF484 08128002 addi r5,r1,#2
FFFFFFFFFFFFF488 4A50FFFE lbu r1,-2[r5] ; get the binary line number
FFFFFFFFFFFFF48C 4A517FFF lbu r2,-1[r5]
FFFFFFFFFFFFF490 06211000 shli r2,r2,#8
FFFFFFFFFFFFF494 04110409 or r1,r1,r2
FFFFFFFFFFFFF498 E0800000 setlo r2,#0 ; display a 0 or more digit line no.
FFFFFFFFFFFFF49C 31FFFCCC call PRTNUM
FFFFFFFFFFFFF4A0 E0400020 setlo r1,#' ' ; followed by a blank
FFFFFFFFFFFFF4A4 31FFF7D5 call GOOUT
FFFFFFFFFFFFF4A8 E0800000 setlo r2,#0 ; stop char. is a zero
FFFFFFFFFFFFF4AC 04500409 or r1,r5,r0
FFFFFFFFFFFFF4B0 31FFFC93 call PRTSTG ; display the rest of the line
FFFFFFFFFFFFF4B4 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFF4B8 47E28000 lw r5,[sp]
FFFFFFFFFFFFF4BC 37EF8010 ret #16
; ===== Test text byte following the call to this subroutine. If it
5114,22 → 6690,22
; Returns
; r8 = updated text pointer
;
FFFFFFFFFFFFE3C4 TSTC
FFFFFFFFFFFFE3C4 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFE3C8 67EF8000 sw lr,[sp]
FFFFFFFFFFFFE3CC 67E08008 sw r1,8[sp]
FFFFFFFFFFFFE3D0 31FFF914 call IGNBLK ; ignore leading blanks
FFFFFFFFFFFFE3D4 40808000 lb r1,[r8]
FFFFFFFFFFFFE3D8 BE3080A8 beq r3,r1,TC1 ; is it = to what r8 points to? if so
FFFFFFFFFFFFE3DC 47E08008 lw r1,8[sp]
FFFFFFFFFFFFE3E0 47EF8000 lw lr,[sp]
FFFFFFFFFFFFE3E4 0BEF0010 addui sp,sp,#16
FFFFFFFFFFFFE3E8 34400000 jal r0,[r4] ; jump to the routine
FFFFFFFFFFFFE3EC TC1:
FFFFFFFFFFFFE3EC 08840001 add r8,r8,#1 ; if equal, bump text pointer
FFFFFFFFFFFFE3F0 47E08008 lw r1,8[sp]
FFFFFFFFFFFFE3F4 47EF8000 lw lr,[sp]
FFFFFFFFFFFFE3F8 37EF8010 ret #16
FFFFFFFFFFFFF4C0 TSTC
FFFFFFFFFFFFF4C0 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFF4C4 67EF8000 sw lr,[sp]
FFFFFFFFFFFFF4C8 67E08008 sw r1,8[sp]
FFFFFFFFFFFFF4CC 31FFFD55 call IGNBLK ; ignore leading blanks
FFFFFFFFFFFFF4D0 40808000 lb r1,[r8]
FFFFFFFFFFFFF4D4 BE3080A8 beq r3,r1,TC1 ; is it = to what r8 points to? if so
FFFFFFFFFFFFF4D8 47E08008 lw r1,8[sp]
FFFFFFFFFFFFF4DC 47EF8000 lw lr,[sp]
FFFFFFFFFFFFF4E0 0BEF0010 addui sp,sp,#16
FFFFFFFFFFFFF4E4 34400000 jal r0,[r4] ; jump to the routine
FFFFFFFFFFFFF4E8 TC1:
FFFFFFFFFFFFF4E8 0A840001 addui r8,r8,#1 ; if equal, bump text pointer
FFFFFFFFFFFFF4EC 47E08008 lw r1,8[sp]
FFFFFFFFFFFFF4F0 47EF8000 lw lr,[sp]
FFFFFFFFFFFFF4F4 37EF8010 ret #16
; ===== See if the text pointed to by r8 is a number. If so,
; return the number in r2 and the number of digits in r3,
5141,31 → 6717,33
; r2 = number of digits in number
; r8 = updated text pointer
;
FFFFFFFFFFFFE3FC TSTNUM:
FFFFFFFFFFFFE3FC 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFE400 67EF8000 sw lr,[sp]
FFFFFFFFFFFFE404 31FFF914 call IGNBLK ; skip over blanks
FFFFFFFFFFFFE408 E0400000 setlo r1,#0 ; initialize return parameters
FFFFFFFFFFFFE40C E0800000 setlo r2,#0
FFFFFFFFFFFFE410 TN1:
FFFFFFFFFFFFE410 40818000 lb r3,[r8]
FFFFFFFFFFFFE414 A8300D30 bltui r3,#'0',TSNMRET ; is it less than zero?
FFFFFFFFFFFFE418 AE300C39 bgtui r3,#'9',TSNMRET ; is it greater than nine?
FFFFFFFFFFFFE41C E13FFFFF setlo r4,#0xFFFFFFFF
FFFFFFFFFFFFE420 F10FFFFF sethi r4,#0x07FFFFFF
FFFFFFFFFFFFE424 BE120066 bleu r1,r4,TN2 ; see if there's room for new digit
FFFFFFFFFFFFE428 E07FE629 setlo r1,msgNumTooBig
FFFFFFFFFFFFE42C BE0057AA bra ERROR ; if not, we've overflowd
FFFFFFFFFFFFE430 TN2:
FFFFFFFFFFFFE430 1A10800A mului r1,r1,#10 ; quickly multiply result by 10
FFFFFFFFFFFFE434 08840001 addi r8,r8,#1 ; adjust text pointer
FFFFFFFFFFFFE438 1431800F andi r3,r3,#0x0F ; add in the new digit
FFFFFFFFFFFFE43C 04118402 add r1,r1,r3
FFFFFFFFFFFFE440 08210001 addi r2,r2,#1 ; increment the no. of digits
FFFFFFFFFFFFE444 BE007E6A bra TN1
FFFFFFFFFFFFE448 TSNMRET:
FFFFFFFFFFFFE448 47EF8000 lw lr,[sp]
FFFFFFFFFFFFE44C 37EF8008 ret #8
FFFFFFFFFFFFF4F8 TSTNUM:
FFFFFFFFFFFFF4F8 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFF4FC 67EF8000 sw lr,[sp]
FFFFFFFFFFFFF500 31FFFD55 call IGNBLK ; skip over blanks
FFFFFFFFFFFFF504 E0400000 setlo r1,#0 ; initialize return parameters
FFFFFFFFFFFFF508 E0800000 setlo r2,#0
FFFFFFFFFFFFF50C TN1:
FFFFFFFFFFFFF50C 40818000 lb r3,[r8]
FFFFFFFFFFFFF510 A8300F30 bltui r3,#'0',TSNMRET ; is it less than zero?
FFFFFFFFFFFFF514 AE300E39 bgtui r3,#'9',TSNMRET ; is it greater than nine?
FFFFFFFFFFFFF518 E6BFFFFF ; SETLO
FFFFFFFFFFFFF51C EEBFFFFF ; SETMID
FFFFFFFFFFFFF520 F6807FFF ; SETHI
FFFFFFFFFFFFF524 040D1009 lw r4,#0x07FFFFFF_FFFFFFFF
FFFFFFFFFFFFF528 BE120066 bleu r1,r4,TN2 ; see if there's room for new digit
FFFFFFFFFFFFF52C 9A00F721 lea r1,msgNumTooBig
FFFFFFFFFFFFF530 BE0057CA bra ERROR ; if not, we've overflowd
FFFFFFFFFFFFF534 TN2:
FFFFFFFFFFFFF534 1A10800A mului r1,r1,#10 ; quickly multiply result by 10
FFFFFFFFFFFFF538 0A840001 addui r8,r8,#1 ; adjust text pointer
FFFFFFFFFFFFF53C 1431800F andi r3,r3,#0x0F ; add in the new digit
FFFFFFFFFFFFF540 04118403 addu r1,r1,r3
FFFFFFFFFFFFF544 0A210001 addui r2,r2,#1 ; increment the no. of digits
FFFFFFFFFFFFF548 BE007E2A bra TN1
FFFFFFFFFFFFF54C TSNMRET:
FFFFFFFFFFFFF54C 47EF8000 lw lr,[sp]
FFFFFFFFFFFFF550 37EF8008 ret #8
;===== Skip over blanks in the text pointed to by r8.
5175,19 → 6753,19
; Returns
; r8 = pointer updateded past any spaces or tabs
;
FFFFFFFFFFFFE450 IGNBLK:
FFFFFFFFFFFFE450 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFE454 67E08000 sw r1,[sp]
FFFFFFFFFFFFE458 IGB2:
FFFFFFFFFFFFE458 40808000 lb r1,[r8] ; get char
FFFFFFFFFFFFE45C B0100220 beqi r1,#' ',IGB1 ; see if it's a space
FFFFFFFFFFFFE460 B2100300 bnei r1,#'\t',IGBRET ; or a tab
FFFFFFFFFFFFE464 IGB1:
FFFFFFFFFFFFE464 08840001 add r8,r8,#1 ; increment the text pointer
FFFFFFFFFFFFE468 BE007F8A bra IGB2
FFFFFFFFFFFFE46C IGBRET:
FFFFFFFFFFFFE46C 47E08000 lw r1,[sp]
FFFFFFFFFFFFE470 37EF8008 ret #8
FFFFFFFFFFFFF554 IGNBLK:
FFFFFFFFFFFFF554 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFF558 67E08000 sw r1,[sp]
FFFFFFFFFFFFF55C IGB2:
FFFFFFFFFFFFF55C 40808000 lb r1,[r8] ; get char
FFFFFFFFFFFFF560 B0100220 beqi r1,#' ',IGB1 ; see if it's a space
FFFFFFFFFFFFF564 B2100300 bnei r1,#'\t',IGBRET ; or a tab
FFFFFFFFFFFFF568 IGB1:
FFFFFFFFFFFFF568 0A840001 addui r8,r8,#1 ; increment the text pointer
FFFFFFFFFFFFF56C BE007F8A bra IGB2
FFFFFFFFFFFFF570 IGBRET:
FFFFFFFFFFFFF570 47E08000 lw r1,[sp]
FFFFFFFFFFFFF574 37EF8008 ret #8
; ===== Convert the line of text in the input buffer to upper
5198,42 → 6776,42
; Returns
; r8 = pointing to end of text in buffer
;
FFFFFFFFFFFFE474 TOUPBUF:
FFFFFFFFFFFFE474 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFE478 67EF8000 sw lr,[sp]
FFFFFFFFFFFFE47C E200111B setlo r8,BUFFER ; set up text pointer
FFFFFFFFFFFFE480 E0C00000 setlo r3,#0 ; clear quote flag
FFFFFFFFFFFFE484 TOUPB1:
FFFFFFFFFFFFE484 40808000 lb r1,[r8] ; get the next text char.
FFFFFFFFFFFFE488 08840001 add r8,r8,#1
FFFFFFFFFFFFE48C B0100D0D beqi r1,#CR,TOUPBRT ; is it end of line?
FFFFFFFFFFFFE490 B0100622 beqi r1,#'"',DOQUO ; a double quote?
FFFFFFFFFFFFE494 B0100527 beqi r1,#'''',DOQUO ; or a single quote?
FFFFFFFFFFFFE498 BE307F69 bne r3,r0,TOUPB1 ; inside quotes?
FFFFFFFFFFFFE49C 31FFF932 call toUpper ; convert to upper case
FFFFFFFFFFFFE4A0 6080FFFF sb r1,-1[r8] ; store it
FFFFFFFFFFFFE4A4 BE007F0A bra TOUPB1 ; and go back for more
FFFFFFFFFFFFE4A8 DOQUO:
FFFFFFFFFFFFE4A8 BE300069 bne r3,r0,DOQUO1; are we inside quotes?
FFFFFFFFFFFFE4AC 04100C09 or r3,r1,r0 ; if not, toggle inside-quotes flag
FFFFFFFFFFFFE4B0 BE007EAA bra TOUPB1
FFFFFFFFFFFFE4B4 DOQUO1:
FFFFFFFFFFFFE4B4 BE30FE89 bne r3,r1,TOUPB1 ; make sure we're ending proper quote
FFFFFFFFFFFFE4B8 E0C00000 setlo r3,#0 ; else clear quote flag
FFFFFFFFFFFFE4BC BE007E4A bra TOUPB1
FFFFFFFFFFFFE4C0 TOUPBRT:
FFFFFFFFFFFFE4C0 47EF8000 lw lr,[sp]
FFFFFFFFFFFFE4C4 37EF8008 ret #8
FFFFFFFFFFFFF578 TOUPBUF:
FFFFFFFFFFFFF578 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFF57C 67EF8000 sw lr,[sp]
FFFFFFFFFFFFF580 9A04111B lea r8,BUFFER ; set up text pointer
FFFFFFFFFFFFF584 E0C00000 setlo r3,#0 ; clear quote flag
FFFFFFFFFFFFF588 TOUPB1:
FFFFFFFFFFFFF588 40808000 lb r1,[r8] ; get the next text char.
FFFFFFFFFFFFF58C 0A840001 addui r8,r8,#1
FFFFFFFFFFFFF590 B0100D0D beqi r1,#CR,TOUPBRT ; is it end of line?
FFFFFFFFFFFFF594 B0100622 beqi r1,#'"',DOQUO ; a double quote?
FFFFFFFFFFFFF598 B0100527 beqi r1,#'''',DOQUO ; or a single quote?
FFFFFFFFFFFFF59C BE307F69 bne r3,r0,TOUPB1 ; inside quotes?
FFFFFFFFFFFFF5A0 31FFFD73 call toUpper ; convert to upper case
FFFFFFFFFFFFF5A4 6080FFFF sb r1,-1[r8] ; store it
FFFFFFFFFFFFF5A8 BE007F0A bra TOUPB1 ; and go back for more
FFFFFFFFFFFFF5AC DOQUO:
FFFFFFFFFFFFF5AC BE300069 bne r3,r0,DOQUO1; are we inside quotes?
FFFFFFFFFFFFF5B0 02118009 mov r3,r1 ; if not, toggle inside-quotes flag
FFFFFFFFFFFFF5B4 BE007EAA bra TOUPB1
FFFFFFFFFFFFF5B8 DOQUO1:
FFFFFFFFFFFFF5B8 BE30FE89 bne r3,r1,TOUPB1 ; make sure we're ending proper quote
FFFFFFFFFFFFF5BC E0C00000 setlo r3,#0 ; else clear quote flag
FFFFFFFFFFFFF5C0 BE007E4A bra TOUPB1
FFFFFFFFFFFFF5C4 TOUPBRT:
FFFFFFFFFFFFF5C4 47EF8000 lw lr,[sp]
FFFFFFFFFFFFF5C8 37EF8008 ret #8
; ===== Convert the character in r1 to upper case
;
FFFFFFFFFFFFE4C8 toUpper
FFFFFFFFFFFFE4C8 A0100361 blt r1,#'a',TOUPRET ; is it < 'a'?
FFFFFFFFFFFFE4CC A610027A bgt r1,#'z',TOUPRET ; or > 'z'?
FFFFFFFFFFFFE4D0 0C108020 sub r1,r1,#32 ; if not, make it upper case
FFFFFFFFFFFFE4D4 TOUPRET
FFFFFFFFFFFFE4D4 37EF8000 ret
FFFFFFFFFFFFF5CC toUpper
FFFFFFFFFFFFF5CC A0100361 blti r1,#'a',TOUPRET ; is it < 'a'?
FFFFFFFFFFFFF5D0 A610027A bgti r1,#'z',TOUPRET ; or > 'z'?
FFFFFFFFFFFFF5D4 0E108020 subui r1,r1,#32 ; if not, make it upper case
FFFFFFFFFFFFF5D8 TOUPRET
FFFFFFFFFFFFF5D8 37EF8000 ret
; 'CHKIO' checks the input. If there's no input, it will return
5241,24 → 6819,24
; However, if a control-C is read, 'CHKIO' will warm-start BASIC and will
; not return to the caller.
;
FFFFFFFFFFFFE4D8 CHKIO:
FFFFFFFFFFFFE4D8 0FEF0008 subui sp,sp,#8 ; save link reg
FFFFFFFFFFFFE4DC 67EF8000 sw lr,[sp]
FFFFFFFFFFFFE4E0 31FFF394 call GOIN ; get input if possible
FFFFFFFFFFFFE4E4 B01003FF beq r1,#-1,CHKRET2 ; if Zero, no input
FFFFFFFFFFFFE4E8 B2100303 bnei r1,#CTRLC,CHKRET ; is it control-C?
FFFFFFFFFFFFE4EC 33FFF3BE jmp WSTART ; if so, do a warm start
FFFFFFFFFFFFE4F0 CHKRET2:
FFFFFFFFFFFFE4F0 0410840A xor r1,r1,r1
FFFFFFFFFFFFE4F4 CHKRET:
FFFFFFFFFFFFE4F4 47EF8000 lw lr,[sp] ;r1=0
FFFFFFFFFFFFE4F8 37EF8008 ret #8
FFFFFFFFFFFFF5DC CHKIO:
FFFFFFFFFFFFF5DC 0FEF0008 subui sp,sp,#8 ; save link reg
FFFFFFFFFFFFF5E0 67EF8000 sw lr,[sp]
FFFFFFFFFFFFF5E4 31FFF7D6 call GOIN ; get input if possible
FFFFFFFFFFFFF5E8 B01003FF beqi r1,#-1,CHKRET2 ; if Zero, no input
FFFFFFFFFFFFF5EC B2100303 bnei r1,#CTRLC,CHKRET ; is it control-C?
FFFFFFFFFFFFF5F0 33FFF801 jmp WSTART ; if so, do a warm start
FFFFFFFFFFFFF5F4 CHKRET2:
FFFFFFFFFFFFF5F4 0410840A xor r1,r1,r1
FFFFFFFFFFFFF5F8 CHKRET:
FFFFFFFFFFFFF5F8 47EF8000 lw lr,[sp] ;r1=0
FFFFFFFFFFFFF5FC 37EF8008 ret #8
; ===== Display a CR-LF sequence
;
FFFFFFFFFFFFE4FC CRLF:
FFFFFFFFFFFFE4FC E07FE60B setlo r1,CLMSG
FFFFFFFFFFFFF600 CRLF:
FFFFFFFFFFFFF600 E07FF703 setlo r1,CLMSG
; ===== Display a zero-ended string pointed to by register r1
5265,22 → 6843,22
; Registers Affected
; r1,r2,r4
;
FFFFFFFFFFFFE500 PRMESG:
FFFFFFFFFFFFE500 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFE504 67E28000 sw r5,[sp]
FFFFFFFFFFFFE508 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFE50C 02128009 mov r5,r1 ; r5 = pointer to message
FFFFFFFFFFFFE510 PRMESG1:
FFFFFFFFFFFFE510 08528001 add r5,r5,#1
FFFFFFFFFFFFE514 4050FFFF lb r1,-1[r5] ; get the char.
FFFFFFFFFFFFE518 BE100068 beq r1,r0,PRMRET
FFFFFFFFFFFFE51C 31FFF393 call GOOUT ;else display it trashes r4
FFFFFFFFFFFFE520 BE007F8A bra PRMESG1
FFFFFFFFFFFFE524 PRMRET:
FFFFFFFFFFFFE524 02508009 mov r1,r5
FFFFFFFFFFFFE528 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFE52C 47E28000 lw r5,[sp]
FFFFFFFFFFFFE530 37EF8010 ret #16
FFFFFFFFFFFFF604 PRMESG:
FFFFFFFFFFFFF604 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFF608 67E28000 sw r5,[sp]
FFFFFFFFFFFFF60C 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFF610 02128009 mov r5,r1 ; r5 = pointer to message
FFFFFFFFFFFFF614 PRMESG1:
FFFFFFFFFFFFF614 0A528001 addui r5,r5,#1
FFFFFFFFFFFFF618 4A50FFFF lbu r1,-1[r5] ; get the char.
FFFFFFFFFFFFF61C BE100068 beq r1,r0,PRMRET
FFFFFFFFFFFFF620 31FFF7D5 call GOOUT ;else display it trashes r4
FFFFFFFFFFFFF624 BE007F8A bra PRMESG1
FFFFFFFFFFFFF628 PRMRET:
FFFFFFFFFFFFF628 02508009 mov r1,r5
FFFFFFFFFFFFF62C 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFF630 47E28000 lw r5,[sp]
FFFFFFFFFFFFF634 37EF8010 ret #16
; ===== Display a zero-ended string pointed to by register r1
5287,22 → 6865,22
; Registers Affected
; r1,r2,r3
;
FFFFFFFFFFFFE534 PRMESGAUX:
FFFFFFFFFFFFE534 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFE538 67E28000 sw r5,[sp]
FFFFFFFFFFFFE53C 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFE540 02128009 mov r5,r1 ; r3 = pointer
FFFFFFFFFFFFE544 PRMESGA1:
FFFFFFFFFFFFE544 0A528001 addui r5,r5,#1
FFFFFFFFFFFFE548 4050FFFF lb r1,-1[r5] ; get the char.
FFFFFFFFFFFFE54C BE100068 beq r1,r0,PRMRETA
FFFFFFFFFFFFE550 31FFF395 call GOAUXO ;else display it
FFFFFFFFFFFFE554 BE007F8A bra PRMESGA1
FFFFFFFFFFFFE558 PRMRETA:
FFFFFFFFFFFFE558 02508009 mov r1,r5
FFFFFFFFFFFFE55C 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFE560 47E28000 lw r5,[sp]
FFFFFFFFFFFFE564 37EF8010 ret #16
FFFFFFFFFFFFF638 PRMESGAUX:
FFFFFFFFFFFFF638 0FEF0010 subui sp,sp,#16
FFFFFFFFFFFFF63C 67E28000 sw r5,[sp]
FFFFFFFFFFFFF640 67EF8008 sw lr,8[sp]
FFFFFFFFFFFFF644 02128009 mov r5,r1 ; r3 = pointer
FFFFFFFFFFFFF648 PRMESGA1:
FFFFFFFFFFFFF648 0A528001 addui r5,r5,#1
FFFFFFFFFFFFF64C 4050FFFF lb r1,-1[r5] ; get the char.
FFFFFFFFFFFFF650 BE100068 beq r1,r0,PRMRETA
FFFFFFFFFFFFF654 31FFF7D7 call GOAUXO ;else display it
FFFFFFFFFFFFF658 BE007F8A bra PRMESGA1
FFFFFFFFFFFFF65C PRMRETA:
FFFFFFFFFFFFF65C 02508009 mov r1,r5
FFFFFFFFFFFFF660 47EF8008 lw lr,8[sp]
FFFFFFFFFFFFF664 47E28000 lw r5,[sp]
FFFFFFFFFFFFF668 37EF8010 ret #16
;*****************************************************
; The following routines are the only ones that need *
5313,15 → 6891,15
; ===== Output character to the console (Port 1) from register r1
; (Preserves all registers.)
;
FFFFFFFFFFFFE568 OUTC:
FFFFFFFFFFFFE568 33FFEF47 jmp DisplayChar
FFFFFFFFFFFFF66C OUTC:
FFFFFFFFFFFFF66C 33FFF07F jmp DisplayChar
; ===== Input a character from the console into register D0 (or
; ===== Input a character from the console into register R1 (or
; return Zero status if there's no character available).
;
FFFFFFFFFFFFE56C INC:
FFFFFFFFFFFFE56C 33FFEE08 jmp KeybdGetChar
FFFFFFFFFFFFF670 INC:
FFFFFFFFFFFFF670 33FFEF07 jmp KeybdGetChar
;*
5328,115 → 6906,112
;* ===== Input a character from the host into register r1 (or
;* return Zero status if there's no character available).
;*
FFFFFFFFFFFFE570 AUXIN:
FFFFFFFFFFFFE570 31FFED54 call SerialGetChar
FFFFFFFFFFFFE574 B01003FF beqi r1,#-1,AXIRET_ZERO
FFFFFFFFFFFFE578 1410807F andi r1,r1,#0x7f ;zero out the high bit
FFFFFFFFFFFFE57C AXIRET:
FFFFFFFFFFFFE57C 37EF8000 ret
FFFFFFFFFFFFE580 AXIRET_ZERO:
FFFFFFFFFFFFE580 0410840A xor r1,r1,r1
FFFFFFFFFFFFE584 37EF8000 ret
FFFFFFFFFFFFF674 AUXIN:
FFFFFFFFFFFFF674 31FFEDA4 call SerialGetChar
FFFFFFFFFFFFF678 B01003FF beqi r1,#-1,AXIRET_ZERO
FFFFFFFFFFFFF67C 1410807F andi r1,r1,#0x7f ;zero out the high bit
FFFFFFFFFFFFF680 AXIRET:
FFFFFFFFFFFFF680 37EF8000 ret
FFFFFFFFFFFFF684 AXIRET_ZERO:
FFFFFFFFFFFFF684 0410840A xor r1,r1,r1
FFFFFFFFFFFFF688 37EF8000 ret
; ===== Output character to the host (Port 2) from register r1
; (Preserves all registers.)
;
FFFFFFFFFFFFE588 AUXOUT
FFFFFFFFFFFFE588 33FFED0C jmp SerialPutChar ; call boot rom routine
FFFFFFFFFFFFF68C AUXOUT
FFFFFFFFFFFFF68C 33FFED5C jmp SerialPutChar ; call boot rom routine
FFFFFFFFFFFFE58C _cls
FFFFFFFFFFFFE58C 31FFEED9 call clearScreen
FFFFFFFFFFFFE590 BE00740A bra FINISH
FFFFFFFFFFFFF690 _cls
FFFFFFFFFFFFF690 31FFF011 call clearScreen
FFFFFFFFFFFFF694 BE00742A bra FINISH
FFFFFFFFFFFFE594 _wait10
FFFFFFFFFFFFE594 37EF8000 ret
FFFFFFFFFFFFE598 _getATAStatus
FFFFFFFFFFFFE598 37EF8000 ret
FFFFFFFFFFFFE59C _waitCFNotBusy
FFFFFFFFFFFFE59C 37EF8000 ret
FFFFFFFFFFFFE5A0 _rdcf
FFFFFFFFFFFFE5A0 BE00738A br FINISH
FFFFFFFFFFFFE5A4 rdcf6
FFFFFFFFFFFFE5A4 BE004BEA br ERROR
FFFFFFFFFFFFF698 _wait10
FFFFFFFFFFFFF698 37EF8000 ret
FFFFFFFFFFFFF69C _getATAStatus
FFFFFFFFFFFFF69C 37EF8000 ret
FFFFFFFFFFFFF6A0 _waitCFNotBusy
FFFFFFFFFFFFF6A0 37EF8000 ret
FFFFFFFFFFFFF6A4 _rdcf
FFFFFFFFFFFFF6A4 BE0073AA br FINISH
FFFFFFFFFFFFF6A8 rdcf6
FFFFFFFFFFFFF6A8 BE004C0A br ERROR
; ===== Return to the resident monitor, operating system, etc.
;
FFFFFFFFFFFFE5A8 BYEBYE:
FFFFFFFFFFFFE5A8 460F1088 lw sp,OSSP
FFFFFFFFFFFFE5AC 47EF8000 lw lr,[sp]
FFFFFFFFFFFFE5B0 37EF8008 ret #8
FFFFFFFFFFFFF6AC BYEBYE:
FFFFFFFFFFFFF6AC 460F1088 lw sp,OSSP
FFFFFFFFFFFFF6B0 47EF8000 lw lr,[sp]
FFFFFFFFFFFFF6B4 37EF8008 ret #8
; MOVE.B #228,D7 return to Tutor
; TRAP #14
FFFFFFFFFFFFE5B0 C44E4100BCBD3CBD .align 16
FFFFFFFFFFFFE5B8 0000000000D24F00
FFFFFFFFFFFFE5C0 .align 16
FFFFFFFFFFFFE5C0 726F747061520A0D msgInit db CR,LF,"Raptor64 Tiny BASIC v1.0",CR,LF,"(C) 2012 Robert Finch",CR,LF,LF,0
FFFFFFFFFFFFE5C8 20796E6954203436
FFFFFFFFFFFFE5D0 3176204349534142
FFFFFFFFFFFFE5D8 202943280A0D302E
FFFFFFFFFFFFE5E0 6F52202032313032
FFFFFFFFFFFFE5E8 6E69462074726562
FFFFFFFFFFFFE5F0 0A0D000A0A0D6863 OKMSG db CR,LF,"OK",CR,LF,0
FFFFFFFFFFFFE5F8 616857000A0D4B4F msgWhat db "What?",CR,LF,0
FFFFFFFFFFFFE600 726F53000A0D3F74 SRYMSG db "Sorry."
FFFFFFFFFFFFE608 6F43000A0D2E7972 msgReadError db "Compact FLASH read error",CR,LF,0
FFFFFFFFFFFFE610 4C4620746361706D
FFFFFFFFFFFFE618 6461657220485341
FFFFFFFFFFFFE620 0A0D726F72726520
FFFFFFFFFFFFE628 207265626D754E00 msgNumTooBig db "Number is too big",CR,LF,0
FFFFFFFFFFFFE630 62206F6F74207369
FFFFFFFFFFFFE638 766944000A0D6769 msgDivZero db "Division by zero",CR,LF,0
FFFFFFFFFFFFE640 7962206E6F697369
FFFFFFFFFFFFE648 000A0D6F72657A20
FFFFFFFFFFFFE650 7620666F2074754F msgVarSpace db "Out of variable space",CR,LF,0
FFFFFFFFFFFFE658 20656C6261697261
FFFFFFFFFFFFE660 000A0D6563617073
FFFFFFFFFFFFE668 6620736574796220 msgBytesFree db " bytes free",CR,LF,0
FFFFFFFFFFFFE670 0A0D000A0D656572 msgReady db CR,LF,"Ready",CR,LF,0
FFFFFFFFFFFFE678 000A0D7964616552
FFFFFFFFFFFFE680 6E69746365707845 msgComma db "Expecting a comma",CR,LF,0
FFFFFFFFFFFFE688 6D6D6F6320612067
FFFFFFFFFFFFE690 656E694C000A0D61 msgLineRange db "Line number too big",CR,LF,0
FFFFFFFFFFFFE698 207265626D756E20
FFFFFFFFFFFFE6A0 0D676962206F6F74
FFFFFFFFFFFFE6A8 746365707845000A msgVar db "Expecting a variable",CR,LF,0
FFFFFFFFFFFFE6B0 6176206120676E69
FFFFFFFFFFFFE6B8 0A0D656C62616972
FFFFFFFFFFFFE6C0 64616220444E5200 msgRNDBad db "RND bad parameter",CR,LF,0
FFFFFFFFFFFFE6C8 74656D6172617020
FFFFFFFFFFFFE6D0 535953000A0D7265 msgSYSBad db "SYS bad address",CR,LF,0
FFFFFFFFFFFFE6D8 6464612064616220
FFFFFFFFFFFFE6E0 49000A0D73736572 msgInputVar db "INPUT expecting a variable",CR,LF,0
FFFFFFFFFFFFE6E8 707865205455504E
FFFFFFFFFFFFE6F0 6120676E69746365
FFFFFFFFFFFFE6F8 6C62616972617620
FFFFFFFFFFFFE700 5458454E000A0D65 msgNextFor db "NEXT without FOR",CR,LF,0
FFFFFFFFFFFFE708 74756F6874697720
FFFFFFFFFFFFE710 4E000A0D524F4620 msgNextVar db "NEXT expecting a defined variable",CR,LF,0
FFFFFFFFFFFFE718 6570786520545845
FFFFFFFFFFFFE720 206120676E697463
FFFFFFFFFFFFE728 2064656E69666564
FFFFFFFFFFFFE730 656C626169726176
FFFFFFFFFFFFE738 2F4F544F47000A0D msgBadGotoGosub db "GOTO/GOSUB bad line number",CR,LF,0
FFFFFFFFFFFFE740 6162204255534F47
FFFFFFFFFFFFE748 6E20656E696C2064
FFFFFFFFFFFFE750 000A0D7265626D75
FFFFFFFFFFFFE758 77204E5255544552 msgRetWoGosub db "RETURN without GOSUB",CR,LF,0
FFFFFFFFFFFFE760 472074756F687469
FFFFFFFFFFFFE768 50000A0D4255534F msgTooBig db "Program is too big",CR,LF,0
FFFFFFFFFFFFE770 69206D6172676F72
FFFFFFFFFFFFE778 6962206F6F742073
FFFFFFFFFFFFE780 72747845000A0D67 msgExtraChars db "Extra characters on line ignored",CR,LF,0
FFFFFFFFFFFFE788 6361726168632061
FFFFFFFFFFFFE790 206E6F2073726574
FFFFFFFFFFFFE798 6E676920656E696C
FFFFFFFFFFFFF6B8 726F747061520A0D msgInit db CR,LF,"Raptor64 Tiny BASIC v1.0",CR,LF,"(C) 2013 Robert Finch",CR,LF,LF,0
FFFFFFFFFFFFF6C0 20796E6954203436
FFFFFFFFFFFFF6C8 3176204349534142
FFFFFFFFFFFFF6D0 202943280A0D302E
FFFFFFFFFFFFF6D8 6F52202033313032
FFFFFFFFFFFFF6E0 6E69462074726562
FFFFFFFFFFFFF6E8 0A0D000A0A0D6863 OKMSG db CR,LF,"OK",CR,LF,0
FFFFFFFFFFFFF6F0 616857000A0D4B4F msgWhat db "What?",CR,LF,0
FFFFFFFFFFFFF6F8 726F53000A0D3F74 SRYMSG db "Sorry."
FFFFFFFFFFFFF700 6F43000A0D2E7972 msgReadError db "Compact FLASH read error",CR,LF,0
FFFFFFFFFFFFF708 4C4620746361706D
FFFFFFFFFFFFF710 6461657220485341
FFFFFFFFFFFFF718 0A0D726F72726520
FFFFFFFFFFFFF720 207265626D754E00 msgNumTooBig db "Number is too big",CR,LF,0
FFFFFFFFFFFFF728 62206F6F74207369
FFFFFFFFFFFFF730 766944000A0D6769 msgDivZero db "Division by zero",CR,LF,0
FFFFFFFFFFFFF738 7962206E6F697369
FFFFFFFFFFFFF740 000A0D6F72657A20
FFFFFFFFFFFFF748 7620666F2074754F msgVarSpace db "Out of variable space",CR,LF,0
FFFFFFFFFFFFF750 20656C6261697261
FFFFFFFFFFFFF758 000A0D6563617073
FFFFFFFFFFFFF760 6620736574796220 msgBytesFree db " bytes free",CR,LF,0
FFFFFFFFFFFFF768 0A0D000A0D656572 msgReady db CR,LF,"Ready",CR,LF,0
FFFFFFFFFFFFF770 000A0D7964616552
FFFFFFFFFFFFF778 6E69746365707845 msgComma db "Expecting a comma",CR,LF,0
FFFFFFFFFFFFF780 6D6D6F6320612067
FFFFFFFFFFFFF788 656E694C000A0D61 msgLineRange db "Line number too big",CR,LF,0
FFFFFFFFFFFFF790 207265626D756E20
FFFFFFFFFFFFF798 0D676962206F6F74
FFFFFFFFFFFFF7A0 746365707845000A msgVar db "Expecting a variable",CR,LF,0
FFFFFFFFFFFFF7A8 6176206120676E69
FFFFFFFFFFFFF7B0 0A0D656C62616972
FFFFFFFFFFFFF7B8 64616220444E5200 msgRNDBad db "RND bad parameter",CR,LF,0
FFFFFFFFFFFFF7C0 74656D6172617020
FFFFFFFFFFFFF7C8 535953000A0D7265 msgSYSBad db "SYS bad address",CR,LF,0
FFFFFFFFFFFFF7D0 6464612064616220
FFFFFFFFFFFFF7D8 49000A0D73736572 msgInputVar db "INPUT expecting a variable",CR,LF,0
FFFFFFFFFFFFF7E0 707865205455504E
FFFFFFFFFFFFF7E8 6120676E69746365
FFFFFFFFFFFFF7F0 6C62616972617620
FFFFFFFFFFFFF7F8 5458454E000A0D65 msgNextFor db "NEXT without FOR",CR,LF,0
FFFFFFFFFFFFF800 74756F6874697720
FFFFFFFFFFFFF808 4E000A0D524F4620 msgNextVar db "NEXT expecting a defined variable",CR,LF,0
FFFFFFFFFFFFF810 6570786520545845
FFFFFFFFFFFFF818 206120676E697463
FFFFFFFFFFFFF820 2064656E69666564
FFFFFFFFFFFFF828 656C626169726176
FFFFFFFFFFFFF830 2F4F544F47000A0D msgBadGotoGosub db "GOTO/GOSUB bad line number",CR,LF,0
FFFFFFFFFFFFF838 6162204255534F47
FFFFFFFFFFFFF840 6E20656E696C2064
FFFFFFFFFFFFF848 000A0D7265626D75
FFFFFFFFFFFFF850 77204E5255544552 msgRetWoGosub db "RETURN without GOSUB",CR,LF,0
FFFFFFFFFFFFF858 472074756F687469
FFFFFFFFFFFFF860 50000A0D4255534F msgTooBig db "Program is too big",CR,LF,0
FFFFFFFFFFFFF868 69206D6172676F72
FFFFFFFFFFFFF870 6962206F6F742073
FFFFFFFFFFFFF878 72747845000A0D67 msgExtraChars db "Extra characters on line ignored",CR,LF,0
FFFFFFFFFFFFF880 6361726168632061
FFFFFFFFFFFFF888 206E6F2073726574
FFFFFFFFFFFFF890 6E676920656E696C
FFFFFFFFFFFFE7A0 00000A0D6465726F align 8
FFFFFFFFFFFFE7A8 align 8
FFFFFFFFFFFFF898 00000A0D6465726F align 8
FFFFFFFFFFFFF8A0 align 8
LSTROM equ * ; end of possible ROM area
; END
5443,8 → 7018,8
;*
;* ===== Return to the resident monitor, operating system, etc.
;*
FFFFFFFFFFFFE7A8 BYEBYE:
FFFFFFFFFFFFE7A8 33FFF096 jmp Monitor
FFFFFFFFFFFFF8A0 BYEBYE:
FFFFFFFFFFFFF8A0 33FFF20A jmp Monitor
; MOVE.B #228,D7 ;return to Tutor
; TRAP #14
5452,280 → 7027,354
; Checkerboard RAM tester
;==============================================================================
;
FFFFFFFFFFFFE7AC code
FFFFFFFFFFFFE7A8 0000000033FFF096 align 16
FFFFFFFFFFFFE7B0 align 16
FFFFFFFFFFFFE7B0 ramtest:
FFFFFFFFFFFFE7B0 04002009 or r8,r0,r0 ; r8 = 0
FFFFFFFFFFFFE7B4 E6AA5555 ; SETLO
FFFFFFFFFFFFE7B8 EE9556AA ; SETMID
FFFFFFFFFFFFE7BC F68AAAA5 ; SETHI
FFFFFFFFFFFFE7C0 040D0409 ori r1,r0,#0xAAAA5555AAAA5555 ; checkerboard pattern
FFFFFFFFFFFFE7C4 ramtest2:
FFFFFFFFFFFFE7C4 66808000 sw r1,[r8] ; save the checkerboard to memory
FFFFFFFFFFFFE7C8 46810000 lw r2,[r8] ; read it back
FFFFFFFFFFFFE7CC 04110C06 cmp r3,r1,r2 ; is it the same ?
FFFFFFFFFFFFE7D0 BE3000C9 bne r3,r0,ramtest1
FFFFFFFFFFFFE7D4 0A840008 addui r8,r8,#8 ; increment RAM pointer
FFFFFFFFFFFFE7D8 E6800000 ; SETLO
FFFFFFFFFFFFE7DC EE800010 ; SETMID
FFFFFFFFFFFFE7E0 048D0C06 cmpi r3,r8,#0x0000_0000_0400_0000
FFFFFFFFFFFFE7E4 BE307F00 blt r3,r0,ramtest2
FFFFFFFFFFFFE7E8 ramtest1:
FFFFFFFFFFFFE7E8 04802809 or r10,r8,r0 ; r10 = max ram address
FFFFFFFFFFFFF8A4 code
FFFFFFFFFFFFF8A0 0000000033FFF20A align 16
FFFFFFFFFFFFF8A8 0000000000000000
FFFFFFFFFFFFF8B0 align 16
FFFFFFFFFFFFF8B0 ramtest:
FFFFFFFFFFFFF8B0 04002009 or r8,r0,r0 ; r8 = 0
FFFFFFFFFFFFF8B4 E6AA5555 ; SETLO
FFFFFFFFFFFFF8B8 EE9556AA ; SETMID
FFFFFFFFFFFFF8BC F68AAAA5 ; SETHI
FFFFFFFFFFFFF8C0 040D0409 ori r1,r0,#0xAAAA5555AAAA5555 ; checkerboard pattern
FFFFFFFFFFFFF8C4 ramtest2:
FFFFFFFFFFFFF8C4 66808000 sw r1,[r8] ; save the checkerboard to memory
FFFFFFFFFFFFF8C8 46810000 lw r2,[r8] ; read it back
FFFFFFFFFFFFF8CC 04110C06 cmp r3,r1,r2 ; is it the same ?
FFFFFFFFFFFFF8D0 BE3000C9 bne r3,r0,ramtest1
FFFFFFFFFFFFF8D4 0A840008 addui r8,r8,#8 ; increment RAM pointer
FFFFFFFFFFFFF8D8 E6800000 ; SETLO
FFFFFFFFFFFFF8DC EE800010 ; SETMID
FFFFFFFFFFFFF8E0 048D0C06 cmpi r3,r8,#0x0000_0000_0400_0000
FFFFFFFFFFFFF8E4 BE307F00 blt r3,r0,ramtest2
FFFFFFFFFFFFF8E8 ramtest1:
FFFFFFFFFFFFF8E8 04802809 or r10,r8,r0 ; r10 = max ram address
; readback the checkerboard pattern
FFFFFFFFFFFFE7EC 04002009 or r8,r0,r0 ; r8 = 0
FFFFFFFFFFFFE7F0 ramtest4:
FFFFFFFFFFFFE7F0 46810000 lw r2,[r8]
FFFFFFFFFFFFE7F4 E6AA5555 ; SETLO
FFFFFFFFFFFFE7F8 EE9556AA ; SETMID
FFFFFFFFFFFFE7FC F68AAAA5 ; SETHI
FFFFFFFFFFFFE800 042D0C06 cmpi r3,r2,#0xAAAA5555AAAA5555
FFFFFFFFFFFFE804 BE3000C9 bne r3,r0,ramtest3
FFFFFFFFFFFFE808 08840008 addi r8,r8,#8
FFFFFFFFFFFFE80C E6800000 ; SETLO
FFFFFFFFFFFFE810 EE800004 ; SETMID
FFFFFFFFFFFFE814 048D0C06 cmpi r3,r8,#0x0000_0000_0100_0000
FFFFFFFFFFFFE818 BE307EC0 blt r3,r0,ramtest4
FFFFFFFFFFFFE81C ramtest3:
FFFFFFFFFFFFE81C BE850389 bne r8,r10,ramtest8 ; check for equal maximum address
FFFFFFFFFFFFF8EC 04002009 or r8,r0,r0 ; r8 = 0
FFFFFFFFFFFFF8F0 ramtest4:
FFFFFFFFFFFFF8F0 46810000 lw r2,[r8]
FFFFFFFFFFFFF8F4 E6AA5555 ; SETLO
FFFFFFFFFFFFF8F8 EE9556AA ; SETMID
FFFFFFFFFFFFF8FC F68AAAA5 ; SETHI
FFFFFFFFFFFFF900 042D0C06 cmpi r3,r2,#0xAAAA5555AAAA5555
FFFFFFFFFFFFF904 BE3000C9 bne r3,r0,ramtest3
FFFFFFFFFFFFF908 08840008 addi r8,r8,#8
FFFFFFFFFFFFF90C E6800000 ; SETLO
FFFFFFFFFFFFF910 EE800004 ; SETMID
FFFFFFFFFFFFF914 048D0C06 cmpi r3,r8,#0x0000_0000_0100_0000
FFFFFFFFFFFFF918 BE307EC0 blt r3,r0,ramtest4
FFFFFFFFFFFFF91C ramtest3:
FFFFFFFFFFFFF91C BE850389 bne r8,r10,ramtest8 ; check for equal maximum address
; perform ramtest again with inverted checkerboard
FFFFFFFFFFFFE820 04002009 or r8,r0,r0 ; r8 = 0
FFFFFFFFFFFFE824 E695AAAA ; SETLO
FFFFFFFFFFFFE828 EEAAA955 ; SETMID
FFFFFFFFFFFFE82C F685555A ; SETHI
FFFFFFFFFFFFE830 040D0409 ori r1,r0,#0x5555AAAA5555AAAA
FFFFFFFFFFFFE834 ramtest5:
FFFFFFFFFFFFE834 66808000 sw r1,[r8]
FFFFFFFFFFFFE838 46810000 lw r2,[r8]
FFFFFFFFFFFFE83C 04110C06 cmp r3,r1,r2
FFFFFFFFFFFFE840 BE3000C9 bne r3,r0,ramtest6
FFFFFFFFFFFFE844 08840008 addi r8,r8,#8
FFFFFFFFFFFFE848 E6800000 ; SETLO
FFFFFFFFFFFFE84C EE800004 ; SETMID
FFFFFFFFFFFFE850 048D0C06 cmpi r3,r8,#0x0000_0000_0100_0000
FFFFFFFFFFFFE854 BE307F00 blt r3,r0,ramtest5
FFFFFFFFFFFFE858 ramtest6:
FFFFFFFFFFFFE858 04802C09 or r11,r8,r0 ; r11 = max ram address
FFFFFFFFFFFFF920 04002009 or r8,r0,r0 ; r8 = 0
FFFFFFFFFFFFF924 E695AAAA ; SETLO
FFFFFFFFFFFFF928 EEAAA955 ; SETMID
FFFFFFFFFFFFF92C F685555A ; SETHI
FFFFFFFFFFFFF930 040D0409 ori r1,r0,#0x5555AAAA5555AAAA
FFFFFFFFFFFFF934 ramtest5:
FFFFFFFFFFFFF934 66808000 sw r1,[r8]
FFFFFFFFFFFFF938 46810000 lw r2,[r8]
FFFFFFFFFFFFF93C 04110C06 cmp r3,r1,r2
FFFFFFFFFFFFF940 BE3000C9 bne r3,r0,ramtest6
FFFFFFFFFFFFF944 08840008 addi r8,r8,#8
FFFFFFFFFFFFF948 E6800000 ; SETLO
FFFFFFFFFFFFF94C EE800004 ; SETMID
FFFFFFFFFFFFF950 048D0C06 cmpi r3,r8,#0x0000_0000_0100_0000
FFFFFFFFFFFFF954 BE307F00 blt r3,r0,ramtest5
FFFFFFFFFFFFF958 ramtest6:
FFFFFFFFFFFFF958 04802C09 or r11,r8,r0 ; r11 = max ram address
; readback checkerboard
FFFFFFFFFFFFE85C 04002009 or r8,r0,r0
FFFFFFFFFFFFE860 ramtest7:
FFFFFFFFFFFFE860 46810000 lw r2,[r8]
FFFFFFFFFFFFE864 E695AAAA ; SETLO
FFFFFFFFFFFFE868 EEAAA955 ; SETMID
FFFFFFFFFFFFE86C F685555A ; SETHI
FFFFFFFFFFFFE870 042D0C06 cmpi r3,r2,#0x5555AAAA5555AAAA
FFFFFFFFFFFFE874 BE3000C9 bne r3,r0,ramtest8
FFFFFFFFFFFFE878 08840008 addi r8,r8,#8
FFFFFFFFFFFFE87C E6800000 ; SETLO
FFFFFFFFFFFFE880 EE800004 ; SETMID
FFFFFFFFFFFFE884 048D0C06 cmpi r3,r8,#0x0000_0000_0100_0000
FFFFFFFFFFFFE888 BE307EC0 blt r3,r0,ramtest7
FFFFFFFFFFFFE88C ramtest8:
FFFFFFFFFFFFE88C BE858048 beq r8,r11,ramtest9
FFFFFFFFFFFFE890 0485A014 min r8,r8,r11
FFFFFFFFFFFFE894 ramtest9:
FFFFFFFFFFFFE894 BE850048 beq r8,r10,ramtest10
FFFFFFFFFFFFE898 04852014 min r8,r8,r10
FFFFFFFFFFFFE89C ramtest10:
FFFFFFFFFFFFE89C 66040400 sw r8,0x00000400 ;memend
FFFFFFFFFFFFE8A0 37EF8000 ret
FFFFFFFFFFFFF95C 04002009 or r8,r0,r0
FFFFFFFFFFFFF960 ramtest7:
FFFFFFFFFFFFF960 46810000 lw r2,[r8]
FFFFFFFFFFFFF964 E695AAAA ; SETLO
FFFFFFFFFFFFF968 EEAAA955 ; SETMID
FFFFFFFFFFFFF96C F685555A ; SETHI
FFFFFFFFFFFFF970 042D0C06 cmpi r3,r2,#0x5555AAAA5555AAAA
FFFFFFFFFFFFF974 BE3000C9 bne r3,r0,ramtest8
FFFFFFFFFFFFF978 08840008 addi r8,r8,#8
FFFFFFFFFFFFF97C E6800000 ; SETLO
FFFFFFFFFFFFF980 EE800004 ; SETMID
FFFFFFFFFFFFF984 048D0C06 cmpi r3,r8,#0x0000_0000_0100_0000
FFFFFFFFFFFFF988 BE307EC0 blt r3,r0,ramtest7
FFFFFFFFFFFFF98C ramtest8:
FFFFFFFFFFFFF98C BE858048 beq r8,r11,ramtest9
FFFFFFFFFFFFF990 0485A014 min r8,r8,r11
FFFFFFFFFFFFF994 ramtest9:
FFFFFFFFFFFFF994 BE850048 beq r8,r10,ramtest10
FFFFFFFFFFFFF998 04852014 min r8,r8,r10
FFFFFFFFFFFFF99C ramtest10:
FFFFFFFFFFFFF99C 66040400 sw r8,0x00000400 ;memend
FFFFFFFFFFFFF9A0 37EF8000 ret
;-------------------------------------------
;-------------------------------------------
;
FFFFFFFFFFFFE8A4 iberr_rout:
FFFFFFFFFFFFE8A4 9A00E92B lea r1,msgiberr
FFFFFFFFFFFFE8A8 31FFEFE7 call DisplayString
FFFFFFFFFFFFE8AC 020085E8 mfspr r1,EPC
FFFFFFFFFFFFE8B0 31FFF019 call DisplayWord
FFFFFFFFFFFFE8B4 00000028 wait
FFFFFFFFFFFFE8B8 33FFEC07 jmp start
FFFFFFFFFFFFE8BC dberr_rout:
FFFFFFFFFFFFE8BC 9A00E910 lea r1,msgdberr
FFFFFFFFFFFFE8C0 31FFEFE7 call DisplayString
FFFFFFFFFFFFE8C4 02008628 mfspr r1,ERRADR
FFFFFFFFFFFFE8C8 31FFF019 call DisplayWord
FFFFFFFFFFFFE8CC 9A00E924 lea r1,msgEPC
FFFFFFFFFFFFE8D0 31FFEFE7 call DisplayString
FFFFFFFFFFFFE8D4 020085E8 mfspr r1,EPC
FFFFFFFFFFFFE8D8 31FFF019 call DisplayWord
FFFFFFFFFFFFE8DC 31FFF93F call CRLF
FFFFFFFFFFFFE8E0 1601001F lw r2,#31
FFFFFFFFFFFFE8E4 dberr1:
FFFFFFFFFFFFE8E4 02200FA9 mtspr PCHI,r2
FFFFFFFFFFFFE8E8 DE000000 nop
FFFFFFFFFFFFE8EC DE000000 nop
FFFFFFFFFFFFE8F0 DE000000 nop
FFFFFFFFFFFFE8F4 02008FE8 mfspr r1,PCHISTORIC
FFFFFFFFFFFFE8F8 31FFF019 call DisplayWord
FFFFFFFFFFFFE8FC 31FFF93F call CRLF
FFFFFFFFFFFFE900 BE017F2F loop r2,dberr1
FFFFFFFFFFFFE904 00000028 wait
FFFFFFFFFFFFE908 33FFEC07 jmp start
FFFFFFFFFFFFE908 0000000033FFEC07 .align 16
FFFFFFFFFFFFE910 .align 16
FFFFFFFFFFFFE910 msgdberr:
FFFFFFFFFFFFE910 7375622061746144 db "Data bus error at: ",0
FFFFFFFFFFFFE918 6120726F72726520
FFFFFFFFFFFFE924 msgEPC:
FFFFFFFFFFFFE920 4350452000203A74 db " EPC: ",0
FFFFFFFFFFFFE92B msgiberr:
FFFFFFFFFFFFE928 662072724500203A db "Err fetching instruction at: ",0
FFFFFFFFFFFFE930 20676E6968637465
FFFFFFFFFFFFE938 7463757274736E69
FFFFFFFFFFFFE940 203A7461206E6F69
FFFFFFFFFFFFE948 0000000000000000 .align 16
FFFFFFFFFFFFE950 .align 16
FFFFFFFFFFFFF9A4 iberr_rout:
FFFFFFFFFFFFF9A4 9A00FA3B lea r1,msgiberr
FFFFFFFFFFFFF9A8 31FFF122 call DisplayString
FFFFFFFFFFFFF9AC 020085E8 mfspr r1,EPC
FFFFFFFFFFFFF9B0 31FFF169 call DisplayWord
FFFFFFFFFFFFF9B4 00000028 wait
FFFFFFFFFFFFF9B8 33FFEC0B jmp start
FFFFFFFFFFFFF9BC dberr_rout:
FFFFFFFFFFFFF9BC E6A00100 ; SETLO
FFFFFFFFFFFFF9C0 EE800400 ; SETMID
FFFFFFFFFFFFF9C4 040D7809 lw sp,#0x100200100
FFFFFFFFFFFFF9C8 9A00FA20 lea r1,msgdberr
FFFFFFFFFFFFF9CC 31FFF122 call DisplayString
FFFFFFFFFFFFF9D0 02008628 mfspr r1,ERRADR
FFFFFFFFFFFFF9D4 31FFF169 call DisplayWord
FFFFFFFFFFFFF9D8 9A00FA34 lea r1,msgEPC
FFFFFFFFFFFFF9DC 31FFF122 call DisplayString
FFFFFFFFFFFFF9E0 020085E8 mfspr r1,EPC
FFFFFFFFFFFFF9E4 31FFF169 call DisplayWord
FFFFFFFFFFFFF9E8 31FFFD80 call CRLF
FFFFFFFFFFFFF9EC 1601001F lw r2,#31
FFFFFFFFFFFFF9F0 dberr1:
FFFFFFFFFFFFF9F0 02200FA9 mtspr PCHI,r2
FFFFFFFFFFFFF9F4 DE000000 nop
FFFFFFFFFFFFF9F8 DE000000 nop
FFFFFFFFFFFFF9FC DE000000 nop
FFFFFFFFFFFFFA00 02008FE8 mfspr r1,PCHISTORIC
FFFFFFFFFFFFFA04 31FFF169 call DisplayWord
FFFFFFFFFFFFFA08 31FFFD80 call CRLF
FFFFFFFFFFFFFA0C BE017F2F loop r2,dberr1
FFFFFFFFFFFFFA10 00000028 wait
FFFFFFFFFFFFFA14 33FFEC0B jmp start
FFFFFFFFFFFFFA18 0000000000000000 .align 16
FFFFFFFFFFFFFA20 .align 16
FFFFFFFFFFFFFA20 msgdberr:
FFFFFFFFFFFFFA20 7375622061746144 db "Data bus error at: ",0
FFFFFFFFFFFFFA28 6120726F72726520
FFFFFFFFFFFFFA34 msgEPC:
FFFFFFFFFFFFFA30 4350452000203A74 db " EPC: ",0
FFFFFFFFFFFFFA3B msgiberr:
FFFFFFFFFFFFFA38 662072724500203A db "Err fetching instruction at: ",0
FFFFFFFFFFFFFA40 20676E6968637465
FFFFFFFFFFFFFA48 7463757274736E69
FFFFFFFFFFFFFA50 203A7461206E6F69
FFFFFFFFFFFFFA5C .align 4
;------------------------------------------------------------------------------
; IRQ routine
;
; Interrupts are automatically disabled at the time of the interrupt in order
; to prevent nested interrupts from occuring. Interrupts are re-enabled by
; the IRET instruction at the end of the interrupt routine. If the interrupt
; turns out to not match a hardware interrupt, then a software context
; switching interrupt is assumed.
;
; This routine uses it's own private interrupt stack; the stack of the
; interrupted context is not used at all. A couple of working registers are
; saved off not on the stack. We can get away with this because nested
; interrupts are not allowed.
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFE950 irqrout:
FFFFFFFFFFFFE950 0FEF0020 subui sp,sp,#32
FFFFFFFFFFFFE954 67E08000 sw r1,[sp] ; save off a working register
FFFFFFFFFFFFE958 67E10008 sw r2,8[sp] ; and a second work register
FFFFFFFFFFFFE95C 67ED0010 sw r26,16[sp] ; save off implicit constant builder reg
FFFFFFFFFFFFE960 67EF8018 sw lr,24[sp]
FFFFFFFFFFFFE964 E69C0FF0 ; SETLO
FFFFFFFFFFFFE968 EE800003 ; SETMID
FFFFFFFFFFFFE96C 6A0D0421 inch r1,PIC ; r1= which IRQ line is active
FFFFFFFFFFFFFA5C irqrout:
FFFFFFFFFFFFFA5C 660F1460 sw sp,sp_save ; use our own private stack for interrupt processing
FFFFFFFFFFFFFA60 660F9468 sw lr,lr_save ; so, save off the sp and working registers
FFFFFFFFFFFFFA64 660D1480 sw r26,r26_save
FFFFFFFFFFFFFA68 66009470 sw r1,r1_save
FFFFFFFFFFFFFA6C 66011478 sw r2,r2_save
FFFFFFFFFFFFFA70 E6801000 ; SETLO
FFFFFFFFFFFFFA74 EE800400 ; SETMID
FFFFFFFFFFFFFA78 040D7809 lw sp,#0x1_00001000 ; the second two kbytes
FFFFFFFFFFFFFA7C E69C0FF0 ; SETLO
FFFFFFFFFFFFFA80 EE800003 ; SETMID
FFFFFFFFFFFFFA84 6A0D0421 inch r1,PIC ; r1= which IRQ line is active
; Dispatch fork, in order of required timeliness
FFFFFFFFFFFFFA88 B0100D02 beqi r1,#2,irq1000Hz
FFFFFFFFFFFFFA8C B0101903 beqi r1,#3,irq100Hz
FFFFFFFFFFFFFA90 B0102008 beqi r1,#8,irqSerial
FFFFFFFFFFFFFA94 B010220D beqi r1,#13,irqRaster
FFFFFFFFFFFFFA98 B010240F beqi r1,#15,irqKeybd
FFFFFFFFFFFFFA9C B0102601 beqi r1,#1,irqColdStart ; CTRL-ALT-DEL interrupt
; Here, none of the hardware interrupts were active so
; assume software context switch interrupt
;
FFFFFFFFFFFFFAA0 460F1460 lw sp,sp_save
FFFFFFFFFFFFFAA4 460F9468 lw lr,lr_save
FFFFFFFFFFFFFAA8 460D1480 lw r26,r26_save
FFFFFFFFFFFFFAAC 46009470 lw r1,r1_save
FFFFFFFFFFFFFAB0 46011478 lw r2,r2_save
FFFFFFFFFFFFFAB4 0000000F iepp
FFFFFFFFFFFFFAB8 01900020 iret
; 1000 Hz interrupt
; This IRQ must be fast, so it's placed inline
; This IRQ must be fast, so it's placed inline. It's also the first
; IRQ checked for in the interrupt dispatch.
; Increments the millisecond counter, and switches to the next context
;
FFFFFFFFFFFFE970 irq1000Hz:
FFFFFFFFFFFFE970 B2101602 bnei r1,#2,irq100Hz
FFFFFFFFFFFFE974 E6BF0000 ; SETLO
FFFFFFFFFFFFE978 6A0D0028 outb r0,0xFFFFFFFF_FFFF0000 ; acknowledge interrupt
FFFFFFFFFFFFE97C 46009400 lw r1,Milliseconds ; increment milliseconds count
FFFFFFFFFFFFE980 0A108001 addui r1,r1,#1
FFFFFFFFFFFFE984 66009400 sw r1,Milliseconds
FFFFFFFFFFFFE988 E6900000 ; SETLO
FFFFFFFFFFFFE98C EE800003 ; SETMID
FFFFFFFFFFFFE990 6A0D082D lea r2,TEXTSCR
FFFFFFFFFFFFE994 8220814C inch r1,332[r2]
FFFFFFFFFFFFE998 0A108001 addui r1,r1,#1
FFFFFFFFFFFFE99C 9220814C outc r1,332[r2]
FFFFFFFFFFFFE9A0 47EF8018 lw lr,24[sp]
FFFFFFFFFFFFE9A4 47ED0010 lw r26,16[sp] ; restore registers from stack
FFFFFFFFFFFFE9A8 47E10008 lw r2,8[sp]
FFFFFFFFFFFFE9AC 47E08000 lw r1,[sp]
FFFFFFFFFFFFE9B0 0BEF0020 addui sp,sp,#32 ; restore stack pointer
FFFFFFFFFFFFE9B4 0000000F iepp ; move to the next context
FFFFFFFFFFFFE9B8 DE000000 nop
FFFFFFFFFFFFE9BC DE000000 nop
FFFFFFFFFFFFE9C0 DE000000 nop
FFFFFFFFFFFFE9C4 01900020 iret ; return to the next context
FFFFFFFFFFFFFABC irq1000Hz:
FFFFFFFFFFFFFABC E69CFFFD ; SETLO
FFFFFFFFFFFFFAC0 EE800003 ; SETMID
FFFFFFFFFFFFFAC4 6A0D0028 outb r0,0xDCFFFD ; acknowledge interrupt
FFFFFFFFFFFFFAC8 46009400 lw r1,Milliseconds ; increment milliseconds count
FFFFFFFFFFFFFACC 0A108001 addui r1,r1,#1
FFFFFFFFFFFFFAD0 66009400 sw r1,Milliseconds
FFFFFFFFFFFFFAD4 460F1460 lw sp,sp_save
FFFFFFFFFFFFFAD8 460F9468 lw lr,lr_save
FFFFFFFFFFFFFADC 460D1480 lw r26,r26_save
FFFFFFFFFFFFFAE0 46009470 lw r1,r1_save
FFFFFFFFFFFFFAE4 46011478 lw r2,r2_save
FFFFFFFFFFFFFAE8 0000000F iepp ; move to the next context
FFFFFFFFFFFFFAEC 01900020 iret ; return to the next context
; 100 Hz interrupt
; This IRQ could have some work to do, including flashing a cursor. So
; we call a subroutine.
;
FFFFFFFFFFFFE9C8 irq100Hz:
FFFFFFFFFFFFE9C8 B2100403 bnei r1,#3,irqSerial
FFFFFFFFFFFFE9CC 4600B000 lw r1,p100IRQvec
FFFFFFFFFFFFFAF0 irq100Hz:
FFFFFFFFFFFFFAF0 4600B000 lw r1,p100IRQvec
; jal lr,[r1]
FFFFFFFFFFFFE9D0 31FFEE3B call Pulse100
FFFFFFFFFFFFE9D4 BE0001AA bra irqret
FFFFFFFFFFFFFAF4 31FFEF73 call Pulse100
FFFFFFFFFFFFFAF8 irqret:
FFFFFFFFFFFFFAF8 460F1460 lw sp,sp_save
FFFFFFFFFFFFFAFC 460F9468 lw lr,lr_save
FFFFFFFFFFFFFB00 460D1480 lw r26,r26_save
FFFFFFFFFFFFFB04 46009470 lw r1,r1_save
FFFFFFFFFFFFFB08 46011478 lw r2,r2_save
FFFFFFFFFFFFFB0C 01900020 iret
FFFFFFFFFFFFE9D8 irqSerial:
FFFFFFFFFFFFE9D8 B2100408 bnei r1,#8,irqRaster
FFFFFFFFFFFFE9DC 4600B010 lw r1,serialIRQvec
FFFFFFFFFFFFE9E0 341F8000 jal lr,[r1]
FFFFFFFFFFFFE9E4 BE00012A bra irqret
FFFFFFFFFFFFFB10 irqSerial:
FFFFFFFFFFFFFB10 4600B010 lw r1,serialIRQvec
FFFFFFFFFFFFFB14 341F8000 jal lr,[r1]
FFFFFFFFFFFFFB18 BE007F0A bra irqret
FFFFFFFFFFFFE9E8 irqRaster:
FFFFFFFFFFFFE9E8 B210040D bnei r1,#13,irqKeybd
FFFFFFFFFFFFE9EC 4600B018 lw r1,rasterIRQvec
FFFFFFFFFFFFFB1C irqRaster:
FFFFFFFFFFFFFB1C 4600B018 lw r1,rasterIRQvec
; jal lr,[r1]
FFFFFFFFFFFFE9F0 31FFF2B1 call RasterIRQfn
FFFFFFFFFFFFE9F4 BE0000AA bra irqret
FFFFFFFFFFFFFB20 31FFF46B call RasterIRQfn
FFFFFFFFFFFFFB24 BE007EAA bra irqret
FFFFFFFFFFFFE9F8 irqKeybd:
FFFFFFFFFFFFE9F8 B0118901 beqi r1,#1,ColdStart ; CTRL-ALT-DEL interrupt
FFFFFFFFFFFFE9FC B210030F bnei r1,#15,irqret
FFFFFFFFFFFFEA00 4600B008 lw r1,keybdIRQvec
FFFFFFFFFFFFEA04 31FFEDF1 call KeybdIRQ
FFFFFFFFFFFFFB28 irqKeybd:
FFFFFFFFFFFFFB28 4600B008 lw r1,keybdIRQvec
FFFFFFFFFFFFFB2C 31FFEEF0 call KeybdIRQ
; jal lr,[r1]
FFFFFFFFFFFFFB30 BE007E4A bra irqret
FFFFFFFFFFFFEA08 irqret:
FFFFFFFFFFFFEA08 47EF8018 lw lr,24[sp]
FFFFFFFFFFFFEA0C 47ED0010 lw r26,16[sp] ; restore registers from stack
FFFFFFFFFFFFEA10 47E10008 lw r2,8[sp]
FFFFFFFFFFFFEA14 47E08000 lw r1,[sp]
FFFFFFFFFFFFEA18 0BEF0020 addui sp,sp,#32 ; restore stack pointer
FFFFFFFFFFFFEA1C 01900020 iret
FFFFFFFFFFFFFB34 irqColdStart:
FFFFFFFFFFFFFB34 33FFEC0B jmp ColdStart
;-------------------------------------------
;------------------------------------------------------------------------------
; NMI routine
;
; The NMI line is tied to the parity error signal. But also any non-initialized
; interrupts get sent here.
;------------------------------------------------------------------------------
;
FFFFFFFFFFFFFB38 nmirout:
FFFFFFFFFFFFFB38 660F1460 sw sp,sp_save
FFFFFFFFFFFFFB3C 66009470 sw r1,r1_save
FFFFFFFFFFFFFB40 660D1480 sw r26,r26_save
FFFFFFFFFFFFFB44 E6801000 ; SETLO
FFFFFFFFFFFFFB48 EE800400 ; SETMID
FFFFFFFFFFFFFB4C 040D7809 lw sp,#0x100001000
FFFFFFFFFFFFFB50 E69CFFFE ; SETLO
FFFFFFFFFFFFFB54 EE800003 ; SETMID
FFFFFFFFFFFFFB58 6A0D0028 outb r0,0xDCFFFE ; acknowledge interrupt
FFFFFFFFFFFFFB5C 9A00FB80 lea r1,msgPerr
FFFFFFFFFFFFFB60 31FFF122 call DisplayString
FFFFFFFFFFFFFB64 02008868 mfspr r1,IPC
FFFFFFFFFFFFFB68 31FFF169 call DisplayWord
FFFFFFFFFFFFFB6C 31FFFD80 call CRLF
FFFFFFFFFFFFFB70 460F1460 lw sp,sp_save
FFFFFFFFFFFFFB74 46009470 lw r1,r1_save
FFFFFFFFFFFFFB78 460D1480 lw r26,r26_save
FFFFFFFFFFFFFB7C 01900020 iret
FFFFFFFFFFFFFB80 msgPerr:
FFFFFFFFFFFFFB80 6520797469726150 db "Parity error at: ",0
FFFFFFFFFFFFFB88 3A746120726F7272
;-------------------------------------------
FFFFFFFFFFFFEA20 nmirout:
FFFFFFFFFFFFEA20 01900020 iret
; Unimplemented instructions end up here
;-------------------------------------------
FFFFFFFFFFFFFB94 .align 4
FFFFFFFFFFFFFB94 ui_irout:
FFFFFFFFFFFFFB94 0FEF0008 subui sp,sp,#8
FFFFFFFFFFFFFB98 67E08000 sw r1,[sp]
FFFFFFFFFFFFFB9C 9A00FBC0 lea r1,msgUnimp
FFFFFFFFFFFFFBA0 31FFF122 call DisplayString
FFFFFFFFFFFFFBA4 02008868 mfspr r1,IPC
FFFFFFFFFFFFFBA8 31FFF169 call DisplayWord
FFFFFFFFFFFFFBAC 31FFFD80 call CRLF
FFFFFFFFFFFFFBB0 47E08000 lw r1,[sp]
FFFFFFFFFFFFFBB4 0BEF0008 addui sp,sp,#8
; hang the context
FFFFFFFFFFFFFBB8 ui_irout1:
FFFFFFFFFFFFFBB8 BE00000A bra ui_irout1
FFFFFFFFFFFFFBBC 01900020 iret
FFFFFFFFFFFFFBC0 msgUnimp:
FFFFFFFFFFFFFBC0 6D656C706D696E55 db "Unimplemented instruction at: ",0
FFFFFFFFFFFFFBC8 6E69206465746E65
FFFFFFFFFFFFFBD0 6F69746375727473
;-------------------------------------------
; Handle miss on Data TLB
;-------------------------------------------
FFFFFFFFFFFFEA24 DTLBHandler:
FFFFFFFFFFFFEA24 E6BF0000 ; SETLO
FFFFFFFFFFFFEA28 6A0D0413 sw r1,0xFFFF_FFFF_FFFF_0000
FFFFFFFFFFFFEA2C E6BF0008 ; SETLO
FFFFFFFFFFFFEA30 6A0D0813 sw r2,0xFFFF_FFFF_FFFF_0008
FFFFFFFFFFFFEA34 dh1:
FFFFFFFFFFFFEA34 02008034 omgi r1,#0 ; try open mutex gate #0 (TLB protector)
FFFFFFFFFFFFEA38 BE107FE9 bne r1,r0,dh1 ; spinlock if gate is closed
FFFFFFFFFFFFEA3C 02008128 mfspr r1,PTA ; get the page table address
FFFFFFFFFFFFEA40 02010228 mfspr r2,BadVAddr ; get the bad virtual address
FFFFFFFFFFFFEA44 022002E9 mtspr TLBVirtPage,r2 ; which virtual address to update
FFFFFFFFFFFFEA48 06211A01 shrui r2,r2,#13 ; turn va into index
FFFFFFFFFFFFEA4C 04110403 addu r1,r1,r2
FFFFFFFFFFFFEA50 46110000 lw r2,[r1] ; get the physical address from the table
FFFFFFFFFFFFEA54 14210000 and r2,r2,#FFFF_FFFF_FFFF_E000 ; mask off lower bits
FFFFFFFFFFFFEA58 022002A9 mtspr TLBPhysPage0,r2 ;
FFFFFFFFFFFFEA5C 46110008 lw r2,8[r1] ; get the physical address from the table
FFFFFFFFFFFFEA60 14210000 and r2,r2,#FFFF_FFFF_FFFF_E000 ; mask off lower bits
FFFFFFFFFFFFEA64 022002E9 mtspr TLBPhysPage1,r2 ;
FFFFFFFFFFFFEA68 02000034 tlbwr ; update a random entry in the TLB
FFFFFFFFFFFFEA6C 02000035 cmgi #0 ; close the mutex gate
FFFFFFFFFFFFEA70 E6BF0000 ; SETLO
FFFFFFFFFFFFEA74 6A0D0403 lw r1,0xFFFF_FFFF_FFFF_0000
FFFFFFFFFFFFEA78 E6BF0008 ; SETLO
FFFFFFFFFFFFEA7C 6A0D0803 lw r2,0xFFFF_FFFF_FFFF_0008
FFFFFFFFFFFFEA80 01900020 iret
FFFFFFFFFFFFEA80 0000000001900020 .align 32
FFFFFFFFFFFFEA88 6A0D0803E6BF0008
FFFFFFFFFFFFEA90 0000000000000000
FFFFFFFFFFFFEA98 0000000000000000
FFFFFFFFFFFFEAA0 .align 32
FFFFFFFFFFFFFBD8 0000203A7461206E .align 4
FFFFFFFFFFFFFBE0 .align 4
FFFFFFFFFFFFFBE0 DTLBHandler:
FFFFFFFFFFFFFBE0 E6BF0000 ; SETLO
FFFFFFFFFFFFFBE4 6A0D0413 sw r1,0xFFFF_FFFF_FFFF_0000
FFFFFFFFFFFFFBE8 E6BF0008 ; SETLO
FFFFFFFFFFFFFBEC 6A0D0813 sw r2,0xFFFF_FFFF_FFFF_0008
FFFFFFFFFFFFFBF0 dh1:
FFFFFFFFFFFFFBF0 02008034 omgi r1,#0 ; try open mutex gate #0 (TLB protector)
FFFFFFFFFFFFFBF4 BE107FE9 bne r1,r0,dh1 ; spinlock if gate is closed
FFFFFFFFFFFFFBF8 02008128 mfspr r1,PTA ; get the page table address
FFFFFFFFFFFFFBFC 02010228 mfspr r2,BadVAddr ; get the bad virtual address
FFFFFFFFFFFFFC00 022002E9 mtspr TLBVirtPage,r2 ; which virtual address to update
FFFFFFFFFFFFFC04 06211A01 shrui r2,r2,#13 ; turn va into index
FFFFFFFFFFFFFC08 04110403 addu r1,r1,r2
FFFFFFFFFFFFFC0C 46110000 lw r2,[r1] ; get the physical address from the table
FFFFFFFFFFFFFC10 14210000 and r2,r2,#FFFF_FFFF_FFFF_E000 ; mask off lower bits
FFFFFFFFFFFFFC14 022002A9 mtspr TLBPhysPage0,r2 ;
FFFFFFFFFFFFFC18 46110008 lw r2,8[r1] ; get the physical address from the table
FFFFFFFFFFFFFC1C 14210000 and r2,r2,#FFFF_FFFF_FFFF_E000 ; mask off lower bits
FFFFFFFFFFFFFC20 022002E9 mtspr TLBPhysPage1,r2 ;
FFFFFFFFFFFFFC24 02000034 tlbwr ; update a random entry in the TLB
FFFFFFFFFFFFFC28 02000035 cmgi #0 ; close the mutex gate
FFFFFFFFFFFFFC2C E6BF0000 ; SETLO
FFFFFFFFFFFFFC30 6A0D0403 lw r1,0xFFFF_FFFF_FFFF_0000
FFFFFFFFFFFFFC34 E6BF0008 ; SETLO
FFFFFFFFFFFFFC38 6A0D0803 lw r2,0xFFFF_FFFF_FFFF_0008
FFFFFFFFFFFFFC3C 01900020 iret
FFFFFFFFFFFFFC40 .align 32
FFFFFFFFFFFFFFB0 org 0xFFFF_FFFF_FFFF_FFB0
FFFFFFFFFFFFFFB0 33FFFA89 jmp DTLBHandler
FFFFFFFFFFFFFFB0 33FFFEF8 jmp DTLBHandler
FFFFFFFFFFFFFFB4 DE000000 nop
FFFFFFFFFFFFFFB8 DE000000 nop
FFFFFFFFFFFFFFC0 org 0xFFFF_FFFF_FFFF_FFC0
FFFFFFFFFFFFFFC0 33FFFA89 jmp DTLBHandler
FFFFFFFFFFFFFFC0 33FFFEF8 jmp DTLBHandler
FFFFFFFFFFFFFFC4 DE000000 nop
FFFFFFFFFFFFFFC8 DE000000 nop
; NMI vector
FFFFFFFFFFFFFFE0 org 0xFFFF_FFFF_FFFF_FFE0
FFFFFFFFFFFFFFE0 33FFFA88 jmp nmirout
FFFFFFFFFFFFFFE4 DE000000 nop
FFFFFFFFFFFFFFE8 DE000000 nop
FFFFFFFFFFFFFFE0 0000000000000000 dw 0 ;
FFFFFFFFFFFFFFE8 0000000000000000 dw 0 ;
; RST vector
; RST vector
FFFFFFFFFFFFFFF0 org 0xFFFF_FFFF_FFFF_FFF0
FFFFFFFFFFFFFFF0 33FFEC07 jmp start
FFFFFFFFFFFFFFF4 DE000000 nop
FFFFFFFFFFFFFFF8 DE000000 nop
FFFFFFFFFFFFFFF0 33FFEC0B jmp start
; ROM checksum goes here
FFFFFFFFFFFFFFF8 org 0xFFFF_FFFF_FFFF_FFF8
FFFFFFFFFFFFFFF8 0000000000000000 dw 0
FFFFFFFFFFFFFFFC 00000000
0000000000000000 00000000
0000000000000004 00000000
Symbol Table:
5737,10 → 7386,15
TAB C constant 0000000000000009
CTRLC C constant 0000000000000003
CTRLH C constant 0000000000000008
CTRLI C constant 0000000000000009
CTRLJ C constant 000000000000000A
CTRLK C constant 000000000000000B
CTRLM C constant 000000000000000D
CTRLS C constant 0000000000000013
CTRLX C constant 0000000000000018
XON C constant 0000000000000011
XOFF C constant 0000000000000013
EX_IRQ C constant 00000000000001C1
DATA_PRESENT C constant 0000000000000001
XMIT_NOT_FULL C constant 0000000000000020
BUFLEN C constant 0000000000000050
5793,15 → 7447,19
TCBr29 C constant 00000000000000E0
TCBr30 C constant 00000000000000E8
TCBr31 C constant 00000000000000F0
SCREENGATE C constant 0000000000000000
KEYBDGATE C constant 0000000000000001
VIDEOGATE C constant 0000000000000002
CARDGATE C constant 0000000000000003
warmStart C constant 0000000000001020
usrJmp C constant 0000000000001028
TickIRQAddr C constant 0000000000001030
TaskBlock C constant 0000000000001038
tencount C constant 00000000000013F8
Milliseconds C constant 0000000000001400
Lastloc C constant 0000000000001408
CharColor C constant 0000000000001410
ScreenColor C constant 0000000000001414
CursorRow C constant 0000000000001416
CursorRow C constant 0000000000001417
CursorCol C constant 0000000000001418
CursorFlash C constant 000000000000141A
KeybdEcho C constant 000000000000141C
5808,6 → 7466,11
KeybdBuffer C constant 0000000000001440
KeybdHead C constant 0000000000001450
KeybdTail C constant 0000000000001451
sp_save C constant 0000000000001460
lr_save C constant 0000000000001468
r1_save C constant 0000000000001470
r2_save C constant 0000000000001478
r26_save C constant 0000000000001480
Score C constant 0000000000001500
Manpos C constant 0000000000001508
MissileActive C constant 0000000000001510
5850,10 → 7513,30
r1save C constant 00000000000020B0
r2save C constant 00000000000020B8
AXCstart C constant 00000000000020C0
ctx0start C constant 00000000000020D0
ctx1start C constant 00000000000020D8
ctx2start C constant 00000000000020E0
ctx3start C constant 00000000000020E8
ctx4start C constant 00000000000020F0
ctx5start C constant 00000000000020F8
ctx6start C constant 0000000000002100
ctx7start C constant 0000000000002108
ctx8start C constant 0000000000002110
ctx9start C constant 0000000000002118
ctx10start C constant 0000000000002120
ctx11start C constant 0000000000002128
ctx12start C constant 0000000000002130
ctx13start C constant 0000000000002138
ctx14start C constant 0000000000002140
ctx15start C constant 0000000000002148
sp_saves C constant 0000000000002200
sp_saves_end C constant 0000000000002280
p100IRQvec C constant 0000000000003000
keybdIRQvec C constant 0000000000003008
serialIRQvec C constant 0000000000003010
rasterIRQvec C constant 0000000000003018
startSector C constant 00000000000030F8
BPB C constant 0000000000003100
TEXTSCR C constant 0000000000D00000
COLORSCR C constant 0000000000D10000
TEXTREG C constant 0000000000DA0000
5868,6 → 7551,31
UART_IE C constant 0000000000DC0A04
UART_MC C constant 0000000000DC0A06
DATETIME C constant 0000000000DC0400
SPIMASTER C constant 0000000000DC0500
SPI_MASTER_VERSION_REG C constant 0000000000000000
SPI_MASTER_CONTROL_REG C constant 0000000000000001
SPI_TRANS_TYPE_REG C constant 0000000000000002
SPI_TRANS_CTRL_REG C constant 0000000000000003
SPI_TRANS_STATUS_REG C constant 0000000000000004
SPI_TRANS_ERROR_REG C constant 0000000000000005
SPI_DIRECT_ACCESS_DATA_REG C constant 0000000000000006
SPI_SD_ADDR_7_0_REG C constant 0000000000000007
SPI_SD_ADDR_15_8_REG C constant 0000000000000008
SPI_SD_ADDR_23_16_REG C constant 0000000000000009
SPI_SD_ADDR_31_24_REG C constant 000000000000000A
SPI_RX_FIFO_DATA_REG C constant 0000000000000010
SPI_RX_FIFO_DATA_COUNT_MSB C constant 0000000000000012
SPI_RX_FIFO_DATA_COUNT_LSB C constant 0000000000000013
SPI_RX_FIFO_CTRL_REG C constant 0000000000000014
SPI_TX_FIFO_DATA_REG C constant 0000000000000020
SPI_TX_FIFO_CTRL_REG C constant 0000000000000024
SPI_INIT_SD C constant 0000000000000001
SPI_TRANS_START C constant 0000000000000001
SPI_TRANS_BUSY C constant 0000000000000001
SPI_INIT_NO_ERROR C constant 0000000000000000
SPI_READ_NO_ERROR C constant 0000000000000000
RW_READ_SD_BLOCK C constant 0000000000000002
RW_WRITE_SD_BLOCK C constant 0000000000000003
PIC C constant 0000000000DC0FF0
PIC_IE C constant 0000000000DC0FF2
PSG C constant 0000000000D50000
5877,27 → 7585,33
PSGADSR0 C constant 0000000000D50006
SPRRAM C constant 0000000000D80000
AC97 C constant 0000000000DC1000
TMP C constant 0000000000DC0300
LED C constant 0000000000DC0600
ETHMAC C constant 0000000000DC2000
CONFIGREC C constant 0000000000DCFFFF
MIIMODER C constant 0000000000000028
MIIADDRESS C constant 0000000000000030
GACCEL C constant 0000000000DAE000
RASTERIRQ C constant 0000000000DA0100
BOOT_STACK C constant FFFFFFFFFFFEFFF8
SPRITEREGS C constant 0000000000DAD000
BITMAPSCR C constant 0000000100200000
BOOTJMP C constant 0000000100800204
txempty C constant 0000000000000040
rxfull C constant 0000000000000001
txtWidth L bss 0000000000001038
txtHeight L bss 0000000000001039
cursx L bss 000000000000103A
cursy L bss 000000000000103B
pos L bss 000000000000103C
dh L bss 000000000000103C
0 L bss 000000000000103C
charToPrint L bss 0000000000001040
fgColor L bss 0000000000001042
bkColor L bss 0000000000001045
cursFlash L bss 0000000000001046
lineLinkTbl L bss 0000000000001047
typef L bss 0000000000001080
txtWidth L bss 0000000000001048
txtHeight L bss 0000000000001049
cursx L bss 000000000000104A
cursy L bss 000000000000104B
pos L bss 000000000000104C
dh L bss 000000000000104C
0 L bss 000000000000104C
charToPrint L bss 000000000000104C
fgColor L bss 000000000000104E
bkColor L bss 0000000000001051
cursFlash L bss 0000000000001052
lineLinkTbl L bss 0000000000001053
typef L bss 0000000000001085
OSSP L bss 0000000000001088
CURRNT L bss 0000000000001090
STKGOS L bss 0000000000001098
5916,593 → 7630,740
NUMWKA L bss 0000000000001100
BUFFER L bss 000000000000111B
TXT C constant 0000000100600000
SerialGetChar L code FFFFFFFFFFFFB550
SerialPutChar L code FFFFFFFFFFFFB430
SetKeyboardEcho L code FFFFFFFFFFFFB818
KeybdCheckForKey L code FFFFFFFFFFFFB874
KeybdGetChar L code FFFFFFFFFFFFB820
DisplayChar L code FFFFFFFFFFFFBD1C
DisplayString L code FFFFFFFFFFFFBF9C
start L code FFFFFFFFFFFFB01C
ColdStart L code FFFFFFFFFFFFB01C
ict1 L code FFFFFFFFFFFFB028
ctxstart3 L code FFFFFFFFFFFFB1F8
ctxstart2 L code FFFFFFFFFFFFB210
ctxstart L code FFFFFFFFFFFFB214
ctxstart1 L code FFFFFFFFFFFFB318
csj5 L code FFFFFFFFFFFFB22C
SerialInit L code FFFFFFFFFFFFB3B0
KeybdInit L code FFFFFFFFFFFFB7B0
PICInit L code FFFFFFFFFFFFB390
SetupRasterIRQ L code FFFFFFFFFFFFCA64
dcokay L code FFFFFFFFFFFFB2C4
ClearScreen L code FFFFFFFFFFFFBB64
ClearBmpScreen L code FFFFFFFFFFFFBB10
RandomizeSprram L code FFFFFFFFFFFFC7B4
DisplayStringCRLF L code FFFFFFFFFFFFBFD4
Monitor L code FFFFFFFFFFFFC258
SetupAC97 L code FFFFFFFFFFFFC7DC
Beep L code FFFFFFFFFFFFC884
j4 L code FFFFFFFFFFFFB310
HelloWorld L code FFFFFFFFFFFFB31C
j3 L code FFFFFFFFFFFFB334
j2 L code FFFFFFFFFFFFB348
MSG L code FFFFFFFFFFFFB360
MSGSTART L code FFFFFFFFFFFFB36D
PICret L code FFFFFFFFFFFFB3AC
SerialGetCharDirect L code FFFFFFFFFFFFB3F4
sgc1 L code FFFFFFFFFFFFC6E0
SerialCheckForCharDirect L code FFFFFFFFFFFFB418
spcb1 L code FFFFFFFFFFFFB490
spcb3 L code FFFFFFFFFFFFB470
spcabort L code FFFFFFFFFFFFB518
spcb2 L code FFFFFFFFFFFFB4C0
spcb4 L code FFFFFFFFFFFFB4A0
spcb5 L code FFFFFFFFFFFFB4DC
spcb6 L code FFFFFFFFFFFFB4C8
spcb8 L code FFFFFFFFFFFFB4E4
spcb7 L code FFFFFFFFFFFFB50C
CharsInRxBuf L code FFFFFFFFFFFFB52C
cirxb1 L code FFFFFFFFFFFFB54C
sgcfifo1 L code FFFFFFFFFFFFB610
sgcfifo2 L code FFFFFFFFFFFFB5FC
sgcfifo3 L code FFFFFFFFFFFFB5C0
sgcfifo4 L code FFFFFFFFFFFFB5E4
sgcfifo5 L code FFFFFFFFFFFFB5FC
SerialIRQ L code FFFFFFFFFFFFB628
sirq1 L code FFFFFFFFFFFFB660
srxirq L code FFFFFFFFFFFFB688
stxirq L code FFFFFFFFFFFFB684
smsirq L code FFFFFFFFFFFFB678
srxirq1 L code FFFFFFFFFFFFB688
srxirq3 L code FFFFFFFFFFFFB6B8
srxirq2 L code FFFFFFFFFFFFB6AC
srxirq5 L code FFFFFFFFFFFFB6D4
srxirq8 L code FFFFFFFFFFFFB764
srxirq6 L code FFFFFFFFFFFFB728
srxirq7 L code FFFFFFFFFFFFB74C
KeybdSC L code FFFFFFFFFFFFB768
kbdsc1 L code FFFFFFFFFFFFB77C
kbdscRet L code FFFFFFFFFFFFB7A4
kbdsc2 L code FFFFFFFFFFFFB78C
kbdsc3 L code FFFFFFFFFFFFB798
kbdsc4 L code FFFFFFFFFFFFB7A4
KeybdIRQ L code FFFFFFFFFFFFB7C4
KeybdIRQa L code FFFFFFFFFFFFB7D4
KeybdIRQb L code FFFFFFFFFFFFB7FC
KeybdIRQc L code FFFFFFFFFFFFB810
nochar L code FFFFFFFFFFFFB864
kgc3 L code FFFFFFFFFFFFB868
kgc2 L code FFFFFFFFFFFFB85C
CRLF L code FFFFFFFFFFFFE4FC
KeybdCheckForKeyDirect L code FFFFFFFFFFFFB884
KeybdGetCharDirect L code FFFFFFFFFFFFB898
kgc1 L code FFFFFFFFFFFFB8A8
gk1 L code FFFFFFFFFFFFB8E0
gk2 L code FFFFFFFFFFFFB8DC
Pulse100 L code FFFFFFFFFFFFB8EC
DisplayDatetime L code FFFFFFFFFFFFCB60
SelectNextToRunTCB L code FFFFFFFFFFFFB928
SwitchTask L code FFFFFFFFFFFFB930
p1001 L code FFFFFFFFFFFFB920
swtsk1 L code FFFFFFFFFFFFB950
FlashCursor L code FFFFFFFFFFFFBA80
CalcScreenLoc L code FFFFFFFFFFFFBCDC
flshcrsr2 L code FFFFFFFFFFFFBADC
flshcrsr3 L code FFFFFFFFFFFFBAB4
flshcrsr1 L code FFFFFFFFFFFFBAC8
CursorOff L code FFFFFFFFFFFFBAE8
CursorOn L code FFFFFFFFFFFFBAFC
csj4 L code FFFFFFFFFFFFBBAC
AsciiToScreen L code FFFFFFFFFFFFBCAC
ScrollUp L code FFFFFFFFFFFFBBD8
scrup1 L code FFFFFFFFFFFFBC18
BlankLine L code FFFFFFFFFFFFBC58
blnkln1 L code FFFFFFFFFFFFBC90
atoscr1 L code FFFFFFFFFFFFBCC4
ScreenToAscii L code FFFFFFFFFFFFBCCC
stasc1 L code FFFFFFFFFFFFBCD8
dccr L code FFFFFFFFFFFFBD3C
dcx7 L code FFFFFFFFFFFFBD68
dcx6 L code FFFFFFFFFFFFBD80
dcx8 L code FFFFFFFFFFFFBDB0
dcx9 L code FFFFFFFFFFFFBDE0
dcx10 L code FFFFFFFFFFFFBE10
dcx11 L code FFFFFFFFFFFFBE44
dcx12 L code FFFFFFFFFFFFBE3C
dcx13 L code FFFFFFFFFFFFBE78
dcx5 L code FFFFFFFFFFFFBE98
dcx3 L code FFFFFFFFFFFFBECC
dcx4 L code FFFFFFFFFFFFBEF4
dclf L code FFFFFFFFFFFFBEF0
IncCursorPos L code FFFFFFFFFFFFBF10
IncCursorRow L code FFFFFFFFFFFFBF48
icc1 L code FFFFFFFFFFFFBF84
icr1 L code FFFFFFFFFFFFBF5C
dspj1 L code FFFFFFFFFFFFBFB0
dsret L code FFFFFFFFFFFFBFC4
DisplayNybble L code FFFFFFFFFFFFC010
dispnyb1 L code FFFFFFFFFFFFC02C
DisplayByte L code FFFFFFFFFFFFC03C
DisplayWord L code FFFFFFFFFFFFC064
dspwd1 L code FFFFFFFFFFFFC078
DisplayMem L code FFFFFFFFFFFFC094
dspmem1 L code FFFFFFFFFFFFC0B8
BinToBCD L code FFFFFFFFFFFFC0E4
bta1 L code FFFFFFFFFFFFC108
BCDToAscii L code FFFFFFFFFFFFC160
bta2 L code FFFFFFFFFFFFC178
BinToStr L code FFFFFFFFFFFFC1BC
btos3 L code FFFFFFFFFFFFC1F0
btos1 L code FFFFFFFFFFFFC1F4
btos2 L code FFFFFFFFFFFFC224
PromptLn L code FFFFFFFFFFFFC264
Prompt3 L code FFFFFFFFFFFFC270
Prompt1 L code FFFFFFFFFFFFC284
Prompt2 L code FFFFFFFFFFFFC2AC
Editmem L code FFFFFFFFFFFFC404
Dumpmem L code FFFFFFFFFFFFC43C
CSTART L code FFFFFFFFFFFFCE70
ExecuteCode L code FFFFFFFFFFFFC42C
LoadS19 L code FFFFFFFFFFFFC500
DisplayHelp L code FFFFFFFFFFFFC314
TestCLS L code FFFFFFFFFFFFC2E0
RandomLinesCall L code FFFFFFFFFFFFC2D8
Invaders L code FFFFFFFFFFFFCDAC
Piano L code FFFFFFFFFFFFC95C
RandomLines L code FFFFFFFFFFFFC6F0
HelpMsg L code FFFFFFFFFFFFC320
ignBlanks L code FFFFFFFFFFFFC3E0
ignBlanks1 L code FFFFFFFFFFFFC3E8
GetHexNumber L code FFFFFFFFFFFFC470
edtmem1 L code FFFFFFFFFFFFC414
gthxn2 L code FFFFFFFFFFFFC488
AsciiToHexNybble L code FFFFFFFFFFFFC4C0
gthxn1 L code FFFFFFFFFFFFC4AC
gthx3 L code FFFFFFFFFFFFC4F8
gthx5 L code FFFFFFFFFFFFC4D0
gthx6 L code FFFFFFFFFFFFC4E4
ProcessRec L code FFFFFFFFFFFFC50C
NextRec L code FFFFFFFFFFFFC504
sGetChar L code FFFFFFFFFFFFC6C8
ProcessS1 L code FFFFFFFFFFFFC5C4
ProcessS2 L code FFFFFFFFFFFFC5CC
ProcessS3 L code FFFFFFFFFFFFC5D4
ProcessS7 L code FFFFFFFFFFFFC5DC
ProcessS8 L code FFFFFFFFFFFFC5E8
ProcessS9 L code FFFFFFFFFFFFC5F4
pcssxa L code FFFFFFFFFFFFC56C
pcss1a L code FFFFFFFFFFFFC574
S19Get16BitAddress L code FFFFFFFFFFFFC600
S19Get24BitAddress L code FFFFFFFFFFFFC618
S19Get32BitAddress L code FFFFFFFFFFFFC630
S1932b L code FFFFFFFFFFFFC684
S1932a L code FFFFFFFFFFFFC664
sgc2 L code FFFFFFFFFFFFC6D0
AUXIN L code FFFFFFFFFFFFE570
rl5 L code FFFFFFFFFFFFC700
rl1 L code FFFFFFFFFFFFC714
rl2 L code FFFFFFFFFFFFC730
rl3 L code FFFFFFFFFFFFC74C
rl4 L code FFFFFFFFFFFFC768
rl8 L code FFFFFFFFFFFFC794
rl7 L code FFFFFFFFFFFFC7A4
rsr1 L code FFFFFFFFFFFFC7C4
sac974 L code FFFFFFFFFFFFC7E8
sac971 L code FFFFFFFFFFFFC7F4
sac973 L code FFFFFFFFFFFFC820
sac972 L code FFFFFFFFFFFFC860
sac975 L code FFFFFFFFFFFFC878
beep1 L code FFFFFFFFFFFFC8FC
beep2 L code FFFFFFFFFFFFC92C
playnt L code FFFFFFFFFFFFC96C
playnt1a L code FFFFFFFFFFFFC994
playnt1b L code FFFFFFFFFFFFC9A0
playnt1c L code FFFFFFFFFFFFC9AC
playnt1d L code FFFFFFFFFFFFC9B8
playnt1e L code FFFFFFFFFFFFC9C4
playnt1f L code FFFFFFFFFFFFC9D0
playnt1g L code FFFFFFFFFFFFC9DC
Tone L code FFFFFFFFFFFFC9E8
tone1 L code FFFFFFFFFFFFCA28
tone2 L code FFFFFFFFFFFFCA44
RasterIRQfn L code FFFFFFFFFFFFCAC4
rirq1 L code FFFFFFFFFFFFCAF4
rirq2 L code FFFFFFFFFFFFCAF4
rirq3 L code FFFFFFFFFFFFCAF4
rirq4 L code FFFFFFFFFFFFCAF4
rirq5 L code FFFFFFFFFFFFCAF4
rirq6 L code FFFFFFFFFFFFCAF4
rirq7 L code FFFFFFFFFFFFCAF4
rirq8 L code FFFFFFFFFFFFCAF4
InitializeGame L code FFFFFFFFFFFFCBD0
DrawScore L code FFFFFFFFFFFFCBF8
DrawMissile L code FFFFFFFFFFFFCC28
MissileOff L code FFFFFFFFFFFFCC84
DrawMan L code FFFFFFFFFFFFCCAC
DrawInvader L code FFFFFFFFFFFFCCF8
DrawInvaders L code FFFFFFFFFFFFCD18
dinv1 L code FFFFFFFFFFFFCDA0
DrawBombs L code FFFFFFFFFFFFCDA8
InvadersLoop L code FFFFFFFFFFFFCDB8
TestMoveMan L code FFFFFFFFFFFFCDCC
MoveManRight L code FFFFFFFFFFFFCDE0
MoveManLeft L code FFFFFFFFFFFFCDF8
FireMissile L code FFFFFFFFFFFFCE0C
Invaders1 L code FFFFFFFFFFFFCE30
InvadersEnd L code FFFFFFFFFFFFCE38
GOSTART L code FFFFFFFFFFFFCE44
GOWARM L code FFFFFFFFFFFFCE48
WSTART L code FFFFFFFFFFFFCEF8
GOOUT L code FFFFFFFFFFFFCE4C
OUTC L code FFFFFFFFFFFFE568
GOIN L code FFFFFFFFFFFFCE50
INC L code FFFFFFFFFFFFE56C
GOAUXO L code FFFFFFFFFFFFCE54
AUXOUT L code FFFFFFFFFFFFE588
GOAUXI L code FFFFFFFFFFFFCE58
GOBYE L code FFFFFFFFFFFFCE5C
BYEBYE L code FFFFFFFFFFFFE7A8
TXTBGN L code FFFFFFFFFFFFCE60
ENDMEM L code FFFFFFFFFFFFCE68
PRMESGAUX L code FFFFFFFFFFFFE534
PRMESG L code FFFFFFFFFFFFE500
clearVars L code FFFFFFFFFFFFD30C
PRTNUM L code FFFFFFFFFFFFE234
ST3 L code FFFFFFFFFFFFCF10
GETLN L code FFFFFFFFFFFFDF60
TOUPBUF L code FFFFFFFFFFFFE474
TSTNUM L code FFFFFFFFFFFFE3FC
IGNBLK L code FFFFFFFFFFFFE450
DIRECT L code FFFFFFFFFFFFD210
ST2 L code FFFFFFFFFFFFCF3C
ERROR L code FFFFFFFFFFFFDF20
FNDLN L code FFFFFFFFFFFFE030
ST4 L code FFFFFFFFFFFFCF90
FNDNXT L code FFFFFFFFFFFFE080
ST7 L code FFFFFFFFFFFFCF6C
ST6 L code FFFFFFFFFFFFCF88
MVUP L code FFFFFFFFFFFFE0A4
ST5 L code FFFFFFFFFFFFCFB8
MVDOWN L code FFFFFFFFFFFFE0BC
TAB1 L code FFFFFFFFFFFFCFE0
TAB2 L code FFFFFFFFFFFFCFF2
TAB4 L code FFFFFFFFFFFFD042
TAB5 L code FFFFFFFFFFFFD063
TAB6 L code FFFFFFFFFFFFD066
TAB8 L code FFFFFFFFFFFFD06B
TAB9 L code FFFFFFFFFFFFD075
TAB10 L code FFFFFFFFFFFFD079
TAB1_1 L code FFFFFFFFFFFFD080
TAB2_1 L code FFFFFFFFFFFFD0A8
TAB4_1 L code FFFFFFFFFFFFD150
TAB5_1 L code FFFFFFFFFFFFD198
TAB6_1 L code FFFFFFFFFFFFD1A8
TAB8_1 L code FFFFFFFFFFFFD1B8
TAB9_1 L code FFFFFFFFFFFFD1F0
TAB10_1 L code FFFFFFFFFFFFD200
EXEC L code FFFFFFFFFFFFD218
EXLP L code FFFFFFFFFFFFD22C
EXNGO L code FFFFFFFFFFFFD244
EXGO L code FFFFFFFFFFFFD27C
EXMAT L code FFFFFFFFFFFFD26C
EX1 L code FFFFFFFFFFFFD25C
NEW L code FFFFFFFFFFFFD284
ENDCHK L code FFFFFFFFFFFFDEE4
STOP L code FFFFFFFFFFFFD294
RUN L code FFFFFFFFFFFFD29C
RUNNXL L code FFFFFFFFFFFFD2AC
FNDLNP L code FFFFFFFFFFFFE040
RUNTSL L code FFFFFFFFFFFFD2CC
RUNSML L code FFFFFFFFFFFFD2D4
CHKIO L code FFFFFFFFFFFFE4D8
GOTO L code FFFFFFFFFFFFD2E4
OREXPR L code FFFFFFFFFFFFD8E8
_clr L code FFFFFFFFFFFFD304
FINISH L code FFFFFFFFFFFFD410
cv1 L code FFFFFFFFFFFFD320
LISTX L code FFFFFFFFFFFFD338
LS1 L code FFFFFFFFFFFFD34C
LS4 L code FFFFFFFFFFFFD354
PRTLN L code FFFFFFFFFFFFE37C
LS3 L code FFFFFFFFFFFFD374
LS2 L code FFFFFFFFFFFFD36C
PRINT L code FFFFFFFFFFFFD380
TSTC L code FFFFFFFFFFFFE3C4
PR2 L code FFFFFFFFFFFFD398
PR0 L code FFFFFFFFFFFFD3AC
PR3 L code FFFFFFFFFFFFD3E4
PR1 L code FFFFFFFFFFFFD3C4
PR4 L code FFFFFFFFFFFFD3DC
QTSTG L code FFFFFFFFFFFFE19C
PR8 L code FFFFFFFFFFFFD400
FIN L code FFFFFFFFFFFFDEA8
PR6 L code FFFFFFFFFFFFD3F8
QWHAT L code FFFFFFFFFFFFDF1C
GOSUB L code FFFFFFFFFFFFD418
PUSHA L code FFFFFFFFFFFFE0F8
gosub1 L code FFFFFFFFFFFFD430
RETURN L code FFFFFFFFFFFFD454
return1 L code FFFFFFFFFFFFD468
POPA L code FFFFFFFFFFFFE0C4
FOR L code FFFFFFFFFFFFD48C
SETVAL L code FFFFFFFFFFFFDE60
FR1 L code FFFFFFFFFFFFD4A4
FR2 L code FFFFFFFFFFFFD4B8
FR4 L code FFFFFFFFFFFFD4C4
FR3 L code FFFFFFFFFFFFD4C0
FR5 L code FFFFFFFFFFFFD4C8
FR7 L code FFFFFFFFFFFFD4E4
FR6 L code FFFFFFFFFFFFD4E0
FR8 L code FFFFFFFFFFFFD504
NEXT L code FFFFFFFFFFFFD508
TSTV L code FFFFFFFFFFFFDBB0
NX4 L code FFFFFFFFFFFFD51C
NX0 L code FFFFFFFFFFFFD520
NX5 L code FFFFFFFFFFFFD530
NX2 L code FFFFFFFFFFFFD53C
NX1 L code FFFFFFFFFFFFD55C
NXPurge L code FFFFFFFFFFFFD570
NX3 L code FFFFFFFFFFFFD560
IF L code FFFFFFFFFFFFD578
IF1 L code FFFFFFFFFFFFD57C
IF2 L code FFFFFFFFFFFFD580
FNDSKP L code FFFFFFFFFFFFE084
IF3 L code FFFFFFFFFFFFD590
INPERR L code FFFFFFFFFFFFD594
INPUT L code FFFFFFFFFFFFD5A8
IP6 L code FFFFFFFFFFFFD5B0
IP2 L code FFFFFFFFFFFFD5D0
IP4 L code FFFFFFFFFFFFD640
IP3 L code FFFFFFFFFFFFD600
IP7 L code FFFFFFFFFFFFD5E8
PRTSTG L code FFFFFFFFFFFFE144
IP5 L code FFFFFFFFFFFFD650
DEFLT L code FFFFFFFFFFFFD65C
LET L code FFFFFFFFFFFFD664
LT1 L code FFFFFFFFFFFFD678
LOAD L code FFFFFFFFFFFFD67C
LOD1 L code FFFFFFFFFFFFD688
LODEND L code FFFFFFFFFFFFD6C8
GCHAR L code FFFFFFFFFFFFD6D0
LOD2 L code FFFFFFFFFFFFD6B0
GCHAR1 L code FFFFFFFFFFFFD6E8
asciiToHex L code FFFFFFFFFFFFD714
a2h1 L code FFFFFFFFFFFFD71C
SAVE L code FFFFFFFFFFFFD728
SAVE1 L code FFFFFFFFFFFFD730
AUXOCRLF L code FFFFFFFFFFFFD784
SAVEND L code FFFFFFFFFFFFD76C
PWORD L code FFFFFFFFFFFFD7A4
SAVE2 L code FFFFFFFFFFFFD758
pword1 L code FFFFFFFFFFFFD7B8
toAsciiHex L code FFFFFFFFFFFFD7F4
pword2 L code FFFFFFFFFFFFD7D4
tah1 L code FFFFFFFFFFFFD800
POKE L code FFFFFFFFFFFFD808
PKER L code FFFFFFFFFFFFD834
POKEC L code FFFFFFFFFFFFD83C
POKEH L code FFFFFFFFFFFFD868
POKEW L code FFFFFFFFFFFFD894
SYSX L code FFFFFFFFFFFFD8C0
sysx1 L code FFFFFFFFFFFFD8D4
ANDEXPR L code FFFFFFFFFFFFD920
XP_OR1 L code FFFFFFFFFFFFD8F4
XP_OR L code FFFFFFFFFFFFD904
XP_ORX L code FFFFFFFFFFFFD914
EXPR L code FFFFFFFFFFFFD9B4
XP_AND1 L code FFFFFFFFFFFFD92C
XP_AND L code FFFFFFFFFFFFD93C
XP_ANDX L code FFFFFFFFFFFFD94C
isDigit L code FFFFFFFFFFFFD958
isDigitFalse L code FFFFFFFFFFFFD968
isAlpha L code FFFFFFFFFFFFD970
isAlphaFalse L code FFFFFFFFFFFFD988
isAlphaTrue L code FFFFFFFFFFFFD980
isAlnum L code FFFFFFFFFFFFD990
isDigitx L code FFFFFFFFFFFFD9AC
EXPR2 L code FFFFFFFFFFFFDA70
XP11 L code FFFFFFFFFFFFD9D0
XP18 L code FFFFFFFFFFFFDA54
XPRT1 L code FFFFFFFFFFFFDA3C
XPRT0 L code FFFFFFFFFFFFDA30
XP12 L code FFFFFFFFFFFFD9E0
XP13 L code FFFFFFFFFFFFD9F0
XP14 L code FFFFFFFFFFFFDA00
XP15 L code FFFFFFFFFFFFDA10
XP16 L code FFFFFFFFFFFFDA20
XP17 L code FFFFFFFFFFFFDA48
XP26 L code FFFFFFFFFFFFDACC
XP21 L code FFFFFFFFFFFFDA90
XP22 L code FFFFFFFFFFFFDA9C
EXPR3 L code FFFFFFFFFFFFDAE4
XP23 L code FFFFFFFFFFFFDAA0
XP24 L code FFFFFFFFFFFFDAB4
XP25 L code FFFFFFFFFFFFDAC0
XP45 L code FFFFFFFFFFFFDAD8
EXPR4 L code FFFFFFFFFFFFDB3C
XP31 L code FFFFFFFFFFFFDAF0
XP34 L code FFFFFFFFFFFFDB10
XP47 L code FFFFFFFFFFFFDB30
XP40 L code FFFFFFFFFFFFDB50
XP41 L code FFFFFFFFFFFFDB68
XP46 L code FFFFFFFFFFFFDB74
PARN L code FFFFFFFFFFFFDB7C
XP42 L code FFFFFFFFFFFFDBA0
XP43 L code FFFFFFFFFFFFDBA8
tstv_notfound L code FFFFFFFFFFFFDC24
TV1 L code FFFFFFFFFFFFDC08
SIZEX L code FFFFFFFFFFFFDE4C
TV2 L code FFFFFFFFFFFFDBFC
QSORRY L code FFFFFFFFFFFFDF14
TSTVRT L code FFFFFFFFFFFFDC18
getVarName L code FFFFFFFFFFFFDC34
findVar L code FFFFFFFFFFFFDCCC
gvn1 L code FFFFFFFFFFFFDCBC
gvn4 L code FFFFFFFFFFFFDC54
gvn2 L code FFFFFFFFFFFFDC8C
gvn6 L code FFFFFFFFFFFFDC7C
gvn3 L code FFFFFFFFFFFFDCA0
fv4 L code FFFFFFFFFFFFDCDC
fv3 L code FFFFFFFFFFFFDD00
fv1 L code FFFFFFFFFFFFDD08
fv2 L code FFFFFFFFFFFFDD18
PEEK L code FFFFFFFFFFFFDD2C
PEEKC L code FFFFFFFFFFFFDD3C
PEEKH L code FFFFFFFFFFFFDD50
PEEKW L code FFFFFFFFFFFFDD64
USRX L code FFFFFFFFFFFFDD78
RND L code FFFFFFFFFFFFDD94
rnd2 L code FFFFFFFFFFFFDDC4
rnd1 L code FFFFFFFFFFFFDDBC
modu4 L code FFFFFFFFFFFFDDD4
mod2 L code FFFFFFFFFFFFDDF4
mod1 L code FFFFFFFFFFFFDE10
ABS L code FFFFFFFFFFFFDE2C
SGN L code FFFFFFFFFFFFDE3C
sv2 L code FFFFFFFFFFFFDE7C
SV1 L code FFFFFFFFFFFFDEA4
FI1 L code FFFFFFFFFFFFDEC4
FI2 L code FFFFFFFFFFFFDEDC
ec1 L code FFFFFFFFFFFFDF04
TOOBIG L code FFFFFFFFFFFFDF0C
GL1 L code FFFFFFFFFFFFDF88
GL3 L code FFFFFFFFFFFFDFBC
GL4 L code FFFFFFFFFFFFDFE4
GL2 L code FFFFFFFFFFFFDFA0
GL7 L code FFFFFFFFFFFFE014
GL6 L code FFFFFFFFFFFFE00C
GL5 L code FFFFFFFFFFFFDFF0
fl1 L code FFFFFFFFFFFFE03C
FNDRET1 L code FFFFFFFFFFFFE06C
FNDRET2 L code FFFFFFFFFFFFE078
FNDRET L code FFFFFFFFFFFFE064
MVUP1 L code FFFFFFFFFFFFE094
MVRET L code FFFFFFFFFFFFE0A8
MVDOWN1 L code FFFFFFFFFFFFE0AC
PP1 L code FFFFFFFFFFFFE0F4
PU1 L code FFFFFFFFFFFFE138
PS1 L code FFFFFFFFFFFFE160
PRTRET L code FFFFFFFFFFFFE180
QT1 L code FFFFFFFFFFFFE1B8
QT2 L code FFFFFFFFFFFFE200
QT3 L code FFFFFFFFFFFFE1D0
QT4 L code FFFFFFFFFFFFE1E8
QT5 L code FFFFFFFFFFFFE20C
prCRLF L code FFFFFFFFFFFFE214
PN1 L code FFFFFFFFFFFFE264
PN6 L code FFFFFFFFFFFFE284
PN4 L code FFFFFFFFFFFFE294
PN3 L code FFFFFFFFFFFFE288
PN5 L code FFFFFFFFFFFFE2A0
PNRET L code FFFFFFFFFFFFE2B4
PRTHEXNUM L code FFFFFFFFFFFFE2CC
PHN1 L code FFFFFFFFFFFFE308
PHN7 L code FFFFFFFFFFFFE31C
PHN8 L code FFFFFFFFFFFFE320
shru L code FFFFFFFFFFFFE32C
r4 L code FFFFFFFFFFFFE32C
#4 L code FFFFFFFFFFFFE32C
PHN6 L code FFFFFFFFFFFFE334
PHN4 L code FFFFFFFFFFFFE344
PHN3 L code FFFFFFFFFFFFE338
PHN5 L code FFFFFFFFFFFFE350
PHNRET L code FFFFFFFFFFFFE364
TC1 L code FFFFFFFFFFFFE3EC
TN1 L code FFFFFFFFFFFFE410
TSNMRET L code FFFFFFFFFFFFE448
TN2 L code FFFFFFFFFFFFE430
IGB2 L code FFFFFFFFFFFFE458
IGB1 L code FFFFFFFFFFFFE464
IGBRET L code FFFFFFFFFFFFE46C
TOUPB1 L code FFFFFFFFFFFFE484
TOUPBRT L code FFFFFFFFFFFFE4C0
DOQUO L code FFFFFFFFFFFFE4A8
toUpper L code FFFFFFFFFFFFE4C8
DOQUO1 L code FFFFFFFFFFFFE4B4
TOUPRET L code FFFFFFFFFFFFE4D4
CHKRET2 L code FFFFFFFFFFFFE4F0
CHKRET L code FFFFFFFFFFFFE4F4
PRMESG1 L code FFFFFFFFFFFFE510
PRMRET L code FFFFFFFFFFFFE524
PRMESGA1 L code FFFFFFFFFFFFE544
PRMRETA L code FFFFFFFFFFFFE558
AXIRET_ZERO L code FFFFFFFFFFFFE580
AXIRET L code FFFFFFFFFFFFE57C
_cls L code FFFFFFFFFFFFE58C
_wait10 L code FFFFFFFFFFFFE594
_getATAStatus L code FFFFFFFFFFFFE598
_waitCFNotBusy L code FFFFFFFFFFFFE59C
_rdcf L code FFFFFFFFFFFFE5A0
rdcf6 L code FFFFFFFFFFFFE5A4
msgInit L code FFFFFFFFFFFFE5C0
OKMSG L code FFFFFFFFFFFFE5F6
msgWhat L code FFFFFFFFFFFFE5FD
SRYMSG L code FFFFFFFFFFFFE605
CLMSG L code FFFFFFFFFFFFE60B
msgReadError L code FFFFFFFFFFFFE60E
msgNumTooBig L code FFFFFFFFFFFFE629
msgDivZero L code FFFFFFFFFFFFE63D
msgVarSpace L code FFFFFFFFFFFFE650
msgBytesFree L code FFFFFFFFFFFFE668
msgReady L code FFFFFFFFFFFFE676
msgComma L code FFFFFFFFFFFFE680
msgLineRange L code FFFFFFFFFFFFE694
msgVar L code FFFFFFFFFFFFE6AA
msgRNDBad L code FFFFFFFFFFFFE6C1
msgSYSBad L code FFFFFFFFFFFFE6D5
msgInputVar L code FFFFFFFFFFFFE6E7
msgNextFor L code FFFFFFFFFFFFE704
msgNextVar L code FFFFFFFFFFFFE717
msgBadGotoGosub L code FFFFFFFFFFFFE73B
msgRetWoGosub L code FFFFFFFFFFFFE758
msgTooBig L code FFFFFFFFFFFFE76F
msgExtraChars L code FFFFFFFFFFFFE784
start L code FFFFFFFFFFFFB02C
ColdStart L code FFFFFFFFFFFFB02C
ict1 L code FFFFFFFFFFFFB084
ctxstart3 L code FFFFFFFFFFFFB214
ctxstart2 L code FFFFFFFFFFFFB224
ctxstart L code FFFFFFFFFFFFB228
ctxstart1 L code FFFFFFFFFFFFB3FC
csj5 L code FFFFFFFFFFFFB240
skip5 L code FFFFFFFFFFFFB2E4
skip4 L code FFFFFFFFFFFFB2FC
dcokay L code FFFFFFFFFFFFB330
skip1 L code FFFFFFFFFFFFB368
skip2 L code FFFFFFFFFFFFB3B0
skip3 L code FFFFFFFFFFFFB3D8
skip_spi_read L code FFFFFFFFFFFFB3F0
j4 L code FFFFFFFFFFFFB3F4
ctx12 L code FFFFFFFFFFFFB410
context1disp L code FFFFFFFFFFFFB428
ctx11 L code FFFFFFFFFFFFB448
HelloWorld L code FFFFFFFFFFFFB460
j3 L code FFFFFFFFFFFFB478
j2 L code FFFFFFFFFFFFB48C
MSG L code FFFFFFFFFFFFB4A0
MSGSTART L code FFFFFFFFFFFFB4AD
PICInit L code FFFFFFFFFFFFB4D0
PICret L code FFFFFFFFFFFFB4EC
SerialInit L code FFFFFFFFFFFFB4F0
SerialGetCharDirect L code FFFFFFFFFFFFB534
sgc1 L code FFFFFFFFFFFFCDC0
SerialCheckForCharDirect L code FFFFFFFFFFFFB558
SerialPutChar L code FFFFFFFFFFFFB570
spcb1 L code FFFFFFFFFFFFB5D0
spcb3 L code FFFFFFFFFFFFB5B0
spcabort L code FFFFFFFFFFFFB658
spcb2 L code FFFFFFFFFFFFB600
spcb4 L code FFFFFFFFFFFFB5E0
spcb5 L code FFFFFFFFFFFFB61C
spcb6 L code FFFFFFFFFFFFB608
spcb8 L code FFFFFFFFFFFFB624
spcb7 L code FFFFFFFFFFFFB64C
CharsInRxBuf L code FFFFFFFFFFFFB66C
cirxb1 L code FFFFFFFFFFFFB68C
SerialGetChar L code FFFFFFFFFFFFB690
sgcfifo1 L code FFFFFFFFFFFFB750
sgcfifo2 L code FFFFFFFFFFFFB73C
sgcfifo3 L code FFFFFFFFFFFFB700
sgcfifo4 L code FFFFFFFFFFFFB724
sgcfifo5 L code FFFFFFFFFFFFB73C
SerialIRQ L code FFFFFFFFFFFFB768
sirq1 L code FFFFFFFFFFFFB7A0
srxirq L code FFFFFFFFFFFFB7C8
stxirq L code FFFFFFFFFFFFB7C4
smsirq L code FFFFFFFFFFFFB7B8
srxirq1 L code FFFFFFFFFFFFB7C8
srxirq3 L code FFFFFFFFFFFFB7F8
srxirq2 L code FFFFFFFFFFFFB7EC
srxirq5 L code FFFFFFFFFFFFB814
srxirq8 L code FFFFFFFFFFFFB8A4
srxirq6 L code FFFFFFFFFFFFB868
srxirq7 L code FFFFFFFFFFFFB88C
VideoSC L code FFFFFFFFFFFFB8A8
Video1 L code FFFFFFFFFFFFB8D0
Video_x02 L code FFFFFFFFFFFFB90C
Video_x03 L code FFFFFFFFFFFFB91C
Video_x06 L code FFFFFFFFFFFFB928
Video_x09 L code FFFFFFFFFFFFB930
Video_x0A L code FFFFFFFFFFFFB944
Video_x0C L code FFFFFFFFFFFFB954
Video_x0D L code FFFFFFFFFFFFB98C
Video_x14 L code FFFFFFFFFFFFB9E0
Video_x15 L code FFFFFFFFFFFFB9EC
Video_x16 L code FFFFFFFFFFFFB9FC
Video_x17 L code FFFFFFFFFFFFBA08
Video_x1A L code FFFFFFFFFFFFBA14
VideoRet L code FFFFFFFFFFFFBA20
Video_x09a L code FFFFFFFFFFFFB938
Video_x0Aa L code FFFFFFFFFFFFB948
vxd1 L code FFFFFFFFFFFFB9C0
SDCARDSC L code FFFFFFFFFFFFBA38
SDC_1 L code FFFFFFFFFFFFBA60
SDC_x00 L code FFFFFFFFFFFFBA78
SDC_x01 L code FFFFFFFFFFFFBA80
SDC_x02 L code FFFFFFFFFFFFBA90
SDCRet L code FFFFFFFFFFFFBA90
RTCSC L code FFFFFFFFFFFFBAA8
RTC_x00 L code FFFFFFFFFFFFBAD8
RTC_x01 L code FFFFFFFFFFFFBAE0
RTCRet L code FFFFFFFFFFFFBB00
KeybdSC L code FFFFFFFFFFFFBB14
kbdsc5 L code FFFFFFFFFFFFBB3C
kbd_x00 L code FFFFFFFFFFFFBB60
kbd_x01 L code FFFFFFFFFFFFBB68
kbd_x02 L code FFFFFFFFFFFFBB74
kbd_x03 L code FFFFFFFFFFFFBB7C
kbd_x04 L code FFFFFFFFFFFFBB84
kbd_x05 L code FFFFFFFFFFFFBB8C
kbdscRet L code FFFFFFFFFFFFBB94
KeybdInit L code FFFFFFFFFFFFBBAC
KeybdIRQ L code FFFFFFFFFFFFBBC0
KeybdIRQa L code FFFFFFFFFFFFBBD0
KeybdIRQb L code FFFFFFFFFFFFBBF8
KeybdIRQc L code FFFFFFFFFFFFBC0C
SetKeyboardEcho L code FFFFFFFFFFFFBC14
KeybdGetChar L code FFFFFFFFFFFFBC1C
nochar L code FFFFFFFFFFFFBC60
kgc3 L code FFFFFFFFFFFFBC64
kgc2 L code FFFFFFFFFFFFBC58
KeybdCheckForKey L code FFFFFFFFFFFFBC70
KeybdCheckForKeyDirect L code FFFFFFFFFFFFBC80
KeybdGetCharDirect L code FFFFFFFFFFFFBC94
kgc1 L code FFFFFFFFFFFFBCA4
gk1 L code FFFFFFFFFFFFBCDC
gk2 L code FFFFFFFFFFFFBCD8
tmp_init L code FFFFFFFFFFFFBCE8
tmp_init4 L code FFFFFFFFFFFFBCF4
tmp_init5 L code FFFFFFFFFFFFBD0C
tmp_init1 L code FFFFFFFFFFFFBD20
tmp_init2 L code FFFFFFFFFFFFBD30
tmp_init3 L code FFFFFFFFFFFFBD48
tmp_read L code FFFFFFFFFFFFBD4C
tmp_read1 L code FFFFFFFFFFFFBD68
tmp_read3 L code FFFFFFFFFFFFBD80
tmp_read2 L code FFFFFFFFFFFFBD90
tmp_read4 L code FFFFFFFFFFFFBDA8
Pulse100 L code FFFFFFFFFFFFBDCC
p1001 L code FFFFFFFFFFFFBE00
SelectNextToRunTCB L code FFFFFFFFFFFFBE08
SwitchTask L code FFFFFFFFFFFFBE10
swtsk1 L code FFFFFFFFFFFFBE30
FlashCursor L code FFFFFFFFFFFFBF60
flshcrsr2 L code FFFFFFFFFFFFBFBC
flshcrsr3 L code FFFFFFFFFFFFBF94
flshcrsr1 L code FFFFFFFFFFFFBFA8
CursorOff L code FFFFFFFFFFFFBFC8
CursorOn L code FFFFFFFFFFFFBFDC
ClearBmpScreen L code FFFFFFFFFFFFBFF0
csj4 L code FFFFFFFFFFFFC08C
ClearScreen L code FFFFFFFFFFFFC044
ScrollUp L code FFFFFFFFFFFFC0B8
scrup1 L code FFFFFFFFFFFFC0F8
BlankLine L code FFFFFFFFFFFFC138
blnkln1 L code FFFFFFFFFFFFC170
AsciiToScreen L code FFFFFFFFFFFFC18C
atoscr1 L code FFFFFFFFFFFFC1A4
ScreenToAscii L code FFFFFFFFFFFFC1AC
stasc1 L code FFFFFFFFFFFFC1B8
CalcScreenLoc L code FFFFFFFFFFFFC1BC
DisplayChar L code FFFFFFFFFFFFC1FC
dccr L code FFFFFFFFFFFFC21C
dcx7 L code FFFFFFFFFFFFC248
dcx6 L code FFFFFFFFFFFFC260
dccr1 L code FFFFFFFFFFFFC224
dcx8 L code FFFFFFFFFFFFC290
dccu1 L code FFFFFFFFFFFFC268
dcx9 L code FFFFFFFFFFFFC2C0
dccl1 L code FFFFFFFFFFFFC298
dcx10 L code FFFFFFFFFFFFC2F0
dccd1 L code FFFFFFFFFFFFC2C8
dcx11 L code FFFFFFFFFFFFC324
dcx12 L code FFFFFFFFFFFFC31C
dcx13 L code FFFFFFFFFFFFC358
dcx5 L code FFFFFFFFFFFFC378
dcx3 L code FFFFFFFFFFFFC3AC
dcx4 L code FFFFFFFFFFFFC3E0
dclf L code FFFFFFFFFFFFC3DC
IncCursorPos L code FFFFFFFFFFFFC3FC
icc1 L code FFFFFFFFFFFFC470
icr1 L code FFFFFFFFFFFFC448
IncCursorRow L code FFFFFFFFFFFFC434
DisplayString L code FFFFFFFFFFFFC488
dspj1 L code FFFFFFFFFFFFC49C
dsret L code FFFFFFFFFFFFC4B0
DisplayStringCRLF L code FFFFFFFFFFFFC4C0
CRLF L code FFFFFFFFFFFFF600
DisplayNum L code FFFFFFFFFFFFC4FC
DisplayNybble L code FFFFFFFFFFFFC500
dispnyb1 L code FFFFFFFFFFFFC51C
DisplayByte L code FFFFFFFFFFFFC52C
DisplayCharr L code FFFFFFFFFFFFC554
DisplayHalf L code FFFFFFFFFFFFC57C
DisplayWord L code FFFFFFFFFFFFC5A4
dspwd1 L code FFFFFFFFFFFFC5B8
DisplayMemB L code FFFFFFFFFFFFC5D4
dspmem1 L code FFFFFFFFFFFFC5F8
DisplayMemC L code FFFFFFFFFFFFC624
dspmemc1 L code FFFFFFFFFFFFC648
DisplayMemW L code FFFFFFFFFFFFC674
BinToBCD L code FFFFFFFFFFFFC6B4
bta1 L code FFFFFFFFFFFFC6D8
BCDToAscii L code FFFFFFFFFFFFC730
bta2 L code FFFFFFFFFFFFC748
BinToStr L code FFFFFFFFFFFFC78C
btos3 L code FFFFFFFFFFFFC7C0
btos1 L code FFFFFFFFFFFFC7C4
btos2 L code FFFFFFFFFFFFC7F4
Monitor L code FFFFFFFFFFFFC828
PromptLn L code FFFFFFFFFFFFC834
Prompt3 L code FFFFFFFFFFFFC840
Prompt1 L code FFFFFFFFFFFFC854
Prompt2 L code FFFFFFFFFFFFC87C
Editmem L code FFFFFFFFFFFFCA24
Dumpmem L code FFFFFFFFFFFFCA70
Fillmem L code FFFFFFFFFFFFCAD4
Prompt7 L code FFFFFFFFFFFFC888
Prompt4 L code FFFFFFFFFFFFC890
ExecuteCode L code FFFFFFFFFFFFCA4C
Prompt9 L code FFFFFFFFFFFFC89C
Prompt10 L code FFFFFFFFFFFFC8AC
TestCLS L code FFFFFFFFFFFFC8DC
Prompt12 L code FFFFFFFFFFFFC8B8
Prompt13 L code FFFFFFFFFFFFC8C0
Prompt14 L code FFFFFFFFFFFFC8C8
Prompt15 L code FFFFFFFFFFFFC8D0
RandomLinesCall L code FFFFFFFFFFFFC8D4
HelpMsg L code FFFFFFFFFFFFC910
ignBlanks L code FFFFFFFFFFFFCA00
ignBlanks1 L code FFFFFFFFFFFFCA08
edtmem1 L code FFFFFFFFFFFFCA34
LoadSector L code FFFFFFFFFFFFCA5C
Dumpmem2 L code FFFFFFFFFFFFCAA0
DumpmemW L code FFFFFFFFFFFFCAC4
DumpmemC L code FFFFFFFFFFFFCAB8
DumpmemB L code FFFFFFFFFFFFCAAC
FillmemC L code FFFFFFFFFFFFCB20
FillmemH L code FFFFFFFFFFFFCB30
FillmemW L code FFFFFFFFFFFFCB40
FillmemB L code FFFFFFFFFFFFCB10
GetHexNumber L code FFFFFFFFFFFFCB50
gthxn2 L code FFFFFFFFFFFFCB68
gthxn1 L code FFFFFFFFFFFFCB8C
AsciiToHexNybble L code FFFFFFFFFFFFCBA0
gthx3 L code FFFFFFFFFFFFCBD8
gthx5 L code FFFFFFFFFFFFCBB0
gthx6 L code FFFFFFFFFFFFCBC4
LoadS19 L code FFFFFFFFFFFFCBE0
ProcessRec L code FFFFFFFFFFFFCBEC
NextRec L code FFFFFFFFFFFFCBE4
ProcessS1 L code FFFFFFFFFFFFCCA4
ProcessS2 L code FFFFFFFFFFFFCCAC
ProcessS3 L code FFFFFFFFFFFFCCB4
ProcessS7 L code FFFFFFFFFFFFCCBC
ProcessS8 L code FFFFFFFFFFFFCCC8
ProcessS9 L code FFFFFFFFFFFFCCD4
pcssxa L code FFFFFFFFFFFFCC4C
pcss1a L code FFFFFFFFFFFFCC54
S19Get16BitAddress L code FFFFFFFFFFFFCCE0
S1932b L code FFFFFFFFFFFFCD64
S19Get24BitAddress L code FFFFFFFFFFFFCCF8
S1932a L code FFFFFFFFFFFFCD44
S19Get32BitAddress L code FFFFFFFFFFFFCD10
sGetChar L code FFFFFFFFFFFFCDA8
sgc2 L code FFFFFFFFFFFFCDB0
RandomLines L code FFFFFFFFFFFFCDD0
rl5 L code FFFFFFFFFFFFCDE4
rl1 L code FFFFFFFFFFFFCDF8
rl2 L code FFFFFFFFFFFFCE14
rl3 L code FFFFFFFFFFFFCE30
rl4 L code FFFFFFFFFFFFCE4C
rl8 L code FFFFFFFFFFFFCE78
rl7 L code FFFFFFFFFFFFCE8C
RandomizeSprram L code FFFFFFFFFFFFCE9C
rsr1 L code FFFFFFFFFFFFCEAC
SetupAC97 L code FFFFFFFFFFFFCEC4
sac974 L code FFFFFFFFFFFFCED0
sac971 L code FFFFFFFFFFFFCEDC
sac973 L code FFFFFFFFFFFFCF08
sac972 L code FFFFFFFFFFFFCF48
sac975 L code FFFFFFFFFFFFCF60
Beep L code FFFFFFFFFFFFCF6C
beep1 L code FFFFFFFFFFFFCFE4
beep2 L code FFFFFFFFFFFFD014
Piano L code FFFFFFFFFFFFD044
playnt L code FFFFFFFFFFFFD054
playnt1a L code FFFFFFFFFFFFD07C
playnt1b L code FFFFFFFFFFFFD088
playnt1c L code FFFFFFFFFFFFD094
playnt1d L code FFFFFFFFFFFFD0A0
playnt1e L code FFFFFFFFFFFFD0AC
playnt1f L code FFFFFFFFFFFFD0B8
playnt1g L code FFFFFFFFFFFFD0C4
Tone L code FFFFFFFFFFFFD0D0
tone1 L code FFFFFFFFFFFFD110
tone2 L code FFFFFFFFFFFFD12C
SetupRasterIRQ L code FFFFFFFFFFFFD14C
RasterIRQfn L code FFFFFFFFFFFFD1AC
rirq1 L code FFFFFFFFFFFFD1DC
rirq2 L code FFFFFFFFFFFFD1DC
rirq3 L code FFFFFFFFFFFFD1DC
rirq4 L code FFFFFFFFFFFFD1DC
rirq5 L code FFFFFFFFFFFFD1DC
rirq6 L code FFFFFFFFFFFFD1DC
rirq7 L code FFFFFFFFFFFFD1DC
rirq8 L code FFFFFFFFFFFFD1DC
DisplayDatetime L code FFFFFFFFFFFFD248
InitializeGame L code FFFFFFFFFFFFD2C4
DrawScore L code FFFFFFFFFFFFD2EC
DrawMissile L code FFFFFFFFFFFFD31C
MissileOff L code FFFFFFFFFFFFD378
DrawMan L code FFFFFFFFFFFFD3A0
DrawInvader L code FFFFFFFFFFFFD3EC
DrawInvaders L code FFFFFFFFFFFFD40C
dinv1 L code FFFFFFFFFFFFD494
DrawBombs L code FFFFFFFFFFFFD49C
Invaders L code FFFFFFFFFFFFD4A0
InvadersLoop L code FFFFFFFFFFFFD4AC
TestMoveMan L code FFFFFFFFFFFFD4C0
MoveManRight L code FFFFFFFFFFFFD4D4
MoveManLeft L code FFFFFFFFFFFFD4EC
FireMissile L code FFFFFFFFFFFFD500
Invaders1 L code FFFFFFFFFFFFD524
InvadersEnd L code FFFFFFFFFFFFD52C
spi_init L code FFFFFFFFFFFFD538
spi_init1 L code FFFFFFFFFFFFD568
spi_error L code FFFFFFFFFFFFD594
spi_init_exit L code FFFFFFFFFFFFD5A4
spi_read_sector L code FFFFFFFFFFFFD5B4
spi_read_sect1 L code FFFFFFFFFFFFD614
spi_read_error L code FFFFFFFFFFFFD64C
spi_read_sect2 L code FFFFFFFFFFFFD634
spi_read_ret L code FFFFFFFFFFFFD65C
spi_read_boot L code FFFFFFFFFFFFD674
spi_read_boot1 L code FFFFFFFFFFFFD694
spi_read_boot2 L code FFFFFFFFFFFFD6DC
spi_read_boot3 L code FFFFFFFFFFFFD6D0
spi_read_boot4 L code FFFFFFFFFFFFD714
msgFoundEB L code FFFFFFFFFFFFD728
loadFAT L code FFFFFFFFFFFFD73C
loadFAT1 L code FFFFFFFFFFFFD780
loadRootDirectory L code FFFFFFFFFFFFD79C
loadRootDir1 L code FFFFFFFFFFFFD800
loadBootFile L code FFFFFFFFFFFFD814
loadBootFileTmp L code FFFFFFFFFFFFD8A8
loadBootFile4 L code FFFFFFFFFFFFD870
loadBootFile5 L code FFFFFFFFFFFFD890
loadBootFile3 L code FFFFFFFFFFFFD888
loadBootFile1 L code FFFFFFFFFFFFD8C8
loadBootFile2 L code FFFFFFFFFFFFD914
msgJumpingToBoot L code FFFFFFFFFFFFD920
msgNotBootable L code FFFFFFFFFFFFD930
spi_init_ok_msg L code FFFFFFFFFFFFD946
spi_init_error_msg L code FFFFFFFFFFFFD960
spi_boot_error_msg L code FFFFFFFFFFFFD98B
spi_read_error_msg L code FFFFFFFFFFFFD99E
my_MAC1 C constant 0000000000000000
my_MAC2 C constant 00000000000000FF
my_MAC3 C constant 00000000000000EE
my_MAC4 C constant 00000000000000F0
my_MAC5 C constant 00000000000000DA
my_MAC6 C constant 0000000000000042
.bss L code FFFFFFFFFFFFD9B4
eth_unique_id L code FFFFFFFFFFFFD9B4
.code L code FFFFFFFFFFFFD9BC
eth_init L code FFFFFFFFFFFFD9BC
eth_request_packet L code FFFFFFFFFFFFD9F4
eth1 L code FFFFFFFFFFFFDA24
eth20 L code FFFFFFFFFFFFDA4C
eth_interpret_packet L code FFFFFFFFFFFFDA70
eth2 L code FFFFFFFFFFFFDA9C
eth5 L code FFFFFFFFFFFFDA90
eth3 L code FFFFFFFFFFFFDACC
eth4 L code FFFFFFFFFFFFDAB4
eth6 L code FFFFFFFFFFFFDAC0
eth7 L code FFFFFFFFFFFFDACC
eth_send_packet L code FFFFFFFFFFFFDADC
eth8 L code FFFFFFFFFFFFDAF4
eth_build_packet L code FFFFFFFFFFFFDB24
eth16 L code FFFFFFFFFFFFDBEC
eth_checksum L code FFFFFFFFFFFFDC38
eth15 L code FFFFFFFFFFFFDC58
eth14 L code FFFFFFFFFFFFDC80
eth_verifyIP L code FFFFFFFFFFFFDCB0
eth11 L code FFFFFFFFFFFFDD0C
eth12 L code FFFFFFFFFFFFDCF4
eth13 L code FFFFFFFFFFFFDCF8
eth_main L code FFFFFFFFFFFFDD3C
eth_loop L code FFFFFFFFFFFFDD40
eth10 L code FFFFFFFFFFFFDDF8
GOSTART L code FFFFFFFFFFFFDF4C
GOWARM L code FFFFFFFFFFFFDF50
GOOUT L code FFFFFFFFFFFFDF54
GOIN L code FFFFFFFFFFFFDF58
GOAUXO L code FFFFFFFFFFFFDF5C
GOAUXI L code FFFFFFFFFFFFDF60
GOBYE L code FFFFFFFFFFFFDF64
TXTBGN L code FFFFFFFFFFFFDF68
ENDMEM L code FFFFFFFFFFFFDF70
CSTART L code FFFFFFFFFFFFDF80
WSTART L code FFFFFFFFFFFFE004
ST3 L code FFFFFFFFFFFFE01C
DIRECT L code FFFFFFFFFFFFE318
ST2 L code FFFFFFFFFFFFE048
ERROR L code FFFFFFFFFFFFF028
ST4 L code FFFFFFFFFFFFE09C
ST7 L code FFFFFFFFFFFFE078
ST6 L code FFFFFFFFFFFFE094
ST5 L code FFFFFFFFFFFFE0C4
TAB1 L code FFFFFFFFFFFFE0EC
TAB2 L code FFFFFFFFFFFFE0FE
TAB4 L code FFFFFFFFFFFFE14E
TAB5 L code FFFFFFFFFFFFE16F
TAB6 L code FFFFFFFFFFFFE172
TAB8 L code FFFFFFFFFFFFE177
TAB9 L code FFFFFFFFFFFFE181
TAB10 L code FFFFFFFFFFFFE185
TAB1_1 L code FFFFFFFFFFFFE188
TAB2_1 L code FFFFFFFFFFFFE1B0
TAB4_1 L code FFFFFFFFFFFFE258
TAB5_1 L code FFFFFFFFFFFFE2A0
TAB6_1 L code FFFFFFFFFFFFE2B0
TAB8_1 L code FFFFFFFFFFFFE2C0
TAB9_1 L code FFFFFFFFFFFFE2F8
TAB10_1 L code FFFFFFFFFFFFE308
EXEC L code FFFFFFFFFFFFE320
EXLP L code FFFFFFFFFFFFE334
EXNGO L code FFFFFFFFFFFFE34C
EXGO L code FFFFFFFFFFFFE384
EXMAT L code FFFFFFFFFFFFE374
EX1 L code FFFFFFFFFFFFE364
NEW L code FFFFFFFFFFFFE38C
STOP L code FFFFFFFFFFFFE39C
RUN L code FFFFFFFFFFFFE3A4
RUNNXL L code FFFFFFFFFFFFE3B4
RUNTSL L code FFFFFFFFFFFFE3D4
RUNSML L code FFFFFFFFFFFFE3DC
GOTO L code FFFFFFFFFFFFE3EC
_clr L code FFFFFFFFFFFFE40C
FINISH L code FFFFFFFFFFFFE518
clearVars L code FFFFFFFFFFFFE414
cv1 L code FFFFFFFFFFFFE428
LISTX L code FFFFFFFFFFFFE440
LS1 L code FFFFFFFFFFFFE454
LS4 L code FFFFFFFFFFFFE45C
LS3 L code FFFFFFFFFFFFE47C
LS2 L code FFFFFFFFFFFFE474
PRINT L code FFFFFFFFFFFFE488
PR2 L code FFFFFFFFFFFFE4A0
PR0 L code FFFFFFFFFFFFE4B4
PR3 L code FFFFFFFFFFFFE4EC
PR1 L code FFFFFFFFFFFFE4CC
PR4 L code FFFFFFFFFFFFE4E4
PR8 L code FFFFFFFFFFFFE508
PR6 L code FFFFFFFFFFFFE500
GOSUB L code FFFFFFFFFFFFE520
gosub1 L code FFFFFFFFFFFFE538
RETURN L code FFFFFFFFFFFFE55C
return1 L code FFFFFFFFFFFFE570
FOR L code FFFFFFFFFFFFE594
FR1 L code FFFFFFFFFFFFE5AC
FR2 L code FFFFFFFFFFFFE5C0
FR4 L code FFFFFFFFFFFFE5CC
FR3 L code FFFFFFFFFFFFE5C8
FR5 L code FFFFFFFFFFFFE5D0
FR7 L code FFFFFFFFFFFFE5EC
FR6 L code FFFFFFFFFFFFE5E8
FR8 L code FFFFFFFFFFFFE60C
NEXT L code FFFFFFFFFFFFE610
NX4 L code FFFFFFFFFFFFE624
NX0 L code FFFFFFFFFFFFE628
NX5 L code FFFFFFFFFFFFE638
NX2 L code FFFFFFFFFFFFE644
NX1 L code FFFFFFFFFFFFE664
NXPurge L code FFFFFFFFFFFFE678
NX3 L code FFFFFFFFFFFFE668
IF L code FFFFFFFFFFFFE680
IF1 L code FFFFFFFFFFFFE684
IF2 L code FFFFFFFFFFFFE688
IF3 L code FFFFFFFFFFFFE698
INPERR L code FFFFFFFFFFFFE69C
INPUT L code FFFFFFFFFFFFE6B0
IP6 L code FFFFFFFFFFFFE6B8
IP2 L code FFFFFFFFFFFFE6D8
IP4 L code FFFFFFFFFFFFE748
IP3 L code FFFFFFFFFFFFE708
IP7 L code FFFFFFFFFFFFE6F0
IP5 L code FFFFFFFFFFFFE758
DEFLT L code FFFFFFFFFFFFE764
LET L code FFFFFFFFFFFFE76C
LT1 L code FFFFFFFFFFFFE780
LOAD L code FFFFFFFFFFFFE784
LOD1 L code FFFFFFFFFFFFE790
LODEND L code FFFFFFFFFFFFE7D0
LOD2 L code FFFFFFFFFFFFE7B8
GCHAR L code FFFFFFFFFFFFE7D8
GCHAR1 L code FFFFFFFFFFFFE7F0
asciiToHex L code FFFFFFFFFFFFE81C
a2h1 L code FFFFFFFFFFFFE824
SAVE L code FFFFFFFFFFFFE830
SAVE1 L code FFFFFFFFFFFFE838
SAVEND L code FFFFFFFFFFFFE874
SAVE2 L code FFFFFFFFFFFFE860
AUXOCRLF L code FFFFFFFFFFFFE88C
PWORD L code FFFFFFFFFFFFE8AC
pword1 L code FFFFFFFFFFFFE8C0
pword2 L code FFFFFFFFFFFFE8DC
toAsciiHex L code FFFFFFFFFFFFE8FC
tah1 L code FFFFFFFFFFFFE908
POKE L code FFFFFFFFFFFFE910
PKER L code FFFFFFFFFFFFE93C
POKEC L code FFFFFFFFFFFFE944
POKEH L code FFFFFFFFFFFFE970
POKEW L code FFFFFFFFFFFFE99C
SYSX L code FFFFFFFFFFFFE9C8
sysx1 L code FFFFFFFFFFFFE9DC
OREXPR L code FFFFFFFFFFFFE9F0
XP_OR1 L code FFFFFFFFFFFFE9FC
XP_OR L code FFFFFFFFFFFFEA0C
XP_ORX L code FFFFFFFFFFFFEA1C
ANDEXPR L code FFFFFFFFFFFFEA28
XP_AND1 L code FFFFFFFFFFFFEA34
XP_AND L code FFFFFFFFFFFFEA44
XP_ANDX L code FFFFFFFFFFFFEA54
isDigit L code FFFFFFFFFFFFEA60
isDigitFalse L code FFFFFFFFFFFFEA70
isAlpha L code FFFFFFFFFFFFEA78
isAlphaFalse L code FFFFFFFFFFFFEA90
isAlphaTrue L code FFFFFFFFFFFFEA88
isAlnum L code FFFFFFFFFFFFEA98
isDigitx L code FFFFFFFFFFFFEAB4
EXPR L code FFFFFFFFFFFFEABC
XP11 L code FFFFFFFFFFFFEAD8
XPRT1 L code FFFFFFFFFFFFEB44
XPRT0 L code FFFFFFFFFFFFEB38
XP12 L code FFFFFFFFFFFFEAE8
XP13 L code FFFFFFFFFFFFEAF8
XP14 L code FFFFFFFFFFFFEB08
XP15 L code FFFFFFFFFFFFEB18
XP16 L code FFFFFFFFFFFFEB28
XP17 L code FFFFFFFFFFFFEB50
XP18 L code FFFFFFFFFFFFEB5C
EXPR2 L code FFFFFFFFFFFFEB78
XP26 L code FFFFFFFFFFFFEBD4
XP21 L code FFFFFFFFFFFFEB98
XP22 L code FFFFFFFFFFFFEBA4
XP23 L code FFFFFFFFFFFFEBA8
XP24 L code FFFFFFFFFFFFEBBC
XP25 L code FFFFFFFFFFFFEBC8
XP45 L code FFFFFFFFFFFFEBE0
EXPR3 L code FFFFFFFFFFFFEBEC
XP31 L code FFFFFFFFFFFFEBF8
XP34 L code FFFFFFFFFFFFEC18
XP47 L code FFFFFFFFFFFFEC38
EXPR4 L code FFFFFFFFFFFFEC44
XP40 L code FFFFFFFFFFFFEC58
XP41 L code FFFFFFFFFFFFEC70
XP46 L code FFFFFFFFFFFFEC7C
PARN L code FFFFFFFFFFFFEC84
XP42 L code FFFFFFFFFFFFECA8
XP43 L code FFFFFFFFFFFFECB0
TSTV L code FFFFFFFFFFFFECB8
tstv_notfound L code FFFFFFFFFFFFED2C
TV1 L code FFFFFFFFFFFFED10
TV2 L code FFFFFFFFFFFFED04
TSTVRT L code FFFFFFFFFFFFED20
getVarName L code FFFFFFFFFFFFED3C
gvn1 L code FFFFFFFFFFFFEDC4
gvn4 L code FFFFFFFFFFFFED5C
gvn2 L code FFFFFFFFFFFFED94
gvn6 L code FFFFFFFFFFFFED84
gvn3 L code FFFFFFFFFFFFEDA8
findVar L code FFFFFFFFFFFFEDD4
fv4 L code FFFFFFFFFFFFEDE4
fv3 L code FFFFFFFFFFFFEE08
fv1 L code FFFFFFFFFFFFEE10
fv2 L code FFFFFFFFFFFFEE20
PEEK L code FFFFFFFFFFFFEE34
PEEKC L code FFFFFFFFFFFFEE44
PEEKH L code FFFFFFFFFFFFEE58
PEEKW L code FFFFFFFFFFFFEE6C
USRX L code FFFFFFFFFFFFEE80
RND L code FFFFFFFFFFFFEE9C
rnd2 L code FFFFFFFFFFFFEECC
rnd1 L code FFFFFFFFFFFFEEC4
modu4 L code FFFFFFFFFFFFEEDC
mod2 L code FFFFFFFFFFFFEEFC
mod1 L code FFFFFFFFFFFFEF18
ABS L code FFFFFFFFFFFFEF34
SGN L code FFFFFFFFFFFFEF44
SIZEX L code FFFFFFFFFFFFEF54
SETVAL L code FFFFFFFFFFFFEF68
sv2 L code FFFFFFFFFFFFEF84
SV1 L code FFFFFFFFFFFFEFAC
QWHAT L code FFFFFFFFFFFFF024
FIN L code FFFFFFFFFFFFEFB0
FI1 L code FFFFFFFFFFFFEFCC
FI2 L code FFFFFFFFFFFFEFE4
ENDCHK L code FFFFFFFFFFFFEFEC
ec1 L code FFFFFFFFFFFFF00C
TOOBIG L code FFFFFFFFFFFFF014
QSORRY L code FFFFFFFFFFFFF01C
GETLN L code FFFFFFFFFFFFF068
GL1 L code FFFFFFFFFFFFF090
GL3 L code FFFFFFFFFFFFF0C4
GL4 L code FFFFFFFFFFFFF0EC
GL2 L code FFFFFFFFFFFFF0A8
GL7 L code FFFFFFFFFFFFF11C
GL6 L code FFFFFFFFFFFFF114
GL5 L code FFFFFFFFFFFFF0F8
FNDLN L code FFFFFFFFFFFFF138
fl1 L code FFFFFFFFFFFFF144
FNDLNP L code FFFFFFFFFFFFF148
FNDRET1 L code FFFFFFFFFFFFF174
FNDNXT L code FFFFFFFFFFFFF188
FNDRET2 L code FFFFFFFFFFFFF180
FNDRET L code FFFFFFFFFFFFF16C
FNDSKP L code FFFFFFFFFFFFF18C
MVUP1 L code FFFFFFFFFFFFF19C
MVUP L code FFFFFFFFFFFFF1AC
MVRET L code FFFFFFFFFFFFF1B0
MVDOWN1 L code FFFFFFFFFFFFF1B4
MVDOWN L code FFFFFFFFFFFFF1C4
POPA L code FFFFFFFFFFFFF1CC
PP1 L code FFFFFFFFFFFFF1FC
PUSHA L code FFFFFFFFFFFFF200
PU1 L code FFFFFFFFFFFFF240
PRTSTG L code FFFFFFFFFFFFF24C
PS1 L code FFFFFFFFFFFFF268
PRTRET L code FFFFFFFFFFFFF288
QTSTG L code FFFFFFFFFFFFF2A4
QT1 L code FFFFFFFFFFFFF2BC
QT2 L code FFFFFFFFFFFFF2FC
QT3 L code FFFFFFFFFFFFF2D4
QT4 L code FFFFFFFFFFFFF2E8
QT5 L code FFFFFFFFFFFFF308
prCRLF L code FFFFFFFFFFFFF310
PRTNUM L code FFFFFFFFFFFFF330
PN2 L code FFFFFFFFFFFFF360
PN1 L code FFFFFFFFFFFFF364
PN6 L code FFFFFFFFFFFFF380
PN4 L code FFFFFFFFFFFFF390
PN3 L code FFFFFFFFFFFFF384
PN5 L code FFFFFFFFFFFFF39C
PNRET L code FFFFFFFFFFFFF3B0
PRTHEXNUM L code FFFFFFFFFFFFF3C8
PHN1 L code FFFFFFFFFFFFF400
PHN7 L code FFFFFFFFFFFFF414
PHN8 L code FFFFFFFFFFFFF418
PHN6 L code FFFFFFFFFFFFF430
PHN4 L code FFFFFFFFFFFFF440
PHN3 L code FFFFFFFFFFFFF434
PHN5 L code FFFFFFFFFFFFF44C
PHNRET L code FFFFFFFFFFFFF460
PRTLN L code FFFFFFFFFFFFF478
TSTC L code FFFFFFFFFFFFF4C0
TC1 L code FFFFFFFFFFFFF4E8
TSTNUM L code FFFFFFFFFFFFF4F8
TN1 L code FFFFFFFFFFFFF50C
TSNMRET L code FFFFFFFFFFFFF54C
TN2 L code FFFFFFFFFFFFF534
IGNBLK L code FFFFFFFFFFFFF554
IGB2 L code FFFFFFFFFFFFF55C
IGB1 L code FFFFFFFFFFFFF568
IGBRET L code FFFFFFFFFFFFF570
TOUPBUF L code FFFFFFFFFFFFF578
TOUPB1 L code FFFFFFFFFFFFF588
TOUPBRT L code FFFFFFFFFFFFF5C4
DOQUO L code FFFFFFFFFFFFF5AC
DOQUO1 L code FFFFFFFFFFFFF5B8
toUpper L code FFFFFFFFFFFFF5CC
TOUPRET L code FFFFFFFFFFFFF5D8
CHKIO L code FFFFFFFFFFFFF5DC
CHKRET2 L code FFFFFFFFFFFFF5F4
CHKRET L code FFFFFFFFFFFFF5F8
PRMESG L code FFFFFFFFFFFFF604
PRMESG1 L code FFFFFFFFFFFFF614
PRMRET L code FFFFFFFFFFFFF628
PRMESGAUX L code FFFFFFFFFFFFF638
PRMESGA1 L code FFFFFFFFFFFFF648
PRMRETA L code FFFFFFFFFFFFF65C
OUTC L code FFFFFFFFFFFFF66C
INC L code FFFFFFFFFFFFF670
AUXIN L code FFFFFFFFFFFFF674
AXIRET_ZERO L code FFFFFFFFFFFFF684
AXIRET L code FFFFFFFFFFFFF680
AUXOUT L code FFFFFFFFFFFFF68C
_cls L code FFFFFFFFFFFFF690
_wait10 L code FFFFFFFFFFFFF698
_getATAStatus L code FFFFFFFFFFFFF69C
_waitCFNotBusy L code FFFFFFFFFFFFF6A0
_rdcf L code FFFFFFFFFFFFF6A4
rdcf6 L code FFFFFFFFFFFFF6A8
BYEBYE L code FFFFFFFFFFFFF8A0
msgInit L code FFFFFFFFFFFFF6B8
OKMSG L code FFFFFFFFFFFFF6EE
msgWhat L code FFFFFFFFFFFFF6F5
SRYMSG L code FFFFFFFFFFFFF6FD
CLMSG L code FFFFFFFFFFFFF703
msgReadError L code FFFFFFFFFFFFF706
msgNumTooBig L code FFFFFFFFFFFFF721
msgDivZero L code FFFFFFFFFFFFF735
msgVarSpace L code FFFFFFFFFFFFF748
msgBytesFree L code FFFFFFFFFFFFF760
msgReady L code FFFFFFFFFFFFF76E
msgComma L code FFFFFFFFFFFFF778
msgLineRange L code FFFFFFFFFFFFF78C
msgVar L code FFFFFFFFFFFFF7A2
msgRNDBad L code FFFFFFFFFFFFF7B9
msgSYSBad L code FFFFFFFFFFFFF7CD
msgInputVar L code FFFFFFFFFFFFF7DF
msgNextFor L code FFFFFFFFFFFFF7FC
msgNextVar L code FFFFFFFFFFFFF80F
msgBadGotoGosub L code FFFFFFFFFFFFF833
msgRetWoGosub L code FFFFFFFFFFFFF850
msgTooBig L code FFFFFFFFFFFFF867
msgExtraChars L code FFFFFFFFFFFFF87C
LSTROM C constant 0000000000000000
ramtest L code FFFFFFFFFFFFE7B0
ramtest2 L code FFFFFFFFFFFFE7C4
ramtest1 L code FFFFFFFFFFFFE7E8
ramtest4 L code FFFFFFFFFFFFE7F0
ramtest3 L code FFFFFFFFFFFFE81C
ramtest8 L code FFFFFFFFFFFFE88C
ramtest5 L code FFFFFFFFFFFFE834
ramtest6 L code FFFFFFFFFFFFE858
ramtest7 L code FFFFFFFFFFFFE860
ramtest9 L code FFFFFFFFFFFFE894
ramtest10 L code FFFFFFFFFFFFE89C
iberr_rout L code FFFFFFFFFFFFE8A4
dberr_rout L code FFFFFFFFFFFFE8BC
dberr1 L code FFFFFFFFFFFFE8E4
msgdberr L code FFFFFFFFFFFFE910
msgEPC L code FFFFFFFFFFFFE924
msgiberr L code FFFFFFFFFFFFE92B
irqrout L code FFFFFFFFFFFFE950
irq1000Hz L code FFFFFFFFFFFFE970
irq100Hz L code FFFFFFFFFFFFE9C8
irqSerial L code FFFFFFFFFFFFE9D8
irqret L code FFFFFFFFFFFFEA08
irqRaster L code FFFFFFFFFFFFE9E8
irqKeybd L code FFFFFFFFFFFFE9F8
nmirout L code FFFFFFFFFFFFEA20
DTLBHandler L code FFFFFFFFFFFFEA24
dh1 L code FFFFFFFFFFFFEA34
ramtest L code FFFFFFFFFFFFF8B0
ramtest2 L code FFFFFFFFFFFFF8C4
ramtest1 L code FFFFFFFFFFFFF8E8
ramtest4 L code FFFFFFFFFFFFF8F0
ramtest3 L code FFFFFFFFFFFFF91C
ramtest8 L code FFFFFFFFFFFFF98C
ramtest5 L code FFFFFFFFFFFFF934
ramtest6 L code FFFFFFFFFFFFF958
ramtest7 L code FFFFFFFFFFFFF960
ramtest9 L code FFFFFFFFFFFFF994
ramtest10 L code FFFFFFFFFFFFF99C
iberr_rout L code FFFFFFFFFFFFF9A4
dberr_rout L code FFFFFFFFFFFFF9BC
dberr1 L code FFFFFFFFFFFFF9F0
msgdberr L code FFFFFFFFFFFFFA20
msgEPC L code FFFFFFFFFFFFFA34
msgiberr L code FFFFFFFFFFFFFA3B
irqrout L code FFFFFFFFFFFFFA5C
irq1000Hz L code FFFFFFFFFFFFFABC
irq100Hz L code FFFFFFFFFFFFFAF0
irqSerial L code FFFFFFFFFFFFFB10
irqRaster L code FFFFFFFFFFFFFB1C
irqKeybd L code FFFFFFFFFFFFFB28
irqColdStart L code FFFFFFFFFFFFFB34
irqret L code FFFFFFFFFFFFFAF8
nmirout L code FFFFFFFFFFFFFB38
msgPerr L code FFFFFFFFFFFFFB80
ui_irout L code FFFFFFFFFFFFFB94
ui_irout1 L code FFFFFFFFFFFFFBB8
msgUnimp L code FFFFFFFFFFFFFBC0
DTLBHandler L code FFFFFFFFFFFFFBE0
dh1 L code FFFFFFFFFFFFFBF0
/trunk/software/sample code/bootrom.s
1,7 → 1,10
; ============================================================================
; (C) 2012,2013 Robert Finch, Stratford
; All Rights Reserved.
; robfinch<remove>@opencores.org
; __
; \\__/ o\ (C) 2012-2013 Robert Finch, Stratford
; \ __ / All rights reserved.
; \/_// robfinch<remove>@opencores.org
; ||
;
;
; This source file is free software: you can redistribute it and/or modify
; it under the terms of the GNU Lesser General Public License as published
23,11 → 26,17
TAB EQU 0x09
CTRLC EQU 0x03
CTRLH EQU 0x08
CTRLI EQU 0x09
CTRLJ EQU 0x0A
CTRLK EQU 0x0B
CTRLM EQU 0x0D
CTRLS EQU 0x13
CTRLX EQU 0x18
XON EQU 0x11
XOFF EQU 0x13
 
EX_IRQ EQU 449
 
DATA_PRESENT EQU 0x01 ; there is data preset at the serial port bc_uart3
XMIT_NOT_FULL EQU 0x20
 
90,15 → 99,19
TCBr30 EQU 0xE8
TCBr31 EQU 0xF0
 
SCREENGATE EQU 0x00
KEYBDGATE EQU 0x01
VIDEOGATE EQU 0x02
CARDGATE EQU 0x03
warmStart EQU 0x1020
usrJmp EQU 0x1028
TickIRQAddr EQU 0x1030
TaskBlock EQU 0x1038
tencount EQU 0x13F8
Milliseconds EQU 0x1400
Lastloc EQU 0x1408
CharColor EQU 0x1410
ScreenColor EQU 0x1414
CursorRow EQU 0x1416
CursorRow EQU 0x1417
CursorCol EQU 0x1418
CursorFlash EQU 0x141A
KeybdEcho EQU 0x141C
105,6 → 118,11
KeybdBuffer EQU 0x1440
KeybdHead EQU 0x1450
KeybdTail EQU 0x1451
sp_save EQU 0x1460
lr_save EQU 0x1468
r1_save EQU 0x1470
r2_save EQU 0x1478
r26_save EQU 0x1480
Score EQU 0x1500
Manpos EQU 0x1508
MissileActive EQU 0x1510
148,11 → 166,34
r2save EQU 0x20B8
AXCstart EQU 0x20C0
 
; Context startup address table
;
ctx0start EQU 0x20D0
ctx1start EQU 0x20D8
ctx2start EQU 0x20E0
ctx3start EQU 0x20E8
ctx4start EQU 0x20F0
ctx5start EQU 0x20F8
ctx6start EQU 0x2100
ctx7start EQU 0x2108
ctx8start EQU 0x2110
ctx9start EQU 0x2118
ctx10start EQU 0x2120
ctx11start EQU 0x2128
ctx12start EQU 0x2130
ctx13start EQU 0x2138
ctx14start EQU 0x2140
ctx15start EQU 0x2148
sp_saves EQU 0x2200
sp_saves_end EQU 0x2280
p100IRQvec EQU 0x3000
keybdIRQvec EQU 0x3008
serialIRQvec EQU 0x3010
rasterIRQvec EQU 0x3018
 
startSector EQU 0x30F8
BPB EQU 0x3100
 
TEXTSCR EQU 0xD0_0000
COLORSCR EQU 0xD1_0000
TEXTREG EQU 0xDA_0000
169,6 → 210,34
UART_IE EQU 0xDC_0A04
UART_MC EQU 0xDC_0A06
DATETIME EQU 0xDC_0400
 
SPIMASTER EQU 0xDC_0500
SPI_MASTER_VERSION_REG EQU 0x00
SPI_MASTER_CONTROL_REG EQU 0x01
SPI_TRANS_TYPE_REG EQU 0x02
SPI_TRANS_CTRL_REG EQU 0x03
SPI_TRANS_STATUS_REG EQU 0x04
SPI_TRANS_ERROR_REG EQU 0x05
SPI_DIRECT_ACCESS_DATA_REG EQU 0x06
SPI_SD_ADDR_7_0_REG EQU 0x07
SPI_SD_ADDR_15_8_REG EQU 0x08
SPI_SD_ADDR_23_16_REG EQU 0x09
SPI_SD_ADDR_31_24_REG EQU 0x0a
SPI_RX_FIFO_DATA_REG EQU 0x10
SPI_RX_FIFO_DATA_COUNT_MSB EQU 0x12
SPI_RX_FIFO_DATA_COUNT_LSB EQU 0x13
SPI_RX_FIFO_CTRL_REG EQU 0x14
SPI_TX_FIFO_DATA_REG EQU 0x20
SPI_TX_FIFO_CTRL_REG EQU 0x24
SPI_INIT_SD EQU 0x01
SPI_TRANS_START EQU 0x01
SPI_TRANS_BUSY EQU 0x01
SPI_INIT_NO_ERROR EQU 0x00
SPI_READ_NO_ERROR EQU 0x00
RW_READ_SD_BLOCK EQU 0x02
RW_WRITE_SD_BLOCK EQU 0x03
 
 
PIC EQU 0xDC_0FF0
PIC_IE EQU 0xDC_0FF2
 
180,7 → 249,12
 
SPRRAM EQU 0xD8_0000
AC97 EQU 0xDC_1000
TMP EQU 0xDC_0300
LED EQU 0xDC_0600
ETHMAC EQU 0xDC_2000
CONFIGREC EQU 0xDC_FFFF
MIIMODER EQU 0x28
MIIADDRESS EQU 0x30
GACCEL EQU 0xDA_E000
RASTERIRQ EQU 0xDA_0100
BOOT_STACK EQU 0xFFFF_FFFF_FFFE_FFF8
187,6 → 261,8
SPRITEREGS EQU 0xDA_D000
BITMAPSCR EQU 0x00000001_00200000
 
BOOTJMP EQU 0x100800204
 
txempty EQU 0x40
rxfull EQU 0x01
 
194,22 → 270,18
; Internal variables follow:
;
bss
org 0x1038
org 0x1048
txtWidth db 0 ; BIOS var =56
txtHeight db 0 ; BIOS var =31
cursx db 0 ; cursor x position
cursy db 0 ; cursor y position
pos dh 0 ; text screen position
org 0x1040
charToPrint dc 0
fgColor db 0
bkColor db 0
cursFlash db 0 ; flash the cursor ?
 
lineLinkTbl fill.b 25,0 ; screen line link table
align 8
 
org 0x1080
lineLinkTbl fill.b 47,0 ; screen line link table
typef db 0 ; variable / expression type
align 8
OSSP dw 1 ; OS value of sp
256,6 → 328,10
jmp KeybdGetChar
jmp DisplayChar
jmp DisplayString
jmp DisplayNum
jmp CalcScreenLoc
jmp ClearScreen
jmp DisplayWord
 
start:
; lea MSGRAM,a1
262,9 → 338,35
; jsr DisplayString
 
ColdStart:
icache_on ; turn on the ICache
icache_off ; turn on the ICache
dcache_off ; turn on the DCache
 
; Make sure semaphores are available by closing the gates.
; We don't know what power up state is.
 
cmgi #KEYBDGATE
cmgi #VIDEOGATE
 
; Initialize the context startup address table with NULL
 
xor r1,r1,r1
sw r1,ctx0start
sw r1,ctx1start
sw r1,ctx2start
sw r1,ctx3start
sw r1,ctx4start
sw r1,ctx5start
sw r1,ctx6start
sw r1,ctx7start
sw r1,ctx8start
sw r1,ctx9start
sw r1,ctx10start
sw r1,ctx11start
sw r1,ctx12start
sw r1,ctx13start
sw r1,ctx14start
sw r1,ctx15start
 
; Initialize the context schedule with all contexts treated equally
; There are only 16 contexts, but 256 schedule slots. Each context is
; given 16 slots distributed evenly throughout the execution pattern
284,88 → 386,72
; We cannot use a loop for this. Fortunately there's only 16 contexts.
;
lea r25,ctxstart
mtspr IPC,r25
lea r30,STACKTOP0
iepp
nop
nop
lea r25,ctxstart
mtspr IPC,r25
lea r30,STACKTOP1
iepp
nop
nop
lea r25,ctxstart
mtspr IPC,r25
lea r30,STACKTOP2
iepp
nop
nop
lea r25,ctxstart
mtspr IPC,r25
lea r30,STACKTOP3
iepp
nop
nop
 
lea r25,ctxstart
mtspr IPC,r25
lea r30,STACKTOP4
iepp
nop
nop
lea r25,ctxstart
mtspr IPC,r25
lea r30,STACKTOP5
iepp
nop
nop
lea r25,ctxstart
mtspr IPC,r25
lea r30,STACKTOP6
iepp
nop
nop
lea r25,ctxstart
mtspr IPC,r25
lea r30,STACKTOP7
iepp
nop
nop
lea r25,ctxstart
mtspr IPC,r25
lea r30,STACKTOP8
iepp
nop
nop
lea r25,ctxstart
mtspr IPC,r25
lea r30,STACKTOP9
iepp
nop
nop
lea r25,ctxstart
mtspr IPC,r25
lea r30,STACKTOP10
iepp
nop
nop
lea r25,ctxstart
mtspr IPC,r25
lea r30,STACKTOP11
iepp
nop
nop
lea r25,ctxstart
mtspr IPC,r25
lea r30,STACKTOP12
iepp
nop
nop
lea r25,ctxstart
mtspr IPC,r25
lea r30,STACKTOP13
iepp
nop
nop
lea r25,ctxstart
mtspr IPC,r25
lea r30,STACKTOP14
iepp
nop
nop
lea r25,ctxstart
mtspr IPC,r25
lea r30,STACKTOP15
iepp
nop
nop
 
; Ensure that context zero is the active context
;
373,8 → 459,6
mfspr r1,AXC
beq r1,r0,ctxstart2
iepp
nop
nop
bra ctxstart3
ctxstart2:
sb r1,AXCstart ; save off the startup context which should be context zero
400,10 → 484,18
sw r1,[r3]
addui r3,r3,#8
loop r2,csj5
lea r1,VideoSC ; Video BIOS vector
sw r1,0xCD0
lea r1,SCCARDSC ; SD Card BIOS vector
sw r1,0xCE8
lea r1,RTCSC ; Real time clock vector
sw r1,0xD00
lea r1,KeybdSC ; keyboard BIOS vector
sw r1,0xD08
lea r1,irqrout
sw r1,0xE08 ; set IRQ vector
lea r1,ui_irout
sw r1,0xF78 ; set unimplemented instruction vector
lea r1,dberr_rout
sw r1,0xFE0 ; set Bus error vector
lea r1,iberr_rout
410,7 → 502,9
sw r1,0xFE8 ; set Bus error vector
lea r1,nmirout
sw r1,0xFF0 ; set NMI vector
 
; set system interrupt hook vectors
 
lea r1,KeybdIRQ
sw r1,keybdIRQvec
lea r1,Pulse100
423,7 → 517,16
;-------------------------------
; Initialize I/O devices
;-------------------------------
inbu r1,CONFIGREC
bfext r1,r1,#4,#4
beq r1,r0,skip5
call tmp_init
skip5:
inbu r1,CONFIGREC
bfext r1,r1,#5,#5
beq r1,r0,skip4
call SerialInit
skip4:
call KeybdInit
call PICInit
call SetupRasterIRQ
431,6 → 534,7
; call HelloWorld
setlo r3,#0xCE ; blue on blue
sc r3,ScreenColor
sc r3,CharColor
lc r3,0x1414
setlo r3,#32
sc r3,0x1416 ; we do a store, then a load through the dcache
440,32 → 544,117
dcokay:
sc r0,NextToRunTCB
sc r0,RunningTCB
lw r1,#2 ; get rid of startup keyboard glitchs by trying to get a character
syscall #417
lw r1,#2 ; get rid of startup keyboard glitchs by trying to get a character
syscall #417
 
; wait for screen to be available
call ClearScreen
call ClearBmpScreen
 
; Test whether or not the sprite controller is present. Skip
; Initialization if it isn't.
 
inb r1,CONFIGREC
bfext r1,r1,#0,#0
beq r1,r0,skip1
call RandomizeSprram
sc r0,CursorRow
sc r0,CursorCol
setlo r1,#1
skip1:
 
sb r0,CursorRow
sb r0,CursorCol
lw r1,#1
sb r1,CursorFlash
lea r1,MSGSTART
call DisplayStringCRLF
jmp Monitor
 
; Test whether or not sound generator is present
; skip initialization and beep if not present
 
inb r1,CONFIGREC
bfext r1,r1,#2,#2
beq r1,r0,skip2
call SetupAC97 ; and Beep
setlo r3,#4
outb r3,LED
lw r1,#4
outb r1,LED
call Beep
skip2:
 
lea r1,context1disp ; start a display
sw r1,ctx1start
 
; Startup Ethernet access ?
;
inb r1,CONFIGREC
bfext r1,r1,#1,#1
beq r1,r0,skip3
lea r1,eth_main
sw r1,ctx2start
skip3:
 
lea r1,RandomLines
sw r1,ctx3start
call spi_init
bne r1,r0,skip_spi_read
call spi_read_boot
call loadBootFile
skip_spi_read:
jmp Monitor
 
j4:
jmp Monitor
bra j4
 
; for now hang the contexts
; The contexts wait for a context startup address to be placed in the
; startup table. Once an address is in the table, a call to the context
; code will be made. The default is a NULL pointer, which
; causes the context to loop around back to here while waiting for a
; code to run.
;
ctxstart1:
lea r1,ctx0start ; r1 = context start table base
mfspr r2,AXC ; r2 = index into start table
lw r1,[r1+r2*8] ; r1 = context start address
beq r1,r0,ctx12
jal lr,[r1] ; perform a call to the context code
 
; We might as well move to the next context, since there's nothing
; to do. This can be accomplished by tirggering a IRQ interrupt.
; We can't just increment the excution pattern pointer, because that
; would only switch the register set and not the program counter.
; An interrupt saves the program counter, and restores it from the
; IPC context register.
;
ctx12:
sei ; causes a priv violation. don't allow interrupts during syscall
nop ; wait for sei to take effect
nop
nop
syscall #EX_IRQ
bra ctxstart1
 
; call ramtest
 
context1disp:
 
; once we've started, clear the start vector so that the context
; isn't continuously restarted.
;
sw r0,ctx1start
lea r3,TEXTSCR
lw r1,#'V'
lw r2,#330
lw r4,#47
call AsciiToScreen
ctx11:
inch r1,[r3+r2]
addui r1,r1,#1
outc r1,[r3+r2]
addui r2,r2,#168
loop r4,ctx11
bra context1disp
 
;-----------------------------------------
; Hello World!
;-----------------------------------------
498,10 → 687,11
 
;----------------------------------------------------------
; Initialize programmable interrupt controller (PIC)
; 0 = nmi
; 0 = nmi (parity error)
; 1 = keyboard reset
; 2 = 1000Hz pulse (context switcher)
; 3 = 100Hz pulse (cursor flash)
; 4 = ethmac
; 8 = uart
; 13 = raster interrupt
; 15 = keyboard char
510,7 → 700,7
lea r1,PICret
sw r1,TickIRQAddr
; enable: raster irq,
setlo r1,#0xA00F ; enable nmi,kbd_rst,and kbd_irq
setlo r1,#0x800F ; enable nmi,kbd_rst,and kbd_irq
; A10F enable serial IRQ
outc r1,PIC_IE
PICret:
793,39 → 983,272
bra sirq1
 
;==============================================================================
; Video BIOS
; Video interrupt #410
;
; Function in R1
; 0x02 = Set Cursor Position r2 = row, r3 = col
; 0x03 = Get Cursor position returns r1 = row, r2 = col
; 0x06 = Scroll screen up
; 0x09 = Display character+attribute, r2=char, r3=attrib, r4=#times
; 0x0A = Display character, r2 = char, r3 = # times
; 0x0C = Display Pixel r2 = x, r3 = y, r4 = color
; 0x0D = Get pixel r2 = x, r3 = y
; 0x14 = Display String r2 = pointer to string
; 0x15 = Display number r2 = number, r3 = # digits
; 0x16 = Display String + CRLF r2 = pointer to string
; 0x17 = Display Word r2 as hex = word
; 0x18 = Display Half word as hex r2 = half word
; 0x19 = Display Charr char in hex r2 = char
; 0x1A = Display Byte in hex r2 = byte
;==============================================================================
;
VideoSC:
mfspr r26,AXC ; get context
shlui r26,r26,#3 ; *8
sw sp,sp_saves[r26] ; save sp in save area
shlui r26,r26,#8 ; 2k for stack
mov sp,r26
addui sp,sp,#0x100008000 ; base stacks address
subui sp,sp,#8
sw lr,[sp]
Video1:
omgi lr,#VIDEOGATE
bne lr,r0,Video1
beqi r1,#0x02,Video_x02
beqi r1,#0x03,Video_x03
beqi r1,#0x06,Video_x06
beqi r1,#0x09,Video_x09
beqi r1,#0x0A,Video_x0A
beqi r1,#0x0C,Video_x0C
beqi r1,#0x0C,Video_x0D
beqi r1,#0x14,Video_x14
beqi r1,#0x15,Video_x15
beqi r1,#0x16,Video_x16
beqi r1,#0x17,Video_x17
beqi r1,#0x1A,Video_x1A
bra VideoRet
 
Video_x02:
sb r2,CursorRow
sb r3,CursorCol
call CalcScreenLoc
bra VideoRet
 
Video_x03:
lbu r1,CursorRow
lbu r2,CursorCol
bra VideoRet
 
Video_x06:
call ScrollUp
bra VideoRet
 
Video_x09:
sc r3,CharColor
mov r1,r2
Video_x09a:
call DisplayChar
loop r4,Video_x09a
bra VideoRet
 
Video_x0A:
mov r1,r2
Video_x0Aa:
call DisplayChar
loop r3,Video_x0Aa
bra VideoRet
 
Video_x0C:
sh r2,GACCEL+8 ; x0
sh r3,GACCEL+12 ; y0
sh r4,GACCEL+0 ; color
lw r1,#1
sh r1,GACCEL+60 ; DRAW PIXEL command
bra VideoRet
 
Video_x0D:
sh r2,GACCEL+8 ; x0
sh r3,GACCEL+12 ; y0
lw r1,#8
sh r1,GACCEL+60 ; GET PIXEL command
nop ; let command start
nop
nop
vxd1:
lhu r1,GACCEL+56 ; wait for state = IDLE
bne r1,r0,vxd1
lhu r1,GACCEL+52
bra VideoRet
 
Video_x14:
mov r1,r2
call DisplayString
bra VideoRet
 
Video_x15:
mov r1,r2
mov r2,r3
call DisplayNum
bra VideoRet
 
Video_x16:
mov r1,r2
call DisplayStringCRLF
bra VideoRet
 
Video_x17:
mov r1,r2
call DisplayWord
bra VideoRet
 
Video_x1A:
mov r1,r2
call DisplayByte
bra VideoRet
 
VideoRet:
cmgi #VIDEOGATE
lw lr,[sp]
mfspr r26,AXC ; get context
shlui r26,r26,#3 ; *8
lw sp,sp_saves[r26] ; get back the stack
eret
 
;==============================================================================
; BIOS interrupt #413
; 0x00 initialize
; 0x01 read sector r2 = sector #, r3 = pointer to buffer
; 0x02 write sector
;==============================================================================
;
SDCARDSC:
mfspr r26,AXC ; get context
shlui r26,r26,#3 ; *8
sw sp,sp_saves[r26] ; save sp in save area
shlui r26,r26,#8 ; 2k for stack
mov sp,r26
addui sp,sp,#0x100008000 ; base stacks address
subui sp,sp,#8
sw lr,[sp]
SDC_1:
omgi lr,#CARDGATE
bne lr,r0,SDC_1
beqi r1,#0,SDC_x00
beqi r1,#1,SDC_x01
beqi r1,#2,SDC_x02
bra SDCRet
SDC_x00:
call spi_init
bra SDCRet
SDC_x01:
mov r1,r2
mov r2,r3
call spi_read_sector
bra SDCRet
SDC_x02:
SDCRet:
cmgi #CARDGATE
lw lr,[sp]
mfspr r26,AXC ; get context
shlui r26,r26,#3 ; *8
lw sp,sp_saves[r26] ; get back the stack
eret
 
;==============================================================================
; Real time clock BIOS
; BIOS interrupt #416
;
; Function
; 0x00 = get system tick
; 0x01 = get date/time
; 0x02 = set date/time
;==============================================================================
;
RTCSC:
mfspr r26,AXC ; get context
shlui r26,r26,#3 ; *8
sw sp,sp_saves[r26] ; save sp in save area
shlui r26,r26,#8 ; 2k for stack
mov sp,r26
addui sp,sp,#0x100008000 ; base stacks address
subui sp,sp,#8
sw lr,[sp]
;
beqi r1,#0x00,RTC_x00
beqi r1,#0x01,RTC_x01
RTC_x00:
mfspr r1,TICK
bra RTCRet
RTC_x01:
outw r0,DATETIME+24 ; trigger a snapshot
nop
inw r1,DATETIME ; get the snapshotted date and time
bra RTCRet
RTCRet:
lw lr,[sp]
mfspr r26,AXC ; get context
shlui r26,r26,#3 ; *8
lw sp,sp_saves[r26] ; get back the stack
eret
 
;==============================================================================
; Keyboard BIOS
; BIOS interrupt #417
;
; Function in R1
; 0 = initialize keyboard
; 1 = set keyboard echo
; 2 = get keyboard character
; 3 = check for key available
; 0x00 = initialize keyboard
; 0x01 = set keyboard echo
; 0x02 = get keyboard character from buffer
; 0x03 = check for key available in buffer
; 0x04 = check for key directly at keyboard port
; 0x05 = get keyboard character directly from keyboard port (blocks)
;==============================================================================
;
KeybdSC:
mfspr r26,AXC ; get context
shlui r26,r26,#3 ; *8
sw sp,sp_saves[r26] ; save sp in save area
shlui r26,r26,#8 ; 2k for stack
mov sp,r26
addui sp,sp,#0x100008000 ; base stacks address
subui sp,sp,#8
sw lr,[sp]
bnei r1,#0,kbdsc1
kbdsc5:
omgi lr,#KEYBDGATE
bne lr,r0,kbdsc5
beqi r1,#0,kbd_x00
beqi r1,#1,kbd_x01
beqi r1,#2,kbd_x02
beqi r1,#3,kbd_x03
beqi r1,#4,kbd_x04
beqi r1,#5,kbd_x05
bra kbdscRet
kbd_x00:
call KeybdInit
bra kbdscRet
kbdsc1:
bnei r1,#1,kbdsc2
kbd_x01:
mov r1,r2
call SetKeyboardEcho
bra kbdscRet
kbdsc2:
bnei r1,#2,kbdsc3
kbd_x02:
call KeybdGetChar
bra kbdscRet
kbdsc3:
bnei r1,#3,kbdsc4
kbd_x03:
call KeybdCheckForKey
bra kbdscRet
kbdsc4:
kbd_x04:
call KeybdCheckForKeyDirect
bra kbdscRet
kbd_x05:
call KeybdGetCharDirect
bra kbdscRet
kbdscRet:
cmgi #KEYBDGATE
lw lr,[sp]
addui sp,sp,#8
mfspr r26,AXC ; get context
shlui r26,r26,#3 ; *8
lw sp,sp_saves[r26] ; get back the stack
eret
 
;------------------------------------------------------------------------------
950,6 → 1373,69
 
;==============================================================================
;==============================================================================
tmp_init:
; wait for the rst1626 to go low
lw r2,#10000000 ; retry for up to several seconds
tmp_init4:
beq r2,r0,tmp_init5
subui r2,r2,#1
inch r1,TMP+2 ; read the status reg
blt r1,r0,tmp_init4
tmp_init5:
 
lw r1,#0x51 ; Start temperature conversion
outc r1,TMP
 
; wait a bit for the trigger to take effect
lw r1,#2500
tmp_init1:
loop r1,tmp_init1
 
; wait for the rst1626 to go low
lw r2,#10000000 ; retry for up to several seconds
tmp_init2:
beq r2,r0,tmp_init3
subui r2,r2,#1
inch r1,TMP+2 ; read the status reg
blt r1,r0,tmp_init2
tmp_init3:
ret
 
tmp_read:
subui sp,sp,#24
sw lr,[sp]
sw r1,8[sp]
sw r2,16[sp]
 
lw r1,#25000000 ; wait about 1 second or so
tmp_read1:
loop r1,tmp_read1
lw r1,#0xAC ; issue read temperature conversion
outc r1,TMP
 
; wait a bit for the trigger to take effect
lw r1,#2500
tmp_read3:
loop r1,tmp_read3
 
; wait for the rst1626 to go low
lw r2,#10000000
tmp_read2:
inch r1,TMP+2 ; read the status reg
beq r2,r0,tmp_read4
subui r2,r2,#1
blt r1,r0,tmp_read2
tmp_read4:
inch r1,TMP+2 ; read the temperature
lw r2,#5 ; five digits
call DisplayNum
lw lr,[sp]
lw r1,8[sp]
lw r2,16[sp]
ret #24
 
;==============================================================================
;==============================================================================
;------------------------------------------------------------------------------
; 100 Hz interrupt
; - takes care of "flashing" the cursor
962,10 → 1448,10
inch r1,334[r2]
addui r1,r1,#1
outc r1,334[r2]
call DisplayDatetime
; call DisplayDatetime
call SelectNextToRunTCB
call SwitchTask
sb r0,0xFFFF_FFFF_FFFF_0010 ; clear interrupt
outb r0,0xDCFFFC ; clear interrupt
; lw r1,TickIRQAddr
; jal r31,[r1]
; lw r1,Milliseconds
1186,7 → 1672,7
subu r2,r2,r1 ; one less row
lea r3,TEXTSCR
scrup1:
inch r4,[r3+r1] ; indexed addressing example
inch r4,[r3+r1*2] ; indexed addressing example
outc r4,[r3]
addui r3,r3,#2
loop r2,scrup1
1237,7 → 1723,7
bleui r1,#'Z',atoscr1
bgtui r1,#'z',atoscr1
bltui r1,#'a',atoscr1
subi r1,r1,#0x60
subui r1,r1,#0x60
atoscr1:
ori r1,r1,#0x100
ret
1261,16 → 1747,16
;------------------------------------------------------------------------------
;
CalcScreenLoc:
lc r1,CursorRow
lbu r1,CursorRow
andi r1,r1,#0x7f
lea r3,TEXTREG
inch r2,TEXT_COLS[r3]
mulu r2,r2,r1
lc r1,CursorCol
lbu r1,CursorCol
andi r1,r1,#0x7f
addu r2,r2,r1
outc r2,TEXT_CURPOS[r3]
shli r2,r2,#1
shlui r2,r2,#1
addui r1,r2,#TEXTSCR ; r1 = screen location
ret
 
1286,19 → 1772,21
sw r2,8[sp]
sw r3,16[sp]
sw lr,24[sp]
sc r0,CursorCol ; just set cursor column to zero on a CR
sb r0,CursorCol ; just set cursor column to zero on a CR
bra dcx7
dccr:
; beqi r1,#CTRLK,dccr1
bnei r1,#0x91,dcx6 ; cursor right ?
dccr1:
subui sp,sp,#32
sw r1,[sp]
sw r2,8[sp]
sw r3,16[sp]
sw lr,24[sp]
lc r2,CursorCol
lbu r2,CursorCol
beqi r2,#56,dcx7
addui r2,r2,#1
sc r2,CursorCol
sb r2,CursorCol
dcx7:
call CalcScreenLoc
lw lr,24[sp]
1307,40 → 1795,46
lw r1,[sp]
ret #32
dcx6:
; beqi r1,#CTRLI,dccu1
bnei r1,#0x90,dcx8 ; cursor up ?
dccu1:
subui sp,sp,#32
sw r1,[sp]
sw r2,8[sp]
sw r3,16[sp]
sw lr,24[sp]
lc r2,CursorRow
lbu r2,CursorRow
beqi r2,#0,dcx7
subui r2,r2,#1
sc r2,CursorRow
sb r2,CursorRow
bra dcx7
dcx8:
; beqi r1,#CTRLJ,dccl1
bnei r1,#0x93,dcx9 ; cursor left ?
dccl1:
subui sp,sp,#32
sw r1,[sp]
sw r2,8[sp]
sw r3,16[sp]
sw lr,24[sp]
lc r2,CursorCol
lbu r2,CursorCol
beqi r2,#0,dcx7
subui r2,r2,#1
sc r2,CursorCol
sb r2,CursorCol
bra dcx7
dcx9:
; beqi r1,#CTRLM,dccd1
bnei r1,#0x92,dcx10 ; cursor down ?
dccd1:
subui sp,sp,#32
sw r1,[sp]
sw r2,8[sp]
sw r3,16[sp]
sw lr,24[sp]
lc r2,CursorRow
lbu r2,CursorRow
beqi r2,#30,dcx7
addui r2,r2,#1
sc r2,CursorRow
sb r2,CursorRow
bra dcx7
dcx10:
bnei r1,#0x94,dcx11 ; cursor home ?
1349,12 → 1843,12
sw r2,8[sp]
sw r3,16[sp]
sw lr,24[sp]
lc r2,CursorCol
lbu r2,CursorCol
beq r2,r0,dcx12
sc r0,CursorCol
sb r0,CursorCol
bra dcx7
dcx12:
sc r0,CursorRow
sb r0,CursorRow
bra dcx7
dcx11:
subui sp,sp,#48
1366,18 → 1860,18
sw lr,40[sp]
bnei r1,#0x99,dcx13 ; delete ?
call CalcScreenLoc
or r3,r0,r1 ; r3 = screen location
lc r1,CursorCol ; r1 = cursor column
mov r3,r1 ; r3 = screen location
lbu r1,CursorCol ; r1 = cursor column
bra dcx5
dcx13:
bnei r1,#CTRLH,dcx3 ; backspace ?
lc r2,CursorCol
lbu r2,CursorCol
beq r2,r0,dcx4
subui r2,r2,#1
sc r2,CursorCol
sb r2,CursorCol
call CalcScreenLoc ; a0 = screen location
or r3,r0,r1 ; r3 = screen location
lc r1,CursorCol
mov r3,r1 ; r3 = screen location
lbu r1,CursorCol
dcx5:
inch r2,2[r3]
outc r2,[r3]
1392,12 → 1886,14
bra dcx4
dcx3:
beqi r1,#'\n',dclf ; linefeed ?
or r4,r0,r1 ; save r1 in r4
mov r4,r1 ; save r1 in r4
call CalcScreenLoc ; r1 = screen location
or r3,r0,r1 ; r3 = screen location
or r1,r0,r4 ; restore r1
mov r3,r1 ; r3 = screen location
mov r1,r4 ; restore r1
call AsciiToScreen ; convert ascii char to screen char
outc r1,[r3]
lc r1,CharColor
outc r1,0x10000[r3]
call IncCursorPos
bra dcx4
dclf:
1422,12 → 1918,12
sw r2,8[sp]
sw r3,16[sp]
sw lr,24[sp]
lc r1,CursorCol
lbu r1,CursorCol
addui r1,r1,#1
sc r1,CursorCol
sb r1,CursorCol
inch r2,TEXTREG+TEXT_COLS
bleu r1,r2,icc1
sc r0,CursorCol ; column = 0
sb r0,CursorCol ; column = 0
bra icr1
IncCursorRow:
subui sp,sp,#32
1436,13 → 1932,13
sw r3,16[sp]
sw lr,24[sp]
icr1:
lc r1,CursorRow
lbu r1,CursorRow
addui r1,r1,#1
sc r1,CursorRow
sb r1,CursorRow
inch r2,TEXTREG+TEXT_ROWS
bleu r1,r2,icc1
subui r2,r2,#1 ; backup the cursor row, we are scrolling up
sc r2,CursorRow
sb r2,CursorRow
call ScrollUp
icc1:
call CalcScreenLoc
1457,7 → 1953,7
;------------------------------------------------------------------------------
;
DisplayString:
subi sp,sp,#24
subui sp,sp,#24
sw r1,[sp]
sw r2,8[sp]
sw lr,16[sp]
1482,7 → 1978,7
addui r30,r30,#8
 
CRLF:
subui r30,r30,#16
subui sp,sp,#16
sw r1,[sp]
sw lr,8[sp]
setlo r1,#'\r'
1493,6 → 1989,11
lw r1,[sp]
ret #16
 
; Call the Tiny BASIC routine to display a number
;
DisplayNum:
jmp PRTNUM
 
;------------------------------------------------------------------------------
; Display nybble in r1
;------------------------------------------------------------------------------
1528,6 → 2029,38
ret #16
 
;------------------------------------------------------------------------------
; Display the char in r1
;------------------------------------------------------------------------------
;
DisplayCharr:
subui sp,sp,#16
sw r1,[sp]
sw lr,8[sp]
rori r1,r1,#8
call DisplayByte
roli r1,r1,#8
call DisplayByte
lw lr,8[sp]
lw r1,[sp]
ret #16
 
;------------------------------------------------------------------------------
; Display the half-word in r1
;------------------------------------------------------------------------------
;
DisplayHalf:
subui sp,sp,#16
sw r1,[sp]
sw lr,8[sp]
rori r1,r1,#16
call DisplayCharr
roli r1,r1,#16
call DisplayCharr
lw lr,8[sp]
lw r1,[sp]
ret #16
 
;------------------------------------------------------------------------------
; Display the 64 bit word in r1
;------------------------------------------------------------------------------
;
1551,7 → 2084,7
; destroys r1,r3
;------------------------------------------------------------------------------
;
DisplayMem:
DisplayMemB:
subui sp,sp,#24
sw r1,[sp]
sw r3,8[sp]
1564,7 → 2097,7
dspmem1:
setlo r1,#' '
call DisplayChar
lb r1,[r2]
lbu r1,[r2]
call DisplayByte
addui r2,r2,#1
loop r3,dspmem1
1574,6 → 2107,47
lw r1,[sp]
ret #24
 
DisplayMemC:
subui sp,sp,#24
sw r1,[sp]
sw r3,8[sp]
sw lr,16[sp]
setlo r1,#':'
call DisplayChar
mov r1,r2
call DisplayWord
setlo r3,#3
dspmemc1:
setlo r1,#' '
call DisplayChar
lcu r1,[r2]
call DisplayCharr
addui r2,r2,#2
loop r3,dspmemc1
call CRLF
lw lr,16[sp]
lw r3,8[sp]
lw r1,[sp]
ret #24
 
DisplayMemW:
subui sp,sp,#24
sw r1,[sp]
sw lr,16[sp]
setlo r1,#':'
call DisplayChar
mov r1,r2
call DisplayWord
setlo r1,#' '
call DisplayChar
lw r1,[r2]
call DisplayWord
addui r2,r2,#8
call CRLF
lw lr,16[sp]
lw r1,[sp]
ret #24
 
;------------------------------------------------------------------------------
; Converts binary number in r1 into BCD number in r2 and r1.
;------------------------------------------------------------------------------
1589,7 → 2163,7
setlo r2,#10
setlo r8,#19 ; number of digits to produce - 1
bta1:
mod r3,r1,r2
modu r3,r1,r2
shli r3,r3,#60 ; shift result to uppermost bits
shli r7,r5,#60 ; copy low order nybble of r5 to r4 topmost nybble
shrui r4,r4,#4
1695,7 → 2269,9
 
 
;==============================================================================
; System Monitor Program
;==============================================================================
;
Monitor:
lea sp,STACKTOP0 ; top of stack; reset the stack pointer
sb r0,KeybdEcho ; turn off keyboard echo
1707,6 → 2283,8
; Get characters until a CR is keyed
;
Prompt3:
; lw r1,#2 ; get keyboard character
; syscall #417
call KeybdGetChar
beqi r1,#-1,Prompt3 ; wait for a character
beqi r1,#CR,Prompt1
1716,9 → 2294,9
; Process the screen line that the CR was keyed on
;
Prompt1:
sc r0,CursorCol ; go back to the start of the line
sb r0,CursorCol ; go back to the start of the line
call CalcScreenLoc ; r1 = screen memory location
or r3,r1,r0
mov r3,r1
inch r1,[r3]
addui r3,r3,#2
call ScreenToAscii
1732,19 → 2310,38
Prompt2:
beqi r1,#':',Editmem ; $: - edit memory
beqi r1,#'D',Dumpmem ; $D - dump memory
beqi r1,#'B',CSTART ; $B - start tiny basic
beqi r1,#'F',Fillmem ; $F - fill memory
Prompt7:
bnei r1,#'B',Prompt4 ; $B - start tiny basic
jmp CSTART
Prompt4:
beqi r1,#'J',ExecuteCode ; $J - execute code
beqi r1,#'L',LoadS19 ; $L - load S19 file
beqi r1,#'?',DisplayHelp ; $? - display help
bnei r1,#'L',Prompt9 ; $L - load S19 file
jmp LoadSector
Prompt9:
bnei r1,#'?',Prompt10 ; $? - display help
lea r1,HelpMsg
call DisplayString
jmp Monitor
Prompt10:
beqi r1,#'C',TestCLS ; $C - clear screen
beqi r1,#'R',RandomLinesCall
beqi r1,#'I',Invaders
beqi r1,#'P',Piano
bra Monitor
bnei r1,#'R',Prompt12
jmp RandomLinesCall
Prompt12:
bnei r1,#'I',Prompt13
jmp Invaders
Prompt13:
bnei r1,#'P',Prompt14
jmp Piano
Prompt14:
bnei r1,#'T',Prompt15
call tmp_read
Prompt15:
jmp Monitor
 
RandomLinesCall:
call RandomLines
bra Monitor
jmp Monitor
 
TestCLS:
inch r1,[r3]
1759,26 → 2356,22
sb r0,CursorCol
sb r0,CursorRow
call CalcScreenLoc
bra Monitor
jmp Monitor
DisplayHelp:
setlo r1,HelpMsg
call DisplayString
bra Monitor
 
align 16
HelpMsg:
db "? = Display help",CR,LF
db "CLS = clear screen",CR,LF
db ": = Edit memory bytes",CR,LF
db "L = Load S19 file",CR,LF
db "D = Dump memory",CR,LF
db "D[B|C|H|W] = Dump memory",CR,LF
db "F[B|C|H|W] = Fill memory",CR,LF
db "B = start tiny basic",CR,LF
db "J = Jump to code",CR,LF
db "I = Invaders",CR,LF
db "R = Random lines",CR,LF
db "T = get temperature",CR,LF
db "P = Piano",CR,LF,0
align 16
align 4
 
;------------------------------------------------------------------------------
; Ignore blanks in the input
1813,7 → 2406,7
sb r1,[r5]
addui r5,r5,#1
loop r4,edtmem1
bra Monitor
jmp Monitor
 
;------------------------------------------------------------------------------
; Execute code at the specified address.
1823,27 → 2416,96
call ignBlanks
call GetHexNumber
jal r31,[r1]
bra Monitor
jmp Monitor
 
LoadSector:
call ignBlanks
call GetHexNumber
lw r2,#0x3800
call spi_read_sector
jmp Monitor
 
;------------------------------------------------------------------------------
; Do a memory dump of the requested location.
;------------------------------------------------------------------------------
;
DumpMem:
inch r1,[r3]
addui r3,r3,#2
call ScreenToAscii
mov r6,r1 ; r6 = fill type character
call ignBlanks
call GetHexNumber
call GetHexNumber ; get start address of dump
mov r2,r1
call ignBlanks
call GetHexNumber ; get number of bytes to dump
shrui r1,r1,#3 ; 1/8 as many dump rows
bnei r1,#0,Dumpmem2
lw r1,#1 ; dump at least one row
Dumpmem2:
call CRLF
call DisplayMem
call DisplayMem
call DisplayMem
call DisplayMem
call DisplayMem
call DisplayMem
call DisplayMem
call DisplayMem
beqi r6,#'W',DumpmemW
; beqi r6,#'H',DumpmemH
beqi r6,#'C',DumpmemC
DumpmemB:
call DisplayMemB
loop r1,DumpmemB
jmp Monitor
DumpmemC:
call DisplayMemC
loop r1,DumpmemC
jmp Monitor
DumpmemW:
call DisplayMemW
loop r1,DumpmemW
jmp Monitor
 
; call DisplayMem
; call DisplayMem
; call DisplayMem
; call DisplayMem
; call DisplayMem
; call DisplayMem
; call DisplayMem
bra Monitor
 
Fillmem:
inch r1,[r3]
addui r3,r3,#2
call ScreenToAscii
mov r6,r1 ; r6 = fill type character
call ignBlanks
call GetHexNumber ; get start address of dump
mov r2,r1
call ignBlanks
call GetHexNumber ; get number of bytes to fill
mov r5,r1
call ignBlanks
call GetHexNumber ; get the fill byte
beqi r6,#'C',FillmemC
beqi r6,#'H',FillmemH
beqi r6,#'W',FillmemW
FillmemB:
sb r1,[r2]
addui r2,r2,#1
loop r5,FillmemB
jmp Monitor
FillmemC:
sc r1,[r2]
addui r2,r2,#2
loop r5,FillmemC
jmp Monitor
FillmemH:
sh r1,[r2]
addui r2,r2,#4
loop r5,FillmemH
jmp Monitor
FillmemW:
sw r1,[r2]
addui r2,r2,#8
loop r5,FillmemW
jmp Monitor
 
;------------------------------------------------------------------------------
; Get a hexidecimal number. Maximum of sixteen digits.
; R3 = text pointer (updated)
1981,7 → 2643,7
ProcessS9:
call S19Get16BitAddress
sw r5,S19StartAddress
bra Monitor
jmp Monitor
 
S19Get16BitAddress:
subui sp,sp,#8
2063,11 → 2725,13
;--------------------------------------------------------------------------
; Draw random lines on the bitmap screen.
;--------------------------------------------------------------------------
;
RandomLines:
subui sp,sp,#24
sw r1,[sp]
sw r3,8[sp]
sw lr,16[sp]
sw r0,ctx3start ; prevent restarting context over and over again
rl5:
gran
mfspr r1,rand ; select a random color
2076,33 → 2740,34
gran
mfspr r1,rand
lw r3,#1364
mod r1,r1,r3
modu r1,r1,r3
outh r1,GACCEL+8
rl2: ; random X1
gran
mfspr r1,rand
lw r3,#1364
mod r1,r1,r3
modu r1,r1,r3
outh r1,GACCEL+16
rl3: ; random Y0
gran
mfspr r1,rand
lw r3,#768
mod r1,r1,r3
modu r1,r1,r3
outh r1,GACCEL+12
rl4: ; random Y1
gran
mfspr r1,rand
lw r3,#768
mod r1,r1,r3
modu r1,r1,r3
outh r1,GACCEL+20
setlo r1,#2 ; draw line command
outh r1,GACCEL+60
rl8:
call KeybdGetChar
beqi r1,#CTRLC,rl7
beqi r1,#'r',rl5
bra rl8
; call KeybdGetChar
; beqi r1,#CTRLC,rl7
inch r1,GACCEL+56 ; ensure controller is in IDLE state
bne r1,r0,rl8
bra rl5
rl7:
lw lr,16[sp]
lw r3,8[sp]
2138,9 → 2803,9
sac971: ; wait for status to register 0xF (all ready)
call KeybdGetChar ; see if we needed to CTRL-C
beqi r1,#CTRLC,sac973
outc r1,AC97+0x68 ; wait for dirty bit to clear
inch r1,AC97+0x68 ; wait for dirty bit to clear
bne r1,r0,sac971
outc r1,AC97+0x26 ; check status at reg h26, wait for
inch r1,AC97+0x26 ; check status at reg h26, wait for
andi r1,r1,#0x0F ; analogue to be ready
bnei r1,#0x0F,sac974
sac973:
2153,7 → 2818,7
sac972:
call KeybdGetChar
beqi r1,#CTRLC,sac975
outc r1,AC97+0x68 ; wait for dirty bits to clear
inch r1,AC97+0x68 ; wait for dirty bits to clear
bne r1,r0,sac972 ; wait a while for the settings to take effect
sac975:
lw lr,8[sp]
2184,7 → 2849,7
outc r1,PSGADSR0
ori r1,r0,#0x1104 ; gate, output enable, triangle waveform
outc r1,PSGCTRL0
ori r1,r0,#25000000 ; delay about 1s
ori r1,r0,#2500000 ; delay about 1s
beep1:
loop r1,beep1
setlo r1,#13
2191,7 → 2856,7
outb r1,LED
ori r1,r0,#0x0104 ; gate off, output enable, triangle waveform
outc r1,PSGCTRL0
ori r1,r0,#25000000 ; delay about 1s
ori r1,r0,#2500000 ; delay about 1s
beep2:
loop r1,beep2
setlo r1,#16
2328,30 → 2993,37
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
DisplayDatetime:
subui sp,sp,#32
subui sp,sp,#48
sw r1,[sp]
sw r2,8[sp]
sw r3,16[sp]
sw r4,24[sp]
sw r5,32[sp]
sw lr,24[sp]
call CursorOff
lc r2,CursorRow
lc r3,CursorCol
outw r0,DATETIME+24 ; trigger a snapshot
lw r1,#46 ; move cursor down to last display line
sc r1,CursorRow
lw r1,#64
sc r1,CursorCol
inw r1,DATETIME ; get the snapshotted date and time
lw r1,#3 ; get cursor position
syscall #410
mov r4,r1 ; r4 = row
mov r5,r2 ; r5 = col
lw r1,#2 ; set cursor position
lw r2,#46 ; move cursor down to last display line
lw r3,#64
syscall #410
lw r1,#1 ; get the snapshotted date and time
syscall #416
call DisplayWord ; display on screen
sc r2,CursorRow ; restore cursor position
sc r3,CursorCol
call CalcScreenLoc
lw r1,#2 ; restore cursor position
mov r2,r4 ; r2 = row
mov r3,r5 ; r3 = col
syscall #410
call CursorOn
lw lr,24[sp]
lw r3,16[sp]
lw r2,8[sp]
lw r1,[sp]
ret #32
lw r4,24[sp]
lw r5,32[sp]
ret #48
 
;==============================================================================
;==============================================================================
2537,6 → 3209,740
 
;==============================================================================
;==============================================================================
;
; Initialize the SD card
; Returns
; r = 0 if successful, 1 otherwise
;
spi_init:
subui sp,sp,#24
sw lr,[sp]
sw r2,8[sp]
sw r3,16[sp]
lea r3,SPIMASTER
lw r1,#SPI_INIT_SD
outb r1,SPI_TRANS_TYPE_REG[r3]
lw r1,#SPI_TRANS_START
outb r1,SPI_TRANS_CTRL_REG[r3]
nop
spi_init1:
inb r1,SPI_TRANS_STATUS_REG[r3]
mov r2,r1 ; note: some time needs to be wasted
mov r1,r2 ; between status reads.
beqi r1,#SPI_TRANS_BUSY,spi_init1
inb r1,SPI_TRANS_ERROR_REG[r3]
bfext r1,r1,#1,#0
bne r1,#SPI_INIT_NO_ERROR,spi_error
lea r1,spi_init_ok_msg
call DisplayString
xor r1,r1,r1
bra spi_init_exit
spi_error:
call DisplayByte
lea r1,spi_init_error_msg
call DisplayString
lw r1,#1
spi_init_exit:
lw lr,[sp]
lw r2,8[sp]
lw r3,16[sp]
ret #24
 
 
; SPI read sector
;
; r1= sector number to read
; r2= address to place read data
; Returns:
; r1 = 0 if successful
;
spi_read_sector:
subui sp,sp,#40
sw lr,[sp]
sw r5,8[sp]
sw r2,16[sp]
sw r3,24[sp]
sw r4,32[sp]
lea r3,SPIMASTER
 
; spi master wants a byte address, so we multiply the sector number
; by 512.
shlui r1,r1,#9
outb r1,SPI_SD_ADDR_7_0_REG[r3]
shrui r1,r1,#8
outb r1,SPI_SD_ADDR_15_8_REG[r3]
shrui r1,r1,#8
outb r1,SPI_SD_ADDR_23_16_REG[r3]
shrui r1,r1,#8
outb r1,SPI_SD_ADDR_31_24_REG[r3]
; Force the reciever fifo to be empty, in case a prior error leaves it
; in an unknown state.
lw r1,#1
outb r1,SPI_RX_FIFO_CTRL_REG[r3]
 
lw r1,#RW_READ_SD_BLOCK
outb r1,SPI_TRANS_TYPE_REG[r3]
lw r1,#SPI_TRANS_START
outb r1,SPI_TRANS_CTRL_REG[r3]
nop
spi_read_sect1:
inb r1,SPI_TRANS_STATUS_REG[r3]
mov r4,r1 ; just a delay between consecutive status reg reads
mov r1,r4
beqi r1,#SPI_TRANS_BUSY,spi_read_sect1
inb r1,SPI_TRANS_ERROR_REG[r3]
bfext r1,r1,#3,#2
bnei r1,#SPI_READ_NO_ERROR,spi_read_error
lw r4,#512 ; read 512 bytes from fifo
spi_read_sect2:
inb r1,SPI_RX_FIFO_DATA_REG[r3]
sb r1,[r2]
addui r2,r2,#1
loop r4,spi_read_sect2
xor r1,r1,r1
bra spi_read_ret
spi_read_error:
call DisplayByte
lea r1,spi_read_error_msg
call DisplayString
lw r1,#1
spi_read_ret:
lw lr,[sp]
lw r5,8[sp]
lw r2,16[sp]
lw r3,24[sp]
lw r4,32[sp]
ret #40
 
; Read the boot sector from the disk.
; Must find it first by looking for the signature bytes 'EB' and '55AA'.
;
spi_read_boot:
subui sp,sp,#32
sw lr,[sp]
sw r2,8[sp]
sw r3,16[sp]
sw r5,24[sp]
sw r0,startSector ; default starting sector
lw r3,#500 ;1934720 ; number of sectors to read (up to 1GB)
lw r5,#0 ; r5 = starting address
spi_read_boot1:
mov r1,r5 ; r1 = sector number
lw r2,#8 ; eight digits
sb r0,CursorCol
call DisplayNum ; Display the sector number being checked
mov r1,r5 ; r1 = sector number
lw r2,#0x100800000 ; r2 = target address
call spi_read_sector
 
; The following displays the contents of the sector
; lw r1,#0x10
; lw r2,#0x3800
;spi_read_boot5:
; call DisplayMemB
; loop r1,spi_read_boot5
 
addui r5,r5,#1 ; move to next sector
lbu r1,0x100800000
cmpui r2,r1,#0xEB
beq r2,r0,spi_read_boot2
spi_read_boot3:
loop r3,spi_read_boot1
lw r1,#1 ; r1 = 1 for error
bra spi_read_boot4
spi_read_boot2:
lea r1,msgFoundEB
call DisplayString
lbu r1,0x1008001FE ; check for 0x55AA signature
bnei r1,#0x55,spi_read_boot3
lbu r1,0x1008001FF
bnei r1,#0xAA,spi_read_boot3
subui r1,r5,#1
sw r1,startSector
xor r1,r1,r1 ; r1 = 0, for okay status
spi_read_boot4:
lw lr,[sp]
lw r2,8[sp]
lw r3,16[sp]
lw r5,24[sp]
ret #32
 
msgFoundEB:
db "Found EB code.",CR,LF,0
.align 4
 
; Load the FAT tables into memory
;
loadFAT:
subui sp,sp,#8
sw lr,[sp]
lcu r3,0x100800016 ; sectors per FAT
lbu r2,0x100800010 ; number of FATs
mulu r3,r3,r2 ; offset
lea r2,0x100800200 ; where to place FAT
lcu r5,0x10080000E ; r5 = # reserved sectors before FAT
lw r6,startSector
addu r5,r5,r6
loadFAT1:
mov r1,r5 ; r1 = sector #
call spi_read_sector
addui r5,r5,#1
addui r2,r2,#512 ; advance 512 bytes
loop r3,loadFAT1
lw lr,[sp]
ret #8
 
; Load the root directory from disk
; r2 = where to place root directory in memory
;
loadRootDirectory:
lcu r3,0x100800016 ; sectors per FAT
lbu r4,0x100800010 ; number of FATs
mulu r3,r3,r4 ; offset
lcu r4,0x10080000E ; r2 = # reserved sectors before FAT
addu r3,r3,r4 ; r3 = root directory sector number
lw r6,startSector
addu r5,r3,r6 ; r5 = root directory sector number
; we have to use two byte loads here because the number is at an unaligned data address
lbu r7,0x100800011 ; r7 <= number of root directory entries
lbu r8,0x100800012
shlui r8,r8,#8
or r7,r7,r8
mov r8,r7 ; r8 = number of root directory entries
shlui r7,r7,#5 ; r7 *=32 = size of root directory table (bytes)
shrui r7,r7,#9 ; r7 /= 512 = number of sectors in root directory
mov r3,r7
loadRootDir1:
mov r1,r5
call spi_read_sector
addui r5,r5,#1
addui r2,r2,#512
loop r3,loadRootDir1
 
loadBootFile:
; For now we cheat and just go directly to sector 512.
bra loadBootFileTmp
 
lcu r3,0x100800016 ; sectors per FAT
lbu r2,0x100800010 ; number of FATs
mulu r3,r3,r2 ; offset
lcu r2,0x10080000E ; r2 = # reserved sectors before FAT
addu r3,r3,r2 ; r3 = root directory sector number
; we have to use two byte loads here because the number is at an unaligned data address
lbu r7,0x100800011 ; r7 <= number of root directory entries
lbu r8,0x100800012
shlui r8,r8,#8
or r7,r7,r8
mov r8,r7 ; r8 = number of root directory entries
shlui r7,r7,#5 ; r7 *=32 = size of root directory table (bytes)
shrui r7,r7,#9 ; r7 /= 512 = number of sectors in root directory
 
; now we need to fetch the sectors of the root directory and put them somewhere in
; memory
;
loadBootFile4:
lw r1,[r3] ; get filename
cmpui r1,r1,#0x454C4946544F4F42 ; "BOOTFILE"
beq r1,r0,loadBootFile5
loadBootFile3:
addui r3,r3,#32 ; move to next directory entry
loop r7,loadBootFile4
; boot file not found
 
; here we found the file in the directory
;
loadBootFile5:
lcu r2,0x1a[r3] ; get starting cluster
lcu r7,0x100800011 ; r7 = number of root directory entries
shlui r7,r7,#5 ; r7 *=32 = size of root directory table (bytes)
shrui r7,r7,#9 ; r7 /= 512 = number of sectors in root directory
 
loadBootFileTmp:
; We load the number of sectors per cluster, then load a single cluster of the file.
; This is 16kib
lbu r3,0x10080000D ; sectors per cluster
lea r2,0x100800200 ; where to place FAT in memory
lw r5,startSector ; r5=start sector of disk
addui r5,r5,#512 ; r5= sector 512
loadBootFile1:
mov r1,r5 ; r1=sector to read
call spi_read_sector
addui r5,r5,#1 ; r5 = next sector
addui r2,r2,#512
loop r3,loadBootFile1
lhu r1,0x100800200 ; make sure it's bootable
bnei r1,#0x544F4F42,loadBootFile2
lw r1,#0x16
lea r1,msgJumpingToBoot
call DisplayString
lw r1,#0x100800204
jal lr,[r1]
jmp Monitor
loadBootFile2:
lea r1,msgNotBootable
call DisplayString
jmp Monitor
 
msgJumpingToBoot:
db "Jumping to boot",0
msgNotBootable:
db "SD card not bootable.",0
spi_init_ok_msg:
db "SD card initialized okay.",0
spi_init_error_msg:
db ": error occurred initializing the SD card.",0
spi_boot_error_msg:
db "SD card boot error",0
spi_read_error_msg:
db "SD card read error",0
 
.align 4
 
;==============================================================================
; Ethernet
;==============================================================================
my_MAC1 EQU 0x00
my_MAC2 EQU 0xFF
my_MAC3 EQU 0xEE
my_MAC4 EQU 0xF0
my_MAC5 EQU 0xDA
my_MAC6 EQU 0x42
 
.bss
eth_unique_id dw 0
 
.code
 
; Initialize the ethmac controller.
; Supply a MAC address, set MD clock
;
eth_init:
lea r3,ETHMAC
lw r1,#0x64 ; 100
sh r1,MIIMODER[r3]
lw r1,#7 ; PHY address
sh r1,MIIADDRESS[r3]
lw r1,#0xEEF0DA42
sh r1,0x40[r3] ; MAC0
lw r1,#0x00FF
sh r1,0x44[r3] ; MAC1
ret
 
; Request a packet and display on screen
; r1 = address where to put packet
;
eth_request_packet:
subui sp,sp,#24
sw r3,[sp]
sw r2,8[sp]
sw r4,16[sp]
lea r3,ETHMAC
lw r2,#4 ; clear rx interrupt
sh r2,4[r3]
sh r1,0x604[r3] ; storage address
lw r2,#0xe000 ; enable interrupt
sh r2,0x600[r3]
eth1:
nop
inh r2,4[r3]
bfext r2,r2,#2,#2 ; get bit #2
beq r2,r0,eth1
inh r2,0x600[r3] ; get from descriptor
shrui r2,r2,#16
lw r3,#0
lea r4,TEXTSCR+7560 ; second last line of screen
eth20:
lbu r2,[r1+r3] ; get byte
sc r2,[r4+r3*2] ; store to screen
addui r3,r3,#1
cmpui r2,r3,#83
bne r2,r0,eth20
lw r3,[sp]
lw r2,8[sp]
lw r4,16[sp]
ret #24
 
; r1 = packet address
;
eth_interpret_packet:
subui sp,sp,#16
sw r3,[sp]
sw r2,8[sp]
lbu r2,12[r1]
lbu r3,13[r1]
bnei r2,#8,eth2 ; 0x806 ?
bnei r3,#6,eth2
lw r1,#2 ; return r1 = 2 for ARP
eth5:
lw r3,[sp]
lw r2,8[sp]
ret #16
eth2:
bnei r2,#8,eth3 ; 0x800 ?
bnei r3,#0,eth3
lbu r2,23[r1]
bnei r2,#1,eth4
lw r1,#1
bra eth5 ; return 1 ICMP
eth4:
bnei r2,#0x11,eth6
lw r1,#3 ; return 3 for UDP
bra eth5
eth6:
bnei r2,#6,eth7
lw r1,#4 ; return 4 for TCP
bra eth5
eth7:
eth3:
xor r1,r1,r1 ; return zero for unknown
lw r3,[sp]
lw r2,8[sp]
ret #16
 
; r1 = address of packet to send
; r2 = packet length
;
eth_send_packet:
subui sp,sp,#16
sw r3,[sp]
sw r4,8[sp]
lea r3,ETHMAC
; wait for tx buffer to be clear
eth8:
inh r4,0x400[r3]
bfext r4,r4,#15,#15
beqi r4,#1,eth8
lw r4,#1 ; clear tx interrupt
sh r4,4[r3]
; set address
sh r1,0x404[r3]
; set the packet length field and enable interrupts
shlui r2,r2,#16
ori r2,r2,#0xF000
sh r2,0x400[r3]
lw r4,8[sp]
lw r3,[sp]
ret #16
 
; Only for IP type packets (not ARP)
; r1 = rx buffer address
; r2 = swap flag
; Returns:
; r1 = data start index
;
eth_build_packet:
subui sp,sp,#64
sw r3,[sp]
sw r4,8[sp]
sw r5,16[sp]
sw r6,24[sp]
sw r7,32[sp]
sw r8,40[sp]
sw r9,48[sp]
sw r10,56[sp]
lbu r3,6[r1]
lbu r4,7[r1]
lbu r5,8[r1]
lbu r6,9[r1]
lbu r7,10[r1]
lbu r8,11[r1]
; write to destination header
sb r3,[r1]
sb r4,1[r1]
sb r5,2[r1]
sb r6,3[r1]
sb r7,4[r1]
sb r8,5[r1]
; write to source header
lw r3,#my_MAC1
sb r3,6[r1]
lw r3,#my_MAC2
sb r3,7[r1]
lw r3,#my_MAC3
sb r3,8[r1]
lw r3,#my_MAC4
sb r3,9[r1]
lw r3,#my_MAC5
sb r3,10[r1]
lw r3,#my_MAC6
sb r3,11[r1]
bnei r2,#1,eth16 // if (swap)
lbu r3,26[r1]
lbu r4,27[r1]
lbu r5,28[r1]
lbu r6,29[r1]
; read destination
lbu r7,30[r1]
lbu r8,31[r1]
lbu r9,32[r1]
lbu r10,33[r1]
; write to sender
sb r7,26[r1]
sb r8,27[r1]
sb r9,28[r1]
sb r10,29[r1]
; write destination
sb r3,30[r1]
sb r4,31[r1]
sb r5,32[r1]
sb r6,33[r1]
eth16:
lw r3,eth_unique_id
addui r3,r3,#1
sw r3,eth_unique_id
sb r3,19[r1]
shrui r3,r3,#8
sb r3,18[r1]
lbu r3,14[r1]
andi r3,r3,#0xF
shlui r3,r3,#2 ; *4
addui r1,r3,#14 ; return datastart in r1
lw r3,[sp]
lw r4,8[sp]
lw r5,16[sp]
lw r6,24[sp]
lw r7,32[sp]
lw r8,40[sp]
lw r9,48[sp]
lw r10,56[sp]
ret #64
 
; Compute IPv4 checksum of header
; r1 = packet address
; r2 = data start
;
eth_checksum:
subui sp,sp,#24
sw r3,[sp]
sw r4,8[sp]
sw r5,16[sp]
; set checksum to zero
sb r0,24[r1]
sb r0,25[r1]
xor r3,r3,r3 ; r3 = sum = zero
lw r4,#14
eth15:
mov r5,r2
subui r5,r5,#1 ; r5 = datastart - 1
bge r4,r5,eth14
lbu r5,[r1+r4] ; shi = [rx_addr+i]
lbu r6,1[r1+r4] ; slo = [rx_addr+i+1]
shlui r5,r5,#8
or r5,r5,r6 ; shilo
addu r3,r3,r5 ; sum = sum + shilo
addui r4,r4,#2 ; i = i + 2
bra eth15
eth14:
mov r5,r3 ; r5 = sum
andi r3,r3,#0xffff
shrui r5,r5,#16
addu r3,r3,r5
com r3,r3
sb r3,25[r1] ; low byte
shrui r3,r3,#8
sb r3,24[r1] ; high byte
sw r3,[sp]
sw r4,8[sp]
sw r5,16[sp]
ret #24
 
; r1 = packet address
; returns r1 = 1 if this IP
;
eth_verifyIP:
subui sp,sp,#32
sw r2,[sp]
sw r3,8[sp]
sw r4,16[sp]
sw r5,24[sp]
lbu r2,30[r1]
lbu r3,31[r1]
lbu r4,32[r1]
lbu r5,33[r1]
; Check for general broadcast
bnei r2,#0xFF,eth11
bnei r3,#0xFF,eth11
bnei r4,#0xFF,eth11
bnei r5,#0xFF,eth11
eth12:
lw r1,#1
eth13:
lw r2,[sp]
lw r3,8[sp]
lw r4,16[sp]
lw r5,24[sp]
ret #32
eth11:
mov r1,r2
shlui r1,r1,#8
or r1,r1,r3
shlui r1,r1,#8
or r1,r1,r4
shlui r1,r1,#8
or r1,r1,r5
beqi r1,#0xC0A8012A,eth12
xor r1,r1,r1
bra eth13
 
 
eth_main:
call eth_init
eth_loop:
xor r1,r1,r1
lw r1,#0x1_00000000 ; memory address zero
call eth_request_packet
call eth_interpret_packet ; r1 = packet type
 
bnei r1,#1,eth10
mov r2,r1 ; save off r1, r2 = packet type
lw r1,#0x1_00000000 ; memory address zero
call eth_verifyIP
mov r3,r1
mov r1,r2 ; r1 = packet type again
bnei r3,#1,eth10
 
lw r1,#0x1_00000000 ; memory address zero
lw r2,#1
call eth_build_packet
mov r3,r1 ; r3 = icmpstart
lw r1,#0x1_00000000 ; memory address zero
sb r0,[r1+r3] ; [rx_addr+icmpstart] = 0
lbu r2,17[r1]
addui r2,r2,#14 ; r2 = len
mov r6,r2 ; r6 = len
lbu r4,2[r1+r3] ; shi
lbu r5,3[r1+r3] ; slo
shlui r4,r4,#8
or r4,r4,r5 ; sum = {shi,slo};
com r4,r4 ; sum = ~sum
subui r4,r4,#0x800 ; sum = sum - 0x800
com r4,r4 ; sum = ~sum
sb r4,3[r1+r3]
shrui r4,r4,#8
sb r4,2[r1+r3]
mov r2,r3
call eth_checksum
lw r1,#0x1_00000000 ; memory address zero
mov r2,r6
call eth_send_packet
jmp eth_loop
eth10:
; r2 = rx_addr
bnei r1,#2,eth_loop ; Do we have ARP ?
; xor r2,r2,r2 ; memory address zero
lw r2,#1_00000000
; get the opcode
lbu r13,21[r2]
bnei r13,#1,eth_loop ; ARP request
; get destination IP address
lbu r9,38[r2]
lbu r10,39[r2]
lbu r11,40[r2]
lbu r12,41[r2]
; set r15 = destination IP
mov r15,r9
shlui r15,r15,#8
or r15,r15,r10
shlui r15,r15,#8
or r15,r15,r11
shlui r15,r15,#8
or r15,r15,r12
; Is it our IP ?
bnei r15,#0xC0A8012A,eth_loop; //192.168.1.42
; get source IP address
lbu r5,28[r2]
lbu r6,29[r2]
lbu r7,30[r2]
lbu r8,31[r2]
; set r14 = source IP
mov r14,r5
shlui r14,r14,#8
or r14,r14,r6
shlui r14,r14,#8
or r14,r14,r7
shlui r14,r14,#8
or r14,r14,r8
; Get the source MAC address
lbu r16,22[r2]
lbu r17,23[r2]
lbu r18,24[r2]
lbu r19,25[r2]
lbu r20,26[r2]
lbu r21,27[r2]
; write to destination header
sb r16,[r2]
sb r17,1[r2]
sb r18,2[r2]
sb r19,3[r2]
sb r20,4[r2]
sb r21,5[r2]
; and write to ARP destination
sb r16,32[r2]
sb r17,33[r2]
sb r18,34[r2]
sb r19,35[r2]
sb r20,36[r2]
sb r21,37[r2]
; write to source header
; stbc #0x00,6[r2]
; stbc #0xFF,7[r2]
; stbc #0xEE,8[r2]
; stbc #0xF0,9[r2]
; stbc #0xDA,10[r2]
; stbc #0x42,11[r2]
sb r0,6[r2]
lw r1,#0xFF
sb r1,7[r2]
lw r1,#0xEE
sb r1,8[r2]
lw r1,#0xF0
sb r1,9[r2]
lw r1,#0xDA
sb r1,10[r2]
lw r1,#0x42
sb r1,11[r2]
; write to ARP source
; stbc #0x00,22[r2]
; stbc #0xFF,23[r2]
; stbc #0xEE,24[r2]
; stbc #0xF0,25[r2]
; stbc #0xDA,26[r2]
; stbc #0x42,27[r2]
sb r0,22[r2]
lw r1,#0xFF
sb r1,23[r2]
lw r1,#0xEE
sb r1,24[r2]
lw r1,#0xF0
sb r1,25[r2]
lw r1,#0xDA
sb r1,26[r2]
lw r1,#0x42
sb r1,27[r2]
; swap sender / destination IP
; write sender
sb r9,28[r2]
sb r10,29[r2]
sb r11,30[r2]
sb r12,31[r2]
; write destination
sb r5,38[r2]
sb r6,39[r2]
sb r7,40[r2]
sb r8,41[r2]
; change request to reply
; stbc #2,21[r2]
lw r1,#2
sb r1,21[r2]
mov r1,r2 ; r1 = packet address
lw r2,#0x2A ; r2 = packet length
call eth_send_packet
jmp eth_loop
 
;==============================================================================
;==============================================================================
;****************************************************************;
; ;
; Tiny BASIC for the Raptor64 ;
2610,28 → 4016,28
lw sp,ENDMEM ; initialize stack pointer
subui sp,sp,#8
sw lr,[sp] ; save off return address
sc r0,CursorRow ; set screen output
sc r0,CursorCol
sb r0,CursorRow ; set screen output
sb r0,CursorCol
sb r0,CursorFlash
sw r0,pos
sh r0,pos
lw r2,#0x10000020 ; black chars, yellow background
sh r2,charToPrint
; sh r2,charToPrint
call ClearScreen
lea r1,msgInit ; tell who we are
call PRMESGAUX
; call PRMESGAUX
lea r1,msgInit ; tell who we are
call PRMESG
lw r1,TXTBGN ; init. end-of-program pointer
sw r1,TXTUNF
lw r1,ENDMEM ; get address of end of memory
subui r1,r1,#2048 ; reserve 2K for the stack
subui r1,r1,#4096 ; reserve 4K for the stack
sw r1,STKBOT
subui r1,r1,#8192 ; 1000 vars
subui r1,r1,#16384 ; 1000 vars
sw r1,VARBGN
call clearVars ; clear the variable area
lw r1,VARBGN ; calculate number of bytes free
lw r3,TXTUNF
sub r1,r1,r3
subu r1,r1,r3
setlo r2,#0
call PRTNUM
lea r1,msgBytesFree
2751,7 → 4157,7
; executed if none of the other table items are matched.
;
; Character-matching tables:
align 8
 
TAB1:
db "LIS",'T'+0x80 ; Direct commands
db "LOA",'D'+0x80
2873,7 → 4279,7
dw XP_OR
dw XP_ORX
 
.align 16
.align 4
 
;*
; r3 = match flag (trashed)
4652,7 → 6058,7
; return r1 = pointer to end of line + 1
 
PRTSTG:
sub sp,sp,#32
subui sp,sp,#32
sw r5,[sp]
sw r5,8[sp]
sw r7,16[sp]
4682,8 → 6088,7
subui sp,sp,#8
sw lr,[sp]
setlo r3,#'"'
setlo r4,#<QT3
sethi r4,#>QT3
lea r4,QT3
call TSTC ; *** QTSTG ***
setlo r2,#'"' ; it is a "
QT1:
4695,15 → 6100,13
bra RUNNXL ; if so, run next line
QT3:
setlo r3,#''''
setlo r4,#<QT4
sethi r4,#>QT4
lea r4,QT4
call TSTC ; is it a single quote?
setlo r2,#'''' ; if so, do same as above
bra QT1
QT4:
setlo r3,#'_'
setlo r4,#<QT5
sethi r4,#>QT5
lea r4,QT5
call TSTC ; is it an underline?
setlo r1,#CR ; if so, output a CR without LF
call GOOUT
4740,15 → 6143,16
sw r6,16[sp]
sw r7,24[sp]
sw lr,32[sp]
ori r7,r0,#NUMWKA ; r7 = pointer to numeric work area
lea r7,NUMWKA ; r7 = pointer to numeric work area
mov r6,r1 ; save number for later
mov r5,r2 ; r5 = min number of chars
bgt r1,r0,PN1 ; is it negative? if not
bgt r1,r0,PN2 ; is it negative? if not
neg r1,r1 ; else make it positive
subui r5,r5,#1 ; one less for width count
PN2:
lw r3,#10
PN1:
lw r3,#10
mod r2,r1,r3 ; r2 = r1 mod 10
modu r2,r1,r3 ; r2 = r1 mod 10
divui r1,r1,#10 ; r1 /= 10 divide by 10
addui r2,r2,#'0' ; convert remainder to ascii
sb r2,[r7] ; and store in buffer
4762,7 → 6166,7
call GOOUT
loop r5,PN3
PN4:
bgt r6,r0,PN5 ; is number negative?
bge r6,r0,PN5 ; is number negative?
setlo r1,#'-' ; if so, display the sign
call GOOUT
PN5:
4789,17 → 6193,16
sw r7,16[sp]
sw r8,24[sp]
sw lr,32[sp]
setlo r7,#<NUMWKA ; r7 = pointer to numeric work area
sethi r7,#>NUMWKA
lea r7,NUMWKA ; r7 = pointer to numeric work area
or r6,r1,r0 ; save number for later
setlo r5,#20 ; r5 = min number of chars
or r4,r1,r0
mov r4,r1
bgt r4,r0,PHN1 ; is it negative? if not
neg r4,r4 ; else make it positive
sub r5,r5,#1 ; one less for width count
subui r5,r5,#1 ; one less for width count
setlo r8,#20 ; maximum of 10 digits
PHN1:
or r1,r4,r0
mov r1,r4
andi r1,r1,#15
blt r1,#10,PHN7
addui r1,r1,#'A'-10
4808,9 → 6211,9
add r1,r1,#'0' ; convert remainder to ascii
PHN8:
sb r1,[r7] ; and store in buffer
add r7,r7,#1
sub r5,r5,#1 ; decrement width
shru r4,r4,#4
addui r7,r7,#1
subui r5,r5,#1 ; decrement width
shrui r4,r4,#4
beq r4,r0,PHN6 ; is it zero yet ?
loop r8,PHN1 ; safety
PHN6: ; test pad count
4824,7 → 6227,7
setlo r1,#'-' ; if so, display the sign
call GOOUT
PHN5:
sub r7,r7,#1
subui r7,r7,#1
lb r1,[r7] ; now unstack the digits and display
call GOOUT
cmpui r1,r7,#NUMWKA
4883,7 → 6286,7
addui sp,sp,#16
jal r0,[r4] ; jump to the routine
TC1:
add r8,r8,#1 ; if equal, bump text pointer
addui r8,r8,#1 ; if equal, bump text pointer
lw r1,8[sp]
lw lr,[sp]
ret #16
4908,17 → 6311,16
lb r3,[r8]
bltui r3,#'0',TSNMRET ; is it less than zero?
bgtui r3,#'9',TSNMRET ; is it greater than nine?
setlo r4,#0xFFFFFFFF
sethi r4,#0x07FFFFFF
lw r4,#0x07FFFFFF_FFFFFFFF
bleu r1,r4,TN2 ; see if there's room for new digit
setlo r1,msgNumTooBig
lea r1,msgNumTooBig
bra ERROR ; if not, we've overflowd
TN2:
mului r1,r1,#10 ; quickly multiply result by 10
addi r8,r8,#1 ; adjust text pointer
addui r8,r8,#1 ; adjust text pointer
andi r3,r3,#0x0F ; add in the new digit
add r1,r1,r3
addi r2,r2,#1 ; increment the no. of digits
addu r1,r1,r3
addui r2,r2,#1 ; increment the no. of digits
bra TN1
TSNMRET:
lw lr,[sp]
4940,7 → 6342,7
beqi r1,#' ',IGB1 ; see if it's a space
bnei r1,#'\t',IGBRET ; or a tab
IGB1:
add r8,r8,#1 ; increment the text pointer
addui r8,r8,#1 ; increment the text pointer
bra IGB2
IGBRET:
lw r1,[sp]
4958,11 → 6360,11
TOUPBUF:
subui sp,sp,#8
sw lr,[sp]
setlo r8,BUFFER ; set up text pointer
lea r8,BUFFER ; set up text pointer
setlo r3,#0 ; clear quote flag
TOUPB1:
lb r1,[r8] ; get the next text char.
add r8,r8,#1
addui r8,r8,#1
beqi r1,#CR,TOUPBRT ; is it end of line?
beqi r1,#'"',DOQUO ; a double quote?
beqi r1,#'''',DOQUO ; or a single quote?
4972,7 → 6374,7
bra TOUPB1 ; and go back for more
DOQUO:
bne r3,r0,DOQUO1; are we inside quotes?
or r3,r1,r0 ; if not, toggle inside-quotes flag
mov r3,r1 ; if not, toggle inside-quotes flag
bra TOUPB1
DOQUO1:
bne r3,r1,TOUPB1 ; make sure we're ending proper quote
4986,9 → 6388,9
; ===== Convert the character in r1 to upper case
;
toUpper
blt r1,#'a',TOUPRET ; is it < 'a'?
bgt r1,#'z',TOUPRET ; or > 'z'?
sub r1,r1,#32 ; if not, make it upper case
blti r1,#'a',TOUPRET ; is it < 'a'?
bgti r1,#'z',TOUPRET ; or > 'z'?
subui r1,r1,#32 ; if not, make it upper case
TOUPRET
ret
 
5002,7 → 6404,7
subui sp,sp,#8 ; save link reg
sw lr,[sp]
call GOIN ; get input if possible
beq r1,#-1,CHKRET2 ; if Zero, no input
beqi r1,#-1,CHKRET2 ; if Zero, no input
bnei r1,#CTRLC,CHKRET ; is it control-C?
jmp WSTART ; if so, do a warm start
CHKRET2:
5028,8 → 6430,8
sw lr,8[sp]
mov r5,r1 ; r5 = pointer to message
PRMESG1:
add r5,r5,#1
lb r1,-1[r5] ; get the char.
addui r5,r5,#1
lbu r1,-1[r5] ; get the char.
beq r1,r0,PRMRET
call GOOUT ;else display it trashes r4
bra PRMESG1
5074,7 → 6476,7
jmp DisplayChar
 
 
; ===== Input a character from the console into register D0 (or
; ===== Input a character from the console into register R1 (or
; return Zero status if there's no character available).
;
INC:
5128,8 → 6530,7
; MOVE.B #228,D7 return to Tutor
; TRAP #14
 
.align 16
msgInit db CR,LF,"Raptor64 Tiny BASIC v1.0",CR,LF,"(C) 2012 Robert Finch",CR,LF,LF,0
msgInit db CR,LF,"Raptor64 Tiny BASIC v1.0",CR,LF,"(C) 2013 Robert Finch",CR,LF,LF,0
OKMSG db CR,LF,"OK",CR,LF,0
msgWhat db "What?",CR,LF,0
SRYMSG db "Sorry."
5239,6 → 6640,7
wait
jmp start
dberr_rout:
lw sp,#0x100200100
lea r1,msgdberr
call DisplayString
mfspr r1,ERRADR
5267,43 → 6669,69
db " EPC: ",0
msgiberr:
db "Err fetching instruction at: ",0
.align 16
.align 4
 
;------------------------------------------------------------------------------
; IRQ routine
;
; Interrupts are automatically disabled at the time of the interrupt in order
; to prevent nested interrupts from occuring. Interrupts are re-enabled by
; the IRET instruction at the end of the interrupt routine. If the interrupt
; turns out to not match a hardware interrupt, then a software context
; switching interrupt is assumed.
;
; This routine uses it's own private interrupt stack; the stack of the
; interrupted context is not used at all. A couple of working registers are
; saved off not on the stack. We can get away with this because nested
; interrupts are not allowed.
;------------------------------------------------------------------------------
;
irqrout:
subui sp,sp,#32
sw r1,[sp] ; save off a working register
sw r2,8[sp] ; and a second work register
sw r26,16[sp] ; save off implicit constant builder reg
sw lr,24[sp]
sw sp,sp_save ; use our own private stack for interrupt processing
sw lr,lr_save ; so, save off the sp and working registers
sw r26,r26_save
sw r1,r1_save
sw r2,r2_save
 
lw sp,#0x1_00001000 ; the second two kbytes
inch r1,PIC ; r1= which IRQ line is active
 
; Dispatch fork, in order of required timeliness
 
beqi r1,#2,irq1000Hz
beqi r1,#3,irq100Hz
beqi r1,#8,irqSerial
beqi r1,#13,irqRaster
beqi r1,#15,irqKeybd
beqi r1,#1,irqColdStart ; CTRL-ALT-DEL interrupt
 
; Here, none of the hardware interrupts were active so
; assume software context switch interrupt
;
lw sp,sp_save
lw lr,lr_save
lw r26,r26_save
lw r1,r1_save
lw r2,r2_save
iepp
iret
; 1000 Hz interrupt
; This IRQ must be fast, so it's placed inline
; This IRQ must be fast, so it's placed inline. It's also the first
; IRQ checked for in the interrupt dispatch.
; Increments the millisecond counter, and switches to the next context
;
irq1000Hz:
bnei r1,#2,irq100Hz
outb r0,0xFFFFFFFF_FFFF0000 ; acknowledge interrupt
outb r0,0xDCFFFD ; acknowledge interrupt
lw r1,Milliseconds ; increment milliseconds count
addui r1,r1,#1
sw r1,Milliseconds
lea r2,TEXTSCR
inch r1,332[r2]
addui r1,r1,#1
outc r1,332[r2]
lw lr,24[sp]
lw r26,16[sp] ; restore registers from stack
lw r2,8[sp]
lw r1,[sp]
addui sp,sp,#32 ; restore stack pointer
lw sp,sp_save
lw lr,lr_save
lw r26,r26_save
lw r1,r1_save
lw r2,r2_save
iepp ; move to the next context
nop
nop
nop
iret ; return to the next context
 
; 100 Hz interrupt
5311,20 → 6739,23
; we call a subroutine.
;
irq100Hz:
bnei r1,#3,irqSerial
lw r1,p100IRQvec
; jal lr,[r1]
call Pulse100
bra irqret
irqret:
lw sp,sp_save
lw lr,lr_save
lw r26,r26_save
lw r1,r1_save
lw r2,r2_save
iret
 
irqSerial:
bnei r1,#8,irqRaster
lw r1,serialIRQvec
jal lr,[r1]
bra irqret
 
irqRaster:
bnei r1,#13,irqKeybd
lw r1,rasterIRQvec
; jal lr,[r1]
call RasterIRQfn
5331,29 → 6762,67
bra irqret
 
irqKeybd:
beqi r1,#1,ColdStart ; CTRL-ALT-DEL interrupt
bnei r1,#15,irqret
lw r1,keybdIRQvec
call KeybdIRQ
; jal lr,[r1]
bra irqret
 
irqret:
lw lr,24[sp]
lw r26,16[sp] ; restore registers from stack
lw r2,8[sp]
lw r1,[sp]
addui sp,sp,#32 ; restore stack pointer
irqColdStart:
jmp ColdStart
 
;------------------------------------------------------------------------------
; NMI routine
;
; The NMI line is tied to the parity error signal. But also any non-initialized
; interrupts get sent here.
;------------------------------------------------------------------------------
;
nmirout:
sw sp,sp_save
sw r1,r1_save
sw r26,r26_save
lw sp,#0x100001000
outb r0,0xDCFFFE ; acknowledge interrupt
lea r1,msgPerr
call DisplayString
mfspr r1,IPC
call DisplayWord
call CRLF
lw sp,sp_save
lw r1,r1_save
lw r26,r26_save
iret
 
msgPerr:
db "Parity error at: ",0
 
 
;-------------------------------------------
; NMI routine
; Unimplemented instructions end up here
;-------------------------------------------
nmirout:
.align 4
ui_irout:
subui sp,sp,#8
sw r1,[sp]
lea r1,msgUnimp
call DisplayString
mfspr r1,IPC
call DisplayWord
call CRLF
lw r1,[sp]
addui sp,sp,#8
; hang the context
ui_irout1:
bra ui_irout1
iret
 
msgUnimp:
db "Unimplemented instruction at: ",0
 
;-------------------------------------------
; Handle miss on Data TLB
;-------------------------------------------
.align 4
DTLBHandler:
sw r1,0xFFFF_FFFF_FFFF_0000
sw r2,0xFFFF_FFFF_FFFF_0008
5387,16 → 6856,15
nop
nop
 
; NMI vector
org 0xFFFF_FFFF_FFFF_FFE0
jmp nmirout
nop
nop
dw 0 ;
dw 0 ;
; RST vector
; RST vector
org 0xFFFF_FFFF_FFFF_FFF0
jmp start
nop
nop
 
; ROM checksum goes here
 
org 0xFFFF_FFFF_FFFF_FFF8
dw 0
/trunk/software/sample code/bootrom.v
1,1880 → 1,2446
rommem[1536] = 65'h133FFED0C33FFED54;
rommem[1537] = 65'h033FFEE1D33FFEE06;
rommem[1538] = 65'h033FFEF4733FFEE08;
rommem[1539] = 65'h10000000A33FFEFE7;
rommem[1540] = 65'h10410840A0000000D;
rommem[1541] = 65'h00A1080010410803A;
rommem[1542] = 65'h1BE207FA9101100FF;
rommem[1543] = 65'h06A0D642DE6BFB214;
rommem[1544] = 65'h16A0D782DE6BEFFF8;
rommem[1545] = 65'h0DE0000000000000F;
rommem[1546] = 65'h0E6BFB214DE000000;
rommem[1547] = 65'h1E6BEFBF86A0D642D;
rommem[1548] = 65'h10000000F6A0D782D;
rommem[1549] = 65'h0DE000000DE000000;
rommem[1550] = 65'h06A0D642DE6BFB214;
rommem[1551] = 65'h06A0D782DE6BEF7F8;
rommem[1552] = 65'h0DE0000000000000F;
rommem[1553] = 65'h0E6BFB214DE000000;
rommem[1554] = 65'h0E6BEF3F86A0D642D;
rommem[1555] = 65'h10000000F6A0D782D;
rommem[1556] = 65'h0DE000000DE000000;
rommem[1557] = 65'h06A0D642DE6BFB214;
rommem[1558] = 65'h06A0D782DE6BEEFF8;
rommem[1559] = 65'h0DE0000000000000F;
rommem[1560] = 65'h0E6BFB214DE000000;
rommem[1561] = 65'h0E6BEEBF86A0D642D;
rommem[1562] = 65'h10000000F6A0D782D;
rommem[1563] = 65'h0DE000000DE000000;
rommem[1564] = 65'h06A0D642DE6BFB214;
rommem[1565] = 65'h16A0D782DE6BEE7F8;
rommem[1566] = 65'h0DE0000000000000F;
rommem[1567] = 65'h0E6BFB214DE000000;
rommem[1568] = 65'h1E6BEE3F86A0D642D;
rommem[1569] = 65'h10000000F6A0D782D;
rommem[1570] = 65'h0DE000000DE000000;
rommem[1571] = 65'h06A0D642DE6BFB214;
rommem[1572] = 65'h06A0D782DE6BEDFF8;
rommem[1573] = 65'h0DE0000000000000F;
rommem[1574] = 65'h0E6BFB214DE000000;
rommem[1575] = 65'h0E6BEDBF86A0D642D;
rommem[1576] = 65'h10000000F6A0D782D;
rommem[1577] = 65'h0DE000000DE000000;
rommem[1578] = 65'h06A0D642DE6BFB214;
rommem[1579] = 65'h16A0D782DE6BED7F8;
rommem[1580] = 65'h0DE0000000000000F;
rommem[1581] = 65'h0E6BFB214DE000000;
rommem[1582] = 65'h1E6BED3F86A0D642D;
rommem[1583] = 65'h10000000F6A0D782D;
rommem[1584] = 65'h0DE000000DE000000;
rommem[1585] = 65'h06A0D642DE6BFB214;
rommem[1586] = 65'h16A0D782DE6BECFF8;
rommem[1587] = 65'h0DE0000000000000F;
rommem[1588] = 65'h0E6BFB214DE000000;
rommem[1589] = 65'h1E6BECBF86A0D642D;
rommem[1590] = 65'h10000000F6A0D782D;
rommem[1591] = 65'h0DE000000DE000000;
rommem[1592] = 65'h06A0D642DE6BFB214;
rommem[1593] = 65'h06A0D782DE6BEC7F8;
rommem[1594] = 65'h0DE0000000000000F;
rommem[1595] = 65'h0E6BFB214DE000000;
rommem[1596] = 65'h0E6BEC3F86A0D642D;
rommem[1597] = 65'h10000000F6A0D782D;
rommem[1598] = 65'h0DE000000DE000000;
rommem[1599] = 65'h1BE1000A802008568;
rommem[1600] = 65'h0DE0000000000000F;
rommem[1601] = 65'h1BE007F6ADE000000;
rommem[1602] = 65'h1020085686000A0C0;
rommem[1603] = 65'h1BE1107E94A0120C0;
rommem[1604] = 65'h0E08001FFE0C00000;
rommem[1605] = 65'h1663080009A00EA20;
rommem[1606] = 65'h1BE017FCF0A318008;
rommem[1607] = 65'h16A0D042DE6BFB768;
rommem[1608] = 65'h09A00E95066008D08;
rommem[1609] = 65'h09A00E8BC66008E08;
rommem[1610] = 65'h19A00E8A466008FE0;
rommem[1611] = 65'h19A00EA2066008FE8;
rommem[1612] = 65'h0E6BFB7C466008FF0;
rommem[1613] = 65'h06600B0086A0D042D;
rommem[1614] = 65'h16A0D042DE6BFB8EC;
rommem[1615] = 65'h0E6BFB6286600B000;
rommem[1616] = 65'h06600B0106A0D042D;
rommem[1617] = 65'h06600B0189A00CAC4;
rommem[1618] = 65'h131FFEDEC31FFECEC;
rommem[1619] = 65'h031FFF29931FFECE4;
rommem[1620] = 65'h1E0C000CE00000040;
rommem[1621] = 65'h14201941462019414;
rommem[1622] = 65'h062019416E0C00020;
rommem[1623] = 65'h1BE21804842011416;
rommem[1624] = 65'h0620020A80000000D;
rommem[1625] = 65'h031FFEED9620020A6;
rommem[1626] = 65'h031FFF1ED31FFEEC4;
rommem[1627] = 65'h16200141862001416;
rommem[1628] = 65'h16000941AE0400001;
rommem[1629] = 65'h06A0D042DE6BFB36D;
rommem[1630] = 65'h033FFF09631FFEFF5;
rommem[1631] = 65'h1E0C0000431FFF1F7;
rommem[1632] = 65'h0EE800003E69C0600;
rommem[1633] = 65'h131FFF2216A0D0C28;
rommem[1634] = 65'h0BE007FEA33FFF096;
rommem[1635] = 65'h10FEF0018BE00000A;
rommem[1636] = 65'h167E1000867E08000;
rommem[1637] = 65'h1E6BFB36067EF8010;
rommem[1638] = 65'h1402080006A0D082D;
rommem[1639] = 65'h031FFED0CBE100088;
rommem[1640] = 65'h1BE007F8A0A210001;
rommem[1641] = 65'h067E1000867EF8010;
rommem[1642] = 65'h037EF801867E08000;
rommem[1643] = 65'h00000000000000000;
rommem[1644] = 65'h06F57206F6C6C6548;
rommem[1645] = 65'h07061520021646C72;
rommem[1646] = 65'h07973203436726F74;
rommem[1647] = 65'h1617473206D657473;
rommem[1648] = 65'h02E2E2E676E697472;
rommem[1649] = 65'h0000000000000002E;
rommem[1650] = 65'h16A0D042DE6BFB3AC;
rommem[1651] = 65'h0E07FA00F66009030;
rommem[1652] = 65'h1EE800003E69C0FF2;
rommem[1653] = 65'h037EF80006A0D0429;
rommem[1654] = 65'h16200180262001800;
rommem[1655] = 65'h062009810E04001F0;
rommem[1656] = 65'h06200980EE0400010;
rommem[1657] = 65'h1E69C0A04E0400001;
rommem[1658] = 65'h16A0D0428EE800003;
rommem[1659] = 65'h06000181260001809;
rommem[1660] = 65'h16000180A60001813;
rommem[1661] = 65'h060009814E0400001;
rommem[1662] = 65'h1E69C0A0137EF8000;
rommem[1663] = 65'h06A0D0420EE800003;
rommem[1664] = 65'h1BE107F8814108001;
rommem[1665] = 65'h0EE800003E69C0A00;
rommem[1666] = 65'h037EF80006A0D0420;
rommem[1667] = 65'h1EE800003E69C0A01;
rommem[1668] = 65'h0141080016A0D0420;
rommem[1669] = 65'h037EF800004100439;
rommem[1670] = 65'h167E100000FEF0020;
rommem[1671] = 65'h167E2001067E18008;
rommem[1672] = 65'h1E69C0A0667E28018;
rommem[1673] = 65'h06A0D0820EE800003;
rommem[1674] = 65'h0E69C0A0616210003;
rommem[1675] = 65'h16A0D0828EE800003;
rommem[1676] = 65'h1BE20016840011812;
rommem[1677] = 65'h0E0C0006446021400;
rommem[1678] = 65'h11421000A80011808;
rommem[1679] = 65'h046029400BE2000C9;
rommem[1680] = 65'h002520009BE42FF88;
rommem[1681] = 65'h1BE00046ABE01FF4F;
rommem[1682] = 65'h0BE20016840011813;
rommem[1683] = 65'h0E0C0006446021400;
rommem[1684] = 65'h11421001480011808;
rommem[1685] = 65'h046029400BE2000C9;
rommem[1686] = 65'h002520009BE42FF88;
rommem[1687] = 65'h0BE0002EABE01FF4F;
rommem[1688] = 65'h0BE2000C840011814;
rommem[1689] = 65'h0BE20008840011815;
rommem[1690] = 65'h01442008080021808;
rommem[1691] = 65'h146021400BE407F89;
rommem[1692] = 65'h0E69C0A01E0C00064;
rommem[1693] = 65'h06A0D0820EE800003;
rommem[1694] = 65'h0BE2000C914210020;
rommem[1695] = 65'h1BE42FF4846029400;
rommem[1696] = 65'h1BE01FF0F02520009;
rommem[1697] = 65'h0E69C0A00BE00008A;
rommem[1536] = 65'h133FFED5C33FFEDA4;
rommem[1537] = 65'h133FFEF1C33FFEF05;
rommem[1538] = 65'h133FFF07F33FFEF07;
rommem[1539] = 65'h033FFF13F33FFF122;
rommem[1540] = 65'h033FFF01133FFF06F;
rommem[1541] = 65'h00000000B33FFF169;
rommem[1542] = 65'h1020000750000000D;
rommem[1543] = 65'h00410840A020000B5;
rommem[1544] = 65'h16600A0D86600A0D0;
rommem[1545] = 65'h16600A0E86600A0E0;
rommem[1546] = 65'h16600A0F86600A0F0;
rommem[1547] = 65'h16600A1086600A100;
rommem[1548] = 65'h16600A1186600A110;
rommem[1549] = 65'h16600A1286600A120;
rommem[1550] = 65'h16600A1386600A130;
rommem[1551] = 65'h16600A1486600A140;
rommem[1552] = 65'h10410803A0410840A;
rommem[1553] = 65'h0101100FF0A108001;
rommem[1554] = 65'h0E6BFB228BE207FA9;
rommem[1555] = 65'h1039008696A0D642D;
rommem[1556] = 65'h16A0D782DE6BEFFF8;
rommem[1557] = 65'h0E6BFB2280000000F;
rommem[1558] = 65'h1039008696A0D642D;
rommem[1559] = 65'h06A0D782DE6BEFBF8;
rommem[1560] = 65'h0E6BFB2280000000F;
rommem[1561] = 65'h1039008696A0D642D;
rommem[1562] = 65'h06A0D782DE6BEF7F8;
rommem[1563] = 65'h0E6BFB2280000000F;
rommem[1564] = 65'h1039008696A0D642D;
rommem[1565] = 65'h16A0D782DE6BEF3F8;
rommem[1566] = 65'h0E6BFB2280000000F;
rommem[1567] = 65'h1039008696A0D642D;
rommem[1568] = 65'h06A0D782DE6BEEFF8;
rommem[1569] = 65'h0E6BFB2280000000F;
rommem[1570] = 65'h1039008696A0D642D;
rommem[1571] = 65'h16A0D782DE6BEEBF8;
rommem[1572] = 65'h0E6BFB2280000000F;
rommem[1573] = 65'h1039008696A0D642D;
rommem[1574] = 65'h16A0D782DE6BEE7F8;
rommem[1575] = 65'h0E6BFB2280000000F;
rommem[1576] = 65'h1039008696A0D642D;
rommem[1577] = 65'h06A0D782DE6BEE3F8;
rommem[1578] = 65'h0E6BFB2280000000F;
rommem[1579] = 65'h1039008696A0D642D;
rommem[1580] = 65'h06A0D782DE6BEDFF8;
rommem[1581] = 65'h0E6BFB2280000000F;
rommem[1582] = 65'h1039008696A0D642D;
rommem[1583] = 65'h16A0D782DE6BEDBF8;
rommem[1584] = 65'h0E6BFB2280000000F;
rommem[1585] = 65'h1039008696A0D642D;
rommem[1586] = 65'h16A0D782DE6BED7F8;
rommem[1587] = 65'h0E6BFB2280000000F;
rommem[1588] = 65'h1039008696A0D642D;
rommem[1589] = 65'h06A0D782DE6BED3F8;
rommem[1590] = 65'h0E6BFB2280000000F;
rommem[1591] = 65'h1039008696A0D642D;
rommem[1592] = 65'h16A0D782DE6BECFF8;
rommem[1593] = 65'h0E6BFB2280000000F;
rommem[1594] = 65'h1039008696A0D642D;
rommem[1595] = 65'h06A0D782DE6BECBF8;
rommem[1596] = 65'h0E6BFB2280000000F;
rommem[1597] = 65'h1039008696A0D642D;
rommem[1598] = 65'h06A0D782DE6BEC7F8;
rommem[1599] = 65'h0E6BFB2280000000F;
rommem[1600] = 65'h1039008696A0D642D;
rommem[1601] = 65'h16A0D782DE6BEC3F8;
rommem[1602] = 65'h1020085680000000F;
rommem[1603] = 65'h00000000FBE100068;
rommem[1604] = 65'h16000A0C0BE007FAA;
rommem[1605] = 65'h04A0120C002008568;
rommem[1606] = 65'h0E0C00000BE110E69;
rommem[1607] = 65'h19A00FB38E08001FF;
rommem[1608] = 65'h00A31800866308000;
rommem[1609] = 65'h1E6BFB8A8BE017FCF;
rommem[1610] = 65'h066008CD06A0D042D;
rommem[1611] = 65'h066008CE89A008000;
rommem[1612] = 65'h06A0D042DE6BFBAA8;
rommem[1613] = 65'h0E6BFBB1466008D00;
rommem[1614] = 65'h166008D086A0D042D;
rommem[1615] = 65'h166008E089A00FA5C;
rommem[1616] = 65'h166008F789A00FB94;
rommem[1617] = 65'h166008FE09A00F9BC;
rommem[1618] = 65'h066008FE89A00F9A4;
rommem[1619] = 65'h166008FF09A00FB38;
rommem[1620] = 65'h06A0D042DE6BFBBC0;
rommem[1621] = 65'h0E6BFBDCC6600B008;
rommem[1622] = 65'h16600B0006A0D042D;
rommem[1623] = 65'h16A0D042DE6BFB768;
rommem[1624] = 65'h09A00D1AC6600B010;
rommem[1625] = 65'h0E69CFFFF6600B018;
rommem[1626] = 65'h16A0D0424EE800003;
rommem[1627] = 65'h1BE1000482A108824;
rommem[1628] = 65'h1E69CFFFF31FFEF3A;
rommem[1629] = 65'h16A0D0424EE800003;
rommem[1630] = 65'h1BE1000482A108A2C;
rommem[1631] = 65'h031FFEEEB31FFED3C;
rommem[1632] = 65'h031FFF45331FFED34;
rommem[1633] = 65'h1E0C000CE00000040;
rommem[1634] = 65'h16201941062019414;
rommem[1635] = 65'h0E0C0002042019414;
rommem[1636] = 65'h04201141662019416;
rommem[1637] = 65'h00000000DBE218048;
rommem[1638] = 65'h1620020A6620020A8;
rommem[1639] = 65'h00181D09716008002;
rommem[1640] = 65'h00181D09716008002;
rommem[1641] = 65'h131FFEFFC31FFF011;
rommem[1642] = 65'h0EE800003E69CFFFF;
rommem[1643] = 65'h12A1080046A0D0420;
rommem[1644] = 65'h131FFF3A7BE100048;
rommem[1645] = 65'h06000141860001417;
rommem[1646] = 65'h16000941A16008001;
rommem[1647] = 65'h16A0D042DE6BFB4AD;
rommem[1648] = 65'h1E69CFFFF31FFF130;
rommem[1649] = 65'h06A0D0420EE800003;
rommem[1650] = 65'h1BE1000E82A108414;
rommem[1651] = 65'h01600800431FFF3B1;
rommem[1652] = 65'h0EE800003E69C0600;
rommem[1653] = 65'h131FFF3DB6A0D0428;
rommem[1654] = 65'h06A0D042DE6BFB428;
rommem[1655] = 65'h1E69CFFFF6600A0D8;
rommem[1656] = 65'h06A0D0420EE800003;
rommem[1657] = 65'h0BE1000682A10820C;
rommem[1658] = 65'h16600A0E09A00DD3C;
rommem[1659] = 65'h06600A0E89A00CDD0;
rommem[1660] = 65'h0BE10006931FFF54E;
rommem[1661] = 65'h131FFF60531FFF59D;
rommem[1662] = 65'h033FFF20A33FFF20A;
rommem[1663] = 65'h19A00A0D0BE007FEA;
rommem[1664] = 65'h06A11070302010568;
rommem[1665] = 65'h0341F8000BE100048;
rommem[1666] = 65'h1DE00000000000040;
rommem[1667] = 65'h0DE000000DE000000;
rommem[1668] = 65'h1BE007ECA0181E097;
rommem[1669] = 65'h0E6900000660020D8;
rommem[1670] = 65'h06A0D0C2DEE800003;
rommem[1671] = 65'h01601014A16008056;
rommem[1672] = 65'h031FFF0631602002F;
rommem[1673] = 65'h10A1080016A310421;
rommem[1674] = 65'h00A2100A86A310429;
rommem[1675] = 65'h1BE007E6ABE027F8F;
rommem[1676] = 65'h067E080000FEF0018;
rommem[1677] = 65'h067EF801067E10008;
rommem[1678] = 65'h06A0D082DE6BFB4A0;
rommem[1679] = 65'h0BE10008840208000;
rommem[1680] = 65'h00A21000131FFED5C;
rommem[1681] = 65'h067EF8010BE007F8A;
rommem[1682] = 65'h167E0800067E10008;
rommem[1683] = 65'h10000000037EF8018;
rommem[1684] = 65'h06F57206F6C6C6548;
rommem[1685] = 65'h07061520021646C72;
rommem[1686] = 65'h07973203436726F74;
rommem[1687] = 65'h1617473206D657473;
rommem[1688] = 65'h02E2E2E676E697472;
rommem[1689] = 65'h0000000000000002E;
rommem[1690] = 65'h16A0D042DE6BFB4EC;
rommem[1691] = 65'h1E07F800F66009030;
rommem[1692] = 65'h1EE800003E69C0FF2;
rommem[1693] = 65'h037EF80006A0D0429;
rommem[1694] = 65'h16200180262001800;
rommem[1695] = 65'h062009810E04001F0;
rommem[1696] = 65'h06200980EE0400010;
rommem[1697] = 65'h1E69C0A04E0400001;
rommem[1698] = 65'h16A0D0428EE800003;
rommem[1699] = 65'h047E1800847E10000;
rommem[1700] = 65'h047E2801847E20010;
rommem[1701] = 65'h14202180037EF8020;
rommem[1702] = 65'h00441100542011802;
rommem[1703] = 65'h0E1000200BE4000A3;
rommem[1704] = 65'h14201180004411003;
rommem[1705] = 65'h137EF800004411005;
rommem[1706] = 65'h167E100000FEF0020;
rommem[1707] = 65'h167E2001067E18008;
rommem[1708] = 65'h14201980067EF8018;
rommem[1709] = 65'h1BE21852842011802;
rommem[1710] = 65'h16A2184009A019600;
rommem[1711] = 65'h0142101FF0A210001;
rommem[1712] = 65'h14001180C62011802;
rommem[1713] = 65'h14201980EBE2003A8;
rommem[1714] = 65'h1BE41834331FFED4B;
rommem[1715] = 65'h0400218096000180C;
rommem[1716] = 65'h0E69C0A06BE400108;
rommem[1717] = 65'h06A0D1020EE800003;
rommem[1718] = 65'h1E69C0A0616420002;
rommem[1719] = 65'h16A0D1028EE800003;
rommem[1720] = 65'h1BE4001084002180A;
rommem[1721] = 65'h0EE800003E69C0A06;
rommem[1722] = 65'h1164200016A0D1020;
rommem[1723] = 65'h0EE800003E69C0A06;
rommem[1724] = 65'h14002180B6A0D1028;
rommem[1725] = 65'h0E1000011BE4000A8;
rommem[1726] = 65'h0EE800003E69C0A00;
rommem[1727] = 65'h047E100006A0D1028;
rommem[1728] = 65'h147E2001047E18008;
rommem[1729] = 65'h037EF802047EF8018;
rommem[1730] = 65'h047E10000E07FFFFF;
rommem[1731] = 65'h147E2001047E18008;
rommem[1732] = 65'h037EF802047EF8018;
rommem[1733] = 65'h067E080000FEF0028;
rommem[1734] = 65'h167E1801067E10008;
rommem[1735] = 65'h167EF802067E20018;
rommem[1736] = 65'h0EE800003E69C0A03;
rommem[1737] = 65'h1BE1000A16A0D0420;
rommem[1738] = 65'h1B0100D041410807F;
rommem[1739] = 65'h1B0100710B0100B0C;
rommem[1740] = 65'h147E1000847E08000;
rommem[1741] = 65'h047E2001847E18010;
rommem[1742] = 65'h037EF802847EF8020;
rommem[1743] = 65'h16000980880009808;
rommem[1744] = 65'h0BE007EEABE007F0A;
rommem[1745] = 65'h0EE800003E69C0A00;
rommem[1746] = 65'h1400118146A0D0420;
rommem[1747] = 65'h0B2100413BE200108;
rommem[1748] = 65'h160009815E0400001;
rommem[1749] = 65'h0B2100311BE00016A;
rommem[1750] = 65'h0BE00010A60001815;
rommem[1751] = 65'h04201180060001815;
rommem[1752] = 65'h06A3104109A019600;
rommem[1753] = 65'h0142101FF0A210001;
rommem[1754] = 65'h0E69C0A0162011800;
rommem[1755] = 65'h06A0D0420EE800003;
rommem[1756] = 65'h1BE107D2914108001;
rommem[1757] = 65'h1BE1003C94000980C;
rommem[1758] = 65'h14200981031FFED4B;
rommem[1759] = 65'h1E0400001BE408360;
rommem[1760] = 65'h1400098096000980C;
rommem[1761] = 65'h0E69C0A06BE100108;
rommem[1762] = 65'h06A0D0420EE800003;
rommem[1763] = 65'h0E69C0A06141080FD;
rommem[1764] = 65'h16A0D0428EE800003;
rommem[1765] = 65'h1BE1001084000980A;
rommem[1766] = 65'h0EE800003E69C0A06;
rommem[1767] = 65'h0141080FE6A0D0420;
rommem[1768] = 65'h0EE800003E69C0A06;
rommem[1769] = 65'h14000980B6A0D0428;
rommem[1770] = 65'h1E0400013BE1000A8;
rommem[1771] = 65'h0EE800003E69C0A00;
rommem[1772] = 65'h1BE0077EA6A0D0428;
rommem[1773] = 65'h167EF80000FEF0008;
rommem[1774] = 65'h131FFEDECB2100300;
rommem[1775] = 65'h0B2100401BE00016A;
rommem[1776] = 65'h031FFEE0602208009;
rommem[1777] = 65'h1B2100302BE0000EA;
rommem[1778] = 65'h1BE00008A31FFEE08;
rommem[1779] = 65'h031FFEE1DB2100303;
rommem[1780] = 65'h147EF8000BE00002A;
rommem[1781] = 65'h1018000210BEF0008;
rommem[1782] = 65'h16000145160001450;
rommem[1783] = 65'h16000941CE0400001;
rommem[1784] = 65'h10FEF000837EF8000;
rommem[1785] = 65'h14A00945067E10000;
rommem[1786] = 65'h1E69C00001410800F;
rommem[1787] = 65'h16A0D0821EE800003;
rommem[1788] = 65'h1EE800003E69C0002;
rommem[1789] = 65'h1601114406A0D0029;
rommem[1790] = 65'h11410800F0A108001;
rommem[1791] = 65'h04A01145160009450;
rommem[1792] = 65'h00A210001BE110089;
rommem[1793] = 65'h0600114511421000F;
rommem[1794] = 65'h037EF800847E10000;
rommem[1795] = 65'h137EF80006000941C;
rommem[1796] = 65'h167E100000FEF0010;
rommem[1797] = 65'h14A01145167EF8008;
rommem[1798] = 65'h1BE1101884A009450;
rommem[1799] = 65'h10A2100014A209440;
rommem[1800] = 65'h0600114511421000F;
rommem[1801] = 65'h0BE2000E84001141C;
rommem[1802] = 65'h131FFF93FB210030D;
rommem[1803] = 65'h131FFEF47BE00008A;
rommem[1804] = 65'h1E07FFFFFBE00004A;
rommem[1805] = 65'h147E1000047EF8008;
rommem[1806] = 65'h14A00945137EF8010;
rommem[1807] = 65'h0041104394A011450;
rommem[1808] = 65'h0E69C000037EF8000;
rommem[1809] = 65'h16A0D0421EE800003;
rommem[1810] = 65'h037EF800004100430;
rommem[1811] = 65'h167E100000FEF0010;
rommem[1812] = 65'h1E09C000067EF8008;
rommem[1813] = 65'h0EE800003E69C0000;
rommem[1814] = 65'h1BE107FA16A0D0421;
rommem[1815] = 65'h1EE800003E69C0002;
rommem[1816] = 65'h0141080FF6A0D0029;
rommem[1817] = 65'h1BE2000A84001141C;
rommem[1818] = 65'h131FFF93FB210030D;
rommem[1819] = 65'h131FFEF47BE00004A;
rommem[1820] = 65'h147EF800847E10000;
rommem[1821] = 65'h00FEF000837EF8010;
rommem[1822] = 65'h0E690000067EF8000;
rommem[1823] = 65'h16A0D082DEE800003;
rommem[1824] = 65'h00A1080018220814E;
rommem[1825] = 65'h031FFF2D89220814E;
rommem[1826] = 65'h031FFEE4C31FFEE4A;
rommem[1827] = 65'h16A0D0010E6BF0010;
rommem[1828] = 65'h037EF800847EF8000;
rommem[1829] = 65'h037EF8000620020A8;
rommem[1830] = 65'h1660120B86600A0B0;
rommem[1831] = 65'h14C0120A64C00A0A8;
rommem[1832] = 65'h14600A0B0BE110089;
rommem[1833] = 65'h037EF8000460120B8;
rommem[1834] = 65'h11A210200142101FF;
rommem[1835] = 65'h0EE800400E6800000;
rommem[1836] = 65'h04600A0B0042D0803;
rommem[1837] = 65'h14600A0B866208000;
rommem[1838] = 65'h16621801066208008;
rommem[1839] = 65'h06622802066220018;
rommem[1840] = 65'h16623803066230028;
rommem[1841] = 65'h16624804066240038;
rommem[1842] = 65'h16625805066250048;
rommem[1843] = 65'h06626806066260058;
rommem[1844] = 65'h16627807066270068;
rommem[1845] = 65'h06628808066280078;
rommem[1846] = 65'h16629809066290088;
rommem[1847] = 65'h0662A80A0662A0098;
rommem[1848] = 65'h1662B80B0662B00A8;
rommem[1849] = 65'h1662C80C0662C00B8;
rommem[1850] = 65'h1662D80D0662D00C8;
rommem[1851] = 65'h0662E80E0662E00D8;
rommem[1852] = 65'h1662F80F0662F00E8;
rommem[1853] = 65'h1620120A64C0120A8;
rommem[1854] = 65'h0E68000001A210200;
rommem[1855] = 65'h0042D0803EE800400;
rommem[1856] = 65'h04621801046208000;
rommem[1857] = 65'h04622802046220018;
rommem[1858] = 65'h14623803046230028;
rommem[1859] = 65'h14624804046240038;
rommem[1860] = 65'h14625805046250048;
rommem[1861] = 65'h04626806046260058;
rommem[1862] = 65'h14627807046270068;
rommem[1863] = 65'h04628808046280078;
rommem[1864] = 65'h14629809046290088;
rommem[1865] = 65'h0462A80A0462A0098;
rommem[1866] = 65'h1462B80B0462B00A8;
rommem[1867] = 65'h1462C80C0462C00B8;
rommem[1868] = 65'h1462D80D0462D00C8;
rommem[1869] = 65'h0462E80E0462E00D8;
rommem[1870] = 65'h1462F80F0462F00E8;
rommem[1871] = 65'h137EF800046210008;
rommem[1872] = 65'h167E080000FEF0020;
rommem[1873] = 65'h167E1801067E10008;
rommem[1874] = 65'h031FFEF3767EF8018;
rommem[1875] = 65'h1041D0403E6810000;
rommem[1876] = 65'h0BE2001C84001141A;
rommem[1877] = 65'h10A21000182110000;
rommem[1878] = 65'h04601140892110000;
rommem[1879] = 65'h042019414BE110088;
rommem[1880] = 65'h06600940892218000;
rommem[1881] = 65'h147E1000847E08000;
rommem[1882] = 65'h047EF801847E18010;
rommem[1883] = 65'h04201941437EF8020;
rommem[1884] = 65'h1BE007E8A92118000;
rommem[1885] = 65'h0E69A0010160080A0;
rommem[1886] = 65'h06A0D0429EE800003;
rommem[1887] = 65'h0160080E037EF8000;
rommem[1888] = 65'h1EE800003E69A0010;
rommem[1889] = 65'h037EF80006A0D0429;
rommem[1890] = 65'h067E080000FEF0018;
rommem[1891] = 65'h167E1801067E10008;
rommem[1892] = 65'h1040D0809E68FFC00;
rommem[1893] = 65'h0E6A9292906210601;
rommem[1894] = 65'h1F6829292EEA4A4A4;
rommem[1895] = 65'h1E6A000006A0D042D;
rommem[1896] = 65'h16A0D0C2DEE800400;
rommem[1897] = 65'h00A31800866308000;
rommem[1898] = 65'h047E08000BE017FCF;
rommem[1899] = 65'h147E1801047E10008;
rommem[1900] = 65'h00FEF002837EF8018;
rommem[1901] = 65'h167E1000867E08000;
rommem[1902] = 65'h067E2001867E18010;
rommem[1903] = 65'h1E69A000067EF8020;
rommem[1904] = 65'h06A0D0C2DEE800003;
rommem[1905] = 65'h18231000282308000;
rommem[1906] = 65'h1E040002004110818;
rommem[1907] = 65'h131FFEF2B42021414;
rommem[1908] = 65'h0EE800003E6900000;
rommem[1909] = 65'h1923080006A0D0C2D;
rommem[1910] = 65'h06A3D1029E6810000;
rommem[1911] = 65'h0BE017F8F0A318002;
rommem[1912] = 65'h147E2001847EF8020;
rommem[1913] = 65'h147E1000847E18010;
rommem[1914] = 65'h137EF802847E08000;
rommem[1915] = 65'h067E080000FEF0028;
rommem[1916] = 65'h167E1801067E10008;
rommem[1917] = 65'h167EF802067E20018;
rommem[1918] = 65'h0EE800003E69A0000;
rommem[1919] = 65'h0823080006A0D0C2D;
rommem[1920] = 65'h00411081882310002;
rommem[1921] = 65'h1E690000004208805;
rommem[1922] = 65'h06A0D0C2DEE800003;
rommem[1923] = 65'h0923200006A309021;
rommem[1924] = 65'h1BE017FAF0A318002;
rommem[1925] = 65'h0EE800003E69A0000;
rommem[1926] = 65'h1823080026A0D0C2D;
rommem[1927] = 65'h131FFEF160E108001;
rommem[1928] = 65'h147E1000847E08000;
rommem[1929] = 65'h047E2001847E18010;
rommem[1930] = 65'h037EF802847EF8020;
rommem[1931] = 65'h067E080000FEF0018;
rommem[1932] = 65'h167E1801067E10008;
rommem[1933] = 65'h0EE800003E69A0000;
rommem[1934] = 65'h0823100006A0D0C2D;
rommem[1935] = 65'h00631820004208C18;
rommem[1936] = 65'h0EE800003E6900000;
rommem[1937] = 65'h1E0400020043D0C03;
rommem[1938] = 65'h10A31800292308000;
rommem[1939] = 65'h047E08000BE017FCF;
rommem[1940] = 65'h147E1801047E10008;
rommem[1941] = 65'h1141080FF37EF8018;
rommem[1942] = 65'h0AC10045AA8100541;
rommem[1943] = 65'h1A8100261AE10037A;
rommem[1944] = 65'h0161081000C108060;
rommem[1945] = 65'h1141080FF37EF8000;
rommem[1946] = 65'h00A10803CAE10021A;
rommem[1947] = 65'h14200941637EF8000;
rommem[1948] = 65'h0E69A00001410807F;
rommem[1949] = 65'h06A0D0C2DEE800003;
rommem[1950] = 65'h10420881882310000;
rommem[1951] = 65'h01410807F42009418;
rommem[1952] = 65'h19231001604208803;
rommem[1953] = 65'h0E690000006210200;
rommem[1954] = 65'h1042D0403EE800003;
rommem[1955] = 65'h0B210080D37EF8000;
rommem[1956] = 65'h167E080000FEF0020;
rommem[1957] = 65'h167E1801067E10008;
rommem[1958] = 65'h06200141867EF8018;
rommem[1959] = 65'h1E6800091BE00018A;
rommem[1960] = 65'h10FEF0020BE1D0209;
rommem[1961] = 65'h167E1000867E08000;
rommem[1962] = 65'h067EF801867E18010;
rommem[1963] = 65'h0B020033842011418;
rommem[1964] = 65'h1620114180A210001;
rommem[1965] = 65'h147EF801831FFEF37;
rommem[1966] = 65'h147E1000847E18010;
rommem[1967] = 65'h037EF802047E08000;
rommem[1968] = 65'h1BE1D0169E6800090;
rommem[1969] = 65'h167E080000FEF0020;
rommem[1970] = 65'h167E1801067E10008;
rommem[1971] = 65'h14201141667EF8018;
rommem[1972] = 65'h10E210001B02FF200;
rommem[1973] = 65'h0BE007DEA62011416;
rommem[1974] = 65'h1BE1D0169E6800093;
rommem[1975] = 65'h167E080000FEF0020;
rommem[1976] = 65'h167E1801067E10008;
rommem[1977] = 65'h04201141867EF8018;
rommem[1978] = 65'h10E210001B02FE600;
rommem[1979] = 65'h1BE007C6A62011418;
rommem[1980] = 65'h0BE1D0169E6800092;
rommem[1981] = 65'h167E080000FEF0020;
rommem[1982] = 65'h167E1801067E10008;
rommem[1983] = 65'h14201141667EF8018;
rommem[1984] = 65'h00A210001B02FDA1E;
rommem[1985] = 65'h1BE007AEA62011416;
rommem[1986] = 65'h1BE1D0189E6800094;
rommem[1987] = 65'h167E080000FEF0020;
rommem[1988] = 65'h167E1801067E10008;
rommem[1989] = 65'h04201141867EF8018;
rommem[1990] = 65'h162001418BE200068;
rommem[1991] = 65'h062001416BE00798A;
rommem[1992] = 65'h10FEF0030BE00794A;
rommem[1993] = 65'h167E1000867E08000;
rommem[1994] = 65'h067E2001867E18010;
rommem[1995] = 65'h067EF802867E28020;
rommem[1996] = 65'h0BE1D00A9E6800099;
rommem[1997] = 65'h104008C0931FFEF37;
rommem[1998] = 65'h1BE00012A42009418;
rommem[1999] = 65'h042011418B2101508;
rommem[2000] = 65'h00E210001BE2003A8;
rommem[2001] = 65'h131FFEF3762011418;
rommem[2002] = 65'h14200941804008C09;
rommem[2003] = 65'h09231000082310002;
rommem[2004] = 65'h00A1080010A318002;
rommem[2005] = 65'h0EE800003E69A0000;
rommem[2006] = 65'h1824280006A0D102D;
rommem[2007] = 65'h0E0400020BE12FF04;
rommem[2008] = 65'h09230FFFE31FFEF2B;
rommem[2009] = 65'h1B010090ABE00016A;
rommem[2010] = 65'h031FFEF3704009009;
rommem[2011] = 65'h10402040904008C09;
rommem[2012] = 65'h09230800031FFEF2B;
rommem[2013] = 65'h0BE00004A31FFEFC4;
rommem[2014] = 65'h047EF802831FFEFD2;
rommem[2015] = 65'h047E2001847E28020;
rommem[2016] = 65'h147E1000847E18010;
rommem[2017] = 65'h137EF803047E08000;
rommem[2018] = 65'h167E080000FEF0020;
rommem[2019] = 65'h167E1801067E10008;
rommem[2020] = 65'h04200941867EF8018;
rommem[2021] = 65'h1620094180A108001;
rommem[2022] = 65'h0EE800003E69A0000;
rommem[2023] = 65'h0BE1102466A0D0821;
rommem[2024] = 65'h1BE0000CA62001418;
rommem[2025] = 65'h167E080000FEF0020;
rommem[2026] = 65'h167E1801067E10008;
rommem[2027] = 65'h14200941667EF8018;
rommem[2028] = 65'h0620094160A108001;
rommem[2029] = 65'h1EE800003E69A0002;
rommem[2030] = 65'h1BE1100866A0D0821;
rommem[2031] = 65'h1620114160E210001;
rommem[2032] = 65'h031FFEF3731FFEEF6;
rommem[2033] = 65'h047E1801047EF8018;
rommem[2034] = 65'h147E0800047E10008;
rommem[2035] = 65'h00DEF001837EF8020;
rommem[2036] = 65'h167E1000867E08000;
rommem[2037] = 65'h10211000967EF8010;
rommem[2038] = 65'h00A2100014A208000;
rommem[2039] = 65'h031FFEF47BE100068;
rommem[2040] = 65'h147EF8010BE007F8A;
rommem[2041] = 65'h147E0800047E10008;
rommem[2042] = 65'h10FEF000837EF8018;
rommem[2043] = 65'h131FFEFE767EF8000;
rommem[2044] = 65'h10BEF000847EF8000;
rommem[2045] = 65'h167E080000FEF0010;
rommem[2046] = 65'h1E040000D67EF8008;
rommem[2047] = 65'h0E040000A31FFEF47;
rommem[2048] = 65'h147EF800831FFEF47;
rommem[2049] = 65'h037EF801047E08000;
rommem[2050] = 65'h167E080000FEF0010;
rommem[2051] = 65'h01410800F67EF8008;
rommem[2052] = 65'h0AC1002390A108030;
rommem[2053] = 65'h131FFEF470A108007;
rommem[2054] = 65'h147E0800047EF8008;
rommem[2055] = 65'h00FEF001037EF8010;
rommem[2056] = 65'h167EF800867E08000;
rommem[2057] = 65'h031FFF00406108804;
rommem[2058] = 65'h031FFF00406108802;
rommem[2059] = 65'h147E0800047EF8008;
rommem[2060] = 65'h10FEF001837EF8010;
rommem[2061] = 65'h067E1800867E08000;
rommem[2062] = 65'h0E0C0000767EF8010;
rommem[2063] = 65'h131FFF00F06109002;
rommem[2064] = 65'h047EF8010BE01FFCF;
rommem[2065] = 65'h047E0800047E18008;
rommem[2066] = 65'h00FEF001837EF8018;
rommem[2067] = 65'h067E1800867E08000;
rommem[2068] = 65'h0E040003A67EF8010;
rommem[2069] = 65'h10220800931FFEF47;
rommem[2070] = 65'h0E0C0000731FFF019;
rommem[2071] = 65'h131FFEF47E0400020;
rommem[2072] = 65'h031FFF00F40208000;
rommem[2073] = 65'h0BE01FF6F0A210001;
rommem[2074] = 65'h147EF801031FFEFFA;
rommem[2075] = 65'h047E0800047E18008;
rommem[2076] = 65'h00FEF003037EF8018;
rommem[2077] = 65'h067E2000867E18000;
rommem[2078] = 65'h167E3001867E28010;
rommem[2079] = 65'h167E4002867E38020;
rommem[2080] = 65'h1E2000013E080000A;
rommem[2081] = 65'h00631F80004110C1C;
rommem[2082] = 65'h1064208010653F800;
rommem[2083] = 65'h00652880104439009;
rommem[2084] = 65'h01C10800004519409;
rommem[2085] = 65'h106426001BE047F0F;
rommem[2086] = 65'h00443100906532000;
rommem[2087] = 65'h0024080090652E001;
rommem[2088] = 65'h147E1800002510009;
rommem[2089] = 65'h147E2801047E20008;
rommem[2090] = 65'h047E3802047E30018;
rommem[2091] = 65'h137EF803047E40028;
rommem[2092] = 65'h067E180000FEF0020;
rommem[2093] = 65'h167E2801067E20008;
rommem[2094] = 65'h1E200000F67E40018;
rommem[2095] = 65'h1162100301411000F;
rommem[2096] = 65'h10642100106217000;
rommem[2097] = 65'h0044290090632F000;
rommem[2098] = 65'h004310C0906319001;
rommem[2099] = 65'h0BE047EEF06108801;
rommem[2100] = 65'h10231000902408009;
rommem[2101] = 65'h047E2000847E18000;
rommem[2102] = 65'h047E4001847E28010;
rommem[2103] = 65'h00FEF003837EF8020;
rommem[2104] = 65'h067E3800867E18000;
rommem[2105] = 65'h067E4801867E40010;
rommem[2106] = 65'h067E5802867E50020;
rommem[2107] = 65'h00225800967EF8030;
rommem[2108] = 65'h10225000931FFF039;
rommem[2109] = 65'h0E240000131FFF058;
rommem[2110] = 65'h006938600E2000007;
rommem[2111] = 65'h10A7380040A738000;
rommem[2112] = 65'h06A758C10141180FF;
rommem[2113] = 65'h1BE047F4F06109001;
rommem[2114] = 65'h0BE04FEEF02208009;
rommem[2115] = 65'h031FFF05802A08009;
rommem[2116] = 65'h1141180FFE2000003;
rommem[2117] = 65'h1061090016A858C10;
rommem[2118] = 65'h160B00014BE047FAF;
rommem[2119] = 65'h047E3800847E18000;
rommem[2120] = 65'h047E4801847E40010;
rommem[2121] = 65'h047E5802847E50020;
rommem[2122] = 65'h037EF803847EF8030;
rommem[2123] = 65'h16A0D782DE6BEFFF8;
rommem[2124] = 65'h131FFEFFA6000141C;
rommem[2125] = 65'h031FFEF47E0400024;
rommem[2126] = 65'h0B01FFFFF31FFEE08;
rommem[2127] = 65'h131FFEF47B010030D;
rommem[2128] = 65'h162001418BE007F8A;
rommem[2129] = 65'h104100C0931FFEF37;
rommem[2130] = 65'h00A31800282308000;
rommem[2131] = 65'h0B210042431FFEF33;
rommem[2132] = 65'h00A31800282308000;
rommem[2133] = 65'h0B010563A31FFEF33;
rommem[2134] = 65'h0B012EF42B0106344;
rommem[2135] = 65'h0B010914CB0105D4A;
rommem[2136] = 65'h1B0100743B010153F;
rommem[2137] = 65'h0B012B849B0100452;
rommem[2138] = 65'h1BE007C2AB011A350;
rommem[2139] = 65'h0BE007BEA31FFF1BC;
rommem[2140] = 65'h00A31800282308000;
rommem[2141] = 65'h0B21FDB4C31FFEF33;
rommem[2142] = 65'h00A31800282308000;
rommem[2143] = 65'h1B21FD75331FFEF33;
rommem[2144] = 65'h06000141831FFEED9;
rommem[2145] = 65'h031FFEF3760001416;
rommem[2146] = 65'h1E07FC320BE007A4A;
rommem[2147] = 65'h0BE0079EA31FFEFE7;
rommem[2148] = 65'h170736944203D203F;
rommem[2149] = 65'h1706C65682079616C;
rommem[2150] = 65'h0203D20534C430A0D;
rommem[2151] = 65'h16373207261656C63;
rommem[2152] = 65'h1203A0A0D6E656572;
rommem[2153] = 65'h06D2074696445203D;
rommem[2154] = 65'h179622079726F6D65;
rommem[2155] = 65'h13D204C0A0D736574;
rommem[2156] = 65'h031532064616F4C20;
rommem[2157] = 65'h00A0D656C69662039;
rommem[2158] = 65'h0706D7544203D2044;
rommem[2159] = 65'h10D79726F6D656D20;
rommem[2160] = 65'h1617473203D20420A;
rommem[2161] = 65'h020796E6974207472;
rommem[2162] = 65'h14A0A0D6369736162;
rommem[2163] = 65'h020706D754A203D20;
rommem[2164] = 65'h10D65646F63206F74;
rommem[2165] = 65'h1766E49203D20490A;
rommem[2166] = 65'h1520A0D7372656461;
rommem[2167] = 65'h16F646E6152203D20;
rommem[2168] = 65'h10D73656E696C206D;
rommem[2169] = 65'h0616950203D20500A;
rommem[2170] = 65'h0000000000A0D6F6E;
rommem[2171] = 65'h00000000000000000;
rommem[2172] = 65'h167EF80000FEF0008;
rommem[2173] = 65'h00A31800282308000;
rommem[2174] = 65'h0B01FFD2031FFEF33;
rommem[2175] = 65'h047EF80000E318002;
rommem[2176] = 65'h031FFF0F837EF8008;
rommem[2177] = 65'h10410140931FFF11C;
rommem[2178] = 65'h131FFF0F8E1000007;
rommem[2179] = 65'h06050800031FFF11C;
rommem[2180] = 65'h0BE027F8F0A528001;
rommem[2181] = 65'h131FFF0F8BE00718A;
rommem[2182] = 65'h0341F800031FFF11C;
rommem[2183] = 65'h031FFF0F8BE00710A;
rommem[2184] = 65'h00211000931FFF11C;
rommem[2185] = 65'h031FFF02531FFEFFA;
rommem[2186] = 65'h031FFF02531FFF025;
rommem[2187] = 65'h031FFF02531FFF025;
rommem[2188] = 65'h031FFF02531FFF025;
rommem[2189] = 65'h0BE006F6A31FFF025;
rommem[2190] = 65'h067E100000FEF0018;
rommem[2191] = 65'h067EF801067E20008;
rommem[2192] = 65'h0E100000FE0800000;
rommem[2193] = 65'h00A31800282308000;
rommem[2194] = 65'h031FFF13031FFEF33;
rommem[2195] = 65'h106210800B01005FF;
rommem[2196] = 65'h0042088091410800F;
rommem[2197] = 65'h102208009BE027F0F;
rommem[2198] = 65'h047E2000847EF8010;
rommem[2199] = 65'h137EF801847E10000;
rommem[2200] = 65'h1AE100339A8100E30;
rommem[2201] = 65'h037EF80000E108030;
rommem[2202] = 65'h0AE100446A8100A41;
rommem[2203] = 65'h10A10800A0E108041;
rommem[2204] = 65'h0A810056137EF8000;
rommem[2205] = 65'h10E108061AE100466;
rommem[2206] = 65'h137EF80000A10800A;
rommem[2207] = 65'h137EF8000E07FFFFF;
rommem[2208] = 65'h031FFF1B2BE00006A;
rommem[2209] = 65'h131FFF1B2B21FFF0A;
rommem[2210] = 65'h1B21FFC53B01F521A;
rommem[2211] = 65'h1A01FFA3031FFF1B2;
rommem[2212] = 65'h004101009A61FF939;
rommem[2213] = 65'h031FFF13031FFF1B2;
rommem[2214] = 65'h131FFF1B204100809;
rommem[2215] = 65'h10621080031FFF130;
rommem[2216] = 65'h104208C0904208809;
rommem[2217] = 65'h0B0401E31B04FEF30;
rommem[2218] = 65'h1B0402033B0401F32;
rommem[2219] = 65'h0B0402037B04FEB35;
rommem[2220] = 65'h1B0402439B0402238;
rommem[2221] = 65'h0143180FFBE007CEA;
rommem[2222] = 65'h031FFF1B20E318001;
rommem[2223] = 65'h10621080031FFF130;
rommem[2224] = 65'h031FFF1B204208809;
rommem[2225] = 65'h10621080031FFF130;
rommem[2226] = 65'h16051000004208809;
rommem[2227] = 65'h1BE01FECF0A528001;
rommem[2228] = 65'h031FFF13031FFF1B2;
rommem[2229] = 65'h10420880906210800;
rommem[2230] = 65'h031FFF13031FFF1B2;
rommem[2231] = 65'h10420880906210800;
rommem[2232] = 65'h131FFF180BE007A2A;
rommem[2233] = 65'h031FFF186BE007D2A;
rommem[2234] = 65'h131FFF18CBE007CEA;
rommem[2235] = 65'h031FFF18CBE007CAA;
rommem[2236] = 65'h0BE0063AA66028000;
rommem[2237] = 65'h16602800031FFF186;
rommem[2238] = 65'h031FFF180BE00634A;
rommem[2239] = 65'h0BE0062EA66028000;
rommem[2240] = 65'h167EF80000FEF0008;
rommem[2241] = 65'h031FFF13031FFF1B2;
rommem[2242] = 65'h0BE00038A04100809;
rommem[2243] = 65'h167EF80000FEF0008;
rommem[2244] = 65'h031FFF13031FFF1B2;
rommem[2245] = 65'h0BE0001CA04100809;
rommem[2246] = 65'h167EF80000FEF0008;
rommem[2247] = 65'h031FFF13031FFF1B2;
rommem[2248] = 65'h131FFF1B204100809;
rommem[2249] = 65'h10621080031FFF130;
rommem[2250] = 65'h031FFF1B204110809;
rommem[2251] = 65'h10621080031FFF130;
rommem[2252] = 65'h031FFF1B204208809;
rommem[2253] = 65'h10621080031FFF130;
rommem[2254] = 65'h031FFF1B204208809;
rommem[2255] = 65'h10621080031FFF130;
rommem[2256] = 65'h031FFF1B204208809;
rommem[2257] = 65'h10621080031FFF130;
rommem[2258] = 65'h031FFF1B204208809;
rommem[2259] = 65'h10621080031FFF130;
rommem[2260] = 65'h031FFF1B204208809;
rommem[2261] = 65'h10621080031FFF130;
rommem[2262] = 65'h00442100A04208809;
rommem[2263] = 65'h047EF800004201409;
rommem[2264] = 65'h037EF80000BEF0008;
rommem[2265] = 65'h167EF80000FEF0008;
rommem[2266] = 65'h1BE10690831FFEE1D;
rommem[2267] = 65'h0B01EDF0031FFEE08;
rommem[2268] = 65'h0BE107F6231FFF95C;
rommem[2269] = 65'h037EF800847EF8000;
rommem[2270] = 65'h067E080000FEF0018;
rommem[2271] = 65'h167EF801067E18008;
rommem[2272] = 65'h0020088A800000050;
rommem[2273] = 65'h1EE800003E69AE000;
rommem[2274] = 65'h1000000506A0D042A;
rommem[2275] = 65'h016018554020088A8;
rommem[2276] = 65'h1E69AE0080411841C;
rommem[2277] = 65'h06A0D042AEE800003;
rommem[2278] = 65'h0020088A800000050;
rommem[2279] = 65'h00411841C16018554;
rommem[2280] = 65'h0EE800003E69AE010;
rommem[2281] = 65'h1000000506A0D042A;
rommem[2282] = 65'h116018300020088A8;
rommem[2283] = 65'h0E69AE00C0411841C;
rommem[2284] = 65'h06A0D042AEE800003;
rommem[2285] = 65'h0020088A800000050;
rommem[2286] = 65'h10411841C16018300;
rommem[2287] = 65'h1EE800003E69AE014;
rommem[2288] = 65'h0E04000026A0D042A;
rommem[2289] = 65'h1EE800003E69AE03C;
rommem[2290] = 65'h131FFEE086A0D042A;
rommem[2291] = 65'h1B01FD972B0100303;
rommem[2292] = 65'h047EF8010BE007FAA;
rommem[2293] = 65'h047E0800047E18008;
rommem[2294] = 65'h1E698000037EF8018;
rommem[2295] = 65'h16A0D082DEE800003;
rommem[2296] = 65'h100000050E10037FF;
rommem[2297] = 65'h192208000020088A8;
rommem[2298] = 65'h0BE027F8F0A210002;
rommem[2299] = 65'h10FEF001037EF8000;
rommem[2300] = 65'h167EF800867E08000;
rommem[2301] = 65'h0EE800003E69C1026;
rommem[2302] = 65'h031FFEE086A0D0029;
rommem[2303] = 65'h1E69C1068B0100A03;
rommem[2304] = 65'h06A0D0429EE800003;
rommem[2305] = 65'h1E69C1026BE107F69;
rommem[2306] = 65'h06A0D0429EE800003;
rommem[2307] = 65'h1B21FF30F1410800F;
rommem[2308] = 65'h0EE800003E69C1002;
rommem[2309] = 65'h1E69C10046A0D0029;
rommem[2310] = 65'h16A0D0029EE800003;
rommem[2311] = 65'h1EE800003E69C1018;
rommem[2312] = 65'h0E69C100A6A0D0029;
rommem[2313] = 65'h16A0D0029EE800003;
rommem[2314] = 65'h0E69C1020E07F8000;
rommem[2315] = 65'h06A0D0429EE800003;
rommem[2316] = 65'h0B010050331FFEE08;
rommem[2317] = 65'h0EE800003E69C1068;
rommem[2318] = 65'h1BE107F696A0D0429;
rommem[2319] = 65'h147E0800047EF8008;
rommem[2320] = 65'h00FEF001037EF8010;
rommem[2321] = 65'h167EF800867E08000;
rommem[2322] = 65'h0E69C0600E0400008;
rommem[2323] = 65'h16A0D0428EE800003;
rommem[2324] = 65'h0E69500801600800F;
rommem[2325] = 65'h06A0D0429EE800003;
rommem[2326] = 65'h1E69500001600B46E;
rommem[2327] = 65'h06A0D0429EE800003;
rommem[2328] = 65'h1E69C0600E0400009;
rommem[2329] = 65'h16A0D0428EE800003;
rommem[2330] = 65'h1E6950006E07FCA12;
rommem[2331] = 65'h06A0D0429EE800003;
rommem[2332] = 65'h1E695000416009104;
rommem[2333] = 65'h06A0D0429EE800003;
rommem[2334] = 65'h1EE800005E6BD7840;
rommem[2335] = 65'h0BE00800F040D0409;
rommem[2336] = 65'h0E69C0600E040000D;
rommem[2337] = 65'h16A0D0428EE800003;
rommem[2338] = 65'h0E695000416008104;
rommem[2339] = 65'h06A0D0429EE800003;
rommem[2340] = 65'h1EE800005E6BD7840;
rommem[2341] = 65'h0BE00800F040D0409;
rommem[2342] = 65'h0E69C0600E0400010;
rommem[2343] = 65'h16A0D0428EE800003;
rommem[2344] = 65'h0E695000416008000;
rommem[2345] = 65'h06A0D0429EE800003;
rommem[2346] = 65'h147E0800047EF8008;
rommem[2347] = 65'h01600800F37EF8010;
rommem[2348] = 65'h1EE800003E6950080;
rommem[2349] = 65'h131FFEE086A0D0429;
rommem[2350] = 65'h1B0100861B01E3A03;
rommem[2351] = 65'h1B0100C63B0100A62;
rommem[2352] = 65'h1B0101065B0100E64;
rommem[2353] = 65'h1B0101467B0101266;
rommem[2354] = 65'h1E0401C31BE007EEA;
rommem[2355] = 65'h0BE007E8A31FFF27A;
rommem[2356] = 65'h031FFF27AE0401FA5;
rommem[2357] = 65'h0E04010C3BE007E2A;
rommem[2358] = 65'h1BE007DCA31FFF27A;
rommem[2359] = 65'h131FFF27AE04012D1;
rommem[2360] = 65'h0E040151FBE007D6A;
rommem[2361] = 65'h1BE007D0A31FFF27A;
rommem[2362] = 65'h031FFF27AE0401660;
rommem[2363] = 65'h0E040191EBE007CAA;
rommem[2364] = 65'h1BE007C4A31FFF27A;
rommem[2365] = 65'h167E080000FEF0010;
rommem[2366] = 65'h1E695000067EF8008;
rommem[2367] = 65'h06A0D0429EE800003;
rommem[2368] = 65'h1E6950006E07FCA12;
rommem[2369] = 65'h06A0D0429EE800003;
rommem[2370] = 65'h1E695000416009104;
rommem[2371] = 65'h06A0D0429EE800003;
rommem[2372] = 65'h0040D0409E683D090;
rommem[2373] = 65'h116008104BE00800F;
rommem[2374] = 65'h1EE800003E6950004;
rommem[2375] = 65'h0E683D0906A0D0429;
rommem[2376] = 65'h0BE00800F040D0409;
rommem[2377] = 65'h0E695000416008000;
rommem[2378] = 65'h06A0D0429EE800003;
rommem[2379] = 65'h147E0800047EF8008;
rommem[2380] = 65'h00FEF000837EF8010;
rommem[2381] = 65'h0E04000C867E08000;
rommem[2382] = 65'h1EE800003E69A0100;
rommem[2383] = 65'h1E04000F06A0D0429;
rommem[2384] = 65'h0EE800003E69A0102;
rommem[2385] = 65'h0E04001186A0D0429;
rommem[2386] = 65'h0EE800003E69A0104;
rommem[2387] = 65'h1E04001406A0D0429;
rommem[2388] = 65'h1EE800003E69A0106;
rommem[2389] = 65'h1E04001686A0D0429;
rommem[2390] = 65'h0EE800003E69A0108;
rommem[2391] = 65'h147E080006A0D0429;
rommem[2392] = 65'h0E69A011E37EF8008;
rommem[2393] = 65'h16A0D0421EE800003;
rommem[2394] = 65'h1B0100802B0100901;
rommem[2395] = 65'h0B0100604B0100703;
rommem[2396] = 65'h1B0100406B0100505;
rommem[2397] = 65'h1B0100208B0100307;
rommem[2398] = 65'h01A10802837EF8000;
rommem[2399] = 65'h1E69AD0020A1080CC;
rommem[2400] = 65'h06A0D0429EE800003;
rommem[2401] = 65'h1EE800003E69AD012;
rommem[2402] = 65'h1E69AD0226A0D0429;
rommem[2403] = 65'h06A0D0429EE800003;
rommem[2404] = 65'h0EE800003E69AD032;
rommem[2405] = 65'h1E69AD0426A0D0429;
rommem[2406] = 65'h06A0D0429EE800003;
rommem[2407] = 65'h0EE800003E69AD052;
rommem[2408] = 65'h0E69AD0626A0D0429;
rommem[2409] = 65'h06A0D0429EE800003;
rommem[2410] = 65'h1EE800003E69AD072;
rommem[2411] = 65'h037EF80006A0D0429;
rommem[2412] = 65'h167E080000FEF0020;
rommem[2413] = 65'h167E1801067E10008;
rommem[2414] = 65'h131FFEEBA67EF8018;
rommem[2415] = 65'h04201941842011416;
rommem[2416] = 65'h1EE800003E69C0418;
rommem[2417] = 65'h11600802E6A0D002B;
rommem[2418] = 65'h01600804062009416;
rommem[2419] = 65'h0E69C040062009418;
rommem[2420] = 65'h06A0D0423EE800003;
rommem[2421] = 65'h16201141631FFF019;
rommem[2422] = 65'h031FFEF3762019418;
rommem[2423] = 65'h047EF801831FFEEBF;
rommem[2424] = 65'h147E1000847E18010;
rommem[2425] = 65'h037EF802047E08000;
rommem[2426] = 65'h0400000040FEF0010;
rommem[2427] = 65'h062019508E0C00140;
rommem[2428] = 65'h06000151062001500;
rommem[2429] = 65'h06200151462001512;
rommem[2430] = 65'h037EF827740000004;
rommem[2431] = 65'h0400000050FEF0018;
rommem[2432] = 65'h160019416E0C00001;
rommem[2433] = 65'h160019418E0C00028;
rommem[2434] = 65'h031FFF00F40009500;
rommem[2435] = 65'h131FFF00F40009501;
rommem[2436] = 65'h037EF827F40000005;
rommem[2437] = 65'h0400000010FEF0010;
rommem[2438] = 65'h0AC10140242009514;
rommem[2439] = 65'h10610860142009512;
rommem[2440] = 65'h14200951460009418;
rommem[2441] = 65'h00E10800160009416;
rommem[2442] = 65'h0E040005E62009514;
rommem[2443] = 65'h04000941831FFEF47;
rommem[2444] = 65'h1600094180E108001;
rommem[2445] = 65'h10E10800140009416;
rommem[2446] = 65'h1E040002060009416;
rommem[2447] = 65'h04000000131FFEF47;
rommem[2448] = 65'h06000151037EF8010;
rommem[2449] = 65'h10610860142009512;
rommem[2450] = 65'h14200951460009418;
rommem[2451] = 65'h1E040002060009416;
rommem[2452] = 65'h04000000131FFEF47;
rommem[2453] = 65'h10FEF001837EF8010;
rommem[2454] = 65'h0E0C0027F40000005;
rommem[2455] = 65'h14201950860019416;
rommem[2456] = 65'h16001941806318601;
rommem[2457] = 65'h131FFEF47E0400020;
rommem[2458] = 65'h131FFEF47E0400023;
rommem[2459] = 65'h031FFEF47E0400041;
rommem[2460] = 65'h131FFEF47E0400023;
rommem[2461] = 65'h131FFEF47E0400020;
rommem[2462] = 65'h037EF827F40000005;
rommem[2463] = 65'h0160080E946018000;
rommem[2464] = 65'h1160080F262308000;
rommem[2465] = 65'h0160080DF62308001;
rommem[2466] = 65'h037EF800062308002;
rommem[2467] = 65'h04000000F0FEF0028;
rommem[2468] = 65'h04202157042009520;
rommem[2469] = 65'h1BE2003A814110001;
rommem[2470] = 65'h16001941640019571;
rommem[2471] = 65'h0E040002060021418;
rommem[2472] = 65'h0E040002331FFF00F;
rommem[2473] = 65'h0E040002331FFF00F;
rommem[2474] = 65'h0E040002331FFF00F;
rommem[2475] = 65'h0E040002031FFF00F;
rommem[2476] = 65'h04000941631FFF00F;
rommem[2477] = 65'h1600094160A108001;
rommem[2478] = 65'h10E10800540009418;
rommem[2479] = 65'h031FFF00FE0400020;
rommem[2480] = 65'h031FFF00FE0400058;
rommem[2481] = 65'h031FFF00FE0400020;
rommem[2482] = 65'h031FFF00FE0400058;
rommem[2483] = 65'h031FFF00FE0400020;
rommem[2484] = 65'h037EF827F4000000F;
rommem[2485] = 65'h1FFFF000037EF8000;
rommem[2486] = 65'h131FFF2FF4000000F;
rommem[2487] = 65'h131FFF34631FFF2FE;
rommem[2488] = 65'h031FFF30A31FFF36A;
rommem[2489] = 65'h131FFEE0831FFF32B;
rommem[2490] = 65'h0B010096AB010046B;
rommem[2491] = 65'h1BE0002AAB0100D20;
rommem[2492] = 65'h1E680028042011508;
rommem[2493] = 65'h00A210008BE2D0247;
rommem[2494] = 65'h0BE0001EA62011508;
rommem[2495] = 65'h0BE2001A242011508;
rommem[2496] = 65'h0620115080E210008;
rommem[2497] = 65'h040011510BE00014A;
rommem[2498] = 65'h1E0800001BE200109;
rommem[2499] = 65'h04201150860011510;
rommem[2500] = 65'h1E080002E62011512;
rommem[2501] = 65'h0BE00002A62011514;
rommem[2502] = 65'h1BE007C2AB0100203;
rommem[2503] = 65'h10BEF02F74000000F;
rommem[2504] = 65'h133FFF39CBE0020CA;
rommem[2505] = 65'h033FFF95A33FFF3BE;
rommem[2506] = 65'h033FFF96233FFF95B;
rommem[2507] = 65'h133FFF9EA33FFF95C;
rommem[2508] = 65'h10000000010060000;
rommem[2509] = 65'h100000000107FFFF8;
rommem[2510] = 65'h167EF80000FEF0008;
rommem[2511] = 65'h1460F4E68660F1088;
rommem[2512] = 65'h167EF80000FEF0008;
rommem[2513] = 65'h16200141862001416;
rommem[2514] = 65'h06600103C6000141A;
rommem[2515] = 65'h1EE800040E6800020;
rommem[2516] = 65'h164011040040D0809;
rommem[2517] = 65'h19A00E5C031FFEED9;
rommem[2518] = 65'h09A00E5C031FFF94D;
rommem[2519] = 65'h04600CE6031FFF940;
rommem[2520] = 65'h04600CE68660090D0;
rommem[2521] = 65'h1660090F80E108800;
rommem[2522] = 65'h0660090D80E10A000;
rommem[2523] = 65'h1460090D831FFF4C3;
rommem[2524] = 65'h104118404460190D0;
rommem[2525] = 65'h031FFF88DE0800000;
rommem[2526] = 65'h031FFF9409A00E668;
rommem[2527] = 65'h066001098660010A8;
rommem[2528] = 65'h1460F4E6866001090;
rommem[2529] = 65'h031FFF9409A00E676;
rommem[2530] = 65'h131FFF7D8E040003E;
rommem[2531] = 65'h10286000931FFF91D;
rommem[2532] = 65'h131FFF8FF9A04111B;
rommem[2533] = 65'h0BE10172831FFF914;
rommem[2534] = 65'h19A00E694AC1003FF;
rommem[2535] = 65'h102110009BE007F4A;
rommem[2536] = 65'h00621100160817FFE;
rommem[2537] = 65'h10E84000260817FFF;
rommem[2538] = 65'h00296800931FFF80C;
rommem[2539] = 65'h1E0400000BE1001C8;
rommem[2540] = 65'h1BE10004931FFF820;
rommem[2541] = 65'h002908009BE900108;
rommem[2542] = 65'h0460190D002D10009;
rommem[2543] = 65'h0660110D031FFF829;
rommem[2544] = 65'h0BE00006A02D48009;
rommem[2545] = 65'h102D48009660690D0;
rommem[2546] = 65'h10414040402C08009;
rommem[2547] = 65'h0460590D0A41FDE03;
rommem[2548] = 65'h104B0AC0202B50009;
rommem[2549] = 65'h0BEB08064460090D8;
rommem[2550] = 65'h033FFF7C89A00E76F;
rommem[2551] = 65'h102A08009660590D0;
rommem[2552] = 65'h00291800902B10009;
rommem[2553] = 65'h00280800931FFF82F;
rommem[2554] = 65'h002C1800902D10009;
rommem[2555] = 65'h0BE0079AA31FFF829;
rommem[2556] = 65'h1C4414F4CD453494C;
rommem[2557] = 65'h14153CE5552D7454E;
rommem[2558] = 65'h0454CD458454EC556;
rommem[2559] = 65'h147CF544F47C649D4;
rommem[2560] = 65'h155544552C255534F;
rommem[2561] = 65'h1D24F46CD4552CE52;
rommem[2562] = 65'h1495250D455504E49;
rommem[2563] = 65'h050C3454B4F50D44E;
rommem[2564] = 65'h1454B4F50C8454B4F;
rommem[2565] = 65'h14F5453C54B4F50D7;
rommem[2566] = 65'h143D35953C55942D0;
rommem[2567] = 65'h0434452D24C43D34C;
rommem[2568] = 65'h050C34B45455000C6;
rommem[2569] = 65'h14B454550C84B4545;
rommem[2570] = 65'h1C44E52CB454550D7;
rommem[2571] = 65'h055C55A4953D34241;
rommem[2572] = 65'h0545300CF5400D253;
rommem[2573] = 65'h1BEBE3CBD3E00D045;
rommem[2574] = 65'h0C44E4100BCBD3CBD;
rommem[2576] = 65'h0FFFFFFFFFFFFD338;
rommem[2577] = 65'h0FFFFFFFFFFFFD67C;
rommem[2578] = 65'h0FFFFFFFFFFFFD284;
rommem[2579] = 65'h0FFFFFFFFFFFFD29C;
rommem[2580] = 65'h0FFFFFFFFFFFFD728;
rommem[2581] = 65'h0FFFFFFFFFFFFD508;
rommem[2582] = 65'h0FFFFFFFFFFFFD664;
rommem[2583] = 65'h1FFFFFFFFFFFFD578;
rommem[2584] = 65'h0FFFFFFFFFFFFD2E4;
rommem[2585] = 65'h0FFFFFFFFFFFFD418;
rommem[2586] = 65'h1FFFFFFFFFFFFD454;
rommem[2587] = 65'h0FFFFFFFFFFFFD580;
rommem[2588] = 65'h1FFFFFFFFFFFFD48C;
rommem[2589] = 65'h0FFFFFFFFFFFFD5A8;
rommem[2590] = 65'h0FFFFFFFFFFFFD380;
rommem[2591] = 65'h0FFFFFFFFFFFFD83C;
rommem[2592] = 65'h1FFFFFFFFFFFFD868;
rommem[2593] = 65'h1FFFFFFFFFFFFD894;
rommem[2594] = 65'h1FFFFFFFFFFFFD808;
rommem[2595] = 65'h1FFFFFFFFFFFFD294;
rommem[2596] = 65'h1FFFFFFFFFFFFCE5C;
rommem[2597] = 65'h0FFFFFFFFFFFFD8C0;
rommem[2598] = 65'h0FFFFFFFFFFFFE58C;
rommem[2599] = 65'h0FFFFFFFFFFFFD304;
rommem[2600] = 65'h1FFFFFFFFFFFFE5A0;
rommem[2601] = 65'h1FFFFFFFFFFFFD65C;
rommem[2602] = 65'h0FFFFFFFFFFFFDD3C;
rommem[2603] = 65'h0FFFFFFFFFFFFDD50;
rommem[2604] = 65'h1FFFFFFFFFFFFDD64;
rommem[2605] = 65'h1FFFFFFFFFFFFDD2C;
rommem[2606] = 65'h1FFFFFFFFFFFFDD94;
rommem[2607] = 65'h1FFFFFFFFFFFFDE2C;
rommem[2608] = 65'h1FFFFFFFFFFFFDE4C;
rommem[2609] = 65'h0FFFFFFFFFFFFDD78;
rommem[2610] = 65'h0FFFFFFFFFFFFDB50;
rommem[2611] = 65'h1FFFFFFFFFFFFD4A4;
rommem[2612] = 65'h0FFFFFFFFFFFFDF1C;
rommem[2613] = 65'h0FFFFFFFFFFFFD4B8;
rommem[2614] = 65'h0FFFFFFFFFFFFD4C0;
rommem[2615] = 65'h0FFFFFFFFFFFFD9D0;
rommem[2616] = 65'h0FFFFFFFFFFFFD9E0;
rommem[2617] = 65'h1FFFFFFFFFFFFD9F0;
rommem[2618] = 65'h0FFFFFFFFFFFFDA10;
rommem[2619] = 65'h1FFFFFFFFFFFFDA00;
rommem[2620] = 65'h0FFFFFFFFFFFFDA20;
rommem[2621] = 65'h1FFFFFFFFFFFFDA48;
rommem[2622] = 65'h1FFFFFFFFFFFFD93C;
rommem[2623] = 65'h0FFFFFFFFFFFFD94C;
rommem[2624] = 65'h0FFFFFFFFFFFFD904;
rommem[2625] = 65'h1FFFFFFFFFFFFD914;
rommem[2626] = 65'h19A0550809A04CFE0;
rommem[2627] = 65'h031FFF91403F58009;
rommem[2628] = 65'h00285800902BF8009;
rommem[2629] = 65'h04A808000E0C00000;
rommem[2630] = 65'h14A9100000A840001;
rommem[2631] = 65'h002B40009BE200069;
rommem[2632] = 65'h1BE1181C8BE0001EA;
rommem[2633] = 65'h1BE2081081421007F;
rommem[2634] = 65'h002B400090AA50008;
rommem[2635] = 65'h00A948001E0C00000;
rommem[2636] = 65'h1BE107FC34090FFFF;
rommem[2637] = 65'h0E0C0002EBE007E2A;
rommem[2638] = 65'h04090FFFF0A948001;
rommem[2639] = 65'h146A58000BE107DA3;
rommem[2640] = 65'h131FFF7B934B00000;
rommem[2641] = 65'h1660090D04600CE60;
rommem[2642] = 65'h131FFF7B931FFF4C3;
rommem[2643] = 65'h131FFF7B9BE00630A;
rommem[2644] = 65'h06604109046044E60;
rommem[2645] = 65'h14600909031FFF4C3;
rommem[2646] = 65'h0E0400000BE106248;
rommem[2647] = 65'h131FFF81002848009;
rommem[2648] = 65'h0BE900049BE100069;
rommem[2649] = 65'h166049090BE00618A;
rommem[2650] = 65'h131FFF9369A940002;
rommem[2651] = 65'h19A0550A89A04CFF2;
rommem[2652] = 65'h031FFF63ABE0079CA;
rommem[2653] = 65'h131FFF7B902128009;
rommem[2654] = 65'h031FFF80C02508009;
rommem[2655] = 65'h09A00E73BBE107EA9;
rommem[2656] = 65'h131FFF4C3BE00610A;
rommem[2657] = 65'h00FEF0010BE00084A;
rommem[2658] = 65'h067EF800867E30000;
rommem[2659] = 65'h1460090D8E1800800;
rommem[2660] = 65'h10810800866100000;
rommem[2661] = 65'h047EF8008BE037FCF;
rommem[2662] = 65'h137EF801047E30000;
rommem[2663] = 65'h00212800931FFF8FF;
rommem[2664] = 65'h10250800931FFF7B9;
rommem[2665] = 65'h0BE10004931FFF80C;
rommem[2666] = 65'h102908009BE905D48;
rommem[2667] = 65'h10214800931FFF8DF;
rommem[2668] = 65'h0BE10008831FFF936;
rommem[2669] = 65'h131FFF936B2100313;
rommem[2670] = 65'h0E0400000BE107FE8;
rommem[2671] = 65'h0BE007E8A31FFF810;
rommem[2672] = 65'h1E0C0003A1602800B;
rommem[2673] = 65'h131FFF8F19A025398;
rommem[2674] = 65'h1BE007A0A31FFEFFA;
rommem[2675] = 65'h19A0253ACE0C0000D;
rommem[2676] = 65'h131FFEFFA31FFF8F1;
rommem[2677] = 65'h1E0C00023BE00782A;
rommem[2678] = 65'h131FFF8F19A0253C4;
rommem[2679] = 65'h10410140931FFF63A;
rommem[2680] = 65'h1E0C00024BE00012A;
rommem[2681] = 65'h131FFF8F19A0253DC;
rommem[2682] = 65'h031FFF39331FFF63A;
rommem[2683] = 65'h131FFF867BE00006A;
rommem[2684] = 65'h1E0C0002CBE00010A;
rommem[2685] = 65'h131FFF8F19A0253F8;
rommem[2686] = 65'h0BE007DCA31FFF7AA;
rommem[2687] = 65'h0BE0000AA31FFEFFA;
rommem[2688] = 65'h10450080931FFF63A;
rommem[2689] = 65'h0BE007ECA31FFF88D;
rommem[2690] = 65'h033FFF7C731FFF7AA;
rommem[2691] = 65'h031FFF63A31FFF83E;
rommem[2692] = 65'h1BE10006931FFF80C;
rommem[2693] = 65'h0BE0057AA9A00E73B;
rommem[2694] = 65'h167E400000DEF0018;
rommem[2695] = 65'h167E0800846009090;
rommem[2696] = 65'h067E0801046009098;
rommem[2697] = 65'h0660F1098660010A8;
rommem[2698] = 65'h131FFF7B9BE0073EA;
rommem[2699] = 65'h1BE10006946009098;
rommem[2700] = 65'h0BE0055EA9A00E758;
rommem[2701] = 65'h147E08010021F0009;
rommem[2702] = 65'h047E0800866009098;
rommem[2703] = 65'h047E4000066009090;
rommem[2704] = 65'h031FFF83109EF0018;
rommem[2705] = 65'h131FFF83EBE007C4A;
rommem[2706] = 65'h0660090A831FFF798;
rommem[2707] = 65'h09A0551989A04D063;
rommem[2708] = 65'h131FFF63A33FFF486;
rommem[2709] = 65'h09A04D066660090B8;
rommem[2710] = 65'h033FFF4869A0551A8;
rommem[2711] = 65'h0BE00004A31FFF63A;
rommem[2712] = 65'h0660090B0E0400001;
rommem[2713] = 65'h1660110C046011090;
rommem[2714] = 65'h005E00C09660410C8;
rommem[2715] = 65'h0BE00004A460310A8;
rommem[2716] = 65'h0463100000A318028;
rommem[2717] = 65'h1BE237FA9BE2000E8;
rommem[2718] = 65'h10A31002804300409;
rommem[2719] = 65'h031FFF82F05E00C09;
rommem[2720] = 65'h1BE00786A09EF0028;
rommem[2721] = 65'h031FFF6ECE0400000;
rommem[2722] = 65'h19A00E717BE100069;
rommem[2723] = 65'h102148009BE00504A;
rommem[2724] = 65'h1BE100069460090A8;
rommem[2725] = 65'h0BE004FAA9A00E704;
rommem[2726] = 65'h131FFF831BE148068;
rommem[2727] = 65'h046908000BE007F4A;
rommem[2728] = 65'h004110403460110B0;
rommem[2729] = 65'h1460190B866908000;
rommem[2730] = 65'h1BE1180E0BE200063;
rommem[2731] = 65'h0BE1180A3BE00004A;
rommem[2732] = 65'h166041090460410C0;
rommem[2733] = 65'h0BE00752A460410C8;
rommem[2734] = 65'h0BE0074EA31FFF831;
rommem[2735] = 65'h0BE106AC931FFF63A;
rommem[2736] = 65'h0E040000002848009;
rommem[2737] = 65'h1BE104B6331FFF821;
rommem[2738] = 65'h1460F10A0BE0069EA;
rommem[2739] = 65'h16604109047E40010;
rommem[2740] = 65'h10BEF002847E40008;
rommem[2741] = 65'h067E280200FEF0028;
rommem[2742] = 65'h031FFF86767E40000;
rommem[2743] = 65'h1E0400001BE0000CA;
rommem[2744] = 65'h1BE1003E831FFF6EC;
rommem[2745] = 65'h1BE0001AA02150009;
rommem[2746] = 65'h1E040000167E40008;
rommem[2747] = 65'h1BE10006931FFF6EC;
rommem[2748] = 65'h1BE0049EA9A00E6E7;
rommem[2749] = 65'h04082800002150009;
rommem[2750] = 65'h047E0800860800000;
rommem[2751] = 65'h06082800031FFF851;
rommem[2752] = 65'h14600909067E40008;
rommem[2753] = 65'h0E07FFFFF67E08010;
rommem[2754] = 65'h1660F10A066009090;
rommem[2755] = 65'h0E040003A67E50018;
rommem[2756] = 65'h19A04111B31FFF7D8;
rommem[2757] = 65'h047E5001831FFF63A;
rommem[2758] = 65'h047E0801066A08000;
rommem[2759] = 65'h147E4000866009090;
rommem[2760] = 65'h19A025650E0C0002C;
rommem[2761] = 65'h0BE007B2A31FFF8F1;
rommem[2762] = 65'h109EF002847E28020;
rommem[2763] = 65'h04080800033FFF504;
rommem[2764] = 65'h031FFF798B01F6C0D;
rommem[2765] = 65'h19A025410E0C0002C;
rommem[2766] = 65'h1BE007F8A31FFF8F1;
rommem[2767] = 65'h046044E60BE006CCA;
rommem[2768] = 65'h031FFF395E040000D;
rommem[2769] = 65'h1BE107FE231FFF396;
rommem[2770] = 65'h0B0100D1AB0100E40;
rommem[2771] = 65'h031FFF5B4B21FFC3A;
rommem[2772] = 65'h00610900160808000;
rommem[2773] = 65'h00A84000260808001;
rommem[2774] = 65'h1BE107FE231FFF396;
rommem[2775] = 65'h10A84000160808000;
rommem[2776] = 65'h1BE007E2AB21FFC0D;
rommem[2777] = 65'h1BE00416A660410D0;
rommem[2778] = 65'h167E280000FEF0018;
rommem[2779] = 65'h167EF801067E30008;
rommem[2780] = 65'h0E1400000E1800003;
rommem[2781] = 65'h1BE107FE231FFF396;
rommem[2782] = 65'h00652880031FFF5C5;
rommem[2783] = 65'h1BE037F6F04509409;
rommem[2784] = 65'h147EF801002508009;
rommem[2785] = 65'h147E2800047E30008;
rommem[2786] = 65'h0A410023937EF8018;
rommem[2787] = 65'h10E1080300E108007;
rommem[2788] = 65'h137EF80001410800F;
rommem[2789] = 65'h1460490D046044E60;
rommem[2790] = 65'h1BE8481C531FFF5E1;
rommem[2791] = 65'h131FFF395E040003A;
rommem[2792] = 65'h14A8100014A808000;
rommem[2793] = 65'h10411040906211000;
rommem[2794] = 65'h131FFF5E90A840002;
rommem[2795] = 65'h00A84000140808000;
rommem[2796] = 65'h131FFF395B01FF40D;
rommem[2797] = 65'h1E0400040BE007F8A;
rommem[2798] = 65'h031FFF5E131FFF395;
rommem[2799] = 65'h031FFF395E040001A;
rommem[2800] = 65'h10FEF0008BE003BCA;
rommem[2801] = 65'h0E040000D67EF8000;
rommem[2802] = 65'h1E040000A31FFF395;
rommem[2803] = 65'h147EF800031FFF395;
rommem[2804] = 65'h10DEF001037EF8008;
rommem[2805] = 65'h067E2800867EF8000;
rommem[2806] = 65'h1021200099A02910F;
rommem[2807] = 65'h10642080102408009;
rommem[2808] = 65'h16050800031FFF5FD;
rommem[2809] = 65'h1125091000E528001;
rommem[2810] = 65'h10A528001BE107F41;
rommem[2811] = 65'h131FFF39540508000;
rommem[2812] = 65'h0BE107F801250910F;
rommem[2813] = 65'h047EF800047E28008;
rommem[2814] = 65'h01410800F37EF8010;
rommem[2815] = 65'h008108007A010020A;
rommem[2816] = 65'h137EF80000A108030;
rommem[2817] = 65'h131FFF63A0FEF0008;
rommem[2818] = 65'h19A025834E0C0002C;
rommem[2819] = 65'h067E0800031FFF8F1;
rommem[2820] = 65'h147E1000031FFF63A;
rommem[2821] = 65'h10BEF000860208000;
rommem[2822] = 65'h09A00E680BE005F0A;
rommem[2823] = 65'h00FEF0008BE00374A;
rommem[2824] = 65'h1E0C0002C31FFF63A;
rommem[2825] = 65'h031FFF8F19A025834;
rommem[2826] = 65'h031FFF63A67E08000;
rommem[2827] = 65'h16220800047E10000;
rommem[2828] = 65'h033FFF5040BEF0008;
rommem[2829] = 65'h131FFF63A0FEF0008;
rommem[2830] = 65'h19A025834E0C0002C;
rommem[2831] = 65'h067E0800031FFF8F1;
rommem[2832] = 65'h147E1000031FFF63A;
rommem[2833] = 65'h00BEF000864208000;
rommem[2834] = 65'h10FEF000833FFF504;
rommem[2835] = 65'h1E0C0002C31FFF63A;
rommem[2836] = 65'h031FFF8F19A025834;
rommem[2837] = 65'h031FFF63A67E08000;
rommem[2838] = 65'h06620800047E10000;
rommem[2839] = 65'h033FFF5040BEF0008;
rommem[2840] = 65'h131FFF63A0FEF0008;
rommem[2841] = 65'h19A00E6D5BE100069;
rommem[2842] = 65'h167E40000BE00328A;
rommem[2843] = 65'h147E40000341F8000;
rommem[2844] = 65'h1BE00596A0BEF0008;
rommem[2845] = 65'h167EF80000FEF0010;
rommem[2846] = 65'h167E0800431FFF648;
rommem[2847] = 65'h09A0552009A04D079;
rommem[2848] = 65'h131FFF64833FFF486;
rommem[2849] = 65'h10411040947E10008;
rommem[2850] = 65'h147E08008BE007F2A;
rommem[2851] = 65'h037EF801047EF8000;
rommem[2852] = 65'h167EF80000FEF0010;
rommem[2853] = 65'h067E0800831FFF66D;
rommem[2854] = 65'h09A0551F09A04D075;
rommem[2855] = 65'h031FFF66D33FFF486;
rommem[2856] = 65'h00411040847E10008;
rommem[2857] = 65'h147E08008BE007F2A;
rommem[2858] = 65'h037EF801047EF8000;
rommem[2859] = 65'h1A6100339A0100430;
rommem[2860] = 65'h037EF8000E0400001;
rommem[2861] = 65'h137EF8000E0400000;
rommem[2862] = 65'h1A410035AA0100641;
rommem[2863] = 65'h1A610037AA0100461;
rommem[2864] = 65'h037EF8000E0400001;
rommem[2865] = 65'h137EF8000E0400000;
rommem[2866] = 65'h167EF80000FEF0008;
rommem[2867] = 65'h031FFF65604100809;
rommem[2868] = 65'h004200409BE100069;
rommem[2869] = 65'h147EF800031FFF65C;
rommem[2870] = 65'h00FEF001037EF8008;
rommem[2871] = 65'h031FFF69C67EF8000;
rommem[2872] = 65'h19A04D06B67E08008;
rommem[2873] = 65'h133FFF4869A0551B8;
rommem[2874] = 65'h031FFF69547E08008;
rommem[2875] = 65'h1BE0002AABE208321;
rommem[2876] = 65'h031FFF69547E08008;
rommem[2877] = 65'h1BE00022ABE2082A9;
rommem[2878] = 65'h031FFF69547E08008;
rommem[2879] = 65'h1BE0001AABE208223;
rommem[2880] = 65'h031FFF69547E08008;
rommem[2881] = 65'h0BE00012ABE2081A2;
rommem[2882] = 65'h031FFF69547E08008;
rommem[2883] = 65'h1BE0000AABE208128;
rommem[2884] = 65'h031FFF69547E08008;
rommem[2885] = 65'h1BE00002ABE2080A0;
rommem[2886] = 65'h0E040000047EF8000;
rommem[2887] = 65'h047EF800037EF8010;
rommem[2888] = 65'h137EF8010E0400001;
rommem[2889] = 65'h147EF800047E08008;
rommem[2890] = 65'h00FEF001037EF8010;
rommem[2891] = 65'h167E0800867EF8000;
rommem[2892] = 65'h047E1000831FFF69C;
rommem[2893] = 65'h037EF801047EF8000;
rommem[2894] = 65'h167EF80000FEF0010;
rommem[2895] = 65'h09A025A90E0C0002D;
rommem[2896] = 65'h1E040000031FFF8F1;
rommem[2897] = 65'h0BE00020A67E00008;
rommem[2898] = 65'h09A025A9CE0C0002B;
rommem[2899] = 65'h131FFF6B931FFF8F1;
rommem[2900] = 65'h1E0C0002B67E08008;
rommem[2901] = 65'h031FFF8F19A025AC0;
rommem[2902] = 65'h147E1000831FFF6B9;
rommem[2903] = 65'h1BE007F2A04110402;
rommem[2904] = 65'h09A025AD8E0C0002D;
rommem[2905] = 65'h131FFF6B931FFF8F1;
rommem[2906] = 65'h0BE007F0A02108006;
rommem[2907] = 65'h147EF800047E08008;
rommem[2908] = 65'h00FEF001037EF8010;
rommem[2909] = 65'h031FFF6CF67EF8000;
rommem[2910] = 65'h0E0C0002A67E08008;
rommem[2911] = 65'h031FFF8F19A025B10;
rommem[2912] = 65'h047E1000831FFF6CF;
rommem[2913] = 65'h1BE007F2A04110419;
rommem[2914] = 65'h09A025B30E0C0002F;
rommem[2915] = 65'h031FFF6CF31FFF8F1;
rommem[2916] = 65'h047E0800804100809;
rommem[2917] = 65'h1BE007E2A0411041B;
rommem[2918] = 65'h147EF800047E08008;
rommem[2919] = 65'h10FEF001837EF8010;
rommem[2920] = 65'h19A04D04267EF8000;
rommem[2921] = 65'h133FFF4869A055150;
rommem[2922] = 65'h031FFF6ECE0400000;
rommem[2923] = 65'h046108000BE100088;
rommem[2924] = 65'h137EF801847EF8000;
rommem[2925] = 65'h0BE20004931FFF8FF;
rommem[2926] = 65'h047EF800031FFF6DF;
rommem[2927] = 65'h10FEF000837EF8018;
rommem[2928] = 65'h0E0C0002867EF8000;
rommem[2929] = 65'h031FFF8F19A025BA8;
rommem[2930] = 65'h1E0C0002931FFF63A;
rommem[2931] = 65'h031FFF8F19A025BA8;
rommem[2932] = 65'h037EF800847EF8000;
rommem[2933] = 65'h0BE001BAA9A00E5FD;
rommem[2934] = 65'h067EF80000FEF0018;
rommem[2935] = 65'h10410140967E28008;
rommem[2936] = 65'h04A80800031FFF914;
rommem[2937] = 65'h0B2100F40A0101740;
rommem[2938] = 65'h131FFF6DF0A840001;
rommem[2939] = 65'h10FEF001806108600;
rommem[2940] = 65'h167EF800067E08008;
rommem[2941] = 65'h047EF800031FFF793;
rommem[2942] = 65'h1BE20804447E10008;
rommem[2943] = 65'h19A0090D833FFF7C5;
rommem[2944] = 65'h0BE0000AA04110405;
rommem[2945] = 65'h1BE10006831FFF70D;
rommem[2946] = 65'h031FFF73302510009;
rommem[2947] = 65'h047EF800047E28008;
rommem[2948] = 65'h147E2800837EF8018;
rommem[2949] = 65'h0E040000047EF8000;
rommem[2950] = 65'h00FEF001837EF8018;
rommem[2951] = 65'h067E2801067EF8000;
rommem[2952] = 65'h167E0800840808000;
rommem[2953] = 65'h0BE10038831FFF65C;
rommem[2954] = 65'h00A840001E1400005;
rommem[2955] = 65'h131FFF66440808000;
rommem[2956] = 65'h047E08008BE100168;
rommem[2957] = 65'h04081000006109000;
rommem[2958] = 65'h067E0800804110409;
rommem[2959] = 65'h00A840001BE02FEEF;
rommem[2960] = 65'h131FFF66440808000;
rommem[2961] = 65'h140808000BE107FA9;
rommem[2962] = 65'h0B0100324B0100425;
rommem[2963] = 65'h00E840001E0400000;
rommem[2964] = 65'h047E100080A840001;
rommem[2965] = 65'h10411040906211000;
rommem[2966] = 65'h047E2801047EF8000;
rommem[2967] = 65'h147EF800037EF8018;
rommem[2968] = 65'h0E040000047E28010;
rommem[2969] = 65'h10FEF001037EF8018;
rommem[2970] = 65'h167E3800867EF8000;
rommem[2971] = 65'h046338000460190D8;
rommem[2972] = 65'h0BE138128BE700108;
rommem[2973] = 65'h0460390F808318008;
rommem[2974] = 65'h1E07FE650BE33FF60;
rommem[2975] = 65'h0BE00112AF04FFFFF;
rommem[2976] = 65'h166308000BE2000C8;
rommem[2977] = 65'h047EF80000A308008;
rommem[2978] = 65'h137EF801047E38008;
rommem[2979] = 65'h147E3800847EF8000;
rommem[2980] = 65'h1E04000000BEF0010;
rommem[2981] = 65'h131FFF6DF37EF8000;
rommem[2982] = 65'h147EF80004A108000;
rommem[2983] = 65'h131FFF6DF37EF8018;
rommem[2984] = 65'h14C1080001410FFFE;
rommem[2985] = 65'h137EF801847EF8000;
rommem[2986] = 65'h11410FFFC31FFF6DF;
rommem[2987] = 65'h047EF80004E108000;
rommem[2988] = 65'h131FFF6DF37EF8018;
rommem[2989] = 65'h1461080001410FFF8;
rommem[2990] = 65'h137EF801847EF8000;
rommem[2991] = 65'h067E4000831FFF6DF;
rommem[2992] = 65'h0342F800046011028;
rommem[2993] = 65'h147EF800047E40008;
rommem[2994] = 65'h131FFF6DF37EF8018;
rommem[2995] = 65'h1BE100100BE100168;
rommem[2996] = 65'h10000005004100809;
rommem[2997] = 65'h131FFF775020088A8;
rommem[2998] = 65'h147EF80000A108001;
rommem[2999] = 65'h19A00E6C137EF8018;
rommem[3000] = 65'h100000050BE000B0A;
rommem[3001] = 65'h047EF8000020088A8;
rommem[3002] = 65'h10FEF002037EF8018;
rommem[3003] = 65'h167E2800867E18000;
rommem[3004] = 65'h067E3801867E30010;
rommem[3005] = 65'h10452940A1603803F;
rommem[3006] = 65'h1061082020463180A;
rommem[3007] = 65'h10663020014118001;
rommem[3008] = 65'h11410FFFE04619809;
rommem[3009] = 65'h104611805BE230047;
rommem[3010] = 65'h102608009BE03FF2F;
rommem[3011] = 65'h147E2800847E18000;
rommem[3012] = 65'h047E3801847E30010;
rommem[3013] = 65'h031FFF6DF37EF8020;
rommem[3014] = 65'h047EF800002108007;
rommem[3015] = 65'h131FFF6DF37EF8018;
rommem[3016] = 65'h047EF800002108008;
rommem[3017] = 65'h0460090D837EF8018;
rommem[3018] = 65'h004110405460110D0;
rommem[3019] = 65'h137EF801847EF8000;
rommem[3020] = 65'h167EF80000FEF0010;
rommem[3021] = 65'h131FFF6ECE0400001;
rommem[3022] = 65'h09A00E6AABE100069;
rommem[3023] = 65'h167E08008BE00054A;
rommem[3024] = 65'h19A025EA4E0C0003D;
rommem[3025] = 65'h031FFF63A31FFF8F1;
rommem[3026] = 65'h16620800047E10008;
rommem[3027] = 65'h147EF800004200409;
rommem[3028] = 65'h0BE0003CA37EF8010;
rommem[3029] = 65'h167EF80000FEF0008;
rommem[3030] = 65'h09A025EC4E0C0003A;
rommem[3031] = 65'h00BEF000831FFF8F1;
rommem[3032] = 65'h1E0C0000DBE0020AA;
rommem[3033] = 65'h031FFF8F19A025EDC;
rommem[3034] = 65'h10BEF000847EF8000;
rommem[3035] = 65'h047EF8000BE001EAA;
rommem[3036] = 65'h00FEF000837EF8008;
rommem[3037] = 65'h031FFF91467EF8000;
rommem[3038] = 65'h1B010040D40808000;
rommem[3039] = 65'h1F04FFFFFE07FE784;
rommem[3040] = 65'h047EF800033FFF7C8;
rommem[3041] = 65'h09A00E76F37EF8008;
rommem[3042] = 65'h09A00E605BE00008A;
rommem[3043] = 65'h19A00E5FDBE00004A;
rommem[3044] = 65'h14600909031FFF940;
rommem[3045] = 65'h0B01D9AFFBE107E88;
rommem[3046] = 65'h16080000040828000;
rommem[3047] = 65'h031FFF8DF46009090;
rommem[3048] = 65'h16082800004101809;
rommem[3049] = 65'h131FFF393E040003F;
rommem[3050] = 65'h10E608001E0800000;
rommem[3051] = 65'h133FFF3BE31FFF851;
rommem[3052] = 65'h167EF80000FEF0010;
rommem[3053] = 65'h031FFF39367E28008;
rommem[3054] = 65'h060009046E0400001;
rommem[3055] = 65'h031FFF393E0400020;
rommem[3056] = 65'h1F2000000E200111B;
rommem[3057] = 65'h1BE107FE831FFF936;
rommem[3058] = 65'h0B0101418B0100B08;
rommem[3059] = 65'h0A81FFB20B010020D;
rommem[3060] = 65'h00884000160808000;
rommem[3061] = 65'h14080FFFF31FFF393;
rommem[3062] = 65'h01280916AB010190D;
rommem[3063] = 65'h1E0400008BE107E80;
rommem[3064] = 65'h0E040002031FFF393;
rommem[3065] = 65'h11280911B31FFF393;
rommem[3066] = 65'h1E0400008BE107DC2;
rommem[3067] = 65'h00C84000131FFF393;
rommem[3068] = 65'h004800409BE007D4A;
rommem[3069] = 65'h0BE5001080E12911B;
rommem[3070] = 65'h031FFF393E0400008;
rommem[3071] = 65'h031FFF393E0400020;
rommem[3072] = 65'h031FFF393E0400008;
rommem[3073] = 65'h19A04111BBE02FF4F;
rommem[3074] = 65'h0E0400000BE007BCA;
rommem[3075] = 65'h1E040000A60009046;
rommem[3076] = 65'h147EF800031FFF393;
rommem[3077] = 65'h037EF801047E28008;
rommem[3078] = 65'h19A00E694AC1003FF;
rommem[3079] = 65'h04604CE60BE00774A;
rommem[3080] = 65'h10EA50001460510D0;
rommem[3081] = 65'h04A918000BE950127;
rommem[3082] = 65'h0062110004A910001;
rommem[3083] = 65'h0BE11012704218809;
rommem[3084] = 65'h10410840ABE1100C8;
rommem[3085] = 65'h00494A40A37EF8000;
rommem[3086] = 65'h137EF80000410840A;
rommem[3087] = 65'h037EF8000E0400001;
rommem[3088] = 65'h14A9100000A948002;
rommem[3089] = 65'h0B22FFE0D0A948001;
rommem[3090] = 65'h040120000BE007D8A;
rommem[3091] = 65'h00810800160220000;
rommem[3092] = 65'h1BE11FF8908210001;
rommem[3093] = 65'h00C10800137EF8000;
rommem[3094] = 65'h0401200000C210001;
rommem[3095] = 65'h1BE11FF8960220000;
rommem[3096] = 65'h147E0800037EF8000;
rommem[3097] = 65'h1BE100148660090A8;
rommem[3098] = 65'h0660090C847E08020;
rommem[3099] = 65'h0660090C047E08018;
rommem[3100] = 65'h1660090B847E08010;
rommem[3101] = 65'h0660090B047E08008;
rommem[3102] = 65'h137EF800837EF8028;
rommem[3103] = 65'h00A108028460090F8;
rommem[3104] = 65'h1460090A8BFE0F0A4;
rommem[3105] = 65'h10FEF0028BE100188;
rommem[3106] = 65'h1460090C867E08000;
rommem[3107] = 65'h1460090C067E08020;
rommem[3108] = 65'h0460090B867E08018;
rommem[3109] = 65'h0460090B067E08010;
rommem[3110] = 65'h137EF800067E08008;
rommem[3111] = 65'h167E080000FEF0008;
rommem[3112] = 65'h00DEF002037EF8000;
rommem[3113] = 65'h167E2800867E28000;
rommem[3114] = 65'h167EF801867E38010;
rommem[3115] = 65'h00223000902128009;
rommem[3116] = 65'h10A5280014A538000;
rommem[3117] = 65'h102708009BE7300C8;
rommem[3118] = 65'h0B27FFB0D31FFF393;
rommem[3119] = 65'h131FFF393E040000A;
rommem[3120] = 65'h10250800902710009;
rommem[3121] = 65'h147E3801047EF8018;
rommem[3122] = 65'h147E2800047E28008;
rommem[3123] = 65'h00FEF000837EF8020;
rommem[3124] = 65'h0E0C0002267EF8000;
rommem[3125] = 65'h0F10FFFFFE13FE1D0;
rommem[3126] = 65'h1E080002231FFF8F1;
rommem[3127] = 65'h031FFF85104800409;
rommem[3128] = 65'h0B2200F0A04102009;
rommem[3129] = 65'h0BE00070A0BEF0008;
rommem[3130] = 65'h1E13FE1E8E0C00027;
rommem[3131] = 65'h031FFF8F1F10FFFFF;
rommem[3132] = 65'h0BE007EAAE0800027;
rommem[3133] = 65'h1E13FE20CE0C0005F;
rommem[3134] = 65'h031FFF8F1F10FFFFF;
rommem[3135] = 65'h031FFF393E040000D;
rommem[3136] = 65'h10BEF000847EF8000;
rommem[3137] = 65'h147EF800035F00004;
rommem[3138] = 65'h00FEF000837EF8008;
rommem[3139] = 65'h0E040000D67EF8000;
rommem[3140] = 65'h1E040000A31FFF393;
rommem[3141] = 65'h147EF800031FFF393;
rommem[3142] = 65'h10FEF002837EF8008;
rommem[3143] = 65'h167E2800867E18000;
rommem[3144] = 65'h067E3801867E30010;
rommem[3145] = 65'h01603910067EF8020;
rommem[3146] = 65'h00222800902130009;
rommem[3147] = 65'h002108006BE100063;
rommem[3148] = 65'h11601800A0E528001;
rommem[3149] = 65'h11C10800A0411881C;
rommem[3150] = 65'h0607100000A210030;
rommem[3151] = 65'h10E5280010A738001;
rommem[3152] = 65'h1BE500082BE107F29;
rommem[3153] = 65'h031FFF393E0400020;
rommem[3154] = 65'h1BE600063BE02FFCF;
rommem[3155] = 65'h131FFF393E040002D;
rommem[3156] = 65'h1407080000E738001;
rommem[3157] = 65'h11270910031FFF393;
rommem[3158] = 65'h147EF8020BE107F87;
rommem[3159] = 65'h047E3001047E38018;
rommem[3160] = 65'h147E1800047E28008;
rommem[3161] = 65'h00FEF002837EF8028;
rommem[3162] = 65'h167E3000867E28000;
rommem[3163] = 65'h167E4001867E38010;
rommem[3164] = 65'h0E1C0110067EF8020;
rommem[3165] = 65'h104101809F1C00000;
rommem[3166] = 65'h004101009E1400014;
rommem[3167] = 65'h102420006BE400083;
rommem[3168] = 65'h1E20000140C528001;
rommem[3169] = 65'h11410800F04400409;
rommem[3170] = 65'h00A108037A010030A;
rommem[3171] = 65'h008108030BE00004A;
rommem[3172] = 65'h00873800160708000;
rommem[3173] = 65'h0BE4000480C528001;
rommem[3174] = 65'h1BE500082BE047ECF;
rommem[3175] = 65'h031FFF393E0400020;
rommem[3176] = 65'h1BE600063BE02FFCF;
rommem[3177] = 65'h131FFF393E040002D;
rommem[3178] = 65'h0407080000C738001;
rommem[3179] = 65'h11270910031FFF393;
rommem[3180] = 65'h047EF8020BE107F83;
rommem[3181] = 65'h147E3801047E40018;
rommem[3182] = 65'h147E2800047E30008;
rommem[3183] = 65'h10FEF001037EF8028;
rommem[3184] = 65'h067EF800867E28000;
rommem[3185] = 65'h14A50FFFE08128002;
rommem[3186] = 65'h0062110004A517FFF;
rommem[3187] = 65'h0E080000004110409;
rommem[3188] = 65'h1E040002031FFF88D;
rommem[3189] = 65'h1E080000031FFF393;
rommem[3190] = 65'h131FFF85104500409;
rommem[3191] = 65'h047E2800047EF8008;
rommem[3192] = 65'h00FEF001037EF8010;
rommem[3193] = 65'h167E0800867EF8000;
rommem[3194] = 65'h04080800031FFF914;
rommem[3195] = 65'h147E08008BE3080A8;
rommem[3196] = 65'h10BEF001047EF8000;
rommem[3197] = 65'h00884000134400000;
rommem[3198] = 65'h147EF800047E08008;
rommem[3199] = 65'h00FEF000837EF8010;
rommem[3200] = 65'h031FFF91467EF8000;
rommem[3201] = 65'h0E0800000E0400000;
rommem[3202] = 65'h0A8300D3040818000;
rommem[3203] = 65'h1E13FFFFFAE300C39;
rommem[3204] = 65'h1BE120066F10FFFFF;
rommem[3205] = 65'h1BE0057AAE07FE629;
rommem[3206] = 65'h1088400011A10800A;
rommem[3207] = 65'h0041184021431800F;
rommem[3208] = 65'h0BE007E6A08210001;
rommem[3209] = 65'h037EF800847EF8000;
rommem[3210] = 65'h167E080000FEF0008;
rommem[3211] = 65'h1B010022040808000;
rommem[3212] = 65'h108840001B2100300;
rommem[3213] = 65'h047E08000BE007F8A;
rommem[3214] = 65'h00FEF000837EF8008;
rommem[3215] = 65'h1E200111B67EF8000;
rommem[3216] = 65'h040808000E0C00000;
rommem[3217] = 65'h0B0100D0D08840001;
rommem[3218] = 65'h0B0100527B0100622;
rommem[3219] = 65'h131FFF932BE307F69;
rommem[3220] = 65'h0BE007F0A6080FFFF;
rommem[3221] = 65'h004100C09BE300069;
rommem[3222] = 65'h0BE30FE89BE007EAA;
rommem[3223] = 65'h0BE007E4AE0C00000;
rommem[3224] = 65'h037EF800847EF8000;
rommem[3225] = 65'h1A610027AA0100361;
rommem[3226] = 65'h037EF80000C108020;
rommem[3227] = 65'h167EF80000FEF0008;
rommem[3228] = 65'h0B01003FF31FFF394;
rommem[3229] = 65'h133FFF3BEB2100303;
rommem[3230] = 65'h047EF80000410840A;
rommem[3231] = 65'h0E07FE60B37EF8008;
rommem[3232] = 65'h067E280000FEF0010;
rommem[3233] = 65'h00212800967EF8008;
rommem[3234] = 65'h14050FFFF08528001;
rommem[3235] = 65'h131FFF393BE100068;
rommem[3236] = 65'h002508009BE007F8A;
rommem[3237] = 65'h047E2800047EF8008;
rommem[3238] = 65'h00FEF001037EF8010;
rommem[3239] = 65'h067EF800867E28000;
rommem[3240] = 65'h10A52800102128009;
rommem[3241] = 65'h1BE1000684050FFFF;
rommem[3242] = 65'h1BE007F8A31FFF395;
rommem[3243] = 65'h147EF800802508009;
rommem[3244] = 65'h137EF801047E28000;
rommem[3245] = 65'h033FFEE0833FFEF47;
rommem[3246] = 65'h0B01003FF31FFED54;
rommem[3247] = 65'h037EF80001410807F;
rommem[3248] = 65'h137EF80000410840A;
rommem[3249] = 65'h031FFEED933FFED0C;
rommem[3250] = 65'h137EF8000BE00740A;
rommem[3251] = 65'h037EF800037EF8000;
rommem[3252] = 65'h1BE004BEABE00738A;
rommem[3253] = 65'h047EF8000460F1088;
rommem[3254] = 65'h0C44E4100BCBD3CBD;
rommem[3255] = 65'h10000000000D24F00;
rommem[3256] = 65'h0726F747061520A0D;
rommem[3257] = 65'h020796E6954203436;
rommem[3258] = 65'h13176204349534142;
rommem[3259] = 65'h0202943280A0D302E;
rommem[3260] = 65'h06F52202032313032;
rommem[3261] = 65'h06E69462074726562;
rommem[3262] = 65'h10A0D000A0A0D6863;
rommem[3263] = 65'h1616857000A0D4B4F;
rommem[3264] = 65'h1726F53000A0D3F74;
rommem[3265] = 65'h16F43000A0D2E7972;
rommem[3266] = 65'h04C4620746361706D;
rommem[3267] = 65'h16461657220485341;
rommem[3268] = 65'h00A0D726F72726520;
rommem[3269] = 65'h0207265626D754E00;
rommem[3270] = 65'h062206F6F74207369;
rommem[3271] = 65'h1766944000A0D6769;
rommem[3272] = 65'h17962206E6F697369;
rommem[3273] = 65'h1000A0D6F72657A20;
rommem[3274] = 65'h17620666F2074754F;
rommem[3275] = 65'h020656C6261697261;
rommem[3276] = 65'h0000A0D6563617073;
rommem[3277] = 65'h16620736574796220;
rommem[3278] = 65'h00A0D000A0D656572;
rommem[3279] = 65'h1000A0D7964616552;
rommem[3280] = 65'h16E69746365707845;
rommem[3281] = 65'h06D6D6F6320612067;
rommem[3282] = 65'h0656E694C000A0D61;
rommem[3283] = 65'h0207265626D756E20;
rommem[3284] = 65'h00D676962206F6F74;
rommem[3285] = 65'h0746365707845000A;
rommem[3286] = 65'h16176206120676E69;
rommem[3287] = 65'h10A0D656C62616972;
rommem[3288] = 65'h164616220444E5200;
rommem[3289] = 65'h174656D6172617020;
rommem[3290] = 65'h1535953000A0D7265;
rommem[3291] = 65'h06464612064616220;
rommem[3292] = 65'h049000A0D73736572;
rommem[3293] = 65'h1707865205455504E;
rommem[3294] = 65'h06120676E69746365;
rommem[3295] = 65'h16C62616972617620;
rommem[3296] = 65'h05458454E000A0D65;
rommem[3297] = 65'h174756F6874697720;
rommem[3298] = 65'h14E000A0D524F4620;
rommem[3299] = 65'h16570786520545845;
rommem[3300] = 65'h1206120676E697463;
rommem[3301] = 65'h02064656E69666564;
rommem[3302] = 65'h0656C626169726176;
rommem[3303] = 65'h12F4F544F47000A0D;
rommem[3304] = 65'h06162204255534F47;
rommem[3305] = 65'h16E20656E696C2064;
rommem[3306] = 65'h0000A0D7265626D75;
rommem[3307] = 65'h177204E5255544552;
rommem[3308] = 65'h1472074756F687469;
rommem[3309] = 65'h050000A0D4255534F;
rommem[3310] = 65'h069206D6172676F72;
rommem[3311] = 65'h06962206F6F742073;
rommem[3312] = 65'h172747845000A0D67;
rommem[3313] = 65'h16361726168632061;
rommem[3314] = 65'h0206E6F2073726574;
rommem[3315] = 65'h06E676920656E696C;
rommem[3316] = 65'h000000A0D6465726F;
rommem[3317] = 65'h00000000033FFF096;
rommem[3318] = 65'h1E6AA555504002009;
rommem[3319] = 65'h1F68AAAA5EE9556AA;
rommem[3320] = 65'h166808000040D0409;
rommem[3321] = 65'h004110C0646810000;
rommem[3322] = 65'h10A840008BE3000C9;
rommem[3323] = 65'h0EE800010E6800000;
rommem[3324] = 65'h0BE307F00048D0C06;
rommem[3325] = 65'h00400200904802809;
rommem[3326] = 65'h0E6AA555546810000;
rommem[3327] = 65'h1F68AAAA5EE9556AA;
rommem[3328] = 65'h1BE3000C9042D0C06;
rommem[3329] = 65'h0E680000008840008;
rommem[3330] = 65'h1048D0C06EE800004;
rommem[3331] = 65'h0BE850389BE307EC0;
rommem[3332] = 65'h1E695AAAA04002009;
rommem[3333] = 65'h1F685555AEEAAA955;
rommem[3334] = 65'h166808000040D0409;
rommem[3335] = 65'h004110C0646810000;
rommem[3336] = 65'h008840008BE3000C9;
rommem[3337] = 65'h0EE800004E6800000;
rommem[3338] = 65'h0BE307F00048D0C06;
rommem[3339] = 65'h10400200904802C09;
rommem[3340] = 65'h0E695AAAA46810000;
rommem[3341] = 65'h1F685555AEEAAA955;
rommem[3342] = 65'h1BE3000C9042D0C06;
rommem[3343] = 65'h0E680000008840008;
rommem[3344] = 65'h1048D0C06EE800004;
rommem[3345] = 65'h0BE858048BE307EC0;
rommem[3346] = 65'h1BE8500480485A014;
rommem[3347] = 65'h16604040004852014;
rommem[3348] = 65'h09A00E92B37EF8000;
rommem[3349] = 65'h0020085E831FFEFE7;
rommem[3350] = 65'h00000002831FFF019;
rommem[3351] = 65'h09A00E91033FFEC07;
rommem[3352] = 65'h00200862831FFEFE7;
rommem[3353] = 65'h19A00E92431FFF019;
rommem[3354] = 65'h0020085E831FFEFE7;
rommem[3355] = 65'h131FFF93F31FFF019;
rommem[3356] = 65'h102200FA91601001F;
rommem[3357] = 65'h0DE000000DE000000;
rommem[3358] = 65'h002008FE8DE000000;
rommem[3359] = 65'h131FFF93F31FFF019;
rommem[3360] = 65'h100000028BE017F2F;
rommem[3361] = 65'h00000000033FFEC07;
rommem[3362] = 65'h07375622061746144;
rommem[3363] = 65'h16120726F72726520;
rommem[3364] = 65'h04350452000203A74;
rommem[3365] = 65'h1662072724500203A;
rommem[3366] = 65'h020676E6968637465;
rommem[3367] = 65'h17463757274736E69;
rommem[3368] = 65'h0203A7461206E6F69;
rommem[3369] = 65'h00000000000000000;
rommem[3370] = 65'h167E080000FEF0020;
rommem[3371] = 65'h067ED001067E10008;
rommem[3372] = 65'h0E69C0FF067EF8018;
rommem[3373] = 65'h16A0D0421EE800003;
rommem[3374] = 65'h1E6BF0000B2101602;
rommem[3375] = 65'h1460094006A0D0028;
rommem[3376] = 65'h0660094000A108001;
rommem[3377] = 65'h0EE800003E6900000;
rommem[3378] = 65'h08220814C6A0D082D;
rommem[3379] = 65'h09220814C0A108001;
rommem[3380] = 65'h147ED001047EF8018;
rommem[3381] = 65'h147E0800047E10008;
rommem[3382] = 65'h10000000F0BEF0020;
rommem[3383] = 65'h0DE000000DE000000;
rommem[3384] = 65'h001900020DE000000;
rommem[3385] = 65'h04600B000B2100403;
rommem[3386] = 65'h1BE0001AA31FFEE3B;
rommem[3387] = 65'h04600B010B2100408;
rommem[3388] = 65'h1BE00012A341F8000;
rommem[3389] = 65'h14600B018B210040D;
rommem[3390] = 65'h0BE0000AA31FFF2B1;
rommem[3391] = 65'h0B210030FB0118901;
rommem[3392] = 65'h131FFEDF14600B008;
rommem[3393] = 65'h147ED001047EF8018;
rommem[3394] = 65'h147E0800047E10008;
rommem[3395] = 65'h1019000200BEF0020;
rommem[3396] = 65'h0E6BF000001900020;
rommem[3397] = 65'h0E6BF00086A0D0413;
rommem[3398] = 65'h0020080346A0D0813;
rommem[3399] = 65'h002008128BE107FE9;
rommem[3400] = 65'h1022002E902010228;
rommem[3401] = 65'h00411040306211A01;
rommem[3402] = 65'h11421000046110000;
rommem[3403] = 65'h146110008022002A9;
rommem[3404] = 65'h0022002E914210000;
rommem[3405] = 65'h10200003502000034;
rommem[3406] = 65'h06A0D0403E6BF0000;
rommem[3407] = 65'h16A0D0803E6BF0008;
rommem[3408] = 65'h00000000001900020;
rommem[3409] = 65'h16A0D0803E6BF0008;
rommem[3410] = 65'h00000000000000000;
rommem[3411] = 65'h00000000000000000;
rommem[4086] = 65'h1DE00000033FFFA89;
rommem[4088] = 65'h1DE00000033FFFA89;
rommem[4092] = 65'h0DE00000033FFFA88;
rommem[4094] = 65'h0DE00000033FFEC07;
rommem[4095] = 65'h000000000DE000000;
rommem[1699] = 65'h06000181260001809;
rommem[1700] = 65'h16000180A60001813;
rommem[1701] = 65'h060009814E0400001;
rommem[1702] = 65'h1E69C0A0137EF8000;
rommem[1703] = 65'h06A0D0420EE800003;
rommem[1704] = 65'h1BE107F8814108001;
rommem[1705] = 65'h0EE800003E69C0A00;
rommem[1706] = 65'h037EF80006A0D0420;
rommem[1707] = 65'h1EE800003E69C0A01;
rommem[1708] = 65'h0141080016A0D0420;
rommem[1709] = 65'h037EF800004100439;
rommem[1710] = 65'h167E100000FEF0020;
rommem[1711] = 65'h167E2001067E18008;
rommem[1712] = 65'h1E69C0A0667E28018;
rommem[1713] = 65'h06A0D0820EE800003;
rommem[1714] = 65'h0E69C0A0616210003;
rommem[1715] = 65'h16A0D0828EE800003;
rommem[1716] = 65'h1BE20016840011812;
rommem[1717] = 65'h0E0C0006446021400;
rommem[1718] = 65'h11421000A80011808;
rommem[1719] = 65'h046029400BE2000C9;
rommem[1720] = 65'h002520009BE42FF88;
rommem[1721] = 65'h1BE00046ABE01FF4F;
rommem[1722] = 65'h0BE20016840011813;
rommem[1723] = 65'h0E0C0006446021400;
rommem[1724] = 65'h11421001480011808;
rommem[1725] = 65'h046029400BE2000C9;
rommem[1726] = 65'h002520009BE42FF88;
rommem[1727] = 65'h0BE0002EABE01FF4F;
rommem[1728] = 65'h0BE2000C840011814;
rommem[1729] = 65'h0BE20008840011815;
rommem[1730] = 65'h01442008080021808;
rommem[1731] = 65'h146021400BE407F89;
rommem[1732] = 65'h0E69C0A01E0C00064;
rommem[1733] = 65'h06A0D0820EE800003;
rommem[1734] = 65'h0BE2000C914210020;
rommem[1735] = 65'h1BE42FF4846029400;
rommem[1736] = 65'h1BE01FF0F02520009;
rommem[1737] = 65'h0E69C0A00BE00008A;
rommem[1738] = 65'h16A0D0428EE800003;
rommem[1739] = 65'h047E1800847E10000;
rommem[1740] = 65'h047E2801847E20010;
rommem[1741] = 65'h14202180037EF8020;
rommem[1742] = 65'h00441100542011802;
rommem[1743] = 65'h0E1000200BE4000A3;
rommem[1744] = 65'h14201180004411003;
rommem[1745] = 65'h137EF800004411005;
rommem[1746] = 65'h167E100000FEF0020;
rommem[1747] = 65'h167E2001067E18008;
rommem[1748] = 65'h14201980067EF8018;
rommem[1749] = 65'h1BE21852842011802;
rommem[1750] = 65'h16A2184009A019600;
rommem[1751] = 65'h0142101FF0A210001;
rommem[1752] = 65'h14001180C62011802;
rommem[1753] = 65'h14201980EBE2003A8;
rommem[1754] = 65'h0BE41834331FFED9B;
rommem[1755] = 65'h0400218096000180C;
rommem[1756] = 65'h0E69C0A06BE400108;
rommem[1757] = 65'h06A0D1020EE800003;
rommem[1758] = 65'h1E69C0A0616420002;
rommem[1759] = 65'h16A0D1028EE800003;
rommem[1760] = 65'h1BE4001084002180A;
rommem[1761] = 65'h0EE800003E69C0A06;
rommem[1762] = 65'h1164200016A0D1020;
rommem[1763] = 65'h0EE800003E69C0A06;
rommem[1764] = 65'h14002180B6A0D1028;
rommem[1765] = 65'h0E1000011BE4000A8;
rommem[1766] = 65'h0EE800003E69C0A00;
rommem[1767] = 65'h047E100006A0D1028;
rommem[1768] = 65'h147E2001047E18008;
rommem[1769] = 65'h037EF802047EF8018;
rommem[1770] = 65'h047E10000E07FFFFF;
rommem[1771] = 65'h147E2001047E18008;
rommem[1772] = 65'h037EF802047EF8018;
rommem[1773] = 65'h067E080000FEF0028;
rommem[1774] = 65'h167E1801067E10008;
rommem[1775] = 65'h167EF802067E20018;
rommem[1776] = 65'h0EE800003E69C0A03;
rommem[1777] = 65'h1BE1000A16A0D0420;
rommem[1778] = 65'h1B0100D041410807F;
rommem[1779] = 65'h1B0100710B0100B0C;
rommem[1780] = 65'h147E1000847E08000;
rommem[1781] = 65'h047E2001847E18010;
rommem[1782] = 65'h037EF802847EF8020;
rommem[1783] = 65'h16000980880009808;
rommem[1784] = 65'h0BE007EEABE007F0A;
rommem[1785] = 65'h0EE800003E69C0A00;
rommem[1786] = 65'h1400118146A0D0420;
rommem[1787] = 65'h0B2100413BE200108;
rommem[1788] = 65'h160009815E0400001;
rommem[1789] = 65'h0B2100311BE00016A;
rommem[1790] = 65'h0BE00010A60001815;
rommem[1791] = 65'h04201180060001815;
rommem[1792] = 65'h06A3104109A019600;
rommem[1793] = 65'h0142101FF0A210001;
rommem[1794] = 65'h0E69C0A0162011800;
rommem[1795] = 65'h06A0D0420EE800003;
rommem[1796] = 65'h1BE107D2914108001;
rommem[1797] = 65'h1BE1003C94000980C;
rommem[1798] = 65'h04200981031FFED9B;
rommem[1799] = 65'h1E0400001BE408360;
rommem[1800] = 65'h1400098096000980C;
rommem[1801] = 65'h0E69C0A06BE100108;
rommem[1802] = 65'h06A0D0420EE800003;
rommem[1803] = 65'h0E69C0A06141080FD;
rommem[1804] = 65'h16A0D0428EE800003;
rommem[1805] = 65'h1BE1001084000980A;
rommem[1806] = 65'h0EE800003E69C0A06;
rommem[1807] = 65'h0141080FE6A0D0420;
rommem[1808] = 65'h0EE800003E69C0A06;
rommem[1809] = 65'h14000980B6A0D0428;
rommem[1810] = 65'h1E0400013BE1000A8;
rommem[1811] = 65'h0EE800003E69C0A00;
rommem[1812] = 65'h1BE0077EA6A0D0428;
rommem[1813] = 65'h107AD0606020D0568;
rommem[1814] = 65'h007AD100667AF2200;
rommem[1815] = 65'h1E680800003AF0009;
rommem[1816] = 65'h005ED7803EE800400;
rommem[1817] = 65'h167EF80000FEF0008;
rommem[1818] = 65'h1BFF07FE9020F80B4;
rommem[1819] = 65'h1B0101003B0100D02;
rommem[1820] = 65'h1B0101309B0101206;
rommem[1821] = 65'h1B0101A0CB010170A;
rommem[1822] = 65'h1B0103B14B010270C;
rommem[1823] = 65'h0B0104016B0103D15;
rommem[1824] = 65'h1B010441AB0104217;
rommem[1825] = 65'h060011417BE0008CA;
rommem[1826] = 65'h131FFF06F60019418;
rommem[1827] = 65'h04A009417BE00084A;
rommem[1828] = 65'h0BE0007EA4A011418;
rommem[1829] = 65'h0BE0007AA31FFF02E;
rommem[1830] = 65'h10220800962019410;
rommem[1831] = 65'h1BE027FEF31FFF07F;
rommem[1832] = 65'h002208009BE00070A;
rommem[1833] = 65'h0BE01FFEF31FFF07F;
rommem[1834] = 65'h0E69AE008BE00068A;
rommem[1835] = 65'h16A0D0812EE800003;
rommem[1836] = 65'h1EE800003E69AE00C;
rommem[1837] = 65'h1E69AE0006A0D0C12;
rommem[1838] = 65'h16A0D1012EE800003;
rommem[1839] = 65'h1E69AE03C16008001;
rommem[1840] = 65'h16A0D0412EE800003;
rommem[1841] = 65'h0E69AE008BE0004CA;
rommem[1842] = 65'h16A0D0812EE800003;
rommem[1843] = 65'h1EE800003E69AE00C;
rommem[1844] = 65'h0160080086A0D0C12;
rommem[1845] = 65'h1EE800003E69AE03C;
rommem[1846] = 65'h0DE0000006A0D0412;
rommem[1847] = 65'h0DE000000DE000000;
rommem[1848] = 65'h0EE800003E69AE038;
rommem[1849] = 65'h1BE107FA96A0D0407;
rommem[1850] = 65'h0EE800003E69AE034;
rommem[1851] = 65'h1BE00022A6A0D0407;
rommem[1852] = 65'h131FFF12202208009;
rommem[1853] = 65'h002208009BE0001CA;
rommem[1854] = 65'h031FFF13F02310009;
rommem[1855] = 65'h102208009BE00014A;
rommem[1856] = 65'h1BE0000EA31FFF130;
rommem[1857] = 65'h131FFF16902208009;
rommem[1858] = 65'h002208009BE00008A;
rommem[1859] = 65'h1BE00002A31FFF14B;
rommem[1860] = 65'h047EF8000020000B5;
rommem[1861] = 65'h107AD0606020D0568;
rommem[1862] = 65'h00180002147AF2200;
rommem[1863] = 65'h107AD0606020D0568;
rommem[1864] = 65'h007AD100667AF2200;
rommem[1865] = 65'h1E680800003AF0009;
rommem[1866] = 65'h005ED7803EE800400;
rommem[1867] = 65'h167EF80000FEF0008;
rommem[1868] = 65'h0BFF07FE9020F80F4;
rommem[1869] = 65'h0B0100501B0100400;
rommem[1870] = 65'h1BE0000EAB0100802;
rommem[1871] = 65'h1BE0000AA31FFF54E;
rommem[1872] = 65'h10231000902208009;
rommem[1873] = 65'h1BE00002A31FFF56D;
rommem[1874] = 65'h147EF8000020000F5;
rommem[1875] = 65'h107AD0606020D0568;
rommem[1876] = 65'h00180002147AF2200;
rommem[1877] = 65'h107AD0606020D0568;
rommem[1878] = 65'h007AD100667AF2200;
rommem[1879] = 65'h1E680800003AF0009;
rommem[1880] = 65'h005ED7803EE800400;
rommem[1881] = 65'h167EF80000FEF0008;
rommem[1882] = 65'h0B0100301B0100200;
rommem[1883] = 65'h1BE00012A020085A8;
rommem[1884] = 65'h1EE800003E69C0418;
rommem[1885] = 65'h1DE0000006A0D002B;
rommem[1886] = 65'h1EE800003E69C0400;
rommem[1887] = 65'h0BE00002A6A0D0423;
rommem[1888] = 65'h1020D056847EF8000;
rommem[1889] = 65'h047AF220007AD0606;
rommem[1890] = 65'h1020D056801800021;
rommem[1891] = 65'h167AF220007AD0606;
rommem[1892] = 65'h103AF000907AD1006;
rommem[1893] = 65'h1EE800400E6808000;
rommem[1894] = 65'h00FEF000805ED7803;
rommem[1895] = 65'h1020F807467EF8000;
rommem[1896] = 65'h0B0100700BFF07FE9;
rommem[1897] = 65'h1B0100A02B0100801;
rommem[1898] = 65'h0B0100C04B0100B03;
rommem[1899] = 65'h0BE0001CAB0100D05;
rommem[1900] = 65'h1BE00018A31FFEEEB;
rommem[1901] = 65'h131FFEF0502208009;
rommem[1902] = 65'h131FFEF07BE00012A;
rommem[1903] = 65'h031FFEF1CBE0000EA;
rommem[1904] = 65'h131FFEF20BE0000AA;
rommem[1905] = 65'h131FFEF25BE00006A;
rommem[1906] = 65'h102000075BE00002A;
rommem[1907] = 65'h1020D056847EF8000;
rommem[1908] = 65'h047AF220007AD0606;
rommem[1909] = 65'h06000145001800021;
rommem[1910] = 65'h0E040000160001451;
rommem[1911] = 65'h137EF80006000941C;
rommem[1912] = 65'h167E100000FEF0008;
rommem[1913] = 65'h01410800F4A009450;
rommem[1914] = 65'h0EE800003E69C0000;
rommem[1915] = 65'h0E69C00026A0D0821;
rommem[1916] = 65'h16A0D0029EE800003;
rommem[1917] = 65'h00A10800160111440;
rommem[1918] = 65'h1600094501410800F;
rommem[1919] = 65'h0BE1100894A011451;
rommem[1920] = 65'h11421000F0A210001;
rommem[1921] = 65'h047E1000060011451;
rommem[1922] = 65'h06000941C37EF8008;
rommem[1923] = 65'h10FEF001037EF8000;
rommem[1924] = 65'h167EF800867E10000;
rommem[1925] = 65'h14A0094504A011451;
rommem[1926] = 65'h14A209440BE110188;
rommem[1927] = 65'h11421000F0A210001;
rommem[1928] = 65'h14001141C60011451;
rommem[1929] = 65'h1B210030DBE2000E8;
rommem[1930] = 65'h0BE00008A31FFFD80;
rommem[1931] = 65'h1BE00004A31FFF07F;
rommem[1932] = 65'h147EF8008E07FFFFF;
rommem[1933] = 65'h037EF801047E10000;
rommem[1934] = 65'h14A0114504A009451;
rommem[1935] = 65'h137EF800004110439;
rommem[1936] = 65'h0EE800003E69C0000;
rommem[1937] = 65'h1041004306A0D0421;
rommem[1938] = 65'h10FEF001037EF8000;
rommem[1939] = 65'h167EF800867E10000;
rommem[1940] = 65'h0E69C0000E09C0000;
rommem[1941] = 65'h16A0D0421EE800003;
rommem[1942] = 65'h1E69C0002BE107FA1;
rommem[1943] = 65'h16A0D0029EE800003;
rommem[1944] = 65'h14001141C141080FF;
rommem[1945] = 65'h0B210030DBE2000A8;
rommem[1946] = 65'h0BE00004A31FFFD80;
rommem[1947] = 65'h047E1000031FFF07F;
rommem[1948] = 65'h137EF801047EF8008;
rommem[1949] = 65'h1EE800002E6989680;
rommem[1950] = 65'h1BE2000C8040D0809;
rommem[1951] = 65'h0E69C03020E210001;
rommem[1952] = 65'h16A0D0421EE800003;
rommem[1953] = 65'h116008051BE107F60;
rommem[1954] = 65'h0EE800003E69C0300;
rommem[1955] = 65'h0160089C46A0D0429;
rommem[1956] = 65'h0E6989680BE00800F;
rommem[1957] = 65'h1040D0809EE800002;
rommem[1958] = 65'h00E210001BE2000C8;
rommem[1959] = 65'h1EE800003E69C0302;
rommem[1960] = 65'h0BE107F606A0D0421;
rommem[1961] = 65'h00FEF001837EF8000;
rommem[1962] = 65'h167E0800867EF8000;
rommem[1963] = 65'h0E6BD784067E10010;
rommem[1964] = 65'h0040D0409EE800005;
rommem[1965] = 65'h1160080ACBE00800F;
rommem[1966] = 65'h0EE800003E69C0300;
rommem[1967] = 65'h0160089C46A0D0429;
rommem[1968] = 65'h0E6989680BE00800F;
rommem[1969] = 65'h1040D0809EE800002;
rommem[1970] = 65'h1EE800003E69C0302;
rommem[1971] = 65'h0BE2000686A0D0421;
rommem[1972] = 65'h0BE107F600E210001;
rommem[1973] = 65'h1EE800003E69C0302;
rommem[1974] = 65'h0160100056A0D0421;
rommem[1975] = 65'h047EF800031FFF13F;
rommem[1976] = 65'h047E1001047E08008;
rommem[1977] = 65'h10FEF000837EF8018;
rommem[1978] = 65'h0E690000067EF8000;
rommem[1979] = 65'h16A0D082DEE800003;
rommem[1980] = 65'h00A1080018220814E;
rommem[1981] = 65'h031FFEF829220814E;
rommem[1982] = 65'h1E69CFFFC31FFEF84;
rommem[1983] = 65'h06A0D0028EE800003;
rommem[1984] = 65'h037EF800847EF8000;
rommem[1985] = 65'h037EF8000620020A8;
rommem[1986] = 65'h1660120B86600A0B0;
rommem[1987] = 65'h14C0120A64C00A0A8;
rommem[1988] = 65'h14600A0B0BE110089;
rommem[1989] = 65'h037EF8000460120B8;
rommem[1990] = 65'h11A210200142101FF;
rommem[1991] = 65'h0EE800400E6800000;
rommem[1992] = 65'h04600A0B0042D0803;
rommem[1993] = 65'h14600A0B866208000;
rommem[1994] = 65'h16621801066208008;
rommem[1995] = 65'h06622802066220018;
rommem[1996] = 65'h16623803066230028;
rommem[1997] = 65'h16624804066240038;
rommem[1998] = 65'h16625805066250048;
rommem[1999] = 65'h06626806066260058;
rommem[2000] = 65'h16627807066270068;
rommem[2001] = 65'h06628808066280078;
rommem[2002] = 65'h16629809066290088;
rommem[2003] = 65'h0662A80A0662A0098;
rommem[2004] = 65'h1662B80B0662B00A8;
rommem[2005] = 65'h1662C80C0662C00B8;
rommem[2006] = 65'h1662D80D0662D00C8;
rommem[2007] = 65'h0662E80E0662E00D8;
rommem[2008] = 65'h1662F80F0662F00E8;
rommem[2009] = 65'h1620120A64C0120A8;
rommem[2010] = 65'h0E68000001A210200;
rommem[2011] = 65'h0042D0803EE800400;
rommem[2012] = 65'h04621801046208000;
rommem[2013] = 65'h04622802046220018;
rommem[2014] = 65'h14623803046230028;
rommem[2015] = 65'h14624804046240038;
rommem[2016] = 65'h14625805046250048;
rommem[2017] = 65'h04626806046260058;
rommem[2018] = 65'h14627807046270068;
rommem[2019] = 65'h04628808046280078;
rommem[2020] = 65'h14629809046290088;
rommem[2021] = 65'h0462A80A0462A0098;
rommem[2022] = 65'h1462B80B0462B00A8;
rommem[2023] = 65'h1462C80C0462C00B8;
rommem[2024] = 65'h1462D80D0462D00C8;
rommem[2025] = 65'h0462E80E0462E00D8;
rommem[2026] = 65'h1462F80F0462F00E8;
rommem[2027] = 65'h137EF800046210008;
rommem[2028] = 65'h167E080000FEF0020;
rommem[2029] = 65'h167E1801067E10008;
rommem[2030] = 65'h031FFF06F67EF8018;
rommem[2031] = 65'h1041D0403E6810000;
rommem[2032] = 65'h0BE2001C84001141A;
rommem[2033] = 65'h10A21000182110000;
rommem[2034] = 65'h04601140892110000;
rommem[2035] = 65'h042019414BE110088;
rommem[2036] = 65'h06600940892218000;
rommem[2037] = 65'h147E1000847E08000;
rommem[2038] = 65'h047EF801847E18010;
rommem[2039] = 65'h04201941437EF8020;
rommem[2040] = 65'h1BE007E8A92118000;
rommem[2041] = 65'h0E69A0010160080A0;
rommem[2042] = 65'h06A0D0429EE800003;
rommem[2043] = 65'h0160080E037EF8000;
rommem[2044] = 65'h1EE800003E69A0010;
rommem[2045] = 65'h037EF80006A0D0429;
rommem[2046] = 65'h067E080000FEF0018;
rommem[2047] = 65'h167E1801067E10008;
rommem[2048] = 65'h1040D0809E68FFC00;
rommem[2049] = 65'h0E6A9292906210601;
rommem[2050] = 65'h1F6829292EEA4A4A4;
rommem[2051] = 65'h1E6A000006A0D042D;
rommem[2052] = 65'h16A0D0C2DEE800400;
rommem[2053] = 65'h00A31800866308000;
rommem[2054] = 65'h047E08000BE017FCF;
rommem[2055] = 65'h147E1801047E10008;
rommem[2056] = 65'h00FEF002837EF8018;
rommem[2057] = 65'h167E1000867E08000;
rommem[2058] = 65'h067E2001867E18010;
rommem[2059] = 65'h1E69A000067EF8020;
rommem[2060] = 65'h06A0D0C2DEE800003;
rommem[2061] = 65'h18231000282308000;
rommem[2062] = 65'h1E040002004110818;
rommem[2063] = 65'h031FFF06342021414;
rommem[2064] = 65'h0EE800003E6900000;
rommem[2065] = 65'h1923080006A0D0C2D;
rommem[2066] = 65'h06A3D1029E6810000;
rommem[2067] = 65'h0BE017F8F0A318002;
rommem[2068] = 65'h147E2001847EF8020;
rommem[2069] = 65'h147E1000847E18010;
rommem[2070] = 65'h137EF802847E08000;
rommem[2071] = 65'h067E080000FEF0028;
rommem[2072] = 65'h167E1801067E10008;
rommem[2073] = 65'h167EF802067E20018;
rommem[2074] = 65'h0EE800003E69A0000;
rommem[2075] = 65'h0823080006A0D0C2D;
rommem[2076] = 65'h00411081882310002;
rommem[2077] = 65'h1E690000004208805;
rommem[2078] = 65'h06A0D0C2DEE800003;
rommem[2079] = 65'h1923200006A309121;
rommem[2080] = 65'h1BE017FAF0A318002;
rommem[2081] = 65'h0EE800003E69A0000;
rommem[2082] = 65'h1823080026A0D0C2D;
rommem[2083] = 65'h131FFF04E0E108001;
rommem[2084] = 65'h147E1000847E08000;
rommem[2085] = 65'h047E2001847E18010;
rommem[2086] = 65'h037EF802847EF8020;
rommem[2087] = 65'h067E080000FEF0018;
rommem[2088] = 65'h167E1801067E10008;
rommem[2089] = 65'h0EE800003E69A0000;
rommem[2090] = 65'h0823100006A0D0C2D;
rommem[2091] = 65'h00631820004208C18;
rommem[2092] = 65'h0EE800003E6900000;
rommem[2093] = 65'h1E0400020043D0C03;
rommem[2094] = 65'h10A31800292308000;
rommem[2095] = 65'h047E08000BE017FCF;
rommem[2096] = 65'h147E1801047E10008;
rommem[2097] = 65'h1141080FF37EF8018;
rommem[2098] = 65'h0AC10045AA8100541;
rommem[2099] = 65'h1A8100261AE10037A;
rommem[2100] = 65'h1161081000E108060;
rommem[2101] = 65'h1141080FF37EF8000;
rommem[2102] = 65'h00A10803CAE10021A;
rommem[2103] = 65'h14A00941737EF8000;
rommem[2104] = 65'h0E69A00001410807F;
rommem[2105] = 65'h06A0D0C2DEE800003;
rommem[2106] = 65'h10420881882310000;
rommem[2107] = 65'h11410807F4A009418;
rommem[2108] = 65'h19231001604208803;
rommem[2109] = 65'h0E690000006210206;
rommem[2110] = 65'h1042D0403EE800003;
rommem[2111] = 65'h0B210080D37EF8000;
rommem[2112] = 65'h167E080000FEF0020;
rommem[2113] = 65'h167E1801067E10008;
rommem[2114] = 65'h16000141867EF8018;
rommem[2115] = 65'h1E6800091BE00018A;
rommem[2116] = 65'h10FEF0020BE1D0209;
rommem[2117] = 65'h167E1000867E08000;
rommem[2118] = 65'h067EF801867E18010;
rommem[2119] = 65'h1B02003384A011418;
rommem[2120] = 65'h0600114180A210001;
rommem[2121] = 65'h147EF801831FFF06F;
rommem[2122] = 65'h147E1000847E18010;
rommem[2123] = 65'h037EF802047E08000;
rommem[2124] = 65'h1BE1D0169E6800090;
rommem[2125] = 65'h167E080000FEF0020;
rommem[2126] = 65'h167E1801067E10008;
rommem[2127] = 65'h14A01141767EF8018;
rommem[2128] = 65'h10E210001B02FF200;
rommem[2129] = 65'h0BE007DEA60011417;
rommem[2130] = 65'h1BE1D0169E6800093;
rommem[2131] = 65'h167E080000FEF0020;
rommem[2132] = 65'h167E1801067E10008;
rommem[2133] = 65'h14A01141867EF8018;
rommem[2134] = 65'h10E210001B02FE600;
rommem[2135] = 65'h0BE007C6A60011418;
rommem[2136] = 65'h0BE1D0169E6800092;
rommem[2137] = 65'h167E080000FEF0020;
rommem[2138] = 65'h167E1801067E10008;
rommem[2139] = 65'h14A01141767EF8018;
rommem[2140] = 65'h00A210001B02FDA1E;
rommem[2141] = 65'h1BE007AEA60011417;
rommem[2142] = 65'h1BE1D0189E6800094;
rommem[2143] = 65'h167E080000FEF0020;
rommem[2144] = 65'h167E1801067E10008;
rommem[2145] = 65'h14A01141867EF8018;
rommem[2146] = 65'h060001418BE200068;
rommem[2147] = 65'h060001417BE00798A;
rommem[2148] = 65'h10FEF0030BE00794A;
rommem[2149] = 65'h167E1000867E08000;
rommem[2150] = 65'h067E2001867E18010;
rommem[2151] = 65'h067EF802867E28020;
rommem[2152] = 65'h0BE1D00A9E6800099;
rommem[2153] = 65'h10211800931FFF06F;
rommem[2154] = 65'h0BE00012A4A009418;
rommem[2155] = 65'h14A011418B2101508;
rommem[2156] = 65'h10E210001BE200408;
rommem[2157] = 65'h031FFF06F60011418;
rommem[2158] = 65'h04A00941802118009;
rommem[2159] = 65'h09231000082310002;
rommem[2160] = 65'h00A1080010A318002;
rommem[2161] = 65'h0EE800003E69A0000;
rommem[2162] = 65'h1824280006A0D102D;
rommem[2163] = 65'h0E0400020BE12FF04;
rommem[2164] = 65'h19230FFFE31FFF063;
rommem[2165] = 65'h1B0100C0ABE0001CA;
rommem[2166] = 65'h031FFF06F02120009;
rommem[2167] = 65'h10240800902118009;
rommem[2168] = 65'h19230800031FFF063;
rommem[2169] = 65'h1E681000042009410;
rommem[2170] = 65'h031FFF0FF6A3D0429;
rommem[2171] = 65'h031FFF10DBE00004A;
rommem[2172] = 65'h047E2802047EF8028;
rommem[2173] = 65'h047E1801047E20018;
rommem[2174] = 65'h147E0800047E10008;
rommem[2175] = 65'h10FEF002037EF8030;
rommem[2176] = 65'h167E1000867E08000;
rommem[2177] = 65'h067EF801867E18010;
rommem[2178] = 65'h10A1080014A009418;
rommem[2179] = 65'h0E69A000060009418;
rommem[2180] = 65'h16A0D0821EE800003;
rommem[2181] = 65'h060001418BE110246;
rommem[2182] = 65'h00FEF0020BE0000CA;
rommem[2183] = 65'h167E1000867E08000;
rommem[2184] = 65'h067EF801867E18010;
rommem[2185] = 65'h10A1080014A009417;
rommem[2186] = 65'h1E69A000260009417;
rommem[2187] = 65'h16A0D0821EE800003;
rommem[2188] = 65'h10E210001BE110086;
rommem[2189] = 65'h031FFF02E60011417;
rommem[2190] = 65'h147EF801831FFF06F;
rommem[2191] = 65'h147E1000847E18010;
rommem[2192] = 65'h037EF802047E08000;
rommem[2193] = 65'h067E080000FEF0018;
rommem[2194] = 65'h067EF801067E10008;
rommem[2195] = 65'h04A20800002110009;
rommem[2196] = 65'h1BE1000680A210001;
rommem[2197] = 65'h0BE007F8A31FFF07F;
rommem[2198] = 65'h047E1000847EF8010;
rommem[2199] = 65'h137EF801847E08000;
rommem[2200] = 65'h167EF80000FEF0008;
rommem[2201] = 65'h047EF800031FFF122;
rommem[2202] = 65'h10FEF00100BEF0008;
rommem[2203] = 65'h167EF800867E08000;
rommem[2204] = 65'h131FFF07FE040000D;
rommem[2205] = 65'h031FFF07FE040000A;
rommem[2206] = 65'h147E0800047EF8008;
rommem[2207] = 65'h033FFFCCC37EF8010;
rommem[2208] = 65'h167E080000FEF0010;
rommem[2209] = 65'h01410800F67EF8008;
rommem[2210] = 65'h0AC1002390A108030;
rommem[2211] = 65'h131FFF07F0A108007;
rommem[2212] = 65'h147E0800047EF8008;
rommem[2213] = 65'h00FEF001037EF8010;
rommem[2214] = 65'h167EF800867E08000;
rommem[2215] = 65'h131FFF14006108804;
rommem[2216] = 65'h131FFF14006108802;
rommem[2217] = 65'h147E0800047EF8008;
rommem[2218] = 65'h00FEF001037EF8010;
rommem[2219] = 65'h167EF800867E08000;
rommem[2220] = 65'h031FFF14B06109004;
rommem[2221] = 65'h031FFF14B06109002;
rommem[2222] = 65'h147E0800047EF8008;
rommem[2223] = 65'h00FEF001037EF8010;
rommem[2224] = 65'h167EF800867E08000;
rommem[2225] = 65'h031FFF1550610A004;
rommem[2226] = 65'h031FFF1550610A002;
rommem[2227] = 65'h147E0800047EF8008;
rommem[2228] = 65'h10FEF001837EF8010;
rommem[2229] = 65'h067E1800867E08000;
rommem[2230] = 65'h0E0C0000767EF8010;
rommem[2231] = 65'h031FFF14B06109002;
rommem[2232] = 65'h047EF8010BE01FFCF;
rommem[2233] = 65'h047E0800047E18008;
rommem[2234] = 65'h00FEF001837EF8018;
rommem[2235] = 65'h067E1800867E08000;
rommem[2236] = 65'h0E040003A67EF8010;
rommem[2237] = 65'h10220800931FFF07F;
rommem[2238] = 65'h0E0C0000731FFF169;
rommem[2239] = 65'h131FFF07FE0400020;
rommem[2240] = 65'h131FFF14B4A208000;
rommem[2241] = 65'h0BE01FF6F0A210001;
rommem[2242] = 65'h147EF801031FFF135;
rommem[2243] = 65'h047E0800047E18008;
rommem[2244] = 65'h00FEF001837EF8018;
rommem[2245] = 65'h067E1800867E08000;
rommem[2246] = 65'h0E040003A67EF8010;
rommem[2247] = 65'h10220800931FFF07F;
rommem[2248] = 65'h1E0C0000331FFF169;
rommem[2249] = 65'h131FFF07FE0400020;
rommem[2250] = 65'h131FFF1554C208000;
rommem[2251] = 65'h0BE01FF6F0A210002;
rommem[2252] = 65'h147EF801031FFF135;
rommem[2253] = 65'h047E0800047E18008;
rommem[2254] = 65'h00FEF001837EF8018;
rommem[2255] = 65'h167EF801067E08000;
rommem[2256] = 65'h031FFF07FE040003A;
rommem[2257] = 65'h131FFF16902208009;
rommem[2258] = 65'h131FFF07FE0400020;
rommem[2259] = 65'h131FFF16946208000;
rommem[2260] = 65'h131FFF1350A210008;
rommem[2261] = 65'h147E0800047EF8010;
rommem[2262] = 65'h00FEF003037EF8018;
rommem[2263] = 65'h067E2000867E18000;
rommem[2264] = 65'h167E3001867E28010;
rommem[2265] = 65'h167E4002867E38020;
rommem[2266] = 65'h1E2000013E080000A;
rommem[2267] = 65'h00631F80004110C1C;
rommem[2268] = 65'h1064208010653F800;
rommem[2269] = 65'h00652880104439009;
rommem[2270] = 65'h11E10800004519409;
rommem[2271] = 65'h106426001BE047F0F;
rommem[2272] = 65'h00443100906532000;
rommem[2273] = 65'h0024080090652E001;
rommem[2274] = 65'h147E1800002510009;
rommem[2275] = 65'h147E2801047E20008;
rommem[2276] = 65'h047E3802047E30018;
rommem[2277] = 65'h137EF803047E40028;
rommem[2278] = 65'h067E180000FEF0020;
rommem[2279] = 65'h167E2801067E20008;
rommem[2280] = 65'h1E200000F67E40018;
rommem[2281] = 65'h1162100301411000F;
rommem[2282] = 65'h10642100106217000;
rommem[2283] = 65'h0044290090632F000;
rommem[2284] = 65'h004310C0906319001;
rommem[2285] = 65'h0BE047EEF06108801;
rommem[2286] = 65'h10231000902408009;
rommem[2287] = 65'h047E2000847E18000;
rommem[2288] = 65'h047E4001847E28010;
rommem[2289] = 65'h00FEF003837EF8020;
rommem[2290] = 65'h067E3800867E18000;
rommem[2291] = 65'h067E4801867E40010;
rommem[2292] = 65'h067E5802867E50020;
rommem[2293] = 65'h00225800967EF8030;
rommem[2294] = 65'h10225000931FFF1AD;
rommem[2295] = 65'h0E240000131FFF1CC;
rommem[2296] = 65'h006938600E2000007;
rommem[2297] = 65'h10A7380040A738000;
rommem[2298] = 65'h06A758C10141180FF;
rommem[2299] = 65'h1BE047F4F06109001;
rommem[2300] = 65'h0BE04FEEF02208009;
rommem[2301] = 65'h031FFF1CC02A08009;
rommem[2302] = 65'h1141180FFE2000003;
rommem[2303] = 65'h1061090016A858C10;
rommem[2304] = 65'h160B00014BE047FAF;
rommem[2305] = 65'h047E3800847E18000;
rommem[2306] = 65'h047E4801847E40010;
rommem[2307] = 65'h047E5802847E50020;
rommem[2308] = 65'h037EF803847EF8030;
rommem[2309] = 65'h16A0D782DE6BEFFF8;
rommem[2310] = 65'h131FFF1356000141C;
rommem[2311] = 65'h031FFF07FE0400024;
rommem[2312] = 65'h1B01FFFFF31FFEF07;
rommem[2313] = 65'h131FFF07FB010030D;
rommem[2314] = 65'h060001418BE007F8A;
rommem[2315] = 65'h10211800931FFF06F;
rommem[2316] = 65'h00A31800282308000;
rommem[2317] = 65'h0B210042431FFF06B;
rommem[2318] = 65'h00A31800282308000;
rommem[2319] = 65'h0B0106A3A31FFF06B;
rommem[2320] = 65'h1B0109446B0107C44;
rommem[2321] = 65'h033FFF7E0B2100242;
rommem[2322] = 65'h0B210024CB0106F4A;
rommem[2323] = 65'h0B210043F33FFF297;
rommem[2324] = 65'h131FFF1229A00C910;
rommem[2325] = 65'h0B0100C4333FFF20A;
rommem[2326] = 65'h033FFF235B2100252;
rommem[2327] = 65'h133FFF528B2100249;
rommem[2328] = 65'h133FFF411B2100250;
rommem[2329] = 65'h131FFEF53B2100254;
rommem[2330] = 65'h031FFF37433FFF20A;
rommem[2331] = 65'h08230800033FFF20A;
rommem[2332] = 65'h131FFF06B0A318002;
rommem[2333] = 65'h082308000B21FD04C;
rommem[2334] = 65'h131FFF06B0A318002;
rommem[2335] = 65'h031FFF011B21FCC53;
rommem[2336] = 65'h06000141760001418;
rommem[2337] = 65'h033FFF20A31FFF06F;
rommem[2338] = 65'h170736944203D203F;
rommem[2339] = 65'h1706C65682079616C;
rommem[2340] = 65'h0203D20534C430A0D;
rommem[2341] = 65'h16373207261656C63;
rommem[2342] = 65'h1203A0A0D6E656572;
rommem[2343] = 65'h06D2074696445203D;
rommem[2344] = 65'h179622079726F6D65;
rommem[2345] = 65'h13D204C0A0D736574;
rommem[2346] = 65'h031532064616F4C20;
rommem[2347] = 65'h00A0D656C69662039;
rommem[2348] = 65'h17C487C437C425B44;
rommem[2349] = 65'h16D7544203D205D57;
rommem[2350] = 65'h179726F6D656D2070;
rommem[2351] = 65'h07C437C425B460A0D;
rommem[2352] = 65'h146203D205D577C48;
rommem[2353] = 65'h16F6D656D206C6C69;
rommem[2354] = 65'h1203D20420A0D7972;
rommem[2355] = 65'h16974207472617473;
rommem[2356] = 65'h0636973616220796E;
rommem[2357] = 65'h1754A203D204A0A0D;
rommem[2358] = 65'h06F63206F7420706D;
rommem[2359] = 65'h0203D20490A0D6564;
rommem[2360] = 65'h07372656461766E49;
rommem[2361] = 65'h16152203D20520A0D;
rommem[2362] = 65'h16E696C206D6F646E;
rommem[2363] = 65'h0203D20540A0D7365;
rommem[2364] = 65'h0706D657420746567;
rommem[2365] = 65'h10D65727574617265;
rommem[2366] = 65'h0616950203D20500A;
rommem[2367] = 65'h0000000000A0D6F6E;
rommem[2368] = 65'h167EF80000FEF0008;
rommem[2369] = 65'h00A31800282308000;
rommem[2370] = 65'h0B01FFD2031FFF06B;
rommem[2371] = 65'h047EF80000E318002;
rommem[2372] = 65'h131FFF28037EF8008;
rommem[2373] = 65'h00410140931FFF2D4;
rommem[2374] = 65'h031FFF280E1000007;
rommem[2375] = 65'h16050800031FFF2D4;
rommem[2376] = 65'h0BE027F8F0A528001;
rommem[2377] = 65'h031FFF28033FFF20A;
rommem[2378] = 65'h1341F800031FFF2D4;
rommem[2379] = 65'h031FFF28033FFF20A;
rommem[2380] = 65'h11601380031FFF2D4;
rommem[2381] = 65'h133FFF20A31FFF56D;
rommem[2382] = 65'h00A31800282308000;
rommem[2383] = 65'h00213000931FFF06B;
rommem[2384] = 65'h131FFF2D431FFF280;
rommem[2385] = 65'h031FFF28002110009;
rommem[2386] = 65'h10610860131FFF2D4;
rommem[2387] = 65'h116008001B2100200;
rommem[2388] = 65'h1B060085731FFF135;
rommem[2389] = 65'h031FFF175B0600443;
rommem[2390] = 65'h033FFF20ABE00FFEF;
rommem[2391] = 65'h0BE00FFEF31FFF189;
rommem[2392] = 65'h031FFF19D33FFF20A;
rommem[2393] = 65'h033FFF20ABE00FFEF;
rommem[2394] = 65'h182308000BE006ACA;
rommem[2395] = 65'h131FFF06B0A318002;
rommem[2396] = 65'h131FFF28002130009;
rommem[2397] = 65'h10211000931FFF2D4;
rommem[2398] = 65'h131FFF2D431FFF280;
rommem[2399] = 65'h131FFF28002128009;
rommem[2400] = 65'h1B060074331FFF2D4;
rommem[2401] = 65'h0B0600D57B0600A48;
rommem[2402] = 65'h10A21000160208000;
rommem[2403] = 65'h033FFF20ABE02FFCF;
rommem[2404] = 65'h00A21000262208000;
rommem[2405] = 65'h033FFF20ABE02FFCF;
rommem[2406] = 65'h00A21000464208000;
rommem[2407] = 65'h033FFF20ABE02FFCF;
rommem[2408] = 65'h10A21000866208000;
rommem[2409] = 65'h033FFF20ABE02FFCF;
rommem[2410] = 65'h067E100000FEF0018;
rommem[2411] = 65'h067EF801067E20008;
rommem[2412] = 65'h0E100000FE0800000;
rommem[2413] = 65'h00A31800282308000;
rommem[2414] = 65'h031FFF2E831FFF06B;
rommem[2415] = 65'h106210800B01005FF;
rommem[2416] = 65'h0042088091410800F;
rommem[2417] = 65'h102208009BE027F0F;
rommem[2418] = 65'h047E2000847EF8010;
rommem[2419] = 65'h137EF801847E10000;
rommem[2420] = 65'h1AE100339A8100E30;
rommem[2421] = 65'h037EF80000E108030;
rommem[2422] = 65'h0AE100446A8100A41;
rommem[2423] = 65'h10A10800A0E108041;
rommem[2424] = 65'h0A810056137EF8000;
rommem[2425] = 65'h10E108061AE100466;
rommem[2426] = 65'h137EF80000A10800A;
rommem[2427] = 65'h137EF8000E07FFFFF;
rommem[2428] = 65'h131FFF36ABE00006A;
rommem[2429] = 65'h031FFF36AB21FFF0A;
rommem[2430] = 65'h1B21FFC53B01F0E1A;
rommem[2431] = 65'h0A01FFA3031FFF36A;
rommem[2432] = 65'h004101009A61FF939;
rommem[2433] = 65'h131FFF2E831FFF36A;
rommem[2434] = 65'h031FFF36A04100809;
rommem[2435] = 65'h10621080031FFF2E8;
rommem[2436] = 65'h104208C0904208809;
rommem[2437] = 65'h0B0401E31B04FEF30;
rommem[2438] = 65'h1B0402033B0401F32;
rommem[2439] = 65'h0B0402037B04FEB35;
rommem[2440] = 65'h1B0402439B0402238;
rommem[2441] = 65'h0143180FFBE007CEA;
rommem[2442] = 65'h131FFF36A0E318001;
rommem[2443] = 65'h10621080031FFF2E8;
rommem[2444] = 65'h131FFF36A04208809;
rommem[2445] = 65'h10621080031FFF2E8;
rommem[2446] = 65'h16051000004208809;
rommem[2447] = 65'h1BE01FECF0A528001;
rommem[2448] = 65'h131FFF2E831FFF36A;
rommem[2449] = 65'h10420880906210800;
rommem[2450] = 65'h131FFF2E831FFF36A;
rommem[2451] = 65'h10420880906210800;
rommem[2452] = 65'h031FFF338BE007A2A;
rommem[2453] = 65'h131FFF33EBE007D2A;
rommem[2454] = 65'h131FFF344BE007CEA;
rommem[2455] = 65'h031FFF344BE007CAA;
rommem[2456] = 65'h0BE005B2A66028000;
rommem[2457] = 65'h06602800031FFF33E;
rommem[2458] = 65'h031FFF338BE005ACA;
rommem[2459] = 65'h133FFF20A66028000;
rommem[2460] = 65'h167EF80000FEF0008;
rommem[2461] = 65'h131FFF2E831FFF36A;
rommem[2462] = 65'h0BE00038A04100809;
rommem[2463] = 65'h167EF80000FEF0008;
rommem[2464] = 65'h131FFF2E831FFF36A;
rommem[2465] = 65'h0BE0001CA04100809;
rommem[2466] = 65'h167EF80000FEF0008;
rommem[2467] = 65'h131FFF2E831FFF36A;
rommem[2468] = 65'h031FFF36A04100809;
rommem[2469] = 65'h10621080031FFF2E8;
rommem[2470] = 65'h131FFF36A04110809;
rommem[2471] = 65'h10621080031FFF2E8;
rommem[2472] = 65'h131FFF36A04208809;
rommem[2473] = 65'h10621080031FFF2E8;
rommem[2474] = 65'h131FFF36A04208809;
rommem[2475] = 65'h10621080031FFF2E8;
rommem[2476] = 65'h131FFF36A04208809;
rommem[2477] = 65'h10621080031FFF2E8;
rommem[2478] = 65'h131FFF36A04208809;
rommem[2479] = 65'h10621080031FFF2E8;
rommem[2480] = 65'h131FFF36A04208809;
rommem[2481] = 65'h10621080031FFF2E8;
rommem[2482] = 65'h00442100A04208809;
rommem[2483] = 65'h047EF800004201409;
rommem[2484] = 65'h037EF80000BEF0008;
rommem[2485] = 65'h167EF80000FEF0008;
rommem[2486] = 65'h1BE103C0831FFEF1C;
rommem[2487] = 65'h1B01E9B0031FFEF07;
rommem[2488] = 65'h0BE107F6231FFFD9D;
rommem[2489] = 65'h037EF800847EF8000;
rommem[2490] = 65'h067E080000FEF0018;
rommem[2491] = 65'h167EF801067E18008;
rommem[2492] = 65'h100000050660020E8;
rommem[2493] = 65'h0E69AE000020088A8;
rommem[2494] = 65'h06A0D042AEE800003;
rommem[2495] = 65'h0020088A800000050;
rommem[2496] = 65'h00411841C16018554;
rommem[2497] = 65'h0EE800003E69AE008;
rommem[2498] = 65'h1000000506A0D042A;
rommem[2499] = 65'h016018554020088A8;
rommem[2500] = 65'h1E69AE0100411841C;
rommem[2501] = 65'h06A0D042AEE800003;
rommem[2502] = 65'h0020088A800000050;
rommem[2503] = 65'h10411841C16018300;
rommem[2504] = 65'h1EE800003E69AE00C;
rommem[2505] = 65'h1000000506A0D042A;
rommem[2506] = 65'h116018300020088A8;
rommem[2507] = 65'h0E69AE0140411841C;
rommem[2508] = 65'h06A0D042AEE800003;
rommem[2509] = 65'h1E69AE03CE0400002;
rommem[2510] = 65'h06A0D042AEE800003;
rommem[2511] = 65'h0EE800003E69AE038;
rommem[2512] = 65'h0BE107FA96A0D0421;
rommem[2513] = 65'h147EF8010BE007AEA;
rommem[2514] = 65'h047E0800047E18008;
rommem[2515] = 65'h1E698000037EF8018;
rommem[2516] = 65'h16A0D082DEE800003;
rommem[2517] = 65'h100000050E10037FF;
rommem[2518] = 65'h192208000020088A8;
rommem[2519] = 65'h0BE027F8F0A210002;
rommem[2520] = 65'h10FEF001037EF8000;
rommem[2521] = 65'h167EF800867E08000;
rommem[2522] = 65'h0EE800003E69C1026;
rommem[2523] = 65'h131FFEF076A0D0029;
rommem[2524] = 65'h1E69C1068B0100A03;
rommem[2525] = 65'h16A0D0421EE800003;
rommem[2526] = 65'h1E69C1026BE107F69;
rommem[2527] = 65'h16A0D0421EE800003;
rommem[2528] = 65'h1B21FF30F1410800F;
rommem[2529] = 65'h0EE800003E69C1002;
rommem[2530] = 65'h1E69C10046A0D0029;
rommem[2531] = 65'h16A0D0029EE800003;
rommem[2532] = 65'h1EE800003E69C1018;
rommem[2533] = 65'h0E69C100A6A0D0029;
rommem[2534] = 65'h16A0D0029EE800003;
rommem[2535] = 65'h0E69C1020E07F8000;
rommem[2536] = 65'h06A0D0429EE800003;
rommem[2537] = 65'h1B010050331FFEF07;
rommem[2538] = 65'h0EE800003E69C1068;
rommem[2539] = 65'h0BE107F696A0D0421;
rommem[2540] = 65'h147E0800047EF8008;
rommem[2541] = 65'h00FEF001037EF8010;
rommem[2542] = 65'h167EF800867E08000;
rommem[2543] = 65'h0E69C0600E0400008;
rommem[2544] = 65'h16A0D0428EE800003;
rommem[2545] = 65'h0E69500801600800F;
rommem[2546] = 65'h06A0D0429EE800003;
rommem[2547] = 65'h1E69500001600B46E;
rommem[2548] = 65'h06A0D0429EE800003;
rommem[2549] = 65'h1E69C0600E0400009;
rommem[2550] = 65'h16A0D0428EE800003;
rommem[2551] = 65'h1E6950006E07FCA12;
rommem[2552] = 65'h06A0D0429EE800003;
rommem[2553] = 65'h1E695000416009104;
rommem[2554] = 65'h06A0D0429EE800003;
rommem[2555] = 65'h1EE800000E6A625A0;
rommem[2556] = 65'h0BE00800F040D0409;
rommem[2557] = 65'h0E69C0600E040000D;
rommem[2558] = 65'h16A0D0428EE800003;
rommem[2559] = 65'h0E695000416008104;
rommem[2560] = 65'h06A0D0429EE800003;
rommem[2561] = 65'h1EE800000E6A625A0;
rommem[2562] = 65'h0BE00800F040D0409;
rommem[2563] = 65'h0E69C0600E0400010;
rommem[2564] = 65'h16A0D0428EE800003;
rommem[2565] = 65'h0E695000416008000;
rommem[2566] = 65'h06A0D0429EE800003;
rommem[2567] = 65'h147E0800047EF8008;
rommem[2568] = 65'h01600800F37EF8010;
rommem[2569] = 65'h1EE800003E6950080;
rommem[2570] = 65'h031FFEF076A0D0429;
rommem[2571] = 65'h0B0100861B01DF403;
rommem[2572] = 65'h1B0100C63B0100A62;
rommem[2573] = 65'h1B0101065B0100E64;
rommem[2574] = 65'h1B0101467B0101266;
rommem[2575] = 65'h1E0401C31BE007EEA;
rommem[2576] = 65'h0BE007E8A31FFF434;
rommem[2577] = 65'h031FFF434E0401FA5;
rommem[2578] = 65'h0E04010C3BE007E2A;
rommem[2579] = 65'h1BE007DCA31FFF434;
rommem[2580] = 65'h131FFF434E04012D1;
rommem[2581] = 65'h0E040151FBE007D6A;
rommem[2582] = 65'h1BE007D0A31FFF434;
rommem[2583] = 65'h031FFF434E0401660;
rommem[2584] = 65'h0E040191EBE007CAA;
rommem[2585] = 65'h1BE007C4A31FFF434;
rommem[2586] = 65'h167E080000FEF0010;
rommem[2587] = 65'h1E695000067EF8008;
rommem[2588] = 65'h06A0D0429EE800003;
rommem[2589] = 65'h1E6950006E07FCA12;
rommem[2590] = 65'h06A0D0429EE800003;
rommem[2591] = 65'h1E695000416009104;
rommem[2592] = 65'h06A0D0429EE800003;
rommem[2593] = 65'h0040D0409E683D090;
rommem[2594] = 65'h116008104BE00800F;
rommem[2595] = 65'h1EE800003E6950004;
rommem[2596] = 65'h0E683D0906A0D0429;
rommem[2597] = 65'h0BE00800F040D0409;
rommem[2598] = 65'h0E695000416008000;
rommem[2599] = 65'h06A0D0429EE800003;
rommem[2600] = 65'h147E0800047EF8008;
rommem[2601] = 65'h00FEF000837EF8010;
rommem[2602] = 65'h0E04000C867E08000;
rommem[2603] = 65'h1EE800003E69A0100;
rommem[2604] = 65'h1E04000F06A0D0429;
rommem[2605] = 65'h0EE800003E69A0102;
rommem[2606] = 65'h0E04001186A0D0429;
rommem[2607] = 65'h0EE800003E69A0104;
rommem[2608] = 65'h1E04001406A0D0429;
rommem[2609] = 65'h1EE800003E69A0106;
rommem[2610] = 65'h1E04001686A0D0429;
rommem[2611] = 65'h0EE800003E69A0108;
rommem[2612] = 65'h147E080006A0D0429;
rommem[2613] = 65'h0E69A011E37EF8008;
rommem[2614] = 65'h16A0D0421EE800003;
rommem[2615] = 65'h1B0100802B0100901;
rommem[2616] = 65'h0B0100604B0100703;
rommem[2617] = 65'h1B0100406B0100505;
rommem[2618] = 65'h1B0100208B0100307;
rommem[2619] = 65'h01A10802837EF8000;
rommem[2620] = 65'h1E69AD0020A1080CC;
rommem[2621] = 65'h06A0D0429EE800003;
rommem[2622] = 65'h1EE800003E69AD012;
rommem[2623] = 65'h1E69AD0226A0D0429;
rommem[2624] = 65'h06A0D0429EE800003;
rommem[2625] = 65'h0EE800003E69AD032;
rommem[2626] = 65'h1E69AD0426A0D0429;
rommem[2627] = 65'h06A0D0429EE800003;
rommem[2628] = 65'h0EE800003E69AD052;
rommem[2629] = 65'h0E69AD0626A0D0429;
rommem[2630] = 65'h06A0D0429EE800003;
rommem[2631] = 65'h1EE800003E69AD072;
rommem[2632] = 65'h037EF80006A0D0429;
rommem[2633] = 65'h067E080000FEF0030;
rommem[2634] = 65'h167E1801067E10008;
rommem[2635] = 65'h067E2802067E20018;
rommem[2636] = 65'h031FFEFF267EF8018;
rommem[2637] = 65'h00181CD1716008003;
rommem[2638] = 65'h10222800902120009;
rommem[2639] = 65'h11601002E16008002;
rommem[2640] = 65'h00181CD1716018040;
rommem[2641] = 65'h10181D01716008001;
rommem[2642] = 65'h11600800231FFF169;
rommem[2643] = 65'h00251800902410009;
rommem[2644] = 65'h131FFEFF70181CD17;
rommem[2645] = 65'h047E1801047EF8018;
rommem[2646] = 65'h147E0800047E10008;
rommem[2647] = 65'h047E2802047E20018;
rommem[2648] = 65'h10FEF001037EF8030;
rommem[2649] = 65'h0E0C0037F40000004;
rommem[2650] = 65'h16200150062019508;
rommem[2651] = 65'h06200151260001510;
rommem[2652] = 65'h04000000462001514;
rommem[2653] = 65'h10FEF001837EF8010;
rommem[2654] = 65'h0E0C0027F40000005;
rommem[2655] = 65'h1E0C0002860019417;
rommem[2656] = 65'h14000950060019418;
rommem[2657] = 65'h04000950131FFF14B;
rommem[2658] = 65'h14000000531FFF14B;
rommem[2659] = 65'h10FEF001037EF8018;
rommem[2660] = 65'h04200977F40000001;
rommem[2661] = 65'h042009512AC101402;
rommem[2662] = 65'h06000941806108601;
rommem[2663] = 65'h16000941742009514;
rommem[2664] = 65'h1620095140E108001;
rommem[2665] = 65'h131FFF07FE040005E;
rommem[2666] = 65'h00E10800140009418;
rommem[2667] = 65'h14000941760009418;
rommem[2668] = 65'h1600094170E108001;
rommem[2669] = 65'h131FFF07FE0400020;
rommem[2670] = 65'h037EF827740000001;
rommem[2671] = 65'h04200951260001510;
rommem[2672] = 65'h06000941806108601;
rommem[2673] = 65'h16000941742009514;
rommem[2674] = 65'h131FFF07FE0400020;
rommem[2675] = 65'h037EF827740000001;
rommem[2676] = 65'h0400000050FEF0018;
rommem[2677] = 65'h160019417E0C0002E;
rommem[2678] = 65'h10631860142019508;
rommem[2679] = 65'h1E040002060019418;
rommem[2680] = 65'h1E040002331FFF07F;
rommem[2681] = 65'h0E040004131FFF07F;
rommem[2682] = 65'h1E040002331FFF07F;
rommem[2683] = 65'h1E040002031FFF07F;
rommem[2684] = 65'h14000000531FFF07F;
rommem[2685] = 65'h04601800037EF8018;
rommem[2686] = 65'h162308000160080E9;
rommem[2687] = 65'h062308001160080F2;
rommem[2688] = 65'h062308002160080DF;
rommem[2689] = 65'h00FEF002837EF8000;
rommem[2690] = 65'h14200977F4000000F;
rommem[2691] = 65'h01411000142021570;
rommem[2692] = 65'h040019571BE2003A8;
rommem[2693] = 65'h16002141860019417;
rommem[2694] = 65'h131FFF14BE0400020;
rommem[2695] = 65'h131FFF14BE0400023;
rommem[2696] = 65'h131FFF14BE0400023;
rommem[2697] = 65'h131FFF14BE0400023;
rommem[2698] = 65'h131FFF14BE0400020;
rommem[2699] = 65'h10A10800140009417;
rommem[2700] = 65'h14000941860009417;
rommem[2701] = 65'h0E04000200E108005;
rommem[2702] = 65'h1E040005831FFF14B;
rommem[2703] = 65'h1E040002031FFF14B;
rommem[2704] = 65'h1E040005831FFF14B;
rommem[2705] = 65'h1E040002031FFF14B;
rommem[2706] = 65'h14000000F31FFF14B;
rommem[2707] = 65'h037EF800037EF8028;
rommem[2708] = 65'h0FFFFFFFFFFFF0000;
rommem[2709] = 65'h031FFF4BB31FFF4B1;
rommem[2710] = 65'h031FFF52731FFF503;
rommem[2711] = 65'h131FFF4E831FFF4C7;
rommem[2712] = 65'h1B010046B31FFEF07;
rommem[2713] = 65'h0B0100D20B010096A;
rommem[2714] = 65'h042011508BE0002AA;
rommem[2715] = 65'h1BE2D0247E6800280;
rommem[2716] = 65'h1620115080A210008;
rommem[2717] = 65'h142011508BE0001EA;
rommem[2718] = 65'h10E210008BE2001A2;
rommem[2719] = 65'h0BE00014A62011508;
rommem[2720] = 65'h0BE20010940011510;
rommem[2721] = 65'h060011510E0800001;
rommem[2722] = 65'h06201151242011508;
rommem[2723] = 65'h162011514E080002E;
rommem[2724] = 65'h0B0100203BE00002A;
rommem[2725] = 65'h14000000FBE007C2A;
rommem[2726] = 65'h0BE0017AA0BEF00F0;
rommem[2727] = 65'h067EF80000FEF0018;
rommem[2728] = 65'h167E1801067E10008;
rommem[2729] = 65'h0EE800003E69C0500;
rommem[2730] = 65'h0160080016A0D0C2D;
rommem[2731] = 65'h11600800190308002;
rommem[2732] = 65'h1DE00000090308003;
rommem[2733] = 65'h00211000980308004;
rommem[2734] = 65'h1B01FFD0102208009;
rommem[2735] = 65'h12A10820480308005;
rommem[2736] = 65'h19A00D946B2100500;
rommem[2737] = 65'h00410840A31FFF122;
rommem[2738] = 65'h031FFF14BBE0000AA;
rommem[2739] = 65'h131FFF1229A00D960;
rommem[2740] = 65'h147EF800016008001;
rommem[2741] = 65'h147E1801047E10008;
rommem[2742] = 65'h00FEF002837EF8018;
rommem[2743] = 65'h067E2800867EF8000;
rommem[2744] = 65'h067E1801867E10010;
rommem[2745] = 65'h1E69C050067E20020;
rommem[2746] = 65'h06A0D0C2DEE800003;
rommem[2747] = 65'h09030800706109206;
rommem[2748] = 65'h09030800806109001;
rommem[2749] = 65'h19030800906109001;
rommem[2750] = 65'h19030800A06109001;
rommem[2751] = 65'h09030801416008001;
rommem[2752] = 65'h19030800216008002;
rommem[2753] = 65'h09030800316008001;
rommem[2754] = 65'h180308004DE000000;
rommem[2755] = 65'h00240800902120009;
rommem[2756] = 65'h080308005B01FFD01;
rommem[2757] = 65'h1B21008002A108614;
rommem[2758] = 65'h08030801016020200;
rommem[2759] = 65'h10A21000160208000;
rommem[2760] = 65'h00410840ABE027FAF;
rommem[2761] = 65'h031FFF14BBE0000AA;
rommem[2762] = 65'h031FFF1229A00D99E;
rommem[2763] = 65'h147EF800016008001;
rommem[2764] = 65'h147E1001047E28008;
rommem[2765] = 65'h047E2002047E18018;
rommem[2766] = 65'h10FEF002037EF8028;
rommem[2767] = 65'h167E1000867EF8000;
rommem[2768] = 65'h167E2801867E18010;
rommem[2769] = 65'h0160181F4660030F8;
rommem[2770] = 65'h10250800916028000;
rommem[2771] = 65'h16000141816010008;
rommem[2772] = 65'h00250800931FFF13F;
rommem[2773] = 65'h1EE800402E6800000;
rommem[2774] = 65'h131FFF56D040D0809;
rommem[2775] = 65'h1E68000000A528001;
rommem[2776] = 65'h16A0D0405EE800402;
rommem[2777] = 65'h1BE200088121100EB;
rommem[2778] = 65'h016008001BE01FE2F;
rommem[2779] = 65'h09A00D728BE0001EA;
rommem[2780] = 65'h0E68001FE31FFF122;
rommem[2781] = 65'h16A0D0405EE800402;
rommem[2782] = 65'h1E68001FFB21FF855;
rommem[2783] = 65'h16A0D0405EE800402;
rommem[2784] = 65'h0BE1D7E69E68000AA;
rommem[2785] = 65'h16600B0F80E508001;
rommem[2786] = 65'h047EF80000410840A;
rommem[2787] = 65'h147E1801047E10008;
rommem[2788] = 65'h137EF802047E28018;
rommem[2789] = 65'h0424520646E756F46;
rommem[2790] = 65'h10A0D2E65646F6320;
rommem[2791] = 65'h00FEF000800000000;
rommem[2792] = 65'h0E680001667EF8000;
rommem[2793] = 65'h06A0D0C06EE800402;
rommem[2794] = 65'h0EE800402E6800010;
rommem[2795] = 65'h004310C186A0D0805;
rommem[2796] = 65'h0EE800402E6800200;
rommem[2797] = 65'h1E680000E6A0D082D;
rommem[2798] = 65'h06A0D1406EE800402;
rommem[2799] = 65'h104531403460330F8;
rommem[2800] = 65'h031FFF56D02508009;
rommem[2801] = 65'h00A2102000A528001;
rommem[2802] = 65'h047EF8000BE01FF8F;
rommem[2803] = 65'h1E680001637EF8008;
rommem[2804] = 65'h06A0D0C06EE800402;
rommem[2805] = 65'h0EE800402E6800010;
rommem[2806] = 65'h004320C186A0D1005;
rommem[2807] = 65'h0EE800402E680000E;
rommem[2808] = 65'h004320C036A0D1006;
rommem[2809] = 65'h104331403460330F8;
rommem[2810] = 65'h1EE800402E6800011;
rommem[2811] = 65'h0E68000126A0D1C05;
rommem[2812] = 65'h16A0D2005EE800402;
rommem[2813] = 65'h104741C0906841006;
rommem[2814] = 65'h106738A0602740009;
rommem[2815] = 65'h10271800906739201;
rommem[2816] = 65'h031FFF56D02508009;
rommem[2817] = 65'h00A2102000A528001;
rommem[2818] = 65'h1BE0004AABE01FF8F;
rommem[2819] = 65'h0EE800402E6800016;
rommem[2820] = 65'h0E68000106A0D0C06;
rommem[2821] = 65'h16A0D0805EE800402;
rommem[2822] = 65'h1E680000E04310C18;
rommem[2823] = 65'h16A0D0806EE800402;
rommem[2824] = 65'h0E680001104310C03;
rommem[2825] = 65'h16A0D1C05EE800402;
rommem[2826] = 65'h1EE800402E6800012;
rommem[2827] = 65'h1068410066A0D2005;
rommem[2828] = 65'h10274000904741C09;
rommem[2829] = 65'h10673920106738A06;
rommem[2830] = 65'h1E68F4F4246308000;
rommem[2831] = 65'h0F68454C4EEA51951;
rommem[2832] = 65'h1BE100068041D0407;
rommem[2833] = 65'h0BE03FF2F0A318020;
rommem[2834] = 65'h1E68000114C31001A;
rommem[2835] = 65'h16A0D1C06EE800402;
rommem[2836] = 65'h10673920106738A06;
rommem[2837] = 65'h0EE800402E680000D;
rommem[2838] = 65'h0E68002006A0D0C05;
rommem[2839] = 65'h16A0D082DEE800402;
rommem[2840] = 65'h10A5282004602B0F8;
rommem[2841] = 65'h031FFF56D02508009;
rommem[2842] = 65'h00A2102000A528001;
rommem[2843] = 65'h1E6800200BE01FF8F;
rommem[2844] = 65'h06A0D0407EE800402;
rommem[2845] = 65'h0EE800151E68F4F42;
rommem[2846] = 65'h116008016BE1D0129;
rommem[2847] = 65'h031FFF1229A00D920;
rommem[2848] = 65'h1EE800402E6800204;
rommem[2849] = 65'h0341F8000040D0409;
rommem[2850] = 65'h09A00D93033FFF20A;
rommem[2851] = 65'h133FFF20A31FFF122;
rommem[2852] = 65'h120676E69706D754A;
rommem[2853] = 65'h000746F6F62206F74;
rommem[2854] = 65'h02064726163204453;
rommem[2855] = 65'h1746F6F6220746F6E;
rommem[2856] = 65'h04453002E656C6261;
rommem[2857] = 65'h16E69206472616320;
rommem[2858] = 65'h0657A696C61697469;
rommem[2859] = 65'h1002E79616B6F2064;
rommem[2860] = 65'h020726F727265203A;
rommem[2861] = 65'h0646572727563636F;
rommem[2862] = 65'h16C616974696E6920;
rommem[2863] = 65'h1687420676E697A69;
rommem[2864] = 65'h17261632044532065;
rommem[2865] = 65'h16163204453002E64;
rommem[2866] = 65'h020746F6F62206472;
rommem[2867] = 65'h0445300726F727265;
rommem[2868] = 65'h06572206472616320;
rommem[2869] = 65'h1726F727265206461;
rommem[2870] = 65'h00000000000000000;
rommem[2871] = 65'h0E69C200000000000;
rommem[2872] = 65'h06A0D0C2DEE800003;
rommem[2873] = 65'h16430802816008064;
rommem[2874] = 65'h16430803016008007;
rommem[2875] = 65'h0EEBFFFBBE6B0DA42;
rommem[2876] = 65'h064308040040D0409;
rommem[2877] = 65'h064308044160080FF;
rommem[2878] = 65'h00FEF001837EF8000;
rommem[2879] = 65'h067E1000867E18000;
rommem[2880] = 65'h0E69C200067E20010;
rommem[2881] = 65'h06A0D0C2DEE800003;
rommem[2882] = 65'h06431000416010004;
rommem[2883] = 65'h11601600064308604;
rommem[2884] = 65'h0DE00000064310600;
rommem[2885] = 65'h02A21041484310004;
rommem[2886] = 65'h084310600BE207FA8;
rommem[2887] = 65'h11601800006212001;
rommem[2888] = 65'h0EE800003E6901D88;
rommem[2889] = 65'h06A1188056A0D102D;
rommem[2890] = 65'h00A3180016A418911;
rommem[2891] = 65'h0BE207F8912310053;
rommem[2892] = 65'h047E1000847E18000;
rommem[2893] = 65'h037EF801847E20010;
rommem[2894] = 65'h067E180000FEF0010;
rommem[2895] = 65'h14A11000C67E10008;
rommem[2896] = 65'h1B22006084A11800D;
rommem[2897] = 65'h116008002B2300506;
rommem[2898] = 65'h047E1000847E18000;
rommem[2899] = 65'h0B2200C0837EF8010;
rommem[2900] = 65'h04A110017B2300B00;
rommem[2901] = 65'h116008001B2200301;
rommem[2902] = 65'h0B2200311BE007F0A;
rommem[2903] = 65'h0BE007EAA16008003;
rommem[2904] = 65'h016008004B2200306;
rommem[2905] = 65'h10410840ABE007E4A;
rommem[2906] = 65'h047E1000847E18000;
rommem[2907] = 65'h00FEF001037EF8010;
rommem[2908] = 65'h067E2000867E18000;
rommem[2909] = 65'h1EE800003E69C2000;
rommem[2910] = 65'h1843204006A0D0C2D;
rommem[2911] = 65'h0B04FFE012A421E7C;
rommem[2912] = 65'h06432000416020001;
rommem[2913] = 65'h10621200664308404;
rommem[2914] = 65'h16431040016217000;
rommem[2915] = 65'h047E1800047E20008;
rommem[2916] = 65'h00FEF004037EF8010;
rommem[2917] = 65'h067E2000867E18000;
rommem[2918] = 65'h167E3001867E28010;
rommem[2919] = 65'h167E4002867E38020;
rommem[2920] = 65'h167E5003867E48030;
rommem[2921] = 65'h04A1200074A118006;
rommem[2922] = 65'h14A1300094A128008;
rommem[2923] = 65'h14A14000B4A13800A;
rommem[2924] = 65'h06012000160118000;
rommem[2925] = 65'h16013000360128002;
rommem[2926] = 65'h16014000560138004;
rommem[2927] = 65'h06011800616018000;
rommem[2928] = 65'h160118007160180FF;
rommem[2929] = 65'h160118008160180EE;
rommem[2930] = 65'h060118009160180F0;
rommem[2931] = 65'h16011800A160180DA;
rommem[2932] = 65'h16011800B16018042;
rommem[2933] = 65'h14A11801AB2201101;
rommem[2934] = 65'h04A12801C4A12001B;
rommem[2935] = 65'h14A13801E4A13001D;
rommem[2936] = 65'h14A1480204A14001F;
rommem[2937] = 65'h16013801A4A150021;
rommem[2938] = 65'h06014801C6014001B;
rommem[2939] = 65'h06011801E6015001D;
rommem[2940] = 65'h1601280206012001F;
rommem[2941] = 65'h04601D9B460130021;
rommem[2942] = 65'h16601D9B40A318001;
rommem[2943] = 65'h00631900160118013;
rommem[2944] = 65'h04A11800E60118012;
rommem[2945] = 65'h1063184061431800F;
rommem[2946] = 65'h147E180000A30800E;
rommem[2947] = 65'h147E2801047E20008;
rommem[2948] = 65'h047E3802047E30018;
rommem[2949] = 65'h147E4803047E40028;
rommem[2950] = 65'h037EF804047E50038;
rommem[2951] = 65'h167E180000FEF0018;
rommem[2952] = 65'h167E2801067E20008;
rommem[2953] = 65'h16010001960100018;
rommem[2954] = 65'h01602000E04318C0A;
rommem[2955] = 65'h00E52800102228009;
rommem[2956] = 65'h16A121405BE428101;
rommem[2957] = 65'h0065290066A121845;
rommem[2958] = 65'h004328C0304531409;
rommem[2959] = 65'h0BE007EEA0A420002;
rommem[2960] = 65'h01431FFFF02328009;
rommem[2961] = 65'h104328C030652A001;
rommem[2962] = 65'h06011801902318004;
rommem[2963] = 65'h16011801806319001;
rommem[2964] = 65'h067E2000867E18000;
rommem[2965] = 65'h037EF801867E28010;
rommem[2966] = 65'h167E100000FEF0020;
rommem[2967] = 65'h167E2001067E18008;
rommem[2968] = 65'h14A11001E67E28018;
rommem[2969] = 65'h14A1200204A11801F;
rommem[2970] = 65'h0E68000FF4A128021;
rommem[2971] = 65'h1E68000FFBE2D01A9;
rommem[2972] = 65'h0E68000FFBE3D0169;
rommem[2973] = 65'h0E68000FFBE4D0129;
rommem[2974] = 65'h116008001BE5D00E9;
rommem[2975] = 65'h047E1800847E10000;
rommem[2976] = 65'h047E2801847E20010;
rommem[2977] = 65'h10220800937EF8020;
rommem[2978] = 65'h00411840906109006;
rommem[2979] = 65'h10412040906109006;
rommem[2980] = 65'h00412840906109006;
rommem[2981] = 65'h0EEBFFF02E6A8012A;
rommem[2982] = 65'h00410840ABE1D7E28;
rommem[2983] = 65'h131FFF66FBE007E0A;
rommem[2984] = 65'h0E68000000410840A;
rommem[2985] = 65'h1040D0409EE800400;
rommem[2986] = 65'h031FFF69C31FFF67D;
rommem[2987] = 65'h102110009B2102801;
rommem[2988] = 65'h0EE800400E6800000;
rommem[2989] = 65'h031FFF72C040D0409;
rommem[2990] = 65'h10220800902118009;
rommem[2991] = 65'h0E6800000B2302001;
rommem[2992] = 65'h1040D0409EE800400;
rommem[2993] = 65'h031FFF6C916010001;
rommem[2994] = 65'h0E680000002118009;
rommem[2995] = 65'h1040D0409EE800400;
rommem[2996] = 65'h14A1100116A118010;
rommem[2997] = 65'h1022300090A21000E;
rommem[2998] = 65'h06A1194C56A119085;
rommem[2999] = 65'h00442900906421006;
rommem[3000] = 65'h00E42080002420004;
rommem[3001] = 65'h16A1190D002420004;
rommem[3002] = 65'h06A11909006421001;
rommem[3003] = 65'h131FFF70E02310009;
rommem[3004] = 65'h0EE800400E6800000;
rommem[3005] = 65'h102610009040D0409;
rommem[3006] = 65'h033FFF75031FFF6B7;
rommem[3007] = 65'h0E6B5E100B21FD202;
rommem[3008] = 65'h0040D0809EE800017;
rommem[3009] = 65'h1B2DFCD014A268015;
rommem[3010] = 65'h14A2500274A248026;
rommem[3011] = 65'h04A2600294A258028;
rommem[3012] = 65'h006F7900602978009;
rommem[3013] = 65'h006F7900604F53C09;
rommem[3014] = 65'h106F7900604F5BC09;
rommem[3015] = 65'h1E6A8012A04F63C09;
rommem[3016] = 65'h0BEFD77E9EEBFFF02;
rommem[3017] = 65'h14A23001D4A22801C;
rommem[3018] = 65'h14A24001F4A23801E;
rommem[3019] = 65'h106E7100602570009;
rommem[3020] = 65'h006E7100604E33809;
rommem[3021] = 65'h106E7100604E3B809;
rommem[3022] = 65'h04A28001604E43809;
rommem[3023] = 65'h04A2900184A288017;
rommem[3024] = 65'h14A2A001A4A298019;
rommem[3025] = 65'h1602800004A2A801B;
rommem[3026] = 65'h06029000260288001;
rommem[3027] = 65'h0602A000460298003;
rommem[3028] = 65'h160280020602A8005;
rommem[3029] = 65'h06029002260288021;
rommem[3030] = 65'h0602A002460298023;
rommem[3031] = 65'h060200006602A8025;
rommem[3032] = 65'h160208007160080FF;
rommem[3033] = 65'h160208008160080EE;
rommem[3034] = 65'h060208009160080F0;
rommem[3035] = 65'h16020800A160080DA;
rommem[3036] = 65'h16020800B16008042;
rommem[3037] = 65'h0160080FF60200016;
rommem[3038] = 65'h0160080EE60208017;
rommem[3039] = 65'h0160080F060208018;
rommem[3040] = 65'h0160080DA60208019;
rommem[3041] = 65'h1160080426020801A;
rommem[3042] = 65'h06024801C6020801B;
rommem[3043] = 65'h16025801E6025001D;
rommem[3044] = 65'h0602280266026001F;
rommem[3045] = 65'h16023802860230027;
rommem[3046] = 65'h01600800260240029;
rommem[3047] = 65'h00220800960208015;
rommem[3048] = 65'h031FFF6B71601002A;
rommem[3049] = 65'h133FFF7E033FFF750;
rommem[3050] = 65'h033FFFD9B33FFF801;
rommem[3051] = 65'h033FFFDA333FFFD9C;
rommem[3052] = 65'h133FFFE2833FFFD9D;
rommem[3053] = 65'h10000000010060000;
rommem[3054] = 65'h100000000107FFFF8;
rommem[3055] = 65'h00000000000000000;
rommem[3056] = 65'h167EF80000FEF0008;
rommem[3057] = 65'h1460F5F70660F1088;
rommem[3058] = 65'h167EF80000FEF0008;
rommem[3059] = 65'h06000141860001417;
rommem[3060] = 65'h06400104C6000141A;
rommem[3061] = 65'h1EE800040E6800020;
rommem[3062] = 65'h031FFF011040D0809;
rommem[3063] = 65'h09A00F6B89A00F6B8;
rommem[3064] = 65'h14600DF6831FFFD81;
rommem[3065] = 65'h04600DF70660090D0;
rommem[3066] = 65'h1660090F80E109000;
rommem[3067] = 65'h1041D0405E6804000;
rommem[3068] = 65'h131FFF905660090D8;
rommem[3069] = 65'h0460190D0460090D8;
rommem[3070] = 65'h1E080000004118405;
rommem[3071] = 65'h09A00F76031FFFCCC;
rommem[3072] = 65'h0660010A831FFFD81;
rommem[3073] = 65'h16600109066001098;
rommem[3074] = 65'h09A00F76E460F5F70;
rommem[3075] = 65'h1E040003E31FFFD81;
rommem[3076] = 65'h131FFFD5E31FFFC1A;
rommem[3077] = 65'h19A04111B02860009;
rommem[3078] = 65'h131FFFD5531FFFD3E;
rommem[3079] = 65'h1AC1003FFBE101708;
rommem[3080] = 65'h0BE007F2A9A00F78C;
rommem[3081] = 65'h160817FFE02110009;
rommem[3082] = 65'h160817FFF06211001;
rommem[3083] = 65'h131FFFC4E0E840002;
rommem[3084] = 65'h1BE1001C802968009;
rommem[3085] = 65'h031FFFC62E0400000;
rommem[3086] = 65'h0BE900108BE100049;
rommem[3087] = 65'h102D1000902908009;
rommem[3088] = 65'h131FFFC6B460190D0;
rommem[3089] = 65'h102D48009660110D0;
rommem[3090] = 65'h1660690D0BE00006A;
rommem[3091] = 65'h002C0800902D48009;
rommem[3092] = 65'h1A41FDE0304140404;
rommem[3093] = 65'h002B50009460590D0;
rommem[3094] = 65'h0460090D804B0AC02;
rommem[3095] = 65'h19A00F867BEB08064;
rommem[3096] = 65'h1660590D033FFFC0A;
rommem[3097] = 65'h102B1000902A08009;
rommem[3098] = 65'h031FFFC7102918009;
rommem[3099] = 65'h002D1000902808009;
rommem[3100] = 65'h131FFFC6B02C18009;
rommem[3101] = 65'h1D453494CBE0079AA;
rommem[3102] = 65'h152D7454EC4414F4C;
rommem[3103] = 65'h0454EC5564153CE55;
rommem[3104] = 65'h047C649D4454CD458;
rommem[3105] = 65'h0C255534F47CF544F;
rommem[3106] = 65'h14552CE5255544552;
rommem[3107] = 65'h055504E49D24F46CD;
rommem[3108] = 65'h14F50D44E495250D4;
rommem[3109] = 65'h0C8454B4F50C3454B;
rommem[3110] = 65'h14B4F50D7454B4F50;
rommem[3111] = 65'h1C55942D04F5453C5;
rommem[3112] = 65'h04C43D34C43D35953;
rommem[3113] = 65'h1455000C6434452D2;
rommem[3114] = 65'h0C84B454550C34B45;
rommem[3115] = 65'h0454550D74B454550;
rommem[3116] = 65'h053D34241C44E52CB;
rommem[3117] = 65'h05400D25355C55A49;
rommem[3118] = 65'h03E00D045545300CF;
rommem[3119] = 65'h1BCBD3CBDBEBE3CBD;
rommem[3120] = 65'h000D24F00C44E4100;
rommem[3121] = 65'h1FFFFFFFFFFFFE440;
rommem[3122] = 65'h0FFFFFFFFFFFFE784;
rommem[3123] = 65'h0FFFFFFFFFFFFE38C;
rommem[3124] = 65'h0FFFFFFFFFFFFE3A4;
rommem[3125] = 65'h0FFFFFFFFFFFFE830;
rommem[3126] = 65'h0FFFFFFFFFFFFE610;
rommem[3127] = 65'h0FFFFFFFFFFFFE76C;
rommem[3128] = 65'h0FFFFFFFFFFFFE680;
rommem[3129] = 65'h0FFFFFFFFFFFFE3EC;
rommem[3130] = 65'h0FFFFFFFFFFFFE520;
rommem[3131] = 65'h1FFFFFFFFFFFFE55C;
rommem[3132] = 65'h1FFFFFFFFFFFFE688;
rommem[3133] = 65'h0FFFFFFFFFFFFE594;
rommem[3134] = 65'h0FFFFFFFFFFFFE6B0;
rommem[3135] = 65'h0FFFFFFFFFFFFE488;
rommem[3136] = 65'h1FFFFFFFFFFFFE944;
rommem[3137] = 65'h0FFFFFFFFFFFFE970;
rommem[3138] = 65'h1FFFFFFFFFFFFE99C;
rommem[3139] = 65'h0FFFFFFFFFFFFE910;
rommem[3140] = 65'h1FFFFFFFFFFFFE39C;
rommem[3141] = 65'h0FFFFFFFFFFFFDF64;
rommem[3142] = 65'h0FFFFFFFFFFFFE9C8;
rommem[3143] = 65'h0FFFFFFFFFFFFF690;
rommem[3144] = 65'h0FFFFFFFFFFFFE40C;
rommem[3145] = 65'h1FFFFFFFFFFFFF6A4;
rommem[3146] = 65'h1FFFFFFFFFFFFE764;
rommem[3147] = 65'h0FFFFFFFFFFFFEE44;
rommem[3148] = 65'h1FFFFFFFFFFFFEE58;
rommem[3149] = 65'h0FFFFFFFFFFFFEE6C;
rommem[3150] = 65'h1FFFFFFFFFFFFEE34;
rommem[3151] = 65'h0FFFFFFFFFFFFEE9C;
rommem[3152] = 65'h0FFFFFFFFFFFFEF34;
rommem[3153] = 65'h0FFFFFFFFFFFFEF54;
rommem[3154] = 65'h1FFFFFFFFFFFFEE80;
rommem[3155] = 65'h0FFFFFFFFFFFFEC58;
rommem[3156] = 65'h1FFFFFFFFFFFFE5AC;
rommem[3157] = 65'h0FFFFFFFFFFFFF024;
rommem[3158] = 65'h1FFFFFFFFFFFFE5C0;
rommem[3159] = 65'h0FFFFFFFFFFFFE5C8;
rommem[3160] = 65'h1FFFFFFFFFFFFEAD8;
rommem[3161] = 65'h1FFFFFFFFFFFFEAE8;
rommem[3162] = 65'h0FFFFFFFFFFFFEAF8;
rommem[3163] = 65'h0FFFFFFFFFFFFEB18;
rommem[3164] = 65'h1FFFFFFFFFFFFEB08;
rommem[3165] = 65'h0FFFFFFFFFFFFEB28;
rommem[3166] = 65'h0FFFFFFFFFFFFEB50;
rommem[3167] = 65'h1FFFFFFFFFFFFEA44;
rommem[3168] = 65'h0FFFFFFFFFFFFEA54;
rommem[3169] = 65'h1FFFFFFFFFFFFEA0C;
rommem[3170] = 65'h0FFFFFFFFFFFFEA1C;
rommem[3171] = 65'h09A0561889A04E0EC;
rommem[3172] = 65'h131FFFD5503F58009;
rommem[3173] = 65'h00285800902BF8009;
rommem[3174] = 65'h04A808000E0C00000;
rommem[3175] = 65'h14A9100000A840001;
rommem[3176] = 65'h002B40009BE200069;
rommem[3177] = 65'h1BE1181C8BE0001EA;
rommem[3178] = 65'h1BE2081081421007F;
rommem[3179] = 65'h002B400090AA50008;
rommem[3180] = 65'h00A948001E0C00000;
rommem[3181] = 65'h1BE107FC34090FFFF;
rommem[3182] = 65'h0E0C0002EBE007E2A;
rommem[3183] = 65'h04090FFFF0A948001;
rommem[3184] = 65'h146A58000BE107DA3;
rommem[3185] = 65'h131FFFBFB34B00000;
rommem[3186] = 65'h0660090D04600DF68;
rommem[3187] = 65'h031FFFBFB31FFF905;
rommem[3188] = 65'h031FFFBFBBE00632A;
rommem[3189] = 65'h16604109046045F68;
rommem[3190] = 65'h04600909031FFF905;
rommem[3191] = 65'h1E0400000BE106268;
rommem[3192] = 65'h031FFFC5202848009;
rommem[3193] = 65'h0BE900049BE100069;
rommem[3194] = 65'h066049090BE0061AA;
rommem[3195] = 65'h031FFFD779A940002;
rommem[3196] = 65'h19A0561B09A04E0FE;
rommem[3197] = 65'h131FFFA7CBE0079CA;
rommem[3198] = 65'h131FFFBFB02128009;
rommem[3199] = 65'h131FFFC4E02508009;
rommem[3200] = 65'h09A00F833BE107EA9;
rommem[3201] = 65'h031FFF905BE00610A;
rommem[3202] = 65'h00FEF0010BE00084A;
rommem[3203] = 65'h067EF800867E30000;
rommem[3204] = 65'h1460090D8E1800800;
rommem[3205] = 65'h10810800866100000;
rommem[3206] = 65'h047EF8008BE037FCF;
rommem[3207] = 65'h137EF801047E30000;
rommem[3208] = 65'h10212800931FFFD3E;
rommem[3209] = 65'h10250800931FFFBFB;
rommem[3210] = 65'h1BE10004931FFFC4E;
rommem[3211] = 65'h002908009BE905D68;
rommem[3212] = 65'h00214800931FFFD1E;
rommem[3213] = 65'h1BE10008831FFFD77;
rommem[3214] = 65'h031FFFD77B2100313;
rommem[3215] = 65'h0E0400000BE107FE8;
rommem[3216] = 65'h1BE007E8A31FFFC52;
rommem[3217] = 65'h1E0C0003A1602800B;
rommem[3218] = 65'h031FFFD309A0264A0;
rommem[3219] = 65'h1BE007A0A31FFF135;
rommem[3220] = 65'h09A0264B4E0C0000D;
rommem[3221] = 65'h031FFF13531FFFD30;
rommem[3222] = 65'h1E0C00023BE00782A;
rommem[3223] = 65'h031FFFD309A0264CC;
rommem[3224] = 65'h00410140931FFFA7C;
rommem[3225] = 65'h1E0C00024BE00012A;
rommem[3226] = 65'h031FFFD309A0264E4;
rommem[3227] = 65'h131FFF7D531FFFA7C;
rommem[3228] = 65'h131FFFCA9BE00006A;
rommem[3229] = 65'h1E0C0002CBE00010A;
rommem[3230] = 65'h131FFFD309A026500;
rommem[3231] = 65'h1BE007DCA31FFFBEC;
rommem[3232] = 65'h0BE0000AA31FFF135;
rommem[3233] = 65'h00450080931FFFA7C;
rommem[3234] = 65'h1BE007ECA31FFFCCC;
rommem[3235] = 65'h133FFFC0931FFFBEC;
rommem[3236] = 65'h031FFFA7C31FFFC80;
rommem[3237] = 65'h0BE10006931FFFC4E;
rommem[3238] = 65'h0BE0057AA9A00F833;
rommem[3239] = 65'h167E400000DEF0018;
rommem[3240] = 65'h167E0800846009090;
rommem[3241] = 65'h067E0801046009098;
rommem[3242] = 65'h0660F1098660010A8;
rommem[3243] = 65'h131FFFBFBBE0073EA;
rommem[3244] = 65'h1BE10006946009098;
rommem[3245] = 65'h0BE0055EA9A00F850;
rommem[3246] = 65'h147E08010021F0009;
rommem[3247] = 65'h047E0800866009098;
rommem[3248] = 65'h047E4000066009090;
rommem[3249] = 65'h131FFFC7309EF0018;
rommem[3250] = 65'h031FFFC80BE007C4A;
rommem[3251] = 65'h0660090A831FFFBDA;
rommem[3252] = 65'h09A0562A09A04E16F;
rommem[3253] = 65'h031FFFA7C33FFF8C8;
rommem[3254] = 65'h19A04E172660090B8;
rommem[3255] = 65'h033FFF8C89A0562B0;
rommem[3256] = 65'h1BE00004A31FFFA7C;
rommem[3257] = 65'h0660090B0E0400001;
rommem[3258] = 65'h1660110C046011090;
rommem[3259] = 65'h005E00C09660410C8;
rommem[3260] = 65'h0BE00004A460310A8;
rommem[3261] = 65'h0463100000A318028;
rommem[3262] = 65'h1BE237FA9BE2000E8;
rommem[3263] = 65'h10A31002804300409;
rommem[3264] = 65'h031FFFC7105E00C09;
rommem[3265] = 65'h1BE00786A09EF0028;
rommem[3266] = 65'h031FFFB2EE0400000;
rommem[3267] = 65'h09A00F80FBE100069;
rommem[3268] = 65'h102148009BE00504A;
rommem[3269] = 65'h1BE100069460090A8;
rommem[3270] = 65'h0BE004FAA9A00F7FC;
rommem[3271] = 65'h031FFFC73BE148068;
rommem[3272] = 65'h046908000BE007F4A;
rommem[3273] = 65'h004110403460110B0;
rommem[3274] = 65'h1460190B866908000;
rommem[3275] = 65'h1BE1180E0BE200063;
rommem[3276] = 65'h0BE1180A3BE00004A;
rommem[3277] = 65'h166041090460410C0;
rommem[3278] = 65'h0BE00752A460410C8;
rommem[3279] = 65'h1BE0074EA31FFFC73;
rommem[3280] = 65'h1BE106AC931FFFA7C;
rommem[3281] = 65'h0E040000002848009;
rommem[3282] = 65'h1BE104B8331FFFC63;
rommem[3283] = 65'h1460F10A0BE0069EA;
rommem[3284] = 65'h16604109047E40010;
rommem[3285] = 65'h10BEF002847E40008;
rommem[3286] = 65'h067E280200FEF0028;
rommem[3287] = 65'h031FFFCA967E40000;
rommem[3288] = 65'h1E0400001BE0000CA;
rommem[3289] = 65'h1BE1003E831FFFB2E;
rommem[3290] = 65'h1BE0001AA02150009;
rommem[3291] = 65'h1E040000167E40008;
rommem[3292] = 65'h1BE10006931FFFB2E;
rommem[3293] = 65'h0BE0049EA9A00F7DF;
rommem[3294] = 65'h04082800002150009;
rommem[3295] = 65'h047E0800860800000;
rommem[3296] = 65'h06082800031FFFC93;
rommem[3297] = 65'h14600909067E40008;
rommem[3298] = 65'h0E07FFFFF67E08010;
rommem[3299] = 65'h1660F10A066009090;
rommem[3300] = 65'h0E040003A67E50018;
rommem[3301] = 65'h19A04111B31FFFC1A;
rommem[3302] = 65'h147E5001831FFFA7C;
rommem[3303] = 65'h047E0801066A08000;
rommem[3304] = 65'h147E4000866009090;
rommem[3305] = 65'h19A026758E0C0002C;
rommem[3306] = 65'h1BE007B2A31FFFD30;
rommem[3307] = 65'h109EF002847E28020;
rommem[3308] = 65'h04080800033FFF946;
rommem[3309] = 65'h031FFFBDAB01F6C0D;
rommem[3310] = 65'h19A026518E0C0002C;
rommem[3311] = 65'h0BE007F8A31FFFD30;
rommem[3312] = 65'h146045F68BE006CCA;
rommem[3313] = 65'h131FFF7D7E040000D;
rommem[3314] = 65'h0BE107FE231FFF7D8;
rommem[3315] = 65'h0B0100D1AB0100E40;
rommem[3316] = 65'h031FFF9F6B21FFC3A;
rommem[3317] = 65'h00610900160808000;
rommem[3318] = 65'h00A84000260808001;
rommem[3319] = 65'h0BE107FE231FFF7D8;
rommem[3320] = 65'h10A84000160808000;
rommem[3321] = 65'h1BE007E2AB21FFC0D;
rommem[3322] = 65'h0BE00418A660410D0;
rommem[3323] = 65'h167E280000FEF0018;
rommem[3324] = 65'h167EF801067E30008;
rommem[3325] = 65'h0E1400000E1800003;
rommem[3326] = 65'h0BE107FE231FFF7D8;
rommem[3327] = 65'h10652880031FFFA07;
rommem[3328] = 65'h1BE037F6F04509409;
rommem[3329] = 65'h147EF801002508009;
rommem[3330] = 65'h147E2800047E30008;
rommem[3331] = 65'h0A410023937EF8018;
rommem[3332] = 65'h10E1080300E108007;
rommem[3333] = 65'h137EF80001410800F;
rommem[3334] = 65'h0460490D046045F68;
rommem[3335] = 65'h0BE8481C531FFFA23;
rommem[3336] = 65'h031FFF7D7E040003A;
rommem[3337] = 65'h14A8100014A808000;
rommem[3338] = 65'h10411040906211000;
rommem[3339] = 65'h031FFFA2B0A840002;
rommem[3340] = 65'h00A84000140808000;
rommem[3341] = 65'h031FFF7D7B01FF40D;
rommem[3342] = 65'h1E0400040BE007F8A;
rommem[3343] = 65'h031FFFA2331FFF7D7;
rommem[3344] = 65'h131FFF7D7E040001A;
rommem[3345] = 65'h00FEF0008BE003BEA;
rommem[3346] = 65'h0E040000D67EF8000;
rommem[3347] = 65'h0E040000A31FFF7D7;
rommem[3348] = 65'h047EF800031FFF7D7;
rommem[3349] = 65'h10DEF001037EF8008;
rommem[3350] = 65'h067E2800867EF8000;
rommem[3351] = 65'h1021200099A02910F;
rommem[3352] = 65'h10642080102408009;
rommem[3353] = 65'h06050800031FFFA3F;
rommem[3354] = 65'h1125091000E528001;
rommem[3355] = 65'h10A528001BE107F41;
rommem[3356] = 65'h031FFF7D740508000;
rommem[3357] = 65'h0BE107F801250910F;
rommem[3358] = 65'h047EF800047E28008;
rommem[3359] = 65'h01410800F37EF8010;
rommem[3360] = 65'h008108007A010020A;
rommem[3361] = 65'h137EF80000A108030;
rommem[3362] = 65'h031FFFA7C0FEF0008;
rommem[3363] = 65'h19A02693CE0C0002C;
rommem[3364] = 65'h167E0800031FFFD30;
rommem[3365] = 65'h047E1000031FFFA7C;
rommem[3366] = 65'h10BEF000860208000;
rommem[3367] = 65'h19A00F778BE005F0A;
rommem[3368] = 65'h00FEF0008BE00374A;
rommem[3369] = 65'h0E0C0002C31FFFA7C;
rommem[3370] = 65'h131FFFD309A02693C;
rommem[3371] = 65'h131FFFA7C67E08000;
rommem[3372] = 65'h16220800047E10000;
rommem[3373] = 65'h033FFF9460BEF0008;
rommem[3374] = 65'h031FFFA7C0FEF0008;
rommem[3375] = 65'h19A02693CE0C0002C;
rommem[3376] = 65'h167E0800031FFFD30;
rommem[3377] = 65'h047E1000031FFFA7C;
rommem[3378] = 65'h00BEF000864208000;
rommem[3379] = 65'h10FEF000833FFF946;
rommem[3380] = 65'h0E0C0002C31FFFA7C;
rommem[3381] = 65'h131FFFD309A02693C;
rommem[3382] = 65'h131FFFA7C67E08000;
rommem[3383] = 65'h06620800047E10000;
rommem[3384] = 65'h033FFF9460BEF0008;
rommem[3385] = 65'h031FFFA7C0FEF0008;
rommem[3386] = 65'h19A00F7CDBE100069;
rommem[3387] = 65'h167E40000BE00328A;
rommem[3388] = 65'h147E40000341F8000;
rommem[3389] = 65'h1BE00596A0BEF0008;
rommem[3390] = 65'h167EF80000FEF0010;
rommem[3391] = 65'h067E0800431FFFA8A;
rommem[3392] = 65'h19A0563089A04E185;
rommem[3393] = 65'h031FFFA8A33FFF8C8;
rommem[3394] = 65'h10411040947E10008;
rommem[3395] = 65'h147E08008BE007F2A;
rommem[3396] = 65'h037EF801047EF8000;
rommem[3397] = 65'h167EF80000FEF0010;
rommem[3398] = 65'h167E0800831FFFAAF;
rommem[3399] = 65'h19A0562F89A04E181;
rommem[3400] = 65'h131FFFAAF33FFF8C8;
rommem[3401] = 65'h00411040847E10008;
rommem[3402] = 65'h147E08008BE007F2A;
rommem[3403] = 65'h037EF801047EF8000;
rommem[3404] = 65'h1A6100339A0100430;
rommem[3405] = 65'h037EF8000E0400001;
rommem[3406] = 65'h137EF8000E0400000;
rommem[3407] = 65'h1A410035AA0100641;
rommem[3408] = 65'h1A610037AA0100461;
rommem[3409] = 65'h037EF8000E0400001;
rommem[3410] = 65'h137EF8000E0400000;
rommem[3411] = 65'h167EF80000FEF0008;
rommem[3412] = 65'h131FFFA9804100809;
rommem[3413] = 65'h004200409BE100069;
rommem[3414] = 65'h047EF800031FFFA9E;
rommem[3415] = 65'h00FEF001037EF8008;
rommem[3416] = 65'h031FFFADE67EF8000;
rommem[3417] = 65'h19A04E17767E08008;
rommem[3418] = 65'h133FFF8C89A0562C0;
rommem[3419] = 65'h031FFFAD747E08008;
rommem[3420] = 65'h1BE0002AABE208321;
rommem[3421] = 65'h031FFFAD747E08008;
rommem[3422] = 65'h1BE00022ABE2082A9;
rommem[3423] = 65'h031FFFAD747E08008;
rommem[3424] = 65'h1BE0001AABE208223;
rommem[3425] = 65'h031FFFAD747E08008;
rommem[3426] = 65'h0BE00012ABE2081A2;
rommem[3427] = 65'h031FFFAD747E08008;
rommem[3428] = 65'h1BE0000AABE208128;
rommem[3429] = 65'h031FFFAD747E08008;
rommem[3430] = 65'h1BE00002ABE2080A0;
rommem[3431] = 65'h0E040000047EF8000;
rommem[3432] = 65'h047EF800037EF8010;
rommem[3433] = 65'h137EF8010E0400001;
rommem[3434] = 65'h147EF800047E08008;
rommem[3435] = 65'h00FEF001037EF8010;
rommem[3436] = 65'h167E0800867EF8000;
rommem[3437] = 65'h047E1000831FFFADE;
rommem[3438] = 65'h037EF801047EF8000;
rommem[3439] = 65'h167EF80000FEF0010;
rommem[3440] = 65'h09A026B98E0C0002D;
rommem[3441] = 65'h0E040000031FFFD30;
rommem[3442] = 65'h0BE00020A67E00008;
rommem[3443] = 65'h09A026BA4E0C0002B;
rommem[3444] = 65'h031FFFAFB31FFFD30;
rommem[3445] = 65'h1E0C0002B67E08008;
rommem[3446] = 65'h131FFFD309A026BC8;
rommem[3447] = 65'h147E1000831FFFAFB;
rommem[3448] = 65'h1BE007F2A04110402;
rommem[3449] = 65'h09A026BE0E0C0002D;
rommem[3450] = 65'h031FFFAFB31FFFD30;
rommem[3451] = 65'h0BE007F0A02108006;
rommem[3452] = 65'h147EF800047E08008;
rommem[3453] = 65'h00FEF001037EF8010;
rommem[3454] = 65'h131FFFB1167EF8000;
rommem[3455] = 65'h0E0C0002A67E08008;
rommem[3456] = 65'h131FFFD309A026C18;
rommem[3457] = 65'h147E1000831FFFB11;
rommem[3458] = 65'h1BE007F2A04110419;
rommem[3459] = 65'h09A026C38E0C0002F;
rommem[3460] = 65'h031FFFB1131FFFD30;
rommem[3461] = 65'h047E0800804100809;
rommem[3462] = 65'h1BE007E2A0411041B;
rommem[3463] = 65'h147EF800047E08008;
rommem[3464] = 65'h10FEF001837EF8010;
rommem[3465] = 65'h09A04E14E67EF8000;
rommem[3466] = 65'h033FFF8C89A056258;
rommem[3467] = 65'h031FFFB2EE0400000;
rommem[3468] = 65'h046108000BE100088;
rommem[3469] = 65'h137EF801847EF8000;
rommem[3470] = 65'h1BE20004931FFFD3E;
rommem[3471] = 65'h047EF800031FFFB21;
rommem[3472] = 65'h10FEF000837EF8018;
rommem[3473] = 65'h0E0C0002867EF8000;
rommem[3474] = 65'h031FFFD309A026CB0;
rommem[3475] = 65'h0E0C0002931FFFA7C;
rommem[3476] = 65'h031FFFD309A026CB0;
rommem[3477] = 65'h037EF800847EF8000;
rommem[3478] = 65'h0BE001BAA9A00F6F5;
rommem[3479] = 65'h067EF80000FEF0018;
rommem[3480] = 65'h10410140967E28008;
rommem[3481] = 65'h14A80800031FFFD55;
rommem[3482] = 65'h0B2100F40A0101740;
rommem[3483] = 65'h131FFFB210A840001;
rommem[3484] = 65'h10FEF001806108600;
rommem[3485] = 65'h167EF800067E08008;
rommem[3486] = 65'h147EF800031FFFBD5;
rommem[3487] = 65'h1BE20804447E10008;
rommem[3488] = 65'h19A0090D833FFFC07;
rommem[3489] = 65'h0BE0000AA04110405;
rommem[3490] = 65'h1BE10006831FFFB4F;
rommem[3491] = 65'h131FFFB7502510009;
rommem[3492] = 65'h047EF800047E28008;
rommem[3493] = 65'h147E2800837EF8018;
rommem[3494] = 65'h0E040000047EF8000;
rommem[3495] = 65'h00FEF001837EF8018;
rommem[3496] = 65'h067E2801067EF8000;
rommem[3497] = 65'h167E0800840808000;
rommem[3498] = 65'h1BE10038831FFFA9E;
rommem[3499] = 65'h00A840001E1400005;
rommem[3500] = 65'h031FFFAA640808000;
rommem[3501] = 65'h047E08008BE100168;
rommem[3502] = 65'h04081000006109000;
rommem[3503] = 65'h067E0800804110409;
rommem[3504] = 65'h00A840001BE02FEEF;
rommem[3505] = 65'h031FFFAA640808000;
rommem[3506] = 65'h140808000BE107FA9;
rommem[3507] = 65'h0B0100324B0100425;
rommem[3508] = 65'h00E840001E0400000;
rommem[3509] = 65'h047E100080A840001;
rommem[3510] = 65'h10411040906211000;
rommem[3511] = 65'h047E2801047EF8000;
rommem[3512] = 65'h147EF800037EF8018;
rommem[3513] = 65'h0E040000047E28010;
rommem[3514] = 65'h10FEF001037EF8018;
rommem[3515] = 65'h167E3800867EF8000;
rommem[3516] = 65'h046338000460190D8;
rommem[3517] = 65'h0BE138128BE700108;
rommem[3518] = 65'h0460390F808318008;
rommem[3519] = 65'h1E07FF748BE33FF60;
rommem[3520] = 65'h0BE00112AF04FFFFF;
rommem[3521] = 65'h166308000BE2000C8;
rommem[3522] = 65'h047EF80000A308008;
rommem[3523] = 65'h137EF801047E38008;
rommem[3524] = 65'h147E3800847EF8000;
rommem[3525] = 65'h1E04000000BEF0010;
rommem[3526] = 65'h131FFFB2137EF8000;
rommem[3527] = 65'h147EF80004A108000;
rommem[3528] = 65'h131FFFB2137EF8018;
rommem[3529] = 65'h14C1080001410FFFE;
rommem[3530] = 65'h137EF801847EF8000;
rommem[3531] = 65'h11410FFFC31FFFB21;
rommem[3532] = 65'h047EF80004E108000;
rommem[3533] = 65'h131FFFB2137EF8018;
rommem[3534] = 65'h1461080001410FFF8;
rommem[3535] = 65'h137EF801847EF8000;
rommem[3536] = 65'h067E4000831FFFB21;
rommem[3537] = 65'h0342F800046011028;
rommem[3538] = 65'h147EF800047E40008;
rommem[3539] = 65'h131FFFB2137EF8018;
rommem[3540] = 65'h1BE100100BE100168;
rommem[3541] = 65'h10000005004100809;
rommem[3542] = 65'h031FFFBB7020088A8;
rommem[3543] = 65'h147EF80000A108001;
rommem[3544] = 65'h19A00F7B937EF8018;
rommem[3545] = 65'h100000050BE000B0A;
rommem[3546] = 65'h047EF8000020088A8;
rommem[3547] = 65'h10FEF002037EF8018;
rommem[3548] = 65'h167E2800867E18000;
rommem[3549] = 65'h067E3801867E30010;
rommem[3550] = 65'h10452940A1603803F;
rommem[3551] = 65'h1061082020463180A;
rommem[3552] = 65'h10663020014118001;
rommem[3553] = 65'h11410FFFE04619809;
rommem[3554] = 65'h104611805BE230047;
rommem[3555] = 65'h102608009BE03FF2F;
rommem[3556] = 65'h147E2800847E18000;
rommem[3557] = 65'h047E3801847E30010;
rommem[3558] = 65'h031FFFB2137EF8020;
rommem[3559] = 65'h047EF800002108007;
rommem[3560] = 65'h131FFFB2137EF8018;
rommem[3561] = 65'h047EF800002108008;
rommem[3562] = 65'h0460090D837EF8018;
rommem[3563] = 65'h004110405460110D0;
rommem[3564] = 65'h137EF801847EF8000;
rommem[3565] = 65'h167EF80000FEF0010;
rommem[3566] = 65'h131FFFB2EE0400001;
rommem[3567] = 65'h19A00F7A2BE100069;
rommem[3568] = 65'h167E08008BE00054A;
rommem[3569] = 65'h19A026FACE0C0003D;
rommem[3570] = 65'h031FFFA7C31FFFD30;
rommem[3571] = 65'h16620800047E10008;
rommem[3572] = 65'h147EF800004200409;
rommem[3573] = 65'h0BE0003CA37EF8010;
rommem[3574] = 65'h167EF80000FEF0008;
rommem[3575] = 65'h09A026FCCE0C0003A;
rommem[3576] = 65'h10BEF000831FFFD30;
rommem[3577] = 65'h1E0C0000DBE0020AA;
rommem[3578] = 65'h131FFFD309A026FE4;
rommem[3579] = 65'h10BEF000847EF8000;
rommem[3580] = 65'h047EF8000BE001EAA;
rommem[3581] = 65'h00FEF000837EF8008;
rommem[3582] = 65'h131FFFD5567EF8000;
rommem[3583] = 65'h1B010040D40808000;
rommem[3584] = 65'h1F04FFFFFE07FF87C;
rommem[3585] = 65'h047EF800033FFFC0A;
rommem[3586] = 65'h09A00F86737EF8008;
rommem[3587] = 65'h09A00F6FDBE00008A;
rommem[3588] = 65'h19A00F6F5BE00004A;
rommem[3589] = 65'h14600909031FFFD81;
rommem[3590] = 65'h1B01D9AFFBE107EA8;
rommem[3591] = 65'h16080000040828000;
rommem[3592] = 65'h131FFFD1E46009090;
rommem[3593] = 65'h16082800004101809;
rommem[3594] = 65'h131FFF7D5E040003F;
rommem[3595] = 65'h10E608001E0800000;
rommem[3596] = 65'h133FFF80131FFFC93;
rommem[3597] = 65'h167EF80000FEF0010;
rommem[3598] = 65'h031FFF7D567E28008;
rommem[3599] = 65'h060009052E0400001;
rommem[3600] = 65'h031FFF7D5E0400020;
rommem[3601] = 65'h1F2000000E200111B;
rommem[3602] = 65'h0BE107FE831FFFD77;
rommem[3603] = 65'h0B0101418B0100B08;
rommem[3604] = 65'h0A81FFB20B010020D;
rommem[3605] = 65'h00884000160808000;
rommem[3606] = 65'h14080FFFF31FFF7D5;
rommem[3607] = 65'h01280916AB010190D;
rommem[3608] = 65'h1E0400008BE107E80;
rommem[3609] = 65'h0E040002031FFF7D5;
rommem[3610] = 65'h11280911B31FFF7D5;
rommem[3611] = 65'h1E0400008BE107DC2;
rommem[3612] = 65'h00C84000131FFF7D5;
rommem[3613] = 65'h004800409BE007D4A;
rommem[3614] = 65'h0BE5001080E12911B;
rommem[3615] = 65'h031FFF7D5E0400008;
rommem[3616] = 65'h031FFF7D5E0400020;
rommem[3617] = 65'h031FFF7D5E0400008;
rommem[3618] = 65'h19A04111BBE02FF4F;
rommem[3619] = 65'h0E0400000BE007BCA;
rommem[3620] = 65'h1E040000A60009052;
rommem[3621] = 65'h147EF800031FFF7D5;
rommem[3622] = 65'h037EF801047E28008;
rommem[3623] = 65'h19A00F78CAC1003FF;
rommem[3624] = 65'h14604DF68BE00774A;
rommem[3625] = 65'h10EA50001460510D0;
rommem[3626] = 65'h04A918000BE950127;
rommem[3627] = 65'h0062110004A910001;
rommem[3628] = 65'h0BE11012704218809;
rommem[3629] = 65'h10410840ABE1100C8;
rommem[3630] = 65'h00494A40A37EF8000;
rommem[3631] = 65'h137EF80000410840A;
rommem[3632] = 65'h037EF8000E0400001;
rommem[3633] = 65'h14A9100000A948002;
rommem[3634] = 65'h0B22FFE0D0A948001;
rommem[3635] = 65'h040120000BE007D8A;
rommem[3636] = 65'h00810800160220000;
rommem[3637] = 65'h1BE11FF8908210001;
rommem[3638] = 65'h00C10800137EF8000;
rommem[3639] = 65'h0401200000C210001;
rommem[3640] = 65'h1BE11FF8960220000;
rommem[3641] = 65'h147E0800037EF8000;
rommem[3642] = 65'h1BE100148660090A8;
rommem[3643] = 65'h0660090C847E08020;
rommem[3644] = 65'h0660090C047E08018;
rommem[3645] = 65'h1660090B847E08010;
rommem[3646] = 65'h0660090B047E08008;
rommem[3647] = 65'h137EF800837EF8028;
rommem[3648] = 65'h00A108028460090F8;
rommem[3649] = 65'h1460090A8BFE0F0A4;
rommem[3650] = 65'h10FEF0028BE100188;
rommem[3651] = 65'h1460090C867E08000;
rommem[3652] = 65'h1460090C067E08020;
rommem[3653] = 65'h0460090B867E08018;
rommem[3654] = 65'h0460090B067E08010;
rommem[3655] = 65'h137EF800067E08008;
rommem[3656] = 65'h167E080000FEF0008;
rommem[3657] = 65'h10FEF002037EF8000;
rommem[3658] = 65'h167E2800867E28000;
rommem[3659] = 65'h167EF801867E38010;
rommem[3660] = 65'h00223000902128009;
rommem[3661] = 65'h10A5280014A538000;
rommem[3662] = 65'h102708009BE7300C8;
rommem[3663] = 65'h0B27FFB0D31FFF7D5;
rommem[3664] = 65'h131FFF7D5E040000A;
rommem[3665] = 65'h10250800902710009;
rommem[3666] = 65'h147E3801047EF8018;
rommem[3667] = 65'h147E2800047E28008;
rommem[3668] = 65'h00FEF000837EF8020;
rommem[3669] = 65'h0E0C0002267EF8000;
rommem[3670] = 65'h131FFFD309A0272D4;
rommem[3671] = 65'h104800409E0800022;
rommem[3672] = 65'h00410200931FFFC93;
rommem[3673] = 65'h10BEF0008B2200D0A;
rommem[3674] = 65'h1E0C00027BE00072A;
rommem[3675] = 65'h131FFFD309A0272E8;
rommem[3676] = 65'h0BE007ECAE0800027;
rommem[3677] = 65'h09A027308E0C0005F;
rommem[3678] = 65'h1E040000D31FFFD30;
rommem[3679] = 65'h147EF800031FFF7D5;
rommem[3680] = 65'h035F000040BEF0008;
rommem[3681] = 65'h037EF800847EF8000;
rommem[3682] = 65'h167EF80000FEF0008;
rommem[3683] = 65'h031FFF7D5E040000D;
rommem[3684] = 65'h131FFF7D5E040000A;
rommem[3685] = 65'h037EF800847EF8000;
rommem[3686] = 65'h167E180000FEF0028;
rommem[3687] = 65'h067E3001067E28008;
rommem[3688] = 65'h167EF802067E38018;
rommem[3689] = 65'h1021300099A039100;
rommem[3690] = 65'h1BE10006302228009;
rommem[3691] = 65'h10E52800102108006;
rommem[3692] = 65'h10411881C1601800A;
rommem[3693] = 65'h00A2100301E10800A;
rommem[3694] = 65'h10A73800160710000;
rommem[3695] = 65'h1BE107F490E528001;
rommem[3696] = 65'h1E0400020BE500082;
rommem[3697] = 65'h0BE02FFCF31FFF7D5;
rommem[3698] = 65'h1E040002DBE600061;
rommem[3699] = 65'h10E73800131FFF7D5;
rommem[3700] = 65'h031FFF7D540708000;
rommem[3701] = 65'h0BE107F8712709100;
rommem[3702] = 65'h147E3801847EF8020;
rommem[3703] = 65'h047E2800847E30010;
rommem[3704] = 65'h037EF802847E18000;
rommem[3705] = 65'h167E280000FEF0028;
rommem[3706] = 65'h167E3801067E30008;
rommem[3707] = 65'h167EF802067E40018;
rommem[3708] = 65'h1041018099A039100;
rommem[3709] = 65'h002120009E1400014;
rommem[3710] = 65'h102420006BE400083;
rommem[3711] = 65'h0E20000140E528001;
rommem[3712] = 65'h11410800F02408009;
rommem[3713] = 65'h00A108037A010030A;
rommem[3714] = 65'h008108030BE00004A;
rommem[3715] = 65'h10A73800160708000;
rommem[3716] = 65'h0064208010E528001;
rommem[3717] = 65'h0BE047EAFBE400048;
rommem[3718] = 65'h1E0400020BE500082;
rommem[3719] = 65'h0BE02FFCF31FFF7D5;
rommem[3720] = 65'h0E040002DBE600063;
rommem[3721] = 65'h10E73800131FFF7D5;
rommem[3722] = 65'h031FFF7D540708000;
rommem[3723] = 65'h1BE107F8312709100;
rommem[3724] = 65'h147E4001847EF8020;
rommem[3725] = 65'h147E3000847E38010;
rommem[3726] = 65'h037EF802847E28000;
rommem[3727] = 65'h067E280000FEF0010;
rommem[3728] = 65'h10812800267EF8008;
rommem[3729] = 65'h14A517FFF4A50FFFE;
rommem[3730] = 65'h10411040906211000;
rommem[3731] = 65'h131FFFCCCE0800000;
rommem[3732] = 65'h031FFF7D5E0400020;
rommem[3733] = 65'h004500409E0800000;
rommem[3734] = 65'h047EF800831FFFC93;
rommem[3735] = 65'h137EF801047E28000;
rommem[3736] = 65'h167EF80000FEF0010;
rommem[3737] = 65'h031FFFD5567E08008;
rommem[3738] = 65'h1BE3080A840808000;
rommem[3739] = 65'h147EF800047E08008;
rommem[3740] = 65'h1344000000BEF0010;
rommem[3741] = 65'h047E080080A840001;
rommem[3742] = 65'h037EF801047EF8000;
rommem[3743] = 65'h167EF80000FEF0008;
rommem[3744] = 65'h0E040000031FFFD55;
rommem[3745] = 65'h040818000E0800000;
rommem[3746] = 65'h1AE300E39A8300F30;
rommem[3747] = 65'h1EEBFFFFFE6BFFFFF;
rommem[3748] = 65'h1040D1009F6807FFF;
rommem[3749] = 65'h19A00F721BE120066;
rommem[3750] = 65'h01A10800ABE0057CA;
rommem[3751] = 65'h11431800F0A840001;
rommem[3752] = 65'h00A21000104118403;
rommem[3753] = 65'h147EF8000BE007E2A;
rommem[3754] = 65'h00FEF000837EF8008;
rommem[3755] = 65'h04080800067E08000;
rommem[3756] = 65'h1B2100300B0100220;
rommem[3757] = 65'h1BE007F8A0A840001;
rommem[3758] = 65'h037EF800847E08000;
rommem[3759] = 65'h167EF80000FEF0008;
rommem[3760] = 65'h0E0C000009A04111B;
rommem[3761] = 65'h00A84000140808000;
rommem[3762] = 65'h0B0100622B0100D0D;
rommem[3763] = 65'h1BE307F69B0100527;
rommem[3764] = 65'h06080FFFF31FFFD73;
rommem[3765] = 65'h1BE300069BE007F0A;
rommem[3766] = 65'h0BE007EAA02118009;
rommem[3767] = 65'h1E0C00000BE30FE89;
rommem[3768] = 65'h147EF8000BE007E4A;
rommem[3769] = 65'h0A010036137EF8008;
rommem[3770] = 65'h10E108020A610027A;
rommem[3771] = 65'h10FEF000837EF8000;
rommem[3772] = 65'h031FFF7D667EF8000;
rommem[3773] = 65'h1B2100303B01003FF;
rommem[3774] = 65'h00410840A33FFF801;
rommem[3775] = 65'h037EF800847EF8000;
rommem[3776] = 65'h10FEF0010E07FF703;
rommem[3777] = 65'h067EF800867E28000;
rommem[3778] = 65'h10A52800102128009;
rommem[3779] = 65'h1BE1000684A50FFFF;
rommem[3780] = 65'h1BE007F8A31FFF7D5;
rommem[3781] = 65'h147EF800802508009;
rommem[3782] = 65'h137EF801047E28000;
rommem[3783] = 65'h067E280000FEF0010;
rommem[3784] = 65'h00212800967EF8008;
rommem[3785] = 65'h04050FFFF0A528001;
rommem[3786] = 65'h031FFF7D7BE100068;
rommem[3787] = 65'h002508009BE007F8A;
rommem[3788] = 65'h047E2800047EF8008;
rommem[3789] = 65'h133FFF07F37EF8010;
rommem[3790] = 65'h031FFEDA433FFEF07;
rommem[3791] = 65'h11410807FB01003FF;
rommem[3792] = 65'h10410840A37EF8000;
rommem[3793] = 65'h133FFED5C37EF8000;
rommem[3794] = 65'h0BE00742A31FFF011;
rommem[3795] = 65'h037EF800037EF8000;
rommem[3796] = 65'h0BE0073AA37EF8000;
rommem[3797] = 65'h1460F1088BE004C0A;
rommem[3798] = 65'h037EF800847EF8000;
rommem[3799] = 65'h0726F747061520A0D;
rommem[3800] = 65'h020796E6954203436;
rommem[3801] = 65'h13176204349534142;
rommem[3802] = 65'h0202943280A0D302E;
rommem[3803] = 65'h16F52202033313032;
rommem[3804] = 65'h06E69462074726562;
rommem[3805] = 65'h10A0D000A0A0D6863;
rommem[3806] = 65'h1616857000A0D4B4F;
rommem[3807] = 65'h1726F53000A0D3F74;
rommem[3808] = 65'h16F43000A0D2E7972;
rommem[3809] = 65'h04C4620746361706D;
rommem[3810] = 65'h16461657220485341;
rommem[3811] = 65'h00A0D726F72726520;
rommem[3812] = 65'h0207265626D754E00;
rommem[3813] = 65'h062206F6F74207369;
rommem[3814] = 65'h1766944000A0D6769;
rommem[3815] = 65'h17962206E6F697369;
rommem[3816] = 65'h1000A0D6F72657A20;
rommem[3817] = 65'h17620666F2074754F;
rommem[3818] = 65'h020656C6261697261;
rommem[3819] = 65'h0000A0D6563617073;
rommem[3820] = 65'h16620736574796220;
rommem[3821] = 65'h00A0D000A0D656572;
rommem[3822] = 65'h1000A0D7964616552;
rommem[3823] = 65'h16E69746365707845;
rommem[3824] = 65'h06D6D6F6320612067;
rommem[3825] = 65'h0656E694C000A0D61;
rommem[3826] = 65'h0207265626D756E20;
rommem[3827] = 65'h00D676962206F6F74;
rommem[3828] = 65'h0746365707845000A;
rommem[3829] = 65'h16176206120676E69;
rommem[3830] = 65'h10A0D656C62616972;
rommem[3831] = 65'h164616220444E5200;
rommem[3832] = 65'h174656D6172617020;
rommem[3833] = 65'h1535953000A0D7265;
rommem[3834] = 65'h06464612064616220;
rommem[3835] = 65'h049000A0D73736572;
rommem[3836] = 65'h1707865205455504E;
rommem[3837] = 65'h06120676E69746365;
rommem[3838] = 65'h16C62616972617620;
rommem[3839] = 65'h05458454E000A0D65;
rommem[3840] = 65'h174756F6874697720;
rommem[3841] = 65'h14E000A0D524F4620;
rommem[3842] = 65'h16570786520545845;
rommem[3843] = 65'h1206120676E697463;
rommem[3844] = 65'h02064656E69666564;
rommem[3845] = 65'h0656C626169726176;
rommem[3846] = 65'h12F4F544F47000A0D;
rommem[3847] = 65'h06162204255534F47;
rommem[3848] = 65'h16E20656E696C2064;
rommem[3849] = 65'h0000A0D7265626D75;
rommem[3850] = 65'h177204E5255544552;
rommem[3851] = 65'h1472074756F687469;
rommem[3852] = 65'h050000A0D4255534F;
rommem[3853] = 65'h069206D6172676F72;
rommem[3854] = 65'h06962206F6F742073;
rommem[3855] = 65'h172747845000A0D67;
rommem[3856] = 65'h16361726168632061;
rommem[3857] = 65'h0206E6F2073726574;
rommem[3858] = 65'h06E676920656E696C;
rommem[3859] = 65'h000000A0D6465726F;
rommem[3860] = 65'h10000000033FFF20A;
rommem[3861] = 65'h00000000000000000;
rommem[3862] = 65'h1E6AA555504002009;
rommem[3863] = 65'h1F68AAAA5EE9556AA;
rommem[3864] = 65'h166808000040D0409;
rommem[3865] = 65'h004110C0646810000;
rommem[3866] = 65'h10A840008BE3000C9;
rommem[3867] = 65'h0EE800010E6800000;
rommem[3868] = 65'h0BE307F00048D0C06;
rommem[3869] = 65'h00400200904802809;
rommem[3870] = 65'h0E6AA555546810000;
rommem[3871] = 65'h1F68AAAA5EE9556AA;
rommem[3872] = 65'h1BE3000C9042D0C06;
rommem[3873] = 65'h0E680000008840008;
rommem[3874] = 65'h1048D0C06EE800004;
rommem[3875] = 65'h0BE850389BE307EC0;
rommem[3876] = 65'h1E695AAAA04002009;
rommem[3877] = 65'h1F685555AEEAAA955;
rommem[3878] = 65'h166808000040D0409;
rommem[3879] = 65'h004110C0646810000;
rommem[3880] = 65'h008840008BE3000C9;
rommem[3881] = 65'h0EE800004E6800000;
rommem[3882] = 65'h0BE307F00048D0C06;
rommem[3883] = 65'h10400200904802C09;
rommem[3884] = 65'h0E695AAAA46810000;
rommem[3885] = 65'h1F685555AEEAAA955;
rommem[3886] = 65'h1BE3000C9042D0C06;
rommem[3887] = 65'h0E680000008840008;
rommem[3888] = 65'h1048D0C06EE800004;
rommem[3889] = 65'h0BE858048BE307EC0;
rommem[3890] = 65'h1BE8500480485A014;
rommem[3891] = 65'h16604040004852014;
rommem[3892] = 65'h09A00FA3B37EF8000;
rommem[3893] = 65'h0020085E831FFF122;
rommem[3894] = 65'h00000002831FFF169;
rommem[3895] = 65'h0E6A0010033FFEC0B;
rommem[3896] = 65'h0040D7809EE800400;
rommem[3897] = 65'h131FFF1229A00FA20;
rommem[3898] = 65'h031FFF16902008628;
rommem[3899] = 65'h131FFF1229A00FA34;
rommem[3900] = 65'h031FFF169020085E8;
rommem[3901] = 65'h01601001F31FFFD80;
rommem[3902] = 65'h0DE00000002200FA9;
rommem[3903] = 65'h0DE000000DE000000;
rommem[3904] = 65'h031FFF16902008FE8;
rommem[3905] = 65'h0BE017F2F31FFFD80;
rommem[3906] = 65'h033FFEC0B00000028;
rommem[3907] = 65'h00000000000000000;
rommem[3908] = 65'h07375622061746144;
rommem[3909] = 65'h16120726F72726520;
rommem[3910] = 65'h04350452000203A74;
rommem[3911] = 65'h1662072724500203A;
rommem[3912] = 65'h020676E6968637465;
rommem[3913] = 65'h17463757274736E69;
rommem[3914] = 65'h0203A7461206E6F69;
rommem[3915] = 65'h0660F146000000000;
rommem[3916] = 65'h0660D1480660F9468;
rommem[3917] = 65'h16601147866009470;
rommem[3918] = 65'h1EE800400E6801000;
rommem[3919] = 65'h1E69C0FF0040D7809;
rommem[3920] = 65'h16A0D0421EE800003;
rommem[3921] = 65'h1B0101903B0100D02;
rommem[3922] = 65'h1B010220DB0102008;
rommem[3923] = 65'h0B0102601B010240F;
rommem[3924] = 65'h0460F9468460F1460;
rommem[3925] = 65'h046009470460D1480;
rommem[3926] = 65'h00000000F46011478;
rommem[3927] = 65'h0E69CFFFD01900020;
rommem[3928] = 65'h06A0D0028EE800003;
rommem[3929] = 65'h10A10800146009400;
rommem[3930] = 65'h0460F146066009400;
rommem[3931] = 65'h0460D1480460F9468;
rommem[3932] = 65'h14601147846009470;
rommem[3933] = 65'h0019000200000000F;
rommem[3934] = 65'h131FFEF734600B000;
rommem[3935] = 65'h0460F9468460F1460;
rommem[3936] = 65'h046009470460D1480;
rommem[3937] = 65'h00190002046011478;
rommem[3938] = 65'h0341F80004600B010;
rommem[3939] = 65'h14600B018BE007F0A;
rommem[3940] = 65'h1BE007EAA31FFF46B;
rommem[3941] = 65'h031FFEEF04600B008;
rommem[3942] = 65'h133FFEC0BBE007E4A;
rommem[3943] = 65'h066009470660F1460;
rommem[3944] = 65'h1E6801000660D1480;
rommem[3945] = 65'h0040D7809EE800400;
rommem[3946] = 65'h1EE800003E69CFFFE;
rommem[3947] = 65'h19A00FB806A0D0028;
rommem[3948] = 65'h00200886831FFF122;
rommem[3949] = 65'h131FFFD8031FFF169;
rommem[3950] = 65'h046009470460F1460;
rommem[3951] = 65'h101900020460D1480;
rommem[3952] = 65'h16520797469726150;
rommem[3953] = 65'h03A746120726F7272;
rommem[3954] = 65'h10FEF000800000020;
rommem[3955] = 65'h09A00FBC067E08000;
rommem[3956] = 65'h00200886831FFF122;
rommem[3957] = 65'h131FFFD8031FFF169;
rommem[3958] = 65'h10BEF000847E08000;
rommem[3959] = 65'h001900020BE00000A;
rommem[3960] = 65'h06D656C706D696E55;
rommem[3961] = 65'h06E69206465746E65;
rommem[3962] = 65'h06F69746375727473;
rommem[3963] = 65'h00000203A7461206E;
rommem[3964] = 65'h16A0D0413E6BF0000;
rommem[3965] = 65'h06A0D0813E6BF0008;
rommem[3966] = 65'h0BE107FE902008034;
rommem[3967] = 65'h00201022802008128;
rommem[3968] = 65'h006211A01022002E9;
rommem[3969] = 65'h14611000004110403;
rommem[3970] = 65'h1022002A914210000;
rommem[3971] = 65'h01421000046110008;
rommem[3972] = 65'h002000034022002E9;
rommem[3973] = 65'h1E6BF000002000035;
rommem[3974] = 65'h1E6BF00086A0D0403;
rommem[3975] = 65'h0019000206A0D0803;
rommem[4086] = 65'h0DE00000033FFFEF8;
rommem[4088] = 65'h0DE00000033FFFEF8;
rommem[4092] = 65'h00000000000000000;
rommem[4093] = 65'h00000000000000000;
rommem[4095] = 65'h00000000000000000;
rommem[0] = 65'h00000000000000000;
/trunk/software/sample code/sieve.c
0,0 → 1,175
/*#include <stdio.h>*/
 
#define LIMIT 1500000 /*size of integers array*/
#define PRIMES 100000 /*size of primes array*/
 
nocall my_org() {
asm {
org 0x100800200
db "BOOT"
jmp crt_start
.align 8
sp_save:
dw 0
}
}
 
int main(){
int i,j,numbers[LIMIT];
int primes[PRIMES];
int limit;
int start_tick,end_tick;
 
asm {
lw r1,#0xAB
outb r1,0xdc0600
}
start_tick = get_tick();
asm {
lw r1,#0xAC
outb r1,0xdc0600
}
printf("Start tick %d\r\n", start_tick);
asm {
lw r1,#0xAD
outb r1,0xdc0600
}
 
limit=LIMIT;
 
/*fill the array with natural numbers*/
for (i=0;i<limit;i++){
numbers[i]=i+2;
}
 
/*sieve the non-primes*/
for (i=0;i<limit;i++){
if (numbers[i]!=-1){
for (j=2*numbers[i]-2;j<limit;j+=numbers[i])
numbers[j]=-1;
}
}
 
/*transfer the primes to their own array*/
j = 0;
for (i=0;i<limit&&j<PRIMES;i++)
if (numbers[i]!=-1)
primes[j++] = numbers[i];
 
end_tick = get_tick();
printf("Clock ticks %d\r\n", end_tick-start_tick);
 
/*print*/
for (i=0;i<PRIMES;i++)
printf("%d\n",primes[i]);
 
return 0;
}
 
int printf(char *p)
{
int *q;
asm {
lw r1,#0xAE
outb r1,0xdc0600
}
q = &p;
 
for (; *p; p++) {
if (*p=='%') {
p++;
switch(*p) {
case '%':
putch('%');
break;
case 'c':
q++;
putch(*q);
break;
case 'd':
q++;
putnum(*q);
break;
case 's':
q++;
putstr(*q);
break;
}
}
else
putch(*p);
}
}
 
void putch(char ch)
{
asm {
lw r1,#0xAF
outb r1,0xdc0600
}
asm {
lw r1,#0x0a
lw r2,24[bp]
lw r3,#1
syscall #410
}
asm {
lw r1,#0xB0
outb r1,0xdc0600
}
}
 
void putnum(int num)
{
asm {
lw r1,#0xB1
outb r1,0xdc0600
}
asm {
lw r1,#0x15
lw r2,24[bp]
lw r3,#5
syscall #410
}
asm {
lw r1,#0xB2
outb r1,0xdc0600
}
}
 
void putstr(char *p)
{
asm {
lw r1,#0x14
lw r2,24[bp]
syscall #410
}
}
 
int get_tick()
{
asm {
lw r1,#0
syscall #416
}
}
 
void crt_start()
{
asm {
lw r1,#0xAA
outb r1,0xdc0600
sw sp,sp_save
lw sp,#0x1_07FFFFF8
lea xlr,prog_abort
call main
lw sp,sp_save
bra retcode
prog_abort:
}
putstr("Program aborted abnormally.");
asm {
lw sp,sp_save
retcode:
}
}
/trunk/software/sample code/sieve.lst
0,0 → 1,648
0000000000000000 code
0000000000000000 align 16
0000000000000000 my_org:
0000000100800200 org 0x100800200
0000000100800204 32200285 jmp crt_start
0000000100800208 .align 8
0000000100800208 sp_save:
0000000100800208 0000000000000000 dw 0
100800210 FFFFFFFFFFFFFFFF fill.b 0x0200,0xff
100800218 FFFFFFFFFFFFFFFF
100800220 FFFFFFFFFFFFFFFF
100800228 FFFFFFFFFFFFFFFF
100800230 FFFFFFFFFFFFFFFF
100800238 FFFFFFFFFFFFFFFF
100800240 FFFFFFFFFFFFFFFF
100800248 FFFFFFFFFFFFFFFF
100800250 FFFFFFFFFFFFFFFF
100800258 FFFFFFFFFFFFFFFF
100800260 FFFFFFFFFFFFFFFF
100800268 FFFFFFFFFFFFFFFF
100800270 FFFFFFFFFFFFFFFF
100800278 FFFFFFFFFFFFFFFF
100800280 FFFFFFFFFFFFFFFF
100800288 FFFFFFFFFFFFFFFF
100800290 FFFFFFFFFFFFFFFF
100800298 FFFFFFFFFFFFFFFF
1008002A0 FFFFFFFFFFFFFFFF
1008002A8 FFFFFFFFFFFFFFFF
1008002B0 FFFFFFFFFFFFFFFF
1008002B8 FFFFFFFFFFFFFFFF
1008002C0 FFFFFFFFFFFFFFFF
1008002C8 FFFFFFFFFFFFFFFF
1008002D0 FFFFFFFFFFFFFFFF
1008002D8 FFFFFFFFFFFFFFFF
1008002E0 FFFFFFFFFFFFFFFF
1008002E8 FFFFFFFFFFFFFFFF
1008002F0 FFFFFFFFFFFFFFFF
1008002F8 FFFFFFFFFFFFFFFF
100800300 FFFFFFFFFFFFFFFF
100800308 FFFFFFFFFFFFFFFF
100800310 FFFFFFFFFFFFFFFF
100800318 FFFFFFFFFFFFFFFF
100800320 FFFFFFFFFFFFFFFF
100800328 FFFFFFFFFFFFFFFF
100800330 FFFFFFFFFFFFFFFF
100800338 FFFFFFFFFFFFFFFF
100800340 FFFFFFFFFFFFFFFF
100800348 FFFFFFFFFFFFFFFF
100800350 FFFFFFFFFFFFFFFF
100800358 FFFFFFFFFFFFFFFF
100800360 FFFFFFFFFFFFFFFF
100800368 FFFFFFFFFFFFFFFF
100800370 FFFFFFFFFFFFFFFF
100800378 FFFFFFFFFFFFFFFF
100800380 FFFFFFFFFFFFFFFF
100800388 FFFFFFFFFFFFFFFF
100800390 FFFFFFFFFFFFFFFF
100800398 FFFFFFFFFFFFFFFF
1008003A0 FFFFFFFFFFFFFFFF
1008003A8 FFFFFFFFFFFFFFFF
1008003B0 FFFFFFFFFFFFFFFF
1008003B8 FFFFFFFFFFFFFFFF
1008003C0 FFFFFFFFFFFFFFFF
1008003C8 FFFFFFFFFFFFFFFF
1008003D0 FFFFFFFFFFFFFFFF
1008003D8 FFFFFFFFFFFFFFFF
1008003E0 FFFFFFFFFFFFFFFF
1008003E8 FFFFFFFFFFFFFFFF
1008003F0 FFFFFFFFFFFFFFFF
1008003F8 FFFFFFFFFFFFFFFF
100800400 FFFFFFFFFFFFFFFF
100800408 FFFFFFFFFFFFFFFF
0000000100800412 L_1:
0000000100800412 L_0:
0000000100800412 main:
0000000100800413 0FEF0018 subui sp,sp,#24
0000000100800417 67ED8000 sw bp,[sp]
000000010080041B 67EE0008 sw xlr,8[sp]
000000010080041F 67EF8010 sw lr,16[sp]
0000000100800423 E6800747 ; SETLO
0000000100800427 EE800402 ; SETMID
000000010080042B 6A0D702D lea xlr,L_5
000000010080042F 03ED8009 mov bp,sp
0000000100800433 E6835028 ; SETLO
0000000100800437 EE800003 ; SETMID
000000010080043B 05ED7805 subui sp,sp,#12800040
000000010080043F 0FEF0038 subui sp,sp,#56
0000000100800443 67E58000 sw r11,[sp]
0000000100800447 67E60008 sw r12,8[sp]
000000010080044B 67E68010 sw r13,16[sp]
000000010080044F 67E70018 sw r14,24[sp]
0000000100800453 67E78020 sw r15,32[sp]
0000000100800457 67E80028 sw r16,40[sp]
000000010080045B 67E88030 sw r17,48[sp]
000000010080045F 1607FFFF ori r15,r0,#-1
0000000100800463 E688E4F0 ; SETLO
0000000100800467 EEBFFFFD ; SETMID
000000010080046B 6BBD0C2D lea r3,-12000016[bp]
000000010080046F 02380009 mov r16,r3
; lw r1,#0x17
; mov r2,sp
; syscall #410
0000000100800473 160080AB lw r1,#0xAB
0000000100800477 E69C0600 ; SETLO
000000010080047B EE800003 ; SETMID
000000010080047F 6A0D0428 outb r1,0xdc0600
0000000100800483 3020027D call get_tick
0000000100800487 02118009 mov r3,r1
000000010080048B 02388009 mov r17,r3
000000010080048F 160080AC lw r1,#0xAC
0000000100800493 E69C0600 ; SETLO
0000000100800497 EE800003 ; SETMID
000000010080049B 6A0D0428 outb r1,0xdc0600
000000010080049F 16008017 lw r1,#0x17
00000001008004A3 03E10009 mov r2,sp
00000001008004A7 0181CD17 syscall #410
00000001008004AB 0FEF0008 subui sp,sp,#8
00000001008004AF 00000014 fip
00000001008004B3 DE000000 nop
00000001008004B7 DE000000 nop
00000001008004BB DE000000 nop
00000001008004BF DE000000 nop
00000001008004C3 67E20000 sw r4,[sp]
; fip
00000001008004C7 160080AE lw r1,#0xAE
00000001008004CB E69C0600 ; SETLO
00000001008004CF EE800003 ; SETMID
00000001008004D3 6A0D0428 outb r1,0xdc0600
00000001008004D7 DE000000 nop
00000001008004DB DE000000 nop
00000001008004DF DE000000 nop
00000001008004E3 DE000000 nop
00000001008004E7 DE000000 nop
00000001008004EB 0FEF0010 subui sp,sp,#16
00000001008004EF 00000014 fip
00000001008004F3 DE000000 nop
00000001008004F7 DE000000 nop
00000001008004FB DE000000 nop
00000001008004FF DE000000 nop
0000000100800503 DE000000 nop
0000000100800507 67E88008 sw r17,8[sp]
000000010080050B 00000014 fip
000000010080050F DE000000 nop
0000000100800513 DE000000 nop
0000000100800517 DE000000 nop
000000010080051B DE000000 nop
000000010080051F DE000000 nop
0000000100800523 E6800412 ; SETLO
0000000100800527 EE800402 ; SETMID
000000010080052B 040D0C09 ori r3,r0,#L_0
000000010080052F 00000014 fip
0000000100800533 DE000000 nop
0000000100800537 DE000000 nop
000000010080053B DE000000 nop
000000010080053F DE000000 nop
0000000100800543 DE000000 nop
0000000100800547 67E18000 sw r3,[sp]
000000010080054B DE000000 nop
000000010080054F DE000000 nop
0000000100800553 DE000000 nop
0000000100800557 DE000000 nop
000000010080055B DE000000 nop
000000010080055F 160080AE lw r1,#0xAE
0000000100800563 E69C0600 ; SETLO
0000000100800567 EE800003 ; SETMID
000000010080056B 6A0D0428 outb r1,0xdc0600
000000010080056F 00000028 wait
0000000100800573 302001D4 call printf
0000000100800577 0BEF0010 addui sp,sp,#16
000000010080057B 47E20000 lw r4,[sp]
000000010080057F 0BEF0008 addui sp,sp,#8
0000000100800583 02118009 mov r3,r1
0000000100800587 160080AD lw r1,#0xAD
000000010080058B E69C0600 ; SETLO
000000010080058F EE800003 ; SETMID
0000000100800593 6A0D0428 outb r1,0xdc0600
0000000100800597 00000040 cli
000000010080059B E696E360 ; SETLO
000000010080059F 040D0C09 ori r3,r0,#1500000
00000001008005A3 02370009 mov r14,r3
00000001008005A7 16018000 ori r3,r0,#0
00000001008005AB 02358009 mov r11,r3
00000001008005AF L_6:
00000001008005AF BEB700A1 bge r11,r14,L_7
00000001008005B3 08B18002 add r3,r11,#2
00000001008005B7 6B058F13 sw r3,[r16+r11*8]
00000001008005BB 0AB58001 addui r11,r11,#1
00000001008005BF BE007F8A bra L_6
00000001008005C3 L_7:
00000001008005C3 16018000 ori r3,r0,#0
00000001008005C7 02358009 mov r11,r3
00000001008005CB L_8:
00000001008005CB BEB701C1 bge r11,r14,L_9
00000001008005CF 6B058F03 lw r3,[r16+r11*8]
00000001008005D3 BE378148 beq r3,r15,L_10
00000001008005D7 6B058F03 lw r3,[r16+r11*8]
00000001008005DB 06320200 shli r4,r3,#1
00000001008005DF 0C418002 sub r3,r4,#2
00000001008005E3 02360009 mov r12,r3
00000001008005E7 L_12:
00000001008005E7 BEC700A1 bge r12,r14,L_13
00000001008005EB 6B063F13 sw r15,[r16+r12*8]
00000001008005EF 6B058F03 lw r3,[r16+r11*8]
00000001008005F3 04C1B002 add r12,r12,r3
00000001008005F7 BE007F8A bra L_12
00000001008005FB L_13:
00000001008005FB L_10:
00000001008005FB 0AB58001 addui r11,r11,#1
00000001008005FF BE007E6A bra L_8
0000000100800603 L_9:
0000000100800603 16018000 ori r3,r0,#0
0000000100800607 02360009 mov r12,r3
000000010080060B 16018000 ori r3,r0,#0
000000010080060F 02358009 mov r11,r3
0000000100800613 L_14:
0000000100800613 BEB701A1 bge r11,r14,L_15
0000000100800617 E68186A0 ; SETLO
000000010080061B BECD0161 bge r12,#100000,L_15
000000010080061F 6B058F03 lw r3,[r16+r11*8]
0000000100800623 BE3780E8 beq r3,r15,L_16
0000000100800627 6B058F03 lw r3,[r16+r11*8]
000000010080062B 08C60001 add r12,r12,#1
000000010080062F E6BCAFF0 ; SETLO
0000000100800633 EEBFFFFC ; SETMID
0000000100800637 6BBD102D lea r4,-12800016[bp]
000000010080063B 6A460F13 sw r3,[r4+r12*8]
000000010080063F L_16:
000000010080063F 0AB58001 addui r11,r11,#1
0000000100800643 BE007E8A bra L_14
0000000100800647 L_15:
0000000100800647 0FEF0010 subui sp,sp,#16
000000010080064B 67E20008 sw r4,8[sp]
000000010080064F 67E28000 sw r5,[sp]
0000000100800653 3020027D call get_tick
0000000100800657 47E20008 lw r4,8[sp]
000000010080065B 47E28000 lw r5,[sp]
000000010080065F 0BEF0010 addui sp,sp,#16
0000000100800663 02118009 mov r3,r1
0000000100800667 02368009 mov r13,r3
000000010080066B 0FEF0010 subui sp,sp,#16
000000010080066F 67E20008 sw r4,8[sp]
0000000100800673 67E28000 sw r5,[sp]
0000000100800677 0FEF0010 subui sp,sp,#16
000000010080067B 04D88C04 sub r3,r13,r17
000000010080067F 67E18008 sw r3,8[sp]
0000000100800683 E6800412 ; SETLO
0000000100800687 EE800402 ; SETMID
000000010080068B 040D0C09 ori r3,r0,#L_0
000000010080068F 67E18000 sw r3,[sp]
0000000100800693 302001D4 call printf
0000000100800697 0BEF0010 addui sp,sp,#16
000000010080069B 47E20008 lw r4,8[sp]
000000010080069F 47E28000 lw r5,[sp]
00000001008006A3 0BEF0010 addui sp,sp,#16
00000001008006A7 02118009 mov r3,r1
00000001008006AB 16018000 ori r3,r0,#0
00000001008006AF 02358009 mov r11,r3
00000001008006B3 L_18:
00000001008006B3 E68186A0 ; SETLO
00000001008006B7 BEBD02C1 bge r11,#100000,L_19
00000001008006BB 0FEF0010 subui sp,sp,#16
00000001008006BF 67E20008 sw r4,8[sp]
00000001008006C3 67E28000 sw r5,[sp]
00000001008006C7 0FEF0010 subui sp,sp,#16
00000001008006CB E6BCAFF0 ; SETLO
00000001008006CF EEBFFFFC ; SETMID
00000001008006D3 6BBD0C2D lea r3,-12800016[bp]
00000001008006D7 6A359303 lw r4,[r3+r11*8]
00000001008006DB 67E20008 sw r4,8[sp]
00000001008006DF E6800412 ; SETLO
00000001008006E3 EE800402 ; SETMID
00000001008006E7 040D1009 ori r4,r0,#L_0
00000001008006EB 67E20000 sw r4,[sp]
00000001008006EF 302001D4 call printf
00000001008006F3 0BEF0010 addui sp,sp,#16
00000001008006F7 47E20008 lw r4,8[sp]
00000001008006FB 47E28000 lw r5,[sp]
00000001008006FF 0BEF0010 addui sp,sp,#16
0000000100800703 02120009 mov r4,r1
0000000100800707 0AB58001 addui r11,r11,#1
000000010080070B BE007D4A bra L_18
000000010080070F L_19:
000000010080070F 16008000 ori r1,r0,#0
0000000100800713 L_20:
0000000100800713 47E88030 lw r17,48[sp]
0000000100800717 47E80028 lw r16,40[sp]
000000010080071B 47E78020 lw r15,32[sp]
000000010080071F 47E70018 lw r14,24[sp]
0000000100800723 47E68010 lw r13,16[sp]
0000000100800727 47E60008 lw r12,8[sp]
000000010080072B 47E58000 lw r11,[sp]
000000010080072F 0BEF0038 addui sp,sp,#56
0000000100800733 03BF0009 mov sp,bp
0000000100800737 47ED8000 lw bp,[sp]
000000010080073B 47EE0008 lw xlr,8[sp]
000000010080073F 47EF8010 lw lr,16[sp]
0000000100800743 37EF8018 ret #24
0000000100800747 L_5:
0000000100800747 47BF8008 lw lr,8[bp]
000000010080074B 67BF8010 sw lr,16[bp]
000000010080074F BE007E2A bra L_20
0000000100800753 printf:
0000000100800753 160080B0 lw r1,#0xB0
0000000100800757 E69C0600 ; SETLO
000000010080075B EE800003 ; SETMID
000000010080075F 6A0D0428 outb r1,0xdc0600
0000000100800763 0FEF0018 subui sp,sp,#24
0000000100800767 67ED8000 sw bp,[sp]
000000010080076B 67EE0008 sw xlr,8[sp]
000000010080076F 67EF8010 sw lr,16[sp]
0000000100800773 E6800937 ; SETLO
0000000100800777 EE800402 ; SETMID
000000010080077B 6A0D702D lea xlr,L_21
000000010080077F 03ED8009 mov bp,sp
0000000100800783 0FEF0008 subui sp,sp,#8
0000000100800787 0FEF0018 subui sp,sp,#24
000000010080078B 67E58000 sw r11,[sp]
000000010080078F 67E60008 sw r12,8[sp]
0000000100800793 67E68010 sw r13,16[sp]
0000000100800797 47B18018 lw r3,24[bp]
000000010080079B 02360009 mov r12,r3
000000010080079F E6800943 ; SETLO
00000001008007A3 EE800402 ; SETMID
00000001008007A7 040D3409 ori r13,r0,#putch
00000001008007AB 160080AE lw r1,#0xAE
00000001008007AF E69C0600 ; SETLO
00000001008007B3 EE800003 ; SETMID
00000001008007B7 6A0D0428 outb r1,0xdc0600
00000001008007BB 9BB18018 lea r3,24[bp]
00000001008007BF 02358009 mov r11,r3
00000001008007C3 L_22:
00000001008007C3 42C18000 lc r3,[r12]
00000001008007C7 BE300A68 beq r3,r0,L_23
00000001008007CB 42C18000 lc r3,[r12]
00000001008007CF B2304225 bne r3,#37,L_24
00000001008007D3 0AC60002 addui r12,r12,#2
00000001008007D7 42C18000 lc r3,[r12]
00000001008007DB 02318015 sext16 r3,r3
00000001008007DF 04300409 or r1,r3,r0
00000001008007E3 B0100525 beq r1,#37,L_27
00000001008007E7 B0101163 beq r1,#99,L_28
00000001008007EB B0101E64 beq r1,#100,L_29
00000001008007EF B0102B73 beq r1,#115,L_30
00000001008007F3 BE00070A bra L_26
00000001008007F7 L_27:
00000001008007F7 0FEF0010 subui sp,sp,#16
00000001008007FB 67E20008 sw r4,8[sp]
00000001008007FF 67E28000 sw r5,[sp]
0000000100800803 0FEF0008 subui sp,sp,#8
0000000100800807 16018025 ori r3,r0,#37
000000010080080B 67E18000 sw r3,[sp]
000000010080080F 34DF8000 jal lr,[r13]
0000000100800813 0BEF0008 addui sp,sp,#8
0000000100800817 47E20008 lw r4,8[sp]
000000010080081B 47E28000 lw r5,[sp]
000000010080081F 0BEF0010 addui sp,sp,#16
0000000100800823 02118009 mov r3,r1
0000000100800827 BE00056A bra L_26
000000010080082B L_28:
000000010080082B 0AB58008 addui r11,r11,#8
000000010080082F 0FEF0010 subui sp,sp,#16
0000000100800833 67E20008 sw r4,8[sp]
0000000100800837 67E28000 sw r5,[sp]
000000010080083B 0FEF0008 subui sp,sp,#8
000000010080083F 46B18000 lw r3,[r11]
0000000100800843 67E18000 sw r3,[sp]
0000000100800847 34DF8000 jal lr,[r13]
000000010080084B 0BEF0008 addui sp,sp,#8
000000010080084F 47E20008 lw r4,8[sp]
0000000100800853 47E28000 lw r5,[sp]
0000000100800857 0BEF0010 addui sp,sp,#16
000000010080085B 02118009 mov r3,r1
000000010080085F BE0003AA bra L_26
0000000100800863 L_29:
0000000100800863 0AB58008 addui r11,r11,#8
0000000100800867 0FEF0010 subui sp,sp,#16
000000010080086B 67E20008 sw r4,8[sp]
000000010080086F 67E28000 sw r5,[sp]
0000000100800873 0FEF0008 subui sp,sp,#8
0000000100800877 46B18000 lw r3,[r11]
000000010080087B 67E18000 sw r3,[sp]
000000010080087F 30200262 call putnum
0000000100800883 0BEF0008 addui sp,sp,#8
0000000100800887 47E20008 lw r4,8[sp]
000000010080088B 47E28000 lw r5,[sp]
000000010080088F 0BEF0010 addui sp,sp,#16
0000000100800893 02118009 mov r3,r1
0000000100800897 BE0001EA bra L_26
000000010080089B L_30:
000000010080089B 0AB58008 addui r11,r11,#8
000000010080089F 0FEF0010 subui sp,sp,#16
00000001008008A3 67E20008 sw r4,8[sp]
00000001008008A7 67E28000 sw r5,[sp]
00000001008008AB 0FEF0008 subui sp,sp,#8
00000001008008AF 46B18000 lw r3,[r11]
00000001008008B3 67E18000 sw r3,[sp]
00000001008008B7 30200274 call putstr
00000001008008BB 0BEF0008 addui sp,sp,#8
00000001008008BF 47E20008 lw r4,8[sp]
00000001008008C3 47E28000 lw r5,[sp]
00000001008008C7 0BEF0010 addui sp,sp,#16
00000001008008CB 02118009 mov r3,r1
00000001008008CF BE00002A bra L_26
00000001008008D3 L_26:
00000001008008D3 BE0001CA bra L_25
00000001008008D7 L_24:
00000001008008D7 0FEF0010 subui sp,sp,#16
00000001008008DB 67E20008 sw r4,8[sp]
00000001008008DF 67E28000 sw r5,[sp]
00000001008008E3 0FEF0008 subui sp,sp,#8
00000001008008E7 42C18000 lc r3,[r12]
00000001008008EB 02318015 sext16 r3,r3
00000001008008EF 67E18000 sw r3,[sp]
00000001008008F3 34DF8000 jal lr,[r13]
00000001008008F7 0BEF0008 addui sp,sp,#8
00000001008008FB 47E20008 lw r4,8[sp]
00000001008008FF 47E28000 lw r5,[sp]
0000000100800903 0BEF0010 addui sp,sp,#16
0000000100800907 02118009 mov r3,r1
000000010080090B L_25:
000000010080090B 0AC60002 addui r12,r12,#2
000000010080090F BE0075AA bra L_22
0000000100800913 L_23:
0000000100800913 L_31:
0000000100800913 47E68010 lw r13,16[sp]
0000000100800917 47E60008 lw r12,8[sp]
000000010080091B 47E58000 lw r11,[sp]
000000010080091F 0BEF0018 addui sp,sp,#24
0000000100800923 03BF0009 mov sp,bp
0000000100800927 47ED8000 lw bp,[sp]
000000010080092B 47EE0008 lw xlr,8[sp]
000000010080092F 47EF8010 lw lr,16[sp]
0000000100800933 37EF8018 ret #24
0000000100800937 L_21:
0000000100800937 47BF8008 lw lr,8[bp]
000000010080093B 67BF8010 sw lr,16[bp]
000000010080093F BE007EAA bra L_31
0000000100800943 putch:
0000000100800943 0FEF0018 subui sp,sp,#24
0000000100800947 67ED8000 sw bp,[sp]
000000010080094B 03ED8009 mov bp,sp
000000010080094F 160080AF lw r1,#0xAF
0000000100800953 E69C0600 ; SETLO
0000000100800957 EE800003 ; SETMID
000000010080095B 6A0D0428 outb r1,0xdc0600
000000010080095F 1600800A lw r1,#0x0a
0000000100800963 47B10018 lw r2,24[bp]
0000000100800967 16018001 lw r3,#1
000000010080096B 0181CD17 syscall #410
000000010080096F 160080B0 lw r1,#0xB0
0000000100800973 E69C0600 ; SETLO
0000000100800977 EE800003 ; SETMID
000000010080097B 6A0D0428 outb r1,0xdc0600
000000010080097F L_33:
000000010080097F 03BF0009 mov sp,bp
0000000100800983 47ED8000 lw bp,[sp]
0000000100800987 37EF8018 ret #24
000000010080098B L_32:
000000010080098B putnum:
000000010080098B 0FEF0018 subui sp,sp,#24
000000010080098F 67ED8000 sw bp,[sp]
0000000100800993 03ED8009 mov bp,sp
0000000100800997 160080B1 lw r1,#0xB1
000000010080099B E69C0600 ; SETLO
000000010080099F EE800003 ; SETMID
00000001008009A3 6A0D0428 outb r1,0xdc0600
00000001008009A7 16008015 lw r1,#0x15
00000001008009AB 47B10018 lw r2,24[bp]
00000001008009AF 16018005 lw r3,#5
00000001008009B3 0181CD17 syscall #410
00000001008009B7 160080B2 lw r1,#0xB2
00000001008009BB E69C0600 ; SETLO
00000001008009BF EE800003 ; SETMID
00000001008009C3 6A0D0428 outb r1,0xdc0600
00000001008009C7 L_35:
00000001008009C7 03BF0009 mov sp,bp
00000001008009CB 47ED8000 lw bp,[sp]
00000001008009CF 37EF8018 ret #24
00000001008009D3 L_34:
00000001008009D3 putstr:
00000001008009D3 0FEF0018 subui sp,sp,#24
00000001008009D7 67ED8000 sw bp,[sp]
00000001008009DB 03ED8009 mov bp,sp
00000001008009DF 16008014 lw r1,#0x14
00000001008009E3 47B10018 lw r2,24[bp]
00000001008009E7 0181CD17 syscall #410
00000001008009EB L_37:
00000001008009EB 03BF0009 mov sp,bp
00000001008009EF 47ED8000 lw bp,[sp]
00000001008009F3 37EF8018 ret #24
00000001008009F7 L_36:
00000001008009F7 get_tick:
00000001008009F7 0FEF0018 subui sp,sp,#24
00000001008009FB 67ED8000 sw bp,[sp]
00000001008009FF 03ED8009 mov bp,sp
0000000100800A03 16008000 lw r1,#0
0000000100800A07 0181D017 syscall #416
0000000100800A0B L_39:
0000000100800A0B 03BF0009 mov sp,bp
0000000100800A0F 47ED8000 lw bp,[sp]
0000000100800A13 37EF8018 ret #24
0000000100800A17 L_38:
0000000100800A17 crt_start:
0000000100800A17 0FEF0018 subui sp,sp,#24
0000000100800A1B 67ED8000 sw bp,[sp]
0000000100800A1F 67EE0008 sw xlr,8[sp]
0000000100800A23 67EF8010 sw lr,16[sp]
0000000100800A27 E6800ADF ; SETLO
0000000100800A2B EE800402 ; SETMID
0000000100800A2F 6A0D702D lea xlr,L_41
0000000100800A33 03ED8009 mov bp,sp
0000000100800A37 160080AA lw r1,#0xAA
0000000100800A3B E69C0600 ; SETLO
0000000100800A3F EE800003 ; SETMID
0000000100800A43 6A0D0428 outb r1,0xdc0600
0000000100800A47 E6800208 ; SETLO
0000000100800A4B EE800402 ; SETMID
0000000100800A4F 6A0D7813 sw sp,sp_save
0000000100800A53 E6BFFFF8 ; SETLO
0000000100800A57 EE80041F ; SETMID
0000000100800A5B 040D7809 lw sp,#0x1_07FFFFF8
0000000100800A5F 16008017 lw r1,#0x17
0000000100800A63 03E10009 mov r2,sp
0000000100800A67 0181CD17 syscall #410
0000000100800A6B E6800A8B ; SETLO
0000000100800A6F EE800402 ; SETMID
0000000100800A73 6A0D702D lea xlr,prog_abort
0000000100800A77 30200104 call main
0000000100800A7B E6800208 ; SETLO
0000000100800A7F EE800402 ; SETMID
0000000100800A83 6A0D7803 lw sp,sp_save
0000000100800A87 BE00022A bra retcode
0000000100800A8B prog_abort:
0000000100800A8B 0FEF0010 subui sp,sp,#16
0000000100800A8F 67E20008 sw r4,8[sp]
0000000100800A93 67E28000 sw r5,[sp]
0000000100800A97 0FEF0008 subui sp,sp,#8
0000000100800A9B E6800412 ; SETLO
0000000100800A9F EE800402 ; SETMID
0000000100800AA3 040D0C09 ori r3,r0,#L_0
0000000100800AA7 67E18000 sw r3,[sp]
0000000100800AAB 30200274 call putstr
0000000100800AAF 0BEF0008 addui sp,sp,#8
0000000100800AB3 47E20008 lw r4,8[sp]
0000000100800AB7 47E28000 lw r5,[sp]
0000000100800ABB 0BEF0010 addui sp,sp,#16
0000000100800ABF E6800208 ; SETLO
0000000100800AC3 EE800402 ; SETMID
0000000100800AC7 6A0D7803 lw sp,sp_save
0000000100800ACB retcode:
0000000100800ACB L_42:
0000000100800ACB 03BF0009 mov sp,bp
0000000100800ACF 47ED8000 lw bp,[sp]
0000000100800AD3 47EE0008 lw xlr,8[sp]
0000000100800AD7 47EF8010 lw lr,16[sp]
0000000100800ADB 37EF8018 ret #24
0000000100800ADF L_41:
0000000100800ADF 47BF8008 lw lr,8[bp]
0000000100800AE3 67BF8010 sw lr,16[bp]
0000000100800AE7 BE007F2A bra L_42
100800AE8 0000000000000000 align 8
0000000100800AF0 align 8
0000000100800AF0 L_40:
0000000100800B26 L_4:
0000000100800B2C L_3:
0000000100800B4C L_2:
; global putch
; global get_tick
; global my_org
; global printf
; global main
; global putnum
; global putstr
; global crt_start
0000000100800B6A 00000000
0000000100800B6E 00000000
Symbol Table:
==========================================================
Name Typ Segment Address/Value
----------------------------------------------------------
my_org L code 0000000000000000
sp_save L code 0000000100800208
L_1 L code 0000000100800412
L_0 L code 0000000100800412
main L code 0000000100800412
L_6 L code 00000001008005AF
L_7 L code 00000001008005C3
L_8 L code 00000001008005CB
L_9 L code 0000000100800603
L_10 L code 00000001008005FB
L_12 L code 00000001008005E7
L_13 L code 00000001008005FB
L_14 L code 0000000100800613
L_15 L code 0000000100800647
L_16 L code 000000010080063F
L_18 L code 00000001008006B3
L_19 L code 000000010080070F
L_20 L code 0000000100800713
L_5 L code 0000000100800747
printf L code 0000000100800753
L_22 L code 00000001008007C3
L_23 L code 0000000100800913
L_24 L code 00000001008008D7
L_27 L code 00000001008007F7
L_28 L code 000000010080082B
L_29 L code 0000000100800863
L_30 L code 000000010080089B
L_26 L code 00000001008008D3
L_25 L code 000000010080090B
L_31 L code 0000000100800913
L_21 L code 0000000100800937
putch L code 0000000100800943
L_33 L code 000000010080097F
L_32 L code 000000010080098B
putnum L code 000000010080098B
L_35 L code 00000001008009C7
L_34 L code 00000001008009D3
putstr L code 00000001008009D3
L_37 L code 00000001008009EB
L_36 L code 00000001008009F7
get_tick L code 00000001008009F7
L_39 L code 0000000100800A0B
L_38 L code 0000000100800A17
crt_start L code 0000000100800A17
retcode L code 0000000100800ACB
prog_abort L code 0000000100800A8B
L_42 L code 0000000100800ACB
L_41 L code 0000000100800ADF
L_40 L code 0000000100800AF0
L_4 L code 0000000100800B26
L_3 L code 0000000100800B2C
L_2 L code 0000000100800B4C
/trunk/software/sample code/sieve.s
0,0 → 1,473
code
align 16
my_org:
org 0x100800200
db "BOOT"
jmp crt_start
.align 8
sp_save:
dw 0
fill.b 0x0200,0xff
L_1:
L_0:
main:
subui sp,sp,#24
sw bp,[sp]
sw xlr,8[sp]
sw lr,16[sp]
lea xlr,L_5
mov bp,sp
subui sp,sp,#12800040
subui sp,sp,#56
sw r11,[sp]
sw r12,8[sp]
sw r13,16[sp]
sw r14,24[sp]
sw r15,32[sp]
sw r16,40[sp]
sw r17,48[sp]
ori r15,r0,#-1
lea r3,-12000016[bp]
mov r16,r3
; lw r1,#0x17
; mov r2,sp
; syscall #410
lw r1,#0xAB
outb r1,0xdc0600
call get_tick
mov r3,r1
mov r17,r3
lw r1,#0xAC
outb r1,0xdc0600
lw r1,#0x17
mov r2,sp
syscall #410
subui sp,sp,#8
fip
nop
nop
nop
nop
sw r4,[sp]
; fip
lw r1,#0xAE
outb r1,0xdc0600
nop
nop
nop
nop
nop
subui sp,sp,#16
fip
nop
nop
nop
nop
nop
sw r17,8[sp]
fip
nop
nop
nop
nop
nop
ori r3,r0,#L_0
fip
nop
nop
nop
nop
nop
sw r3,[sp]
nop
nop
nop
nop
nop
lw r1,#0xAE
outb r1,0xdc0600
wait
call printf
addui sp,sp,#16
lw r4,[sp]
addui sp,sp,#8
mov r3,r1
lw r1,#0xAD
outb r1,0xdc0600
cli
ori r3,r0,#1500000
mov r14,r3
ori r3,r0,#0
mov r11,r3
L_6:
bge r11,r14,L_7
add r3,r11,#2
sw r3,[r16+r11*8]
addui r11,r11,#1
bra L_6
L_7:
ori r3,r0,#0
mov r11,r3
L_8:
bge r11,r14,L_9
lw r3,[r16+r11*8]
beq r3,r15,L_10
lw r3,[r16+r11*8]
shli r4,r3,#1
sub r3,r4,#2
mov r12,r3
L_12:
bge r12,r14,L_13
sw r15,[r16+r12*8]
lw r3,[r16+r11*8]
add r12,r12,r3
bra L_12
L_13:
L_10:
addui r11,r11,#1
bra L_8
L_9:
ori r3,r0,#0
mov r12,r3
ori r3,r0,#0
mov r11,r3
L_14:
bge r11,r14,L_15
bge r12,#100000,L_15
lw r3,[r16+r11*8]
beq r3,r15,L_16
lw r3,[r16+r11*8]
add r12,r12,#1
lea r4,-12800016[bp]
sw r3,[r4+r12*8]
L_16:
addui r11,r11,#1
bra L_14
L_15:
subui sp,sp,#16
sw r4,8[sp]
sw r5,[sp]
call get_tick
lw r4,8[sp]
lw r5,[sp]
addui sp,sp,#16
mov r3,r1
mov r13,r3
subui sp,sp,#16
sw r4,8[sp]
sw r5,[sp]
subui sp,sp,#16
sub r3,r13,r17
sw r3,8[sp]
ori r3,r0,#L_0
sw r3,[sp]
call printf
addui sp,sp,#16
lw r4,8[sp]
lw r5,[sp]
addui sp,sp,#16
mov r3,r1
ori r3,r0,#0
mov r11,r3
L_18:
bge r11,#100000,L_19
subui sp,sp,#16
sw r4,8[sp]
sw r5,[sp]
subui sp,sp,#16
lea r3,-12800016[bp]
lw r4,[r3+r11*8]
sw r4,8[sp]
ori r4,r0,#L_0
sw r4,[sp]
call printf
addui sp,sp,#16
lw r4,8[sp]
lw r5,[sp]
addui sp,sp,#16
mov r4,r1
addui r11,r11,#1
bra L_18
L_19:
ori r1,r0,#0
L_20:
lw r17,48[sp]
lw r16,40[sp]
lw r15,32[sp]
lw r14,24[sp]
lw r13,16[sp]
lw r12,8[sp]
lw r11,[sp]
addui sp,sp,#56
mov sp,bp
lw bp,[sp]
lw xlr,8[sp]
lw lr,16[sp]
ret #24
L_5:
lw lr,8[bp]
sw lr,16[bp]
bra L_20
printf:
lw r1,#0xB0
outb r1,0xdc0600
subui sp,sp,#24
sw bp,[sp]
sw xlr,8[sp]
sw lr,16[sp]
lea xlr,L_21
mov bp,sp
subui sp,sp,#8
subui sp,sp,#24
sw r11,[sp]
sw r12,8[sp]
sw r13,16[sp]
lw r3,24[bp]
mov r12,r3
ori r13,r0,#putch
lw r1,#0xAE
outb r1,0xdc0600
lea r3,24[bp]
mov r11,r3
L_22:
lc r3,[r12]
beq r3,r0,L_23
lc r3,[r12]
bne r3,#37,L_24
addui r12,r12,#2
lc r3,[r12]
sext16 r3,r3
or r1,r3,r0
beq r1,#37,L_27
beq r1,#99,L_28
beq r1,#100,L_29
beq r1,#115,L_30
bra L_26
L_27:
subui sp,sp,#16
sw r4,8[sp]
sw r5,[sp]
subui sp,sp,#8
ori r3,r0,#37
sw r3,[sp]
jal lr,[r13]
addui sp,sp,#8
lw r4,8[sp]
lw r5,[sp]
addui sp,sp,#16
mov r3,r1
bra L_26
L_28:
addui r11,r11,#8
subui sp,sp,#16
sw r4,8[sp]
sw r5,[sp]
subui sp,sp,#8
lw r3,[r11]
sw r3,[sp]
jal lr,[r13]
addui sp,sp,#8
lw r4,8[sp]
lw r5,[sp]
addui sp,sp,#16
mov r3,r1
bra L_26
L_29:
addui r11,r11,#8
subui sp,sp,#16
sw r4,8[sp]
sw r5,[sp]
subui sp,sp,#8
lw r3,[r11]
sw r3,[sp]
call putnum
addui sp,sp,#8
lw r4,8[sp]
lw r5,[sp]
addui sp,sp,#16
mov r3,r1
bra L_26
L_30:
addui r11,r11,#8
subui sp,sp,#16
sw r4,8[sp]
sw r5,[sp]
subui sp,sp,#8
lw r3,[r11]
sw r3,[sp]
call putstr
addui sp,sp,#8
lw r4,8[sp]
lw r5,[sp]
addui sp,sp,#16
mov r3,r1
bra L_26
L_26:
bra L_25
L_24:
subui sp,sp,#16
sw r4,8[sp]
sw r5,[sp]
subui sp,sp,#8
lc r3,[r12]
sext16 r3,r3
sw r3,[sp]
jal lr,[r13]
addui sp,sp,#8
lw r4,8[sp]
lw r5,[sp]
addui sp,sp,#16
mov r3,r1
L_25:
addui r12,r12,#2
bra L_22
L_23:
L_31:
lw r13,16[sp]
lw r12,8[sp]
lw r11,[sp]
addui sp,sp,#24
mov sp,bp
lw bp,[sp]
lw xlr,8[sp]
lw lr,16[sp]
ret #24
L_21:
lw lr,8[bp]
sw lr,16[bp]
bra L_31
putch:
subui sp,sp,#24
sw bp,[sp]
mov bp,sp
lw r1,#0xAF
outb r1,0xdc0600
lw r1,#0x0a
lw r2,24[bp]
lw r3,#1
syscall #410
lw r1,#0xB0
outb r1,0xdc0600
L_33:
mov sp,bp
lw bp,[sp]
ret #24
L_32:
putnum:
subui sp,sp,#24
sw bp,[sp]
mov bp,sp
lw r1,#0xB1
outb r1,0xdc0600
lw r1,#0x15
lw r2,24[bp]
lw r3,#5
syscall #410
lw r1,#0xB2
outb r1,0xdc0600
L_35:
mov sp,bp
lw bp,[sp]
ret #24
L_34:
putstr:
subui sp,sp,#24
sw bp,[sp]
mov bp,sp
lw r1,#0x14
lw r2,24[bp]
syscall #410
L_37:
mov sp,bp
lw bp,[sp]
ret #24
L_36:
get_tick:
subui sp,sp,#24
sw bp,[sp]
mov bp,sp
lw r1,#0
syscall #416
L_39:
mov sp,bp
lw bp,[sp]
ret #24
L_38:
crt_start:
subui sp,sp,#24
sw bp,[sp]
sw xlr,8[sp]
sw lr,16[sp]
lea xlr,L_41
mov bp,sp
lw r1,#0xAA
outb r1,0xdc0600
sw sp,sp_save
lw sp,#0x1_07FFFFF8
lw r1,#0x17
mov r2,sp
syscall #410
lea xlr,prog_abort
call main
lw sp,sp_save
bra retcode
prog_abort:
subui sp,sp,#16
sw r4,8[sp]
sw r5,[sp]
subui sp,sp,#8
ori r3,r0,#L_0
sw r3,[sp]
call putstr
addui sp,sp,#8
lw r4,8[sp]
lw r5,[sp]
addui sp,sp,#16
lw sp,sp_save
retcode:
L_42:
mov sp,bp
lw bp,[sp]
lw xlr,8[sp]
lw lr,16[sp]
ret #24
L_41:
lw lr,8[bp]
sw lr,16[bp]
bra L_42
align 8
L_40:
dc 80,114,111,103,114,97,109,32
dc 97,98,111,114,116,101,100,32
dc 97,98,110,111,114,109,97,108
dc 108,121,46,0
L_4:
dc 37,100,10,0
L_3:
dc 67,108,111,99,107,32,116,105
dc 99,107,115,32,37,100,13,10
dc 0
L_2:
dc 83,116,97,114,116,32,116,105
dc 99,107,32,37,100,13,10,0
; global putch
; global get_tick
; global my_org
; global printf
; global main
; global putnum
; global putstr
; global crt_start

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.