]> git.sur5r.net Git - cc65/commitdiff
Fix exec() for atarixl target.
authorChristian Groessler <chris@groessler.org>
Wed, 15 Jun 2016 21:52:16 +0000 (23:52 +0200)
committerChristian Groessler <chris@groessler.org>
Wed, 15 Jun 2016 21:52:16 +0000 (23:52 +0200)
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.

libsrc/atari/exec.s
libsrc/atari/open.s

index 4ae30fdbf8dfac5c2d43bb725419adc325ef421d..260a772b4208b2b83430cbd87067182bf7df1245 100644 (file)
         .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
         .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
+        ldx     SP_save
+        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
+        jsr     excexit         ; on atarixl this will enable the ROM again, making all high variables inaccessible
         pla
-        ldx     SP_save
-        txs                     ; reset stack pointer
         tax                     ; IOCB index in X
 
         lda     #<CMDLINE_BUFFER
index d5ff4ca521fc699bdaf9fb2b7f88abe77c6404db..721519525c97aaa7e41fc0abb8ce952439b1fed7 100644 (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