annotate io.c @ 9:cb7aa75418b8

mmu and io
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 05 Jul 2018 16:00:19 +0900
parents a6db579d8c11
children 2a1338b218bf
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
1 /* 6808 Simulator V092
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
2 created 1993,1994 by L.C. Benschop. copyleft (c) 1994-2014
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
3 by the sbc09 team, see AUTHORS for more details. license:
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
4 GNU General Public License version 2, see LICENSE for more
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
5 details.
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 This program simulates a 6809 processor.
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 System dependencies: short must be 16 bits.
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 char must be 8 bits.
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 long must be more than 16 bits.
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 arrays up to 65536 bytes must be supported.
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 machine must be twos complement.
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 Most Unix machines will work. For MSODS you need long pointers
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 and you may have to malloc() the mem array of 65536 bytes.
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 Define BIG_ENDIAN if you have a big-endian machine (680x0 etc)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 Special instructions:
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 SWI2 writes char to stdout from register B.
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 SWI3 reads char from stdout to register B, sets carry at EOF.
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 (or when no key available when using term control).
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 SWI retains its normal function.
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 CWAI and SYNC stop simulator.
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 #include<stdio.h>
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 #include<stdlib.h>
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 #include<ctype.h>
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 #include<signal.h>
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 #include<sys/time.h>
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 #include <unistd.h>
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 #include <fcntl.h>
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 #include <string.h>
1
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
37 #include <time.h>
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 #ifdef USE_TERMIOS
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 #include <termios.h>
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 #endif
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 #define engine extern
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 #include "v09.h"
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45
1
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
46 /*
3
831ac057ea86 before mmu
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
47 * IO Map ( can be overrupped by ROM )
831ac057ea86 before mmu
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
48 *
7
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
49 * IOPAGE ~ IOPAGE+0x7f
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
50 * for OS9 level2
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
51 * IOPAGE 0xff80 means ioport beging 0xff80 but IOPAGE itself starts 0xff00
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
52 * 0xff00-0xff7f, 0xffe0-0xffff can be used as ROM in fixed area
1
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
53 *
3
831ac057ea86 before mmu
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
54 * IOPAGE + 0x00 ACIA control
831ac057ea86 before mmu
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
55 * IOPAGE + 0x01 ACIA data
1
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
56 *
7
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
57 * IOPAGE + 0x11 MMU Taskreg 0 system map, 1 user map
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
58 * IOPAGE + 0x20-0x27 MMU reg system map
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
59 * IOPAGE + 0x28-0x2f MMU reg user map
3
831ac057ea86 before mmu
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
60 *
831ac057ea86 before mmu
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
61 * on reset tr==0 and only IOPAGE is valid
831ac057ea86 before mmu
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
62 * translatation occur only on non-IOPAGE
831ac057ea86 before mmu
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
63 * mem == phymem + 0x70000
831ac057ea86 before mmu
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
64 * phy addr = phymem[ ( mmu[ adr >> 13 ] <<13 ) + (adr & 0x1fff ) ]
831ac057ea86 before mmu
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
65 * tr=0 mmu=IOPAGE+0xa0
831ac057ea86 before mmu
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
66 * tr=1 mmu=IOPAGE+0xa8
1
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
67 *
7
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
68 * IOPAGE + 0x30 Timer control 0x8f start timer/0x80 stop timer/0x04 update date
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
69 * IOPAGE + 0x31- YY/MM/DD/HH/MM/SS
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
70 *
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
71 * IOPAGE + 0x40 Disk control 0x81 read/0x55 write 0 ... ok / 0xff .. error
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
72 * IOPAGE + 0x41 drive no
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
73 * IOPAGE + 0x42 LSN2
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
74 * IOPAGE + 0x43 LSN1
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
75 * IOPAGE + 0x44 LSN0
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
76 * IOPAGE + 0x45 ADR2
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
77 * IOPAGE + 0x46 ADR1
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
78 *
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
79 *
1
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
80 */
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
81
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
82 #define SECSIZE 256
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
83
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 int tflags;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 int timer = 1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 struct termios termsetting;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 int xmstat; /* 0= no XMODEM transfer, 1=send, 2=receiver */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 unsigned char xmbuf[132];
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 int xidx;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 int acknak;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 int rcvdnak;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 int blocknum;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 FILE *logfile;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 FILE *infile;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 FILE *xfile;
1
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
98 FILE *disk[] = {0,0};
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
99
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 extern void hexadump( unsigned char *b, int l, int loc, int w);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 extern void disasm(int,int);
9
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
102 #ifdef USE_MMU
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
103 extern char *prog ; // for disass
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
104 extern Byte * mem1(Byte *iphymem, Word adr, Byte *immu) ;
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
105 #endif
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
106
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
107
1
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
108 void do_timer(int,int);
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
109 void do_disk(int,int);
4
6159cc57d44e on going ...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
110 void do_mmu(int,int);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
111
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 int char_input(void) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 int c, w, sum;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 if (!xmstat) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 if (infile) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 c = getc(infile);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 if (c == EOF) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 fclose(infile);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 infile = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 return char_input();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 if (c == '\n')
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
123 c = '\r';
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 return c;
2
31d96e2b364e add virtual hd option to v09
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
125 } else {
31d96e2b364e add virtual hd option to v09
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
126 usleep(100);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 return getchar();
2
31d96e2b364e add virtual hd option to v09
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
128 }
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
129 } else if (xmstat == 1) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 if (xidx) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
131 c = xmbuf[xidx++];
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
132 if (xidx == 132) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
133 xidx = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
134 rcvdnak = EOF;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 acknak = 6;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
137 } else {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
138 if ((acknak == 21 && rcvdnak == 21) || (acknak == 6 && rcvdnak == 6)) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 rcvdnak = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
140 memset(xmbuf, 0, 132);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
141 w = fread(xmbuf + 3, 1, 128, xfile);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 if (w) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 printf("Block %3d transmitted, ", blocknum);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 xmbuf[0] = 1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
145 xmbuf[1] = blocknum;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
146 xmbuf[2] = 255 - blocknum;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
147 blocknum = (blocknum + 1) & 255;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 sum = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
149 for (w = 3; w < 131; w++)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
150 sum = (sum + xmbuf[w]) & 255;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
151 xmbuf[131] = sum;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
152 acknak = 6;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
153 c = 1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 xidx = 1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 } else {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
156 printf("EOT transmitted, ");
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
157 acknak = 4;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
158 c = 4;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 } else if (rcvdnak == 21) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
161 rcvdnak = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
162 printf("Block %3d retransmitted, ", xmbuf[1]);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
163 c = xmbuf[xidx++]; /*retransmit the same block */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
164 } else
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
165 c = EOF;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
166 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
167 return c;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 } else {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
169 if (acknak == 4) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
170 c = 6;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
171 acknak = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 fclose(xfile);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
173 xfile = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 xmstat = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
175 } else if (acknak) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
176 c = acknak;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
177 acknak = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 } else
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
179 c = EOF;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
180 if (c == 6)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
181 printf("ACK\n");
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
182 if (c == 21)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
183 printf("NAK\n");
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
184 return c;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
185 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
186 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
187
9
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
188 int do_input(int a) {
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
189 static int c, f = EOF;
7
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
190 if (a == 0+(IOPAGE&0xff)) {
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
191 if (f == EOF)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
192 f = char_input();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
193 if (f != EOF)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 c = f;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 return 2 + (f != EOF);
7
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
196 } else if (a == 1+(IOPAGE&0xff)) { /*data port*/
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
197 if (f == EOF)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
198 f = char_input();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
199 if (f != EOF) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
200 c = f;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
201 f = EOF;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
202 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
203 return c;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
204 }
9
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
205 return mem[(IOPAGE&0xff00) + a];
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
206 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
207
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 void do_output(int a, int c) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
209 int i, sum;
7
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
210 if (a == 1+(IOPAGE&0xff)) { /* ACIA data port,ignore address */
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
211 if (!xmstat) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
212 if (logfile && c != 127 && (c >= ' ' || c == '\n'))
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
213 putc(c, logfile);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
214 putchar(c);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
215 fflush(stdout);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
216 } else if (xmstat == 1) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 rcvdnak = c;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
218 if (c == 6 && acknak == 4) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
219 fclose(xfile);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
220 xfile = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
221 xmstat = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
222 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
223 if (c == 6)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
224 printf("ACK\n");
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
225 if (c == 21)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
226 printf("NAK\n");
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
227 if (c == 24) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
228 printf("CAN\n");
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
229 fclose(xfile);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
230 xmstat = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
231 xfile = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
232 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
233 } else {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
234 if (xidx == 0 && c == 4) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
235 acknak = 4;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
236 printf("EOT received, ");
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
237 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
238 xmbuf[xidx++] = c;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
239 if (xidx == 132) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
240 sum = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
241 for (i = 3; i < 131; i++)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
242 sum = (sum + xmbuf[i]) & 255;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
243 if (xmbuf[0] == 1 && xmbuf[1] == 255 - xmbuf[2]
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
244 && sum == xmbuf[131])
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
245 acknak = 6;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
246 else
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
247 acknak = 21;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
248 printf("Block %3d received, ", xmbuf[1]);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
249 if (blocknum == xmbuf[1]) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
250 blocknum = (blocknum + 1) & 255;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
251 fwrite(xmbuf + 3, 1, 128, xfile);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
252 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
253 xidx = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
254 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
255 }
7
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
256 } else if (a >= 0x10+(IOPAGE&0xff)) { /* mmu */
4
6159cc57d44e on going ...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
257 do_mmu(a,c);
7
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
258 } else if (a >= 0x30+(IOPAGE&0xff)) { /* timer */
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
259 do_timer(a,c);
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
260 } else if (a >= 0x40+(IOPAGE&0xff)) { /* disk */
4
6159cc57d44e on going ...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
261 do_disk(a,c);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
262 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
263 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
264
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
265 void restore_term(void) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
266 tcsetattr(0, TCSAFLUSH, &termsetting);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
267 fcntl(0, F_SETFL, tflags);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
268 signal(SIGALRM, SIG_IGN);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
269 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
270
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
271 void do_exit(void) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
272 restore_term();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
273 exit(0);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
274 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
275
1
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
276 void do_timer(int a, int c) {
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
277 struct itimerval timercontrol;
9
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
278 if (a==0x30+(IOPAGE&0xff) && c==0x8f) {
1
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
279 timercontrol.it_interval.tv_sec = 0;
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
280 timercontrol.it_interval.tv_usec = 20000;
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
281 timercontrol.it_value.tv_sec = 0;
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
282 timercontrol.it_value.tv_usec = 20000;
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
283 setitimer(ITIMER_REAL, &timercontrol, NULL);
9
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
284 } else if (a==0x30+(IOPAGE&0xff) && c==0x80) {
1
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
285 timercontrol.it_interval.tv_sec = 0;
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
286 timercontrol.it_interval.tv_usec = 0;
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
287 setitimer(ITIMER_REAL, &timercontrol, NULL);
9
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
288 } else if (a==0x30+(IOPAGE&0xff) && c==0x04) {
1
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
289 time_t tm = time(0);
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
290 struct tm *t = localtime(&tm);
7
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
291 mem[IOPAGE+0x31] = t->tm_year;
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
292 mem[IOPAGE+0x32] = t->tm_mon;
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
293 mem[IOPAGE+0x33] = t->tm_mday;
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
294 mem[IOPAGE+0x34] = t->tm_hour;
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
295 mem[IOPAGE+0x35] = t->tm_min;
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
296 mem[IOPAGE+0x36] = t->tm_sec;
1
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
297 } else {
9
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
298 mem[(IOPAGE&0xff00)+a]=c;
1
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
299 }
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
300 }
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
301
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
302 void do_disk(int a, int c) {
9
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
303 if (a!=0x40+(IOPAGE&0xff)) {
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
304 mem[(IOPAGE&0xff00)+a]=c;
1
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
305 return;
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
306 }
7
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
307 int drv = mem[IOPAGE+0x41];
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
308 int lsn = (mem[IOPAGE+0x42]<<16) + (mem[IOPAGE+0x43]<<8) + mem[IOPAGE+0x44];
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
309 int buf = (mem[IOPAGE+0x45]<<8) + mem[IOPAGE+0x46];
1
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
310 if (drv > 1 || disk[drv]==0) goto error;
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
311 if (c==0x81) {
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
312 if (lseek(fileno(disk[drv]),lsn*SECSIZE,SEEK_SET)==-1) goto error;
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
313 if (read(fileno(disk[drv]),&mem[buf],SECSIZE)==-1) goto error;
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
314 } else if (c==0x55) {
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
315 if (lseek(fileno(disk[drv]),lsn*SECSIZE,SEEK_SET)==-1) goto error;
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
316 if (write(fileno(disk[drv]),&mem[buf],SECSIZE)==-1) goto error;
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
317 }
7
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
318 mem[IOPAGE+0x40] = 0;
1
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
319 return;
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
320 error :
7
a6db579d8c11 level 2 rom preparing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
321 mem[IOPAGE+0x40] = 0xff;
1
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
322 }
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
323
4
6159cc57d44e on going ...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
324 void do_mmu(int a, int c)
6159cc57d44e on going ...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
325 {
6159cc57d44e on going ...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
326 #ifdef USE_MMU
6159cc57d44e on going ...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
327
9
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
328 if (a==0x11+(IOPAGE&0xff)) {
4
6159cc57d44e on going ...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
329 if (c&0) {
6159cc57d44e on going ...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
330 mmu = phymem+memsize-0x10000+0xffa0;
6159cc57d44e on going ...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
331 } else {
6159cc57d44e on going ...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
332 mmu = phymem+memsize-0x10000+0xffa8;
6159cc57d44e on going ...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
333 }
9
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
334 mem[(IOPAGE&0xff00)+a] = c;
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
335 } if (0x20+(IOPAGE&0xff) <= a && a <= 0x2f+(IOPAGE&0xff)) {
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
336 mem[(IOPAGE&0xff00)+a] = c;
4
6159cc57d44e on going ...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
337 }
6159cc57d44e on going ...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
338
6159cc57d44e on going ...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
339 #endif
6159cc57d44e on going ...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
340 }
6159cc57d44e on going ...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
341
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
342 typedef struct bp {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
343 int address;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
344 int count;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
345 struct bp *next;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
346 } BP, *BPTR;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
347
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
348 BPTR breakpoint = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
349 int bpskip = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
350 int trskip = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
351 int stkskip = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
352
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
353 int getarg(char *buf, char** next) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
354 return strtol(buf,(char**)next,0);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
355 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
356
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
357 void printhelp(void)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
358 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
359 printf(
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
360 " s [count] one step trace\n"
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
361 " n step over\n"
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
362 " f finish this call (until stack pop)\n"
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
363 " b [adr] set break point\n"
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
364 " l break point list\n"
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
365 " d [n] delte break point list\n"
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
366 " c [count] continue;\n"
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
367 " x [adr] dump\n"
9
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
368 #ifdef USE_MMU
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
369 " xp [adr] dump physical memory\n"
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
370 #endif
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
371 " xi [adr] disassemble\n"
1
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
372 " 0 file disk drive 0 image\n"
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
373 " 1 file disk drive 1 image\n"
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
374 " L file start log to file\n"
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
375 " S file set input file\n"
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
376 " X exit\n"
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
377 " q exit\n"
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
378 " U file upload from srecord file \n"
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
379 " D file download to srecord file \n"
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
380 " R do reset\n"
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
381 " h,? print this\n"
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
382 );
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
383 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
384
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
385 void do_escape(void) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
386 char s[80];
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
387 int adr,skip;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
388 if (bpskip) { // skip unbreak instruction
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
389 bpskip--;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
390 for(BPTR b = breakpoint; b ; b=b->next) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
391 if (pcreg==b->address) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
392 if (b->count) b->count--;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
393 if (b->count==0) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
394 goto restart0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
395 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
396 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
397 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
398 return;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
399 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
400 if (stkskip) { // skip until return
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
401 if (sreg < stkskip ) return;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
402 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
403 restart0:
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
404 stkskip = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
405 restore_term();
9
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
406 #ifdef USE_MMU
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
407 Byte *phyadr = mem1(phymem,pcreg,mmu);
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
408 prog = (char*)phyadr - pcreg;
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
409 #endif
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
410 do_trace(stdout);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
411 if (trskip>1) { // show trace and step
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
412 trskip--;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
413 set_term(escchar);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
414 return;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
415 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
416 restart:
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
417 printf("v09>");
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
418 fgets(s, 80, stdin);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
419 if (s[0])
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
420 s[strlen(s) - 1] = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
421 switch (s[0]) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
422 case 's': // one step trace
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
423 trskip = 1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
424 if (s[1]) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
425 trskip = getarg(s+1,0);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
426 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
427 bpskip = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
428 attention = escape = 1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
429 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
430 case 'n': // step over
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
431 stkskip = sreg;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
432 attention = escape = 1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
433 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
434 case 'f': // finish this call (until stack pop)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
435 stkskip = sreg + 2;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
436 attention = escape = 1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
437 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
438 case 'b': // set break point
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
439 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
440 BPTR bp = calloc(1,sizeof(BP));
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
441 bp->next = breakpoint;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
442 breakpoint = bp;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
443 bp->count = 1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
444 if (s[1]) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
445 char *next;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
446 bp->address = getarg(s+1,&next);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
447 if (next[0]) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
448 bp->count = getarg(next,&next);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
449 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
450 } else {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
451 bp->address = pcreg;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
452 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
453 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
454 bpskip = -1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
455 goto restart;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
456 case 'l': // break point list
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
457 for(BPTR bp = breakpoint; bp ; bp = bp->next) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
458 printf("%x %i\n", bp->address, bp->count);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
459 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
460 goto restart;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
461 case 'd': // delte break point list
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
462 if (s[1]) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
463 int trskip = getarg(s+1,0);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
464 BPTR *prev = &breakpoint;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
465 for(BPTR bp = breakpoint; bp ; bp = bp->next) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
466 if (trskip-- == 0) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
467 if (bp) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
468 *prev = bp->next;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
469 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
470 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
471 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
472 prev = &bp->next;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
473 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
474 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
475 goto restart;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
476 case 'c': // continue;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
477 bpskip = -1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
478 attention = escape = 1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
479 if (s[1]) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
480 bpskip = getarg(s+1,0);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
481 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
482 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
483 case 'x': // dump
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
484 skip = 1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
485 if (s[1]=='i') skip=2;
9
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
486 if (s[1]=='p') skip=2;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
487 if (s[skip]) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
488 char *next;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
489 int adr = getarg(s+skip,&next);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
490 int len = 32;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
491 if (next[0]) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
492 len = getarg(next,&next);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
493 }
9
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
494 if (skip==2 && s[1]=='i') {
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
495 for(int i=0; len > 0 ; i+=16, len-=16) {
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
496 #ifdef USE_MMU
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
497 Byte *phyadr = mem1(phymem,adr+i,mmu);
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
498 prog = (char*)phyadr - adr;
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
499 #endif
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
500 disasm(adr,adr+((i>len)?len:i));
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
501 }
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
502 } else {
9
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
503 #ifdef USE_MMU
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
504 for(int i=0; len > 0 ; i+=16, len-=16) {
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
505 if (skip==2 && s[1]=='p') {
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
506 if (adr+i > memsize) goto restart;
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
507 hexadump(phymem+adr+i,len>16?16:len,adr+i,16);
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
508 } else {
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
509 Byte *phyadr = mem1(phymem,adr+i,mmu);
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
510 if (phyadr > phymem+memsize) goto restart;
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
511 hexadump(phyadr,len>16?16:len,adr+i,16);
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
512 }
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
513 }
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
514 #else
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
515 for(int i=0; len > 0 ; i+=16, len-=16) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
516 hexadump(mem+adr+i,len>16?16:len,adr+i,16);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
517 }
9
cb7aa75418b8 mmu and io
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
518 #endif
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
519 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
520 } else
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
521 disasm(pcreg,pcreg+32);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
522 goto restart;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
523 case 'L':
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
524 if (logfile)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
525 fclose(logfile);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
526 logfile = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
527 if (s[1]) {
1
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
528 int i=1; while(s[i]==' ') i++;
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
529 logfile = fopen(s + i, "w");
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
530 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
531 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
532 case 'S':
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
533 if (infile)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
534 fclose(infile);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
535 infile = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
536 if (s[1]) {
1
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
537 int i=1; while(s[i]==' ') i++;
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
538 infile = fopen(s + i, "r");
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
539 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
540 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
541 case 'h':
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
542 case '?':
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
543 printhelp();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
544 goto restart;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
545 case 'X':
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
546 case 'q':
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
547 if (!xmstat)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
548 do_exit();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
549 else {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
550 xmstat = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
551 fclose(xfile);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
552 xfile = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
553 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
554 break;
1
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
555 case '0':
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
556 case '1':
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
557 { FILE **drv = &disk[ s[0]-'0'] ;
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
558 if (*drv)
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
559 fclose(*drv);
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
560 *drv = 0;
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
561 if (s[1]) {
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
562 int i=1; while(s[i]==' ') i++;
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
563 *drv = fopen(s + i, "r+b");
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
564 if ( *drv == 0 ) { printf("can't open %s\n", &s[i]); }
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
565 }
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
566 }
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
567 break;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
568 case 'U':
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
569 if (xfile)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
570 fclose(xfile);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
571 xfile = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
572 if (s[1]) {
1
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
573 int i=1; while(s[i]==' ') i++;
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
574 xfile = fopen(s + i, "rb");
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
575 if ( xfile == 0 ) { printf("can't open %s\n", &s[i]); }
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
576 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
577 if (xfile)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
578 xmstat = 1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
579 else
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
580 xmstat = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
581 xidx = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
582 acknak = 21;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
583 rcvdnak = EOF;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
584 blocknum = 1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
585 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
586 case 'D':
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
587 if (xfile)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
588 fclose(xfile);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
589 xfile = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
590 if (s[1]) {
1
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
591 int i=1; while(s[i]==' ') i++;
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
592 xfile = fopen(s + i, "wb");
3c736a81b886 add disk
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
593 if ( xfile == 0 ) { printf("can't open %s\n", &s[i]); }
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
594 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
595 if (xfile)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
596 xmstat = 2;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
597 else
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
598 xmstat = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
599 xidx = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
600 acknak = 21;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
601 blocknum = 1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
602 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
603 case 'R':
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
604 pcreg = (mem[0xfffe] << 8) + mem[0xffff];
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
605 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
606 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
607 if (tracing||breakpoint||trskip||bpskip||stkskip) { attention = escape = 1; }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
608 else attention = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
609 set_term(escchar);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
610 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
611
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
612 void timehandler(int sig) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
613 attention = 1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
614 irq = 2;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
615 signal(SIGALRM, timehandler);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
616 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
617
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
618 void handler(int sig) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
619 escape = 1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
620 attention = 1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
621 bpskip = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
622 stkskip = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
623 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
624
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
625 void set_term(char c) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
626 struct termios newterm;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
627 struct itimerval timercontrol;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
628 signal(SIGQUIT, SIG_IGN);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
629 signal(SIGTSTP, SIG_IGN);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
630 signal(SIGINT, handler);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
631 signal(SIGUSR1, handler);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
632 tcgetattr(0, &termsetting);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
633 newterm = termsetting;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
634 newterm.c_iflag = newterm.c_iflag & ~INLCR & ~ICRNL;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
635 newterm.c_lflag = newterm.c_lflag & ~ECHO & ~ICANON;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
636 newterm.c_cc[VTIME] = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
637 newterm.c_cc[VMIN] = 1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
638 newterm.c_cc[VINTR] = escchar;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
639 tcsetattr(0, TCSAFLUSH, &newterm);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
640 tflags = fcntl(0, F_GETFL, 0);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
641 fcntl(0, F_SETFL, tflags | O_NDELAY); /* Make input from stdin non-blocking */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
642 signal(SIGALRM, timehandler);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
643 timercontrol.it_interval.tv_sec = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
644 timercontrol.it_interval.tv_usec = 20000;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
645 timercontrol.it_value.tv_sec = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
646 timercontrol.it_value.tv_usec = 20000;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
647 if (timer)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
648 setitimer(ITIMER_REAL, &timercontrol, NULL);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
649 }