?? max.asm
字號:
.include "ccall.asm"
.def _ti_max
.text
_ti_max:
pre_ccall 2,AR_X,AR_N
setc SXM
sar AR_X,*+,AR_X ; xmax=stack[0]=&x[max]=&x[0];
lacc *,AR_STACK
sacl *+,AR_STACK ; stack[1] = x[max]
; Compute N%7 to make N divisible by 8 in the unrolled loop
sar AR_N,* ; stack[2]=N
lacl *+ ; acc=N
and #07h ; acc&=0111b - Unroll 8 iterations
sacl *- ; stack[3] = N % 0111b
lacc *,13 ; acch=N>>3
sach *+ ; stack[2]=N>>3
lar AR_N,*- ; AR_N = stack[3] = N%7
mar *-,AR_N
banz NEXT0,AR_X ; AR_N--, Skip loop if AR_N = 0
b NEXT1
; SP = &stack[1]
; Local variables
; &xmax - stack[0]
; *xmax - stack[1]
; ARP=AR_X
NEXT0:
; Is x[AR_X++] > x[max] ?
lacc *+,AR_STACK ; ACC = x[AR_X++];
sub *,AR_N ; ACC -= x[max];
cc NEWMAX2,gt ; if(x[AR_X]>x[max]) newmax
; while(N--)
banz NEXT0,AR_X
NEXT1:
mar *,AR_STACK
mar *+
lar AR_N,*-,AR_N ; AR_N = stack[2]=N>>3
banz NEXT2,AR_X ; Go to 8x loop if AR_X > 0
b DONE
NEXT2:
.loop 7
lacc *+,AR_STACK ; ACC = x[AR_X++];
sub *,AR_X ; ACC -= x[max];
cc NEWMAX1,gt ; if(x[AR_X]>x[max]) newmax
.endloop
lacc *+,AR_STACK ; ACC = x[AR_X++];
sub *,AR_N ; ACC -= x[max];
cc NEWMAX2,gt ; if(x[AR_X]>x[max]) newmax
; while(N--)
banz NEXT2,AR_X
DONE:
mar *,AR_STACK
mar *- ; SP=0
lacl * ; acc=stack[0]=&x[max]
post_ccall 2
NEWMAX .macro AR
mar *,AR_X
mar *-,AR_STACK ; i--
sbrk #1 ; SP--
sar AR_X,*+,AR_X ; stack[0]=&x[i] (address of new max)
lacc *+,AR_STACK ; acc=x[i]
sacl *,AR ; stack[1]=x[i]
ret
.endm
; We need one NEWMAX that returns with ARP=AR_X and
; one with ARP=AR_N
NEWMAX1:
NEWMAX AR_X
NEWMAX2:
NEWMAX AR_N
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -