Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
/*
2
 * non-startup assembly-language assist
3
 */
4
 
5
#include "mem.h"
6
#include "/sys/src/boot/pc/x16.h"
7
#undef DELAY
8
 
9
#define PADDR(a)	((a) & ~KZERO)
10
#define KADDR(a)	(KZERO|(a))
11
 
12
/*
13
 * Some machine instructions not handled by 8[al].
14
 */
15
#define OP16		BYTE $0x66
16
#define DELAY		BYTE $0xEB; BYTE $0x00	/* JMP .+2 */
17
#define CPUID		BYTE $0x0F; BYTE $0xA2	/* CPUID, argument in AX */
18
#define WRMSR		BYTE $0x0F; BYTE $0x30	/* WRMSR, argument in AX/DX (lo/hi) */
19
#define RDTSC 		BYTE $0x0F; BYTE $0x31	/* RDTSC, result in AX/DX (lo/hi) */
20
#define RDMSR		BYTE $0x0F; BYTE $0x32	/* RDMSR, result in AX/DX (lo/hi) */
21
#define HLT		BYTE $0xF4
22
#define INVLPG	BYTE $0x0F; BYTE $0x01; BYTE $0x39	/* INVLPG (%ecx) */
23
#define WBINVD	BYTE $0x0F; BYTE $0x09
24
 
25
/*
26
 * Macros for calculating offsets within the page directory base
27
 * and page tables. Note that these are assembler-specific hence
28
 * the '<<2'.
29
 */
30
#define PDO(a)		(((((a))>>22) & 0x03FF)<<2)
31
#define PTO(a)		(((((a))>>12) & 0x03FF)<<2)
32
 
33
TEXT pagingoff(SB), $0
34
	DELAY				/* JMP .+2 */
35
 
36
	/*
37
	 *  use a jump to an absolute location to get the PC out of
38
	 *  KZERO.  first establishes double mapping of first few MB.
39
	 */
40
	MOVL	CR3, CX				/* load address of PDB */
41
	ADDL	$KZERO, CX
42
	MOVL	PDO(KZERO)(CX), DX		/* double-map KZERO at 0 */
43
	MOVL	DX, PDO(0)(CX)
44
 
45
	MOVL	CR3, CX
46
	MOVL	CX, CR3				/* load and flush the mmu */
47
 
48
	MOVL	  entry+0(FP), DX
49
 
50
	LEAL	_nopaging-KZERO(SB),AX
51
	JMP*	AX				/* jump to identity-map */
52
 
53
TEXT _nopaging(SB), $0
54
	DELAY				/* JMP .+2 */
55
 
56
	/* switch to low stack */
57
	MOVL	SP, AX
58
	MOVL	$RMSTACK, SP
59
//	PUSHL	AX
60
 
61
	/* change gdt to physical pointer */
62
	MOVL	_gdtptr16r-KZERO(SB), GDTR
63
 
64
	/*
65
	 * turn off paging
66
	 */
67
	MOVL	CR0,AX
68
	ANDL	$~PG, AX
69
	MOVL	AX,CR0
70
	DELAY				/* JMP .+2 */
71
 
72
	MOVL	$_stop32pg-KZERO(SB), AX
73
	JMP*	AX				/* forward into the past */
74
 
75
TEXT _stop32pg(SB), $0
76
	MOVL	multibootheader-KZERO(SB), BX	/* multiboot data pointer */
77
	MOVL	$0x2badb002, AX			/* multiboot magic */
78
 
79
	JMP*	DX				/* into the loaded kernel */
80
 
81
_idle:
82
	HLT
83
	JMP	_idle
84
 
85
/*
86
 * BIOS32.
87
 */
88
TEXT bios32call(SB), $0
89
	MOVL	ci+0(FP), BP
90
	MOVL	0(BP), AX
91
	MOVL	4(BP), BX
92
	MOVL	8(BP), CX
93
	MOVL	12(BP), DX
94
	MOVL	16(BP), SI
95
	MOVL	20(BP), DI
96
	PUSHL	BP
97
 
98
	MOVL	12(SP), BP			/* ptr */
