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

Subversion Repositories thor

[/] [thor/] [trunk/] [software/] [boot_tb/] [boot.asm] - Blame information for rev 5

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 5 robfinch
 
2
; ============================================================================
3
;        __
4
;   \\__/ o\    (C) 2015  Robert Finch, Stratford
5
;    \  __ /    All rights reserved.
6
;     \/_//     robfinch@finitron.ca
7
;       ||
8
;
9
;
10
; This source file is free software: you can redistribute it and/or modify
11
; it under the terms of the GNU Lesser General Public License as published
12
; by the Free Software Foundation, either version 3 of the License, or
13
; (at your option) any later version.
14
;
15
; This source file is distributed in the hope that it will be useful,
16
; but WITHOUT ANY WARRANTY; without even the implied warranty of
17
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
; GNU General Public License for more details.
19
;
20
; You should have received a copy of the GNU General Public License
21
; along with this program.  If not, see .
22
;
23
; ============================================================================
24
;
25
SCRSZ   EQU     4096
26
CR      EQU     0x0D            ;ASCII equates
27
LF      EQU     0x0A
28
TAB     EQU     0x09
29
CTRLC   EQU     0x03
30
BS              EQU     0x07
31
CTRLH   EQU     0x08
32
CTRLI   EQU     0x09
33
CTRLJ   EQU     0x0A
34
CTRLK   EQU     0x0B
35
CTRLM   EQU 0x0D
36
CTRLS   EQU     0x13
37
CTRLX   EQU     0x18
38
XON             EQU     0x11
39
XOFF    EQU     0x13
40
ESC             EQU     0x1B
41
 
42
SC_LSHIFT       EQU             $12
43
SC_RSHIFT       EQU             $59
44
SC_KEYUP        EQU             $F0
45
SC_EXTEND       EQU             $E0
46
SC_CTRL         EQU             $14
47
SC_ALT          EQU             $11
48
SC_DEL          EQU             $71             ; extend
49
SC_LCTRL        EQU             $58
50
SC_NUMLOCK      EQU             $77
51
SC_SCROLLLOCK   EQU     $7E
52
SC_CAPSLOCK     EQU             $58
53
 
54
IOBASE_ADDR     EQU             0xFFD00000
55
IOLMT           EQU             0x100000
56
LEDS            EQU             0xC0600
57
TEXTSCR         EQU             0x00000
58
TEXTSCR2        EQU             0x10000
59
TEXTREG         EQU             0xA0000
60
TEXT_COLS       EQU             0x0
61
TEXT_ROWS       EQU             0x2
62
TEXT_CURPOS     EQU             0x16
63
KEYBD           EQU             0xC0000
64
 
65
PIC_IE          EQU             0xC0FC8
66
PIC_ES          EQU             0xC0FE0
67
PIC_ESR         EQU             0xC0FE8         ; edge sense reset
68
 
69
KeyState1       EQU             $2008
70
KeyState2       EQU             $2009
71
KeybdLEDs       EQU             $200A
72
KeybdWaitFlag   EQU     $200B
73
 
74
CursorX         EQU             $2030
75
CursorY         EQU             $2032
76
VideoPos        EQU             $2034
77
NormAttr        EQU             $2036
78
Vidregs         EQU             $2040
79
Vidptr          EQU             $2044
80
EscState        EQU             $2048
81
Textrows        EQU             $204A
82
Textcols        EQU             $204C
83
 
84
        code
85
        org             $FFFF8000
86
 
87
cold_start:
88
 
89
                ; Initialize segment registers for flat model
90
                mtspr   cs,r0
91
                ldis    cs.lmt,#-1              ; maximum
92
                mtspr   zs,r0
93
                ldis    zs.lmt,#-1
94
                mtspr   ds,r0
95
                ldis    ds.lmt,#-1
96
                mtspr   es,r0
97
                ldis    es.lmt,#-1
98
                mtspr   fs,r0
99
                ldis    fs.lmt,#-1
100
                mtspr   gs,r0
101
                ldis    gs.lmt,#-1
102
                ldis    hs,#IOBASE_ADDR
103
                ldis    hs.lmt,#IOLMT
104
 
105
                ; set SS:SP
106
                mtspr   ss,r0
107
                ldis    ss.lmt,#$4000
108
                ldi             r27,#$03ff8             ; initialize SP
109
 
110
                ; switch processor to full speed
111
                stp             #$FFFF
112
 
113
                ; set interrupt table at $0000
114
                ldis    c12,#0
115
 
116
                ; set all vectors to the uninitialized interrupt vector
117
                mov             r4,r0
118
                ldis    lc,#255         ; 256 vectors to set
119
su1:
120
                ldi             r1,#uii_jmp
121
                mov             r2,r4
122
                bsr             set_vector      ; trashes r2,r3
123
                addui   r4,r4,#1
124
                loop    su1
125
 
126
                ; setup break vector
127
                ldi             r1,#brk_jmp
128
                ldi             r2,#0
129
                bsr             set_vector
130
 
131
                ; setup NMI vector
132
                ldi             r1,#nmi_jmp
133
                ldi             r2,#254
134
                bsr             set_vector
135
 
136
                ; setup IRQ vector
137
                ldi             r1,#tms_jmp
138
                ldi             r2,#194
139
                bsr             set_vector
140
 
141
                ; Initialize PIC
142
                ldi             r1,#%00100              ; time slice interrupt is edge sensitive
143
                sh              r1,hs:PIC_ES
144
                ldi             r1,#%00101              ; enable time slice interrupt, nmi
145
                sh              r1,hs:PIC_IE
146
 
147
                mov             r1,r0
148
                mov             r2,r0
149
                mov             r3,r0
150
                mov             r4,r0
151
                mov             r5,r0
152
 
153
                ldi             r1,#1
154
                sc              r1,$FFDC0600
155
 
156
                tlbwrreg DMA,r0                         ; clear TLB miss registers
157
                tlbwrreg IMA,r0
158
                ldi                     r1,#2                   ; 2 wired registers
159
                tlbwrreg        Wired,r1
160
                ldi                     r1,#$2                  ; 64kiB page size
161
                tlbwrreg        PageSize,r1
162
 
163
                ; setup the first translation
164
                ; virtual page $FFFF0000 maps to physical page $FFFF0000
165
                ; This places the BIOS ROM at $FFFFxxxx in the memory map
166
                ldi                     r1,#$80000101   ; ASID=zero, G=1,valid=1
167
                tlbwrreg        ASID,r1
168
                ldi                     r1,#$0FFFF
169
                tlbwrreg        VirtPage,r1
170
                tlbwrreg        PhysPage,r1
171
                tlbwrreg        Index,r0                ; select way #0
172
                tlbwi                                           ; write to TLB entry group #0 with hold registers
173
 
174
                ; setup second translation
175
                ; virtual page 0 maps to physical page 0
176
                ldi                     r1,#$80000101   ; ASID=zero, G=1,valid=1
177
                tlbwrreg        ASID,r1
178
                tlbwrreg        VirtPage,r0
179
                tlbwrreg        PhysPage,r0
180
                ldi                     r1,#8                   ; select way#1
181
                tlbwrreg        Index,r1
182
                tlbwi                                           ; write to TLB entry group #0 with hold registers
183
 
184
                ; turn on the TLB
185
;               tlben
186
 
187
                ; enable maskable interrupts
188
                ; Interrupts also are not enabled until an RTI instruction is executed.
189
                ; there will likely be a timer interrupt outstanding so this
190
                ; should go to the timer IRQ.
191
                cli
192
 
193
                ; now globally enable interrupts using the RTI instruction, this will also
194
                ; switch to core to application/user mode.
195
                ldis    c14,#j1                 ; c14 contains RTI return address
196
                rti
197
j1:
198
                ldi             r1,#2
199
                sc              r1,$FFDC0600
200
;               ldi             r1,#$AAAAAAAA
201
;               sh              r1,10
202
;               mov             r1,r0
203
;               lh              r1,10
204
;               cmpi    p0,r1,#$AAAAAAAA
205
;p0.ne  br              bad_ram
206
                sb              r0,EscState
207
                bsr             VideoInit
208
                bsr             ClearScreen
209
                bsr             ClearScreen2
210
                ldi             r1,#3
211
                sc              r1,$FFDC0600
212
                bsr             HomeCursor
213
                ldi             r1,#6
214
                sc              r1,$FFDC0600
215
                ldi             r2,#msgStartup
216
                bsr             DisplayString
217
                ldi             r5,#TEXTSCR
218
.0001:
219
                bsr             KeybdGetCharWait
220
                bsr             AsciiToScreen
221
                or              r1,r1,#%000000111_111111111_00_00000000
222
                sh              r1,hs:[r5]
223
                addui   r5,r5,#4
224
                br              .0001
225
 
226
msgStartup:
227
                byte    "Thor Test System Starting...",CR,LF,0
228
 
229
bad_ram:
230
                ldi             r1,#'B'
231
                bsr             AsciiToScreen
232
                ori             r1,r1,#%011000000_111111111_00_00000000
233
                sh              r1,hs:TEXTSCR+16
234
.bram1: br              .bram1
235
 
236
;------------------------------------------------------------------------------
237
; Set interrupt vector
238
;
239
; Parameters:
240
;       r1 = address of jump code
241
;       r2 = vector number to set
242
; Trashes: r2,r3
243
;------------------------------------------------------------------------------
244
 
245
set_vector:
246
                mfspr   r3,c12                  ; get base address of interrupt table
247
                _16addu r2,r2,r3
248
                lh              r3,cs:[r1]
249
                sh              r3,zs:[r2]
250
                lh              r3,cs:4[r1]
251
                sh              r3,zs:4[r2]
252
                lh              r3,cs:8[r1]
253
                sh              r3,zs:8[r2]
254
                lh              r3,cs:12[r1]
255
                sh              r3,zs:12[r2]
256
                rts
257
 
258
;------------------------------------------------------------------------------
259
;------------------------------------------------------------------------------
260
 
261
VideoInit:
262
                ldi             r1,#84
