MOT6502 assembler, disassembler and linker
修订版 | aac452baec823df12fe6c14624e8a85a035ef830 (tree) |
---|---|
时间 | 2013-02-08 16:10:58 |
作者 | astoria-d <astoria-d@my-s...> |
Commiter | astoria-d |
fill the segment to align the segment size.
@@ -217,12 +217,18 @@ int load_object (const char* obj_fname) { | ||
217 | 217 | |
218 | 218 | static int resolve_symbol(const char* symname) { |
219 | 219 | ////not worked yet... |
220 | +#warning must work resove_symbol!!! | |
220 | 221 | return FALSE; |
221 | 222 | } |
222 | 223 | |
223 | 224 | int link_segment(FILE* outf) { |
224 | - struct seginfo* pseg; | |
225 | - pseg = seg_list; | |
225 | + struct seginfo* pseg, *pp; | |
226 | + unsigned short conf_addr, conf_size, pp_addr, pp_size; | |
227 | + int seg_total_size = 0; | |
228 | + char tmp = 0; | |
229 | + | |
230 | + pp = pseg = seg_list; | |
231 | + pp_addr = pp_size = 0xffff; | |
226 | 232 | while (pseg != NULL) { |
227 | 233 | FILE *objfp = pseg->fp; |
228 | 234 | int ret; |
@@ -230,8 +236,24 @@ int link_segment(FILE* outf) { | ||
230 | 236 | int read_size = 0; |
231 | 237 | int len, total_len; |
232 | 238 | |
233 | - dprint("link seg: %s %d byte @ %04x from %04x\n", pseg->name, | |
234 | - pseg->segsize, pseg->segaddr, pseg->segpos); | |
239 | + | |
240 | + ret = lookup_lmap(pseg->name, &conf_addr, &conf_size); | |
241 | + if (!ret) | |
242 | + return FALSE; | |
243 | + | |
244 | + if (pseg != pp && (conf_addr != pp_addr || conf_size != pp_size)) { | |
245 | + if (pp_size - seg_total_size > 0) { | |
246 | + //dprint("fill %04x\n", pp_size - seg_total_size); | |
247 | + int i = 0; | |
248 | + tmp = 0; | |
249 | + for (i = 0; i < pp_size - seg_total_size; i++) | |
250 | + fwrite(&tmp, 1, 1, outf); | |
251 | + } | |
252 | + seg_total_size = 0; | |
253 | + } | |
254 | + | |
255 | + /*dprint("link seg: %10s @ %04x, %04x byte from %04x\n", pseg->name, | |
256 | + pseg->segaddr, pseg->segsize, pseg->segpos);*/ | |
235 | 257 | |
236 | 258 | ret = fseek(objfp, pseg->segpos, SEEK_SET); |
237 | 259 | if (ret) |
@@ -255,9 +277,21 @@ int link_segment(FILE* outf) { | ||
255 | 277 | if ( total_len != pseg->segsize ) { |
256 | 278 | return FALSE; |
257 | 279 | } |
280 | + seg_total_size += total_len; | |
258 | 281 | |
282 | + pp = pseg; | |
283 | + pp_addr = conf_addr; | |
284 | + pp_size = conf_size; | |
259 | 285 | pseg = (struct seginfo*) pseg->list.next; |
260 | 286 | } |
287 | + if (pp_size - seg_total_size > 0) { | |
288 | + int i = 0; | |
289 | + //dprint("fill %04x\n", pp_size - seg_total_size); | |
290 | + tmp = 0; | |
291 | + for (i = 0; i < pp_size - seg_total_size; i++) | |
292 | + fwrite(&tmp, 1, 1, outf); | |
293 | + } | |
294 | + | |
261 | 295 | return TRUE; |
262 | 296 | } |
263 | 297 |
@@ -1,6 +1,6 @@ | ||
1 | 1 | #segment name, start address, size |
2 | -HEADER 0x0000 0x0010 | |
3 | -STARTUP 0x8000 0x1000 | |
2 | +HEADER 0x0000 0x0010 | |
3 | +STARTUP 0x8000 0x0FFA | |
4 | 4 | VECINFO 0xfffa 0x0006 |
5 | 5 | CHARS 0x0000 0x2000 |
6 | -<default> 0x8000 0x1000 | |
6 | +<default> 0x8000 0x0ffa |
@@ -1,6 +1,7 @@ | ||
1 | 1 | |
2 | 2 | #include <stdio.h> |
3 | 3 | #include <stdlib.h> |
4 | +#include <string.h> | |
4 | 5 | #include "tools.h" |
5 | 6 | |
6 | 7 | #define BUF_SIZE 100 |