99
	BYTE $0xFF; BYTE $0x5D; BYTE $0x00	/* CALL FAR 0(BP) */
100
 
101
	POPL	BP
102
	MOVL	DI, 20(BP)
103
	MOVL	SI, 16(BP)
104
	MOVL	DX, 12(BP)
105
	MOVL	CX, 8(BP)
106
	MOVL	BX, 4(BP)
107
	MOVL	AX, 0(BP)
108
 
109
	XORL	AX, AX
110
	JCC	_bios32xxret
111
	INCL	AX
112
 
113
_bios32xxret:
114
	RET
115
 
116
TEXT cgapost2(SB), 0, $16
117
	MOVL	$0xb8000,CX
118
	MOVL	CX,(SP)
119
	CALL	,kaddr+0(SB)
120
	MOVL	code+0(FP),BP
121
	MOVL	AX,BX
122
	MOVL	BP,CX
123
	SARL	$4,CX
124
	ANDL	$15,CX
125
	MOVBLZX	hex(SB)(CX*1),AX
126
	MOVB	AX,3996(BX)
127
	MOVB	$7,3997(BX)
128
	MOVL	BP,DX
129
	ANDL	$15,DX
130
	MOVBLZX	hex(SB)(DX*1),CX
131
	MOVB	CX,3998(BX)
132
	MOVB	$7,3999(BX)
133
	RET
134
 
135
/*
136
 * Read/write various system registers.
137
 * CR4 and the 'model specific registers' should only be read/written
138
 * after it has been determined the processor supports them
139
 */
140
TEXT ltr(SB), $0				/* TR - task register */
141
	MOVL	tptr+0(FP), AX
142
	MOVW	AX, TASK
143
	RET
144
 
145
TEXT invlpg(SB), $0
146
	/* 486+ only */
147
	MOVL	va+0(FP), CX
148
	INVLPG
149
	RET
150
 
151
TEXT wbinvd(SB), $0
152
	WBINVD
153
	RET
154
 
155
/*
156
 * stub for:
157
 * time stamp counter; low-order 32 bits of 64-bit cycle counter
158
 * Runs at fasthz/4 cycles per second (m->clkin>>3)
159
 */
160
TEXT lcycles(SB),1,$0
161
	RDTSC
162
	RET
163
 
164
/*
165
 * Try to determine the CPU type which requires fiddling with EFLAGS.
166
 * If the Id bit can be toggled then the CPUID instruction can be used
167
 * to determine CPU identity and features. First have to check if it's
168
 * a 386 (Ac bit can't be set). If it's not a 386 and the Id bit can't be
169
 * toggled then it's an older 486 of some kind.
170
 *
171
 *	cpuid(fun, regs[4]);
172
 */
173
TEXT cpuid(SB), $0
174
	MOVL	$0x240000, AX
175
	PUSHL	AX
176
	POPFL					/* set Id|Ac */
177
	PUSHFL
178
	POPL	BX				/* retrieve value */
179
	MOVL	$0, AX
180
	PUSHL	AX
181
	POPFL					/* clear Id|Ac, EFLAGS initialised */
182
	PUSHFL
183
	POPL	AX				/* retrieve value */
184
	XORL	BX, AX
185
	TESTL	$0x040000, AX			/* Ac */
186
	JZ	_cpu386				/* can't set this bit on 386 */
187
	TESTL	$0x200000, AX			/* Id */
188
	JZ	_cpu486				/* can't toggle this bit on some 486 */
189
	MOVL	fn+0(FP), AX
190
	CPUID
191
	JMP	_cpuid
192
_cpu486:
193
	MOVL	$0x400, AX
194
	JMP	_maybezapax
195
_cpu386:
196
	MOVL	$0x300, AX
197
_maybezapax:
198
	CMPL	fn+0(FP), $1
199
	JE	_zaprest
200
	XORL	AX, AX
201
_zaprest:
202
	XORL	BX, BX
203
	XORL	CX, CX
204
	XORL	DX, DX
205
_cpuid:
206
	MOVL	regs+4(FP), BP