263
                sc              r1,Textcols
264
                ldi             r1,#31
265
                sc              r1,Textrows
266
                ldi             r1,#%011000000_111111111_00_00000000
267
                sh              r1,NormAttr
268
                ldi             r1,#TEXTREG
269
                sh              r1,Vidregs
270
                ldi             r1,#TEXTSCR
271
                sh              r1,Vidptr
272
 
273
                ldi             r2,#TC1InitData
274
                ldis    lc,#10                          ; initialize loop counter ( one less)
275
                lhu             r3,Vidregs
276
.0001:
277
                lvc             r1,cs:[r2]
278
;               sh              r1,hs:[r3]
279
                addui   r2,r2,#2
280
                addui   r3,r3,#4
281
                loop    .0001
282
                rts
283
 
284
;------------------------------------------------------------------------------
285
;------------------------------------------------------------------------------
286
 
287
ClearScreen:
288
;               push    c1
289
                addui   r27,r27,#-8
290
                sws             c1,[r27]
291
                ldi             r1,#' '
292
                bsr             AsciiToScreen
293
                lh              r2,NormAttr
294
                or              r2,r2,r1
295
                ldis    lc,#SCRSZ-1
296
                lh              r1,Vidptr
297
.0001:
298
;               sh              r2,hs:[r1]
299
;               addui   r1,r1,#4
300
;               loop    .0001
301
                ldi             r1,#TEXTSCR
302
                sync
303
                stsh    r2,hs:[r1]
304
;               pop             c1
305
                lws             c1,[r27]
306
                addui   r27,r27,#8
307
                rts
308
 
309
ClearScreen2:
310
                ldis    lc,#SCRSZ-1
311
                ldi             r2,#' '|%000011000_111111111_00_00000000;
312
                ldi             r1,#TEXTSCR2
313
                sync
314
                stsh    r2,hs:[r1]
315
                rts
316
 
317
;------------------------------------------------------------------------------
318
; Scroll the screen upwards.
319
;------------------------------------------------------------------------------
320
 
321
ScrollUp:
322
                ldi             r3,#0
323
                ldi             r2,#4096
324
                lh              r4,Vidptr
325
.0001:
326
                addui   r27,r27,#-8
327
                sw              r2,[r27]
328
                lc              r1,Textcols
329
                add             r3,r3,r1
330
                lh              r1,[r4+r3*4]
331
                lw              r3,[r27]                ; pop r3
332
                addui   r27,r27,#8
333
                sh              r1,[r4+r3*4]
334
                addui   r3,r3,#1
335
                addui   r2,r2,#-1
336
p0.ne   br              .0001
337
                lc              r1,Textrows
338
                addui   r1,r1,#-1
339
 
340
;------------------------------------------------------------------------------
341
; Blank out a line on the screen.
342
;
343
; Parameters:
344
;       r1 = line number to blank
345
; Trashes:
346
;       r2,r3,r4
347
;------------------------------------------------------------------------------
348
 
349
BlankLine:
350
                shli    r1,r1,#1
351
                lc              r3,cs:LineTbl[r1]
352
                lc              r2,Textcols
353
                lh              r1,NormAttr
354
                ori             r1,r1,#$20
355
                lh              r4,Vidptr
356
.0001:
357
                sh              r1,[r4+r3]
358
                addui   r3,r3,#4
359
                addui   r2,r2,#-1
360
p0.ne   br              .0001
361
                rts
362
 
363
;------------------------------------------------------------------------------
364
; Turn cursor on or off.
365
;------------------------------------------------------------------------------
366
 
367
CursorOn:
368
                addui   r27,r27,#-16
369
                sw              r1,8[r27]
370
                sw              r2,[r27]
371
                lh              r2,Vidregs
372
                ldi             r1,#$40
373
                sh              r1,hs:32[r2]
374
                ldi             r1,#$1F
375
                sh              r1,hs:36[r2]
376
                lw              r2,[r27]
377
                lw              r1,8[r27]
378
                rts
379
 
380
CursorOff:
381
                addui   r27,r27,#-16
382
                sw              r1,8[r27]
383
                sw              r2,[r27]
384
                lh              r2,Vidregs
385
                ldi             r1,#$20
386
                sh              r1,hs:32[r2]
387
                mov             r1,r0
388
                sh              r1,hs:36[r2]
389
                lw              r2,[r27]
390
                lw              r1,8[r27]
391
                rts
392
 
393
;------------------------------------------------------------------------------
394
; Get the number of text rows and columns from the video controller.
395
;------------------------------------------------------------------------------
396
 
397
GetTextRowscols:
398
                lh              r2,Vidregs
399
                lvc             r1,hs:0[r2]
400
                sc              r1,Textcols
401
                lvc             r1,hs:4[r2]
402
                sc              r1,Textrows
403
                rts
404
 
405
;------------------------------------------------------------------------------
406
; Set cursor to home position.
407
;------------------------------------------------------------------------------
408
 
409
HomeCursor:
410
                sc              r0,CursorX
411
                sc              r0,CursorY
412
                sc              r0,VideoPos
