URL
https://opencores.org/ocsvn/thor/thor/trunk
Subversion Repositories thor
[/] [thor/] [trunk/] [software/] [boot_tb/] [boot.asm] - Rev 28
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/>.;; ============================================================================;.include "C:\Cores4\Thor\trunk\software\FMTK\source\kernel\FMTK_Equates.inc"SCRSZ EQU 2604_BS EQU 0x07CR EQU 0x0D ;ASCII equatesLF EQU 0x0ATAB EQU 0x09CTRLC EQU 0x03CTRLH EQU 0x08CTRLI EQU 0x09CTRLJ EQU 0x0ACTRLK EQU 0x0BCTRLM EQU 0x0DCTRLS EQU 0x13CTRLX EQU 0x18XON EQU 0x11XOFF EQU 0x13ESC EQU 0x1BSC_TAB EQU $0DSC_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_IS EQU 0xC0FC0PIC_IE EQU 0xC0FC8PIC_ES EQU 0xC0FE0PIC_ESR EQU 0xC0FE8 ; edge sense resetbssorg $0000dw 0 ; the first word is unusedMilliseconds dw 0m_w dh 0m_z dh 0FMTK_SchedulerIRQ_vec dw 0Running_ dw 0IOFocusNdx_ dw 0iof_switch_ db 0align 8NextRdy_ dw 0PrevRdy_ dw 0KeyState1 db 0KeyState2 db 0KeybdLEDs db 0KeybdWaitFlag db 0align 2KeybdHead db 0KeybdTail db 0KeybdBufSz db 0KeybdBuf fill.b 128,0align 2CursorX dc 0CursorY dc 0VideoPos dc 0align 4NormAttr dh 0Vidregs dh 0Vidptr dh 0EscState dc 0Textrows dc 0Textcols dc 0align 8reg_save fill.w 64,0creg_save fill.w 16,0sreg_save fill.w 16,0preg_save dw 0bssorg $4000rxfull 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 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 $1000ldis c12,#$1000; 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 vectorlla r1,cs:brk_jmpldi r2,#0bsr set_vector; setup system scheduler vector; points to an RTE at startuplla r1,cs:tms_jmpldi r2,#2bsr set_vectorlla r1,cs:rte_jmpldi r2,#3bsr set_vector; setup Video BIOS vectorlla r1,cs:vb_jmpldi r2,#10bsr set_vector; setup NMI vectorlla r1,cs:nmi_jmpldi r2,#254bsr set_vectorlla r1,cs:svc_jmpldi r2,#190bsr set_vectorlla r1,cs:rsc_jmpldi r2,#191bsr set_vector; spurious interrupt;lla r1,cs:spur_jmpldi r2,#192bsr set_vector; setup MSI vectorsh r0,Millisecondslla r1,cs:msi_jmpldi r2,#193bsr set_vector; setup BTNU vectorlla r1,cs:btnu_jmpldi r2,#200bsr set_vector; setup KM vectorlla r1,cs:km_jmpldi r2,#245bsr set_vector; setup data bus error vectorlla r1,cs:dbe_jmpldi r2,#251bsr set_vectorldi r1,#JCB_Arraysw r1,zs:RunningJCB_sw r1,zs:IOFocusNdx_ ; set I/O focus to BIOSldi r1,#TCB_Arraysw r1,zs:RunningTCB_sb r0,zs:iof_switch_ ; reset switch flagmov tr,r0bsr KeybdInitjsr FMTKInitialize_; Initialize PICldi r1,#%00000111 ; nmi, time slice interrupt is edge sensitivesh r1,hs:PIC_ESldi r1,#%000001111 ; enable time slice interrupt, msi, nmish r1,hs:PIC_IE; Initialize random number generator; m_z and m_w must not be zeroldi r1,#$88888888sh r1,m_wldi r1,#$77777777sh r1,m_zmov 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 addresssyncrtij1:ldi r1,#2sc r1,hs:LEDSsb r0,EscStatebsr SerialInit; bsr 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 alphabetlla r1,cs:msgStartup ; convert to linear addressldi r6,#$14sys #10;------------------------------------------------------------------------------;------------------------------------------------------------------------------; Monitor;------------------------------------------------------------------------------;------------------------------------------------------------------------------Monitor:lla r1,cs:msgMonitorbsr VBDisplayString; Display monitor prompt.prompt:ldi r1,#CRbsr VBDisplayCharldi r1,#LFbsr VBDisplayCharldi r1,#'$'bsr VBDisplayCharbsr CursorOn.getkey:bsr KeybdGetCharWaitbsr VBDisplayCharcmpi p0,r1,#CRp0.ne br .getkeybsr CursorOfflcu r1,CursorYlcu r7,Textcolsmtspr lc,r7 ; use loop counter as safetymulu r10,r1,r7 ; pos = row * cols_4addu r10,r10,r0 ; pos *= 4.0001:bsr MonGetch1 ; get character skipping spacescmpi p0,r1,#'$' ; skip over promptp0.eq br .0001cmpi p0,r1,#'d' ; debug ?p0.eq bsr Debuggerp0.eq br .promptcmpi p0,r1,#'g'p0.eq bsr GoGraphicsp0.eq br .promptcmpi p0,r1,#'t'p0.eq bsr MonGetchp0.eq cmpi p0,r1,#'x'p0.eq bsr GoTextp0.eq br .promptcmpi p0,r1,'r'p0.eq bsr RandomDotsp0.eq br .promptcmpi p0,r1,#'c'p0.eq bsr VBClearScreenp0.eq mov r1,r0p0.eq mov r2,r0p0.eq ldi r6,#2p0.eq sys #10br .prompt;------------------------------------------------------------------------------; Returns:; r1 ascii code for character; r10 incremented; lc decremented;------------------------------------------------------------------------------MonGetch:addui r31,r31,#-8sws c1,[r31]lhu r1,hs:[r10]andi r1,r1,#$3ffbsr VBScreenToAsciiaddui r10,r10,#4loop .0001 ; decrement loop counter.0001:lws c1,[r31]addui r31,r31,#8rts;------------------------------------------------------------------------------; Returns:; r1 ascii code for character; r10 incremented by number of spaces + 1; lc decremented by number of spaces + 1;------------------------------------------------------------------------------MonGetch1:addui r31,r31,#-8sws c1,[r31].0001:lhu r1,hs:[r10]andi r1,r1,#$3ffbsr VBScreenToAsciiaddui r10,r10,#4cmpi p0,r1,#' 'p0.leu loop .0001lws c1,[r31]addui r31,r31,#8rts;------------------------------------------------------------------------------; Go into graphics mode, four lines of text at bottom.;------------------------------------------------------------------------------GoGraphics:lhu r3,Vidregsldi r1,#4sc r1,Textrowssh r1,hs:4[r3] ; # rowsldi r1,#240sh r1,hs:12[r3] ; window topmov r1,r0 ; reset cursor positionmov r2,r0ldi r6,#2sys #10rts;------------------------------------------------------------------------------; Go back to full text mode.;------------------------------------------------------------------------------GoText:lhu r3,Vidregsldi r1,#31sc r1,Textrowssh r1,hs:4[r3] ; # rowsldi r1,#17sh r1,hs:12[r3] ; window topmov r1,r0 ; reset cursor positionmov r2,r0ldi r6,#2sys #10rts// ----------------------------------------------------------------------------// Uses George Marsaglia's multiply method//// m_w = <choose-initializer>; /* must not be zero */// m_z = <choose-initializer>; /* must not be zero *///// uint get_random()// {// m_z = 36969 * (m_z & 65535) + (m_z >> 16);// m_w = 18000 * (m_w & 65535) + (m_w >> 16);// return (m_z << 16) + m_w; /* 32-bit result */// }// ----------------------------------------------------------------------------//gen_rand:addui r31,r31,#-8sw r2,[r31]lhu r1,m_zmului r2,r1,#36969shrui r1,r1,#16addu r2,r2,r1sh r2,m_zlhu r1,m_wmului r2,r1,#18000shrui r1,r1,#16addu r2,r2,r1sh r2,m_wrand:lhu r1,m_zshli r1,r1,#16addu r1,r1,r2lw r2,[r31]addui r31,r31,#8rts// ----------------------------------------------------------------------------// Display random dots on the graphics screen.// ----------------------------------------------------------------------------RandomDots:addui r31,r31,#-8sws c1,[r31] ; stack the return addressmov r4,r0.0001:bsr gen_rand ; get random bitmap memory locationmodui r2,r1,#172032 ; mod the memory size_2addui r2,r2,#$FFA00000 ; *2 for 16 bit data, generate addressbsr gen_rand ; get random colormodui r3,r1,#$1000 ; limit to 12 bitssc r3,zs:[r2] ; store color in memoryaddui r4,r4,#1 ; increment loop indexandi r4,r4,#$FFF ;tst p1,r4 ; check if time to check for keypressp1.ne br .0001bsr KeybdGetCharNoWait ; try get a key, but don't waittst p1,r1 ; branch if no key pressedp1.lt br RandomDots.0001lws c1,[r31] ; restore return addressaddui r31,r31,#8rts;------------------------------------------------------------------------------msgStartup:byte "Thor Test System Starting...",CR,LF,0msgStartupEnd:msgMonitor:byte CR,LFbyte "d - run debugger",CR,LFbyte "g - graphics mode",CR,LFbyte "tx - text mode",CR,LFbyte "r - random dots",CR,LFbyte 0bad_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 = linear address of jump code; r2 = vector number to set; Trashes: r2,r3,r5,p0;------------------------------------------------------------------------------set_vector:mfspr r3,c12 ; get base address of interrupt table_16addu r2,r2,r3lh r3,zs:[r1]cmpi p0,r3,#$003F6F01 ; unitialized interrupt number loadp0.eq shli r5,r2,#18p0.eq or r3,r3,r5sh r3,zs:[r2]lh r3,zs:4[r1]sh r3,zs:4[r2]lh r3,zs:8[r1]sh r3,zs:8[r2]lh r3,zs:12[r1]sh r3,zs:12[r2]rts;------------------------------------------------------------------------------; Save the register context.;; Parameters:; tr points to app's TCB;;------------------------------------------------------------------------------save_context:sw r1,TCB_r1[tr]sw r2,TCB_r2[tr]sw r3,TCB_r3[tr]sw r4,TCB_r4[tr]sw r5,TCB_r5[tr]sw r6,TCB_r6[tr]sw r7,TCB_r7[tr]sw r8,TCB_r8[tr]sw r9,TCB_r9[tr]sw r10,TCB_r10[tr]sw r11,TCB_r11[tr]sw r12,TCB_r12[tr]sw r13,TCB_r13[tr]sw r14,TCB_r14[tr]sw r15,TCB_r15[tr]sw r16,TCB_r16[tr]sw r17,TCB_r17[tr]sw r18,TCB_r18[tr]sw r19,TCB_r19[tr]sw r20,TCB_r20[tr]sw r21,TCB_r21[tr]sw r22,TCB_r22[tr]sw r23,TCB_r23[tr]sw r24,TCB_r24[tr]sw r25,TCB_r25[tr]sw r26,TCB_r26[tr]sw r27,TCB_r27[tr]sws ds,TCB_ds[tr]sws es,TCB_es[tr]sws fs,TCB_fs[tr]sws gs,TCB_gs[tr]sws hs,TCB_hs[tr]sws ss,TCB_ss[tr]sws cs,TCB_cs[tr]sws ds.lmt,TCB_dslmt[tr]sws es.lmt,TCB_eslmt[tr]sws fs.lmt,TCB_fslmt[tr]sws gs.lmt,TCB_gslmt[tr]sws hs.lmt,TCB_hslmt[tr]sws ss.lmt,TCB_sslmt[tr]sws cs.lmt,TCB_cslmt[tr]sws c1,TCB_c1[tr]sws c2,TCB_c2[tr]sws c3,TCB_c3[tr]sws c4,TCB_c4[tr]sws c5,TCB_c5[tr]sws c6,TCB_c6[tr]sws c7,TCB_c7[tr]sws c8,TCB_c8[tr]sws c9,TCB_c9[tr]sws c10,TCB_c10[tr]sws c11,TCB_c11[tr]; sws c13,TCB_c13[tr]; sws c14,TCB_c14[tr]sws pregs,TCB_pregs[tr]rte;------------------------------------------------------------------------------; Restore register context.; Parameters:; DS points to app's data space.;------------------------------------------------------------------------------restore_context:lw r1,TCB_r1[tr]lw r2,TCB_r2[tr]lw r3,TCB_r3[tr]lw r4,TCB_r4[tr]lw r5,TCB_r5[tr]lw r6,TCB_r6[tr]lw r7,TCB_r7[tr]lw r8,TCB_r8[tr]lw r9,TCB_r9[tr]lw r10,TCB_r10[tr]lw r11,TCB_r11[tr]lw r12,TCB_r12[tr]lw r13,TCB_r13[tr]lw r14,TCB_r14[tr]lw r15,TCB_r15[tr]lw r16,TCB_r16[tr]lw r17,TCB_r17[tr]lw r18,TCB_r18[tr]lw r19,TCB_r19[tr]lw r20,TCB_r20[tr]lw r21,TCB_r21[tr]lw r22,TCB_r22[tr]lw r23,TCB_r23[tr]lw r24,TCB_r24[tr]lw r25,TCB_r25[tr]lw r26,TCB_r26[tr]lw r27,TCB_r27[tr]lws ds,TCB_ds[tr]lws es,TCB_es[tr]lws fs,TCB_fs[tr]lws gs,TCB_gs[tr]lws hs,TCB_hs[tr]lws ss,TCB_ss[tr]lws cs,TCB_cs[tr]lws ds.lmt,TCB_dslmt[tr]lws es.lmt,TCB_eslmt[tr]lws fs.lmt,TCB_fslmt[tr]lws gs.lmt,TCB_gslmt[tr]lws hs.lmt,TCB_hslmt[tr]lws ss.lmt,TCB_sslmt[tr]lws cs.lmt,TCB_cslmt[tr]lws c1,TCB_c1[tr]lws c2,TCB_c2[tr]lws c3,TCB_c3[tr]lws c4,TCB_c4[tr]lws c5,TCB_c5[tr]lws c6,TCB_c6[tr]lws c7,TCB_c7[tr]lws c8,TCB_c8[tr]lws c9,TCB_c9[tr]lws c10,TCB_c10[tr]lws c11,TCB_c11[tr]; lws c13,TCB_c13[tr]; lws c14,TCB_c14[tr]lws pregs,TCB_pregs[tr]rte.include "c:\cores4\thor\trunk\software\FMTK\source\kernel\FMTKc.s".include "video.asm".include "serial.asm".include "keyboard.asm".include "debugger.asm";------------------------------------------------------------------------------; BTNU IRQ routine.;;------------------------------------------------------------------------------;btnu_rout:syncaddui r31,r31,#-24sw r1,[r31]sws hs,8[r31]sws hs.lmt,16[r31]; set I/O segmentldis hs,#$FFD00000ldis hs.lmt,#$100000; update on-screen IRQ live indicatorinc.h hs:TEXTSCR+312; restore regs and returnlw r1,[r31]lws hs,8[r31]lws hs.lmt,16[r31]addui r31,r31,#24syncrti;------------------------------------------------------------------------------;------------------------------------------------------------------------------spur_rout:syncaddui r31,r31,#-24sw r1,[r31]sws hs,8[r31]sws hs.lmt,16[r31]; set I/O segmentldis hs,#$FFD00000ldis hs.lmt,#$100000; ldi r1,#18; sc r1,hs:LEDS; update on-screen IRQ live indicatorinc.h hs:TEXTSCR+316; restore regs and returnlw r1,[r31]lws hs,8[r31]lws hs.lmt,16[r31]addui r31,r31,#24syncrti;------------------------------------------------------------------------------; Uninitialized interrupt;------------------------------------------------------------------------------uii_rout:syncaddui r31,r31,#-24sw r1,[r31]sws hs,8[r31]sws hs.lmt,16[r31]; set I/O segmentldis hs,#$FFD00000ldis hs.lmt,#$100000; update on-screen IRQ live indicatorldi r1,#'U'|%011000000_111111111_00_00000000sh r1,hs:TEXTSCR+320mov r5,r63sc r63,hs:LEDSbsr DisplayAddrldi r6,#2ldi r2,#0ldi r7,#0.0001:ldis 60,#18 ; set breakout index to 18syncmtspr 61,r7 ; select history reg #syncldis 60,#16 ; set breakout index to 16syncmfspr r5,61 ; get addressbsr DisplayAddraddui r2,r2,#1ldis 60,#17 ; set breakout index to 17syncmfspr r5,61 ; get addressbsr DisplayAddraddui r2,r2,#1addui r7,r7,#1cmpi p0,r7,#63p0.ltu br .0001uii_hang:br uii_hang; restore regs and returnlw r1,[r31]lws hs,8[r31]lws hs.lmt,16[r31]addui r31,r31,#24syncrti;------------------------------------------------------------------------------; Non-maskable interrupt routine.;;------------------------------------------------------------------------------;nmi_rout:syncaddui r31,r31,#-24sw r1,[r31]sws hs,8[r31]sws hs.lmt,16[r31]; set I/O segmentldis hs,#$FFD00000ldis hs.lmt,#$100000ldi 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]lws hs.lmt,16[r31]addui r31,r31,#24syncrti;------------------------------------------------------------------------------; Millisecond (1024 Hz) interrupt routine.;;------------------------------------------------------------------------------;msi_rout:syncaddui sp,sp,#-32sw r1,[sp]sws hs,8[sp]sws hs.lmt,16[sp]sws c1,24[sp]; set I/O segmentldis hs,#$FFD00000ldis hs.lmt,#$100000ldi r1,#24sc r1,hs:LEDS; reset the edge sense circuit to re-enable interruptsldi r1,#1sh r1,hs:PIC_ESR; update millisecondslw r1,zs:Millisecondsaddui r1,r1,#1sw r1,zs:Milliseconds; restore regs and returnlw r1,[sp]lws hs,8[sp]lws hs.lmt,16[sp]lws c1,24[sp]addui sp,sp,#32syncrti;------------------------------------------------------------------------------; Time Slice IRQ routine.;;------------------------------------------------------------------------------;tms_rout:syncaddui r31,r31,#-24sw r1,[r31]sws hs,8[r31]sws hs.lmt,16[r31]; set I/O segmentldis hs,#$FFD00000ldis hs.lmt,#$100000ldi 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 indicatorinc.h hs:TEXTSCR+328; restore regs and returnlw r1,[r31]lws hs,8[r31]lws hs.lmt,16[r31]addui r31,r31,#24syncrte;------------------------------------------------------------------------------; Data bus error 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 DisplayAddrldi r2,#10ldi r6,#1mfspr r5,c14bsr DisplayAddrldi r6,#2ldi r2,#0ldi r7,#0.0001:ldis 60,#18 ; set breakout index to 18syncmtspr 61,r7 ; select history reg #syncldis 60,#16 ; set breakout index to 16syncmfspr r5,61 ; get addressbsr DisplayAddraddui r2,r2,#1ldis 60,#17 ; set breakout index to 17syncmfspr r5,61 ; get addressbsr DisplayAddraddui r2,r2,#1addui r7,r7,#1cmpi p0,r7,#63p0.ltu br .0001brk_lockup:br brk_lockup[c0]; code snippet to jump to the break routine, copied to the break vector;; vector table jumps;align 8brk_jmp:jmp brk_rout[c0]align 8tms_jmp:jmp tms_rout[c0]align 8msi_jmp:jmp msi_rout[c0]align 8nmi_jmp:jmp nmi_rout[c0]align 8uii_jmp:ldi r63,#00jmp uii_rout[c0]align 8vb_jmp:jmp VideoBIOSCall[c0]align 8dbe_jmp:jmp dbe_rout[c0]align 8svc_jmp:jmp save_context[c0]align 8rsc_jmp:jmp restore_context[c0]align 8spur_jmp:jmp spur_rout[c0]align 8btnu_jmp:jmp btnu_rout[c0]align 8rti_jmp:km_jmp:rtialign 8rte_jmp:rte;------------------------------------------------------------------------------; Reset Point;------------------------------------------------------------------------------org $FFFFEFF0jmp cold_start[c15]extern my_main : 24
