diff --git a/include/fileio.h02 b/include/fileio.h02 index 551d5b4..66d73af 100644 --- a/include/fileio.h02 +++ b/include/fileio.h02 @@ -4,7 +4,7 @@ ***************************************/ #define DRIVES 0 //Number of Disk Drives -const char drive[]; //Disk Drives +const char drive[]; #define DISKS 0 //Number of Drives in Disk const char disk[]; diff --git a/include/filesys.a02 b/include/filesys.a02 index e76d44f..ccb595d 100644 --- a/include/filesys.a02 +++ b/include/filesys.a02 @@ -33,11 +33,3 @@ CHDRV: LDA #$FF ;Return Result - Failure ;Returns: A = Drive# | Disk# (0=Failure) ; Y = Error Code (0 = None) GETDRV: ;Return Error - Not Implemented (Fall Through) - -;drvnam(drv) - Get Drive Name -;Args: A = Drive Number -;Returns: A = Drive Name (0=Failure) -; Y = Error (0=None) -DRVNAM: LDA #$00 ;Return Result (None) - LDY #$FF ;and Error - Not Implemented - RTS \ No newline at end of file diff --git a/include/filesys.h02 b/include/filesys.h02 index cbc71ba..069a923 100644 --- a/include/filesys.h02 +++ b/include/filesys.h02 @@ -9,14 +9,6 @@ * 255 = Not Implemented */ char chdrv(); -/* Drive Name * - * Args: char d - Drive ID | Disk # * - * Returns: char n - Drive Name * - * 0 = Invalid Device * - * char e - Error, 0=None * - * 255 = Not Implemented */ -char drvnam(); - /* Get Drive * * Returns: char d - Current Drive/Disk * * 0 = None or Error * diff --git a/include/run6502/direct.a02 b/include/run6502/direct.a02 index bdf530f..ba44c71 100644 --- a/include/run6502/direct.a02 +++ b/include/run6502/direct.a02 @@ -1,15 +1,15 @@ ; C02 Module direct Assembly Language Routines for run6502 emulator ; This is the reference implementation of the direct module -; Requires external function FSCMD and FSVDRV (fileio.h02) +; Requires external function FSCMD and FSDRVN (fileio.h02) SUBROUTINE DIRECT ;getcwd(drv, &dir) - Get Current Directory ;Args: A = Drive Identifier ; Y,X = Pointer to String -;Returns: A = Result (0 = Succes, $FF = Failure) +;Returns: A = Result (0 = Success, $FF = Failure) ; Y = Error Code (0 = None) -GETCWD: JSR FSVDRV ;Validate Drive Number +GETCWD: JSR FSDRVN ;Convert Drive Letter to Drive Number BCS .DRVERR ;If Invalid Return Error LDA #'T' ;Set Command to GETCWD .FSCMDX JSR FSCMD ;Execute Command @@ -21,7 +21,7 @@ GETCWD: JSR FSVDRV ;Validate Drive Number ; Y,X = Pointer to String ;Returns: A = Result (0 = Succes, $FF = Failure) ; Y = Error Code (0 = None) -CHDIR: JSR FSVDRV ;Validate Drive Number +CHDIR: JSR FSDRVN ;Convert Drive Letter to Drive Number BCS .DRVERR ;If Invalid Return Error LDA #'U' ;Set Command to GETCWD BNE .FSCMDX ;Execute Command and Return Result @@ -39,7 +39,7 @@ RMDIR: SEC ;Set Mode to RMDIR ;Returns: A = Error Code (0 = None) MKDIR: CLC ;Set Mode to MKDIR .MRDIR PHP ;Save Status Register - JSR FSVDRV ;Validate Drive Number + JSR FSDRVN ;Convert Drive Letter to Drive Number BCS .DRVERR ;If Invalid Return Error PLP ;Restore Status Register LDA #'X' ;Set Command to MKRMDIR diff --git a/include/run6502/dirent.a02 b/include/run6502/dirent.a02 index 685734b..27e10fc 100644 --- a/include/run6502/dirent.a02 +++ b/include/run6502/dirent.a02 @@ -1,6 +1,6 @@ ; C02 Module dirent Assembly Language Eoutines for run6502 emulator ; This is the reference implementation of the dirent module -; Requires external functions FSADDR, FSCMD, and FSVDRV (fileio.h02) +; Requires external functions FSADDR, FSCMD, and FSDRVN (fileio.h02) SUBROUTINE DIRENT @@ -9,7 +9,7 @@ ; Y,X = Pointer to Directory Name ;Returns: A = File Pointer (0 = Not Opened) ; Y = Error Code (0 = None) -OPNDIR: JSR FSVDRV ;Validate Drive Number +OPNDIR: JSR FSDRVN ;Convert Drive Letter to Drive Number BCS .OPNERR ;If Invalid Return Error LDA #'D' ;Set Command to OPENDIR .FSCMDX JSR FSCMD ;Execute Command diff --git a/include/run6502/fileio.a02 b/include/run6502/fileio.a02 index 46a56a2..351e00c 100644 --- a/include/run6502/fileio.a02 +++ b/include/run6502/fileio.a02 @@ -10,7 +10,7 @@ SUBROUTINE FILEIO DRIVES EQU 26 ;Number of Disk Drives -DRIVE BYTE 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26 +DRIVE BYTE "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ;Disk Drive Letters DISKS EQU 1 ;Number of Disks in Drive DISK BYTE 0 @@ -37,14 +37,15 @@ FFLUSH: TAY ;Set Channel Number ; Y,X = Pointer to File Name ;Returns: A = File Channel (0=File Not Opened) ; Y = Error (0=None) -FOPEN: JSR FSVDRV ;Validate Drive Number - BCS .DRVERR - JSR FSNAME ;Set Filename - TAY ;and Pass in Y +FOPEN: JSR FSNAME ;Set Filename + TAX ;Pass Mode to X + JSR FSDRVN ;Convert Drive Letter to Drive Number + BCS .RETURN ;If Error, Return Carry Set + TAY ;Pass Drive Number in Y LDA #'O' ;Set Command to OPEN .FEXECX JSR FSCMD ;Execute Command TXA ;Return Channel in A -.DRVERR RTS + RTS ;fclose(chan) - Close File ;Args: A = Channel Number @@ -164,21 +165,25 @@ FERROR: JSR FSADDR ;Set Buffer Address ;File System Commands -;Check fot Valid Drive Number -;Args: A = Drive Number -;Returns: A = Index into Drives +;Convert Drive Letter Into Drive Number +;Drive letters A-Z in DOS map to drive numbers 1-26 +;A drice specifier of NULL - SPACE or @ maps to drive 0, which +;means the current drive in the run6502 File Command Processor. +;Args: A = Drive Letter +;Returns: A = Drive Number ; Carry Clear = Valid Drive Number ; Carry Set = Invalid Drive Number -FSVDRV: PHA - AND #$1F ;Isolate Drive Number - CMP #DRIVES+2 ;Compare against Number of Drives - PLA - BCS .FSVERR - RTS - -.FSVERR LDA #$FF ;Return Operation Failed - LDY #1 ;Error - Invalid Argument - RTS +FSDRVN: SEC + SBC #' ' ;If Drive Specifier + BCS .FSDRVL ;is NULL through SPACE + LDA #0 ; Return Drive Number 0 + RTS ; and Carry Clear +.FSDRVL AND #$1F ;Convert A-Z, a-z to 1-26 + CMP #DRIVES+2 ;If Drive Number is + BCC .RETURN ;greater than 26 + LDA #$FF ; Return Operation Failed + LDY #1 ; and Error - Invalid Argument +.RETURN RTS ;fsinit() - Initialize File System FSINIT: LDA #'I' ;Set Command to INITFS diff --git a/include/run6502/filesys.a02 b/include/run6502/filesys.a02 index 98302a6..b80e72b 100644 --- a/include/run6502/filesys.a02 +++ b/include/run6502/filesys.a02 @@ -1,6 +1,6 @@ ; C02 Module filesys Assembly Language Eoutines for run6502 emulator ; This is the reference implementation of the filesys module -; Requires external functions FSCMD and FSVDRV (fileio.h02) +; Requires external functions FSCMD and FSDRVN (fileio.h02) SUBROUTINE FILESYS @@ -9,11 +9,11 @@ ;Args: A = Drive Identifier ; Y,X = Address of Directory Name String ;Returns: A = Error Code (0 = None) -REMOVE: JSR FSVDRV ;Validate Drive Number - BCS .DRVERR ;If Invalid Return Error - LDA #'K' ;Set Command to KILL (REMOVE) -.FSCMDX JSR FSCMD ;Execute Command - TXA ;Return Result +REMOVE: JSR FSDRVN ;Validate Drive Number + BCS .RETURN ;If Invalid Return Error + LDA #'K' ;Set Command to KILL (REMOVE) +.FSCMDX JSR FSCMD ;Execute Command + TXA ;Return Result RTS ;rename(drv, &filnam) - Rename File to filnam @@ -21,10 +21,10 @@ REMOVE: JSR FSVDRV ;Validate Drive Number ;Args: A = Drive Identifier ; Y,X = Address of Directory Name String ;Returns: A = Error Code (0 = None) -RENAME: JSR FSVDRV ;Validate Drive Number - BCS .DRVERR ;If Invalid Return Error - LDA #'M' ;Set Command to KILL (REMOVE) - BNE .FSCMDX ;Execute Command and Return Result +RENAME: JSR FSDRVN ;Convert Drive Letter to Drive Number + BCS .RETURN ;If Invalid Return Error + LDA #'M' ;Set Command to KILL (REMOVE) + BNE .FSCMDX ;Execute Command and Return Result ;inidrv(drv) - Initialize Disk Drive ;Args: A = Drive Identifier @@ -36,25 +36,19 @@ INIDRV: LDA #$FF ;Return Error - Not Implemented ;Args: A = Drive# | Disk# ;Returns: A = Result (0 - Success) ; Y = Error Code (0 = None) -CHDRV: JSR FSVDRV ;Validate Drive Number - BCS .DRVERR ;If Invalid Return Error +CHDRV: JSR FSDRVN ;Validate Drive Number + BCS .RETURN ;If Invalid Return Error TAY ;Set Drive Number SEC ;Set Mode to Change - BCS .GETDRV ;Execute DRIVE Command and Return Result - + LDA #'V' ;Set Command to DRIVE + BNE .FSCMDX ;Execute Command and Return Result + ;getdrv() - Get Current Drive/Disk ;Returns: A = Drive# | Disk# (0=Failure) ; Y = Error Code (0 = None) GETDRV: CLC ;Set Mode to Get -.GETDRV LDA #'V' ;Set Command to DRIVE - BNE .FSCMDX ;Execute and Return Result - -;drvnam(drv) - Get Drive Name -;Args: A = Drive Number -;Returns: A = Drive Name (0=Failure) -; Y = Error (0=None) -DRVNAM: JSR FSVDRV ;Validate Drive Number - BCS .DRVERR ;If Valid - LDY #0 ; Set Error to None - ADC #'@' ; Return Drive Letter -.DRVERR RTS + LDA #'V' ;Set Command to DRIVE + JSR FSCMD ;Execute Command + TXA ;Copy Drive Number to A + ADC #'@' ; Convert to Drive Letter +.RETURN RTS diff --git a/include/run6502/filesys.h02 b/include/run6502/filesys.h02 index 2b23792..f823be1 100644 --- a/include/run6502/filesys.h02 +++ b/include/run6502/filesys.h02 @@ -8,13 +8,6 @@ * char e - Error, 0=None */ char chdrv(); -/* Drive Name * - * Args: char d - Drive ID | Disk # * - * Returns: char n - Drive Name * - * 0 = Invalid Device * - * char e - Error, 0=None */ -char drvnam(); - /* Get Drive * * Returns: char d - Current Drive/Disk * * 0 = None or Error * diff --git a/test/_files.txt b/test/_files.txt index 56dcf95..ccda8f5 100644 --- a/test/_files.txt +++ b/test/_files.txt @@ -13,11 +13,16 @@ Auxillary Files - Used by Batch Files s2boot.dsk Apple 2 Bootable Disk Image - Used by A2.BAT xvic.ini VICE Configuration - Used bu V8K.BAT -C02 Test & Demonstration Files +C02 Test & Demonstration Programs + System Specific Header Test Progroams echo.c02 Echo typed keys to screen echohex.c02 Display ASCII code of typed keys in Hexadecimal + System Library Module Test Programs + testsd.c02 Test module "stddef" functions + testsl.c02 Test module "stdlib" functions + conds.c02 Test C02 Conditional Expressions funcs.c02 Test C02 Function Calls and Parameter Passing loops.c02 Test C02 Loop Structures @@ -25,7 +30,9 @@ C02 Test & Demonstration Files forforpf.c02 Demo of printf function from "stringx" module strings.c02 Demo of standard library "string" module - testhdr.c02 Test system specific Header file functions - testsd.c02 Test module "stddef" functions - testsl.c02 Test module "stdlib" functions testiox.c02 Test module "stdiox" functions + + filetest.c02 Test module "fileio" functions + fstest.c02 Test module "filesys" functions + diskdir.c02 Test module "dirent" functions + dirtest.c02 Test module "direct" functions diff --git a/test/dirtest.c02 b/test/dirtest.c02 index 68fcdcc..dcd7cc8 100644 --- a/test/dirtest.c02 +++ b/test/dirtest.c02 @@ -24,7 +24,7 @@ main: goto exit; void prtcwd() { - puts("GETCWD: "); + puts("GETCWD(0)="); n, err = getcwd(0, &s); if (err) goto error; putln(&s); diff --git a/test/fstest.c02 b/test/fstest.c02 index 3cea21b..3c4ac6c 100644 --- a/test/fstest.c02 +++ b/test/fstest.c02 @@ -13,7 +13,6 @@ #include #include - const char dir = "TEMPDIR"; const char oldnam = "OLDFILE.TMP"; const char newnam = "NEWFILE.TMP"; @@ -27,51 +26,51 @@ main: delfil(); prtdrv(); chgdrv(); - goto exit; +goto exit; -void chkerr() { +void chkerr(aa) { puts(": "); if (err) { e = ferror(0, &m); printf(e, "ERROR %d - "); putln(&m); } - else if (r) putln("FAILED"); + else if (aa) putln("FAILED"); else putln("SUCCESS"); } void prtdrv() { - d, err = getdrv(); printf(d,"GETDRV: %d "); chkerr(); - printf(drvnam(d), "DRVNAM: '%c'"); chkerr(); + d, err = getdrv(); + printf(d,"GETDRV()='%c'"); + chkerr(0); } void newfil() { puts("CREATING FILE "); puts(oldnam); - f, err = fopen(#MWRITE, oldnam); chkerr(); - puts("WRITING TO FILE "); - n, err = fputln(f, "FILE CONTENTS"); chkerr(); - puts("CLOSING FILE "); - err = fclose(f); chkerr(); + f, err = fopen(#MWRITE, oldnam); chkerr(0); + puts("WRITING TO FILE"); + n, err = fputln(f, "FILE CONTENTS"); chkerr(0); + puts("CLOSING FILE"); + err = fclose(f); chkerr(0); } void renfil() { puts("RENAMING "); puts(oldnam); puts(" TO "); puts(newnam); fsname(oldnam); - r, err = rename(newnam); chkerr(); + r, err = rename(newnam); chkerr(r); } void delfil() { puts("REMOVING "); puts(newnam); - r, err = remove(newnam); chkerr(); + r, err = remove(newnam); chkerr(r); } void chgdrv() { for (i=0; i<#DRIVES; i++) { d = drive[i]; - printf(d, "CHDRV(%d) "); - printf(drvnam(d), "'%c'"); - r, err = chdrv(d); chkerr(); + printf(d, "CHDRV('%c') "); + r, err = chdrv(d); chkerr(r); } }