# HG changeset patch # User Shinji KONO # Date 1546772231 -32400 # Node ID 36000611014be39b67216418498c88e874f1c22c # Parent 188111be26b4752cbdade384b40101501acce9cd micro-c buffering diff -r 188111be26b4 -r 36000611014b TL1/TL1os9.asm --- a/TL1/TL1os9.asm Sat Jan 05 22:10:20 2019 +0900 +++ b/TL1/TL1os9.asm Sun Jan 06 19:57:11 2019 +0900 @@ -348,7 +348,7 @@ FDB $33D7 FCB WT2 FDB $33D7 - FCB WT1 $9E,WT2 + FCB WT1,$9E,WT2 FDB $A700 CLR INDEX RTS @@ -402,7 +402,7 @@ LDA #$64 do LBSR CHECK BSR ASTOUT - LDD #$3402 pshs a + LDD #$3402 pshs a LBSR PUTAB CLR INDEX LBSR STAT @@ -867,10 +867,10 @@ OLOAD LDA LSW BEQ RTE LDA ACC - BEQ *+6 - LDA #$36 - BSR PUTA1 - LDA #$86 + BEQ OL1 + LDD #$3402 pshs a + LBSR PUTAB +OL1 LDA #$86 OCORD PSHS A CLRA STA LSW @@ -887,12 +887,12 @@ LBRA PUTAB * PUT 'TAB:PULS A' PUTPUL LBSR PUTHS - FCB 2 - FDB $1632 + FCB 4 + FCB $1f,$89,$35,2 tfr a,b ; puls a RTE1 RTS * PUT 'PULS B' -PUTPLB LDA #$33 - BRA PUTA1 +PUTPLB LDA #$3504 puls b + LBRA PUTAB ** * ADDING EXPRESSION ** @@ -1041,8 +1041,8 @@ OLP LBSR OLOAD LDB ACC BEQ RTS4 - LDA #$36 - LBSR PUTA + LDD #$3402 pshs a + LBSR PUTAB CLR ACC RTS4 RTS ** FUNCTION RND diff -r 188111be26b4 -r 36000611014b os9/mc09/crtos9.asm --- a/os9/mc09/crtos9.asm Sat Jan 05 22:10:20 2019 +0900 +++ b/os9/mc09/crtos9.asm Sun Jan 06 19:57:11 2019 +0900 @@ -41,7 +41,7 @@ bcc __0C005 ldd ,s subd #$1000 - blo exit can't get any memroy + lblo exit can't get any memroy std ,s bra __0C004 __0C005 @@ -76,7 +76,7 @@ std heapp,y LBSR _INITIALIZE call initializer LBSR _main -exit clrb +* exit clrb os9 F$Exit diff -r 188111be26b4 -r 36000611014b os9/mc09/makefile --- a/os9/mc09/makefile Sat Jan 05 22:10:20 2019 +0900 +++ b/os9/mc09/makefile Sun Jan 06 19:57:11 2019 +0900 @@ -35,7 +35,7 @@ mc2.c: patch fd = 0; - stdout = STDOUT; stdout->fd = 1; - stderr = STDERR; stderr->fd = 2; initheap(); + stdin = malloc(sizeof(FILE)*3); initfp(stdin,0); + stdout = (FILE*)(((char*)stdin)+sizeof(FILE)); initfp(stdout,1); + stderr = (FILE*)(((char*)stdout)+sizeof(FILE)); initfp(stderr,2); for ( i = 3; i < NFILES; i++ ) _fcbtbl[i] = NULL; /* create argv here */ argc = 0; @@ -82,7 +77,32 @@ argc = n; } argv[n]=0; - main(argc,argv); + exit(main(argc,argv)); +} + + +exit(e) +int e; +{ + int i; + for ( i = 3; i < NFILES; i++ ) { + if (_fcbtbl[i]) + fclose(_fcbtbl[i]); + } +#asm + ldb 3,u + os9 F$Exit +#endasm +} + +initfp(fp,d) +FILE *fp; +int fd; +{ + fp->fd = d; + fp->buf = (char*)malloc(BUFSIZ); + fp->ptr = fp->buf; + fp->fname = fp->length = fp->fmode = 0; } FILE *fopen(name,mode) @@ -122,7 +142,7 @@ pshs x,y,u ldx -2,u lda 7,u mode - ldx 6,x name + ldx 5,x name os9 I$Open bcs _LC0001 ldx -2,u @@ -140,9 +160,9 @@ _LC0002 puls x,y,u #endasm - if (fcbp->fd < 0 ) { errno = fcbp->fmode ; return NULL; } - /* fcbp->ptr = fcbp->buff; - fcbp->len = 0; */ + if (fcbp->fd < 0 ) { errno = fcbp->fmode ; *mfree(fcbp); return NULL; } + initfp(fcbp,i); + fcbp->fmode = cm; return (_fcbtbl[i] = fcbp); } @@ -161,7 +181,7 @@ ldx -2,u lda 7,u mode ldb #3 - ldx 6,x name + ldx 5,x name os9 I$Create bcs _LC0003 ldx -2,u @@ -179,9 +199,9 @@ _LC0004 puls x,y,u #endasm - if (fcbp->fd < 0 ) { errno = fcbp->fmode ; return NULL; } - /* fcbp->ptr = fcbp->buff; - fcbp->len = 0; */ + if (fcbp->fd < 0 ) { errno = fcbp->fmode ; mfree(fcbp); return NULL; } + initfp(fcbp,i); + fcbp->fmode = cm; return (_fcbtbl[i] = fcbp); } @@ -191,8 +211,9 @@ for ( i = 0; i < NFILES; i++ ) if ( fcbp == _fcbtbl[i] ) break; if ( i >= NFILES ) return EOF; - _fcbtbl[i] = NULL; - if ( (fcbp == STDIN) || (fcbp == STDOUT) || (fcbp == STDERR) ) return 0; + if ((fcbp->fmode&3) && fcbp->ptr!=fcbp->buf) { + fflush(fcbp); + } #asm pshs x,y,u ldx 4,u @@ -200,7 +221,9 @@ os9 I$Close puls x,y,u #endasm - mfree(fcbp); + _fcbtbl[i] = NULL; + if (fcbp->buf) mfree(fcbp->buf); + mfree(fcbp); return 0; } @@ -213,39 +236,69 @@ getc(fcbp) -char *fcbp; +FILE *fcbp; { - int c; + int len; + char *buff; + if (fcbp->buf) { + if (fcbp->ptr < fcbp->buf+fcbp->length) { + return (*fcbp->ptr++)&0xff; + } + len = BUFSIZ; fcbp->ptr = buff = fcbp->buf; + } else { + len = 1 ; fcbp->ptr = buff = &len; + } #asm pshs y - ldx 4,u + ldx 4,u FILE lda 1,x file descriptor - leax -1,u - clr -2,u - ldy #1 + ldx -4,u buf + ldy -2,u len os9 I$Read - bcc _LC0005 - ldd #-1 - std -2,u -_LC0005 + sty -2,u len puls y #endasm + if (len<=0) { fcbp->length=0; return -1; } + fcbp->length=len; + return (*fcbp->ptr++)&0xff; +} + +fflush(fcbp) +FILE *fcbp; +{ + int len; + char *buff; + if (fcbp->buf==0) + return; + len = fcbp->ptr - fcbp->buf; + if (len==0) return; + buff = fcbp->buf; +#asm + pshs y + ldx 4,u FILE + lda 1,x file descriptor + ldx -4,u + ldy -2,u + os9 I$Write + sty -2,u + puls y +#endasm + fcbp->ptr = fcbp->buf; } putc(c,fcbp) -char c,*fcbp; +char c; FILE *fcbp; { - int ret; -#asm - pshs y - ldx 6,u - lda 1,x file descriptor - leax 5,u - ldy #1 - os9 I$Write - puls y -#endasm - return c; + int len; + if (!fcbp->buf) { + fcbp->buf=&c; fcbp->ptr=fcbp->buf+1; + fflush(fcbp); + fcbp->buf = 0; + return; + } else if (fcbp->ptr >= fcbp->buf+BUFSIZ) { + fflush(fcbp); + } + *fcbp->ptr++ = c; } getchar() diff -r 188111be26b4 -r 36000611014b os9/mc09/test/cp.c --- a/os9/mc09/test/cp.c Sat Jan 05 22:10:20 2019 +0900 +++ b/os9/mc09/test/cp.c Sun Jan 06 19:57:11 2019 +0900 @@ -8,12 +8,13 @@ int c; int i; - input = STDIN; - output = STDOUT; + input = stdin; + output = stdout; i = 1; if (argv[i]) { input = fopen(argv[i++],"r"); } if (argv[i]) { output = fopen(argv[i++],"w"); } + if (input==0 || output==0) return 0; while( (c = getc(input) ) != -1) { putc(c,output); }