Tavukoodia ja virtuaalikone(hko)
Posted: Thu Aug 02, 2012 7:46 pm
Tällainen. Suorittaa alussa määritellyn Konekieliohjelman, esitettynä alussa (rivit 23,33) assembly-koodina (pokebyteillä) voitte testata itsekin ja muuttaa konekieliohjelmaa, se suorittaa sen. Muistakaa muuttaa myös debug tekstiä riveillä 103-105, että saatte ohjelmanne tulokset esille.
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)
Projekteihin, koska muokkaan tämän joskus ihan oikeaksi virtuaalikoneeksi.
Ohjelmat ja tieto täytyy mahtua 255 tavuun, vaikka alussa varataaankin 1 kilotavu.
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.