1
0
mirror of https://github.com/cc65/cc65.git synced 2024-07-01 08:29:37 +00:00

Allow to run programs as ProDOS SYS files (beside BIN files). To do so detect at runtime if BASIC.SYSTEM is present by checking the "signature" of the last system bitmap byte.

git-svn-id: svn://svn.cc65.org/cc65/trunk@4146 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
ol.sc 2009-09-11 16:27:20 +00:00
parent d9cdca75b6
commit aeccd3a776

View File

@ -99,14 +99,14 @@ _exit: ldx #<exit
jsr donelib
; Check for valid interrupt vector table entry number
lda intnum
lda int_num
beq exit
; Deallocate interrupt vector table entry
dec params ; Adjust parameter count
dec i_param ; Adjust parameter count
jsr $BF00 ; MLI call entry point
.byte $41 ; Dealloc interrupt
.addr params
.addr i_param
; Restore the original RESET vector
exit: ldx #$02
@ -128,8 +128,8 @@ exit: ldx #$02
ldx #$FF
txs ; Re-init stack pointer
; Back to DOS
jmp DOSWARM
; We're done
jmp (done)
; ------------------------------------------------------------------------
@ -159,25 +159,47 @@ init: ldx #zpspace-1
lda #>_exit
jsr reset ; Setup RESET vector
; Setup the stack
lda HIMEM
sta sp
lda HIMEM+1
sta sp+1 ; Set argument stack ptr
; Check for ProDOS
ldy $BF00 ; MLI call entry point
cpy #$4C ; Is MLI present? (JMP opcode)
bne basic
; Check ProDOS system bit map
lda $BF6F ; protection for pages $B8 - $BF
cmp #%00000001 ; exactly page $BF is protected
bne basic
; No BASIC.SYSTEM so quit to ProDOS dispatcher instead
lda #<quit
ldx #>quit
sta done
stx done+1
; No BASIC.SYSTEM so use addr of ProDOS system global page
lda #<$BF00
ldx #>$BF00
bne :+ ; Branch always
; Get highest available mem addr from BASIC interpreter
basic: lda HIMEM
ldx HIMEM+1
; Setup the C stack
: sta sp
stx sp+1
; Check for interruptors
lda #<__INTERRUPTOR_COUNT__
beq :+
; Check for ProDOS
lda $BF00 ; MLI call entry point
cmp #$4C ; Is MLI present? (JMP opcode)
cpy #$4C ; Is MLI present? (JMP opcode)
bne prterr
; Allocate interrupt vector table entry
jsr $BF00 ; MLI call entry point
.byte $40 ; Alloc interrupt
.addr params
.addr i_param
bcs prterr
; Enable interrupts as old ProDOS versions (i.e. 1.1.1)
@ -223,7 +245,7 @@ msglen = * - errmsg
; ProDOS TechRefMan, chapter 6.2:
; "Each installed routine must begin with a CLD instruction."
intrpt: cld
intptr: cld
; Call interruptors and check for success
jsr callirq
@ -248,13 +270,33 @@ reset: stx SOFTEV
sta PWREDUP
rts
; Quit to ProDOS dispatcher
quit: jsr $BF00 ; MLI call entry point
.byte $65 ; Quit
.word q_param
; ------------------------------------------------------------------------
.rodata
; MLI parameter list for quit
q_param:.byte $04 ; param_count
.byte $00 ; quit_type
.word $0000 ; reserved
.byte $00 ; reserved
.word $0000 ; reserved
; ------------------------------------------------------------------------
.data
params: .byte $02 ; Parameter count
intnum: .byte $00 ; Interrupt number
.addr intrpt ; Interrupt handler
; MLI parameter list for (de)alloc interrupt
i_param:.byte $02 ; param_count
int_num:.byte $00 ; int_num
.addr intptr ; int_code
; Location to jump to when we're done
done: .addr DOSWARM
; ------------------------------------------------------------------------