发布于 2008-10-07 09:43:53
0楼
AR1 := Start address of table
L P##TABLE // ACC1 := Ptr to start of table
LAR1 // AR1 := Ptr to start of table
L W#16#0 // ACC1 := 0
L W [AR1,P#0.0] // Memory reference byte 0..1 ; ACC2 := 0
==I // if(memory reference byte 0..1 = DB#)
JZ IF01 // {
T #BLOCK_NO // ACC1 := DB#
OPN DB [#BLOCK_NO] // Open DB#
IF01: NOP 0 // }
L D [AR1,P#2.0] // ACC1 := Starting address of table
LAR1 // AR1 := Starting address of table
// Check if table is empty
L W#16#0 // ACC1 := 0
L W [AR1,P#2.0] // ACC1 := TABLE[1] // # of entries
==I // if(TABLE[1] = 0)
JZ FAIL // { FAIL }
// Remove "FIRST IN" entry from table
L D [AR1,P#4.0] // ACC1 := TABLE[3]
T #RET_VAL // FIFO := TABLE[3]
// Decrement # of entries by 1. Then, if # of entries = 0 then EXIT
L W [AR1,P#2.0] // TABLE[1] := TABLE[1] - 1
L 1 // .
-I // .
T W [AR1,P#2.0] // .
JZ EXIT // if(TABLE[1] = 0 { EXIT }
// Shift remaining entries down in the table
+AR1 P#4.0 // for(COUNT = # of entries; COUNT <> 0; COUNT -1)
L001: T #CNTR // {
L D [AR1,P#4.0] // .
T D [AR1,P#0.0] // .
+AR1 P#4.0 // AR1 := AR1 + 4 bytes
L #CNTR // .
LOOP L001 // }
EXIT: SET // RL0 := 1
JU SBR // .
FAIL: CLR // RLO := 0
SBR: SAVE // Set BR indicating function success or failure
#RET_VAL 输出应定义为dword类型例如 #output dword
如果希望连续的执行fifo而不受fifo第二个字的长度限制,则可以把程序修改为:
L P##table // ACC1 := Ptr to start of table
LAR1 // AR1 := Ptr to start of table
L W#16#0 // ACC1 := 0
L W [AR1,P#0.0] // Memory reference byte 0..1 ; ACC2 := 0
==I // if(memory reference byte 0..1 = DB#)
JZ IF01 // {
T #BLOCK_NO // ACC1 := DB#
OPN DB [#BLOCK_NO] // Open DB#
IF01: NOP 0 // }
L D [AR1,P#2.0] // ACC1 := Starting address of table
LAR1 // AR1 2:= Starting address of table
LAR2
// Check if table is empty
L W#16#0 // ACC1 := 0
L W [AR1,P#2.0] // ACC1 := TABLE[1] // # of entries
==I // if(TABLE[1] = 0)
JZ FAIL // { FAIL }
// Remove "FIRST IN" entry from table
L D [AR1,P#4.0] // ACC1 := TABLE[3]
T #output // FIFO := TABLE[3]
// Decrement # of entries by 1. Then, if # of entries = 0 then EXIT
L W [AR1,P#2.0] // TABLE[1] := TABLE[1] - 1
T #temp
L 1 // .
-I // .
T W [AR1,P#2.0] // .
JZ EXIT // if(TABLE[1] = 0 { EXIT }
// Shift remaining entries down in the table
+AR1 P#4.0 // for(COUNT = # of entries; COUNT <> 0; COUNT -1)
L001: T #CNTR // {
L D [AR1,P#4.0] // .
T D [AR1,P#0.0] // .
+AR1 P#4.0 // AR1 := AR1 + 4 bytes
L #CNTR // .
LOOP L001 // }
L #temp
T W [AR2,P#2.0]
EXIT: SET // RL0 := 1
JU SBR // .
FAIL: CLR // RLO := 0
SBR: SAVE // Set BR indicating function success or failure