225 lines
5.1 KiB
NASM
225 lines
5.1 KiB
NASM
.equ high_test = 0x11 ;in order to use the full 64k of external mem, everytime a read or write occurs
|
|
;the address must be checked to make sure it is above or euqal to 0x1100, if it below
|
|
;then have to perform hack
|
|
.equ rom_start = 0x80 ;high byte test for ROM - sets ammount of ram
|
|
.equ VIAS = 0x91
|
|
.equ sb_mask = 64
|
|
;--------------------------------------------------------------
|
|
.MACRO ld_cpuZ
|
|
mov r16,ZH ;test if VIAS being accessed
|
|
cpi r16,VIAS
|
|
breq hardware
|
|
|
|
cpi ZH,high_test
|
|
brlo dohack1
|
|
ld @0,Z ;hack not needed
|
|
rjmp exit1
|
|
|
|
dohack1:
|
|
ldi r16, (1<<XMM1) ;force top address bit 0
|
|
sts XMCRB, r16
|
|
|
|
sbr ZH,sb_mask ;set high bit, so when writing/reading it will use external memory
|
|
|
|
ld @0,Z ;read value
|
|
|
|
cbr ZH,sb_mask ;clear top bit
|
|
|
|
ldi r16,(0<<XMM1)
|
|
sts XMCRB, r16
|
|
rjmp exit1
|
|
hardware:
|
|
; push retL
|
|
rcall vias_access
|
|
mov @0,retL
|
|
; pop retL
|
|
|
|
|
|
exit1:
|
|
.ENDMACRO
|
|
;--------------------------------------------------------------
|
|
.MACRO ld_cpuZp
|
|
cpi ZH,high_test
|
|
brlo dohack1
|
|
ld @0,Z+ ;hack not needed
|
|
rjmp exit1
|
|
|
|
dohack1:
|
|
ldi r16, (1<<XMM1) ;force top address bit 0
|
|
sts XMCRB, r16
|
|
|
|
sbr ZH,sb_mask ;set high bit, so when writing/reading it will use external memory
|
|
|
|
ld @0,Z+ ;read value
|
|
|
|
cbr ZH,sb_mask ;clear top bit
|
|
|
|
ldi r16, (0<<XMM1)
|
|
sts XMCRB, r16
|
|
|
|
exit1:
|
|
|
|
.ENDMACRO
|
|
;--------------------------------------------------------------
|
|
.MACRO ld_cpuY
|
|
|
|
|
|
|
|
cpi YH,high_test
|
|
brlo dohack1
|
|
ld @0,Y ;hack not needed
|
|
rjmp exit1
|
|
|
|
dohack1:
|
|
ldi r16, (1<<XMM1) ;force top address bit 0
|
|
sts XMCRB, r16
|
|
|
|
sbr YH,sb_mask ;set high bit, so when writing/reading it will use external memory
|
|
|
|
ld @0,Y ;read value
|
|
|
|
cbr YH,sb_mask ;clear top bit
|
|
|
|
ldi r16, (0<<XMM1)
|
|
sts XMCRB, r16
|
|
|
|
|
|
|
|
exit1:
|
|
.ENDMACRO
|
|
;--------------------------------------------------------------
|
|
.MACRO ld_cpuYp
|
|
cpi YH,high_test
|
|
brlo dohack1
|
|
ld @0,Y+ ;hack not needed
|
|
rjmp exit1
|
|
|
|
dohack1:
|
|
ldi r16, (1<<XMM1) ;force top address bit 0
|
|
sts XMCRB, r16
|
|
|
|
sbr YH,sb_mask ;set high bit, so when writing/reading it will use external memory
|
|
|
|
ld @0,Y+ ;read value
|
|
|
|
cbr YH,sb_mask ;clear top bit
|
|
|
|
ldi r16,(0<<XMM1)
|
|
sts XMCRB, r16
|
|
|
|
exit1:
|
|
.ENDMACRO
|
|
|
|
;--------------------------------------------------------------
|
|
|
|
.MACRO st_cpuZ
|
|
cpi ZH,high_test
|
|
brlo dohack1
|
|
|
|
mov r16,ZH ;when kernal starts, it tests ram untill it finds ROM
|
|
andi r16,0b11110000
|
|
cpi r16,rom_start
|
|
breq exit1
|
|
|
|
st Z,@0 ;hack not needed
|
|
rjmp exit1
|
|
|
|
dohack1:
|
|
ldi r16, (1<<XMM1) ;force top address bit 0
|
|
sts XMCRB, r16
|
|
|
|
sbr ZH,sb_mask ;set high bit, so when writing/reading it will use external memory
|
|
|
|
st Z,@0 ;store value
|
|
|
|
cbr ZH,sb_mask ;clear top bit
|
|
|
|
ldi r16, (0<<XMM1)
|
|
sts XMCRB, r16
|
|
|
|
exit1:
|
|
.ENDMACRO
|
|
;--------------------------------------------------------------
|
|
|
|
.MACRO stack_push ;stack 1FF -> 100
|
|
|
|
ldi ZH,1 ;get next stack address
|
|
mov ZL,stack
|
|
|
|
;TODO def in lower reagion, setup for write
|
|
ldi r16, (1<<XMM1) ;force top address bit 0
|
|
sts XMCRB, r16
|
|
|
|
sbr ZH,sb_mask ;set high bit, so when writing/reading it will use external memory
|
|
|
|
st Z,@0 ;store value
|
|
|
|
cbr ZH,sb_mask ;clear top bit
|
|
|
|
ldi r16, (0<<XMM1)
|
|
sts XMCRB, r16
|
|
; st Z,@0 ;store value to stack
|
|
|
|
dec stack ;dec stack to next location
|
|
.ENDMACRO
|
|
|
|
|
|
.MACRO stack_pop ;stack 1FF -> 100
|
|
inc stack ;in stack to prev location
|
|
|
|
ldi ZH,1 ;get next stack address
|
|
mov ZL,stack
|
|
|
|
;TODO def in lower reagion, setup for write
|
|
ldi r16, (1<<XMM1) ;force top address bit 0
|
|
sts XMCRB, r16
|
|
|
|
sbr ZH,sb_mask ;set high bit, so when writing/reading it will use external memory
|
|
|
|
ld @0,Z ;read value
|
|
|
|
cbr ZH,sb_mask ;clear top bit
|
|
|
|
ldi r16,(0<<XMM1)
|
|
sts XMCRB, r16
|
|
; ld @0,Z ;get value from stack
|
|
|
|
.ENDMACRO
|
|
|
|
|
|
|
|
|
|
|
|
;----------------------------------------------------------------------
|
|
;----------------------------------------------------------------------
|
|
;get_pc_mem
|
|
|
|
;purpose: get next byte pointed to by PC, also inc PC
|
|
;Takes: PC
|
|
;Give: returns byte in first param
|
|
;----------------------------------------------------------------------
|
|
;----------------------------------------------------------------------
|
|
.MACRO get_pc_mem
|
|
cpi XH,high_test
|
|
brlo dohack1
|
|
ld @0,X+ ;hack not needed
|
|
rjmp exit1
|
|
|
|
dohack1:
|
|
ldi r16, (1<<XMM1) ;force top address bit 0
|
|
sts XMCRB, r16
|
|
|
|
sbr XH,sb_mask ;set high bit, so when writing/reading it will use external memory
|
|
|
|
ld @0,X+ ;read value
|
|
|
|
cbr XH,sb_mask ;clear top bit
|
|
|
|
ldi r16, (0<<XMM1)
|
|
sts XMCRB, r16
|
|
exit1:
|
|
;TODO check is less than 0x1100
|
|
;ld @0,X+;
|
|
.ENDMACRO ;
|
|
|