URL
https://opencores.org/ocsvn/thor/thor/trunk
Subversion Repositories thor
[/] [thor/] [trunk/] [software/] [boot_tb/] [boot.asm] - Rev 12
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 2604CR 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 $58E_BadFuncno EQU 1BIOS_E_Timeout EQU 2E_Unsupported EQU 3BIOS_STACKTOP EQU $3bf8INT_STACK EQU $37f8VIDEO_BIOS_STACKTOP EQU $3ff8IOBASE_ADDR EQU 0xFFD00000IOLMT EQU 0x100000LEDS EQU 0xC0600TEXTSCR EQU 0x00000TEXTSCR2 EQU 0x10000TEXTREG EQU 0xA0000TEXTREG2 EQU 0xA0040TEXT_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 $204Cbssorg $4000Milliseconds dw 0rxfull EQU 1Uart_ms db 0Uart_txxonoff db 0Uart_rxhead dc 0Uart_rxtail dc 0Uart_rxflow db 0Uart_rxrts db 0Uart_rxdtr db 0Uart_rxxon db 0Uart_foff dc 0Uart_fon dc 0Uart_txrts db 0Uart_txdtr db 0Uart_txxon db 0Uart_rxfifo fill.b 512,0NUMWKA fill.b 64,0code 17 bitsorg $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 r31,#$03ef8 ; initialize kernel SPldi r27,#$03bf8 ; initialize SP; switch processor to full speedstp #$FFFF; set interrupt table at $0000ldis c12,#0; set all vectors to the uninitialized interrupt vector; mov r4,r0; ldis lc,#255 ; 256 vectors to set;su1:; ldi r1,#uii_jmp; mov r2,r4; bsr set_vector ; trashes r2,r3; addui r4,r4,#1; loop su1; setup break vectorldi r1,#brk_jmpldi r2,#0bsr set_vector; setup Video BIOS vectorldi r1,#vb_jmpldi r2,#10bsr set_vector; setup NMI vectorldi r1,#nmi_jmpldi r2,#254bsr set_vector; setup MSI vectorsh r0,Millisecondsldi r1,#msi_jmpldi r2,#193bsr set_vector; setup IRQ vectorldi r1,#tms_jmpldi r2,#194bsr set_vector; setup data bus error vectorldi r1,#dbe_jmpldi r2,#251bsr set_vector; Initialize PICldi r1,#%00111 ; time slice interrupt is edge sensitivesh r1,hs:PIC_ESldi r1,#%00111 ; enable time slice interrupt, msi, nmish r1,hs:PIC_IEmov r1,r0mov r2,r0mov r3,r0mov r4,r0mov r5,r0ldi r1,#1sc r1,hs:LEDStlbwrreg 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 addresssync; rtij1:ldi r1,#2sc r1,hs:LEDSsb r0,EscStatebsr SerialInitbsr Debuggerldi r2,#msgStartupldis lc,#msgStartupEnd-msgStartup-1j3:; lbu r1,[r2]; addui r2,r2,#1; tst p0,r1;p0.eq br j2; bsr SerialPutChar; loop j3j2:bsr VideoInitbsr VBClearScreen; bsr VBClearScreen2ldi r1,#3sc r1,hs:LEDSmov r1,r0mov r2,r0ldi r6,#2 ; Set Cursor Possys #10ldi r1,#6sc r1,hs:LEDSbsr alphabetldi r1,#msgStartupldi r6,#$14sys #10; bsr VBDisplayStringldi r5,#TEXTSCR.0001:.0002:bsr KeybdGetCharWaitbsr VBDisplayCharcmpi p0,r1,#CRp0.ne br .0002bsr VBAsciiToScreenori r1,r1,#%000000111_111111111_00_00000000sh r1,hs:[r5]addui r5,r5,#4br .0001msgStartup:byte "Thor Test System Starting...",CR,LF,0msgStartupEnd:bad_ram:ldi r1,#'B'bsr VBAsciiToScreenori r1,r1,#%011000000_111111111_00_00000000sh r1,hs:TEXTSCR+16.bram1: br .bram1;------------------------------------------------------------------------------; alphabet:;; Display the alphabet across the top of the screen.;------------------------------------------------------------------------------alphabet:addui sp,sp,#-8sws c1,[sp] ; store off return addressldi r5,#'A' ; the first charldi r3,#TEXTSCR ; screen addressldis lc,#25 ; 25 chars.0001:mov r1,r5 ; r1 = ascii letterbsr VBAsciiToScreen ; r1 = screen charlhu r2,NormAttr ; r2 = attributeor r1,r1,r2 ; r1 = screen char + attributesh r1,hs:[r3] ; store r1 to screenaddui r5,r5,#1 ; increment to next charaddui r3,r3,#4 ; increment to next screen locloop .0001 ; loop backlws c1,[sp] ; restore return addressaddui sp,sp,#8rts;------------------------------------------------------------------------------; 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.include "video.asm".include "keyboard.asm".include "serial.asm".include "debugger.asm";------------------------------------------------------------------------------; Uninitialized interrupt;------------------------------------------------------------------------------uii_rout:syncldi r31,#INT_STACK-16sw r1,[r31]sws hs,8[r31]; 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,[r31]lws hs,8[r31]syncrti;------------------------------------------------------------------------------; Non-maskable interrupt routine.;;------------------------------------------------------------------------------;nmi_rout:syncldi r31,#INT_STACK-16sw r1,[r31]sws hs,8[r31]; set I/O segmentldis hs,#$FFD00000ldi r1,#16sc r1,hs:LEDS; 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,[r31]lws hs,8[r31]syncrti;------------------------------------------------------------------------------; Millisecond (1024 Hz) interrupt routine.;;------------------------------------------------------------------------------;msi_rout:syncldi r31,#INT_STACK-16sw r1,[r31]sws hs,8[r31]; set I/O segmentldis hs,#$FFD00000ldi r1,#24sc r1,hs:LEDS; reset the edge sense circuit to re-enable interruptsldi r1,#1sh r1,hs:PIC_ESR; update millisecondslh r1,Millisecondsaddui r1,r1,#1sh r1,Milliseconds; restore regs and returnlw r1,[r31]lws hs,8[r31]syncrti;------------------------------------------------------------------------------; Time Slice IRQ routine.;;;------------------------------------------------------------------------------;tms_rout:syncldi r31,#INT_STACK-16sw r1,[r31]sws hs,8[r31]; set I/O segmentldis hs,#$FFD00000ldi r1,#32sc r1,hs:LEDS; 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,[r31]lws hs,8[r31]syncrti;------------------------------------------------------------------------------; Time Slice IRQ routine.;;;------------------------------------------------------------------------------;dbe_rout:syncldi r31,#INT_STACK-24sw r1,[r31]sws hs,8[r31]sw r5,16[r31]; set I/O segmentldis hs,#$FFD00000ldi r1,#64sc r1,hs:LEDS; reset the bus error circuit to re-enable interruptssh r0,hs:$CFFE0; update on-screen DBE indicatorldi r1,'D'|%011000000_000000110_0000000000sh r1,hs:TEXTSCR+320; Advance the program to the next addressmfspr r5,c14bsr DBGGetInsnLengthaddu r1,r5,r1mtspr c14,r1; restore regs and returnlw r1,[r31]lws hs,8[r31]lw r5,16[r31]syncrti;------------------------------------------------------------------------------; Break routine;; Currently uses only registers in case memory is bad, and sets an indicator; on-screen.;------------------------------------------------------------------------------;brk_rout:syncldi r1,#'B'bsr VBAsciiToScreenori r1,r1,#|%011000000_111111111_00_00000000sh r1,zs:$FFD10140ldi r1,#'R'bsr VBAsciiToScreenori r1,r1,#|%011000000_111111111_00_00000000sh r1,zs:$FFD10144ldi r1,#'K'bsr VBAsciiToScreenori r1,r1,#|%011000000_111111111_00_00000000sh r1,zs:$FFD10148ldi r2,#10ldi r6,#0mfspr r5,c13bsr DisplayAddrbrk_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 4msi_jmp: jmp msi_rout[c0]align 4nmi_jmp: jmp nmi_rout[c0]align 4uii_jmp: jmp uii_rout[c0]align 4vb_jmp: jmp VideoBIOSCall[c0]align 4ser_jmp: jmp SerialIRQ[c0]align 4dbe_jmp: jmp dbe_rout[c0];------------------------------------------------------------------------------; Reset Point;------------------------------------------------------------------------------org $FFFFEFF0jmp cold_start[C15]extern my_main : 24
Go to most recent revision | Compare with Previous | Blame | View Log