207
	MOVL	AX, 0(BP)
208
	MOVL	BX, 4(BP)
209
	MOVL	CX, 8(BP)
210
	MOVL	DX, 12(BP)
211
	RET
212
 
213
/*
214
 * Floating point.
215
 * Note: the encodings for the FCLEX, FINIT, FSAVE, FSTCW, FSENV and FSTSW
216
 * instructions do NOT have the WAIT prefix byte (i.e. they act like their
217
 * FNxxx variations) so WAIT instructions must be explicitly placed in the
218
 * code as necessary.
219
 */
220
#define	FPOFF(l)						 ;\
221
	MOVL	CR0, AX 					 ;\
222
	ANDL	$0xC, AX			/* EM, TS */	 ;\
223
	CMPL	AX, $0x8					 ;\
224
	JEQ 	l						 ;\
225
	WAIT							 ;\
226
l:								 ;\
227
	MOVL	CR0, AX						 ;\
228
	ANDL	$~0x4, AX			/* EM=0 */	 ;\
229
	ORL	$0x28, AX			/* NE=1, TS=1 */ ;\
230
	MOVL	AX, CR0
231
 
232
#define	FPON							 ;\
233
	MOVL	CR0, AX						 ;\
234
	ANDL	$~0xC, AX			/* EM=0, TS=0 */ ;\
235
	MOVL	AX, CR0
236
 
237
TEXT fpoff(SB), $0				/* disable */
238
	FPOFF(l1)
239
	RET
240
 
241
TEXT fpinit(SB), $0				/* enable and init */
242
	FPON
243
	FINIT
244
	WAIT
245
	/* setfcr(FPPDBL|FPRNR|FPINVAL|FPZDIV|FPOVFL) */
246
	/* note that low 6 bits are masks, not enables, on this chip */
247
	PUSHW	$0x0232
248
	FLDCW	0(SP)
249
	POPW	AX
250
	WAIT
251
	RET
252
 
253
/*
254
 * Test-And-Set
255
 */
256
TEXT tas(SB), $0
257
	MOVL	$0xDEADDEAD, AX
258
	MOVL	lock+0(FP), BX
259
	XCHGL	AX, (BX)			/* lock->key */
260
	RET
261
 
262
TEXT _xinc(SB), $0				/* void _xinc(long*); */
263
	MOVL	l+0(FP), AX
264
	LOCK;	INCL 0(AX)
265
	RET
266
 
267
TEXT _xdec(SB), $0				/* long _xdec(long*); */
268
	MOVL	l+0(FP), BX
269
	XORL	AX, AX
270
	LOCK;	DECL 0(BX)
271
	JLT	_xdeclt
272
	JGT	_xdecgt
273
	RET
274
_xdecgt:
275
	INCL	AX
276
	RET
277
_xdeclt:
278
	DECL	AX
279
	RET
280
 
281
TEXT xchgw(SB), $0
282
	MOVL	v+4(FP), AX
283
	MOVL	p+0(FP), BX
284
	XCHGW	AX, (BX)
285
	RET
286
 
287
TEXT cmpswap486(SB), $0
288
	MOVL	addr+0(FP), BX
289
	MOVL	old+4(FP), AX
290
	MOVL	new+8(FP), CX
291
	LOCK
292
	BYTE $0x0F; BYTE $0xB1; BYTE $0x0B	/* CMPXCHGL CX, (BX) */
293
	JNZ didnt
294
	MOVL	$1, AX
295
	RET
296
didnt:
297
	XORL	AX,AX
298
	RET
299
 
300
TEXT mul64fract(SB), $0
301
/*
302
 * Multiply two 64-bit number s and keep the middle 64 bits from the 128-bit result
303
 * See ../port/tod.c for motivation.
304
 */
305
	MOVL	r+0(FP), CX
306
	XORL	BX, BX				/* BX = 0 */
307
 
308
	MOVL	a+8(FP), AX
309
	MULL	b+16(FP)			/* a1*b1 */
310
	MOVL	AX, 4(CX)			/* r2 = lo(a1*b1) */
311
 
