diff --git a/desk.acc/calculator.s b/desk.acc/calculator.s index 0b891d4..7912c81 100644 --- a/desk.acc/calculator.s +++ b/desk.acc/calculator.s @@ -1526,9 +1526,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 @@ -1547,8 +1545,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) diff --git a/macros.inc b/macros.inc index d9edc64..cfb3c55 100644 --- a/macros.inc +++ b/macros.inc @@ -679,6 +679,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 ;;; ============================================================ diff --git a/res/asmfmt.pl b/res/asmfmt.pl index 633c154..c16229a 100755 --- a/res/asmfmt.pl +++ b/res/asmfmt.pl @@ -57,14 +57,16 @@ while () { $_ .= ' ' 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 // '');