diff src/v09.c @ 57:2088fd998865

sbc09 directry clean up
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 23 Jul 2018 16:07:12 +0900
parents v09.c@8d151f303bee
children 80f4ec9a3420
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/v09.c	Mon Jul 23 16:07:12 2018 +0900
@@ -0,0 +1,206 @@
+/* 6809 Simulator V09.
+
+   Copyright 1994, L.C. Benschop, Eidnhoven The Netherlands.
+   This version of the program is distributed under the terms and conditions
+   of the GNU General Public License version 2. See the file COPYING.
+   THERE IS NO WARRANTY ON THIS PROGRAM!!!
+   
+   This program simulates a 6809 processor.
+   
+   System dependencies: short must be 16 bits.
+                        char  must be 8 bits.
+                        long must be more than 16 bits.
+                        arrays up to 65536 bytes must be supported.
+                        machine must be twos complement.
+   Most Unix machines will work. For MSODS you need long pointers
+   and you may have to malloc() the mem array of 65536 bytes.
+                 
+   Define BIG_ENDIAN if you have a big-endian machine (680x0 etc)              
+   
+   Special instructions:                     
+   SWI2 writes char to stdout from register B.
+   SWI3 reads char from stdout to register B, sets carry at EOF.
+               (or when no key available when using term control).
+   SWI retains its normal function. 
+   CWAI and SYNC stop simulator.
+   
+*/
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <strings.h>
+#include <sys/stat.h>
+
+#define engine extern
+
+#include "v09.h"
+
+FILE *tracefile;
+
+extern FILE *disk[];
+extern FILE *fp;      // for disasm
+extern char *prog;    // for disasm
+extern void disasm(int,int);
+extern void do_mmu(Word,Byte);
+extern void init_term(void) ;
+
+
+void do_trace(FILE *tracefile)
+{
+ Word pc=pcreg;
+ Byte ir;
+ // fprintf(tracefile,"pc=%04x ",pc);
+ // ir=mem[pc++];
+ // fprintf(tracefile,"i=%02x ",ir); if((ir&0xfe)==0x10) fprintf(tracefile,"%02x ",mem[pc]);else 
+ // fprintf(tracefile,"   ");
+ fprintf(tracefile,"x=%04x y=%04x u=%04x s=%04x a=%02x b=%02x cc=%02x pc=",
+                   xreg,yreg,ureg,sreg,*areg,*breg,ccreg);
+ fp = tracefile;
+ disasm(pc,pc);
+} 
+
+char *romfile = "v09.rom";
+long romstart = 0x8000;
+
+long
+filesize(FILE *image)
+{
+    struct stat buf;
+    fstat(fileno(image),&buf);
+    return buf.st_size;
+}
+
+
+void 
+read_image()
+{
+ FILE *image;
+ if((image=fopen(romfile,"rb"))==NULL) 
+  if((image=fopen("../v09.rom","rb"))==NULL) 
+   if((image=fopen("..\\v09.rom","rb"))==NULL) {
+    perror("v09, image file");
+    exit(2);
+ }
+ long len = filesize(image);
+ /*
+  * 
+  *    0x0000-0xdfff    normal mem
+  *    0xxxxx-0xdfff    rom
+  *    0xe000-0xe100    i/o
+  *    0xe000-0xffff    rom
+  *
+  * discless boot
+  *    rom image will be copyied from 0xed00-0x1xxxx
+  *    boot copies 0x10000-0x1xxxx to os9's boot memory 
+  */
+#ifdef USE_MMU
+ /*
+  * In case of Coco, there is no ROM (switched out after boot )
+  *    0x00000-0x0fdff    normal mem
+  *    0x0fe00-0x0ffff    ram fixed address ram including io
+  *    0x10000-0x7ffff    ram (512Kb memory current implementation)
+  * it should have 2MB memory
+  *    0x10000-0xfffff    ram
+  *  >0x100000            lapround
+  *
+  * discless boot
+  *    rom image will be copyied from 0xed00-0x1xxxx
+  *    boot copies 0x10000-0x1xxxx to os9's boot memory 
+  */
+ phymem = malloc(memsize + len - 0x2000);
+ rommemsize = memsize + len - 0x2000;
+ mem    = phymem + memsize - 0x10000 ;
+ mmu = &mem[0xffa0];
+ prog = (char*)mem;
+ if (romstart==0x8000) {
+     // romstart = memsize - 0x10000 + 0xed00 ;
+     romstart = memsize ;  // full 512kb mem
+ }
+ fread(mem+ 0xe000,len,1,image);
+ mem[0xffa7] = 0x3f;
+#else
+ if (romstart==0x8000) {
+     romstart = 0x10000 - len; 
+ }
+ fread(mem+(romstart&0xffff),len,1,image);
+#endif
+ fclose(image);
+}
+
+void usage(void)
+{
+ fprintf(stderr,"Usage: v09 [-rom rom-image] [-l romstart] [-t tracefile [-tl addr] [-nt]"
+                "[-th addr] ]\n[-e escchar] \n");
+ exit(1); 
+}
+
+
+#define CHECKARG if(i==argc)usage();else i++;
+
+int
+main(int argc,char *argv[])
+{
+ char *imagename=0;
+ int i;
+ int setterm = 1;
+ timerirq = 2;   // use FIRQ default
+ memsize = 512*1024;
+ escchar='\x1d'; 
+ tracelo=0;tracehi=0xffff;
+ for(i=1;i<argc;i++) {
+    if (strcmp(argv[i],"-t")==0) {
+     i++;
+     if((tracefile=fopen(argv[i],"w"))==NULL) {
+         perror("v09, tracefile");
+         exit(2);
+     }
+     tracing=1;attention=1;    
+   } else if (strcmp(argv[i],"-rom")==0) {
+     i++;
+     timer = 0;         // non standard rom image, don't start timer
+     timerirq = 1 ;     // os9 cannot handle FIRQ
+     romfile = argv[i];
+
+   } else if (strcmp(argv[i],"-0")==0) {
+      i++;
+      disk[0] = fopen(argv[i],"r+");
+   } else if (strcmp(argv[i],"-1")==0) {
+      i++;
+      disk[1] = fopen(argv[i],"r+");
+   } else if (strcmp(argv[i],"-tl")==0) {
+     i++;
+     tracelo=strtol(argv[i],(char**)0,0);
+   } else if (strcmp(argv[i],"-th")==0) {
+     i++;
+     tracehi=strtol(argv[i],(char**)0,0);
+   } else if (strcmp(argv[i],"-e")==0) {
+     i++;
+     escchar=strtol(argv[i],(char**)0,0);
+   } else if (strcmp(argv[i],"-l")==0) {
+     i++;
+     romstart=strtol(argv[i],(char**)0,0);
+   } else if (strcmp(argv[i],"-nt")==0) {  // start debugger at the start
+     attention = escape = 1;
+     timer = 0;   // no timer
+   } else if (strcmp(argv[i],"-m")==0) {
+     i++;
+     memsize=strtol(argv[i],(char**)0,0) & ~0xffff;
+     if (memsize < 512*1024) memsize = 512*1024;
+   } else usage();
+ }   
+ #ifdef MSDOS
+ if((mem=farmalloc(65535))==0) { 
+   fprintf(stderr,"Not enough memory\n");
+   exit(2);
+ } 
+ #endif
+ read_image(); 
+ init_term();
+ if (setterm) set_term(escchar);
+ pcreg=(mem[0xfffe]<<8)+mem[0xffff]; 
+ prog = (char*)mem;  // for disasm
+ interpr();
+ return 0;
+}
+