413
                ldi             r1,#4
414
                sc              r1,$FFDC0600
415
 
416
;------------------------------------------------------------------------------
417
; Synchronize the absolute video position with the cursor co-ordinates.
418
; Does not modify any predicates.
419
;------------------------------------------------------------------------------
420
 
421
SyncVideoPos:
422
                addui   r27,r27,#-24
423
                sw              r1,16[r27]                      ; save off some working regs
424
                sw              r2,8[r27]
425
                sw              r3,[r27]
426
                ldi             r1,#5
427
                sc              r1,$FFDC0600
428
                lc              r2,CursorY
429
                shli    r2,r2,#1
430
                lcu             r1,cs:LineTbl[r2]
431
                shrui   r1,r1,#2
432
                lc              r2,CursorX
433
                addu    r1,r1,r2
434
                sc              r1,VideoPos
435
                lh              r3,Vidregs                      ; r3 = address of video registers
436
                sh              r1,hs:44[r3]            ; Update the position in the text controller
437
                lw              r3,[r27]                        ; restore the regs
438
                lw              r2,8[r27]
439
                lw              r1,16[r27]
440
                addui   r27,r27,#24
441
                rts
442
 
443
                align   2
444
LineTbl:
445
                dc              0
446
                dc              TEXTCOLS*4
447
                dc              TEXTCOLS*8
448
                dc              TEXTCOLS*12
449
                dc              TEXTCOLS*16
450
                dc              TEXTCOLS*20
451
                dc              TEXTCOLS*24
452
                dc              TEXTCOLS*28
453
                dc              TEXTCOLS*32
454
                dc              TEXTCOLS*36
455
                dc              TEXTCOLS*40
456
                dc              TEXTCOLS*44
457
                dc              TEXTCOLS*48
458
                dc              TEXTCOLS*52
459
                dc              TEXTCOLS*56
460
                dc              TEXTCOLS*60
461
                dc              TEXTCOLS*64
462
                dc              TEXTCOLS*68
463
                dc              TEXTCOLS*72
464
                dc              TEXTCOLS*76
465
                dc              TEXTCOLS*80
466
                dc              TEXTCOLS*84
467
                dc              TEXTCOLS*88
468
                dc              TEXTCOLS*92
469
                dc              TEXTCOLS*96
470
                dc              TEXTCOLS*100
471
                dc              TEXTCOLS*104
472
                dc              TEXTCOLS*108
473
                dc              TEXTCOLS*112
474
                dc              TEXTCOLS*116
475
                dc              TEXTCOLS*120
476
                dc              TEXTCOLS*124
477
 
478
TC1InitData:
479
                dc              84              ; #columns
480
                dc              31              ; #rows
481
                dc              64              ; window left
482
                dc              17              ; window top
483
                dc               7              ; max scan line
484
                dc         $21          ; pixel size (hhhhvvvv)
485
                dc        $1FF          ; transparent color
486
                dc         $40          ; cursor blink, start line
487
                dc          31          ; cursor end
488
                dc               0              ; start address
489
                dc               0              ; cursor position
490
TC2InitData:
491
                dc              40
492
                dc              25
493
                dc         376
494
                dc      64              ; window top
495
                dc               7
496
                dc         $10
497
                dc        $1FF
498
                dc         $40
499
                dc      31
500
                dc       0
501
                dc       0
502
 
503
;------------------------------------------------------------------------------
504
; Convert Ascii character to screen character.
505
;------------------------------------------------------------------------------
506
 
507
AsciiToScreen:
508
                zxb             r1,r1
509
                cmp             p0,r1,#' '
510
p0.le   ori             r1,r1,#$100
511
p0.le   br              .0003
512
                cmp             p0,r1,#$5B                      ; special test for  [ ] characters
513
p0.ne   br              .0001
514
                ldi             r1,#$11B
515
                rts
516
.0001:
517
                cmp             p0,r1,#$5D
518
p0.ne   br              .0002
519
                ldi             r1,#$11D
520
                rts
521
.0002:
522
                ori             r1,r1,#$100
523
                biti    p0,r1,#$20                      ; if bit 5 isn't set
524
p0.eq   br              .0003
525
                biti    p0,r1,#$40                      ; or bit 6 isn't set
526
p0.ne   andi    r1,r1,#$19F
527
.0003:
528
                rts
529
 
530
;------------------------------------------------------------------------------
531
; Convert screen character to ascii character
532
;------------------------------------------------------------------------------
533
;
534
ScreenToAscii:
535
                zxb             r1,r1
536
                cmpi    p0,r1,#27
537
p0.le   addi    r1,r1,#$60
538
                rts
539
 
540
.include "DisplayChar.asm"
541
 
542
;------------------------------------------------------------------------------
543
; Display a string on the screen.
544
;------------------------------------------------------------------------------
545
 
546
DisplayString:
547
                ldi             r1,#7
548
                sc              r1,$FFDC0600
549
                ldis    lc,#$FFF
550
.0001:
551
                lbu             r1,[r2]
552
                tst             p2,r1
553
p2.eq   br              .0002
554
                bsr             DisplayChar
