]> git.sur5r.net Git - cc65/commitdiff
cbm_write() added
authormrintsch <mrintsch@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Fri, 30 Mar 2001 18:18:40 +0000 (18:18 +0000)
committermrintsch <mrintsch@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Fri, 30 Mar 2001 18:18:40 +0000 (18:18 +0000)
changed/added some comments
all cbm_* IO functions are using _oserror now

git-svn-id: svn://svn.cc65.org/cc65/trunk@682 b7a2c559-68d2-44c3-8de9-860c34a00d81

include/cbm.h
libsrc/cbm/Makefile
libsrc/cbm/c_bsout.s
libsrc/cbm/c_ckout.s
libsrc/cbm/cbm_load.c
libsrc/cbm/cbm_open.c
libsrc/cbm/cbm_read.c
libsrc/cbm/cbm_save.c
libsrc/cbm/cbm_write.c [new file with mode: 0644]

index b26673e1c69f4ab7718c612a66f5acd8f8a84936..e80145efe9b30bc2dc82165bc322f8ee14dd9e1e 100644 (file)
@@ -104,26 +104,36 @@ unsigned char __fastcall__ cbm_k_open (void);
 void __fastcall__ cbm_k_close (unsigned char FN);
 unsigned char __fastcall__ cbm_k_readst (void);
 unsigned char __fastcall__ cbm_k_chkin (unsigned char FN);
+unsigned char __fastcall__ cbm_k_ckout (unsigned char FN);
 unsigned char __fastcall__ cbm_k_basin (void);
+void __fastcall__ cbm_k_bsout (unsigned char C);
 void __fastcall__ cbm_k_clrch (void);
 
-/* BASIC-like functions */
-unsigned char cbm_load(const char* name, unsigned char device, unsigned int addr);
-/* Loads file "name" from given device to given address or to the load address
- * of the file if addr is 0 (like load"name",8,1 in BASIC)
- * Returns 0 if loading was successful otherwise an errorcode (see table below).
+/* BASIC-like functions
+ *
+ * All cbm_* IO functions set extern unsigned char _oserror in case
+ * of an error. For the meaning of the errorcode see the table below.
+ */
+unsigned char cbm_load(const char* name, unsigned char device,
+                       unsigned int addr);
+/* Loads file "name" from given device to given address or to the load
+ * address of the file if addr is 0 (like load"name",8,1 in BASIC)
+ * Returns 0 if loading was successful otherwise an errorcode (see table
+ * below).
  */
 
 unsigned char cbm_save(const char* name, unsigned char device,
-                      unsigned int start, unsigned int end);
+                       unsigned int start, unsigned int end);
 /* Saves a memory area from start to end-1 to a file.
- * Returns 0 if saving was successful, otherwise an errorcode (see table below).
+ * Returns 0 if saving was successful, otherwise an errorcode (see table
+ * below).
  */
 
 unsigned char cbm_open(unsigned char lfn, unsigned char device,
                        unsigned char sec_addr, const char* name);
 /* Opens a file. Works just like the BASIC command.
- * Returns 0 if opening was successful, otherwise an errorcode (see table below).
+ * Returns 0 if opening was successful, otherwise an errorcode (see table
+ * below).
  */
 
 void __fastcall__ cbm_close (unsigned char lfn);
@@ -131,8 +141,15 @@ void __fastcall__ cbm_close (unsigned char lfn);
 
 int cbm_read(unsigned char lfn, void* buffer, unsigned int size);
 /* Reads up to "size" bytes from a file to "buffer".
- * Returns the number of actually read bytes, 0 if there are no bytes left (EOF)
- * or -1 in case of an error. _oserror contains an errorcode then (see table below).
+ * Returns the number of actually read bytes, 0 if there are no bytes left
+ * (EOF) or -1 in case of an error. _oserror contains an errorcode then (see
+ * table below).
+ */
+
+int cbm_write(unsigned char lfn, void* buffer, unsigned int size);
+/* Writes up to "size" bytes from "buffer" to a file.
+ * Returns the number of actually written bytes or -1 in case of an error.
+ * _oserror contains an errorcode then (see table below).
  */
 
 /* Errorcodes of cbm_* I/O functions:
index 5bc350402c8f466c30e01c97b5bfc3bb6580150d..a4222f2d660fc87438eb34cb7e5ed6aff791bec7 100644 (file)
@@ -11,7 +11,7 @@
 %.o:   %.s
        @$(AS) -g -o $@ $(AFLAGS) $<
 
-C_OBJS = cbm_load.o cbm_save.o cbm_open.o cbm_read.o
+C_OBJS = cbm_load.o cbm_save.o cbm_open.o cbm_read.o cbm_write.o
 
 S_OBJS = ctype.o getenv.o gotoxy.o gotox.o gotoy.o where.o\
         clock.o chline.o cvline.o cclear.o revers.o\
index a2c682b1c958c4e43399dad598a658efdb247248..9bb0430cd11ef439386fb8ff49ec2a4fd67dd2ba 100644 (file)
@@ -1,14 +1,11 @@
 ;
 ; Ullrich von Bassewitz, 03.06.1999
 ;
-; void __fastcall__ cbm_bsout (unsigned char C);
+; void __fastcall__ cbm_k_bsout (unsigned char C);
 ;
 
                .include        "cbm.inc"
 
-               .export         _cbm_bsout
-
-_cbm_bsout = BSOUT
-
-
+               .export         _cbm_k_bsout
 
+_cbm_k_bsout = BSOUT
index f239727cb18b907e91cc9f127feebcab67f5c3f6..148619d6b3d891add5cd0d127c4d21e57d05215c 100644 (file)
 _cbm_k_ckout:
        tax
                jsr     CKOUT
-       ldx     #0
-       bcc     @Ok
-       inx
-       rts
-@Ok:   txa
-       rts
-
-
-
-
-
+       bcs     @NotOk
+       lda     #0
+@NotOk:        rts
index 7550746313a95f35bf0859e2cb821ff479239f26..283a4512dcc5e394a039b1b81545cefed79ca57b 100644 (file)
@@ -6,6 +6,8 @@
 
 #include <cbm.h>
 
+extern unsigned char _oserror;         
+
 /* loads file "name" from given device to given address or to the load address
  * of the file if addr is 0
  */
