2019-11-16 18:11:40 +00:00
|
|
|
;
|
|
|
|
; 2012-09-04, Oliver Schmidt
|
|
|
|
; 2019-11-08, Greg King
|
|
|
|
;
|
|
|
|
; unsigned char getfirstdevice (void);
|
|
|
|
; unsigned char __fastcall__ getnextdevice (unsigned char device);
|
|
|
|
;
|
|
|
|
|
|
|
|
.export _getfirstdevice
|
|
|
|
.export _getnextdevice
|
|
|
|
.import isdisk
|
|
|
|
.import opencmdchannel
|
|
|
|
.import closecmdchannel
|
|
|
|
.importzp tmp2
|
|
|
|
|
|
|
|
.include "cx16.inc"
|
|
|
|
|
|
|
|
;------------------------------------------------------------------------------
|
|
|
|
; getfirstdevice()
|
|
|
|
|
|
|
|
_getfirstdevice:
|
|
|
|
lda #$FF
|
|
|
|
; Fall through
|
|
|
|
|
|
|
|
;------------------------------------------------------------------------------
|
|
|
|
; getnextdevice()
|
|
|
|
|
|
|
|
_getnextdevice:
|
|
|
|
tax
|
|
|
|
next: inx
|
|
|
|
cpx #$FF
|
|
|
|
beq done
|
|
|
|
|
|
|
|
; [open|close]cmdchannel already call isdisk internally; but, they
|
|
|
|
; interpret a non-disk as a no-op, while we need to interpret it
|
|
|
|
; as an error here.
|
|
|
|
|
|
|
|
jsr isdisk
|
|
|
|
bcs next
|
|
|
|
|
|
|
|
; [open|close]cmdchannel don't call into the Kernal, at all, if they
|
|
|
|
; only [in|de]crement the reference count of the shared cmdchannel.
|
|
|
|
; Therefore, we need to initiate STATUS explicitly here.
|
|
|
|
|
|
|
|
lda #$00
|
|
|
|
sta STATUS
|
|
|
|
|
|
|
|
stx tmp2
|
|
|
|
jsr opencmdchannel
|
|
|
|
ldx tmp2
|
|
|
|
jsr closecmdchannel
|
|
|
|
ldx tmp2
|
|
|
|
|
2020-11-08 22:45:54 +00:00
|
|
|
; As we had to reference STATUS above anyway, we can do so, as well,
|
2019-11-16 18:11:40 +00:00
|
|
|
; here too (instead of calling READST).
|
|
|
|
|
|
|
|
lda STATUS
|
|
|
|
|
|
|
|
; Either the Kernal calls above were successfull, or there was
|
|
|
|
; already a cmdchannel to the device open -- which is a pretty
|
|
|
|
; good indication of its existence. ;-)
|
|
|
|
|
|
|
|
bmi next
|
|
|
|
|
|
|
|
done: txa
|
|
|
|
ldx #$00
|
|
|
|
rts
|