2015-10-05 05:47:43 -04:00
|
|
|
;
|
2015-10-07 14:56:14 -04:00
|
|
|
; 2015-10-07, Greg King
|
2015-10-05 05:47:43 -04:00
|
|
|
;
|
|
|
|
|
2015-10-07 14:56:14 -04:00
|
|
|
.export moveinit
|
2015-10-05 05:47:43 -04:00
|
|
|
|
|
|
|
.import __INIT_LOAD__, __INIT_RUN__, __INIT_SIZE__ ; Linker-generated
|
|
|
|
|
|
|
|
.macpack cpu
|
|
|
|
.macpack generic
|
|
|
|
|
|
|
|
|
2015-10-07 14:56:14 -04:00
|
|
|
; Put this in the DATA segment because it is self-modifying code.
|
|
|
|
|
|
|
|
.data
|
|
|
|
|
2015-10-05 05:47:43 -04:00
|
|
|
; Move the INIT segment from where it was loaded (over the bss segments)
|
2015-10-14 22:52:09 +02:00
|
|
|
; into where it must be run (over the BSS segment). The two areas might overlap;
|
|
|
|
; and, the segment is moved upwards. Therefore, this code starts at the highest
|
2015-10-05 05:47:43 -04:00
|
|
|
; address, and decrements to the lowest address. The low bytes of the starting
|
|
|
|
; pointers are not sums. The high bytes are sums; but, they do not include the
|
|
|
|
; carry. Both the low-byte sums and the carries will be done when the pointers
|
|
|
|
; are indexed by the .Y register.
|
|
|
|
|
2015-10-07 14:56:14 -04:00
|
|
|
moveinit:
|
2015-10-05 05:47:43 -04:00
|
|
|
|
|
|
|
; First, move the last, partial page.
|
|
|
|
; Then, move all of the full pages.
|
|
|
|
|
|
|
|
ldy #<__INIT_SIZE__ ; size of partial page
|
2015-10-07 14:56:14 -04:00
|
|
|
ldx #>__INIT_SIZE__ + (<__INIT_SIZE__ <> 0) ; number of pages, including partial
|
|
|
|
|
|
|
|
L1: dey
|
|
|
|
init_load:
|
|
|
|
lda __INIT_LOAD__ + (__INIT_SIZE__ & $FF00) - $0100 * (<__INIT_SIZE__ = 0),y
|
|
|
|
init_run:
|
|
|
|
sta __INIT_RUN__ + (__INIT_SIZE__ & $FF00) - $0100 * (<__INIT_SIZE__ = 0),y
|
2015-10-05 05:47:43 -04:00
|
|
|
tya
|
2015-10-07 14:56:14 -04:00
|
|
|
bnz L1 ; page not finished
|
2015-10-05 05:47:43 -04:00
|
|
|
|
2015-10-07 14:56:14 -04:00
|
|
|
dec init_load+2
|
|
|
|
dec init_run+2
|
2015-10-05 05:47:43 -04:00
|
|
|
dex
|
|
|
|
bnz L1 ; move next page
|
|
|
|
rts
|