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

View File

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

View File

@ -675,6 +675,30 @@ loop: lda src,x
.endmacro .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 ;;; Flow Control
;;; ============================================================ ;;; ============================================================

View File

@ -57,14 +57,16 @@ while (<STDIN>) {
$_ .= ' ' while length($_) % $tab; $_ .= ' ' while length($_) % $tab;
$_ .= ':= ' . $expression . ' '; $_ .= ':= ' . $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 # scope - flush left
my ($opcode, $arguments) = ($1 // '', $2 // ''); my ($opcode, $arguments) = ($1 // '', $2 // '');
$_ = $opcode . ' ' . $arguments; $_ = $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 # conditional - half indent left
my ($opcode, $arguments) = ($1 // '', $2 // ''); my ($opcode, $arguments) = ($1 // '', $2 // '');