555
                addui   r2,r2,#1
556
                loop    .0001
557
.0002:
558
                rts
559
 
560
KeybdGetCharWait:
561
                ldi             r1,#-1
562
                sb              r1,KeybdWaitFlag
563
                br              KeybdGetChar
564
 
565
KeybdGetCharNoWait:
566
                sb              r0,KeybdWaitFlag
567
                br              KeybdGetChar
568
 
569
; Wait for a keyboard character to be available
570
; Returns (-1) if no key available
571
; Return key >= 0 if key is available
572
;
573
;
574
KeybdGetChar:
575
KeybdGetChar1:
576
                addui   r27,r27,#-16
577
                sws             c1,8[r27]               ; save off link register
578
                sw              r2,[r27]
579
.0002:
580
.0003:
581
                memsb
582
                lvb             r1,hs:KEYBD+1   ; check MSB of keyboard status reg.
583
                biti    p0,r1,#$80
584
p0.ne   br              .0006
585
                lb              r1,KeybdWaitFlag
586
                tst             p0,r1
587
p0.lt   br              .0003
588
                lw              r2,[r27]
589
                lws             c1,8[r27]
590
                addui   r27,r27,#16
591
                rts
592
.0006:
593
                memsb
594
                lvb             r1,hs:KEYBD             ; get scan code value
595
                memdb
596
                zxb             r1,r1                   ; make unsigned
597
                sb              r0,hs:KEYBD+1   ; clear read flag
598
                ldi             r3,#3
599
                sc              r3,$FFDC0600
600
.0001:
601
                cmp             p0,r1,#SC_KEYUP ; keyup scan code ?
602
p0.eq   br              .doKeyup
603
                cmp             p0,r1,#SC_EXTEND; extended scan code ?
604
p0.eq   br              .doExtend
605
                cmp             p0,r1,#$14              ; control ?
606
p0.eq   br              .doCtrl
607
                cmp             p0,r1,#$12              ; left shift
608
p0.eq   br              .doShift
609
                cmp             p0,r1,#$59              ; right shift
610
p0.eq   br              .doShift
611
                cmp             p0,r1,#SC_NUMLOCK
612
p0.eq   br              .doNumLock
613
                cmp             p0,r1,#SC_CAPSLOCK
614
p0.eq   br              .doCapsLock
615
                cmp             p0,r1,#SC_SCROLLLOCK
616
p0.eq   br              .doScrollLock
617
                lb              r2,KeyState1
618
                andi    r2,r2,#1
619
                cmp             p0,r2,#0
620
p0.ne   br              .0003
621
                lb              r2,KeyState2    ; Is extended code ?
622
                andi    r2,r2,#$80
623
p0.eq   br              .0010
624
                lb              r2,KeyState2
625
                andi    r2,r2,#$7F
626
                sb              r2,KeyState2
627
                sb              r0,KeyState1    ; clear keyup
628
                andi    r1,r1,#$7F
629
                lbu             r1,cs:keybdExtendedCodes[r1]
630
                br              .0008
631
.0010:
632
                ldi             r3,#4
633
                sc              r3,$FFDC0600
634
                lb              r2,KeyState2
635
                biti    p0,r2,#4                ; Is Cntrl down ?
636
p0.eq   br              .0009
637
                andi    r1,r1,#$7F
638
                lbu             r1,cs:keybdControlCodes[r1]
639
                br              .0008
640
.0009:
641
                lb              r2,KeyState2
642
                biti    p0,r2,#1                ; Is shift down ?
643
p0.eq   br              .0007
644
                andi    r1,r1,#$FF
645
                lbu             r1,cs:shiftedScanCodes[r1]
646
                br              .0008
647
.0007:
648
                andi    r1,r1,#$FF
649
                lbu             r1,cs:unshiftedScanCodes[r1]
650
.0008:
651
                ldi             r3,#5
652
                sc              r3,$FFDC0600
653
                lw              r2,[r27]
654
                lws             c1,8[r27]
655
                addui   r27,r27,#16
656
                rts
657
 
658
.doKeyup:
659
                lb              r2,KeyState1
660
                ori             r2,r2,#1
661
                sb              r2,KeyState1
662
                br              .0003
663
.doExtend:
664
                lb              r2,KeyState2
665
                ori             r2,r2,#$80
666
                sb              r2,KeyState2
667
                br              .0003
668
.doCtrl:
669
                lb              r2,KeyState1
670
                biti    p0,r2,#1
671
p0.eq   br              .0004
672
                lbu             r2,KeyState2
673
                andi    r2,r2,#~4
674
                sb              r2,KeyState2
675
                br              .0003
676
.0004:
677
                lbu             r2,KeyState2
678
                ori             r2,r2,#4
679
                sb              r2,KeyState2
680
                br              .0003
681
.doShift:
682
                lb              r2,KeyState1
683
                biti    p0,r2,#1
684
p0.eq   br              .0005
685
                lbu             r2,KeyState2
686
                andi    r2,r2,#~1
687
                sb              r2,KeyState2
688
                br              .0003
689
.0005:
690
                lbu             r2,KeyState2
