URL
https://opencores.org/ocsvn/thor/thor/trunk
Subversion Repositories thor
Compare Revisions
- This comparison shows the changes necessary to convert path
/thor/trunk/software
- from Rev 15 to Rev 16
- ↔ Reverse comparison
Rev 15 → Rev 16
/boot_tb/boot.asm
72,29 → 72,41
TEXT_CURPOS EQU 0x16 |
KEYBD EQU 0xC0000 |
|
PIC_IS EQU 0xC0FC0 |
PIC_IE EQU 0xC0FC8 |
PIC_ES EQU 0xC0FE0 |
PIC_ESR EQU 0xC0FE8 ; edge sense reset |
|
KeyState1 EQU $2008 |
KeyState2 EQU $2009 |
KeybdLEDs EQU $200A |
KeybdWaitFlag EQU $200B |
bss |
org $0000 |
dw 0 ; the first word is unused |
Milliseconds dw 0 |
m_w dh 0 |
m_z dh 0 |
KeyState1 db 0 |
KeyState2 db 0 |
KeybdLEDs db 0 |
KeybdWaitFlag db 0 |
|
CursorX EQU $2030 |
CursorY EQU $2032 |
VideoPos EQU $2034 |
NormAttr EQU $2036 |
Vidregs EQU $2040 |
Vidptr EQU $2044 |
EscState EQU $2048 |
Textrows EQU $204A |
Textcols EQU $204C |
CursorX dc 0 |
CursorY dc 0 |
VideoPos dc 0 |
align 4 |
NormAttr dh 0 |
Vidregs dh 0 |
Vidptr dh 0 |
EscState dc 0 |
Textrows dc 0 |
Textcols dc 0 |
align 8 |
reg_save fill.w 64,0 |
creg_save fill.w 16,0 |
sreg_save fill.w 16,0 |
preg_save dw 0 |
|
bss |
org $4000 |
|
Milliseconds dw 0 |
|
rxfull EQU 1 |
Uart_ms db 0 |
118,10 → 130,7
org $FFFF8000 |
|
cold_start: |
|
; Initialize segment registers for flat model |
mtspr cs,r0 |
ldis cs.lmt,#-1 ; maximum |
mtspr zs,r0 |
ldis zs.lmt,#-1 |
mtspr ds,r0 |
144,56 → 153,86
; switch processor to full speed |
stp #$FFFF |
|
; set interrupt table at $0000 |
ldis c12,#0 |
; set interrupt table at $1000 |
ldis c12,#$1000 |
|
; 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 |
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 vector |
ldi r1,#brk_jmp |
lla r1,cs:brk_jmp |
ldi r2,#0 |
bsr set_vector |
|
; setup Video BIOS vector |
ldi r1,#vb_jmp |
lla r1,cs:vb_jmp |
ldi r2,#10 |
bsr set_vector |
|
; setup NMI vector |
ldi r1,#nmi_jmp |
lla r1,cs:nmi_jmp |
ldi r2,#254 |
bsr set_vector |
|
lla r1,cs:svc_jmp |
ldi r2,#190 |
bsr set_vector |
lla r1,cs:rsc_jmp |
ldi r2,#191 |
bsr set_vector |
|
; spurious interrupt |
; |
lla r1,cs:spur_jmp |
ldi r2,#192 |
bsr set_vector |
|
; setup MSI vector |
sh r0,Milliseconds |
ldi r1,#msi_jmp |
lla r1,cs:msi_jmp |
ldi r2,#193 |
bsr set_vector |
|
; setup IRQ vector |
ldi r1,#tms_jmp |
lla r1,cs:tms_jmp |
ldi r2,#194 |
bsr set_vector |
|
; setup BTNU vector |
lla r1,cs:btnu_jmp |
ldi r2,#200 |
bsr set_vector |
|
; setup KM vector |
lla r1,cs:km_jmp |
ldi r2,#245 |
bsr set_vector |
|
; setup data bus error vector |
ldi r1,#dbe_jmp |
lla r1,cs:dbe_jmp |
ldi r2,#251 |
bsr set_vector |
|
; Initialize PIC |
ldi r1,#%00111 ; time slice interrupt is edge sensitive |
ldi r1,#%00000111 ; time slice interrupt is edge sensitive |
sh r1,hs:PIC_ES |
ldi r1,#%00111 ; enable time slice interrupt, msi, nmi |
ldi r1,#%100000111 ; enable time slice interrupt, msi, nmi |
sh r1,hs:PIC_IE |
|
; Initialize random number generator |
; m_z and m_w must not be zero |
ldi r1,#$88888888 |
sh r1,m_w |
ldi r1,#$77777777 |
sh r1,m_z |
|
mov r1,r0 |
mov r2,r0 |
mov r3,r0 |
244,13 → 283,13
; switch to core to application/user mode. |
ldis c14,#j1 ; c14 contains RTI return address |
sync |
; rti |
rti |
j1: |
ldi r1,#2 |
sc r1,hs:LEDS |
sb r0,EscState |
bsr SerialInit |
bsr Debugger |
; bsr Debugger |
ldi r2,#msgStartup |
ldis lc,#msgStartupEnd-msgStartup-1 |
j3: |
273,26 → 312,197
ldi r1,#6 |
sc r1,hs:LEDS |
bsr alphabet |
ldi r1,#msgStartup |
lla r1,cs:msgStartup ; convert to linear address |
ldi r6,#$14 |
sys #10 |
; bsr VBDisplayString |
ldi r5,#TEXTSCR |
.0001: |
.0002: |
|
;------------------------------------------------------------------------------ |
;------------------------------------------------------------------------------ |
; Monitor |
;------------------------------------------------------------------------------ |
;------------------------------------------------------------------------------ |
|
Monitor: |
lla r1,cs:msgMonitor |
bsr VBDisplayString |
|
; Display monitor prompt |
.prompt: |
ldi r1,#CR |
bsr VBDisplayChar |
ldi r1,#LF |
bsr VBDisplayChar |
ldi r1,#'$' |
bsr VBDisplayChar |
bsr CursorOn |
.getkey: |
bsr KeybdGetCharWait |
bsr VBDisplayChar |
cmpi p0,r1,#CR |
p0.ne br .0002 |
bsr VBAsciiToScreen |
ori r1,r1,#%000000111_111111111_00_00000000 |
sh r1,hs:[r5] |
addui r5,r5,#4 |
br .0001 |
p0.ne br .getkey |
bsr CursorOff |
lcu r1,CursorY |
lcu r7,Textcols |
mtspr lc,r7 ; use loop counter as safety |
mulu r10,r1,r7 ; pos = row * cols |
_4addu r10,r10,r0 ; pos *= 4 |
.0001: |
bsr MonGetch1 ; get character skipping spaces |
cmpi p0,r1,#'$' ; skip over prompt |
p0.eq br .0001 |
cmpi p0,r1,#'d' ; debug ? |
p0.eq bsr Debugger |
cmpi p0,r1,#'g' |
p0.eq bsr GoGraphics |
cmpi p0,r1,#'t' |
p0.eq bsr MonGetch |
p0.eq cmpi p0,r1,#'x' |
p0.eq bsr GoText |
cmpi p0,r1,'r' |
p0.eq bsr RandomDots |
cmpi p0,r1,#'c' |
p0.eq bsr VBClearScreen |
p0.eq mov r1,r0 |
p0.eq mov r2,r0 |
p0.eq ldi r6,#2 |
p0.eq sys #10 |
br .prompt |
|
;------------------------------------------------------------------------------ |
; Returns: |
; r1 ascii code for character |
; r10 incremented |
; lc decremented |
;------------------------------------------------------------------------------ |
|
MonGetch: |
addui r31,r31,#-8 |
sws c1,[r31] |
lhu r1,hs:[r10] |
andi r1,r1,#$3ff |
bsr VBScreenToAscii |
addui r10,r10,#4 |
loop .0001 ; decrement loop counter |
.0001: |
lws c1,[r31] |
addui r31,r31,#8 |
rts |
|
;------------------------------------------------------------------------------ |
; Returns: |
; r1 ascii code for character |
; r10 incremented by number of spaces + 1 |
; lc decremented by number of spaces + 1 |
;------------------------------------------------------------------------------ |
|
MonGetch1: |
addui r31,r31,#-8 |
sws c1,[r31] |
.0001: |
lhu r1,hs:[r10] |
andi r1,r1,#$3ff |
bsr VBScreenToAscii |
addui r10,r10,#4 |
cmpi p0,r1,#' ' |
p0.leu loop .0001 |
lws c1,[r31] |
addui r31,r31,#8 |
rts |
|
;------------------------------------------------------------------------------ |
;------------------------------------------------------------------------------ |
|
GoGraphics: |
lhu r3,Vidregs |
ldi r1,#4 |
sc r1,Textrows |
sh r1,hs:4[r3] ; # rows |
ldi r1,#720 |
sh r1,hs:12[r3] ; window top |
rts |
|
GoText: |
lhu r3,Vidregs |
ldi r1,#31 |
sc r1,Textrows |
sh r1,hs:4[r3] ; # rows |
ldi r1,#17 |
sh r1,hs:12[r3] ; window top |
rts |
|
// ---------------------------------------------------------------------------- |
// 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,#-8 |
sw r2,[r31] |
lhu r1,m_z |
mului r2,r1,#36969 |
shrui r1,r1,#16 |
addu r2,r2,r1 |
sh r2,m_z |
|
lhu r1,m_w |
mului r2,r1,#18000 |
shrui r1,r1,#16 |
addu r2,r2,r1 |
sh r2,m_w |
rand: |
lhu r1,m_z |
shli r1,r1,#16 |
addu r1,r1,r2 |
lw r2,[r31] |
addui r31,r31,#8 |
rts |
|
// ---------------------------------------------------------------------------- |
// Display random dots on the graphics screen. |
// ---------------------------------------------------------------------------- |
|
RandomDots: |
addui r31,r31,#-8 |
sws c1,[r31] |
mov r4,r0 |
.0001: |
bsr gen_rand ; get random bitmap memory location |
modu r2,r1,#172032 ; mod the memory size |
shli r2,r2,#1 ; *2 for 16 bit data |
bsr gen_rand ; get random color |
modui r3,r1,#$1000 ; limit to 12 bits |
sc r3,zs:$FFA00000[r2] ; store color in memory |
addui r4,r4,#1 ; increment loop index |
andi r4,r4,#$FFF ; |
tst p0,r4 ; check if time to check for keypress |
p0.eq bsr KeybdGetCharNoWait ; try get a key, but don't wait |
tst p0,r1 ; branch if no key pressed |
p0.lt br RandomDots.0001 |
lws c1,[r31] |
addui r31,r31,#8 |
rts |
|
;------------------------------------------------------------------------------ |
|
msgStartup: |
byte "Thor Test System Starting...",CR,LF,0 |
msgStartupEnd: |
msgMonitor: |
byte CR,LF |
byte "d - run debugger",CR,LF |
byte "g - graphics mode",CR,LF |
byte "tx - text mode",CR,LF |
byte "r - random dots",CR,LF |
byte 0 |
|
bad_ram: |
ldi r1,#'B' |
330,30 → 540,224
; Set interrupt vector |
; |
; Parameters: |
; r1 = address of jump code |
; r1 = linear address of jump code |
; r2 = vector number to set |
; Trashes: r2,r3 |
; Trashes: r2,r3,r5,p0 |
;------------------------------------------------------------------------------ |
|
set_vector: |
mfspr r3,c12 ; get base address of interrupt table |
_16addu r2,r2,r3 |
lh r3,cs:[r1] |
lh r3,zs:[r1] |
cmpi p0,r3,#$003F6F01 ; unitialized interrupt number load |
p0.eq shli r5,r2,#18 |
p0.eq or r3,r3,r5 |
sh r3,zs:[r2] |
lh r3,cs:4[r1] |
lh r3,zs:4[r1] |
sh r3,zs:4[r2] |
lh r3,cs:8[r1] |
lh r3,zs:8[r1] |
sh r3,zs:8[r2] |
lh r3,cs:12[r1] |
lh r3,zs:12[r1] |
sh r3,zs:12[r2] |
rts |
|
;------------------------------------------------------------------------------ |
; Save the register context. |
; |
; Parameters: |
; DS points to app's data space |
; |
;------------------------------------------------------------------------------ |
|
save_context: |
sw r1,reg_save+8*1 |
sw r2,reg_save+8*2 |
sw r3,reg_save+8*3 |
sw r4,reg_save+8*4 |
sw r5,reg_save+8*5 |
sw r6,reg_save+8*6 |
sw r7,reg_save+8*7 |
sw r8,reg_save+8*8 |
sw r9,reg_save+8*9 |
sw r10,reg_save+8*10 |
sw r11,reg_save+8*11 |
sw r12,reg_save+8*12 |
sw r13,reg_save+8*13 |
sw r14,reg_save+8*14 |
sw r15,reg_save+8*15 |
sw r16,reg_save+8*16 |
sw r17,reg_save+8*17 |
sw r18,reg_save+8*18 |
sw r19,reg_save+8*19 |
sw r20,reg_save+8*20 |
sw r21,reg_save+8*21 |
sw r22,reg_save+8*22 |
sw r23,reg_save+8*23 |
sw r24,reg_save+8*24 |
sw r25,reg_save+8*25 |
sw r26,reg_save+8*26 |
sw r27,reg_save+8*27 |
sw r28,reg_save+8*28 |
sw r29,reg_save+8*29 |
sw r30,reg_save+8*30 |
sw r31,reg_save+8*31 |
sws ds,sreg_save+8*1 |
sws es,sreg_save+8*2 |
sws fs,sreg_save+8*3 |
sws gs,sreg_save+8*4 |
sws hs,sreg_save+8*5 |
sws ss,sreg_save+8*6 |
sws cs,sreg_save+8*7 |
sws ds.lmt,sreg_save+8*9 |
sws es.lmt,sreg_save+8*10 |
sws fs.lmt,sreg_save+8*11 |
sws gs.lmt,sreg_save+8*12 |
sws hs.lmt,sreg_save+8*13 |
sws ss.lmt,sreg_save+8*14 |
sws cs.lmt,sreg_save+8*15 |
sws c1,creg_save+8*1 |
sws c2,creg_save+8*2 |
sws c3,creg_save+8*3 |
sws c4,creg_save+8*4 |
sws c5,creg_save+8*5 |
sws c6,creg_save+8*6 |
sws c7,creg_save+8*7 |
sws c8,creg_save+8*8 |
sws c9,creg_save+8*9 |
sws c10,creg_save+8*10 |
sws c11,creg_save+8*11 |
sws c13,creg_save+8*13 |
sws c14,creg_save+8*14 |
sws pregs,preg_save |
rte |
|
;------------------------------------------------------------------------------ |
; Restore register context. |
; Parameters: |
; DS points to app's data space. |
;------------------------------------------------------------------------------ |
|
restore_context: |
lw r1,reg_save+8*1 |
lw r2,reg_save+8*2 |
lw r3,reg_save+8*3 |
lw r4,reg_save+8*4 |
lw r5,reg_save+8*5 |
lw r6,reg_save+8*6 |
lw r7,reg_save+8*7 |
lw r8,reg_save+8*8 |
lw r9,reg_save+8*9 |
lw r10,reg_save+8*10 |
lw r11,reg_save+8*11 |
lw r12,reg_save+8*12 |
lw r13,reg_save+8*13 |
lw r14,reg_save+8*14 |
lw r15,reg_save+8*15 |
lw r16,reg_save+8*16 |
lw r17,reg_save+8*17 |
lw r18,reg_save+8*18 |
lw r19,reg_save+8*19 |
lw r20,reg_save+8*20 |
lw r21,reg_save+8*21 |
lw r22,reg_save+8*22 |
lw r23,reg_save+8*23 |
lw r24,reg_save+8*24 |
lw r25,reg_save+8*25 |
lw r26,reg_save+8*26 |
lw r27,reg_save+8*27 |
lw r28,reg_save+8*28 |
lw r29,reg_save+8*29 |
lw r30,reg_save+8*30 |
lw r31,reg_save+8*31 |
; lws ds,sreg_save+8*1 |
lws es,sreg_save+8*2 |
lws fs,sreg_save+8*3 |
lws gs,sreg_save+8*4 |
lws hs,sreg_save+8*5 |
lws ss,sreg_save+8*6 |
lws cs,sreg_save+8*7 |
; lws ds.lmt,sreg_save+8*9 |
lws es.lmt,sreg_save+8*10 |
lws fs.lmt,sreg_save+8*11 |
lws gs.lmt,sreg_save+8*12 |
lws hs.lmt,sreg_save+8*13 |
lws ss.lmt,sreg_save+8*14 |
lws cs.lmt,sreg_save+8*15 |
lws c1,creg_save+8*1 |
lws c2,creg_save+8*2 |
lws c3,creg_save+8*3 |
lws c4,creg_save+8*4 |
lws c5,creg_save+8*5 |
lws c6,creg_save+8*6 |
lws c7,creg_save+8*7 |
lws c8,creg_save+8*8 |
lws c9,creg_save+8*9 |
lws c10,creg_save+8*10 |
lws c11,creg_save+8*11 |
; lws c13,creg_save+8*13 |
lws c14,creg_save+8*14 |
lws pregs,preg_save |
rte |
|
.include "video.asm" |
.include "keyboard.asm" |
.include "serial.asm" |
.include "debugger.asm" |
|
|
;------------------------------------------------------------------------------ |
; BTNU IRQ routine. |
; |
;------------------------------------------------------------------------------ |
; |
btnu_rout: |
sync |
addui r31,r31,#-16 |
sw r1,[r31] |
sws hs,8[r31] |
|
; set I/O segment |
ldis hs,#$FFD00000 |
|
; update on-screen IRQ live indicator |
lh r1,hs:TEXTSCR+312 |
addui r1,r1,#1 |
sh r1,hs:TEXTSCR+312 |
|
; restore regs and return |
lw r1,[r31] |
lws hs,8[r31] |
addui r31,r31,#16 |
sync |
rti |
|
;------------------------------------------------------------------------------ |
;------------------------------------------------------------------------------ |
|
spur_rout: |
sync |
ldi r31,#INT_STACK-16 |
sw r1,[r31] |
sws hs,8[r31] |
|
; set I/O segment |
ldis hs,#$FFD00000 |
|
; ldi r1,#18 |
; sc r1,hs:LEDS |
|
; update on-screen IRQ live indicator |
lh r1,hs:TEXTSCR+316 |
addui r1,r1,#1 |
sh r1,hs:TEXTSCR+316 |
|
; restore regs and return |
lw r1,[r31] |
lws hs,8[r31] |
sync |
rti |
|
;------------------------------------------------------------------------------ |
; Uninitialized interrupt |
;------------------------------------------------------------------------------ |
uii_rout: |
369,6 → 773,34
ldi r1,#'U'|%011000000_111111111_00_00000000 |
sh r1,hs:TEXTSCR+320 |
|
mov r5,r63 |
sc r63,hs:LEDS |
bsr DisplayAddr |
|
ldi r6,#2 |
ldi r2,#0 |
ldi r7,#0 |
.0001: |
ldis 60,#18 ; set breakout index to 18 |
sync |
mtspr 61,r7 ; select history reg # |
sync |
ldis 60,#16 ; set breakout index to 16 |
sync |
mfspr r5,61 ; get address |
bsr DisplayAddr |
addui r2,r2,#1 |
ldis 60,#17 ; set breakout index to 17 |
sync |
mfspr r5,61 ; get address |
bsr DisplayAddr |
addui r2,r2,#1 |
addui r7,r7,#1 |
cmpi p0,r7,#63 |
p0.ltu br .0001 |
|
uii_hang: |
br uii_hang |
; restore regs and return |
lw r1,[r31] |
lws hs,8[r31] |
414,7 → 846,7
; |
msi_rout: |
sync |
ldi r31,#INT_STACK-16 |
addui r31,r31,#-16 |
sw r1,[r31] |
sws hs,8[r31] |
|
429,13 → 861,14
sh r1,hs:PIC_ESR |
|
; update milliseconds |
lh r1,Milliseconds |
lh r1,zs:Milliseconds |
addui r1,r1,#1 |
sh r1,Milliseconds |
sh r1,zs:Milliseconds |
|
; restore regs and return |
lw r1,[r31] |
lws hs,8[r31] |
addui r31,r31,#16 |
sync |
rti |
|
442,12 → 875,11
;------------------------------------------------------------------------------ |
; Time Slice IRQ routine. |
; |
; |
;------------------------------------------------------------------------------ |
; |
tms_rout: |
sync |
ldi r31,#INT_STACK-16 |
addui r31,r31,#-16 |
sw r1,[r31] |
sws hs,8[r31] |
|
469,11 → 901,12
; restore regs and return |
lw r1,[r31] |
lws hs,8[r31] |
addui r31,r31,#16 |
sync |
rti |
|
;------------------------------------------------------------------------------ |
; Time Slice IRQ routine. |
; Data bus error routine. |
; |
; |
;------------------------------------------------------------------------------ |
536,6 → 969,32
ldi r6,#0 |
mfspr r5,c13 |
bsr DisplayAddr |
ldi r2,#10 |
ldi r6,#1 |
mfspr r5,c14 |
bsr DisplayAddr |
ldi r6,#2 |
ldi r2,#0 |
ldi r7,#0 |
.0001: |
ldis 60,#18 ; set breakout index to 18 |
sync |
mtspr 61,r7 ; select history reg # |
sync |
ldis 60,#16 ; set breakout index to 16 |
sync |
mfspr r5,61 ; get address |
bsr DisplayAddr |
addui r2,r2,#1 |
ldis 60,#17 ; set breakout index to 17 |
sync |
mfspr r5,61 ; get address |
bsr DisplayAddr |
addui r2,r2,#1 |
addui r7,r7,#1 |
cmpi p0,r7,#63 |
p0.ltu br .0001 |
|
brk_lockup: |
br brk_lockup[c0] |
|
543,22 → 1002,47
; |
; vector table jumps |
; |
align 4 |
brk_jmp: jmp brk_rout[c0] |
align 4 |
tms_jmp: jmp tms_rout[c0] |
align 4 |
msi_jmp: jmp msi_rout[c0] |
align 4 |
nmi_jmp: jmp nmi_rout[c0] |
align 4 |
uii_jmp: jmp uii_rout[c0] |
align 4 |
vb_jmp: jmp VideoBIOSCall[c0] |
align 4 |
ser_jmp: jmp SerialIRQ[c0] |
align 4 |
dbe_jmp: jmp dbe_rout[c0] |
align 8 |
brk_jmp: |
jmp brk_rout[c0] |
align 8 |
tms_jmp: |
jmp tms_rout[c0] |
align 8 |
msi_jmp: |
jmp msi_rout[c0] |
align 8 |
nmi_jmp: |
jmp nmi_rout[c0] |
align 8 |
uii_jmp: |
ldi r63,#00 |
jmp uii_rout[c0] |
align 8 |
vb_jmp: |
jmp VideoBIOSCall[c0] |
align 8 |
ser_jmp: |
jmp SerialIRQ[c0] |
align 8 |
dbe_jmp: |
jmp dbe_rout[c0] |
align 8 |
svc_jmp: |
jmp save_context[c0] |
align 8 |
rsc_jmp: |
jmp restore_context[c0] |
align 8 |
spur_jmp: |
jmp spur_rout[c0] |
align 8 |
btnu_jmp: |
jmp btnu_rout[c0] |
align 8 |
rti_jmp: |
km_jmp: |
rti |
|
;------------------------------------------------------------------------------ |
; Reset Point |
565,7 → 1049,7
;------------------------------------------------------------------------------ |
|
org $FFFFEFF0 |
jmp cold_start[C15] |
jmp cold_start[c15] |
|
extern my_main : 24 |
|