Files
SyncHome/trunk/workspace/AVR-Computer/avr-vic20/AVRCODE/macros.asm
2023-03-13 08:36:51 +00:00

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 ;