691
                ori             r2,r2,#1
692
                sb              r2,KeyState2
693
                br              .0003
694
.doNumLock:
695
                lbu             r2,KeyState2
696
                eori    r2,r2,#16
697
                sb              r2,KeyState2
698
                bsr             KeybdSetLEDStatus
699
                br              .0003
700
.doCapsLock:
701
                lbu             r2,KeyState2
702
                eori    r2,r2,#32
703
                sb              r2,KeyState2
704
                bsr             KeybdSetLEDStatus
705
                br              .0003
706
.doScrollLock:
707
                lbu             r2,KeyState2
708
                eori    r2,r2,#64
709
                sb              r2,KeyState2
710
                bsr             KeybdSetLEDStatus
711
                br              .0003
712
 
713
;------------------------------------------------------------------------------
714
; Set the keyboard LED status leds.
715
; Trashes r1, p0
716
;------------------------------------------------------------------------------
717
 
718
KeybdSetLEDStatus:
719
                addui   r27,r27,#-8
720
                sws             c1,[r27]
721
                sb              r0,KeybdLEDs
722
                lb              r1,KeyState2
723
                biti    p0,r1,#16
724
p0.ne   lb              r1,KeybdLEDs    ; set bit 1 for Num lock, 0 for scrolllock , 2 for caps lock
725
p0.ne   ori             r1,r1,#2
726
p0.ne   sb              r1,KeybdLEDs
727
                lb              r1,KeyState2
728
                biti    p0,r1,#32
729
p0.ne   lb              r1,KeybdLEDs
730
p0.ne   ori             r1,r1,#4
731
p0.ne   sb              r1,KeybdLEDs
732
                lb              r1,KeyState2
733
                biti    p0,r1,#64
734
p0.ne   lb              r1,KeybdLEDs
735
p0.ne   ori             r1,r1,#1
736
p0.ne   sb              r1,KeybdLEDs
737
                ldi             r1,#$ED
738
                sb              r1,hs:KEYBD             ; set status LEDs command
739
                bsr             KeybdWaitTx
740
                bsr             KeybdRecvByte
741
                cmpi    p0,r1,#$FA
742
                lb              r1,KeybdLEDs
743
                sb              r1,hs:KEYBD
744
                bsr             KeybdWaitTx
745
                bsr             KeybdRecvByte
746
                lws             c1,[r27]
747
                addui   r27,r27,#8
748
                rts
749
 
750
;------------------------------------------------------------------------------
751
; Receive a byte from the keyboard, used after a command is sent to the
752
; keyboard in order to wait for a response.
753
;
754
; Returns:
755
;       r1 >= 0 if a scancode is available
756
;   r1 = -1 on timeout
757
;------------------------------------------------------------------------------
758
;
759
KeybdRecvByte:
760
                addui   r27,r27,#-16
761
                sws             c1,8[r27]
762
                sw              r3,[r27]
763
                ldi             r3,#20                  ; wait up to .2s
764
.0003:
765
                bsr             KeybdWaitBusy
766
                lb              r1,hs:KEYBD+1   ; wait for response from keyboard
767
                biti    p0,r1,#$80              ; is input buffer full ?
768
p0.ne   br              .0004                   ; yes, branch
769
                bsr             Wait10ms                ; wait a bit
770
                addui   r3,r3,#-1
771
                tst             p0,r3
772
p0.ne   br              .0003                   ; go back and try again
773
                lw              r3,[r27]                ; timeout
774
                lws             c1,8[r27]
775
                addui   r27,r27,#16
776
                ldi             r1,#-1
777
                rts
778
.0004:
779
                lvb             r1,hs:KEYBD             ; get scancode
780
                zxb             r1,r1                   ; convert to unsigned char
781
                sb              r0,hs:KEYBD+1   ; clear recieve state
782
                lw              r3,[r27]
783
                lws             c1,8[r27]
784
                addui   r27,r27,#16
785
                rts                                             ; return char in r1
786
 
787
;------------------------------------------------------------------------------
788
; Wait until the keyboard isn't busy anymore
789
; Wait until the keyboard transmit is complete
790
; Returns:
791
;    r1 >= 0 if successful
792
;        r1 < 0 if timed out
793
;------------------------------------------------------------------------------
794
;
795
KeybdWaitBusy:                          ; alias for KeybdWaitTx
796
KeybdWaitTx:
797
                addui   r27,r27,#-16
798
                sws             c1,8[r27]
799
                sw              r3,[r27]
800
                ldi             r3,#10                  ; wait a max of .1s
801
.0001:
802
                lvb             r1,hs:KEYBD+1
803
                biti    p0,r1,#$40              ; check for transmit busy bit
804
p0.eq   br              .0002                   ; branch if bit clear
805
                bsr             Wait10ms                ; delay a little bit
806
                addui   r3,r3,#-1               ; go back and try again
807
                tst             p0,r3
808
p0.ne   br              .0001
809
                lw              r3,[r27]                ; timed out
810
                lws             c1,8[r27]
811
                addui   r27,r27,#16
812
                ldi             r1,#-1                  ; return -1
