From 987c3066a3b76e84843f41d6bd7e602b6167af19 Mon Sep 17 00:00:00 2001
From: "ol.sc"
Date: Sun, 7 Oct 2012 19:18:56 +0000
Subject: [PATCH] Introduced getdevicedir() - with implementation for the CBMs.
git-svn-id: svn://svn.cc65.org/cc65/trunk@5840 b7a2c559-68d2-44c3-8de9-860c34a00d81
---
include/device.h | 2 +
libsrc/cbm/Makefile | 2 +
libsrc/cbm/devicedir.s | 97 ++++++++++++++++++++++++++++++++++++++++++
libsrc/cbm/devicestr.s | 35 +++++++++++++++
libsrc/cbm/initcwd.s | 27 +++---------
5 files changed, 143 insertions(+), 20 deletions(-)
create mode 100644 libsrc/cbm/devicedir.s
create mode 100644 libsrc/cbm/devicestr.s
diff --git a/include/device.h b/include/device.h
index 37323e637..9d525e15a 100644
--- a/include/device.h
+++ b/include/device.h
@@ -55,6 +55,8 @@ unsigned char getfirstdevice (void);
unsigned char __fastcall__ getnextdevice (unsigned char device);
+char* __fastcall__ getdevicedir (unsigned char device, char* buf, size_t size);
+
/* End of device.h */
diff --git a/libsrc/cbm/Makefile b/libsrc/cbm/Makefile
index 1b1a6a4cb..fbcaeeeed 100644
--- a/libsrc/cbm/Makefile
+++ b/libsrc/cbm/Makefile
@@ -69,6 +69,8 @@ S_OBJS = c_acptr.o \
closedir.o \
ctype.o \
cvline.o \
+ devicedir.o \
+ devicestr.o \
dir.o \
diskcmd.o \
exehdr.o \
diff --git a/libsrc/cbm/devicedir.s b/libsrc/cbm/devicedir.s
new file mode 100644
index 000000000..93e1845c0
--- /dev/null
+++ b/libsrc/cbm/devicedir.s
@@ -0,0 +1,97 @@
+;
+; Oliver Schmidt, 2012-09-10
+;
+; char* __fastcall__ getdevicedir (unsigned char device, char* buf, size_t size);
+;
+
+ .export _getdevicedir
+
+ .import opencmdchannel, closecmdchannel
+ .import writefndiskcmd, readdiskerror
+ .import isdisk, fnunit, fncmd, devicestr
+ .import popa, popax
+ .importzp ptr2, ptr3
+
+ .include "errno.inc"
+
+;------------------------------------------------------------------------------
+; _getdevicedir
+
+.proc _getdevicedir
+
+; Save size
+
+ sta ptr3
+ stx ptr3+1
+
+; Save buf
+
+ jsr popax
+ sta ptr2
+ stx ptr2+1
+
+; Save device
+
+ jsr popa
+ sta fnunit
+
+; Check for disk device
+
+ tax
+ jsr isdisk
+ bcs erange
+
+; Open channel
+
+ jsr opencmdchannel
+ bne oserr
+
+; Write command
+
+ lda #'i' ; Init command
+ sta fncmd
+ jsr writefndiskcmd
+ bne close
+
+; Read error
+
+ ldx fnunit
+ jsr readdiskerror
+
+; Close channel
+
+close: pha
+ ldx fnunit
+ jsr closecmdchannel
+ pla
+ bne oserr
+
+; Check for sufficient buf size
+
+ lda ptr3+1
+ bne okay ; Buf >= 256
+ lda ptr3
+ cmp #3
+ bcs okay ; Buf >= 3
+
+erange: lda #=10
+ add #'0'
+ sta (ptr2),y
+ iny
+: lda ptr1 ; rem
+ add #'0'
+ sta (ptr2),y
+ iny
+ lda #0
+ sta (ptr2),y
+ rts
+
+.endproc
diff --git a/libsrc/cbm/initcwd.s b/libsrc/cbm/initcwd.s
index 2df6dba85..5f43bc867 100644
--- a/libsrc/cbm/initcwd.s
+++ b/libsrc/cbm/initcwd.s
@@ -5,31 +5,18 @@
;
.export initcwd
- .import __curunit, __cwd
- .import pusha0, tosudiva0
- .importzp sreg, ptr1
-
- .macpack generic
+ .import __curunit, __cwd, devicestr
+ .importzp ptr2
.segment "INIT"
.proc initcwd
+ lda #<__cwd
+ ldx #>__cwd
+ sta ptr2
+ stx ptr2+1
lda __curunit
- jsr pusha0
- lda #10
- jsr tosudiva0
- ldx #0
- lda sreg
- beq :+ ; >=10
- add #'0'
- sta __cwd
- inx
-: lda ptr1 ; rem
- add #'0'
- sta __cwd,x
- lda #0
- sta __cwd+1,x
- rts
+ jmp devicestr
.endproc
--
2.39.5