• R/O
  • HTTP
  • SSH
  • HTTPS

提交

标签
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

MOT6502 assembler, disassembler and linker


Commit MetaInfo

修订版aac452baec823df12fe6c14624e8a85a035ef830 (tree)
时间2013-02-08 16:10:58
作者astoria-d <astoria-d@my-s...>
Commiterastoria-d

Log Message

fill the segment to align the segment size.

更改概述

差异

--- a/linker/linker.c
+++ b/linker/linker.c
@@ -217,12 +217,18 @@ int load_object (const char* obj_fname) {
217217
218218 static int resolve_symbol(const char* symname) {
219219 ////not worked yet...
220+#warning must work resove_symbol!!!
220221 return FALSE;
221222 }
222223
223224 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;
226232 while (pseg != NULL) {
227233 FILE *objfp = pseg->fp;
228234 int ret;
@@ -230,8 +236,24 @@ int link_segment(FILE* outf) {
230236 int read_size = 0;
231237 int len, total_len;
232238
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);*/
235257
236258 ret = fseek(objfp, pseg->segpos, SEEK_SET);
237259 if (ret)
@@ -255,9 +277,21 @@ int link_segment(FILE* outf) {
255277 if ( total_len != pseg->segsize ) {
256278 return FALSE;
257279 }
280+ seg_total_size += total_len;
258281
282+ pp = pseg;
283+ pp_addr = conf_addr;
284+ pp_size = conf_size;
259285 pseg = (struct seginfo*) pseg->list.next;
260286 }
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+
261295 return TRUE;
262296 }
263297
--- a/linker/linkmap
+++ b/linker/linkmap
@@ -1,6 +1,6 @@
11 #segment name, start address, size
2-HEADER 0x0000 0x0010
3-STARTUP 0x8000 0x1000
2+HEADER 0x0000 0x0010
3+STARTUP 0x8000 0x0FFA
44 VECINFO 0xfffa 0x0006
55 CHARS 0x0000 0x2000
6-<default> 0x8000 0x1000
6+<default> 0x8000 0x0ffa
--- a/linker/lmap.c
+++ b/linker/lmap.c
@@ -1,6 +1,7 @@
11
22 #include <stdio.h>
33 #include <stdlib.h>
4+#include <string.h>
45 #include "tools.h"
56
67 #define BUF_SIZE 100