813
                rts
814
.0002:
815
                lw              r3,[r27]                ; wait complete, return
816
                lws             c1,8[r27]               ; restore return address
817
                ldi             r1,#0                   ; return 0 for okay
818
                addui   r27,r27,#16
819
                rts
820
 
821
;------------------------------------------------------------------------------
822
; Delay for about 10 ms.
823
;------------------------------------------------------------------------------
824
 
825
Wait10ms:
826
                addui   r27,r27,#-16
827
                sw              r1,8[r27]
828
                sw              r2,[r27]
829
                mfspr   r1,tick
830
                addui   r1,r1,#250000   ; 10ms at 25 MHz
831
.0001:
832
                mfspr   r2,tick
833
                cmp             p0,r2,r1
834
p0.lt   br              .0001
835
                lw              r2,[r27]
836
                lw              r1,8[r27]
837
                addui   r27,r27,#16
838
                rts
839
 
840
        ;--------------------------------------------------------------------------
841
        ; PS2 scan codes to ascii conversion tables.
842
        ;--------------------------------------------------------------------------
843
        ;
844
unshiftedScanCodes:
845
        byte    $2e,$a9,$2e,$a5,$a3,$a1,$a2,$ac
846
        byte    $2e,$aa,$a8,$a6,$a4,$09,$60,$2e
847
        byte    $2e,$2e,$2e,$2e,$2e,$71,$31,$2e
848
        byte    $2e,$2e,$7a,$73,$61,$77,$32,$2e
849
        byte    $2e,$63,$78,$64,$65,$34,$33,$2e
850
        byte    $2e,$20,$76,$66,$74,$72,$35,$2e
851
        byte    $2e,$6e,$62,$68,$67,$79,$36,$2e
852
        byte    $2e,$2e,$6d,$6a,$75,$37,$38,$2e
853
        byte    $2e,$2c,$6b,$69,$6f,$30,$39,$2e
854
        byte    $2e,$2e,$2f,$6c,$3b,$70,$2d,$2e
855
        byte    $2e,$2e,$27,$2e,$5b,$3d,$2e,$2e
856
        byte    $ad,$2e,$0d,$5d,$2e,$5c,$2e,$2e
857
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$08,$2e
858
        byte    $2e,$95,$2e,$93,$94,$2e,$2e,$2e
859
        byte    $98,$7f,$92,$2e,$91,$90,$1b,$af
860
        byte    $ab,$2e,$97,$2e,$2e,$96,$ae,$2e
861
 
862
        byte    $2e,$2e,$2e,$a7,$2e,$2e,$2e,$2e
863
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
864
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
865
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
866
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
867
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
868
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
869
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
870
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
871
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
872
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
873
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
874
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
875
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
876
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
877
        byte    $2e,$2e,$fa,$2e,$2e,$2e,$2e,$2e
878
 
879
shiftedScanCodes:
880
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
881
        byte    $2e,$2e,$2e,$2e,$2e,$09,$7e,$2e
882
        byte    $2e,$2e,$2e,$2e,$2e,$51,$21,$2e
883
        byte    $2e,$2e,$5a,$53,$41,$57,$40,$2e
884
        byte    $2e,$43,$58,$44,$45,$24,$23,$2e
885
        byte    $2e,$20,$56,$46,$54,$52,$25,$2e
886
        byte    $2e,$4e,$42,$48,$47,$59,$5e,$2e
887
        byte    $2e,$2e,$4d,$4a,$55,$26,$2a,$2e
888
        byte    $2e,$3c,$4b,$49,$4f,$29,$28,$2e
889
        byte    $2e,$3e,$3f,$4c,$3a,$50,$5f,$2e
890
        byte    $2e,$2e,$22,$2e,$7b,$2b,$2e,$2e
891
        byte    $2e,$2e,$0d,$7d,$2e,$7c,$2e,$2e
892
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$08,$2e
893
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
894
        byte    $2e,$7f,$2e,$2e,$2e,$2e,$1b,$2e
895
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
896
 
897
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
898
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
899
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
900
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
901
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
902
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
903
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
904
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
905
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
906
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
907
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
908
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
909
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
910
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
911
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
912
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
913
 
914
; control
915
keybdControlCodes:
916
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
917
        byte    $2e,$2e,$2e,$2e,$2e,$09,$7e,$2e
918
        byte    $2e,$2e,$2e,$2e,$2e,$11,$21,$2e
919
        byte    $2e,$2e,$1a,$13,$01,$17,$40,$2e
920
        byte    $2e,$03,$18,$04,$05,$24,$23,$2e
921
        byte    $2e,$20,$16,$06,$14,$12,$25,$2e
922
        byte    $2e,$0e,$02,$08,$07,$19,$5e,$2e
923
        byte    $2e,$2e,$0d,$0a,$15,$26,$2a,$2e
924
        byte    $2e,$3c,$0b,$09,$0f,$29,$28,$2e
925
        byte    $2e,$3e,$3f,$0c,$3a,$10,$5f,$2e
926
        byte    $2e,$2e,$22,$2e,$7b,$2b,$2e,$2e
