# HG changeset patch # User Shinji KONO # Date 1545892850 -32400 # Node ID 15569aa4098e1ec97bdbf674b2787dc1efd6361c # Parent 990add11e9f8a4c9aff025e9f8e5c26dfb24b0f7 micro c continue diff -r 990add11e9f8 -r 15569aa4098e os9/mc09/crtos9.asm --- a/os9/mc09/crtos9.asm Thu Dec 27 11:49:54 2018 +0900 +++ b/os9/mc09/crtos9.asm Thu Dec 27 15:40:50 2018 +0900 @@ -3,192 +3,42 @@ * micro-C driver under FLEX * * 12-Dec-81 M.Ohta,H.Tezuka +* 12-Dec-2018 S.Kono * - ORG $100 - -_00000 - LDX $CC2B LOAD MEM END - LEAS 1,X - - JSR $CD24 CR/LF - - LEAS -256,S ALLOCATE WORK AREA - LEAU 128,S POINT TO CONTENT OF ARGUMENT VECTOR +* +* micro-C user program +* +* OPT LIST + INCLUDE "c.out" include compilers output +* OPT NOL - STU ,S - BSR _0C004 GET ARGV[0] - CLRA ARGC*2 -_0C000 ADDA #2 INCREMENT ARGC - STU A,S - PSHS A - BSR _0C009 GET NEXT ARGV - PULS A - CMPU #-1 - BNE _0C000 - STU A,S - - LEAU 128,S - TFR A,B -_0C001 LDX A,S - PSHU X - SUBA #2 - BNE _0C001 - LDX ,S - PSHU X - LEAS ,U - LSRB - CLRA - PSHS D,U push argc,argv - LEAY _99999,PCR clear globals +* x arguments pointer +* u global variable area +_start +_00000 + LEAS -256,S ALLOCATE WORK AREA + leay ,u + pshs d,x POINT TO CONTENT OF ARGUMENT VECTOR + PSHS Y + clear globals on Y LDX #_GLOBALS _0C002 BEQ _0C003 CLR ,Y+ LEAX -1,X BRA _0C002 -_0C003 LEAY _99999,PCR +_0C003 PULS Y LBSR _INITIALIZE call initializer LBSR _main -exit JSR $D403 FMS close - JMP $CD03 WARMS - -_0C004 LDX $CC14 -_0C005 CMPX #$C080 - BEQ _0C007 - LDB ,-X - CMPB #$0D - BEQ _0C006 - CMPB $CC02 - BNE _0C005 -_0C006 LEAX 1,X -_0C007 LDB ,X+ - CMPB #' - BEQ _0C008 - STB ,U+ - CMPX #$CC02 - BLO _0C007 -_0C008 CLR ,U+ - RTS +exit clrb + os9 F$Exit -_0C009 JSR $CD27 - CMPA #' - BEQ _0C009 - CMPA #$0D - BEQ _0C013 - CMPA $CC02 - BEQ _0C013 -_0C010 CMPA #'" - BEQ _0C014 - CMPA #'' - BEQ _0C014 - CMPA #' - BEQ _0C012 - CMPA #$0D - BEQ _0C012 - CMPA $CC02 - BEQ _0C012 - STA ,U+ -_0C011 JSR $CD27 - BRA _0C010 - -_0C012 CLR ,U+ - RTS - -_0C013 LDU #-1 - RTS - -_0C014 PSHS A - LDX $CC14 -_0C015 - LDA ,X+ - CMPA #$0D - BEQ _0C016 - CMPA ,S - BEQ _0C017 - STA ,U+ - BRA _0C015 - -_0C016 LEAX -1,X -_0C017 STX $CC14 - PULS A - BRA _0C011 * * run time support * -FMS LDX 2,S - LDA 5,S - STA ,X - LDA 7,S - TST 59,X - BMI _FMS1 - CMPA #$0A - BNE _FMS0 - LDA #$0D -_FMS0 CMPA #$09 - BNE _FMS1 - LDA #$20 -_FMS1 JSR $D406 - BNE _FMSERR - TFR A,B - TST 59,X - BMI _FMS9 - CMPB #$0D - BNE _FMS8 - LDB #$0A -_FMS8 CMPB #$09 - BNE _FMS9 - LDB #$20 -_FMS9 CLRA - RTS - -_FMSERR LDD #-1 - RTS - -GETCH PSHS X,Y,U - JSR $CD15 get character - TFR A,B - ANDB #$7F - CMPB #26 control-Z ? - BNE _0G001 - LDD #-1 - PULS X,Y,U,PC - -_0G001 CMPB #$0D - BNE _0G002 - LDB #$0A -_0G002 CLRA - PULS X,Y,U,PC -* -PUTCH LDD 2,S - PSHS D,X,Y,U - TFR B,A - CMPA #$09 - BNE _0P001 - LDA #$20 -_0P001 CMPA #$0A - BNE _0P002 - JSR $CD24 put CR/LF - PULS D,X,Y,U,PC - -_0P002 JSR $CD18 put character - PULS D,X,Y,U,PC -* -PUTCH2 LDD 2,S - PSHS D - LDA $CC22 - PSHS A - LDA #$FF - STA $CC22 - LDD 1,S - PSHS D - BSR PUTCH - LEAS 2,S - PULS A - STA $CC22 - PULS D,PC * _00001 PSHS D,X,Y multiply @@ -372,15 +222,7 @@ LEAS 2,S RTS * -* micro-C user program -* -* OPT LIST - INCLUDE "c.out" include compilers output -* OPT NOL * * * -_99999 EQU * global vars allocated here -* - END _00000 - +_eom diff -r 990add11e9f8 -r 15569aa4098e os9/mc09/makefile --- a/os9/mc09/makefile Thu Dec 27 11:49:54 2018 +0900 +++ b/os9/mc09/makefile Thu Dec 27 15:40:50 2018 +0900 @@ -9,7 +9,7 @@ AS09 = ../../src/a09 -all: mc2.o +all: mc2 mc: mc.c cc $(CFLAGS) mc.c -o mc @@ -17,8 +17,11 @@ c.out: mc mc2.c mclib.c ./mc mc2.c -mc2.o: c.out - $(AS09) c.txt -l c.lst -o mc2.o +mc2: c.out + $(AS09) crtos9.asm -l c.lst -o mc2 + +# mc2.o: c.out +# $(AS09) c.txt -l c.lst -o mc2.o lint: mc.c lint mc.c >lint diff -r 990add11e9f8 -r 15569aa4098e os9/mc09/mc.c --- a/os9/mc09/mc.c Thu Dec 27 11:49:54 2018 +0900 +++ b/os9/mc09/mc.c Thu Dec 27 15:40:50 2018 +0900 @@ -183,6 +183,7 @@ {NMTBL *nptr; int i; char *ccout; +char *modname = "aout"; if(argc==1) exit(1); lsrc = chk = asmf = 0; ccout = "c.out"; @@ -196,6 +197,9 @@ case 'O': case 'o': ccout = av[ac2]+2; break; + case 'M': case 'm': + modname = av[ac2]+2; + break; case 'C': case 'c': chk = 1; break; @@ -204,8 +208,13 @@ exit(1); } fclose(stdout); - if (!chk) + if (!chk) { if ( (obuf = fopen(ccout,"w")) == NULL ) error(FILERR); + else { + printf("\tmod _eom,_name,_tylg,_atrv,_main,_GLOBALS\n"); /* os9 module header */ + printf("_name fcs /%s/\n",modname); + } + } init(); while(1) { for (nptr = &ntable[GSYMS],i=LSYMS; i--;) diff -r 990add11e9f8 -r 15569aa4098e os9/mc09/mclibos9.c --- a/os9/mc09/mclibos9.c Thu Dec 27 11:49:54 2018 +0900 +++ b/os9/mc09/mclibos9.c Thu Dec 27 15:40:50 2018 +0900 @@ -1,5 +1,24 @@ -#define FILE char -#define FCBSIZE 320 +/* + * os9 driver + */ + +#asm + ifp1 + use defsfile + endc +#endasm + +typedef struct { + int fd; /* 0 */ + int mode; /* 2 */ + int len; /* 4 */ + char *name; /* 6 */ + unsigned char*ptr; /* 8 */ + unsigned char buf[256]; /* 10 */ + } FILE ; + +#define FCBSIZE (sizeof(FILE)) + #define NFILES 8 #define NULL 0 @@ -9,21 +28,55 @@ #define stdout _fcbtbl[1] #define stderr _fcbtbl[2] -#define STDIN 0xffff -#define STDOUT 0xfffe -#define STDERR 0xfffd - FILE *_fcbtbl[NFILES]; -_main(argc,argv) -int argc; -char **argv; +FILE _s0[3]; + +#define STDIN (&_s0[0]) +#define STDOUT (&_s0[1]) +#define STDERR (&_s0[2]) + +_main(args) +char *args; {int i; - stdin = STDIN; - stdout = STDOUT; - stderr = STDERR; + char **argv,*p; + int argc,n,quote,c; + stdin = STDIN; stdin->fd = 0; + stdout = STDOUT; stdout->fd = 1; + stderr = STDERR; stderr->fd = 2; initheap(); for ( i = 3; i < NFILES; i++ ) _fcbtbl[i] = NULL; + /* create argv here */ + argc = 0; + argv = 0; + n = 0; + quote = 0; + for( i = 0; i < 2 ; i++ ) { + if (i==1 && argc) { argv = (char**)malloc(sizeof(char*)*argc; } + p = args; + while((c = *p++)) { + if (i==1) argv[n] = args; + if (c=='\'') { + if (!quote) { + if (i==1) argv[n]++; + quote = 1; + continue; + } else { + if (i==1) p[-1]=0; + quote = 0; + } + } else if (c=='\\') { + p++; + continue; + } else if (c==' ') { + if (quote) + continue; + if (i==1) p[-1]=0; + } + n++; + } + p[-1]=0; + } main(argc,argv); } @@ -60,9 +113,30 @@ if ( i >= NFILES) return NULL; if ( (fcbp = malloc(FCBSIZE)) == NULL ) return NULL; if ( _setname(name,fcbp) == 0 ) return NULL; - if ( FMS(fcbp,1) < 0 ) return NULL; - fcbp[59] = cm ? 0 : 0xff; - fcbp[60] = 0; +#asm + pshs x,y,u + ldx -4,u + lda 2,x mode + ldb 3,x src attribute + leax 6,x name + os9 I$Open + bcc _LC0001 + ldx -4,u + clrb + std ,x + bra _LC0002 +_LC0001 + ldx -4,u + clra + stD 2,x err code + ldd #-1 + std ,x +_LC0002 + puls x,y,u +#endasm + if fcbp->fd < 0 ) return NULL; + fcbp->ptr = fcpp->buf; + fcbp->len = 0; return (_fcbtbl[i] = fcbp); } @@ -76,14 +150,30 @@ if ( i >= NFILES) return NULL; if ( (fcbp = malloc(FCBSIZE)) == NULL ) return NULL; if ( _setname(name,fcbp) == 0 ) return NULL; - if ( FMS(fcbp,2) < 0 ) - { if ( (fcbp[1] != 3) || (FMS(fcbp,12) < 0) ) return NULL; - _setname(name,fcbp); - if (FMS(fcbp,2) < 0) return NULL; - } - fcbp[15] = 0; - fcbp[59] = cm ? 0 : 0xff; - fcbp[60] = 0; +#asm + pshs x,y,u + ldx -4,u + lda 2,x mode + ldb 3,x src attribute + leax 6,x name + os9 F$Create + bcc _LC0001 + ldx -4,u + clrb + std ,x + bra _LC0002 +_LC0001 + ldx -4,u + clra + stD 2,x err code + ldd #-1 + std ,x +_LC0002 + puls x,y,u +#endasm + if fcbp->fd < 0 ) return NULL; + fcbp->ptr = fcpp->buf; + fcbp->len = 0; return (_fcbtbl[i] = fcbp); } @@ -95,7 +185,13 @@ if ( i >= NFILES ) return EOF; _fcbtbl[i] = NULL; if ( (fcbp == STDIN) || (fcbp == STDOUT) || (fcbp == STDERR) ) return 0; - if ( FMS(fcbp,4) < 0 ) return EOF; +#asm + pshs x,y,u + ldx -4,u + lda ,x + os9 I$Close + puls x,y,u +#endasm mfree(fcbp); return 0; } @@ -130,33 +226,41 @@ getc(fcbp) char *fcbp; { - switch (fcbp) - {case STDIN: - return GETCH(); - case STDOUT: - case STDERR: - return EOF; - default: - if (fcbp[2] != 1) return EOF; - return FMS(fcbp,0); - } + int c; +#asm + pshs x,y,u + ldd ,u c + PSHS A,B + ldx 2,u + lda 1,x file descriptor + leax 1,S + clr ,s + ldy #1 + os9 I$Read + bcc _LC0003 + ldd #-1 + std ,s +_LC0003 + puls d,x,y,u +#endasm } putc(c,fcbp) char c,*fcbp; -{ if ( c == '\t' ) c = ' '; - switch (fcbp) - {case STDIN: - return EOF; - case STDOUT: - return PUTCH(c); - case STDERR: - return PUTCH2(c); - default: - if (fcbp[2] != 2) return EOF; - if (FMS(fcbp,0,c) < 0) return EOF; - return c; - } +{ + int ret; +#asm + pshs x,y,u + ldd ,u c + PSHS A,B + ldx 2,u + lda 1,x file descriptor + leax 1,S + ldy #1 + os9 I$Write + puls d,x,y,u +#endasm + return c; } getchar()