312
	MOVL	a+8(FP), AX
313
	MULL	b+12(FP)			/* a1*b0 */
314
	MOVL	AX, 0(CX)			/* r1 = lo(a1*b0) */
315
	ADDL	DX, 4(CX)			/* r2 += hi(a1*b0) */
316
 
317
	MOVL	a+4(FP), AX
318
	MULL	b+16(FP)			/* a0*b1 */
319
	ADDL	AX, 0(CX)			/* r1 += lo(a0*b1) */
320
	ADCL	DX, 4(CX)			/* r2 += hi(a0*b1) + carry */
321
 
322
	MOVL	a+4(FP), AX
323
	MULL	b+12(FP)			/* a0*b0 */
324
	ADDL	DX, 0(CX)			/* r1 += hi(a0*b0) */
325
	ADCL	BX, 4(CX)			/* r2 += carry */
326
	RET
327
 
328
/*
329
 *  label consists of a stack pointer and a PC
330
 */
331
TEXT gotolabel(SB), $0
332
	MOVL	label+0(FP), AX
333
	MOVL	0(AX), SP			/* restore sp */
334
	MOVL	4(AX), AX			/* put return pc on the stack */
335
	MOVL	AX, 0(SP)
336
	MOVL	$1, AX				/* return 1 */
337
	RET
338
 
339
TEXT setlabel(SB), $0
340
	MOVL	label+0(FP), AX
341
	MOVL	SP, 0(AX)			/* store sp */
342
	MOVL	0(SP), BX			/* store return pc */
343
	MOVL	BX, 4(AX)
344
	MOVL	$0, AX				/* return 0 */
345
	RET
346
 
347
/*
348
 * Attempt at power saving. -rsc
349
 */
350
TEXT halt(SB), $0
351
	CLI					/* interrupts off */
352
	CMPL	nrdy(SB), $0
353
	JEQ	_nothingready
354
	STI					/* interrupts on */
355
	RET
356
 
357
_nothingready:
358
	STI			/* interrupts on: service before rescheduling */
359
	HLT
360
	RET
361
 
362
/*
363
 * Interrupt/exception handling.
364
 * Each entry in the vector table calls either _strayintr or _strayintrx depending
365
 * on whether an error code has been automatically pushed onto the stack
366
 * (_strayintrx) or not, in which case a dummy entry must be pushed before retrieving
367
 * the trap type from the vector table entry and placing it on the stack as part
368
 * of the Ureg structure.
369
 * The size of each entry in the vector table (6 bytes) is known in trapinit().
370
 */
371
TEXT _strayintr(SB), $0
372
	PUSHL	AX			/* save AX */
373
	MOVL	4(SP), AX		/* return PC from vectortable(SB) */
374
	JMP	intrcommon
375
 
376
TEXT _strayintrx(SB), $0
377
	XCHGL	AX, (SP)		/* swap AX with vectortable CALL PC */
378
intrcommon:
379
	PUSHL	DS			/* save DS */
380
	PUSHL	$(KDSEL)
381
	POPL	DS			/* fix up DS */
382
	MOVBLZX	(AX), AX		/* trap type -> AX */
383
	XCHGL	AX, 4(SP)		/* exchange trap type with saved AX */
384
 
385
	PUSHL	ES			/* save ES */
386
	PUSHL	$(KDSEL)
387
	POPL	ES			/* fix up ES */
388
 
389
	PUSHL	FS			/* save the rest of the Ureg struct */
390
	PUSHL	GS
391
	PUSHAL
392
 
393
	PUSHL	SP			/* Ureg* argument to trap */
394
	CALL	trap(SB)
395
 
396
TEXT forkret(SB), $0
397
	POPL	AX
398
	POPAL
399
	POPL	GS
400
	POPL	FS
401
	POPL	ES
402
	POPL	DS
403
	ADDL	$8, SP			/* pop error code and trap type */
404
	IRETL
405
 
406
TEXT vectortable(SB), $0
407
	CALL _strayintr(SB); BYTE $0x00		/* divide error */
408
	CALL _strayintr(SB); BYTE $0x01		/* debug exception */
