3 #include "hw_helpers.h"
8 /**********************************************************************/
10 int get_blocktype (datablock
* block
){
11 return block
->data
[0].blocktype
.type
;
14 int get_blocksubtype(datablock
* block
){
15 if (block
->data
[0].blocktype
.type
!=0) return 0;
16 return block
->data
[0].blocktype
.t0_subtype
;
19 void block_copy(datablock
* dest
, datablock
* src
){
20 dest
->data
= (hw16
*) malloc (src
->size
* sizeof (hw16
));
21 dest
->raw_data
= (unsigned char *) malloc (src
->size
* 3 );
23 memcpy (dest
->data
, src
->data
, src
->size
* sizeof (hw16
));
24 memcpy (dest
->raw_data
, src
->raw_data
, src
->size
* 3);
28 datablock
* block_clone(datablock
* orgblock
){
29 datablock
* block
= (datablock
*) malloc (sizeof (datablock
));
30 block_copy(block
,orgblock
);
34 void block_dispose(datablock
* victim
){
36 free(victim
->raw_data
);
40 char ** extract_labels0(datablock
* blockp
){
41 char ** result
=(char **) malloc (sizeof(char **));
43 if (get_blocktype(blockp
)!=0) return NULL
;
46 block_copy(&block
,blockp
);
48 hw16
* data
= block
.data
;
50 parstrip ((char *)data
+4, (block
.size
- 3) * 2);
51 twistbytes (data
+ 2, block
.size
- 3);
52 for (c
= 0; c
< (((head0
*)data
)->N
- 3) / 3; c
++) {
54 memcpy (akt
, ((char *) data
) + 4 + c
* 6, 6);
59 while (akt
[dd
]==' ') akt
[dd
--]=0; // hinten kürzen;
61 while (akt
[dd
]==' ') dd
++; // vorne kürzen;
62 char * aktres
= malloc(strlen(akt
+dd
)+1);
64 strncpy (aktres
,akt
+dd
,strlen(akt
+dd
));
65 result
=(char **)realloc(result
, (c
+1)* sizeof(char**));
67 // printf("akt: %s\n",result[c]);
69 result
=(char **)realloc(result
, (c
+1)* sizeof(char**));
76 void dispose_labels(char ** labels
){
78 if (labels
==NULL
) return;
82 } while (labels
[c
]!=NULL
);
87 char * extract_label6(datablock
* block
){
89 block_copy(&myblock
,block
);
90 char * dat
=(char *) myblock
.data
;
91 twistbytes (myblock
.data
+ 1, 4);
92 parstrip (dat
+ 3, 6);
93 char *akt
= malloc(7);
94 memcpy (akt
, dat
+ 3, 6);
97 free (myblock
.raw_data
);
103 void process_block (datablock
* orgblock
)
105 if (orgblock
->type
==BT_STOP
){
106 say("**************** ENDBLOCK ****************");
110 if (orgblock
->type
!=BT_DATA
) return;
113 block_copy(&block
, orgblock
);
115 hw16
* data
= block
.data
;
117 int type
= get_blocktype(&block
);
118 int subtype
= get_blocksubtype(&block
);
120 msg ("process_block(): Start");
121 msgf ("process_block(): Blocktyp: %o", type
);
123 msgf ("process_block(): Subtyp (oct): %o",
124 block
.data
[0].blocktype
.t0_subtype
);
128 head0
*head
= (head0
*) data
;
133 char ** labels
=extract_labels0(&block
);
135 char * akt
= labels
[c
++];
137 sayf ("%6s (0-0) subprogram name", akt
);
139 sayf ("%s (0-0) \" \"", akt
);
140 } while (labels
[c
]!=NULL
);
141 dispose_labels(labels
);
145 say (" (0-1) non-load flag off");
148 say (" (0-2) chain flag on");
151 say (" (0-3) end of job");
157 #ifdef DEBUG_DATA_PLAIN
159 int words24
= (block
.size
- 4) * 2 / 3;
161 for (c
= 3; c
< (block
.size
- 1); c
++) {
162 msgf ("Datenwort(hex): %04x Und (bin):%s", data
[c
].value
,
163 bin2str (data
[c
].value
, 16));
169 int words24
= (block
.size
- 4) * 2 / 3;
170 msgf ("WORDS:%02i", words24
);
171 msgf ("BASE (oct):%06o", data
[2].value
);
173 twistbytes (data
+ 3, (block
.size
- 4));
174 for (c
= 0; c
< (words24
); c
++) {
175 // sayf("Nummer:%5i",c);
176 unsigned int dhigh
= ((unsigned char *) data
)[6 + 3 * c
];
177 unsigned int dmid
= ((unsigned char *) data
)[7 + 3 * c
];
178 unsigned int dlow
= ((unsigned char *) data
)[8 + 3 * c
];
179 type_0_4_data mydata
;
181 mydata
.value
+= dhigh
<< 16;
182 mydata
.value
+= dmid
<< 8;
183 mydata
.value
+= dlow
<< 0;
184 // msgf("Daten: %08o %06x",(unsigned long)mydata.value,mydata.value);
185 switch (mydata
.generic
.type
) {
186 case 0: //generic/unmodified data
187 sayf ("%06o Generic/unmodified data",
188 mydata
.generic
.data
);
190 case 1: //Address is known and to be desectorized
193 sayf ("%o %o %02o %05o (%1o) Known address",
194 mydata
.op_known_address
.F
,
195 mydata
.op_known_address
.T
,
196 mydata
.op_known_address
.OP
,
197 mydata
.op_known_address
.ADDRESS
,
198 mydata
.op_known_address
.R
);
200 case 2: // Symbolic Address, to be desectorized
201 sayf ("%o %o %02o %05o Symbolic address",
202 mydata
.op_symbolic_address
.F
,
203 mydata
.op_symbolic_address
.T
,
204 mydata
.op_symbolic_address
.OP
,
205 mydata
.op_symbolic_address
.SYMBOL_NUMBER
);
207 case 4: // Address ist known, do not desectorize
209 sayf ("%o %o %06o Address known, not to be desectorized", mydata
.known_address
.F
, mydata
.known_address
.T
, mydata
.known_address
.ADDRESS
);
211 case 6: //Symbolic Address, not to be desctorized when known
212 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
);
216 say ("There is an error in the 0-4 type word!");
224 say (" (0-10) symbol number definition block");
231 say (" (0-24) switch to relocateable mode");
234 say (" (0-30) switch to absolute mode");
237 say (" (0-54) enter extended-memory desectorizing mode");
240 say (" (0-60) leave extended-memory desectorizing mode");
245 parstrip ((char *) data
+ 4, 6);
246 twistbytes (data
+ 2, 3);
247 char akt
[7] = "SYMBOL";
248 memcpy (akt
, ((char *) data
) + 4, 6);
250 sayf ("%s (0-44) subprogram call", akt
);
256 parstrip ((char *) data
+ 4, (block
.size
- 3) * 2);
257 twistbytes (data
+ 2, block
.size
- 3);
258 for (c
= 0; c
< (head
->N
- 3) / 3; c
++) {
259 char akt
[7] = "SYMBOL";
260 memcpy (akt
, ((char *) data
) + 4 + c
* 6, 6);
262 sayf ("%s (0-50) subprogram entry point definition",
265 sayf ("%s (0-50) \" \"", akt
);
272 say (" (0-64) set base sector");
275 errf ("Unbekannter Blocktyp! (0-%0o)", subtype
);
282 say (" (1) absolute program words");
285 say (" (2) relative program words");
288 say (" (3) end jump (absolute)");
291 say (" (4) end jump (relative)");
294 char * dat
=(char *) data
;
295 twistbytes (data
+ 1, 4);
296 parstrip (dat
+ 3, 6);
297 char akt
[7] = "SYMBOL";
298 memcpy (akt
, dat
+ 3, 6);
299 twistbytes (data
+ 1, 4);
301 sayf ("%s (5) subroutine call", akt
);
306 char * dat
=(char *) data
;
307 twistbytes (data
+ 1, 4);
308 parstrip (dat
+ 3, 6);
309 char akt
[7] = "SYMBOL";
310 memcpy (akt
, dat
+ 3, 6);
311 twistbytes (data
+ 1, 4);
314 sayf ("%s (6) subroutine or common block definition",akt
);
320 parstrip ((char *) data
+ 3, 6);
321 twistbytes (data
+ 1, 4);
322 char akt
[7] = "SYMBOL";
323 memcpy (akt
, ((char *) data
) + 3, 6);
324 twistbytes (data
+ 1, 4);
326 sayf ("%s (7) reference (call) to common item", akt
);
332 err ("Unbekannter Blocktyp!");