Memory controller implemented.
This commit is contained in:
@@ -0,0 +1,127 @@
|
||||
; Writes Program Memory through the controller, and gets turned away from what it may
|
||||
; not touch.
|
||||
;
|
||||
; Writing code is the thing SplitBit's instruction set deliberately cannot do. The
|
||||
; controller can, which is what makes a loader possible. The marker below is written and
|
||||
; then read back through the controller, so the change is observed rather than assumed.
|
||||
;
|
||||
; The two refusals are the other half. Bank 2 is the bank table and is read only, so
|
||||
; writing to it is a GuardViolation. Bank 200 has nothing registered in it, so naming it
|
||||
; is a BankFault. Both handlers step the saved address past the instruction that was
|
||||
; refused, the way any handler carrying on past a fault has to.
|
||||
;
|
||||
; Correct output is:
|
||||
; AA BB the marker after being written through the controller
|
||||
; readonly
|
||||
; nobank
|
||||
; done
|
||||
|
||||
#Include print.asm
|
||||
|
||||
#Program
|
||||
|
||||
start:
|
||||
; Aim both ends of the controller at the marker.
|
||||
SETD.0 Marker
|
||||
PSHD.0
|
||||
POPA
|
||||
POPB
|
||||
PSHA
|
||||
PSHB
|
||||
|
||||
RSTA
|
||||
OUTA 0xE0 ; SourceBank = 0
|
||||
OUTA 0xE3 ; DestBank = 0
|
||||
POPB
|
||||
OUTB 0xE1 ; SourceHigh
|
||||
OUTB 0xE4 ; DestHigh
|
||||
POPA
|
||||
OUTA 0xE2 ; SourceLow
|
||||
OUTA 0xE5 ; DestLow
|
||||
|
||||
; Write two bytes over the marker. This is Program Memory being changed at run time.
|
||||
INIA 0xAA
|
||||
OUTA 0xE9
|
||||
INIA 0xBB
|
||||
OUTA 0xE9
|
||||
|
||||
; Read them back the same way, to prove they landed.
|
||||
CALL readAndPrint
|
||||
CALL readAndPrint
|
||||
CALL lineFeed
|
||||
|
||||
; Bank 2 is the bank table, and it is read only.
|
||||
INIA 0d2
|
||||
OUTA 0xE3
|
||||
RSTA
|
||||
OUTA 0xE4
|
||||
OUTA 0xE5
|
||||
INIA 0d1
|
||||
OUTA 0xE9 ; Refused: GuardViolation.
|
||||
|
||||
; Bank 200 has nothing in it.
|
||||
INIA 0d200
|
||||
OUTA 0xE3
|
||||
INIA 0d1
|
||||
OUTA 0xE9 ; Refused: BankFault.
|
||||
|
||||
SETD.0 Done
|
||||
CALL printString
|
||||
CALL lineFeed
|
||||
HALT
|
||||
|
||||
readAndPrint:
|
||||
INA 0xE9
|
||||
CALL printByteHex
|
||||
CALL blankSpace
|
||||
RET
|
||||
|
||||
readOnlyHandler:
|
||||
SETD.0 ReadOnly
|
||||
CALL printString
|
||||
CALL lineFeed
|
||||
BRI stepPastRefusal
|
||||
|
||||
noBankHandler:
|
||||
SETD.0 NoBank
|
||||
CALL printString
|
||||
CALL lineFeed
|
||||
BRI stepPastRefusal
|
||||
|
||||
; Steps the saved address past the refused instruction. OUT is two bytes, an opcode and
|
||||
; a port, so two is what it takes.
|
||||
stepPastRefusal:
|
||||
MVSD.0
|
||||
DPUP.0 0d14
|
||||
LDA.0
|
||||
CCF
|
||||
INIB 0d2
|
||||
ADD
|
||||
MVQA
|
||||
STA.0
|
||||
BRC carried
|
||||
RETI
|
||||
carried:
|
||||
DPDN.0 0d01
|
||||
LDA.0
|
||||
INCA
|
||||
STA.0
|
||||
RETI
|
||||
|
||||
; Never executed.
|
||||
Marker:
|
||||
0x00 0x00
|
||||
|
||||
#Data
|
||||
|
||||
ReadOnly:
|
||||
"readonly"
|
||||
NoBank:
|
||||
"nobank"
|
||||
Done:
|
||||
"done"
|
||||
|
||||
#Vectors
|
||||
|
||||
GuardViolation readOnlyHandler
|
||||
BankFault noBankHandler
|
||||
Reference in New Issue
Block a user