409
	CALL _strayintr(SB); BYTE $0x02		/* NMI interrupt */
410
	CALL _strayintr(SB); BYTE $0x03		/* breakpoint */
411
	CALL _strayintr(SB); BYTE $0x04		/* overflow */
412
	CALL _strayintr(SB); BYTE $0x05		/* bound */
413
	CALL _strayintr(SB); BYTE $0x06		/* invalid opcode */
414
	CALL _strayintr(SB); BYTE $0x07		/* no coprocessor available */
415
	CALL _strayintrx(SB); BYTE $0x08	/* double fault */
416
	CALL _strayintr(SB); BYTE $0x09		/* coprocessor segment overflow */
417
	CALL _strayintrx(SB); BYTE $0x0A	/* invalid TSS */
418
	CALL _strayintrx(SB); BYTE $0x0B	/* segment not available */
419
	CALL _strayintrx(SB); BYTE $0x0C	/* stack exception */
420
	CALL _strayintrx(SB); BYTE $0x0D	/* general protection error */
421
	CALL _strayintrx(SB); BYTE $0x0E	/* page fault */
422
	CALL _strayintr(SB); BYTE $0x0F		/*  */
423
	CALL _strayintr(SB); BYTE $0x10		/* coprocessor error */
424
	CALL _strayintrx(SB); BYTE $0x11	/* alignment check */
425
	CALL _strayintr(SB); BYTE $0x12		/* machine check */
426
	CALL _strayintr(SB); BYTE $0x13
427
	CALL _strayintr(SB); BYTE $0x14
428
	CALL _strayintr(SB); BYTE $0x15
429
	CALL _strayintr(SB); BYTE $0x16
430
	CALL _strayintr(SB); BYTE $0x17
431
	CALL _strayintr(SB); BYTE $0x18
432
	CALL _strayintr(SB); BYTE $0x19
433
	CALL _strayintr(SB); BYTE $0x1A
434
	CALL _strayintr(SB); BYTE $0x1B
435
	CALL _strayintr(SB); BYTE $0x1C
436
	CALL _strayintr(SB); BYTE $0x1D
437
	CALL _strayintr(SB); BYTE $0x1E
438
	CALL _strayintr(SB); BYTE $0x1F
439
	CALL _strayintr(SB); BYTE $0x20		/* VectorLAPIC */
440
	CALL _strayintr(SB); BYTE $0x21
441
	CALL _strayintr(SB); BYTE $0x22
442
	CALL _strayintr(SB); BYTE $0x23
443
	CALL _strayintr(SB); BYTE $0x24
444
	CALL _strayintr(SB); BYTE $0x25
445
	CALL _strayintr(SB); BYTE $0x26
446
	CALL _strayintr(SB); BYTE $0x27
447
	CALL _strayintr(SB); BYTE $0x28
448
	CALL _strayintr(SB); BYTE $0x29
449
	CALL _strayintr(SB); BYTE $0x2A
450
	CALL _strayintr(SB); BYTE $0x2B
451
	CALL _strayintr(SB); BYTE $0x2C
452
	CALL _strayintr(SB); BYTE $0x2D
453
	CALL _strayintr(SB); BYTE $0x2E
454
	CALL _strayintr(SB); BYTE $0x2F
455
	CALL _strayintr(SB); BYTE $0x30
456
	CALL _strayintr(SB); BYTE $0x31
457
	CALL _strayintr(SB); BYTE $0x32
458
	CALL _strayintr(SB); BYTE $0x33
459
	CALL _strayintr(SB); BYTE $0x34
460
	CALL _strayintr(SB); BYTE $0x35
461
	CALL _strayintr(SB); BYTE $0x36
462
	CALL _strayintr(SB); BYTE $0x37
463
	CALL _strayintr(SB); BYTE $0x38
464
	CALL _strayintr(SB); BYTE $0x39
465
	CALL _strayintr(SB); BYTE $0x3A
466
	CALL _strayintr(SB); BYTE $0x3B
467
	CALL _strayintr(SB); BYTE $0x3C