927
        byte    $2e,$2e,$0d,$7d,$2e,$7c,$2e,$2e
928
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$08,$2e
929
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
930
        byte    $2e,$7f,$2e,$2e,$2e,$2e,$1b,$2e
931
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
932
 
933
keybdExtendedCodes:
934
        byte    $2e,$2e,$2e,$2e,$a3,$a1,$a2,$2e
935
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
936
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
937
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
938
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
939
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
940
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
941
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
942
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
943
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
944
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
945
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
946
        byte    $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e
947
        byte    $2e,$95,$2e,$93,$94,$2e,$2e,$2e
948
        byte    $98,$99,$92,$2e,$91,$90,$2e,$2e
949
        byte    $2e,$2e,$97,$2e,$2e,$96,$2e,$2e
950
 
951
 
952
;------------------------------------------------------------------------------
953
; Uninitialized interrupt
954
;------------------------------------------------------------------------------
955
uii_rout:
956
                addui   r27,r27,#-16
957
                sw              r1,[r27]
958
                sws             hs,8[r27]
959
 
960
                ; set I/O segment
961
                ldis    hs,#$FFD00000
962
 
963
                ; update on-screen IRQ live indicator
964
                ldi             r1,#'U'|%011000000_111111111_00_00000000
965
                sh              r1,hs:TEXTSCR+320
966
 
967
                ; restore regs and return
968
                lw              r1,[r27]
969
                lws             hs,8[r27]
970
                addui   r27,r27,#16
971
                rti
972
 
973
;------------------------------------------------------------------------------
974
; Non-maskable interrupt routine.
975
;
976
;------------------------------------------------------------------------------
977
;
978
nmi_rout:
979
                addui   r27,r27,#-16
980
                sw              r1,[r27]
981
                sws             hs,8[r27]
982
 
983
                ; set I/O segment
984
                ldis    hs,#$FFD00000
985
 
986
                ; reset the edge sense circuit to re-enable interrupts
987
                ldi             r1,#0
988
                sh              r1,hs:PIC_ESR
989
 
990
                ; update on-screen IRQ live indicator
991
                lh              r1,hs:TEXTSCR+324
992
                addui   r1,r1,#1
993
                sh              r1,hs:TEXTSCR+324
994
 
995
                ; restore regs and return
996
                lw              r1,[r27]
997
                lws             hs,8[r27]
998
                addui   r27,r27,#16
999
                rti
1000
 
1001
;------------------------------------------------------------------------------
1002
; Time Slice IRQ routine.
1003
;
1004
;
1005
;------------------------------------------------------------------------------
1006
;
1007
tms_rout:
1008
                addui   r27,r27,#-16
1009
                sw              r1,[r27]
1010
                sws             hs,8[r27]
1011
 
1012
                ; set I/O segment
1013
                ldis    hs,#$FFD00000
1014
 
1015
                ; reset the edge sense circuit to re-enable interrupts
1016
                ldi             r1,#2
1017
                sh              r1,hs:PIC_ESR
1018
 
1019
                ; update on-screen IRQ live indicator
1020
                lh              r1,hs:TEXTSCR+328
1021
                addui   r1,r1,#1
1022
                sh              r1,hs:TEXTSCR+328
1023
 
1024
                ; restore regs and return
1025
                lw              r1,[r27]
1026
                lws             hs,8[r27]
1027
                addui   r27,r27,#16
1028
                rti
1029
 
1030
;------------------------------------------------------------------------------
1031
; Break routine
1032
;
1033
; Currently uses only registers in case memory is bad, and sets an indicator
1034
; on-screen.
1035
;------------------------------------------------------------------------------
1036
;
1037
brk_rout:
1038
                ldi             r1,#'B'
1039
                bsr             AsciiToScreen
1040
                ori             r1,r1,#|%011000000_111111111_00_00000000
1041
                sh              r1,$FFD00000
1042
                ldi             r1,#'R'
1043
                bsr             AsciiToScreen
1044
                ori             r1,r1,#|%011000000_111111111_00_00000000
1045
                sh              r1,$FFD00004
1046
                ldi             r1,#'K'
1047
                bsr             AsciiToScreen
1048
                ori             r1,r1,#|%011000000_111111111_00_00000000
1049
                sh              r1,$FFD00008
1050
brk_lockup:
1051
                br              brk_lockup[c0]
1052
 
1053
; code snippet to jump to the break routine, copied to the break vector
1054
;
1055
; vector table jumps
1056
;
1057
                align   4
1058
brk_jmp:        jmp             brk_rout[c0]
1059
                align   4
1060
tms_jmp:        jmp             tms_rout[c0]
1061
                align   4
1062
nmi_jmp:        jmp             nmi_rout[c0]
1063
                align   4
1064
uii_jmp:        jmp             uii_rout[c0]
1065
 
1066
;------------------------------------------------------------------------------
1067
; Reset Point
1068
;------------------------------------------------------------------------------
1069
 
1070
                org             $FFFFEFF0
1071
                jmp             cold_start[C15]
1072
 

powered by: WebSVN 2.1.0

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