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:
Christian Groessler 2016-06-15 23:52:16 +02:00
parent 2c8b8d90bf
commit ec7751332f
2 changed files with 14 additions and 9 deletions

View file

@ -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

View file

@ -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