Starting Spin-Interpreter with new bytecode

in Propeller 1
Dear members,
I searched the forums really hard, but now I am stuck.
In order to understand how the Spin-interpreter is started from another cog, I wrote following program:
1. Spin-Code to blink on pin 27
- start new cog with pasm-prg
- stop it self
2. pasm-prg to start in another cog and
- copy the spin-byte-code (witch is stored in the DATA area as hex)
- start cog 0 with spin-interpreter
The byte-code stored in the DATA area is another spin-program to blink on Pin 26.
I wanted to avoid all the hassle with serial communication (SD-card, EEPROM) just to see, how to load another SPIN-prg to adress 0 in the Hub and how to start it.
I found some examples in the forums and booter.spin - and tried to strip the information down to the necessary.
In order to verify the steps, I used the Gear emulator. All runs well, until the Interpreter should start.
I saw the new Spin-code in Cog 0, but then nothing happens.
Testing on hardware showed the same result: nothing.
Is there someone out there, who would help me please ?
Thank You !
I searched the forums really hard, but now I am stuck.
In order to understand how the Spin-interpreter is started from another cog, I wrote following program:
1. Spin-Code to blink on pin 27
- start new cog with pasm-prg
- stop it self
2. pasm-prg to start in another cog and
- copy the spin-byte-code (witch is stored in the DATA area as hex)
- start cog 0 with spin-interpreter
The byte-code stored in the DATA area is another spin-program to blink on Pin 26.
I wanted to avoid all the hassle with serial communication (SD-card, EEPROM) just to see, how to load another SPIN-prg to adress 0 in the Hub and how to start it.
I found some examples in the forums and booter.spin - and tried to strip the information down to the necessary.
In order to verify the steps, I used the Gear emulator. All runs well, until the Interpreter should start.
I saw the new Spin-code in Cog 0, but then nothing happens.
Testing on hardware showed the same result: nothing.
Is there someone out there, who would help me please ?
Thank You !
Comments
I think part of the problem you're having is that the second parameter of cognew() is supposed to be the address of a long, and you're providing the address of a byte.
I do not know if your logic is sound. The purpose of cognew() -- when providing a Spin method as the first argument-- is to launch another interpreter and run the target code. My guess is that you're trying obfuscate the code you want to run. This seems counter to the idea the Propeller being very open.
Essentially, you have to have an assembly routine that copies the binary file of the new program (including the 16 byte header) to hub memory beginning at location 0. At this point, you can't have any Spin interpreters going because they're using the information in the program header. Once the copy is done, your assembly routine can start a Spin interpreter as shown.
thank you for the quick answer.
I have found the solution - now it works:
CON _clkmode = xtal1 + pll16x _xinfreq = 5_000_000 OBJ pin : "Input Output Pins" time : "Timing" PUB Blink27 repeat 3 pin.High(27) time.Pause(200) pin.Low(27) time.Pause(200) cognew(@ASM,@PRG01) cogstop (0) DAT org 0 ASM mov hubram, par 'get pointer for spin-code mov address, #0 ' Beginning of Hub mov counter,#$61 ' 400 Bytes Spin-Programm :loop rdlong spindata, hubram 'get spin-code long wrlong spindata, address 'write to ram add address,#4 'inc address add hubram, #4 'inc pointer djnz counter,#:loop 'loop until done ' ' Launch program in ram ' launch rdword address,#$0004+2 'if pbase address invalid, shutdown cmp address,#$0010 wz if_nz jmp #shutdown :delay djnz time_xtal,#:delay 'allow 20ms to settle rdbyte address,#$0004 'switch to selected clock clkset address mov cognr, #0 ' we want cog 0 or cognr, interpreter coginit cognr 'reboot cog 0 with interpreter cogid cognr 'number of this cog cogstop cognr 'stop this cog shutdown ' mov dira,#0 'cancel any outputs mov smode,#$02 'stop clock clkset smode 'suspend until reset ' ' Constants ' time_xtal long 20 * 20000 / 4 / 1 '20ms (@20MHz, 1 inst/loop) smode long 0 interpreter long ($0004 << 16) | ($F004 << 2) | %0000 ' start Spin-Interpreter ' ' Variables ' counter res 1 hubram res 1 address res 1 spindata res 1 cognr res 1 'Spin-Code in 400 Hex-Bytes as saved after build PRG01 byte $00,$B4,$C4,$04,$6F,$6A,$10,$00,$84,$01,$9C,$01,$20,$00,$A0,$01 .........
Now led #27 blinks 3 times and then led #26
What a good start in the new year of Propeller-discovery ;-)
Greetings