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
Était-ce utile?

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:

  1. Windows 95 used code like this to build graphics rendering code on the stack.
  2. Viruses and trojans use this as an attack vector (write code on the stack or manipulate return addresses to simluate a JMP)
  3. 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.)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top