468
	CALL _strayintr(SB); BYTE $0x3D
469
	CALL _strayintr(SB); BYTE $0x3E
470
	CALL _strayintr(SB); BYTE $0x3F
471
//	CALL _syscallintr(SB); BYTE $0x40	/* VectorSYSCALL */
472
	CALL _strayintr(SB); BYTE $0x40
473
	CALL _strayintr(SB); BYTE $0x41
474
	CALL _strayintr(SB); BYTE $0x42
475
	CALL _strayintr(SB); BYTE $0x43
476
	CALL _strayintr(SB); BYTE $0x44
477
	CALL _strayintr(SB); BYTE $0x45
478
	CALL _strayintr(SB); BYTE $0x46
479
	CALL _strayintr(SB); BYTE $0x47
480
	CALL _strayintr(SB); BYTE $0x48
481
	CALL _strayintr(SB); BYTE $0x49
482
	CALL _strayintr(SB); BYTE $0x4A
483
	CALL _strayintr(SB); BYTE $0x4B
484
	CALL _strayintr(SB); BYTE $0x4C
485
	CALL _strayintr(SB); BYTE $0x4D
486
	CALL _strayintr(SB); BYTE $0x4E
487
	CALL _strayintr(SB); BYTE $0x4F
488
	CALL _strayintr(SB); BYTE $0x50
489
	CALL _strayintr(SB); BYTE $0x51
490
	CALL _strayintr(SB); BYTE $0x52
491
	CALL _strayintr(SB); BYTE $0x53
492
	CALL _strayintr(SB); BYTE $0x54
493
	CALL _strayintr(SB); BYTE $0x55
494
	CALL _strayintr(SB); BYTE $0x56
495
	CALL _strayintr(SB); BYTE $0x57
496
	CALL _strayintr(SB); BYTE $0x58
497
	CALL _strayintr(SB); BYTE $0x59
498
	CALL _strayintr(SB); BYTE $0x5A
499
	CALL _strayintr(SB); BYTE $0x5B
500
	CALL _strayintr(SB); BYTE $0x5C
501
	CALL _strayintr(SB); BYTE $0x5D
502
	CALL _strayintr(SB); BYTE $0x5E
503
	CALL _strayintr(SB); BYTE $0x5F
504
	CALL _strayintr(SB); BYTE $0x60
505
	CALL _strayintr(SB); BYTE $0x61
506
	CALL _strayintr(SB); BYTE $0x62
507
	CALL _strayintr(SB); BYTE $0x63
508
	CALL _strayintr(SB); BYTE $0x64
509
	CALL _strayintr(SB); BYTE $0x65
510
	CALL _strayintr(SB); BYTE $0x66
511
	CALL _strayintr(SB); BYTE $0x67
512
	CALL _strayintr(SB); BYTE $0x68
513
	CALL _strayintr(SB); BYTE $0x69
514
	CALL _strayintr(SB); BYTE $0x6A
515
	CALL _strayintr(SB); BYTE $0x6B
516
	CALL _strayintr(SB); BYTE $0x6C
517
	CALL _strayintr(SB); BYTE $0x6D
518
	CALL _strayintr(SB); BYTE $0x6E
519
	CALL _strayintr(SB); BYTE $0x6F
520
	CALL _strayintr(SB); BYTE $0x70
521
	CALL _strayintr(SB); BYTE $0x71
522
	CALL _strayintr(SB); BYTE $0x72
523
	CALL _strayintr(SB); BYTE $0x73
524
	CALL _strayintr(SB); BYTE $0x74
525
	CALL _strayintr(SB); BYTE $0x75
526
	CALL _strayintr(SB); BYTE $0x76
527
	CALL _strayintr(SB); BYTE $0x77
528
	CALL _strayintr(SB); BYTE $0x78
529
	CALL _strayintr(SB); BYTE $0x79
530
	CALL _strayintr(SB); BYTE $0x7A
531
	CALL _strayintr(SB); BYTE $0x7B
532
	CALL _strayintr(SB); BYTE $0x7C
533
	CALL _strayintr(SB); BYTE $0x7D
