Files
cc65/libsrc/atari/xlmemchk.inc
Christian Groessler 6ed1b07e59 Fix check whether there is enough memory btw. MEMLO and the program
load address to move screen buffer there.
2013-06-20 23:31:41 +02:00

92 lines
1.6 KiB
PHP

; ... 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: