Subject: [stella] Usefull illegal opcodes (part 2: NOP) From: "Thomas Jentzsch" <tjentzsch@xxxxxx> Date: Tue, 6 Mar 2001 10:31:34 +0100 |
Hi again, here is another example of an usefull illegal opcode: NOP! Yes, there exists a legal NOP (opcode $ea, 1 byte), but there a lot of undocumented NOPs with different lenghts and cycles. Believe me, there are situations where even illegal NOPs can be usefull, I'll show you later. First, I need to explain something: When your are short of ROM space, there exists a nice trick to save bytes: use BIT. Example: There is a often called subroutine which needs an input parameter. This parameter is mostly one of only some different values: A straightforward solution may look like this: lda #0 ; or 1,2 jsr MySub ... lda #0 ; or 1,2 jsr MySub ... MySub: A simple optimization is to add different entries into the subroutine: jsr MySub0 ... jsr MySub1 ... MySub0: lda #0 beq MySub MySub1: lda #1 bne MySub ... MySub: However, there are a lot of branches (2 bytes) which can be easily replaced with BIT (1 byte): ... MySub0: lda #0 .byte $2c ; opcode for BIT ABS, this skips the next two bytes! MySub1: lda #1 .byte $2c ... MySub: This is my optimal solution for that. The only problem is, that BIT changes flags (V,N,Z) which are sometimes needed later. But there is an illegal opcode solution for that: NOP. To replace BIT ABS (opcode $2c) you can use $0c (NOP ABS). Here is an example from my Thrust code: This code is used to simulate the (sometimes reverse) gravity: lda PlanetHi ; bit 0 of PlanetHi contains the gravity state lsr ; the state bit is shifted into the carry-flag lda P1speedY ; load the current y-speed of the ship (-128..+127) bcs .reverseGravity ; sbc #GRAVITY-1 ; normal gravity, subtract the gravity factor (carry flag=0) .byte $0c ; <-- here I use an illegal NOP because I need the overflow- and negative-flags! .reverseGravity: adc #GRAVITY-1 ; in case of reverse gravity I have to add the factor (carry flag=1) .contGravity: bvc .ySpeedOk ; no overflow, the result is ok, else limit the speed to the maximum bmi .ySpeedPos ; a negative value shows, that the overflowed speed was positive before lda #-128 ; the maximum negative speed .byte $2c ; <- here I use BIT ABS, but $0c would to the job too .ySpeedPos: lda #127 ; the maximum positive speed .ySpeedOk: sta P1speedY ; save the new y-speed Ok, that looks a bit complicated, but it saved me some bytes. Have fun! _______________________________________________________ Thomas Jentzsch | *** Every bit is sacred ! *** tjentzsch at web dot de | ______________________________________________________________________________ Die Fachpresse ist sich einig: WEB.DE 20mal Testsieger! Kostenlos E-Mail, Fax, SMS, Verschlüsselung, POP3, WAP....testen Sie uns! http://freemail.web.de - Archives (includes files) at http://www.biglist.com/lists/stella/archives/ Unsub & more at http://www.biglist.com/lists/stella/
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [stella] Qb: RELEASE CANDIDATE , Kurt . Woloch | Thread | Re: [stella] Usefull illegal opcode, Ruffin Bailey |
Re: [stella] Qb: RELEASE CANDIDATE , Chris Wilkson | Date | Re: [stella] Gunfight 2600: Desciss, Manuel Polik |
Month |