![]() |
Routines |
| A | New animatory state |
| D | New y-coordinate (3-17) |
| E | New x-coordinate (0-189) |
| H | Character number (183-214) |
| 24880 | LD L,2 | Point HL at byte 2 of the character's buffer |
| 24882 | LD (HL),D | Fill in the new y-coordinate |
| 24883 | DEC L | L=1 |
| 24884 | LD (HL),E | Fill in the new x-coordinate |
| 24885 | DEC L | L=0 |
| 24886 | LD (HL),A | Fill in the new animatory state |
| 24887 | LD C,A | C=new animatory state |
| 24888 | LD A,(32767) | A=leftmost column of play area on screen (0-160) |
| 24891 | SUB 3 | |
| 24893 | JR C,24897 | |
| 24895 | CP E | |
| 24896 | RET NC | Return if the character is entirely off-screen to the left |
| 24897 | ADD A,34 | |
| 24899 | CP E | |
| 24900 | RET C | Return if the character is entirely off-screen to the right |
| 24901 | SUB 32 | A=E-(32767): the character's relative x-coordinate (-2 to 31) |
| 24903 | CPL | |
| 24904 | ADD A,E | |
| 24905 | LD B,3 | The sprites are 3 tiles wide |
| 24907 | PUSH HL | |
| 24908 | LD H,215 | |
| 24910 | CP 254 | Is the character either fully on-screen or walking off it to the right? |
| 24912 | JR C,24924 | Jump if so |
| 24914 | LD H,219 | |
| 24916 | DEC B | B=2 |
| 24917 | INC A | Is the character one-third off/two-thirds on at the left? |
| 24918 | JR Z,24924 | Jump if so |
| 24920 | LD H,223 | |
| 24922 | DEC B | B=1 (character is one-third on-screen at the left) |
| 24923 | XOR A | |
| 24924 | LD E,A | E=leftmost column of the screen occupied by the character sprite (0-31) |
| 24925 | SUB 30 | |
| 24927 | JR C,24932 | Jump if the character is one- or two-thirds off-screen to the right |
| 24929 | CPL | |
| 24930 | ADD A,B | |
| 24931 | LD B,A |
| 24932 | LD L,C | L=animatory state |
| 24933 | LD C,0 | |
| 24935 | BIT 7,L | Is the character facing left? |
| 24937 | JR Z,24945 | Jump if so |
| 24939 | LD C,248 | |
| 24941 | LD A,182 | |
| 24943 | SUB H | |
| 24944 | LD H,A |
| 24945 | SET 7,L | Point HL at the UDG reference for the sprite tile |
| 24947 | LD A,E | A=leftmost column of the screen occupied by the sprite (0-31) |
| 24948 | EXX | |
| 24949 | AND 7 | |
| 24951 | ADD A,120 | |
| 24953 | LD L,A | |
| 24954 | LD H,225 | |
| 24956 | LD C,(HL) | Pick up a byte from the table at 57720 |
| 24957 | EXX |
| 24958 | LD A,E | A=leftmost column of the screen occupied by the sprite |
| 24959 | RRCA | Set A to the LSB of the first byte of the SRB that needs to be modified (corresponding to the top left tile of the sprite) |
| 24960 | RRCA | |
| 24961 | RRCA | |
| 24962 | AND 3 | |
| 24964 | ADD A,D | |
| 24965 | ADD A,D | |
| 24966 | ADD A,D | |
| 24967 | ADD A,D | |
| 24968 | EXX | |
| 24969 | LD B,A | Copy this LSB to B' |
| 24970 | LD H,127 | The SRB starts at page 127 (32512) |
| 24972 | EXX | |
| 24973 | LD E,0 | E will count up to 4 (the number of rows occupied by a character sprite) |
| 24975 | LD A,(HL) | Pick up the sprite tile UDG reference in A |
| 24976 | AND A | Is this the "null" UDG (blank square)? |
| 24977 | JR Z,24989 | Jump if so |
| 24979 | LD A,E | A=row number of character sprite (0-3) |
| 24980 | ADD A,A | Multiply by 4 (the number of bytes of the SRB that correspond to one row of the screen) |
| 24981 | ADD A,A | |
| 24982 | EXX | |
| 24983 | ADD A,B | Point HL' at the relevant byte of the SRB |
| 24984 | LD L,A | |
| 24985 | LD A,C | The bit set in A is the bit that needs setting in the SRB byte |
| 24986 | OR (HL) | Set the bit in the SRB |
| 24987 | LD (HL),A | |
| 24988 | EXX | |
| 24989 | INC H | Point HL at the UDG reference for the next tile in the sprite (one row down) |
| 24990 | INC E | Next row down in this column of the sprite |
| 24991 | BIT 2,E | Have we done all four rows yet? |
| 24993 | JR Z,24975 | Jump back if not |
| 24995 | DEC B | Have we done all the columns occupied by the sprite yet? |
| 24996 | JR Z,25009 | Jump if so |
| 24998 | LD A,H | Point HL at the UDG reference for the tile in the top row of the next column of the sprite (C=0 if the character's facing left, -8 if facing right) |
| 24999 | ADD A,C | |
| 25000 | LD H,A | |
| 25001 | EXX | |
| 25002 | RRC C | Move the SRB marker bit one place to the right (possibly wrapping round to bit 7) |
| 25004 | JR NC,24972 | Jump back if there are still bits to be set in the current SRB byte |
| 25006 | INC B | Otherwise move to the next SRB byte |
| 25007 | JR 24972 | |
| 25009 | POP HL | Restore the character number to H (L=0) |
| 25010 | RET |