changeset 101:15569aa4098e

micro c continue
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 27 Dec 2018 15:40:50 +0900
parents 990add11e9f8
children 09148bb27659
files os9/mc09/crtos9.asm os9/mc09/makefile os9/mc09/mc.c os9/mc09/mclibos9.c
diffstat 4 files changed, 187 insertions(+), 229 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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
--- 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--;)
--- 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()