534
	CALL _strayintr(SB); BYTE $0x7E
535
	CALL _strayintr(SB); BYTE $0x7F
536
	CALL _strayintr(SB); BYTE $0x80		/* Vector[A]PIC */
537
	CALL _strayintr(SB); BYTE $0x81
538
	CALL _strayintr(SB); BYTE $0x82
539
	CALL _strayintr(SB); BYTE $0x83
540
	CALL _strayintr(SB); BYTE $0x84
541
	CALL _strayintr(SB); BYTE $0x85
542
	CALL _strayintr(SB); BYTE $0x86
543
	CALL _strayintr(SB); BYTE $0x87
544
	CALL _strayintr(SB); BYTE $0x88
545
	CALL _strayintr(SB); BYTE $0x89
546
	CALL _strayintr(SB); BYTE $0x8A
547
	CALL _strayintr(SB); BYTE $0x8B
548
	CALL _strayintr(SB); BYTE $0x8C
549
	CALL _strayintr(SB); BYTE $0x8D
550
	CALL _strayintr(SB); BYTE $0x8E
551
	CALL _strayintr(SB); BYTE $0x8F
552
	CALL _strayintr(SB); BYTE $0x90
553
	CALL _strayintr(SB); BYTE $0x91
554
	CALL _strayintr(SB); BYTE $0x92
555
	CALL _strayintr(SB); BYTE $0x93
556
	CALL _strayintr(SB); BYTE $0x94
557
	CALL _strayintr(SB); BYTE $0x95
558
	CALL _strayintr(SB); BYTE $0x96
559
	CALL _strayintr(SB); BYTE $0x97
560
	CALL _strayintr(SB); BYTE $0x98
561
	CALL _strayintr(SB); BYTE $0x99
562
	CALL _strayintr(SB); BYTE $0x9A
563
	CALL _strayintr(SB); BYTE $0x9B
564
	CALL _strayintr(SB); BYTE $0x9C
565
	CALL _strayintr(SB); BYTE $0x9D
566
	CALL _strayintr(SB); BYTE $0x9E
567
	CALL _strayintr(SB); BYTE $0x9F
568
	CALL _strayintr(SB); BYTE $0xA0
569
	CALL _strayintr(SB); BYTE $0xA1
570
	CALL _strayintr(SB); BYTE $0xA2
571
	CALL _strayintr(SB); BYTE $0xA3
572
	CALL _strayintr(SB); BYTE $0xA4
573
	CALL _strayintr(SB); BYTE $0xA5
574
	CALL _strayintr(SB); BYTE $0xA6
575
	CALL _strayintr(SB); BYTE $0xA7
576
	CALL _strayintr(SB); BYTE $0xA8
577
	CALL _strayintr(SB); BYTE $0xA9
578
	CALL _strayintr(SB); BYTE $0xAA
579
	CALL _strayintr(SB); BYTE $0xAB
580
	CALL _strayintr(SB); BYTE $0xAC
581
	CALL _strayintr(SB); BYTE $0xAD
582
	CALL _strayintr(SB); BYTE $0xAE
583
	CALL _strayintr(SB); BYTE $0xAF
584
	CALL _strayintr(SB); BYTE $0xB0
585
	CALL _strayintr(SB); BYTE $0xB1
586
	CALL _strayintr(SB); BYTE $0xB2
587
	CALL _strayintr(SB); BYTE $0xB3
588
	CALL _strayintr(SB); BYTE $0xB4
589
	CALL _strayintr(SB); BYTE $0xB5
590
	CALL _strayintr(SB); BYTE $0xB6
591
	CALL _strayintr(SB); BYTE $0xB7
592
	CALL _strayintr(SB); BYTE $0xB8
593
	CALL _strayintr(SB); BYTE $0xB9
594
	CALL _strayintr(SB); BYTE $0xBA
595
	CALL _strayintr(SB); BYTE $0xBB
596
	CALL _strayintr(SB); BYTE $0xBC
597
	CALL _strayintr(SB); BYTE $0xBD
598
	CALL _strayintr(SB); BYTE $0xBE
