ack/lang/a68s/liba68s/swap.e
1988-10-04 13:41:01 +00:00

36 lines
1.4 KiB
Plaintext

#include "e.h"
exp $SWAP
pro $SWAP,0 ; used by twist is A68S1CE to swap two items
; of any length on the stack. the lengths of
; the two items to be swapped are passed as two
; SZWORD byte parameters
; first copy what was the top item on the stack before the call
; to the procedural working stack
lal SZADDR+SZWORD+SZWORD ; address of top of stack before call
lol SZADDR+SZWORD ; 2nd param is the length of top item
los SZWORD ; load top item to procedural stack
; now copy what was the second stack item to the top
lal SZADDR+SZWORD+SZWORD ; address of top for source of copy
dup SZADDR ; dup for destination
dup SZADDR ; and dup to copy top item back
lol SZADDR+SZWORD ; length of top item
ads SZWORD ; add length to address of top of stack to get
; the address of the 2nd param. (source address)
exg SZADDR ; exchange source and destination address
lol SZADDR ; 1st param is the length of the 2nd stack item
bls SZWORD ; copy 2nd item to the top of the pre-call stack
; now copy the what was the top item from the procedural stack to
; the second position of the stack before the call
lol SZADDR ; length of 2nd stack item, now on the top
ads SZWORD ; add length to address of the top of the stack to
; get place for 2nd item, the old top item
lol SZADDR+SZWORD ; length of old top, now to be copied to 2nd position
sts SZWORD ; move the item that was top
ret 0
end 0