Fix check whether there is enough memory btw. MEMLO and the program
load address to move screen buffer there.
This commit is contained in:
91
libsrc/atari/xlmemchk.inc
Normal file
91
libsrc/atari/xlmemchk.inc
Normal file
@@ -0,0 +1,91 @@
|
||||
; ... change system memory variables bla
|
||||
|
||||
|
||||
jmp cont
|
||||
|
||||
lowadr: .word __SAVEAREA_LOAD__ & $FF00 ; our load address, rounded down to page boundary
|
||||
tstadr: .res 2
|
||||
tstadr2:.res 2
|
||||
tmp: .res 1
|
||||
|
||||
|
||||
; When setting a display mode, the ROM takes the RAMTOP value
|
||||
; and subtracts the size of the screen memory from it. This will
|
||||
; become the new screen memory address.
|
||||
; From this address it subtracts the size of the display list.
|
||||
; This will become the new display list address.
|
||||
; Screen memory cannot cross 4K boundaries and a display list
|
||||
; cannot cross a 1K boundary.
|
||||
; Work out a sane value for RAMTOP to prevent boundary crossing.
|
||||
; RAMTOP is only one byte, it counts in memory pages.
|
||||
|
||||
cont:
|
||||
|
||||
_SCRBUFSZ = (40 * 24) ; size of mode 0 screen buffer
|
||||
_DLSZ = 32 ; size of mode 0 display list
|
||||
|
||||
; subtract screen memory size from our load address
|
||||
|
||||
lda lowadr
|
||||
sec
|
||||
sbc #<_SCRBUFSZ
|
||||
sta tstadr
|
||||
lda lowadr+1
|
||||
sbc #>_SCRBUFSZ
|
||||
sta tstadr+1
|
||||
|
||||
; check if a 4K boundary is crossed
|
||||
|
||||
lda lowadr+1
|
||||
and #$f0
|
||||
sta tmp
|
||||
lda tstadr+1
|
||||
and #$f0
|
||||
cmp tmp
|
||||
beq scrmemok
|
||||
|
||||
; 4K boundary will be crossed, take 4K boundary address as lowadr
|
||||
|
||||
al4k: lda lowadr+1
|
||||
and #$f0
|
||||
tax
|
||||
dex
|
||||
stx lowadr+1
|
||||
bne cont
|
||||
|
||||
; subtract display list size from calculated screen address
|
||||
|
||||
scrmemok:
|
||||
lda tstadr
|
||||
sec
|
||||
sbc #<_DLSZ
|
||||
sta tstadr2
|
||||
lda tstadr+1
|
||||
sbc #>_DLSZ
|
||||
sta tstadr2+1
|
||||
|
||||
; check if a 1K boundary is crossed
|
||||
|
||||
lda tstadr+1
|
||||
and #$fc
|
||||
sta tmp
|
||||
lda tstadr2+1
|
||||
and #$fc
|
||||
cmp tmp
|
||||
bne al4k ; 1K boundary will be crossed, decrease lowadr
|
||||
|
||||
; address of display list is ok
|
||||
|
||||
dlok:
|
||||
|
||||
; decrease tstadr2 by two
|
||||
|
||||
lda tstadr2
|
||||
sec
|
||||
sbc #2
|
||||
sta tstadr2
|
||||
bcs dec_cont
|
||||
lda tstadr2+1
|
||||
sbc #0
|
||||
sta tstadr2+1
|
||||
dec_cont:
|
||||
Reference in New Issue
Block a user