]> git.sur5r.net Git - cc65/commitdiff
Implementation of getfirstdevice/getnextdevice for Atari. 562/head
authorChristian Groessler <chris@groessler.org>
Thu, 28 Dec 2017 03:54:18 +0000 (04:54 +0100)
committerChristian Groessler <chris@groessler.org>
Thu, 28 Dec 2017 03:54:18 +0000 (04:54 +0100)
libsrc/atari/getdevice.s [new file with mode: 0644]

diff --git a/libsrc/atari/getdevice.s b/libsrc/atari/getdevice.s
new file mode 100644 (file)
index 0000000..e0e7004
--- /dev/null
@@ -0,0 +1,78 @@
+;
+; Oliver Schmidt, 2012-09-04
+; Christian Groessler, 2017-12-28
+;
+; unsigned char getfirstdevice (void);
+; unsigned char __fastcall__ getnextdevice (unsigned char device);
+;
+
+        .include        "atari.inc"
+        .export         _getfirstdevice
+        .export         _getnextdevice
+
+MAX_DIO_DEVICES =       8
+
+;------------------------------------------------------------------------------
+; _getfirstdevice
+
+_getfirstdevice:
+        lda     #$FF
+        ; Fall through
+
+;------------------------------------------------------------------------------
+; _getnextdevice
+
+_getnextdevice:
+        tax
+next:   inx
+        cpx     #MAX_DIO_DEVICES
+        beq     none
+
+        jsr     check_device
+        bmi     next
+
+done:   txa
+        ldx     #$00
+        rts
+
+none:   ldx     #255            ; INVALID_DEVICE (see include/device.h)
+        bne     done            ; jump always
+
+;------------------------------------------------------------------------------
+; check_device - checks if a disk device is present
+; input:        X  - device id (0 = D1, 1 = D2, ...)
+; output:       NF - 0/1 for detected/not detected
+; X register preserved
+
+check_device:
+        txa
+        pha
+        lda     #SIO_STAT
+        sta     DCOMND          ; set command into DCB
+        lda     #%01000000      ; direction value, "receive data"
+        sta     DSTATS          ; set data flow directon
+        lda     #15
+        sta     DTIMLO          ; value got from DOS source
+        lda     #4
+        sta     DAUX1           ; set sector #  (dummy: 4)
+        sta     DBYTLO          ; # of bytes to transfer
+        lda     #0
+        sta     DAUX2
+        sta     DBYTHI
+        lda     #>DVSTAT
+        sta     DBUFHI
+        lda     #<DVSTAT
+        sta     DBUFLO          ; set buffer address into DCB
+        lda     #DISKID         ; SIO bus ID of diskette drive
+        sta     DDEVIC
+        inx
+        stx     DUNIT           ; unit number (1-based)
+
+        jsr     SIOV            ; execute SIO command
+
+        pla
+        tax
+        lda     DSTATS
+        rts
+
+        .end