URL
https://opencores.org/ocsvn/thor/thor/trunk
Subversion Repositories thor
[/] [thor/] [trunk/] [software/] [boot_tb/] [boot.asm] - Rev 5
Go to most recent revision | Compare with Previous | Blame | View Log
; ============================================================================; __; \\__/ o\ (C) 2015 Robert Finch, Stratford; \ __ / All rights reserved.; \/_// robfinch<remove>@finitron.ca; ||;;; 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; by the Free Software Foundation, either version 3 of the License, or; (at your option) any later version.;; This source file is distributed in the hope that it will be useful,; but WITHOUT ANY WARRANTY; without even the implied warranty of; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the; GNU General Public License for more details.;; You should have received a copy of the GNU General Public License; along with this program. If not, see <http://www.gnu.org/licenses/>.;; ============================================================================;SCRSZ EQU 4096CR EQU 0x0D ;ASCII equatesLF EQU 0x0ATAB EQU 0x09CTRLC EQU 0x03BS EQU 0x07CTRLH EQU 0x08CTRLI EQU 0x09CTRLJ EQU 0x0ACTRLK EQU 0x0BCTRLM EQU 0x0DCTRLS EQU 0x13CTRLX EQU 0x18XON EQU 0x11XOFF EQU 0x13ESC EQU 0x1BSC_LSHIFT EQU $12SC_RSHIFT EQU $59SC_KEYUP EQU $F0SC_EXTEND EQU $E0SC_CTRL EQU $14SC_ALT EQU $11SC_DEL EQU $71 ; extendSC_LCTRL EQU $58SC_NUMLOCK EQU $77SC_SCROLLLOCK EQU $7ESC_CAPSLOCK EQU $58IOBASE_ADDR EQU 0xFFD00000IOLMT EQU 0x100000LEDS EQU 0xC0600TEXTSCR EQU 0x00000TEXTSCR2 EQU 0x10000TEXTREG EQU 0xA0000TEXT_COLS EQU 0x0TEXT_ROWS EQU 0x2TEXT_CURPOS EQU 0x16KEYBD EQU 0xC0000PIC_IE EQU 0xC0FC8PIC_ES EQU 0xC0FE0PIC_ESR EQU 0xC0FE8 ; edge sense resetKeyState1 EQU $2008KeyState2 EQU $2009KeybdLEDs EQU $200AKeybdWaitFlag EQU $200BCursorX EQU $2030CursorY EQU $2032VideoPos EQU $2034NormAttr EQU $2036Vidregs EQU $2040Vidptr EQU $2044EscState EQU $2048Textrows EQU $204ATextcols EQU $204Ccodeorg $FFFF8000cold_start:; Initialize segment registers for flat modelmtspr cs,r0ldis cs.lmt,#-1 ; maximummtspr zs,r0ldis zs.lmt,#-1mtspr ds,r0ldis ds.lmt,#-1mtspr es,r0ldis es.lmt,#-1mtspr fs,r0ldis fs.lmt,#-1mtspr gs,r0ldis gs.lmt,#-1ldis hs,#IOBASE_ADDRldis hs.lmt,#IOLMT; set SS:SPmtspr ss,r0ldis ss.lmt,#$4000ldi r27,#$03ff8 ; initialize SP; switch processor to full speedstp #$FFFF; set interrupt table at $0000ldis c12,#0; set all vectors to the uninitialized interrupt vectormov r4,r0ldis lc,#255 ; 256 vectors to setsu1:ldi r1,#uii_jmpmov r2,r4bsr set_vector ; trashes r2,r3addui r4,r4,#1loop su1; setup break vectorldi r1,#brk_jmpldi r2,#0bsr set_vector; setup NMI vectorldi r1,#nmi_jmpldi r2,#254bsr set_vector; setup IRQ vectorldi r1,#tms_jmpldi r2,#194bsr set_vector; Initialize PICldi r1,#%00100 ; time slice interrupt is edge sensitivesh r1,hs:PIC_ESldi r1,#%00101 ; enable time slice interrupt, nmish r1,hs:PIC_IEmov r1,r0mov r2,r0mov r3,r0mov r4,r0mov r5,r0ldi r1,#1sc r1,$FFDC0600tlbwrreg DMA,r0 ; clear TLB miss registerstlbwrreg IMA,r0ldi r1,#2 ; 2 wired registerstlbwrreg Wired,r1ldi r1,#$2 ; 64kiB page sizetlbwrreg PageSize,r1; setup the first translation; virtual page $FFFF0000 maps to physical page $FFFF0000; This places the BIOS ROM at $FFFFxxxx in the memory mapldi r1,#$80000101 ; ASID=zero, G=1,valid=1tlbwrreg ASID,r1ldi r1,#$0FFFFtlbwrreg VirtPage,r1tlbwrreg PhysPage,r1tlbwrreg Index,r0 ; select way #0tlbwi ; write to TLB entry group #0 with hold registers; setup second translation; virtual page 0 maps to physical page 0ldi r1,#$80000101 ; ASID=zero, G=1,valid=1tlbwrreg ASID,r1tlbwrreg VirtPage,r0tlbwrreg PhysPage,r0ldi r1,#8 ; select way#1tlbwrreg Index,r1tlbwi ; write to TLB entry group #0 with hold registers; turn on the TLB; tlben; enable maskable interrupts; Interrupts also are not enabled until an RTI instruction is executed.; there will likely be a timer interrupt outstanding so this; should go to the timer IRQ.cli; now globally enable interrupts using the RTI instruction, this will also; switch to core to application/user mode.ldis c14,#j1 ; c14 contains RTI return addressrtij1:ldi r1,#2sc r1,$FFDC0600; ldi r1,#$AAAAAAAA; sh r1,10; mov r1,r0; lh r1,10; cmpi p0,r1,#$AAAAAAAA;p0.ne br bad_ramsb r0,EscStatebsr VideoInitbsr ClearScreenbsr ClearScreen2ldi r1,#3sc r1,$FFDC0600bsr HomeCursorldi r1,#6sc r1,$FFDC0600ldi r2,#msgStartupbsr DisplayStringldi r5,#TEXTSCR.0001:bsr KeybdGetCharWaitbsr AsciiToScreenor r1,r1,#%000000111_111111111_00_00000000sh r1,hs:[r5]addui r5,r5,#4br .0001msgStartup:byte "Thor Test System Starting...",CR,LF,0bad_ram:ldi r1,#'B'bsr AsciiToScreenori r1,r1,#%011000000_111111111_00_00000000sh r1,hs:TEXTSCR+16.bram1: br .bram1;------------------------------------------------------------------------------; Set interrupt vector;; Parameters:; r1 = address of jump code; r2 = vector number to set; Trashes: r2,r3;------------------------------------------------------------------------------set_vector:mfspr r3,c12 ; get base address of interrupt table_16addu r2,r2,r3lh r3,cs:[r1]sh r3,zs:[r2]lh r3,cs:4[r1]sh r3,zs:4[r2]lh r3,cs:8[r1]sh r3,zs:8[r2]lh r3,cs:12[r1]sh r3,zs:12[r2]rts;------------------------------------------------------------------------------;------------------------------------------------------------------------------VideoInit:ldi r1,#84sc r1,Textcolsldi r1,#31sc r1,Textrowsldi r1,#%011000000_111111111_00_00000000sh r1,NormAttrldi r1,#TEXTREGsh r1,Vidregsldi r1,#TEXTSCRsh r1,Vidptrldi r2,#TC1InitDataldis lc,#10 ; initialize loop counter ( one less)lhu r3,Vidregs.0001:lvc r1,cs:[r2]; sh r1,hs:[r3]addui r2,r2,#2addui r3,r3,#4loop .0001rts;------------------------------------------------------------------------------;------------------------------------------------------------------------------ClearScreen:; push c1addui r27,r27,#-8sws c1,[r27]ldi r1,#' 'bsr AsciiToScreenlh r2,NormAttror r2,r2,r1ldis lc,#SCRSZ-1lh r1,Vidptr.0001:; sh r2,hs:[r1]; addui r1,r1,#4; loop .0001ldi r1,#TEXTSCRsyncstsh r2,hs:[r1]; pop c1lws c1,[r27]addui r27,r27,#8rtsClearScreen2:ldis lc,#SCRSZ-1ldi r2,#' '|%000011000_111111111_00_00000000;ldi r1,#TEXTSCR2syncstsh r2,hs:[r1]rts;------------------------------------------------------------------------------; Scroll the screen upwards.;------------------------------------------------------------------------------ScrollUp:ldi r3,#0ldi r2,#4096lh r4,Vidptr.0001:addui r27,r27,#-8sw r2,[r27]lc r1,Textcolsadd r3,r3,r1lh r1,[r4+r3*4]lw r3,[r27] ; pop r3addui r27,r27,#8sh r1,[r4+r3*4]addui r3,r3,#1addui r2,r2,#-1p0.ne br .0001lc r1,Textrowsaddui r1,r1,#-1;------------------------------------------------------------------------------; Blank out a line on the screen.;; Parameters:; r1 = line number to blank; Trashes:; r2,r3,r4;------------------------------------------------------------------------------BlankLine:shli r1,r1,#1lc r3,cs:LineTbl[r1]lc r2,Textcolslh r1,NormAttrori r1,r1,#$20lh r4,Vidptr.0001:sh r1,[r4+r3]addui r3,r3,#4addui r2,r2,#-1p0.ne br .0001rts;------------------------------------------------------------------------------; Turn cursor on or off.;------------------------------------------------------------------------------CursorOn:addui r27,r27,#-16sw r1,8[r27]sw r2,[r27]lh r2,Vidregsldi r1,#$40sh r1,hs:32[r2]ldi r1,#$1Fsh r1,hs:36[r2]lw r2,[r27]lw r1,8[r27]rtsCursorOff:addui r27,r27,#-16sw r1,8[r27]sw r2,[r27]lh r2,Vidregsldi r1,#$20sh r1,hs:32[r2]mov r1,r0sh r1,hs:36[r2]lw r2,[r27]lw r1,8[r27]rts;------------------------------------------------------------------------------; Get the number of text rows and columns from the video controller.;------------------------------------------------------------------------------GetTextRowscols:lh r2,Vidregslvc r1,hs:0[r2]sc r1,Textcolslvc r1,hs:4[r2]sc r1,Textrowsrts;------------------------------------------------------------------------------; Set cursor to home position.;------------------------------------------------------------------------------HomeCursor:sc r0,CursorXsc r0,CursorYsc r0,VideoPosldi r1,#4sc r1,$FFDC0600;------------------------------------------------------------------------------; Synchronize the absolute video position with the cursor co-ordinates.; Does not modify any predicates.;------------------------------------------------------------------------------SyncVideoPos:addui r27,r27,#-24sw r1,16[r27] ; save off some working regssw r2,8[r27]sw r3,[r27]ldi r1,#5sc r1,$FFDC0600lc r2,CursorYshli r2,r2,#1lcu r1,cs:LineTbl[r2]shrui r1,r1,#2lc r2,CursorXaddu r1,r1,r2sc r1,VideoPoslh r3,Vidregs ; r3 = address of video registerssh r1,hs:44[r3] ; Update the position in the text controllerlw r3,[r27] ; restore the regslw r2,8[r27]lw r1,16[r27]addui r27,r27,#24rtsalign 2LineTbl:dc 0dc TEXTCOLS*4dc TEXTCOLS*8dc TEXTCOLS*12dc TEXTCOLS*16dc TEXTCOLS*20dc TEXTCOLS*24dc TEXTCOLS*28dc TEXTCOLS*32dc TEXTCOLS*36dc TEXTCOLS*40dc TEXTCOLS*44dc TEXTCOLS*48dc TEXTCOLS*52dc TEXTCOLS*56dc TEXTCOLS*60dc TEXTCOLS*64dc TEXTCOLS*68dc TEXTCOLS*72dc TEXTCOLS*76dc TEXTCOLS*80dc TEXTCOLS*84dc TEXTCOLS*88dc TEXTCOLS*92dc TEXTCOLS*96dc TEXTCOLS*100dc TEXTCOLS*104dc TEXTCOLS*108dc TEXTCOLS*112dc TEXTCOLS*116dc TEXTCOLS*120dc TEXTCOLS*124TC1InitData:dc 84 ; #columnsdc 31 ; #rowsdc 64 ; window leftdc 17 ; window topdc 7 ; max scan linedc $21 ; pixel size (hhhhvvvv)dc $1FF ; transparent colordc $40 ; cursor blink, start linedc 31 ; cursor enddc 0 ; start addressdc 0 ; cursor positionTC2InitData:dc 40dc 25dc 376dc 64 ; window topdc 7dc $10dc $1FFdc $40dc 31dc 0dc 0;------------------------------------------------------------------------------; Convert Ascii character to screen character.;------------------------------------------------------------------------------AsciiToScreen:zxb r1,r1cmp p0,r1,#' 'p0.le ori r1,r1,#$100p0.le br .0003cmp p0,r1,#$5B ; special test for [ ] charactersp0.ne br .0001ldi r1,#$11Brts.0001:cmp p0,r1,#$5Dp0.ne br .0002ldi r1,#$11Drts.0002:ori r1,r1,#$100biti p0,r1,#$20 ; if bit 5 isn't setp0.eq br .0003biti p0,r1,#$40 ; or bit 6 isn't setp0.ne andi r1,r1,#$19F.0003:rts;------------------------------------------------------------------------------; Convert screen character to ascii character;------------------------------------------------------------------------------;ScreenToAscii:zxb r1,r1cmpi p0,r1,#27p0.le addi r1,r1,#$60rts.include "DisplayChar.asm";------------------------------------------------------------------------------; Display a string on the screen.;------------------------------------------------------------------------------DisplayString:ldi r1,#7sc r1,$FFDC0600ldis lc,#$FFF.0001:lbu r1,[r2]tst p2,r1p2.eq br .0002bsr DisplayCharaddui r2,r2,#1loop .0001.0002:rtsKeybdGetCharWait:ldi r1,#-1sb r1,KeybdWaitFlagbr KeybdGetCharKeybdGetCharNoWait:sb r0,KeybdWaitFlagbr KeybdGetChar; Wait for a keyboard character to be available; Returns (-1) if no key available; Return key >= 0 if key is available;;KeybdGetChar:KeybdGetChar1:addui r27,r27,#-16sws c1,8[r27] ; save off link registersw r2,[r27].0002:.0003:memsblvb r1,hs:KEYBD+1 ; check MSB of keyboard status reg.biti p0,r1,#$80p0.ne br .0006lb r1,KeybdWaitFlagtst p0,r1p0.lt br .0003lw r2,[r27]lws c1,8[r27]addui r27,r27,#16rts.0006:memsblvb r1,hs:KEYBD ; get scan code valuememdbzxb r1,r1 ; make unsignedsb r0,hs:KEYBD+1 ; clear read flagldi r3,#3sc r3,$FFDC0600.0001:cmp p0,r1,#SC_KEYUP ; keyup scan code ?p0.eq br .doKeyupcmp p0,r1,#SC_EXTEND; extended scan code ?p0.eq br .doExtendcmp p0,r1,#$14 ; control ?p0.eq br .doCtrlcmp p0,r1,#$12 ; left shiftp0.eq br .doShiftcmp p0,r1,#$59 ; right shiftp0.eq br .doShiftcmp p0,r1,#SC_NUMLOCKp0.eq br .doNumLockcmp p0,r1,#SC_CAPSLOCKp0.eq br .doCapsLockcmp p0,r1,#SC_SCROLLLOCKp0.eq br .doScrollLocklb r2,KeyState1andi r2,r2,#1cmp p0,r2,#0p0.ne br .0003lb r2,KeyState2 ; Is extended code ?andi r2,r2,#$80p0.eq br .0010lb r2,KeyState2andi r2,r2,#$7Fsb r2,KeyState2sb r0,KeyState1 ; clear keyupandi r1,r1,#$7Flbu r1,cs:keybdExtendedCodes[r1]br .0008.0010:ldi r3,#4sc r3,$FFDC0600lb r2,KeyState2biti p0,r2,#4 ; Is Cntrl down ?p0.eq br .0009andi r1,r1,#$7Flbu r1,cs:keybdControlCodes[r1]br .0008.0009:lb r2,KeyState2biti p0,r2,#1 ; Is shift down ?p0.eq br .0007andi r1,r1,#$FFlbu r1,cs:shiftedScanCodes[r1]br .0008.0007:andi r1,r1,#$FFlbu r1,cs:unshiftedScanCodes[r1].0008:ldi r3,#5sc r3,$FFDC0600lw r2,[r27]lws c1,8[r27]addui r27,r27,#16rts.doKeyup:lb r2,KeyState1ori r2,r2,#1sb r2,KeyState1br .0003.doExtend:lb r2,KeyState2ori r2,r2,#$80sb r2,KeyState2br .0003.doCtrl:lb r2,KeyState1biti p0,r2,#1p0.eq br .0004lbu r2,KeyState2andi r2,r2,#~4sb r2,KeyState2br .0003.0004:lbu r2,KeyState2ori r2,r2,#4sb r2,KeyState2br .0003.doShift:lb r2,KeyState1biti p0,r2,#1p0.eq br .0005lbu r2,KeyState2andi r2,r2,#~1sb r2,KeyState2br .0003.0005:lbu r2,KeyState2ori r2,r2,#1sb r2,KeyState2br .0003.doNumLock:lbu r2,KeyState2eori r2,r2,#16sb r2,KeyState2bsr KeybdSetLEDStatusbr .0003.doCapsLock:lbu r2,KeyState2eori r2,r2,#32sb r2,KeyState2bsr KeybdSetLEDStatusbr .0003.doScrollLock:lbu r2,KeyState2eori r2,r2,#64sb r2,KeyState2bsr KeybdSetLEDStatusbr .0003;------------------------------------------------------------------------------; Set the keyboard LED status leds.; Trashes r1, p0;------------------------------------------------------------------------------KeybdSetLEDStatus:addui r27,r27,#-8sws c1,[r27]sb r0,KeybdLEDslb r1,KeyState2biti p0,r1,#16p0.ne lb r1,KeybdLEDs ; set bit 1 for Num lock, 0 for scrolllock , 2 for caps lockp0.ne ori r1,r1,#2p0.ne sb r1,KeybdLEDslb r1,KeyState2biti p0,r1,#32p0.ne lb r1,KeybdLEDsp0.ne ori r1,r1,#4p0.ne sb r1,KeybdLEDslb r1,KeyState2biti p0,r1,#64p0.ne lb r1,KeybdLEDsp0.ne ori r1,r1,#1p0.ne sb r1,KeybdLEDsldi r1,#$EDsb r1,hs:KEYBD ; set status LEDs commandbsr KeybdWaitTxbsr KeybdRecvBytecmpi p0,r1,#$FAlb r1,KeybdLEDssb r1,hs:KEYBDbsr KeybdWaitTxbsr KeybdRecvBytelws c1,[r27]addui r27,r27,#8rts;------------------------------------------------------------------------------; Receive a byte from the keyboard, used after a command is sent to the; keyboard in order to wait for a response.;; Returns:; r1 >= 0 if a scancode is available; r1 = -1 on timeout;------------------------------------------------------------------------------;KeybdRecvByte:addui r27,r27,#-16sws c1,8[r27]sw r3,[r27]ldi r3,#20 ; wait up to .2s.0003:bsr KeybdWaitBusylb r1,hs:KEYBD+1 ; wait for response from keyboardbiti p0,r1,#$80 ; is input buffer full ?p0.ne br .0004 ; yes, branchbsr Wait10ms ; wait a bitaddui r3,r3,#-1tst p0,r3p0.ne br .0003 ; go back and try againlw r3,[r27] ; timeoutlws c1,8[r27]addui r27,r27,#16ldi r1,#-1rts.0004:lvb r1,hs:KEYBD ; get scancodezxb r1,r1 ; convert to unsigned charsb r0,hs:KEYBD+1 ; clear recieve statelw r3,[r27]lws c1,8[r27]addui r27,r27,#16rts ; return char in r1;------------------------------------------------------------------------------; Wait until the keyboard isn't busy anymore; Wait until the keyboard transmit is complete; Returns:; r1 >= 0 if successful; r1 < 0 if timed out;------------------------------------------------------------------------------;KeybdWaitBusy: ; alias for KeybdWaitTxKeybdWaitTx:addui r27,r27,#-16sws c1,8[r27]sw r3,[r27]ldi r3,#10 ; wait a max of .1s.0001:lvb r1,hs:KEYBD+1biti p0,r1,#$40 ; check for transmit busy bitp0.eq br .0002 ; branch if bit clearbsr Wait10ms ; delay a little bitaddui r3,r3,#-1 ; go back and try againtst p0,r3p0.ne br .0001lw r3,[r27] ; timed outlws c1,8[r27]addui r27,r27,#16ldi r1,#-1 ; return -1rts.0002:lw r3,[r27] ; wait complete, returnlws c1,8[r27] ; restore return addressldi r1,#0 ; return 0 for okayaddui r27,r27,#16rts;------------------------------------------------------------------------------; Delay for about 10 ms.;------------------------------------------------------------------------------Wait10ms:addui r27,r27,#-16sw r1,8[r27]sw r2,[r27]mfspr r1,tickaddui r1,r1,#250000 ; 10ms at 25 MHz.0001:mfspr r2,tickcmp p0,r2,r1p0.lt br .0001lw r2,[r27]lw r1,8[r27]addui r27,r27,#16rts;--------------------------------------------------------------------------; PS2 scan codes to ascii conversion tables.;--------------------------------------------------------------------------;unshiftedScanCodes:byte $2e,$a9,$2e,$a5,$a3,$a1,$a2,$acbyte $2e,$aa,$a8,$a6,$a4,$09,$60,$2ebyte $2e,$2e,$2e,$2e,$2e,$71,$31,$2ebyte $2e,$2e,$7a,$73,$61,$77,$32,$2ebyte $2e,$63,$78,$64,$65,$34,$33,$2ebyte $2e,$20,$76,$66,$74,$72,$35,$2ebyte $2e,$6e,$62,$68,$67,$79,$36,$2ebyte $2e,$2e,$6d,$6a,$75,$37,$38,$2ebyte $2e,$2c,$6b,$69,$6f,$30,$39,$2ebyte $2e,$2e,$2f,$6c,$3b,$70,$2d,$2ebyte $2e,$2e,$27,$2e,$5b,$3d,$2e,$2ebyte $ad,$2e,$0d,$5d,$2e,$5c,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$08,$2ebyte $2e,$95,$2e,$93,$94,$2e,$2e,$2ebyte $98,$7f,$92,$2e,$91,$90,$1b,$afbyte $ab,$2e,$97,$2e,$2e,$96,$ae,$2ebyte $2e,$2e,$2e,$a7,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$fa,$2e,$2e,$2e,$2e,$2eshiftedScanCodes:byte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$09,$7e,$2ebyte $2e,$2e,$2e,$2e,$2e,$51,$21,$2ebyte $2e,$2e,$5a,$53,$41,$57,$40,$2ebyte $2e,$43,$58,$44,$45,$24,$23,$2ebyte $2e,$20,$56,$46,$54,$52,$25,$2ebyte $2e,$4e,$42,$48,$47,$59,$5e,$2ebyte $2e,$2e,$4d,$4a,$55,$26,$2a,$2ebyte $2e,$3c,$4b,$49,$4f,$29,$28,$2ebyte $2e,$3e,$3f,$4c,$3a,$50,$5f,$2ebyte $2e,$2e,$22,$2e,$7b,$2b,$2e,$2ebyte $2e,$2e,$0d,$7d,$2e,$7c,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$08,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$7f,$2e,$2e,$2e,$2e,$1b,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e; controlkeybdControlCodes:byte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$09,$7e,$2ebyte $2e,$2e,$2e,$2e,$2e,$11,$21,$2ebyte $2e,$2e,$1a,$13,$01,$17,$40,$2ebyte $2e,$03,$18,$04,$05,$24,$23,$2ebyte $2e,$20,$16,$06,$14,$12,$25,$2ebyte $2e,$0e,$02,$08,$07,$19,$5e,$2ebyte $2e,$2e,$0d,$0a,$15,$26,$2a,$2ebyte $2e,$3c,$0b,$09,$0f,$29,$28,$2ebyte $2e,$3e,$3f,$0c,$3a,$10,$5f,$2ebyte $2e,$2e,$22,$2e,$7b,$2b,$2e,$2ebyte $2e,$2e,$0d,$7d,$2e,$7c,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$08,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$7f,$2e,$2e,$2e,$2e,$1b,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ekeybdExtendedCodes:byte $2e,$2e,$2e,$2e,$a3,$a1,$a2,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2ebyte $2e,$95,$2e,$93,$94,$2e,$2e,$2ebyte $98,$99,$92,$2e,$91,$90,$2e,$2ebyte $2e,$2e,$97,$2e,$2e,$96,$2e,$2e;------------------------------------------------------------------------------; Uninitialized interrupt;------------------------------------------------------------------------------uii_rout:addui r27,r27,#-16sw r1,[r27]sws hs,8[r27]; set I/O segmentldis hs,#$FFD00000; update on-screen IRQ live indicatorldi r1,#'U'|%011000000_111111111_00_00000000sh r1,hs:TEXTSCR+320; restore regs and returnlw r1,[r27]lws hs,8[r27]addui r27,r27,#16rti;------------------------------------------------------------------------------; Non-maskable interrupt routine.;;------------------------------------------------------------------------------;nmi_rout:addui r27,r27,#-16sw r1,[r27]sws hs,8[r27]; set I/O segmentldis hs,#$FFD00000; reset the edge sense circuit to re-enable interruptsldi r1,#0sh r1,hs:PIC_ESR; update on-screen IRQ live indicatorlh r1,hs:TEXTSCR+324addui r1,r1,#1sh r1,hs:TEXTSCR+324; restore regs and returnlw r1,[r27]lws hs,8[r27]addui r27,r27,#16rti;------------------------------------------------------------------------------; Time Slice IRQ routine.;;;------------------------------------------------------------------------------;tms_rout:addui r27,r27,#-16sw r1,[r27]sws hs,8[r27]; set I/O segmentldis hs,#$FFD00000; reset the edge sense circuit to re-enable interruptsldi r1,#2sh r1,hs:PIC_ESR; update on-screen IRQ live indicatorlh r1,hs:TEXTSCR+328addui r1,r1,#1sh r1,hs:TEXTSCR+328; restore regs and returnlw r1,[r27]lws hs,8[r27]addui r27,r27,#16rti;------------------------------------------------------------------------------; Break routine;; Currently uses only registers in case memory is bad, and sets an indicator; on-screen.;------------------------------------------------------------------------------;brk_rout:ldi r1,#'B'bsr AsciiToScreenori r1,r1,#|%011000000_111111111_00_00000000sh r1,$FFD00000ldi r1,#'R'bsr AsciiToScreenori r1,r1,#|%011000000_111111111_00_00000000sh r1,$FFD00004ldi r1,#'K'bsr AsciiToScreenori r1,r1,#|%011000000_111111111_00_00000000sh r1,$FFD00008brk_lockup:br brk_lockup[c0]; code snippet to jump to the break routine, copied to the break vector;; vector table jumps;align 4brk_jmp: jmp brk_rout[c0]align 4tms_jmp: jmp tms_rout[c0]align 4nmi_jmp: jmp nmi_rout[c0]align 4uii_jmp: jmp uii_rout[c0];------------------------------------------------------------------------------; Reset Point;------------------------------------------------------------------------------org $FFFFEFF0jmp cold_start[C15]
Go to most recent revision | Compare with Previous | Blame | View Log
