Link zum Quellcode bitte......
Code: Alles auswählen
CON
_clkmode = XTAL1|PLL16X
_xinfreq = 5_000_000
CODE = %0000_0001
CODE_ERROR = %0000_0010
CODE_J_C = %0000_0100
CODE_R = %0000_1000
CODE_M = %0001_0000
VAR
long Ccod[512]
byte Cmark[512] ' Status der Zelle (unbenutzt | CODE | CODE_ERROR | Marke_JMP_CALL_RET | modifizierter Code)
word Rstack[512] ' Hier werden die noch abzuarbeideten Adressen gespeichert
DAT
byte "NOP "
byte "WRBYTE "
byte "RDBYTE "
PUB MAIN
REASM
PRI REASM | ad, sp, ci, i, cc, cd, cs
repeat i from 0 to 511
Cmark[i] := $0
Rstack[i*2] := $FFFF
' code zerlegen 1. Lauf (Ermittlung Marken/CODE...)
Rstack[0] := $0 ' Startadresse COG
sp := 1 ' Stackmax
ad := -1
repeat Rstack[0] <> $FFFF
if ad := -1 ' keine Adresse
ad := Rstack[0]
wordmove(@Rstack, (@Rstack+2), 510) ' Blockmove -1 word ( eine Adresse vom Stabel geholt)
Rstack[511] := $FFFF
sp--
if ad == $FFFF ' alles abgearbeitet
quit ' repeat exit fertig zur ausgabe
else
ci := i := cc := cd := cs := Ccod[ad*4]
ci := (ci > 22) & %1111111111
i := ( i > 22) & %0000000001 ' Lower case “i” denotes a bit that is affected by immediate status
cc := (cc > 18) & %0000001111
' cd := (cd > 9) & %0111111111
cs := cs & %0111111111
if Cmark[ad] <> 0
next ' Bereits bearbeitet
else
if cc == %0000 ' NOP
ad++
else
case ci
%000000_0000, %000000_0001 : ' WRBYTE
ad := ad_code(ad)
%000000_0010, %000000_0011 : ' RDBYTE
ad := ad_code(ad)
%000001_0000, %000001_0001 : ' WRWORD
ad := ad_code(ad)
%000001_0010, %000001_0011 : ' RDWORD
ad := ad_code(ad)
%000010_0000, %000010_0001 : ' WRLONG
ad := ad_code(ad)
%000010_0010, %000010_0011 : ' RDLONG
ad := ad_code(ad)
%000011_0000, %000011_0001, %000011_0011 : ' HUBOP ???
cs := cs & %111 ' Restliche Bits löschen
case cs
%001 : ' COGID
ad := ad_code(ad)
%010 : ' COGINIT
ad := ad_code(ad)
%011 : ' COGSTOP
ad := ad_code(ad)
%100 : ' LOCKNEW
ad := ad_code(ad)
%101 : ' LOCKRET
ad := ad_code(ad)
%110 : ' LOCKSET
ad := ad_code(ad)
%111 : ' LOCKCLR
ad := ad_code(ad)
%001000_0010, %001000_0011 : ' ROR
ad := ad_code(ad)
%001001_0010, %001001_0011 : ' ROL
ad := ad_code(ad)
%001010_0010, %001010_0011 : ' SHR
ad := ad_code(ad)
%001011_0010, %001011_0011 : ' SHL
ad := ad_code(ad)
%001100_0010, %001100_0011 : ' RCR
ad := ad_code(ad)
%001101_0010, %001101_0011 : ' RCL
ad := ad_code(ad)
%001110_0010, %001110_0011 : ' SAR
ad := ad_code(ad)
%001111_0010, %001111_0011 : ' REV
ad := ad_code(ad)
%010000_0010, %010000_0011 : ' MINS
ad := ad_code(ad)
%010001_0010, %010001_0011 : ' MAXS
ad := ad_code(ad)
%010010_0010, %010010_0011 : ' MIN
ad := ad_code(ad)
%010011_0010, %010011_0011 : ' MAX
ad := ad_code(ad)
%010100_0010, %010100_0011 : ' MOVS
ad := ad_code(ad)
%010101_0010, %010101_0011 : ' MOVD
ad := ad_code(ad)
%010110_0010, %010110_0011 : ' MOVI
ad := ad_code(ad)
%010111_0000 : ' JMP
ad := ad_code(ad)
ad := cs
%010111_0001 : ' JMP/RET
' %010111_0001 : ' RET
ad := ad_code(ad)
%010111_0010 : ' JMPRET
ad := ad_code(ad)
%010111_0011 : ' JMPRET/CALL
' %010111_0011 : ' CALL
ad := ad_code(ad)
%011000_0000, %011000_0001 : ' TEST
ad := ad_code(ad)
%011000_0010, %011000_0011 : ' AND
ad := ad_code(ad)
%011001_0000, %011001_0001 : ' TESTN
ad := ad_code(ad)
%011001_0010, %011001_0011 : ' ANDN
ad := ad_code(ad)
%011010_0010, %011010_0011 : ' OR
ad := ad_code(ad)
%011011_0010, %011011_0011 : ' XOR
ad := ad_code(ad)
%011100_0010, %011100_0011 : ' MUXC
ad := ad_code(ad)
%011101_0010, %011101_0011 : ' MUXNC
ad := ad_code(ad)
%011110_0010, %011110_0011 : ' MUXZ
ad := ad_code(ad)
%011111_0010, %011111_0011 : ' MUXNZ
ad := ad_code(ad)
%100000_0010, %100000_0011 : ' ADD
ad := ad_code(ad)
%100001_0000, %100001_0001 : ' CMP
ad := ad_code(ad)
%100001_0010, %100001_0011 : ' SUB
ad := ad_code(ad)
%100010_0010, %100010_0011 : ' ADDABS
ad := ad_code(ad)
%100011_0010, %100011_0011 : ' SUBABS
ad := ad_code(ad)
%100100_0010, %100100_0011 : ' SUMC
ad := ad_code(ad)
%100101_0010, %100101_0011 : ' SUMNC
ad := ad_code(ad)
%100110_0010, %100110_0011 : ' SUMZ
ad := ad_code(ad)
%100111_0010, %100111_0011 : ' SUMNZ
ad := ad_code(ad)
%101000_0010, %101000_0011 : ' MOV
ad := ad_code(ad)
%101001_0010, %101001_0011 : ' NEG
ad := ad_code(ad)
%101010_0010, %101010_0011 : ' ABS
ad := ad_code(ad)
%101011_0010, %101011_0011 : ' ABSNEG
ad := ad_code(ad)
%101100_0010, %101100_0011 : ' NEGC
ad := ad_code(ad)
%101101_0010, %101101_0011 : ' NEGNC
ad := ad_code(ad)
%101110_0010, %101110_0011 : ' NEGZ
ad := ad_code(ad)
%101111_0010, %101111_0011 : ' NEGNZ
ad := ad_code(ad)
%110000_0000, %110000_0001 : ' CMPS
ad := ad_code(ad)
%110001_0000, %110001_0001 : ' CMPSX
ad := ad_code(ad)
%110010_0010, %110010_0011 : ' ADDX
ad := ad_code(ad)
%110011_0000, %110011_0001 : ' CMPX
ad := ad_code(ad)
%110011_0010, %110011_0011 : ' SUBX
ad := ad_code(ad)
%110100_0010, %110100_0011 : ' ADDS
ad := ad_code(ad)
%110101_0010, %110101_0011 : ' SUBS
ad := ad_code(ad)
%110110_0010, %110110_0011 : ' ADDSX
ad := ad_code(ad)
%110111_0010, %110111_0011 : ' SUBSX
ad := ad_code(ad)
%111000_0010, %111000_0011 : ' CMPSUB
ad := ad_code(ad)
%111001_0010, %111001_0011 : ' DJNZ
ad := ad_code(ad)
%111010_0000, %111010_0001 : ' TJNZ
ad := ad_code(ad)
%111011_0000, %111011_0001 : ' TJZ
ad := ad_code(ad)
%111100_0000, %111100_0001 : ' WAITPEQ
ad := ad_code(ad)
%111101_0000, %111101_0001 : ' WAITPNE
ad := ad_code(ad)
%111110_0010, %111110_0011 : ' WAITCNT
ad := ad_code(ad)
%111111_0000, %111111_0001 : ' WAITVID
ad := ad_code(ad)
other : ' ERROR
' alle Adressen abgearbeitet
' code zerlegen 2. Lauf (ausgabe linear)
repeat ad from 0 to 511
ci := i := cc := cd := cs := Ccod[ad*4]
ci := (ci > 22) & %1111111111
i := ( i > 22) & %0000000001 ' Lower case “i” denotes a bit that is affected by immediate status
cc := (cc > 18) & %0000001111
cd := (cd > 9) & %0111111111
cs := cs & %0111111111
if (Cmark & %0100_0000) == %0100_0000 ' CODE
if cc == %0000 ' NOP
else
case ci
%000000_0000, %000000_0001 : ' WRBYTE
%000000_0010, %000000_0011 : ' RDBYTE
%000001_0000, %000001_0001 : ' WRWORD
%000001_0010, %000001_0011 : ' RDWORD
%000010_0000, %000010_0001 : ' WRLONG
%000010_0010, %000010_0011 : ' RDLONG
%000011_0000, %000011_0001, %000011_0011 : ' HUBOP ???
case cs
%001 : ' COGID
%010 : ' COGINIT
%011 : ' COGSTOP
%100 : ' LOCKNEW
%101 : ' LOCKRET
%110 : ' LOCKSET
%111 : ' LOCKCLR
%001000_0010, %001000_0011 : ' ROR
%001001_0010, %001001_0011 : ' ROL
%001010_0010, %001010_0011 : ' SHR
%001011_0010, %001011_0011 : ' SHL
%001100_0010, %001100_0011 : ' RCR
%001101_0010, %001101_0011 : ' RCL
%001110_0010, %001110_0011 : ' SAR
%001111_0010, %001111_0011 : ' REV
%010000_0010, %010000_0011 : ' MINS
%010001_0010, %010001_0011 : ' MAXS
%010010_0010, %010010_0011 : ' MIN
%010011_0010, %010011_0011 : ' MAX
%010100_0010, %010100_0011 : ' MOVS
%010101_0010, %010101_0011 : ' MOVD
%010110_0010, %010110_0011 : ' MOVI
%010111_0000 : ' JMP
%010111_0001 : ' JMP/RET
' %010111_0001 : ' RET
%010111_0010 : ' JMPRET
%010111_0011 : ' JMPRET/CALL
' %010111_0011 : ' CALL
%011000_0000, %011000_0001 : ' TEST
%011000_0010, %011000_0011 : ' AND
%011001_0000, %011001_0001 : ' TESTN
%011001_0010, %011001_0011 : ' ANDN
%011010_0010, %011010_0011 : ' OR
%011011_0010, %011011_0011 : ' XOR
%011100_0010, %011100_0011 : ' MUXC
%011101_0010, %011101_0011 : ' MUXNC
%011110_0010, %011110_0011 : ' MUXZ
%011111_0010, %011111_0011 : ' MUXNZ
%100000_0010, %100000_0011 : ' ADD
%100001_0000, %100001_0001 : ' CMP
%100001_0010, %100001_0011 : ' SUB
%100010_0010, %100010_0011 : ' ADDABS
%100011_0010, %100011_0011 : ' SUBABS
%100100_0010, %100100_0011 : ' SUMC
%100101_0010, %100101_0011 : ' SUMNC
%100110_0010, %100110_0011 : ' SUMZ
%100111_0010, %100111_0011 : ' SUMNZ
%101000_0010, %101000_0011 : ' MOV
%101001_0010, %101001_0011 : ' NEG
%101010_0010, %101010_0011 : ' ABS
%101011_0010, %101011_0011 : ' ABSNEG
%101100_0010, %101100_0011 : ' NEGC
%101101_0010, %101101_0011 : ' NEGNC
%101110_0010, %101110_0011 : ' NEGZ
%101111_0010, %101111_0011 : ' NEGNZ
%110000_0000, %110000_0001 : ' CMPS
%110001_0000, %110001_0001 : ' CMPSX
%110010_0010, %110010_0011 : ' ADDX
%110011_0000, %110011_0001 : ' CMPX
%110011_0010, %110011_0011 : ' SUBX
%110100_0010, %110100_0011 : ' ADDS
%110101_0010, %110101_0011 : ' SUBS
%110110_0010, %110110_0011 : ' ADDSX
%110111_0010, %110111_0011 : ' SUBSX
%111000_0010, %111000_0011 : ' CMPSUB
%111001_0010, %111001_0011 : ' DJNZ
%111010_0000, %111010_0001 : ' TJNZ
%111011_0000, %111011_0001 : ' TJZ
%111100_0000, %111100_0001 : ' WAITPEQ
%111101_0000, %111101_0001 : ' WAITPNE
%111110_0010, %111110_0011 : ' WAITCNT
%111111_0000, %111111_0001 : ' WAITVID
' alle Adressen abgearbeitet
PRI ad_code(ad)
Cmark[ad] := Cmark[ad] & CODE
result := ++ad