Fix check whether there is enough memory btw. MEMLO and the program

load address to move screen buffer there.
This commit is contained in:
Christian Groessler
2013-06-20 23:31:41 +02:00
parent 96b0ca0524
commit 6ed1b07e59
3 changed files with 101 additions and 30 deletions

91
libsrc/atari/xlmemchk.inc Normal file
View 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: