Mercurial > hg > Members > kono > os9 > sbc09
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; + }