Tässä on siis muutamia rekisterejä, mm. Akkumulaattori, ohjelmalaskuri, carry rekisteri, overflow (vain akkumulaattori ja ohjelmalaskuri ovat käytössä)
Assembly-komennot A on akkumulaattori, adr on muistiosoite joka määritellään komennon jälkeen. PC on ohjelmalaskuri. (Suoritettavan komennon muistiosoite)
Code: Select all
BRK...Keskeyttää::::::0x00=0
ORA...A=A or adr::::::0x01=1
ANA...A=A and adr:::::0x02=2
EOR...A=A xor adr:::::0x03=3
ADD...A=A+adr:::::::::0x04=4
SUB...A=A-adr:::::::::0x05=5
INC...A=A+1:::::::::::0x06=6
DEC...A=A-1:::::::::::0x07=7
LDA...A=adr:::::::::::0x08=8
STA...adr=A:::::::::::0x09=9
TAP...PC=A::::::::::::0x0A=10
TPA...A=PC::::::::::::0x0B=11
NOP...Ei mitään:::::::0xFF=255 (voi käyttää waittina :))
Code: Select all
mem=MakeMEMBlock(1024)
a=MakeMEMBlock(1)
pc=MakeMEMBlock(2)
o=MakeMEMBlock(1)
c=MakeMEMBlock(1)
s=MakeMEMBlock(1)
//Nämä ovat vain numeroarvojen muistamista varten koska niitä ei voi käyttää casessa
Const BRK = 0
Const ORA = 1
Const ANA = 2
Const EOR = 3
Const ADD = 4
Const SUB = 5
Const INC = 6
Const DEC = 7
Const LDA = 8
Const STA = 9
Const TAP = 10
Const TPA = 11
Const LDA2 = 12
Const NOP = 255
PokeByte mem,10,LDA
PokeByte mem,11,5
PokeByte mem,12,STA
PokeByte mem,13,50
PokeByte mem,14,INC
PokeByte mem,15,STA
PokeByte mem,16,51
PokeByte mem,17,INC
PokeByte mem,18,STA
PokeByte mem,19,52
PokeByte mem,20,BRK
PokeByte pc,0,9
isrunning=True
starttime=Timer()
cyclecount=0
cycle:
PokeShort pc,0,PeekShort(pc,0)+1
PokeByte mem,1023,PeekByte(mem,PeekByte(pc,0))
Print "Executing "+PeekByte(mem,1023)
Select PeekByte(mem,1023) 'Tee hommat
Case 0
isrunning=False
Case 1
PokeByte mem,0,1
Case 2
PokeByte mem,0,2
Case 3
PokeByte mem,0,3
Case 4
PokeByte mem,0,4
Case 5
PokeByte mem,0,5
Case 6
PokeByte a,0,PeekByte(a,0)+1 : Goto endi
Case 7
PokeByte a,0,PeekByte(a,0)-1 : Goto endi
Case 8
PokeByte mem,0,8
Case 9
PokeByte mem,0,9
Case 10
PokeByte pc,0,PeekByte(a,0) : Goto endi
Case 11
PokeByte a,0,PeekByte(pc,0) : Goto endi
Case 12
PokeByte mem,0,12
Case 255
Goto endi
EndSelect
PokeShort pc,0,PeekShort(pc,0)+1
PokeByte mem,1023,PeekByte(mem,PeekByte(pc,0)) 'Lisää laskuria ja tallenna arvo
Select PeekByte(mem,0)
Case 1
PokeByte a,0,BinOr(PeekByte(a,0),PeekByte(mem,1023))
Case 2
PokeByte a,0,BinAnd(PeekByte(a,0),PeekByte(mem,1023))
Case 3
PokeByte a,0,BinXor(PeekByte(a,0),PeekByte(mem,1023))
Case 4
PokeByte a,0,PeekByte(a,0)+PeekByte(mem,1023)
Case 5
PokeByte a,0,PeekByte(a,0)-PeekByte(mem,1023)
Case 8
PokeByte a,0,PeekByte(mem,1023)
Case 9
PokeByte mem,PeekByte(mem,1023),PeekByte(a,0)
Case 12
PokeByte a,0,PeekByte(mem,PeekByte(mem,1023))
EndSelect
Goto endi2
endi:
'PokeShort pc,0,PeekShort(pc,0)+1 Lisää laskuria
endi2:
cyclecount=cyclecount+1
If isrunning=True Then Goto cycle
endtime=Timer()-starttime
Print cyclecount+" cycles took "+endtime
Print PeekByte(mem,50)
Print PeekByte(mem,51)
Print PeekByte(mem,52)
WaitKey
End
Function BinAnd(luku1, luku2)
For i = 0 To 31
luku3 = luku3 + (((luku1 Shr i) Mod 2) And ((luku2 Shr i) Mod 2)) Shl i
Next i
Return luku3
End Function
Function BinNot(luku1)
For i = 0 To 31
luku3 = luku3 + (Not ((luku1 Shr i) Mod 2)) Shl i
Next i
Return luku3
End Function
Function BinXor(luku1, luku2)
For i = 0 To 31
luku3 = luku3 + (((luku1 Shr i) Mod 2) Xor ((luku2 Shr i) Mod 2)) Shl i
Next i
Return luku3
End Function
Function BinOr(luku1, luku2)
For i = 0 To 31
luku3 = luku3 + (((luku1 Shr i) Mod 2) Or ((luku2 Shr i) Mod 2)) Shl i
Next i
Return luku3
End Function
Ohjelmat ja tieto täytyy mahtua 255 tavuun, vaikka alussa varataaankin 1 kilotavu.