changeset 46:ec9f494497e1

vdisk fix
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 20 Jul 2018 11:48:19 +0900
parents 07c84761da6f
children 15f1e1b49928
files Makefile a09.c io.c os9/Makefile os9/level2/Makefile os9/level2/v0.asm os9/level2/vrbf.asm vdisk.c
diffstat 8 files changed, 231 insertions(+), 112 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile	Thu Jul 19 16:21:47 2018 +0900
+++ b/Makefile	Fri Jul 20 11:48:19 2018 +0900
@@ -38,7 +38,7 @@
 
 # with Coco MMU 
 v09c: v09.c engine.c io.c d09.o trace.o
-	$(CC) -o v09c $(CFLAGS) $(V09FLAGS) -DIOPAGE=0xff80 -DUSE_MMU=1 v09.c engine.c io.c d09.o trace.c
+	$(CC) -o v09c $(CFLAGS) $(V09FLAGS) -DIOPAGE=0xff80 -DUSE_MMU=1 -DUSE_VDISK v09.c engine.c io.c d09.o trace.c vdisk.c
 
 a09.o : a09.c 
 	$(CC) -c $(CFLAGS) $(V09FLAGS) $< 
--- a/a09.c	Thu Jul 19 16:21:47 2018 +0900
+++ b/a09.c	Fri Jul 20 11:48:19 2018 +0900
@@ -71,25 +71,6 @@
      struct longer *next;
 } *lglist = 0;
 
