Question
According to the DCPU specification, the only time a SET
instruction fails is if the a
value is a literal.
So would the following work?
SET [PC],0x1000
A more useful version would be setting an offset of PC
, so a rather strange infinite loop would be:
SET [PC+0x2],0x89C3 ; = SUB PC,0x2
La solution
Probably (= I think it should work but I didn't try).
This is called "self modifying" code and was quite common the 8bit era because of a) limited RAM and b) limited code size. Code like that is very powerful but error prone. If your code base grows, this can quickly become a maintenance nightmare.
Famous use cases:
- Windows 95 used code like this to build graphics rendering code on the stack.
- Viruses and trojans use this as an attack vector (write code on the stack or manipulate return addresses to simluate a
JMP
) - Simulate switch statements on the C64
Autres conseils
There's no value for [PC], so I'm guessing you need to do it in a round-about way by storing PC in something you can use as a pointer (registry or memory).
SET A , PC SET [A+3], 0x8dc3 ; SUB PC, 3 (if A can't be changed from outside SUB PC,2 works too.)