Commit | Line | Data |
---|---|---|
196ba1fc PH |
1 | /* i7094_binloader.c: IBM 7094 simulator interface\r |
2 | \r | |
3 | Copyright (c) 2006, David G. Pitts\r | |
4 | \r | |
5 | Permission is hereby granted, free of charge, to any person obtaining a\r | |
6 | copy of this software and associated documentation files (the "Software"),\r | |
7 | to deal in the Software without restriction, including without limitation\r | |
8 | the rights to use, copy, modify, merge, publish, distribute, sublicense,\r | |
9 | and/or sell copies of the Software, and to permit persons to whom the\r | |
10 | Software is furnished to do so, subject to the following conditions:\r | |
11 | \r | |
12 | The above copyright notice and this permission notice shall be included in\r | |
13 | all copies or substantial portions of the Software.\r | |
14 | \r | |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r | |
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r | |
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\r | |
18 | THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r | |
19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r | |
20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r | |
21 | \r | |
22 | Except as contained in this notice, the name of the author shall not be\r | |
23 | used in advertising or otherwise to promote the sale, use or other dealings\r | |
24 | in this Software without prior written authorization from the author.\r | |
25 | */\r | |
26 | /***********************************************************************\r | |
27 | *\r | |
28 | * binloader.h - IBM 7090 emulator binary loader header.\r | |
29 | *\r | |
30 | * Changes:\r | |
31 | * 10/20/03 DGP Original.\r | |
32 | * 12/28/04 DGP Changed for new object formats.\r | |
33 | * \r | |
34 | ***********************************************************************/\r | |
35 | \r | |
36 | #define IBSYSSYM '$' /* Marks end of object file */\r | |
37 | #define WORDPERREC 5 /* Object words per record */\r | |
38 | #define LOADADDR 0200 /* Default load address */\r | |
39 | #define OBJRECLEN 80 /* Object record length */\r | |
40 | #define CHARWORD 12 /* Characters per word */\r | |
41 | \r | |
42 | /*\r | |
43 | ** Object tags\r | |
44 | */\r | |
45 | \r | |
46 | #define IDT_TAG '0' /* 0SSSSSS0LLLLL */\r | |
47 | #define ABSENTRY_TAG '1' /* 10000000AAAAA */\r | |
48 | #define RELENTRY_TAG '2' /* 20000000RRRRR */\r | |
49 | #define ABSEXTRN_TAG '3' /* 3SSSSSS0AAAAA */\r | |
50 | #define RELEXTRN_TAG '4' /* 4SSSSSS0RRRRR */\r | |
51 | #define ABSGLOBAL_TAG '5' /* 5SSSSSS0AAAAA */\r | |
52 | #define RELGLOBAL_TAG '6' /* 6SSSSSS0RRRRR */\r | |
53 | #define ABSORG_TAG '7' /* 70000000AAAAA */\r | |
54 | #define RELORG_TAG '8' /* 80000000RRRRR */\r | |
55 | #define ABSDATA_TAG '9' /* 9AAAAAAAAAAAA */\r | |
56 | #define RELADDR_TAG 'A' /* AAAAAAAARRRRR */\r | |
57 | #define RELDECR_TAG 'B' /* BARRRRRAAAAAA */\r | |
58 | #define RELBOTH_TAG 'C' /* CARRRRRARRRRR */\r | |
59 | #define BSS_TAG 'D' /* D0000000PPPPP */\r | |
60 | #define ABSXFER_TAG 'E' /* E0000000RRRRR */\r | |
61 | #define RELXFER_TAG 'F' /* F0000000RRRRR */\r | |
62 | #define EVEN_TAG 'G' /* G0000000RRRRR */\r | |
63 | #define FAPCOMMON_TAG 'H' /* H0000000AAAAA */\r | |
64 | \r | |
65 | /* Where:\r | |
66 | * SSSSSS - Symbol\r | |
67 | * LLLLLL - Length of module\r | |
68 | * AAAAAA - Absolute field\r | |
69 | * RRRRRR - Relocatable field\r | |
70 | * PPPPPP - PC offset field\r | |
71 | */\r | |
72 | \r | |
73 | /***********************************************************************\r | |
74 | *\r | |
75 | * binloader.c - IBM 7090 emulator binary loader routines for ASM7090\r | |
76 | * and LNK7090 object files.\r | |
77 | *\r | |
78 | * Changes:\r | |
79 | * 10/20/03 DGP Original.\r | |
80 | * 12/28/04 DGP Changed for new object formats.\r | |
81 | * 02/14/05 DGP Detect IBSYSSYM for EOF.\r | |
82 | * 06/09/06 DGP Make simh callable.\r | |
83 | * \r | |
84 | ***********************************************************************/\r | |
85 | \r | |
86 | #include "i7094_defs.h"\r | |
87 | \r | |
88 | extern t_uint64 *M;\r | |
89 | extern uint32 PC;\r | |
90 | \r | |
91 | t_stat\r | |
92 | binloader (FILE *fd, char *file, int loadpt)\r | |
93 | {\r | |
94 | #ifdef DEBUGLOADER\r | |
95 | FILE *lfd;\r | |
96 | #endif\r | |
97 | int transfer = FALSE;\r | |
98 | int loadaddr = LOADADDR;\r | |
99 | int curraddr = LOADADDR;\r | |
100 | char inbuf[OBJRECLEN+2];\r | |
101 | \r | |
102 | #ifdef DEBUGLOADER\r | |
103 | lfd = fopen ("load.log", "w");\r | |
104 | fprintf (lfd, "binloader: file = '%s', loadpt = %d\n", file, loadpt);\r | |
105 | #endif\r | |
106 | \r | |
107 | if (loadpt > 0)\r | |
108 | {\r | |
109 | loadaddr = loadpt;\r | |
110 | curraddr = loadpt;\r | |
111 | }\r | |
112 | \r | |
113 | while (fgets (inbuf, sizeof(inbuf), fd))\r | |
114 | {\r | |
115 | char *op = inbuf;\r | |
116 | int i;\r | |
117 | \r | |
118 | if (*op == IBSYSSYM) /* End of object marker */\r | |
119 | break;\r | |
120 | \r | |
121 | for (i = 0; i < WORDPERREC; i++)\r | |
122 | {\r | |
123 | char otag;\r | |
124 | char item[16];\r | |
125 | t_uint64 ldata;\r | |
126 | \r | |
127 | otag = *op++;\r | |
128 | if (otag == ' ') break;\r | |
129 | strncpy (item, op, CHARWORD);\r | |
130 | item[CHARWORD] = '\0';\r | |
131 | #ifdef WIN32\r | |
132 | sscanf (item, "%I64o", &ldata);\r | |
133 | #else\r | |
134 | sscanf (item, "%llo", &ldata);\r | |
135 | #endif\r | |
136 | \r | |
137 | #ifdef DEBUGLOADER\r | |
138 | fprintf (lfd, "loadaddr = %05o, curraddr = %05o\n",\r | |
139 | loadaddr, curraddr);\r | |
140 | fprintf (lfd, " otag = %c, item = %s\n", otag, item);\r | |
141 | fprintf (lfd, " ldata = %12.12o\n", ldata);\r | |
142 | #endif\r | |
143 | \r | |
144 | switch (otag)\r | |
145 | {\r | |
146 | case IDT_TAG:\r | |
147 | break;\r | |
148 | \r | |
149 | case ABSORG_TAG:\r | |
150 | curraddr = loadaddr = (int32) ldata & AMASK;\r | |
151 | break;\r | |
152 | \r | |
153 | case RELORG_TAG:\r | |
154 | curraddr = (int32) (ldata + loadaddr) & AMASK;\r | |
155 | break;\r | |
156 | \r | |
157 | case BSS_TAG:\r | |
158 | curraddr = (int32) (curraddr + ldata) & AMASK;\r | |
159 | break;\r | |
160 | \r | |
161 | case RELBOTH_TAG:\r | |
162 | ldata = ldata + loadaddr + (loadaddr << INST_V_DEC);\r | |
163 | goto STORE;\r | |
164 | \r | |
165 | case RELDECR_TAG:\r | |
166 | ldata = ldata + (loadaddr << INST_V_DEC);\r | |
167 | goto STORE;\r | |
168 | \r | |
169 | case RELADDR_TAG:\r | |
170 | ldata = ldata + loadaddr;\r | |
171 | \r | |
172 | case ABSDATA_TAG:\r | |
173 | STORE:\r | |
174 | #ifdef DEBUGLOADER\r | |
175 | fprintf (lfd, " M[%05o] = %12.12o\n", curraddr, ldata);\r | |
176 | #endif\r | |
177 | M[curraddr] = ldata & DMASK;\r | |
178 | curraddr++;\r | |
179 | break;\r | |
180 | \r | |
181 | case ABSXFER_TAG:\r | |
182 | transfer = TRUE;\r | |
183 | case ABSENTRY_TAG:\r | |
184 | PC = (uint32) ldata & AMASK;\r | |
185 | #ifdef DEBUGLOADER\r | |
186 | fprintf (lfd, " PC = %05o\n", PC);\r | |
187 | #endif\r | |
188 | if (transfer) goto GOSTART;\r | |
189 | break;\r | |
190 | \r | |
191 | case RELXFER_TAG:\r | |
192 | transfer = TRUE;\r | |
193 | case RELENTRY_TAG:\r | |
194 | ldata = (ldata + loadaddr) & AMASK;\r | |
195 | PC = (uint32) ldata & AMASK;\r | |
196 | #ifdef DEBUGLOADER\r | |
197 | fprintf (lfd, " PC = %05o\n", PC);\r | |
198 | #endif\r | |
199 | if (transfer) goto GOSTART;\r | |
200 | break;\r | |
201 | \r | |
202 | default: ;\r | |
203 | }\r | |
204 | op += CHARWORD;\r | |
205 | }\r | |
206 | }\r | |
207 | \r | |
208 | GOSTART:\r | |
209 | #ifdef DEBUGLOADER\r | |
210 | fclose (lfd);\r | |
211 | #endif\r | |
212 | \r | |
213 | return SCPE_OK;\r | |
214 | }\r |