Macros for relocated procs

This commit is contained in:
Joshua Bell 2019-03-30 08:21:34 -07:00
parent 8b66a9faa0
commit d15e52eb53
4 changed files with 33 additions and 13 deletions

View File

@ -1598,9 +1598,7 @@ draw_title_bar:
.endproc
;; Following proc is copied to $B1
save_org := *
.proc adjust_txtptr_copied
.org $B1
PROC_AT adjust_txtptr_copied, $B1
dummy_addr := $EA60
loop: inc TXTPTR
@ -1619,8 +1617,7 @@ loop: inc TXTPTR
sec
sbc #$D0 ; carry set if successful
end: rts
.endproc
.org save_org + .sizeof(adjust_txtptr_copied)
END_PROC_AT
sizeof_adjust_txtptr_copied = .sizeof(adjust_txtptr_copied)
da_end := *

View File

@ -899,9 +899,7 @@ path0: .res 65, 0
;;; Launch FILER - used if machine is not 128k
;;; Relocated to $300 before invoking
saved_org := *
.proc launch_filer
.org $300
PROC_AT launch_filer, $300
sys_start := $2000
@ -931,13 +929,12 @@ path0: .res 65, 0
filename:
PASCAL_STRING "FILER"
.endproc
END_PROC_AT
.assert .sizeof(launch_filer) <= $D0, error, "Routine length exceeded"
;;; ============================================================
.org (saved_org + .sizeof(launch_filer))
filenum:
.byte 0 ; index of file being copied

View File

@ -675,6 +675,30 @@ loop: lda src,x
.endmacro
;;; ============================================================
;;; Placed Procedures
;;; ============================================================
;;; Usage:
;;; PROC_AT relocated_proc, $300
;;; .assert * = $300, ...
;;; ...
;;; END_PROC_AT
;;; .assert * = back to normal
.macro PROC_AT name, addr
.proc name
saved_org := *
.org addr
.proc __inner__
.endmacro
.macro END_PROC_AT
.endproc ; __inner__
.org saved_org + .sizeof(__inner__)
.endproc
.endmacro
;;; ============================================================
;;; Flow Control
;;; ============================================================

View File

@ -57,14 +57,16 @@ while (<STDIN>) {
$_ .= ' ' while length($_) % $tab;
$_ .= ':= ' . $expression . ' ';
} elsif (m/^(\.(?:end)?(?:proc|scope|macro|struct|enum)\b)\s*(.*)$/) {
} elsif (m/^(\.(?:end)?(?:proc|scope|macro|struct|enum)\b)\s*(.*)$/ ||
m/^(\b(?:END_)?(?:PROC_AT)\b)\s*(.*)$/) {
# scope - flush left
my ($opcode, $arguments) = ($1 // '', $2 // '');
$_ = $opcode . ' ' . $arguments;
} elsif (m/^(\.(?:if\w*|elseif|else|endif)\b)\s*(.*)$/) {
} elsif (m/^(\.(?:if\w*|elseif|else|endif)\b)\s*(.*)$/ ||
m/^(\b(?:IF_\w+|ELSE|END_IF)\b)\s*(.*)$/) {
# conditional - half indent left
my ($opcode, $arguments) = ($1 // '', $2 // '');