Signed-off-by: Tormod Volden <debian.tormod@gmail.com>
.globl map_process_always
.globl map_save
.globl map_restore
+ .globl copybank
; imported
.globl _ramsize
lda map_store
bra map_set_a
+; optimized bank copy for fork
+; src bank in A, dst bank in B, start in X, end in U
+copybank
+ stu cmpend+1 ; self-modiying code FTW
+copyf sta banksel
+ ldu ,x
+ stb banksel
+ stu ,x++
+cmpend cmpx #0
+ blo copyf
+ stb map_copy
+ rts
+
map_store .db 0
map_copy .db 0
.globl map_process
.globl map_process_a
.globl map_process_always
+ .globl copybank
# exported
.globl _switchout
ldb P_TAB__P_PAGE_OFFSET+1,x ; new bank
lda U_DATA__U_PAGE+1 ; old bank
ldx #0x8000 ; PROGBASE
-copyf:
- jsr map_process_a
- ldu ,x
- exg a,b
- jsr map_process_a ; preserves A and B
- stu ,x++
- exg a,b
- cmpx U_DATA__U_TOP
- blo copyf
+ ldu U_DATA__U_TOP
+ jsr copybank ; preserves A,B, clobbers X,U
; stash parent urea (including kernel stack)
jsr map_process_a