4cade/src/4cade.init.gs.a

106 lines
2.5 KiB
Plaintext

;license:MIT
;(c) 2020 by qkumba
;
; GS-specific code to support return-to-GS/OS
;
PrepareGSOS
!cpu 65816
clc
xce
rep #$30
!al
!rl
pha ; reserve word return
pea $1100 ; application-type, auxId #1
ldx #$2003 ; GetNewID
jsl $E10000
ply
sty @userID+1
pha
pha ; reserve dword return
pha
pea @return_e-@return_b ; dword size
phy ; ID
pea $8010 ; attrib (locked, can't cross bank)
pha
pha ; dword 0
ldx #$0902 ; NewHandle
jsl $E10000
plx
ply ; handle
pha
pea @return_b ; ptr
phy
phx ; handle
pha
pea @return_e-@return_b ; size
tya
xba
sta @handle2+2
stx @handle2+1
inx
inx
sta @handle1+2
stx @handle1+1
lda #$FB18 ; CLC / XCE
sta PatchQuit
lda #$005C ; JML
sta PatchQuit+2
@handle1
lda $D1D1D1 ; SMC
sta PatchQuit+5
xba
sta @copycallback+2
@handle2
lda $D1D1D1 ; SMC
sta PatchQuit+3
adc #@callback_b-@return_b
sta @copycallback+1
ldx #$2802 ; PtrToHand
jsl $E10000 ; copy hook code to allocated memory
sec
xce
rts
@return_b
rep #$30 ; called from 8-bit code but with e=0
ldx #((@callback_e-@callback_b)+1) and -2
@copycallback
lda $D1D1D1,x ; SMC
sta $BF00,x
dex
dex
bpl @copycallback
@userID pea $D1D1 ; SMC
ldx #$1102 ; DisposeAll
phb
pea ($BF00+@jmpGSOS-@callback_b)-1
jmp $E10000
@callback_b
!cpu 65C02
plx
inx
inx
inx
phx
lda #$B3
sta $204
lda #0
sta $280
rts
!cpu 65816
@jmpGSOS
sep #$30 ; revert to 8-bit mode
jmp $E0D000
@callback_e
@return_e
!cpu 6502