-void makelonger(int gl) {
-    for(struct longer *p=lglist;p;p=p->next) {
-        if (p->gline==gl) { // already fixed
-            p->change = 1;
-            return;
-        }
-    }
-    struct longer *p = (struct longer *)calloc(sizeof(struct longer *),1);
-    p->gline=gl;
-    p->next = lglist;
-    lglist = p;
-}
-
-int longer() {
-    for(struct longer *p=lglist;p;p=p->next) {
-        if (p->change == 0) return 1;
-    }
-    return 0;
-}
 
 struct oprecord{char * name;
                 unsigned char cat;
@@ -351,6 +332,26 @@
                           label or constant, this is important when
                           generating relocatable object code. */
 
+void makelonger(int gl) {
+    if (pass==1) return;
+    for(struct longer *p=lglist;p;p=p->next) {
+        if (p->gline==gl) { // already fixed
+            p->change = 1;
+            return;
+        }
+    }
+    struct longer *p = (struct longer *)calloc(sizeof(struct longer *),1);
+    p->gline=gl;
+    p->next = lglist;
+    lglist = p;
+}
+
+int longer() {
+    for(struct longer *p=lglist;p;p=p->next) {
+        if (p->change == 0) return 1;
+    }
+    return 0;
+}
 void generate()
 {
     generating = 1;
--- a/io.c	Thu Jul 19 16:21:47 2018 +0900
+++ b/io.c	Fri Jul 20 11:48:19 2018 +0900
@@ -45,6 +45,9 @@
 /*
  *   IO Map ( can be overrupped by ROM )
  *
+ *   In do_input/do_output call, we cannot access 6809 registers, since it is in i*reg, 
+ *     which  is a local variable of interpr
+ *
  *   IOPAGE ~ IOPAGE+0x7f
  *       for OS9 level2
  *       IOPAGE 0xff80 means ioport beging 0xff80 but IOPAGE itself starts 0xff00
@@ -74,9 +77,9 @@
  *                                       0xd1- VDISK command
  *   IOPAGE + 0x41   drive no           / VDISK drv
  *   IOPAGE + 0x42   LSN2               / VDISK sysmode  0 for system, 1 for user 
- *   IOPAGE + 0x43   LSN1               / VDISK Curdir pd number
- *   IOPAGE + 0x44   LSN0               / VDISK file attribute
- *   IOPAGE + 0x45   ADR2
+ *   IOPAGE + 0x43   LSN1               / VDISK Curdir pd number (2 byte)
+ *   IOPAGE + 0x44   LSN0     
+ *   IOPAGE + 0x45   ADR2               / VDISK caller stack
  *   IOPAGE + 0x46   ADR1
  *
  *
@@ -104,6 +107,11 @@
 FILE *logfile;
 FILE *disk[] = {0,0};
 
+#ifdef USE_VDISK
+extern void do_vdisk(int c);
+#endif
+
+
 #ifdef USE_MMU
 extern char *prog ;   // for disass
 extern Byte * mem0(Byte *iphymem, Word adr, Byte *immu) ;
@@ -329,7 +337,7 @@
    } else if (c==0x55) {
       if (lseek(fileno(disk[drv]),lsn*SECSIZE,SEEK_SET)==-1) goto error;
       if (write(fileno(disk[drv]),phy,SECSIZE)==-1) goto error;
-#ifdef VDISK
+#ifdef USE_VDISK
    } else  {
        do_vdisk(c);
 #endif
--- a/os9/Makefile	Thu Jul 19 16:21:47 2018 +0900
+++ b/os9/Makefile	Fri Jul 20 11:48:19 2018 +0900
@@ -1,4 +1,4 @@
-all: os9mod makerom os9d.rom os9lv2.rom
+all: os9mod makerom os9d.rom os9lv2.rom os9v.rom
 
 CC=clang
 CFLAGS = -g
@@ -18,6 +18,8 @@
 os9lv2.rom : makerom level2/init
 	./makerom -o os9lv2.rom -2  level2/Shell  level2/dir level2/d1 level2/ioman  level2/os9p3_perr level2/os9p4_regdump  level2/pipe level2/piper level2/pipeman  level2/scf level2/rbf level2/os9p2 level2/sysgo level2/pdisk level2/d0 level2/pty level2/term level2/init level2/boot level2/os9p1 
 
+os9v.rom : makerom level2/init
+	./makerom -o os9v.rom -2  level2/Shell  level2/dir level2/d1 level2/ioman  level2/os9p3_perr level2/os9p4_regdump  level2/pipe level2/piper level2/pipeman  level2/v0 level2/vrbf level2/scf level2/rbf level2/os9p2 level2/sysgo level2/pdisk level2/d0 level2/pty level2/term level2/init level2/boot level2/os9p1 
 
 level1/init : nitros9-code
 	cd level1 ; make
--- a/os9/level2/Makefile	Thu Jul 19 16:21:47 2018 +0900
+++ b/os9/level2/Makefile	Fri Jul 20 11:48:19 2018 +0900
@@ -5,10 +5,12 @@
 
 A09 = ../../a09 -I $(OS9SRC)/defs/
 
-all : ioman pdisk init os9p1 os9p2 os9p3_perr os9p4_regdump pipe pipeman pipeman_named piper rbf scf term pty d0 d1 clock vector boot shell dir mdir sysgo
+ALL = ioman pdisk init os9p1 os9p2 os9p3_perr os9p4_regdump pipe pipeman pipeman_named piper rbf scf term pty d0 d1 clock vector boot shell dir mdir sysgo v0 vrbf
+
+all : $(ALL)
 
 clean : 
-	rm -rf ioman pdisk init os9p1 os9p2 os9p3_perr os9p4_regdump pipe pipeman pipeman_named piper rbf scf term pty d0 d1 clock vector boot shell dir mdir sysgo *.lst *.dSYM
+	rm -rf $(ALL) *.lst *.dSYM
 
 LST = -l $@.lst
 pdisk : 
@@ -35,6 +37,9 @@
 d1 : d1.asm
 	$(A09) d1.asm -o d1 $(LST)
 
+v0 : v0.asm
+	$(A09) $@.asm -o $@ $(LST)
+
 clock :  
 	$(A09) ../level1/clock.asm -o clock $(LST)
 
@@ -80,6 +85,9 @@
 rbf :
 	$(A09) ${SRCDIR}/rbf.asm -o rbf $(LST)
 
+vrbf : vrbf.asm
+	$(A09) vrbf.asm -o vrbf $(LST)
+
 scf :
 	$(A09) $(OS9SRC)/level1/modules/scf.asm  -o $@ $(LST)
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/os9/level2/v0.asm	Fri Jul 20 11:48:19 2018 +0900
@@ -0,0 +1,50 @@
+********************************************************************
+* progname - program module
+*
+* $Id: d0.asm,v 1.1 2002/06/14 12:35:43 roug Exp $
+*
+* Ed.    Comments                                       Who YY/MM/DD
+* ------------------------------------------------------------------
+*  -     Original Dragon Data distribution version
+*
+* $Log: d0.asm,v $
+* Revision 1.1  2002/06/14 12:35:43  roug
+* Add work done on ideal devices
+*
+*
+
+         nam   V0
+         ttl   40-track floppy disk device descriptor
+
+         ifp1
+         use   defsfile
+         endc
+tylg     set   Devic+Objct   
+atrv     set   ReEnt+rev
+rev      set   $02
+         mod   eom,name,tylg,atrv,mgrnam,drvnam
+         fcb   $FF mode byte
+         fcb   $00  extended controller address
+         fdb   $ffc0  physical controller address
+         fcb   initsize-*-1  initilization table size
+         fcb   $01 device type:0=scf,1=rbf,2=pipe,3=scf
+         fcb   $00 drive number
+         fcb   $00 step rate
+         fcb   $20 drive device type
+         fcb   $01 media density:0=single,1=double
+         fdb   $0100 number of cylinders (tracks)
+         fcb   $01 number of sides
+         fcb   $00 verify disk writes:0=on
+         fdb   $0012 # of sectors per track
+         fdb   $0012 # of sectors per track (track 0)
+         fcb   $01 sector interleave factor
+         fcb   $08 minimum size of sector allocation
+initsize equ   *
+name     equ   *
+         fcs   /V0/
+mgrnam   equ   *
+         fcs   /VRBF/
+drvnam   equ   *
+         fcs   /PDisk/
+         emod
+eom      equ   *
--- a/os9/level2/vrbf.asm	Thu Jul 19 16:21:47 2018 +0900
+++ b/os9/level2/vrbf.asm	Fri Jul 20 11:48:19 2018 +0900
@@ -1,6 +1,5 @@
-********************************************************************
-* Virtual RBF - Random Block File Manager
-*
+*******************************************************************2
+* Virtual RBF - Random Block File Manager * 
 
          nam   VRBF
          ttl   VRandom Block File Manager
@@ -38,8 +37,7 @@
 * Entry: Y = Path descriptor pointer
 *        U = Register stack pointer
 
-start    bra   Create
-         nop   
+start    lbra  Create
          lbra  Open
          lbra  MakDir
          lbra  ChgDir
@@ -53,6 +51,10 @@
          lbra  SetStat
          lbra  Close
 
+* 
+*            
+*
+
 
 *
 * I$Create Entry Point
@@ -67,35 +69,15 @@
 * Error: CC Carry set
 *        B = errcode
 *
-Create   pshs  y,u		Preserve path desc ptr
-         sta   PD.MOD,y
+Create   pshs  y,u,cc		Preserve path desc ptr
+         orcc  #IntMasks
          bsr   setuppd
          stb   4,u              put file attribute
-         ldb   #$d0
-         stb   ,u
+         ldb   #$d1
+         stb   ,u               do IO   b,x will be rewrited
          ldb   ,u
          beq   ok00
-err00    orcc  #$1
-ok00     pull  y,u,pc
-
-setuppd  pshs  x   
-         ldu   #$FFc0           vdisk port
-         lda   <PD.DRV,y
-         sta   1,u
-         ldx   <D.Proc          get process pointer
-         cmpx  <D.SysPrc
-         beq   sysmode
-         lda   #0
-sysmode  sta   2,u
-         lda   PD.MOD,y
-         bita  #EXEC.
-         bne   usechx
-         lda   P$DIO+5,x        get curwdir #pdnumber
-         bra   s1
-usechx   lda   P$DIO+11,x       get curxdir #pdnumber
-s1       sta   3,u
-         ldy   PD.PD,y          path number and mode
-         puls  x,pc
+         bra   er00
 
 *
 * I$Open Entry Point
@@ -109,15 +91,50 @@
 * Error: CC Carry set
 *        B = errcode
 *
-Open     pshs  y,u
-         sta   PD.MOD,y
+Open     pshs  y,u,cc
+         orcc  #IntMasks
          bsr   setuppd
-         ldb   #$d1
+         ldb   #$d2
          stb   ,u
          ldb   ,u
+         cmpb  #0
          beq   ok00
          bra   er00
 
+*        u    user stack
+*        y    path descriptor
+*         PD.PD.y     path number
+*         PD.PD.MOD.y mode
+*         PD.RGS,y    caller's rega  = u
+*         PD.DEV,y    device table
+*         PD.DRV,y    drive number
+
+setuppd  ldx   #$FFc0           vdisk port
+         stu   5,x              caller stack
+         lda   <PD.DRV,y
+         sta   1,x
+         clra
+         ldx   <D.Proc          get process pointer
+         cmpx  <D.SysPrc
+         beq   sysmode
+         lda   #1
+sysmode  sta   2,x
+         lda   R$A,u
+         bita  #EXEC.
+         bne   usechx
+         ldd   P$DIO+4,x        get curwdir #pdnumber
+         bra   s1
+usechx   ldd   P$DIO+10,x       get curxdir #pdnumber
+s1       
+         ldu   #$FFc0
+         std   3,u
+         rts
+
+er00     puls  y,u,cc
+         orcc  #Carry
+         rts
+ok00     puls  y,u,cc,pc
+
 *
 * I$MakDir Entry Point
 *
@@ -128,16 +145,16 @@
 * Error: CC Carry set
 *        B = errcode
 *
-MakDir   pshs  y,u
-         sta   PD.MOD,y
+MakDir   pshs  y,u,cc
+         orcc  #IntMasks
          bsr   setuppd
-         ldb   #$d2
+         ldb   #$d3
          stb   ,u
          ldb   ,u
+         cmpb  #0
          beq   ok00
          bra   er00
 
-
 *
 * I$Close Entry Point
 *
@@ -148,15 +165,16 @@
 * Error: CC Carry set
 *        B = errcode
 *
-Close    pshs  y,u
+Close    pshs  y,u,cc
+         orcc  #IntMasks
          bsr   setuppd
          ldb   #$db
          stb   ,u
          ldb   ,u
+         cmpb  #0
          beq   ok00
          bra   er00
 
-
 *
 * I$ChgDir Entry Point
 *
@@ -167,23 +185,26 @@
 * Error: CC Carry set
 *        B = errcode
 *
-ChgDir   pshs  y,u
+ChgDir   pshs  y,u,cc
+         orcc  #IntMasks
          bsr   setuppd
          ldb   #$d4
          stb   ,u
          ldb   ,u
-         bne   er00
-
+         ldu   PD.RGS,y
+         lda   R$A,u
          ldb   PD.MOD,y		get current file mode
          bitb  #UPDAT.		read or write mode?
          beq   CD30D		no, skip ahead
 * Change current data dir
+         clr   P$DIO+4,x
          sta   P$DIO+5,x
 CD30D    bitb  #EXEC.		is it execution dir?
-         beq   CD31C		no, skip ahead
+         beq   ok01		no, skip ahead
 * Change current execution directory
+         clr   P$DIO+10,x
          sta   P$DIO+11,x
-         bra   ok00
+         bra   ok01
 
 *
 * I$Delete Entry Point
@@ -196,13 +217,15 @@
 *        B = errcode
 *
 *
-Delete   pshs  y,u
-         bsr   setuppd
+Delete   pshs  y,u,cc
+         orcc  #IntMasks
+         lbsr   setuppd
          ldb   #$d5
          stb   ,u
          ldb   ,u
-         beq   ok00
-         bra   er00
+         cmpb  #0
+         beq   ok01
+         bra   er01
 
 *
 * I$Seek Entry Point
@@ -214,13 +237,15 @@
 * Error: CC Carry set
 *        B = errcode
 *
-Seek     pshs  y,u
-         bsr   setuppd
+Seek     pshs  y,u,cc
+         orcc  #IntMasks
+         lbsr   setuppd
          ldb   #$d6
          stb   ,u
          ldb   ,u
-         beq   ok00
-         bra   er00
+         cmpb  #0
+         beq   ok01
+         bra   er01
 
 *
 * I$ReadLn Entry Point
@@ -232,13 +257,14 @@
 * Error: CC Carry set
 *        B = errcode
 *
-ReadLn   pshs  y,u
-         bsr   setuppd
+ReadLn   pshs  y,u,cc
+         orcc  #IntMasks
+         lbsr   setuppd
          ldb   #$d7
          stb   ,u
          ldb   ,u
-         beq   ok00
-         bra   er00
+         beq   ok01
+         bra   er01
 
 *
 * I$Read Entry Point
@@ -250,15 +276,14 @@
 * Error: CC Carry set
 *        B = errcode
 *
-Read     pshs  y,u
-         bsr   setuppd
+Read     pshs  y,u,cc
+         orcc  #IntMasks
+         lbsr   setuppd
          ldb   #$d8
          stb   ,u
          ldb   ,u
-         beq   ok00
-         bra   er00
-         beq   Read4BB		no, allow it
-         bsr   Read4BC		do reading
+         beq   ok01
+         bra   er01
 
 
 *
@@ -271,13 +296,14 @@
 * Error: CC Carry set
 *        B = errcode
 *
-WriteLn  pshs  y,u
-         bsr   setuppd
+WriteLn  pshs  y,u,cc
+         orcc  #IntMasks
+         lbsr   setuppd
          ldb   #$d9
          stb   ,u
          ldb   ,u
-         beq   ok00
-         bra   er00
+         beq   ok01
+         bra   er01
 
 *
 * I$Write Entry Point
@@ -289,13 +315,17 @@
 * Error: CC Carry set
 *        B = errcode
 *
-Write    pshs  y,u
-         bsr   setuppd
+Write    pshs  y,u,cc
+         orcc  #IntMasks
+         lbsr   setuppd
          ldb   #$da
          stb   ,u
          ldb   ,u
-         beq   ok00
-         bra   er00
+         beq   ok01
+er01     puls  y,u,cc
+         orcc  #Carry
+         rts
+ok01     puls  y,u,cc,pc
 
 *
 * I$GetStat Entry Point
@@ -307,14 +337,15 @@
 * Error: CC Carry set
 *        B = errcode
 *
-GetStat  pshs  y,u
+GetStat  pshs  y,u,cc
+         orcc  #IntMasks
          ldb   R$B,u		get function code
-         bsr   setuppd
+         lbsr   setuppd
          ldb   #$dc
          stb   ,u
          ldb   ,u
-         beq   ok00
-         bra   er00
+         beq   ok01
+         bra   er01
 
 
 *
@@ -327,14 +358,15 @@
 * Error: CC Carry set
 *        B = errcode
 *
-SetStat  pshs  y,u
+SetStat  pshs  y,u,cc
+         orcc  #IntMasks
          ldb   R$B,u		get function code
-         bsr   setuppd
+         lbsr   setuppd
          ldb   #$dd
          stb   ,u
          ldb   ,u
-         beq   ok00
-         bra   er00
+         beq   ok01
+         bra   er01
 
 
          emod  
--- a/vdisk.c	Thu Jul 19 16:21:47 2018 +0900
+++ b/vdisk.c	Fri Jul 20 11:48:19 2018 +0900
@@ -20,10 +20,12 @@
 extern char *prog ;   // for disass
 extern Byte * mem0(Byte *iphymem, Word adr, Byte *immu) ;
 #define pmem(a)  mem0(phymem,a,mmu)
+#define smem(a)  mem0(phymem,a,&mem[0x20+IOPAGE])
 #define umem(a)  (mem[0x42+IOPAGE]?mem0(phymem,a,&mem[0x21+IOPAGE]):mem0(phymem,a,&mem[0x20+IOPAGE]))
 #else
 #define pmem(a)  (&mem[a])
 #define umem(a)  (&mem[a])
+#define smem(a)  (&mem[a])
 #endif
 
 #define MAXPDV 256
@@ -45,7 +47,7 @@
 
 #define MAXVDRV 4
 
-char drvRoot[] = { '.','.','.','.'};
+char *drvRoot[] = { ".",".",".","."};
 PathDesc pdv[MAXPDV];
 
 int setVdisk(int drv,char *name) {
@@ -83,11 +85,14 @@
 #define MAXPAHTLEN 256
 
 char *addCurdir(char *name, PathDesc *pd, PathDesc *curdir) {
-    int ns = strlen(name);
+    int ns =0 ;
+    if (name[0]=='/') {
+        while(*name++ =='/') ; // skip /d0
+        while(name[ns]!=0) ns++;
+    } else if (curdir==0 ) return 0; // no current directory
     int ps = ns;
-    if (curdir==0 && name[0]!='/') return 0; // no current directory
     char *base ; 
-    if (name[0]!='/') { base = curdir->name; ps += strlen(curdir->name)+1; }
+    if (name[0]!='/') { name++; base = curdir->name; ps += strlen(curdir->name)+1; }
     else { base = drvRoot[pd->drv]; ps += strlen(drvRoot[pd->drv])+1; }
     char *path = (char*)malloc(ps+1);
     int i = 0;
@@ -272,10 +277,15 @@
  */
 void do_vdisk(Byte cmd) {
     int err;
-    PathDesc *pd = pdv + yreg;
-    PathDesc *curdir = pdv+mem[0x43+IOPAGE];
+    Byte mode = yreg&0xff;
+    PathDesc *pd = pdv + ((yreg>>8)&0xff);
+    PathDesc *curdir = pdv+mem[0x44+IOPAGE];  // garbage until set
     pd->drv = mem[0x41+IOPAGE];
-    Byte mode,attr ;
+    Byte attr ;
+    Word u =  mem[0x45+IOPAGE];   // caller's stack in system segment
+    xreg = (*smem(u+4)<<8)+*smem(u+5);
+    *areg = *smem(u+1);
+    *breg = *smem(u+2);
     char *path,*next,*buf;
 
     switch(cmd) {
@@ -642,6 +652,8 @@
                  */
                     *breg = 0xff;
                     if (pd==0) break;
+                    yreg = (*smem(u+6)<<8)+*smem(u+7);
+                    ureg = (*smem(u+8)<<8)+*smem(u+9);
                     *breg  = fdinfo(pmem(xreg),yreg,xreg*0x10000+ureg,pd);
                     break;
                 default:
@@ -675,6 +687,12 @@
             }
             break;
     }
+    // return value
+    mem[0xffc0] = *breg;
+    *smem(u+2) = *breg ;
+    *smem(u+4) = (xreg & 0xff00) >> 8;
+    *smem(u+5) = xreg & 0xff;
+
 }