]> git.sur5r.net Git - cc65/commitdiff
Atari: fix lookup of default device on XDOS. 349/head
authorChristian Groessler <chris@groessler.org>
Mon, 12 Sep 2016 21:34:10 +0000 (23:34 +0200)
committerChristian Groessler <chris@groessler.org>
Mon, 12 Sep 2016 21:40:25 +0000 (23:40 +0200)
Stefan Dorndorf, author of XDOS, pointed out that retrieving the
default device by looking at an undocumented memory location won't
work in future XDOS versions.
He also showed a way to get the default device in a compatible
manner.

This change implements his method and adds a version check (XDOS
versions below 2.4 don't support this -- for them the behaviour
will be the same as, for example, AtariDOS: no notion of a default
drive).

asminc/atari.inc
libsrc/atari/getdefdev.s
libsrc/atari/shadow_ram_handlers.s

index 453c370f43f4b80ff262cf8a64e6a1dcb8d321d8..1b995e380731e2322512d05888dd9f17f257cb55 100644 (file)
@@ -1024,9 +1024,16 @@ XFILE        = $087D    ; XDOS filename buffer
 XLINE        = $0880    ; XDOS DUP input line
 XGLIN        = $0871    ; get line
 XSKIP        = $0874    ; skip parameter
+.ifdef __ATARIXL__
+.ifndef SHRAM_HANDLERS
+.import XMOVE_handler
+.endif
+.define XMOVE XMOVE_handler
+XMOVE_org    = $0877    ; move filename
+.else
 XMOVE        = $0877    ; move filename
+.endif
 XGNUM        = $087A    ; get number
-XDEFDEV      = $0816    ; current drive * undocumented *
 
 ;-------------------------------------------------------------------------
 ; End of atari.inc
index a1c950dc50e9112b9aea3c847adf05385289fb75..480639b4a6cea56457fc33a2b6e60e7766d04b08 100644 (file)
@@ -77,16 +77,33 @@ finish: lda     #<__defdev
         ldx     #>__defdev
         rts
 
-; XDOS version
+; XDOS default device retrieval
 
-xdos:   lda     XDEFDEV
+xdos:
+
+; check XDOS version (we need >= 2.4)
+
+        lda     XGLIN
+        cmp     #$4C            ; there needs to be a 'JMP' opcode here
+        bne     finish          ; older version, use DEFAULT_DEVICE or D1:
+        lda     XVER            ; get BCD encoded version ($24 for 2.4)
+        cmp     #$24
+        bcc     finish          ; too old, below 2.4
+
+; good XDOS version, get default drive
+
+        lda     #ATEOL
+        sta     XLINE           ; simulate empty command line
+        ldy     #0
+        jsr     XMOVE           ; create an FMS filename (which in this case only contains the drive)
+        lda     XFILE+1
         bne     done
 
         .data
 
 crvec:  jmp     $FFFF           ; target address will be set to crunch vector
 
-; Default device
+; Default device string
 
 __defdev:
 .ifdef  DEFAULT_DEVICE
@@ -94,4 +111,3 @@ __defdev:
 .else
         .byte   "D1:", 0
 .endif
-
index d65e6bd68727eaa394d0c2a59f320aeabcdc7bc1..a8ba611b6ca45407f15c465d9fd0ca63d906008b 100644 (file)
@@ -22,6 +22,7 @@ SHRAM_HANDLERS  =       1
         .export         CIO_handler
         .export         SIO_handler
         .export         SETVBV_handler
+        .export         XMOVE_handler
 
 BUFSZ           =       128     ; bounce buffer size
 BUFSZ_SIO       =       256
@@ -1085,6 +1086,24 @@ SETVBV_handler:
         plp
         rts
 
+;---------------------------------------------------------
+
+XMOVE_handler:
+
+        pha
+        lda     PORTB
+        sta     cur_XMOVE_PORTB
+        enable_rom
+        pla
+        jsr     XMOVE_org
+        php
+        pha
+        disable_rom_val cur_XMOVE_PORTB
+        pla
+        plp
+        rts
+
+
 CIO_a:                  .res    1
 CIO_x:                  .res    1
 CIO_y:                  .res    1
@@ -1093,6 +1112,7 @@ cur_CIOV_PORTB:         .res    1
 cur_SIOV_PORTB:         .res    1
 cur_KEYBDV_PORTB:       .res    1
 cur_SETVBV_PORTB:       .res    1
+cur_XMOVE_PORTB:        .res    1
 orig_ptr:               .res    2
 orig_len:               .res    2
 req_len:                .res    2