
FORTH

: LAST-BYTE-OFFSET ;
: NUM-SPRITES 4 + ;
: FIRST-SPRITE 8 + ;
: FIRST-FREE-WORD 12 + ;

: DEF-SPRITE-AREA ( SIZE -> )
   <BUILDS
      HERE >R
      DUP ALLOT
      R LAST-BYTE-OFFSET !
      0 R NUM-SPRITES !
      16 R FIRST-SPRITE !
      16 R> FIRST-FREE-WORD !
   DOES>
   ;

HEX
CODE MERGE-SPRITE' ( SPRITE-AREA / FILENAME -> )
   ENTER,
   R0 20 # MOV,
   R0 PUSH,
   CALL WORD
   R2 POP,
   R2 R2 4 # ADD,
   R1 POP,
   R0 0B # MOV,
   R0 R0 200 # ORR,
   2E SWI,
   LEAVE,
END-CODE

CODE PUT-SPRITE ( CTRL-BLOCK / SPRITE-PTR / X / Y / GCOL )
   ENTER,
   R5 POP,
   R4 POP,
   R3 POP,
   R2 POP,
   R1 POP,
   R0 22 # MOV,
   R0 R0 200 # ORR,
   2E SWI,
   LEAVE,
END-CODE
DECIMAL

: GET-SPRITE-CTRL-BLOCK ( SPRITE-AREA / SPRITE-NO -> CTRL-BLOCK )
   SWAP DUP
   FIRST-SPRITE @ + ( ADDR OF FIRST SPRITE )
   SWAP -DUP IF
      0 DO
         DUP @ +
      LOOP
   THEN
   ;

HEX
CODE READ-SPRITE-PIXEL ( CTRL-BLOCK / SPRITE-PTR / X / Y -> )
   R4 POP,
   R3 POP,
   R2 POP,
   R1 POP,
   R0 200 # MOV,
   R0 R0 29 # ORR,
   2E SWI,
   R5 PUSH,
   PC R14 MOV,
END-CODE

CODE SPRITE-SIZE ( CTRL-BLOCK / SPRITE-PTR -> X / Y )
   R2 POP,
   R1 POP,
   R0 28 # MOV,
   R0 R0 200 # ORR,
   2E SWI,
   R3 PUSH,
   R4 PUSH,
   PC R14 MOV,
END-CODE
DECIMAL
