Re: HBasic
Verfasst: Sa 27. Okt 2012, 14:26
Schau dir mal die ersten 4 Zellen an hier ist nur der SPIN Code aktiv.
Ich werde heute Abend mal das reg-ios näher anschauen.
Ich werde heute Abend mal das reg-ios näher anschauen.
Retro Style Eigenbau Computer mit Parallax Propeller
https://www.hive-project.de/board/
Code: Alles auswählen
a:=dira
b:=outa
ios.print(String($D, "dira ->"))
ios.printbin(a>> 0 & $FF ,8)
Code: Alles auswählen
CON
_CLKMODE = XTAL1 + PLL16X
_XINFREQ = 5_000_000
OBJ
ios : "reg-ios"
pub main | a1,b1,a2,b2
ios.start
a1:=dira
b1:=outa
ios.print(string($0d,"Teststring"))
a2:=dira
b2:=outa
ios.printnl
print_dira(a1)
print_dira(a2)
ios.printnl
print_outa(b1)
print_outa(b2)
repeat
pri print_dira(n)
ios.print(String($D, "dira ->"))
ios.printbin(n>>24 & $FF ,8)
ios.print(String("_"))
ios.printbin(n>>16 & $FF ,8)
ios.print(String("_"))
ios.printbin(n>>08 & $FF ,8)
ios.print(String("_"))
ios.printbin(n>>00 & $FF ,8)
pri print_outa(n)
ios.print(String($D, "outa ->"))
ios.printbin(n>>24 & $FF ,8)
ios.print(String("_"))
ios.printbin(n>>16 & $FF ,8)
ios.print(String("_"))
ios.printbin(n>>08 & $FF ,8)
ios.print(String("_"))
ios.printbin(n>>00 & $FF ,8)
Code: Alles auswählen
CON
_clkmode = xtal1+pll16x
_xinfreq = 5_000_000
OBJ
ios : "reg-ios"
PUB main|a1,b1,a2,b2,a3,b3,a4,b4
ios.start
a1:=dira
b1:=outa
ios.printcls
a2:=dira
b2:=outa
ios.print(string("Test(PIC18F2550)"))
a3:=dira
b3:=outa
' ios.ram_wrlong(0,$0008_4638,$7f00) '<-- Testobjekte
long[$7f00]:=ios.ram_rdlong(0,$7f00) '<-- Testobjekte
a4:=dira
b4:=outa
ios.print(String($D," +----------------------------- /hs"))
ios.print(String($D," |+---------------------------- /wr"))
ios.print(String($D," ||+--------------------------- busclk"))
ios.print(String($D," |||+-------------------------- hbeat"))
ios.print(String($D," ||||+------------------------- al"))
ios.print(String($D," |||||+------------------------ /bel"))
ios.print(String($D," ||||||+----------------------- /adm"))
ios.print(String($D," |||||||+---------------------- /ram2"))
ios.print(String($D," ||||||||+--------------------- /ram1"))
ios.print(String($D," ||||||||| +--------- a0..10"))
ios.print(String($D," ||||||||| | +- d0..7"))
ios.print(String($D," |||||||||+----------++------+"))
ios.print(String($D," %0000000000000aaaaaaaaaaadddddddd"))
list(a1,b1)
list(a2,b2)
list(a3,b3)
list(a4,b4)
ios.print(String($D," %0000000000000aaaaaaaaaaadddddddd"))
PRI list(a,b)
ios.print(String($D, "dira ->"))
ios.printbin(a,32)
ios.print(String($D, "outa ->"))
ios.printbin(b,32)
Quatsch, das war nur ein unbewußer Verschlüsslungscode!Sorry hab da wol ein paar bits vertauscht![]()
Code: Alles auswählen
CON
_clkmode = xtal1+pll16x
_xinfreq = 5_000_000
PUB main
' bus_init '<-- Problem
cognew(@runtime, 0)
repeat
DAT{{Runtime COG***********************************************************************************}}
runtime
org 0
' ---------------------------------------------------------------------
' mov sprvm, SPRV 'Bytecode Merken
'INI0 rdlong temp1, stat 'status laden
' cmp temp1, h7F7FF7F7 wz
' if_nz jmp #INI0 'Test auf inifreigabe ><h7F7FF7F7 = Stop =h7F7FF7F7 = Start
' ---------------------------------------------------------------------
' Load Programm vom externen Ram
mov dira, dinp ' Bus auf eingang setzen (Grundstellung)
and outa, dclr
' andn outa, _wr 'WR --> L
or outa, _wr 'WR --> H
KKKK jmp #KKKK
dinp long %00000111_11111111_11111111_00000000 ' bus input
dclr long %11111100_01111000_00000000_00000000 ' bus löschen
_wr long %00000100_00000000_00000000_00000000 ' /wr bitmaske
PUB bus_init 'bus: initialisiert bussystem
{{bus_init - bus: initialisierung aller bussignale }}
dira := db_in ' datenbus auf eingabe schalten
outa[bus_wr] := 1 ' schreiben inaktiv
outa[reg_ram1] := 1 ' ram1 inaktiv
outa[reg_ram2] := 1 ' ram2 inaktiv
outa[reg_prop1] := 1 ' prop1 inaktiv
outa[reg_prop2] := 1 ' prop2 inaktiv
outa[busclk] := 0 ' busclk startwert
outa[reg_al] := 0 ' strobe aus
outa[18..8] := 0 ' adresse a0..a10 auf 0 setzen
outa[23] := 1 ' obere adresse in adresslatch übernehmen
outa[23] := 0
CON
DB_IN = %00000111_11111111_11111111_00000000 'maske: dbus-eingabe
'signaldefinition regnatix
#0, D0,D1,D2,D3,D4,D5,D6,D7 'datenbus
#8, A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10 'adressbus
#19, REG_RAM1,REG_RAM2 'selektionssignale rambank 1 und 2
#21, REG_PROP1,REG_PROP2 'selektionssignale für administra und bellatrix
#23, REG_AL 'strobesignal für adresslatch
#24, HBEAT 'front-led
BUSCLK 'bustakt
BUS_WR '/wr - schreibsignal
BUS_HS ' '/hs - quittungssignal
Code: Alles auswählen
CON
_clkmode = xtal1+pll16x
_xinfreq = 5_000_000
PUB main
bus_init
dira:=0
cognew(@runtime, 0)
' repeat 1000 'kleine zeitschleife
' dira := db_in 'datenbus auf eingabe schalten aktiv
' ...
' dira := 0 'Vom Bus abmelden
DAT{{Runtime COG***********************************************************************************}}
runtime
org 0
' Bus auf eingang setzen (Grundstellung)
mov dira, #$0 'Vom Bus abmelden
mov outa, clr
' ---------------------------------------------------------------------
' mov sprvm, SPRV 'Bytecode Merken
'INI0 rdlong temp1, stat 'status laden
' cmp temp1, h7F7FF7F7 wz
' if_nz jmp #INI0 'Test auf inifreigabe ><h7F7FF7F7 = Stop =h7F7FF7F7 = Start
' ---------------------------------------------------------------------
' Load Programm vom externen Ram
mov dira, dinp 'Busübernahme
' andn outa, _wr 'WR --> L
or outa, _wr 'WR --> H
KKKK jmp #KKKK 'Programm ausführen
mov dira, #$0 'Vom Bus abmelden
'KKKK jmp #KKKK 'Programm ausführen
dinp long %00000111_11111111_11111111_00000000 ' bus input
clr long %00001100_01111000_00000000_00000000 ' bus löschen
_wr long %00000100_00000000_00000000_00000000 ' /wr bitmaske
PUB bus_init 'bus: initialisiert bussystem
{{bus_init - bus: initialisierung aller bussignale }}
dira := 0 ' Bus inaktiv
outa[bus_wr] := 1 ' schreiben inaktiv
outa[reg_ram1] := 1 ' ram1 inaktiv
outa[reg_ram2] := 1 ' ram2 inaktiv
outa[reg_prop1] := 1 ' prop1 inaktiv
outa[reg_prop2] := 1 ' prop2 inaktiv
outa[busclk] := 0 ' busclk startwert
outa[reg_al] := 0 ' strobe aus
outa[18..8] := 0 ' adresse a0..a10 auf 0 setzen
outa[23] := 1 ' obere adresse in adresslatch übernehmen
outa[23] := 0
CON
DB_IN = %00000111_11111111_11111111_00000000 'maske: dbus-eingabe
'signaldefinition regnatix
#0, D0,D1,D2,D3,D4,D5,D6,D7 'datenbus
#8, A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10 'adressbus
#19, REG_RAM1,REG_RAM2 'selektionssignale rambank 1 und 2
#21, REG_PROP1,REG_PROP2 'selektionssignale für administra und bellatrix
#23, REG_AL 'strobesignal für adresslatch
#24, HBEAT 'front-led
BUSCLK 'bustakt
BUS_WR '/wr - schreibsignal
BUS_HS ' '/hs - quittungssignal
Code: Alles auswählen
CON 'Signaldefinitionen
'signaldefinition regnatix
#0, D0,D1,D2,D3,D4,D5,D6,D7 'datenbus
#8, A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10 'adressbus
#19, REG_RAM1,REG_RAM2 'selektionssignale rambank 1 und 2
#21, REG_PROP1,REG_PROP2 'selektionssignale für administra und bellatrix
#23, REG_AL 'strobesignal für adresslatch
#24, HBEAT 'front-led
BUSCLK 'bustakt
BUS_WR '/wr - schreibsignal
BUS_HS ' '/hs - quittungssignal
db_in = %00000111_11111111_11111111_00000000 'maske: dbus-eingabe
db_out = %00000111_11111111_11111111_11111111 'maske: dbus-ausgabe
PUB bus_init 'bus: initialisiert bussystem
{{bus_init - bus: initialisierung aller bussignale }}
dira := 0 ' Bus deaktivieren
outa[bus_wr] := 1 ' schreiben inaktiv
outa[reg_ram1] := 1 ' ram1 inaktiv
outa[reg_ram2] := 1 ' ram2 inaktiv
outa[reg_prop1] := 1 ' prop1 inaktiv
outa[reg_prop2] := 1 ' prop2 inaktiv
outa[busclk] := 0 ' busclk startwert
outa[reg_al] := 0 ' strobe aus
outa[18..8] := 0 ' adresse a0..a10 auf 0 setzen
outa[23] := 1 ' obere adresse in adresslatch übernehmen
outa[23] := 0
' dira := db_in ' datenbus auf eingabe schalten
' dira := db_out ' datenbus auf ausgabe schalten
PUB ram_rdbyte(adresse):wert 'eram: liest ein byte vom eram
{{ram_rdbyte(adresse):wert - eram: ein byte aus externem ram lesen}}
'rambank 1 000000 - 07FFFF
'rambank 2 080000 - 0FFFFF
'der gesamte speicher (2 x 512 KB) werden durchgängig adressiert
outa[15..8] := adresse >> 11 'höherwertige adresse setzen
outa[23] := 1 'obere adresse in adresslatch übernehmen
outa[23] := 0
outa[18..8] := adresse 'niederwertige adresse setzen
dira := db_in 'datenbus auf eingabe schalten
if adresse < $080000 'rambank 1?
outa[reg_ram1] := 0 'ram1 selektieren (wert wird geschrieben)
else
outa[reg_ram2] := 0 'ram2 selektieren (wert wird geschrieben)
wert := ina[7..0] 'speicherzelle einlesen
outa[reg_ram1] := 1 'ram1 deselektieren
outa[reg_ram2] := 1 'ram2 deselektieren
dira := 0 'Bus deaktivieren
PUB ram_wrbyte(wert,adresse) 'eram: schreibt ein byte in eram
{{ram_wrbyte(wert,adresse) - eram: ein byte in externen ram schreiben}}
'rambank 1 000000 - 07FFFF
'rambank 2 080000 - 08FFFF
'der gesamte speicher (2 x 512 KB) werden durchgängig adressiert
outa[bus_wr] := 0 'schreiben aktivieren
outa[7..0] := wert 'wert --> datenbus
outa[15..8] := adresse >> 11 'höherwertige adresse setzen
outa[23] := 1 'obere adresse in adresslatch übernehmen
outa[23] := 0
outa[18..8] := adresse 'niederwertige adresse setzen
dira := db_out ' datenbus auf ausgabe schalten
if adresse < $080000 'rambank 1?
outa[reg_ram1] := 0 'ram1 selektieren (wert wird geschrieben)
else
outa[reg_ram2] := 0 'ram2 selektieren (wert wird geschrieben)
outa[reg_ram1] := 1 'ram1 deselektieren
outa[reg_ram2] := 1 'ram2 deselektieren
outa[bus_wr] := 1 'schreiben deaktivieren
dira := 0 'Bus deaktivieren
Code: Alles auswählen
'---------------------------------------------------------------------
' eRam
' nop befehle damit SRAM genug zeit hat aufgabe zu erledigen:)
' temp1 Daten
' temp2 Adresse
' temp3 temp
'---------------------------------------------------------------------
eRamWB ' byte schreiben
mov outa, clr
mov dira, dout
call #setadr
and temp1, #$FF
or outa, temp1
andn outa, _wr
andn outa, _ram1
nop '<< sehr wichtig
nop '<< sehr wichtig
or outa, _ram1
mov outa, clr
mov dira, #$0
eRamWB_ret ret
'---------------------------------------------------------------------
eRamRB ' byte lesen
mov outa, clr
mov dira, dinp
call #setadr
andn outa, _ram1
nop '<< sehr wichtig
mov temp1, ina
and temp1, #$FF
or outa, _ram1
or outa, _ram2
mov outa, clr
mov dira, #$0
eRamRB_ret ret
'---------------------------------------------------------------------
setadr ' adresse verarbeiten
'hwt-adresse --> latch
mov temp3, temp2
shr temp3, #3
and temp3, _latch
or outa, temp3
or outa, _la
nop '<< sehr wichtig
andn outa, _la
mov outa, clr
' nwt-adresse setzen
mov temp3, temp2
shl temp3, #8
and temp3, _adr
or outa, temp3
setadr_ret ret
'---------------------------------------------------------------------
' +------------------------------- /hs
' |+------------------------------ /wr
' ||+----------------------------- busclk
' |||+---------------------------- hbeat
' |||| +-------------------------- al
' |||| |+------------------------- /bel
' |||| ||+------------------------ /adm
' |||| |||+----------------------- /ram2
' |||| ||||+---------------------- /ram1
' |||| ||||| +---------- a0..10
' |||| ||||| |
' |||| ||||| | +- d0..7
' |||| |||||+----------+ +------+
'port long %00000000_00000aaa_aaaaaaaa_dddddddd ' a: adr, d: daten'Konstanten
dinp long %00000111_11111111_11111111_00000000 ' bus input
dout long %00000111_11111111_11111111_11111111 ' bus output
clr long %00001100_01111000_00000000_00000000 ' bus löschen
_la long %00000000_10000000_00000000_00000000 ' /la bitmaske
_wr long %00000100_00000000_00000000_00000000 ' /wr bitmaske
_ram1 long %00000000_00001000_00000000_00000000 ' /ram1 bitmaske
_ram2 long %00000000_00010000_00000000_00000000 ' /ram2 bitmaske
_latch long %00000000_00000000_11111111_00000000 ' latch bitmaske
_s1 long %00000100_01111000_00000000_00000000 ' bus inaktiv
_b1 long %00000000_00111000_00000000_00000000 ' adm=1, bel=0, wr=0, busclk=0
_b2 long %00000010_00111000_00000000_00000000 ' adm=1, bel=0, wr=0, busclk=1
_b3 long %00000110_00111000_00000000_00000000 ' adm=1, bel=0, wr=1, busclk=1
_a1 long %00000000_01011000_00000000_00000000 ' adm=0, bel=1, wr=0, busclk=0
_a2 long %00000010_01011000_00000000_00000000 ' adm=0, bel=1, wr=0, busclk=1
_a3 long %00000110_01011000_00000000_00000000 ' adm=0, bel=1, wr=1, busclk=1
_hs long %00001000_00000000_00000000_00000000 ' hs=1?
_adr long %00000000_00000111_11111111_00000000 ' adrbus bistmaske
'---------------------------------------------------------------------
h7F7FF7F7 long $7F7FF7F7 '32 bitmaske für LOAD SYSTEM von externen Ram (STATUS)
'---------------------------------------------------------------------
'Konstanten
rtnr long $0 'dient zum identifizieren der verschiedenen Runtimemodule
h00000000 long $0 '0
h00000001 long $1 ' STOP-Statusmeldung
h00007f00 long $7F00
h0000ffff long $FFFF '16 bit Lowmaske
'Variabeln
sprvm long 0 'Merker Bytecode SPRVM
stat long $7FFC 'Zeiger auf Statusregister
areg long $7FF8 'Zeiger auf nächsten Befehl im hRAM
line long 0 'Merker line Nummer
code long 0 'Tockencode
arg1 long 0 'Tokenargument 1
arg23 long 0 'Longargument
arg2 long 0 'Tokenargument 2
arg3 long 0 'Tokenargument 3
temp1 long 0 'Merker
temp2 long 0 'Merker
temp3 long 0 'Merker