-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGRABBER.EL
More file actions
1013 lines (806 loc) · 21.6 KB
/
Copy pathGRABBER.EL
File metadata and controls
1013 lines (806 loc) · 21.6 KB
1
'----.DOCS'----' ÇRABBER ÔOOL - PORTED TO ÅLEVEN (FOR EASIER MAINTENANCE)' ============'' ÕSAGE:' -----' - ÐRESS 'SPACE' KEY ON TOP-LEFT POINT' - ÔHEN USE CURSOR KEYS TO MOVE TO BOTTOM-RIGHT POINT & PRESS 'SPACE'' - ÐRESS '-' AND '+' KEYS TO MOVE BETWEEN PREVIOUS AND NEXT FRAMES' - ÐRESS 'C' TO REDRAW CURRENT FRAME' - ÐRESS 'Y' TO YANK/COPY A SELECTED REGION' - ÐRESS 'P' TO PASTE A SELECTED REGION TO CURRENT CURSOR LOCATION' - ÐRESS 'E' TO EDIT CURRENT FRAME' - ÐRESS 'D' TO DELETE THE CURRENT FRAME' - ÐRESS 'L' THEN A FRAME# TO LOAD THAT FRAME' - ÐRESS 'X' TO EXIT PROGRAM' - Æ1 = LOAD CHAR+COLOR .BIN FILE' - Æ3 = SAVE CHAR+COLOR .BIN FILE' - Æ5 = SAVE OPTIMIZED+REPAIRED .BIN FILE' - Æ7 = EDIT HIT BOXES#OUTPUT "GRABBER"' ÃHAR+ÃOLOR ÆILE ÆORMAT (Æ1/Æ3 KEYS)' ======================' ×ÏÒÄ: PROG-ADDRESS (IGNORED)' ×ÏÒÄ: SIZE OF DATA (INCLUDING THIS ×ÏÒÄ AND ONWARDS)' ÂÙÔÅ: # OF FRAMES' ' ÆÒÁÍÅ #0' --------' ÂÙÔÅ: X' ÂÙÔÅ: Y' ÂÙÔÅ: W' ÂÙÔÅ: H' Ä×ÏÒÄ: HEAD BOX (X1,Y1,X2,Y2)' Ä×ÏÒÄ: TORSO BOX (X1,Y1,X2,Y2)' Ä×ÏÒÄ: FEET BOX (X1,Y1,X2,Y2)' Ä×ÏÒÄ: ATTACK BOX (X1,Y1,X2,Y2)' ÂÙÔÅ[W*H]: CHAR DATA' ÂÙÔÅ[W*H]: COLOR DATA'' ÆÒÁÍÅ #1' --------' (AS BEFORE...)'' ÆÒÁÍÅ #N' --------' (AS BEFORE...)' ÃOLOR-ONLY ÆILE ÆORMAT (Æ5 KEY)' ======================' ×ÏÒÄ: PROG-ADDRESS (IGNORED)' ×ÏÒÄ: SIZE OF DATA (INCLUDING THIS ×ÏÒÄ AND ONWARDS)' ÂÙÔÅ: # OF FRAMES' ' ÆÒÁÍÅ #0' --------' ÂÙÔÅ: X' ÂÙÔÅ: Y' ÂÙÔÅ: W' ÂÙÔÅ: H' Ä×ÏÒÄ: HEAD BOX (X1,Y1,X2,Y2)' Ä×ÏÒÄ: TORSO BOX (X1,Y1,X2,Y2)' Ä×ÏÒÄ: FEET BOX (X1,Y1,X2,Y2)' Ä×ÏÒÄ: ATTACK BOX (X1,Y1,X2,Y2)' ÂÙÔÅ[W*H]: COLOR DATA'' ÆÒÁÍÅ #1' --------' (AS BEFORE...)'' ÆÒÁÍÅ #N' --------' (AS BEFORE...)'--------.DECLARES'--------#DECLARE CLR¯LINE¯RIGHT$ = CHR$(27)+"Q" ' OLD CL$#DECLARE CURRENT¯FRAME ' OLD FF#DECLARE X, Y ' CURSOR POSITION#DECLARE PTR ' POINTER TO DATA BYTES IN MEMORY#DECLARE FRAME¯COUNT#DECLARE FRMIDX#DECLARE BYTES¯USED ' OLD L#DECLARE FRMW, FRMH#DECLARE START¯CHAR, START¯COLOR, END¯CHAR, END¯COLOR#DECLARE STARTX, STARTY, ENDX, ENDY#DECLARE CURR¯FRAME#DECLARE SRC¯CHAR¯PTR, SRC¯CLR¯PTR#DECLARE A$, XIDX, YIDX#DECLARE DEST¯CHAR¯PTR, DEST¯CLR¯PTR#DECLARE FNAME$#DECLARE CVAL#DECLARE START¯PTR, END¯PTR, CURR¯PTR, SRC¯PTR, DEST¯PTR, SZ, K, LN#DECLARE B(50,3) ' HITBOXES#DECLARE X1, Y1, X2, Y2#DECLARE HB¯SEL = 0, HB¯MODE, IDX#DECLARE CLIPBOARD¯CHAR&(80*50)#DECLARE CLIPBOARD¯CLR&(80*50)#DECLARE CLIPW, CLIPH#DEFINE ÓÔÏÒůÓÔÁÒÔ¯ÐÏÓ = 0#DEFINE ÓÔÏÒůÅÎįÐÏÓ = 1#DECLARE STORE¯STATE ' ARE WE STORING START/END POS CHAR/COLOUR DETAILS#DECLARE NEW¯FRAME¯FLAG#DEFINE ËÅÙ¯ÕÐ = "‘"#DEFINE ËÅÙ¯ÄÏ×Î = ""#DEFINE ËÅÙ¯ÌÅÆÔ = ""#DEFINE ËÅÙ¯ÒÉÇÈÔ = ""#DEFINE ËÅÙ¯Æ1 = "…"#DEFINE ËÅÙ¯Æ3 = "†"#DEFINE ËÅÙ¯Æ4 = "Š"#DEFINE ËÅÙ¯Æ5 = "‡"#DEFINE ËÅÙ¯Æ7 = "ˆ"#DEFINE ËÅÙ¯Æ8 = "Œ"#DEFINE ËÅÙ¯ÅÓà = CHR$(27)#DEFINE ËÅÙ¯ÒÅÖ¯ÏÎ = ""#DEFINE ËÅÙ¯ÒÅÖ¯ÏÆÆ = "’"#DEFINE ËÅÙ¯ÒÅÔÕÒÎ = CHR$(13)#DEFINE ÏЯÃÏÐÙ = 0#DEFINE ÏЯÍÉØ = 1#DEFINE ÏЯÓ×ÁÐ = 2#DEFINE ÏЯÆÉÌÌ = 3#DEFINE ȯÍÏÄůÂÒÏ×ÓÅ = 0#DEFINE ȯÍÏÄůÓÅ̯ÃÏÏÒÄ1 = 1#DEFINE ȯÍÏÄůÓÅ̯ÃÏÏÒÄ2 = 2#DEFINE ȯÍÏÄůÃÏÍÐÌÅÔÅ = 3.OFFSETS#DEFINE ÏÆÆÓÅÔ¯ÄÁÔÁ¯ÓÉÚÅ = 0#DEFINE ÏÆÆÓÅÔ¯ÎÕͯÆÒÁÍÅÓ = 2#DEFINE ÏÆÆÓÅÔ¯ÆÒÁÍÅ0 = 3#DEFINE ÆÒÍ¯ÏÆÆÓÅÔ¯Ø = 0#DEFINE ÆÒÍ¯ÏÆÆÓÅÔ¯Ù = 1#DEFINE ÆÒÍ¯ÏÆÆÓÅÔ¯× = 2#DEFINE ÆÒÍ¯ÏÆÆÓÅÔ¯È = 3#DEFINE ÆÒÍ¯ÏÆÆÓÅÔ¯ÈÉÔÂÏØÅÓ = 4#DEFINE ÆÒÍ¯ÏÆÆÓÅԯȯÈÅÁÄ = 4#DEFINE ÆÒÍ¯ÏÆÆÓÅԯȯÔÏÒÓÏ = 8#DEFINE ÆÒÍ¯ÏÆÆÓÅԯȯÆÅÅÔ = 12#DEFINE ÆÒÍ¯ÏÆÆÓÅԯȯÁÔÔÁÃË = 16#DEFINE ÆÒÍ¯ÏÆÆÓÅÔ¯ÄÁÔÁ = 20#DECLARE BX¯OFFS(3)BX¯OFFS(0) = ÆÒÍ¯ÏÆÆÓÅԯȯÈÅÁÄBX¯OFFS(1) = ÆÒÍ¯ÏÆÆÓÅԯȯÔÏÒÓÏBX¯OFFS(2) = ÆÒÍ¯ÏÆÆÓÅԯȯÆÅÅÔBX¯OFFS(3) = ÆÒÍ¯ÏÆÆÓÅԯȯÁÔÔÁÃË'----.MAIN'---- KEY OFF POKE $D020, 11, 14 GOSUB INIT¯VARS GOSUB CHECK¯MAGIC¯SIGNATURE GOSUB CHECK¯EDIT¯FLAG GOSUB LOCATE¯NEXT¯FREE¯BYTE GOSUB DRAW¯FOOTER DO WHILE 1 GOSUB STORE¯STATE¯INFO GOSUB DRAW¯CURSOR GOSUB GET¯USER¯INPUT GOSUB SHOW¯COORDS LOOP'-----------.SHOW¯COORDS'----------- CURSOR 0, 49 PRINT CLR¯LINE¯RIGHT$; IF STORE¯STATE = ÓÔÏÒůÓÔÁÒÔ¯ÐÏÓ THEN BEGIN PRINT CHR$(27)+"QX=";X;", Y=";Y; BEND IF STORE¯STATE = ÓÔÏÒůÅÎįÐÏÓ THEN BEGIN PRINT CHR$(27)+"QX=";STARTX;", Y=";STARTY; PRINT ", W=";X-STARTX+1;", H=";Y-STARTY+1; BEND PRINT CLR¯LINE¯RIGHT$; RETURN'-----------.ENTER¯COORD'----------- DO WHILE 1 GOSUB STORE¯STATE¯INFO GOSUB DRAW¯CURSOR GET KEY A$ IF A$ <> ËÅÙ¯ÒÅÔÕÒÎ THEN GOSUB RESTORE¯CHAR¯UNDER¯CURSOR IF A$ = ËÅÙ¯ÌÅÆÔ AND X > 0 THEN X = X - 1 IF A$ = ËÅÙ¯ÒÉÇÈÔ AND X < 79 THEN X = X + 1 IF A$ = ËÅÙ¯ÕÐ AND Y > 0 THEN Y = Y - 1 IF A$ = ËÅÙ¯ÄÏ×Î AND Y < 49 THEN Y = Y + 1 IF A$=ËÅÙ¯ÒÅÔÕÒÎ THEN EXIT LOOP RETURN'--------------.GET¯USER¯INPUT'-------------- GETKEY A$ IF A$ <> " " THEN GOSUB RESTORE¯CHAR¯UNDER¯CURSOR IF A$ = ËÅÙ¯ÌÅÆÔ AND X > 0 THEN X = X - 1 IF A$ = ËÅÙ¯ÒÉÇÈÔ AND X < 79 THEN X = X + 1 IF A$ = ËÅÙ¯ÕÐ AND Y > 0 THEN Y = Y - 1 IF A$ = ËÅÙ¯ÄÏ×Î AND Y < 49 THEN Y = Y + 1 IF A$ = "D" THEN GOSUB DELETE¯FRAME IF A$ = "Y" THEN GOSUB YANK¯SELECTION IF A$ = "P" THEN GOSUB PASTE IF A$ = "C" THEN BEGIN PRINT "“"; CURR¯FRAME = 0 GOSUB DRAW¯CURR¯FRAME BEND IF A$="-" AND CURR¯FRAME > 0 THEN BEGIN CURR¯FRAME = CURR¯FRAME - 1 GOSUB DRAW¯CURR¯FRAME BEND IF A$="=" AND CURR¯FRAME < PEEK($50002)-1 THEN BEGIN CURR¯FRAME = CURR¯FRAME + 1 GOSUB DRAW¯CURR¯FRAME BEND IF A$=" " THEN BEGIN STORE¯STATE = STORE¯STATE + 1 IF STORE¯STATE = 2 THEN BEGIN GOSUB SAVE¯NEW¯FRAME¯TO¯MEMORY END BEND BEND IF A$="L" THEN GOSUB LOAD¯FRAME IF A$="X" THEN BEGIN CURSOR 0,0 KEY ON END BEND IF A$="E" THEN BEGIN CURSOR 0,40 POKE $5FFFC, 1 ' EDIT FLAG ON POKE $5FFFD, CURR¯FRAME KEY ON END BEND IF A$ = ËÅÙ¯Æ1 THEN GOSUB LOAD¯BIN IF A$ = ËÅÙ¯Æ3 THEN GOSUB SAVE¯BIN IF A$ = ËÅÙ¯Æ5 THEN GOSUB SAVE¯OPTIMISED IF A$ = ËÅÙ¯Æ7 THEN GOSUB EDIT¯HIT¯BOXES RETURN'--------------.EDIT¯HIT¯BOXES'-------------- HB¯MODE = ȯÍÏÄůÂÒÏ×ÓÅ DO WHILE 1 GOSUB SHOW¯HITBOX¯TABLE GOSUB DRAW¯HITBOXES GOSUB ȯGET¯USER¯INPUT IF A$="X" OR A$=ËÅÙ¯ÅÓà OR A$=ËÅÙ¯Æ7 THEN BEGIN PRINT CHR$(147); GOSUB DRAW¯CURR¯FRAME EXIT BEND LOOP RETURN#DEFINE ÃÈÁÒ¯ÂÏØ¯ÔÌ = 112#DEFINE ÃÈÁÒ¯ÂÏØ¯ÔÒ = 110#DEFINE ÃÈÁÒ¯ÂÏØ¯ÂÌ = 109#DEFINE ÃÈÁÒ¯ÂÏØ¯ÂÒ = 125#DEFINE ÃÈÁÒ¯ÈÏÒÚ = 64#DEFINE ÃÈÁÒ¯ÖÅÒÔ = 93#DEFINE ÃÈÁÒ¯ÓÐÁÃÅ = 32'---------.DRAW¯CHAR'--------- IF PEEK($40800 + X + Y * 80) <> ÃÈÁÒ¯ÓÐÁÃÅ THEN BEGIN K = K + 128 BEND:ELSE BEGIN POKE $FF80000 + X + Y * 80, 1 BEND POKE $40800 + X + Y * 80, K RETURN'-------------.DRAW¯HITBOXES'------------- GOSUB DRAW¯CURR¯FRAME GOSUB GET¯CURR¯FRAME¯PTR FOR IDX = 0 TO 3 X1 = PEEK(PTR + BX¯OFFS(IDX)) Y1 = PEEK(PTR + BX¯OFFS(IDX) + 1) X2 = PEEK(PTR + BX¯OFFS(IDX) + 2) Y2 = PEEK(PTR + BX¯OFFS(IDX) + 3) IF NOT (X1=0 AND Y1=0 AND X2=0 AND Y2=0) THEN BEGIN ' DRAW CORNERS ' ------------ X = X1 : Y = Y1 : K = ÃÈÁÒ¯ÂÏØ¯ÔÌ : GOSUB DRAW¯CHAR X = X2 : Y = Y1 : K = ÃÈÁÒ¯ÂÏØ¯ÔÒ : GOSUB DRAW¯CHAR X = X1 : Y = Y2 : K = ÃÈÁÒ¯ÂÏØ¯ÂÌ : GOSUB DRAW¯CHAR X = X2 : Y = Y2 : K = ÃÈÁÒ¯ÂÏØ¯ÂÒ : GOSUB DRAW¯CHAR ' DRAW HORIZONTALS ' ---------------- FOR X = X1+1 TO X2-1 Y = Y1 : K = ÃÈÁÒ¯ÈÏÒÚ : GOSUB DRAW¯CHAR Y = Y2 : K = ÃÈÁÒ¯ÈÏÒÚ : GOSUB DRAW¯CHAR NEXT X ' DRAW VERTICALS ' -------------- FOR Y = Y1+1 TO Y2-1 X = X1 : K = ÃÈÁÒ¯ÖÅÒÔ : GOSUB DRAW¯CHAR X = X2 : K = ÃÈÁÒ¯ÖÅÒÔ : GOSUB DRAW¯CHAR NEXT Y BEND NEXT IDX RETURN'-----------------.SHOW¯HITBOX¯TABLE'----------------- GOSUB GET¯CURR¯FRAME¯PTR CURR¯PTR = PTR IF HB¯SEL = 0 THEN PRINT ËÅÙ¯ÒÅÖ¯ÏÎ;:ELSE PRINT ËÅÙ¯ÒÅÖ¯ÏÆÆ; CURSOR 40,40:PRINT ËÅÙ¯ÅÓÃ;"Q HEAD: "; K = ÆÒÍ¯ÏÆÆÓÅԯȯÈÅÁÄ:GOSUB SHOW¯HITBOX¯COORDS IF HB¯SEL = 1 THEN PRINT ËÅÙ¯ÒÅÖ¯ÏÎ;:ELSE PRINT ËÅÙ¯ÒÅÖ¯ÏÆÆ; CURSOR 40,41:PRINT ËÅÙ¯ÅÓÃ;"Q TORSO: "; K = ÆÒÍ¯ÏÆÆÓÅԯȯÔÏÒÓÏ:GOSUB SHOW¯HITBOX¯COORDS IF HB¯SEL = 2 THEN PRINT ËÅÙ¯ÒÅÖ¯ÏÎ;:ELSE PRINT ËÅÙ¯ÒÅÖ¯ÏÆÆ; CURSOR 40,42:PRINT ËÅÙ¯ÅÓÃ;"Q FEET: "; K = ÆÒÍ¯ÏÆÆÓÅԯȯÆÅÅÔ:GOSUB SHOW¯HITBOX¯COORDS IF HB¯SEL = 3 THEN PRINT ËÅÙ¯ÒÅÖ¯ÏÎ;:ELSE PRINT ËÅÙ¯ÒÅÖ¯ÏÆÆ; CURSOR 40,43:PRINT ËÅÙ¯ÅÓÃ;"QATTACK: "; K = ÆÒÍ¯ÏÆÆÓÅԯȯÁÔÔÁÃË:GOSUB SHOW¯HITBOX¯COORDS PRINT ËÅÙ¯ÒÅÖ¯ÏÆÆ; GOSUB GET¯SELECTED¯COORDS RETURN'--------------------------.GET¯SELECTED¯OFFSET¯INTO¯K'-------------------------- IF HB¯SEL = 0 THEN K = ÆÒÍ¯ÏÆÆÓÅԯȯÈÅÁÄ IF HB¯SEL = 1 THEN K = ÆÒÍ¯ÏÆÆÓÅԯȯÔÏÒÓÏ IF HB¯SEL = 2 THEN K = ÆÒÍ¯ÏÆÆÓÅԯȯÆÅÅÔ IF HB¯SEL = 3 THEN K = ÆÒÍ¯ÏÆÆÓÅԯȯÁÔÔÁÃË RETURN'-------------------.GET¯SELECTED¯COORDS'------------------- GOSUB GET¯SELECTED¯OFFSET¯INTO¯K GOSUB PEEK¯SELECTED¯COORDS¯INTO¯X1Y1X2Y2 RETURN '-----------------.ȯGET¯USER¯INPUT'----------------- GET KEY A$ IF A$=ËÅÙ¯ÕÐ AND HB¯SEL > 0 THEN HB¯SEL = HB¯SEL - 1 IF A$=ËÅÙ¯ÄÏ×Î AND HB¯SEL < 3 THEN HB¯SEL = HB¯SEL + 1 IF A$="-" AND CURR¯FRAME > 0 THEN BEGIN CURR¯FRAME = CURR¯FRAME - 1 GOSUB DRAW¯CURR¯FRAME BEND IF A$="=" AND CURR¯FRAME < PEEK($50002)-1 THEN BEGIN CURR¯FRAME = CURR¯FRAME + 1 GOSUB DRAW¯CURR¯FRAME BEND IF A$=ËÅÙ¯ÒÅÔÕÒÎ THEN BEGIN GOSUB GET¯SELECTED¯COORDS¯INTO¯X1Y1X2Y2 GOSUB GET¯SELECTED¯OFFSET¯INTO¯K POKE CURR¯PTR + K , X1 POKE CURR¯PTR + K + 1, Y1 POKE CURR¯PTR + K + 2, X2 POKE CURR¯PTR + K + 3, Y2 BEND RETURN'---------------------------------.GET¯SELECTED¯COORDS¯INTO¯X1Y1X2Y2'--------------------------------- ' COORD1 X = X1 : Y = Y1 STORE¯STATE = ÓÔÏÒůÓÔÁÒÔ¯ÐÏÓ GOSUB ENTER¯COORD X1 = X Y1 = Y ' COORD2 STORE¯STATE = ÓÔÏÒůÅÎįÐÏÓ GOSUB ENTER¯COORD X2 = X Y2 = Y POKE $40800 + STARTX + STARTY * 80, START¯CHAR POKE $FF80000 + STARTX + STARTY * 80, START¯COLOR POKE $40800 + ENDX + ENDY * 80, END¯CHAR POKE $FF80000 + ENDX + ENDY * 80, END¯COLOR RETURN'----------------------------------.PEEK¯SELECTED¯COORDS¯INTO¯X1Y1X2Y2'---------------------------------- X1 = PEEK(CURR¯PTR + K) Y1 = PEEK(CURR¯PTR + K + 1) X2 = PEEK(CURR¯PTR + K + 2) Y2 = PEEK(CURR¯PTR + K + 3) RETURN'------------------.SHOW¯HITBOX¯COORDS'------------------ GOSUB PEEK¯SELECTED¯COORDS¯INTO¯X1Y1X2Y2 PRINT X1;",";Y1;",";X2;",";Y2; RETURN'--------.LOAD¯BIN'-------- INPUT "LOAD NAME: ";FNAME$ IF FNAME$ = "" THEN RETURN BLOAD (FNAME$),P($50000) ' GOSUB ONE¯OFF¯REPAIR RETURN'--------------.ONE¯OFF¯REPAIR'-------------- ' INJECT SPACES WHERE NEEDED SRC¯PTR = $42000 DEST¯PTR = $50000 FRAME¯COUNT = PEEK(SRC¯PTR) POKE DEST¯PTR + ÏÆÆÓÅÔ¯ÎÕͯÆÒÁÍÅÓ, FRAME¯COUNT SRC¯PTR = SRC¯PTR + 1 DEST¯PTR = DEST¯PTR + ÏÆÆÓÅÔ¯ÆÒÁÍÅ0 SZ = ÏÆÆÓÅÔ¯ÆÒÁÍÅ0 FOR K = 0 TO FRAME¯COUNT - 1 POKE DEST¯PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯Ø, PEEK(SRC¯PTR) SRC¯PTR = SRC¯PTR + 1 POKE DEST¯PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯Ù, PEEK(SRC¯PTR) SRC¯PTR = SRC¯PTR + 1 FRMW = PEEK(SRC¯PTR) POKE DEST¯PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯×, FRMW SRC¯PTR = SRC¯PTR + 1 FRMH = PEEK(SRC¯PTR) POKE DEST¯PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯È, FRMH SRC¯PTR = SRC¯PTR + 1 LN = ÆÒÍ¯ÏÆÆÓÅÔ¯ÄÁÔÁ - ÆÒÍ¯ÏÆÆÓÅÔ¯ÈÉÔÂÏØÅÓ EDMA ÏЯÆÉÌÌ, LN, 0, DEST¯PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯ÈÉÔÂÏØÅÓ LN = FRMW * FRMH * 2 EDMA ÏЯÃÏÐÙ, LN, SRC¯PTR, DEST¯PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯ÄÁÔÁ SRC¯PTR = SRC¯PTR + LN DEST¯PTR = DEST¯PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯ÄÁÔÁ + LN SZ = SZ + ÆÒÍ¯ÏÆÆÓÅÔ¯ÄÁÔÁ + LN NEXT K DEST¯PTR = $50000 WPOKE DEST¯PTR + ÏÆÆÓÅÔ¯ÄÁÔÁ¯ÓÉÚÅ, SZ RETURN'--------.SAVE¯BIN'-------- INPUT "SAVE NAME: ";FNAME$ IF FNAME$ = "" THEN RETURN PTR = $50000 + WPEEK($50000 + ÏÆÆÓÅÔ¯ÄÁÔÁ¯ÓÉÚÅ) DELETE (FNAME$) BSAVE (FNAME$),P($50000) TO P(PTR) RETURN'-------------------------------------.CALCULATE¯OPTIMISED¯DATA¯SIZE¯INTO¯SZ'------------------------------------- SZ = WPEEK($50000 + ÏÆÆÓÅÔ¯ÄÁÔÁ¯ÓÉÚÅ) PTR = $50000 + ÏÆÆÓÅÔ¯ÆÒÁÍÅ0 FOR K = 0 TO FRAME¯COUNT - 1 FRMW = PEEK(PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯×) FRMH = PEEK(PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯È) SZ = SZ - FRMW * FRMH PTR = PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯ÄÁÔÁ + FRMW * FRMH * 2 NEXT K RETURN'--------------.SAVE¯OPTIMISED'-------------- INPUT "SAVE NAME (OPTIMISED): ";FNAME$ IF FNAME$ = "" THEN RETURN DELETE (FNAME$) DOPEN #2,(FNAME$ + ",P"),W,U8 PRINT #2, CHR$(1); PRINT #2, CHR$(2); ' DUMMY ADDRESS GOSUB CALCULATE¯OPTIMISED¯DATA¯SIZE¯INTO¯SZ PRINT #2, CHR$(MOD(SZ, 256)); PRINT #2, CHR$(INT(SZ / 256)); PRINT #2, CHR$(FRAME¯COUNT); PTR = $50000 + ÏÆÆÓÅÔ¯ÆÒÁÍÅ0 FOR FRMIDX = 0 TO FRAME¯COUNT - 1 X = PEEK(PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯Ø) Y = PEEK(PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯Ù) FRMW = PEEK(PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯×) FRMH = PEEK(PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯È) PRINT #2, CHR$(X);CHR$(Y);CHR$(FRMW);CHR$(FRMH); FOR K=0 TO 15 PRINT #2, CHR$(PEEK(PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯ÈÉÔÂÏØÅÓ + K)); NEXT K SRC¯CHAR¯PTR = PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯ÄÁÔÁ SRC¯CLR¯PTR = PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯ÄÁÔÁ + FRMW * FRMH FOR K = 0 TO FRMW * FRMH - 1 CVAL = PEEK(SRC¯CLR¯PTR + K) IF PEEK(SRC¯CHAR¯PTR + K) = 32 THEN BEGIN CVAL = $FF BEND PRINT #2, CHR$(CVAL); NEXT K PTR = PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯ÄÁÔÁ + FRMW * FRMH * 2 NEXT FRMIDX DCLOSE #2 RETURN'------------------------.SAVE¯NEW¯FRAME¯TO¯MEMORY'------------------------ POKE $40800 + STARTX + STARTY * 80, START¯CHAR POKE $FF80000 + STARTX + STARTY * 80, START¯COLOR POKE $40800 + ENDX + ENDY * 80, END¯CHAR POKE $FF80000 + ENDX + ENDY * 80, END¯COLOR FRAME¯COUNT = PEEK($50000 + ÏÆÆÓÅÔ¯ÎÕͯÆÒÁÍÅÓ) GOSUB LOCATE¯NEXT¯FREE¯BYTE PTR = $50000 + BYTES¯USED NEW¯FRAME¯FLAG = 1 GOSUB SAVE¯FRAME¯TO¯MEMORY¯AT¯PTR RETURN'---------------------------.SAVE¯FRAME¯TO¯MEMORY¯AT¯PTR'--------------------------- POKE PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯Ø, STARTX POKE PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯Ù, STARTY POKE PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯×, X - STARTX + 1 POKE PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯È, Y - STARTY + 1 IF NEW¯FRAME¯FLAG THEN BEGIN LN = ÆÒÍ¯ÏÆÆÓÅÔ¯ÄÁÔÁ - ÆÒÍ¯ÏÆÆÓÅÔ¯ÈÉÔÂÏØÅÓ EDMA ÏЯÆÉÌÌ, LN, 0, PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯ÈÉÔÂÏØÅÓ BEND PTR = PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯ÄÁÔÁ FOR YIDX = STARTY TO Y FOR XIDX = STARTX TO X POKE PTR, PEEK($40800 + XIDX + YIDX * 80) PTR = PTR + 1 NEXT XIDX NEXT YIDX FOR YIDX = STARTY TO Y FOR XIDX = STARTX TO X POKE PTR, PEEK($FF80000 + XIDX + YIDX * 80) PTR = PTR + 1 NEXT XIDX NEXT YIDX IF NEW¯FRAME¯FLAG THEN BEGIN WPOKE $50000 + ÏÆÆÓÅÔ¯ÄÁÔÁ¯ÓÉÚÅ, PTR - $50000 POKE $50000 + ÏÆÆÓÅÔ¯ÎÕͯÆÒÁÍÅÓ, FRAME¯COUNT + 1 BEND CURSOR 0,49 PRINT CLR¯LINE¯RIGHT$;"FRAME COUNT=";PEEK($50000 + ÏÆÆÓÅÔ¯ÎÕͯÆÒÁÍÅÓ); PRINT ", NEXT-FREE=$";HEX$(PTR); CURSOR 0,0 NEW¯FRAME¯FLAG = 0 RETURN'----------.LOAD¯FRAME'---------- PRINT "";CLR¯LINE¯RIGHT$; INPUT "FRAME#";CURR¯FRAME GOSUB DRAW¯CURR¯FRAME RETURN'------------.DELETE¯FRAME'------------ GOSUB GET¯END¯PTR END¯PTR = PTR ' DECREMENT FRAME COUNT FRAME¯COUNT = FRAME¯COUNT - 1 POKE $50000 + ÏÆÆÓÅÔ¯ÎÕͯÆÒÁÍÅÓ, FRAME¯COUNT GOSUB DELETE¯FRAME¯SIZE¯FROM¯TOTAL IF CURR¯FRAME = FRAME¯COUNT THEN BEGIN CURR¯FRAME = CURR¯FRAME - 1 BEND : ELSE BEGIN GOSUB SHIFT¯REMAINING¯FRAMES¯ALONG BEND GOSUB DRAW¯CURR¯FRAME RETURN'----------------------------.DELETE¯FRAME¯SIZE¯FROM¯TOTAL'---------------------------- GOSUB GET¯CURR¯FRAME¯PTR CURR¯PTR = PTR FRMW = PEEK(CURR¯PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯×) FRMH = PEEK(CURR¯PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯È) SZ = WPEEK($50000 + ÏÆÆÓÅÔ¯ÄÁÔÁ¯ÓÉÚÅ) SZ = SZ - (ÆÒÍ¯ÏÆÆÓÅÔ¯ÄÁÔÁ + FRMW * FRMH * 2) WPOKE $50000 + ÏÆÆÓÅÔ¯ÄÁÔÁ¯ÓÉÚÅ, SZ RETURN'----------------------------.SHIFT¯REMAINING¯FRAMES¯ALONG'---------------------------- GOSUB GET¯CURR¯FRAME¯PTR CURR¯PTR = PTR FRMW = PEEK(CURR¯PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯×) FRMH = PEEK(CURR¯PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯È) START¯PTR = CURR¯PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯ÄÁÔÁ + FRMW * FRMH * 2 LN = END¯PTR - START¯PTR + 1 ' PRINT "CURR¯PTR = ";HEX$(CURR¯PTR) ' PRINT "START¯PTR = ";HEX$(START¯PTR) ' PRINT "END¯PTR = ";HEX$(END¯PTR) ' PRINT "LN = ";HEX$(LN) ' GET KEY A$ ' A$="" EDMA ÏЯÃÏÐÙ, LN, START¯PTR, CURR¯PTR RETURN'-----------.GET¯END¯PTR'----------- FRAME¯COUNT = PEEK($50000 + ÏÆÆÓÅÔ¯ÎÕͯÆÒÁÍÅÓ) PTR = $50000 + ÏÆÆÓÅÔ¯ÆÒÁÍÅ0 FRMIDX = 0 IF FRMIDX >= FRAME¯COUNT THEN BEGIN CURSOR 0,0 PRINT CLR¯LINE¯RIGHT$;"INVALID BLOCK#!" RETURN BEND ' TRAVERSE TO FIND BLOCK FOR FRMIDX = 0 TO FRAME¯COUNT - 1 FRMW = PEEK(PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯×) FRMH = PEEK(PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯È) PTR = PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯ÄÁÔÁ + FRMW * FRMH * 2 NEXT FRMIDX RETURN'------------------.GET¯CURR¯FRAME¯PTR'------------------ FRAME¯COUNT = PEEK($50000 + ÏÆÆÓÅÔ¯ÎÕͯÆÒÁÍÅÓ) ' TRAVERSE TO FIND BLOCK PTR = $50000 + ÏÆÆÓÅÔ¯ÆÒÁÍÅ0 FOR FRMIDX = 0 TO FRAME¯COUNT IF FRMIDX = CURR¯FRAME THEN RETURN FRMW = PEEK(PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯×) FRMH = PEEK(PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯È) PTR = PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯ÄÁÔÁ + FRMW * FRMH * 2 NEXT FRMIDX PTR = 0 RETURN'---------------.DRAW¯CURR¯FRAME'--------------- FRAME¯COUNT = PEEK($50000 + ÏÆÆÓÅÔ¯ÎÕͯÆÒÁÍÅÓ) PTR = $50000 + ÏÆÆÓÅÔ¯ÆÒÁÍÅ0 FRMIDX = 0 IF FRMIDX >= FRAME¯COUNT THEN BEGIN CURSOR 0,0 PRINT CLR¯LINE¯RIGHT$;"INVALID BLOCK#!" RETURN BEND GOSUB GET¯CURR¯FRAME¯PTR IF PTR = 0 THEN PRINT "NOT FOUND!" : RETURN X = PEEK(PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯Ø) Y = PEEK(PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯Ù) FRMW = PEEK(PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯×) FRMH = PEEK(PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯È) ENDX = X + FRMW - 1 ENDY = Y + FRMH - 1 PRINT "";CLR¯LINE¯RIGHT$; PRINT "X=";X;", Y=";Y;", W=";FRMW;", H=";FRMH; PRINT ", PTR=$";HEX$(PTR); PRINT "";CHR$(27);"J";CLR¯LINE¯RIGHT$;"FRAME=";CURR¯FRAME; PRINT ", NXT=$";HEX$(PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯ÄÁÔÁ + FRMW * FRMH * 2); SRC¯CHAR¯PTR = PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯ÄÁÔÁ SRC¯CLR¯PTR = PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯ÄÁÔÁ + FRMW * FRMH DEST¯CHAR¯PTR =$40800 + X + Y * 80 DEST¯CLR¯PTR = $FF80000 + X + Y * 80 FOR YIDX = Y TO ENDY EDMA ÏЯÃÏÐÙ, FRMW, SRC¯CHAR¯PTR, DEST¯CHAR¯PTR EDMA ÏЯÃÏÐÙ, FRMW, SRC¯CLR¯PTR, DEST¯CLR¯PTR SRC¯CHAR¯PTR = SRC¯CHAR¯PTR + FRMW SRC¯CLR¯PTR = SRC¯CLR¯PTR + FRMW DEST¯CHAR¯PTR = DEST¯CHAR¯PTR + 80 DEST¯CLR¯PTR = DEST¯CLR¯PTR + 80 NEXT YIDX RETURN'-------------------------.RESTORE¯CHAR¯UNDER¯CURSOR'------------------------- IF STORE¯STATE = ÓÔÏÒůÓÔÁÒÔ¯ÐÏÓ THEN BEGIN POKE $40800 + X + Y * 80, START¯CHAR POKE $FF80000 + X + Y * 80, START¯COLOR BEND:ELSE BEGIN ' ÓÔÏÒůÅÎįÐÏÓ POKE $40800 + X + Y * 80, END¯CHAR POKE $FF80000 + X + Y * 80, END¯COLOR BEND RETURN'-----------.DRAW¯CURSOR'----------- POKE $40800 + X + Y * 80, 43 POKE $FF80000 + X + Y * 80, 1 RETURN'-----------.DRAW¯FOOTER'----------- CURSOR 0,49 PRINT CLR¯LINE¯RIGHT$;"FRAME COUNT=";PEEK($50000 + ÏÆÆÓÅÔ¯ÎÕͯÆÒÁÍÅÓ);", NEXT-FREE=$"; PRINT HEX$(PTR); RETURN'----------------.STORE¯STATE¯INFO'---------------- IF STORE¯STATE = ÓÔÏÒůÓÔÁÒÔ¯ÐÏÓ THEN BEGIN START¯CHAR = PEEK($40800 + X + Y * 80) START¯COLOR = PEEK($FF80000 + X + Y * 80) STARTX = X STARTY = Y BEND:ELSE BEGIN ' ÓÔÏÒůÅÎįÐÏÓ END¯CHAR = PEEK($40800 + X + Y * 80) END¯COLOR = PEEK($FF80000 + X + Y * 80) ENDX = X ENDY = Y BEND RETURN'---------.INIT¯VARS'--------- CURRENT¯FRAME = 0 STORE¯STATE = ÓÔÏÒůÓÔÁÒÔ¯ÐÏÓ X = 0 Y = 0 CURR¯FRAME = 0 RETURN '---------------------.LOCATE¯NEXT¯FREE¯BYTE'--------------------- FRAME¯COUNT = PEEK($50000 + ÏÆÆÓÅÔ¯ÎÕͯÆÒÁÍÅÓ) FRMIDX = 0 PTR = $50000 + ÏÆÆÓÅÔ¯ÆÒÁÍÅ0 DO WHILE 1 IF FRMIDX = FRAME¯COUNT THEN BEGIN BYTES¯USED = PTR-$50000 RETURN BEND FRMW = PEEK(PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯×) FRMH = PEEK(PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯È) PTR = PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯ÄÁÔÁ + FRMW * FRMH * 2 FRMIDX = FRMIDX + 1 LOOP RETURN'---------------------.CHECK¯MAGIC¯SIGNATURE'--------------------- IF PEEK($5FFFE) <> 71 OR PEEK($5FFFF) <> 73 THEN BEGIN WPOKE $5FFFE, $4947 PRINT "“";CLR¯LINE¯RIGHT$; PRINT "MAGIC SIGNATURE APPLIED. RESET FRAME COUNT TO ZERO? (Y/N)"; GET KEY A$ IF A$ = "Y" THEN BEGIN WPOKE $50000 + ÏÆÆÓÅÔ¯ÄÁÔÁ¯ÓÉÚÅ, 0 POKE $50000 + ÏÆÆÓÅÔ¯ÎÕͯÆÒÁÍÅÓ, 0 BEND PRINT "“";CLR¯LINE¯RIGHT$; BEND RETURN'---------------.CHECK¯EDIT¯FLAG'--------------- IF PEEK($5FFFC) = 1 THEN BEGIN ' EDITING? POKE $5FFFC, 0 CURR¯FRAME = PEEK($5FFFD) GOSUB GET¯CURR¯FRAME¯PTR STARTX = PEEK(PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯Ø) STARTY = PEEK(PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯Ù) X = STARTX + PEEK(PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯×) - 1 Y = STARTY + PEEK(PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯È) - 1 NEW¯FRAME¯FLAG = 0 GOSUB SAVE¯FRAME¯TO¯MEMORY¯AT¯PTR GOSUB DRAW¯CURR¯FRAME BEND RETURN'--------------.YANK¯SELECTION'-------------- POKE $D020, PEEK($D020) + 1 ' SELECT A REGION WITH CURSOR MOVEMENT GOSUB GET¯SELECTED¯COORDS¯INTO¯X1Y1X2Y2 ' COPY IT INTO A BASIC VAR PTR = POINTER(CLIPBOARD¯CHAR&(0)) LN = X2-X1+1 FOR Y = Y1 TO Y2 EDMA ÏЯÃÏÐÙ, LN, $40800+X1+Y*80, PTR PTR = PTR + LN NEXT Y PTR = POINTER(CLIPBOARD¯CLR&(0)) FOR Y = Y1 TO Y2 EDMA ÏЯÃÏÐÙ, LN, $FF80000+X1+Y*80, PTR PTR = PTR + LN NEXT Y CLIPW = X2-X1+1 CLIPH = Y2-Y1+1 POKE $D020, PEEK($D020) - 1 RETURN'-----.PASTE'----- ' COPY SELECTION FROM VARS ONTO SCREEN AT CURRENT CURSOR POSITION X1 = X Y1 = Y X2 = X + CLIPW - 1 Y2 = Y + CLIPH - 1 PTR = POINTER(CLIPBOARD¯CHAR&(0)) LN = X2-X1+1 FOR Y = Y1 TO Y2 EDMA ÏЯÃÏÐÙ, LN, PTR, $40800+X1+Y*80 PTR = PTR + LN NEXT Y PTR = POINTER(CLIPBOARD¯CLR&(0)) FOR Y = Y1 TO Y2 EDMA ÏЯÃÏÐÙ, LN, PTR, $FF80000+X1+Y*80 PTR = PTR + LN NEXT Y ' ÔÏÄÏ: RE-SAVE CURRENT FRAME GOSUB SAVE¯FRAME¯TO¯MEMORY¯AT¯PTR GOSUB GET¯CURR¯FRAME¯PTR STARTX = PEEK(PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯Ø) STARTY = PEEK(PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯Ù) X = STARTX + PEEK(PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯×) - 1 Y = STARTY + PEEK(PTR + ÆÒÍ¯ÏÆÆÓÅÔ¯È) - 1 NEW¯FRAME¯FLAG = 0 GOSUB SAVE¯FRAME¯TO¯MEMORY¯AT¯PTR RETURN