macro/util changes to support reserved space after loaded command

This commit is contained in:
mgcaret 2018-12-12 08:57:36 -08:00
parent 5305beb715
commit 2f36ecc007
2 changed files with 23 additions and 5 deletions

View File

@ -59,7 +59,7 @@ dx_desc_none = 0
; if the Load address is zero, we don't export X_DX_LOAD ; if the Load address is zero, we don't export X_DX_LOAD
; so that later we can calculate an appropriate start addr ; so that later we can calculate an appropriate start addr
; and let the linker do it. ; and let the linker do it.
.macro DX_start Load .macro DX_start Load,Resv
.ifdef DID_DX_start .ifdef DID_DX_start
.warning "DX_start used more than once" .warning "DX_start used more than once"
.else .else
@ -74,6 +74,13 @@ dx_desc_none = 0
X_DX_AUTO_LOAD = 1 X_DX_AUTO_LOAD = 1
.endif .endif
X_DX_LOAD := * X_DX_LOAD := *
.ifblank Resv
X_DX_RESV = 0
.else
X_DX_RESV = Resv
.out .sprintf("Reserving %d bytes", Resv)
.endif
.export X_DX_RESV
ext_start: ext_start:
rts rts
.byte $ee, $ee .byte $ee, $ee
@ -153,7 +160,7 @@ X_DX_DESC: .byte .strlen(Desc)
.error "DX_start not used" .error "DX_start not used"
.endif .endif
X_DX_END = * X_DX_END = *
X_DX_SIZE = X_DX_END - X_DX_LOAD X_DX_SIZE = X_DX_END - X_DX_LOAD + X_DX_RESV
DID_YOU_DX_end = 1 DID_YOU_DX_end = 1
.ifndef DID_DX_info .ifndef DID_DX_info
.error "DX_info not used" .error "DX_info not used"
@ -169,12 +176,17 @@ X_DX_DESC: .byte .strlen(Desc)
X_DX_DESC := 0 X_DX_DESC := 0
.endif .endif
.ifndef X_DX_AUTO_LOAD .ifndef X_DX_AUTO_LOAD
.out .sprintf("Code ends at $%x, size $%x", X_DX_END, X_DX_SIZE) .out .sprintf("Code ends at $%x, size $%x (%x resv)", X_DX_END, X_DX_SIZE, X_DX_RESV)
.assert * < $b000, error, "Code is past $b000!" .assert * < $b000, error, "Code is past $b000!"
.if * < $af00 .if (X_DX_END+X_DX_RESV) < $af00
.out "Consider moving code start to place end shortly before $b000" .out "Consider moving code start to place end shortly before $b000"
.out .sprintf("Perhaps at $%x", ($b000-X_DX_SIZE)&$ff00) .out .sprintf("Perhaps at $%x", ($b000-X_DX_SIZE)&$ff00)
.endif .endif
.if (X_DX_END+X_DX_RESV) > $afff
.out "Code overruns available space, consider moving code start"
.out .sprintf("Perhaps at $%x", ($b000-X_DX_SIZE)&$ff00)
.error "Cannot continue"
.endif
.else .else
.out .sprintf("Auto load address, size $%x", X_DX_SIZE) .out .sprintf("Auto load address, size $%x", X_DX_SIZE)
.endif .endif

View File

@ -63,7 +63,13 @@ else
exit 4 exit 4
fi fi
echo "Code size: ${CODE_SIZE}" echo "Code size: ${CODE_SIZE}"
START=$(( (${END_FENCE} - ${CODE_SIZE}) / 256 * 256 )) RESERVE=0
RESV=`${OD65} --dump-exports ${OBJECT_FILE} | awk -F'(' 'f{print substr(\$2,1,length(\$2)-1);f=0} /X_DX_RESV/{f=1}'`
if [ -n "${RESV}" ]; then
RESERVE="${RESV}"
echo "Reserve: ${RESERVE}"
fi
START=$(( (${END_FENCE} - ${CODE_SIZE} - ${RESERVE}) / 256 * 256 ))
if [ -z "${START}" ]; then if [ -z "${START}" ]; then
echo "Could not calculate a start address!" echo "Could not calculate a start address!"
exit 4 exit 4