| 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 |