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**));
69 result
=(char **)realloc(result
, (c
+1)* sizeof(char**));
76 void dispose_labels(char ** labels
){
77 if (labels
==NULL
) return;
81 } while (labels
[c
]!=NULL
);
86 char * extract_label6(datablock
* block
){
88 block_copy(&myblock
,block
);
89 char * dat
=(char *) myblock
.data
;
90 twistbytes (myblock
.data
+ 1, 4);
91 parstrip (dat
+ 3, 6);
92 char *akt
= malloc(7);
93 memcpy (akt
, dat
+ 3, 6);
96 free (myblock
.raw_data
);
102 void process_block (datablock
* orgblock
)
104 if (orgblock
->type
==BT_STOP
){
105 say("**************** ENDBLOCK ****************");
109 if (orgblock
->type
!=BT_DATA
) return;
112 block_copy(&block
, orgblock
);
114 hw16
* data
= block
.data
;
116 int type
= get_blocktype(&block
);
117 int subtype
= get_blocksubtype(&block
);
119 msg ("process_block(): Start");
120 msgf ("process_block(): Blocktyp: %o", type
);
122 msgf ("process_block(): Subtyp (oct): %o",
123 block
.data
[0].blocktype
.t0_subtype
);
127 head0
*head
= (head0
*) data
;
132 char ** labels
=extract_labels0(&block
);
134 char * akt
= labels
[c
++];
136 sayf ("%6s (0-0) subprogram name", akt
);
138 sayf ("%s (0-0) \" \"", akt
);
139 } while (labels
[c
]!=NULL
);
140 dispose_labels(labels
);
144 say (" (0-1) non-load flag off");
147 say (" (0-2) chain flag on");
150 say (" (0-3) end of job");
156 #ifdef DEBUG_DATA_PLAIN
158 int words24
= (block
.size
- 4) * 2 / 3;
160 for (c
= 3; c
< (block
.size
- 1); c
++) {
161 msgf ("Datenwort(hex): %04x Und (bin):%s", data
[c
].value
,
162 bin2str (data
[c
].value
, 16));
168 int words24
= (block
.size
- 4) * 2 / 3;
169 msgf ("WORDS:%02i", words24
);
170 msgf ("BASE (oct):%06o", data
[2].value
);
172 twistbytes (data
+ 3, (block
.size
- 4));
173 for (c
= 0; c
< (words24
); c
++) {
174 // sayf("Nummer:%5i",c);
175 unsigned int dhigh
= ((unsigned char *) data
)[6 + 3 * c
];
176 unsigned int dmid
= ((unsigned char *) data
)[7 + 3 * c
];
177 unsigned int dlow
= ((unsigned char *) data
)[8 + 3 * c
];
178 type_0_4_data mydata
;
180 mydata
.value
+= dhigh
<< 16;
181 mydata
.value
+= dmid
<< 8;
182 mydata
.value
+= dlow
<< 0;
183 // msgf("Daten: %08o %06x",(unsigned long)mydata.value,mydata.value);
184 switch (mydata
.generic
.type
) {
185 case 0: //generic/unmodified data
186 sayf ("%06o Generic/unmodified data",
187 mydata
.generic
.data
);
189 case 1: //Address is known and to be desectorized
192 sayf ("%o %o %02o %05o (%1o) Known address",
193 mydata
.op_known_address
.F
,
194 mydata
.op_known_address
.T
,
195 mydata
.op_known_address
.OP
,
196 mydata
.op_known_address
.ADDRESS
,
197 mydata
.op_known_address
.R
);
199 case 2: // Symbolic Address, to be desectorized
200 sayf ("%o %o %02o %05o Symbolic address",
201 mydata
.op_symbolic_address
.F
,
202 mydata
.op_symbolic_address
.T
,
203 mydata
.op_symbolic_address
.OP
,
204 mydata
.op_symbolic_address
.SYMBOL_NUMBER
);
206 case 4: // Address ist known, do not desectorize
208 sayf ("%o %o %06o Address known, not to be desectorized", mydata
.known_address
.F
, mydata
.known_address
.T
, mydata
.known_address
.ADDRESS
);
210 case 6: //Symbolic Address, not to be desctorized when known
211 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
);
215 say ("There is an error in the 0-4 type word!");
223 say (" (0-10) symbol number definition block");
230 say (" (0-24) switch to relocateable mode");
233 say (" (0-30) switch to absolute mode");
236 say (" (0-54) enter extended-memory desectorizing mode");
239 say (" (0-60) leave extended-memory desectorizing mode");
244 parstrip ((char *) data
+ 4, 6);
245 twistbytes (data
+ 2, 3);
246 char akt
[7] = "SYMBOL";
247 memcpy (akt
, ((char *) data
) + 4, 6);
249 sayf ("%s (0-44) subprogram call", akt
);
255 parstrip ((char *) data
+ 4, (block
.size
- 3) * 2);
256 twistbytes (data
+ 2, block
.size
- 3);
257 for (c
= 0; c
< (head
->N
- 3) / 3; c
++) {
258 char akt
[7] = "SYMBOL";
259 memcpy (akt
, ((char *) data
) + 4 + c
* 6, 6);
261 sayf ("%s (0-50) subprogram entry point definition",
264 sayf ("%s (0-50) \" \"", akt
);
271 say (" (0-64) set base sector");
274 errf ("Unbekannter Blocktyp! (0-%0o)", subtype
);
281 say (" (1) absolute program words");
284 say (" (2) relative program words");
287 say (" (3) end jump (absolute)");
290 say (" (4) end jump (relative)");
293 char * dat
=(char *) data
;
294 twistbytes (data
+ 1, 4);
295 parstrip (dat
+ 3, 6);
296 char akt
[7] = "SYMBOL";
297 memcpy (akt
, dat
+ 3, 6);
298 twistbytes (data
+ 1, 4);
300 sayf ("%s (5) subroutine call", akt
);
305 char * dat
=(char *) data
;
306 twistbytes (data
+ 1, 4);
307 parstrip (dat
+ 3, 6);
308 char akt
[7] = "SYMBOL";
309 memcpy (akt
, dat
+ 3, 6);
310 twistbytes (data
+ 1, 4);
311 sayf ("%s (6) subroutine or common block definition",akt
);
316 char * dat
=(char *) data
; // Get byte pointer
317 twistbytes (data
+ 1, 4); // Do the endian thing
318 parstrip ((char *) data
+ 3, 6); // Strip parity bits away
319 char akt
[7] = "SYMBOL";
320 memcpy (akt
, dat
+ 3, 6); // Take the name
321 twistbytes (data
+ 1, 4); // repair the head
322 sayf ("%s (7) reference (call) to common item", akt
);
328 err ("Unbekannter Blocktyp!");