599
	CALL _strayintr(SB); BYTE $0xBF
600
	CALL _strayintr(SB); BYTE $0xC0
601
	CALL _strayintr(SB); BYTE $0xC1
602
	CALL _strayintr(SB); BYTE $0xC2
603
	CALL _strayintr(SB); BYTE $0xC3
604
	CALL _strayintr(SB); BYTE $0xC4
605
	CALL _strayintr(SB); BYTE $0xC5
606
	CALL _strayintr(SB); BYTE $0xC6
607
	CALL _strayintr(SB); BYTE $0xC7
608
	CALL _strayintr(SB); BYTE $0xC8
609
	CALL _strayintr(SB); BYTE $0xC9
610
	CALL _strayintr(SB); BYTE $0xCA
611
	CALL _strayintr(SB); BYTE $0xCB
612
	CALL _strayintr(SB); BYTE $0xCC
613
	CALL _strayintr(SB); BYTE $0xCD
614
	CALL _strayintr(SB); BYTE $0xCE
615
	CALL _strayintr(SB); BYTE $0xCF
616
	CALL _strayintr(SB); BYTE $0xD0
617
	CALL _strayintr(SB); BYTE $0xD1
618
	CALL _strayintr(SB); BYTE $0xD2
619
	CALL _strayintr(SB); BYTE $0xD3
620
	CALL _strayintr(SB); BYTE $0xD4
621
	CALL _strayintr(SB); BYTE $0xD5
622
	CALL _strayintr(SB); BYTE $0xD6
623
	CALL _strayintr(SB); BYTE $0xD7
624
	CALL _strayintr(SB); BYTE $0xD8
625
	CALL _strayintr(SB); BYTE $0xD9
626
	CALL _strayintr(SB); BYTE $0xDA
627
	CALL _strayintr(SB); BYTE $0xDB
628
	CALL _strayintr(SB); BYTE $0xDC
629
	CALL _strayintr(SB); BYTE $0xDD
630
	CALL _strayintr(SB); BYTE $0xDE
631
	CALL _strayintr(SB); BYTE $0xDF
632
	CALL _strayintr(SB); BYTE $0xE0
633
	CALL _strayintr(SB); BYTE $0xE1
634
	CALL _strayintr(SB); BYTE $0xE2
635
	CALL _strayintr(SB); BYTE $0xE3
636
	CALL _strayintr(SB); BYTE $0xE4
637
	CALL _strayintr(SB); BYTE $0xE5
638
	CALL _strayintr(SB); BYTE $0xE6
639
	CALL _strayintr(SB); BYTE $0xE7
640
	CALL _strayintr(SB); BYTE $0xE8
641
	CALL _strayintr(SB); BYTE $0xE9
642
	CALL _strayintr(SB); BYTE $0xEA
643
	CALL _strayintr(SB); BYTE $0xEB
644
	CALL _strayintr(SB); BYTE $0xEC
645
	CALL _strayintr(SB); BYTE $0xED
646
	CALL _strayintr(SB); BYTE $0xEE
647
	CALL _strayintr(SB); BYTE $0xEF
648
	CALL _strayintr(SB); BYTE $0xF0
649
	CALL _strayintr(SB); BYTE $0xF1
650
	CALL _strayintr(SB); BYTE $0xF2
651
	CALL _strayintr(SB); BYTE $0xF3
652
	CALL _strayintr(SB); BYTE $0xF4
653
	CALL _strayintr(SB); BYTE $0xF5
654
	CALL _strayintr(SB); BYTE $0xF6
655
	CALL _strayintr(SB); BYTE $0xF7
656
	CALL _strayintr(SB); BYTE $0xF8
657
	CALL _strayintr(SB); BYTE $0xF9
658
	CALL _strayintr(SB); BYTE $0xFA
659
	CALL _strayintr(SB); BYTE $0xFB
660
	CALL _strayintr(SB); BYTE $0xFC
661
	CALL _strayintr(SB); BYTE $0xFD
662
	CALL _strayintr(SB); BYTE $0xFE
663
	CALL _strayintr(SB); BYTE $0xFF