Fix exec() for atarixl target.
The final part of exec() called 'excexit' and only then restored the stack pointer to its value at program entry. 'excexit' does all cleanup (the same as '_exit()'), which means that on the atarixl target the ROM is banked in again. On big programs the 'SP_save' variable might reside at a high memory address which is no longer accessible after the ROM has been banked in. The change just moves the restoration of the stack pointer before the call to 'excexit'. Another change lets exec.s compile if UCASE_FILENAME is not defined. And some other small cleanups, also in open.s.
This commit is contained in:
parent
2c8b8d90bf
commit
ec7751332f
2 changed files with 14 additions and 9 deletions
|
@ -11,11 +11,9 @@
|
|||
.import __dos_type
|
||||
.import findfreeiocb
|
||||
.import incsp2
|
||||
.import __do_oserror
|
||||
.import excexit ; from crt0.s
|
||||
.import SP_save ; from crt0.s
|
||||
.ifdef UCASE_FILENAME
|
||||
.importzp tmp3
|
||||
.import ucase_fn
|
||||
.import addysp
|
||||
.endif
|
||||
|
@ -24,7 +22,10 @@
|
|||
.include "errno.inc"
|
||||
.include "atari.inc"
|
||||
|
||||
CMDLINE_BUFFER = $0100 ; put progname + cmdline as one single string there
|
||||
; area $0100 to $0128 might be in use (e.g. Hias' high speed patch)
|
||||
CMDLINE_BUFFER = $0129 ; put progname + cmdline as one single string there
|
||||
; alternatively:
|
||||
;CMDLINE_BUFFER = $0480 ; put progname + cmdline as one single string there
|
||||
CMDLINE_MAX = 40+3 ; max. length of drive + progname + cmdline
|
||||
|
||||
.code
|
||||
|
@ -85,6 +86,11 @@ copyp: lda (ptr4),y
|
|||
; programe name too long
|
||||
beq invret
|
||||
|
||||
.ifndef UCASE_FILENAME
|
||||
invret: lda #EINVAL
|
||||
bne seterr
|
||||
.endif
|
||||
|
||||
; file name copied, check for args
|
||||
|
||||
copypd: tya ; put Y into X (index into CMDLINE_BUFFER)
|
||||
|
@ -172,11 +178,11 @@ openok: lda #>buf
|
|||
; here's the point of no return
|
||||
|
||||
lda tmp4 ; get IOCB index
|
||||
pha ; and save it ('excexit' calls destructors and they might destroy tmp4)
|
||||
jsr excexit
|
||||
pla
|
||||
ldx SP_save
|
||||
txs ; reset stack pointer
|
||||
txs ; reset stack pointer to what it was at program entry
|
||||
pha ; and save it ('excexit' calls destructors and they might destroy tmp4)
|
||||
jsr excexit ; on atarixl this will enable the ROM again, making all high variables inaccessible
|
||||
pla
|
||||
tax ; IOCB index in X
|
||||
|
||||
lda #<CMDLINE_BUFFER
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
.include "fcntl.inc"
|
||||
.include "errno.inc"
|
||||
.include "fd.inc"
|
||||
.include "zeropage.inc"
|
||||
|
||||
.export _open
|
||||
.destructor closeallfiles, 5
|
||||
|
@ -19,9 +20,7 @@
|
|||
.import incsp4
|
||||
.import ldaxysp,addysp
|
||||
.import __oserror
|
||||
.importzp tmp4,tmp2
|
||||
.ifdef UCASE_FILENAME
|
||||
.importzp tmp3
|
||||
.import ucase_fn
|
||||
.endif
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue