void playmv() { /* locate the ship at SHIP_R,SHIPC (PLAYER_SPRITE already moved) */ uint8 x; //sploct(PLAYER_SPRITE,r,c); sploct(PLAYER_SPRITE+1,SHIP_R,SHIP_C+16); sploct(PLAYER_SPRITE+2,SHIP_R+16,SHIP_C); sploct(PLAYER_SPRITE+3,SHIP_R+16,SHIP_C+16); if ((!f18a)||(shield > 0)) { sploct(PLAYER_SHIELD,SHIP_R,SHIP_C); sploct(PLAYER_SHIELD+1,SHIP_R,SHIP_C+16); sploct(PLAYER_SHIELD+2,SHIP_R+16,SHIP_C); sploct(PLAYER_SHIELD+3,SHIP_R+16,SHIP_C+16); } sploct(PLAYER_FLAME,SHIP_R+flameOffset,SHIP_C+8); // set shield color if (shield != oldshield) { if (f18a) { unsigned int old = nBank; SWITCH_IN_BANK14a; if (oldshield == 0) { // new shield must not be zero, so turn on the shield patterns shieldsOn(); } if (shield > 70) { loadpal_f18a(F18SHIELDMAX, PAL_PLAYSHIELD*4+1, 7); } else if (shield > 40) { // also find the code that plays sfx_shieldwarn loadpal_f18a(F18SHIELDMED, PAL_PLAYSHIELD*4+1, 7); } else if (shield > 0) { loadpal_f18a(F18SHIELDLOW, PAL_PLAYSHIELD*4+1, 7); } else { // done with shield, back to normal shieldsOff(); } SWITCH_IN_PREV_BANK(old); } else { if (oldshield == 0) { // new shield must not be zero, so turn on the shield patterns shieldsOn(); } if (shield > 70) { x=COLOR_WHITE; } else if (shield > 40) { // also find the code that plays sfx_shieldwarn x=COLOR_DKYELLOW; } else if (shield > 0) { x=COLOR_DKRED; } else { x=COLOR_BLACK; // done with shield, back to normal shieldsOff(); } spcolr(PLAYER_SHIELD,x); spcolr(PLAYER_SHIELD+1,x); spcolr(PLAYER_SHIELD+2,x); spcolr(PLAYER_SHIELD+3,x); } oldshield = shield; } } /home/tursilion/newtms9900-gcc/newgcc9900/bin/tms9900-gcc -Os -std=c99 -c -s --save-temp -DTI99 -fno-builtin -fno-function-cse -I/mnt/d/work/libti99ALL -I/mnt/d/work/ti/vgmcomp2/Players/libtivgm2 -o superspaceacer.o superspaceacer.c def playmv playmv ai r10, >FFFC1 stack mov r14, @>2(r10) mov r11, *r10 locate rest of ship (first sprite already moved) movb @SpriteTab, @SpriteTab+4 sploct(PLAYER_SPRITE+1,SHIP_R,SHIP_C+16); (R) movb @LC19, r1 r1=16 ab @SpriteTab+1, r1 ship_C+16 movb r1, @SpriteTab+5 (C) movb @LC19, r2 R2=16 ab @SpriteTab, r2 (two more) movb r2, @SpriteTab+8 movb @SpriteTab+1, @SpriteTab+9 movb r2, @SpriteTab+12 movb r1, @SpriteTab+13 mov @f18a, r2 if !f18a, locate shield sprites jeq L80 mov @shield, r0 if shield=0, skip jeq L81 L80 locate shield sprites movb @SpriteTab, @SpriteTab+72 movb @SpriteTab+1, @SpriteTab+73 movb @SpriteTab, @SpriteTab+76 movb @LC19, r1 ab @SpriteTab+1, r1 movb r1, @SpriteTab+77 movb @LC19, r3 ab @SpriteTab, r3 movb r3, @SpriteTab+80 movb @SpriteTab+1, @SpriteTab+81 movb r3, @SpriteTab+84 movb r1, @SpriteTab+85 L81 movb @flameOffset+1, r1 locate flame sprite ab @SpriteTab, r1 movb r1, @SpriteTab+68 movb @LC20, r1 ab @SpriteTab+1, r1 movb r1, @SpriteTab+69 c @shield, @oldshield did shield counter change? jne JMP_1 execute if yes b @L95 skip if not JMP_1 mov r2, r0 R2 contains F18, so test it jeq L83 skip ahead if not F18A mov @nBank, r14 This is the F18A side li r2, >6038 mov r2, @nBank mov r2, @>6038 mov r1, r0 this is supposed to be checking oldshield against zero - where is it set? <<<<<<46 jle L85 movb @LC22, r3 movb @LC23, r2 li r1, F18SHIELDMAX jmp L96 L85 ci r1, >28 jle L87 movb @LC22, r3 movb @LC23, r2 li r1, F18SHIELDMED L96 bl @loadpal_f18a jmp L86 L87 mov r1, r0 jeq L88 movb @LC22, r3 movb @LC23, r2 li r1, F18SHIELDLOW jmp L96 L88 mov @shieldsOff, r1 bl *r1 L86 mov r14, @nBank mov r14, *r14 jmp L89 L83 non-F18A version mov r1, r0 same check for oldshield against zero, but R1 was never loaded with it <<<<<<7820 in my test) mov @shieldsOn, r1 bl *r1 L90 mov @shield, r1 ci r1, >46 jle L91 movb @LC24, r1 jmp L92 L91 ci r1, >28 jle L93 movb @LC25, r1 jmp L92 L93 mov r1, r0 jeq L94 movb @LC26, r1 jmp L92 L94 mov @shieldsOff, r1 bl *r1 movb @LC23, r1 L92 movb r1, @SpriteTab+75 movb r1, @SpriteTab+79 movb r1, @SpriteTab+83 movb r1, @SpriteTab+87 L89 F18A or not, both come here mov @shield, @oldshield to save the oldshield value L95 come here if no shield change mov *r10+, r11 fix up stack mov *r10+, r14 b *r11 .size playmv, .-playmv