# HG changeset patch # User Shinji KONO # Date 1532054899 -32400 # Node ID ec9f494497e1d08c6325c2768b16ecbfaa292c2d # Parent 07c84761da6f315033643a6862fbdcf84c46a343 vdisk fix diff -r 07c84761da6f -r ec9f494497e1 Makefile --- 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) $< diff -r 07c84761da6f -r ec9f494497e1 a09.c --- 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; diff -r 07c84761da6f -r ec9f494497e1 io.c --- 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 diff -r 07c84761da6f -r ec9f494497e1 os9/Makefile --- 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 diff -r 07c84761da6f -r ec9f494497e1 os9/level2/Makefile --- 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) diff -r 07c84761da6f -r ec9f494497e1 os9/level2/v0.asm --- /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 * diff -r 07c84761da6f -r ec9f494497e1 os9/level2/vrbf.asm --- 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 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; + }