3 #include "hw_helpers.h"
9 /**********************************************************************/
12 int get_blocktype (datablock
* block
){
13 return block
->data
[0].blocktype
.type
;
16 int get_blocksubtype(datablock
* block
){
17 if (block
->data
[0].blocktype
.type
!=0) return 0;
18 return block
->data
[0].blocktype
.t0_subtype
;
21 void block_copy(datablock
* dest
, datablock
* src
){
22 dest
->data
= (hw16
*) malloc (src
->size
* sizeof (hw16
));
23 dest
->raw_data
= (unsigned char *) malloc (src
->size
* 3 );
25 memcpy (dest
->data
, src
->data
, src
->size
* sizeof (hw16
));
26 memcpy (dest
->raw_data
, src
->raw_data
, src
->size
* 3);
30 datablock
* block_clone(datablock
* orgblock
){
31 datablock
* block
= (datablock
*) malloc (sizeof (datablock
));
32 block_copy(block
,orgblock
);
36 void block_dispose(datablock
* victim
){
38 free(victim
->raw_data
);
42 char ** extract_labels0(datablock
* blockp
){
43 char ** result
=(char **) malloc (sizeof(char **));
45 if (get_blocktype(blockp
)!=0) return NULL
;
48 block_copy(&block
,blockp
);
50 hw16
* data
= block
.data
;
52 parstrip ((char *)data
+4, (block
.size
- 3) * 2);
53 twistbytes (data
+ 2, block
.size
- 3);
54 for (c
= 0; c
< (((head0
*)data
)->N
- 3) / 3; c
++) {
56 memcpy (akt
, ((char *) data
) + 4 + c
* 6, 6);
60 while (akt
[dd
]==' ') akt
[dd
--]=0; // hinten kürzen;
62 while (akt
[dd
]==' ') dd
++; // vorne kürzen;
63 char * aktres
= malloc(strlen(akt
+dd
)+1);
65 strncpy (aktres
,akt
+dd
,strlen(akt
+dd
));
66 result
=(char **)realloc(result
, (c
+1)* sizeof(char**));
68 // printf("akt: %s\n",result[c]);
70 result
=(char **)realloc(result
, (c
+1)* sizeof(char**));
77 void dispose_labels(char ** labels
){
79 if (labels
==NULL
) return;
83 } while (labels
[c
]!=NULL
);
88 char * extract_label6(datablock
* block
){
90 block_copy(&myblock
,block
);
91 char * dat
=(char *) myblock
.data
;
92 twistbytes (myblock
.data
+ 1, 4);
93 parstrip (dat
+ 3, 6);
94 char *akt
= malloc(7);
95 memcpy (akt
, dat
+ 3, 6);
98 free (myblock
.raw_data
);
104 void process_block (datablock
* orgblock
)
106 if (orgblock
->type
==BT_STOP
){
107 say("**************** ENDBLOCK ****************");
111 if (orgblock
->type
!=BT_DATA
) return;
114 block_copy(&block
, orgblock
);
116 hw16
* data
= block
.data
;
118 int type
= get_blocktype(&block
);
119 int subtype
= get_blocksubtype(&block
);
121 msg ("process_block(): Start");
122 msgf ("process_block(): Blocktyp: %o", type
);
124 msgf ("process_block(): Subtyp (oct): %o",
125 block
.data
[0].blocktype
.t0_subtype
);
129 head0
*head
= (head0
*) data
;
134 char ** labels
=extract_labels0(&block
);
136 char * akt
= labels
[c
++];
138 sayf ("%6s (0-0) subprogram name", akt
);
140 sayf ("%s (0-0) \" \"", akt
);
141 } while (labels
[c
]!=NULL
);
142 dispose_labels(labels
);
146 say (" (0-1) non-load flag off");
149 say (" (0-2) chain flag on");
152 say (" (0-3) end of job");
158 #ifdef DEBUG_DATA_PLAIN
160 int words24
= (block
.size
- 4) * 2 / 3;
162 for (c
= 3; c
< (block
.size
- 1); c
++) {
163 msgf ("Datenwort(hex): %04x Und (bin):%s", data
[c
].value
,
164 bin2str (data
[c
].value
, 16));
170 int words24
= (block
.size
- 4) * 2 / 3;
171 msgf ("WORDS:%02i", words24
);
172 msgf ("BASE (oct):%06o", data
[2].value
);
174 twistbytes (data
+ 3, (block
.size
- 4));
175 for (c
= 0; c
< (words24
); c
++) {
176 // sayf("Nummer:%5i",c);
177 unsigned int dhigh
= ((unsigned char *) data
)[6 + 3 * c
];
178 unsigned int dmid
= ((unsigned char *) data
)[7 + 3 * c
];
179 unsigned int dlow
= ((unsigned char *) data
)[8 + 3 * c
];
180 type_0_4_data mydata
;
182 mydata
.value
+= dhigh
<< 16;
183 mydata
.value
+= dmid
<< 8;
184 mydata
.value
+= dlow
<< 0;
185 // msgf("Daten: %08o %06x",(unsigned long)mydata.value,mydata.value);
186 switch (mydata
.generic
.type
) {
187 case 0: //generic/unmodified data
188 sayf ("%06o Generic/unmodified data",
189 mydata
.generic
.data
);
191 case 1: //Address is known and to be desectorized
194 sayf ("%o %o %02o %05o (%1o) Known address",
195 mydata
.op_known_address
.F
,
196 mydata
.op_known_address
.T
,
197 mydata
.op_known_address
.OP
,
198 mydata
.op_known_address
.ADDRESS
,
199 mydata
.op_known_address
.R
);
201 case 2: // Symbolic Address, to be desectorized
202 sayf ("%o %o %02o %05o Symbolic address",
203 mydata
.op_symbolic_address
.F
,
204 mydata
.op_symbolic_address
.T
,
205 mydata
.op_symbolic_address
.OP
,
206 mydata
.op_symbolic_address
.SYMBOL_NUMBER
);
208 case 4: // Address ist known, do not desectorize
210 sayf ("%o %o %06o Address known, not to be desectorized", mydata
.known_address
.F
, mydata
.known_address
.T
, mydata
.known_address
.ADDRESS
);
212 case 6: //Symbolic Address, not to be desctorized when known
213 sayf ("%o %o %05o Symbolic Address, not to be desectorized when the address is known", mydata
.symbolic_address
.F
, mydata
.symbolic_address
.T
, mydata
.symbolic_address
.SYMBOL_NUMBER
);
217 say ("There is an error in the 0-4 type word!");
225 say (" (0-10) symbol number definition block");
232 say (" (0-24) switch to relocateable mode");
235 say (" (0-30) switch to absolute mode");
238 say (" (0-54) enter extended-memory desectorizing mode");
241 say (" (0-60) leave extended-memory desectorizing mode");
246 parstrip ((char *) data
+ 4, 6);
247 twistbytes (data
+ 2, 3);
248 char akt
[7] = "SYMBOL";
249 memcpy (akt
, ((char *) data
) + 4, 6);
251 sayf ("%s (0-44) subprogram call", akt
);
257 parstrip ((char *) data
+ 4, (block
.size
- 3) * 2);
258 twistbytes (data
+ 2, block
.size
- 3);
259 for (c
= 0; c
< (head
->N
- 3) / 3; c
++) {
260 char akt
[7] = "SYMBOL";
261 memcpy (akt
, ((char *) data
) + 4 + c
* 6, 6);
263 sayf ("%s (0-50) subprogram entry point definition",
266 sayf ("%s (0-50) \" \"", akt
);
273 say (" (0-64) set base sector");
276 errf ("Unbekannter Blocktyp! (0-%0o)", subtype
);
283 say (" (1) absolute program words");
286 say (" (2) relative program words");
289 say (" (3) end jump (absolute)");
292 say (" (4) end jump (relative)");
295 char * dat
=(char *) data
;
296 twistbytes (data
+ 1, 4);
297 parstrip (dat
+ 3, 6);
298 char akt
[7] = "SYMBOL";
299 memcpy (akt
, dat
+ 3, 6);
300 twistbytes (data
+ 1, 4);
302 sayf ("%s (5) subroutine call", akt
);
307 char * dat
=(char *) data
;
308 twistbytes (data
+ 1, 4);
309 parstrip (dat
+ 3, 6);
310 char akt
[7] = "SYMBOL";
311 memcpy (akt
, dat
+ 3, 6);
312 twistbytes (data
+ 1, 4);
313 sayf ("%s (6) subroutine or common block definition",akt
);
318 char * dat
=(char *) data
; // Get byte pointer
319 twistbytes (data
+ 1, 4); // Do the endian thing
320 parstrip ((char *) data
+ 3, 6); // Strip parity bits away
321 char akt
[7] = "SYMBOL";
322 memcpy (akt
, dat
+ 3, 6); // Take the name
323 twistbytes (data
+ 1, 4); // repair the head
324 sayf ("%s (7) reference (call) to common item", akt
);
330 err ("Unbekannter Blocktyp!");