1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
; align.asm
; (C) 2004 Julian Albo
; This code may be freely used.
;--------------------------------------------------------------------
; Sample of macro that can be used to align the current position to
; a multiple of some number, like the align and aligndata directives
; of some oher assemblers.
;--------------------------------------------------------------------
align macro n
local newpos, oldpos
oldpos equ $
newpos equ (oldpos + n - 1) / n * n
if newpos < oldpos
.error Align out of memory
endif
; The second method is faster, the first can be used to align code
; in 8086 generation mode (code of NOP is not 00).
; If align of data and code is needed can be better to define another
; macro called aligndata.
if defined ALIGN_WITH_NOP
rept newpos - oldpos
nop
endm
else
org newpos
endif
endm ; align
;--------------------------------------------------------------------
; Test program.
;--------------------------------------------------------------------
org 100h ; To view the result with a cp/m debugger.
ld a, a
align 8
ld a, b
ld a, c
ld a, d
align 64
align 16 ; Do nothing, already aligned.
ld a, e
if defined TESTERROR
org 0E000h
ld a, h
align 16384 ; Must generate an error.
ld a, l
endif
end
;--------------------------------------------------------------------
; End of align.asm
|