annotate src/a09.c @ 127:321b7fffadab

TL/1 simple test worked
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 05 Jan 2019 19:08:54 +0900
parents fbb3301a2564
children 2937e970aac6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
33
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1 /* A09, 6809 Assembler2
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 created 1993,1994 by L.C. Benschop.
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 copyleft (c) 1994-2014 by the sbc09 team, see AUTHORS for more details.
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 license: GNU General Public License version 2, see LICENSE for more details.
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 THERE IS NO WARRANTY ON THIS PROGRAM.
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 Generates binary image file from the lowest to
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 the highest address with actually assembled data.
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10
5
35028b396a35 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
11 Machin edependencies:
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 char is 8 bits.
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 short is 16 bits.
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 integer arithmetic is twos complement.
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 syntax a09 [-o filename] [-l filename] sourcefile.
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 Options
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 -o filename name of the output file (default name minus a09 suffix)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 -s filename name of the s-record output file (default its a binary file)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 -l filename list file name (default no listing)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 -d enable debugging
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 recognized pseudoops:
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 extern public
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 macro endm if else endif
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 org equ set setdp
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 fcb fcw fdb fcc rmb
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 end include title
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 Not all of these are actually IMPLEMENTED!!!!!!
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 Revisions:
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 1993-11-03 v0.1
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 Initial version.
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 1994/03/21 v0.2
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 Fixed PC relative addressing bug
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 Added SET, SETDP, INCLUDE. IF/ELSE/ENDIF
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 No macros yet, and no separate linkable modules.
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 2012-06-04 j at klasek at
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 New: debugging parameter/option.
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 Fixed additional possible issue PC relative addressing.
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 Compatibility: Octal number prefix "&".
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 2014-07-15 j at klasek at
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 Fixed usage message.
29
3c14d647bb51 assembler and emulator fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 26
diff changeset
46 2018-07-11
3c14d647bb51 assembler and emulator fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 26
diff changeset
47 leax $ED00/256,x kernel offset in map
3c14d647bb51 assembler and emulator fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 26
diff changeset
48 should be positive offset expr should be int(32bit)
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 #include <stdlib.h>
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 #include <stdio.h>
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 #include <string.h>
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 #include <ctype.h>
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55
103
844305752064 no compile errors on mc09
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
56 #define NLABELS (2048*2)
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 #define MAXIDLEN 16
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 #define MAXLISTBYTES 8
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 #define FNLEN 30
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 #define LINELEN 128
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 static int debug=0;
33
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
63 static struct incl {
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
64 char *name;
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
65 struct incl *next;
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
66 } *incls = 0;
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
67
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
68 static struct longer {
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
69 int gline;
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
70 int change;
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
71 struct longer *next;
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
72 } *lglist = 0;
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
73
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 struct oprecord{char * name;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 unsigned char cat;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 unsigned short code;};
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
78
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
79 #define EXPERR 1
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
80 #define ILLAERR 2
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
81 #define UDEFLABELERR 4
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
82 #define MULTLABELERR 8
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
83 #define RBRACHERR 16
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
84 #define MSSINGLBLERR 32
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
85 #define ILLNMERR 0x8000
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
86
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 /* Instruction categories:
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 0 one byte oprcodes NOP
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 1 two byte opcodes SWI2
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 2 opcodes w. imm byte ANDCC
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 3 LEAX etc.
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 4 short branches. BGE
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 5 long branches 2byte opc LBGE
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 6 long branches 1byte opc LBRA
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 7 accumulator instr. ADDA
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 8 double reg instr 1byte opc LDX
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 9 double reg instr 2 byte opc LDY
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 10 single address instrs NEG
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
99 11 TFR, EXG
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 12 push,pull
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 13 pseudoops
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
103
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 struct oprecord optable[]={
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 {"ABX",0,0x3a},{"ADCA",7,0x89},{"ADCB",7,0xc9},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 {"ADDA",7,0x8b},{"ADDB",7,0xcb},{"ADDD",8,0xc3},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 {"ANDA",7,0X84},{"ANDB",7,0xc4},{"ANDCC",2,0x1c},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 {"ASL",10,0x08},{"ASLA",0,0x48},{"ASLB",0,0x58},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 {"ASR",10,0x07},{"ASRA",0,0x47},{"ASRB",0,0x57},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 {"BCC",4,0x24},{"BCS",4,0x25},{"BEQ",4,0x27},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 {"BGE",4,0x2c},{"BGT",4,0x2e},{"BHI",4,0x22},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 {"BHS",4,0x24},{"BITA",7,0x85},{"BITB",7,0xc5},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 {"BLE",4,0x2f},{"BLO",4,0x25},{"BLS",4,0x23},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 {"BLT",4,0x2d},{"BMI",4,0x2b},{"BNE",4,0x26},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 {"BPL",4,0x2a},{"BRA",4,0x20},{"BRN",4,0x21},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 {"BSR",4,0x8d},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 {"BVC",4,0x28},{"BVS",4,0x29},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 {"CLC",1,0x1cfe},{"CLF",1,0x1cbf},{"CLI",1,0x1cef},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 {"CLIF",1,0x1caf},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 {"CLR",10,0x0f},{"CLRA",0,0x4f},{"CLRB",0,0x5f},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 {"CLV",1,0x1cfd},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 {"CMPA",7,0x81},{"CMPB",7,0xc1},{"CMPD",9,0x1083},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
123 {"CMPS",9,0x118c},{"CMPU",9,0x1183},{"CMPX",8,0x8c},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 {"CMPY",9,0x108c},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
125 {"COM",10,0x03},{"COMA",0,0x43},{"COMB",0,0x53},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 {"CWAI",2,0x3c},{"DAA",0,0x19},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 {"DEC",10,0x0a},{"DECA",0,0x4a},{"DECB",0,0x5a},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
128 {"DES",1,0x327f},{"DEU",1,0x335f},{"DEX",1,0x301f},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
129 {"DEY",1,0x313f},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 {"ELSE",13,1},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
131 {"EMOD",13,25},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
132 {"END",13,2},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
133 {"ENDC",13,3},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
134 {"ENDIF",13,3},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 {"ENDM",13,4},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 {"EORA",7,0x88},{"EORB",7,0xc8},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
137 {"EQU",13,5},{"EXG",11,0x1e},{"EXTERN",13,6},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
138 {"FCB",13,7},{"FCC",13,8},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 {"FCS",13,23},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
140 {"FCW",13,9},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
141 {"FDB",13,9},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 {"IF",13,10},
33
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
143 {"IFEQ",13,30},
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
144 {"IFGT",13,29},
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
145 {"IFNDEF",13,33},
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
146 {"IFNE",13,28},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
147 {"IFP1",13,21},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 {"INC",10,0x0c},{"INCA",0,0x4c},{"INCB",0,0x5c},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
149 {"INCLUDE",13,16},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
150 {"INS",1,0x3261},{"INU",1,0x3341},{"INX",1,0x3001},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
151 {"INY",1,0x3121},{"JMP",10,0x0e},{"JSR",8,0x8d},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
152 {"LBCC",5,0x1024},{"LBCS",5,0x1025},{"LBEQ",5,0x1027},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
153 {"LBGE",5,0x102c},{"LBGT",5,0x102e},{"LBHI",5,0x1022},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 {"LBHS",5,0x1024},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 {"LBLE",5,0x102f},{"LBLO",5,0x1025},{"LBLS",5,0x1023},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
156 {"LBLT",5,0x102d},{"LBMI",5,0x102b},{"LBNE",5,0x1026},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
157 {"LBPL",5,0x102a},{"LBRA",6,0x16},{"LBRN",5,0x1021},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
158 {"LBSR",6,0x17},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 {"LBVC",5,0x1028},{"LBVS",5,0x1029},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 {"LDA",7,0x86},{"LDB",7,0xc6},{"LDD",8,0xcc},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
161 {"LDS",9,0x10ce},{"LDU",8,0xce},{"LDX",8,0x8e},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
162 {"LDY",9,0x108e},{"LEAS",3,0x32},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
163 {"LEAU",3,0x33},{"LEAX",3,0x30},{"LEAY",3,0x31},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
164 {"LSL",10,0x08},{"LSLA",0,0x48},{"LSLB",0,0x58},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
165 {"LSR",10,0x04},{"LSRA",0,0x44},{"LSRB",0,0x54},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
166 {"MACRO",13,11},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
167 {"MOD",13,24},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 {"MUL",0,0x3d},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
169 {"NAM",13,26},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
170 {"NEG",10,0x00},{"NEGA",0,0x40},{"NEGB",0,0x50},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
171 {"NOP",0,0x12},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 {"OPT",13,19},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
173 {"ORA",7,0x8a},{"ORB",7,0xca},{"ORCC",2,0x1a},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 {"ORG",13,12},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
175 {"OS9",13,32},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
176 {"PAG",13,20}, {"PAGE",13,20},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
177 {"PSHS",12,0x34},{"PSHU",12,0x36},{"PUBLIC",13,13},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 {"PULS",12,0x35},{"PULU",12,0x37},{"RMB",13,0},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
179 {"ROL",10,0x09},{"ROLA",0,0x49},{"ROLB",0,0x59},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
180 {"ROR",10,0x06},{"RORA",0,0x46},{"RORB",0,0x56},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
181 {"RTI",0,0x3b},{"RTS",0,0x39},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
182 {"SBCA",7,0x82},{"SBCB",7,0xc2},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
183 {"SEC",1,0x1a01},{"SEF",1,0x1a40},{"SEI",1,0x1a10},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
184 {"SEIF",1,0x1a50},{"SET",13,15},
82
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 71
diff changeset
185 {"SETDP",13,14},{"SEV",1,0x1a02},{"SEX",0,0x1d},{"SPC",13,20},
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
186 {"STA",7,0x87},{"STB",7,0xc7},{"STD",8,0xcd},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
187 {"STS",9,0x10cf},{"STU",8,0xcf},{"STX",8,0x8f},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
188 {"STY",9,0x108f},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
189 {"SUBA",7,0x80},{"SUBB",7,0xc0},{"SUBD",8,0x83},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
190 {"SWI",0,0x3f},{"SWI2",1,0x103f},{"SWI3",1,0x113f},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
191 {"SYNC",0,0x13},{"TFR",11,0x1f},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
192 {"TITLE",13,18},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
193 {"TST",10,0x0d},{"TSTA",0,0x4d},{"TSTB",0,0x5d},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 {"TTL",13,18},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 {"USE",13,27},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 };
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
197
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
198 struct symrecord{char name[MAXIDLEN+1];
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
199 char cat;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
200 unsigned short value;
33
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
201 struct symrecord *next;
0
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
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
204 int symcounter=0;
34
2032755628dc fix for nitros9
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
205 int os9 = 0; // os9 flag
2032755628dc fix for nitros9
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
206 int rmbmode = 0; // in os9 work area
26
51a35f0347f6 fix label
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
207 struct symrecord * prevlp = 0;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
208
8
96a067cf4c4f level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
209 /* expression categories...
96a067cf4c4f level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
210 ECORD all zeros is ordinary constant.
96a067cf4c4f level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
211 ECADR bit 1 indicates address within module.
96a067cf4c4f level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
212 ECEXT bit 2 indicates external address.
96a067cf4c4f level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
213 ECLBL bit 3 public label
96a067cf4c4f level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
214 ECABS bit 4 indicates this can't be relocated if it's an address.
96a067cf4c4f level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
215 ECNEG bit 5 indicates address (if any) is negative.
96a067cf4c4f level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
216 */
96a067cf4c4f level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
217
96a067cf4c4f level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
218
96a067cf4c4f level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
219 /* Symbol categories. exprcat ( symcat & 0xe )
96a067cf4c4f level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
220 0 SCC Constant value (from equ). ECORD
96a067cf4c4f level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
221 1 SCV Variable value (from set) ECORD
96a067cf4c4f level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
222 2 SCC__ADR Address within program module (label). ECADR
96a067cf4c4f level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
223 3 SCV__ADR Variable containing address. ECADR
96a067cf4c4f level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
224 4 SC_E_ADR Adress in other program module (extern) ECEXT
96a067cf4c4f level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
225 5 SCVE_ADR Variable containing external address. ECEXT
96a067cf4c4f level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
226 6 SCU _ADR Unresolved address. ECEXT+ECADR
96a067cf4c4f level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
227 7 SCV_UADR Variable containing unresolved address. ECEXT+ECADR
96a067cf4c4f level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
228 8 SC___LBL Public label. ECLBL
96a067cf4c4f level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
229 9 SCMACRO Macro definition. xxx
96a067cf4c4f level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
230 10 SCU__LBL Public label (yet undefined). ECADR+ECLBL
96a067cf4c4f level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
231 11 SCPARAM parameter name. ECADR+ECLBL
96a067cf4c4f level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
232 12 SCLOCAL local label. ECEXT+ECLBL
96a067cf4c4f level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
233 13 SCEMPTY empty. xxx
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
234 */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
235
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
236 struct symrecord symtable[NLABELS];
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 void processfile(char *name);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
239
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
240 struct oprecord * findop(char * nm)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
241 /* Find operation (mnemonic) in table using binary search */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
242 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
243 int lo,hi,i,s;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
244 lo=0;hi=sizeof(optable)/sizeof(optable[0])-1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
245 do {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
246 i=(lo+hi)/2;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
247 s=strcmp(optable[i].name,nm);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
248 if(s<0) lo=i+1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
249 else if(s>0) hi=i-1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
250 else break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
251 } while(hi>=lo);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
252 if (s) return NULL;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
253 return optable+i;
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
40
b8fa36c04ff7 fix multiple label on empty line
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
256 struct symrecord * findsym(char * nm) {
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
257 /* finds symbol table record; inserts if not found
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
258 uses binary search, maintains sorted table */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
259 int lo,hi,i,j,s;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
260 lo=0;hi=symcounter-1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
261 s=1;i=0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
262 while (hi>=lo) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
263 i=(lo+hi)/2;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
264 s=strcmp(symtable[i].name,nm);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
265 if(s<0) lo=i+1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
266 else if(s>0) hi=i-1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
267 else break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
268 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
269 if(s) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
270 i=(s<0?i+1:i);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
271 if(symcounter==NLABELS) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
272 fprintf(stderr,"Sorry, no storage for symbols!!!");
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
273 exit(4);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
274 }
40
b8fa36c04ff7 fix multiple label on empty line
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
275 for(j=symcounter;j>i;j--) {
b8fa36c04ff7 fix multiple label on empty line
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
276 struct symrecord *from = &symtable[j-1];
b8fa36c04ff7 fix multiple label on empty line
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
277 if (prevlp == from) prevlp++;
b8fa36c04ff7 fix multiple label on empty line
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
278 if (from->next && from->next - symtable > i) from->next ++;
b8fa36c04ff7 fix multiple label on empty line
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
279 symtable[j]=symtable[j-1];
b8fa36c04ff7 fix multiple label on empty line
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
280 }
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
281 symcounter++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
282 strcpy(symtable[i].name,nm);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
283 symtable[i].cat=13;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
284 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
285 return symtable+i;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
286 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
287
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
288 FILE *listfile,*objfile;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
289 char *listname,*objname,*srcname,*curname;
33
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
290 int lineno,glineno;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
291
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
292 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
293 outsymtable()
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
294 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
295 int i,j=0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
296 fprintf(listfile,"\nSYMBOL TABLE");
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
297 for(i=0;i<symcounter;i++)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
298 if(symtable[i].cat!=13) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
299 if(j%4==0)fprintf(listfile,"\n");
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
300 fprintf(listfile,"%10s %02d %04x",symtable[i].name,symtable[i].cat,
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
301 symtable[i].value);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
302 j++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
303 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
304 fprintf(listfile,"\n");
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
305 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
306
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
307 struct regrecord{char *name;unsigned char tfr,psh;};
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
308 struct regrecord regtable[]=
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
309 {{"D",0x00,0x06},{"X",0x01,0x10},{"Y",0x02,0x20},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
310 {"U",0x03,0x40},{"S",0x04,0x40},{"PC",0x05,0x80},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
311 {"A",0x08,0x02},{"B",0x09,0x04},{"CC",0x0a,0x01},
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
312 {"CCR",0x0a,0x01},{"DP",0x0b,0x08},{"DPR",0x0b,0x08}};
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
313
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
314 struct regrecord * findreg(char *nm)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
315 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
316 int i;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
317 for(i=0;i<12;i++) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
318 if(strcmp(regtable[i].name,nm)==0) return regtable+i;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
319 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
320 return 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
321 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
322
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
323
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
324 char pass; /* Assembler pass=1 or 2 */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
325 char listing; /* flag to indicate listing */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
326 char relocatable; /* flag to indicate relocatable object. */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
327 char terminate; /* flag to indicate termination. */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
328 char generating; /* flag to indicate that we generate code */
34
2032755628dc fix for nitros9
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
329 unsigned short loccounter,oldlc,prevloc,rmbcounter; /* Location counter */
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
330
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
331 char inpline[128]; /* Current input line (not expanded)*/
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
332 char srcline[128]; /* Current source line */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
333 char * srcptr; /* Pointer to line being parsed */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
334
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
335 char unknown; /* flag to indicate value unknown */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
336 char certain; /* flag to indicate value is certain at pass 1*/
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
337 int error; /* flags indicating errors in current line. */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
338 int errors; /* number of errors */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
339 char exprcat; /* category of expression being parsed, eg.
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
340 label or constant, this is important when
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
341 generating relocatable object code. */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
342
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
343 void seterror(int e) {
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
344 error |= e;
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
345 }
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
346
46
ec9f494497e1 vdisk fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
347 void makelonger(int gl) {
ec9f494497e1 vdisk fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
348 if (pass==1) return;
ec9f494497e1 vdisk fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
349 for(struct longer *p=lglist;p;p=p->next) {
ec9f494497e1 vdisk fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
350 if (p->gline==gl) { // already fixed
ec9f494497e1 vdisk fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
351 p->change = 1;
ec9f494497e1 vdisk fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
352 return;
ec9f494497e1 vdisk fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
353 }
ec9f494497e1 vdisk fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
354 }
ec9f494497e1 vdisk fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
355 struct longer *p = (struct longer *)calloc(sizeof(struct longer *),1);
ec9f494497e1 vdisk fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
356 p->gline=gl;
ec9f494497e1 vdisk fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
357 p->next = lglist;
ec9f494497e1 vdisk fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
358 lglist = p;
ec9f494497e1 vdisk fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
359 }
ec9f494497e1 vdisk fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
360
ec9f494497e1 vdisk fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
361 int longer() {
ec9f494497e1 vdisk fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
362 for(struct longer *p=lglist;p;p=p->next) {
ec9f494497e1 vdisk fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
363 if (p->change == 0) return 1;
ec9f494497e1 vdisk fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
364 }
ec9f494497e1 vdisk fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
365 return 0;
ec9f494497e1 vdisk fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
366 }
6
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
367 void generate()
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
368 {
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
369 generating = 1;
34
2032755628dc fix for nitros9
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
370 if (rmbmode) {
2032755628dc fix for nitros9
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
371 rmbcounter = loccounter;
2032755628dc fix for nitros9
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
372 oldlc = loccounter = prevloc;
2032755628dc fix for nitros9
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
373 rmbmode = 0;
6
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
374 }
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
375 }
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
376
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
377
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
378 char namebuf[MAXIDLEN+1];
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
379
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
380 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
381 err(int er) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
382 error |= er ;
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
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
386 scanname()
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
387 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
388 int i=0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
389 char c;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
390 while(1) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
391 c=*srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
392 if(c>='a'&&c<='z')c-=32;
33
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
393 if(c!='_'&&c!='@'&&c!='.'&&c!='$'&&(c<'0'||c>'9')&&(c<'A'||c>'Z'))break;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
394 if(i<MAXIDLEN)namebuf[i++]=c;
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 namebuf[i]=0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
397 srcptr--;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
398 }
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 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
401 skipspace()
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 char c;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
404 do {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
405 c=*srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
406 } while(c==' '||c=='\t');
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
407 srcptr--;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
408 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
409
29
3c14d647bb51 assembler and emulator fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 26
diff changeset
410 int scanexpr(int);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
411
29
3c14d647bb51 assembler and emulator fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 26
diff changeset
412 int scandecimal()
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
413 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
414 char c;
29
3c14d647bb51 assembler and emulator fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 26
diff changeset
415 int t=0;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
416 c=*srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
417 while(isdigit(c)) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
418 t=t*10+c-'0';
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
419 c=*srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
420 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
421 srcptr--;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
422 return t;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
423 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
424
29
3c14d647bb51 assembler and emulator fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 26
diff changeset
425 int scanhex()
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
426 {
29
3c14d647bb51 assembler and emulator fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 26
diff changeset
427 int t=0,i=0;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
428 srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
429 scanname();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
430 while(namebuf[i]>='0'&&namebuf[i]<='F') {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
431 t=t*16+namebuf[i]-'0';
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
432 if(namebuf[i]>'9')t-=7;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
433 i++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
434 }
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
435 if(i==0)seterror(1);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
436 return t;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
437 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
438
29
3c14d647bb51 assembler and emulator fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 26
diff changeset
439 int scanchar()
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
440 {
29
3c14d647bb51 assembler and emulator fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 26
diff changeset
441 int t;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
442 srcptr++;
119
b4e43c5bc0fd source fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 118
diff changeset
443 if (*srcptr=='\\')srcptr++;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
444 t=*srcptr;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
445 if(t)srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
446 if (*srcptr=='\'')srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
447 return t;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
448 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
449
29
3c14d647bb51 assembler and emulator fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 26
diff changeset
450 int scanbin()
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
451 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
452 char c;
29
3c14d647bb51 assembler and emulator fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 26
diff changeset
453 int t=0;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
454 srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
455 c=*srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
456 while(c=='0'||c=='1') {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
457 t=t*2+c-'0';
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
458 c=*srcptr++;
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 srcptr--;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
461 return t;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
462 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
463
29
3c14d647bb51 assembler and emulator fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 26
diff changeset
464 int scanoct()
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
465 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
466 char c;
29
3c14d647bb51 assembler and emulator fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 26
diff changeset
467 int t=0;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
468 srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
469 c=*srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
470 while(c>='0'&&c<='7') {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
471 t=t*8+c-'0';
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
472 c=*srcptr++;
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 srcptr--;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
475 return t;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
476 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
477
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
478
29
3c14d647bb51 assembler and emulator fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 26
diff changeset
479 int scanlabel()
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
480 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
481 struct symrecord * p;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
482 scanname();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
483 p=findsym(namebuf);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
484 if(p->cat==13) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
485 p->cat=6;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
486 p->value=0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
487 }
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
488 if(p->cat==9||p->cat==11)seterror(1);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
489 exprcat=p->cat&14;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
490 if(exprcat==6||exprcat==10)unknown=1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
491 if(((exprcat==2||exprcat==8)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
492 && (unsigned short)(p->value)>(unsigned short)loccounter)||
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
493 exprcat==4)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
494 certain=0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
495 if(exprcat==8||exprcat==6||exprcat==10)exprcat=2;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
496 return p->value;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
497 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
498
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
499
29
3c14d647bb51 assembler and emulator fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 26
diff changeset
500 int scanfactor()
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
501 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
502 char c;
29
3c14d647bb51 assembler and emulator fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 26
diff changeset
503 int t;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
504 skipspace();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
505 c=*srcptr;
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
506 if(isalpha(c)||c=='_')return scanlabel();
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
507 else if(isdigit(c))return scandecimal();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
508 else switch(c) {
34
2032755628dc fix for nitros9
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
509 case '*' : srcptr++;exprcat|=2; if(rmbmode) return prevloc; else return loccounter;
2032755628dc fix for nitros9
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
510 case '.' : srcptr++;exprcat|=2; if(os9&&!rmbmode) return rmbcounter; else return loccounter;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
511 case '$' : return scanhex();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
512 case '%' : return scanbin();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
513 case '&' : /* compatibility */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
514 case '@' : return scanoct();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
515 case '\'' : return scanchar();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
516 case '(' : srcptr++;t=scanexpr(0);skipspace();
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
517 if(*srcptr==')')srcptr++;else seterror(1);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
518 return t;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
519 case '-' : srcptr++;exprcat^=32;return -scanfactor();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
520 case '+' : srcptr++;return scanfactor();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
521 case '!' : srcptr++;exprcat|=16;return !scanfactor();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
522 case '^' :
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
523 case '~' : srcptr++;exprcat|=16;return ~scanfactor();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
524 }
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
525 seterror(1);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
526 return 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
527 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
528
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
529 #define EXITEVAL {srcptr--;return t;}
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 #define RESOLVECAT if((oldcat&15)==0)oldcat=0;\
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
532 if((exprcat&15)==0)exprcat=0;\
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
533 if((exprcat==2&&oldcat==34)||(exprcat==34&&oldcat==2)) {\
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
534 exprcat=0;\
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
535 oldcat=0;}\
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
536 exprcat|=oldcat;\
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
537 /* resolve such cases as constant added to address or difference between
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
538 two addresses in same module */
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
29
3c14d647bb51 assembler and emulator fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 26
diff changeset
541 int scanexpr(int level) /* This is what you call _recursive_ descent!!!*/
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
542 {
29
3c14d647bb51 assembler and emulator fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 26
diff changeset
543 int t,u;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
544 char oldcat,c;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
545 exprcat=0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
546 if(level==10)return scanfactor();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
547 t=scanexpr(level+1);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
548 while(1) {
5
35028b396a35 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
549 // skipspace();
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
550 c=*srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
551 switch(c) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
552 case '*':oldcat=exprcat;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
553 t*=scanexpr(10);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
554 exprcat|=oldcat|16;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
555 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
556 case '/':oldcat=exprcat;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
557 u=scanexpr(10);
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
558 if(u)t/=u;else seterror(1);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
559 exprcat|=oldcat|16;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
560 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
561 case '%':oldcat=exprcat;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
562 u=scanexpr(10);
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
563 if(u)t%=u;else seterror(1);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
564 exprcat|=oldcat|16;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
565 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
566 case '+':if(level==9)EXITEVAL
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
567 oldcat=exprcat;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
568 t+=scanexpr(9);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
569 RESOLVECAT
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
570 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
571 case '-':if(level==9)EXITEVAL
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
572 oldcat=exprcat;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
573 t-=scanexpr(9);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
574 exprcat^=32;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
575 RESOLVECAT
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
576 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
577 case '<':if(*(srcptr)=='<') {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
578 if(level>=8)EXITEVAL
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
579 srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
580 oldcat=exprcat;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
581 t<<=scanexpr(8);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
582 exprcat|=oldcat|16;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
583 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
584 } else if(*(srcptr)=='=') {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
585 if(level>=7)EXITEVAL
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
586 srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
587 oldcat=exprcat;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
588 t=t<=scanexpr(7);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
589 exprcat|=oldcat|16;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
590 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
591 } else {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
592 if(level>=7)EXITEVAL
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
593 oldcat=exprcat;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
594 t=t<scanexpr(7);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
595 exprcat|=oldcat|16;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
596 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
597 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
598 case '>':if(*(srcptr)=='>') {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
599 if(level>=8)EXITEVAL
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
600 srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
601 oldcat=exprcat;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
602 t>>=scanexpr(8);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
603 exprcat|=oldcat|16;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
604 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
605 } else if(*(srcptr)=='=') {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
606 if(level>=7)EXITEVAL
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
607 srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
608 oldcat=exprcat;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
609 t=t>=scanexpr(7);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
610 exprcat|=oldcat|16;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
611 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
612 } else {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
613 if(level>=7)EXITEVAL
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
614 oldcat=exprcat;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
615 t=t>scanexpr(7);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
616 exprcat|=oldcat|16;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
617 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
618 }
5
35028b396a35 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
619 case '!':if(level>=6) {
35028b396a35 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
620 if (*srcptr=='=') {
35028b396a35 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
621 srcptr++;
35028b396a35 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
622 oldcat=exprcat;
35028b396a35 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
623 t=t!=scanexpr(6);
35028b396a35 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
624 exprcat|=oldcat|16;
35028b396a35 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
625 } else {
35028b396a35 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
626 oldcat=exprcat;
35028b396a35 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
627 t|=scanexpr(6);
35028b396a35 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
628 exprcat|=oldcat|16;
35028b396a35 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
629 }
35028b396a35 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
630 }
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
631 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
632 case '=':if(level>=6)EXITEVAL
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
633 if(*srcptr=='=')srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
634 oldcat=exprcat;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
635 t=t==scanexpr(6);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
636 exprcat|=oldcat|16;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
637 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
638 case '&':if(level>=5)EXITEVAL
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
639 oldcat=exprcat;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
640 t&=scanexpr(5);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
641 exprcat|=oldcat|16;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
642 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
643 case '^':if(level>=4)EXITEVAL
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
644 oldcat=exprcat;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
645 t^=scanexpr(4);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
646 exprcat|=oldcat|16;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
647 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
648 case '|':if(level>=3)EXITEVAL
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
649 oldcat=exprcat;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
650 t|=scanexpr(3);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
651 exprcat|=oldcat|16;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
652 default: EXITEVAL
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
653 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
654 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
655 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
656
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
657 char mode; /* addressing mode 0=immediate,1=direct,2=extended,3=postbyte
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
658 4=pcrelative(with postbyte) 5=indirect 6=pcrel&indirect*/
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
659 char opsize; /*desired operand size 0=dunno,1=5,2=8,3=16*/
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
660 short operand;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
661 unsigned char postbyte;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
662
118
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 103
diff changeset
663 int dpsetting = 0;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
664
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
665
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
666 int scanindexreg()
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
667 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
668 char c;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
669 c=*srcptr;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
670 if(islower(c))c-=32;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
671 if (debug) fprintf(stderr,"DEBUG: scanindexreg: indexreg=%d, mode=%d, opsize=%d, error=%d, postbyte=%02X\n",c,mode,opsize,error,postbyte);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
672 switch(c) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
673 case 'X':return 1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
674 case 'Y':postbyte|=0x20;return 1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
675 case 'U':postbyte|=0x40;return 1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
676 case 'S':postbyte|=0x60;return 1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
677 default: return 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
678 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
679 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
680
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
681 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
682 set3()
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
683 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
684 if(mode<3)mode=3;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
685 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
686
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
687 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
688 scanspecial()
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
689 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
690 set3();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
691 skipspace();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
692 if(*srcptr=='-') {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
693 srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
694 if(*srcptr=='-') {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
695 srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
696 postbyte=0x83;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
697 } else postbyte=0x82;
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
698 if(!scanindexreg())seterror(2);else srcptr++;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
699 } else {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
700 postbyte=0x80;
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
701 if(!scanindexreg())seterror(2);else srcptr++;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
702 if(*srcptr=='+') {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
703 srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
704 if(*srcptr=='+') {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
705 srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
706 postbyte+=1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
707 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
708 } else postbyte+=4;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
709 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
710 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
711
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
712 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
713 scanindexed()
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
714 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
715 set3();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
716 postbyte=0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
717 if(scanindexreg()) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
718 srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
719 if(opsize==0) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
720 if(unknown||!certain)opsize=3;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
721 else if(operand>=-16&&operand<16&&mode==3)opsize=1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
722 else if(operand>=-128&&operand<128)opsize=2;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
723 else opsize=3;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
724 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
725 switch(opsize) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
726 case 1:postbyte+=(operand&31);opsize=0;break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
727 case 2:postbyte+=0x88;break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
728 case 3:postbyte+=0x89;break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
729 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
730 } else { /*pc relative*/
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
731 if(toupper(*srcptr)!='P')seterror(2);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
732 else {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
733 srcptr++;
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
734 if(toupper(*srcptr)!='C')seterror(2);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
735 else {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
736 srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
737 if(toupper(*srcptr)=='R')srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
738 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
739 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
740 mode++;postbyte+=0x8c;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
741 if(opsize==1)opsize=2;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
742 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
743 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
744
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
745 #define RESTORE {srcptr=oldsrcptr;c=*srcptr;goto dodefault;}
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
746
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
747 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
748 scanoperands()
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
749 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
750 char c,d,*oldsrcptr;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
751 unknown=0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
752 opsize=0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
753 certain=1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
754 skipspace();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
755 c=*srcptr;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
756 mode=0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
757 if(c=='[') {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
758 srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
759 c=*srcptr;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
760 mode=5;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
761 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
762 if (debug) fprintf(stderr,"DEBUG: scanoperands: c=%c (%02X)\n",c,c);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
763 switch(c) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
764 case 'D': case 'd':
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
765 oldsrcptr=srcptr;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
766 srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
767 skipspace();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
768 if(*srcptr!=',')RESTORE else {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
769 postbyte=0x8b;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
770 srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
771 if(!scanindexreg())RESTORE else {srcptr++;set3();}
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
772 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
773 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
774 case 'A': case 'a':
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
775 oldsrcptr=srcptr;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
776 srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
777 skipspace();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
778 if(*srcptr!=',')RESTORE else {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
779 postbyte=0x86;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
780 srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
781 if(!scanindexreg())RESTORE else {srcptr++;set3();}
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
782 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
783 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
784 case 'B': case 'b':
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
785 oldsrcptr=srcptr;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
786 srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
787 skipspace();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
788 if(*srcptr!=',')RESTORE else {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
789 postbyte=0x85;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
790 srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
791 if (debug) fprintf(stderr,"DEBUG: scanoperands: breg preindex: c=%c (%02X)\n",*srcptr,*srcptr);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
792 if(!scanindexreg())RESTORE else {srcptr++;set3();}
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
793 if (debug) fprintf(stderr,"DEBUG: scanoperands: breg: postindex c=%c (%02X)\n",*srcptr,*srcptr);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
794 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
795 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
796 case ',':
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
797 srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
798 scanspecial();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
799 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
800 case '#':
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
801 if(mode==5)seterror(2);else mode=0;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
802 srcptr++;
119
b4e43c5bc0fd source fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 118
diff changeset
803 if (*srcptr=='"') { // ??
5
35028b396a35 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
804 operand = (srcptr[1]<<8) + srcptr[2] ;
35028b396a35 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
805 srcptr += 3;
35028b396a35 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
806 break;
35028b396a35 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
807 }
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
808 operand=scanexpr(0);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
809 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
810 case '<':
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
811 srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
812 if(*srcptr=='<') {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
813 srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
814 opsize=1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
815 } else opsize=2;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
816 goto dodefault;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
817 case '>':
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
818 srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
819 opsize=3;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
820 default: dodefault:
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
821 operand=scanexpr(0);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
822 skipspace();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
823 if(*srcptr==',') {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
824 srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
825 scanindexed();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
826 } else {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
827 if(opsize==0) {
118
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 103
diff changeset
828 if(unknown||dpsetting==-1|| // omit !certain
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 103
diff changeset
829 ((((operand&0xff00)>>8))!=dpsetting))
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
830 opsize=3; else opsize=2;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
831 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
832 if(opsize==1)opsize=2;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
833 if(mode==5){
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
834 postbyte=0x8f;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
835 opsize=3;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
836 } else mode=opsize-1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
837 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
838 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
839 if (debug) fprintf(stderr,"DEBUG: scanoperands: mode=%d, error=%d, postbyte=%02X\n",mode,error,postbyte);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
840 if(mode>=5) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
841 skipspace();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
842 postbyte|=0x10;
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
843 if(*srcptr!=']')seterror(2);else srcptr++;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
844 }
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
845 if(pass==2&&unknown)seterror(4);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
846 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
847
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
848 unsigned char codebuf[128];
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
849 int codeptr; /* byte offset within instruction */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
850 int suppress; /* 0=no suppress 1=until ENDIF 2=until ELSE 3=until ENDM */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
851 int ifcount; /* count of nested IFs within suppressed text */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
852
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
853 unsigned char outmode; /* 0 is binary, 1 is s-records */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
854
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
855 unsigned short hexaddr;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
856 int hexcount;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
857 unsigned char hexbuffer[16];
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
858 unsigned int chksum;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
859
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
860 extern int os9crc(unsigned char c, int crcp);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
861 int crc;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
862
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
863 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
864 reset_crc()
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
865 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
866 crc = -1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
867 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
868
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
869
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
870 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
871 flushhex()
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
872 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
873 int i;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
874 if(hexcount){
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
875 fprintf(objfile,"S1%02X%04X",(hexcount+3)&0xff,hexaddr&0xffff);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
876 for(i=0;i<hexcount;i++)fprintf(objfile,"%02X",hexbuffer[i]);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
877 chksum+=(hexaddr&0xff)+((hexaddr>>8)&0xff)+hexcount+3;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
878 fprintf(objfile,"%02X\n",0xff-(chksum&0xff));
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
879 hexaddr+=hexcount;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
880 hexcount=0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
881 chksum=0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
882 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
883 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
884
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
885 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
886 outhex(unsigned char x)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
887 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
888 if(hexcount==16)flushhex();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
889 hexbuffer[hexcount++]=x;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
890 chksum+=x;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
891 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
892
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
893 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
894 outbuffer()
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
895 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
896 int i;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
897 for(i=0;i<codeptr;i++) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
898 crc = os9crc(codebuf[i],crc);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
899 if(!outmode)fputc(codebuf[i],objfile);else outhex(codebuf[i]);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
900 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
901 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
902
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
903 char *errormsg[]={"Error in expression",
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
904 "Illegal addressing mode",
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
905 "Undefined label",
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
906 "Multiple definitions of label",
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
907 "Relative branch out of range",
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
908 "Missing label",
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
909 "","","","","","","","","",
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
910 "Illegal mnemonic"
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
911 };
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
912
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
913 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
914 report()
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
915 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
916 int i;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
917 fprintf(stderr,"File %s, line %d:%s\n",curname,lineno,srcline);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
918 for(i=0;i<16;i++) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
919 if(error&1) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
920 fprintf(stderr,"%s\n",errormsg[i]);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
921 if(pass==2&&listing)fprintf(listfile,"**** %s\n",errormsg[i]);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
922 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
923 error>>=1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
924 }
5
35028b396a35 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
925 error = 0;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
926 errors++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
927 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
928
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
929 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
930 outlist()
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
931 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
932 int i;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
933 fprintf(listfile,"%04X: ",oldlc);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
934 for(i=0;i<codeptr&&i<MAXLISTBYTES;i++)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
935 fprintf(listfile,"%02X",codebuf[i]);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
936 for(;i<=MAXLISTBYTES;i++)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
937 fprintf(listfile," ");
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
938 fprintf(listfile,"%s\n",srcline);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
939 while(i<codeptr) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
940 fprintf(listfile,"%04X: ",oldlc + i);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
941 for(int j=0;i<codeptr&&j<MAXLISTBYTES;j++) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
942 fprintf(listfile,"%02X",codebuf[i]); i++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
943 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
944 fprintf(listfile,"\n");
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
945 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
946 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
947
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
948 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
949 setlabel(struct symrecord * lp)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
950 {
33
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
951 while (prevlp) {
26
51a35f0347f6 fix label
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
952 struct symrecord *l = prevlp;
33
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
953 prevlp = prevlp->next;
40
b8fa36c04ff7 fix multiple label on empty line
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
954 l->next = 0;
26
51a35f0347f6 fix label
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
955 setlabel(l);
51a35f0347f6 fix label
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
956 }
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
957 if(lp) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
958 if(lp->cat!=13&&lp->cat!=6) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
959 if(lp->cat!=2||lp->value!=loccounter)
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
960 lp->value=loccounter; // seterror(8);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
961 } else {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
962 lp->cat=2;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
963 lp->value=loccounter;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
964 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
965 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
966 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
967
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
968 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
969 putbyte(unsigned char b)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
970 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
971 codebuf[codeptr++]=b;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
972 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
973
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
974 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
975 putword(unsigned short w)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
976 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
977 codebuf[codeptr++]=w>>8;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
978 codebuf[codeptr++]=w&0x0ff;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
979 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
980
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
981 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
982 doaddress() /* assemble the right addressing bytes for an instruction */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
983 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
984 int offs;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
985 switch(mode) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
986 case 0: if(opsize==2)putbyte(operand);else putword(operand);break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
987 case 1: putbyte(operand);break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
988 case 2: putword(operand);break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
989 case 3: case 5: putbyte(postbyte);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
990 switch(opsize) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
991 case 2: putbyte(operand);break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
992 case 3: putword(operand);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
993 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
994 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
995 case 4: case 6: offs=(unsigned short)operand-loccounter-codeptr-2;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
996 if(offs<-128||offs>=128||opsize==3||unknown||!certain) {
33
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
997 if((!unknown)&&opsize==2&&(offs<-128||offs>=128) ) {
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
998 seterror(16); makelonger(glineno);
33
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
999 }
12
111e5defb8ab boot is called, rti failed
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
1000 offs--;
111e5defb8ab boot is called, rti failed
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
1001 opsize=3;
111e5defb8ab boot is called, rti failed
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
1002 postbyte++;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1003 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1004 putbyte(postbyte);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1005 if (debug) fprintf(stderr,"DEBUG: doaddress: mode=%d, opsize=%d, error=%d, postbyte=%02X, operand=%04X offs=%d\n",mode,opsize,error,postbyte,operand,offs);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1006 if(opsize==3)putword(offs);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1007 else putbyte(offs);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1008 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1009 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1010
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1011 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1012 onebyte(int co)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1013 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1014 putbyte(co);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1015 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1016
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1017 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1018 twobyte(int co)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1019 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1020 putword(co);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1021 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1022
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1023 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1024 oneimm(int co)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1025 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1026 scanoperands();
5
35028b396a35 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
1027 if(mode>=3)
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
1028 seterror(2);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1029 putbyte(co);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1030 putbyte(operand);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1031 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1032
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1033 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1034 lea(int co)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1035 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1036 putbyte(co);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1037 scanoperands();
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
1038 if(mode==0) seterror(2);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1039 if(mode<3) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1040 opsize=3;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1041 postbyte=0x8f;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1042 mode=3;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1043 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1044 if (debug) fprintf(stderr,"DEBUG: lea: mode=%d, opsize=%d, error=%d, postbyte=%02X, *src=%c\n",mode,opsize,error,postbyte,*srcptr);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1045 doaddress();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1046 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1047
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1048 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1049 sbranch(int co)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1050 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1051 int offs;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1052 scanoperands();
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
1053 if(mode!=1&&mode!=2)seterror(2);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1054 offs=(unsigned short)operand-loccounter-2;
33
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1055 if(!unknown&&(offs<-128||offs>=128)) {
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
1056 seterror(16);makelonger(glineno);
33
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1057 if (co==0x20) {
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
1058 if(mode!=1&&mode!=2)seterror(2);
33
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1059 putbyte(0x16);
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1060 putword(operand-loccounter-3);
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1061 } else {
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
1062 if(mode!=1&&mode!=2)seterror(2);
33
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1063 putbyte(0x10);
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1064 putbyte(co);
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1065 putword(operand-loccounter-4);
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1066 }
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1067 return;
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1068 }
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
1069 if(pass==2&&unknown)seterror(4);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1070 putbyte(co);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1071 putbyte(offs);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1072 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1073
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1074 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1075 lbra(int co)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1076 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1077 scanoperands();
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
1078 if(mode!=1&&mode!=2)seterror(2);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1079 putbyte(co);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1080 putword(operand-loccounter-3);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1081 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1082
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1083 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1084 lbranch(int co)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1085 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1086 scanoperands();
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
1087 if(mode!=1&&mode!=2)seterror(2);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1088 putword(co);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1089 putword(operand-loccounter-4);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1090 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1091
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1092 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1093 arith(int co)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1094 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1095 scanoperands();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1096 switch(mode) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1097 case 0:opsize=2;putbyte(co);break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1098 case 1:putbyte(co+0x010);break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1099 case 2:putbyte(co+0x030);break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1100 default:putbyte(co+0x020);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1101 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1102 doaddress();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1103 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1104
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1105 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1106 darith(int co)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1107 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1108 scanoperands();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1109 switch(mode) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1110 case 0:opsize=3;putbyte(co);break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1111 case 1:putbyte(co+0x010);break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1112 case 2:putbyte(co+0x030);break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1113 default:putbyte(co+0x020);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1114 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1115 doaddress();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1116 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1117
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1118 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1119 d2arith(int co)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1120 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1121 scanoperands();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1122 switch(mode) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1123 case 0:opsize=3;putword(co);break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1124 case 1:putword(co+0x010);break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1125 case 2:putword(co+0x030);break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1126 default:putword(co+0x020);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1127 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1128 doaddress();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1129 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1130
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1131 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1132 oneaddr(int co)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1133 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1134 scanoperands();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1135 switch(mode) {
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
1136 case 0: seterror(2);break;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1137 case 1: putbyte(co);break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1138 case 2: putbyte(co+0x70);break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1139 default: putbyte(co+0x60);break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1140 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1141 doaddress();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1142 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1143
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1144 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1145 tfrexg(int co)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1146 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1147 struct regrecord * p;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1148 putbyte(co);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1149 skipspace();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1150 scanname();
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
1151 if((p=findreg(namebuf))==0)seterror(2);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1152 else postbyte=(p->tfr)<<4;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1153 skipspace();
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
1154 if(*srcptr==',')srcptr++;else seterror(2);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1155 skipspace();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1156 scanname();
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
1157 if((p=findreg(namebuf))==0)seterror(2);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1158 else postbyte|=p->tfr;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1159 putbyte(postbyte);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1160 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1161
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1162 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1163 pshpul(int co)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1164 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1165 struct regrecord *p;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1166 putbyte(co);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1167 postbyte=0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1168 do {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1169 if(*srcptr==',')srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1170 skipspace();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1171 scanname();
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
1172 if((p=findreg(namebuf))==0)seterror(2);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1173 else postbyte|=p->psh;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1174 skipspace();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1175 }while (*srcptr==',');
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1176 putbyte(postbyte);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1177 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1178
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1179 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1180 skipComma()
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1181 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1182 while(*srcptr && *srcptr!='\n' && *srcptr!=',')srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1183 if (*srcptr==',') {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1184 srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1185 } else {
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
1186 seterror(1);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1187 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1188 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1189
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1190 void os9begin()
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1191 {
6
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1192 generate();
39
1d3057b6b786 rmb counter on pass 2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 38
diff changeset
1193 os9=1; // contiguous code generation ( seprate rmb and code )
34
2032755628dc fix for nitros9
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
1194 oldlc = loccounter = rmbcounter = rmbmode = 0;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1195 reset_crc();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1196 putword(0x87cd);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1197 putword(scanexpr(0)-loccounter); // module size
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
1198 if(unknown&&pass==2)seterror(4);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1199 skipComma();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1200 putword(scanexpr(0)-loccounter); // offset to module name
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
1201 if(unknown&&pass==2)seterror(4);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1202 skipComma();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1203 putbyte(scanexpr(0)); // type / language
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
1204 if(unknown&&pass==2)seterror(4);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1205 skipComma();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1206 putbyte(scanexpr(0)); // attribute
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
1207 if(unknown&&pass==2)seterror(4);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1208 int parity=0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1209 for(int i=0; i< 8; i++) parity^=codebuf[i];
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1210 putbyte(parity^0xff); // header parity
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1211 skipspace();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1212 while (*srcptr==',') { // there are some more
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1213 srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1214 putword(scanexpr(0));
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
1215 if(unknown&&pass==2)seterror(4);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1216 skipspace();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1217 }
34
2032755628dc fix for nitros9
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
1218 prevloc = codeptr;
2032755628dc fix for nitros9
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
1219 rmbmode = 1; // next org works on rmb
39
1d3057b6b786 rmb counter on pass 2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 38
diff changeset
1220 rmbcounter=0;
34
2032755628dc fix for nitros9
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
1221 loccounter = 0x10000-codeptr; // should start at 0
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1222 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1223
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1224 void os9end()
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1225 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1226 crc = crc ^ 0xffffff;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1227
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1228 putbyte((crc>>16)&0xff);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1229 putbyte((crc>>8)&0xff);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1230 putbyte(crc&0xff);
39
1d3057b6b786 rmb counter on pass 2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 38
diff changeset
1231 os9 = 0;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1232 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1233
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1234
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1235 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1236 pseudoop(int co,struct symrecord * lp)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1237 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1238 int i;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1239 char c;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1240 char *fname;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1241 int locsave;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1242
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1243 switch(co) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1244 case 0:/* RMB */
3
831ac057ea86 before mmu
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
1245 // in OS9 mode, this generates no data
831ac057ea86 before mmu
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
1246 // loccounter will be reset after any code to the current code generation
34
2032755628dc fix for nitros9
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
1247 if (os9 && !rmbmode) {
2032755628dc fix for nitros9
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
1248 prevloc = loccounter;
2032755628dc fix for nitros9
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
1249 oldlc = loccounter = rmbcounter;
2032755628dc fix for nitros9
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
1250 rmbmode = 1;
33
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1251 }
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1252 setlabel(lp);
40
b8fa36c04ff7 fix multiple label on empty line
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
1253 oldlc = loccounter;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1254 operand=scanexpr(0);
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
1255 if(unknown)seterror(4);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1256 loccounter+=operand;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1257 if(generating&&pass==2) {
6
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1258 if(!outmode && !os9 ) {
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1259 for(i=0;i<operand;i++) { fputc(0,objfile); }
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1260 } else
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1261 flushhex();
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1262 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1263 hexaddr=loccounter;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1264 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1265 case 5:/* EQU */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1266 operand=scanexpr(0);
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
1267 if(!lp)seterror(32);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1268 else {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1269 if(lp->cat==13||lp->cat==6||
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1270 (lp->value==(unsigned short)operand&&pass==2)) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1271 if(exprcat==2)lp->cat=2;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1272 else lp->cat=0;
40
b8fa36c04ff7 fix multiple label on empty line
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
1273 lp->value=oldlc=operand;
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
1274 } else // else seterror(8);
40
b8fa36c04ff7 fix multiple label on empty line
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
1275 lp->value=oldlc=operand;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1276 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1277 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1278 case 7:/* FCB */
6
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1279 generate();
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1280 setlabel(lp);
120
fbb3301a2564 TL1 source fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 119
diff changeset
1281 fcb:
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1282 do {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1283 if(*srcptr==',')srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1284 skipspace();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1285 if(*srcptr=='\"') {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1286 srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1287 while(*srcptr!='\"'&&*srcptr)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1288 putbyte(*srcptr++);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1289 if(*srcptr=='\"')srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1290 } else {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1291 putbyte(scanexpr(0));
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
1292 if(unknown&&pass==2)seterror(4);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1293 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1294 skipspace();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1295 } while(*srcptr==',');
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1296 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1297 case 8:/* FCC */
6
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1298 generate();
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1299 setlabel(lp);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1300 skipspace();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1301 c=*srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1302 while(*srcptr!=c&&*srcptr)
120
fbb3301a2564 TL1 source fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 119
diff changeset
1303 putbyte(*srcptr++);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1304 if(*srcptr==c)srcptr++;
120
fbb3301a2564 TL1 source fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 119
diff changeset
1305 if(*srcptr==',') goto fcb;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1306 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1307 case 9:/* FDB */
6
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1308 generate();
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1309 setlabel(lp);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1310 do {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1311 if(*srcptr==',')srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1312 skipspace();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1313 putword(scanexpr(0));
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
1314 if(unknown&&pass==2)seterror(4);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1315 skipspace();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1316 } while(*srcptr==',');
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1317 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1318 case 23 :/* FCS */
6
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1319 generate();
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1320 setlabel(lp);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1321 skipspace();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1322 int sep = *srcptr;
35
01519215ec70 add watch point
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
1323 if(sep=='\"' || sep=='/' || sep=='\'') {
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1324 srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1325 while(*srcptr!=sep&&*srcptr)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1326 putbyte(*srcptr++);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1327 if(*srcptr==sep)srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1328 codebuf[codeptr-1] |= 0x80; // os9 string termination
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1329 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1330 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1331 case 1: /* ELSE */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1332 suppress=1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1333 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1334 case 21: /* IFP1 */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1335 if(pass==2)suppress=2;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1336 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1337 case 29: /* IFGT */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1338 operand=scanexpr(0);
33
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1339 if(operand<=0)suppress=2;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1340 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1341 case 31: /* IFLT */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1342 operand=scanexpr(0);
33
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1343 if(operand>=0)suppress=2;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1344 break;
3
831ac057ea86 before mmu
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
1345 case 30: /* IFEQ */
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1346 operand=scanexpr(0);
33
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1347 if(operand!=0)suppress=2;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1348 break;
3
831ac057ea86 before mmu
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
1349 case 28: /* IFNE */
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1350 case 10: /* IF */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1351 operand=scanexpr(0);
33
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1352 if(operand==0)suppress=2;
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1353 break;
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1354 case 33: /* IFNDEF */
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1355 operand=scanexpr(0);
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1356 if(!unknown)suppress=2;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1357 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1358 case 12: /* ORG */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1359 operand=scanexpr(0);
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
1360 if(unknown)seterror(4);
3
831ac057ea86 before mmu
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
1361 if(generating&&pass==2&&!outmode&&!os9) {
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1362 for(i=0;i<(unsigned short)operand-loccounter;i++)
3
831ac057ea86 before mmu
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
1363 fputc(0,objfile);
831ac057ea86 before mmu
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
1364 } else flushhex();
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1365 loccounter=operand;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1366 hexaddr=loccounter;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1367 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1368 case 14: /* SETDP */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1369 operand=scanexpr(0);
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
1370 if(unknown)seterror(4);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1371 if(!(operand&255))operand=(unsigned short)operand>>8;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1372 if((unsigned)operand>255)operand=-1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1373 dpsetting=operand;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1374 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1375 case 15: /* SET */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1376 operand=scanexpr(0);
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
1377 if(!lp)seterror(32);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1378 else {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1379 if(lp->cat&1||lp->cat==6) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1380 if(exprcat==2)lp->cat=3;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1381 else lp->cat=1;
40
b8fa36c04ff7 fix multiple label on empty line
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
1382 lp->value=oldlc=operand;
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
1383 } else // else seterror(8);
40
b8fa36c04ff7 fix multiple label on empty line
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
1384 lp->value=oldlc=operand;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1385 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1386 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1387 case 2: /* END */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1388 terminate=1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1389 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1390 case 27: /* USE */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1391 case 16: /* INCLUDE */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1392 skipspace();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1393 if(*srcptr=='"')srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1394 i = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1395 for(i=0; !(srcptr[i]==0||srcptr[i]=='"'); i++);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1396 int len = i;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1397 fname = calloc(1,len);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1398 for(i=0;i<len;i++) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1399 if(*srcptr==0||*srcptr=='"')break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1400 fname[i]=*srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1401 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1402 fname[i]=0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1403 processfile(fname);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1404 codeptr=0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1405 srcline[0]=0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1406 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1407 case 24: /* MOD */
6
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1408 oldlc = loccounter = 0;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1409 setlabel(lp);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1410 os9begin();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1411 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1412 case 25: /* EMOD */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1413 os9end();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1414 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1415 case 32: /* OS9 */
6
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1416 generate();
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1417 setlabel(lp);
3
831ac057ea86 before mmu
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
1418 putword(0x103f); // SWI2
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1419 putbyte(scanexpr(0));
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
1420 if(unknown&&pass==2)seterror(4);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1421 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1422 case 18: /* TTL */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1423 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1424 case 19: /* OPT */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1425 case 26: /* NAM */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1426 case 20: /* PAG */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1427 case 3: /* ENDIF/ENDC */
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1428 break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1429 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1430 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1431
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1432
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1433 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1434 processline()
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1435 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1436 struct symrecord * lp;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1437 struct oprecord * op;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1438 int co;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1439 char c;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1440 srcptr=srcline;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1441 oldlc=loccounter;
5
35028b396a35 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
1442 // error=0;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1443 unknown=0;certain=1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1444 lp=0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1445 codeptr=0;
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
1446 if(*srcptr=='_'||isalnum(*srcptr)) {
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1447 scanname();lp=findsym(namebuf);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1448 if(*srcptr==':') srcptr++;
26
51a35f0347f6 fix label
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
1449 if(lp && pass==2) {
51a35f0347f6 fix label
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
1450 oldlc = lp->value;
51a35f0347f6 fix label
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
1451 }
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1452 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1453 skipspace();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1454 if(isalnum(*srcptr)) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1455 scanname();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1456 op=findop(namebuf);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1457 if(op) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1458 if(op->cat!=13){
6
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1459 generate();
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1460 setlabel(lp);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1461 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1462 co=op->code;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1463 switch(op->cat) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1464 case 0:onebyte(co);break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1465 case 1:twobyte(co);break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1466 case 2:oneimm(co);break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1467 case 3:lea(co);break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1468 case 4:sbranch(co);break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1469 case 5:lbranch(co);break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1470 case 6:lbra(co);break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1471 case 7:arith(co);break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1472 case 8:darith(co);break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1473 case 9:d2arith(co);break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1474 case 10:oneaddr(co);break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1475 case 11:tfrexg(co);break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1476 case 12:pshpul(co);break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1477 case 13:pseudoop(co,lp);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1478 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1479 c=*srcptr;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1480 if (debug) fprintf(stderr,"DEBUG: processline: mode=%d, opsize=%d, error=%d, postbyte=%02X c=%c\n",mode,opsize,error,postbyte,c);
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
1481 if(c!=' '&&*(srcptr-1)!=' '&&c!=0&&c!=';')seterror(2);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1482 }
100
990add11e9f8 add micro-c stuff
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 82
diff changeset
1483 else seterror(0x8000);
26
51a35f0347f6 fix label
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
1484 } else {
33
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1485 if (lp) {
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1486 lp->next = prevlp;
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1487 prevlp = lp; // os9 mode label can be data or code
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1488 }
26
51a35f0347f6 fix label
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
1489 }
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1490 if(pass==2) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1491 outbuffer();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1492 if(listing)outlist();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1493 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1494 if(error)report();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1495 loccounter+=codeptr;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1496 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1497
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1498 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1499 suppressline()
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1500 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1501 struct oprecord * op;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1502 srcptr=srcline;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1503 oldlc=loccounter;
40
b8fa36c04ff7 fix multiple label on empty line
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
1504 struct symrecord * lp = 0;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1505 codeptr=0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1506 if(isalnum(*srcptr)) {
40
b8fa36c04ff7 fix multiple label on empty line
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
1507 scanname();lp=findsym(namebuf);
b8fa36c04ff7 fix multiple label on empty line
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
1508 if (lp) oldlc = lp->value;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1509 if(*srcptr==':')srcptr++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1510 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1511 skipspace();
40
b8fa36c04ff7 fix multiple label on empty line
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
1512 scanname();op=findop(namebuf);
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1513 if(op && op->cat==13) {
33
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1514 if(op->code==10||op->code==13||op->code==29||op->code==28||op->code==21||op->code==30||op->code==31||op->code==33) ifcount++;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1515 else if(op->code==3) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1516 if(ifcount>0)ifcount--;else if(suppress==1|suppress==2)suppress=0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1517 } else if(op->code==1) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1518 if(ifcount==0 && suppress==2)suppress=0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1519 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1520 }
6
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1521 if(pass==2&&listing)outlist(); }
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1522
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1523 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1524 usage(char*nm)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1525 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1526 fprintf(stderr,"Usage: %s [-o objname] [-l listname] [-s srecord-file] srcname\n",nm);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1527 exit(2);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1528 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1529
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1530 char *
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1531 strconcat(char *s,int spos,char *d)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1532 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1533 int slen = strlen(s);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1534 int dlen = strlen(d);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1535 if ( spos == 0) spos = slen;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1536 char *out = calloc(1,spos+dlen+1);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1537 int i = 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1538 for(; i< spos; i++ ) out[i] = s[i];
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1539 for(; i< spos+dlen+1; i++ ) out[i] = *d++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1540 return out;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1541 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1542
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1543
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1544 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1545 getoptions(int c,char*v[])
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1546 {
6
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1547 int i=1;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1548 if(c==1)usage(v[0]);
6
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1549 while(v[i]) {
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1550 if(strcmp(v[i],"-d")==0) {
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1551 debug=1;
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1552 i++;
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1553 } else if(strcmp(v[i],"-o")==0) {
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1554 objname = v[i+1];
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1555 i+=2;
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1556 } else if(strcmp(v[i],"-s")==0) {
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1557 objname=v[i+1];
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1558 outmode=1;
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1559 i+=2;
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1560 } else if(strcmp(v[i],"-l")==0) {
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1561 listname=v[i+1];
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1562 i+=2;
71
eb9be32c701c fix leval
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
1563 } else if(strcmp(v[i],"-D")==0) {
eb9be32c701c fix leval
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
1564 struct symrecord * p;
eb9be32c701c fix leval
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
1565 p=findsym(v[i+1]);
eb9be32c701c fix leval
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
1566 p->value = 1;
eb9be32c701c fix leval
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
1567 p->cat = 0;
eb9be32c701c fix leval
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
1568 i+=2;
33
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1569 } else if(strcmp(v[i],"-I")==0) {
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1570 struct incl *j = (struct incl *)malloc(sizeof(struct incl));
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1571 j->name = v[i+1];
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1572 j->next = 0;
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1573 if (!incls) incls = j;
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1574 else {
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1575 struct incl *k=incls ;
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1576 for(; k->next ; k = k->next ) ;
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1577 k->next = j;
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1578 }
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1579 i+=2;
6
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1580 } else if(*v[i]=='-') {
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1581 usage(v[0]);
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1582 } else {
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1583 if (srcname) usage(v[0]);
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1584 srcname=v[i];
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1585 i++;
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1586 }
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1587 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1588 if(objname==0) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1589 for(i=0;srcname[i]!='.' && srcname[i]!=0 ;i++) ;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1590 objname = strconcat(srcname,i,".b");
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1591 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1592 listing=(listname!=0);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1593 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1594
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1595 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1596 expandline()
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1597 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1598 int i=0,j=0,k,j1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1599 for(i=0;i<128&&j<128;i++)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1600 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1601 if(inpline[i]=='\n') {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1602 srcline[j]=0;break;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1603 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1604 if(inpline[i]=='\t') {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1605 j1=j;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1606 for(k=0;k<8-j1%8 && j<128;k++)srcline[j++]=' ';
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1607 }else srcline[j++]=inpline[i];
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1608 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1609 srcline[127]=0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1610 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1611
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1612
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1613 void
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1614 processfile(char *name)
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1615 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1616 char *oldname;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1617 int oldno;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1618 FILE *srcfile;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1619 oldname=curname;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1620 curname=name;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1621 oldno=lineno;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1622 lineno=0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1623 if((srcfile=fopen(name,"r"))==0) {
6
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1624 int i = 0;
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1625 if (oldname) {
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1626 i = strlen(oldname);
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1627 while(i>0 && oldname[i]!='/') i--;
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1628 }
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1629 if (i>0) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1630 char *next = strconcat(oldname,i+1,name);
33
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1631 if((srcfile=fopen(next,"r"))!=0) {
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1632 curname = next;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1633 }
33
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1634 }
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1635 if (!srcfile) {
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1636 for( struct incl *d = incls; d ; d = d->next) {
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1637 char *next = strconcat(d->name,0,name);
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1638 if((srcfile=fopen(next,"r"))!=0) {
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1639 curname = next;
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1640 break;
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1641 }
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1642 }
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1643 }
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1644 }
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1645 if (!srcfile) {
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1646 fprintf(stderr,"Cannot open source file %s\n",name);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1647 exit(4);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1648 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1649 while(!terminate&&fgets(inpline,128,srcfile)) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1650 expandline();
33
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1651 lineno++; glineno++;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1652 srcptr=srcline;
40
b8fa36c04ff7 fix multiple label on empty line
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
1653 if(suppress)
b8fa36c04ff7 fix multiple label on empty line
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
1654 suppressline();
b8fa36c04ff7 fix multiple label on empty line
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
1655 else
b8fa36c04ff7 fix multiple label on empty line
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
1656 processline();
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1657 }
26
51a35f0347f6 fix label
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
1658 setlabel(0); // process prevlp
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1659 fclose(srcfile);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1660 if(suppress) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1661 fprintf(stderr,"improperly nested IF statements in %s",curname);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1662 errors++;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1663 suppress=0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1664 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1665 lineno=oldno;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1666 curname=oldname;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1667 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1668
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1669 int
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1670 main(int argc,char *argv[])
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1671 {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1672 char c;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1673 getoptions(argc,argv);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1674 pass=1;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1675 errors=0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1676 generating=0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1677 terminate=0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1678 processfile(srcname);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1679 if(errors) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1680 fprintf(stderr,"%d Pass 1 Errors, Continue?",errors);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1681 c=getchar();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1682 if(c=='n'||c=='N') exit(3);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1683 }
33
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1684 do {
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1685 pass=2;
6
9c2602e1d716 level2 rom done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
1686 prevloc = 0;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1687 loccounter=0;
39
1d3057b6b786 rmb counter on pass 2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 38
diff changeset
1688 rmbcounter=0;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1689 errors=0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1690 generating=0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1691 terminate=0;
33
7c5379eb406e nitors9 version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
1692 glineno=0;
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1693 if(listing&&((listfile=fopen(listname,"w"))==0)) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1694 fprintf(stderr,"Cannot open list file");
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1695 exit(4);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1696 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1697 if((objfile=fopen(objname,outmode?"w":"wb"))==0) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1698 fprintf(stderr,"Cannot write object file\n");
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1699 exit(4);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1700 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1701 processfile(srcname);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1702 fprintf(stderr,"%d Pass 2 errors.\n",errors);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1703 if(listing) {
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1704 fprintf(listfile,"%d Pass 2 errors.\n",errors);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1705 outsymtable();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1706 fclose(listfile);
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1707 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1708 if(outmode){
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1709 flushhex();
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1710 fprintf(objfile,"S9030000FC\n");
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1711 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1712 fclose(objfile);
38
52f7ad4c2ebb a09 out range bug
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
1713 } while (longer());
0
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1714 return 0;
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1715 }
9a224bd9b45f os9 emulation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1716