From 6198e10f6779f08c97faf5ebef6c8bb8d0bd8b90 Mon Sep 17 00:00:00 2001 From: Christian Groessler Date: Mon, 12 Sep 2016 23:34:10 +0200 Subject: [PATCH] Atari: fix lookup of default device on XDOS. 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 | 9 ++++++++- libsrc/atari/getdefdev.s | 24 ++++++++++++++++++++---- libsrc/atari/shadow_ram_handlers.s | 20 ++++++++++++++++++++ 3 files changed, 48 insertions(+), 5 deletions(-) diff --git a/asminc/atari.inc b/asminc/atari.inc index 453c370f4..1b995e380 100644 --- a/asminc/atari.inc +++ b/asminc/atari.inc @@ -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 diff --git a/libsrc/atari/getdefdev.s b/libsrc/atari/getdefdev.s index a1c950dc5..480639b4a 100644 --- a/libsrc/atari/getdefdev.s +++ b/libsrc/atari/getdefdev.s @@ -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 - diff --git a/libsrc/atari/shadow_ram_handlers.s b/libsrc/atari/shadow_ram_handlers.s index d65e6bd68..a8ba611b6 100644 --- a/libsrc/atari/shadow_ram_handlers.s +++ b/libsrc/atari/shadow_ram_handlers.s @@ -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