@@ -13,9 +15,8 @@ unsigned char cbm_load(const char* name, unsigned char device,
                        unsigned int addr)
 {
     /* LFN is set to 0 but it's not needed for loading.
-     * (BASIC V2 sets it to the value of the SA for LOAD)
-     */
+     * (BASIC V2 sets it to the value of the SA for LOAD) */
     cbm_k_setlfs(0, device, addr == 0);
     cbm_k_setnam(name);
-    return cbm_k_load(0, addr);
+    return _oserror = cbm_k_load(0, addr);
 }
index c47ecf26793a7b2fb965a0c65e7cc32340f79a91..c63ac8ab815a3418f227afb4687a057073bb95c1 100644 (file)
@@ -2,15 +2,19 @@
  * Marc 'BlackJack' Rintsch, 18.03.2001
  *
  * unsigned char cbm_open(unsigned char lfn, unsigned char device,
- *                        unsigned char sec_addr, const char* name)
+ *                        unsigned char sec_addr, const char* name);
  */
  
 #include <cbm.h>
 
+extern unsigned char _oserror;
+
+/* It's like BASIC's: OPEN lfn, device, sec_addr, "name"
+ */
 unsigned char cbm_open(unsigned char lfn, unsigned char device,
                        unsigned char sec_addr, const char* name)
 {
     cbm_k_setlfs(lfn, device, sec_addr);
     cbm_k_setnam(name);
-    return cbm_k_open();
+    return _oserror = cbm_k_open();
 }
index 1efd203a65c5699db420c28e108c9d16f1ce1448..23be7315c69d29982cf9ccf0d9dfd348c9f81852 100644 (file)
@@ -12,18 +12,24 @@ int cbm_read(unsigned char lfn, void* buffer, unsigned int size)
 {
     static unsigned int bytesread;
     static unsigned char tmp;
-        
+
+    /* if we can't change to the inputchannel #lfn then return an error */
     if (_oserror = cbm_k_chkin(lfn)) return -1;
     
     bytesread = 0;
-    
+
     while (bytesread<size && !cbm_k_readst()) {
         tmp = cbm_k_basin();
+        
+        /* the kernal routine BASIN sets ST to EOF if the end of file
+         * is reached the first time, then we have store tmp.
+         * every subsequent call returns EOF and READ ERROR in ST, then
+         * we have to exit the loop here immidiatly. */
         if (cbm_k_readst() & 0xBF) break;
+        
         ((unsigned char*)buffer)[bytesread++] = tmp;
     }
     
     cbm_k_clrch();
-    
     return bytesread;
 }
index 13843627efae342e948d833a8c23ea8abd79e1ad..381b747b8a9395fb3e31a9edb9f96723c9f20c83 100644 (file)
@@ -9,6 +9,8 @@
 
 #include <cbm.h>
 
+extern unsigned char _oserror;
+
 /* saves a memory area from start to end-1 to a file.
  */
 unsigned char cbm_save(const char* name, unsigned char device,
@@ -16,5 +18,5 @@ unsigned char cbm_save(const char* name, unsigned char device,
 {
     cbm_k_setlfs(0, device, 0);
     cbm_k_setnam(name);
-    return cbm_k_save(start, end);
+    return _oserror = cbm_k_save(start, end);
 }
diff --git a/libsrc/cbm/cbm_write.c b/libsrc/cbm/cbm_write.c
new file mode 100644 (file)
index 0000000..b204b68
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Marc 'BlackJack' Rintsch, 25.03.2001
+ *
+ * int cbm_write(unsigned char lfn, void* buffer, unsigned int size);
+ */
+
+#include <cbm.h>
+
+extern unsigned char _oserror;
+
+int cbm_write(unsigned char lfn, void* buffer, unsigned int size) {
+
+    static unsigned int byteswritten;
+    
+    /* if we can't change to the outputchannel #lfn then return an error */
+    if (_oserror = cbm_k_ckout(lfn)) return -1;
+    
+    byteswritten = 0;
+    
+    while (byteswritten<size && !cbm_k_readst()) {
+        cbm_k_bsout(((unsigned char*)buffer)[byteswritten++]);
+    }
+
+    if (cbm_k_readst()) {
+        _oserror = 5; /* device not present */
+        byteswritten = -1;
+    }
+        
+    cbm_k_clrch();
+    
+    return byteswritten;
+}