* * This is the hand translation for SNES 65c816 assembler * by Chris Burke. * * The translation includes additional comments to help * with debugging and to clarify the operation of the * original code. I also like to spread out my code a * bit by inserting blank lines after control transfers. * * * Code * * Entry point. Name pointer is at 1+2,S * Returns process ID or match in long A LONGA ON * Start after PID #1 (system process) * Enter with A long ISRUNNIN SA LDA #1 STA _IR_PID,Y LA BRA _IRC_GO LONGA ON * Start at current PID #1 * Enter with A long PIDSCAN * Common code * Enter with A long _IRC_GO LDA _FakeU ;Was PSHS U,Y / LDD #-64; no U PHA PHY LDA #-64 JSL _STKCHECK * Main loop * Enter with A long LONGA ON _IRC_MAIN TYX ;Use X for indexing (Y less capable) INC _IR_PID,X ;WAS INC _IR_PID,Y BEQ _IRC_NO ;BRANCH IF NO MATCH PHX ;Was LEAX _IR_PBUF,Y ;GET THIS PROC'S DESCRIPTOR LDA #_IR_PBUF CLC ADC 1+0,S PLX ;Clean stack temp TAX SA ;Use short A LDA _IR_PID,Y LA JSL F_GPRDSC BCS _IRC_MAIN * Compare names and quit on match * NOTE: Enter with A long _IRC_CMP LDA 1+6,S ;Was LDX 6,S ;RECOVER POINTER TO CALLER'S NAME TAX BSR _IRC_CMP BCC _IRC_YES BRA _IRC_MAIN * No match -- clean stack and return 0 * NOTE: Enter with A long _IRC_ERR1 _IRC_NO PLY ;Was PULS Y,U,PC PLA STA _FakeU LDA #0 ;Order changed so we get right N,Z flags RTS * Found a match -- clean stack and return the matching PID. * NOTE: Enter with A long _IRC_YES PLY ;Was PULS Y,U,PC PLA STA _FakeU SA LDA _IR_PID,Y ;Order changed so we get right N,Z flags (same Y) LA AND #$00FF RTS