TITLE ' XZIP INTERPRETER FOR APPLE MACINTOSH ' PRINT NOGEN ; DON'T EXPAND MACROS PRINT ON BLANKS OFF ; ALLOW COMMENTS USING '*' NOT ';' STRING ASIS ; NOT PASCAL OR C FORMAT 00000 PROC 00000 DATA 00000 00000 IMPORT firstRow 00000 IMPORT lastRow 00000 IMPORT firstCol 00000 IMPORT lastCol 00000 00000 IMPORT totRows * [was totLines] 00000 IMPORT totCols * [was totColumns] 00000 IMPORT curRow 00000 IMPORT curCol 00000 00000 IMPORT lineHeight * height of font, in pixels 00000 IMPORT colWidth * width of font (or of digit '0') 00000 00000 IMPORT margLeft 00000 IMPORT margRight 00000 00000 IMPORT currentHl * inverse, etc 00000 IMPORT currentAttr * wrap, etc 00000 ** IMPORT currentFont * DEAD, use ZFont 00000 00000 ** IMPORT scr1Lines 00000 ** IMPORT whichScr 00000 00000 ** IMPORT _w0font 00000 ** IMPORT _w1font 00000 IMPORT mColor * [was _mono] 00000 00000 IMPORT xmouse * mouse position (char units, zero origin) 00000 IMPORT ymouse 00000 IMPORT bmouse * mouse button status 00000 IMPORT undoflag * [boolean -- addr as byte from 68K] 00000 00000 IMPORT filename 00000 IMPORT filevol 00000 IMPORT actlen 00000 00000 CODE 00000 00000 0000 0002 EXPORT ZSTART 00000 ** EXPORT _mov_mem * (char *p1, *p2; LONG len) 00000 ** EXPORT _clr_mem * (char *p1; LONG len) 00000 0000 2A14 EXPORT SqzRow * (src, dst: Ptr; len: INTEGER); 00000 0000 2A38 EXPORT FillCSpec * (CSpec: Ptr; ix: INTEGER; bytePal: Ptr); 00000 0000 2A5C EXPORT BuildStips * (table1, table2: Ptr); 00000 0000 2AB8 EXPORT StipPic * (src, dst: Ptr; rowBytes, rows: INTEGER; maps: Ptr); 00000 0000 2B28 EXPORT Shrink75 * (base: Ptr; rb1, rb2, rows: INTEGER); 00000 0000 2BAC EXPORT Scale2xPic * (src, dst, randTbl: Ptr; cols {rbSrc, rbDst}, rows: INTEGER); 00000 00000 *** IMPORT ScrnSize 00000 IMPORT ClearWindow * was ClearLines 00000 *** IMPORT EraseEOL 00000 IMPORT EraseLine * (start, len: INTEGER) 00000 IMPORT Scroll 00000 00000 *** IMPORT HiLight * dead 00000 IMPORT ZFont * zid: INTEGER 00000 IMPORT SetColor 00000 IMPORT opPicinf 00000 IMPORT opDisplay 00000 00000 IMPORT SetUpInput * was _do_input 00000 IMPORT EventIn * was _char_in, MacttyIn 00000 IMPORT opMouseInfo 00000 IMPORT CharOut 00000 IMPORT LineOut 00000 00000 IMPORT MacInit 00000 IMPORT QuitGame 00000 IMPORT ZAlloc 00000 00000 *** IMPORT _german_convert * Mac: unimplemented 00000 *** IMPORT MacSound 00000 IMPORT ZSound 00000 IMPORT EndZSound * END-OF-SOUND CHECK 00000 00000 IMPORT NewDefault 00000 IMPORT FileSelect 00000 00000 IMPORT ExistFile 00000 IMPORT CreateFile 00000 IMPORT OpenFile 00000 IMPORT CloseFile 00000 IMPORT DeleteFile 00000 IMPORT ReadFile 00000 IMPORT WriteFile 00000 00000 IMPORT PrInit 00000 IMPORT PrLine 00000 00000 * ---------------------------------------------------------------------------- 00000 * PROGRAM 00000 * ---------------------------------------------------------------------------- 00000 00000 INCLUDE 'MX1.a' 00000 00000 * ___________________________________________________________________________ 00000 * 00000 * XZIP INTERPRETER FOR THE MACINTOSH 00000 * 00000 * INFOCOM, INC. COMPANY CONFIDENTIAL -- NOT FOR DISTRIBUTION 00000 * 00000 * WRITTEN BY DUNCAN BLANCHARD 00000 * ___________________________________________________________________________ 00000 * 00000 00000 * YZIP-MAC MODIFICATION HISTORY: 00000 * 00000 * 01 APR 88 DBB currow, curcol, clearLines - NOW 0-ORIGIN 00000 * 02 MAY 88 DBB ADDED YZIP WINDOW CALLS, ETC 00000 * 06 JUL 88 DBB ADDED ZBEEP, NOW READLN -> ZBEEP -> DOSOUND 00000 * WAS TRASHING D1-D3; I THINK THIS FIXES 'D3BUG' 00000 * 00000 * YZIP 'D' FROZEN 00000 00000 * XZIP-MAC MODIFICATION HISTORY: 00000 * 00000 * 14 JUL 87 DBB PORTED FROM ST 00000 * 14 SEP 87 DBB XZIP 'A' FROZEN 00000 * 05 OCT 87 DBB (PASCAL) ROW/COL VARS ALLOW BIG-SCREEN WINDOW 00000 * TIMEOUT COUNTER STOPS WHEN DA ACTIVE 00000 * PUTLIN1 <-> PUTLIN 00000 * OPINPUT/OPPRNT CALL PUTLIN (FIX HINT-WRAP BUG) 00000 * FKEYS THAT AREN'T TCHARS REJECTED IN OPREAD 00000 * ADDED UNDO AND MOUSE SUPPORT CHECKS 00000 * 1-CHAR INPUT DISABLES MENU "CMD-STRINGS" 00000 * 13 OCT 87 DBB DESKTOP RESTORE SETS SL REFRESH BIT 00000 * BUFFER NOW DUMPED IN CURSET/SPLIT/SCREEN 00000 * 14 OCT 87 DBB TO ALLOW SCREEN1 BUFFERING: 00000 * BUFFER ALSO ZEROED FOR ABOVE 3 (CURSOR MOVED) 00000 * SIZEQP NO LONGER SHRINKS BUF SIZE (ST ITALIC HACK) 00000 * XZIP 'B' FROZEN 00000 * 16 FEB 88 DBB ADDED SOUND, SOUND INTERRUPTS (GAMINT) 00000 * FIXED COPYT/PRINTT PAGING BUG 00000 * MOVED 'UNDO' SETUP BEFORE PAGING 00000 * XZIP 'C' FROZEN 00000 00000 * XZIP-ATARI MODIFICATION HISTORY: 00000 * 00000 * 02 FEB 87 DBB MODIFIED EZIP 00000 * 21 MAY 87 DBB ADDED LOWCORE, MOUSE VARS 00000 * 02 JUN 87 DBB MOVED DUPNAM CHECK (_exist_file) INTO C 00000 * 25 JUN 87 DBB CHANGED OPFONT TO IGNORE REDUNDANT FONT CHANGES 00000 * FIXED STACK BUG, RESTORE VS. TIMER INTERRUPT 00000 * 13 JUL 87 DBB BUFFER FLUSHED IN OPSCRN, OPDIRO, OPERASE, OPCLEAR 00000 * CHKDSK MODIFIED FOR FULL PRELOAD SITUATION, 00000 * RESTART, $VER MAKE SPECIAL CHECKS FOR GAME DISK 00000 * XZIP 'A' FROZEN 00000 00000 * ZIP/EZIP (ATARI) MODIFICATION HISTORY: 00000 * 00000 * 02 AUG 85 ZIP A FROZEN 00000 * 09 AUG 85 CLSGAM CHECKS WHETHER GAME FILE WAS OPENED 00000 * 09 AUG 85 REBUILT OBJECT FILE WITH NEW LIBRARIES, 00000 * INCREASED MACHINE STACK TO 2K (IN ZIPSTART) 00000 * 09 AUG 85 ZIP B FROZEN 00000 * EZIP A FROZEN 00000 * 10 FEB 86 PURE PRELOAD MAY EXCEED 32K (PUT, PUTB, PTSIZE) 00000 * OPSPLT (EZIP) NO LONGER CLEARS SCREEN 00000 * 10 APR 86 CHANGED PUTCHR (SPECIAL HANDLING FOR TABLE OUTPUT) 00000 * ADDED SCRNAM, SCRIPTS SAVE/RESTORE FILENAMES 00000 * 18 APR 86 CHANGED NXTLIN/BUFOUT/LINOUT. BUFOUT CALLS NXTLIN 00000 * SO [MORE] IS TIMED CORRECTLY DURING BOLDFACE, ETC 00000 * CHANGED OPATTR AND DQUE INIT, FOR ITALICS HACK 00000 * FIXED GETMEM, PREVENTS ST BUG WITH ODD MEM REQUEST 00000 * 08 MAY 86 FIXED QUECHR (QCX2A), ALLOW FOR EMPTY [DUMPED] BUFFER 00000 * CHANGED OPREAD, ONLY OVERFLOW WORDS ARE FLUSHED 00000 * 13 MAY 86 LINES(A6) NOW NORMALLY RESET TO ZERO, UPDATED INCHR 00000 * OPINPUT CHECKS VOBUFF(A6) 00000 * OPSPLIT CHECKS MAXIMUM SIZE OF split_row 00000 * NXTLIN TURNS OFF HIGHLIGHTING BEFORE PRINTING [MORE] 00000 * COMBINED READLN AND INCHR 00000 * EZIP B FROZEN 00000 00000 * XZIP: SUGGESTIONS FOR FURTHER OVERHAUL 00000 * 00000 * - MAKE ALL OPERATORS TAKE ARGS IN SLOTS (INDEXED OFF A6, NOT A0) RATHER 00000 * THAN REGISTERS, NOW THAT MANY ARE OPTIONALS. PASS A1 -> FIRST ARG 00000 * FOR CONVENIENCE ((A1)++). REDUCES NEED TO SAVE/RESTORE ARGS, SIMPLIFIES 00000 * USAGE. 00000 * 00000 * - IMPLEMENT HIGHLIGHTING USING SPECIAL CHARS, PUT DIRECTLY INTO THE OUTPUT 00000 * STREAM/BUFFER. LOW-LEVEL OUTPUT ROUTINE SCANS FOR THESE SPECIALS. 00000 * AVOIDS NEED FOR MUCH SPECIAL FLUSHING OF BUFFER. 00000 * 00000 00000 * --------------------------------------------------------------------------- 00000 * REGISTER CONVENTIONS 00000 * --------------------------------------------------------------------------- 00000 00000 * GENERALLY, SINGLE ARGUMENTS ARE PASSED IN D0 OR A0. SINGLE VALUES ARE 00000 * LIKEWISE RETURNED IN D0 OR A0. IN ANY CASE, THESE ARE SCRATCH REGISTERS 00000 * AND NEED NOT BE PRESERVED. ALL OTHER REGISTERS, EXCEPT WHERE OTHERWISE 00000 * SPECIFIED, MUST BE PRESERVED ACROSS EACH SUBROUTINE CALL. NOTE THAT 00000 * TOP-LEVEL ROUTINES, OPx ROUTINES, ARE EXCLUDED FROM THIS RESTRICTION. 00000 00000 * DEDICATED REGISTERS: 00000 * A7 = SYSTEM SP 00000 * A6 = FRAME POINTER FOR ZIP VARIABLES *** STATIC *** 00000 * A5 = unused in this version 00000 * A4 = VIRTUAL SP 00000 00000 * --------------------------------------------------------------------------- 00000 * ASSEMBLY FLAGS 00000 * --------------------------------------------------------------------------- 00000 00000 * THE FIRST TWO FLAGS EXIST ONLY FOR COMPARATIVE PURPOSES: 00000 * XZIP CAN'T BE CONDITIONALLY ASSEMBLED AS EZIP OR CLASSIC ZIP 00000 00000 0000 0001 EZIP EQU 1 * ALWAYS ON (XZIP) 00000 0000 0000 CZIP EQU 0 * ALWAYS OFF (XZIP) 00000 00000 0000 0000 DEBUG EQU 0 * IF ON, ASSEMBLES DEBUGGING CODE 00000 0000 0000 D3BUG EQU 0 * REG D3 BEING TRASHED; TRY TO PINPOINT IT 00000 * (FIXED BY READLN/ZBEEP, I THINK) 00000 00000 * --------------------------------------------------------------------------- 00000 * INDEXING BASE FOR THE DISPATCH TABLE 00000 * --------------------------------------------------------------------------- 00000 00000 4E71 ZBASE NOP 00002 00002 * DATA * ST LATTICE: BEGIN THE DATA SEGMENT 00002 * DC.W 0 * (KLUGE TO AVOID AN OBSCURE LINKER BUG ASSOCIATED 00002 * CODE * WITH SUCCESSIVE 'DC' STATEMENTS) 00002 00002 * --------------------------------------------------------------------------- 00002 * GENERAL MACRO DEFINITIONS 00002 * --------------------------------------------------------------------------- 00002 00002 * MACRO ZERO 00002 * MOVEQ #0,%1 * CLEAR A REGISTER QUICKLY (BOTH WORDS) 00002 * ENDM 00002 00002 * MACRO SOB * SUBTRACT ONE AND BRANCH IF NOT ZERO 00002 * SUBQ.W #1,%1 00002 * BNE.S %2 00002 * ENDM 00002 00002 * PRIOR TO CALLING A PASCAL FUNCTION, MUST MAKE SPACE ON THE STACK 00002 * FOR THE RESULT, WORD OR LONG. [FOR 'C' FUNCTIONS THIS WOULD BE A NOP.] 00002 00002 MACRO 00002 RESWORD 00002 SUBQ.L #2,SP * QUICKEST INSTR 00002 *** TST.W -(SP) 00002 ENDM 00002 00002 MACRO 00002 RESLONG 00002 SUBQ.L #4,SP 00002 ENDM 00002 00002 * AFTER CALLING A PASCAL FUNCTION, POP THE RESULT FROM THE STACK 00002 * INTO D0 (THIS MIMICS COMMON 'C' INTERFACES TO INCREASE PORTABILITY). 00002 00002 MACRO 00002 POPWORD 00002 MOVE.W (SP)+,D0 00002 *** TST.W D0 * [C ONLY: SET FLAGS] 00002 ENDM 00002 00002 MACRO 00002 POPLONG 00002 MOVE.L (SP)+,D0 00002 *** TST.L D0 00002 ENDM 00002 00002 * WHEN CALLING ANY MAC PASCAL ROUTINE, THESE ARE THE REGISTERS THAT 00002 * SHOULD NORMALLY BE PRESERVED, AND WHICH PASCAL MIGHT TRASH. 00002 00002 MACRO 00002 SAVEREGS 00002 *** MOVEM.L D1-D7/A1-A5,-(SP) * ULTRA-CONSERVATIVE SET 00002 MOVEM.L D1-D2/A1,-(SP) * STANDARD SET FOR MAC PASCAL 00002 ENDM 00002 00002 MACRO 00002 RESTREGS 00002 *** MOVEM.L (SP)+,D1-D7/A1-A5 00002 MOVEM.L (SP)+,D1-D2/A1 * (DON'T AFFECT FLAGS) 00002 ENDM 00002 00002 * --------------------------------------------------------------------------- 00002 * GENERAL EQUATES 00002 * --------------------------------------------------------------------------- 00002 00002 0000 0000 ARG0 EQU 0 * ARGUMENT COUNT 00002 0000 0002 ARG1 EQU 2 * ARGUMENT OFFSETS IN PARAMETER BLOCK 00002 0000 0004 ARG2 EQU 4 00002 0000 0006 ARG3 EQU 6 00002 0000 0008 ARG4 EQU 8 00002 00002 0000 0000 SKIP EQU 0 * 'PLACEHOLDER' IN DEFAULT-PARAMETER BLOCK 00002 0000 0010 DBQLEN EQU 16 * LENGTH OF DEBUGGER HISTORY QUEUE 00002 00002 *** THESE ARE NOW DERIVED ELSEWHERE ... 00002 * YCHAR EQU 12 * CHAR CELL PIXEL SIZE (MAC, MONACO 9) 00002 * XCHAR EQU 6 00002 00002 IF EZIP THEN 00002 00002 0000 0009 VCHARS EQU 9 * MAX CHARS IN AN EZIP VOCAB WORD 00002 0000 0006 ZCHARS EQU 6 * EZIP: BYTES PER ZWORD 00002 00002 0000 007E OPLEN EQU 63*2 * OBJECT PROPERTY DEFAULT TABLE LENGTH 00002 0000 000E OLEN EQU 14 * OBJECT LENGTH 00002 00002 0000 0006 LOC EQU 6 * PARENT 00002 0000 0008 NEXT EQU 8 * NEXT SIBLING 00002 0000 000A FIRST EQU 10 * FIRST CHILD 00002 0000 000C PROP EQU 12 * PROPERTY TABLE POINTER 00002 00002 0000 003F PMASK EQU $003F * PROPERTY NUMBER IS LOW 6 BITS (OF FIRST ID BYTE) 00002 0000 0006 PLBIT EQU 6 * PROPERTY LENGTH BIT (IF LENGTH IS TWO OR ONE) 00002 00002 ENDIF 00002 IF CZIP THEN 00002 ENDIF 00002 00002 *-------------------------------------------------------------------------- 00002 * GENERALIZED OUTPUT-FOLDING PARAMETER BLOCK 00002 *-------------------------------------------------------------------------- 00002 00002 * THE QUECHR ROUTINE IS CALLED WITH A POINTER TO A STRUCTURE CONTAINING 00002 * THE VARIABLES BELOW. THIS ARRANGEMENT ALLOWS FOR THE EXISTANCE OF MORE THAN 00002 * ONE STRUCTURE, USEFUL IF DISPLAYED TEXT AND SCRIPTED TEXT ARE TO FOLD AT 00002 * DIFFERENT POINTS. 00002 00002 * THE STRUCTURE IDENTIFIES TWO ACTION ROUTINES. THE OUTPUT FUNCTION 00002 * DUMPS THE BUFFER WHEN IT BECOMES FULL. THE SIZE FUNCTION ALLOWS FOR THE 00002 * HANDLING OF PROPORTIONALLY SPACED TEXT. 00002 00002 * THE LAST TWO VARIABLES ARE CURRENTLY IGNORED, BUT MIGHT BE USEFUL 00002 * FOR IMPLEMENTING RECALCULATION OF THE FOLD POINTS FOR A PARAGRAPH OF TEXT, 00002 * AS WHEN A WINDOW CHANGES SIZE. 00002 00002 * DATA STRUCTURE FOR QUEUE-PARAMETERS BLOCK: 00002 00002 0000 0000 BUFPTR EQU 0 * START OF BUFFER 00002 0000 0004 NXTPTR EQU 4 * CURRENT POSITION WITHIN BUFFER 00002 0000 0008 ENDPTR EQU 8 * END OF BUFFER >> current not used << 00002 00002 0000 000C BUFSIZ EQU 12 * MAXIMUM UNITS IN BUFFER 00002 0000 000E CURSIZ EQU 14 * CURRENT UNITS IN BUFFER 00002 00002 0000 0010 SIZFUN EQU 16 * GIVEN A CHAR, RETURNS UNIT SIZE 00002 0000 0014 OUTFUN EQU 20 * GIVEN PTRS (BEG AND END), DUMPS BUFFER, ADDS CR 00002 0000 0018 RETFUN EQU 24 * (UNUSED -- THIS SHOULD ADD THE CR) 00002 00002 * FLAGS: 00002 00002 0000 001C DUMPED EQU 28 * WAS BUFFER EMPTIED (WITHOUT CR) BEFORE FULL? 00002 0000 001D AUTOCR EQU 29 * APPEND A CR TO EACH BUFFER DUMP? *** YES 00002 0000 001E KEEPSP EQU 30 * DON'T DISCARD TRAILING SPACE? *** NO 00002 0000 001F INUSE EQU 31 * SEMAPHORE TO AVOID RE-ENTRANCE 00002 00002 0000 0020 QPLEN EQU 32 * LENGTH OF BLOCK (ALWAYS EVEN) 00002 00002 *-------------------------------------------------------------------------- 00002 * DATA STRUCTURE FOR YZIP WINDOWS: 00002 *-------------------------------------------------------------------------- 00002 00002 0000 0000 WYPOS EQU 0 * WINDOW POSITION 00002 0000 0002 WXPOS EQU 2 00002 0000 0004 WYSIZE EQU 4 * WINDOW SIZE 00002 0000 0006 WXSIZE EQU 6 00002 0000 0008 WYCURS EQU 8 * CURSOR POSITION 00002 0000 000A WXCURS EQU 10 00002 0000 000C WLMARG EQU 12 * MARGINS 00002 0000 000E WRMARG EQU 14 00002 0000 0010 WCRINT EQU 16 * CR INTERRUPT FUNCTION, COUNTER 00002 0000 0012 WCRCNT EQU 18 00002 0000 0014 WHLIGHT EQU 20 * HIGHLIGHT MODE 00002 0000 0016 WCOLOR EQU 22 * BACK/FORE COLORS 00002 0000 0018 WFONTID EQU 24 * FONT ID, SIZE 00002 0000 001A WFONTYX EQU 26 00002 0000 001C WATTR EQU 28 * WRAP BIT, SCROLL BIT, ETC 00002 * PRIVATE VARIABLES: 00002 0000 001E WLCNT EQU 30 * LINES DISPLAYED SINCE LAST 'MORE' 00002 0000 0020 WCSIZ EQU 32 * "FULLNESS" OF LAST BUFFER (CURSIZ FROM DQUE) 00002 * END OF BLOCK: 00002 0000 0022 WBLKLEN EQU 34 * TOTAL LENGTH OF BLOCK (ALWAYS EVEN) 00002 00002 0000 0008 MAXWIND EQU 8 * VALID WINDOW IDS ARE 0..7 00002 00002 * FLAG BITS IN WATTR: 00002 0000 0001 WFWRAP EQU 1 * WRAP BIT 00002 0000 0002 WFSCRL EQU 2 * SCROLL BIT 00002 0000 0004 WFSCRP EQU 4 * SCRIPT BIT 00002 0000 0008 WFBUFF EQU 8 * BUFFER BIT 00002 00002 * --------------------------------------------------------------------------- 00002 * ZIP VARIABLES - INDEXED OFF A6 00002 * --------------------------------------------------------------------------- 00002 00002 FFFF FFFE ZORKID EQU 0-2 * UNIQUE GAME AND VERSION ID 00002 FFFF FFFC TIMEMD EQU ZORKID-2 * HOURS/MINUTES MODE FLAG 00002 FFFF FFFA ENDLOD EQU TIMEMD-2 * END OF PRELOAD (FIRST PAGED BLOCK NUMBER) 00002 FFFF FFF8 PURBOT EQU ENDLOD-2 * END OF IMPURE (FIRST PURE BLOCK NUMBER) 00002 00002 FFFF FFF4 VOCTAB EQU PURBOT-4 * VOCABULARY TABLE POINTER 00002 FFFF FFF0 OBJTAB EQU VOCTAB-4 * OBJECT TABLE POINTER 00002 FFFF FFEC GLOTAB EQU OBJTAB-4 * GLOBAL TABLE POINTER 00002 FFFF FFE8 WRDTAB EQU GLOTAB-4 * FREQUENT WORD TABLE POINTER 00002 00002 FFFF FFE4 RBRKS EQU WRDTAB-4 * POINTER TO STRING OF READ-BREAK CHARS 00002 FFFF FFE0 ESIBKS EQU RBRKS-4 * END OF SELF-INSERTING BREAK CHARS (+1) 00002 00002 FFFF FFDE VWLEN EQU ESIBKS-2 * NUMBER OF BYTES IN A VOCAB WORD ENTRY 00002 FFFF FFDC VWORDS EQU VWLEN-2 * NUMBER OF VOCABULARY WORDS 00002 FFFF FFD8 VOCBEG EQU VWORDS-4 * POINTER TO FIRST VOCAB WORD 00002 FFFF FFD4 VOCEND EQU VOCBEG-4 * POINTER TO LAST VOCAB WORD 00002 00002 FFFF FFD0 PAGTAB EQU VOCEND-4 * POINTER TO PAGE INFORMATION TABLE 00002 FFFF FFCC PAGES EQU PAGTAB-4 * POINTER TO START OF PAGE BUFFERS 00002 00002 FFFF FFCA PAGTOT EQU PAGES-2 * NUMBER OF PAGE BUFFERS 00002 FFFF FFC8 MAXLOD EQU PAGTOT-2 * TOTAL BLOCKS IN GAME 00002 FFFF FFC6 MAXFLG EQU MAXLOD-2 * FLAG SET IF GAME FILE IS WHOLLY PRELOADED 00002 00002 FFFF FFC2 TOPSP EQU MAXFLG-4 * TOP OF SYSTEM STACK 00002 FFFF FFBE STKBOT EQU TOPSP-4 * BOTTOM OF GAME STACK 00002 00002 FFFF FFBC ZPC1 EQU STKBOT-2 * ZORK PC, BLOCK POINTER (RELATIVE ADDRESS) 00002 FFFF FFBA ZPC2 EQU ZPC1-2 * ZORK PC, BYTE POINTER 00002 FFFF FFB8 NARGS EQU ZPC2-2 * (LOW BYTE) OPTIONAL ARG COUNT 00002 FFFF FFB4 ZLOCS EQU NARGS-4 * POINTER TO LOCALS (ABSOLUTE ADDRESS) 00002 00002 FFFF FFB2 RSEED1 EQU ZLOCS-2 * RANDOM NUMBER SEED, HIGH WORD 00002 FFFF FFB0 RSEED2 EQU RSEED1-2 * LOW WORD 00002 FFFF FFAE RCYCLE EQU RSEED2-2 * ZERO MEANS NORMAL, OTHERWISE TOP OF SEQUENCE 00002 FFFF FFAC RCONST EQU RCYCLE-2 * CURRENT PLACE IN SEQUENCE 00002 00002 FFFF FFA8 BUFFER EQU RCONST-4 * START OF PRELOADED GAME CODE 00002 FFFF FF96 ARGBLK EQU BUFFER-18 * 8 ARGS MAX FOR EZIP, PLUS COUNT 00002 FFFF FF8C DEFBLK EQU ARGBLK-10 * DEFAULT ARGUMENT BLOCK (4 ARGS + COUNT) 00002 00002 *** 00002 00002 FFFF FF82 RDWSTR EQU DEFBLK-10 * ASCIZ STRING BUFFER (9 CHARS MAX FOR EZIP) 00002 FFFF FF7C RDZSTR EQU RDWSTR-6 * ZSTR BUFFER (3 WORDS MAX FOR EZIP) 00002 00002 FFFF FF78 RDBOS EQU RDZSTR-4 * BEGINNING OF INPUT STRING BUFFER 00002 FFFF FF74 RDEOS EQU RDBOS-4 * END OF INPUT STRING BUFFER (+1) 00002 FFFF FF70 RDRET EQU RDEOS-4 * RETURN TABLE 00002 00002 FFFF FF6E VWSORT EQU RDRET-2 * FLAG: SET IF VOCTAB SORTED 00002 FFFF FF6C VWBOFF EQU VWSORT-2 * INITIAL OFFSET FOR BINARY SEARCH 00002 00002 FFFF FF6A WRDOFF EQU VWBOFF-2 * OFFSET INTO WORD TABLE FOR CURRENT SET 00002 00002 * VIRTUAL I/O DEVICES 00002 00002 FFFF FF68 VOCONS EQU WRDOFF-2 * SET FOR SCREEN OUTPUT 00002 FFFF FF66 VOPRNT EQU VOCONS-2 * SET FOR SCRIPTING 00002 FFFF FF64 VOSTAT EQU VOPRNT-2 * SET FOR STATUS LINE OUTPUT 00002 FFFF FF62 VOTABL EQU VOSTAT-2 * SET FOR TABLE OUTPUT 00002 FFFF FF60 VOFILE EQU VOTABL-2 * SET FOR FILE OUTPUT 00002 00002 FFFF FF5E VIKEYB EQU VOFILE-2 * SET FOR KEYBOARD INPUT 00002 FFFF FF5C VIFILE EQU VIKEYB-2 * SET FOR FILE INPUT 00002 00002 FFFF FF5A VOBUFF EQU VIFILE-2 * SET IF OUTPUT TO SCREEN IS BUFFERED 00002 FFFF FF58 VIECHO EQU VOBUFF-2 * SET IF INPUT IS ECHOED 00002 00002 FFFF FF54 DQUE EQU VIECHO-4 * DISPLAY QUE PARAMETER BLOCK 00002 FFFF FF50 SQUE EQU DQUE-4 * SCRIPT QUE PARAMETER BLOCK 00002 00002 FFFF FF4C TABOUT EQU SQUE-4 * POINTS TO CURRENT TABLE OUTPUT BUFFER (EZIP) 00002 FFFF FF48 TABPTR EQU TABOUT-4 * POINTS TO NEXT TABLE POSITION 00002 00002 FFFF FF44 CURPAG EQU TABPTR-4 * CURRENT PAGE (WHERE ZPC IS) POINTER 00002 FFFF FF42 CURBLK EQU CURPAG-2 * CURRENT BLOCK, USUALLY SAME AS ZPC1 00002 FFFF FF3E CURTAB EQU CURBLK-4 * CURRENT PAGE TABLE POINTER 00002 00002 FFFF FF3A RTIME EQU CURTAB-4 * REFERENCE TIME, NOW USES 2 WORDS 00002 FFFF FF38 LPAGE EQU RTIME-2 * LAST REFERENCED PAGE NUMBER 00002 FFFF FF34 LPLOC EQU LPAGE-4 * AND ITS CORE LOCATION 00002 FFFF FF30 LPTAB EQU LPLOC-4 * AND ITS TABLE POINTER 00002 00002 FFFF FF2E TWAIT EQU LPTAB-2 * DELAY, IN 1/10'S SEC, BETWEEN TIMEOUTS 00002 FFFF FF2C TFUNC EQU TWAIT-2 * FUNCTION TO CALL UPON TIMEOUT 00002 FFFF FF28 TCLOCK EQU TFUNC-4 * REF TIME (60THS) OF LAST CHANGE IN TCOUNT 00002 FFFF FF26 TCOUNT EQU TCLOCK-2 * DELAY REMAINING (10THS) 00002 00002 FFFF FF24 SFUNC EQU TCOUNT-2 * FUNCTION TO CALL UPON SOUND-END 00002 FFFF FF22 SCOUNT EQU SFUNC-2 * #OPS TO WAIT BEFORE NEXT SOUND-END CHECK 00002 00002 FFFF FF1E QFOFF EQU SCOUNT-4 * OFFSET OF FUNCTION AREA (QUADS, LONG) 00002 FFFF FF1A QSOFF EQU QFOFF-4 * OFFSET OF STRING AREA (QUADS, LONG) 00002 00002 * WIND1 * [DEAD] 00002 * ROW0 * WINDOW 0 (SAVED) CURSOR POSITION 00002 * COL0 00002 * ROW1 * WINDOW 1 (SAVED) CURSOR POSITION 00002 * COL1 00002 * LINES * [MOVED INTO EACH WBLOCK] 00002 00002 FFFF FF18 CURWIND EQU QSOFF-2 * CURRENT WINDOW 00002 FFFF FF14 CURWP EQU CURWIND-4 * PTR TO CURWIND RECORD BLOCK 00002 FFFF FEF4 WBLOCKP EQU CURWP-(MAXWIND*4) * PTRS TO ALL BLOCKS 00002 FFFF FEF2 MSWIND EQU WBLOCKP-2 * CURRENT MOUSE WINDOW 00002 00002 FFFF FEF0 INLAST EQU MSWIND-2 * INPUT SETS IT, OUTPUT CLEARS IT, QUIT CHECKS 00002 FFFF FEEE CHRTOT EQU INLAST-2 * TOTAL CHARS INPUT SO FAR DURING OPREAD 00002 00002 FFFF FEEC GAMFIL EQU CHRTOT-2 * REF NUMBER OF OPENED GAME FILE 00002 FFFF FEEA SAVFIL EQU GAMFIL-2 * REF NUMBER OF OPENED SAVE FILE 00002 00002 FFFF FEE6 MSAVEB EQU SAVFIL-4 * PTR TO A RAM BUFFER FOR ISAVE/IRESTORE 00002 FFFF FEE4 MSAVEF EQU MSAVEB-2 * FLAG, SET FOR ISAVE/IRESTORE 00002 00002 *** 00002 00002 FFFF FEE2 FONT EQU MSAVEF-2 * NONZERO WHEN USING SPECIAL (MONOSPACED) FONT 00002 FFFF FEDE MACBUF EQU FONT-4 * NEW VALUE FOR ENDBUF WHEN FONTSIZE CHANGES 00002 00002 FFFF FEDA APPARM EQU MACBUF-4 * HANDLE TO APPLICATION PARAMETERS 00002 FFFF FED6 SHOWVE EQU APPARM-4 * POINTER TO "VERSION" STRING, ZERO IF NONE 00002 00002 *** 00002 00002 FFFF FED4 DBZPC1 EQU SHOWVE-2 * BREAK WHEN ZPC REACHES THIS ADDRESS 00002 FFFF FED2 DBZPC2 EQU DBZPC1-2 00002 FFFF FED0 DBINST EQU DBZPC2-2 * BREAK WHEN NEXT INSTRUCTION HAS THIS VALUE 00002 00002 FFFF FECC DBITOT EQU DBINST-4 * TOTAL INSTRUCTIONS EXECUTED 00002 FFFF FEC8 DBIBRK EQU DBITOT-4 * BREAK AFTER THIS MANY INSTRUCTIONS 00002 00002 FFFF FEB8 DBQUE EQU DBIBRK-DBQLEN * CIRCULAR QUEUE FOR INST HISTORY 00002 FFFF FEB4 DBQPTR EQU DBQUE-4 * PTR, NEXT OPEN SLOT IN QUEUE 00002 FFFF FEB0 DBQEND EQU DBQPTR-4 * PTR, END OF QUEUE 00002 00002 *** 00002 00002 0000 0150 ZVLEN EQU 0-DBQEND * TOTAL LENGTH OF ZIP'S VARIABLES FRAME 00002 00002 00002 * --------------------------------------------------------------------------- 00002 * INITIALIZATIONS 00002 * --------------------------------------------------------------------------- 00002 00002 * LOW-CORE GAME VARIABLES 00002 00002 0000 0000 PVERS1 EQU 0 * ZVERSION VERSION BYTE 00002 0000 0001 PVERS2 EQU 1 * ZVERSION MODE BYTE 00002 0000 0002 PZRKID EQU 2 * ZORK ID 00002 0000 0004 PENDLD EQU 4 * ENDLOD (BYTE OFFSET) 00002 0000 0006 PSTART EQU 6 * START 00002 0000 0008 PVOCTB EQU 8 * VOCTAB 00002 0000 000A POBJTB EQU 10 * OBJTAB 00002 0000 000C PGLOTB EQU 12 * GLOTAB 00002 0000 000E PPURBT EQU 14 * PURBOT 00002 0000 0010 PFLAGS EQU 16 * USER FLAGS WORD 00002 0000 0012 PSERNM EQU 18 * SERIAL NUMBER (6 BYTES) 00002 0000 0018 PWRDTB EQU 24 * WRDTAB 00002 0000 001A PLENTH EQU 26 * LENGTH (EZIP QUADS, ZIP WORDS) 00002 0000 001C PCHKSM EQU 28 * CHECKSUM (ALL BYTES STARTING WITH BYTE 64) 00002 0000 001E PINTWD EQU 30 * INTERPRETER ID/VERSION 00002 0000 0020 PSCRWD EQU 32 * SCREEN SIZE, ROWS/COLUMNS 00002 00002 * FOR XZIP: 00002 00002 0000 0022 PHWRD EQU 2*17 ** * WIDTH OF DISPLAY, IN PIXEL UNITS 00002 0000 0024 PVWRD EQU 2*18 ** * HEIGHT OF DISPLAY, IN PIXEL UNITS 00002 0000 0026 PFWRD EQU 2*19 ** * FONT HEIGHT, WIDTH 00002 * PLMRG EQU 2*20 * DEAD * LEFT MARGIN, IN PIXEL UNITS 00002 * PRMRG EQU 2*21 * DEAD * RIGHT MARGIN, IN PIXEL UNITS 00002 0000 002C PCLRWRD EQU 2*22 * COLOR, BACKGROUND/FOREGROUND 00002 0000 002E PTCHARS EQU 2*23 * BYTE PTR, TABLE OF TERMINATING CHARACTERS 00002 0000 0030 PCRCNT EQU 2*24 ** * CR COUNTER 00002 0000 0032 PCRFUNC EQU 2*25 ** * CR FUNCTION 00002 0000 0034 PCHRSET EQU 2*26 * BYTE PTR, CHAR SET TABLE 00002 0000 0036 PLCTBL EQU 2*27 * BYTE PTR, LOW-CORE VARS EXTENSION TABLE 00002 00002 * FOR YZIP (REPLACEMENTS FOR ABOVE): 00002 00002 0000 0028 PFOFF EQU 2*20 * OFFSET OF FUNCTION AREA (x8) 00002 0000 002A PSOFF EQU 2*21 * OFFSET OF STRING AREA (x8) 00002 00002 * LOW CORE EXTENSION TABLE VARIABLES 00002 * (WORD OFFSETS -- ACCESS THROUGH 'LOWCORE' ROUTINE) 00002 00002 0000 0000 PLCLEN EQU 0 * TABLE LENGTH, IN WORDS 00002 0000 0001 PMLOCX EQU 1 * MOUSE LOCATION WHEN LAST CLICKED 00002 0000 0002 PMLOCY EQU 2 00002 00002 * "PFLAGS" BIT DEFINITIONS 00002 00002 * FSCRI EQU 0 * INTERPRETER CURRENTLY SCRIPTING >> DEAD << 00002 0000 0001 FFIXE EQU 1 * FIXED-WIDTH FONT NEEDED 00002 0000 0002 FSTAT EQU 2 * REQUEST FOR STATUS LINE REFRESH 00002 0000 0003 FDISP EQU 3 * GAME USES DISPLAY OPS 00002 0000 0004 FUNDO EQU 4 * GAME USES UNDO 00002 0000 0005 FMOUS EQU 5 * GAME USES MOUSE 00002 00002 * MICRO'S ID CODE, INTERPRETER VERSION LETTER (SEE ALSO OPVERI) 00002 00000 DATA 00000 03 INTWRD DC.B 3 * MACHINE ID FOR MACINTOSH 00001 44 DC.B 'D' * XZIP INTERPRETER VERSION 00002 0000 SUBVER DC.W 0 * INTRPRETER SUB-VERSION, ZERO TO DISABLE 00002 CODE 00002 00002 * INITIAL SET OF READ BREAK CHARS -- SPACE, TAB, CR, <.>, <,>, 00002 00004 DATA 00004 20 09 0D 2E 2C IRBRKS DC.B $20,$09,$0D,$2E,$2C,$3F,0 * ASCIZ 00002 CODE 00002 00002 0000 0006 ZMVERS EQU 6 * 'YZIP' Z-MACHINE VERSION NUMBER 00002 0000 0400 STKLEN EQU 512*2 * LENGTH OF GAME STACK (MULTIPLE OF 512) 00002 0000 0002 PAGMIN EQU 2 * MINIMUM # PAGES (NEEDED BY $VER) 00002 00002 * ---------------------- 00002 * ZSTART 00002 * ---------------------- 00002 00002 4E56 FEB0 ZSTART LINK A6,#-ZVLEN * CREATE A FRAME FOR ZIP VARIABLES 00006 G 204E MOVE.L A6,A0 * TOP OF FRAME 00008 00008 303C 00A8 MOVE.W #ZVLEN/2,D0 0000C 4260 STRX1 CLR.W -(A0) * ALL INITIAL VALUES ARE ZERO 0000E 5340 SUBQ.W #1,D0 00010 66FA 0000C BNE STRX1 00012 00012 2D4F FFC2 MOVE.L SP,TOPSP(A6) * SAVE THE SP FOR RESTARTS 00016 41ED 0352 LEA ZVARS,A0 0001A 208E MOVE.L A6,(A0) * COPY A6 FOR EXTERNAL CALLS INTO ZIP ROUTINES 0001C 0001C *** careful about error msgs before screen & buffers are initialized ... 0001C 0001C 3D7C 0001 FF68 MOVE.W #1,VOCONS(A6) * OUTPUT ERRORS TO SCREEN FOR NOW (NO BUFFER) 00022 3D7C 0001 FF58 MOVE.W #1,VIECHO(A6) * INPUT IS NORMALLY ECHOED 00028 00028 *** MOVE.W #1,WIND1(A6) * AVOID PUTCHR/TSTSCR (CZIP ONLY) BUG DURING INIT 00028 6100 234A 02374 BSR SYSIN1 * OPEN GAME FILE, WINDOW, ETC 0002C 0002C * SET UP ZIP DEBUGGER (IF REQUESTED) 0002C 0002C IF DEBUG THEN 0002C ENDIF 0002C 0002C *** READ GAME BLOCK 0 INTO A TEMP STACK BUFFER ... 0002C 0002C 9EFC 0200 SUBA.W #512,SP * CREATE THE BUFFER 00030 G 284F MOVE.L SP,A4 * SAVE POINTER HERE FOR NOW 00032 00032 G 204C MOVE.L A4,A0 00034 4240 CLR.W D0 * BLOCK 0 00036 6100 27C8 02800 BSR GETBLK * GET IT 0003A 0003A *** CHECK FOR ID CODE ... 0003A 0003A 0C14 0006 CMPI.B #ZMVERS,(A4) * PROPER Z-MACHINE VERSION? 0003E 670A 0004A BEQ.S STRX3 * YES 00040 00040 4240 STRX2 CLR.W D0 * SOMETHING WRONG, DIE 00042 41ED 000B LEA MSGZMV,A0 00046 6000 2710 02758 BRA FATAL * 'Wrong Z-machine' 0000B DATA 0000B 57726F6E67205A MSGZMV DC.B 'Wrong Z-machine version',0 0004A CODE 0004A 0004A 3D6C 0002 FFFE STRX3 MOVE.W PZRKID(A4),ZORKID(A6) * UNIQUE GAME ID, CHECKED BY "RESTORE" 00050 00050 7000 MOVEQ #0,D0 00052 302C 000E MOVE.W PPURBT(A4),D0 * GET PURBOT BYTE POINTER 00056 6100 0362 003BA BSR BYTBLK * ROUND UP TO NEXT BLOCK BOUNDARY 0005A 3D40 FFF8 MOVE.W D0,PURBOT(A6) * >> here for undo, below << 0005E 0005E * Allocate an "undo" buffer, if requested. This allocation (now) comes 0005E * BEFORE the preload/paging allocations. It should really get skipped if 0005E * it would leave either () not enough for preload, or () a critically low 0005E * (defined in some heuristic way) amount for paging. 0005E 0005E 7200 MOVEQ #0,D1 * ASSUME NO UNDO 00060 302C 0010 MOVE.W PFLAGS(A4),D0 00064 0800 0004 BTST #FUNDO,D0 * DOES THIS GAME USE UNDO? 00068 6718 00082 BEQ.S STRX3B * NO 0006A 0006A 302E FFF8 STRX3A MOVE.W PURBOT(A6),D0 * BLOCKS 0006E 5480 ADDQ.L #STKLEN/512,D0 00070 6100 0340 003B2 BSR BLKBYT * TOTAL BYTES NEEDED FOR AN UNDO-SAVE 00074 6100 2322 02398 BSR GETM * GET IT, WITHOUT ERROR TRAPPING 00078 6708 00082 BEQ.S STRX3B * ZERO: NOT ENOUGH MEM 0007A 0007A 4250 CLR.W (A0) * OK, MARK THE BUFFER AS EMPTY 0007C 2D48 FEE6 MOVE.L A0,MSAVEB(A6) * AND STORE PTR 00080 7201 MOVEQ #1,D1 * SUCCESS 00082 3001 STRX3B MOVE.W D1,D0 00084 6100 2288 0230E BSR SETUNDO * SET FLAG FOR PASCAL (MENU DISPLAY) 00088 00088 * ALLOC/INIT SOME WINDOW RECORDS (YZIP) 00088 00088 7208 MOVEQ #MAXWIND,D1 * TOTAL RECORDS TO CREATE 0008A 43EE FEF4 LEA WBLOCKP(A6),A1 0008E 0008E 6100 021A 002AA INIWX1 BSR INITWB * CREATE A WINDOW RECORD 00092 22C8 MOVE.L A0,(A1)+ * AND STORE THE POINTER 00094 5341 SUBQ.W #1,D1 00096 66F6 0008E BNE.S INIWX1 00098 00098 6100 2100 0219A BSR MAXSCRN * GET D0.W = ROWS, D1.W = COLS 0009C 43EE FEF4 LEA WBLOCKP(A6),A1 000A0 G 2059 MOVE.L (A1)+,A0 * GET POINTER TO WINDOW 0 RECORD 000A2 000A2 3140 0004 MOVE.W D0,WYSIZE(A0) * WINDOW 0 GETS A FEW SPECIAL INIT VALS 000A6 3141 0006 MOVE.W D1,WXSIZE(A0) 000AA 0068 0003 001C ORI.W #WFWRAP+WFSCRL,WATTR(A0) 000B0 000B0 2D48 FF14 MOVE.L A0,CURWP(A6) * THIS IS INITIAL RECORD POINTER 000B4 * CLR.W CURWIND(A6) * AND INITIAL WINDOW [0 ALREADY] 000B4 000B4 G 2059 MOVE.L (A1)+,A0 * GET POINTER TO WINDOW 1 RECORD 000B6 3141 0006 MOVE.W D1,WXSIZE(A0) * IT GETS ONE SPECIAL INIT VAL 000BA 000BA *** CHECK MEMORY, SET ENDLOD & PAGTOT, DO PRELOAD 000BA 000BA 6100 2320 023DC STRX4 BSR MEMAVAIL * DETERMINE HOW MUCH FREE MEMORY EXISTS 000BE 2E00 MOVE.L D0,D7 * REMEMBER THE AMOUNT 000C0 000C0 7000 MOVEQ #0,D0 000C2 302C 001A MOVE.W PLENTH(A4),D0 * LENGTH OF GAME FILE (WORDS OR QUADS) 000C6 D080 ADD.L D0,D0 000C8 IF EZIP THEN 000C8 D080 ADD.L D0,D0 * BYTES 000CA ENDIF 000CA 000CA IF DEBUG THEN 000CA ENDIF 000CA 000CA B087 CMP.L D7,D0 * ENOUGH ROOM TO PRELOAD ENTIRE GAME? 000CC 6D0E 000DC BLT.S LOAD1 * YES 000CE 000CE 7000 MOVEQ #0,D0 000D0 302C 0004 MOVE.W PENDLD(A4),D0 * LENGTH OF PRELOAD SEGMENT (BYTES) 000D4 B087 CMP.L D7,D0 * ENOUGH ROOM FOR IT? 000D6 6D1A 000F2 BLT.S LOAD2 * YES 000D8 000D8 6000 22E4 023BE BRA MEMERROR * NO, FAIL 000DC 000DC * WE HAVE MEGA-MEMORY, PRELOAD EVERYTHING ... 000DC 000DC 6100 02DC 003BA LOAD1 BSR BYTBLK * LENGTH OF GAME FILE (IN BLOCKS) 000E0 3D40 FFFA MOVE.W D0,ENDLOD(A6) * MAXIMIZE THE PRELOAD 000E4 000E4 3D7C 0002 FFCA MOVE.W #PAGMIN,PAGTOT(A6) * MINIMIZE THE PAGING SPACE (FOR $VER) 000EA 3D7C 0001 FFC6 MOVE.W #1,MAXFLG(A6) * SET FLAG 000F0 601A 0010C BRA.S LOAD3 000F2 000F2 * WE HAVE LIMITED MEMORY, PRELOAD ONLY WHAT'S NEEDED 000F2 000F2 9E80 LOAD2 SUB.L D0,D7 * FIRST DETERMINE MEMORY LEFT AFTER PRELOAD 000F4 6100 02C4 003BA BSR BYTBLK 000F8 3D40 FFFA MOVE.W D0,ENDLOD(A6) * LENGTH OF PRELOAD (IN BLOCKS) 000FC 000FC 8EFC 0208 DIVU #512+8,D7 * PAGES AVAIL (ALLOW 8 BYTES PER TABLE ENTRY) 00100 0C47 0002 CMPI.W #2,D7 00104 6C02 00108 BGE.S LOADX1 00106 7E02 MOVEQ #2,D7 * MUST HAVE AT LEAST TWO (FOR $VERIFY) 00108 3D47 FFCA LOADX1 MOVE.W D7,PAGTOT(A6) * MAXIMIZE THE PAGING SPACE 0010C 0010C 302E FFFA LOAD3 MOVE.W ENDLOD(A6),D0 * SPACE NEEDED FOR PRELOAD, IN BLOCKS 00110 6100 02A0 003B2 BSR BLKBYT * CONVERT TO BYTES 00114 6100 22A0 023B6 BSR GETMEM * GET IT 00118 00118 2D48 FFA8 MOVE.L A0,BUFFER(A6) * SAVE POINTER 0011C G 2848 MOVE.L A0,A4 * ALSO HERE FOR REMAINING INIT 0011E 0011E 322E FFFA MOVE.W ENDLOD(A6),D1 * NUMBER OF BLOCKS TO PRELOAD 00122 4240 CLR.W D0 * STARTING WITH BLOCK 0 00124 6100 26EA 02810 BSR GTBLKS * READ THEM IN 00128 00128 *** CLR.W WIND1(A6) * RESTORE NORMAL VALUE (AFTER PREV KLUGE) 00128 00128 * ------------------------------------------------------------------------ 00128 00128 *** INITIALIZE MAJOR TABLE POINTERS 00128 00128 7000 STRX6 MOVEQ #0,D0 0012A 302C 0008 MOVE.W PVOCTB(A4),D0 * RELATIVE VOCAB TABLE POINTER 0012E D08C ADD.L A4,D0 * ABSOLUTIZE IT 00130 2D40 FFF4 MOVE.L D0,VOCTAB(A6) * AND SAVE IT 00134 00134 7000 MOVEQ #0,D0 00136 302C 000A MOVE.W POBJTB(A4),D0 * RELATIVE OBJECT TABLE POINTER 0013A D08C ADD.L A4,D0 0013C 2D40 FFF0 MOVE.L D0,OBJTAB(A6) 00140 6100 020A 0034C BSR EZERR * CHECK OBJTAB ALIGNMENT 00144 00144 7000 MOVEQ #0,D0 00146 302C 000C MOVE.W PGLOTB(A4),D0 * RELATIVE GLOBAL TABLE POINTER 0014A D08C ADD.L A4,D0 0014C 2D40 FFEC MOVE.L D0,GLOTAB(A6) 00150 00150 7000 MOVEQ #0,D0 00152 302C 0018 MOVE.W PWRDTB(A4),D0 * RELATIVE WORD TABLE POINTER 00156 D08C ADD.L A4,D0 00158 2D40 FFE8 MOVE.L D0,WRDTAB(A6) 0015C 0015C * AND SEGMENT OFFSETS 0015C 0015C 7000 MOVEQ #0,D0 0015E 302C 0028 MOVE.W PFOFF(A4),D0 * OFFSET OF FUNCTION AREA ("OCTS") 00162 D080 ADD.L D0,D0 * STORE AS QUADS (LONG) 00164 2D40 FF1E MOVE.L D0,QFOFF(A6) 00168 00168 7000 MOVEQ #0,D0 0016A 302C 002A MOVE.W PSOFF(A4),D0 * OFFSET OF STRING AREA ("OCTS") 0016E D080 ADD.L D0,D0 * STORE AS QUADS (LONG) 00170 2D40 FF1A MOVE.L D0,QSOFF(A6) 00174 00174 *** ALLOCATE MEMORY FOR Z STACK 00174 00174 203C 0000 0400 MOVE.L #STKLEN,D0 0017A 6100 223A 023B6 BSR GETMEM 0017E 2D48 FFBE MOVE.L A0,STKBOT(A6) * THIS WILL BE BOTTOM OF GAME STACK 00182 00182 *** INITIALIZE LINE BUFFER, SCRIPT BUFFER 00182 00182 0000 00A0 MAXLEN EQU 160 * MAX LENGTH OF LINE BUFFER (BYTES) 00182 0000 0041 SCRLEN EQU 65 ** 80 * LENGTH OF SCRIPT BUFFER (BYTES) 00182 00182 6100 2016 0219A BSR MAXSCRN * FULL SCREEN WIDTH (UNITS) 00186 3401 MOVE.W D1,D2 00188 323C 00A0 MOVE.W #MAXLEN,D1 * (BYTES) 0018C 43FA 2572 02700 LEA LINOUT,A1 * SCREEN DISPLAY FUNCTION 00190 45FA 2272 02404 LEA DCHSIZ,A2 00194 6100 1CFC 01E92 BSR INITQP * SET UP DISPLAY QUEUE STUFF 00198 2D48 FF54 MOVE.L A0,DQUE(A6) * SAVE BLOCK POINTER 0019C 0019C 323C 0041 MOVE.W #SCRLEN,D1 * SCRIPTING WIDTH, NEVER CHANGES 001A0 3401 MOVE.W D1,D2 001A2 43FA 25F4 02798 LEA SCROUT,A1 * SCRIPTING DISPLAY FUNCTION 001A6 45FA 226E 02416 LEA SCHSIZ,A2 001AA 6100 1CE6 01E92 BSR INITQP * SET UP SCRIPT QUEUE STUFF 001AE 2D48 FF50 MOVE.L A0,SQUE(A6) * SAVE THIS POINTER TOO 001B2 001B2 * AND SET UP MACBUF ... 001B2 001B2 * ALLOCATE AND SET UP BREAK-CHAR TABLE 001B2 001B2 G 7040 MOVE.L #64,D0 * MAX BREAK CHARS 001B4 6100 2200 023B6 BSR GETMEM * ALLOCATE BUFFER FOR BREAK-CHAR TABLE 001B8 2D48 FFE4 MOVE.L A0,RBRKS(A6) 001BC 001BC G 226E FFF4 MOVE.L VOCTAB(A6),A1 * (DEFAULT) VOCAB TABLE 001C0 4240 CLR.W D0 001C2 1019 MOVE.B (A1)+,D0 * FIRST BYTE OF VOCTAB IS # OF SI BREAK CHARS 001C4 6002 001C8 BRA.S STRX11 * (ZERO CHECK) 001C6 001C6 10D9 STRX10 MOVE.B (A1)+,(A0)+ * TRANSFER SI BREAKS FIRST 001C8 51C8 FFFC 001C6 STRX11 DBF D0,STRX10 001CC 2D48 FFE0 MOVE.L A0,ESIBKS(A6) * REMEMBER END OF SI BREAKS 001D0 001D0 45ED 0004 LEA IRBRKS,A2 * THESE ARE THE "NORMAL" BREAK CHARS 001D4 10DA STRX12 MOVE.B (A2)+,(A0)+ * TRANSFER THEM TOO 001D6 66FC 001D4 BNE STRX12 * ASCIZ 001D8 001D8 *** ALLOCATE MEMORY FOR PAGE TABLE & BUFFERS 001D8 001D8 302E FFCA MOVE.W PAGTOT(A6),D0 * PREVIOUSLY CALCULATED NUMBER OF PAGE BUFFERS 001DC C0FC 0008 MULU #8,D0 * 8-BYTE TABLE ENTRY FOR EACH PAGE 001E0 5480 ADDQ.L #2,D0 * ALLOW FOR THE END MARK 001E2 6100 21D2 023B6 BSR GETMEM 001E6 2D48 FFD0 MOVE.L A0,PAGTAB(A6) * THIS WILL BE START OF PAGE TABLE 001EA 001EA 302E FFCA MOVE.W PAGTOT(A6),D0 * PREVIOUSLY CALCULATED NUMBER OF PAGE BUFFERS 001EE C0FC 0200 MULU #512,D0 * 512 BYTES EACH 001F2 6100 21C2 023B6 BSR GETMEM 001F6 2D48 FFCC MOVE.L A0,PAGES(A6) * PAGES THEMSELVES WILL START HERE 001FA 001FA *** INITIALIZE THE PAGE TABLE 001FA 001FA 302E FFCA MOVE.W PAGTOT(A6),D0 * PREVIOUSLY CALCULATED NUMBER OF PAGE BUFFERS 001FE G 206E FFD0 MOVE.L PAGTAB(A6),A0 00202 00202 30FC FFFE STRX16 MOVE.W #-2,(A0)+ * BLOCK (NO BLOCK "$FFFE") 00206 4298 CLR.L (A0)+ * REF TIME IS ZERO 00208 4258 CLR.W (A0)+ * THIS SLOT UNUSED (BUT 8 BYTES SPEEDS CALCS) 0020A 5340 SUBQ.W #1,D0 0020C 66F4 00202 BNE STRX16 0020E 30BC FFFF MOVE.W #-1,(A0) * MARK THE END OF THE TABLE (NO BLOCK "$FFFF") 00212 00212 3D7C FFFF FF42 MOVE.W #-1,CURBLK(A6) * MUST INIT THESE PAGING VARS TOO! 00218 3D7C FFFF FF38 MOVE.W #-1,LPAGE(A6) 0021E 0021E * ETCETERA ... 0021E 0021E 6100 21D8 023F8 STRX17 BSR GTSEED * INITIALIZE THE RANDOM NUMBER SEEDS 00222 3D40 FFB2 MOVE.W D0,RSEED1(A6) 00226 4840 SWAP D0 00228 3D40 FFB0 MOVE.W D0,RSEED2(A6) * PUT HIGH WORD HERE, "RELATIVELY CONSTANT" 0022C 0022C 3D7C 0001 FF5A MOVE.W #1,VOBUFF(A6) * BEGIN BUFFERING OUTPUT 00232 00232 6100 213E 02372 BSR ENDTITLE * PAUSE FOR TITLE SCREEN, IF SHOWING 00236 601A 00252 BRA.S START1 00238 00238 * ---------------------- 00238 * RESTRT 00238 * ---------------------- 00238 00238 * RESTART EXECUTION HERE 00238 00238 G 206E FFA8 RESTRT MOVE.L BUFFER(A6),A0 0023C 3F28 0010 MOVE.W PFLAGS(A0),-(SP) * PRESERVE THE USER FLAGS (SCRIPT ETC) 00240 00240 4240 CLR.W D0 * REREAD ALL OF THE IMPURE STUFF 00242 322E FFF8 MOVE.W PURBOT(A6),D1 00246 6100 25C8 02810 BSR GTBLKS 0024A 0024A G 206E FFA8 MOVE.L BUFFER(A6),A0 0024E 315F 0010 MOVE.W (SP)+,PFLAGS(A0) * RESTORE FLAGS 00252 00252 G 2E6E FFC2 START1 MOVE.L TOPSP(A6),SP * RESET SYSTEM STACK POINTER 00256 00256 G 206E FF54 MOVE.L DQUE(A6),A0 0025A 2150 0004 MOVE.L BUFPTR(A0),NXTPTR(A0) * INITIALIZE OUTPUT BUFFER POINTER 0025E 0025E G 286E FFBE MOVE.L STKBOT(A6),A4 00262 D8FC 0400 ADDA.W #STKLEN,A4 * INITIALIZE GAME STACK POINTER 00266 2D4C FFB4 MOVE.L A4,ZLOCS(A6) * INITIALIZE POINTER TO LOCALS/FRAME 0026A G 246E FFA8 MOVE.L BUFFER(A6),A2 0026E 0026E 002A 0002 0001 ORI.B #2,PVERS2(A2) * DISPLAY OP IS AVAILABLE 00274 002A 003C 0001 ORI.B #32+16+8+4,PVERS2(A2) * SOUND, MONOSPACE, ITALIC, BOLD 0027A 0027A 6100 0078 002F4 BSR INITDISP * GET/STORE TTY-SPECIFIC LOWCORE VARS 0027E 0027E 356D 0000 001E MOVE.W INTWRD,PINTWD(A2) * SET INTERPRETER ID/VERSION WORD 00284 426E FFAE CLR.W RCYCLE(A6) * ALWAYS RESTART WITH NORMAL RANDOMNESS 00288 3D7C 0001 FEF2 MOVE.W #1,MSWIND(A6) * YZIP: INITIALLY CONSTRAIN MOUSE TO W1 0028E 0028E 302A 0006 MOVE.W PSTART(A2),D0 * GET STARTING LOCATION 00292 6100 02A6 0053A BSR BSPLTB * SPLIT BLOCK AND BYTE POINTERS 00296 00296 3D40 FFBC MOVE.W D0,ZPC1(A6) * INITIALIZE THE ZPC 0029A 3D41 FFBA MOVE.W D1,ZPC2(A6) 0029E 6100 1E0A 020AA BSR NEWZPC * GET THE PAGE TO EXECUTE 002A2 002A2 * SYSIN2 SHOULD BE THE /LAST/ CALL BEFORE NXTINS, BECAUSE OF STACK HACKING 002A2 * (FOR KLUDGY TIMEOUTS) IN OPREST. 002A2 002A2 6100 2508 027AC BSR SYSIN2 * MAC -- BUT LOAD A SAVED GAME IF REQUESTED 002A6 6000 18AC 01B54 BRA NXTINS * TALLY HO 002AA 002AA * ---------------------- 002AA * INITWB 002AA * ---------------------- 002AA 002AA * ALLOCATE AND INITIALIZE A (GENERIC) WINDOW RECORD BLOCK 002AA * RETURN A0 -> BLOCK 002AA 002AA 48E7 4040 INITWB MOVEM.L D1/A1,-(SP) 002AE 7022 MOVEQ #WBLKLEN,D0 * SPACE FOR ONE BLOCK 002B0 6100 2104 023B6 BSR GETMEM * GET IT 002B4 G 2248 MOVE.L A0,A1 * SAVE HERE 002B6 002B6 7022 MOVEQ #WBLKLEN,D0 002B8 4218 INWBX1 CLR.B (A0)+ * ZERO THE BLOCK 002BA 5340 SUBQ.W #1,D0 002BC 66FA 002B8 BNE.S INWBX1 002BE 002BE * INIT ALL NON-ZERO SLOTS 002BE 002BE 7001 MOVEQ #1,D0 002C0 3280 MOVE.W D0,WYPOS(A1) * EACH WINDOW LIVES INITIALLY AT 1,1 002C2 3340 0002 MOVE.W D0,WXPOS(A1) 002C6 3340 0008 MOVE.W D0,WYCURS(A1) * CURSOR INITIALLY AT UPPER LEFT 002CA 3340 000A MOVE.W D0,WXCURS(A1) 002CE 002CE 3340 0018 MOVE.W D0,WFONTID(A1) * INITIALLY FONT #1 002D2 6100 1ED0 021A4 BSR GETFYX * GET (DEFAULT) FONT SIZE 002D6 3340 001A MOVE.W D0,WFONTYX(A1) 002DA 002DA 7000 MOVEQ #0,D0 * GET DEFAULT COLORS 002DC 7200 MOVEQ #0,D1 002DE 6100 2046 02326 BSR MDCOLOR 002E2 3340 0016 MOVE.W D0,WCOLOR(A1) * (BACK/FORE) 002E6 002E6 337C 0008 001C MOVE.W #WFBUFF,WATTR(A1) * BUFFERING ON 002EC 002EC G 2049 MOVE.L A1,A0 * RETURN PTR 002EE 4CDF 0202 MOVEM.L (SP)+,D1/A1 002F2 4E75 RTS 002F4 002F4 * ---------------------- 002F4 * INITDISP 002F4 * ---------------------- 002F4 002F4 * GET/STORE TTY-SPECIFIC LOWCORE VARS 002F4 * [MAY CHANGE BETWEEN MAC & MACII -- ALSO CALLED AFTER RESTORE] 002F4 002F4 INITDISP 002F4 48E7 7020 MOVEM.L D1-D3/A2,-(SP) 002F8 G 246E FFA8 MOVE.L BUFFER(A6),A2 002FC 002FC 6100 1EA6 021A4 BSR GETFYX 00300 3540 0026 MOVE.W D0,PFWRD(A2) * FONT SIZE, HEIGHT/WIDTH (PIXELS) 00304 *** MOVE.W D0,D2 00304 *** ROR.W #8,D2 * SWAP BYTES (BUG IN YZIP20) 00304 *** MOVE.W D2,PFWRD(A2) 00304 00304 ** PFWRD/PVWRD/PHWRD DEAD IN 'YZIP', BUT KEEP FOR NOW, FOR BACKWARD COMPAT ... 00304 00304 3400 MOVE.W D0,D2 00306 3600 MOVE.W D0,D3 00308 E04A LSR.W #8,D2 * UNPACK HEIGHT 0030A 0243 00FF ANDI.W #$FF,D3 * UNPACK WIDTH 0030E 0030E 6100 1E8A 0219A BSR MAXSCRN * SCREEN SIZE, PIXELS 00312 3540 0024 MOVE.W D0,PVWRD(A2) 00316 3541 0022 MOVE.W D1,PHWRD(A2) 0031A 0031A 48C0 EXT.L D0 0031C 80C2 DIVU D2,D0 0031E E148 LSL.W #8,D0 * ROWS (ROUNDED DOWN) IN HIGH BYTE 00320 48C1 EXT.L D1 00322 82C3 DIVU D3,D1 00324 1001 MOVE.B D1,D0 * COLUMNS IN LOW 00326 3540 0020 MOVE.W D0,PSCRWD(A2) * SCREEN SIZE, CHARS 0032A 0032A * INIT COLOR STUFF TOO 0032A 0032A 7000 MOVEQ #0,D0 * GET DEFAULT COLORS (OR BLACK/WHITE) 0032C 7200 MOVEQ #0,D1 0032E 6100 1FF6 02326 BSR MDCOLOR 00332 3540 002C MOVE.W D0,PCLRWRD(A2) * (BACK/FORE) 00336 00336 022A 00FE 0001 ANDI.B #$FE,PVERS2(A2) * ASSUME COLOR UNAVAILABLE (FORCE BIT -> 0) 0033C 4A41 TST.W D1 * MONO MACHINE? 0033E 6706 00346 BEQ.S IDSPX9 00340 002A 0001 0001 ORI.B #1,PVERS2(A2) * NO, COLOR IS AVAILABLE 00346 00346 4CDF 040E IDSPX9 MOVEM.L (SP)+,D1-D3/A2 0034A 4E75 RTS 0034C 0034C * ---------------------- 0034C * EZERR 0034C * ---------------------- 0034C 0034C IF EZIP THEN 0034C * FOR EZIP/XZIP, MAKE SURE D0.L = OBJ TABLE BASE IS WORD ALIGNED 0034C 0034C 0800 0000 EZERR BTST #0,D0 * WORD ALIGNED? 00350 6602 00354 BNE.S EZERX1 * NO, FAIL 00352 4E75 RTS 00354 00354 4240 EZERX1 CLR.W D0 00356 41ED 0023 LEA MSGEZR,A0 0035A 6000 23FC 02758 BRA FATAL * 'OBJTAB align err' 0035E 00023 DATA 00023 4F424A54414220 MSGEZR DC.B 'OBJTAB align err',0 0035E CODE 0035E 0035E ENDIF 0035E 0035E * --------------------------------------------------------------------------- 0035E * MISC FUNCTIONS 0035E * --------------------------------------------------------------------------- 0035E 0035E * ------------------------------ 0035E * COPYB 0035E * ------------------------------ 0035E 0035E * COPY BYTES 0035E * GIVEN A0 -> SRC, D0 = LEN, A1 -> DEST 0035E 0035E 12D8 CPBX1 MOVE.B (A0)+,(A1)+ * COPY THEM 00360 51C8 FFFC 0035E COPYB DBF D0,CPBX1 * ZERO CHECK << ENTRY POINT >> 00364 4E75 RTS 00366 00366 * ------------------------------ 00366 * COPYS 00366 * ------------------------------ 00366 00366 * COPY A STRING, AND TACK ON A NULL BYTE 00366 * GIVEN A0 -> SRC, A1 -> DEST, D0 = LEN, D1 = MAX LEN 00366 00366 B041 COPYS CMP.W D1,D0 * LEN WITHIN MAX? 00368 6F02 0036C BLE.S CPSX1 0036A 3001 MOVE.W D1,D0 * NO, TRUNCATE IT 0036C 6002 00370 CPSX1 BRA.S CPSX3 * ZERO CHECK 0036E 0036E 12D8 CPSX2 MOVE.B (A0)+,(A1)+ 00370 51C8 FFFC 0036E CPSX3 DBF D0,CPSX2 00374 4211 CLR.B (A1) * ASCIZ 00376 4E75 RTS 00378 00378 * -------------------------- 00378 * COMPS 00378 * -------------------------- 00378 00378 * COMPARE STRINGS, PTRS IN A0 AND A1, LENGTHS IN D0.W 00378 * RETURN FLAGS, 'EQ' IF SAME 00378 00378 4A40 COMPS TST.W D0 0037A 6F08 00384 BLE.S CMPSX4 * ZERO CHECK 0037C G B308 CMPSX2 CMP.B (A0)+,(A1)+ 0037E 6604 00384 BNE.S CMPSX4 * MISMATCH, RETURN "DIFFERENT" 00380 5340 SUBQ.W #1,D0 00382 66F8 0037C BNE.S CMPSX2 * IF DONE, RETURN "SAME" 00384 4E75 CMPSX4 RTS 00386 00386 * ---------------------- 00386 * STRLEN 00386 * ---------------------- 00386 00386 * FIND LENGTH OF AN NULL-TERMINATED STRING, POINTER IN A0 00386 * RETURN POINTER IN A0, LENGTH IN D0 00386 00386 2F08 STRLEN MOVE.L A0,-(SP) * SAVE START 00388 4A18 STRLX1 TST.B (A0)+ * SEARCH FOR NULL 0038A 66FC 00388 BNE.S STRLX1 0038C 2008 MOVE.L A0,D0 * FOUND IT 0038E 5380 SUBQ.L #1,D0 * BACKUP TO THE NULL 00390 G 205F MOVE.L (SP)+,A0 * RETURN ORIGINAL POINTER 00392 9088 SUB.L A0,D0 * RETURN LENGTH 00394 4E75 RTS 00396 00396 * ------------------------------ 00396 * RELABS [RRELABS] 00396 * ------------------------------ 00396 00396 * CONVERT A RELATIVE (BYTE) OFFSET (D0.W) TO AN ABSOLUTE PTR (A0) 00396 00396 G 206E FFA8 RELABS MOVE.L BUFFER(A6),A0 0039A *** CMP.W PPURBT(A0),D0 * MAX FOR READ/WRITE 0039A B068 0004 CMP.W PENDLD(A0),D0 * MAX FOR READ-ONLY (USED BY OPLEX!) 0039E 620A 003AA BHI.S RLBSX2 * REQUEST TOO HIGH 003A0 003A0 4840 RLBSX1 SWAP D0 003A2 4240 CLR.W D0 * ZERO THE HIGH WORD (NO SIGN-EXTENDING) 003A4 4840 SWAP D0 * [14 cycles vs 16] 003A6 D1C0 ADDA.L D0,A0 * ABSOLUTIZE IT 003A8 4E75 RTS 003AA 003AA 41ED 0034 RLBSX2 LEA MSGRLB,A0 003AE *** CLR.W D0 003AE 6000 23A8 02758 BRA FATAL 00034 DATA 00034 4F7574206F6620 MSGRLB DC.B 'Out of range in RELABS',0 003B2 CODE 003B2 003B2 * ---------------------- 003B2 * BLKBYT 003B2 * ---------------------- 003B2 003B2 * GIVEN A ZIP BLOCK COUNT IN D0.W, RETURN A BYTE COUNT IN D0.L 003B2 003B2 48C0 BLKBYT EXT.L D0 * CLEAR HIGH WORD 003B4 4840 SWAP D0 003B6 EE88 LSR.L #7,D0 * x512 003B8 4E75 RTS 003BA 003BA * ---------------------- 003BA * BYTBLK 003BA * ---------------------- 003BA 003BA * GIVEN A BYTE COUNT IN D0.L, RETURN A ZIP BLOCK COUNT IN D0.W, ROUNDING UP 003BA 003BA 3F00 BYTBLK MOVE.W D0,-(SP) * SAVE LOW WORD 003BC E088 LSR.L #8,D0 003BE E288 LSR.L #1,D0 * EXTRACT BLOCK NUMBER 003C0 003C0 025F 01FF ANDI.W #$01FF,(SP)+ * EXACT MULTIPLE OF 512? 003C4 6702 003C8 BEQ.S BYTBX1 * YES 003C6 5240 ADDQ.W #1,D0 * NO, ROUND UP TO NEXT BLOCK 003C8 4E75 BYTBX1 RTS 003CA 003CA * ---------------------- 003CA * LOWCORE 003CA * ---------------------- 003CA 003CA * USE THIS ROUTINE TO ACCESS LOW-CORE EXTENSION-TABLE VARS 003CA 003CA * GIVEN D0 = VAR (WORD OFFSET) 003CA * RETURN A0 (MAY BE ODD) -> VAR, AND FLAGS (ZERO IF INVALID VAR) 003CA 003CA 48E7 4000 LOWCORE MOVEM.L D1,-(SP) 003CE 3200 MOVE.W D0,D1 003D0 G 206E FFA8 MOVE.L BUFFER(A6),A0 003D4 7000 MOVEQ #0,D0 * GET EXTENSION TABLE OFFSET (MAY BE >32K, ODD) 003D6 3028 0036 MOVE.W PLCTBL(A0),D0 * EXISTS? 003DA 6712 003EE BEQ.S LWCX1 * NO, ERROR 003DC 003DC D1C0 ADDA.L D0,A0 * TABLE BASE 003DE 6100 0016 003F6 BSR GTAWRD * TABLE LEN (WORDS) 003E2 B240 CMP.W D0,D1 * ENOUGH? 003E4 6E08 003EE BGT.S LWCX1 * NO, ERROR 003E6 003E6 5588 SUBQ.L #2,A0 003E8 D241 ADD.W D1,D1 * BYTE OFFSET 003EA D0C1 ADDA.W D1,A0 * POINT TO DESIRED VAR 003EC 6002 003F0 BRA.S LWCX2 * NONZERO FLAGS 003EE 003EE 7000 LWCX1 MOVEQ #0,D0 * ZERO FLAGS 003F0 4CDF 0002 LWCX2 MOVEM.L (SP)+,D1 * DON'T DISTURB FLAGS 003F4 4E75 RTS 003F6 003F6 * ---------------------- 003F6 * GTAWRD 003F6 * ---------------------- 003F6 003F6 * GET CORE WORD, ABSOLUTE POINTER IN A0, RETURN THE WORD IN D0, UPDATE POINTER 003F6 003F6 GTAWRD 003F6 1018 MOVE.B (A0)+,D0 * GET HIGH-ORDER BYTE, ADVANCE A0 003F8 E140 ASL.W #8,D0 * POSITION IT 003FA 1018 MOVE.B (A0)+,D0 * GET LOW-ORDER BYTE, ADVANCE A0 003FC 4E75 RTS 003FE 003FE * ---------------------- 003FE * PTAWRD 003FE * ---------------------- 003FE 003FE * WRITE WORD TO CORE, ABSOLUTE POINTER IN A0, VALUE IN D0, UPDATE A0 003FE 003FE PTAWRD 003FE 1140 0001 MOVE.B D0,1(A0) * STORE LOW-ORDER BYTE 00402 E040 ASR.W #8,D0 00404 1080 MOVE.B D0,(A0) * STORE HIGH-ORDER BYTE 00406 5488 ADDQ.L #2,A0 00408 4E75 RTS 0040A 0040A * --------------------------------------------------------------------------- 0040A * LOW LEVEL ZIP FUNCTIONS 0040A * --------------------------------------------------------------------------- 0040A 0040A * ---------------------- 0040A * GETBYT 0040A * ---------------------- 0040A 0040A * GET A BYTE FROM GAME, BLOCK-POINTER IN D0, BYTE-POINTER IN D1, RESULT IN D2 0040A * UPDATE D0 AND D1 TO REFLECT BYTE GOTTEN 0040A 0040A 3F00 GETBYT MOVE.W D0,-(SP) 0040C B06E FFFA CMP.W ENDLOD(A6),D0 * IS THIS A PRELOADED LOCATION? 00410 6C10 00422 BGE.S GETBX1 * NO 00412 00412 619E 003B2 BSR BLKBYT * YES, RECONSTRUCT POINTER (MAY EXCEED 32K) 00414 8041 OR.W D1,D0 00416 00416 4242 CLR.W D2 * CLEAR THE UNWANTED HIGH BYTE 00418 G 206E FFA8 MOVE.L BUFFER(A6),A0 * ABSOLUTE POINTER 0041C 1430 0800 MOVE.B 0(A0,D0.L),D2 * GET THE DESIRED BYTE 00420 600A 0042C BRA.S GETBX2 00422 00422 6100 1CE8 0210C GETBX1 BSR GETPAG * FIND THE PROPER PAGE (POINTER RETURNED IN A0) 00426 4242 CLR.W D2 * CLEAR THE UNWANTED HIGH BYTE 00428 1430 1000 MOVE.B 0(A0,D1.W),D2 * GET THE DESIRED BYTE 0042C 0042C 301F GETBX2 MOVE.W (SP)+,D0 0042E 5241 ADDQ.W #1,D1 * UPDATE BYTE-POINTER 00430 0C41 0200 CMPI.W #512,D1 * END OF PAGE? 00434 6604 0043A BNE.S GETBX3 * NO, DONE 00436 00436 4241 CLR.W D1 * YES, CLEAR BYTE-POINTER 00438 5240 ADDQ.W #1,D0 * AND UPDATE BLOCK-POINTER 0043A 4E75 GETBX3 RTS 0043C 0043C * ---------------------- 0043C * GETWRD 0043C * ---------------------- 0043C 0043C * GET A WORD FROM GAME, BLOCK-POINTER IN D0, BYTE-POINTER IN D1, RESULT IN D2 0043C 0043C 61CC 0040A GETWRD BSR GETBYT * GET HIGH-ORDER BYTE 0043E E142 ASL.W #8,D2 * POSITION IT 00440 3F02 MOVE.W D2,-(SP) * SAVE IT 00442 00442 61C6 0040A BSR GETBYT * GET LOW-ORDER BYTE 00444 845F OR.W (SP)+,D2 * OR IN THE OTHER BYTE 00446 4E75 RTS 00448 00448 * ---------------------- 00448 * NXTBYT 00448 * ---------------------- 00448 00448 * GET THE NEXT BYTE, RETURN IT IN D0 00448 00448 G 206E FF44 NXTBYT MOVE.L CURPAG(A6),A0 * INDEX INTO CURRENT PAGE 0044C D0EE FFBA ADDA.W ZPC2(A6),A0 00450 4240 CLR.W D0 * CLEAR HIGH REGISTER AND 00452 1010 MOVE.B (A0),D0 * GET THE NEXT BYTE 00454 00454 526E FFBA ADDQ.W #1,ZPC2(A6) * UPDATE PC 00458 0C6E 0200 FFBA CMPI.W #512,ZPC2(A6) * END OF PAGE? 0045E 6D08 00468 BLT.S NXTBX1 * NO 00460 00460 3F00 MOVE.W D0,-(SP) 00462 6100 1C46 020AA BSR NEWZPC * YES, UPDATE PAGE 00466 301F MOVE.W (SP)+,D0 00468 4E75 NXTBX1 RTS * AND RETURN 0046A 0046A * ---------------------- 0046A * NXTWRD 0046A * ---------------------- 0046A 0046A * GET THE NEXT WORD, RETURN IT IN D0 0046A 0046A 61DC 00448 NXTWRD BSR NXTBYT * GET HIGH-ORDER BYTE 0046C E140 ASL.W #8,D0 * SHIFT TO PROPER POSITION 0046E 3F00 MOVE.W D0,-(SP) * SAVE IT 00470 00470 61D6 00448 BSR NXTBYT * GET LOW-ORDER BYTE 00472 805F OR.W (SP)+,D0 * OR IN THE OTHER BYTE 00474 4E75 RTS 00476 00476 * ---------------------- 00476 * GETARG 00476 * ---------------------- 00476 00476 * GET AN ARGUMENT GIVEN ITS TYPE IN D0 00476 00476 5340 GETARG SUBQ.W #1,D0 * EXAMINE ARGUMENT 00478 6DF0 0046A BLT.S NXTWRD * 0 MEANT LONG IMMEDIATE 0047A 67CC 00448 BEQ.S NXTBYT * 1 MEANT SHORT IMMEDIATE 0047C 0047C 61CA 00448 BSR NXTBYT * 2 MEANT VARIABLE, GET THE VAR 0047E 4A40 TST.W D0 * STACK? 00480 660C 0048E BNE.S GETV1 * NO, JUST GET THE VAR'S VALUE 00482 301C MOVE.W (A4)+,D0 * YES, POP THE STACK 00484 4E75 RTS 00486 00486 * ---------------------- 00486 * GETVAR 00486 * ---------------------- 00486 00486 * GET VALUE OF A VARIABLE, VAR IN D0, VALUE RETURNED IN D0 00486 00486 4A40 GETVAR TST.W D0 * STACK? 00488 6604 0048E BNE.S GETV1 * NO 0048A 3014 MOVE.W (A4),D0 * YES, GET TOP-OF-STACK (DON'T POP) 0048C 4E75 RTS 0048E 0048E 0C40 0010 GETV1 CMPI.W #16,D0 * LOCAL? 00492 6C0C 004A0 BGE.S GETVX2 * NO 00494 G 206E FFB4 MOVE.L ZLOCS(A6),A0 * YES, POINT TO PROPER STACK ELEMENT 00498 D040 ADD.W D0,D0 0049A 90C0 SUBA.W D0,A0 * LOCALS BUILD DOWN 0049C 3010 MOVE.W (A0),D0 * GET IT 0049E 4E75 RTS 004A0 004A0 G 0440 0010 GETVX2 SUB.W #16,D0 * GLOBAL, ADJUST FOR LOCALS 004A4 G 206E FFEC MOVE.L GLOTAB(A6),A0 * POINT TO PROPER GLOBAL TABLE ELEMENT 004A8 D040 ADD.W D0,D0 004AA D0C0 ADDA.W D0,A0 004AC 6000 FF48 003F6 BRA GTAWRD * GET IT AND RETURN 004B0 004B0 * ---------------------- 004B0 * PUTVAR 004B0 * ---------------------- 004B0 004B0 * UPDATE VALUE OF A VARIABLE, VAR IN D0, NEW VALUE IN D1 004B0 004B0 4A40 PUTVAR TST.W D0 * STACK? 004B2 6604 004B8 BNE.S PUTVX1 * NO 004B4 3881 MOVE.W D1,(A4) * YES, UPDATE TOP-OF-STACK (DON'T PUSH) 004B6 4E75 RTS 004B8 004B8 0C40 0010 PUTVX1 CMPI.W #16,D0 * LOCAL? 004BC 6C0C 004CA BGE.S PUTVX2 * NO 004BE G 206E FFB4 MOVE.L ZLOCS(A6),A0 * YES, POINT TO PROPER STACK ELEMENT 004C2 D040 ADD.W D0,D0 004C4 90C0 SUBA.W D0,A0 * LOCALS BUILD DOWN 004C6 3081 MOVE.W D1,(A0) * UPDATE IT 004C8 4E75 RTS 004CA 004CA G 0440 0010 PUTVX2 SUB.W #16,D0 * GLOBAL, ADJUST FOR LOCALS 004CE G 206E FFEC MOVE.L GLOTAB(A6),A0 * POINT TO PROPER GLOBAL TABLE ELEMENT 004D2 D040 ADD.W D0,D0 004D4 D0C0 ADDA.W D0,A0 004D6 3001 MOVE.W D1,D0 004D8 6000 FF24 003FE BRA PTAWRD * UPDATE IT AND RETURN 004DC 004DC * ---------------------- 004DC * PUTVAL, BYTVAL 004DC * ---------------------- 004DC 004DC * RETURN VAL IN D0 TO LOCATION SPECIFIED BY NEXTBYTE 004DC * DESTROYS D1, BUT IS USUALLY CALLED AT END OF TOP-LEVEL FUNCTION 004DC 004DC 0240 00FF BYTVAL ANDI.W #$00FF,D0 * ENTER HERE TO CLEAR HIGH BYTE 004E0 3200 PUTVAL MOVE.W D0,D1 * NORMAL ENTRY 004E2 6100 FF64 00448 BSR NXTBYT * GET VAR TO USE 004E6 4A40 TST.W D0 * STACK? 004E8 66C6 004B0 BNE.S PUTVAR * NO, GO STORE VALUE 004EA 3901 MOVE.W D1,-(A4) * YES, PUSH ONTO STACK 004EC 4E75 RTS 004EE 004EE * ---------------------- 004EE * PFALSE, PTRUE 004EE * ---------------------- 004EE 004EE * PREDICATE HANDLERS TRUE AND FALSE 004EE * DESTROYS REGISTERS, BUT ARE ONLY CALLED FROM END OF TOP-LEVEL FUNCTIONS 004EE 004EE 4241 PFALSE CLR.W D1 * PREDICATE WAS FALSE, CLEAR FLAG 004F0 6002 004F4 BRA.S PTRUE1 004F2 004F2 7201 PTRUE MOVEQ #1,D1 * PREDICATE WAS TRUE, SET FLAG 004F4 6100 FF52 00448 PTRUE1 BSR NXTBYT * GET FIRST (OR ONLY) PREDICATE JUMP BYTE 004F8 0880 0007 BCLR #7,D0 * NORMAL POLARITY PREDICATE? 004FC 6702 00500 BEQ.S PTRUX1 * NO, LEAVE FLAG ALONE 004FE 5241 ADDQ.W #1,D1 * YES, INCREMENT FLAG 00500 00500 0880 0006 PTRUX1 BCLR #6,D0 * ONE-BYTE JUMP OFFSET? 00504 6614 0051A BNE.S PTRUX3 * YES 00506 00506 E140 ASL.W #8,D0 * NO, TWO-BYTE, POSITION HIGH-ORDER OFFSET BYTE 00508 3400 MOVE.W D0,D2 0050A 6100 FF3C 00448 BSR NXTBYT * GET LOW-ORDER BYTE 0050E 8042 OR.W D2,D0 * OR IN HIGH-ORDER BITS 00510 0800 000D BTST #13,D0 * IS NUMBER NEGATIVE (14-BIT 2'S COMP NUMBER)? 00514 6704 0051A BEQ.S PTRUX3 * NO 00516 0040 C000 ORI.W #$C000,D0 * YES, MAKE 16-BIT NUMBER NEGATIVE 0051A 0051A 5341 PTRUX3 SUBQ.W #1,D1 * TEST FLAG 0051C 671A 00538 BEQ.S PTRUX6 * WAS 1, THAT MEANS DO NOTHING 0051E 4A40 TST.W D0 * ZERO JUMP? 00520 6604 00526 BNE.S PTRUX4 * NO 00522 6000 1250 01774 BRA OPRFAL * YES, THAT MEANS DO AN RFALSE 00526 00526 5340 PTRUX4 SUBQ.W #1,D0 * ONE JUMP? 00528 6604 0052E BNE.S PTRUX5 * NO 0052A 6000 1244 01770 BRA OPRTRU * YES, THAT MEANS DO AN RTRUE 0052E 0052E 5340 PTRUX5 SUBQ.W #1,D0 * ADJUST OFFSET 00530 D16E FFBA ADD.W D0,ZPC2(A6) * ADD TO PC 00534 6000 1B74 020AA BRA NEWZPC * AND UPDATE ZPC STUFF 00538 4E75 PTRUX6 RTS 0053A 0053A * ---------------------- 0053A * BSPLTB 0053A * ---------------------- 0053A 0053A * SPLIT BYTE-POINTER IN D0.W (16 BIT UNSIGNED) 0053A * INTO BLOCK NUMBER IN D0 & BYTE OFFSET IN D1 0053A 0053A 3200 BSPLTB MOVE.W D0,D1 0053C E048 LSR.W #8,D0 * EXTRACT THE 7 BLOCK BITS (64K RANGE) 0053E E248 LSR.W #1,D0 00540 0241 01FF ANDI.W #$01FF,D1 * EXTRACT THE 9 OFFSET BITS (0-511) 00544 IF DEBUG THEN 00544 ENDIF 00544 4E75 RTS 00546 00546 * ---------------------- 00546 * BSPLIT 00546 * ---------------------- 00546 00546 * SPLIT WORD-POINTER IN D0.W (16 BIT UNSIGNED) 00546 * INTO BLOCK NUMBER IN D0 & BYTE OFFSET IN D1 00546 00546 3200 BSPLIT MOVE.W D0,D1 00548 E048 LSR.W #8,D0 * EXTRACT THE 8 BLOCK BITS (128K RANGE) 0054A 0241 00FF ANDI.W #$00FF,D1 * EXTRACT THE 8 OFFSET BITS (0-255) 0054E D241 ADD.W D1,D1 * CONVERT OFFSET TO BYTES 00550 IF DEBUG THEN 00550 ENDIF 00550 4E75 RTS 00552 00552 * ---------------------- 00552 * BSPLTQ 00552 * ---------------------- 00552 00552 * SPLIT QUAD-POINTER IN D0.W 00552 * INTO BLOCK NUMBER IN D0.W & BYTE OFFSET IN D1.W -- EZIP ONLY 00552 00552 ** BSPLTQ MOVE.W D0,D1 00552 ** LSR.W #7,D0 * EXTRACT THE 9 BLOCK BITS (256K RANGE) 00552 ** ANDI.W #$007F,D1 * EXTRACT THE 7 OFFSET BITS (0-127) 00552 ** ADD.W D1,D1 * CONVERT OFFSET TO BYTES 00552 ** ADD.W D1,D1 00552 ** IF DEBUG THEN 00552 ** CMP.W MAXLOD(A6),D0 * VALID BLOCK NUMBER? 00552 ** BCC BLKERR * BHS * NO, FAIL 00552 ** ENDIF 00552 ** RTS 00552 00552 * ---------------------- 00552 * BSPLTQ2 00552 * ---------------------- 00552 00552 * COMBINE/SPLIT QUAD-POINTERS IN D0.L AND D1.L 00552 * INTO BLOCK NUMBER IN D0.W & BYTE OFFSET IN D1.W -- EZIP ONLY 00552 00552 D081 BSPLTQ2 ADD.L D1,D0 00554 3200 MOVE.W D0,D1 00556 EE88 LSR.L #7,D0 * EXTRACT THE 9 BLOCK BITS (256K RANGE) 00558 0241 007F ANDI.W #$007F,D1 * EXTRACT THE 7 OFFSET BITS (0-127) 0055C D241 ADD.W D1,D1 * CONVERT OFFSET TO BYTES 0055E D241 ADD.W D1,D1 00560 IF DEBUG THEN 00560 ENDIF 00560 4E75 RTS 00562 00562 * ---------------------- 00562 * BLKERR 00562 * ---------------------- 00562 00562 IF DEBUG THEN 00562 ENDIF 00562 00562 INCLUDE 'MX2.a' 00562 00562 * ---------------------------------------------------------------------------- 00562 * ARITHMETIC OPERATIONS 00562 * ---------------------------------------------------------------------------- 00562 00562 * ---------------------- 00562 * OPADD 00562 * ---------------------- 00562 00562 D041 OPADD ADD.W D1,D0 * ADD OPR1 AND OPR2 00564 6000 FF7A 004E0 BRA PUTVAL * RETURN THE VALUE 00568 00568 * ---------------------- 00568 * OPSUB 00568 * ---------------------- 00568 00568 9041 OPSUB SUB.W D1,D0 * SUBTRACT OPR2 FROM OPR1 0056A 6000 FF74 004E0 BRA PUTVAL * RETURN THE VALUE 0056E 0056E * ---------------------- 0056E * OPMUL 0056E * ---------------------- 0056E 0056E C1C1 OPMUL MULS D1,D0 * MULTIPLY OPR1 BY OPR2 (16 BIT SIGNED) 00570 6000 FF6E 004E0 BRA PUTVAL * RETURN THE PRODUCT, IGNORING OVERFLOW 00574 00574 * ---------------------- 00574 * OPDIV 00574 * ---------------------- 00574 00574 * DIVIDE BY ZERO AND MOD ZERO ARE CAUGHT, AVOIDING CONFUSING HARDWARE TRAPS 00574 00574 4A41 OPDIV TST.W D1 00576 6708 00580 BEQ.S ODIVX1 * TRAP DIVIDE-BY-ZERO 00578 48C0 EXT.L D0 * SIGN-EXTEND OPR1 TO 32 BITS 0057A 81C1 DIVS D1,D0 * DIVIDE OPR2 INTO OPR1 0057C 6000 FF62 004E0 BRA PUTVAL * RETURN THE QUOTIENT, IGNORING REMAINDER 00580 00580 ODIVX1 00580 * CLR.W D0 00580 41ED 004B LEA MSGODV,A0 00584 6000 21D2 02758 BRA FATAL 0004B DATA 0004B 42616420444956 MSGODV DC.B 'Bad DIV',0 00588 CODE 00588 00588 * ---------------------- 00588 * OPMOD 00588 * ---------------------- 00588 00588 4A41 OPMOD TST.W D1 0058A 670A 00596 BEQ.S OMODX1 * TRAP DIVIDE-BY-ZERO 0058C 48C0 EXT.L D0 * SIGN-EXTEND OPR1 TO 32 BITS 0058E 81C1 DIVS D1,D0 * DIVIDE OPR2 INTO OPR1 00590 4840 SWAP D0 * GET REMAINDER 00592 6000 FF4C 004E0 BRA PUTVAL * RETURN IT 00596 00596 OMODX1 00596 * CLR.W D0 00596 41ED 0053 LEA MSGOMD,A0 0059A 6000 21BC 02758 BRA FATAL 00053 DATA 00053 426164204D4F44 MSGOMD DC.B 'Bad MOD',0 0059E CODE 0059E 0059E * ---------------------- 0059E * OPRAND 0059E * ---------------------- 0059E 0059E 4A47 OPRAND TST.W D7 * [GARBAGE FOR ST ASSEMBLER] 005A0 005A0 IF EZIP THEN 005A0 4A40 TST.W D0 * DISABLE RANDOMNESS NOW? 005A2 6D34 005D8 BLT.S RANDX1 * YES 005A4 6734 005DA BEQ.S RANDX2 * ZERO, RE-ENABLE RANDOMNESS 005A6 005A6 4A6E FFAE TST.W RCYCLE(A6) * IS RANDOMNESS ALREADY DISABLED? 005AA 6634 005E0 BNE.S RANDX3 * YES 005AC ENDIF 005AC 005AC * NORMAL RANDOMNESS, GENERATE A VALUE 005AC 005AC 322E FFB0 MOVE.W RSEED2(A6),D1 * GET BOTH SEEDS 005B0 4841 SWAP D1 005B2 322E FFB2 MOVE.W RSEED1(A6),D1 005B6 3D41 FFB0 MOVE.W D1,RSEED2(A6) * UPDATE LOW SEED 005BA 4841 SWAP D1 005BC 005BC E289 LSR.L #1,D1 * SHIFT BOTH RIGHT BY 1 BIT 005BE B36E FFB2 EOR.W D1,RSEED1(A6) * GENERATE OUTPUT & UPDATE HIGH SEED 005C2 322E FFB2 MOVE.W RSEED1(A6),D1 * GET NEW HIGH SEED 005C6 005C6 0281 0000 7FFF ANDI.L #$00007FFF,D1 * CLEAR HIGH BIT TO PREVENT POSSIBLE OVERFLOW 005CC 82C0 DIVU D0,D1 * DIVIDE ARG INTO RANDOM NUMBER 005CE 4841 SWAP D1 * GET REMAINDER 005D0 5241 ADDQ.W #1,D1 * MUST BE BETWEEN 1 AND N, INCLUSIVE 005D2 3001 MOVE.W D1,D0 005D4 6000 FF0A 004E0 BRA PUTVAL * RETURN THE VALUE 005D8 005D8 IF EZIP THEN 005D8 005D8 *** GENERATE A NON-RANDOM SEQUENCE HENCEFORTH 005D8 005D8 4440 RANDX1 NEG.W D0 * THIS SPECIFIES UPPER LIMIT OF SEQUENCE 005DA 3D40 FFAE RANDX2 MOVE.W D0,RCYCLE(A6) * STORE IT 005DE 600E 005EE BRA.S RANDX4 * AND INITIALIZE COUNTER (SEQ BEGINS NEXT PASS) 005E0 005E0 302E FFAC RANDX3 MOVE.W RCONST(A6),D0 * GENERATE NEXT VALUE IN SEQUENCE 005E4 5240 ADDQ.W #1,D0 005E6 B06E FFAE CMP.W RCYCLE(A6),D0 * EXCEEDED THE UPPER LIMIT YET? 005EA 6F02 005EE BLE.S RANDX4 * NO 005EC 7001 MOVEQ #1,D0 * YES, RESTART THE SEQUENCE 005EE 005EE 3D40 FFAC RANDX4 MOVE.W D0,RCONST(A6) * UPDATE COUNTER 005F2 6000 FEEC 004E0 BRA PUTVAL * RETURN THE VALUE 005F6 005F6 ENDIF 005F6 005F6 * ---------------------- 005F6 * OPQLES 005F6 * ---------------------- 005F6 005F6 B041 OPQLES CMP.W D1,D0 * IS OPR1 LESS THAN OPR2? 005F8 6D00 FEF8 004F2 BLT PTRUE * YES, PREDICATE TRUE 005FC 6000 FEF0 004EE BRA PFALSE * NO, PREDICATE FALSE 00600 00600 * ---------------------- 00600 * OPQGRT 00600 * ---------------------- 00600 00600 B041 OPQGRT CMP.W D1,D0 * IS OPR1 GREATER THAN OPR2? 00602 6E00 FEEE 004F2 BGT PTRUE * YES, PREDICATE TRUE 00606 6000 FEE6 004EE BRA PFALSE * NO, PRECICATE FALSE 0060A 0060A * ---------------------- 0060A * OPBTST 0060A * ---------------------- 0060A 0060A * LOGICAL OPERATIONS 0060A 0060A 4640 OPBTST NOT.W D0 * TURN OFF ALL BITS IN OPR2 THAT ARE ON IN OPR1 0060C C240 AND.W D0,D1 0060E 6700 FEE2 004F2 BEQ PTRUE * SUCCESS IF OPR2 COMPLETELY CLEARED 00612 6000 FEDA 004EE BRA PFALSE 00616 00616 * ---------------------- 00616 * OPBOR 00616 * ---------------------- 00616 00616 8041 OPBOR OR.W D1,D0 * LOGICAL "OR" 00618 6000 FEC6 004E0 BRA PUTVAL * RETURN THE VALUE 0061C 0061C * ---------------------- 0061C * OPBCOM 0061C * ---------------------- 0061C 0061C 4640 OPBCOM NOT.W D0 * LOGICAL COMPLEMENT 0061E 6000 FEC0 004E0 BRA PUTVAL * RETURN THE VALUE 00622 00622 * ---------------------- 00622 * OPBAND 00622 * ---------------------- 00622 00622 C041 OPBAND AND.W D1,D0 * LOGICAL "AND" 00624 6000 FEBA 004E0 BRA PUTVAL * RETURN THE VALUE 00628 00628 * ---------------------- 00628 * OPSHIFT 00628 * ---------------------- 00628 00628 OPSHIFT 00628 4A41 TST.W D1 * NEGATIVE? 0062A 6D06 00632 BLT.S SHFX1 * YES 0062C E368 LSL.W D1,D0 * NO, LOGICAL LEFT SHIFT 0062E 6000 FEB0 004E0 BRA PUTVAL 00632 4441 SHFX1 NEG.W D1 00634 E268 LSR.W D1,D0 * LOGICAL RIGHT SHIFT 00636 6000 FEA8 004E0 BRA PUTVAL 0063A 0063A * ---------------------- 0063A * OPASHIFT 0063A * ---------------------- 0063A 0063A OPASHIFT 0063A 4A41 TST.W D1 * NEGATIVE? 0063C 6D06 00644 BLT.S ASHFX1 * YES 0063E E360 ASL.W D1,D0 * NO, ARITHMETIC LEFT SHIFT 00640 6000 FE9E 004E0 BRA PUTVAL 00644 4441 ASHFX1 NEG.W D1 00646 E260 ASR.W D1,D0 * ARITHMETIC RIGHT SHIFT 00648 6000 FE96 004E0 BRA PUTVAL 0064C 0064C * ---------------------- 0064C * OPQEUQ 0064C * ---------------------- 0064C 0064C * GENERAL PREDICATES 0064C 0064C 4E71 OPQEQU NOP * TELL CALLER TO USE ARGBLK 0064E 3218 MOVE.W (A0)+,D1 * NUMBER OF OPERANDS 00650 3018 MOVE.W (A0)+,D0 * OPR1 00652 5341 SUBQ.W #1,D1 00654 00654 B058 QEQUX1 CMP.W (A0)+,D0 * IS NEXT OPR EQUAL TO OPR1? 00656 6708 00660 BEQ.S QEQUX2 * YES 00658 5341 SUBQ.W #1,D1 * NO, BUT LOOP IF MORE OPERANDS 0065A 66F8 00654 BNE.S QEQUX1 0065C 0065C 6000 FE90 004EE BRA PFALSE * PREDICATE FALSE 00660 6000 FE90 004F2 QEQUX2 BRA PTRUE * PREDICATE TRUE 00664 00664 00664 * ---------------------- 00664 * OPQZER 00664 * ---------------------- 00664 00664 4A40 OPQZER TST.W D0 * IS OPR ZERO? 00666 6700 FE8A 004F2 BEQ PTRUE * YES, PREDICATE TRUE 0066A 6000 FE82 004EE BRA PFALSE * NO, PREDICATE FALSE 0066E 0066E 0066E * ---------------------------------------------------------------------------- 0066E * OBJECT-RELATED PRIMITIVES 0066E * ---------------------------------------------------------------------------- 0066E 0066E * ---------------------- 0066E * OBJLOC 0066E * ---------------------- 0066E 0066E * GIVEN OBJECT NUMBER IN D0.W, RETURN OBJECT LOCATION IN A0 0066E 0066E C0FC 000E OBJLOC MULU #OLEN,D0 * CALCULATE OBJECT OFFSET 00672 G 206E FFF0 MOVE.L OBJTAB(A6),A0 00676 D1C0 ADDA.L D0,A0 * INDEX INTO OBJECT TABLE 00678 D0FC 0070 ADDA.W #OPLEN-OLEN,A0 * SKIPPING OVER THE DEFAULT PROPERTY TABLE 0067C 4E75 RTS 0067E 0067E * ---------------------- 0067E * FSTPRP 0067E * ---------------------- 0067E 0067E * GIVEN OBJECT LOCATION IN A0, RETURN POINTER TO FIRST PROPERTY IN A0 0067E 0067E D0FC 000C FSTPRP ADDA.W #PROP,A0 * POINT TO PROPERTY TABLE SLOT 00682 7000 MOVEQ #0,D0 00684 6100 FD70 003F6 BSR GTAWRD * GET ITS LOCATION 00688 G 206E FFA8 MOVE.L BUFFER(A6),A0 * ABSOLUTIZE THE LOCATION 0068C D1C0 ADDA.L D0,A0 0068E 0068E 4240 CLR.W D0 00690 1018 MOVE.B (A0)+,D0 * LENGTH OF SHORT DESCRIPTION IN WORDS 00692 D040 ADD.W D0,D0 00694 D0C0 ADDA.W D0,A0 * ADJUST POINTER TO SKIP IT 00696 4E75 RTS 00698 00698 * ---------------------- 00698 * NXTPRP 00698 * ---------------------- 00698 00698 * GIVEN POINTER TO A PROPERTY ID IN A0, UPDATE IT TO POINT TO NEXT PROPERTY ID 00698 00698 IF EZIP THEN 00698 00698 1018 NXTPRP MOVE.B (A0)+,D0 * GET (FIRST) PROPERTY ID BYTE 0069A 0800 0007 BTST #7,D0 * PROPERTY LENGTH GREATER THAN 2? 0069E 660C 006AC BNE.S NXTPX4 * YES 006A0 006A0 0800 0006 BTST #6,D0 * NO, PROPERTY LENGTH 2? 006A4 6702 006A8 BEQ.S NXTPX2 * NO, PROPERTY LENGTH IS 1 006A6 5288 ADDQ.L #1,A0 006A8 5288 NXTPX2 ADDQ.L #1,A0 * UPDATE POINTER 006AA 4E75 RTS 006AC 006AC 1018 NXTPX4 MOVE.B (A0)+,D0 * GET (SECOND) PROPERTY LENGTH BYTE (LOW 6 BITS) 006AE 0240 003F ANDI.W #$003F,D0 * CLEAR OFF HIGH BITS 006B2 D0C0 ADDA.W D0,A0 * UPDATE POINTER 006B4 4E75 RTS 006B6 ENDIF 006B6 IF CZIP THEN 006B6 ENDIF 006B6 006B6 * ---------------------------------------------------------------------------- 006B6 * OBJECT OPERATIONS 006B6 * ---------------------------------------------------------------------------- 006B6 006B6 * ---------------------- 006B6 * OPMOVE 006B6 * ---------------------- 006B6 006B6 * MOVE (OBJ1 INTO OBJ2) 006B6 006B6 48A7 C000 OPMOVE MOVEM.W D1/D0,-(SP) * PROTECT OPERANDS FROM REMOVE CALL 006BA 6100 0022 006DE BSR OPREMO * REMOVE OBJ1 FROM WHEREVER IT IS 006BE 006BE 302F 0002 MOVE.W 2(SP),D0 * OBJ2 006C2 61AA 0066E BSR OBJLOC * FIND ITS LOCATION 006C4 G 2248 MOVE.L A0,A1 * SAVE IT 006C6 3017 MOVE.W (SP),D0 * OBJ1 006C8 61A4 0066E BSR OBJLOC * FIND ITS LOCATION 006CA 006CA 4C9F 0003 MOVEM.W (SP)+,D0/D1 * RESTORE THE OBJ NUMBERS 006CE 006CE IF EZIP THEN 006CE 3169 000A 0008 MOVE.W FIRST(A1),NEXT(A0) * PUT OBJ2'S CHILD INTO OBJ1'S SIBLING SLOT 006D4 3141 0006 MOVE.W D1,LOC(A0) * PUT OBJ2 IN OBJ1'S PARENT SLOT 006D8 3340 000A MOVE.W D0,FIRST(A1) * PUT OBJ1 IN OBJ2'S CHILD SLOT 006DC ENDIF 006DC IF CZIP THEN 006DC ENDIF 006DC 4E75 RTS 006DE 006DE * ---------------------- 006DE * OPREMO 006DE * ---------------------- 006DE 006DE * REMOVE (OBJ FROM ITS PARENT) 006DE 006DE IF EZIP THEN 006DE 006DE 3200 OPREMO MOVE.W D0,D1 * SAVE OBJ 006E0 618C 0066E BSR OBJLOC * FIND ITS LOCATION 006E2 G 2248 MOVE.L A0,A1 006E4 3029 0006 MOVE.W LOC(A1),D0 * GET ITS PARENT 006E8 672C 00716 BEQ.S REMOX3 * IF NO PARENT, WE'RE DONE 006EA 006EA 6182 0066E BSR OBJLOC * FIND PARENT'S LOCATION 006EC 3028 000A MOVE.W FIRST(A0),D0 * GET PARENT'S FIRST CHILD 006F0 B240 CMP.W D0,D1 * IS IT OBJ? 006F2 6608 006FC BNE.S REMOX1 * NO 006F4 006F4 3169 0008 000A MOVE.W NEXT(A1),FIRST(A0) * YES, CHANGE IT TO OBJ'S SIBLING 006FA 6012 0070E BRA.S REMOX2 * AND EXIT 006FC 006FC 6100 FF70 0066E REMOX1 BSR OBJLOC * FIND LOCATION OF CURRENT SIBLING 00700 3028 0008 MOVE.W NEXT(A0),D0 * GET NEXT SIBLING IN CHAIN 00704 B240 CMP.W D0,D1 * IS IT OBJ? 00706 66F4 006FC BNE.S REMOX1 * NO, CONTINUE SEARCH 00708 00708 3169 0008 0008 MOVE.W NEXT(A1),NEXT(A0) * YES, CHANGE IT TO OBJ'S SIBLING 0070E 4269 0006 REMOX2 CLR.W LOC(A1) * OBJ NOW HAS NO PARENT 00712 4269 0008 CLR.W NEXT(A1) * OR SIBLING 00716 4E75 REMOX3 RTS 00718 00718 ENDIF 00718 IF CZIP THEN 00718 ENDIF 00718 00718 * ---------------------- 00718 * OPLOC 00718 * ---------------------- 00718 00718 * LOC (RETURN CONTAINER OF OBJ) 00718 00718 6100 FF54 0066E OPLOC BSR OBJLOC * FIND OBJ'S LOCATION 0071C 0071C IF EZIP THEN 0071C 3028 0006 MOVE.W LOC(A0),D0 * GET PARENT 00720 ENDIF 00720 IF CZIP THEN 00720 ENDIF 00720 6000 FDBE 004E0 BRA PUTVAL * RETURN THE VALUE 00724 00724 * ---------------------- 00724 * OPQFIR 00724 * ---------------------- 00724 00724 * FIRST? (RETURN FIRST CHILD OF OBJ, FAIL IF NONE) 00724 00724 6100 FF48 0066E OPQFIR BSR OBJLOC * FIND OBJ'S LOCATION 00728 00728 IF EZIP THEN 00728 3028 000A MOVE.W FIRST(A0),D0 * GET FIRST CHILD 0072C ENDIF 0072C IF CZIP THEN 0072C ENDIF 0072C 3F00 MOVE.W D0,-(SP) 0072E 6100 FDB0 004E0 BSR PUTVAL * RETURN THE VALUE 00732 4A5F TST.W (SP)+ * NONZERO? 00734 6600 FDBC 004F2 BNE PTRUE * YES, PREDICATE TRUE 00738 6000 FDB4 004EE BRA PFALSE * NO, PREDICATE FALSE 0073C 0073C * ---------------------- 0073C * OPQNEX 0073C * ---------------------- 0073C 0073C * NEXT? (RETURN THE NEXT SIBLING OF OBJ, FAIL IF NONE) 0073C 0073C 6100 FF30 0066E OPQNEX BSR OBJLOC * FIND OBJ'S LOCATION 00740 00740 IF EZIP THEN 00740 3028 0008 MOVE.W NEXT(A0),D0 * GET SIBLING 00744 ENDIF 00744 IF CZIP THEN 00744 ENDIF 00744 3F00 MOVE.W D0,-(SP) 00746 6100 FD98 004E0 BSR PUTVAL * RETURN THE VALUE 0074A 4A5F TST.W (SP)+ * NONZERO? 0074C 6600 FDA4 004F2 BNE PTRUE * YES, PREDICATE TRUE 00750 6000 FD9C 004EE BRA PFALSE * NO, PREDICATE FALSE 00754 00754 * ---------------------- 00754 * OPQIN 00754 * ---------------------- 00754 00754 * IN? (IS OBJ1 CONTAINED IN OBJ2?) 00754 00754 6100 FF18 0066E OPQIN BSR OBJLOC * FIND OBJ1'S LOCATION 00758 00758 IF EZIP THEN 00758 B268 0006 CMP.W LOC(A0),D1 * IS OBJ1'S PARENT OBJ2? 0075C ENDIF 0075C IF CZIP THEN 0075C ENDIF 0075C 6700 FD94 004F2 BEQ PTRUE * YES, PREDICATE TRUE 00760 6000 FD8C 004EE BRA PFALSE * NO, PREDICATE FALSE 00764 00764 * ---------------------- 00764 * OPGETP 00764 * ---------------------- 00764 00764 * GETP (GET SPECIFIED PROPERTY OF OBJ, DEFAULT IF NONE) 00764 00764 6100 FF08 0066E OPGETP BSR OBJLOC * FIND OBJ'S LOCATION 00768 6100 FF14 0067E BSR FSTPRP * GET POINTER TO FIRST PROPERTY 0076C 6004 00772 BRA.S GETPX2 * SKIP NEXT LINE FIRST TIME THROUGH LOOP 0076E 0076E 6100 FF28 00698 GETPX1 BSR NXTPRP * POINT TO NEXT PROPERTY 00772 1010 GETPX2 MOVE.B (A0),D0 * GET PROPERTY IDENTIFIER 00774 0240 003F ANDI.W #PMASK,D0 * CLEAN OFF (EZIP MODE AND) LENGTH BITS 00778 00778 B041 CMP.W D1,D0 * COMPARE PROPERTY NUMBER WITH DESIRED ONE 0077A 6EF2 0076E BGT.S GETPX1 * IF GREATER, LOOP (TABLE SORTED IN REVERSE) 0077C 6D0C 0078A BLT.S GETPX3 * IF LESS, NO SUCH PROPERTY, USE DEFAULT 0077E 0077E * (ASSUMIMG NO 2ND EZIP LENGTH BYTE EXISTS HERE) 0077E 0077E 0818 0006 BTST #PLBIT,(A0)+ * GOT IT, EXAMINE (LOW MODE OR) LOWEST LEN BIT 00782 6610 00794 BNE.S GETPX4 * ONE MEANS WORD VALUE, OTHERWISE BYTE VALUE 00784 00784 1010 MOVE.B (A0),D0 * GET THE BYTE 00786 6000 FD54 004DC BRA BYTVAL * AND RETURN IT 0078A 0078A 5341 GETPX3 SUBQ.W #1,D1 * PROPERTY NOT FOUND, USE DEFAULT PROP TABLE 0078C D241 ADD.W D1,D1 * WORD OFFSET 0078E G 206E FFF0 MOVE.L OBJTAB(A6),A0 * GET BASE OF DEFAULT TABLE 00792 D0C1 ADDA.W D1,A0 * POINT TO THE DEFAULT PROPERTY 00794 00794 6100 FC60 003F6 GETPX4 BSR GTAWRD * GET THE WORD VALUE 00798 6000 FD46 004E0 BRA PUTVAL * AND RETURN IT 0079C 0079C * ---------------------- 0079C * OPPUTP 0079C * ---------------------- 0079C 0079C * PUTP (CHANGE VALUE OF SPECIFIED PROPERTY OF OBJ, ERROR IF BAD PROP NUMBER) 0079C 0079C 6100 FED0 0066E OPPUTP BSR OBJLOC * FIND OBJ'S LOCATION 007A0 6100 FEDC 0067E BSR FSTPRP * GET POINTER TO FIRST PROPERTY 007A4 6004 007AA BRA.S PUTPX2 * SKIP NEXT LINE FIRST TIME THROUGH LOOP 007A6 007A6 6100 FEF0 00698 PUTPX1 BSR NXTPRP * POINT TO NEXT PROPERTY 007AA 1010 PUTPX2 MOVE.B (A0),D0 * GET PROPERTY IDENTIFIER 007AC 0240 003F ANDI.W #PMASK,D0 * CLEAN OFF (EZIP MODE AND) LENGTH BITS 007B0 007B0 B041 CMP.W D1,D0 * COMPARE PROPERTY NUMBER WITH DESIRED ONE 007B2 6EF2 007A6 BGT.S PUTPX1 * IF GREATER, LOOP (TABLE SORTED IN REVERSE) 007B4 670A 007C0 BEQ.S PUTPX3 * IF EQUAL, GOT IT 007B6 007B6 4240 CLR.W D0 * OTHERWISE, FATAL ERROR 007B8 41ED 005B LEA MSGPUP,A0 007BC 6000 1F9A 02758 BRA FATAL * 'Non-existant put property' 007C0 0005B DATA 0005B 4E6F6E2D657869 MSGPUP DC.B 'Non-existant put property',0 007C0 CODE 007C0 007C0 * (ASSUMING NO 2ND EZIP LENGTH BYTE EXISTS HERE) 007C0 007C0 0818 0006 PUTPX3 BTST #PLBIT,(A0)+ * EXAMINE (LOW MODE OR) LOWEST LENGTH BIT 007C4 6604 007CA BNE.S PUTPX4 * ZERO MEANS BYTE VALUE, OTHERWISE WORD VALUE 007C6 007C6 1082 MOVE.B D2,(A0) * STORE THE NEW BYTE 007C8 4E75 RTS 007CA 007CA 3002 PUTPX4 MOVE.W D2,D0 007CC 6000 FC30 003FE BRA PTAWRD * STORE THE NEW WORD 007D0 007D0 * ---------------------- 007D0 * OPNEXT 007D0 * ---------------------- 007D0 007D0 * NEXTP (RETURN NUMBER OF NEXT PROP FOLLOWING GIVEN PROP IN OBJ) 007D0 007D0 6100 FE9C 0066E OPNEXT BSR OBJLOC * FIND OBJ'S LOCATION 007D4 6100 FEA8 0067E BSR FSTPRP * GET POINTER TO FIRST PROPERTY 007D8 4A41 TST.W D1 * WERE WE GIVEN ZERO AS PROP? 007DA 6720 007FC BEQ.S NEXTX4 * YES, JUST RETURN FIRST PROPERTY NUMBER 007DC 6004 007E2 BRA.S NEXTX2 * SKIP NEXT LINE FIRST TIME THROUGH LOOP 007DE 007DE 6100 FEB8 00698 NEXTX1 BSR NXTPRP * POINT TO NEXT PROPERTY 007E2 1010 NEXTX2 MOVE.B (A0),D0 * GET PROPERTY IDENTIFIER 007E4 0240 003F ANDI.W #PMASK,D0 * CLEAN OFF (EZIP MODE AND) LENGTH BITS 007E8 007E8 B041 CMP.W D1,D0 * COMPARE PROPERTY NUMBER WITH DESIRED ONE 007EA 6EF2 007DE BGT.S NEXTX1 * IF GREATER, LOOP (TABLE SORTED IN REVERSE) 007EC 670A 007F8 BEQ.S NEXTX3 * IF EQUAL, GOT IT 007EE 007EE 4240 CLR.W D0 * OTHERWISE, FATAL ERROR 007F0 41ED 0075 LEA MSGNXP,A0 007F4 6000 1F62 02758 BRA FATAL * 'Non-existant next property' 007F8 00075 DATA 00075 4E6F6E2D657869 MSGNXP DC.B 'Non-existant next property',0 007F8 CODE 007F8 007F8 6100 FE9E 00698 NEXTX3 BSR NXTPRP * POINT TO NEXT PROPERTY 007FC 1010 NEXTX4 MOVE.B (A0),D0 * GET PROPERTY IDENTIFIER 007FE 0240 003F ANDI.W #PMASK,D0 * EXTRACT PROPERTY NUMBER 00802 6000 FCDC 004E0 BRA PUTVAL * AND RETURN IT 00806 00806 * ---------------------- 00806 * FLGLOC 00806 * ---------------------- 00806 00806 * PRIMITIVE TO LOCATE A FLAG BIT 00806 * GIVEN A POINTER TO FIRST FLAGS BYTE IN A0, TARGET FLAG NUMBER (0-47) IN D0 00806 * RETURN POINTER TO TARGET FLAGS BYTE IN A0, TARGET BIT NUMBER (7-0) IN D0 00806 00806 3F00 FLGLOC MOVE.W D0,-(SP) 00808 E648 LSR.W #3,D0 * EXTRACT BYTE OFFSET 0080A G D0C0 ADD.W D0,A0 * ADJUST FLAGS POINTER 0080C 0080C 301F MOVE.W (SP)+,D0 0080E 4640 NOT.W D0 * FIX THE 3 LOW-ORDER BITS 00810 0240 0007 ANDI.W #$0007,D0 * MASK OFF THE REST 00814 4E75 RTS 00816 00816 * ADDQ.L #1,A0 * POINT TO NEXT FLAGS BYTE 00816 * SUBQ.W #8,D0 * WAS TARGET FLAG IN PREVIOUS BYTE? 00816 * BGE.S FLGLOC * NO 00816 * SUBQ.L #1,A0 * YES, POINT TO PREVIOUS FLAGS BYTE 00816 * NEG.W D0 * AND COMPUTE THE TARGET BIT NUMBER (7-0) 00816 * SUBQ.W #1,D0 00816 * RTS 00816 00816 * ---------------------- 00816 * OPQFSE 00816 * ---------------------- 00816 00816 * FSET? (IS FLAG SET IN OBJ?) 00816 00816 6100 FE56 0066E OPQFSE BSR OBJLOC * FIND OBJ'S LOCATION 0081A 3001 MOVE.W D1,D0 0081C 61E8 00806 BSR FLGLOC * DETERMINE PROPER FLAGS BYTE & BIT NUMBER 0081E 0110 BTST D0,(A0) * IS THE SPECIFIED BIT SET? 00820 6600 FCD0 004F2 BNE PTRUE * YES, PREDICATE TRUE 00824 6000 FCC8 004EE BRA PFALSE * NO, PREDICATE FALSE 00828 00828 * ---------------------- 00828 * OPFSET 00828 * ---------------------- 00828 00828 * FSET (SET A FLAG IN OBJ) 00828 00828 6100 FE44 0066E OPFSET BSR OBJLOC * FIND OBJ'S LOCATION 0082C 3001 MOVE.W D1,D0 0082E 61D6 00806 BSR FLGLOC * DETERMINE PROPER FLAGS BYTE & BIT NUMBER 00830 01D0 BSET D0,(A0) * SET THE SPECIFIED BIT 00832 4E75 RTS 00834 00834 * ---------------------- 00834 * OPFCLE 00834 * ---------------------- 00834 00834 * FCLEAR (CLEAR A FLAG IN OBJ) 00834 00834 6100 FE38 0066E OPFCLE BSR OBJLOC * FIND OBJ'S LOCATION 00838 3001 MOVE.W D1,D0 0083A 61CA 00806 BSR FLGLOC * DETERMINE PROPER FLAGS BYTE & BIT NUMBER 0083C 0190 BCLR D0,(A0) * CLEAR THE SPECIFIED BIT 0083E 4E75 RTS 00840 00840 * ---------------------------------------------------------------------------- 00840 * TABLE OPERATIONS 00840 * ---------------------------------------------------------------------------- 00840 00840 * ---------------------- 00840 * OPGET 00840 * ---------------------- 00840 00840 * GET (GET THE ITEM'TH WORD FROM TABLE) 00840 00840 E341 OPGET ASL.W #1,D1 * WORD OFFSET 00842 D041 ADD.W D1,D0 * INDEX INTO TABLE 00844 6100 FCF4 0053A BSR BSPLTB * SPLIT THE POINTER 00848 6100 FBF2 0043C BSR GETWRD * GET THE WORD 0084C 3002 MOVE.W D2,D0 0084E 6000 FC90 004E0 BRA PUTVAL * AND RETURN IT 00852 00852 * ---------------------- 00852 * OPGETB 00852 * ---------------------- 00852 00852 * GETB (GET THE ITEM'TH BYTE FROM TABLE) 00852 00852 D041 OPGETB ADD.W D1,D0 * INDEX INTO TABLE 00854 6100 FCE4 0053A BSR BSPLTB * SPLIT THE POINTER 00858 6100 FBB0 0040A BSR GETBYT * GET THE BYTE 0085C 3002 MOVE.W D2,D0 0085E 6000 FC7C 004DC BRA BYTVAL * AND RETURN IT 00862 00862 * ---------------------- 00862 * OPPUT 00862 * ---------------------- 00862 00862 * NOTE: PROPERTY TABLE POINTERS IN THE NEXT FOUR ROUTINES NOW !MAY! 00862 * EXCEED 32K, SO SIGN-EXTENSIONS MUST BE AVOIDED. 00862 00862 * A "TABLE" ARGUMENT IS A 16-BIT UNSIGNED BYTE POINTER 00862 00862 * PUT (REPLACE THE ITEM'TH WORD IN TABLE) 00862 00862 E341 OPPUT ASL.W #1,D1 * WORD OFFSET 00864 D041 ADD.W D1,D0 * INDEX INTO TABLE 00866 0280 0000 FFFF ANDI.L #$FFFF,D0 * MAKE THE SUM A LONGWORD 0086C G 2040 MOVE.L D0,A0 0086E G D1EE FFA8 ADD.L BUFFER(A6),A0 * ABSOLUTIZE POINTER 00872 3002 MOVE.W D2,D0 00874 6000 FB88 003FE BRA PTAWRD * STORE THE WORD 00878 00878 * ---------------------- 00878 * OPPUTB 00878 * ---------------------- 00878 00878 * PUTB (REPLACE THE ITEM'TH BYTE IN TABLE) 00878 00878 D041 OPPUTB ADD.W D1,D0 * INDEX INTO TABLE 0087A 0280 0000 FFFF ANDI.L #$FFFF,D0 * MAKE THE SUM A LONGWORD 00880 G 206E FFA8 MOVE.L BUFFER(A6),A0 00884 1182 0800 MOVE.B D2,0(A0,D0.L) * STORE THE BYTE 00888 4E75 RTS 0088A 0088A * ---------------------- 0088A * OPGTPT 0088A * ---------------------- 0088A 0088A * GETPT (GET POINTER TO PROPERTY TABLE FOR GIVEN OBJ, PROP) 0088A 0088A 6100 FDE2 0066E OPGTPT BSR OBJLOC * FIND OBJ'S LOCATION 0088E 6100 FDEE 0067E BSR FSTPRP * GET POINTER TO FIRST PROPERTY 00892 6004 00898 BRA.S GTPTX2 * SKIP NEXT LINE FIRST TIME THROUGH LOOP 00894 00894 6100 FE02 00698 GTPTX1 BSR NXTPRP * POINT TO NEXT PROPERTY 00898 1010 GTPTX2 MOVE.B (A0),D0 * GET (FIRST) PROPERTY ID BYTE 0089A 0240 003F ANDI.W #PMASK,D0 * CLEAN OFF MODE/LENGTH BITS 0089E 0089E B041 CMP.W D1,D0 * COMPARE PROPERTY NUMBER WITH DESIRED ONE 008A0 6EF2 00894 BGT.S GTPTX1 * IF GREATER, LOOP (TABLE SORTED IN REVERSE) 008A2 6704 008A8 BEQ.S GTPTX3 * IF EQUAL, GOT IT 008A4 008A4 4240 CLR.W D0 * OTHERWISE, RETURN ZERO FOR NO SUCH PROPERTY 008A6 6010 008B8 BRA.S GTPTX5 008A8 008A8 IF EZIP THEN 008A8 1018 GTPTX3 MOVE.B (A0)+,D0 * GET (FIRST) PROPERTY ID BYTE 008AA 0800 0007 BTST #7,D0 * IS THERE A SECOND LENGTH BYTE? 008AE 6702 008B2 BEQ.S GTPTX4 * NO 008B0 5288 ADDQ.L #1,A0 * YES, SKIP IT TOO 008B2 ENDIF 008B2 IF CZIP THEN 008B2 ENDIF 008B2 008B2 2008 GTPTX4 MOVE.L A0,D0 008B4 90AE FFA8 SUB.L BUFFER(A6),D0 * RE-RELATIVIZE POINTER 008B8 6000 FC26 004E0 GTPTX5 BRA PUTVAL * AND RETURN IT 008BC 008BC * ---------------------- 008BC * OPPTSI 008BC * ---------------------- 008BC 008BC * PTSIZE (GIVEN POINTER TO PROPERTY TABLE, RETURN ITS SIZE) 008BC 008BC G 206E FFA8 OPPTSI MOVE.L BUFFER(A6),A0 008C0 0280 0000 FFFF ANDI.L #$FFFF,D0 * MAKE THE TABLE PTR A LONGWORD 008C6 D1C0 ADDA.L D0,A0 * ABSOLUTIZE THE TABLE POINTER 008C8 008C8 IF EZIP THEN 008C8 1028 FFFF MOVE.B -1(A0),D0 * GET MODE/ID BYTE OR LEN BYTE (EITHER WORKS!) 008CC 0800 0007 BTST #7,D0 * PROPERTY LENGTH GREATER THAN 2? 008D0 6612 008E4 BNE.S PTSIX4 * YES 008D2 008D2 0800 0006 BTST #6,D0 * NO, PROPERTY LENGTH 2? 008D6 6606 008DE BNE.S PTSIX2 * YES 008D8 7001 MOVEQ #1,D0 * NO, PROPERTY LENGTH IS 1 008DA 6000 FC04 004E0 BRA PUTVAL * RETURN IT 008DE 008DE 7002 PTSIX2 MOVEQ #2,D0 008E0 6000 FBFE 004E0 BRA PUTVAL * RETURN IT 008E4 008E4 0240 003F PTSIX4 ANDI.W #PMASK,D0 * LENGTH IS LOW 6 BITS 008E8 6000 FBF6 004E0 BRA PUTVAL * RETURN IT 008EC ENDIF 008EC IF CZIP THEN 008EC ENDIF 008EC 008EC * ---------------------------------------------------------------------------- 008EC * BLOCK OPERATIONS 008EC * ---------------------------------------------------------------------------- 008EC 008EC * ---------------------- 008EC * OPINTBL 008EC * ---------------------- 008EC 008EC * INTBL? (SEARCH TABLE FOR A VALUE) 008EC 008EC 4E71 OPINTBL NOP * USE AN ARGUMENT BLOCK 008EE 43EE FF8C LEA DEFBLK(A6),A1 * DEFAULT ARGBLK 008F2 32BC 0004 MOVE.W #4,(A1) * 4 ARGS MAX 008F6 337C 0082 0008 MOVE.W #128+2,ARG4(A1) * DEFAULT -- WORD SEARCH, RECORD LENGTH = 2 008FC 6100 13C4 01CC2 BSR SETDEF * SET UP DEFAULTS 00900 00900 G 2248 MOVE.L A0,A1 00902 3629 0008 MOVE.W ARG4(A1),D3 00906 0243 007F ANDI.W #127,D3 * RECORD LENGTH 0090A 0269 0080 0008 ANDI.W #128,ARG4(A1) * SEARCH MODE BIT -- WORD 1, BYTE 0 00910 6028 0093A BRA.S ITBX4 * >>> ZERO CHECK <<< 00912 00912 3029 0004 ITBX1 MOVE.W ARG2(A1),D0 * RELATIVE BYTE ADDRESS OF TABLE 00916 6100 FC22 0053A BSR BSPLTB * SPLIT IT [D0,D1] 0091A 4A69 0008 TST.W ARG4(A1) * WORD SEARCH? 0091E 670C 0092C BEQ.S ITBX2 * NO, BYTE 00920 6100 FB1A 0043C BSR GETWRD 00924 B469 0002 CMP.W ARG1(A1),D2 * MATCH? 00928 6720 0094A BEQ.S ITBX5 * YES 0092A 600A 00936 BRA.S ITBX3 0092C 6100 FADC 0040A ITBX2 BSR GETBYT 00930 B429 0003 CMP.B ARG1+1(A1),D2 * MATCH? 00934 6714 0094A BEQ.S ITBX5 * YES 00936 00936 D769 0004 ITBX3 ADD.W D3,ARG2(A1) * NO, SKIP TO NEXT RECORD 0093A 5369 0006 ITBX4 SUBQ.W #1,ARG3(A1) * ANY MORE RECORDS? 0093E 6CD2 00912 BGE.S ITBX1 * YES, CONTINUE SEARCHING 00940 00940 4240 CLR.W D0 * FAILED, RETURN ZERO 00942 6100 FB9C 004E0 BSR PUTVAL 00946 6000 FBA6 004EE BRA PFALSE * PREDICATE FALSE 0094A 0094A 3029 0004 ITBX5 MOVE.W ARG2(A1),D0 * SUCCESS, RETURN THE RELATIVE POINTER 0094E 6100 FB90 004E0 BSR PUTVAL 00952 6000 FB9E 004F2 BRA PTRUE * PREDICATE TRUE 00956 00956 * ---------------------- 00956 * OPCOPYT 00956 * ---------------------- 00956 00956 * COPYT (COPY OR CLEAR A TABLE) 00956 00956 4E71 OPCOPYT NOP * ASK FOR ARGBLK [JUST TO FREE UP REGS] 00958 G 2448 MOVE.L A0,A2 0095A 0095A 302A 0002 MOVE.W ARG1(A2),D0 0095E B06A 0004 CMP.W ARG2(A2),D0 00962 6700 0086 009EA BEQ CPYTX8 * SAME, EXIT 00966 00966 322A 0006 MOVE.W ARG3(A2),D1 * CHECK LENGTH: 0096A 6700 007E 009EA BEQ CPYTX8 * ZERO, EXIT 0096E 6E04 00974 BGT.S CPYTX1 * POSITIVE 00970 446A 0006 NEG.W ARG3(A2) * NEGATIVE, MAKE POSITIVE 00974 00974 4A6A 0004 CPYTX1 TST.W ARG2(A2) * DEST 00978 6760 009DA BEQ.S CPYTX6 * IF ZERO, SPECIAL CASE 0097A 4A41 TST.W D1 * WAS LEN NEG? 0097C 6D3C 009BA BLT.S CPYTX4 * IF SO, DO /NOT/ CHECK FOR OVERLAP 0097E 0097E *** MOVE.W ARG1(A2),D0 * SRC 0097E B06A 0004 CMP.W ARG2(A2),D0 * ANY "FORWARD OVERLAP"? 00982 6236 009BA BHI.S CPYTX4 * NO 00984 00984 D06A 0006 ADD.W ARG3(A2),D0 * MAYBE, SRC END (+1) 00988 B06A 0004 CMP.W ARG2(A2),D0 * ANY "FORWARD OVERLAP"? 0098C 632C 009BA BLS.S CPYTX4 * NO 0098E 0098E * "FORWARD OVERLAP" DOES EXIST, DO A REVERSE COPY 0098E 0098E 302A 0004 CPYTX2 MOVE.W ARG2(A2),D0 * DEST 00992 D06A 0006 ADD.W ARG3(A2),D0 * END (+1) 00996 6100 F9FE 00396 BSR RELABS * ABSOLUTIZE IT [MUST BE PRELOAD] 0099A G 2248 MOVE.L A0,A1 0099C 0099C 362A 0002 MOVE.W ARG1(A2),D3 * SRC 009A0 D66A 0006 ADD.W ARG3(A2),D3 * END (+1) 009A4 009A4 5343 CPYTX3 SUBQ.W #1,D3 * [PREDECREMENT] 009A6 3003 MOVE.W D3,D0 009A8 6100 FB90 0053A BSR BSPLTB * --> D0/D1 = BLK/OFF 009AC 009AC 6100 FA5C 0040A BSR GETBYT * --> D0/D1 = NEW BLK/OFF, D2 = DATA 009B0 1302 MOVE.B D2,-(A1) * [PREDECREMENT] 009B2 536A 0006 SUBQ.W #1,ARG3(A2) 009B6 66EC 009A4 BNE.S CPYTX3 * LOOP [UNSIGNED TEST] 009B8 4E75 RTS 009BA 009BA * DO A NORMAL COPY 009BA 009BA 302A 0004 CPYTX4 MOVE.W ARG2(A2),D0 * DEST 009BE 6100 F9D6 00396 BSR RELABS * ABSOLUTIZE IT [MUST BE PRELOAD] 009C2 G 2248 MOVE.L A0,A1 009C4 009C4 302A 0002 MOVE.W ARG1(A2),D0 009C8 6100 FB70 0053A BSR BSPLTB * --> D0/D1 = BLK/OFF 009CC 009CC 6100 FA3C 0040A CPYTX5 BSR GETBYT * --> D0/D1 = NEW BLK/OFF, D2 = DATA 009D0 12C2 MOVE.B D2,(A1)+ 009D2 536A 0006 SUBQ.W #1,ARG3(A2) 009D6 66F4 009CC BNE.S CPYTX5 * LOOP [UNSIGNED TEST] 009D8 4E75 RTS 009DA 009DA * NO DEST, JUST CLEAR THE SOURCE TABLE 009DA 009DA 302A 0002 CPYTX6 MOVE.W ARG1(A2),D0 * SRC 009DE 6100 F9B6 00396 BSR RELABS * ABSOLUTIZE IT [MUST BE PRELOAD] 009E2 4218 CPYTX7 CLR.B (A0)+ 009E4 536A 0006 SUBQ.W #1,ARG3(A2) 009E8 66F8 009E2 BNE.S CPYTX7 * LOOP [UNSIGNED TEST] 009EA 4E75 CPYTX8 RTS 009EC 009EC * ---------------------- 009EC * OPPRNT 009EC * ---------------------- 009EC 009EC * PRINTT (DISPLAY A TABLE IN BLOCK FORMAT) 009EC 009EC 4E71 OPPRNT NOP * USE AN ARGUMENT BLOCK 009EE 43EE FF8C LEA DEFBLK(A6),A1 * DEFAULT ARGBLK 009F2 32BC 0003 MOVE.W #3,(A1) * 3 ARGS MAX 009F6 337C 0001 0006 MOVE.W #1,ARG3(A1) * DEFAULT # LINES = 1 009FC 6100 12C4 01CC2 BSR SETDEF * SET UP DEFAULT 00A00 G 2448 MOVE.L A0,A2 00A02 00A02 4A6A 0004 TST.W ARG2(A2) 00A06 6F48 00A50 BLE.S PRNTX3 * BAD COL COUNT, EXIT 00A08 4A6A 0006 TST.W ARG3(A2) 00A0C 6F42 00A50 BLE.S PRNTX3 * BAD ROW COUNT, EXIT 00A0E 00A0E 6100 15E6 01FF6 BSR PUTLIN * MAKE SURE BUFFER IS EMPTY 00A12 6100 1894 022A8 BSR GETCURS 00A16 G 3241 MOVE.W D1,A1 * INITIAL CURSOR COLUMN -- SAVE HERE 00A18 00A18 * WE NOW USE VIRTUAL MEMORY CALLS TO FETCH TABLE DATA 00A18 00A18 362A 0004 PRNTX1 MOVE.W ARG2(A2),D3 * COLS PER ROW 00A1C 302A 0002 MOVE.W ARG1(A2),D0 * TABLE BASE / START OF CURRENT ROW 00A20 6100 FB18 0053A BSR BSPLTB * --> D0/D1 = BLK/OFF 00A24 00A24 6100 F9E4 0040A PRNTX2 BSR GETBYT * --> D0/D1 = NEW BLK/OFF, D2 = CHAR 00A28 C142 EXG D0,D2 00A2A 6100 1558 01F84 BSR PUTCHR * QUEUE/SCRIPT CHAR, ETC 00A2E C142 EXG D0,D2 00A30 00A30 5343 SUBQ.W #1,D3 * ANY MORE COLS IN THIS ROW? 00A32 6EF0 00A24 BGT.S PRNTX2 * YES, LOOP 00A34 00A34 * BEFORE, WE SAVED THE CURRENT FONT AND ENABLED FONT1, TO BE SURE THE CR 00A34 * WAS CORRECTLY INTERPRETED. BUT (IN OTHER CONTEXTS) IT STILL GOT 00A34 * MISINTERPRETED. NOWADAYS, #13 ALWAYS MEANS CR, REGARDLESS OF CONTEXT 00A34 * (SEE CharOut). A BETTER SOLUTION WILL REQUIRE SOME STICKY RETHINKING. 00A34 00A34 536A 0006 SUBQ.W #1,ARG3(A2) * ANY MORE ROWS IN TABLE? 00A38 6716 00A50 BEQ.S PRNTX3 * NO, DONE 00A3A 6100 1546 01F82 BSR PUTNEW * YES, CR, SCROLL IF NEEDED [PUTCHR #13] 00A3E 00A3E 70FF MOVEQ #-1,D0 * KEEP CURRENT ROW 00A40 3209 MOVE.W A1,D1 * BUT RESET COLUMN TO ORIGINAL VALUE 00A42 6100 182A 0226E BSR SETCURS 00A46 00A46 302A 0004 MOVE.W ARG2(A2),D0 00A4A D16A 0002 ADD.W D0,ARG1(A2) * START OF NEXT LINE 00A4E 60C8 00A18 BRA.S PRNTX1 * LOOP 00A50 4E75 PRNTX3 RTS 00A52 00A52 * ---------------------- 00A52 * OPPRNF 00A52 * ---------------------- 00A52 00A52 * DISPLAY A FORMATTED TABLE (AS FROM 3-ARG DIROUT) 00A52 00A52 4E75 OPPRNF RTS 00A54 00A54 * ---------------------------------------------------------------------------- 00A54 * VARIABLE OPERATIONS 00A54 * ---------------------------------------------------------------------------- 00A54 00A54 * ---------------------- 00A54 * OPVALU 00A54 * ---------------------- 00A54 00A54 * VALUE (GET VALUE OF VARIABLE) 00A54 00A54 6100 FA30 00486 OPVALU BSR GETVAR * GET THE VALUE 00A58 6000 FA86 004E0 BRA PUTVAL * AND RETURN IT 00A5C 00A5C * ---------------------- 00A5C * OPSET 00A5C * ---------------------- 00A5C 00A5C * SET (VAR TO VALUE) 00A5C 00A5C 6000 FA52 004B0 OPSET BRA PUTVAR * STORE THE VALUE 00A60 00A60 * ---------------------- 00A60 * OPPUSH 00A60 * ---------------------- 00A60 00A60 * PUSH (A VALUE ONTO THE GAME STACK) 00A60 00A60 3900 OPPUSH MOVE.W D0,-(A4) * PUSH THE VALUE 00A62 4E75 RTS 00A64 00A64 * ---------------------- 00A64 * OPXPUSH 00A64 * ---------------------- 00A64 00A64 * PUSH (A VALUE ONTO A 'USER STACK') 00A64 00A64 C141 OPXPUSH EXG D0,D1 * SAVE VALUE IN D1 00A66 6100 F92E 00396 BSR RELABS * GET A0 -> LTABLE 00A6A 6100 F98A 003F6 BSR GTAWRD * GET D0.W = SPACE REMAINING, ADVANCE A0 00A6E 4A40 TST.W D0 00A70 6F1A 00A8C BLE.S XPSHX2 * NO MORE SPACE 00A72 00A72 5340 SUBQ.W #1,D0 00A74 G 2248 MOVE.L A0,A1 00A76 D2C0 ADDA.W D0,A1 00A78 D2C0 ADDA.W D0,A1 * A1 -> FREE SLOT 00A7A 00A7A 5548 SUBQ.W #2,A0 00A7C 6100 F980 003FE BSR PTAWRD * UPDATE LENGTH SLOT 00A80 G 2049 MOVE.L A1,A0 00A82 3001 MOVE.W D1,D0 00A84 6100 F978 003FE BSR PTAWRD * AND STORE VALUE 00A88 00A88 6000 FA68 004F2 BRA PTRUE * PREDICATE TRUE 00A8C 6000 FA60 004EE XPSHX2 BRA PFALSE * PREDICATE FALSE 00A90 00A90 * ---------------------- 00A90 * OPPOP 00A90 * ---------------------- 00A90 00A90 * POP (A VALUE FROM A STACK, AND RETURN IT [NO LONGER PUTVAR - YZIP] ) 00A90 00A90 4E71 OPPOP NOP * REQUEST AN ARGBLK 00A92 4A50 TST.W (A0) * STACK SUPPLIED? 00A94 6604 00A9A BNE.S PPOPX2 * YES 00A96 301C MOVE.W (A4)+,D0 * NO, POP VAL FROM GAME STACK 00A98 6020 00ABA BRA.S PPOPX4 00A9A 00A9A 3028 0002 PPOPX2 MOVE.W ARG1(A0),D0 00A9E 6100 F8F6 00396 BSR RELABS * GET A0 -> LTABLE 00AA2 6100 F952 003F6 BSR GTAWRD * GET D0.W = SPACE REMAINING, ADVANCE A0 00AA6 G 2248 MOVE.L A0,A1 00AA8 D2C0 ADDA.W D0,A1 00AAA D2C0 ADDA.W D0,A1 * A1 -> LATEST ITEM ON STACK 00AAC 00AAC 5548 SUBQ.W #2,A0 00AAE 5240 ADDQ.W #1,D0 00AB0 6100 F94C 003FE BSR PTAWRD * UPDATE LENGTH SLOT 00AB4 00AB4 G 2049 MOVE.L A1,A0 00AB6 6100 F93E 003F6 BSR GTAWRD * AND GET VALUE 00ABA 6000 FA24 004E0 PPOPX4 BRA PUTVAL * RETURN IT 00ABE 00ABE * ---------------------- 00ABE * OPINC 00ABE * ---------------------- 00ABE 00ABE * INC (INCREMENT VAR) 00ABE 00ABE 3200 OPINC MOVE.W D0,D1 * SAVE A COPY HERE 00AC0 6100 F9C4 00486 BSR GETVAR * GET THE VARIABLE'S VALUE 00AC4 5240 ADDQ.W #1,D0 * INCREMENT IT 00AC6 C141 EXG D0,D1 * POSITION IT 00AC8 6000 F9E6 004B0 BRA PUTVAR * AND STORE THE NEW VALUE 00ACC 00ACC * ---------------------- 00ACC * OPDEC 00ACC * ---------------------- 00ACC 00ACC * DEC (DECREMENT VAR) 00ACC 00ACC 3200 OPDEC MOVE.W D0,D1 * SAVE A COPY HERE 00ACE 6100 F9B6 00486 BSR GETVAR * GET THE VARIABLE'S VALUE 00AD2 5340 SUBQ.W #1,D0 * DECREMENT IT 00AD4 C141 EXG D0,D1 * POSITION IT 00AD6 6000 F9D8 004B0 BRA PUTVAR * AND STORE NEW VALUE 00ADA 00ADA * ---------------------- 00ADA * OPQIGR 00ADA * ---------------------- 00ADA 00ADA * IGRTR? (INCREMENT VAR & TEST IF GREATER THAN VAL) 00ADA 00ADA 3401 OPQIGR MOVE.W D1,D2 * MOVE VAL HERE 00ADC 3200 MOVE.W D0,D1 * COPY VAR HERE 00ADE 6100 F9A6 00486 BSR GETVAR * GET THE VARIABLE'S VALUE 00AE2 5240 ADDQ.W #1,D0 * INCREMENT IT 00AE4 C141 EXG D0,D1 * POSITION IT 00AE6 00AE6 B242 CMP.W D2,D1 * NEW VALUE GREATER THAN VAL? 00AE8 6E08 00AF2 BGT.S QIG2 * YES 00AEA 6100 F9C4 004B0 QIG1 BSR PUTVAR * NO, STORE THE NEW VALUE 00AEE 6000 F9FE 004EE BRA PFALSE * AND RETURN PREDICATE FALSE 00AF2 00AF2 6100 F9BC 004B0 QIG2 BSR PUTVAR * STORE THE NEW VALUE 00AF6 6000 F9FA 004F2 BRA PTRUE * AND RETURN PREDICATE TRUE 00AFA 00AFA * ---------------------- 00AFA * OPQDLE 00AFA * ---------------------- 00AFA 00AFA * DLESS? (DECREMENT VAR & TEST IF LESS THAN VAL) 00AFA 00AFA 3401 OPQDLE MOVE.W D1,D2 * MOVE VAL HERE 00AFC 3200 MOVE.W D0,D1 * COPY VAR HERE 00AFE 6100 F986 00486 BSR GETVAR * GET THE VARIABLE'S VALUE 00B02 5340 SUBQ.W #1,D0 * DECREMENT IT 00B04 C141 EXG D0,D1 * POSITION IT 00B06 00B06 B242 CMP.W D2,D1 * NEW VALUE LESS THAN VAL? 00B08 6DE8 00AF2 BLT.S QIG2 * YES 00B0A 60DE 00AEA BRA.S QIG1 * NO 00B0C 00B0C * --------------------------------------------------------------------------- 00B0C * READ/INPUT OPERATIONS 00B0C * --------------------------------------------------------------------------- 00B0C 00B0C * 6/88 -- REGISTER D3 IS BEING TRASHED; TRY TO PINPOINT IT 00B0C 00B0C IF D3BUG THEN 00B0C ENDIF 00B0C 00B0C * ------------------------------ 00B0C * OPREAD 00B0C * ------------------------------ 00B0C 00B0C * READ (A LINE OF INPUT AND MASTICATE IT) 00B0C 00B0C 4E71 OPREAD NOP * USE AN ARGUMENT BLOCK 00B0E 43EE FF8C LEA DEFBLK(A6),A1 * USE A DEFAULT ARGBLK, TOO 00B12 32BC 0004 MOVE.W #4,(A1) * 4 ARGS MAX 00B16 4269 0004 CLR.W ARG2(A1) * DEFAULT LEXV -- ZERO MEANS DON'T 00B1A 337C FFFF 0006 MOVE.W #-1,ARG3(A1) * DEFAULT TIMOUT INTERVAL -- NEG MEANS DON'T 00B20 4269 0008 CLR.W ARG4(A1) * DEFAULT TIMOUT HANDLER FUNCTION 00B24 6100 119C 01CC2 BSR SETDEF * SET UP DEFAULTS 00B28 00B28 5488 ADDQ.L #2,A0 * SKIP COUNT SLOT 00B2A 3018 MOVE.W (A0)+,D0 * INBUF 00B2C 3618 MOVE.W (A0)+,D3 * [LEXV] 00B2E IF D3BUG THEN 00B2E ENDIF 00B2E 3D58 FF2E MOVE.W (A0)+,TWAIT(A6) * [TIME] 00B32 3D58 FF2C MOVE.W (A0)+,TFUNC(A6) * [HANDLER] 00B36 00B36 6100 F85E 00396 BSR RELABS * ABSOLUTIZE THE INBUF PTR 00B3A G 2448 MOVE.L A0,A2 * KEEP IT HERE 00B3C 6100 041C 00F5A BSR TRESET * RESET THE TIMER, IF NEEDED 00B40 00B40 IF CZIP THEN 00B40 ENDIF 00B40 00B40 G 206E FF14 MOVE.L CURWP(A6),A0 00B44 4268 001E CLR.W WLCNT(A0) * RESET COUNTER (PREVENTS A SPURIOUS [MORE]) 00B48 6100 14A4 01FEE BSR PUTLIN1 * THEN FORCE OUT ANY QUEUED TEXT (THE PROMPT) 00B4C 00B4C IF D3BUG THEN 00B4C ENDIF 00B4C 00B4C *** GATHER AND LOWER-CASIFY THE INPUT LINE ... 00B4C 00B4C G 204A MOVE.L A2,A0 * START OF INPUT LINE BUFFER 00B4E 7000 MOVEQ #0,D0 00B50 1018 MOVE.B (A0)+,D0 * 1ST HEADER BYTE == MAX LENGTH 00B52 7200 MOVEQ #0,D1 00B54 1218 MOVE.B (A0)+,D1 * 2ND HEADER BYTE == CURRENT LEN 00B56 6100 0200 00D58 BSR READLN * GET IT 00B5A 00B5A IF D3BUG THEN 00B5A ENDIF 00B5A 00B5A 3400 MOVE.W D0,D2 * RETURN D0: TERM CHAR 00B5C 2008 MOVE.L A0,D0 * RETURN A0: END OF ACTUAL INPUT (+1) 00B5E G 204A MOVE.L A2,A0 00B60 5488 ADDQ.L #2,A0 * START OF INPUT, SKIP HEADER 00B62 00B62 9088 SUB.L A0,D0 * NEW TOTAL LENGTH 00B64 1540 0001 MOVE.B D0,1(A2) * STORE THE NEW LENGTH IN THE HEADER 00B68 6100 02A4 00E0E BSR LCASE * AND LOWER-CASIFY EVERYTHING 00B6C 00B6C *** TOKENIZE AND LOOKUP THE INPUT ... 00B6C 00B6C 3003 MOVE.W D3,D0 * LEXV ARG 00B6E 6710 00B80 BEQ.S RDX4 * ZERO MEANS EXIT IMMEDIATELY 00B70 6100 F824 00396 BSR RELABS * ABSOLUTIZE 00B74 G 2648 MOVE.L A0,A3 00B76 00B76 G 226E FFF4 MOVE.L VOCTAB(A6),A1 * OPREAD: USE "STANDARD" VOCAB TABLE 00B7A 7200 MOVEQ #0,D1 * OPREAD: NO PRESERVE FLAG 00B7C 6100 0042 00BC0 BSR LEX 00B80 00B80 3002 RDX4 MOVE.W D2,D0 00B82 6000 F958 004DC BRA BYTVAL * RETURN THE TERM CHARACTER 00B86 00B86 * ------------------------------ 00B86 * OPLEX 00B86 * ------------------------------ 00B86 00B86 * TOKENIZE AND LOOKUP A LINE OF INPUT 00B86 * (FIND EACH WORD, CONVERT IT TO ZWORD, AND STORE OFFSET INFO IN LEXV) 00B86 00B86 4E71 OPLEX NOP * USE AN ARGUMENT BLOCK 00B88 43EE FF8C LEA DEFBLK(A6),A1 * USE A DEFAULT ARGBLK, TOO 00B8C 32BC 0004 MOVE.W #4,(A1) * 4 ARGS MAX 00B90 4269 0006 CLR.W ARG3(A1) * DEFAULT VOC TABLE (FLAG) 00B94 4269 0008 CLR.W ARG4(A1) * DEFAULT PRESERVE FLAG = OFF 00B98 6100 1128 01CC2 BSR SETDEF * SET UP DEFAULTS 00B9C 00B9C G 2248 MOVE.L A0,A1 * ARGBLK 00B9E 4A59 TST.W (A1)+ * SKIP ACTUAL ARG COUNT (NOT NEEDED) 00BA0 3019 MOVE.W (A1)+,D0 * ARG1 == INBUF 00BA2 6100 F7F2 00396 BSR RELABS * ABSOLUTIZE 00BA6 G 2448 MOVE.L A0,A2 * AND PASS IT HERE 00BA8 3019 MOVE.W (A1)+,D0 * ARG2 == LEXV 00BAA 6100 F7EA 00396 BSR RELABS * ABSOLUTIZE 00BAE G 2648 MOVE.L A0,A3 * AND PASS IT HERE 00BB0 00BB0 G 206E FFF4 MOVE.L VOCTAB(A6),A0 * "STANDARD" VOCTAB 00BB4 3019 MOVE.W (A1)+,D0 * USE A SPECIAL VOCTAB? 00BB6 6704 00BBC BEQ.S LXX0 * NO 00BB8 6100 F7DC 00396 BSR RELABS * YES, ABSOLUTIZE 00BBC C149 LXX0 EXG A0,A1 * PASS VOCTAB IN A1 00BBE 3218 MOVE.W (A0)+,D1 * AND PASS "PRESERVE" FLAG HERE 00BC0 00BC0 * INTERNAL ENTRY POINT 00BC0 * GIVEN A1 -> VOCAB TABLE, A2 -> INBUF, A3 -> LEXV, D1 = PRESERVE FLAG 00BC0 00BC0 2F02 LEX MOVE.L D2,-(SP) 00BC2 G 2049 MOVE.L A1,A0 00BC4 6100 02C8 00E8E BSR INITLX * SETUP VOCAB VARS (FOR LOOKUP) 00BC8 00BC8 2D4A FF78 MOVE.L A2,RDBOS(A6) * REMEMBER INPUT BUFFER BASE 00BCC 7000 MOVEQ #0,D0 00BCE 102A 0001 MOVE.B 1(A2),D0 * >> ACTUAL LEN OF INPUT << 00BD2 548A ADDQ.L #2,A2 * SKIP HEADER (MAX LEN, CUR LEN) 00BD4 D08A ADD.L A2,D0 00BD6 2D40 FF74 MOVE.L D0,RDEOS(A6) * REMEMBER END OF INPUT 00BDA 00BDA 2D4B FF70 MOVE.L A3,RDRET(A6) * REMEMBER RETURN BUFFER BASE 00BDE 422B 0001 CLR.B 1(A3) * BUFFER INITIALLY EMPTY 00BE2 548B ADDQ.L #2,A3 * SKIP HEADER (MAX WORDS, NWORDS) 00BE4 00BE4 * LOOP STARTS HERE, A2 -> CURRENT INBUF, A3 -> CURRENT LEXV 00BE4 00BE4 G 204A LXX2 MOVE.L A2,A0 * CURRENT INPUT START 00BE6 202E FF74 MOVE.L RDEOS(A6),D0 00BEA 908A SUB.L A2,D0 * CURRENT REMAINING LENGTH 00BEC 674A 00C38 BEQ.S LXX8 * NOTHING, EXIT 00BEE 6100 006A 00C5A BSR ZWSTR * FIND NEXT WORD, AND CONVERT IT 00BF2 00BF2 G 2448 MOVE.L A0,A2 * RETURN: START OF CURRENT WORD 00BF4 3400 MOVE.W D0,D2 * RETURN: LENGTH OF CURRENT WORD, OR ZERO 00BF6 6740 00C38 BEQ.S LXX8 * NOTHING, EXIT 00BF8 00BF8 *** BUILD THE LEX (RETURN) TABLE ... 00BF8 00BF8 G 206E FF70 MOVE.L RDRET(A6),A0 * RETURN TABLE POINTER 00BFC 1018 MOVE.B (A0)+,D0 * MAX WORDS ALLOWED 00BFE B010 CMP.B (A0),D0 * ROOM FOR ANOTHER? 00C00 672C 00C2E BEQ.S LXX6 * NO, ERROR 00C02 5210 ADDQ.B #1,(A0) * INCREMENT FOUND-WORD COUNT 00C04 00C04 41EE FF7C LEA RDZSTR(A6),A0 * ZWORD WAS LEFT HERE 00C08 6100 02DA 00EE4 BSR LOOKUP * SEARCH VOCAB TABLE FOR IT, RETURN OFFSET 00C0C 4A40 TST.W D0 * WORD FOUND? 00C0E 6604 00C14 BNE.S LXX3 * YES 00C10 4A41 TST.W D1 * NO, PRESERVE OLD INFO? >> OFFSET ONLY << 00C12 6606 00C1A BNE.S LXX4 * YES 00C14 00C14 G 204B LXX3 MOVE.L A3,A0 * CURRENT RETURN SLOT 00C16 6100 F7E6 003FE BSR PTAWRD * STORE THE OFFSET IN RETURN TABLE 00C1A 00C1A 1742 0002 LXX4 MOVE.B D2,2(A3) * STORE WORD LENGTH IN RETURN TABLE 00C1E 200A MOVE.L A2,D0 00C20 90AE FF78 SUB.L RDBOS(A6),D0 * CALCULATE STARTING BYTE OFFSET OF WORD 00C24 1740 0003 MOVE.B D0,3(A3) * STORE IT TOO 00C28 00C28 588B ADDQ.L #4,A3 * ADVANCE RETURN TABLE PTR 00C2A D4C2 ADDA.W D2,A2 * ADVANCE INPUT PTR 00C2C 60B6 00BE4 BRA LXX2 * GO FOR THE NEXT WORD 00C2E 00C2E *** ERROR, RETURN BUFFER IS FULL, TELL USER, THEN EXIT 00C2E 00C2E G 204A LXX6 MOVE.L A2,A0 * START OF FLUSHED STRING 00C30 G 226E FF74 MOVE.L RDEOS(A6),A1 * END (+1) 00C34 6100 0230 00E66 BSR RDERR * ECHO IT IN ERROR MESSAGE 00C38 00C38 241F LXX8 MOVE.L (SP)+,D2 * CLEAN UP AND EXIT 00C3A 4E75 RTS 00C3C 00C3C * ------------------------------ 00C3C * OPZWSTR 00C3C * ------------------------------ 00C3C 00C3C * IDENTIFY THE NEXT WORD (START/END), AND CONVERT IT TO A ZWORD 00C3C 00C3C OPZWSTR 00C3C D042 ADD.W D2,D0 * INPUT BUFFER: BASE + OFFSET 00C3E 6100 F756 00396 BSR RELABS * ABSOLUTIZE IT 00C42 7009 MOVEQ #VCHARS,D0 * MAX LEN -- IGNORE 2ND ARG (SPEC ERROR) 00C44 6100 0014 00C5A BSR ZWSTR * GO FOR IT 00C48 00C48 * (IGNORE RETURNED INFO; WE'RE INTERESTED IN INITIAL WORD ONLY) 00C48 00C48 3003 MOVE.W D3,D0 * REQUESTED ZWORD BUFFER 00C4A 6100 F74A 00396 BSR RELABS * ABSOLUTIZE IT 00C4E G 2248 MOVE.L A0,A1 00C50 41EE FF7C LEA RDZSTR(A6),A0 * ZWORD WAS LEFT HERE 00C54 7006 MOVEQ #ZCHARS,D0 00C56 6000 F708 00360 BRA COPYB * COPY ZWORD TO FINAL DEST, AND EXIT 00C5A 00C5A * INTERNAL ENTRY POINT 00C5A * GIVEN A0 -> INPUT START, D0.W = INPUT LENGTH (TOTAL) 00C5A * RETURN A0 -> FIRST WORD START, D0.W = FIRST WORD LENGTH, OR ZERO 00C5A 00C5A 6100 01CC 00E28 ZWSTR BSR FINDBK * FIND NEXT BREAK CHAR 00C5E 4A40 TST.W D0 00C60 671E 00C80 BEQ.S ZWSX1 * EXIT IF NOTHING 00C62 00C62 48E7 C0C0 MOVEM.L D0-D1/A0-A1,-(SP) * SAVE RESULTS 00C66 43EE FF82 LEA RDWSTR(A6),A1 * TEMP STRING BUFFER 00C6A 7209 MOVEQ #VCHARS,D1 * MAX LENGTH 00C6C 6100 F6F8 00366 BSR COPYS * COPY FIRST WORD, MAKE ASCIZ 00C70 00C70 43EE FF82 LEA RDWSTR(A6),A1 00C74 41EE FF7C LEA RDZSTR(A6),A0 * TEMP OUTPUT BUFFER 00C78 6100 119E 01E18 BSR ZWORD * CONVERT STRING, LEAVE ZWORD IN BUFFER 00C7C 4CDF 0303 MOVEM.L (SP)+,D0-D1/A0-A1 * RESTORE RESULTS 00C80 4E75 ZWSX1 RTS 00C82 00C82 * ------------------------------ 00C82 * OPINPUT 00C82 * ------------------------------ 00C82 00C82 * WAIT FOR A KEY (NO ECHO), HANDLE OPTIONAL TIMEOUTS 00C82 00C82 4E71 OPINPUT NOP * USE ARGBLK 00C84 43EE FF8C LEA DEFBLK(A6),A1 * USE A DEFAULT ARGBLK, TOO 00C88 32BC 0003 MOVE.W #3,(A1) * 3 ARGS MAX 00C8C 337C FFFF 0004 MOVE.W #-1,ARG2(A1) * DEFAULT TIMOUT INTERVAL -- "DON'T" 00C92 4269 0006 CLR.W ARG3(A1) * DEFAULT TIMOUT HANDLER FUNCTION 00C96 6100 102A 01CC2 BSR SETDEF * SET UP DEFAULTS 00C9A 5888 ADDQ.L #ARG2,A0 * SKIP COUNT AND DEVICE 00C9C 3D58 FF2E MOVE.W (A0)+,TWAIT(A6) * DELAY IN 1/10'S SECOND 00CA0 3D58 FF2C MOVE.W (A0)+,TFUNC(A6) * FUNCTION TO CALL UPON TIMEOUT 00CA4 6100 02B4 00F5A BSR TRESET * RESET THE TIMER, IF NEEDED 00CA8 00CA8 G 206E FF14 MOVE.L CURWP(A6),A0 00CAC 4268 001E CLR.W WLCNT(A0) * RESET COUNTER, PREVENTS A SPURIOUS [MORE] 00CB0 4A6E FF5A TST.W VOBUFF(A6) * BUFFERED OUTPUT? 00CB4 6704 00CBA BEQ.S INPX1 * NO 00CB6 6100 133E 01FF6 BSR PUTLIN * YES, EMPTY THE BUFFER 00CBA 00CBA 7000 INPX1 MOVEQ #0,D0 * SINGLE CHAR [SUPPRESS MENU CMD-STRINGS] 00CBC 6100 000C 00CCA BSR INPUT * GET KEY 00CC0 0C00 0001 CMPI.B #1,D0 * CONTINUE AFTER TIMEOUT? 00CC4 67F4 00CBA BEQ.S INPX1 * YES 00CC6 6000 F814 004DC BRA BYTVAL * OTHERWISE, RETURN KEY 00CCA 00CCA * INTERNAL ENTRY POINT >> CALLED ALSO FROM READLN; HANDLES TIMEOUTS << 00CCA * GIVEN D0.W = LINE-INPUT FLAG (ZERO IF SINGLE-CHAR INPUT) 00CCA * WAIT FOR A KEY, RETURN D0.B = VALUE 00CCA * IN CASE OF A TIMEOUT, RETURN D0.B = 0 (ABORT) OR 1 (KEEP WAITING) 00CCA * IF WAITING, RETURN D0 (HI WORD) = NONZERO TO REDRAW INPUT LINE 00CCA 00CCA 48E7 6000 INPUT MOVEM.L D1-D2,-(SP) 00CCE 3400 MOVE.W D0,D2 * SAVE FLAG HERE 00CD0 7001 MOVEQ #1,D0 * START OF INPUT 00CD2 3202 MOVE.W D2,D1 * CHAR/LINE 00CD4 6100 17F0 024C6 BSR SETUPI 00CD8 00CD8 6100 1782 0245C INPX4 BSR GAMINT1 * CHECK FOR GAME INTERRUPT (SOUND, ETC) 00CDC 6100 1820 024FE BSR ITTYIN * CHECK FOR A KEY << DON'T WAIT! >> 00CE0 4A00 TST.B D0 * GOT ONE? 00CE2 670E 00CF2 BEQ.S INPX6 * NOTHING YET 00CE4 00CE4 3F00 MOVE.W D0,-(SP) 00CE6 4240 CLR.W D0 * END OF INPUT 00CE8 3202 MOVE.W D2,D1 * CHAR/LINE 00CEA 6100 17DA 024C6 BSR SETUPI 00CEE 301F MOVE.W (SP)+,D0 00CF0 603E 00D30 BRA.S INPX8 * EXIT WITH KEY 00CF2 00CF2 4A6E FF2E INPX6 TST.W TWAIT(A6) * TIMOUTS IN EFFECT? 00CF6 6DE0 00CD8 BLT.S INPX4 * NO, JUST LOOP 00CF8 6100 0276 00F70 BSR TCHECK * TIME (10'S) REMAINING BEFORE NEXT TIMEOUT 00CFC 4A40 TST.W D0 * HAS IT RUN OUT? 00CFE 6ED8 00CD8 BGT.S INPX4 * NO, CONTINUE LOOP 00D00 00D00 6100 0266 00F68 BSR TNEXT * YES: UPDATE TIMER 00D04 4240 CLR.W D0 * END OF INPUT (FOR THE MOMENT...) 00D06 3202 MOVE.W D2,D1 * CHAR/LINE 00D08 6100 17BC 024C6 BSR SETUPI 00D0C 00D0C 6100 159A 022A8 BSR GETCURS 00D10 3401 MOVE.W D1,D2 * REMEMBER CURRENT CURSOR POS (COLUMN) 00D12 00D12 302E FF2C MOVE.W TFUNC(A6),D0 * TIMEOUT FUNCTION 00D16 6100 0AC2 017DA BSR INCALL * CALL IT (INTERNALLY) 00D1A 4A40 TST.W D0 * IT RETURNS A BOOLEAN -- ABORT INPUT? 00D1C 6610 00D2E BNE.S INPX7 * YES 00D1E 00D1E 6100 1588 022A8 BSR GETCURS 00D22 9242 SUB.W D2,D1 * DID CURSOR POS (COLUMN) CHANGE? 00D24 3001 MOVE.W D1,D0 * ZERO IF NO 00D26 4840 SWAP D0 * RETURN THIS FLAG IN HIGH WORD 00D28 303C 0001 MOVE.W #1,D0 * 1 MEANS KEEP WAITING 00D2C 6002 00D30 BRA.S INPX8 00D2E 00D2E 7000 INPX7 MOVEQ #0,D0 * NULL CHAR MEANS ABORT INPUT 00D30 4CDF 0006 INPX8 MOVEM.L (SP)+,D1-D2 00D34 4E75 RTS 00D36 00D36 * ---------------------- 00D36 * OPMSINFO 00D36 * ---------------------- 00D36 00D36 * GET MOUSE STATUS 00D36 00D36 OPMSINFO 00D36 6100 F65E 00396 BSR RELABS 00D3A G 2248 MOVE.L A0,A1 * RETURN VALS IN TABLE 00D3C 6100 1886 025C4 BSR GETMOUSE 00D40 00D40 G 2049 MOVE.L A1,A0 00D42 6100 F6BA 003FE BSR PTAWRD * STORE YPOS 00D46 3001 MOVE.W D1,D0 00D48 6100 F6B4 003FE BSR PTAWRD * STORE XPOS 00D4C 3002 MOVE.W D2,D0 00D4E 6000 F6AE 003FE BRA PTAWRD * STORE BUTTON STATUS 00D52 00D52 * ---------------------- 00D52 * OPMSLMT 00D52 * ---------------------- 00D52 00D52 * SET MOUSE LIMITS (WINDOW) 00D52 00D52 3D40 FEF2 OPMSLMT MOVE.W D0,MSWIND(A6) * UPDATE MOUSE-LIMIT WINDOW ... 00D56 4E75 RTS 00D58 00D58 * --------------------------------------------------------------------------- 00D58 * READ/INPUT PRIMITIVES 00D58 * --------------------------------------------------------------------------- 00D58 00D58 * ------------------------------ 00D58 * READLN 00D58 * ------------------------------ 00D58 00D58 * GATHER A LINE OF INPUT 00D58 * GIVEN A0 -> INPUT BUFFER, D0 = MAX LENGTH, D1 = CURRENT LENGTH 00D58 * RETURN A0 -> END OF ACTUAL INPUT (+1), D0 = TERM CHAR 00D58 00D58 0000 000D EOLCHR EQU $0D * CARRIAGE RETURN 00D58 0000 0008 DELCH1 EQU $08 * BACKSPACE 00D58 0000 007F DELCH2 EQU $7F * ALSO ACCEPT "DELETE" 00D58 00D58 48E7 6070 READLN MOVEM.L D1-D2/A1-A3,-(SP) 00D5C G 2248 MOVE.L A0,A1 * A1 -> START 00D5E G 2448 MOVE.L A0,A2 00D60 D4C1 ADDA.W D1,A2 * A2 -> CURRENT POSITION (MAY BE FULL) 00D62 G 2648 MOVE.L A0,A3 00D64 D6C0 ADDA.W D0,A3 * A3 -> END (+1) 00D66 00D66 G 206E FFA8 RDLX1 MOVE.L BUFFER(A6),A0 00D6A 3028 002E MOVE.W PTCHARS(A0),D0 * TABLE OF TERMINATING CHARS 00D6E 6100 F626 00396 BSR RELABS * ABSOLUTIZE 00D72 2408 MOVE.L A0,D2 * KEEP PTR HERE 00D74 00D74 *** WAIT FOR A KEY, CHECK FOR A TCHAR ... 00D74 00D74 7001 RDLX2 MOVEQ #1,D0 * LINE INPUT [ALLOW MENU CMD-STRINGS] 00D76 6100 FF52 00CCA BSR INPUT * NO ECHO, HANDLE TIMEOUTS 00D7A IF D3BUG THEN 00D7A ENDIF 00D7A *** BSR TTYIN 00D7A 4A00 TST.B D0 * WAS THERE A TIME-OUT AND AN ABORT? 00D7C 6760 00DDE BEQ.S RDLX10 * YES, BREAK 00D7E 0C00 0001 CMPI.B #1,D0 * WAS THERE A TIME-OUT WITHOUT AN ABORT? 00D82 6758 00DDC BEQ.S RDLX9A * YES, DO INPUT-ECHO HACK 00D84 0C00 000D CMPI.B #EOLCHR,D0 * CR? 00D88 6754 00DDE BEQ.S RDLX10 * YES, BREAK 00D8A 00D8A G 2042 MOVE.L D2,A0 * TCHARS TABLE 00D8C 7200 MOVEQ #0,D1 * FLAG FOR "FUNCTION-KEY TCHARS" 00D8E 0C10 00FF RDLX4 CMPI.B #255,(A0) * CONSIDER ALL FKEYS TO BE TCHARS? 00D92 6602 00D96 BNE.S RDLX5 * NO 00D94 7201 MOVEQ #1,D1 * YES, SET FLAG 00D96 B010 RDLX5 CMP.B (A0),D0 * CHECK TABLE FOR THIS CHAR 00D98 6744 00DDE BEQ.S RDLX10 * >> FOUND IT, BREAK << 00D9A 4A18 TST.B (A0)+ * END OF TABLE? 00D9C 66F0 00D8E BNE RDLX4 * NO, CONTINUE SEARCH 00D9E 00D9E * LAST CHANCE TO BE A TCHAR ... 00D9E 00D9E 0C00 007F CMPI.B #127,D0 * SPECIAL CASE: IS THIS CHAR AN FKEY? 00DA2 6306 00DAA BLS.S RDLX6 * NO 00DA4 00DA4 4A41 TST.W D1 * YES: "FUNCTION-KEY TCHARS" ACTIVE? 00DA6 6636 00DDE BNE.S RDLX10 * YES, BREAK 00DA8 602C 00DD6 BRA.S RDLX9 * RDLX2 * NO >> REJECT KEY << 00DAA 00DAA * NOT A TCHAR, CHECK FOR A BACKSPACE ... 00DAA 00DAA 0C00 0008 RDLX6 CMPI.B #DELCH1,D0 * BACKSPACE? 00DAE 6712 00DC2 BEQ.S RDLX8 * YES 00DB0 0C00 007F CMPI.B #DELCH2,D0 * DELETE? 00DB4 670C 00DC2 BEQ.S RDLX8 * YES 00DB6 00DB6 *** NORMAL CHARACTER, HANDLE IT ... 00DB6 00DB6 B5CB CMPA.L A3,A2 * BUFFER OVERFLOW? 00DB8 641C 00DD6 BCC.S RDLX9 * BHS * YES, IGNORE CHAR, JUST BEEP 00DBA 00DBA 14C0 MOVE.B D0,(A2)+ * STORE CHAR 00DBC 6100 182A 025E8 BSR TTYOUT * AND ECHO IT 00DC0 60B2 00D74 BRA.S RDLX2 00DC2 00DC2 * HANDLE A BACKSPACE 00DC2 00DC2 B5C9 RDLX8 CMPA.L A1,A2 * BUFFER UNDERFLOW? 00DC4 6310 00DD6 BLS.S RDLX9 * YES, JUST BEEP 00DC6 00DC6 538A SUBQ.L #1,A2 * NO, BACK UP BUFFER POINTER 00DC8 1012 MOVE.B (A2),D0 * (PASS PREVIOUS CHAR IN HIGH BYTE) 00DCA E148 LSL.W #8,D0 00DCC 103C 0008 MOVE.B #DELCH1,D0 00DD0 6100 1816 025E8 BSR TTYOUT * AND ECHO A BS 00DD4 609E 00D74 BRA RDLX2 00DD6 00DD6 * ERROR, BEEP -- BUFFER TOO FULL/EMPTY. DISCARD CHAR, NO ECHO. 00DD6 00DD6 RDLX9 00DD6 *** MOVEQ #1,D0 00DD6 *** BSR DOSOUND 00DD6 6100 1662 0243A BSR ZBEEP * BEEP AT USER 00DDA IF D3BUG THEN 00DDA ENDIF 00DDA 6098 00D74 BRA RDLX2 * AND KEEP WAITING 00DDC 00DDC * TIMEOUT OCCURRED (NO ABORT) 00DDC * RE-ECHO ENTIRE INPUT LINE, BUT ONLY IF GAME WROTE AFTER THE OLD ONE 00DDC * WE ASSUME GAME PRINTED A FRESH CR, AND A PROMPT (>) IF NEEDED 00DDC * >> MAJOR KLUDGE, DEAD IN YZIP << 00DDC 00DDC RDLX9A 00DDC ** SWAP D0 * "REDRAW" FLAG IS IN HIGH HALF OF REGISTER 00DDC ** TST.W D0 * DID CURSOR POSITION CHANGE DURING TIMEOUT? 00DDC ** BEQ RDLX2 * NO, DON'T REDRAW 00DDC 00DDC ** MOVE.L A1,-(SP) * SAVE START PTR 00DDC ** BRA.S RDLX9C 00DDC ** X9B MOVE.B (A1)+,D0 00DDC ** BSR TTYOUT * ECHO ONE-AT-A-TIME, SO WILL WRAP IF NEEDED 00DDC ** X9C CMPA.L A2,A1 * ANY MORE? 00DDC ** BLT.S RDLX9B * YES 00DDC ** MOVE.L (SP)+,A1 00DDC 6096 00D74 BRA RDLX2 * START WAITING AGAIN 00DDE 00DDE *** DONE, HANDLE THE TERMINATING CHAR <<< DON'T STORE IN BUFFER >>> 00DDE 00DDE 3400 RDLX10 MOVE.W D0,D2 * SAVE TCHAR 00DE0 0C02 000D CMPI.B #EOLCHR,D2 * WAS THE CHAR A RETURN? 00DE4 6604 00DEA BNE.S RDLX12 * NO >>> SKIP THE ECHO? <<< 00DE6 6100 1800 025E8 BSR TTYOUT * YES, ECHO IT 00DEA 00DEA B5CB RDLX12 CMPA.L A3,A2 * ANY ROOM LEFT? 00DEC 6402 00DF0 BCC.S RDLX14 * BHS * NO (SIGH) 00DEE 4212 CLR.B (A2) * INPUT SHOULD BE FOLLOWED BY A BREAK (ZWSTR) 00DF0 00DF0 * ADJUST THE [MORE] COUNTER AFTER MULTI-LINE INPUT (DEAD -- VERY KLUDGY) 00DF0 00DF0 0C02 000D RDLX14 CMPI.B #EOLCHR,D2 * WAS THE CHAR A RETURN? 00DF4 660E 00E04 BNE.S RDLX20 * NO 00DF6 G 206E FF14 RDLX16 MOVE.L CURWP(A6),A0 00DFA 7000 MOVEQ #0,D0 00DFC 1028 001A MOVE.B WFONTYX(A0),D0 * VERTICAL LINE SIZE 00E00 D168 001E ADD.W D0,WLCNT(A0) * BUMP THE [MORE] COUNTER 00E04 *** ADDQ.W #1,WLCNT(A0) 00E04 00E04 * SCRIPT THE USER INPUT LINE (IF SCRIPTING IS ACTIVE) 00E04 * AVOID PROBLEMS WITH BACKSPACES, BY WAITING UNTIL INPUT IS COMPLETE 00E04 * [DEAD -- YZIP] 00E04 RDLX20 00E04 * MOVEQ #0,D1 00E04 *** CMPI.B #EOLCHR,D2 * BUT WAS THE CHAR A RETURN? 00E04 *** BNE.S RDLX22 * NO, AVOID SCRIPTING [XZIP] 00E04 *** MOVEQ #1,D1 * YES, (AND ADD A CR) 00E04 00E04 *** MOVE.L A1,A0 * START OF LINE 00E04 *** MOVE.L A2,D0 00E04 *** SUB.L A1,D0 * LENGTH 00E04 *** BSR SCRINP 00E04 00E04 3002 RDLX22 MOVE.W D2,D0 * RETURN TERM CHAR 00E06 G 204A MOVE.L A2,A0 * RETURN END-OF-INPUT (+1) POINTER 00E08 4CDF 0E06 MOVEM.L (SP)+,D1-D2/A1-A3 00E0C 4E75 RTS 00E0E 00E0E * --------------------------- 00E0E * LCASE 00E0E * --------------------------- 00E0E 00E0E * LOWER-CASIFY A LINE OF INPUT, A0 -> INPUT, D0.W = LEN 00E0E 00E0E 6012 00E22 LCASE BRA.S LCSX3 00E10 0C10 0041 LCSX1 CMPI.B #'A',(A0) * UPPERCASE CHAR? 00E14 6D0A 00E20 BLT.S LCSX2 * NO 00E16 0C10 005A CMPI.B #'Z',(A0) * MAYBE? 00E1A 6E04 00E20 BGT.S LCSX2 * NO 00E1C 0610 0020 ADDI.B #32,(A0) * YES, LOWER-CASIFY IT 00E20 5288 LCSX2 ADDQ.L #1,A0 00E22 51C8 FFEC 00E10 LCSX3 DBF D0,LCSX1 * ZERO CHECK << ENTRY POINT >> 00E26 4E75 RTS 00E28 00E28 * ------------------------------ 00E28 * FINDBK 00E28 * ------------------------------ 00E28 00E28 * FIND THE NEXT BREAK CHARACTER 00E28 * GIVEN A0 -> INPUT START, D0.W = INPUT LENGTH 00E28 * RETURN A0 -> FIRST WORD START, D0.W = FIRST WORD LENGTH, OR ZERO 00E28 00E28 48E7 4070 FINDBK MOVEM.L D1/A1-A3,-(SP) 00E2C G 2448 MOVE.L A0,A2 00E2E D4C0 ADDA.W D0,A2 * END OF INPUT (+1) 00E30 4241 CLR.W D1 * COUNT OF SIGNIFICANT CHARS 00E32 00E32 G 2248 FBX1 MOVE.L A0,A1 * REMEMBER START OF CURRENT WORD 00E34 B5C8 FBX2 CMPA.L A0,A2 * END OF INPUT STRING? 00E36 6724 00E5C BEQ.S FBX8 * YES 00E38 1018 MOVE.B (A0)+,D0 * NO, PICK UP NEXT CHAR 00E3A 00E3A G 266E FFE4 MOVE.L RBRKS(A6),A3 * LIST OF READ-BREAK CHARACTERS 00E3E 0C00 007F CMPI.B #127,D0 * BUT IS THIS A FUNCTION KEY? 00E42 620C 00E50 BHI.S FBX6 * YES, CONSIDER IT A S.I. BREAK (?) 00E44 B013 FBX4 CMP.B (A3),D0 * SEARCH LIST FOR CHAR << XZIP: "NULL" TOO >> 00E46 6708 00E50 BEQ.S FBX6 * FOUND IT 00E48 4A1B TST.B (A3)+ * END OF (ASCIZ) LIST? 00E4A 66F8 00E44 BNE FBX4 * NO, CONTINUE SEARCH 00E4C 5241 ADDQ.W #1,D1 * YES, NOT A BREAK, BUMP COUNT 00E4E 60E4 00E34 BRA FBX2 00E50 00E50 *** BREAK CHAR FOUND ... 00E50 00E50 4A41 FBX6 TST.W D1 * WORD READ /BEFORE/ THIS BREAK? 00E52 6608 00E5C BNE.S FBX8 * YES, GO FOR IT 00E54 B7EE FFE0 CMPA.L ESIBKS(A6),A3 * NO, BUT WAS THIS A SELF-INSERTING BREAK? 00E58 64D8 00E32 BCC.S FBX1 * BHS * NO, JUST SKIP IT, LOOP FOR NEXT 00E5A 5241 ADDQ.W #1,D1 * YES, BUMP COUNT AND GO FOR ZWORD 00E5C 00E5C *** CLEAN UP AND EXIT ... 00E5C 00E5C G 2049 FBX8 MOVE.L A1,A0 * RETURN START OF CURRENT WORD 00E5E 3001 MOVE.W D1,D0 * RETURN LENGTH OF CURRENT WORD 00E60 4CDF 0E02 MOVEM.L (SP)+,D1/A1-A3 00E64 4E75 RTS 00E66 00E66 * ------------------------------ 00E66 * RDERR 00E66 * ------------------------------ 00E66 00E66 * TOO MANY WORDS FOUND IN THE INPUT BUFFER, INFORM LOSER 00E66 * A0 -> START OF EXCESS INPUT, A1 -> END OF INPUT (+1) 00E66 00E66 2F08 RDERR MOVE.L A0,-(SP) * SAVE ARG HERE 00E68 6100 1118 01F82 BSR PUTNEW 00E6C 41ED 0090 LEA MSGIO1,A0 00E70 6100 18AE 02720 BSR OUTMSG0 * '[Too many words ... "' 00090 DATA 00090 5B546F6F206D61 MSGIO1 DC.B '[Too many words typed, discarding ',$22,0 00E74 CODE 00E74 00E74 G 205F MOVE.L (SP)+,A0 * START OF FLUSHED WORD/STRING 00E76 1F11 MOVE.B (A1),-(SP) * SAVE TERMINAL BYTE, TO BE SAFE 00E78 4211 CLR.B (A1) * MAKE STRING ASCIZ 00E7A 6100 18A4 02720 BSR OUTMSG0 * ECHO IT 00E7E 129F MOVE.B (SP)+,(A1) * RESTORE THIS BYTE 00E80 00E80 41ED 00B4 LEA MSGIO2,A0 00E84 6100 18B8 0273E BSR OUTMSG * '."]' 000B4 DATA 000B4 2E 22 5D 00 MSGIO2 DC.B '.',$22,']',0 00E88 CODE 00E88 00E88 6100 10F8 01F82 BSR PUTNEW * FINAL CR 00E8C 4E75 RTS 00E8E 00E8E * --------------------------- 00E8E * INITLX 00E8E * --------------------------- 00E8E 00E8E * INIT VOCABULARY VARS, GIVEN A VOCAB TABLE POINTER IN A0 00E8E * (CALLED AT BEGINNING OF EACH "LEX" CALL) 00E8E 00E8E 48E7 6060 INITLX MOVEM.L D1-D2/A1-A2,-(SP) 00E92 4240 CLR.W D0 00E94 1018 MOVE.B (A0)+,D0 * THIS BYTE IS THE # OF SI BREAKS 00E96 D0C0 ADDA.W D0,A0 * SKIP THEM (READ DURING STARTUP ONLY) 00E98 00E98 4240 CLR.W D0 00E9A 1018 MOVE.B (A0)+,D0 * THIS BYTE IS THE LENGTH OF EACH VOCTAB ENTRY 00E9C 3D40 FFDE MOVE.W D0,VWLEN(A6) * SAVE IT 00EA0 00EA0 1018 MOVE.B (A0)+,D0 * THIS WORD IS # OF VOCTAB ENTRIES 00EA2 E140 ASL.W #8,D0 00EA4 1018 MOVE.B (A0)+,D0 00EA6 2D48 FFD8 MOVE.L A0,VOCBEG(A6) * THIS IS BEGINNING OF ACTUAL VOCABULARY 00EAA 00EAA 4A40 TST.W D0 * IF POSITIVE #, TABLE IS SORTED 00EAC 6E06 00EB4 BGT.S INLX4 00EAE 4440 NEG.W D0 * OTHERWISE, NOT SORTED, POSITIVIZE COUNT 00EB0 4241 CLR.W D1 * AND INDICATE UNSORTED TABLE 00EB2 6014 00EC8 BRA.S INLX6 00EB4 00EB4 * SORTED TABLE -- CALCULATE INITIAL OFFSET FOR BINARY SEARCH 00EB4 00EB4 3400 INLX4 MOVE.W D0,D2 00EB6 322E FFDE MOVE.W VWLEN(A6),D1 * NUMBER OF BYTES PER VOCAB ENTRY 00EBA E242 ASR.W #1,D2 00EBC E341 INLX5 ASL.W #1,D1 00EBE E242 ASR.W #1,D2 00EC0 66FA 00EBC BNE INLX5 00EC2 3D41 FF6C MOVE.W D1,VWBOFF(A6) * SAVE INITIAL BINARY SEARCH OFFSET 00EC6 00EC6 7201 MOVEQ #1,D1 * INDICATE A SORTED TABLE 00EC8 3D40 FFDC INLX6 MOVE.W D0,VWORDS(A6) * SAVE COUNT 00ECC 3D41 FF6E MOVE.W D1,VWSORT(A6) * SAVE FLAG 00ED0 00ED0 5340 SUBQ.W #1,D0 00ED2 C1EE FFDE MULS VWLEN(A6),D0 00ED6 D0AE FFD8 ADD.L VOCBEG(A6),D0 * CALCULATE POINTER TO LAST ENTRY 00EDA 2D40 FFD4 MOVE.L D0,VOCEND(A6) * SAVE IT 00EDE 00EDE 4CDF 0606 MOVEM.L (SP)+,D1-D2/A1-A2 00EE2 4E75 RTS 00EE4 00EE4 * ------------------------------ 00EE4 * LOOKUP 00EE4 * ------------------------------ 00EE4 00EE4 * SEARCH (CURRENT) VOCAB TABLE FOR A ZWORD, POINTER TO ZWORD IN A0 00EE4 * RETURN ZWORD'S TABLE ADDR (RELATIVIZED) IN D0.W, NULL IF NOT FOUND 00EE4 00EE4 48E7 4070 LOOKUP MOVEM.L D1/A1-A3,-(SP) 00EE8 G 2648 MOVE.L A0,A3 * SAVE POINTER TO GIVEN ZWORD HERE 00EEA G 246E FFD8 MOVE.L VOCBEG(A6),A2 * BEGINNING OF (CURRENT) VOCABULARY TABLE 00EEE 00EEE 4A6E FFDC TST.W VWORDS(A6) * EMPTY TABLE? 00EF2 6754 00F48 BEQ.S LKX14 * YES, RETURN ZERO 00EF4 4A6E FF6E TST.W VWSORT(A6) * SORTED TABLE? 00EF8 6616 00F10 BNE.S LKX2 * YES 00EFA 00EFA G 204A LKX1 MOVE.L A2,A0 * NO, MUST DO LINEAR SEARCH 00EFC G 224B MOVE.L A3,A1 00EFE 6100 0050 00F50 BSR VCOMP * COMPARE GIVEN WORD TO CURRENT WORD 00F02 673C 00F40 BEQ.S LKX12 * SAME, WE'VE FOUND IT 00F04 00F04 D4EE FFDE ADDA.W VWLEN(A6),A2 * NEXT TABLE ITEM 00F08 B5EE FFD4 CMPA.L VOCEND(A6),A2 * HAVE WE MOVED PAST END OF TABLE? 00F0C 63EC 00EFA BLS LKX1 * NO 00F0E 6038 00F48 BRA.S LKX14 * YES, WORD NOT FOUND, RETURN ZERO 00F10 00F10 *** SORTED TABLE 00F10 00F10 322E FF6C LKX2 MOVE.W VWBOFF(A6),D1 * INITIAL OFFSET FOR BINARY SEARCH 00F14 D4C1 ADDA.W D1,A2 * INITIAL POINTER INTO TABLE 00F16 94EE FFDE SUBA.W VWLEN(A6),A2 * AVOID FENCE-POST BUG, EXACT-POWER-OF-2 TABLE 00F1A 00F1A E241 LKX4 ASR.W #1,D1 * NEXT OFFSET WILL BE HALF OF PREVIOUS ONE 00F1C G 204A MOVE.L A2,A0 00F1E G 224B MOVE.L A3,A1 00F20 6100 002E 00F50 BSR VCOMP * COMPARE GIVEN WORD TO CURRENT WORD 00F24 6210 00F36 BHI.S LKX8 * GREATER, MOVE DOWN 00F26 6718 00F40 BEQ.S LKX12 * SAME, WE'VE FOUND IT 00F28 *** BCS.S LKX6 * (BLO) * LESS, MOVE UP 00F28 00F28 D4C1 LKX6 ADDA.W D1,A2 * TO MOVE UP, ADD OFFSET 00F2A B5EE FFD4 CMPA.L VOCEND(A6),A2 * HAVE WE MOVED PAST END OF TABLE? 00F2E 6308 00F38 BLS.S LKX10 * NO 00F30 G 246E FFD4 MOVE.L VOCEND(A6),A2 * YES, POINT TO END OF TABLE 00F34 6002 00F38 BRA.S LKX10 00F36 94C1 LKX8 SUBA.W D1,A2 * TO MOVE DOWN, JUST SUBTRACT OFFSET 00F38 00F38 B26E FFDE LKX10 CMP.W VWLEN(A6),D1 * IS OFFSET RESOLUTION AT LEAST ONE WORD? 00F3C 6CDC 00F1A BGE LKX4 * YES, CONTINUE LOOP 00F3E 6008 00F48 BRA.S LKX14 * NO, WORD NOT FOUND 00F40 00F40 *** DONE, WINNING VOCAB POINTER LEFT IN A2 00F40 00F40 200A LKX12 MOVE.L A2,D0 00F42 90AE FFA8 SUB.L BUFFER(A6),D0 * RELATIVIZE THE ZWORD'S VOCAB TABLE OFFSET 00F46 6002 00F4A BRA.S LKX16 00F48 00F48 7000 LKX14 MOVEQ #0,D0 * WORD NOT FOUND, RETURN ZERO 00F4A 4CDF 0E02 LKX16 MOVEM.L (SP)+,D1/A1-A3 00F4E 4E75 RTS 00F50 00F50 * ------------------------------ 00F50 * VCOMP 00F50 * ------------------------------ 00F50 00F50 * COMPARE GIVEN ZWORD (A1) TO CURRENT TABLE ZWORD (A0) 00F50 * RETURN WITH FLAGS 00F50 00F50 7005 VCOMP MOVEQ #ZCHARS-1,D0 * CHECK THREE WORDS 00F52 B109 VCPX1 CMPM.B (A1)+,(A0)+ 00F54 56C8 FFFC 00F52 DBNE D0,VCPX1 * TAKE BRANCH IF EQUAL 00F58 4E75 RTS 00F5A 00F5A * UNROLL THE LOOP (RUNS A BIT FASTER) 00F5A 00F5A ** CMPM.B (A1)+,(A0)+ * CHECK FIRST WORD 00F5A ** BNE.S VCPX2 * DIFFERENT, EXIT 00F5A ** CMPM.B (A1)+,(A0)+ 00F5A ** BNE.S VCPX2 00F5A 00F5A ** CMPM.B (A1)+,(A0)+ * CHECK SECOND WORD 00F5A ** BNE.S VCPX2 * DIFFERENT, EXIT 00F5A ** CMPM.B (A1)+,(A0)+ 00F5A ** BNE.S VCPX2 00F5A 00F5A ** IF EZIP THEN 00F5A ** CMPM.B (A1)+,(A0)+ * CHECK THIRD WORD 00F5A ** BNE.S VCPX2 * DIFFERENT, EXIT 00F5A ** CMPM.B (A1)+,(A0)+ 00F5A ** BNE.S VCPX2 00F5A ** ENDIF 00F5A 00F5A * VCPX2 RTS * OTHERWISE SAME, EXIT 00F5A 00F5A 00F5A * ------------------------------ 00F5A * TIMEOUT PRIMITIVES 00F5A * ------------------------------ 00F5A 00F5A * NOTE: THIS TIMEOUT IMPLEMENTATION USES A SIMPLE "BUSY LOOP" RATHER THAN 00F5A * A REAL CPU INTERRUPT. THIS IS OK FOR SOME MACHINES BUT WOULD NOT BE GOOD 00F5A * FOR MULTITASKING ONES. IF AN INTERRUPT IS USED, ONE PROBLEM TO THINK 00F5A * ABOUT: THE LOW-LEVEL INPUT FUNCTION (TTYIN) MUST BE CANCEL-ABLE WHEN THE 00F5A * TIMEOUT ABORT OCCURS. 00F5A * 00F5A * THE TIMEOUT COUNTDOWN MECHANISM HAS CHANGED A BIT; IT NOW FUNCTIONS ONLY 00F5A * WHEN THE BUSY LOOP IS RUNNING. IT'S SUSPENDED IF THE LOOP STOPS FOR 00F5A * MORE THAT 1/10 SEC (E.G. WHEN A DESK ACCESSORY IS UP, OR A MENU IS PULLED 00F5A * DOWN. OTHERWISE, A TIMEOUT COULD OCCUR IN THE BACKGROUND, AND A NOXIOUS 00F5A * EVENT COULD SPILL OUT THE MOMENT THE GAME IS SWITCHED BACK IN.) 00F5A * 00F5A * << WARNING: >> BE CAREFUL ABOUT REDUCING THE POLLING FREQUENCY, AS FOR 00F5A * MULTIFINDER. MUST LOOP AT LEAST EVERY 1/10 SEC FOR US TO WORK CORRECTLY. 00F5A 00F5A * ---------------------- 00F5A * TRESET, TNEXT 00F5A * ---------------------- 00F5A 00F5A * RESET THE TIMEOUT COUNTDOWN VARS 00F5A 00F5A 4A6E FF2E TRESET TST.W TWAIT(A6) * BUT ARE TIMOUTS IN EFFECT? 00F5E 6D0E 00F6E BLT.S TNEX1 * NO, EXIT 00F60 00F60 6100 149C 023FE BSR TIME60 00F64 2D40 FF28 MOVE.L D0,TCLOCK(A6) * INITIAL REFERENCE TIME (IN 60THS) 00F68 00F68 3D6E FF2E FF26 TNEXT MOVE.W TWAIT(A6),TCOUNT(A6) * TOTAL DELAY (IN 10THS) 00F6E 4E75 TNEX1 RTS 00F70 00F70 * ---------------------- 00F70 * TCHECK 00F70 * ---------------------- 00F70 00F70 * UPDATE THE TIMEOUT CLOCK & COUNTER, 00F70 * RETURN TIME REMAINING (ZERO IF NONE) & FLAGS 00F70 00F70 6100 148C 023FE TCHECK BSR TIME60 * CURRENT TIME (IN 60THS) 00F74 90AE FF28 SUB.L TCLOCK(A6),D0 * ELAPSED TIME, SINCE LAST CHECK 00F78 0C80 0000 000C CMPI.L #12,D0 00F7E 6C0A 00F8A BGE.S TCHX2 * ET >= 2/10, RESET CLOCK, DON'T TOUCH COUNTER 00F80 5D80 SUBQ.L #6,D0 00F82 6D0A 00F8E BLT.S TCHX3 * ET < 1/10, DO NOTHING 00F84 00F84 536E FF26 SUBQ.W #1,TCOUNT(A6) * 1/10 <= ET < 2/10, UPDATE CLOCK & COUNTER 00F88 7006 MOVEQ #6,D0 00F8A D1AE FF28 TCHX2 ADD.L D0,TCLOCK(A6) 00F8E 00F8E 302E FF26 TCHX3 MOVE.W TCOUNT(A6),D0 * RETURN COUNTER/FLAGS 00F92 4E75 RTS 00F94 00F94 00F94 * --------------------------------------------------------------------------- 00F94 * I/O OPERATIONS -- OUTPUT 00F94 * --------------------------------------------------------------------------- 00F94 00F94 * ---------------------- 00F94 * OPUSL 00F94 * ---------------------- 00F94 00F94 * OPUSL (UPDATE STATUS LINE) 00F94 00F94 IF EZIP THEN 00F94 6000 0D4E 01CE4 OPUSL BRA OPERR * DEAD INSTRUCTION 00F98 ENDIF 00F98 00F98 * ---------------------- 00F98 * OPPRNC 00F98 * ---------------------- 00F98 00F98 * PRINTC (PRINT CHAR WHOSE ASCII VALUE IS GIVEN) 00F98 00F98 6000 0FEA 01F84 OPPRNC BRA PUTCHR * HANDLE IT 00F9C 00F9C * ---------------------- 00F9C * OPPRNN 00F9C * ---------------------- 00F9C 00F9C * PRINTN (PRINT A NUMBER, USING CURRENT CHARACTER OUTPUT FUNCTION) 00F9C 00F9C 3200 OPPRNN MOVE.W D0,D1 * NON-ZERO NUMBER? 00F9E 6608 00FA8 BNE.S PRNNX1 * YES 00FA0 103C 0030 MOVE.B #'0',D0 * ZERO, SPECIAL CASE 00FA4 6000 0FDE 01F84 BRA PUTCHR * PRINT A ZERO 00FA8 00FA8 6E0A 00FB4 PRNNX1 BGT.S PRNNX2 * POSITIVE? 00FAA 103C 002D MOVE.B #'-',D0 * NO, PRINT A MINUS SIGN 00FAE 6100 0FD4 01F84 BSR PUTCHR 00FB2 4441 NEG.W D1 * AND MAKE NUMBER POSITIVE 00FB4 00FB4 4242 PRNNX2 CLR.W D2 * COUNT OF DIGITS ON STACK 00FB6 600E 00FC6 BRA.S PRNNX4 * START WITH GREATER-THAN-10 TEST 00FB8 00FB8 48C1 PRNNX3 EXT.L D1 * CLEAR HIGH WORD FOR DIVISION 00FBA 82FC 000A DIVU #10,D1 * EXTRACT A DIGIT (THE REMAINDER) 00FBE 4841 SWAP D1 00FC0 3F01 MOVE.W D1,-(SP) * PUSH IT 00FC2 4841 SWAP D1 00FC4 5242 ADDQ.W #1,D2 * BUMP COUNT 00FC6 00FC6 0C41 000A PRNNX4 CMPI.W #10,D1 * ANY MORE DIGITS TO EXTRACT? 00FCA 6CEC 00FB8 BGE PRNNX3 * YES 00FCC 3001 MOVE.W D1,D0 * NO, POSITION LAST (FIRST) DIGIT 00FCE 6002 00FD2 BRA.S PRNNX6 00FD0 00FD0 301F PRNNX5 MOVE.W (SP)+,D0 * POP NEXT DIGIT 00FD2 0600 0030 PRNNX6 ADDI.B #'0',D0 * ASCIIZE IT 00FD6 6100 0FAC 01F84 BSR PUTCHR * PRINT NEXT DIGIT 00FDA 5342 SUBQ.W #1,D2 * ANY DIGITS LEFT ON STACK? 00FDC 6CF2 00FD0 BGE PRNNX5 * YES 00FDE 4E75 RTS 00FE0 00FE0 * ---------------------- 00FE0 * OPPRIN 00FE0 * ---------------------- 00FE0 00FE0 * PRINT (THE STRING POINTED TO) 00FE0 00FE0 7200 OPPRIN MOVEQ #0,D1 * ZERO HIGH WORD 00FE2 3200 MOVE.W D0,D1 * QUAD PTR 00FE4 202E FF1A MOVE.L QSOFF(A6),D0 * QUAD STRING OFFSET 00FE8 00FE8 6100 F568 00552 BSR BSPLTQ2 * SPLIT THE BLOCK AND OFFSET 00FEC 6000 0D00 01CEE BRA PUTSTR * PRINT THE STRING 00FF0 00FF0 * ---------------------- 00FF0 * OPPRNB 00FF0 * ---------------------- 00FF0 00FF0 * PRINTB (THE STRING POINTED TO) 00FF0 00FF0 6100 F548 0053A OPPRNB BSR BSPLTB * SPLIT THE BLOCK AND OFFSET (BYTE) 00FF4 6000 0CF8 01CEE BRA PUTSTR * PRINT THE STRING 00FF8 00FF8 * ---------------------- 00FF8 * OPPRND 00FF8 * ---------------------- 00FF8 00FF8 * PRINTD (PRINT OBJ'S SHORT DESCRIPTION) 00FF8 00FF8 6100 F674 0066E OPPRND BSR OBJLOC * FIND OBJECT'S LOCATION 00FFC D0FC 000C ADDA.W #PROP,A0 * PROPERTY TABLE POINTER (ZIP/EZIP) 01000 6100 F3F4 003F6 BSR GTAWRD * GET IT 01004 01004 5240 ADDQ.W #1,D0 * POINT TO SHORT DESCRIPTION STRING 01006 6100 F532 0053A BSR BSPLTB * SPLIT THE POINTER 0100A 6000 0CE2 01CEE BRA PUTSTR * AND PRINT THE STRING 0100E 0100E * ---------------------- 0100E * OPPRNI 0100E * ---------------------- 0100E 0100E * PRINTI (PRINT THE STRING FOLLOWING THIS INSTRUCTION) 0100E 0100E 302E FFBC OPPRNI MOVE.W ZPC1(A6),D0 * GET POINTER TO STRING 01012 322E FFBA MOVE.W ZPC2(A6),D1 01016 6100 0CD6 01CEE BSR PUTSTR * PRINT IT 0101A 3D40 FFBC MOVE.W D0,ZPC1(A6) * AND UPDATE ZPC 0101E 3D41 FFBA MOVE.W D1,ZPC2(A6) 01022 6000 1086 020AA BRA NEWZPC 01026 01026 * ---------------------- 01026 * OPPRNR 01026 * ---------------------- 01026 01026 * PRINTR (PRINTI FOLLOWED BY RTRUE) 01026 01026 61E6 0100E OPPRNR BSR OPPRNI * DO A PRINTI 01028 6100 0006 01030 BSR OPCRLF * A CRLF 0102C 6000 0742 01770 BRA OPRTRU * AND AN RTRUE 01030 01030 * ---------------------- 01030 * OPCRLF 01030 * ---------------------- 01030 01030 * CRLF (DO A NEWLINE) 01030 01030 6000 0F50 01F82 OPCRLF BRA PUTNEW * DO A NEWLINE 01034 01034 01034 * ------------------------------------------------------------------ 01034 * WINDOW-RELATED PRIMITIVES 01034 * ------------------------------------------------------------------ 01034 01034 * ---------------------- 01034 * CALCWP 01034 * ---------------------- 01034 01034 * GIVEN D0.W = WINDOW ID, RETURN A0 -> THE CORRESPONDING RECORD 01034 01034 4A40 CALCWP TST.W D0 * VALID WINDOW ID? 01036 6D14 0104C BLT.S CLWPX2 * NO/MAYBE 01038 0C40 0008 CMPI.W #MAXWIND,D0 0103C 6C0E 0104C BGE.S CLWPX2 * NO 0103E 0103E D040 ADD.W D0,D0 01040 D040 ADD.W D0,D0 * OFFSET x4 01042 41EE FEF4 LEA WBLOCKP(A6),A0 01046 G 2070 0000 MOVE.L 0(A0,D0.W),A0 * GET PTR TO NEW WINDOW RECORD 0104A 4E75 RTS 0104C 0104C CLWPX2 0104C *** CMPI.W #-3,D0 * ID = -3 NOW MEANS USE CURRENT WP 0104C *** BEQ.S CLWPX3 0104C *** BSR ZWARN 0104C 0104C G 206E FF14 CLWPX3 MOVE.L CURWP(A6),A0 * IF ERROR, JUST RETURN CURRENT WP 01050 4E75 RTS 01052 01052 * ---------------------- 01052 * WBOUNDS 01052 * ---------------------- 01052 01052 * SET POSITION/SIZE OF THE DISPLAY WINDOW, GIVEN D0.W = ALTERNATE ID 01052 * (TEMPORARY, e.g. FOR SCROLL/CLEAR -- DOESN'T CHANGE ANY OTHER WINDOW VARS ) 01052 01052 48E7 7000 WBOUNDS MOVEM.L D1-D3,-(SP) 01056 61DC 01034 BSR CALCWP 01058 3010 MOVE.W WYPOS(A0),D0 0105A 3228 0002 MOVE.W WXPOS(A0),D1 0105E 3428 0004 MOVE.W WYSIZE(A0),D2 01062 3628 0006 MOVE.W WXSIZE(A0),D3 01066 6100 11A8 02210 BSR NEWBOUNDS 0106A 4CDF 000E MOVEM.L (SP)+,D1-D3 0106E 4E75 RTS 01070 01070 * ---------------------- 01070 * TSTWFLG 01070 * ---------------------- 01070 01070 * TEST A BIT IN THE CURRENT WINDOW ATTRIBUTES WORD (SCROLL, SCRIPT, ETC), 01070 * GIVEN D0.W = BIT NUMBER, RETURN FLAGS [MAKE THIS A MACRO?] 01070 01070 G 206E FF14 TSTWFLG MOVE.L CURWP(A6),A0 01074 C068 001C AND.W WATTR(A0),D0 * INDICATED BIT ON? 01078 4E75 RTS 0107A 0107A * ------------------------------------------------------------------ 0107A * WINDOW OPERATIONS 0107A * ------------------------------------------------------------------ 0107A 0107A * ---------------------- 0107A * OPSCRN 0107A * ---------------------- 0107A 0107A * MAKE OUTPUT FALL INTO SPECIFIED WINDOW, D0.W = ID 0107A * (OPSCRN MAY BE CALLED INTERNALLY, BY OPSPLT) 0107A 0107A B06E FF18 OPSCRN CMP.W CURWIND(A6),D0 0107E 6700 0088 01108 BEQ SCRNX9 * SAME, EXIT 01082 01082 3400 MOVE.W D0,D2 * SAVE ARG 01084 *** BSR PUTLIN1 01084 6100 0F70 01FF6 BSR PUTLIN * EMPTY BUFFER IF NEEDED (KEEPING CURSIZ) 01088 01088 * SAVE CURRENT CURSOR POS IN CURRENT WINDOW REC 01088 01088 6100 121E 022A8 BSR GETCURS * GET CURSOR POS [1-ORIGIN] 0108C G 226E FF14 MOVE.L CURWP(A6),A1 01090 3340 0008 MOVE.W D0,WYCURS(A1) * AND STORE IT 01094 3341 000A MOVE.W D1,WXCURS(A1) 01098 01098 * BUFFER "FULLNESS" INFO NOW /IS/ PRESERVED ACROSS WINDOWS 01098 01098 G 246E FF54 MOVE.L DQUE(A6),A2 0109C 336A 000E 0020 MOVE.W CURSIZ(A2),WCSIZ(A1) * SAVE CURRENT BUFFER "FULLNESS" 010A2 010A2 * SWITCH WINDOWS (ALL OTHER PARAMS SHOULD BE VALID!) 010A2 010A2 3D42 FF18 MOVE.W D2,CURWIND(A6) * STORE NEW WINDOW ID 010A6 3002 MOVE.W D2,D0 010A8 618A 01034 BSR CALCWP 010AA 2D48 FF14 MOVE.L A0,CURWP(A6) * AND NEW RECORD POINTER 010AE G 2248 MOVE.L A0,A1 010B0 010B0 * SET UP NEW BUFFER "FULLNESS" INFO ["BUFSIZ" IS SET ELSEWHERE] 010B0 010B0 3569 0020 000E MOVE.W WCSIZ(A1),CURSIZ(A2) 010B6 010B6 * SET UP NEW WINDOW POS/SIZE, CURSOR POS, ETC 010B6 010B6 3029 000C MOVE.W WLMARG(A1),D0 010BA 3229 000E MOVE.W WRMARG(A1),D1 010BE 6100 1242 02302 BSR SETMARG 010C2 010C2 3011 MOVE.W WYPOS(A1),D0 010C4 3229 0002 MOVE.W WXPOS(A1),D1 010C8 3429 0004 MOVE.W WYSIZE(A1),D2 010CC 3629 0006 MOVE.W WXSIZE(A1),D3 010D0 6100 10FA 021CC BSR SETBOUNDS * [MUST CALL /AFTER/ SETMARG] 010D4 010D4 3029 0008 MOVE.W WYCURS(A1),D0 * 1-ORIGIN 010D8 3229 000A MOVE.W WXCURS(A1),D1 010DC 6100 1190 0226E BSR SETCURS * [MUST CALL /AFTER/ SETBOUNDS] 010E0 010E0 3029 0018 MOVE.W WFONTID(A1),D0 010E4 *** MOVE.W WFONTXY(A1),D1 * [NOT HANDLED] 010E4 6100 11DC 022C2 BSR SETFONT 010E8 010E8 3029 0014 MOVE.W WHLIGHT(A1),D0 010EC 6100 11EA 022D8 BSR SETHL 010F0 3029 001C MOVE.W WATTR(A1),D0 010F4 6100 11DC 022D2 BSR SETATTR 010F8 010F8 3029 0016 MOVE.W WCOLOR(A1),D0 010FC 3200 MOVE.W D0,D1 010FE 0240 00FF ANDI.W #$00FF,D0 * FORE 01102 E049 LSR.W #8,D1 * BACK 01104 6100 1220 02326 BSR MDCOLOR * UPDATE SCREEN COLORS 01108 01108 4E75 SCRNX9 RTS 0110A 0110A * ---------------------- 0110A * OPSPLT 0110A * ---------------------- 0110A 0110A * SPLIT THE SCREEN BETWEEN THE FIRST TWO WINDOWS (FOR BACKWARD COMPATIBILITY) 0110A * GIVEN D0 = LINES IN WINDOW 1 (UPPER) 0110A 0110A 3400 OPSPLT MOVE.W D0,D2 * SAVE SPLIT COUNT HERE 0110C 6100 0EE0 01FEE BSR PUTLIN1 * EMPTY (&ZERO) BUFFER IF NEEDED 01110 01110 * CHECK FOR VALID ARG 01110 01110 6100 1088 0219A BSR MAXSCRN * GET TOTAL ROWS 01114 B440 CMP.W D0,D2 01116 6F02 0111A BLE.S SPLTX1 01118 3400 MOVE.W D0,D2 * CAN'T HAVE MORE THAN FULL SCREEN 0111A *** BSR ZWARN 0111A 0111A * READ CURRENT CURSOR POS INTO CURRENT WINDOW REC (ALL OTHER PARAMS SHOULD BE 0111A * VALID!) (THIS /NOT/ DONE IN OPSCRN, IF CURRENT WINDOW IS W0) 0111A 0111A 6100 118C 022A8 SPLTX1 BSR GETCURS * GET Wx CURSOR POS [1-ORIGIN] 0111E G 226E FF14 MOVE.L CURWP(A6),A1 01122 3340 0008 MOVE.W D0,WYCURS(A1) * AND STORE IT 01126 3341 000A MOVE.W D1,WXCURS(A1) 0112A 0112A 3F02 MOVE.W D2,-(SP) * PROTECT REG(S) ACROSS OPx CALL 0112C 7000 MOVEQ #0,D0 * MAKE SURE WE'RE IN W0 0112E 6100 FF4A 0107A BSR OPSCRN 01132 341F MOVE.W (SP)+,D2 01134 01134 * GET RECORD POINTERS FOR FIRST TWO WINDOWS 01134 01134 G 246E FF14 MOVE.L CURWP(A6),A2 * WINDOW 0 01138 7001 MOVEQ #1,D0 0113A 6100 FEF8 01034 BSR CALCWP 0113E G 2248 MOVE.L A0,A1 * WINDOW 1 01140 01140 * SET NEW POSITIONS/SIZES 01140 01140 303C 0001 MOVE.W #1,D0 01144 3280 MOVE.W D0,WYPOS(A1) 01146 3342 0004 MOVE.W D2,WYSIZE(A1) 0114A 3340 0008 MOVE.W D0,WYCURS(A1) * "HOME THE W1 CURSOR" 0114E 3340 000A MOVE.W D0,WXCURS(A1) 01152 01152 D042 ADD.W D2,D0 01154 3212 MOVE.W WYPOS(A2),D1 * OLD W0 POSITION 01156 3480 MOVE.W D0,WYPOS(A2) 01158 9240 SUB.W D0,D1 0115A D26A 0004 ADD.W WYSIZE(A2),D1 * "ADJUST SIZE SO W0 BOTTOM DOESN'T MOVE" 0115E 6C02 01162 BGE.S SPLTX2 01160 7200 MOVEQ #0,D1 01162 3541 0004 SPLTX2 MOVE.W D1,WYSIZE(A2) 01166 01166 *** MOVE.W D2,D0 01166 *** BSR SETSPLT * [FOR BACKWARD COMPATIBILITY] 01166 01166 3012 MOVE.W WYPOS(A2),D0 01168 322A 0002 MOVE.W WXPOS(A2),D1 0116C 342A 0004 MOVE.W WYSIZE(A2),D2 01170 362A 0006 MOVE.W WXSIZE(A2),D3 01174 6100 109A 02210 BSR NEWBOUNDS * ADJUST BOUNDS, /DON'T/ ADJUST CURSOR 01178 01178 6100 112E 022A8 BSR GETCURS * GET NEW >>RELATIVE<< W0 CURSOR POS 0117C 3540 0008 MOVE.W D0,WYCURS(A2) * AND STORE IT 01180 3541 000A MOVE.W D1,WXCURS(A2) 01184 6100 10E8 0226E BSR SETCURS * FORCE IT INBOUNDS, IF NEEDED 01188 4E75 SPLTX5 RTS 0118A 0118A * ---------------------- 0118A * OPWPOS 0118A * ---------------------- 0118A 0118A 3600 OPWPOS MOVE.W D0,D3 * ID 0118C 6100 FEA6 01034 BSR CALCWP 01190 G 2648 MOVE.L A0,A3 01192 01192 * CHECK FOR VALID POSITION (SIZE NOT TAKEN INTO ACCOUNT HERE) 01192 01192 G 206E FFA8 MOVE.L BUFFER(A6),A0 01196 B268 0024 CMP.W PVWRD(A0),D1 0119A 6206 011A2 BHI.S WPOSX1 * OUT OF BOUNDS 0119C B468 0022 CMP.W PHWRD(A0),D2 011A0 6308 011AA BLS.S WPOSX2 * OK 011A2 000B8 DATA 000B8 4261642057494E MSGWPS DC.B 'Bad WINPOS',0 011A2 CODE 011A2 41ED 00B8 WPOSX1 LEA MSGWPS,A0 011A6 6100 15A0 02748 BSR ZWARN * SHOW A WARNING 011AA 011AA 3681 WPOSX2 MOVE.W D1,WYPOS(A3) * STORE NEW COORDS (1-ORIGIN) 011AC 3742 0002 MOVE.W D2,WXPOS(A3) 011B0 B66E FF18 CMP.W CURWIND(A6),D3 * THIS THE CURRENT ACTIVE WINDOW? 011B4 6610 011C6 BNE.S WPOSX9 * NO 011B6 011B6 3001 MOVE.W D1,D0 * YES, UPDATE SCREEN 011B8 3202 MOVE.W D2,D1 011BA 342B 0004 MOVE.W WYSIZE(A3),D2 011BE 362B 0006 MOVE.W WXSIZE(A3),D3 011C2 6100 1008 021CC BSR SETBOUNDS 011C6 4E75 WPOSX9 RTS 011C8 011C8 * ---------------------- 011C8 * OPWSIZ 011C8 * ---------------------- 011C8 011C8 3600 OPWSIZ MOVE.W D0,D3 * ID 011CA 6100 FE68 01034 BSR CALCWP 011CE G 2648 MOVE.L A0,A3 011D0 011D0 3741 0004 MOVE.W D1,WYSIZE(A3) * STORE NEW SIZE 011D4 3742 0006 MOVE.W D2,WXSIZE(A3) 011D8 426B 001E CLR.W WLCNT(A3) * RESET THE [MORE] COUNTER [???] 011DC 011DC B66E FF18 CMP.W CURWIND(A6),D3 * THIS THE CURRENT ACTIVE WINDOW? 011E0 660E 011F0 BNE.S WSIZX3 * NO 011E2 011E2 3602 MOVE.W D2,D3 * YES, UPDATE SCREEN 011E4 3401 MOVE.W D1,D2 011E6 3013 MOVE.W WYPOS(A3),D0 011E8 322B 0002 MOVE.W WXPOS(A3),D1 011EC 6100 0FDE 021CC BSR SETBOUNDS 011F0 4E75 WSIZX3 RTS 011F2 011F2 * ---------------------- 011F2 * OPWATTR 011F2 * ---------------------- 011F2 011F2 0003 OPWATTR DC.W 3 * DEFAULT ARGBLK 011F4 0000 0000 0000 DC.W SKIP,SKIP,0 * DEFAULT OP = "MOVE" 011FA 011FA G 2248 MOVE.L A0,A1 011FC 3029 0002 MOVE.W ARG1(A1),D0 * WINDOW ID 01200 6100 FE32 01034 BSR CALCWP 01204 G 2448 MOVE.L A0,A2 01206 01206 3229 0004 MOVE.W ARG2(A1),D1 * ARG BITS 0120A 302A 001C MOVE.W WATTR(A2),D0 * CURRENT BITS 0120E 0120E 3429 0006 MOVE.W ARG3(A1),D2 * BITWISE OP: 01212 670E 01222 BEQ.S WATTX1 * "MOVE" 01214 5342 SUBQ.W #1,D2 01216 670E 01226 BEQ.S WATTX2 * "SET" 01218 5342 SUBQ.W #1,D2 0121A 670E 0122A BEQ.S WATTX3 * "CLEAR" 0121C 5342 SUBQ.W #1,D2 0121E 670C 0122C BEQ.S WATTX4 * "COMP" 01220 *** BSR ZWARN 01220 6026 01248 BRA.S WATTX6 * NOT A VALID OP 01222 01222 3001 WATTX1 MOVE.W D1,D0 01224 6008 0122E BRA.S WATTX5 01226 8041 WATTX2 OR.W D1,D0 01228 6004 0122E BRA.S WATTX5 0122A C240 WATTX3 AND.W D0,D1 * FLIP ONLY THE GIVEN BITS THAT ARE "ON" 0122C B340 WATTX4 EOR.W D1,D0 * FLIP ALL GIVEN BITS 0122E 3540 001C WATTX5 MOVE.W D0,WATTR(A2) * STORE BITS 01232 01232 3200 MOVE.W D0,D1 01234 3029 0002 MOVE.W ARG1(A1),D0 * WINDOW ID 01238 B06E FF18 CMP.W CURWIND(A6),D0 * THIS THE CURRENT ACTIVE WINDOW? 0123C 660A 01248 BNE.S WATTX6 * NO 0123E 6100 0DAE 01FEE BSR PUTLIN1 * EMPTY(&ZERO) BUFFER IF NEEDED 01242 3001 MOVE.W D1,D0 01244 6100 108C 022D2 BSR SETATTR 01248 4E75 WATTX6 RTS 0124A 0124A * ---------------------- 0124A * OPCURS 0124A * ---------------------- 0124A 0124A * SET CURSOR TO ROW/COLUMN 0124A 0124A 4E71 OPCURS NOP * REQUEST AN ARGBLK 0124C 0C50 0002 CMPI.W #2,(A0) 01250 6E06 01258 BGT.S OPCSX1 01252 316E FF18 0006 MOVE.W CURWIND(A6),ARG3(A0) * USE CURRENT WINDOW 01258 01258 G 2248 OPCSX1 MOVE.L A0,A1 0125A 3029 0006 MOVE.W ARG3(A1),D0 * WINDOW ID 0125E 6100 FDD4 01034 BSR CALCWP 01262 G 2448 MOVE.L A0,A2 01264 01264 3029 0002 MOVE.W ARG1(A1),D0 * ROW 01268 3229 0004 MOVE.W ARG2(A1),D1 * COL 0126C 0126C 0C40 0001 CMPI.W #1,D0 * ROW: OUT OF BOUNDS? 01270 6C04 01276 BGE.S OPCSX2 01272 303C 0001 MOVE.W #1,D0 * YES, MOVE WITHIN BOUNDS 01276 B06A 0004 OPCSX2 CMP.W WYSIZE(A2),D0 0127A 6F04 01280 BLE.S OPCSX3 0127C 302A 0004 MOVE.W WYSIZE(A2),D0 01280 3540 0008 OPCSX3 MOVE.W D0,WYCURS(A2) 01284 01284 0C41 0001 CMPI.W #1,D1 * COL: OUT OF BOUNDS? 01288 6C04 0128E BGE.S OPCSX4 0128A 323C 0001 MOVE.W #1,D1 * YES, MOVE WITHIN BOUNDS 0128E B26A 0006 OPCSX4 CMP.W WXSIZE(A2),D1 01292 6F04 01298 BLE.S OPCSX5 01294 322A 0006 MOVE.W WXSIZE(A2),D1 01298 3541 000A OPCSX5 MOVE.W D1,WXCURS(A2) 0129C 0129C 3400 MOVE.W D0,D2 * PROTECT ARG 0129E 3029 0006 MOVE.W ARG3(A1),D0 012A2 B06E FF18 CMP.W CURWIND(A6),D0 * THIS THE CURRENT ACTIVE WINDOW? 012A6 660A 012B2 BNE.S OPCSX6 * NO 012A8 012A8 6100 0D44 01FEE BSR PUTLIN1 * EMPTY(&ZERO) BUFFER IF NEEDED 012AC 3002 MOVE.W D2,D0 012AE 6100 0FBE 0226E BSR SETCURS * D0 = ROW, D1 = COL 012B2 4E75 OPCSX6 RTS 012B4 012B4 * ---------------------- 012B4 * OPCURG 012B4 * ---------------------- 012B4 012B4 * GET CURSOR POSITION [1-ORIGIN] [ALWAYS CURRENT WINDOW] 012B4 012B4 OPCURG 012B4 * MOVE.W D0,-(SP) 012B4 * BSR PUTLIN * [DONE BY GETCURS] 012B4 * MOVE.W (SP)+,D0 012B4 6100 F0E0 00396 BSR RELABS * TABLE FOR RETURN VALUES 012B8 G 2248 MOVE.L A0,A1 012BA 6100 0FEC 022A8 BSR GETCURS 012BE G 2049 MOVE.L A1,A0 012C0 6100 F13C 003FE BSR PTAWRD * STORE ROW 012C4 G 2049 MOVE.L A1,A0 012C6 5488 ADDQ.L #2,A0 012C8 3001 MOVE.W D1,D0 012CA 6000 F132 003FE BRA PTAWRD * STORE COLUMN 012CE 012CE * ---------------------- 012CE * OPWGET 012CE * ---------------------- 012CE 012CE 0003 OPWGET DC.W 3 * DEFAULT ARGBLK 012D0 0000 0000 0000 DC.W SKIP,SKIP,0 * DEFAULT OFFSET = 0 012D6 012D6 G 2448 MOVE.L A0,A2 * A2 -> ARGBLK 012D8 302A 0002 MOVE.W ARG1(A2),D0 012DC B06E FF18 CMP.W CURWIND(A6),D0 * FROM THE CURRENT WINDOW? 012E0 6612 012F4 BNE.S OPWGX1 * NO 012E2 012E2 6100 0FC4 022A8 BSR GETCURS * YES, FIRST GET CURSOR POS 012E6 G 206E FF14 MOVE.L CURWP(A6),A0 012EA 3140 0008 MOVE.W D0,WYCURS(A0) * AND STORE IT 012EE 3141 000A MOVE.W D1,WXCURS(A0) 012F2 6004 012F8 BRA.S OPWGX2 012F4 012F4 6100 FD3E 01034 OPWGX1 BSR CALCWP 012F8 G 2248 OPWGX2 MOVE.L A0,A1 * A1 -> WREC 012FA 302A 0006 MOVE.W ARG3(A2),D0 * OFFSET (IN WREC) 012FE 6D2A 0132A BLT.S OPWGX9 * EXIT 01300 7211 MOVEQ #WBLKLEN/2,D1 01302 9240 SUB.W D0,D1 * D1 = MAX #ITEMS (WORDS) TO COPY 01304 6F24 0132A BLE.S OPWGX9 * EXIT 01306 D040 ADD.W D0,D0 01308 D2C0 ADDA.W D0,A1 0130A 0130A 302A 0004 MOVE.W ARG2(A2),D0 0130E 6100 F086 00396 BSR RELABS * A0 -> LTABLE 01312 6100 F0E2 003F6 BSR GTAWRD * (ADVANCE PTR) 01316 3400 MOVE.W D0,D2 * D2 = MAX TABLE LEN (WORDS) 01318 6F10 0132A BLE.S OPWGX9 * EXIT 0131A B441 CMP.W D1,D2 0131C 6F02 01320 BLE.S OPWGX4 * USE SMALLER OF TWO 0131E 3401 MOVE.W D1,D2 01320 01320 3019 OPWGX4 MOVE.W (A1)+,D0 01322 6100 F0DA 003FE BSR PTAWRD * COPY A WORD, ADVANCE PTR 01326 5342 SUBQ.W #1,D2 01328 6EF6 01320 BGT.S OPWGX4 * LOOP 0132A 4E75 OPWGX9 RTS 0132C 0132C * ---------------------- 0132C * OPWPUT 0132C * ---------------------- 0132C 0132C 0003 OPWPUT DC.W 3 * DEFAULT ARGBLK 0132E 0000 0000 0000 DC.W SKIP,SKIP,0 * DEFAULT OFFSET = 0 01334 01334 G 2448 MOVE.L A0,A2 * A2 -> ARGBLK 01336 302A 0002 MOVE.W ARG1(A2),D0 0133A 6100 FCF8 01034 BSR CALCWP 0133E G 2648 MOVE.L A0,A3 * A3 -> WREC 01340 01340 7022 MOVEQ #WBLKLEN,D0 01342 G 9EC0 SUB.W D0,SP * MAKE SPACE FOR A TEMPORARY WREC 01344 G 224F MOVE.L SP,A1 01346 32D8 OPWPX2 MOVE.W (A0)+,(A1)+ * COPY CONTENTS 01348 5540 SUBQ.W #2,D0 0134A 66FA 01346 BNE.S OPWPX2 0134C G 224F MOVE.L SP,A1 * A1 -> TEMPORARY WREC 0134E 0134E 302A 0006 MOVE.W ARG3(A2),D0 * OFFSET (IN WREC) 01352 6D38 0138C BLT.S OPWPX9 * EXIT 01354 7211 MOVEQ #WBLKLEN/2,D1 01356 9240 SUB.W D0,D1 * D1 = MAX #ITEMS (WORDS) TO COPY 01358 6F32 0138C BLE.S OPWPX9 * EXIT 0135A D040 ADD.W D0,D0 0135C D2C0 ADDA.W D0,A1 0135E 0135E 302A 0004 MOVE.W ARG2(A2),D0 01362 6100 F032 00396 BSR RELABS * A0 -> LTABLE 01366 6100 F08E 003F6 BSR GTAWRD * (ADVANCE PTR) 0136A 3400 MOVE.W D0,D2 * D2 = MAX TABLE LEN (WORDS) 0136C 6F1E 0138C BLE.S OPWPX9 * EXIT 0136E B441 CMP.W D1,D2 01370 6F02 01374 BLE.S OPWPX4 * USE SMALLER OF TWO 01372 3401 MOVE.W D1,D2 01374 01374 6100 F080 003F6 OPWPX4 BSR GTAWRD * PICKUP A WORD, ADVANCE PTR 01378 32C0 MOVE.W D0,(A1)+ * COPY TO (TEMPORARY) WREC 0137A 5342 SUBQ.W #1,D2 0137C 6EF6 01374 BGT.S OPWPX4 * LOOP 0137E 0137E * FINALLY, UPDATE THE ACTUAL WREC 0137E * THE CR FUNCTION/COUNT SLOTS ARE THE ONLY "LEGALLY WRITABLE" ONES 0137E 0137E G 224F MOVE.L SP,A1 * A1 -> TEMPORARY WREC 01380 3769 0010 0010 MOVE.W WCRINT(A1),WCRINT(A3) 01386 3769 0012 0012 MOVE.W WCRCNT(A1),WCRCNT(A3) 0138C 0138C 7022 OPWPX9 MOVEQ #WBLKLEN,D0 0138E G DEC0 ADD.W D0,SP * CLEANUP STACK 01390 4E75 RTS 01392 01392 * ---------------------- 01392 * OPSCROLL 01392 * ---------------------- 01392 01392 OPSCROLL 01392 0002 DC.W 2 * DEFAULT ARGBLK 01394 0000 0001 DC.W SKIP,1 * DEFAULT DISTANCE = 1 UP 01398 01398 G 2448 MOVE.L A0,A2 * A2 -> ARGBLK 0139A 6100 0C5A 01FF6 BSR PUTLIN * FIRST EMPTY BUFFER, IF NEEDED 0139E 342E FF18 MOVE.W CURWIND(A6),D2 * SAVE ORIGINAL VALUE 013A2 302A 0002 MOVE.W ARG1(A2),D0 013A6 B440 CMP.W D0,D2 * SAME? 013A8 670E 013B8 BEQ.S ROLLX1 * YES, JUST DO THE SCROLL 013AA 013AA 6100 FCA6 01052 BSR WBOUNDS * OTHERWISE, TEMPORARILY RESET WINDOW BOUNDS 013AE 6100 0008 013B8 BSR ROLLX1 * >> CALL AS SUBR << 013B2 3002 MOVE.W D2,D0 * THEN RESTORE THEM 013B4 6000 FC9C 01052 BRA WBOUNDS * AND EXIT 013B8 013B8 302A 0004 ROLLX1 MOVE.W ARG2(A2),D0 013BC 6100 0F24 022E2 BSR MDSCROLL 013C0 4E75 RTS 013C2 013C2 * ---------------------- 013C2 * OPCLEAR 013C2 * ---------------------- 013C2 013C2 * CLEAR A WINDOW, OR ENTIRE SCREEN 013C2 013C2 3400 OPCLEAR MOVE.W D0,D2 013C4 6100 0C28 01FEE BSR PUTLIN1 * EMPTY & ZERO BUFFER, IF NEEDED 013C8 4A42 TST.W D2 * ID NEGATIVE? 013CA 6D22 013EE BLT.S OCLRX6 * YES, HANDLE SPECIALLY 013CC 013CC 362E FF18 MOVE.W CURWIND(A6),D3 013D0 B443 CMP.W D3,D2 * IN CURRENT WINDOW? 013D2 6710 013E4 BEQ.S OCLRX2 * YES 013D4 013D4 3002 MOVE.W D2,D0 013D6 6100 FC7A 01052 BSR WBOUNDS * OTHERWISE, TEMPORARILY RESET WINDOW BOUNDS 013DA 6100 0008 013E4 BSR OCLRX2 * >> CALL AS SUBR << 013DE 3003 MOVE.W D3,D0 * RESTORE CURRENT BOUNDS 013E0 6000 FC70 01052 BRA WBOUNDS * AND EXIT 013E4 013E4 7000 OCLRX2 MOVEQ #0,D0 013E6 6100 0F0A 022F2 BSR MDCLEAR * CLEAR TARGET WINDOW (VISIBLY) 013EA * MOVE.W D2,xx 013EA 6000 001E 0140A BRA OCLRX8 * HOME CURSOR 013EE 013EE * HANDLE NEGATIVE ARGS: 013EE 013EE 3D7C 0001 FEF0 OCLRX6 MOVE.W #1,INLAST(A6) * "DON'T PAUSE UPON EXIT IF SCREEN CLEARED" 013F4 013F4 70FF MOVEQ #-1,D0 013F6 6100 0EFA 022F2 BSR MDCLEAR * CLEAR ENTIRE SCREEN 013FA 0C42 FFFF CMPI.W #-1,D2 * SPLIT REQUESTED? 013FE 6606 01406 BNE.S OCLRX7 * NO 01400 01400 * MOVE.L XX,-(SP) * PROTECT REG(S) ACROSS OPx CALL 01400 7000 MOVEQ #0,D0 01402 6100 FD06 0110A BSR OPSPLT * DO A SPLIT-0 01406 * MOVE.L (SP)+,XX 01406 01406 342E FF18 OCLRX7 MOVE.W CURWIND(A6),D2 0140A 0140A * HOME CURSOR AND RESET LINE COUNT, D2.W = TARGET WINDOW 0140A 0140A 3002 OCLRX8 MOVE.W D2,D0 0140C 6100 FC26 01034 BSR CALCWP * GET TARGET WREC 01410 7001 MOVEQ #1,D0 01412 3140 0008 MOVE.W D0,WYCURS(A0) * HOME CURSOR IN TARGET WINDOW 01416 7201 MOVEQ #1,D1 01418 D268 000C ADD.W WLMARG(A0),D1 0141C 3141 000A MOVE.W D1,WXCURS(A0) 01420 4268 001E CLR.W WLCNT(A0) * RESET THE 'MORE' COUNTER 01424 01424 B46E FF18 CMP.W CURWIND(A6),D2 * IN CURRENT WINDOW? 01428 6604 0142E BNE.S OCLRX9 0142A 6100 0E42 0226E BSR SETCURS * YES: UPDATE SCREEN CURSOR 0142E 4E75 OCLRX9 RTS 01430 01430 * ---------------------- 01430 * OPERASE 01430 * ---------------------- 01430 01430 * ERASE (CURRENT LINE, STARTING AT CURSOR) 01430 01430 5340 OPERASE SUBQ.W #1,D0 01432 660C 01440 BNE.S ERAX1 * "IGNORE ARG IF NOT 1" 01434 6100 0BC0 01FF6 BSR PUTLIN * EMPTY BUFFER, IF NEEDED 01438 70FF MOVEQ #-1,D0 * FROM CURSOR ... 0143A 72FF MOVEQ #-1,D1 * ... TO EOL 0143C 6100 0ED6 02314 BSR MDERASE 01440 4E75 ERAX1 RTS 01442 01442 * ---------------------- 01442 * OPHLIGHT [WAS OPATTR] 01442 * ---------------------- 01442 01442 * HIGHLIGHT (SET DISPLAY MODE FOR SUBSEQUENT OUTPUT) 01442 * D0.W = 0 PLAIN, 1 INVERSE, 2 BOLD, 4 ITALIC (8 MONO) 01442 01442 OPHLIGHT 01442 G 206E FF14 MOVE.L CURWP(A6),A0 * [ALWAYS IN CURRENT WINDOW] 01446 3140 0014 MOVE.W D0,WHLIGHT(A0) * STORE NEW MODE 0144A 0144A 3200 MOVE.W D0,D1 0144C 6100 0BA8 01FF6 BSR PUTLIN * EMPTY THE LINE BUFFER (IN OLD MODE) 01450 3001 MOVE.W D1,D0 01452 6000 0E84 022D8 BRA SETHL 01456 *** BRA MDATTR 01456 01456 * ---------------------- 01456 * OPFONT 01456 * ---------------------- 01456 01456 4E71 OPFONT NOP * REQUEST AN ARGBLK 01458 G 2248 MOVE.L A0,A1 0145A 0C51 0001 CMPI.W #1,(A1) * WINDOW ID SUPPLIED? 0145E 6E06 01466 BGT.S FONTX2 01460 G 206E FF14 MOVE.L CURWP(A6),A0 * NO, USE DEFAULT 01464 6008 0146E BRA.S FONTX4 01466 01466 3029 0004 FONTX2 MOVE.W ARG2(A1),D0 * YES, GET PTR 0146A 6100 FBC8 01034 BSR CALCWP 0146E 0146E 3229 0002 FONTX4 MOVE.W ARG1(A1),D1 * NEW FONT ID 01472 3428 0018 MOVE.W WFONTID(A0),D2 * OLD FONT ID 01476 B242 CMP.W D2,D1 * >>> IS THE FONT REALLY CHANGING? <<< 01478 6714 0148E BEQ.S FONTX9 * NO, EXIT (WITHOUT EMPTYING BUFFER!) 0147A 3141 0018 MOVE.W D1,WFONTID(A0) * STORE NEW FONT ID 0147E 0147E G B1EE FF14 CMP.L CURWP(A6),A0 * WORKING WITH THE CURRENT WINDOW? 01482 660A 0148E BNE.S FONTX9 * NO, DONE 01484 01484 6100 0B70 01FF6 BSR PUTLIN * EMPTY THE LINE BUFFER (IN OLD FONT) 01488 3001 MOVE.W D1,D0 0148A 6100 0E36 022C2 BSR SETFONT * UPDATE SCREEN FONT 0148E 0148E 3002 FONTX9 MOVE.W D2,D0 01490 6000 F04E 004E0 BRA PUTVAL * RETURN OLD FONT ID 01494 01494 * ---------------------- 01494 * OPCOLOR 01494 * ---------------------- 01494 01494 4E71 OPCOLOR NOP * REQUEST AN ARGBLK 01496 G 2248 MOVE.L A0,A1 01498 0C51 0002 CMPI.W #2,(A1) * WINDOW ID SUPPLIED? 0149C 6E06 014A4 BGT.S COLRX2 0149E G 206E FF14 MOVE.L CURWP(A6),A0 * NO, USE DEFAULT 014A2 6008 014AC BRA.S COLRX4 014A4 014A4 3029 0006 COLRX2 MOVE.W ARG3(A1),D0 * YES, GET PTR 014A8 6100 FB8A 01034 BSR CALCWP 014AC 014AC 1229 0005 COLRX4 MOVE.B ARG2+1(A1),D1 * BACK 014B0 E149 LSL.W #8,D1 014B2 1229 0003 MOVE.B ARG1+1(A1),D1 * FORE 014B6 3141 0016 MOVE.W D1,WCOLOR(A0) * STORE NEW COLORS 014BA 014BA G B1EE FF14 CMP.L CURWP(A6),A0 * WORKING WITH THE CURRENT WINDOW? 014BE 6610 014D0 BNE.S COLRX9 * NO, DONE 014C0 014C0 6100 0B34 01FF6 BSR PUTLIN * EMPTY THE LINE BUFFER (IN OLD FONT) 014C4 3029 0002 MOVE.W ARG1(A1),D0 * FORE 014C8 3229 0004 MOVE.W ARG2(A1),D1 * BACK 014CC 6100 0E58 02326 BSR MDCOLOR * UPDATE SCREEN COLORS 014D0 4E75 COLRX9 RTS 014D2 014D2 * ---------------------- 014D2 * OPMARG 014D2 * ---------------------- 014D2 014D2 * SET MARGINS 014D2 014D2 4E71 OPMARG NOP * REQUEST AN ARGBLK 014D4 G 2248 MOVE.L A0,A1 014D6 0C51 0002 CMPI.W #2,(A1) * WINDOW ID SUPPLIED? 014DA 6E06 014E2 BGT.S MARGX2 014DC G 206E FF14 MOVE.L CURWP(A6),A0 * NO, USE DEFAULT 014E0 6008 014EA BRA.S MARGX4 014E2 014E2 3029 0006 MARGX2 MOVE.W ARG3(A1),D0 * YES, GET PTR 014E6 6100 FB4C 01034 BSR CALCWP 014EA 014EA G 2448 MARGX4 MOVE.L A0,A2 014EC 3429 0002 MOVE.W ARG1(A1),D2 014F0 3542 000C MOVE.W D2,WLMARG(A2) 014F4 3629 0004 MOVE.W ARG2(A1),D3 014F8 3543 000E MOVE.W D3,WRMARG(A2) 014FC 014FC 7201 MOVEQ #1,D1 014FE D242 ADD.W D2,D1 01500 3541 000A MOVE.W D1,WXCURS(A2) * MOVE CURSOR TO LEFT MARGIN 01504 01504 G B5EE FF14 CMP.L CURWP(A6),A2 * WORKING WITH THE CURRENT WINDOW? 01508 6612 0151C BNE.S MARGX9 * NO 0150A 0150A *** NOTE: CR-INTERRUPT ROUTINES COMMONLY CALL OPMARG (TO FLOW AROUND PICTURES), 0150A *** IN WHICH CASE WE SHOULD /NOT/ EMPTY THE BUFFER, BUT ALLOW IT TO WRAP. 0150A *** [MOREOVER, PUTLIN/QUECHR IS /NOT/ RE-ENTRANT -- GARBAGE IS DISPLAYED] 0150A *** IN OTHER CASES, THE GAME SHOULD ITSELF ENSURE THAT THE BUFFER IS EMPTY. 0150A *** BSR PUTLIN * EMPTY THE LINE BUFFER 0150A 3002 MOVE.W D2,D0 0150C 3203 MOVE.W D3,D1 0150E 6100 0DF2 02302 BSR SETMARG * UPDATE DISPLAY VARS 01512 01512 70FF MOVEQ #-1,D0 * [DON'T CHANGE ROW] 01514 7201 MOVEQ #1,D1 01516 D242 ADD.W D2,D1 01518 6100 0D54 0226E BSR SETCURS * MOVE CURSOR TO LEFT MARGIN 0151C 4E75 MARGX9 RTS 0151E 0151E * --------------------------------------------------------------------------- 0151E * MORE I/O OPERATIONS 0151E * --------------------------------------------------------------------------- 0151E 0151E * ---------------------- 0151E * OPBUFO 0151E * ---------------------- 0151E 0151E * SET BUFFERING OF OUTPUT ACCORDING TO INT 0151E 0151E OPBUFO 0151E *** RTS * [SEMI-OBSOLETE OP; SLOWS DRAWING ON MAC] 0151E 0151E 5340 SUBQ.W #1,D0 * NORMAL BUFFERING? 01520 6706 01528 BEQ.S BUFOX1 * YES 01522 5240 ADDQ.W #1,D0 * NO BUFFERING, OUTPUT DIRECTLY TO SCREEN? 01524 670A 01530 BEQ.S BUFOX2 * YES 01526 6018 01540 BRA.S BUFOX3 * ELSE DO NOTHING 01528 01528 3D7C 0001 FF5A BUFOX1 MOVE.W #1,VOBUFF(A6) * TURN ON BUFFERING 0152E 6010 01540 BRA.S BUFOX3 01530 BUFOX2 01530 000C3 DATA 000C3 4255464F555420 MSGBFO DC.B 'BUFOUT off',0 01530 CODE 01530 41ED 00C3 LEA MSGBFO,A0 01534 6100 1212 02748 BSR ZWARN * SHOW A WARNING 01538 01538 6100 0ABC 01FF6 BSR PUTLIN * FIRST EMPTY THE CURRENT OUTPUT BUFFER 0153C 426E FF5A CLR.W VOBUFF(A6) * THEN TURN OFF BUFFERING 01540 4E75 BUFOX3 RTS 01542 01542 01542 * ---------------------- 01542 * TABCHR 01542 * ---------------------- 01542 01542 * TABLE OUTPUT FUNCTION --- PUT THE CHAR IN D0 IN THE DEFINED TABLE 01542 01542 G 206E FF48 TABCHR MOVE.L TABPTR(A6),A0 * CURRENT POSITION IN TABLE 01546 10C0 MOVE.B D0,(A0)+ * STORE CHAR 01548 2D48 FF48 MOVE.L A0,TABPTR(A6) * UPDATE POINTER 0154C 4E75 RTS 0154E 0154E * ---------------------- 0154E * OPDIRO 0154E * ---------------------- 0154E 0154E * REDIRECT OUTPUT (TABLE OR NORMAL) ACCORDING TO INT 0154E 0154E 4E71 OPDIRO NOP * TELL CALLER TO USE ARGBLK 01550 3028 0002 MOVE.W ARG1(A0),D0 * VIRTUAL OUTPUT DEVICE -- NEGATIVE? 01554 6D0E 01564 BLT.S DIRX0 * YES, MEANS TURN IT OFF 01556 01556 5340 SUBQ.W #1,D0 * TURN ON SCREEN? 01558 6718 01572 BEQ.S DIRX1 * YES 0155A 5340 SUBQ.W #1,D0 * TURN ON PRINTER? 0155C 6726 01584 BEQ.S DIRX3 * YES 0155E 5340 SUBQ.W #1,D0 * TURN ON TABLE? 01560 675C 015BE BEQ.S DIRX5 * YES 01562 4E75 RTS * UNKNOWN DEVICE, IGNORE REQUEST 01564 01564 5240 DIRX0 ADDQ.W #1,D0 * TURN OFF SCREEN? 01566 6712 0157A BEQ.S DIRX2 * YES 01568 5240 ADDQ.W #1,D0 * TURN OFF PRINTER? 0156A 6736 015A2 BEQ.S DIRX4 * YES 0156C 5240 ADDQ.W #1,D0 * TURN OFF TABLE? 0156E 676A 015DA BEQ.S DIRX6 * YES 01570 4E75 RTS * UNKNOWN DEVICE, IGNORE REQUEST 01572 01572 *** TURN SCREEN OUTPUT ON, OFF 01572 01572 3D7C 0001 FF68 DIRX1 MOVE.W #1,VOCONS(A6) 01578 607A 015F4 BRA.S DIRX7 0157A 6100 0A7A 01FF6 DIRX2 BSR PUTLIN * BUT FIRST DUMP BUFFER, IF NEEDED 0157E 426E FF68 CLR.W VOCONS(A6) 01582 6070 015F4 BRA.S DIRX7 01584 01584 *** TURN SCRIPTING OUTPUT ON, OFF 01584 01584 4A6E FF66 DIRX3 TST.W VOPRNT(A6) * ALREADY ON? 01588 666A 015F4 BNE.S DIRX7 * YES 0158A 0158A 303C 0001 MOVE.W #1,D0 0158E 3D40 FF66 MOVE.W D0,VOPRNT(A6) 01592 6100 11F4 02788 BSR SCRINIT * OPEN SCRIPT CHANNEL (IF NEEDED) 01596 01596 G 206E FFA8 MOVE.L BUFFER(A6),A0 0159A 08E8 0000 0011 BSET #0,PFLAGS+1(A0) * SET PRELOAD FLAG FOR GAME'S USE 015A0 6052 015F4 BRA.S DIRX7 015A2 015A2 4A6E FF66 DIRX4 TST.W VOPRNT(A6) * ALREADY OFF? 015A6 674C 015F4 BEQ.S DIRX7 * YES 015A8 015A8 7000 MOVEQ #0,D0 015AA 3D40 FF66 MOVE.W D0,VOPRNT(A6) 015AE 6100 11D8 02788 BSR SCRINIT * CLOSE SCRIPT CHANNEL (IF NEEDED) 015B2 015B2 G 206E FFA8 MOVE.L BUFFER(A6),A0 015B6 08A8 0000 0011 BCLR #0,PFLAGS+1(A0) * CLEAR THE PRELOAD FLAG 015BC 6036 015F4 BRA.S DIRX7 015BE 015BE *** TURN TABLE ON, OFF 015BE 015BE 7000 DIRX5 MOVEQ #0,D0 015C0 3028 0004 MOVE.W ARG2(A0),D0 * GET RELATIVE TABLE POINTER 015C4 D0AE FFA8 ADD.L BUFFER(A6),D0 * ABSOLUTIZE 015C8 2D40 FF4C MOVE.L D0,TABOUT(A6) * REMEMBER START OF TABLE 015CC 015CC 5480 ADDQ.L #2,D0 * SKIP LENGTH SLOT 015CE 2D40 FF48 MOVE.L D0,TABPTR(A6) * FIRST CHAR WILL GO HERE 015D2 015D2 3D7C 0001 FF62 MOVE.W #1,VOTABL(A6) * SET TABLE-OUTPUT FLAG 015D8 601A 015F4 BRA.S DIRX7 015DA 015DA 4A6E FF62 DIRX6 TST.W VOTABL(A6) * MAKE SURE A TABLE DOES EXIST 015DE 6714 015F4 BEQ.S DIRX7 * NO TABLE, IGNORE REQUEST 015E0 426E FF62 CLR.W VOTABL(A6) * OK, TURN OFF TABLE-OUTPUT FLAG 015E4 015E4 G 206E FF4C MOVE.L TABOUT(A6),A0 * COMPUTE LENGTH OF CURRENT TABLE CONTENTS 015E8 202E FF48 MOVE.L TABPTR(A6),D0 015EC 9088 SUB.L A0,D0 015EE 5540 SUBQ.W #2,D0 * ADJUST FOR LENGTH SLOT 015F0 6100 EE0C 003FE BSR PTAWRD * AND STORE LENGTH IN LENGTH SLOT 015F4 015F4 4E75 DIRX7 RTS 015F6 015F6 * REDIRECT INPUT (NORMAL OR COMMAND FILE) ACCORDING TO INT 015F6 015F6 * ---------------------- 015F6 * OPDIRI 015F6 * ---------------------- 015F6 015F6 4E71 OPDIRI NOP * TELL CALLER TO USE ARGBLK 015F8 *** 0 MEANS KEYBOARD, 1 MEANS SPECIAL FILE -- NOT IMPLEMENTED 015F8 4E75 RTS 015FA 015FA * ---------------------- 015FA * OPSOUND 015FA * ---------------------- 015FA 015FA * MAKE A SOUND 015FA * ARG1 = ID: 1=BEEP, 2=BOOP, 3+ ARE SPECIAL, 0=MRU 015FA * [ARG2] = ACTION: 1=INIT, [2=START], 3=STOP, 4=CLEANUP 015FA * [ARG3] = COUNT (HIBYTE): -1=INFINITE, [0=USE MIDI COUNT], 1-254=FINITE 015FA * VOL (LOBYTE): 0=MIN, 8=MAX, [-1=USE MIDI VOLUME] 015FA * [ARG4] = INTERRUPT FUNCTION 015FA 015FA 4E71 OPSOUND NOP * REQUEST AN ARGBLK 015FC 43EE FF8C LEA DEFBLK(A6),A1 * USE A DEFAULT ARGBLK, TOO 01600 32BC 0004 MOVE.W #4,(A1) * 4 ARGS MAX 01604 337C 0002 0004 MOVE.W #2,ARG2(A1) * DEFAULT ACTION = "START" 0160A 337C 00FF 0006 MOVE.W #$00FF,ARG3(A1) * DEFAULT COUNT=0/VOL=-1 (USE MIDI DATA) 01610 4269 0008 CLR.W ARG4(A1) * DEFAULT INTERRUPT HANDLER = NONE 01614 6100 06AC 01CC2 BSR SETDEF * SET UP DEFAULTS 01618 01618 3D68 0008 FF24 MOVE.W ARG4(A0),SFUNC(A6) * SAVE INTERRUPT HERE 0161E 3428 0006 MOVE.W ARG3(A0),D2 * COUNT/VOL 01622 3602 MOVE.W D2,D3 01624 4882 EXT.W D2 * VOL (16 BITS) 01626 E04B LSR.W #8,D3 * COUNT (16 BITS, UNLESS -1) 01628 0C03 00FF CMPI.B #$FF,D3 * -1? 0162C 6602 01630 BNE.S OPSDX1 0162E 4883 EXT.W D3 * YES, MAKE 16 BITS 01630 01630 3228 0004 OPSDX1 MOVE.W ARG2(A0),D1 * ACTION 01634 3028 0002 MOVE.W ARG1(A0),D0 * SOUND ID 01638 6000 0DE0 0241A BRA DOSOUND 0163C 0163C * ---------------------- 0163C * OPPICI 0163C * ---------------------- 0163C 0163C * GET PICTURE INFO (SIZE) 0163C 0163C 598F OPPICI SUBQ.L #4,SP * TEMP TABLE, 2 WORDS, >> EVEN-ALIGNED << 0163E G 204F MOVE.L SP,A0 01640 6100 0D00 02342 BSR PICINF * GET SIZE INFO, STORE IN TABLE 01644 01644 C340 EXG D1,D0 * GIVEN TABLE (MAY BE ODD) 01646 6100 ED4E 00396 BSR RELABS 0164A 301F MOVE.W (SP)+,D0 0164C 6100 EDB0 003FE BSR PTAWRD * COPY INFO TO GIVEN TABLE 01650 301F MOVE.W (SP)+,D0 01652 6100 EDAA 003FE BSR PTAWRD 01656 01656 4A41 TST.W D1 * PICINF RESULT 01658 6D04 0165E BLT.S OPICX1 * NEG RESULT MEANS ERROR 0165A 6000 EE96 004F2 BRA PTRUE 0165E 6000 EE8E 004EE OPICX1 BRA PFALSE 01662 01662 * ---------------------- 01662 * OPDISP, OPDCLR 01662 * ---------------------- 01662 01662 * DISPLAY [OR CLEAR] A PICTURE 01662 01662 0003 OPDISP DC.W 3 * DEFAULT ARGBLK 01664 0000 FF9D FF9D DC.W SKIP,-99,-99 * NEG POSITION MEANS READ PALETTE STUFF ONLY 0166A 0166A 7600 MOVEQ #0,D3 * "CLEAR" FLAG OFF 0166C 600A 01678 BRA.S DISPX1 0166E 0166E 0003 OPDCLR DC.W 3 * DEFAULT ARGBLK 01670 0000 FF9D FF9D DC.W SKIP,-99,-99 01676 01676 7601 MOVEQ #1,D3 * "CLEAR" FLAG ON 01678 01678 3028 0002 DISPX1 MOVE.W ARG1(A0),D0 0167C 3228 0004 MOVE.W ARG2(A0),D1 01680 3428 0006 MOVE.W ARG3(A0),D2 01684 6000 0CD2 02358 BRA PICDISP 01688 01688 01688 01688 01688 * ---------------------------------------------------------------------------- 01688 * CONTROL OPERATIONS 01688 * ---------------------------------------------------------------------------- 01688 01688 0000 000F MAXLOCS EQU 15 * MAXIMUM LOCALS; VARS 16-255 ARE GLOBAL 01688 0000 0100 CVFLAG EQU $0100 * FLAG SET (HIGH BYTE) IF CALL RETURNS A VALUE 01688 01688 * ---------------------- 01688 * OPICALL, ETC 01688 * ---------------------- 01688 01688 * CALL (A FUNCTION WITH OPTIONAL ARGUMENTS), NO RETURNED VALUE 01688 01688 41EE FF96 OPICAL1 LEA ARGBLK(A6),A0 * MUST SET UP AN ARGUMENT BLOCK FOR 1-OP 0168C 30BC 0001 MOVE.W #1,(A0) * ONE ARG (THE FUNCTION) 01690 3140 0002 MOVE.W D0,ARG1(A0) 01694 01694 OPICAL2 01694 OPIXCAL 01694 4E71 OPICALL NOP * TELL CALLER TO USE ARGBLK 01696 7600 MOVEQ #0,D3 * FLAG -- DON'T RETURN A VALUE 01698 6012 016AC BRA.S CALLX1 0169A 0169A * ---------------------- 0169A * OPCALL, ETC 0169A * ---------------------- 0169A 0169A * CALL (A FUNCTION WITH OPTIONAL ARGUMENTS) 0169A 0169A 41EE FF96 OPCAL1 LEA ARGBLK(A6),A0 * MUST SET UP AN ARGUMENT BLOCK FOR 1-OP 0169E 30BC 0001 MOVE.W #1,(A0) * ONE ARG (THE FUNCTION) 016A2 3140 0002 MOVE.W D0,ARG1(A0) 016A6 016A6 OPCAL2 016A6 OPXCAL 016A6 4E71 OPCALL NOP * TELL CALLER TO USE ARGBLK 016A8 363C 0100 MOVE.W #CVFLAG,D3 * FLAG (HIGH BYTE) -- RETURN A VALUE 016AC 016AC *** COMMON ENTRY POINT, A0 -> ARGBLK, D3 (HIGH BYTE) = RETURN-VALUE FLAG 016AC 016AC G 2448 CALLX1 MOVE.L A0,A2 016AE 341A MOVE.W (A2)+,D2 * ARG COUNT 016B0 301A MOVE.W (A2)+,D0 * FUNCTION TO CALL -- IS IT ZERO? 016B2 6608 016BC BNE.S CALLX2 * NO 016B4 016B4 4A43 TST.W D3 * SPECIAL CASE -- RETURN A VALUE? 016B6 6776 0172E BEQ.S CALLX9 * NO, JUST EXIT 016B8 * CLR.W D0 * YES, RETURN A ZERO 016B8 6000 EE26 004E0 BRA PUTVAL 016BC 016BC *** BUILD A STACK FRAME, THEN UPDATE THE ZPC AND STATE VARS ... 016BC 016BC 392E FFBC CALLX2 MOVE.W ZPC1(A6),-(A4) * SAVE OLD ZPC 016C0 392E FFBA MOVE.W ZPC2(A6),-(A4) 016C4 162E FFB9 MOVE.B NARGS+1(A6),D3 * SAVE OLD "OPTIONALS" COUNT ... 016C8 3903 MOVE.W D3,-(A4) * ALONG WITH /NEW/ RETURN FLAG 016CA 016CA * >>> old locs pointer (rel) now stacked as word, instead of long <<< 016CA * >>> new locs pointer now points to (pseudo) loc 0, instead of 1 <<< 016CA 016CA 222E FFB4 MOVE.L ZLOCS(A6),D1 * OLD LOCALS/FRAME POINTER 016CE 92AE FFBE SUB.L STKBOT(A6),D1 * BUT RELATIVIZE IT, IN CASE OF GAME SAVE 016D2 3901 MOVE.W D1,-(A4) * SAVE IT 016D4 2D4C FFB4 MOVE.L A4,ZLOCS(A6) * NEW LOCALS/FRAME POINTER 016D8 016D8 5342 SUBQ.W #1,D2 * NUMBER OF PARAMETERS ("OPTIONALS") 016DA 1D42 FFB9 MOVE.B D2,NARGS+1(A6) * REMEMBER IT (BYTE) 016DE 016DE 7200 MOVEQ #0,D1 * ZERO HIGH WORD 016E0 3200 MOVE.W D0,D1 * QUAD PTR 016E2 202E FF1E MOVE.L QFOFF(A6),D0 * QUAD FUNCTION OFFSET 016E6 6100 EE6A 00552 BSR BSPLTQ2 * SPLIT THE BLOCK AND OFFSET 016EA 016EA 3D40 FFBC MOVE.W D0,ZPC1(A6) * MAKE IT THE NEW ZPC 016EE 3D41 FFBA MOVE.W D1,ZPC2(A6) 016F2 6100 09B6 020AA BSR NEWZPC * UPDATE ZPC STUFF 016F6 016F6 *** GET FUNCTION HEADER 016F6 016F6 6100 ED50 00448 BSR NXTBYT * TOTAL # DEFINED LOCALS 016FA 3200 MOVE.W D0,D1 016FC 0C41 000F CMPI.W #MAXLOCS,D1 * VALID? 01700 630A 0170C BLS.S CALLX3 01702 41ED 00CE LEA MSGCA1,A0 * TOO MANY LOCALS DEFINED 01706 6100 1040 02748 BSR ZWARN * SHOW A WARNING 0170A 720F MOVEQ #MAXLOCS,D1 * (CUT BACK -- CAN'T BE TOUCHED ANYWAY) 0170C 0170C B242 CALLX3 CMP.W D2,D1 * VALID? 0170E 640A 0171A BCC.S CALLX4 * BHS 01710 41ED 00DA LEA MSGCA2,A0 * TOO MANY OPTIONALS SUPPLIED 01714 6100 1032 02748 BSR ZWARN * SHOW A WARNING 01718 3401 MOVE.W D1,D2 * (CUT BACK -- WON'T BE TOUCHED ANYWAY) 0171A 0171A 9242 CALLX4 SUB.W D2,D1 * THIS IS NUMBER OF "DEFAULT" VALUES 0171C 6002 01720 BRA.S CALLX6 0171E 000CE DATA 000CE 426164206C6F63 MSGCA1 DC.B 'Bad loc num',0 000DA 426164206F7074 MSGCA2 DC.B 'Bad optional num',0 0171E CODE 0171E 0171E *** BUILD & INITIALIZE A LOCALS FRAME ... 0171E 0171E 391A CALLX5 MOVE.W (A2)+,-(A4) * POSITION THE OPTIONAL VALUES FIRST 01720 51CA FFFC 0171E CALLX6 DBF D2,CALLX5 * ZERO CHECK -- ANY MORE? 01724 7000 MOVEQ #0,D0 01726 6002 0172A BRA.S CALLX8 01728 01728 3900 CALLX7 MOVE.W D0,-(A4) * CLEAR THE REMAINING DEFAULT VALUES [XZIP] 0172A 51C9 FFFC 01728 CALLX8 DBF D1,CALLX7 * ZERO CHECK -- ANY MORE? 0172E 4E75 CALLX9 RTS * DONE 01730 01730 * ---------------------- 01730 * OPASSN 01730 * ---------------------- 01730 01730 * ASSIGNED? (A LOCAL AN OPTIONAL VALUE) 01730 01730 B02E FFB9 OPASSN CMP.B NARGS+1(A6),D0 * WAS THIS LOCAL ASSIGNED A VALUE? 01734 6E00 EDB8 004EE BGT PFALSE * NO, VALUE DEFAULTED TO ZERO 01738 6000 EDB8 004F2 BRA PTRUE * YES 0173C 0173C * ---------------------- 0173C * OPRETU 0173C * ---------------------- 0173C 0173C * RETURN (FROM CURRENT FUNCTION CALL) 0173C 0173C G 286E FFB4 OPRETU MOVE.L ZLOCS(A6),A4 * OLD TOP-OF-STACK 01740 7200 MOVEQ #0,D1 01742 321C MOVE.W (A4)+,D1 * RESTORE OLD LOCALS POINTER 01744 D2AE FFBE ADD.L STKBOT(A6),D1 * ABSOLUTIZE IT 01748 2D41 FFB4 MOVE.L D1,ZLOCS(A6) 0174C 0174C 341C MOVE.W (A4)+,D2 * RESTORE RETURN FLAG, OPTS COUNT 0174E 1D42 FFB9 MOVE.B D2,NARGS+1(A6) 01752 3D5C FFBA MOVE.W (A4)+,ZPC2(A6) * RESTORE OLD ZPC 01756 3D5C FFBC MOVE.W (A4)+,ZPC1(A6) 0175A IF EZIP THEN 0175A 6D00 00A0 017FC BLT INRETU * SPECIAL INTERNAL CALL/RETURN, HANDLE IT 0175E ENDIF 0175E 3200 MOVE.W D0,D1 * PROTECT VALUE (IF ANY -- XZIP) 01760 6100 0948 020AA BSR NEWZPC * UPDATE ZPC STUFF 01764 3001 MOVE.W D1,D0 01766 01766 0242 0100 ANDI.W #CVFLAG,D2 * WAS THIS A RETURN-VALUE CALL? (XZIP) 0176A 6600 ED74 004E0 BNE PUTVAL * YES, RETURN THE VALUE 0176E 4E75 RTS * NO, JUST EXIT 01770 01770 * ---------------------- 01770 * OPRTRU 01770 * ---------------------- 01770 01770 * RTRUE 01770 01770 7001 OPRTRU MOVEQ #1,D0 * RETURN A "1" 01772 60C8 0173C BRA.S OPRETU 01774 01774 * ---------------------- 01774 * OPRFAL 01774 * ---------------------- 01774 01774 * RFALSE 01774 01774 4240 OPRFAL CLR.W D0 * RETURN A "0" 01776 60C4 0173C BRA.S OPRETU 01778 01778 * ---------------------- 01778 * OPRSTA 01778 * ---------------------- 01778 01778 * RSTACK (RETURN STACK) 01778 01778 301C OPRSTA MOVE.W (A4)+,D0 * POP A VALUE 0177A 60C0 0173C BRA OPRETU * AND RETURN IT 0177C 0177C * ---------------------- 0177C * OPFSTA 0177C * ---------------------- 0177C 0177C * FSTACK (FLUSH 'N' ELEMENTS OFF A STACK) *** REVIVED FOR YZIP 0177C 0177C 4E71 OPFSTA NOP * REQUEST AN ARGBLK 0177E 3228 0002 MOVE.W ARG1(A0),D1 * #ITEMS TO FLUSH 01782 0C50 0001 CMPI.W #1,(A0) * STACK SUPPLIED? 01786 6E06 0178E BGT.S FSTAX2 * YES 01788 D241 ADD.W D1,D1 0178A D8C1 ADDA.W D1,A4 * NO, ADJUST GAME STACK 0178C 6014 017A2 BRA.S FSTAX4 0178E 0178E 3028 0004 FSTAX2 MOVE.W ARG2(A0),D0 01792 6100 EC02 00396 BSR RELABS * GET A0 -> LTABLE 01796 6100 EC5E 003F6 BSR GTAWRD * GET D0.W = SPACE REMAINING, ADVANCE A0 0179A 5548 SUBQ.W #2,A0 0179C D041 ADD.W D1,D0 0179E 6100 EC5E 003FE BSR PTAWRD * UPDATE LENGTH SLOT 017A2 4E75 FSTAX4 RTS 017A4 017A4 * ---------------------- 017A4 * OPJUMP 017A4 * ---------------------- 017A4 017A4 * JUMP (TO A NEW LOCATION) 017A4 017A4 5540 OPJUMP SUBQ.W #2,D0 * ADJUST OFFSET 017A6 D16E FFBA ADD.W D0,ZPC2(A6) * ADD OFFSET TO CURRENT ZPC 017AA 6000 08FE 020AA BRA NEWZPC * NORMALIZE IT & UPDATE ZPC STUFF 017AE 017AE * ---------------------- 017AE * OPNOOP 017AE * ---------------------- 017AE 017AE * NOOP (NO OPERATION) 017AE 017AE 4E75 OPNOOP RTS * DO NOTHING 017B0 017B0 * ---------------------- 017B0 * OPCATCH 017B0 * ---------------------- 017B0 017B0 * CATCH 017B0 017B0 202E FFB4 OPCATCH MOVE.L ZLOCS(A6),D0 * THE CURRENT "FRAME POINTER" 017B4 90AE FFBE SUB.L STKBOT(A6),D0 * RELATIVIZE IT 017B8 6000 ED26 004E0 BRA PUTVAL 017BC 017BC * ---------------------- 017BC * OPTHROW 017BC * ---------------------- 017BC 017BC * THROW (NON-LOCAL RETURN) 017BC 017BC 48C1 OPTHROW EXT.L D1 * A PREVIOUS FRAME PTR 017BE D2AE FFBE ADD.L STKBOT(A6),D1 * ABSOLUTIZE 017C2 B2AE FFB4 CMP.L ZLOCS(A6),D1 * VALID FRAME? 017C6 6D08 017D0 BLT.S THRX1 * ERROR 017C8 2D41 FFB4 MOVE.L D1,ZLOCS(A6) * OK, FLUSH ANY INTERMEDIATE FRAMES 017CC 6000 FF6E 0173C BRA OPRETU * AND RETURN VAL (STILL IN D0) 017D0 017D0 4240 THRX1 CLR.W D0 017D2 41ED 00EB LEA MSGTHR,A0 017D6 6000 0F80 02758 BRA FATAL 000EB DATA 000EB 42616420546872 MSGTHR DC.B 'Bad Throw',0 017DA CODE 017DA 017DA * ---------------------- 017DA * INCALL 017DA * ---------------------- 017DA 017DA IF EZIP THEN 017DA 017DA * INTERNALLY CALL A FUNCTION, FUNCTION IN D0, RETURN VALUE IN D0 017DA 017DA 48E7 7F70 INCALL MOVEM.L D1-D7/A1-A3,-(SP) * SAVE EVERYTHING 017DE 017DE 3F2E FFBC MOVE.W ZPC1(A6),-(SP) 017E2 3D7C FFFF FFBC MOVE.W #-1,ZPC1(A6) * FAKE ZPC1, SIGNALS AN INTERNAL CALL/RETURN 017E8 017E8 41EE FF96 LEA ARGBLK(A6),A0 * SET UP ARGBLK FOR OPCALL 017EC 3140 0002 MOVE.W D0,ARG1(A0) * FUNCTION TO CALL 017F0 30BC 0001 MOVE.W #1,(A0) * ONE ARG (FUNCTION ITSELF) 017F4 017F4 6100 FEB0 016A6 BSR OPCALL * CALL THE TIMEOUT FUNCTION 017F8 6000 035A 01B54 BRA NXTINS * GO EXECUTE IT 017FC 017FC * ---------------------- 017FC * INRETU 017FC * ---------------------- 017FC 017FC * JUMP BACK TO HERE UPON NEXT OPRETURN ... 017FC 017FC 588F INRETU ADDQ.L #4,SP * CAREFUL -- FLUSH TOP RETURN ADDR (NXTINS) 017FE 3D5F FFBC MOVE.W (SP)+,ZPC1(A6) * FIX THE ZPC 01802 01802 3200 MOVE.W D0,D1 01804 6100 08A4 020AA BSR NEWZPC * RESTORE THE PROPER PAGE 01808 3001 MOVE.W D1,D0 0180A 0180A 4CDF 0EFE MOVEM.L (SP)+,D1-D7/A1-A3 0180E 4E75 RTS * RETURN TO ORIGINAL CALLER 01810 ENDIF 01810 01810 * ---------------------------------------------------------------------------- 01810 * GAME COMMANDS 01810 * ---------------------------------------------------------------------------- 01810 01810 * ------------------------------ 01810 * PRIMITIVES FOR SAVE/RESTORE 01810 * ------------------------------ 01810 01810 * SAVE STATE VARIABLES ON GAME STACK 01810 01810 392E FFBC SAVSTA MOVE.W ZPC1(A6),-(A4) 01814 392E FFBA MOVE.W ZPC2(A6),-(A4) 01818 01818 G 206E FFBE MOVE.L STKBOT(A6),A0 0181C 202E FFB4 MOVE.L ZLOCS(A6),D0 * RELATIVIZE THIS ONE 01820 9088 SUB.L A0,D0 01822 3900 MOVE.W D0,-(A4) 01824 392E FFFE MOVE.W ZORKID(A6),-(A4) 01828 01828 200C MOVE.L A4,D0 0182A 9088 SUB.L A0,D0 * RELATIVIZE GAME SP, TOO 0182C 3080 MOVE.W D0,(A0) * AND SAVE IT IN KNOWN LOCATION 0182E G 504C ADDA.W #8,A4 * RESET THE GAME SP 01830 4E75 RTS 01832 01832 * RESTORE STATE VARIABLES FROM GAME STACK, RETURN ZORKID IN D0 AND FLAGS 01832 01832 G 206E FFBE RESSTA MOVE.L STKBOT(A6),A0 01836 7000 MOVEQ #0,D0 01838 3010 MOVE.W (A0),D0 * RESTORE GAME SP FROM KNOWN LOCATION 0183A D088 ADD.L A0,D0 * RE-ABSOLUTIZE IT 0183C G 2840 MOVE.L D0,A4 0183E 0183E 3F1C MOVE.W (A4)+,-(SP) * GET THE SAVED ZORKID 01840 7000 MOVEQ #0,D0 01842 301C MOVE.W (A4)+,D0 * RESTORE OLD LOCALS POINTER 01844 D088 ADD.L A0,D0 * RE-ABSOLUTIZE IT 01846 2D40 FFB4 MOVE.L D0,ZLOCS(A6) 0184A 0184A 3D5C FFBA MOVE.W (A4)+,ZPC2(A6) * RESTORE OTHER STUFF 0184E 3D5C FFBC MOVE.W (A4)+,ZPC1(A6) 01852 01852 301F MOVE.W (SP)+,D0 01854 B06E FFFE CMP.W ZORKID(A6),D0 * IS ID THE SAME AS OURS? 01858 4E75 RTS * (RETURN WITH FLAGS) 0185A 0185A * ---------------------- 0185A * OPISAV 0185A * ---------------------- 0185A 0185A * ISAVE (SAVE TO MEMORY BUFFER) 0185A 0185A 61B4 01810 OPISAV BSR SAVSTA * SAVE STATE VARIABLES ON GAME STACK 0185C 242E FEE6 MOVE.L MSAVEB(A6),D2 * PTR, ISAVE BUFFER 01860 6700 00EE 01950 BEQ SAVERR * ERROR, BUFFER DOESN'T EXIST 01864 G 206E FFBE MOVE.L STKBOT(A6),A0 01868 G 2242 MOVE.L D2,A1 0186A 203C 0000 0400 MOVE.L #STKLEN,D0 01870 6100 1130 029A2 BSR MOVMEM * SAVE THE STACK (FAST BLOCKMOVE) 01874 01874 G 206E FFA8 MOVE.L BUFFER(A6),A0 * BEGINNING OF IMPURE STUFF IN CORE 01878 G 2242 MOVE.L D2,A1 0187A D2FC 0400 ADDA.W #STKLEN,A1 * START WRITING AFTER STACK 0187E 302E FFF8 MOVE.W PURBOT(A6),D0 * IMPURE BLOCKS 01882 6100 EB2E 003B2 BSR BLKBYT 01886 6100 111A 029A2 BSR MOVMEM * SAVE IMPURE DATA (FAST BLOCKMOVE) 0188A 6000 00AC 01938 BRA SAVEOK * SUCCESS 0188E 0188E * ---------------------- 0188E * OPSAVE 0188E * ---------------------- 0188E 0188E 0000 0020 PSNLEN EQU 32 * MAX LENGTH OF SUGGESTED NAME 0188E 0188E * SAVE (STATE OF GAME, OR SELECTED "PARTIAL" DATA) 0188E 0188E 4E71 OPSAVE NOP 01890 4A50 TST.W (A0) * PARTIAL SAVE (ANY ARGS)? 01892 6700 0056 018EA BEQ SVX2 * NO 01896 01896 *** HANDLE A PARTIAL SAVE, A0 -> ARGBLK *** 01896 01896 G 2448 MOVE.L A0,A2 01898 4240 CLR.W D0 0189A 6100 10EC 02988 BSR CHKDSK * CHECK FOR GAME DISK AND CLOSE GAME FILE 0189E 0189E 302A 0006 MOVE.W ARG3(A2),D0 * "SUGGESTED" NAME, BYTE 0 = LENGTH 018A2 6100 EAF2 00396 BSR RELABS 018A6 G 2248 MOVE.L A0,A1 * SAVE HERE, & PASS TO FSEL 018A8 7001 MOVEQ #1,D0 * OPSAVE 018AA 7201 MOVEQ #1,D1 * PARTIAL 018AC 6100 0F98 02846 BSR GETSFL * GET A NAME FOR THE SAVE FILE 018B0 6600 0094 01946 BNE SVX14 * CANCELLED 018B4 018B4 6100 0FD6 0288C BSR NEWSFL * CREATE (IF NEEDED) AND OPEN THE FILE 018B8 6600 008C 01946 BNE SVX14 * ERROR, JUST EXIT (NEED NOT DELETE) 018BC 018BC * WRITE SUGGESTED NAME TO FILE 018BC 018BC 7000 MOVEQ #0,D0 018BE 7220 MOVEQ #PSNLEN,D1 * MAX LENGTH OF SUGGESTED NAME 018C0 G 2049 MOVE.L A1,A0 * STARTS HERE (WITH LENGTH BYTE) 018C2 6100 1038 028FC BSR SFWRIT 018C6 6600 0076 0193E BNE SVX12 * ERROR, CLOSE AND DELETE THE FILE 018CA 018CA * WRITE DATA TO FILE 018CA 018CA 302A 0002 MOVE.W ARG1(A2),D0 * BASE OF PARTIAL SAVE 018CE 6100 EAC6 00396 BSR RELABS * ABSOLUTIZE 018D2 7020 MOVEQ #PSNLEN,D0 * FILE OFFSET 018D4 7200 MOVEQ #0,D1 018D6 322A 0004 MOVE.W ARG2(A2),D1 * LENGTH OF PARTIAL SAVE DATA 018DA 6100 1020 028FC BSR SFWRIT 018DE 6600 005E 0193E BNE SVX12 * ERROR, CLOSE AND DELETE THE FILE 018E2 018E2 6100 108C 02970 BSR DEFOLD * OK >>> BUT RESTORE "NORMAL" FILE NAMES <<< 018E6 6000 0042 0192A BRA SVX10 * AND CLEAN UP 018EA 018EA *** ENTER HERE FOR "STANDARD" SAVE *** 018EA 018EA 4240 SVX2 CLR.W D0 018EC 6100 109A 02988 BSR CHKDSK * CHECK FOR GAME DISK AND CLOSE GAME FILE 018F0 018F0 7001 MOVEQ #1,D0 * OPSAVE 018F2 4241 CLR.W D1 * STANDARD 018F4 6100 0F50 02846 BSR GETSFL * GET A NAME FOR THE SAVE FILE 018F8 6600 004C 01946 BNE SVX14 * CANCELLED 018FC 018FC 6100 0F8E 0288C BSR NEWSFL * CREATE (IF NEEDED) AND OPEN THE FILE 01900 6600 0044 01946 BNE SVX14 * ERROR, JUST EXIT (NEED NOT DELETE) 01904 01904 * SAVE GAME STACK, THEN IMPURE PRELOAD 01904 01904 6100 FF0A 01810 BSR SAVSTA * SAVE STATE VARIABLES ON GAME STACK 01908 G 206E FFBE MOVE.L STKBOT(A6),A0 0190C 4240 CLR.W D0 * THIS WILL BE BLOCK ZERO 0190E 7202 MOVEQ #STKLEN/512,D1 * BLOCK LENGTH OF STACK 01910 6100 0FDE 028F0 BSR PTSBKS * WRITE IT OUT 01914 6600 0028 0193E BNE SVX12 * ERROR, CLOSE AND DELETE THE FILE 01918 01918 G 206E FFA8 MOVE.L BUFFER(A6),A0 * BEGINNING OF IMPURE STUFF IN CORE 0191C 7002 MOVEQ #STKLEN/512,D0 * START WRITING AFTER STACK 0191E 322E FFF8 MOVE.W PURBOT(A6),D1 * NUMBER OF IMPURE BLOCKS 01922 6100 0FCC 028F0 BSR PTSBKS 01926 6600 0016 0193E BNE SVX12 * ERROR, CLOSE AND DELETE THE FILE 0192A 0192A * SAVE SUCCEEDED 0192A 0192A 6100 101C 02948 SVX10 BSR CLSSFL * SUCCESS, CLOSE THE FILE [NO ERRORS] 0192E 6100 1046 02976 BSR DEFNEW * UPDATE PREVIOUS DEFAULT NAMES 01932 7001 MOVEQ #1,D0 01934 6100 1052 02988 BSR CHKDSK * MAKE SURE GAME DISK IS BACK IN DRIVE 01938 01938 7001 SAVEOK MOVEQ #1,D0 * RETURN "SAVE OK" 0193A 6000 EBA4 004E0 BRA PUTVAL 0193E 0193E * SAVE FAILED FOR SOME REASON ... 0193E 0193E 6100 1008 02948 SVX12 BSR CLSSFL * CLOSE THE BAD FILE 01942 6100 101A 0295E BSR DELSFL * AND DELETE THE BAD FILE FROM THE DIRECTORY 01946 01946 6100 1028 02970 SVX14 BSR DEFOLD * INSTALL PREVIOUS DEFAULT NAMES 0194A 7001 MOVEQ #1,D0 0194C 6100 103A 02988 BSR CHKDSK * MAKE SURE GAME DISK IS BACK IN DRIVE 01950 01950 4240 SAVERR CLR.W D0 * RETURN "SAVE FAILED" 01952 6000 EB8C 004E0 BRA PUTVAL 01956 01956 * ---------------------- 01956 * OPIRES 01956 * ---------------------- 01956 01956 * IRESTORE (RESTORE FROM MEMORY BUFFER) 01956 01956 242E FEE6 OPIRES MOVE.L MSAVEB(A6),D2 * PTR, ISAVE BUFFER 0195A 6700 0138 01A94 BEQ RESERR * ERROR, BUFFER DOESN'T EXIST 0195E G 2042 MOVE.L D2,A0 01960 4A50 TST.W (A0) 01962 6700 0130 01A94 BEQ RESERR * ERROR, NO PREVIOUS ISAVE! 01966 G 226E FFBE MOVE.L STKBOT(A6),A1 0196A 203C 0000 0400 MOVE.L #STKLEN,D0 01970 6100 1030 029A2 BSR MOVMEM * RESTORE THE GAME STACK (FAST BLOCKMOVE) 01974 01974 6100 FEBC 01832 BSR RESSTA * UNSTACK THE OLD STATE INFO 01978 6600 0128 01AA2 BNE RESX15 * ERROR, WRONG ZORKID 0197C 0197C G 2042 MOVE.L D2,A0 0197E D0FC 0400 ADDA.W #STKLEN,A0 * START READING AFTER STACK 01982 G 226E FFA8 MOVE.L BUFFER(A6),A1 * BEGINNING OF IMPURE STUFF IN CORE 01986 302E FFF8 MOVE.W PURBOT(A6),D0 * IMPURE BLOCKS 0198A 6100 EA26 003B2 BSR BLKBYT 0198E 6100 1012 029A2 BSR MOVMEM * RESTORE IMPURE DATA (FAST BLOCKMOVE) 01992 6000 00E0 01A74 BRA RESTOK * SUCCESS 01996 01996 * ---------------------- 01996 * OPREST 01996 * ---------------------- 01996 01996 * RESTORE (STATE OF GAME, OR SELECTED "PARTIAL" DATA) 01996 01996 4E71 OPREST NOP 01998 4A50 TST.W (A0) * PARTIAL RESTORE (ANY ARGS)? 0199A 6700 0076 01A12 BEQ RESX2 * NO 0199E 0199E *** HANDLE A PARTIAL RESTORE, A0 -> ARGBLK *** 0199E 0199E G 2448 MOVE.L A0,A2 019A0 4240 CLR.W D0 019A2 6100 0FE4 02988 BSR CHKDSK * CHECK FOR GAME DISK AND CLOSE GAME FILE 019A6 019A6 302A 0006 MOVE.W ARG3(A2),D0 * "SUGGESTED" NAME, BYTE 0 = LENGTH 019AA 6100 E9EA 00396 BSR RELABS 019AE G 2248 MOVE.L A0,A1 * SAVE HERE, & PASS TO FSEL 019B0 7000 MOVEQ #0,D0 * RESTORE 019B2 7201 MOVEQ #1,D1 * PARTIAL 019B4 6100 0E90 02846 BSR GETSFL * GET A NAME FOR THE SAVE FILE 019B8 6600 00D0 01A8A BNE RESX13 * CANCELLED 019BC 019BC 6100 0EEE 028AC BSR OPNSFL * OPEN THE FILE 019C0 6600 00C8 01A8A BNE RESX13 * ERROR 019C4 019C4 * READ (PREVIOUS) SUGGESTED NAME FROM FILE, & CHECK FOR A MATCH 019C4 019C4 7000 MOVEQ #0,D0 019C6 7220 MOVEQ #PSNLEN,D1 * MAX LENGTH OF SUGGESTED NAME 019C8 G 206E FFBE MOVE.L STKBOT(A6),A0 * (GRAB TEMP BUFFER AT BASE OF ZSTACK) 019CC 6100 0F00 028CE BSR SFREAD 019D0 6600 00B4 01A86 BNE RESX12 * ERROR, CLOSE THE FILE (NOT FATAL) 019D4 019D4 G 2049 MOVE.L A1,A0 * CURRENT NAME STARTS HERE (WITH LENGTH BYTE) 019D6 G 226E FFBE MOVE.L STKBOT(A6),A1 019DA 7001 MOVEQ #1,D0 * COUNT LENGTH BYTE 019DC D010 ADD.B (A0),D0 019DE 6100 E998 00378 BSR COMPS * COMPARE THE STRINGS 019E2 6600 00A2 01A86 BNE RESX12 * DIFFERENT, ERROR, CLOSE THE FILE 019E6 019E6 * READ DATA FROM FILE 019E6 019E6 302A 0002 MOVE.W ARG1(A2),D0 * BASE OF PARTIAL SAVE 019EA 6100 E9AA 00396 BSR RELABS * ABSOLUTIZE 019EE 7020 MOVEQ #PSNLEN,D0 * FILE OFFSET 019F0 7200 MOVEQ #0,D1 019F2 322A 0004 MOVE.W ARG2(A2),D1 * LENGTH OF PARTIAL SAVE DATA 019F6 6100 0ED6 028CE BSR SFREAD * [RETURNS ACTUAL BYTES READ IN D1] 019FA 6600 008A 01A86 BNE RESX12 * ERROR, CLOSE THE FILE 019FE 019FE 6100 0F70 02970 BSR DEFOLD * >>> RESTORE "NON-PARTIAL" FILE NAMES <<< 01A02 6100 0F44 02948 BSR CLSSFL * CLOSE THE FILE 01A06 7001 MOVEQ #1,D0 01A08 6100 0F7E 02988 BSR CHKDSK * MAKE SURE GAME DISK IS BACK IN DRIVE 01A0C 01A0C *** [SYSTEM STACK HACKING AND CALL TO NEWZPC NOT NEEDED AFTER PARTIAL OP] 01A0C 01A0C 3001 MOVE.W D1,D0 * RETURN "ACTUAL BYTES READ" 01A0E 6000 EAD0 004E0 BRA PUTVAL 01A12 01A12 *** ENTER HERE FOR "STANDARD" RESTORE *** 01A12 01A12 4240 RESX2 CLR.W D0 01A14 6100 0F72 02988 BSR CHKDSK * CHECK FOR GAME DISK AND CLOSE GAME FILE 01A18 01A18 4240 CLR.W D0 * RESTORE 01A1A 4241 CLR.W D1 * STANDARD 01A1C 6100 0E28 02846 BSR GETSFL * GET A NAME FOR THE SAVE FILE 01A20 6600 0068 01A8A BNE RESX13 * CANCELLED 01A24 01A24 *** ENTER HERE IF DOING SPECIAL RESTORE DURING LAUNCH *** 01A24 01A24 6100 0E86 028AC RES1 BSR OPNSFL * OPEN THE FILE 01A28 6600 0060 01A8A BNE RESX13 * ERROR 01A2C 01A2C 4240 CLR.W D0 * FIRST READ IN STACK 01A2E 7202 MOVEQ #STKLEN/512,D1 * BLOCK LENGTH OF STACK 01A30 G 206E FFBE MOVE.L STKBOT(A6),A0 * PUT IT HERE 01A34 6100 0E8C 028C2 BSR GTSBKS 01A38 6600 0070 01AAA BNE RESX16 * DIE IF DISK ERROR 01A3C 01A3C 6100 FDF4 01832 BSR RESSTA * UNSTACK THE OLD STATE INFO 01A40 6600 0058 01A9A BNE RESX14 * ERROR, WRONG ZORKID 01A44 01A44 G 206E FFA8 MOVE.L BUFFER(A6),A0 01A48 3F28 0010 MOVE.W PFLAGS(A0),-(SP) * PRESERVE THE FLAGS (SCRIPT ETC) 01A4C 01A4C 7002 MOVEQ #STKLEN/512,D0 * READ IMPURE STUFF STARTING AFTER STACK 01A4E 322E FFF8 MOVE.W PURBOT(A6),D1 * LENGTH OF IMPURE STUFF 01A52 6100 0E6E 028C2 BSR GTSBKS 01A56 6600 0052 01AAA BNE RESX16 * DIE IF DISK ERROR 01A5A 01A5A G 206E FFA8 MOVE.L BUFFER(A6),A0 01A5E 315F 0010 MOVE.W (SP)+,PFLAGS(A0) * RESTORE THE OLD FLAGS 01A62 01A62 * RESTORE SUCCEEDED 01A62 01A62 6100 0EE4 02948 RESX10 BSR CLSSFL * CLOSE THE FILE 01A66 6100 0F0E 02976 BSR DEFNEW * UPDATE PREVIOUS DEFAULT NAMES 01A6A 7001 MOVEQ #1,D0 01A6C 6100 0F1A 02988 BSR CHKDSK * (1) MAKE SURE GAME DISK IS BACK IN DRIVE 01A70 01A70 6100 E882 002F4 BSR INITDISP * UPDATE TTY-SPECIFIC LOWCORE (IF NEEDED) 01A74 01A74 * A subtle bug was found in ZIP20 when certain calls that reset the game 01A74 * state (the ZPC and stack) occurred during a timer interrupt. Since control 01A74 * never returned to the code that caused the interrupt, the system (machine) 01A74 * stack never got cleaned up. After several such calls it overflowed. 01A74 01A74 * The questionable calls include (a successful) Restore or Irestore (Undo), 01A74 * and Restart. The first two are handled here, the last elsewhere. 01A74 01A74 G 2E6E FFC2 RESTOK MOVE.L TOPSP(A6),SP * MAKE SURE THE SYSTEM STACK IS CLEAN 01A78 487A 00DA 01B54 PEA NXTINS * AND HACK IT SO WE WILL RETURN TO MAIN LOOP 01A7C 01A7C 6100 062C 020AA BSR NEWZPC * (2) GET THE PROPER ZPC PAGE 01A80 7002 MOVEQ #2,D0 * RETURN "RESTORE OK" 01A82 6000 EA5C 004E0 BRA PUTVAL 01A86 01A86 * SOMETHING WRONG, FAIL ... 01A86 01A86 6100 0EC0 02948 RESX12 BSR CLSSFL * CLOSE THE FILE 01A8A 6100 0EE4 02970 RESX13 BSR DEFOLD * INSTALL PREVIOUS DEFAULT NAMES 01A8E 7001 MOVEQ #1,D0 01A90 6100 0EF6 02988 BSR CHKDSK * MAKE SURE GAME DISK IS BACK IN DRIVE 01A94 01A94 4240 RESERR CLR.W D0 * RETURN "RESTORE FAILED" 01A96 6000 EA48 004E0 BRA PUTVAL 01A9A 01A9A * FATAL ERROR: BAD ZORKID 01A9A 01A9A 3F00 RESX14 MOVE.W D0,-(SP) 01A9C 6100 0EAA 02948 BSR CLSSFL * CLOSE THE BAD FILE 01AA0 301F MOVE.W (SP)+,D0 * BAD VERSION ID 01AA2 01AA2 41ED 00F5 RESX15 LEA MSGRE2,A0 01AA6 6000 0CB0 02758 BRA FATAL * 'Wrong save file version' 000F5 DATA 000F5 57726F6E672073 MSGRE2 DC.B 'Wrong save file version',0 01AAA CODE 01AAA 01AAA * FATAL ERROR: RESTORE READ ERROR 01AAA 01AAA 3F00 RESX16 MOVE.W D0,-(SP) 01AAC 6100 0E9A 02948 BSR CLSSFL * CLOSE THE BAD FILE AND DIE 01AB0 301F MOVE.W (SP)+,D0 * ERROR CODE 01AB2 01AB2 41ED 010D LEA MSGRE1,A0 01AB6 6000 0CA0 02758 BRA FATAL * 'Save file read error' 0010D DATA 0010D 53617665206669 MSGRE1 DC.B 'Save file read error',0 01ABA CODE 01ABA 01ABA * ---------------------- 01ABA * OPRSTT 01ABA * ---------------------- 01ABA 01ABA * RESTART (THE GAME) 01ABA 01ABA 6100 04C6 01F82 OPRSTT BSR PUTNEW * FORCE OUT ANY QUEUED TEXT 01ABE G 206E FF14 MOVE.L CURWP(A6),A0 01AC2 4268 001E CLR.W WLCNT(A0) * RESET COUNTER 01AC6 01AC6 4A6E FEEC TST.W GAMFIL(A6) * GAME FILE ALREADY OPEN? 01ACA 6606 01AD2 BNE.S RSTTX1 * YES 01ACC 7001 MOVEQ #1,D0 01ACE 6100 0EB8 02988 BSR CHKDSK1 * NO, OPEN IT NOW (PROMPTING AS NEEDED) 01AD2 01AD2 70FF RSTTX1 MOVEQ #-1,D0 01AD4 6100 F8EC 013C2 BSR OPCLEAR * CLEAR (AND UNSPLIT) SCREEN 01AD8 6000 E75E 00238 BRA RESTRT * SKIP MOST INITIALIZATIONS 01ADC 01ADC * ---------------------- 01ADC * OPQUIT 01ADC * ---------------------- 01ADC 01ADC * QUIT 01ADC 01ADC 6000 099C 0247A OPQUIT BRA FINISH * DIE PEACEFULLY 01AE0 01AE0 * ---------------------- 01AE0 * OPVERI 01AE0 * ---------------------- 01AE0 01AE0 * VERIFY (GAME FILE) 01AE0 01AE0 OPVERI 01AE0 IF CZIP THEN * VERSION INFO FOR ZIP ONLY 01AE0 ENDIF 01AE0 01AE0 4A6D 0002 TST.W SUBVER * DISPLAY SUB-VERSION ONLY IF NON-ZERO 01AE4 6714 01AFA BEQ.S VERX0 01AE6 01AE6 41ED 0122 LEA MSGVR2,A0 01AEA 6100 0C34 02720 BSR OUTMSG0 * 'Sub-version ' 00122 DATA 00122 5375622D766572 MSGVR2 DC.B 'Sub-version ',0 01AEE CODE 01AEE 01AEE 302D 0002 MOVE.W SUBVER,D0 * DISPLAY THE SUB-VERSION NUMBER 01AF2 6100 F4A8 00F9C BSR OPPRNN 01AF6 6100 F538 01030 BSR OPCRLF 01AFA 01AFA 4A6E FEEC VERX0 TST.W GAMFIL(A6) * GAME FILE ALREADY OPEN? 01AFE 6606 01B06 BNE.S VERX05 * YES 01B00 7001 MOVEQ #1,D0 01B02 6100 0E84 02988 BSR CHKDSK1 * NO, OPEN IT NOW (PROMPTING AS NEEDED) 01B06 01B06 G 206E FFA8 VERX05 MOVE.L BUFFER(A6),A0 01B0A 3028 001A MOVE.W PLENTH(A0),D0 * GET LENGTH OF GAME FILE 01B0E 01B0E IF EZIP THEN 01B0E 7200 MOVEQ #0,D1 * ZERO HIGH WORD 01B10 3200 MOVE.W D0,D1 * QUAD PTR 01B12 7000 MOVEQ #0,D0 * [QUAD FUNCTION OFFSET] 01B14 6100 EA3C 00552 BSR BSPLTQ2 * SPLIT INTO BLOCK AND OFFSET 01B18 ENDIF 01B18 IF CZIP THEN 01B18 ENDIF 01B18 3800 MOVE.W D0,D4 * THIS IS FINAL BLOCK 01B1A 3A01 MOVE.W D1,D5 * FINAL BYTE 01B1C 01B1C 4240 CLR.W D0 * STARTING BLOCK NUMBER 01B1E 7240 MOVEQ #64,D1 * STARTING BYTE NUMBER 01B20 4243 CLR.W D3 * CHECKSUM HERE 01B22 3F2E FFFA MOVE.W ENDLOD(A6),-(SP) 01B26 426E FFFA CLR.W ENDLOD(A6) * FORCE LOADING FROM DISK 01B2A 01B2A 6100 E8DE 0040A VERX1 BSR GETBYT * GET NEXT BYTE 01B2E D642 ADD.W D2,D3 * ADD IN TO CHECKSUM 01B30 B840 CMP.W D0,D4 * DONE YET? 01B32 66F6 01B2A BNE VERX1 * NO 01B34 BA41 CMP.W D1,D5 * MAYBE 01B36 66F2 01B2A BNE VERX1 * NO 01B38 01B38 3D5F FFFA MOVE.W (SP)+,ENDLOD(A6) * YES, RESTORE PROPER ENDLOD 01B3C 01B3C G 206E FFA8 MOVE.L BUFFER(A6),A0 01B40 3028 001C MOVE.W PCHKSM(A0),D0 * GET THE REAL CHECKSUM 01B44 B640 CMP.W D0,D3 01B46 6604 01B4C BNE.S VERX2 * ERROR 01B48 01B48 6000 E9A8 004F2 BRA PTRUE * SUCCESS 01B4C 6000 E9A0 004EE VERX2 BRA PFALSE * FAILURE 01B50 01B50 * ---------------------- 01B50 * OPORIG 01B50 * ---------------------- 01B50 01B50 * ORIGINAL (NOT A COPY) GAME DISK? 01B50 01B50 6000 E9A0 004F2 OPORIG BRA PTRUE * NO COPY-PROTECTION, SO ALWAYS TRUE 01B54 01B54 01B54 * ------------------------------------------------------------------ 01B54 * ZIP DEBUGGING 01B54 * ------------------------------------------------------------------ 01B54 * NOTE: THIS STUFF SHOULD BE INCLUDED ONLY DURING DEVELOPMENT 01B54 01B54 IF DEBUG THEN 01B54 ENDIF * END OF CONDITIONAL ASSEMBLY 01B54 01B54 * --------------------------------------------------------------------------- 01B54 * MAIN LOOP, DISPATCHING 01B54 * --------------------------------------------------------------------------- 01B54 01B54 * OPERATORS WHICH ACCEPT A VARIABLE NUMBER OF ARGUMENTS (OPQEQU, OPCALL, ETC) 01B54 * ARE IDENTIFIED BY AN INITIAL NOP. THEIR ARGUMENTS ARE PASSED IN AN ARGUMENT 01B54 * BLOCK, WITH THE NUMBER OF ARGUMENTS AS THE FIRST ENTRY. ALL OTHER OPERATORS 01B54 * RECEIVE THEIR ARGUMENTS IN REGISTERS. 01B54 01B54 0000 4E71 NOOP EQU $4E71 * MARKS ROUTINES WHICH TAKE OPTIONAL ARGS 01B54 01B54 *** Alternate NXTINS dispatch mechanism. Would require that all entries in 01B54 *** dispatch table (ZIPOPS) be relative to ZIPOPS. 01B54 01B54 *** LEA ZIPOPS,A1 01B54 *** MOVE.W xxxOPS-ZIPOPS(A1,D0.W),D2 * GET THE OPx ROUTINE OFFSET 01B54 *** JSR 0(A1,D2.W) * CALL THE OPERATOR ROUTINE 01B54 *** BRA NXTINS 01B54 01B54 * ---------------------- 01B54 * NXTINS 01B54 * ---------------------- 01B54 01B54 6100 08F8 0244E NXTINS BSR GAMINT * CHECK FOR GAME INTERRUPT (SOUND, ETC) 01B58 6100 E8EE 00448 BSR NXTBYT * GET THE NEXT INSTRUCTION BYTE 01B5C 01B5C 2E00 MOVE.L D0,D7 * >> QUICK & DIRTY DEBUGGING << 01B5E IF DEBUG THEN 01B5E ENDIF 01B5E 0C00 0080 CMPI.B #$80,D0 * IS IT A 2 OP? 01B62 6500 0068 01BCC BCS NXT2 * BLO * YES 01B66 01B66 0C00 00B0 CMPI.B #$B0,D0 * IS IT A 1 OP? 01B6A 6500 003C 01BA8 BCS NXT1 * BLO * YES 01B6E 01B6E 0C00 00C0 CMPI.B #$C0,D0 * IS IT A 0 OP? 01B72 6400 00A8 01C1C BCC NXT4 * BHS * NO, MUST BE AN EXTENDED OP 01B76 01B76 *** HANDLE A ZERO-OP 01B76 01B76 0C00 00BE NXT0 CMPI.B #190,D0 * SPECIAL "EXTOP" OPCODE? 01B7A 6718 01B94 BEQ.S N0X1 * YES 01B7C 01B7C 0240 000F ANDI.W #$0F,D0 * 0 OP, EXTRACT OPERATOR CODE, "xxxx oooo" 01B80 D040 ADD.W D0,D0 * WORD OFFSET 01B82 01B82 43ED 013E LEA ZEROPS,A1 01B86 3431 0000 MOVE.W 0(A1,D0.W),D2 * GET THE OPx ROUTINE OFFSET 01B8A 43FA E474 00000 LEA ZBASE,A1 01B8E 01B8E 4EB1 2000 JSR 0(A1,D2.W) * CALL THE OPERATOR ROUTINE 01B92 60C0 01B54 BRA NXTINS 01B94 01B94 6100 E8B2 00448 N0X1 BSR NXTBYT * NEXT BYTE IS SPECIAL "EXTOP" 01B98 4847 SWAP D7 * >> #190 IN HIGH WORD << 01B9A 3E00 MOVE.W D0,D7 * >> QUICK & DIRTY DEBUGGING << 01B9C 01B9C 0240 003F ANDI.W #$3F,D0 * EXTRACT OPERATOR CODE, "xxoo oooo" 01BA0 7440 MOVEQ #64,D2 * MAXIMUM 2OPS/XOPS 01BA2 D440 ADD.W D0,D2 * ADJUST OPCODE INTO "EXTOP" RANGE 01BA4 6000 00A6 01C4C BRA NXT4A * THEN HANDLE AS AN XOP 01BA8 01BA8 *** HANDLE A ONE-OP 01BA8 01BA8 3400 NXT1 MOVE.W D0,D2 * 1 OP, MAKE A COPY, "xxmm oooo" 01BAA 0242 000F ANDI.W #$0F,D2 * EXTRACT OPERATOR CODE 01BAE D442 ADD.W D2,D2 * WORD OFFSET 01BB0 01BB0 E848 LSR.W #4,D0 * EXTRACT MODE BITS 01BB2 0240 0003 ANDI.W #3,D0 01BB6 6100 E8BE 00476 BSR GETARG * GET THE ARGUMENT 01BBA 01BBA 43ED 015E LEA ONEOPS,A1 01BBE 3431 2000 MOVE.W 0(A1,D2.W),D2 * GET THE OPx ROUTINE OFFSET 01BC2 43FA E43C 00000 LEA ZBASE,A1 01BC6 01BC6 4EB1 2000 JSR 0(A1,D2.W) * CALL THE OPERATOR ROUTINE 01BCA 6088 01B54 BRA NXTINS 01BCC 01BCC *** HANDLE A TWO-OP 01BCC 01BCC 3400 NXT2 MOVE.W D0,D2 * 2 OP, MAKE A COPY, "xmmo oooo" 01BCE 01BCE 7001 MOVEQ #1,D0 * ASSUME FIRST ARG IS AN IMMEDIATE 01BD0 0802 0006 BTST #6,D2 * IS IT INSTEAD A VARIABLE? 01BD4 6702 01BD8 BEQ.S N2X1 * NO 01BD6 7002 MOVEQ #2,D0 * YES, CHANGE MODE 01BD8 6100 E89C 00476 N2X1 BSR GETARG * GET THE FIRST ARG 01BDC 3200 MOVE.W D0,D1 01BDE 01BDE 7001 MOVEQ #1,D0 * ASSUME SECOND ARG IS AN IMMEDIATE 01BE0 0802 0005 BTST #5,D2 * IS IT INSTEAD A VAR? 01BE4 6702 01BE8 BEQ.S N2X2 * NO 01BE6 7002 MOVEQ #2,D0 * YES, CHANGE MODE 01BE8 6100 E88C 00476 N2X2 BSR GETARG * GET THE SECOND ARG 01BEC C141 EXG D0,D1 * POSITION THE ARGS 01BEE 01BEE 0242 001F ANDI.W #$1F,D2 * EXTRACT OPERATOR CODE 01BF2 D442 ADD.W D2,D2 * WORD OFFSET 01BF4 01BF4 43ED 017E LEA TWOOPS,A1 01BF8 3431 2000 MOVE.W 0(A1,D2.W),D2 * GET THE OPx ROUTINE OFFSET 01BFC 43FA E402 00000 LEA ZBASE,A1 01C00 43F1 2000 LEA 0(A1,D2.W),A1 * CALCULATE THE OPx ROUTINE ADDRESS 01C04 01C04 0C51 4E71 CMPI.W #NOOP,(A1) * BUT DOES THE OPERATOR EXPECT AN ARGBLK? 01C08 660C 01C16 BNE.S N2X3 * NO 01C0A 01C0A 41EE FF9C LEA ARGBLK+6(A6),A0 * YES, MOVE ARGS TO ARGBLK 01C0E 3101 MOVE.W D1,-(A0) 01C10 3100 MOVE.W D0,-(A0) 01C12 313C 0002 MOVE.W #2,-(A0) * ALWAYS 2 ARGS 01C16 01C16 4E91 N2X3 JSR (A1) * CALL THE OPERATOR ROUTINE 01C18 6000 FF3A 01B54 BRA NXTINS 01C1C 01C1C *** HANDLE AN EXTENDED-OP ... 01C1C 01C1C 3400 NXT4 MOVE.W D0,D2 * EXTENDED OP, SAVE A COPY, "xxoo oooo" 01C1E 0242 003F ANDI.W #$3F,D2 * EXTRACT OPERATOR CODE 01C22 01C22 0C00 00EC CMPI.B #236,D0 * IS THIS AN XCALL ($EC)? 01C26 6706 01C2E BEQ.S N4X1 * YES 01C28 0C00 00FA CMPI.B #250,D0 * IS THIS AN IXCALL ($FA)? 01C2C 661E 01C4C BNE.S NXT4A * NO 01C2E 01C2E * GET THE 4 (OR 8) MODE SPECIFIERS, EXTRACT AND STACK THEM ... 01C2E 01C2E 7608 N4X1 MOVEQ #8,D3 * SPECIAL XOP, 8 MODE SPECIFIERS 01C30 6100 E816 00448 BSR NXTBYT * GET THE FIRST MODE BYTE, "aabb ccdd" 01C34 3200 MOVE.W D0,D1 01C36 6100 E810 00448 BSR NXTBYT * GET THE SECOND MODE BYTE, "eeff gghh" 01C3A 01C3A 3F00 MOVE.W D0,-(SP) * SAVE hh 01C3C E448 LSR.W #2,D0 01C3E 3F00 MOVE.W D0,-(SP) * SAVE gg 01C40 E448 LSR.W #2,D0 01C42 3F00 MOVE.W D0,-(SP) * SAVE ff 01C44 E448 LSR.W #2,D0 01C46 3F00 MOVE.W D0,-(SP) * SAVE ee 01C48 01C48 3001 MOVE.W D1,D0 01C4A 6006 01C52 BRA.S N4X2 01C4C 01C4C * ENTRY POINT TO DECODE SPECIAL "EXTOP" 01C4C * D2 = STRIPPED OPCODE (MAY BE 64+) 01C4C 01C4C 7604 NXT4A MOVEQ #4,D3 * 4 MODE SPECIFIERS 01C4E 6100 E7F8 00448 BSR NXTBYT * GET THE MODE BYTE, "aabb ccdd" 01C52 01C52 3F00 N4X2 MOVE.W D0,-(SP) * SAVE dd 01C54 E448 LSR.W #2,D0 01C56 3F00 MOVE.W D0,-(SP) * SAVE cc 01C58 E448 LSR.W #2,D0 01C5A 3F00 MOVE.W D0,-(SP) * SAVE bb 01C5C E448 LSR.W #2,D0 01C5E 3F00 MOVE.W D0,-(SP) * SAVE aa 01C60 01C60 * DECODE ARGUMENTS, STORE IN ARGBLK 01C60 01C60 4244 CLR.W D4 * KEEP A COUNT OF ACTUAL ARGUMENTS 01C62 43EE FF98 LEA ARGBLK+2(A6),A1 * ARGUMENT BLOCK, SKIP OVER COUNT SLOT 01C66 01C66 301F N4X3 MOVE.W (SP)+,D0 * POP NEXT MODE SPECIFIER 01C68 0240 0003 ANDI.W #3,D0 * EXTRACT MODE BITS 01C6C 0C40 0003 CMPI.W #3,D0 * ARE THERE ANY MORE ARGUMENTS? 01C70 670E 01C80 BEQ.S N4X4 * NO 01C72 01C72 5244 ADDQ.W #1,D4 * YES, COUNT THIS ONE 01C74 6100 E800 00476 BSR GETARG * DECODE AND FETCH IT 01C78 32C0 MOVE.W D0,(A1)+ * STORE IT IN ARGUMENT BLOCK 01C7A 01C7A 5343 SUBQ.W #1,D3 * GO FOR MORE 01C7C 66E8 01C66 BNE N4X3 01C7E 6006 01C86 BRA.S N4X5 01C80 01C80 5343 N4X4 SUBQ.W #1,D3 * NUMBER OF EXTRA MODE SPECIFIERS 01C82 D643 ADD.W D3,D3 01C84 DEC3 ADDA.W D3,SP * FLUSH THEM 01C86 01C86 41EE FF96 N4X5 LEA ARGBLK(A6),A0 * PASS ARGBLK POINTER TO THE OPERATOR HERE ... 01C8A 3084 MOVE.W D4,(A0) * STORE NUMBER OF ARGUMENTS 01C8C 01C8C * CALCULATE THE OPERATOR ROUTINE ADDRESS 01C8C 01C8C D442 ADD.W D2,D2 * WORD OFFSET 01C8E 43ED 017E LEA EXTOPS,A1 01C92 3431 2000 MOVE.W 0(A1,D2.W),D2 * GET THE OPx ROUTINE OFFSET 01C96 43FA E368 00000 LEA ZBASE,A1 01C9A 43F1 2000 LEA 0(A1,D2.W),A1 * CALCULATE THE OPx ROUTINE ADDRESS 01C9E 01C9E 3011 MOVE.W (A1),D0 01CA0 0C40 4E71 CMPI.W #NOOP,D0 * ARGBLK EXPECTED? 01CA4 6716 01CBC BEQ.S N4X6 * YES 01CA6 * THIS WORKS AS LONG AS NO ROUTINE EVER BEGINS WITH "ORI.B"! 01CA6 0C40 0004 CMPI.W #4,D0 * ARGBLK EXPECTED /AND/ DEFAULTS DEFINED? 01CAA 630C 01CB8 BLS.S N4X5A * YES 01CAC 01CAC 5488 ADDQ.L #2,A0 * NO, PASS ARGS IN REGISTERS 01CAE 3018 MOVE.W (A0)+,D0 01CB0 3218 MOVE.W (A0)+,D1 01CB2 3418 MOVE.W (A0)+,D2 01CB4 3618 MOVE.W (A0)+,D3 * MAXIMUM OF FOUR 01CB6 6004 01CBC BRA.S N4X6 01CB8 01CB8 6100 0008 01CC2 N4X5A BSR SETDEF * GET DEFAULTS; ADVANCE A1 01CBC 4E91 N4X6 JSR (A1) * CALL THE OPERATOR ROUTINE 01CBE 6000 FE94 01B54 BRA NXTINS 01CC2 01CC2 * ---------------------- 01CC2 * SETDEF 01CC2 * ---------------------- 01CC2 01CC2 * SET UP DEFAULT ARGS IN ARGBLK[], USING VALUES FROM DEFBLK[] 01CC2 * CALLED BY INDIVIDUAL OPERATORS, SINCE DEFAULT COUNT/VALUES MAY VARY 01CC2 * CALLED AT BEGINNING OF OPS, SO NEED NOT SAVE REGISTERS 01CC2 * GIVEN A0 -> ARGBLK, A1 -> DEFBLK, (A1) = MAX ARGS, 01CC2 * RETURN A0 -> ARGBLK, A1 -> END OF DEFBLK 01CC2 01CC2 G 2448 SETDEF MOVE.L A0,A2 01CC4 3018 MOVE.W (A0)+,D0 * ACTUAL # ARGS PASSED (REQS PLUS OPTS) 01CC6 3219 MOVE.W (A1)+,D1 * MAX # ARGS POSSIBLE 01CC8 G 2649 MOVE.L A1,A3 01CCA D241 ADD.W D1,D1 01CCC D6C1 ADDA.W D1,A3 * SAVE PTR TO END OF DEFBLK 01CCE D040 ADD.W D0,D0 01CD0 9240 SUB.W D0,D1 * DIFFERENCE IS # DEFAULTS TO SET (x2) 01CD2 6F0A 01CDE BLE.S SDFX4 * NONE 01CD4 01CD4 D0C0 ADDA.W D0,A0 * SKIP OVER ACTUAL ARGS 01CD6 D2C0 ADDA.W D0,A1 01CD8 30D9 SDFX2 MOVE.W (A1)+,(A0)+ * COPY DEFAULT VALS 01CDA 5541 SUBQ.W #2,D1 01CDC 66FA 01CD8 BNE.S SDFX2 01CDE 01CDE G 204A SDFX4 MOVE.L A2,A0 * RETURN ARGBLK PTR INTACT 01CE0 G 224B MOVE.L A3,A1 * RETURN PTR PAST DEFBLK 01CE2 4E75 RTS 01CE4 01CE4 * --------------------------------------------------------------------------- 01CE4 * DISPATCH TABLES 01CE4 * --------------------------------------------------------------------------- 01CE4 01CE4 * UNIMPLEMENTED OPCODES DISPATCH TO HERE ... 01CE4 01CE4 4240 OPERR CLR.W D0 01CE6 41ED 012F LEA MSGBAD,A0 01CEA 6000 0A6C 02758 BRA FATAL * 'Bad operation' 01CEE 0012F DATA 0012F 426164206F7065 MSGBAD DC.B 'Bad operation',0 01CEE CODE 01CEE 0013D DATA 0013E 1770 ZEROPS DC.W OPRTRU-ZBASE * 176 00140 1774 DC.W OPRFAL-ZBASE * 177 00142 100E DC.W OPPRNI-ZBASE * 178 00144 1026 DC.W OPPRNR-ZBASE * 179 00146 17AE DC.W OPNOOP-ZBASE * 180 00148 1CE4 DC.W OPERR-ZBASE 0014A 1CE4 DC.W OPERR-ZBASE 0014C 1ABA DC.W OPRSTT-ZBASE * 183 0014E 1778 DC.W OPRSTA-ZBASE * 184 00150 17B0 DC.W OPCATCH-ZBASE * 185 XZIP 00152 1ADC DC.W OPQUIT-ZBASE * 186 00154 1030 DC.W OPCRLF-ZBASE * 187 00156 0F94 DC.W OPUSL-ZBASE * 188 00158 1AE0 DC.W OPVERI-ZBASE * 189 0015A 1CE4 DC.W OPERR-ZBASE * 190 XZIP ("EXTOP") 0015C 1B50 DC.W OPORIG-ZBASE * 191 XZIP 0015E 0015E 0664 ONEOPS DC.W OPQZER-ZBASE * 128 00160 073C DC.W OPQNEX-ZBASE * 129 00162 0724 DC.W OPQFIR-ZBASE * 130 00164 0718 DC.W OPLOC-ZBASE * 131 00166 08BC DC.W OPPTSI-ZBASE * 132 00168 0ABE DC.W OPINC-ZBASE * 133 0016A 0ACC DC.W OPDEC-ZBASE * 134 0016C 0FF0 DC.W OPPRNB-ZBASE * 135 0016E 169A DC.W OPCAL1-ZBASE * 136 EZIP 00170 06DE DC.W OPREMO-ZBASE * 137 00172 0FF8 DC.W OPPRND-ZBASE * 138 00174 173C DC.W OPRETU-ZBASE * 139 00176 17A4 DC.W OPJUMP-ZBASE * 140 00178 0FE0 DC.W OPPRIN-ZBASE * 141 0017A 0A54 DC.W OPVALU-ZBASE * 142 0017C 1688 DC.W OPICAL1-ZBASE * 143 XZIP 0017E 0017E TWOOPS: 0017E 1CE4 EXTOPS: DC.W OPERR-ZBASE * 0 (OR 192+0) 00180 064C DC.W OPQEQU-ZBASE * 1 00182 05F6 DC.W OPQLES-ZBASE * 2 00184 0600 DC.W OPQGRT-ZBASE * 3 00186 0AFA DC.W OPQDLE-ZBASE * 4 00188 0ADA DC.W OPQIGR-ZBASE * 5 0018A 0754 DC.W OPQIN-ZBASE * 6 0018C 060A DC.W OPBTST-ZBASE * 7 0018E 0616 DC.W OPBOR-ZBASE * 8 00190 0622 DC.W OPBAND-ZBASE * 9 00192 0816 DC.W OPQFSE-ZBASE * 10 00194 0828 DC.W OPFSET-ZBASE * 11 00196 0834 DC.W OPFCLE-ZBASE * 12 00198 0A5C DC.W OPSET-ZBASE * 13 0019A 06B6 DC.W OPMOVE-ZBASE * 14 0019C 0840 DC.W OPGET-ZBASE * 15 0019E 0852 DC.W OPGETB-ZBASE * 16 001A0 0764 DC.W OPGETP-ZBASE * 17 001A2 088A DC.W OPGTPT-ZBASE * 18 001A4 07D0 DC.W OPNEXT-ZBASE * 19 001A6 0562 DC.W OPADD-ZBASE * 20 001A8 0568 DC.W OPSUB-ZBASE * 21 001AA 056E DC.W OPMUL-ZBASE * 22 001AC 0574 DC.W OPDIV-ZBASE * 23 001AE 0588 DC.W OPMOD-ZBASE * 24 001B0 16A6 DC.W OPCAL2-ZBASE * 25 EZIP 001B2 1694 DC.W OPICAL2-ZBASE * 26 XZIP 001B4 1494 DC.W OPCOLOR-ZBASE * 27 XZIP 001B6 17BC DC.W OPTHROW-ZBASE * 28 XZIP 001B8 1CE4 DC.W OPERR-ZBASE 001BA 1CE4 DC.W OPERR-ZBASE 001BC 1CE4 DC.W OPERR-ZBASE 001BE 001BE 16A6 DC.W OPCALL-ZBASE * 224 (192+32) 001C0 0862 DC.W OPPUT-ZBASE * 225 001C2 0878 DC.W OPPUTB-ZBASE * 226 001C4 079C DC.W OPPUTP-ZBASE * 227 001C6 0B0C DC.W OPREAD-ZBASE * 228 001C8 0F98 DC.W OPPRNC-ZBASE * 229 001CA 0F9C DC.W OPPRNN-ZBASE * 230 001CC 059E DC.W OPRAND-ZBASE * 231 001CE 0A60 DC.W OPPUSH-ZBASE * 232 001D0 0A90 DC.W OPPOP-ZBASE * 233 001D2 110A DC.W OPSPLT-ZBASE * 234 001D4 107A DC.W OPSCRN-ZBASE * 235 001D6 16A6 DC.W OPXCAL-ZBASE * 236 EZIP 001D8 13C2 DC.W OPCLEAR-ZBASE * 237 EZIP 001DA 1430 DC.W OPERASE-ZBASE * 238 EZIP 001DC 124A DC.W OPCURS-ZBASE * 239 EZIP 001DE 12B4 DC.W OPCURG-ZBASE * 240 XZIP 001E0 1442 DC.W OPHLIGHT-ZBASE * 241 EZIP [WAS OPATTR] 001E2 151E DC.W OPBUFO-ZBASE * 242 EZIP 001E4 154E DC.W OPDIRO-ZBASE * 243 EZIP 001E6 15F6 DC.W OPDIRI-ZBASE * 244 EZIP 001E8 15FA DC.W OPSOUND-ZBASE * 245 EZIP 001EA 0C82 DC.W OPINPUT-ZBASE * 246 EZIP 001EC 08EC DC.W OPINTBL-ZBASE * 247 EZIP 001EE 061C DC.W OPBCOM-ZBASE * 248 XZIP 001F0 1694 DC.W OPICALL-ZBASE * 249 XZIP 001F2 1694 DC.W OPIXCAL-ZBASE * 250 XZIP 001F4 0B86 DC.W OPLEX-ZBASE * 251 XZIP 001F6 0C3C DC.W OPZWSTR-ZBASE * 252 XZIP 001F8 0956 DC.W OPCOPYT-ZBASE * 253 XZIP 001FA 09EC DC.W OPPRNT-ZBASE * 254 XZIP 001FC 1730 DC.W OPASSN-ZBASE * 255 XZIP 001FE 001FE * "EXTOPS" (XZIP) 001FE 001FE 188E DC.W OPSAVE-ZBASE * 256 (192+64) 00200 1996 DC.W OPREST-ZBASE * 257 00202 0628 DC.W OPSHIFT-ZBASE * 258 XZIP 00204 063A DC.W OPASHIFT-ZBASE * 259 XZIP 00206 1456 DC.W OPFONT-ZBASE * 260 XZIP 00208 1662 DC.W OPDISP-ZBASE * 261 XZIP 0020A 163C DC.W OPPICI-ZBASE * 262 XZIP 0020C 166E DC.W OPDCLR-ZBASE * 263 XZIP 0020E 14D2 DC.W OPMARG-ZBASE * 264 XZIP 00210 185A DC.W OPISAV-ZBASE * 265 XZIP 00212 1956 DC.W OPIRES-ZBASE * 266 XZIP 00214 1CE4 DC.W OPERR-ZBASE 00216 1CE4 DC.W OPERR-ZBASE 00218 1CE4 DC.W OPERR-ZBASE 0021A 1CE4 DC.W OPERR-ZBASE 0021C 1CE4 DC.W OPERR-ZBASE 0021E 118A DC.W OPWPOS-ZBASE * 272 YZIP 00220 11C8 DC.W OPWSIZ-ZBASE * 273 YZIP 00222 11F2 DC.W OPWATTR-ZBASE * 274 YZIP 00224 12CE DC.W OPWGET-ZBASE * 275 YZIP 00226 1392 DC.W OPSCROLL-ZBASE * 276 YZIP 00228 177C DC.W OPFSTA-ZBASE * 277 YZIP 0022A 0D36 DC.W OPMSINFO-ZBASE * 278 YZIP 0022C 0D52 DC.W OPMSLMT-ZBASE * 279 YZIP 0022E 0A64 DC.W OPXPUSH-ZBASE * 280 YZIP 00230 132C DC.W OPWPUT-ZBASE * 281 YZIP 00232 0A52 DC.W OPPRNF-ZBASE * 282 YZIP 00234 1CE4 DC.W OPERR-ZBASE 00236 1CE4 DC.W OPERR-ZBASE 00238 1CE4 DC.W OPERR-ZBASE 0023A 1CE4 DC.W OPERR-ZBASE 0023C 1CE4 DC.W OPERR-ZBASE 0023E 1CE4 DC.W OPERR-ZBASE 00240 01CEE CODE 01CEE INCLUDE 'MX3.a' 01CEE 01CEE * ---------------------------------------------------------------------------- 01CEE * STRING FUNCTIONS 01CEE * ---------------------------------------------------------------------------- 01CEE 01CEE * ZSTR CHARACTER CONVERSION VECTOR 01CEE 00240 DATA 00240 61626364656667 ZCHRS DC.B 'abcdefghijklmnopqrstuvwxyz' * CHAR SET 1 0025A 41424344454647 DC.B 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' * CHAR SET 2 00274 20203031323334 DC.B ' 0123456789.,!?_#' * CHAR SET 3 00286 00286 27 22 DC.B $27,$22 * <'>,<"> 00288 2F5C2D3A2829 DC.B '/\-:()' 0028E 00 DC.B 0 * ASCIZ 01CEE CODE 01CEE 01CEE * ---------------------- 01CEE * PUTSTR 01CEE * ---------------------- 01CEE 01CEE * OUTPUT A ZSTR, BLOCK-POINTER IN D0, BYTE-POINTER IN D1 01CEE * RETURN UPDATED POINTER 01CEE 01CEE 48E7 3C00 PUTSTR MOVEM.L D2-D5,-(SP) 01CF2 4244 CLR.W D4 * TEMP CS STARTS AT 0 01CF4 4245 CLR.W D5 * PERM CS STARTS AT 0 01CF6 01CF6 6100 E744 0043C PSX1 BSR GETWRD * GET NEXT STRING WORD 01CFA 48A7 E000 MOVEM.W D0-D2,-(SP) * SAVE POINTER & COPY OF STRING WORD 01CFE 01CFE 7602 MOVEQ #2,D3 * 3 BYTES IN WORD 01D00 3F02 PSX2 MOVE.W D2,-(SP) * PUSH CURRENT BYTE 01D02 EA42 ASR.W #5,D2 * SHIFT TO NEXT BYTE 01D04 51CB FFFA 01D00 DBF D3,PSX2 * LOOP UNTIL DONE 01D08 01D08 7602 MOVEQ #2,D3 * RETRIEVE THE 3 BYTES ... 01D0A 341F PSX3 MOVE.W (SP)+,D2 * GET NEXT BYTE 01D0C 0242 001F ANDI.W #$001F,D2 * CLEAR UNWANTED BITS 01D10 4A44 TST.W D4 * IN WORD MODE? (NEGATIVE D4) 01D12 6A1A 01D2E BPL.S PSX4 * NO 01D14 01D14 E342 ASL.W #1,D2 * YES, CALCULATE WORD OFFSET 01D16 G 206E FFE8 MOVE.L WRDTAB(A6),A0 * GET WORD TABLE POINTER 01D1A D46E FF6A ADD.W WRDOFF(A6),D2 * USE PROPER 32 WORD BLOCK 01D1E D0C2 ADDA.W D2,A0 * INDEX INTO WORD TABLE 01D20 6100 E6D4 003F6 BSR GTAWRD * GET A POINTER TO THE WORD ITSELF 01D24 6100 E820 00546 BSR BSPLIT * SPLIT IT 01D28 61C4 01CEE BSR PUTSTR * AND PRINT IT 01D2A 6000 0082 01DAE BRA PSX15 * CONTINUE WHERE WE LEFT OFF WITH TEMP CS RESET 01D2E 01D2E 0C44 0003 PSX4 CMPI.W #3,D4 * CS 3 (ASCII MODE) SELECTED? 01D32 6D16 01D4A BLT.S PSX6 * NO, NORMAL CS 01D34 6E08 01D3E BGT.S PSX5 * NO, BUT WE'RE ALREADY IN ASCII MODE 01D36 08C4 000E BSET #14,D4 * YES (MAKE D4 LARGE POSITIVE) 01D3A 1802 MOVE.B D2,D4 * SAVE HIGH-ORDER ASCII BITS (2) HERE 01D3C 6072 01DB0 BRA.S PSX16 * AND GO GET NEXT BYTE 01D3E 0244 0003 PSX5 ANDI.W #$0003,D4 * EXTRACT PREVIOUSLY SAVED HIGH-ORDER BITS 01D42 EB44 ASL.W #5,D4 * POSITION THEM 01D44 8842 OR.W D2,D4 * OR IN LOW-ORDER BITS 01D46 3004 MOVE.W D4,D0 01D48 6060 01DAA BRA.S PSX14 * GO PRINT THE CHARACTER 01D4A 01D4A 0C42 0006 PSX6 CMPI.W #6,D2 * SPECIAL CODE (0 TO 5)? 01D4E 6D2A 01D7A BLT.S PSX9 * YES, SPACE, WORD, OR SHIFT 01D50 0C44 0002 CMPI.W #2,D4 * MIGHT ALSO BE SPECIAL IF IN CS 2 01D54 6612 01D68 BNE.S PSX8 * BUT WE'RE NOT 01D56 01D56 0C42 0007 CMPI.W #7,D2 * CS 2, SPECIAL CODE FOR CRLF? 01D5A 6706 01D62 BEQ.S PSX7 * YES 01D5C 6E0A 01D68 BGT.S PSX8 * NO, NOT ASCII MODE, EITHER? 01D5E 5244 ADDQ.W #1,D4 * YES IT IS, SWITCH TO ASCII MODE (CS 3) 01D60 604E 01DB0 BRA.S PSX16 * AND GO GET NEXT BYTE 01D62 6100 021E 01F82 PSX7 BSR PUTNEW * CRLF REQUESTED, DO A NEWLINE 01D66 6046 01DAE BRA.S PSX15 01D68 01D68 3204 PSX8 MOVE.W D4,D1 * NORMAL CHARACTER, GET CS 01D6A C2FC 001A MULU #26,D1 * CALCULATE OFFSET FOR THIS CS 01D6E D242 ADD.W D2,D1 * ADD IN CHARACTER OFFSET (+6) 01D70 01D70 41ED 0240 LEA ZCHRS,A0 01D74 1030 10FA MOVE.B -6(A0,D1.W),D0 * GET THE CHARACTER FROM CONVERSION VECTOR 01D78 6030 01DAA BRA.S PSX14 * GO PRINT IT 01D7A 01D7A 4A42 PSX9 TST.W D2 * IS IT A SPACE? 01D7C 6604 01D82 BNE.S PSX10 * NO 01D7E 7020 MOVEQ #32,D0 * YES, GO PRINT A SPACE 01D80 6028 01DAA BRA.S PSX14 01D82 01D82 0C42 0003 PSX10 CMPI.W #3,D2 * IS IT A WORD? 01D86 6E0E 01D96 BGT.S PSX11 * NO, MUST BE A SHIFT 01D88 08C4 000F BSET #15,D4 * SWITCH TO WORD MODE (NEG D4) FOR NEXT BYTE 01D8C 5342 SUBQ.W #1,D2 * CALCULATE WORD-TABLE BLOCK OFFSET 01D8E ED42 ASL.W #6,D2 * 64 BYTES IN A BLOCK 01D90 3D42 FF6A MOVE.W D2,WRDOFF(A6) * SAVE IT AND LOOP 01D94 601A 01DB0 BRA.S PSX16 01D96 01D96 5742 PSX11 SUBQ.W #3,D2 * CALCULATE NEW CS 01D98 4A44 TST.W D4 * TEMPORARY SHIFT (FROM CS 0)? 01D9A 6604 01DA0 BNE.S PSX12 * NO 01D9C 3802 MOVE.W D2,D4 * YES, JUST SAVE NEW TEMP CS 01D9E 6010 01DB0 BRA.S PSX16 01DA0 01DA0 B842 PSX12 CMP.W D2,D4 * IS THIS THE CURRENT CS? 01DA2 6702 01DA6 BEQ.S PSX13 * YES, DO A PERM SHIFT TO IT 01DA4 4244 CLR.W D4 * OTHERWISE, PERM SHIFT TO CS 0 01DA6 3A04 PSX13 MOVE.W D4,D5 * TEMP AND PERM CS'S ARE THE SAME NOW 01DA8 6006 01DB0 BRA.S PSX16 01DAA 01DAA 6100 01D8 01F84 PSX14 BSR PUTCHR * OUTPUT THE CHARACTER 01DAE 3805 PSX15 MOVE.W D5,D4 * RESET TEMP CS TO PERM CS 01DB0 51CB FF58 01D0A PSX16 DBF D3,PSX3 * LOOP FOR NEXT BYTE 01DB4 01DB4 4C9F 0007 MOVEM.W (SP)+,D0-D2 * RESTORE POINTERS & ORIGINAL STRING WORD 01DB8 4A42 TST.W D2 * END-OF-STRING (HIGH BIT SET)? 01DBA 6A00 FF3A 01CF6 BPL PSX1 * NO, GO GET NEXT WORD 01DBE 4CDF 003C MOVEM.L (SP)+,D2-D5 * YES, CLEAN UP & RETURN UPDATED POINTER 01DC2 4E75 RTS 01DC4 01DC4 * ---------------------- 01DC4 * CHRCS 01DC4 * ---------------------- 01DC4 01DC4 * GIVEN AN ASCII CHARACTER IN D0, RETURN THE CHARACTER SET # IN D0 01DC4 01DC4 4A00 CHRCS TST.B D0 * IS THIS A NULL? 01DC6 6604 01DCC BNE.S CHRCX1 * NO 01DC8 7003 MOVEQ #3,D0 * YES, RETURN DUMMY CS NUMBER 01DCA 6022 01DEE BRA.S CHRCX4 01DCC 01DCC 0C00 0061 CHRCX1 CMPI.B #'a',D0 * LOWERCASE CHAR? 01DD0 6D0A 01DDC BLT.S CHRCX2 * NO 01DD2 0C00 007A CMPI.B #'z',D0 01DD6 6E04 01DDC BGT.S CHRCX2 * NO 01DD8 4240 CLR.W D0 * YES, RETURN CS 0 01DDA 6012 01DEE BRA.S CHRCX4 01DDC 01DDC 0C00 0041 CHRCX2 CMPI.B #'A',D0 * UPPERCASE CHAR? 01DE0 6D0A 01DEC BLT.S CHRCX3 * NO 01DE2 0C00 005A CMPI.B #'Z',D0 01DE6 6E04 01DEC BGT.S CHRCX3 * NO 01DE8 7001 MOVEQ #1,D0 * YES, RETURN CS 1 01DEA 6002 01DEE BRA.S CHRCX4 01DEC 01DEC 7002 CHRCX3 MOVEQ #2,D0 * OTHERWISE CALL IT CS 2 01DEE 4E75 CHRCX4 RTS 01DF0 01DF0 * ---------------------- 01DF0 * CHRBYT 01DF0 * ---------------------- 01DF0 01DF0 * GIVEN AN ASCII CHARACTER IN D0, RETURN ZSTR BYTE VALUE IN D0 (6 TO 31, OR 0) 01DF0 01DF0 41ED 0240 CHRBYT LEA ZCHRS,A0 * POINT TO CONVERSION VECTOR 01DF4 01DF4 B018 CHRBX1 CMP.B (A0)+,D0 * FOUND THE CHARACTER? 01DF6 6708 01E00 BEQ.S CHRBX2 * YES 01DF8 4A10 TST.B (A0) * END OF STRING? 01DFA 66F8 01DF4 BNE CHRBX1 * NO, CONTINUE SEARCH 01DFC 4240 CLR.W D0 * YES, RETURN ZERO FOR FAILURE 01DFE 6016 01E16 BRA.S CHRBX4 01E00 01E00 2008 CHRBX2 MOVE.L A0,D0 * CALCULATE OFFSET OF CHAR INTO VECTOR 01E02 41ED 0240 LEA ZCHRS,A0 01E06 9088 SUB.L A0,D0 01E08 5A40 ADDQ.W #5,D0 * ADJUST OFFSET SO FIRST CHAR IS 6 01E0A 01E0A 0C40 0020 CHRBX3 CMPI.W #32,D0 * IN BASE CODE RANGE (6-31)? 01E0E 6D06 01E16 BLT.S CHRBX4 * YES 01E10 0440 001A SUBI.W #26,D0 * SUBTRACT MULTIPLES OF 26 UNTIL BASE CODE 01E14 60F4 01E0A BRA CHRBX3 01E16 4E75 CHRBX4 RTS 01E18 01E18 * ---------------------- 01E18 * ZWORD 01E18 * ---------------------- 01E18 01E18 * GIVEN UP TO 6 (EZIP 9) ASCIZ CHARACTERS, BUFFER POINTER IN A1, 01E18 * CONVERT THEM TO A TWO (EZIP THREE) WORD ZSTR, BUFFER POINTER IN A0 01E18 01E18 0000 0005 PADCHR EQU 5 * ZSTR PADDING CHAR (SHIFT 2) 01E18 01E18 48E7 6020 ZWORD MOVEM.L D1-D2/A2,-(SP) 01E1C G 2448 MOVE.L A0,A2 01E1E 343C 0009 MOVE.W #VCHARS,D2 * NUMBER OF PACKED CHARS IN A ZSTR (6 OR 9) 01E22 01E22 4241 ZWX1 CLR.W D1 01E24 1219 MOVE.B (A1)+,D1 * GET NEXT CHARACTER, END-OF-STRING? 01E26 6738 01E60 BEQ.S ZWX4 * YES 01E28 01E28 3001 MOVE.W D1,D0 01E2A 6198 01DC4 BSR CHRCS * FIND THE CS NUMBER FOR THIS CHAR 01E2C 4A40 TST.W D0 * CS 0? 01E2E 6708 01E38 BEQ.S ZWX2 * YES 01E30 5640 ADDQ.W #3,D0 * NO, CALCULATE TEMP SHIFT BYTE 01E32 3F00 MOVE.W D0,-(SP) * SAVE THE SHIFT BYTE 01E34 5342 SUBQ.W #1,D2 * REDUCE BYTE COUNT, DONE YET? 01E36 6730 01E68 BEQ.S ZWX6 * YES 01E38 01E38 3001 ZWX2 MOVE.W D1,D0 01E3A 61B4 01DF0 BSR CHRBYT * FIND THE PROPER BYTE VALUE FOR THIS CHAR 01E3C 4A40 TST.W D0 * IN NORMAL CS'S? 01E3E 6618 01E58 BNE.S ZWX3 * YES 01E40 01E40 7006 MOVEQ #6,D0 * NO, USE ASCII SHIFT 01E42 3F00 MOVE.W D0,-(SP) 01E44 5342 SUBQ.W #1,D2 * DONE YET? 01E46 6720 01E68 BEQ.S ZWX6 * YES 01E48 01E48 3001 MOVE.W D1,D0 * NO, SAVE HIGH-ORDER ASCII BITS (3) 01E4A EA40 ASR.W #5,D0 01E4C 3F00 MOVE.W D0,-(SP) 01E4E 5342 SUBQ.W #1,D2 * DONE YET? 01E50 6716 01E68 BEQ.S ZWX6 * YES 01E52 01E52 3001 MOVE.W D1,D0 * NO, SAVE LOW-ORDER ASCII BITS (5) 01E54 0240 001F ANDI.W #$001F,D0 01E58 3F00 ZWX3 MOVE.W D0,-(SP) * SAVE THIS BYTE 01E5A 01E5A 5342 SUBQ.W #1,D2 * AND LOOP UNTIL ZWORD FULL 01E5C 66C4 01E22 BNE ZWX1 01E5E 6008 01E68 BRA.S ZWX6 01E60 01E60 3F3C 0005 ZWX4 MOVE.W #PADCHR,-(SP) * END OF STRING, SAVE A PAD BYTE 01E64 5342 SUBQ.W #1,D2 * LOOP UNTIL ZSTR FULL 01E66 66F8 01E60 BNE ZWX4 01E68 01E68 *** BUILD A ZSTR FROM THE SAVED BYTES ... 01E68 01E68 343C 0012 ZWX6 MOVE.W #VCHARS*2,D2 * 6 OR 9 CHARS (WORDS) ON STACK 01E6C G 204F MOVE.L SP,A0 * DON'T DISTURB SP YET (IN CASE OF INTERRUPTS) 01E6E D0C2 ADDA.W D2,A0 01E70 323C 0003 MOVE.W #VCHARS/3,D1 * 2 OR 3 TIMES THROUGH LOOP 01E74 01E74 3020 ZWX7 MOVE.W -(A0),D0 01E76 EB40 ASL.W #5,D0 01E78 8060 OR.W -(A0),D0 01E7A EB40 ASL.W #5,D0 01E7C 8060 OR.W -(A0),D0 01E7E 34C0 MOVE.W D0,(A2)+ * STORE A PACKED ZWORD IN RETURN BUFFER 01E80 01E80 5341 SUBQ.W #1,D1 01E82 66F0 01E74 BNE ZWX7 * GO FOR NEXT 01E84 01E84 08EA 0007 FFFE BSET #7,-2(A2) * SET HIGH-ORDER BIT IN LAST ZWORD 01E8A DEC2 ADDA.W D2,SP * AND FLUSH THE STACK 01E8C 01E8C 4CDF 0406 MOVEM.L (SP)+,D1-D2/A2 01E90 4E75 RTS 01E92 01E92 01E92 *-------------------------------------------------------------------------- 01E92 * GENERALIZED OUTPUT FOLDING ROUTINE 01E92 *-------------------------------------------------------------------------- 01E92 01E92 * ---------------------- 01E92 * INITQP 01E92 * ---------------------- 01E92 01E92 * ALLOCATE AND INITIALIZE A QUEUE PARAMETER BLOCK, 01E92 * D1 IS MAXIMUM SIZE OF BUFFER (IN BYTES), D2 IS INITIAL UNIT SIZE 01E92 * A1 -> LINE OUTPUT FUNCTION, A2 -> UNIT SIZE FUNCTION 01E92 * RETURN A0 -> PARAMETER BLOCK 01E92 01E92 7020 INITQP MOVEQ #QPLEN,D0 01E94 48C1 EXT.L D1 01E96 D081 ADD.L D1,D0 * TOTAL SPACE TO ALLOCATE 01E98 *** BSR GETMEM * GET IT 01E98 6100 052E 023C8 BSR GETMEMC * GET IT & CLEAR IT (RETURN A0 -> PARAM BLK) 01E9C 01E9C 7020 MOVEQ #QPLEN,D0 01E9E D088 ADD.L A0,D0 * LINE BUFFER STARTS HERE 01EA0 2080 MOVE.L D0,BUFPTR(A0) 01EA2 2140 0004 MOVE.L D0,NXTPTR(A0) * ALSO CURRENT POINTER 01EA6 D081 ADD.L D1,D0 01EA8 2140 0008 MOVE.L D0,ENDPTR(A0) * (PHYSICALLY) ENDS HERE 01EAC 01EAC 2149 0014 MOVE.L A1,OUTFUN(A0) * INITIALIZE LINE OUTPUT FUNCTION 01EB0 214A 0010 MOVE.L A2,SIZFUN(A0) * INITIALIZE CHAR SIZE FUNCTION 01EB4 01EB4 *** CLR.W CURSIZ(A0) * ALWAYS EMPTY INITIALLY 01EB4 *** CLR.B DUMPED(A0) * THIS ONE IS SET ONLY BY PUTLIN 01EB4 *** CLR.B INUSE(A0) * [RE]-ENTRANCY FLAG 01EB4 3002 MOVE.W D2,D0 * UNIT CAPACITY OF BUFFER ... [FALL THRU] 01EB6 01EB6 * CHANGE THE LINE WRAP POINT, A0 -> PARAMETER BLOCK, DO = NEW LENGTH (UNITS) 01EB6 * RETURN A0 -> PARAMETER BLOCK 01EB6 01EB6 SIZEQP 01EB6 *** IN THE FUTURE, IF EXTRA ROOM IS NEEDED FOR ITALICS, CALLER SHOULD 01EB6 *** (TEMPORARILY) INCREMENT CURSIZ. MUST LEAVE BUFSIZ AT MAX SO BUFFERING 01EB6 *** CAN WORK CORRECTLY IN SCREEN 1, IF USED. (For example, printing 80 01EB6 *** inverse spaces to frame the status line.) 01EB6 *** SUBQ.W #XCHAR,D0 * >>> ALLOW FOR ATARI ITALICS HACK <<< 01EB6 01EB6 *** >>> CANCEL THE ABOVE <<<. FOR MAC, SEVERAL CHARS (r, 4, ^, f) "KERN" 01EB6 *** TO RIGHT. LAST CHAR IN A LINE MUST NEVER KERN OUTSIDE WINDOW. 01EB6 *** (WHICH SUGGESTS ANOTHER POSSIBLE FIX: CHECK KERNING FOR EVERY LAST CHAR.) 01EB6 5340 SUBQ.W #1,D0 * SEEMS TO BE 1 PIXEL MAX (GENEVA 9, 12) 01EB8 01EB8 3140 000C MOVE.W D0,BUFSIZ(A0) * STORE IT 01EBC 4E75 RTS 01EBE 01EBE * ---------------------- 01EBE * QUECHR 01EBE * ---------------------- 01EBE 01EBE * QUEUE THE CHAR IN D0 FOR OUTPUT, A0 -> QUEUE-PARAMETERS BLOCK 01EBE 01EBE 4A28 001F QUECHR TST.B INUSE(A0) * ATTEMPT TO RE-ENTER? (E.G. CR INTERRUPT) 01EC2 6600 00BC 01F80 BNE QCX10 * YES, NOT SUPPORTED, JUST EXIT 01EC6 117C 0001 001F MOVE.B #1,INUSE(A0) * "ENTER" 01ECC 01ECC 48E7 0878 MOVEM.L D4/A1-A4,-(SP) 01ED0 3800 MOVE.W D0,D4 * MOVE PARAMS TO A4/D4 01ED2 G 2848 MOVE.L A0,A4 01ED4 01ED4 G 206C 0010 MOVE.L SIZFUN(A4),A0 01ED8 4E90 JSR (A0) * GET UNIT SIZE OF NEW CHAR 01EDA 4844 SWAP D4 01EDC 3800 MOVE.W D0,D4 * AND SAVE IN D4-HIGH 01EDE 4844 SWAP D4 01EE0 01EE0 * NOTE: FOR PROPORTIONAL FONTS, NEED /TWO/ FULLNESS TESTS HERE: 01EE0 * LOGICALLY FULL (UNITS) - WRAP WORDS, ADD CR 01EE0 * PHYSICALLY FULL (BYTES) - [OUGHT NOT TO ADD CR] 01EE0 01EE0 *** MOVE.W CURSIZ(A4),D0 01EE0 D06C 000E ADD.W CURSIZ(A4),D0 * [TAKING INTO ACCOUNT THE NEW CHAR] 01EE4 B06C 000C CMP.W BUFSIZ(A4),D0 * BUFFER (LOGICALLY) FULL YET? 01EE8 *** BGE.S QCX0 01EE8 6E0C 01EF6 BGT.S QCX0 * YES 01EEA G 206C 0004 MOVE.L NXTPTR(A4),A0 01EEE G B1EC 0008 CMP.L ENDPTR(A4),A0 * BUFFER (PHYSICALLY) FULL YET? ("iiiii...") 01EF2 6D00 0074 01F68 BLT QCX8 * NO 01EF6 01EF6 0C04 0020 QCX0 CMPI.B #32,D4 * YES, BUT DID A SPACE CAUSE OVERFLOW? 01EFA 661A 01F16 BNE.S QCX1 * NO 01EFC 01EFC 202C 0004 MOVE.L NXTPTR(A4),D0 * YES, JUST PRINT THE WHOLE BUFFER 01F00 G 2054 MOVE.L BUFPTR(A4),A0 01F02 01F02 G 266C 0014 MOVE.L OUTFUN(A4),A3 01F06 4E93 JSR (A3) 01F08 01F08 426C 000E CLR.W CURSIZ(A4) * RESET LENGTH COUNTER 01F0C 2954 0004 MOVE.L BUFPTR(A4),NXTPTR(A4) * RESET CURRENT CHAR POINTER 01F10 422C 001C CLR.B DUMPED(A4) * STARTING A FRESH LINE 01F14 6062 01F78 BRA.S QCX9 * EXIT, IGNORING SPACE 01F16 01F16 * FOLDING ROUTINE, SEARCH FOR MOST-RECENT SPACE ... 01F16 01F16 G 2254 QCX1 MOVE.L BUFPTR(A4),A1 * BEGINNING OF BUFFER 01F18 G 246C 0004 MOVE.L NXTPTR(A4),A2 * END OF BUFFER (+1) 01F1C 6006 01F24 BRA.S QCX2A * ALLOW FOR EMPTY [DUMPED] BUFFER 01F1E 01F1E 0C22 0020 QCX2 CMPI.B #32,-(A2) * SEARCH FOR SPACE BACKWARDS FROM END 01F22 6710 01F34 BEQ.S QCX4 * FOUND ONE 01F24 B5C9 QCX2A CMPA.L A1,A2 * REACHED BEGINNING OF BUFFER? 01F26 6EF6 01F1E BGT QCX2 * NOT YET 01F28 01F28 * NO SPACES FOUND, DUMP WHOLE BUFFER ... 01F28 01F28 4A2C 001C QCX3 TST.B DUMPED(A4) * BUT WAS THIS BUFFER ALREADY PARTLY EMPTIED? 01F2C 660E 01F3C BNE.S QCX5 * YES, CARRY EVERYTHING OVER TO NEXT LINE 01F2E 01F2E G 246C 0004 MOVE.L NXTPTR(A4),A2 * OTHERWISE, OUTPUT EVERYTHING 01F32 6008 01F3C BRA.S QCX5 01F34 01F34 * SPACE WAS FOUND, DUMP THE BUFFER (THROUGH SPACE) ... 01F34 01F34 G 204A QCX4 MOVE.L A2,A0 * POINTER TO THE SPACE 01F36 528A ADDQ.L #1,A2 * POINTER PAST THE SPACE 01F38 01F38 B1C9 CMPA.L A1,A0 * DEGENERATE CASE WITH SPACE AT BUFPTR? 01F3A 67EC 01F28 BEQ QCX3 * YES, OUTPUT WHOLE LINE 01F3C 01F3C 200A QCX5 MOVE.L A2,D0 * LAST CHAR TO PRINT (+1) 01F3E G 2049 MOVE.L A1,A0 * START OF BUFFER 01F40 01F40 G 266C 0014 MOVE.L OUTFUN(A4),A3 * GO DUMP IT, ADDING A CR 01F44 4E93 JSR (A3) 01F46 01F46 * SHIFT ANY REMAINING CHARS TO FRONT OF BUFFER ... 01F46 01F46 426C 000E CLR.W CURSIZ(A4) * ZERO THE UNIT COUNT 01F4A 422C 001C CLR.B DUMPED(A4) * START WITH A FRESH BUFFER 01F4E 600E 01F5E BRA.S QCX7 01F50 01F50 101A QCX6 MOVE.B (A2)+,D0 01F52 12C0 MOVE.B D0,(A1)+ * COPY NEXT CHAR TO BEGINNING OF BUF 01F54 01F54 G 206C 0010 MOVE.L SIZFUN(A4),A0 * CHAR STILL IN D0 01F58 4E90 JSR (A0) 01F5A D16C 000E ADD.W D0,CURSIZ(A4) * UPDATE THE UNIT COUNT 01F5E 01F5E B5EC 0004 QCX7 CMPA.L NXTPTR(A4),A2 * ANY MORE CHARS AFTER SPACE? 01F62 6DEC 01F50 BLT QCX6 * YES 01F64 2949 0004 MOVE.L A1,NXTPTR(A4) * NO, STORE NEW CURRENT POINTER HERE 01F68 01F68 * FINALLY, STORE THE NEW CHAR AND EXIT ... 01F68 01F68 G 206C 0004 QCX8 MOVE.L NXTPTR(A4),A0 01F6C 10C4 MOVE.B D4,(A0)+ * STORE THE NEW CHARACTER IN BUFFER 01F6E 2948 0004 MOVE.L A0,NXTPTR(A4) * AND UPDATE POINTER 01F72 01F72 4844 SWAP D4 * (UNIT SIZE SAVED IN D4-HIGH) 01F74 D96C 000E ADD.W D4,CURSIZ(A4) * UPDATE COUNTER 01F78 01F78 422C 001F QCX9 CLR.B INUSE(A4) * "EXIT" 01F7C 4CDF 1E10 MOVEM.L (SP)+,D4/A1-A4 01F80 4E75 QCX10 RTS 01F82 01F82 *-------------------------------------------------------------------------- 01F82 * MAIN OUTPUT HANDLER 01F82 *-------------------------------------------------------------------------- 01F82 01F82 * !ALL! OUTPUT GENERATED BY THE GAME (AND THE USER) SHOULD BE CHANNELED 01F82 * THROUGH THE FOLLOWING TWO ROUTINES, WHICH REDIRECT IT APPROPRIATELY. 01F82 01F82 * ---------------------- 01F82 * PUTNEW 01F82 * ---------------------- 01F82 01F82 * OUTPUT A NEWLINE 01F82 01F82 700D PUTNEW MOVEQ #13,D0 * JUST FALL THROUGH WITH A CR 01F84 01F84 * ---------------------- 01F84 * PUTCHR 01F84 * ---------------------- 01F84 01F84 * OUTPUT THE CHAR IN D0 (TO THE REQUESTED DEVICES) 01F84 01F84 0C00 0009 PUTCHR CMPI.B #9,D0 * TAB? (OLD ZORK BUG, DISPLAYS GARBAGE) 01F88 6602 01F8C BNE.S PCX1 01F8A 7020 MOVEQ #32,D0 * YES, MAP TO A SPACE 01F8C 4E71 PCX1 NOP * 01F8E 01F8E *** STATUS LINE OUTPUT (ZIP INTERNAL FUNCTION ONLY) ... 01F8E 01F8E IF CZIP THEN 01F8E ENDIF 01F8E 01F8E *** TABLE OUTPUT ... 01F8E 01F8E IF EZIP THEN 01F8E 4A6E FF62 TST.W VOTABL(A6) * TABLE OUTPUT? 01F92 6600 F5AE 01542 BNE TABCHR * YES (ABORT PUTCHR PER "DIROUT" SPEC) 01F96 ENDIF 01F96 01F96 3F00 MOVE.W D0,-(SP) * OTHERWISE, SAVE THE CHAR HERE 01F98 01F98 *** SCRIPT (BEFORE SCREEN, SO "OPEN" ERROR DISPLAYS IN CORRECT SEQUENCE) 01F98 01F98 IF EZIP THEN 01F98 4A6E FF66 TST.W VOPRNT(A6) * [GLOBAL] SCRIPTING ACTIVE? 01F9C ENDIF 01F9C IF CZIP THEN 01F9C ENDIF 01F9C 6706 01FA4 BEQ.S PCX2 * NO 01F9E 01F9E *** MOVEQ #WFSCRP,D0 * [CHECKED IN SCRCHR -- MOVE HERE INSTEAD?] 01F9E *** BSR TSTWFLG * SCRIPTING ACTIVE IN /CURRENT/ WINDOW? 01F9E *** BEQ.S PCX2 * NO 01F9E 01F9E 3017 MOVE.W (SP),D0 * SCRIPT THIS CHAR 01FA0 6100 0086 02028 BSR SCRCHR 01FA4 01FA4 *** SCREEN DISPLAY ... 01FA4 01FA4 4A6E FF68 PCX2 TST.W VOCONS(A6) * CONSOLE OUTPUT ACTIVE? 01FA8 6706 01FB0 BEQ.S PCX3 * NO 01FAA 01FAA 3017 MOVE.W (SP),D0 * YES, DISPLAY THE CHAR 01FAC 6100 0008 01FB6 BSR QDCHR 01FB0 01FB0 *** FILE OUTPUT ... 01FB0 01FB0 4E71 PCX3 NOP * NOT IMPLEMENTED 01FB2 01FB2 4A5F TST.W (SP)+ * FLUSH CHAR FROM STACK 01FB4 4E75 RTS 01FB6 01FB6 *-------------------------------------------------------------------------- 01FB6 * TERMINAL DISPLAY FUNCTIONS 01FB6 *-------------------------------------------------------------------------- 01FB6 01FB6 * ---------------------- 01FB6 * QDCHR 01FB6 * ---------------------- 01FB6 01FB6 * QUEUE/DISPLAY THE CHAR IN D0 01FB6 01FB6 4A6E FF5A QDCHR TST.W VOBUFF(A6) * IS BUFFERING TURNED OFF? 01FBA 6700 0622 025DE BEQ OUTCHR * YES, GO TO SCREEN (THIS HANDLES CR'S ALSO) 01FBE 01FBE 0C00 000D CMPI.B #13,D0 * CR? 01FC2 6700 000A 01FCE BEQ NEWLIN * YES, DUMP THE BUFFER 01FC6 01FC6 G 206E FF54 MOVE.L DQUE(A6),A0 * OTHERWISE, GO QUEUE IT 01FCA 6000 FEF2 01EBE BRA QUECHR 01FCE 01FCE * ---------------------- 01FCE * NEWLIN 01FCE * ---------------------- 01FCE 01FCE * GO TO NEW LINE, OUTPUTTING CURRENT BUFFER 01FCE * (THIS ROUTINE NOW CALLED ONLY FROM THE PRECEEDING ROUTINE) 01FCE 01FCE 2F0C NEWLIN MOVE.L A4,-(SP) 01FD0 G 286E FF54 MOVE.L DQUE(A6),A4 * SCREEN BUFFER 01FD4 01FD4 G 2054 MOVE.L BUFPTR(A4),A0 * START OF LINE 01FD6 202C 0004 MOVE.L NXTPTR(A4),D0 * END OF CURRENT LINE 01FDA 6100 0724 02700 BSR LINOUT * CHECK "MORE", OUTPUT LINE, ADD A CR 01FDE 01FDE 2954 0004 MOVE.L BUFPTR(A4),NXTPTR(A4) * RESET CHARACTER POINTER 01FE2 426C 000E CLR.W CURSIZ(A4) * RESET UNIT COUNT 01FE6 422C 001C CLR.B DUMPED(A4) * NO OUTPUT ON NEW LINE YET 01FEA 01FEA G 285F MOVE.L (SP)+,A4 01FEC 4E75 RTS 01FEE 01FEE * ---------------------- 01FEE * PUTLIN 01FEE * ---------------------- 01FEE 01FEE * OUTPUT CURRENT BUFFER, WITHOUT A NEWLINE 01FEE * (ASSUMES SOMETHING LIKE OPREAD WILL SUPPLY THE NEWLINE) 01FEE 01FEE G 206E FF54 PUTLIN1 MOVE.L DQUE(A6),A0 01FF2 4268 000E CLR.W CURSIZ(A0) * RESET UNIT COUNT (BUFFER EMPTY) 01FF6 01FF6 * ENTER HERE IF BUFFERING WILL LATER RESUME FROM CURRENT POINT 01FF6 01FF6 2F0C PUTLIN MOVE.L A4,-(SP) 01FF8 G 286E FF54 MOVE.L DQUE(A6),A4 * SCREEN BUFFER 01FFC 01FFC * CHECK FOR RE-ENTRANCY [E.G. DURING A CR INTERRUPT] 01FFC * GENERALLY, THE BUFFER IS ALREADY EMPTY, AND NOTHING SHOULD HAPPEN ANYWAY 01FFC 4A2C 001F TST.B INUSE(A4) * ATTEMPT TO RE-ENTER? 02000 6622 02024 BNE.S PTLNX2 * YES, NOT SUPPORTED, JUST EXIT 02002 02002 G 2054 MOVE.L BUFPTR(A4),A0 * START OF LINE 02004 202C 0004 MOVE.L NXTPTR(A4),D0 * END OF CURRENT LINE 02008 B088 CMP.L A0,D0 0200A 6712 0201E BEQ.S PTLNX1 * SKIP IF EMPTY 0200C 0200C 197C 0001 001F MOVE.B #1,INUSE(A4) * "ENTER" 02012 6100 06D0 026E4 BSR BUFOUT * OUTPUT IT (NO CR, BUT DOES CHECK [MORE]) 02016 2954 0004 MOVE.L BUFPTR(A4),NXTPTR(A4) * RESET CHARACTER POINTER 0201A 422C 001F CLR.B INUSE(A4) * "EXIT" 0201E 0201E 197C 0001 001C PTLNX1 MOVE.B #1,DUMPED(A4) * REMEMBER BUFFER IS PARTLY DUMPED 02024 G 285F PTLNX2 MOVE.L (SP)+,A4 02026 4E75 RTS 02028 02028 *-------------------------------------------------------------------------- 02028 * SCRIPT BUFFERING 02028 *-------------------------------------------------------------------------- 02028 02028 * ---------------------- 02028 * SCRCHR 02028 * ---------------------- 02028 02028 * /ALL/ SCRIPT OUTPUT IS CHANNELED THROUGH HERE 02028 02028 * QUEUE THE CHAR IN D0 FOR SCRIPTING 02028 02028 48A7 8000 SCRCHR MOVEM.W D0,-(SP) 0202C 7004 MOVEQ #WFSCRP,D0 0202E 6100 F040 01070 BSR TSTWFLG * SCRIPTING ACTIVE IN /CURRENT/ WINDOW? 02032 4C9F 0001 MOVEM.W (SP)+,D0 * [RESTORE CHAR, BUT DON'T DISTURB FLAGS] 02036 6602 0203A BNE.S SCRCX1 * YES 02038 4E75 RTS * NO, EXIT 0203A 0203A 0C00 000D SCRCX1 CMPI.B #13,D0 * CR? 0203E 6708 02048 BEQ.S SCRLIN * YES, DUMP SCRIPT BUFFER 02040 02040 G 206E FF50 MOVE.L SQUE(A6),A0 * SCRIPTING PARAMETERS BLOCK 02044 6000 FE78 01EBE BRA QUECHR * GO QUEUE CHAR 02048 02048 * GOT A NEWLINE -- SCRIPT THE CURRENT BUFFER 02048 02048 2F0C SCRLIN MOVE.L A4,-(SP) 0204A G 286E FF50 MOVE.L SQUE(A6),A4 * SCRIPTING PARAMETERS BLOCK 0204E 0204E G 2054 MOVE.L BUFPTR(A4),A0 * START OF LINE 02050 202C 0004 MOVE.L NXTPTR(A4),D0 * END OF CURRENT LINE 02054 6100 0742 02798 BSR SCROUT * OUTPUT LINE, ADD A CR ... 02058 02058 2954 0004 MOVE.L BUFPTR(A4),NXTPTR(A4) * RESET CHARACTER POINTER 0205C 426C 000E CLR.W CURSIZ(A4) * RESET UNIT COUNT 02060 02060 G 285F MOVE.L (SP)+,A4 02062 4E75 RTS 02064 02064 * ---------------------- 02064 * SCRINP 02064 * ---------------------- 02064 02064 * OUTPUT A USER INPUT LINE TO THE TRANSCRIPT (IF SCRIPTING) 02064 * START IN A0, LENGTH IN D0, FLAG IN D1 (NONZERO) FOR CR 02064 02064 48E7 2020 SCRINP MOVEM.L A2/D2,-(SP) 02068 G 2448 MOVE.L A0,A2 * PROTECT ARGS 0206A 3400 MOVE.W D0,D2 0206C 0206C IF EZIP THEN 0206C 4A6E FF66 TST.W VOPRNT(A6) * SCRIPTING? 02070 ENDIF 02070 IF CZIP THEN 02070 ENDIF 02070 6714 02086 BEQ.S SCRIX3 * NO, EXIT 02072 02072 4A42 TST.W D2 * LENGTH OF INPUT 02074 6708 0207E BEQ.S SCRIX2 * ZERO, JUST DO THE CR 02076 02076 101A SCRIX1 MOVE.B (A2)+,D0 * SCRIPT NEXT CHAR 02078 61AE 02028 BSR SCRCHR * (USE BUFFERING, SO WRAP IS CORRECT) 0207A 5342 SUBQ.W #1,D2 0207C 66F8 02076 BNE.S SCRIX1 0207E 0207E 4A41 SCRIX2 TST.W D1 * CR REQUESTED? 02080 6704 02086 BEQ.S SCRIX3 * NO 02082 700D MOVEQ #13,D0 * YES, ADD THE CR 02084 61A2 02028 BSR SCRCHR 02086 02086 4CDF 0404 SCRIX3 MOVEM.L (SP)+,D2/A2 0208A 4E75 RTS 0208C 0208C * ---------------------- 0208C * SCRNAM 0208C * ---------------------- 0208C 0208C * ECHO THE SAVE/RESTORE FILENAME TO THE TRANSCRIPT (IF SCRIPTING) 0208C * (USER SELECTED IT THRU A SPECIAL DIALOG) 0208C 0208C 2F01 SCRNAM MOVE.L D1,-(SP) 0208E 0208E 41ED 028F LEA MSGSCN,A0 * 'File: ' 02092 6100 E2F2 00386 BSR STRLEN * LEAVE LENGTH OF STRING IN D0 02096 4241 CLR.W D1 * NO CR YET 02098 61CA 02064 BSR SCRINP 0028F DATA 0028F 46696C653A20 0 MSGSCN DC.B 'File: ',0 * (PHRASE OKAY FOR SAVE & RESTORE) 0209A CODE 0209A 0209A 41ED 0000 LEA filename,A0 * SIMPLE NAME (NO DISK/PATH SPEC) 0209E 7000 MOVEQ #0,D0 020A0 1018 MOVE.B (A0)+,D0 * LENGTH [MAC PASCAL FORMAT] 020A2 7201 MOVEQ #1,D1 * END WITH CR 020A4 61BE 02064 BSR SCRINP 020A6 020A6 221F MOVE.L (SP)+,D1 020A8 4E75 RTS 020AA 020AA * ---------------------------------------------------------------------------- 020AA * PAGING ROUTINES 020AA * ---------------------------------------------------------------------------- 020AA 020AA * ---------------------- 020AA * NEWZPC 020AA * ---------------------- 020AA 020AA * NORMALIZE ZPC & (IF NECESSARY) GET PROPER PAGE 020AA 020AA 302E FFBA NEWZPC MOVE.W ZPC2(A6),D0 * LOW ORDER ZPC 020AE E040 ASR.W #8,D0 * EXTRACT REQUIRED BLOCK ADJUSTMENT (+ OR -) 020B0 E240 ASR.W #1,D0 020B2 020B2 D16E FFBC ADD.W D0,ZPC1(A6) * AND ADJUST HIGH ORDER ZPC 020B6 026E 01FF FFBA ANDI.W #$01FF,ZPC2(A6) * NORMALIZE LOW ORDER ZPC 020BC 020BC * GET THE INDICATED PAGE 020BC 020BC 302E FFBC MOVE.W ZPC1(A6),D0 020C0 B06E FF42 CMP.W CURBLK(A6),D0 * HAS THE BLOCK CHANGED? 020C4 6744 0210A BEQ.S NZX4 * NO, EXIT 020C6 3D40 FF42 MOVE.W D0,CURBLK(A6) * YES, REMEMBER NEW BLOCK 020CA 020CA 4AAE FF3E TST.L CURTAB(A6) * IS OLD PAGE PRELOADED? 020CE 670A 020DA BEQ.S NZX2 * YES 020D0 G 206E FF3E MOVE.L CURTAB(A6),A0 * NO, RESTORE CURRENT REF TIME FOR OLD PAGE 020D4 216E FF3A 0002 MOVE.L RTIME(A6),2(A0) 020DA 020DA B06E FFFA NZX2 CMP.W ENDLOD(A6),D0 * IS NEW PAGE PRELOADED? 020DE 6D1A 020FA BLT.S NZX3 * YES 020E0 6100 002A 0210C BSR GETPAG * NO, GET THE NEW PAGE 020E4 2D48 FF44 MOVE.L A0,CURPAG(A6) * REMEMBER NEW PAGE POINTER 020E8 020E8 G 206E FF30 MOVE.L LPTAB(A6),A0 * GET NEW TABLE POINTER 020EC 2D48 FF3E MOVE.L A0,CURTAB(A6) * SAVE THIS POINTER FOR LATER 020F0 217C FFFF FFFF MOVE.L #-1,2(A0) * FAKE A HIGH RTIME TO PROTECT ZPC PAGE FOR US 0002 020F8 6010 0210A BRA.S NZX4 020FA 020FA 6100 E2B6 003B2 NZX3 BSR BLKBYT * CALCULATE PRELOAD PAGE ADDRESS 020FE D0AE FFA8 ADD.L BUFFER(A6),D0 * ABSOLUTIZE 02102 2D40 FF44 MOVE.L D0,CURPAG(A6) * REMEMBER NEW PAGE POINTER 02106 42AE FF3E CLR.L CURTAB(A6) * ZERO TABLE POINTER MEANS PAGE IS PRELOADED 0210A 0210A 4E75 NZX4 RTS 0210C 0210C * ---------------------- 0210C * GETPAG 0210C * ---------------------- 0210C 0210C * GET THE PAGE WHOSE NUMBER IS IN D0, RETURN A POINTER TO IT IN A0 0210C 0210C B06E FF38 GETPAG CMP.W LPAGE(A6),D0 * IS THIS THE SAME PAGE AS LAST REFERENCED? 02110 6758 0216A BEQ.S GPX4 * YES, RETURN ITS LOCATION 02112 02112 3D40 FF38 MOVE.W D0,LPAGE(A6) * SAVE NEW PAGE NUMBER 02116 52AE FF3A ADDQ.L #1,RTIME(A6) * UPDATE REFERENCE COUNT 0211A G 206E FFD0 MOVE.L PAGTAB(A6),A0 * PAGE INFORMATION TABLE 0211E 0211E B050 GPX1 CMP.W (A0),D0 * SEARCH FOR DESIRED BLOCK 02120 6622 02144 BNE.S GPX3 * NOT IT 02122 02122 B06E FF42 CMP.W CURBLK(A6),D0 * FOUND IT, BUT IS IT THE CURRENT ZPC PAGE? 02126 6706 0212E BEQ.S GPX2 * YES, DON'T TOUCH REF TIME (PAGE IS PROTECTED) 02128 216E FF3A 0002 MOVE.L RTIME(A6),2(A0) * NO, UPDATE ITS REFERENCE TIME 0212E 0212E 2D48 FF30 GPX2 MOVE.L A0,LPTAB(A6) * SAVE THE TABLE POINTER 02132 2008 MOVE.L A0,D0 02134 90AE FFD0 SUB.L PAGTAB(A6),D0 * BUFFER NUMBER x8 02138 ED80 ASL.L #6,D0 * CALCULATE CORE ADDRESS OF PAGE 0213A D0AE FFCC ADD.L PAGES(A6),D0 0213E 2D40 FF34 MOVE.L D0,LPLOC(A6) * SAVE IT 02142 6026 0216A BRA.S GPX4 * AND RETURN IT 02144 02144 5088 GPX3 ADDQ.L #8,A0 * SKIP OVER REFERENCE TIME, ETC. 02146 0C50 FFFF CMPI.W #-1,(A0) * END OF TABLE? 0214A 66D2 0211E BNE GPX1 * NO, CONTINUE SEARCH 0214C 0214C * DESIRED PAGE NOT RESIDENT, MUST READ IT FROM DISK 0214C 0214C 2F09 MOVE.L A1,-(SP) 0214E 6100 0020 02170 BSR FINDPG * FIND AN OLD PAGE 02152 2D48 FF34 MOVE.L A0,LPLOC(A6) * SAVE ITS PAGE POINTER 02156 2D49 FF30 MOVE.L A1,LPTAB(A6) * SAVE ITS PAGTAB POINTER 0215A 0215A 302E FF38 MOVE.W LPAGE(A6),D0 * NEW PAGE NUMBER FOR GETBLK 0215E 32C0 MOVE.W D0,(A1)+ * SAVE PAGE NUMBER IN FIRST SLOT 02160 22AE FF3A MOVE.L RTIME(A6),(A1) * SAVE CURRENT REF TIME 02164 02164 6100 069A 02800 BSR GETBLK * GET THE BLOCK 02168 G 225F MOVE.L (SP)+,A1 * CLEAN UP 0216A 0216A G 206E FF34 GPX4 MOVE.L LPLOC(A6),A0 * RETURN THE PAGE POINTER 0216E 4E75 RTS 02170 02170 * ---------------------- 02170 * FINDPG 02170 * ---------------------- 02170 02170 * FIND A GOOD (LRU) PAGE, RETURN PAGE POINTER IN A0 & PAGTAB POINTER IN A1 02170 02170 G 206E FFD0 FINDPG MOVE.L PAGTAB(A6),A0 02174 5488 ADDQ.L #2,A0 * SKIP OVER FIRST PAGE NUMBER 02176 G 70FF MOVE.L #-1,D0 * FAKE A BEST-CASE REFERENCE COUNT 02178 02178 B090 FDPGX1 CMP.L (A0),D0 * COMPARE PREV OLDEST REF TIME WITH THIS ONE 0217A 6304 02180 BLS.S FDPGX2 * STILL THE OLDEST 0217C 0217C 2010 MOVE.L (A0),D0 * NEW OLDEST, SAVE THIS REFERENCE COUNT 0217E G 2248 MOVE.L A0,A1 * AND PAGTAB LOCATION (+2) 02180 02180 5C88 FDPGX2 ADDQ.L #6,A0 * SKIP OVER REF TIME, ETC. 02182 0C58 FFFF CMPI.W #-1,(A0)+ * END OF TABLE? 02186 66F0 02178 BNE FDPGX1 * NO 02188 02188 5589 SUBQ.L #2,A1 * RETURN THE PAGTAB LOCATION HERE 0218A 2009 MOVE.L A1,D0 0218C 90AE FFD0 SUB.L PAGTAB(A6),D0 * BUFFER NUMBER x8 02190 ED80 ASL.L #6,D0 * CALCULATE CORE ADDRESS OF PAGE 02192 D0AE FFCC ADD.L PAGES(A6),D0 02196 G 2040 MOVE.L D0,A0 * AND RETURN IT HERE 02198 4E75 RTS 0219A 0219A 0219A * ---------------------------------------------------------------------- 0219A * MACHINE DEPENDENT ROUTINES -- MACINTOSH XZIP 0219A * ---------------------------------------------------------------------- 0219A 0219A * ---------------------- 0219A * SETSPLT 0219A * ---------------------- 0219A 0219A * >>> DEAD <<< 0219A * SET THE SPLIT SIZE, D0 = LINES IN TOP SCREEN (0 IF UNSPLIT) 0219A 0219A * ---------------------- 0219A * GETSPLT 0219A * ---------------------- 0219A 0219A * >>> DEAD <<< 0219A * RETURN D0 = SPLIT SIZE 0219A 0219A * ---------------------- 0219A * SETSCRN 0219A * ---------------------- 0219A 0219A * >>> DEAD <<< 0219A * SET THE ACTIVE SCREEN, D0 = NEW VALUE (0 OR 1) 0219A 0219A * ---------------------- 0219A * GETSCRN 0219A * ---------------------- 0219A 0219A * >>> DEAD <<< 0219A * RETURN D0 = CURRENTLY ACTIVE GAME SCREEN, PLUS FLAGS 0219A 0219A * ---------------------- 0219A * MAXSCRN 0219A * ---------------------- 0219A 0219A * GET FULL-SCREEN DIMENSIONS, RETURN D0.W = ROWS, D1.W = COLS 0219A 0219A MAXSCRN 0219A 302D 0000 MOVE.W totRows,D0 0219E 322D 0000 MOVE.W totCols,D1 021A2 4E75 RTS 021A4 021A4 * ---------------------- 021A4 * GETFYX 021A4 * ---------------------- 021A4 021A4 * RETURN D0.W = CELL SIZE (IN PIXELS, Y/X) OF CURRENT FONT (SEE ALSO CHSIZ) 021A4 * IF PROPORTIONAL, RETURN SIZE OF A DIGIT 021A4 021A4 302D 0000 GETFYX MOVE.W lineHeight,D0 021A8 E148 LSL.W #8,D0 021AA 806D 0000 OR.W colWidth,D0 021AE 021AE *** MOVE.W #YCHAR*256+XCHAR,D0 021AE *** MOVE.W #$0101,D0 * 1 CHAR UNIT = 1 PIXEL 021AE 4E75 RTS 021B0 021B0 * ---------------------- 021B0 * SETBUF 021B0 * ---------------------- 021B0 021B0 * ADJUST BUFFERING LENGTH (AFTER CHANGE IN WINDOW SIZE, OR MARGINS) 021B0 021B0 302D 0000 SETBUF MOVE.W lastCol,D0 021B4 906D 0000 SUB.W firstCol,D0 * CALC WIDTH 021B8 906D 0000 SUB.W margLeft,D0 021BC 906D 0000 SUB.W margRight,D0 * ADJUST FOR MARGINS 021C0 6E02 021C4 BGT.S SBFX0 021C2 *** MOVEQ #'M',D0 021C2 *** BSR DCHSIZ 021C2 *** MOVEQ ,D0 021C2 7001 MOVEQ #1,D0 * MINIMUM VALID LEN (UNITS...) 021C4 G 206E FF54 SBFX0 MOVE.L DQUE(A6),A0 021C8 6000 FCEC 01EB6 BRA SIZEQP * AND UPDATE LINE-WRAP 021CC 021CC * ---------------------- 021CC * SETBOUNDS 021CC * ---------------------- 021CC 021CC * SET DISPLAY-WINDOW POSITION AND SIZE 021CC * ALSO ADJUST CURSOR POSITION; HOME IT IF OUT OF BOUNDS 021CC * GIVEN D0/D1 = POSITION (ROW/COL, 1-ORIGIN), D2/D3 = SIZE (ROWS/COLS) 021CC 021CC SETBOUNDS 021CC 48E7 0C00 MOVEM.L D4-D5,-(SP) 021D0 3800 MOVE.W D0,D4 021D2 3A01 MOVE.W D1,D5 021D4 6100 FE20 01FF6 BSR PUTLIN * (MAKE SURE BUFFER IS EMPTY) 021D8 6100 00CE 022A8 BSR GETCURS * READ CURSOR POS (RELATIVE, 1-ORG) 021DC C144 EXG D0,D4 021DE C345 EXG D1,D5 021E0 6100 002E 02210 BSR NEWBOUNDS 021E4 021E4 302D 0000 MOVE.W totRows,D0 021E8 906D 0000 SUB.W firstRow,D0 * CALC NEW HEIGHT 021EC B840 CMP.W D0,D4 * CURSOR NOW OUT OF BOUNDS? 021EE 6E0C 021FC BGT.S SBNDX4 * YES 021F0 021F0 322D 0000 MOVE.W totCols,D1 021F4 926D 0000 SUB.W firstCol,D1 * CALC NEW WIDTH 021F8 BA41 CMP.W D1,D5 * CURSOR NOW OUT OF BOUNDS? 021FA 6F04 02200 BLE.S SBNDX6 * NO 021FC 021FC 7801 SBNDX4 MOVEQ #1,D4 * HOME CURSOR 021FE 7A01 MOVEQ #1,D5 02200 02200 3004 SBNDX6 MOVE.W D4,D0 * WRITE NEW CURSOR POS 02202 3205 MOVE.W D5,D1 02204 6100 0068 0226E BSR SETCURS 02208 02208 61A6 021B0 BSR SETBUF * ADJUST BUFFERING LENGTH 0220A 4CDF 0030 MOVEM.L (SP)+,D4-D5 0220E 4E75 RTS 02210 02210 * ---------------------- 02210 * NEWBOUNDS 02210 * ---------------------- 02210 02210 * SET DISPLAY-WINDOW POSITION AND SIZE 02210 * GIVEN D0/D1 = POSITION (ROW/COL, 1-ORIGIN), D2/D3 = SIZE (ROWS/COLS) 02210 02210 NEWBOUNDS 02210 2F07 MOVE.L D7,-(SP) 02212 02212 5340 SUBQ.W #1,D0 * FIRST ROW, MAKE 0-ORIGIN 02214 3E2D 0000 MOVE.W totRows,D7 02218 5347 SUBQ.W #1,D7 * (ONLY /LAST/ ROW CAN EQUAL totRows) 0221A 6100 0044 02260 BSR INBOUNDS * MUST BE WITHIN SCREEN 0221E 3B40 0000 MOVE.W D0,firstRow 02222 02222 4A42 TST.W D2 * HEIGHT 02224 6C02 02228 BGE.S NBNDX2 * MAKE SURE IT'S NON-NEGATIVE 02226 7400 MOVEQ #0,D2 02228 02228 D042 NBNDX2 ADD.W D2,D0 * LAST ROW (+1) 0222A 3E2D 0000 MOVE.W totRows,D7 0222E 6100 0030 02260 BSR INBOUNDS * MUST BE WITHIN SCREEN 02232 3B40 0000 MOVE.W D0,lastRow 02236 02236 5341 SUBQ.W #1,D1 * FIRST COL, MAKE 0-ORIGIN 02238 3001 MOVE.W D1,D0 0223A 3E2D 0000 MOVE.W totCols,D7 0223E 5347 SUBQ.W #1,D7 02240 6100 001E 02260 BSR INBOUNDS * MUST BE WITHIN SCREEN 02244 3B40 0000 MOVE.W D0,firstCol 02248 02248 4A43 TST.W D3 * WIDTH 0224A 6C02 0224E BGE.S NBNDX4 * MAKE SURE IT'S NON-NEGATIVE 0224C 7600 MOVEQ #0,D3 0224E 0224E D043 NBNDX4 ADD.W D3,D0 * LAST COL (+1) 02250 3E2D 0000 MOVE.W totCols,D7 02254 6100 000A 02260 BSR INBOUNDS * MUST BE WITHIN SCREEN 02258 3B40 0000 MOVE.W D0,lastCol 0225C 0225C 2E1F MOVE.L (SP)+,D7 0225E 4E75 RTS 02260 02260 * ---------------------- 02260 * INBOUNDS 02260 * ---------------------- 02260 02260 * GIVEN D0.W = VALUE, D7.W = BOUNDS; MAKE SURE 0 <= VAL <= BOUNDS 02260 02260 INBOUNDS 02260 B047 CMP.W D7,D0 02262 6F02 02266 BLE.S IBNDX1 * CAN'T EXCEED BOUNDS 02264 3007 MOVE.W D7,D0 02266 4A40 IBNDX1 TST.W D0 02268 6C02 0226C BGE.S IBNDX2 * [THEN] MUST BE NON-NEGATIVE 0226A 7000 MOVEQ #0,D0 0226C 4E75 IBNDX2 RTS 0226E 0226E * ---------------------- 0226E * SETCURS 0226E * ---------------------- 0226E 0226E * SET CURSOR POSITION 0226E * GIVEN D0.W = ROW, D1.W = COL (1-ORIGIN, RELATIVE TO CURRENT WINDOW) 0226E * -1 MEANS DON'T CHANGE 0226E 0226E SETCURS 0226E *** bsr putlin ?? * done by caller 0226E *** MOVEM.L D1/D7,-(SP) 0226E 2F07 MOVE.L D7,-(SP) 02270 4A40 TST.W D0 * ROW [DON'T CHANGE?] 02272 6D16 0228A BLT.S SCURX2 02274 5340 SUBQ.W #1,D0 * MAKE 0-ORIGIN 02276 02276 3E2D 0000 MOVE.W lastRow,D7 0227A 9E6D 0000 SUB.W firstRow,D7 * CALC HEIGHT 0227E 5347 SUBQ.W #1,D7 02280 02280 *** MAKE SURE AT LEAST 1 /CHAR/ IN FROM WINDOW EDGE (?) 02280 *** MOVE.L CURWP(A6),A0 02280 *** MOVEQ #0,D1 02280 *** MOVE.B WFONTYX(A0),D1 * VERTICAL LINE SIZE 02280 02280 61DE 02260 BSR INBOUNDS * "CLIP" (DON'T HOME) POSITION IF NEEDED 02282 D06D 0000 ADD.W firstRow,D0 * ABSOLUTIZE POSITION 02286 3B40 0000 MOVE.W D0,curRow 0228A 0228A 3001 SCURX2 MOVE.W D1,D0 * COL [DON'T CHANGE?] 0228C 6D16 022A4 BLT.S SCURX4 0228E 5340 SUBQ.W #1,D0 * MAKE 0-ORIGIN 02290 02290 3E2D 0000 MOVE.W lastCol,D7 02294 9E6D 0000 SUB.W firstCol,D7 * CALC WIDTH 02298 5347 SUBQ.W #1,D7 0229A 61C4 02260 BSR INBOUNDS * MAKE SURE CURSOR WITHIN WINDOW 0229C D06D 0000 ADD.W firstCol,D0 * ABSOLUTIZE POSITION 022A0 3B40 0000 MOVE.W D0,curCol 022A4 022A4 2E1F SCURX4 MOVE.L (SP)+,D7 022A6 *** MOVEM.L (SP)+,D1/D7 022A6 4E75 RTS 022A8 022A8 * ---------------------- 022A8 * GETCURS 022A8 * ---------------------- 022A8 022A8 * RETURN CURSOR POSITION (RELATIVE TO CURRENT WINDOW, 1-ORIGIN) 022A8 * D0.W = ROW, D1.W = COL 022A8 022A8 6100 FD4C 01FF6 GETCURS BSR PUTLIN * (FIRST, MAKE SURE BUFFER IS EMPTY) 022AC 022AC * ENTER HERE FROM NXTLIN, ETC ... 022AC GETCURS1 022AC 302D 0000 MOVE.W curRow,D0 022B0 906D 0000 SUB.W firstRow,D0 * RELATIVIZE IT 022B4 5240 ADDQ.W #1,D0 * MAKE 1-ORIGIN 022B6 322D 0000 MOVE.W curCol,D1 022BA 926D 0000 SUB.W firstCol,D1 * RELATIVIZE IT 022BE 5241 ADDQ.W #1,D1 * MAKE 1-ORIGIN 022C0 4E75 RTS 022C2 022C2 * ---------------------- 022C2 * SETFONT 022C2 * ---------------------- 022C2 022C2 * SET FONT (IN CURRENT WINDOW), D0.W = ID 022C2 022C2 * ZSTD = 1; { Geneva } 022C2 * ZGFX = 2; { "graphics font" -- NOT HANDLED } 022C2 * ZALT = 3; { BZ Font [currently 9-point] } 022C2 * ZMONO = -1; { Monaco } 022C2 * ZTOGGLE = -2; { switch proportional/mono (for debugging) } 022C2 022C2 SETFONT 022C2 SAVEREGS 022C6 3F00 MOVE.W D0,-(SP) 022C8 4EBA 0000 JSR ZFont 022CC RESTREGS 022D0 022D0 *** MOVE.W D0,currentFont 022D0 4E75 RTS 022D2 022D2 * ---------------------- 022D2 * GETFONT 022D2 * ---------------------- 022D2 022D2 * RETURN FONT (IN CURRENT WINDOW), D0.W = ID 022D2 * >> DEAD << 022D2 022D2 * ---------------------- 022D2 * SETHL, SETATTR 022D2 * ---------------------- 022D2 022D2 3B40 0000 SETATTR MOVE.W D0,currentAttr * wrap, etc 022D6 4E75 RTS 022D8 022D8 3F01 SETHL MOVE.W D1,-(SP) 022DA 3B40 0000 MOVE.W D0,currentHl * UPDATE: inverse, etc 022DE 022DE * BIT 8 = MONOFONT -- CHECK AND HANDLE SEPARATELY (TO BE IMPLEMENTED) 022DE * IDEA: UNDER YZIP, MONOFONT SHOULD BE DEFINED UNDER OPFONT NOT OPHLIGHT 022DE 022DE * MOVE.W currentHl,D1 * PREVIOUS VAL 022DE * XXX 022DE * BSR SETFONT 022DE 022DE 321F MOVE.W (SP)+,D1 022E0 4E75 RTS 022E2 022E2 * ---------------------- 022E2 * MDATTR 022E2 * ---------------------- 022E2 022E2 * SET THE HIGHLIGHTING ("ATTRIBUTES"), ARGBIT(S) IN D0.W 022E2 * IF D0 = -1, JUST RETURN OLD ATTRIBUTES 022E2 * >> DEAD << 022E2 022E2 * ---------------------- 022E2 * MDSCROLL 022E2 * ---------------------- 022E2 022E2 * SCROLL CURRENT WINDOW, D0.W = DELTA (IN PIXELS) (NEGATIVE MEANS DOWN) 022E2 022E2 MDSCROLL 022E2 SAVEREGS 022E6 3F00 MOVE.W D0,-(SP) 022E8 4EBA 0000 JSR Scroll 022EC RESTREGS 022F0 4E75 RTS 022F2 022F2 * ---------------------- 022F2 * MDCLEAR 022F2 * ---------------------- 022F2 022F2 * CLEAR ACTIVE WINDOW 022F2 * D0.W = -1 MEANS CLEAR ENTIRE SCREEN 022F2 022F2 MDCLEAR SAVEREGS 022F6 3F00 MOVE.W D0,-(SP) 022F8 4EBA 0000 JSR ClearWindow * [was ClearLines] 022FC RESTREGS 02300 4E75 RTS 02302 02302 * ---------------------- 02302 * SETMARG 02302 * ---------------------- 02302 02302 * SET THE LEFT AND RIGHT MARGINS 02302 * D0.W = LEFT, D1.W = RIGHT (DEFAULTS ARE BOTH 0) 02302 02302 3B40 0000 SETMARG MOVE.W D0,margLeft 02306 3B41 0000 MOVE.W D1,margRight 0230A 6000 FEA4 021B0 BRA SETBUF * ADJUST BUFFERING LENGTH 0230E 0230E * ---------------------- 0230E * GETMARG 0230E * ---------------------- 0230E 0230E * >>> DEAD <<< 0230E * RETURN THE LEFT AND RIGHT MARGINS 0230E 0230E * ---------------------- 0230E * SETUNDO 0230E * ---------------------- 0230E 0230E * SET AN "UNDO-SUPPORTED" FLAG FOR PASCAL 0230E 0230E 1B40 0000 SETUNDO MOVE.B D0,undoflag * [BOOL, ADDRESS AS BYTE FROM 68K] 02312 4E75 RTS 02314 02314 * ---------------------- 02314 * MDERASE 02314 * ---------------------- 02314 02314 * CLEAR WITHIN CURRENT LINE, D0.W = START [ABSOLUTE!], D1.W = LEN 02314 * DEFAULTS VALS (-1) ARE CURSOR POSITION AND [TO] EOL 02314 02314 MDERASE SAVEREGS 02318 3F00 MOVE.W D0,-(SP) 0231A 3F01 MOVE.W D1,-(SP) 0231C 4EBA 0000 JSR EraseLine * (left, right: INTEGER) 02320 RESTREGS 02324 4E75 RTS 02326 02326 * ---------------------- 02326 * MDCOLOR 02326 * ---------------------- 02326 02326 * SET/GET SCREEN COLORS 02326 * GIVEN D0.W = FORE, D1.W = BACK, 02326 * RETURN D0.W = DEFAULT BACK/DEFAULT FORE, D1.W = COLOR FLAG (0 IF MONO) 02326 02326 MDCOLOR SAVEREGS 0232A RESWORD 0232C 3F00 MOVE.W D0,-(SP) 0232E 3F01 MOVE.W D1,-(SP) 02330 4EBA 0000 JSR SetColor 02334 POPWORD 02336 RESTREGS 0233A 7200 MOVEQ #0,D1 0233C 122D 0000 MOVE.B mColor,D1 * Mac: Boolean var 02340 4E75 RTS 02342 02342 * ---------------------- 02342 * PICINF 02342 * ---------------------- 02342 02342 * LOOKUP PICTURE SIZE INFO 02342 * GIVEN D0.W = ID, A0 -> TABLE FOR RESULTS (Y,X) 02342 * IF ID = 0, RETURN MAX ID IN TABLE WORD 0 02342 * IF ID IS IN ERROR, RETURN FLAGS NEGATIVE, ELSE ZERO 02342 * EXTERN FUNCTION opPicinf (n: INTEGER; VAR tbl: ARRAY2): INTEGER; 02342 02342 PICINF SAVEREGS 02346 RESWORD 02348 3F00 MOVE.W D0,-(SP) 0234A 2F08 MOVE.L A0,-(SP) 0234C 4EBA 0000 JSR opPicinf 02350 POPWORD 02352 RESTREGS 02356 4E75 RTS 02358 02358 * ---------------------- 02358 * PICDISP 02358 * ---------------------- 02358 02358 * DISPLAY [OR CLEAR] A PICTURE 02358 * D0.W = ID (1-ORIG), D1,D2 = YPOS,XPOS (1-ORIG), D3 = NONZERO TO CLEAR 02358 * EXTERN PROCEDURE opDisplay (id, ypos, xpos, erase: INTEGER); 02358 02358 PICDISP SAVEREGS 0235C 3F00 MOVE.W D0,-(SP) 0235E 5341 SUBQ.W #1,D1 * MAKE POSITION 0-ORIGIN 02360 3F01 MOVE.W D1,-(SP) 02362 5342 SUBQ.W #1,D2 02364 3F02 MOVE.W D2,-(SP) 02366 3F03 MOVE.W D3,-(SP) 02368 4EBA 0000 JSR opDisplay 0236C RESTREGS 02370 4E75 RTS 02372 02372 * ---------------------- 02372 * ENDTITLE 02372 * ---------------------- 02372 02372 * IF A TITLE SCREEN WAS DRAWN, WAIT FOR A KEY. DON'T ERASE SCREEN, LET 02372 * GAME. (OTHERWISE MAY CAUSE A FLASH AS GAME SETS UP ITS SCREEN COLORS.) 02372 * COME HERE AFTER GAME HAS BEEN LOADED BUT BEFORE STARTING. 02372 02372 ENDTITLE 02372 4E75 RTS * Mac: NOT IMPLEMENTED 02374 02374 * ---------------------- 02374 * SYSIN1 02374 * ---------------------- 02374 02374 * MISC SYSTEM INITIALIZATION 02374 02374 SYSIN1 SAVEREGS 02378 486E FEEC PEA GAMFIL(A6) ;OPEN GAME FILE, GET REF NUMBER ... 0237C 486E FEDA PEA APPARM(A6) ;AND FINDER PARAMETERS HANDLE ... 02380 4EBA 0000 JSR MacInit ;WHILE INITIALIZING MACINTOSH INTERFACE 02384 RESTREGS 02388 02388 4A6E FEEC TST.W GAMFIL(A6) 0238C 6702 02390 BEQ.S SYSX1 * ERROR 0238E 4E75 RTS * OK 02390 02390 41ED 0296 SYSX1 LEA MSGOPN,A0 02394 6000 03C2 02758 BRA FATAL * 'Story file open error.' 02398 00296 DATA 00296 53746F72792066 MSGOPN DC.B 'Story file open error.',0 02398 CODE 02398 02398 * ---------------------- 02398 * GETM, GETMEM, GETMEMC 02398 * ---------------------- 02398 02398 * ALLOCATE MEMORY, NUMBER OF BYTES REQUESTED IN D0.L, RETURN POINTER IN A0 02398 * (GETMEM TRAPS ERRORS, GETM DOESN'T) 02398 02398 GETM SAVEREGS 0239C 0800 0000 BTST #0,D0 * ODD REQUEST? 023A0 6702 023A4 BEQ.S GETMX1 * NO 023A2 5280 ADDQ.L #1,D0 * YES, ROUND UP (FIXES ST GEMDOS-48 BUG) 023A4 023A4 GETMX1 RESLONG 023A6 2F00 MOVE.L D0,-(SP) * REQUEST 023A8 4EBA 0000 JSR ZAlloc 023AC POPLONG 023AE G 2040 MOVE.L D0,A0 * RESULT, ZERO IF ERROR 023B0 RESTREGS 023B4 4E75 RTS 023B6 023B6 * ALLOCATE MEMORY AS ABOVE, AND CHECK FOR ERROR 023B6 023B6 61E0 02398 GETMEM BSR GETM 023B8 2008 MOVE.L A0,D0 * GOT IT? 023BA 6702 023BE BEQ.S MEMERROR * ZERO MEANS FAILURE 023BC 4E75 RTS 023BE 023BE MEMERROR 023BE 4240 CLR.W D0 023C0 41ED 02AD LEA MSGME1,A0 023C4 6000 0392 02758 BRA FATAL * 'Not enough memory.' 023C8 002AD DATA 002AD 4E6F7420656E6F MSGME1 DC.B 'Not enough memory.',0 023C8 CODE 023C8 023C8 * ALLOCATE MEMORY AS ABOVE, CHECK FOR ERROR, AND CLEAR 023C8 * (SLOW LOOP; SHOULD USE ONLY FOR SMALL BLOCKS) 023C8 023C8 2F00 GETMEMC MOVE.L D0,-(SP) 023CA 61EA 023B6 BSR GETMEM 023CC 201F MOVE.L (SP)+,D0 023CE 023CE 2F08 MOVE.L A0,-(SP) 023D0 6002 023D4 BRA.S GTMCX2 023D2 4218 GTMCX1 CLR.B (A0)+ 023D4 *** CLR.W (A0)+ * [ASSUME RETURNED PTR IS WORD ALIGNED] 023D4 G 51C8 FFFC 023D2 GTMCX2 DBRA D0,GTMCX1 * [ABSOLUTE MAX LEN = 32K] 023D8 G 205F MOVE.L (SP)+,A0 023DA 4E75 RTS 023DC 023DC * ---------------------- 023DC * MEMAVAIL 023DC * ---------------------- 023DC 023DC * DETERMINE AVAILABLE MEMORY, RETURN NUMBER OF BYTES AVAILABLE IN D0.L 023DC 023DC 0000 5000 MEMSYS EQU 40*512 * ALLOW FOR DA'S, PACKAGES, AND ZIP OVERHEAD 023DC 023DC MEMAVAIL 023DC SAVEREGS 023E0 RESLONG 023E2 70FF MOVEQ #-1,D0 * INQUIRE MAXIMUM AVAIL MEMORY 023E4 2F00 MOVE.L D0,-(SP) 023E6 4EBA 0000 JSR ZAlloc 023EA POPLONG 023EC G 0480 0000 5000 SUB.L #MEMSYS,D0 * "FUDGE FACTOR" 023F2 RESTREGS 023F6 4E75 RTS 023F8 023F8 * ---------------------- 023F8 * GTSEED 023F8 * ---------------------- 023F8 023F8 * RETURN A RANDOM NUMBER SEED IN D0, DIFFERENT EACH COLDSTART 023F8 * [FOR MAC, SECONDS ELAPSED SINCE MIDNIGHT, JAN 1, 1904, WILL WRAP IN 2040] 023F8 023F8 2038 020C GTSEED MOVE.L TIME,D0 * [MAC] 023FC 4E75 RTS 023FE 023FE * ---------------------- 023FE * TIME60 023FE * ---------------------- 023FE 023FE * ELAPSED TIME (IN 60THS SECOND) SINCE SYSTEM STARTUP 023FE 023FE 2038 016A TIME60 MOVE.L TICKS,D0 * [MAC] 02402 4E75 RTS 02404 02404 * ---------------------- 02404 * DCHSIZ, SCHSIZ 02404 * ---------------------- 02404 02404 * GIVEN AN ASCII CHAR, RETURN ITS UNIT WIDTH (IN CURRENT FONT) 02404 * >> NOW SUPPORTS PROPORTIONAL FONTS << 02404 * >> Call the Mac Toolbox directly, for speed << 02404 02404 48E7 6040 DCHSIZ MOVEM.L D1-D2/A1,-(SP) * Save regs that Toolbox doesn't [need a new macro] 02408 558F SUBQ.L #2,SP * [space for return val] 0240A *** MOVE.B D0,-(SP) * [only for a boolean!] 0240A 3F00 MOVE.W D0,-(SP) 0240C A88D _CharWidth 0240E 301F MOVE.W (SP)+,D0 02410 4CDF 0206 MOVEM.L (SP)+,D1-D2/A1 02414 02414 *** MOVEQ #XCHAR,D0 * [IN PIXELS] 02414 4E75 RTS 02416 02416 7001 SCHSIZ MOVEQ #1,D0 * SCRIPTING: ALWAYS 1 UNIT 02418 4E75 RTS 0241A 0241A * ---------------------- 0241A * DOSOUND 0241A * ---------------------- 0241A 0241A * MAC: ADJUST ARG4 0241A * COUNT: 0=INFINITE, 1-254=FINITE, -1=USE MIDI COUNT 0241A 0241A 4A43 DOSOUND TST.W D3 0241C 6E06 02424 BGT.S DOSDX2 * IF 1-254, JUST PASS ALONG 0241E 5243 ADDQ.W #1,D3 * MAP -1 TO 0 02420 6702 02424 BEQ.S DOSDX2 02422 76FF MOVEQ #-1,D3 * MAP 0 TO -1 02424 02424 DOSDX2 SAVEREGS 02428 3F00 MOVE.W D0,-(SP) * ID 0242A 3F01 MOVE.W D1,-(SP) * ACTION 0242C 3F02 MOVE.W D2,-(SP) * VOLUME 0242E 3F03 MOVE.W D3,-(SP) * COUNT 02430 4EBA 0000 JSR ZSound 02434 RESTREGS 02438 4E75 RTS 0243A 0243A * ---------------------- 0243A * ZBEEP 0243A * ---------------------- 0243A 0243A 48E7 7000 ZBEEP MOVEM.L D1-D3,-(SP) 0243E 7001 MOVEQ #1,D0 * BEEP ID 02440 7202 MOVEQ #2,D1 * START 02442 74FF MOVEQ #-1,D2 * DEFAULT VOL 02444 7601 MOVEQ #1,D3 * SINGLE REPEAT 02446 61D2 0241A BSR DOSOUND 02448 4CDF 000E MOVEM.L (SP)+,D1-D3 0244C 4E75 RTS 0244E 0244E * ---------------------- 0244E * GAMINT, GAMINT1 0244E * ---------------------- 0244E 0244E * PERIODICALLY CHECK FOR GAME INTERRUPTS 0244E 0244E * NOTE: BECAUSE THE INTERPRETER AS A WHOLE IS /NOT/ RE-ENTRANT, THIS 0244E * ROUTINE SHOULD BE CALLED ONLY FROM THE TOP OF THE MAIN LOOP (NXTINS), AND 0244E * (PERHAPS) FROM OPREAD/OPINPUT (SO SOUNDS CAN CHAIN BETWEEN MOVES). 0244E * BUT IT SHOULD /NOT/ BE CALLED FROM ITTYIN, SINCE THAT IS ALSO CALLED 0244E * FROM [MORE], AND THE INTERPRETER STATE IS UNDEFINED. 0244E 0244E 0000 0032 SKPCNT EQU 50 * 2500 ops/sec (max) ==> 50 ints/sec (max) 0244E 0244E * ENTRY POINT FROM MAIN LOOP 0244E * To avoid cutting into interpreter performance too much, we keep a 0244E * simple counter, and only occasionally perform the (somewhat costlier) 0244E * check for a sound interrupt. 0244E 0244E 536E FF22 GAMINT SUBQ.W #1,SCOUNT(A6) * TIME FOR A SOUND CHECK? 02452 6F02 02456 BLE.S GAMIX1 02454 4E75 RTS * NO, QUICK EXIT 02456 3D7C 0032 FF22 GAMIX1 MOVE.W #SKPCNT,SCOUNT(A6) * YES, RESET COUNTER AND FALL THRU 0245C 0245C * ENTRY POINT FROM INPUT-WAIT LOOP 0245C * While awaiting Mac input, check for sound every time around (or at least 0245C * every 1/10 sec). Note: called from OPREAD/OPINPUT; probably safe to call 0245C * interrupt function as long as it doesn't itself call OPREAD/OPINPUT. 0245C 0245C GAMINT1 SAVEREGS 02460 02460 * (could check first for valid SFUNC(A6), skip end-check if none, 02460 * but then end event would hang around unreported ...) 02460 02460 RESWORD 02462 4EBA 0000 JSR EndZSound * END-OF-SOUND CHECK 02466 101F MOVE.B (SP)+,D0 * >> BOOLEAN << NON-ZERO IF END DETECTED 02468 670A 02474 BEQ.S GAMIX3 0246A 0246A 302E FF24 MOVE.W SFUNC(A6),D0 * SOUND-INTERRUPT FUNCTION ("START NEXT") 0246E 6704 02474 BEQ.S GAMIX3 * NONE 02470 6100 F368 017DA BSR INCALL * CALL IT (INTERNALLY) 02474 *** TST.W D0 * (NO RETURN VAL) 02474 02474 GAMIX3 RESTREGS 02478 4E75 RTS 0247A 0247A * ---------------------- 0247A * FINISH 0247A * ---------------------- 0247A 0247A * RESTART THE SYSTEM (RETURN TO THE DESKTOP) 0247A 0247A 7000 FINISH MOVEQ #0,D0 * LAST-USED SOUND ID 0247C 7204 MOVEQ #4,D1 * CLEANUP 0247E 74FF MOVEQ #-1,D2 * DEFAULT VOL 02480 76FF MOVEQ #-1,D3 * DEFAULT REPEAT 02482 6196 0241A BSR DOSOUND * MAKE SURE IT'S OFF 02484 02484 7000 MOVEQ #0,D0 02486 6100 0300 02788 BSR SCRINIT * MAKE SURE SCRIPTING'S OFF 0248A 0248A 4A6E FEF0 TST.W INLAST(A6) * HAS THERE BEEN INPUT SINCE LAST OUTPUT? 0248E 6600 002A 024BA BNE FINIX3 * YES, JUST EXIT 02492 02492 6100 FAEE 01F82 BSR PUTNEW * NO, MUST FIRST PAUSE FOR A PROMPT 02496 41ED 02C0 LEA MSGKEY,A0 0249A 6100 0284 02720 BSR OUTMSG0 * 'Press any key to exit ' 0249E 002C0 DATA 002C0 50726573732061 MSGKEY DC.B 'Press any key to exit ',0 0249E CODE 0249E 0249E 7001 MOVEQ #1,D0 * [ALWAYS SETUP AROUND ITTYIN] 024A0 7200 MOVEQ #0,D1 * SINGLE CHAR 024A2 6100 0022 024C6 BSR SETUPI 024A6 6100 0056 024FE FINIX2 BSR ITTYIN * FIRST CHECK FOR ANY TYPED-AHEAD KEYS ... 024AA 4A00 TST.B D0 * AND DISCARD THEM 024AC 66F8 024A6 BNE FINIX2 * UNTIL NO MORE 024AE 7000 MOVEQ #0,D0 024B0 7200 MOVEQ #0,D1 * SINGLE CHAR 024B2 6100 0012 024C6 BSR SETUPI 024B6 6100 00E6 0259E BSR TTYIN * THEN WAIT FOR ONE MORE 024BA 024BA 3F2E FEEC FINIX3 MOVE.W GAMFIL(A6),-(SP) 024BE 4EBA 0000 JSR QuitGame * CLOSE GAME FILE, WINDOWS, ETC. 024C2 024C2 * THIS LINE FIXES A BUG IN ONE OF THE MPW 1.0 LIBRARIES -- IT CORRECTLY 024C2 * RESETS A SYSTEM GLOBAL USED BY THE SOUND DRIVER. MPW 2.0 IS SAID TO 024C2 * FIX THE BUG TOO, SO BEST TO REMOVE THIS LINE AFTER WE UPGRADE. 024C2 * 024C2 * NOPE, THE ZIP CAN'T DO THIS -- THE DEALLOC HASN'T HAPPENED YET! 024C2 **** MOVE.L #$0A06,#$0AE8 * (RESETS PTR TO $FFFFFFFF AFTER DEALLOC) 024C2 024C2 4E5E UNLK A6 * FLUSH THE ZIP'S STACK FRAME 024C4 4E75 RTS * RETURN TO ORIGINAL CALLER 024C6 024C6 024C6 * ----------------------------------------------- 024C6 * SCREEN/KEY I/O 024C6 * ----------------------------------------------- 024C6 024C6 * ---------------------- 024C6 * SETUPI 024C6 * ---------------------- 024C6 024C6 * MUST "BRACKET" CALLS TO TTYIN OR INCHR WITH CALLS TO HERE 024C6 * ACTIVATES/DEACTIVATES BLINKING CURSOR AND MENU COMMAND-STRINGS 024C6 * D0.W = 1 TO BEGIN CURSOR, 0 TO END 024C6 * D1.W = 1 IF STRING INPUT, 0 IF SINGLE-CHAR INPUT 024C6 024C6 4A40 SETUPI TST.W D0 * STARTING INPUT? 024C8 670E 024D8 BEQ.S SETUX1 * NO, ENDING 024CA 3D7C 0001 FEF0 MOVE.W #1,INLAST(A6) * SET INPUT FLAG 024D0 G 206E FF14 MOVE.L CURWP(A6),A0 024D4 4268 001E CLR.W WLCNT(A0) * RESET THE [MORE] COUNTER 024D8 024D8 SETUX1 SAVEREGS 024DC 1F00 MOVE.B D0,-(SP) 024DE 1F01 MOVE.B D1,-(SP) 024E0 4EBA 0000 JSR SetUpInput 024E4 RESTREGS 024E8 4E75 RTS 024EA 024EA * ---------------------- 024EA * INCHR 024EA * ---------------------- 024EA 024EA * INPUT A CHAR AND ECHO IT, RETURN CHAR IN D0 *** DEAD, USE READLN *** 024EA * [CAREFUL WITH CR AND BACKSPACE] 024EA 024EA 6100 00B2 0259E INCHR BSR TTYIN * GET CHAR 024EE 4A6E FF58 TST.W VIECHO(A6) * IS ECHOING TURNED OFF? 024F2 6708 024FC BEQ.S INCHX1 * YES, JUST EXIT 024F4 024F4 3F00 MOVE.W D0,-(SP) 024F6 6100 00F0 025E8 BSR TTYOUT * ECHO CHAR 024FA 301F MOVE.W (SP)+,D0 024FC 4E75 INCHX1 RTS 024FE 024FE * ---------------------- 024FE * TTYIN, ITTYIN 024FE * ---------------------- 024FE 024FE * INPUT A SINGLE CHAR (XZIP: or mouse clicks), NO ECHO 024FE * IF NONE AVAILABLE, RETURN A ZERO IMMEDIATELY 024FE 024FE ITTYIN SAVEREGS 02502 RESWORD 02504 4EBA 0000 JSR EventIn 02508 POPWORD 0250A RESTREGS 0250E 0240 00FF ANDI.W #$00FF,D0 02512 0C00 00FD CMPI.B #253,D0 * MOUSE BUTTON CLICK? (SINGLE OR DOUBLE) 02516 6726 0253E BEQ.S ITTYX11 * YES 02518 0C00 00FE CMPI.B #254,D0 0251C 6720 0253E BEQ.S ITTYX11 * YES 0251E 0251E 0C00 000D CMPI.B #13,D0 * CR,BS ARE ONLY VALID CONTROL CHARS 02522 6718 0253C BEQ.S ITTYX2 02524 0C00 0008 CMPI.B #8,D0 02528 6712 0253C BEQ.S ITTYX2 0252A 0252A 0C00 0003 CMPI.B #3,D0 * [MAC: MAP 'ENTER' TO 'RETURN'] 0252E 6604 02534 BNE.S ITTYX1 02530 700D MOVEQ #13,D0 02532 6008 0253C BRA.S ITTYX2 02534 02534 0C00 001F ITTYX1 CMPI.B #31,D0 * SUPPRESS OTHERS (TAB, CLR, ETC) 02538 6202 0253C BHI.S ITTYX2 0253A 7000 MOVEQ #0,D0 0253C 4E75 ITTYX2 RTS * RETURN CHAR OR FKEY CODE 0253E 0253E * HERE AFTER MOUSE EVENT, STORE POSITION IN GLOBALS 0253E 0253E 48E7 7040 ITTYX11 MOVEM.L D1-D3/A1,-(SP) 02542 3600 MOVE.W D0,D3 * SAVE MOUSE CODE (SINGLE OR DOUBLE) 02544 02544 *** ["BZ" ISN'T SETTING THE MOUSE BIT; DEPEND FOR NOW ON LOWCORE ERR-CHECK] 02544 *** MOVE.L BUFFER(A6),A0 02544 *** MOVE.W PFLAGS(A0),D0 02544 *** BTST #FMOUS,D0 * BUT DOES GAME USE MOUSE? 02544 *** BEQ.S ITTYX18 * NO 02544 02544 * CHECK IF MOUSE INBOUNDS 02544 02544 322D 0000 MOVE.W ymouse,D1 * (RELATIVE TO ENTIRE GAME WINDOW; 1-ORIGIN) 02548 ** ADDQ.W #1,D1 02548 342D 0000 MOVE.W xmouse,D2 0254C ** ADDQ.W #1,D1 0254C 0254C 302E FEF2 MOVE.W MSWIND(A6),D0 * CONSTRAIN MOUSE TO THIS WINDOW 02550 6D24 02576 BLT.S ITTYX13 * -1 MEANS NO CONSTRAINT 02552 6100 EAE0 01034 BSR CALCWP 02556 G 2248 MOVE.L A0,A1 * POINT TO WINDOW-RECORD 02558 02558 3011 MOVE.W WYPOS(A1),D0 0255A B240 CMP.W D0,D1 0255C 6D36 02594 BLT.S ITTYX18 * OUT OF BOUNDS 0255E D069 0004 ADD.W WYSIZE(A1),D0 02562 B240 CMP.W D0,D1 02564 6C2E 02594 BGE.S ITTYX18 * OUT OF BOUNDS 02566 02566 3029 0002 MOVE.W WXPOS(A1),D0 0256A B440 CMP.W D0,D2 0256C 6D26 02594 BLT.S ITTYX18 * OUT OF BOUNDS 0256E D069 0006 ADD.W WXSIZE(A1),D0 02572 B440 CMP.W D0,D2 02574 6C1E 02594 BGE.S ITTYX18 * OUT OF BOUNDS 02576 02576 * STORE MOUSE Y POSITION 02576 02576 7002 ITTYX13 MOVEQ #PMLOCY,D0 * LOWCORE-EXTENSION VAR FOR MOUSE YPOS 02578 6100 DE50 003CA BSR LOWCORE * GET ITS ADDR 0257C 6716 02594 BEQ.S ITTYX18 * ERROR (TABLE UNDEFINED, OR TOO SMALL) 0257E 3001 MOVE.W D1,D0 02580 6100 DE7C 003FE BSR PTAWRD 02584 02584 * STORE MOUSE X POSITION 02584 02584 7001 MOVEQ #PMLOCX,D0 02586 6100 DE42 003CA BSR LOWCORE 0258A 6708 02594 BEQ.S ITTYX18 * ERROR 0258C 3002 MOVE.W D2,D0 0258E 6100 DE6E 003FE BSR PTAWRD 02592 6002 02596 BRA.S ITTYX19 02594 02594 4243 ITTYX18 CLR.W D3 * ERROR, DISCARD MOUSE EVENT 02596 3003 ITTYX19 MOVE.W D3,D0 * RETURN MOUSE CODE 02598 4CDF 020E MOVEM.L (SP)+,D1-D3/A1 0259C 4E75 RTS 0259E 0259E * ENTER HERE TO LOOP UNTIL A CHAR IS AVAILABLE 0259E 0259E 48E7 6000 TTYIN MOVEM.L D1-D2,-(SP) 025A2 7001 MOVEQ #1,D0 * SET UP FOR INPUT 025A4 7200 MOVEQ #0,D1 * SINGLE CHAR 025A6 6100 FF1E 024C6 BSR SETUPI 025AA 025AA 6100 FF52 024FE TTYX1 BSR ITTYIN 025AE 4A00 TST.B D0 025B0 67F8 025AA BEQ.S TTYX1 * IF NONE, KEEP WAITING 025B2 025B2 3400 MOVE.W D0,D2 025B4 7000 MOVEQ #0,D0 * FINISHED INPUT 025B6 7200 MOVEQ #0,D1 * SINGLE CHAR 025B8 6100 FF0C 024C6 BSR SETUPI 025BC 3002 MOVE.W D2,D0 * RETURN THE CHAR 025BE 4CDF 0006 MOVEM.L (SP)+,D1-D2 025C2 4E75 RTS 025C4 025C4 * ---------------------- 025C4 * GETMOUSE 025C4 * ---------------------- 025C4 025C4 * GET MOUSE INFO, RETURN D0.W/D1.W = ROW/COL, D2.W = BUTTON FLAGS 025C4 025C4 GETMOUSE 025C4 SAVEREGS 025C8 4EBA 0000 JSR opMouseInfo 025CC 302D 0000 MOVE.W ymouse,D0 025D0 322D 0000 MOVE.W xmouse,D1 025D4 342D 0000 MOVE.W bmouse,D2 025D8 RESTREGS 025DC 4E75 RTS 025DE 025DE * ---------------------- 025DE * OUTCHR 025DE * ---------------------- 025DE 025DE * OUTPUT THE CHAR (OR CR) IN D0.B (SCROLLING IF NECESSARY) 025DE 025DE 0C00 000D OUTCHR CMPI.B #13,D0 * [DON'T PAUSE AT FINISH JUST FOR CR'S] 025E2 6704 025E8 BEQ.S TTYOUT 025E4 426E FEF0 CLR.W INLAST(A6) * CURRENT I/O IS OUTPUT 025E8 025E8 * IF CHAR = BS, THE PREVIOUS CHAR IS NOW PASSED IN THE HIGH BYTE 025E8 025E8 TTYOUT SAVEREGS 025EC 3200 MOVE.W D0,D1 025EE 0C01 0008 CMPI.B #DELCH1,D1 * BS? 025F2 6704 025F8 BEQ.S TTYOX1 * YES 025F4 7200 MOVEQ #0,D1 025F6 1200 MOVE.B D0,D1 * OTHERWISE, CLEAR HIGH BYTE 025F8 025F8 0C01 000D TTYOX1 CMPI.B #13,D1 * IS THIS A CR? 025FC 6604 02602 BNE.S TTYOX2 025FE 6100 000E 0260E BSR CRCHECK * YES, CHECK FOR POSSIBLE INTERRUPT (XZIP) 02602 IF D3BUG THEN 02602 ENDIF 02602 02602 3F01 TTYOX2 MOVE.W D1,-(SP) 02604 4EBA 0000 JSR CharOut 02608 IF D3BUG THEN 02608 ENDIF 02608 RESTREGS 0260C 4E75 RTS 0260E 0260E * ---------------------- 0260E * CRCHECK 0260E * ---------------------- 0260E 0260E * XZIP: WE'RE ABOUT TO OUTPUT A CR; CHECK FOR A SPECIAL INTERRUPT 0260E 0260E CRCHECK 0260E * XZIP: CHECK LOWCORE GLOBALS [LEFT IN FOR BACK COMPATIBILITY (YZIPTEST)] 0260E G 206E FFA8 MOVE.L BUFFER(A6),A0 02612 2008 MOVE.L A0,D0 * VALID? (MIGHT BE AN INIT ERROR) 02614 6746 0265C BEQ.S CRCHX9 02616 4A68 0030 TST.W PCRCNT(A0) * CR COUNTER ACTIVE? 0261A 670C 02628 BEQ.S CRCHX2 * NO 0261C 5368 0030 SUBQ.W #1,PCRCNT(A0) * YES, DECREMENT IT; REACHED ZERO? 02620 663A 0265C BNE.S CRCHX9 * NO 02622 3028 0032 MOVE.W PCRFUNC(A0),D0 * YES: FUNCTION TO CALL 02626 6018 02640 BRA.S CRCHX4 02628 02628 * YZIP: CHECK CURRENT WINDOW RECORD 02628 G 206E FF14 CRCHX2 MOVE.L CURWP(A6),A0 0262C 2008 MOVE.L A0,D0 * VALID? (MIGHT BE AN INIT ERROR) 0262E 672C 0265C BEQ.S CRCHX9 02630 4A68 0012 TST.W WCRCNT(A0) * CR COUNTER ACTIVE? 02634 6726 0265C BEQ.S CRCHX9 * NO 02636 5368 0012 SUBQ.W #1,WCRCNT(A0) * YES, DECREMENT IT; REACHED ZERO? 0263A 6620 0265C BNE.S CRCHX9 * NO 0263C 3028 0010 MOVE.W WCRINT(A0),D0 * YES: FUNCTION TO CALL 02640 02640 * AN INTERRUPT IS REQUESTED; INTERNALLY CALL THE INTERRUPT FUNCTION. 02640 02640 * Problem: register A4, dedicated to the game SP, is needed for this call 02640 * but is NOT currently valid. That's because some of the I/O handlers 02640 * "borrow" it, assuming that such an value would never be needed during I/O. 02640 * [May be a good reason to avoid dedicating any other registers.] 02640 02640 2F0C CRCHX4 MOVE.L A4,-(SP) 02642 3F2E FF5A MOVE.W VOBUFF(A6),-(SP) 02646 426E FF5A CLR.W VOBUFF(A6) * MAKE SURE BUFFERING OFF (NOT RE-ENTRANT!) 0264A 0264A G 286E FFBE MOVE.L STKBOT(A6),A4 * FAKE A SMALL GAME STACK 0264E D8FC 0064 ADDA.W #100,A4 * AT THE BOTTOM OF THE REAL ONE 02652 6100 F186 017DA BSR INCALL * AND HANDLE THE INTERRUPT 02656 3D5F FF5A MOVE.W (SP)+,VOBUFF(A6) 0265A G 285F MOVE.L (SP)+,A4 0265C 4E75 CRCHX9 RTS 0265E 0265E * ---------------------- 0265E * NXTLIN 0265E * ---------------------- 0265E 0265E * CHECK FOR END-OF-PAGE CONDITION 0265E 0265E 48E7 7000 NXTLIN MOVEM.L D1-D3,-(SP) 02662 G 206E FF14 MOVE.L CURWP(A6),A0 02666 3028 0004 MOVE.W WYSIZE(A0),D0 * VERTICAL WINDOW SIZE 0266A 7400 MOVEQ #0,D2 0266C 1428 001A MOVE.B WFONTYX(A0),D2 * VERTICAL LINE SIZE 02670 02670 * ALGORITHM: IF (WSIZ-LSIZ) - LCNT < LSIZ THEN PAUSE, WRITE [MORE] 02670 02670 9042 SUB.W D2,D0 * RESERVE ONE LINE FOR [MORE] ITSELF 02672 *** SUBQ.W #1,D0 02672 6F50 026C4 BLE.S NXTLX6 * DEGENERATE WINDOW (0+ LINES), DON'T PAUSE 02674 B042 CMP.W D2,D0 02676 6D4C 026C4 BLT.S NXTLX6 * TINY WINDOW (1+ LINES), SKIP ALSO ("SHOGUN") 02678 02678 9068 001E SUB.W WLCNT(A0),D0 0267C B042 CMP.W D2,D0 * PAGE FULL YET? 0267E 6C44 026C4 BGE.S NXTLX6 * NO, EXIT 02680 02680 *** MOVE.W _v_italic,-(SP) * SAVE ITALICS STATUS HERE 02680 *** TST.W (SP) * CURRENTLY IN ITALIC MODE? 02680 *** BEQ.S NXTLX1 * NO 02680 *** CLR.L -(SP) * YES, SWITCH TO NORMAL FOR [MORE] 02680 *** JSR _highlight * 0 NORMAL, 4 ITALIC 02680 *** ADDQ.L #4,SP 02680 *** NXTLX1 02680 02680 6100 FC2A 022AC BSR GETCURS1 * [DON'T TRY TO FLUSH BUFFER!] 02684 48A7 C000 MOVEM.W D0-D1,-(SP) * REMEMBER INITIAL POSITION 02688 02688 41ED 02D7 LEA MSGMOR,A0 * DISPLAY A PROMPT (NO CR) 0268C 7006 MOVEQ #6,D0 0268E 6100 003A 026CA BSR PRINT * WRITE DIRECTLY TO SCREEN 002D7 DATA 002D7 5B4D4F52455D 0 MSGMOR DC.B '[MORE]',0 02692 CODE 02692 02692 362E FEF2 MOVE.W MSWIND(A6),D3 * SAVE THIS TEMPORARILY 02696 3D7C FFFF FEF2 MOVE.W #-1,MSWIND(A6) * ENSURE THAT MOUSECLICKS UNPAUSE US, TOO 0269C 6100 FF00 0259E BSR TTYIN * WAIT FOR A KEY, NO ECHO 026A0 3D43 FEF2 MOVE.W D3,MSWIND(A6) 026A4 026A4 * MOVEQ #6,D1 * PROMPT LENGTH 026A4 *NXTLX2 MOVEQ #8,D0 026A4 * BSR TTYOUT * BACKUP CURSOR >> ASSUMES MONOFONT <<< 026A4 * SUBQ.W #1,D1 026A4 * BNE.S NXTLX2 026A4 026A4 6100 FC06 022AC BSR GETCURS1 026A8 3601 MOVE.W D1,D3 * "END-OF-MORE" COL [RELATIVE] 026AA 4C9F 0003 MOVEM.W (SP)+,D0-D1 * BEGINNING COL 026AE 9641 SUB.W D1,D3 026B0 6100 FBBC 0226E BSR SETCURS * RESTORE INITIAL POSITION 026B4 026B4 3203 MOVE.W D3,D1 * END - BEG = LEN 026B6 * MOVEQ #-1,D1 026B6 70FF MOVEQ #-1,D0 * FROM CURSOR ... 026B8 6100 FC5A 02314 BSR MDERASE * ERASE THE PROMPT 026BC 026BC *** TST.W (SP) * FORMERLY IN ITALICS MODE? 026BC *** BEQ.S NXTLX4 * NO 026BC *** MOVEQ #4,D0 * YES, RESUME 026BC *** MOVE.L D0,-(SP) 026BC *** JSR _highlight * 0 NORMAL, 4 ITALIC 026BC *** ADDQ.L #4,SP 026BC *** NXTLX4 026BC 026BC G 206E FF14 MOVE.L CURWP(A6),A0 026C0 3142 001E MOVE.W D2,WLCNT(A0) * RESET COUNTER, ALLOWING ONE OVERLAP LINE 026C4 *** MOVE.W #1,WLCNT(A0) 026C4 4CDF 000E NXTLX6 MOVEM.L (SP)+,D1-D3 026C8 4E75 RTS 026CA 026CA * ---------------------- 026CA * PRINT 026CA * ---------------------- 026CA 026CA * OUTPUT A STRING, POINTER IN A0, LENGTH IN D0.W 026CA 026CA 426E FEF0 PRINT CLR.W INLAST(A6) * CURRENT I/O IS OUTPUT 026CE 4A40 TST.W D0 026D0 6710 026E2 BEQ.S PRINTX1 * SKIP OUT IF NULL 026D2 SAVEREGS 026D6 2F08 MOVE.L A0,-(SP) * PASS THE STRING POINTER 026D8 3F00 MOVE.W D0,-(SP) * AND LENGTH 026DA 4EBA 0000 JSR LineOut 026DE RESTREGS 026E2 4E75 PRINTX1 RTS 026E4 026E4 * ---------------------- 026E4 * BUFOUT 026E4 * ---------------------- 026E4 026E4 * OUTPUT THE LINE BUFFER, BEGINNING AND END IN A0, D0 026E4 * FIRST CHECK FOR END-OF-SCREEN CONDITION (UNLESS IN WINDOW 1) 026E4 026E4 48E7 8080 BUFOUT MOVEM.L D0/A0,-(SP) 026E8 7002 MOVEQ #WFSCRL,D0 026EA 6100 E984 01070 BSR TSTWFLG * SCROLLING ACTIVE? 026EE 6704 026F4 BEQ.S BUFUX1 * NO, SKIP THE SCREEN CHECK 026F0 6100 FF6C 0265E BSR NXTLIN * YES, PAUSE FOR [MORE] IF NECESSARY 026F4 026F4 4CDF 0101 BUFUX1 MOVEM.L (SP)+,D0/A0 026F8 9088 SUB.L A0,D0 * CURRENT LENGTH OF BUFFER IN D0.W 026FA 6F02 026FE BLE.S BUFUX2 * EXIT IF NOTHING 026FC 61CC 026CA BSR PRINT * OTHERWISE, DISPLAY IT 026FE 4E75 BUFUX2 RTS 02700 02700 * ---------------------- 02700 * LINOUT 02700 * ---------------------- 02700 02700 * OUTPUT THE LINE BUFFER THEN ADD A CR, BEGINNING AND END IN A0, D0 02700 * ALSO UPDATE THE CUMULATIVE LINE COUNTER 02700 02700 61E2 026E4 LINOUT BSR BUFOUT * DISPLAY IT 02702 700D MOVEQ #13,D0 02704 6100 FED8 025DE BSR OUTCHR * AND TACK ON A CR 02708 02708 7002 MOVEQ #WFSCRL,D0 0270A 6100 E964 01070 BSR TSTWFLG * SCROLLING ACTIVE? 0270E 670E 0271E BEQ.S LINOX1 * NO 02710 02710 G 206E FF14 MOVE.L CURWP(A6),A0 * YES, UPDATE THE [MORE] COUNTER 02714 7000 MOVEQ #0,D0 02716 1028 001A MOVE.B WFONTYX(A0),D0 * VERTICAL LINE SIZE 0271A D168 001E ADD.W D0,WLCNT(A0) 0271E *** ADDQ.W #1,WLCNT(A0) 0271E 4E75 LINOX1 RTS 02720 02720 02720 *---------------------------------------------------------------------------- 02720 * ZIP MESSAGES 02720 *---------------------------------------------------------------------------- 02720 02720 * ---------------------- 02720 * OUTMSG 02720 * ---------------------- 02720 02720 * OUTPUT AN ASCIZ MESSAGE, POINTER IN A0 02720 02720 2F09 OUTMSG0 MOVE.L A1,-(SP) 02722 G 2248 MOVE.L A0,A1 * STRING POINTER 02724 02724 4240 OUTMX1 CLR.W D0 02726 1019 MOVE.B (A1)+,D0 * GET NEXT CHAR, END OF STRING? 02728 6706 02730 BEQ.S OUTMX2 * YES 0272A 0272A 6100 F858 01F84 BSR PUTCHR * NO, DISPLAY/QUEUE IT 0272E 60F4 02724 BRA OUTMX1 02730 02730 4A6E FF5A OUTMX2 TST.W VOBUFF(A6) * ARE WE BUFFERING OUTPUT? 02734 6704 0273A BEQ.S OUTMX3 * NO 02736 6100 F8BE 01FF6 BSR PUTLIN * YES, EMPTY THE BUFFER NOW 0273A 0273A G 225F OUTMX3 MOVE.L (SP)+,A1 0273C 4E75 RTS 0273E 0273E * OUTPUT AN ASCIZ MESSAGE, POINTER IN A0 (NULL IF NONE) 0273E * THEN APPEND A CR 0273E 0273E 2008 OUTMSG MOVE.L A0,D0 * ANY MESSAGE? 02740 6702 02744 BEQ.S OUTMX9 * NO, JUST A CR 02742 61DC 02720 BSR OUTMSG0 * YES, OUTPUT THE STRING 02744 6000 F83C 01F82 OUTMX9 BRA PUTNEW 02748 02748 * ---------------------- 02748 * ZWARN 02748 * ---------------------- 02748 02748 * PRINT AN INTERPRETER WARNING, A0 -> MESSAGE 02748 02748 2F08 ZWARN MOVE.L A0,-(SP) 0274A 6100 F836 01F82 BSR PUTNEW * CR 0274E 41ED 02DE LEA MSGZWR,A0 02752 61CC 02720 BSR OUTMSG0 * MESSAGE HEADER 02754 002DE DATA 002DE 2A 2A 2A MSGZWR DC.B $2A,$2A,$2A * [***] 002E1 20496E74657270 DC.B ' Interpreter warning: ',0 02754 CODE 02754 02754 G 205F MOVE.L (SP)+,A0 * MESSAGE 02756 60E6 0273E BRA OUTMSG 02758 02758 * ---------------------- 02758 * FATAL 02758 * ---------------------- 02758 02758 * PRINT A FATAL ERROR HEADER, CODE NUMBER AND MESSAGE (LAST TWO ARE OPTIONALS) 02758 * ERROR CODE IN D0.W, STRING IN A0, ZERO MEANS NONE 02758 02758 G 2248 FATAL MOVE.L A0,A1 * [TRASHES THESE REGS, BUT DOESN'T MATTER] 0275A 3200 MOVE.W D0,D1 0275C 6100 F824 01F82 BSR PUTNEW * NEW LINE 02760 02760 41ED 02F8 LEA MSGFTL,A0 * PRINT A STANDARD ERROR HEADER, NO CR 02764 61BA 02720 BSR OUTMSG0 * 'Internal Error ' 02766 002F8 DATA 002F8 496E7465726E61 MSGFTL DC.B 'Internal Error ',0 02766 CODE 02766 02766 4A41 TST.W D1 * GOT A NUMBER? 02768 670E 02778 BEQ.S FATLX1 * NO 0276A 103C 0023 MOVE.B #'#',D0 * YES, PRINT A PREFIX 0276E 6100 F814 01F84 BSR PUTCHR 02772 3001 MOVE.W D1,D0 * PRINT THE ERROR NUMBER 02774 6100 E826 00F9C BSR OPPRNN 02778 02778 6100 F808 01F82 FATLX1 BSR PUTNEW * ANOTHER CR 0277C 2009 MOVE.L A1,D0 * GOT A MESSAGE? 0277E 6704 02784 BEQ.S FATLX2 02780 G 2049 MOVE.L A1,A0 * YES, DISPLAY IT 02782 61BA 0273E BSR OUTMSG 02784 6000 FCF4 0247A FATLX2 BRA FINISH * WAIT FOR FINAL KEY, AND EXIT 02788 02788 * -------------------------------------------------------------- 02788 * SCRIPTING STUFF 02788 * -------------------------------------------------------------- 02788 02788 * ---------------------- 02788 * SCRINIT 02788 * ---------------------- 02788 02788 * SETUP SCRIPTING, FLAG IN D0: 1=START, 0=STOP 02788 02788 SCRINIT SAVEREGS 0278C 1F00 MOVE.B D0,-(SP) * [PASCAL: PASS BOOL @ODD ADDR] 0278E 4EBA 0000 JSR PrInit 02792 RESTREGS 02796 4E75 RTS 02798 02798 * ---------------------- 02798 * SCROUT 02798 * ---------------------- 02798 02798 * SCRIPT OUT A LINE, START IN A0, END IN D0, THEN TACK ON A CR/LF 02798 02798 SCROUT SAVEREGS 0279C 9088 SUB.L A0,D0 * THIS IS THE LENGTH 0279E 2F08 MOVE.L A0,-(SP) 027A0 3F00 MOVE.W D0,-(SP) 027A2 4EBA 0000 JSR PrLine * ALL HANDLED IN PASCAL 027A6 RESTREGS 027AA 4E75 RTS 027AC 027AC * -------------------------------------------------------------- 027AC * *** PURE HACKERY *** 027AC * -------------------------------------------------------------- 027AC 027AC * THIS ROUTINE EXISTS TO ALLOW MACINTOSH USERS TO LAUNCH DIRECTLY INTO 027AC * A SAVED GAME (BY DOUBLE-CLICKING IT), SKIPPING THE NORMAL GAME 027AC * OPENING. IT CAN FUNCTION AT MOST ONCE. 027AC 027AC * WE USED TO FORCE A "VERSION" DISPLAY (BY FAKING INPUT). THIS PREVENTED 027AC * AN OPENING SCREEN THAT (IN SOME ZIP GAMES) SAID NOTHING BUT "OK". BUT 027AC * SOME LATER GAMES PRINT LENGTHY DESCS, AND A "VERSION" LOOKS BAD. 027AC 027AC 202E FEDA SYSIN2 MOVE.L APPARM(A6),D0 * GET THE "FINDER PARAMETERS" HANDLE 027B0 6720 027D2 BEQ.S SS2X1 * EXIT IF BEEN HERE ALREADY (HANDLE IS NULL) 027B2 42AE FEDA CLR.L APPARM(A6) * MARK HANDLE, SO THIS CODE ONLY RUNS ONCE! 027B6 027B6 G 2040 MOVE.L D0,A0 027B8 G 2050 MOVE.L (A0),A0 * EXTRACT THE POINTER 027BA 4A68 0002 TST.W 2(A0) * WAS ZIP LAUNCHED VIA A SAVED GAME? 027BE 6712 027D2 BEQ.S SS2X1 * NO, NORMAL LAUNCH, JUST MARK THE HANDLE 027C0 6100 0012 027D4 BSR FNDRSF * COPY FINDER INFO INTO SF REPLY RECORD 027C4 027C4 G 206E FFA8 MOVE.L BUFFER(A6),A0 027C8 08E8 0002 0011 BSET #FSTAT,PFLAGS+1(A0) * REQUEST STATUS LINE BE REDRAWN 027CE 027CE * WARNING: HACKING (FOR TIMEOUTS) IN RES1 MEANS THAT CONTROL MAY NEVER 027CE * RETURN HERE (IT JUMPS TO DISPATCH). DON'T ADD CODE BEYOND THIS POINT!. 027CE 027CE 6100 F254 01A24 BSR RES1 * DO A SPECIAL RESTORE, SKIPPING NORMAL DIALOG 027D2 4E75 SS2X1 RTS 027D4 027D4 * GIVEN A0 -> "FINDER PARAMETERS BLOCK" (AS FROM GetAppParm), 027D4 * COPY THE SAVED GAME INFO (NAME AND VOL) INTO OUR RESTORE VARS 027D4 * (USE ONLY FIRST GAME, IF MORE THAN ONE IS INDICATED) 027D4 027D4 48E7 4060 FNDRSF MOVEM.L D1/A1-A2,-(SP) 027D8 G 2448 MOVE.L A0,A2 * PARAMS PTR HERE 027DA 027DA 41EA 000C LEA 12(A2),A0 * COPY FILE NAME 027DE 43ED 0000 LEA filename,A1 027E2 7001 MOVEQ #1,D0 * ALLOW FOR LENGTH BYTE 027E4 D010 ADD.B (A0),D0 * IN FIRST BYTE [MAC PASCAL] 027E6 7240 MOVEQ #64,D1 * MAX LEN (OF filename) 027E8 6100 DB7C 00366 BSR COPYS 027EC 027EC 3B6A 0004 0000 MOVE.W 4(A2),filevol * AND COPY VOLUME REFNUM 027F2 4CDF 0602 MOVEM.L (SP)+,D1/A1-A2 027F6 4E75 RTS 027F8 027F8 027F8 * --------------------------------------------------------------------------- 027F8 * DISK I/O ROUTINES 027F8 * --------------------------------------------------------------------------- 027F8 027F8 * ---------------------- 027F8 * OPNGAM 027F8 * ---------------------- 027F8 027F8 * OPEN THE GAME FILE, STORE REFNUM, RETURN FLAGS 027F8 027F8 7000 OPNGAM MOVEQ #0,D0 027FA 4E75 RTS * [MAC: NOW DONE IN MACINIT] 027FC 027FC * CLOSE THE GAME FILE, RETURN FLAGS 027FC 027FC 7000 CLSGAM MOVEQ #0,D0 027FE 4E75 RTS * [MAC: NOW IN FINISH] 02800 02800 * ---------------------- 02800 * GETBLK 02800 * ---------------------- 02800 02800 * GET A GAME FILE BLOCK, BLOCK NUMBER IN D0, CORE TARGET LOCATION IN A0 02800 02800 48E7 4000 GETBLK MOVEM.L D1,-(SP) 02804 7201 MOVEQ #1,D1 * ONE BLOCK 02806 6100 0008 02810 BSR GTBLKS 0280A 4CDF 0002 MOVEM.L (SP)+,D1 * (DOESN'T ALTER FLAGS) 0280E 4E75 RTS 02810 02810 * GET A SERIES OF GAME FILE BLOCKS 02810 * FIRST BLOCK NUMBER IN D0, CORE TARGET LOCATION IN A0, TOTAL BLOCKS IN D1 02810 02810 GTBLKS SAVEREGS 02814 6100 DB9C 003B2 BSR BLKBYT * CONVERT BLOCKS TO BYTES 02818 C340 EXG D1,D0 0281A 6100 DB96 003B2 BSR BLKBYT 0281E C340 EXG D1,D0 02820 RESWORD 02822 3F2E FEEC MOVE.W GAMFIL(A6),-(SP) 02826 2F00 MOVE.L D0,-(SP) * OFFSET IN BYTES 02828 2F01 MOVE.L D1,-(SP) * LENGTH IN BYTES 0282A 2F08 MOVE.L A0,-(SP) * BUFFER 0282C 4EBA 0000 JSR ReadFile 02830 POPWORD * ERROR ON READ? 02832 6606 0283A BNE.S GTBKX2 * YES, FAIL 02834 GTBKX1 RESTREGS 02838 4E75 RTS 0283A 0283A * TST.W DSKERR(A6) * BUT WERE WE ASKED TO RETURN WITH FLAGS? 0283A * BNE GTBKX1 * YES 0283A 0283A 41ED 0308 GTBKX2 LEA MSGREA,A0 * ERROR CODE IN D0 0283E 6000 FF18 02758 BRA FATAL * 'Story file read error.' 02842 00308 DATA 00308 53746F72792066 MSGREA DC.B 'Story file read error.',0 02842 CODE 02842 02842 02842 * -------------------------------------------------------------------------- 02842 * SAVE/RESTORE -- DISK I/O ROUTINES 02842 * -------------------------------------------------------------------------- 02842 02842 * ---------------------- 02842 * DKSWAP 02842 * ---------------------- 02842 02842 * PRELIMINARY DIALOG FOR SAVE/RESTORE 02842 * PROMPT USER TO SWAP DISKS AND IDENTIFY DRIVE BEING USED 02842 * RETURN LETTER IN D0, ZERO FOR DEFAULT 02842 02842 * >>> THIS FUNCTION NOW HANDLED WITHIN FILE-SELECT CALL <<< 02842 02842 * ---------------------- 02842 * DUPNAM 02842 * ---------------------- 02842 02842 * DUPLICATE NAME CHECK/DIALOG (FOR SAVES ONLY) 02842 * CHECK FOR FILENAME CONFLICT, IF SO, PROMPT USER FOR INSTRUCTIONS 02842 * RETURN ZERO TO PROCEED NORMALLY, OTHERWISE ABORT 02842 02842 7000 DUPNAM MOVEQ #0,D0 * [MAC: THIS FUNC HANDLED BY OS (FSEL)] 02844 4E75 RTS 02846 02846 * SAVEREGS 02846 * RESWORD 02846 * JSR ExistFile 02846 * POPWORD 02846 * MOVE.W D0,D1 * RESULT 02846 * BEQ.S DUPX3 * ZERO MEANS NONE 02846 * 02846 *DUPX1 LEA MSGDUP,A0 02846 * BSR OUTMSG0 * PROMPT, DON'T ADD A CR 02846 * 02846 * DATA 02846 *MSGDUP DC.B 'You are about to write over an existing file. ' 02846 * DC.B 'Proceed? (Y/N) ',0 02846 * CODE 02846 * 02846 * BSR TTYIN * GET A CHAR 02846 * CLR.W D1 * ASSUME A NORMAL SAVE 02846 * 02846 * CMPI.B #'Y',D0 * PROCEED? 02846 * BEQ.S DUPX2 * YES 02846 * CMPI.B #'y',D0 02846 * BEQ.S DUPX2 * YES 02846 * 02846 * MOVEQ #1,D1 * NO, ABORT (ANY KEY BESIDES 'Y') 02846 * MOVE.B #'N',D0 02846 *DUPX2 BSR PUTCHR 02846 * BSR PUTNEW * FOLLOW WITH A CR 02846 * 02846 *DUPX3 MOVE.W D1,D0 * RETURN FLAGS FOR RESULT 02846 * RESTREGS 02846 * RTS 02846 02846 * ---------------------- 02846 * GETSFL 02846 * ---------------------- 02846 02846 * POLL USER FOR A FILE NAME, DRIVE, DIRECTORY, ETC (LEAVE IN GLOBAL) 02846 * GIVEN: 02846 * D0.W = SET IF SAVE, 0 IF RESTORE, 02846 * D1.W = SET IF PARTIAL, 0 IF NORMAL, 02846 * A0 -> XZIP "SUGGESTED" NAME (BYTE 0 IS LEN) 02846 * RETURN WITH FLAGS SET, ZERO IF NO ERROR 02846 02846 48E7 3040 GETSFL MOVEM.L D2-D3/A1,-(SP) 0284A 3400 MOVE.W D0,D2 * REPOSITION THESE VALS 0284C 3601 MOVE.W D1,D3 0284E 0284E 4A43 TST.W D3 02850 670E 02860 BEQ.S GTSFX2 * IF NORMAL, NO XZIP NAME 02852 7001 MOVEQ #1,D0 02854 D010 ADD.B (A0),D0 02856 720D MOVEQ #12+1,D1 * MAX LEN (ST/PC DOS) 02858 43ED 0000 LEA filename,A1 0285C 6100 DB08 00366 BSR COPYS * IF PARTIAL, SUGGEST NAME TO USER 02860 02860 GTSFX2 SAVEREGS 02864 RESWORD 02866 1F03 MOVE.B D3,-(SP) * NORMAL/PARTIAL [PASCAL: PASS BOOL @ODD ADDR] 02868 1F02 MOVE.B D2,-(SP) * SAVE/RESTORE 0286A 4EBA 0000 JSR FileSelect 0286E POPWORD 02870 RESTREGS 02874 02874 3200 MOVE.W D0,D1 * FSEL RESULT, NON-ZERO IF CANCEL OR ERROR 02876 660C 02884 BNE.S GTSFX8 02878 6100 F812 0208C BSR SCRNAM * IF OK, OUTPUT FILENAME TO TRANSCRIPT 0287C 0287C 4A42 TST.W D2 * WAS THIS A SAVE? 0287E 6704 02884 BEQ.S GTSFX8 * NO 02880 61C0 02842 BSR DUPNAM * YES, CHECK FOR DUPLICATE FILENAME 02882 3200 MOVE.W D0,D1 * NON-ZERO IF USER SAYS ABORT 02884 02884 4CDF 020C GTSFX8 MOVEM.L (SP)+,D2-D3/A1 02888 4A41 TST.W D1 * FINAL RESULT, RETURN FLAGS 0288A 4E75 RTS 0288C 0288C * ---------------------- 0288C * NEWSFL 0288C * ---------------------- 0288C 0288C * CREATE (IF NECESSARY) AND OPEN A SAVE FILE, USING GLOBAL FILENAME 0288C * RETURN WITH FLAGS SET, ZERO IF NO ERROR 0288C 0288C NEWSFL SAVEREGS 02890 RESWORD 02892 486E FEEA PEA SAVFIL(A6) * RETURN CHANNEL HERE 02896 4EBA 0000 JSR CreateFile 0289A POPWORD 0289C RESTREGS 028A0 6708 028AA BEQ.S NEWSX2 * ZERO MEANS NO ERROR 028A2 028A2 * CMPI.W #-44,D0 * ST: DISK IS WRITE-PROTECTED? (SAY SO) 028A2 * CMPI.W #-48,D0 * ST: NAME EXISTS ALREADY? (IGNORE) 028A2 028A2 3F00 MOVE.W D0,-(SP) 028A4 6100 0092 02938 BSR WPRCHK * IF WRITE-PROTECT ERROR, INFORM USER 028A8 301F MOVE.W (SP)+,D0 028AA 028AA 4E75 NEWSX2 RTS * RETURN FLAGS 028AC 028AC * ---------------------- 028AC * OPNSFL 028AC * ---------------------- 028AC 028AC * OPEN A (RESTORE) FILE, USING GLOBAL FILENAME, LEAVE CHANNEL IN SAVFIL(A6) 028AC * RETURN WITH FLAGS, ZERO IF NO ERROR 028AC 028AC OPNSFL SAVEREGS 028B0 RESWORD 028B2 486E FEEA PEA SAVFIL(A6) * RETURN CHANNEL HERE 028B6 4EBA 0000 JSR OpenFile 028BA POPWORD * ZERO MEANS NO ERROR 028BC RESTREGS 028C0 4E75 RTS 028C2 028C2 * ---------------------- 028C2 * GTSBKS, SFREAD 028C2 * ---------------------- 028C2 028C2 * GET A SERIES OF SAVE FILE BLOCKS 028C2 * FIRST BLOCK NUMBER IN D0, # OF BLOCKS IN D1, CORE TARGET LOCATION IN A0 028C2 * RETURN WITH FLAGS, NONZERO IF ERROR 028C2 028C2 6100 DAEE 003B2 GTSBKS BSR BLKBYT * CONVERT BLOCKS TO BYTES 028C6 C340 EXG D1,D0 028C8 6100 DAE8 003B2 BSR BLKBYT 028CC C340 EXG D1,D0 028CE 028CE * ENTER HERE: BYTE OFFSET IN D0, BYTE LENGTH IN D1 028CE * RETURN FLAGS, >> ALSO D1 = ACTUAL BYTES READ << 028CE 028CE SFREAD SAVEREGS 028D2 RESWORD 028D4 3F2E FEEA MOVE.W SAVFIL(A6),-(SP) 028D8 2F00 MOVE.L D0,-(SP) * OFFSET IN BYTES 028DA 2F01 MOVE.L D1,-(SP) * LENGTH IN BYTES 028DC 2F08 MOVE.L A0,-(SP) * BUFFER POINTER 028DE 4EBA 0000 JSR ReadFile 028E2 POPWORD 028E4 RESTREGS 028E8 222D 0000 MOVE.L actlen,D1 028EC 4A40 TST.W D0 * NONZERO MEANS ERROR 028EE 4E75 RTS 028F0 028F0 * ---------------------- 028F0 * PTSBKS, SFWRIT 028F0 * ---------------------- 028F0 028F0 * WRITE A SERIES OF SAVE FILE BLOCKS, 028F0 * FIRST BLOCK OFFSET IN D0, NUMBER OF BLOCKS IN D1, CORE LOCATION IN A0, 028F0 * RETURN WITH FLAGS, NONZERO IF ERROR 028F0 028F0 6100 DAC0 003B2 PTSBKS BSR BLKBYT * CONVERT BLOCKS TO BYTES 028F4 C340 EXG D1,D0 028F6 6100 DABA 003B2 BSR BLKBYT 028FA C340 EXG D1,D0 028FC 028FC * ENTER HERE: BYTE OFFSET IN D0, BYTE LENGTH IN D1 028FC * RETURN FLAGS, >> ALSO D1 = ACTUAL BYTES READ << 028FC 028FC SFWRIT SAVEREGS 02900 RESWORD 02902 3F2E FEEA MOVE.W SAVFIL(A6),-(SP) 02906 2F00 MOVE.L D0,-(SP) * OFFSET IN BYTES 02908 2F01 MOVE.L D1,-(SP) * LENGTH IN BYTES 0290A 2F08 MOVE.L A0,-(SP) * BUFFER POINTER 0290C 4EBA 0000 JSR WriteFile 02910 POPWORD 02912 RESTREGS 02916 02916 3200 MOVE.W D0,D1 * ANY ERROR? 02918 6714 0292E BEQ.S PTSBX2 * NO 0291A 0291A 0C40 FFDE CMPI.W #dskFulErr,D0 * Mac: DISK-FULL ERROR? 0291E 6706 02926 BEQ.S PTSBX1 * YES, INFORM USER 02920 02920 6100 0016 02938 BSR WPRCHK * ALSO CHECK FOR WRITE-PROTECT ERROR 02924 6008 0292E BRA.S PTSBX2 02926 02926 41ED 031F PTSBX1 LEA MSGFUL,A0 0292A 6100 FE12 0273E BSR OUTMSG * 'Not enough room on disk.' 0292E 0031F DATA 0031F 4E6F7420656E6F MSGFUL DC.B 'Not enough room on disk.',0 0292E CODE 0292E 0292E 3001 PTSBX2 MOVE.W D1,D0 02930 222D 0000 MOVE.L actlen,D1 * COUNT 02934 4A40 TST.W D0 * FLAGS, NONZERO MEANS ERROR 02936 4E75 RTS 02938 02938 * ---------------------- 02938 * WPRCHK 02938 * ---------------------- 02938 02938 * CHECK FOR DISK WRITE-PROTECT ERROR, GIVEN D0 = RESULT CODE 02938 * (MAY BE CALLED DURING FILE CREATE /OR/ FILE WRITE) 02938 02938 0C40 FFD4 WPRCHK CMPI.W #wPrErr,D0 * Mac: WRITE-PROTECT ERROR? 0293C 6608 02946 BNE.S WPRCX1 0293E 0293E 41ED 0338 LEA MSGWPR,A0 * INFORM USER 02942 6100 FDFA 0273E BSR OUTMSG * 'Disk is write-protected.' 02946 4E75 WPRCX1 RTS 02948 00338 DATA 00338 4469736B206973 MSGWPR DC.B 'Disk is write-protected.',0 02948 CODE 02948 02948 * ---------------------- 02948 * CLSSFL 02948 * ---------------------- 02948 02948 * CLOSE A SAVE FILE, CHANNEL IN SAVFIL(A6) 02948 * RETURN WITH FLAGS SET, ZERO IF NO ERROR 02948 02948 CLSSFL SAVEREGS 0294C RESWORD 0294E 3F2E FEEA MOVE.W SAVFIL(A6),-(SP) 02952 4EBA 0000 JSR CloseFile 02956 POPWORD * NON-ZERO IF ERROR 02958 RESTREGS 0295C 4E75 RTS 0295E 0295E * ---------------------- 0295E * DELSFL 0295E * ---------------------- 0295E 0295E * DELETE A BAD SAVE FILE, MUST HAVE BEEN ALREADY CLOSED (OR NOT OPENED) 0295E * RETURN WITH FLAGS SET, ZERO IF NO ERROR 0295E 0295E DELSFL SAVEREGS 02962 RESWORD 02964 4EBA 0000 JSR DeleteFile 02968 POPWORD * NON-ZERO IF ERROR 0296A RESTREGS 0296E 4E75 RTS 02970 02970 * ---------------------- 02970 * DEFOLD 02970 * ---------------------- 02970 02970 4240 DEFOLD CLR.W D0 * RETRIEVE PREVIOUS DEFAULT NAMES 02972 6000 0004 02978 BRA DEFNX1 02976 7001 DEFNEW MOVEQ #1,D0 * UPDATE PREVIOUS DEFAULT NAMES 02978 02978 DEFNX1 SAVEREGS 0297C 1F00 MOVE.B D0,-(SP) * [PASCAL: PASS BOOL @ODD ADDR] 0297E 4EBA 0000 JSR NewDefault * (COPIES SOME GLOBAL STRINGS) 02982 RESTREGS 02986 4E75 RTS 02988 02988 * ---------------------- 02988 * CHKDSK, CHKDSK1 02988 * ---------------------- 02988 02988 * [MAC: THIS CALL ISN'T NEEDED, SINCE THE OS DOES A GOOD JOB OF KEEPING 02988 * TRACK OF WHEN THE GAME DISK HAS BEEN EJECTED, AND ASKING FOR IT WHEN 02988 * NECESSARY.] 02988 02988 CHKDSK 02988 CHKDSK1 02988 4E75 RTS 0298A 0298A INCLUDE 'MX4.a' 0298A 0298A * ---------------------------------------------------------------------------- 0298A * 68000 CALLS FROM PASCAL/C (XDEFS REQUIRED) 0298A * ---------------------------------------------------------------------------- 0298A 00351 DATA 00352 0000 0000 ZVARS DC.L 0 * CORRECT A6 STORED HERE, MUST RESTORE IF NEEDED 0298A CODE 0298A 0298A * PROCEDURE OutBufLen (charCount: INTEGER) -- ADJUST MAC FOLDING 0298A * RESET ENDBUF (WHEN NEXT EMPTIED, TO PREVENT BUGS) 0298A 0298A * OUTBUFLEN 0298A * MOVE.L ZVARS,A0 * GET ZIP'S VALUE OF A6 0298A * MOVE.W 4(SP),CURSIZ 0298A * MOVE.L D0,MACBUF(A0) 0298A * RTS 0298A 0298A * ---------------------------------------------------------------------------- 0298A * FAST MEMORY ROUTINES 0298A * USED FOR ST SCROLLING, ALSO FOR ISAVE/IRESTORE 0298A * ---------------------------------------------------------------------------- 0298A 0298A * ---------------------- 0298A * _mov_mem, MOVMEM 0298A * ---------------------- 0298A 0298A * THIS ROUTINE PERFORMS A FAST BLOCKMOVE. ASSUMPTIONS ARE: 0298A * () COPY MUST BE FROM HIGH TO LOW MEMORY IF IT OVERLAPS ("SCROLL UP") 0298A * () MAX LENGTH IS 256K (32K x 16), DUE TO USE OF "DBxx" 0298A 0298A 0000 0008 MMSRC EQU 8+0 * 8 = 4 (REG) + 4 (RTS) 0298A 0000 000C MMDEST EQU 8+4 0298A 0000 0010 MMLEN EQU 8+8 0298A 0298A _mov_mem 0298A 2F09 MOVE.L A1,-(SP) 0298C G 206F 0008 MOVE.L MMSRC(SP),A0 02990 G 226F 000C MOVE.L MMDEST(SP),A1 02994 202F 0010 MOVE.L MMLEN(SP),D0 02998 6704 0299E BEQ.S MMX0 * ZERO LENGTH, EXIT 0299A 6100 0006 029A2 BSR MOVMEM 0299E G 225F MMX0 MOVE.L (SP)+,A1 029A0 4E75 RTS 029A2 029A2 * ALTERNATE ENTRY POINT (FOR 68K USERS), JUST TAKES ARGS IN REGS 029A2 * A0 -> SOURCE, A1 -> DEST, D0.L = LENGTH 029A2 029A2 2F01 MOVMEM MOVE.L D1,-(SP) 029A4 3208 MOVE.W A0,D1 * CHECK FOR ODD-ALIGNED SRC ADDRESS 029A6 0241 0001 ANDI.W #1,D1 029AA 6622 029CE BNE.S MMX3 * IF SO, MUST USE SLOWER CODE 029AC 3209 MOVE.W A1,D1 * CHECK DEST ADDRESS, TOO 029AE 0241 0001 ANDI.W #1,D1 029B2 661A 029CE BNE.S MMX3 029B4 029B4 2200 MOVE.L D0,D1 029B6 E881 ASR.L #4,D1 * DIVIDE BY 16: QUOTIENT HERE 029B8 6008 029C2 BRA.S MMX2 * ENTER LOOP AT DBRA 029BA 029BA * PHASE 1 COPY -- MAXIMIZE SPEED 029BA 029BA 22D8 MMX1 MOVE.L (A0)+,(A1)+ * COPY 16 BYTES ("UNROLL" FOUR ITERATIONS) 029BC 22D8 MOVE.L (A0)+,(A1)+ 029BE 22D8 MOVE.L (A0)+,(A1)+ 029C0 22D8 MOVE.L (A0)+,(A1)+ 029C2 G 51C9 FFF6 029BA MMX2 DBRA D1,MMX1 * LOOP (32K IS MAX COUNT) 029C6 029C6 0280 0000 000F ANDI.L #$0F,D0 * DIVIDE BY 16: REMAINDER 029CC 6706 029D4 BEQ.S MMX5 * FALL THROUGH IF ANYTHING LEFT 029CE 029CE * PHASE 2 COPY -- HANDLE EXTRA BYTES OR ODD CASES 029CE 029CE 12D8 MMX3 MOVE.B (A0)+,(A1)+ * COPY ONE BYTE 029D0 5380 SUBQ.L #1,D0 029D2 66FA 029CE BNE.S MMX3 * LOOP (NO MAX COUNT) 029D4 029D4 221F MMX5 MOVE.L (SP)+,D1 * DONE 029D6 4E75 RTS 029D8 029D8 * ---------------------- 029D8 * _clr_mem 029D8 * ---------------------- 029D8 029D8 0000 000C CMSRC EQU 12+0 * 12 = 8 (REGS) + 4 (RTS) 029D8 0000 0010 CMLEN EQU 12+4 029D8 029D8 _clr_mem 029D8 48E7 4040 MOVEM.L D1/A1,-(SP) 029DC 202F 0010 MOVE.L CMLEN(SP),D0 029E0 672C 02A0E BEQ.S CMX5 * ZERO, EXIT 029E2 G 206F 000C MOVE.L CMSRC(SP),A0 029E6 029E6 3208 MOVE.W A0,D1 * CHECK FOR ODD SRC ADDRESS 029E8 0241 0001 ANDI.W #1,D1 029EC 661A 02A08 BNE.S CMX3 029EE 029EE 2200 MOVE.L D0,D1 029F0 E881 ASR.L #4,D1 * DIVIDE BY 16: QUOTIENT 029F2 6008 029FC BRA.S CMX2 * ENTER LOOP AT DBRA 029F4 029F4 * PHASE 1 "CLEAR" -- MAXIMIZE SPEED 029F4 029F4 4298 CMX1 CLR.L (A0)+ * CLEAR 16 BYTES ("UNROLL" FOUR ITERATIONS) 029F6 4298 CLR.L (A0)+ 029F8 4298 CLR.L (A0)+ 029FA 4298 CLR.L (A0)+ 029FC G 51C9 FFF6 029F4 CMX2 DBRA D1,CMX1 * LOOP (32K IS MAXIMUM COUNT) 02A00 02A00 0280 0000 000F ANDI.L #$0F,D0 * DIVIDE BY 16: REMAINDER 02A06 6706 02A0E BEQ.S CMX5 * FALL THROUGH IF ANYTHING LEFT 02A08 02A08 * PHASE 2 "CLEAR" -- HANDLE EXTRA BYTES OR ODD CASES 02A08 02A08 4218 CMX3 CLR.B (A0)+ * CLEAR ONE BYTE 02A0A 5380 SUBQ.L #1,D0 02A0C 66FA 02A08 BNE.S CMX3 * LOOP (NO MAXIMUM COUNT) 02A0E 02A0E 4CDF 0202 CMX5 MOVEM.L (SP)+,D1/A1 02A12 4E75 RTS 02A14 02A14 * ---------------------- 02A14 * SqzRow 02A14 * ---------------------- 02A14 02A14 * >> DEAD SOON << 02A14 * PROCEDURE SqzRow (src, dst: Ptr; len: INTEGER); 02A14 02A14 SqzRow 02A14 302F 0004 MOVE.W 4(SP),D0 * LEN 02A18 G 226F 0006 MOVE.L 6(SP),A1 * DST 02A1C G 206F 000A MOVE.L 10(SP),A0 * SRC 02A20 02A20 * SQZROW: SQUEEZE BYTES INTO NIBBLES, THROWING AWAY THE HIGH NIBBLES 02A20 * GIVEN A0 -> SRC, A1 -> DST, D0.W = COUNT 02A20 02A20 1218 SQRWX1 MOVE.B (A0)+,D1 * GET FIRST LOW-NIBBLE 02A22 E949 LSL.W #4,D1 * POSITION IT 02A24 0210 000F ANDI.B #$0F,(A0) * [MAKE SURE HIGH NIBBLE = 0] 02A28 8218 OR.B (A0)+,D1 * GET SECOND LOW-NIBBLE 02A2A 12C1 MOVE.B D1,(A1)+ 02A2C 02A2C 5540 SUBQ.W #2,D0 * 2 BYTES INTO 1 02A2E 6EF0 02A20 BGT.S SQRWX1 02A30 02A30 G 205F MOVE.L (SP)+,A0 * RETURN ADDR 02A32 DEFC 000A ADDA.W #10,SP * CLEANUP, PASCAL STYLE 02A36 4ED0 JMP (A0) 02A38 02A38 * ---------------------- 02A38 * FillCSpec 02A38 * ---------------------- 02A38 02A38 * PROCEDURE FillCSpec (CSpec: Ptr; ix: INTEGER; bytePal: Ptr); 02A38 02A38 FillCSpec 02A38 G 206F 0004 MOVE.L 4(SP),A0 * bytePal = SRC 02A3C 302F 0008 MOVE.W 8(SP),D0 * ix 02A40 G 226F 000A MOVE.L 10(SP),A1 * CSpec = DST 02A44 02A44 * FillCSpec: COPY INDEX/PALETTE INTO DEST, SCALING THE RGB (BYTE-TO-WORD) 02A44 * GIVEN A0 -> SRC, A1 -> DST, D0.W = INDEX 02A44 02A44 32C0 MOVE.W D0,(A1)+ * COPY IX 02A46 7003 MOVEQ #3,D0 02A48 02A48 1210 FLCSX1 MOVE.B (A0),D1 * GET AN RGB BYTE 02A4A E149 LSL.W #8,D1 * SCALE UP TO A WORD 02A4C 8218 OR.B (A0)+,D1 * DUP VAL IN LOW BYTE 02A4E 32C1 MOVE.W D1,(A1)+ 02A50 02A50 5340 SUBQ.W #1,D0 02A52 6EF4 02A48 BGT.S FLCSX1 02A54 02A54 G 205F MOVE.L (SP)+,A0 * RETURN ADDR 02A56 DEFC 000A ADDA.W #10,SP * CLEANUP, PASCAL STYLE 02A5A 4ED0 JMP (A0) 02A5C 02A5C * ---------------------- 02A5C * BuildStips 02A5C * ---------------------- 02A5C 02A5C * OFFSETS IN EXPANDED STIPPLE TABLE 02A5C 02A5C 0000 0000 SH0 EQU 0 * 16 WORDS OF "SHIFT-0", ------xx ------xx 02A5C 0000 0020 SH2 EQU 16*2 * 16 WORDS OF "SHIFT-2", ----xx-- ----xx-- 02A5C 0000 0040 SH4 EQU 32*2 * ETC 02A5C 0000 0060 SH6 EQU 48*2 02A5C 02A5C * MAP STIPPLE IDS TO VALUES 02A5C 00356 DATA 00356 00 STPTAB DC.B $0 * NO BITS ON 00357 01 02 04 08 DC.B $1,$2,$4,$8 * 1 BIT ON 0035B 03 05 06 09 DC.B $3,$5,$6,$9 * 2 BITS ON 00/11, 01/01, 01/10, 10/01 0035F 0A 0C DC.B $A,$C * [NORMALLY UNUSED] 10/10, 11/00 00361 07 0B 0D 0E DC.B $7,$B,$D,$E * 3 BITS ON 00365 0F DC.B $F * 4 BITS ON 02A5C CODE 02A5C 02A5C * PROCEDURE BuildStips (table1, table2: Ptr); 02A5C 02A5C * BUILD AN "EXPANDED" TABLE OF STIPPLE VALS (16 WORDS x4), FOR USE BY StipRow, 02A5C * GIVEN A TABLE OF STIPPLE IDS (16 BYTES, EACH 0..15) 02A5C 02A5C BuildStips 02A5C G 226F 0004 MOVE.L 04(SP),A1 * EXPANDED TABLE (RESERVED SPACE, ACTUALLY) 02A60 G 206F 0008 MOVE.L 08(SP),A0 * ID TABLE 02A64 02A64 48E7 3020 MOVEM.L D2-D3/A2,-(SP) 02A68 45ED 0356 LEA STPTAB,A2 02A6C 7600 MOVEQ #0,D3 * INITIAL COLOR INDEX 02A6E 02A6E 3403 BLDSX1 MOVE.W D3,D2 * NEXT COLOR INDEX 02A70 7000 MOVEQ #0,D0 02A72 1018 MOVE.B (A0)+,D0 * GET CORRESPONDING STIPPLE ID 02A74 1032 0000 MOVE.B 0(A2,D0.W),D0 * MAP TO "DARKNESS" VALUE 02A78 6100 0014 02A8E BSR BuildOne 02A7C 02A7C 5243 ADDQ.W #1,D3 02A7E 0C43 000F CMPI.W #15,D3 * MAX COLOR INDEX 02A82 6FEA 02A6E BLE.S BLDSX1 02A84 02A84 4CDF 040C MOVEM.L (SP)+,D2-D3/A2 02A88 G 205F MOVE.L (SP)+,A0 * RETURN ADDR 02A8A G 504F ADDA.W #8,SP * CLEANUP, PASCAL STYLE 02A8C 4ED0 JMP (A0) 02A8E 02A8E * STORE THE STIPPLE FOR ONE PARTICULAR COLOR INDEX 02A8E * GIVEN D0.W = STIPPLE VALUE (0..15), D2.W = COLOR INDEX (0..15), 02A8E * A1 -> EXPANDED TABLE 02A8E 02A8E BuildOne 02A8E 4640 NOT.W D0 * >> MAC: REVERSE WHITE & BLACK! << 02A90 3200 MOVE.W D0,D1 02A92 0241 000C ANDI.W #$000C,D1 * EXTRACT 1ST HALF-NIBBLE 02A96 ED49 LSL.W #6,D1 * POSITION IT ------xx -------- 02A98 0240 0003 ANDI.W #$0003,D0 * EXTRACT 2ND HALF-NIBBLE -------- ------xx 02A9C 8041 OR.W D1,D0 * RECOMBINE 02A9E 02A9E D442 ADD.W D2,D2 * 2x INDEX 02AA0 3380 2000 MOVE.W D0,SH0(A1,D2.W) * STORE "SHIFT-0" POSITION 02AA4 E548 LSL.W #2,D0 02AA6 3380 2020 MOVE.W D0,SH2(A1,D2.W) * STORE "SHIFT-2" POSITION 02AAA E548 LSL.W #2,D0 02AAC 3380 2040 MOVE.W D0,SH4(A1,D2.W) * STORE "SHIFT-4" POSITION 02AB0 E548 LSL.W #2,D0 02AB2 3380 2060 MOVE.W D0,SH6(A1,D2.W) * STORE "SHIFT-6" POSITION 02AB6 4E75 RTS 02AB8 02AB8 * ---------------------- 02AB8 * StipPic 02AB8 * ---------------------- 02AB8 02AB8 * PROCEDURE StipPic (src, dst: Ptr; rowBytes, rows: INTEGER; maps: Ptr); 02AB8 02AB8 StipPic 02AB8 48E7 3C30 MOVEM.L D2-D5/A2-A3,-(SP) * [24 BYTES] 02ABC 02ABC G 266F 001C MOVE.L 24+04(SP),A3 * MAPS (16 WORDS X4) 02AC0 3A2F 0020 MOVE.W 24+08(SP),D5 * ROWS [MONO] 02AC4 E245 ASR.W #1,D5 * ROWS [COLOR] 02AC6 382F 0022 MOVE.W 24+10(SP),D4 * ROWBYTES [MONO] -- MULTIPLE OF 2 02ACA G 246F 0024 MOVE.L 24+12(SP),A2 * DST 02ACE G 206F 0028 MOVE.L 24+16(SP),A0 * SRC 02AD2 02AD2 G 224A STPPX1 MOVE.L A2,A1 * NEW DST1 02AD4 D4C4 ADDA.W D4,A2 * NEW DST2 - 2ND ROW OF STIPPLES 02AD6 3004 MOVE.W D4,D0 02AD8 6100 0012 02AEC BSR StipRow 02ADC 5345 SUBQ.W #1,D5 02ADE 6EF2 02AD2 BGT.S STPPX1 02AE0 02AE0 4CDF 0C3C MOVEM.L (SP)+,D2-D5/A2-A3 02AE4 G 205F MOVE.L (SP)+,A0 * RETURN ADDR 02AE6 DEFC 0010 ADDA.W #16,SP * CLEANUP, PASCAL STYLE 02AEA 4ED0 JMP (A0) 02AEC 02AEC * StipRow: CONVERT EACH COLOR PIXEL INTO A 2x2 MONO STIPPLE 02AEC * FOR SPEED, EACH LOOP CONVERTS /4/ COLOR PIXELS INTO AN 8x2 MONO STIPPLE 02AEC 02AEC * GIVEN A0 -> SRC, D0.W = ROW LENGTH, A1 -> DST1, A2 -> DST2, A3 -> MAPS 02AEC * USES D1.W = PIX1, D2.W = PIX2, D3.W = STIPPLE 02AEC * RETURNS UPDATED PTRS 02AEC 02AEC StipRow 02AEC 7200 MOVEQ #0,D1 * ZERO ALL BYTES 02AEE 7600 STPRX1 MOVEQ #0,D3 * ZERO RESULT 02AF0 02AF0 1218 MOVE.B (A0)+,D1 * GET 2 PIXELS (2x4 BITS) 02AF2 1401 MOVE.B D1,D2 02AF4 E849 LSR.W #4,D1 * EXTRACT HIGH PIXEL 02AF6 D241 ADD.W D1,D1 * 2x 02AF8 8673 1060 OR.W SH6(A3,D1.W),D3 * xx------ xx------ 02AFC 0242 000F ANDI.W #$0F,D2 * EXTRACT LOW PIXEL 02B00 D442 ADD.W D2,D2 * 2x 02B02 8673 2040 OR.W SH4(A3,D2.W),D3 * --xx---- --xx---- 02B06 02B06 1218 MOVE.B (A0)+,D1 * GET 2 MORE PIXELS (2x4 BITS) 02B08 1401 MOVE.B D1,D2 02B0A E849 LSR.W #4,D1 * EXTRACT HIGH PIXEL 02B0C D241 ADD.W D1,D1 * 2x 02B0E 8673 1020 OR.W SH2(A3,D1.W),D3 * ----xx-- ----xx-- 02B12 0242 000F ANDI.W #$0F,D2 * EXTRACT LOW PIXEL 02B16 D442 ADD.W D2,D2 * 2x 02B18 8673 2000 OR.W SH0(A3,D2.W),D3 * ------xx ------xx 02B1C 02B1C * AT THIS POINT, WE HAVE 4 FOUR-BIT STIPPLES 02B1C 02B1C 14C3 MOVE.B D3,(A2)+ * STORE 2x4 LSBITS OF STIPPLES IN 2ND ROW 02B1E E04B LSR.W #8,D3 02B20 12C3 MOVE.B D3,(A1)+ * STORE 2x4 MSBITS OF STIPPLES IN PRIMARY ROW 02B22 5340 SUBQ.W #1,D0 02B24 6EC8 02AEE BGT.S STPRX1 * LOOP UNTIL END OF ROW 02B26 4E75 RTS 02B28 02B28 * ---------------------- 02B28 * Shrink75 02B28 * ---------------------- 02B28 02B28 * PROCEDURE Shrink75 (base: Ptr; rb1, rb2, rows: INTEGER); 02B28 02B28 * SCALE A GIVEN (COLOR) PICTURE BY 0.75 - DISCARD EVERY 4TH BYTE AND EVERY 4TH ROW 02B28 * NOTE: BOTH RB ARE ALWAYS MULTIPLES OF 4 (SINCE PRE-STIPPLE) 02B28 02B28 Shrink75 02B28 48E7 3F30 MOVEM.L D2-D7/A2-A3,-(SP) * 8x4 BYTES 02B2C 382F 0024 MOVE.W 32+04(SP),D4 * ROWS 02B30 362F 0026 MOVE.W 32+06(SP),D3 * SHRUNK ROWBYTES 02B34 342F 0028 MOVE.W 32+08(SP),D2 * ROWBYTES 02B38 G 266F 002A MOVE.L 32+10(SP),A3 * SRC AND (INITIAL) DST PTRS (IN-PLACE COPY) 02B3C G 244B MOVE.L A3,A2 02B3E 02B3E 6100 0030 02B70 SK75X1 BSR ShrinkOne * COPY 1ST ROW 02B42 D4C2 ADDA.W D2,A2 * NEXT SRC 02B44 D6C3 ADDA.W D3,A3 * NEXT DST 02B46 5344 SUBQ.W #1,D4 * DONE? 02B48 6F1A 02B64 BLE.S SK75X2 02B4A 02B4A 6100 0024 02B70 BSR ShrinkOne * COPY 2ND ROW 02B4E D4C2 ADDA.W D2,A2 02B50 D6C3 ADDA.W D3,A3 02B52 5344 SUBQ.W #1,D4 * DONE? 02B54 6F0E 02B64 BLE.S SK75X2 02B56 02B56 6100 0018 02B70 BSR ShrinkOne * COPY 3RD ROW 02B5A D4C2 ADDA.W D2,A2 02B5C D6C3 ADDA.W D3,A3 02B5E 02B5E D4C2 ADDA.W D2,A2 * SKIP 4TH ROW 02B60 5544 SUBQ.W #2,D4 * DONE? 02B62 6EDA 02B3E BGT.S SK75X1 02B64 02B64 4CDF 0CFC SK75X2 MOVEM.L (SP)+,D2-D7/A2-A3 02B68 G 205F MOVE.L (SP)+,A0 * RETURN ADDR 02B6A DEFC 000A ADDA.W #10,SP * CLEANUP, PASCAL STYLE 02B6E 4ED0 JMP (A0) 02B70 02B70 ShrinkOne 02B70 G 204A MOVE.L A2,A0 02B72 G 224B MOVE.L A3,A1 02B74 3202 MOVE.W D2,D1 * FULL ROWBYTES 02B76 02B76 * GIVEN A0 -> SRC, A1 -> DST, D1.W = FULL ROWBYTES 02B76 * NOTE: WE "UNROLL" 2x4 ITERATIONS FOR SPEED - MAY GO 4 BYTES BEYOND END OF DATA 02B76 02B76 SKONX1 02B76 ** MOVE.L (A0)+,(A1)+ * COPY 3 BYTES, SKIP 4TH 02B76 ** SUBQ.L #1,A1 02B76 ** MOVE.B (A0)+,(A1)+ * COPY 3 BYTES (OUT OF PHASE), SKIP 4TH 02B76 ** MOVE.B (A0)+,(A1)+ 02B76 ** MOVE.B (A0)+,(A1)+ 02B76 ** ADDQ.L #1,A0 02B76 02B76 * COPY 3 BYTES (6 NIBBLES/PIXELS), SKIP 4TH (2 NIBBLES/PIXELS) 02B76 02B76 2018 MOVE.L (A0)+,D0 02B78 7E00 MOVEQ #0,D7 * ZERO HIGH WORD 02B7A 3E00 MOVE.W D0,D7 02B7C E98F LSL.L #4,D7 * POSITION NIBBLES: 00 0e fg x0 02B7E 0280 FFF0 0000 ANDI.L #$FFF00000,D0 * EXTRACT NIBBLES: ab c0 00 00 02B84 8087 OR.L D7,D0 02B86 02B86 22C0 MOVE.L D0,(A1)+ * STORE 3 BYTES 02B88 5389 SUBQ.L #1,A1 02B8A 02B8A * COPY 3 BYTES (OUT OF PHASE), SKIP 4TH 02B8A 02B8A 2018 MOVE.L (A0)+,D0 02B8C 7E00 MOVEQ #0,D7 * ZERO HIGH WORD 02B8E 3E00 MOVE.W D0,D7 02B90 E98F LSL.L #4,D7 * POSITION NIBBLES: 00 0e fg x0 02B92 0280 FFF0 0000 ANDI.L #$FFF00000,D0 * EXTRACT NIBBLES: ab c0 00 00 02B98 8087 OR.L D7,D0 02B9A 02B9A E198 ROL.L #8,D0 * STORE 3 BYTES 02B9C 12C0 MOVE.B D0,(A1)+ 02B9E E198 ROL.L #8,D0 02BA0 12C0 MOVE.B D0,(A1)+ 02BA2 E198 ROL.L #8,D0 02BA4 12C0 MOVE.B D0,(A1)+ 02BA6 02BA6 5141 SUBQ.W #8,D1 02BA8 6ECC 02B76 BGT.S SKONX1 * LOOP 02BAA 4E75 RTS 02BAC 02BAC * ---------------------- 02BAC * Scale2xPic 02BAC * ---------------------- 02BAC 02BAC * PROCEDURE Scale2xPic (src, dst, randTbl: Ptr; cols {rbSrc, rbDst}, rows: INTEGER); 02BAC 02BAC * SCALE A GIVEN (COLOR) PICTURE BY 2.0, INTERPOLATING /RANDOMLY/ 02BAC * HOPEFULLY THIS WILL MAKE IT LOOK LESS SCALED-UP AND BLOCKY 02BAC 02BAC Scale2xPic 02BAC 48E7 3F3E MOVEM.L D2-D7/A2-A6,-(SP) * 11x4 BYTES 02BB0 3C2F 0030 MOVE.W 44+04(SP),D6 * ROWS 02BB4 3A2F 0032 MOVE.W 44+06(SP),D5 * COLS 02BB8 G 286F 0034 MOVE.L 44+08(SP),A4 * PTR TO TABLE OF RANDOM BITS 02BBC 7800 MOVEQ #0,D4 * INITIAL BIT OFFSET 02BBE G 226F 0038 MOVE.L 44+12(SP),A1 * DST 02BC2 G 206F 003C MOVE.L 44+16(SP),A0 * SRC 02BC6 02BC6 G 2448 MOVE.L A0,A2 02BC8 D4C5 ADDA.W D5,A2 * SRC_AHEAD (NEXT ROW) 02BCA G 2649 MOVE.L A1,A3 02BCC D6C5 ADDA.W D5,A3 02BCE D6C5 ADDA.W D5,A3 * DST_MID (NEXT ROW) 02BD0 02BD0 5346 SUBQ.W #1,D6 * (LAST ROW IS HANDLED SPECIALLY) 02BD2 6F1E 02BF2 BLE.S SCXPX2 * BLT? 02BD4 02BD4 3605 SCXPX1 MOVE.W D5,D3 02BD6 6100 0026 02BFE BSR Scale2xRow 02BDA 02BDA G 224B MOVE.L A3,A1 * UPDATE DST 02BDC D6C5 ADDA.W D5,A3 02BDE D6C5 ADDA.W D5,A3 * AND DST_MID 02BE0 02BE0 G 286F 0034 MOVE.L 44+08(SP),A4 * RESET: PTR TO TABLE OF RANDOM BITS 02BE4 5204 ADDQ.B #1,D4 * UPDATE: BIT OFFSET (ONLY CARE ABOUT LOW 3 BITS) 02BE6 5346 SUBQ.W #1,D6 02BE8 6EEA 02BD4 BGT.S SCXPX1 02BEA 02BEA * LAST ROW, SPECIAL CASE: NO VERTICAL RANDOMIZATION 02BEA 02BEA G 2448 MOVE.L A0,A2 * "SRC = SRC_AHEAD" 02BEC 3605 MOVE.W D5,D3 02BEE 6100 000E 02BFE BSR Scale2xRow 02BF2 02BF2 4CDF 7CFC SCXPX2 MOVEM.L (SP)+,D2-D7/A2-A6 02BF6 G 205F MOVE.L (SP)+,A0 * RETURN ADDR 02BF8 DEFC 0010 ADDA.W #16,SP * CLEANUP, PASCAL STYLE 02BFC 4ED0 JMP (A0) 02BFE 02BFE 02BFE * Scale2xRow 02BFE * 02BFE * EACH SRC PIXEL MAPS TO 4 DST PIXELS, ACCORDING TO THE FOLLOWING PATTERN: 02BFE * 02BFE * 1a 1a' (1b) 1a' = 1a or 1b 02BFE * 1'a 1'a' 1'a = 1a or 2a 02BFE * (2a) 1'a' = 1a' or 1'a 02BFE * 02BFE * 1a is copied directly from the src. Each of its three spinoffs are generated 02BFE * randomly from two neighbors of that spinoff. 02BFE * 02BFE * To avoid "feathering" lines and such, the algorithm is extended as follows: 02BFE * 02BFE * if 2a = 1a then 1a' = 1a always (and by implication, 1'a = 1'a' = 1a also) 02BFE * if 1b = 1a then 1'a = 1a always (and by implication, 1a' = 1'a' = 1a also) 02BFE * 02BFE * >> NOTE: ALL PIXELS CURRENTLY /BYTE/ VALUES (NOT NIBBLES) << 02BFE * 02BFE * GIVEN A0 -> SRC, A2 -> SRC_AHEAD D3.W = SRC PIXELS (BYTES) 02BFE * A1 -> DST, A3 -> DST_MID 02BFE * A4 -> TABLE OF RANDOM BYTES (4x200) D4.B = BIT NUMBER (0-7) 02BFE * 02BFE * ALSO USES D7 02BFE * RETURN UPDATED A0-A3 02BFE 02BFE Scale2xRow 02BFE 5343 SUBQ.W #1,D3 * (LAST PIXEL IS HANDLED SPECIALLY) 02C00 6F36 02C38 BLE.S SCXRX9 02C02 1018 MOVE.B (A0)+,D0 * GET FIRST PIXEL 02C04 02C04 * A0 -> SRC+1, D0.B = (A0) 02C04 02C04 12C0 SCXRX1 MOVE.B D0,(A1)+ * STORE 1a 02C06 02C06 1218 MOVE.B (A0)+,D1 * GET 1b 02C08 141A MOVE.B (A2)+,D2 * GET 2a 02C0A 1E00 MOVE.B D0,D7 02C0C 02C0C B200 CMP.B D0,D1 * 1b = 1a? 02C0E 6706 02C16 BEQ.S SCXRX2 * YES, FORCE 1'a = 1a 02C10 02C10 091C BTST.B D4,(A4)+ * RANDOMIZE 02C12 6702 02C16 BEQ.S SCXRX2 02C14 1E02 MOVE.B D2,D7 02C16 16C7 SCXRX2 MOVE.B D7,(A3)+ * STORE 1'a 02C18 02C18 B400 CMP.B D0,D2 * 2a = 1a? 02C1A 6706 02C22 BEQ.S SCXRX3 * YES, FORCE 1a' = 1a 02C1C 02C1C 091C BTST.B D4,(A4)+ * RANDOMIZE 02C1E 6702 02C22 BEQ.S SCXRX3 02C20 1001 MOVE.B D1,D0 02C22 12C0 SCXRX3 MOVE.B D0,(A1)+ * STORE 1a' 02C24 02C24 091C BTST.B D4,(A4)+ * RANDOMIZE 02C26 6702 02C2A BEQ.S SCXRX4 02C28 1007 MOVE.B D7,D0 02C2A 16C0 SCXRX4 MOVE.B D0,(A3)+ * STORE 1'a' 02C2C 02C2C * Each loop advances each src +1, each dst +2 02C2C 02C2C 1001 MOVE.B D1,D0 * [POSITION 1b FOR NEXT ITERATION] 02C2E 02C2E 5343 SUBQ.W #1,D3 02C30 6ED2 02C04 BGT.S SCXRX1 02C32 6D04 02C38 BLT.S SCXRX9 02C34 02C34 * For the final pixel, make 1b = 1a 02C34 02C34 5388 SUBQ.L #1,A0 02C36 60CC 02C04 BRA.S SCXRX1 02C38 02C38 4E75 SCXRX9 RTS 02C3A 02C3A 02C3A END #0001 00000000 CODE LABEL #0002 00000000 DATA MODULE ENTRY ACTLEN -------- DATA IMPORT APPARM FFFFFEDA EQU ARG0 00000000 EQU ARG1 00000002 EQU ARG2 00000004 EQU ARG3 00000006 EQU ARG4 00000008 EQU ARGBLK FFFFFF96 EQU ASHFX1 00000644 CODE LABEL AUTOCR 0000001D EQU BLDSX1 00002A6E CODE LABEL BLKBYT 000003B2 CODE LABEL BMOUSE -------- DATA IMPORT BSPLIT 00000546 CODE LABEL BSPLTB 0000053A CODE LABEL BSPLTQ2 00000552 CODE LABEL BUFFER FFFFFFA8 EQU BUFOUT 000026E4 CODE LABEL BUFOX1 00001528 CODE LABEL BUFOX2 00001530 CODE LABEL BUFOX3 00001540 CODE LABEL BUFPTR 00000000 EQU BUFSIZ 0000000C EQU BUFUX1 000026F4 CODE LABEL BUFUX2 000026FE CODE LABEL BUILDONE 00002A8E CODE LABEL BUILDSTIPS 00002A5C CODE LABEL EXPORT BYTBLK 000003BA CODE LABEL BYTBX1 000003C8 CODE LABEL BYTVAL 000004DC CODE LABEL CALCWP 00001034 CODE LABEL CALLX1 000016AC CODE LABEL CALLX2 000016BC CODE LABEL CALLX3 0000170C CODE LABEL CALLX4 0000171A CODE LABEL CALLX5 0000171E CODE LABEL CALLX6 00001720 CODE LABEL CALLX7 00001728 CODE LABEL CALLX8 0000172A CODE LABEL CALLX9 0000172E CODE LABEL CHAROUT -------- CODE IMPORT CHKDSK 00002988 CODE LABEL CHKDSK1 00002988 CODE LABEL CHRBX1 00001DF4 CODE LABEL CHRBX2 00001E00 CODE LABEL CHRBX3 00001E0A CODE LABEL CHRBX4 00001E16 CODE LABEL CHRBYT 00001DF0 CODE LABEL CHRCS 00001DC4 CODE LABEL CHRCX1 00001DCC CODE LABEL CHRCX2 00001DDC CODE LABEL CHRCX3 00001DEC CODE LABEL CHRCX4 00001DEE CODE LABEL CHRTOT FFFFFEEE EQU CLEARWINDOW -------- CODE IMPORT CLOSEFILE -------- CODE IMPORT CLSGAM 000027FC CODE LABEL CLSSFL 00002948 CODE LABEL CLWPX2 0000104C CODE LABEL CLWPX3 0000104C CODE LABEL CMLEN 00000010 EQU CMPSX2 0000037C CODE LABEL CMPSX4 00000384 CODE LABEL CMSRC 0000000C EQU CMX1 000029F4 CODE LABEL CMX2 000029FC CODE LABEL CMX3 00002A08 CODE LABEL CMX5 00002A0E CODE LABEL COLRX2 000014A4 CODE LABEL COLRX4 000014AC CODE LABEL COLRX9 000014D0 CODE LABEL COLWIDTH -------- DATA IMPORT COMPS 00000378 CODE LABEL COPYB 00000360 CODE LABEL COPYS 00000366 CODE LABEL CPBX1 0000035E CODE LABEL CPSX1 0000036C CODE LABEL CPSX2 0000036E CODE LABEL CPSX3 00000370 CODE LABEL CPYTX1 00000974 CODE LABEL CPYTX2 0000098E CODE LABEL CPYTX3 000009A4 CODE LABEL CPYTX4 000009BA CODE LABEL CPYTX5 000009CC CODE LABEL CPYTX6 000009DA CODE LABEL CPYTX7 000009E2 CODE LABEL CPYTX8 000009EA CODE LABEL CRCHECK 0000260E CODE LABEL CRCHX2 00002628 CODE LABEL CRCHX4 00002640 CODE LABEL CRCHX9 0000265C CODE LABEL CREATEFILE -------- CODE IMPORT CURBLK FFFFFF42 EQU CURCOL -------- DATA IMPORT CURPAG FFFFFF44 EQU CURRENTATTR -------- DATA IMPORT CURRENTHL -------- DATA IMPORT CURROW -------- DATA IMPORT CURSIZ 0000000E EQU CURTAB FFFFFF3E EQU CURWIND FFFFFF18 EQU CURWP FFFFFF14 EQU CVFLAG 00000100 EQU CZIP 00000000 EQU D3BUG 00000000 EQU DBIBRK FFFFFEC8 EQU DBINST FFFFFED0 EQU DBITOT FFFFFECC EQU DBQEND FFFFFEB0 EQU DBQLEN 00000010 EQU DBQPTR FFFFFEB4 EQU DBQUE FFFFFEB8 EQU DBZPC1 FFFFFED4 EQU DBZPC2 FFFFFED2 EQU DCHSIZ 00002404 CODE LABEL DEBUG 00000000 EQU DEFBLK FFFFFF8C EQU DEFNEW 00002976 CODE LABEL DEFNX1 00002978 CODE LABEL DEFOLD 00002970 CODE LABEL DELCH1 00000008 EQU DELCH2 0000007F EQU DELETEFILE -------- CODE IMPORT DELSFL 0000295E CODE LABEL DIRX0 00001564 CODE LABEL DIRX1 00001572 CODE LABEL DIRX2 0000157A CODE LABEL DIRX3 00001584 CODE LABEL DIRX4 000015A2 CODE LABEL DIRX5 000015BE CODE LABEL DIRX6 000015DA CODE LABEL DIRX7 000015F4 CODE LABEL DISPX1 00001678 CODE LABEL DOSDX2 00002424 CODE LABEL DOSOUND 0000241A CODE LABEL DQUE FFFFFF54 EQU DUMPED 0000001C EQU DUPNAM 00002842 CODE LABEL ENDLOD FFFFFFFA EQU ENDPTR 00000008 EQU ENDTITLE 00002372 CODE LABEL ENDZSOUND -------- CODE IMPORT EOLCHR 0000000D EQU ERASELINE -------- CODE IMPORT ERAX1 00001440 CODE LABEL ESIBKS FFFFFFE0 EQU EVENTIN -------- CODE IMPORT EXISTFILE -------- CODE IMPORT EXTOPS 0000017E DATA LABEL EZERR 0000034C CODE LABEL EZERX1 00000354 CODE LABEL EZIP 00000001 EQU FATAL 00002758 CODE LABEL FATLX1 00002778 CODE LABEL FATLX2 00002784 CODE LABEL FBX1 00000E32 CODE LABEL FBX2 00000E34 CODE LABEL FBX4 00000E44 CODE LABEL FBX6 00000E50 CODE LABEL FBX8 00000E5C CODE LABEL FDISP 00000003 EQU FDPGX1 00002178 CODE LABEL FDPGX2 00002180 CODE LABEL FFIXE 00000001 EQU FILENAME -------- DATA IMPORT FILESELECT -------- CODE IMPORT FILEVOL -------- DATA IMPORT FILLCSPEC 00002A38 CODE LABEL EXPORT FINDBK 00000E28 CODE LABEL FINDPG 00002170 CODE LABEL FINISH 0000247A CODE LABEL FINIX2 000024A6 CODE LABEL FINIX3 000024BA CODE LABEL FIRST 0000000A EQU FIRSTCOL -------- DATA IMPORT FIRSTROW -------- DATA IMPORT FLCSX1 00002A48 CODE LABEL FLGLOC 00000806 CODE LABEL FMOUS 00000005 EQU FNDRSF 000027D4 CODE LABEL FONT FFFFFEE2 EQU FONTX2 00001466 CODE LABEL FONTX4 0000146E CODE LABEL FONTX9 0000148E CODE LABEL FSTAT 00000002 EQU FSTAX2 0000178E CODE LABEL FSTAX4 000017A2 CODE LABEL FSTPRP 0000067E CODE LABEL FUNDO 00000004 EQU GAMFIL FFFFFEEC EQU GAMINT 0000244E CODE LABEL GAMINT1 0000245C CODE LABEL GAMIX1 00002456 CODE LABEL GAMIX3 00002474 CODE LABEL GETARG 00000476 CODE LABEL GETBLK 00002800 CODE LABEL GETBX1 00000422 CODE LABEL GETBX2 0000042C CODE LABEL GETBX3 0000043A CODE LABEL GETBYT 0000040A CODE LABEL GETCURS 000022A8 CODE LABEL GETCURS1 000022AC CODE LABEL GETFYX 000021A4 CODE LABEL GETM 00002398 CODE LABEL GETMEM 000023B6 CODE LABEL GETMEMC 000023C8 CODE LABEL GETMOUSE 000025C4 CODE LABEL GETMX1 000023A4 CODE LABEL GETPAG 0000210C CODE LABEL GETPX1 0000076E CODE LABEL GETPX2 00000772 CODE LABEL GETPX3 0000078A CODE LABEL GETPX4 00000794 CODE LABEL GETSFL 00002846 CODE LABEL GETV1 0000048E CODE LABEL GETVAR 00000486 CODE LABEL GETVX2 000004A0 CODE LABEL GETWRD 0000043C CODE LABEL GLOTAB FFFFFFEC EQU GPX1 0000211E CODE LABEL GPX2 0000212E CODE LABEL GPX3 00002144 CODE LABEL GPX4 0000216A CODE LABEL GTAWRD 000003F6 CODE LABEL GTBKX1 00002834 CODE LABEL GTBKX2 0000283A CODE LABEL GTBLKS 00002810 CODE LABEL GTMCX1 000023D2 CODE LABEL GTMCX2 000023D4 CODE LABEL GTPTX1 00000894 CODE LABEL GTPTX2 00000898 CODE LABEL GTPTX3 000008A8 CODE LABEL GTPTX4 000008B2 CODE LABEL GTPTX5 000008B8 CODE LABEL GTSBKS 000028C2 CODE LABEL GTSEED 000023F8 CODE LABEL GTSFX2 00002860 CODE LABEL GTSFX8 00002884 CODE LABEL IBNDX1 00002266 CODE LABEL IBNDX2 0000226C CODE LABEL IDSPX9 00000346 CODE LABEL INBOUNDS 00002260 CODE LABEL INCALL 000017DA CODE LABEL INCHR 000024EA CODE LABEL INCHX1 000024FC CODE LABEL INITDISP 000002F4 CODE LABEL INITLX 00000E8E CODE LABEL INITQP 00001E92 CODE LABEL INITWB 000002AA CODE LABEL INIWX1 0000008E CODE LABEL INLAST FFFFFEF0 EQU INLX4 00000EB4 CODE LABEL INLX5 00000EBC CODE LABEL INLX6 00000EC8 CODE LABEL INPUT 00000CCA CODE LABEL INPX1 00000CBA CODE LABEL INPX4 00000CD8 CODE LABEL INPX6 00000CF2 CODE LABEL INPX7 00000D2E CODE LABEL INPX8 00000D30 CODE LABEL INRETU 000017FC CODE LABEL INTWRD 00000000 DATA LABEL INUSE 0000001F EQU INWBX1 000002B8 CODE LABEL IRBRKS 00000004 DATA LABEL ITBX1 00000912 CODE LABEL ITBX2 0000092C CODE LABEL ITBX3 00000936 CODE LABEL ITBX4 0000093A CODE LABEL ITBX5 0000094A CODE LABEL ITTYIN 000024FE CODE LABEL ITTYX1 00002534 CODE LABEL ITTYX11 0000253E CODE LABEL ITTYX13 00002576 CODE LABEL ITTYX18 00002594 CODE LABEL ITTYX19 00002596 CODE LABEL ITTYX2 0000253C CODE LABEL KEEPSP 0000001E EQU LASTCOL -------- DATA IMPORT LASTROW -------- DATA IMPORT LCASE 00000E0E CODE LABEL LCSX1 00000E10 CODE LABEL LCSX2 00000E20 CODE LABEL LCSX3 00000E22 CODE LABEL LEX 00000BC0 CODE LABEL LINEHEIGHT -------- DATA IMPORT LINEOUT -------- CODE IMPORT LINOUT 00002700 CODE LABEL LINOX1 0000271E CODE LABEL LKX1 00000EFA CODE LABEL LKX10 00000F38 CODE LABEL LKX12 00000F40 CODE LABEL LKX14 00000F48 CODE LABEL LKX16 00000F4A CODE LABEL LKX2 00000F10 CODE LABEL LKX4 00000F1A CODE LABEL LKX6 00000F28 CODE LABEL LKX8 00000F36 CODE LABEL LOAD1 000000DC CODE LABEL LOAD2 000000F2 CODE LABEL LOAD3 0000010C CODE LABEL LOADX1 00000108 CODE LABEL LOC 00000006 EQU LOOKUP 00000EE4 CODE LABEL LOWCORE 000003CA CODE LABEL LPAGE FFFFFF38 EQU LPLOC FFFFFF34 EQU LPTAB FFFFFF30 EQU LWCX1 000003EE CODE LABEL LWCX2 000003F0 CODE LABEL LXX0 00000BBC CODE LABEL LXX2 00000BE4 CODE LABEL LXX3 00000C14 CODE LABEL LXX4 00000C1A CODE LABEL LXX6 00000C2E CODE LABEL LXX8 00000C38 CODE LABEL MACBUF FFFFFEDE EQU MACINIT -------- CODE IMPORT MARGLEFT -------- DATA IMPORT MARGRIGHT -------- DATA IMPORT MARGX2 000014E2 CODE LABEL MARGX4 000014EA CODE LABEL MARGX9 0000151C CODE LABEL MAXFLG FFFFFFC6 EQU MAXLEN 000000A0 EQU MAXLOCS 0000000F EQU MAXLOD FFFFFFC8 EQU MAXSCRN 0000219A CODE LABEL MAXWIND 00000008 EQU MCOLOR -------- DATA IMPORT MDCLEAR 000022F2 CODE LABEL MDCOLOR 00002326 CODE LABEL MDERASE 00002314 CODE LABEL MDSCROLL 000022E2 CODE LABEL MEMAVAIL 000023DC CODE LABEL MEMERROR 000023BE CODE LABEL MEMSYS 00005000 EQU MMDEST 0000000C EQU MMLEN 00000010 EQU MMSRC 00000008 EQU MMX0 0000299E CODE LABEL MMX1 000029BA CODE LABEL MMX2 000029C2 CODE LABEL MMX3 000029CE CODE LABEL MMX5 000029D4 CODE LABEL MOVMEM 000029A2 CODE LABEL MSAVEB FFFFFEE6 EQU MSAVEF FFFFFEE4 EQU MSGBAD 0000012F DATA LABEL MSGBFO 000000C3 DATA LABEL MSGCA1 000000CE DATA LABEL MSGCA2 000000DA DATA LABEL MSGEZR 00000023 DATA LABEL MSGFTL 000002F8 DATA LABEL MSGFUL 0000031F DATA LABEL MSGIO1 00000090 DATA LABEL MSGIO2 000000B4 DATA LABEL MSGKEY 000002C0 DATA LABEL MSGME1 000002AD DATA LABEL MSGMOR 000002D7 DATA LABEL MSGNXP 00000075 DATA LABEL MSGODV 0000004B DATA LABEL MSGOMD 00000053 DATA LABEL MSGOPN 00000296 DATA LABEL MSGPUP 0000005B DATA LABEL MSGRE1 0000010D DATA LABEL MSGRE2 000000F5 DATA LABEL MSGREA 00000308 DATA LABEL MSGRLB 00000034 DATA LABEL MSGSCN 0000028F DATA LABEL MSGTHR 000000EB DATA LABEL MSGVR2 00000122 DATA LABEL MSGWPR 00000338 DATA LABEL MSGWPS 000000B8 DATA LABEL MSGZMV 0000000B DATA LABEL MSGZWR 000002DE DATA LABEL MSWIND FFFFFEF2 EQU N0X1 00001B94 CODE LABEL N2X1 00001BD8 CODE LABEL N2X2 00001BE8 CODE LABEL N2X3 00001C16 CODE LABEL N4X1 00001C2E CODE LABEL N4X2 00001C52 CODE LABEL N4X3 00001C66 CODE LABEL N4X4 00001C80 CODE LABEL N4X5 00001C86 CODE LABEL N4X5A 00001CB8 CODE LABEL N4X6 00001CBC CODE LABEL NARGS FFFFFFB8 EQU NBNDX2 00002228 CODE LABEL NBNDX4 0000224E CODE LABEL NEWBOUNDS 00002210 CODE LABEL NEWDEFAULT -------- CODE IMPORT NEWLIN 00001FCE CODE LABEL NEWSFL 0000288C CODE LABEL NEWSX2 000028AA CODE LABEL NEWZPC 000020AA CODE LABEL NEXT 00000008 EQU NEXTX1 000007DE CODE LABEL NEXTX2 000007E2 CODE LABEL NEXTX3 000007F8 CODE LABEL NEXTX4 000007FC CODE LABEL NOOP 00004E71 EQU NXT0 00001B76 CODE LABEL NXT1 00001BA8 CODE LABEL NXT2 00001BCC CODE LABEL NXT4 00001C1C CODE LABEL NXT4A 00001C4C CODE LABEL NXTBX1 00000468 CODE LABEL NXTBYT 00000448 CODE LABEL NXTINS 00001B54 CODE LABEL NXTLIN 0000265E CODE LABEL NXTLX6 000026C4 CODE LABEL NXTPRP 00000698 CODE LABEL NXTPTR 00000004 EQU NXTPX2 000006A8 CODE LABEL NXTPX4 000006AC CODE LABEL NXTWRD 0000046A CODE LABEL NZX2 000020DA CODE LABEL NZX3 000020FA CODE LABEL NZX4 0000210A CODE LABEL OBJLOC 0000066E CODE LABEL OBJTAB FFFFFFF0 EQU OCLRX2 000013E4 CODE LABEL OCLRX6 000013EE CODE LABEL OCLRX7 00001406 CODE LABEL OCLRX8 0000140A CODE LABEL OCLRX9 0000142E CODE LABEL ODIVX1 00000580 CODE LABEL OLEN 0000000E EQU OMODX1 00000596 CODE LABEL ONEOPS 0000015E DATA LABEL OPADD 00000562 CODE LABEL OPASHIFT 0000063A CODE LABEL OPASSN 00001730 CODE LABEL OPBAND 00000622 CODE LABEL OPBCOM 0000061C CODE LABEL OPBOR 00000616 CODE LABEL OPBTST 0000060A CODE LABEL OPBUFO 0000151E CODE LABEL OPCAL1 0000169A CODE LABEL OPCAL2 000016A6 CODE LABEL OPCALL 000016A6 CODE LABEL OPCATCH 000017B0 CODE LABEL OPCLEAR 000013C2 CODE LABEL OPCOLOR 00001494 CODE LABEL OPCOPYT 00000956 CODE LABEL OPCRLF 00001030 CODE LABEL OPCSX1 00001258 CODE LABEL OPCSX2 00001276 CODE LABEL OPCSX3 00001280 CODE LABEL OPCSX4 0000128E CODE LABEL OPCSX5 00001298 CODE LABEL OPCSX6 000012B2 CODE LABEL OPCURG 000012B4 CODE LABEL OPCURS 0000124A CODE LABEL OPDCLR 0000166E CODE LABEL OPDEC 00000ACC CODE LABEL OPDIRI 000015F6 CODE LABEL OPDIRO 0000154E CODE LABEL OPDISP 00001662 CODE LABEL OPDISPLAY -------- CODE IMPORT OPDIV 00000574 CODE LABEL OPENFILE -------- CODE IMPORT OPERASE 00001430 CODE LABEL OPERR 00001CE4 CODE LABEL OPFCLE 00000834 CODE LABEL OPFONT 00001456 CODE LABEL OPFSET 00000828 CODE LABEL OPFSTA 0000177C CODE LABEL OPGET 00000840 CODE LABEL OPGETB 00000852 CODE LABEL OPGETP 00000764 CODE LABEL OPGTPT 0000088A CODE LABEL OPHLIGHT 00001442 CODE LABEL OPICAL1 00001688 CODE LABEL OPICAL2 00001694 CODE LABEL OPICALL 00001694 CODE LABEL OPICX1 0000165E CODE LABEL OPINC 00000ABE CODE LABEL OPINPUT 00000C82 CODE LABEL OPINTBL 000008EC CODE LABEL OPIRES 00001956 CODE LABEL OPISAV 0000185A CODE LABEL OPIXCAL 00001694 CODE LABEL OPJUMP 000017A4 CODE LABEL OPLEN 0000007E EQU OPLEX 00000B86 CODE LABEL OPLOC 00000718 CODE LABEL OPMARG 000014D2 CODE LABEL OPMOD 00000588 CODE LABEL OPMOUSEINFO -------- CODE IMPORT OPMOVE 000006B6 CODE LABEL OPMSINFO 00000D36 CODE LABEL OPMSLMT 00000D52 CODE LABEL OPMUL 0000056E CODE LABEL OPNEXT 000007D0 CODE LABEL OPNGAM 000027F8 CODE LABEL OPNOOP 000017AE CODE LABEL OPNSFL 000028AC CODE LABEL OPORIG 00001B50 CODE LABEL OPPICI 0000163C CODE LABEL OPPICINF -------- CODE IMPORT OPPOP 00000A90 CODE LABEL OPPRIN 00000FE0 CODE LABEL OPPRNB 00000FF0 CODE LABEL OPPRNC 00000F98 CODE LABEL OPPRND 00000FF8 CODE LABEL OPPRNF 00000A52 CODE LABEL OPPRNI 0000100E CODE LABEL OPPRNN 00000F9C CODE LABEL OPPRNR 00001026 CODE LABEL OPPRNT 000009EC CODE LABEL OPPTSI 000008BC CODE LABEL OPPUSH 00000A60 CODE LABEL OPPUT 00000862 CODE LABEL OPPUTB 00000878 CODE LABEL OPPUTP 0000079C CODE LABEL OPQDLE 00000AFA CODE LABEL OPQEQU 0000064C CODE LABEL OPQFIR 00000724 CODE LABEL OPQFSE 00000816 CODE LABEL OPQGRT 00000600 CODE LABEL OPQIGR 00000ADA CODE LABEL OPQIN 00000754 CODE LABEL OPQLES 000005F6 CODE LABEL OPQNEX 0000073C CODE LABEL OPQUIT 00001ADC CODE LABEL OPQZER 00000664 CODE LABEL OPRAND 0000059E CODE LABEL OPREAD 00000B0C CODE LABEL OPREMO 000006DE CODE LABEL OPREST 00001996 CODE LABEL OPRETU 0000173C CODE LABEL OPRFAL 00001774 CODE LABEL OPRSTA 00001778 CODE LABEL OPRSTT 00001ABA CODE LABEL OPRTRU 00001770 CODE LABEL OPSAVE 0000188E CODE LABEL OPSCRN 0000107A CODE LABEL OPSCROLL 00001392 CODE LABEL OPSDX1 00001630 CODE LABEL OPSET 00000A5C CODE LABEL OPSHIFT 00000628 CODE LABEL OPSOUND 000015FA CODE LABEL OPSPLT 0000110A CODE LABEL OPSUB 00000568 CODE LABEL OPTHROW 000017BC CODE LABEL OPUSL 00000F94 CODE LABEL OPVALU 00000A54 CODE LABEL OPVERI 00001AE0 CODE LABEL OPWATTR 000011F2 CODE LABEL OPWGET 000012CE CODE LABEL OPWGX1 000012F4 CODE LABEL OPWGX2 000012F8 CODE LABEL OPWGX4 00001320 CODE LABEL OPWGX9 0000132A CODE LABEL OPWPOS 0000118A CODE LABEL OPWPUT 0000132C CODE LABEL OPWPX2 00001346 CODE LABEL OPWPX4 00001374 CODE LABEL OPWPX9 0000138C CODE LABEL OPWSIZ 000011C8 CODE LABEL OPXCAL 000016A6 CODE LABEL OPXPUSH 00000A64 CODE LABEL OPZWSTR 00000C3C CODE LABEL OUTCHR 000025DE CODE LABEL OUTFUN 00000014 EQU OUTMSG 0000273E CODE LABEL OUTMSG0 00002720 CODE LABEL OUTMX1 00002724 CODE LABEL OUTMX2 00002730 CODE LABEL OUTMX3 0000273A CODE LABEL OUTMX9 00002744 CODE LABEL PADCHR 00000005 EQU PAGES FFFFFFCC EQU PAGMIN 00000002 EQU PAGTAB FFFFFFD0 EQU PAGTOT FFFFFFCA EQU PCHKSM 0000001C EQU PCHRSET 00000034 EQU PCLRWRD 0000002C EQU PCRCNT 00000030 EQU PCRFUNC 00000032 EQU PCX1 00001F8C CODE LABEL PCX2 00001FA4 CODE LABEL PCX3 00001FB0 CODE LABEL PENDLD 00000004 EQU PFALSE 000004EE CODE LABEL PFLAGS 00000010 EQU PFOFF 00000028 EQU PFWRD 00000026 EQU PGLOTB 0000000C EQU PHWRD 00000022 EQU PICDISP 00002358 CODE LABEL PICINF 00002342 CODE LABEL PINTWD 0000001E EQU PLBIT 00000006 EQU PLCLEN 00000000 EQU PLCTBL 00000036 EQU PLENTH 0000001A EQU PMASK 0000003F EQU PMLOCX 00000001 EQU PMLOCY 00000002 EQU POBJTB 0000000A EQU PPOPX2 00000A9A CODE LABEL PPOPX4 00000ABA CODE LABEL PPURBT 0000000E EQU PRINIT -------- CODE IMPORT PRINT 000026CA CODE LABEL PRINTX1 000026E2 CODE LABEL PRLINE -------- CODE IMPORT PRNNX1 00000FA8 CODE LABEL PRNNX2 00000FB4 CODE LABEL PRNNX3 00000FB8 CODE LABEL PRNNX4 00000FC6 CODE LABEL PRNNX5 00000FD0 CODE LABEL PRNNX6 00000FD2 CODE LABEL PRNTX1 00000A18 CODE LABEL PRNTX2 00000A24 CODE LABEL PRNTX3 00000A50 CODE LABEL PROP 0000000C EQU PSCRWD 00000020 EQU PSERNM 00000012 EQU PSNLEN 00000020 EQU PSOFF 0000002A EQU PSTART 00000006 EQU PSX1 00001CF6 CODE LABEL PSX10 00001D82 CODE LABEL PSX11 00001D96 CODE LABEL PSX12 00001DA0 CODE LABEL PSX13 00001DA6 CODE LABEL PSX14 00001DAA CODE LABEL PSX15 00001DAE CODE LABEL PSX16 00001DB0 CODE LABEL PSX2 00001D00 CODE LABEL PSX3 00001D0A CODE LABEL PSX4 00001D2E CODE LABEL PSX5 00001D3E CODE LABEL PSX6 00001D4A CODE LABEL PSX7 00001D62 CODE LABEL PSX8 00001D68 CODE LABEL PSX9 00001D7A CODE LABEL PTAWRD 000003FE CODE LABEL PTCHARS 0000002E EQU PTLNX1 0000201E CODE LABEL PTLNX2 00002024 CODE LABEL PTRUE 000004F2 CODE LABEL PTRUE1 000004F4 CODE LABEL PTRUX1 00000500 CODE LABEL PTRUX3 0000051A CODE LABEL PTRUX4 00000526 CODE LABEL PTRUX5 0000052E CODE LABEL PTRUX6 00000538 CODE LABEL PTSBKS 000028F0 CODE LABEL PTSBX1 00002926 CODE LABEL PTSBX2 0000292E CODE LABEL PTSIX2 000008DE CODE LABEL PTSIX4 000008E4 CODE LABEL PURBOT FFFFFFF8 EQU PUTCHR 00001F84 CODE LABEL PUTLIN 00001FF6 CODE LABEL PUTLIN1 00001FEE CODE LABEL PUTNEW 00001F82 CODE LABEL PUTPX1 000007A6 CODE LABEL PUTPX2 000007AA CODE LABEL PUTPX3 000007C0 CODE LABEL PUTPX4 000007CA CODE LABEL PUTSTR 00001CEE CODE LABEL PUTVAL 000004E0 CODE LABEL PUTVAR 000004B0 CODE LABEL PUTVX1 000004B8 CODE LABEL PUTVX2 000004CA CODE LABEL PVERS1 00000000 EQU PVERS2 00000001 EQU PVOCTB 00000008 EQU PVWRD 00000024 EQU PWRDTB 00000018 EQU PZRKID 00000002 EQU QCX0 00001EF6 CODE LABEL QCX1 00001F16 CODE LABEL QCX10 00001F80 CODE LABEL QCX2 00001F1E CODE LABEL QCX2A 00001F24 CODE LABEL QCX3 00001F28 CODE LABEL QCX4 00001F34 CODE LABEL QCX5 00001F3C CODE LABEL QCX6 00001F50 CODE LABEL QCX7 00001F5E CODE LABEL QCX8 00001F68 CODE LABEL QCX9 00001F78 CODE LABEL QDCHR 00001FB6 CODE LABEL QEQUX1 00000654 CODE LABEL QEQUX2 00000660 CODE LABEL QFOFF FFFFFF1E EQU QIG1 00000AEA CODE LABEL QIG2 00000AF2 CODE LABEL QPLEN 00000020 EQU QSOFF FFFFFF1A EQU QUECHR 00001EBE CODE LABEL QUITGAME -------- CODE IMPORT RANDX1 000005D8 CODE LABEL RANDX2 000005DA CODE LABEL RANDX3 000005E0 CODE LABEL RANDX4 000005EE CODE LABEL RBRKS FFFFFFE4 EQU RCONST FFFFFFAC EQU RCYCLE FFFFFFAE EQU RDBOS FFFFFF78 EQU RDEOS FFFFFF74 EQU RDERR 00000E66 CODE LABEL RDLX1 00000D66 CODE LABEL RDLX10 00000DDE CODE LABEL RDLX12 00000DEA CODE LABEL RDLX14 00000DF0 CODE LABEL RDLX16 00000DF6 CODE LABEL RDLX2 00000D74 CODE LABEL RDLX20 00000E04 CODE LABEL RDLX22 00000E04 CODE LABEL RDLX4 00000D8E CODE LABEL RDLX5 00000D96 CODE LABEL RDLX6 00000DAA CODE LABEL RDLX8 00000DC2 CODE LABEL RDLX9 00000DD6 CODE LABEL RDLX9A 00000DDC CODE LABEL RDRET FFFFFF70 EQU RDWSTR FFFFFF82 EQU RDX4 00000B80 CODE LABEL RDZSTR FFFFFF7C EQU READFILE -------- CODE IMPORT READLN 00000D58 CODE LABEL RELABS 00000396 CODE LABEL REMOX1 000006FC CODE LABEL REMOX2 0000070E CODE LABEL REMOX3 00000716 CODE LABEL RES1 00001A24 CODE LABEL RESERR 00001A94 CODE LABEL RESSTA 00001832 CODE LABEL RESTOK 00001A74 CODE LABEL RESTRT 00000238 CODE LABEL RESX10 00001A62 CODE LABEL RESX12 00001A86 CODE LABEL RESX13 00001A8A CODE LABEL RESX14 00001A9A CODE LABEL RESX15 00001AA2 CODE LABEL RESX16 00001AAA CODE LABEL RESX2 00001A12 CODE LABEL RETFUN 00000018 EQU RLBSX1 000003A0 CODE LABEL RLBSX2 000003AA CODE LABEL ROLLX1 000013B8 CODE LABEL RSEED1 FFFFFFB2 EQU RSEED2 FFFFFFB0 EQU RSTTX1 00001AD2 CODE LABEL RTIME FFFFFF3A EQU SAVEOK 00001938 CODE LABEL SAVERR 00001950 CODE LABEL SAVFIL FFFFFEEA EQU SAVSTA 00001810 CODE LABEL SBFX0 000021C4 CODE LABEL SBNDX4 000021FC CODE LABEL SBNDX6 00002200 CODE LABEL SCALE2XPIC 00002BAC CODE LABEL EXPORT SCALE2XROW 00002BFE CODE LABEL SCHSIZ 00002416 CODE LABEL SCOUNT FFFFFF22 EQU SCRCHR 00002028 CODE LABEL SCRCX1 0000203A CODE LABEL SCRINIT 00002788 CODE LABEL SCRINP 00002064 CODE LABEL SCRIX1 00002076 CODE LABEL SCRIX2 0000207E CODE LABEL SCRIX3 00002086 CODE LABEL SCRLEN 00000041 EQU SCRLIN 00002048 CODE LABEL SCRNAM 0000208C CODE LABEL SCRNX9 00001108 CODE LABEL SCROLL -------- CODE IMPORT SCROUT 00002798 CODE LABEL SCURX2 0000228A CODE LABEL SCURX4 000022A4 CODE LABEL SCXPX1 00002BD4 CODE LABEL SCXPX2 00002BF2 CODE LABEL SCXRX1 00002C04 CODE LABEL SCXRX2 00002C16 CODE LABEL SCXRX3 00002C22 CODE LABEL SCXRX4 00002C2A CODE LABEL SCXRX9 00002C38 CODE LABEL SDFX2 00001CD8 CODE LABEL SDFX4 00001CDE CODE LABEL SETATTR 000022D2 CODE LABEL SETBOUNDS 000021CC CODE LABEL SETBUF 000021B0 CODE LABEL SETCOLOR -------- CODE IMPORT SETCURS 0000226E CODE LABEL SETDEF 00001CC2 CODE LABEL SETFONT 000022C2 CODE LABEL SETHL 000022D8 CODE LABEL SETMARG 00002302 CODE LABEL SETUNDO 0000230E CODE LABEL SETUPI 000024C6 CODE LABEL SETUPINPUT -------- CODE IMPORT SETUX1 000024D8 CODE LABEL SFREAD 000028CE CODE LABEL SFUNC FFFFFF24 EQU SFWRIT 000028FC CODE LABEL SH0 00000000 EQU SH2 00000020 EQU SH4 00000040 EQU SH6 00000060 EQU SHFX1 00000632 CODE LABEL SHOWVE FFFFFED6 EQU SHRINK75 00002B28 CODE LABEL EXPORT SHRINKONE 00002B70 CODE LABEL SIZEQP 00001EB6 CODE LABEL SIZFUN 00000010 EQU SK75X1 00002B3E CODE LABEL SK75X2 00002B64 CODE LABEL SKIP 00000000 EQU SKONX1 00002B76 CODE LABEL SKPCNT 00000032 EQU SPLTX1 0000111A CODE LABEL SPLTX2 00001162 CODE LABEL SPLTX5 00001188 CODE LABEL SQRWX1 00002A20 CODE LABEL SQUE FFFFFF50 EQU SQZROW 00002A14 CODE LABEL EXPORT SS2X1 000027D2 CODE LABEL START1 00000252 CODE LABEL STIPPIC 00002AB8 CODE LABEL EXPORT STIPROW 00002AEC CODE LABEL STKBOT FFFFFFBE EQU STKLEN 00000400 EQU STPPX1 00002AD2 CODE LABEL STPRX1 00002AEE CODE LABEL STPTAB 00000356 DATA LABEL STRLEN 00000386 CODE LABEL STRLX1 00000388 CODE LABEL STRX1 0000000C CODE LABEL STRX10 000001C6 CODE LABEL STRX11 000001C8 CODE LABEL STRX12 000001D4 CODE LABEL STRX16 00000202 CODE LABEL STRX17 0000021E CODE LABEL STRX2 00000040 CODE LABEL STRX3 0000004A CODE LABEL STRX3A 0000006A CODE LABEL STRX3B 00000082 CODE LABEL STRX4 000000BA CODE LABEL STRX6 00000128 CODE LABEL SUBVER 00000002 DATA LABEL SVX10 0000192A CODE LABEL SVX12 0000193E CODE LABEL SVX14 00001946 CODE LABEL SVX2 000018EA CODE LABEL SYSIN1 00002374 CODE LABEL SYSIN2 000027AC CODE LABEL SYSX1 00002390 CODE LABEL TABCHR 00001542 CODE LABEL TABOUT FFFFFF4C EQU TABPTR FFFFFF48 EQU TCHECK 00000F70 CODE LABEL TCHX2 00000F8A CODE LABEL TCHX3 00000F8E CODE LABEL TCLOCK FFFFFF28 EQU TCOUNT FFFFFF26 EQU TFUNC FFFFFF2C EQU THRX1 000017D0 CODE LABEL TIME60 000023FE CODE LABEL TIMEMD FFFFFFFC EQU TNEX1 00000F6E CODE LABEL TNEXT 00000F68 CODE LABEL TOPSP FFFFFFC2 EQU TOTCOLS -------- DATA IMPORT TOTROWS -------- DATA IMPORT TRESET 00000F5A CODE LABEL TSTWFLG 00001070 CODE LABEL TTYIN 0000259E CODE LABEL TTYOUT 000025E8 CODE LABEL TTYOX1 000025F8 CODE LABEL TTYOX2 00002602 CODE LABEL TTYX1 000025AA CODE LABEL TWAIT FFFFFF2E EQU TWOOPS 0000017E DATA LABEL UNDOFLAG -------- DATA IMPORT VCHARS 00000009 EQU VCOMP 00000F50 CODE LABEL VCPX1 00000F52 CODE LABEL VERX0 00001AFA CODE LABEL VERX05 00001B06 CODE LABEL VERX1 00001B2A CODE LABEL VERX2 00001B4C CODE LABEL VIECHO FFFFFF58 EQU VIFILE FFFFFF5C EQU VIKEYB FFFFFF5E EQU VOBUFF FFFFFF5A EQU VOCBEG FFFFFFD8 EQU VOCEND FFFFFFD4 EQU VOCONS FFFFFF68 EQU VOCTAB FFFFFFF4 EQU VOFILE FFFFFF60 EQU VOPRNT FFFFFF66 EQU VOSTAT FFFFFF64 EQU VOTABL FFFFFF62 EQU VWBOFF FFFFFF6C EQU VWLEN FFFFFFDE EQU VWORDS FFFFFFDC EQU VWSORT FFFFFF6E EQU WATTR 0000001C EQU WATTX1 00001222 CODE LABEL WATTX2 00001226 CODE LABEL WATTX3 0000122A CODE LABEL WATTX4 0000122C CODE LABEL WATTX5 0000122E CODE LABEL WATTX6 00001248 CODE LABEL WBLKLEN 00000022 EQU WBLOCKP FFFFFEF4 EQU WBOUNDS 00001052 CODE LABEL WCOLOR 00000016 EQU WCRCNT 00000012 EQU WCRINT 00000010 EQU WCSIZ 00000020 EQU WFBUFF 00000008 EQU WFONTID 00000018 EQU WFONTYX 0000001A EQU WFSCRL 00000002 EQU WFSCRP 00000004 EQU WFWRAP 00000001 EQU WHLIGHT 00000014 EQU WLCNT 0000001E EQU WLMARG 0000000C EQU WPOSX1 000011A2 CODE LABEL WPOSX2 000011AA CODE LABEL WPOSX9 000011C6 CODE LABEL WPRCHK 00002938 CODE LABEL WPRCX1 00002946 CODE LABEL WRDOFF FFFFFF6A EQU WRDTAB FFFFFFE8 EQU WRITEFILE -------- CODE IMPORT WRMARG 0000000E EQU WSIZX3 000011F0 CODE LABEL WXCURS 0000000A EQU WXPOS 00000002 EQU WXSIZE 00000006 EQU WYCURS 00000008 EQU WYPOS 00000000 EQU WYSIZE 00000004 EQU XMOUSE -------- DATA IMPORT XPSHX2 00000A8C CODE LABEL YMOUSE -------- DATA IMPORT ZALLOC -------- CODE IMPORT ZBASE 00000000 CODE LABEL ZBEEP 0000243A CODE LABEL ZCHARS 00000006 EQU ZCHRS 00000240 DATA LABEL ZEROPS 0000013E DATA LABEL ZFONT -------- CODE IMPORT ZLOCS FFFFFFB4 EQU ZMVERS 00000006 EQU ZORKID FFFFFFFE EQU ZPC1 FFFFFFBC EQU ZPC2 FFFFFFBA EQU ZSOUND -------- CODE IMPORT ZSTART 00000002 CODE LABEL EXPORT ZVARS 00000352 DATA LABEL ZVLEN 00000150 EQU ZWARN 00002748 CODE LABEL ZWORD 00001E18 CODE LABEL ZWSTR 00000C5A CODE LABEL ZWSX1 00000C80 CODE LABEL ZWX1 00001E22 CODE LABEL ZWX2 00001E38 CODE LABEL ZWX3 00001E58 CODE LABEL ZWX4 00001E60 CODE LABEL ZWX6 00001E68 CODE LABEL ZWX7 00001E74 CODE LABEL _CLR_MEM 000029D8 CODE LABEL _MOV_MEM 0000298A CODE LABEL #0001 00000000 CODE MODULE ENTRY ABORTERR FFFFFFE5 EQU ACCCLEAR 00000049 EQU ACCCOPY 00000047 EQU ACCCURSOR 00000042 EQU ACCCUT 00000046 EQU ACCEVENT 00000040 EQU ACCMENU 00000043 EQU ACCPASTE 00000048 EQU ACCRUN 00000041 EQU ACCUNDO 00000044 EQU ACTIVATEEVT 00000008 EQU ACTIVDEV 00000005 EQU ACTIVEFLAG 00000000 EQU ACTLCMD 00000004 EQU ADBADDRMASK 00FF0000 EQU ADBBASE 00000CF8 EQU ADDREFFAILED FFFFFF3D EQU ADDRESFAILED FFFFFF3E EQU AFPACCESSDENIED FFFFEC78 EQU AFPAUTHCONTINUE FFFFEC77 EQU AFPBADUAM FFFFEC76 EQU AFPBADVERSNUM FFFFEC75 EQU AFPBITMAPERR FFFFEC74 EQU AFPCALLNOTSUPPORTED FFFFEC60 EQU AFPCANTMOVE FFFFEC73 EQU AFPCANTRENAME FFFFEC5C EQU AFPDENYCONFLICT FFFFEC72 EQU AFPDIRNOTEMPTY FFFFEC71 EQU AFPDIRNOTFOUND FFFFEC5B EQU AFPDISKFULL FFFFEC70 EQU AFPEOFERROR FFFFEC6F EQU AFPFILEBUSY FFFFEC6E EQU AFPFLATVOL FFFFEC6D EQU AFPICONTYPEERROR FFFFEC5A EQU AFPITEMNOTFOUND FFFFEC6C EQU AFPLOCKERR FFFFEC6B EQU AFPMISCERR FFFFEC6A EQU AFPNOMORELOCKS FFFFEC69 EQU AFPNOSERVER FFFFEC68 EQU AFPOBJECTEXISTS FFFFEC67 EQU AFPOBJECTNOTFOUND FFFFEC66 EQU AFPOBJECTTYPEERR FFFFEC5F EQU AFPPARMERR FFFFEC65 EQU AFPRANGENOTLOCKED FFFFEC64 EQU AFPRANGEOVERLAP FFFFEC63 EQU AFPSERVERGOINGDOWN FFFFEC5D EQU AFPSESSCLOSED FFFFEC62 EQU AFPTOOMANYFILESOPEN FFFFEC5E EQU AFPUSERNOTAUTH FFFFEC61 EQU ALARMSTATE 0000021F EQU ALLOCPTR 00000030 EQU ALPHALOCK 0000000A EQU ALRMFLENABLE 00000000 EQU APP1EVT 0000000C EQU APP2EVT 0000000D EQU APP3EVT 0000000E EQU APP4EVT 0000000F EQU APPLLIMIT 00000130 EQU APPLZONE 000002AA EQU ARDCMD 00000002 EQU ASCBASE 00000CC0 EQU ASPBADVERSNUM FFFFFBD6 EQU ASPBUFTOOSMALL FFFFFBD5 EQU ASPNOACK FFFFFBCD EQU ASPNOMORESESS FFFFFBD4 EQU ASPNOSERVERS FFFFFBD3 EQU ASPPARAMERR FFFFFBD2 EQU ASPSERVERBUSY FFFFFBD1 EQU ASPSESSCLOSED FFFFFBD0 EQU ASPSIZEERR FFFFFBCF EQU ASPTOOMANY FFFFFBCE EQU ASTSCMD 00000005 EQU ASYNC 00000400 EQU ASYNCTRPBIT 0000000A EQU ATPBADRSP FFFFF3DD EQU ATPLENERR FFFFF3DE EQU AUTOKEYEVT 00000005 EQU AUTOPOP 00000400 EQU AWRCMD 00000003 EQU BADATPSKT FFFFFBB5 EQU BADBTSLPERR FFFFFFBA EQU BADBUFFNUM FFFFFBB4 EQU BADCHANNEL FFFFFF33 EQU BADCKSMERR FFFFFFBB EQU BADDBTSLP FFFFFFB7 EQU BADDCKSUM FFFFFFB8 EQU BADFORMAT FFFFFF32 EQU BADMDBERR FFFFFFC4 EQU BADMOVERR FFFFFF86 EQU BADUNITERR FFFFFFEB EQU BDNAMERR FFFFFFDB EQU BGNSLOTREF FFFFFFCF EQU BGNSLOTUNIT 00000030 EQU BKLIM 00000000 EQU BLKDATA 00000008 EQU BOOTDRIVE 00000210 EQU BREAKRECD FFFFFFA6 EQU BTNSTATE 00000007 EQU BUF2SMALLERR FFFFF3E3 EQU BUFPTR 0000010C EQU BUFTGDATE 00000304 EQU BUFTGFBKNUM 00000302 EQU BUFTGFFLG 00000300 EQU BUFTGFNUM 000002FC EQU BUILDSTIPS 00002A5C CODE LABEL EXPORT BUSERRVCT 00000008 EQU BUTTONMSG 00000013 EQU CANTSTEPERR FFFFFFB5 EQU CARETTIME 000002F4 EQU CASE 00000400 EQU CBNOTFOUND FFFFFBB2 EQU CDEVERR FFFFFF65 EQU CDEVGENERR FFFFFFFF EQU CDEVMEMERR 00000000 EQU CDEVRESERR 00000001 EQU CDEVUNSET 00000003 EQU CHARCODEMASK 000000FF EQU CHOOSERID 00000001 EQU CHUNKYDEPTH 00000D60 EQU CKSUMERR FFFFF3E1 EQU CLEAR 00000200 EQU CLEARBIT 00000009 EQU CLKRDERR FFFFFFAB EQU CLKWRERR FFFFFFAA EQU CLOSEDEV 00000002 EQU CLOSERR FFFFFFE8 EQU CMATCHERR FFFFFF6A EQU CMDKEY 00000008 EQU CMOREMASTERS 00000008 EQU CNOMEMERR FFFFFF68 EQU CNTEMPTY 00000020 EQU CNTHANDLES 00000022 EQU CNTNREL 0000001C EQU CNTREL 00000018 EQU COLLINES 00000C22 EQU CONTROLERR FFFFFFEF EQU CONTROLKEY 0000000C EQU CORERR FFFFFFFD EQU CPROTECTERR FFFFFF66 EQU CPUFLAG 0000012F EQU CQDGLOBALS 00000CCC EQU CRANGEERR FFFFFF67 EQU CRESERR FFFFFF64 EQU CROSSCURSOR 00000002 EQU CRSRADDR 00000888 EQU CRSRBASE 00000898 EQU CRSRBUSY 000008CD EQU CRSRCOUPLE 000008CF EQU CRSRDEVICE 0000089C EQU CRSRNEW 000008CE EQU CRSROBSCURE 000008D2 EQU CRSRPIN 00000834 EQU CRSRPTR 00000D62 EQU CRSRRECT 0000083C EQU CRSRROW 000008AC EQU CRSRSAVE 0000088C EQU CRSRSCALE 000008D3 EQU CRSRSTATE 000008D0 EQU CRSRTHRESH 000008EC EQU CRSRVIS 000008CC EQU CSCODE 0000001A EQU CSPARAM 0000001C EQU CTEMPMEMERR FFFFFF69 EQU CURAPNAME 00000910 EQU CURAPREFNUM 00000900 EQU CURDIRSTORE 00000398 EQU CURJTOFFSET 00000934 EQU CURPAGEOPTION 00000936 EQU CURPITCH 00000280 EQU CURRENTA5 00000904 EQU CURSTACKBASE 00000908 EQU DATAVERERR FFFFFFBC EQU DCEEXTERR FFFFFFE2 EQU DCINIT 00000019 EQU DCREAD 00000000 EQU DCSCAN 0000001A EQU DCSTATUS 00000003 EQU DCTLCURTICKS 0000001A EQU DCTLDELAY 00000022 EQU DCTLDEVBASE 0000002A EQU DCTLDRIVER 00000000 EQU DCTLEMASK 00000024 EQU DCTLENABLE 00000002 EQU DCTLENTRYSIZE 00000034 EQU DCTLEXTDEV 00000032 EQU DCTLFLAGS 00000004 EQU DCTLMENU 00000026 EQU DCTLOWNER 0000002E EQU DCTLPOSITION 00000010 EQU DCTLQHEAD 00000008 EQU DCTLQTAIL 0000000C EQU DCTLQUEUE 00000006 EQU DCTLREFNUM 00000018 EQU DCTLSLOT 00000028 EQU DCTLSLOTID 00000029 EQU DCTLSTORAGE 00000014 EQU DCTLWINDOW 0000001E EQU DCWRITE 00000001 EQU DDPLENERR FFFFFFA4 EQU DDPSKTERR FFFFFFA5 EQU DEACTIVDEV 00000006 EQU DEFLTSTACK 00000322 EQU DESELECTMSG 00000010 EQU DESKCPAT 00000CD8 EQU DESKPATDISABLE 00000CDC EQU DEVICELIST 000008A8 EQU DFLTSTACKSIZE 00002000 EQU DINSTERR FFFFFFE6 EQU DIRFULERR FFFFFFDF EQU DIRNFERR FFFFFF88 EQU DISKINSERTEVT 00000007 EQU DNEEDGOODBYE 00000004 EQU DNEEDLOCK 00000006 EQU DNEEDTIME 00000005 EQU DOPENED 00000005 EQU DOUBLETIME 000002F0 EQU DQDRIVE 00000006 EQU DQDRVSZ 0000000C EQU DQDRVSZ2 0000000E EQU DQFSID 0000000A EQU DQREFNUM 00000008 EQU DRAMBASED 00000006 EQU DRDRIVENUM 00000000 EQU DREADENABLE 00000000 EQU DREMOVERR FFFFFFE7 EQU DRREFNUM 00000002 EQU DRVQHDR 00000308 EQU DRVQTYPE 00000003 EQU DRVRACTIVE 00000007 EQU DRVRCLOSE 00000010 EQU DRVRCTL 0000000C EQU DRVRDELAY 00000002 EQU DRVREMASK 00000004 EQU DRVRFLAGS 00000000 EQU DRVRMENU 00000006 EQU DRVRNAME 00000012 EQU DRVROPEN 00000008 EQU DRVRPRIME 0000000A EQU DRVRSTATUS 0000000E EQU DRVSTSCODE 00000008 EQU DSALERTRECT 000003F8 EQU DSALERTTAB 000002BA EQU DSBADSANEOPCODE 00000051 EQU DSBADSLOTINT 00000033 EQU DSCTRADJ 00000DA8 EQU DSDISKERRS 00000014 EQU DSDISKINPLACE 00000003 EQU DSDQDRIVE 0000000C EQU DSDQFSID 00000010 EQU DSDQREFNUM 0000000E EQU DSDQVERS 0000000A EQU DSDRAWPROC 00000334 EQU DSDRVCHAR 0000001A EQU DSDRVMANF 00000018 EQU DSDRVMISC 0000001C EQU DSDRVS1 00000014 EQU DSDRVSIZE 00000012 EQU DSDRVTYPE 00000016 EQU DSERRCODE 00000AF0 EQU DSHMENUFINDERR 00000056 EQU DSINSTALLED 00000004 EQU DSKERR 00000142 EQU DSKFULERR FFFFFFDE EQU DSKRFN 0000FFFB EQU DSKVERIFY 0000012C EQU DSMBARNFND 00000055 EQU DSQLINK 00000006 EQU DSSIDES 00000005 EQU DSTATENABLE 00000003 EQU DSTRACK 00000000 EQU DSTWOSIDEFMT 00000012 EQU DSWNDUPDATE 0000015D EQU DSWRITEPROT 00000002 EQU DTADDR 00000008 EQU DTDAY 00000004 EQU DTDAYOFWEEK 0000000C EQU DTFLAGS 00000006 EQU DTHOUR 00000006 EQU DTLINK 00000000 EQU DTMINUTE 00000008 EQU DTMONTH 00000002 EQU DTPARM 0000000C EQU DTQELSIZE 00000014 EQU DTQFLAGS 00000D92 EQU DTQTYPE 00000007 EQU DTQUEUE 00000D92 EQU DTRESRVD 00000010 EQU DTSECOND 0000000A EQU DTSKQHDR 00000D94 EQU DTSKQTAIL 00000D98 EQU DTTYPE 00000004 EQU DTYEAR 00000000 EQU DUPFNERR FFFFFFD0 EQU DWRITENABLE 00000001 EQU EJECTCODE 00000007 EQU EJECTNOTIFY 00000338 EQU ENDSRTPTR 00000DB4 EQU ENV512KE 00000001 EQU ENV68000 00000001 EQU ENV68010 00000002 EQU ENV68020 00000003 EQU ENVAEXTENDKBD 00000004 EQU ENVBADVERS FFFFEA83 EQU ENVCPUUNKNOWN 00000000 EQU ENVMAC FFFFFFFF EQU ENVMACANDPAD 00000002 EQU ENVMACHUNKNOWN 00000000 EQU ENVMACII 00000004 EQU ENVMACKBD 00000001 EQU ENVMACPLUS 00000002 EQU ENVMACPLUSKBD 00000003 EQU ENVNOTPRESENT FFFFEA84 EQU ENVSE 00000003 EQU ENVSTANDADBKBD 00000005 EQU ENVUNKNOWNKBD 00000000 EQU ENVVERSTOOBIG FFFFEA82 EQU ENVXL FFFFFFFE EQU EOFERR FFFFFFD9 EQU EVENTQUEUE 0000014A EQU EVERYEVENT FFFFFFFF EQU EVTBLKSIZE 00000010 EQU EVTBUFCNT 00000154 EQU EVTMBUT 0000000F EQU EVTMESSAGE 00000002 EQU EVTMETA 0000000E EQU EVTMOUSE 0000000A EQU EVTNOTENB 00000001 EQU EVTNUM 00000000 EQU EVTQBLKSIZE 00000016 EQU EVTQMBUT 00000015 EQU EVTQMESSAGE 00000008 EQU EVTQMETA 00000014 EQU EVTQWHAT 00000006 EQU EVTQWHEN 0000000C EQU EVTQWHERE 00000010 EQU EVTTICKS 00000006 EQU EVTYPE 00000004 EQU EXCESSCOLLSNS FFFFFFA1 EQU EXPANDMEM 000002B6 EQU EXPANDMEMREC 00000000 TEMPLATE EXPANDSIZE 00000040 EQU EXTFSERR FFFFFFC6 EQU EXTRACTERR FFFFF3E0 EQU EXTSTSDT 000002BE EQU EZIP 00000001 EQU FALSE32B 00000000 EQU FBSYERR FFFFFFD1 EQU FCHECKING 00000001 EQU FDCOMMENT 0000000A EQU FDCREATOR 00000004 EQU FDESKTOP FFFFFFFE EQU FDFLAGS 00000008 EQU FDFLDR 0000000E EQU FDICONID 00000000 EQU FDISK 00000000 EQU FDLOCATION 0000000A EQU FDPUTAWAY 0000000C EQU FDTYPE 00000000 EQU FDUNUSED 00000002 EQU FHASBUNDLE 00002000 EQU FILLCSPEC 00002A38 CODE LABEL EXPORT FILLLISTMSG 0000000D EQU FINVISIBLE 00004000 EQU FIRSTDSKERR FFFFFFAC EQU FLAGS 00000016 EQU FLCKDERR FFFFFFD3 EQU FMT1ERR FFFFFFAE EQU FMT2ERR FFFFFFAD EQU FMULTI 00000000 EQU FNFERR FFFFFFD5 EQU FNOPNERR FFFFFFDA EQU FNORVRALLOC 00000005 EQU FNSELCOMPCT 00000004 EQU FNSELPURGE 00000006 EQU FONCHECK 00000000 EQU FONDESK 00000001 EQU FONTDECERROR FFFFFFC0 EQU FONTNOTDECLARED FFFFFFBF EQU FONTSUBERR FFFFFFBE EQU FRCOMMENT 0000000A EQU FRELATEND 00000007 EQU FRFLAGS 00000008 EQU FRLOCATION 0000000A EQU FROPENCHAIN 00000004 EQU FRPUTAWAY 0000000C EQU FRRECT 00000000 EQU FRSCROLL 00000000 EQU FRUNUSED 00000008 EQU FRVIEW 0000000E EQU FSATMARK 00000000 EQU FSCTCNID 00000004 EQU FSCURPERM 00000000 EQU FSFROMLEOF 00000002 EQU FSFROMMARK 00000003 EQU FSFROMSTART 00000001 EQU FSQTYPE 00000005 EQU FSRDPERM 00000001 EQU FSRDWRPERM 00000003 EQU FSRDWRSHPERM 00000004 EQU FSRNERR FFFFFFC5 EQU FSRTDIRID 00000002 EQU FSRTPARID 00000001 EQU FSUSRCNID 00000010 EQU FSWRPERM 00000002 EQU FSXTCNID 00000003 EQU FTRASH FFFFFFFD EQU GDBADDEV FFFFFFEE EQU GETPARAM 000001E4 EQU GETSELMSG 0000000E EQU GFPERR FFFFFFCC EQU GOODBYE FFFFFFFF EQU GZMOVEHND 00000330 EQU GZPROC 00000010 EQU GZROOTHND 00000328 EQU GZROOTPTR 0000032C EQU HANDLE 00000004 EQU HEAPDATA 00000034 EQU HEAPEND 00000114 EQU HFSTFREE 00000008 EQU HIHEAPMARK 00000BAE EQU HIKEYLAST 00000216 EQU HILITEMODE 00000938 EQU HILITERGB 00000DA0 EQU HITDEV 00000001 EQU HMENUFINDERR FFFFFF81 EQU HPCHK 00000316 EQU I2CRANGEERR FFFFFFEF EQU IAZNOTIFY 0000033C EQU IBEAMCURSOR 00000001 EQU ICONTLADDR 00000DAC EQU IIOABORTERR FFFFFFE5 EQU IMMED 00000200 EQU INDTQ 00000006 EQU INITDEV 00000000 EQU INITIWMERR FFFFFFB3 EQU INTFLAG 0000015F EQU INTLSPEC 00000BA0 EQU INVBL 00000006 EQU IOACTCOUNT 00000028 EQU IOALBLST 00000038 EQU IOBUFFER 00000020 EQU IOBYTECOUNT 00000024 EQU IOCMDADDR 00000008 EQU IOCOMPLETION 0000000C EQU IODIRFLG 00000004 EQU IODIRID 00000030 EQU IODRBKDAT 00000050 EQU IODRCRDAT 00000048 EQU IODRDIRID 00000030 EQU IODRFNDRINFO 00000054 EQU IODRMDDAT 0000004C EQU IODRNMFLS 00000034 EQU IODRPARID 00000064 EQU IODRUSRWDS 00000020 EQU IODRVNUM 00000016 EQU IODRVREVT 0000000B EQU IOERR FFFFFFDC EQU IOFCBCLPSIZ 00000036 EQU IOFCBCRPS 00000030 EQU IOFCBEOF 00000028 EQU IOFCBFILLER1 0000001E EQU IOFCBFLAGS 00000024 EQU IOFCBFLNM 00000020 EQU IOFCBINDX 0000001C EQU IOFCBPARID 0000003A EQU IOFCBPLEN 0000002C EQU IOFCBQELSIZE 0000003E EQU IOFCBSTBLK 00000026 EQU IOFCBVREFNUM 00000034 EQU IOFDIRINDEX 0000001C EQU IOFFLNUM 00000030 EQU IOFFLTYPE 0000001F EQU IOFILENAME 00000012 EQU IOFILETYPE 0000001A EQU IOFLAGS 00000020 EQU IOFLATTRIB 0000001E EQU IOFLBKDAT 00000050 EQU IOFLCLPSIZ 00000068 EQU IOFLCRDAT 00000048 EQU IOFLLGLEN 00000036 EQU IOFLMDDAT 0000004C EQU IOFLPARID 00000064 EQU IOFLPYLEN 0000003A EQU IOFLRLGLEN 00000040 EQU IOFLRPYLEN 00000044 EQU IOFLRSTBLK 0000003E EQU IOFLSTBLK 00000034 EQU IOFLUSRWDS 00000020 EQU IOFLXFNDRINFO 00000054 EQU IOFQELSIZE 00000050 EQU IOFSVRSN 00000020 EQU IOHFQELSIZ 0000006C EQU IOHVQELSIZE 0000007A EQU IOID 00000023 EQU IOLEOF 0000001C EQU IOLINK 00000000 EQU IOMIX 0000001C EQU IONEWDIRID 00000024 EQU IONEWNAME 0000001C EQU IONEWTYPE 0000001C EQU IONUMDONE 00000028 EQU IOOWNBUF 0000001C EQU IOPERMSSN 0000001B EQU IOPMSPFLG 0000001A EQU IOPMSPHOOK 0000001C EQU IOPOSMODE 0000002C EQU IOPOSOFFSET 0000002E EQU IOQELSIZE 00000032 EQU IOQTYPE 00000002 EQU IOREFNUM 00000018 EQU IOREQCOUNT 00000024 EQU IORESULT 00000010 EQU IOSEBLKPTR 00000022 EQU IOSLOT 00000022 EQU IOTRAP 00000006 EQU IOTYPE 00000004 EQU IOVALBLKSIZ 00000030 EQU IOVATRB 00000026 EQU IOVBKUP 00000048 EQU IOVBLLN 0000002C EQU IOVCBVBMST 0000002A EQU IOVCLPSIZ 00000034 EQU IOVCRDATE 0000001E EQU IOVDIRCNT 00000056 EQU IOVDIRST 0000002A EQU IOVDREFNUM 00000044 EQU IOVDRVINFO 00000042 EQU IOVDRVNUM 00000016 EQU IOVFILCNT 00000052 EQU IOVFNDRINFO 0000005A EQU IOVFRBLK 0000003E EQU IOVFSID 00000046 EQU IOVLSBKUP 00000022 EQU IOVLSMOD 00000022 EQU IOVNMALBLKS 0000002E EQU IOVNMFLS 00000028 EQU IOVNPTR 00000012 EQU IOVNXTCNID 0000003A EQU IOVNXTFNUM 0000003A EQU IOVOLINDEX 0000001C EQU IOVQELSIZE 00000040 EQU IOVREFNUM 00000016 EQU IOVSEQNUM 0000004C EQU IOVSIGWORD 00000040 EQU IOVWRCNT 0000004E EQU IOWDDIRID 00000030 EQU IOWDINDEX 0000001A EQU IOWDPROCID 0000001C EQU IOWDVREFNUM 00000020 EQU ITABPURGERR FFFFFFF7 EQU IWM 000001E0 EQU JALLOCCRSR 0000088C EQU JCBUTTON 00000002 EQU JCEVENT 00000004 EQU JCGETKEYS 00000003 EQU JCGETMOUSE 00000001 EQU JCRSRTASK 000008EE EQU JCTICKCOUNT 00000000 EQU JDTINSTALL 00000D9C EQU JFETCH 000008F4 EQU JGNEFILTER 0000029A EQU JIODONE 000008FC EQU JKYBDTASK 0000021A EQU JOPCODEPROC 00000894 EQU JOURNALFLAG 000008DE EQU JOURNALREF 000008E8 EQU JPLAYCTL 00000010 EQU JRECORDCTL 00000011 EQU JSETCCRSR 00000890 EQU JSTASH 000008F8 EQU JSWAPMMU 00000DBC EQU JVBLTASK 00000D28 EQU KBDLAST 00000218 EQU KBDTYPE 0000021E EQU KBDVARS 00000216 EQU KEY1TRANS 0000029E EQU KEY2TRANS 000002A2 EQU KEYCODEMASK 0000FF00 EQU KEYDWNEVT 00000003 EQU KEYEVTDEV 00000007 EQU KEYLAST 00000184 EQU KEYMAP 00000174 EQU KEYMVARS 00000B04 EQU KEYPADMAP 0000017C EQU KEYREPTHRESH 00000190 EQU KEYREPTIME 0000018A EQU KEYTHRESH 0000018E EQU KEYTIME 00000186 EQU KEYUPEVT 00000004 EQU KILLCODE 00000001 EQU LAPPROTERR FFFFFFA2 EQU LASTDSKERR FFFFFFC0 EQU LASTTXGDEVICE 00000DC4 EQU LAUNCHFLAG 00000902 EQU LIMITPTR 00000004 EQU LO3BYTES 0000031A EQU LOADERPBLOCK 0000093A EQU LOADTRAP 0000012D EQU LOCK 00000007 EQU LVL1DT 00000192 EQU LVL2DT 000001B2 EQU MACDEV 00000008 EQU MAINDEVICE 000008A4 EQU MALLOCCNT 00000014 EQU MAPREADERR FFFFFF39 EQU MARKS 00000200 EQU MASKBC 0000031A EQU MASKHANDLE 0000031A EQU MASKPTR 0000031A EQU MAXNREL 0000001E EQU MAXREL 0000001A EQU MAXSIZE 00800000 EQU MAXUTENTRIES 00000080 EQU MBARNFND FFFFFF82 EQU MBSTATE 00000172 EQU MBTICKS 0000016E EQU MBUTDWNEVT 00000001 EQU MBUTUPEVT 00000002 EQU MEMADRERR FFFFFF92 EQU MEMAZERR FFFFFF8F EQU MEMBCERR FFFFFF8D EQU MEMERR 00000220 EQU MEMFULLERR FFFFFF94 EQU MEMLOCKEDERR FFFFFF8B EQU MEMPCERR FFFFFF8E EQU MEMPURERR FFFFFF90 EQU MEMROZERR FFFFFF9D EQU MEMROZERROR FFFFFF9D EQU MEMROZWARN FFFFFF9D EQU MEMSCERR FFFFFF8C EQU MEMTOP 00000108 EQU MEMWZERR FFFFFF91 EQU MFULERR FFFFFFD7 EQU MICKEYBYTES 00000D6A EQU MINCBFREE 00000024 EQU MINSTACK 0000031E EQU MINUSONE 00000A06 EQU MMDEFFLAGS 00000326 EQU MMINOK 0000012E EQU MMU32BIT 00000CB2 EQU MMUFLAGS 00000CB0 EQU MMUFLUFF 00000CB3 EQU MMUTBL 00000CB4 EQU MMUTBLSIZE 00000CB8 EQU MMUTYPE 00000CB1 EQU MNSTACKSIZE 00000400 EQU MONKEYLIVES 00000100 EQU MOUSE 00000830 EQU MOUSEMASK 000008D6 EQU MOUSEOFFSET 000008DA EQU MTEMP 00000828 EQU NBPBUFFOVR FFFFFC00 EQU NBPCONFDIFF FFFFFBFE EQU NBPDUPLICATE FFFFFBFD EQU NBPNISERR FFFFFBFB EQU NBPNOCONFIRM FFFFFBFF EQU NBPNOTFOUND FFFFFBFC EQU NETWORKEVT 0000000A EQU NEWCRSRJCNT 00000001 EQU NEWCRSRJTBL 0000088C EQU NEWOS 00000200 EQU NEWSELMSG 0000000C EQU NEWTOOL 00000600 EQU NILHANDLEERR FFFFFF93 EQU NMIFLAG 00000C2C EQU NOADRMKERR FFFFFFBD EQU NOBRIDGEERR FFFFFFA3 EQU NOCOLMATCH FFFFFFF6 EQU NODATAAREA FFFFFBB0 EQU NODRIVEERR FFFFFFC0 EQU NODTAMKERR FFFFFFB9 EQU NOERR 00000000 EQU NOHARDWARE FFFFFF38 EQU NOMACDSKERR FFFFFFC7 EQU NOMPPERR FFFFF3E2 EQU NONYBERR FFFFFFBE EQU NOQUEUEBIT 00000009 EQU NORELERR FFFFFBB3 EQU NOROOMERR FFFFFFF2 EQU NOSCRAPERR FFFFFF9C EQU NOSENDRESP FFFFFBB1 EQU NOTENOUGHHARDWARE FFFFFF37 EQU NOTOPENERR FFFFFFE4 EQU NOTYPEERR FFFFFF9A EQU NSDRVERR FFFFFFC8 EQU NSVERR FFFFFFDD EQU NULDEV 00000003 EQU NULLEVT 00000000 EQU OFFLINERR FFFFFFBF EQU ONEONE 00000A02 EQU OPENERR FFFFFFE9 EQU OPTIONKEY 0000000B EQU OPWRERR FFFFFFCF EQU OVERRUN FFFFFFF3 EQU PARAMERR FFFFFFCE EQU PCDESKPAT 0000020B EQU PERMERR FFFFFFCA EQU PGROWZONE 0000000A EQU PLUSCURSOR 00000003 EQU PORTAUSE 00000290 EQU PORTBUSE 00000291 EQU PORTINUSE FFFFFF9F EQU PORTLIST 00000D66 EQU PORTNOTCF FFFFFF9E EQU POSERR FFFFFFD8 EQU PRINITERR FFFFFFA8 EQU PRWRERR FFFFFFA9 EQU PSALERT 00000006 EQU PURGE 00000006 EQU PURGEPROC 00000028 EQU PURGEPTR 00000004 EQU PWMBUF2 00000312 EQU QALLOCERR FFFFFFF5 EQU QDCOLORS 000008B0 EQU QDERR 00000D6E EQU QDEXIST 000008F3 EQU QERR FFFFFFFF EQU QFLAGS 00000000 EQU QHEAD 00000002 EQU QHEADSIZE 0000000A EQU QINUSE 00000007 EQU QLINK 00000000 EQU QTAIL 00000006 EQU QTYPE 00000004 EQU QUEUEFULL FFFFFF35 EQU RAMBASE 000002B2 EQU RAWMOUSE 0000082C EQU RCVRERR FFFFFFA7 EQU RDVERIFY 00000040 EQU READERR FFFFFFED EQU READQERR FFFFF3DF EQU RECNOTFND FFFFF3DC EQU REQABORTED FFFFFBAF EQU REQFAILED FFFFFBB8 EQU RERANGEERR FFFFFFED EQU RESATTRERR FFFFFF3A EQU RESFNOTFOUND FFFFFF3F EQU RESNOTFOUND FFFFFF40 EQU RESOURCE 00000005 EQU RESPROBLEM FFFFFF34 EQU RESTPROC 00000A8C EQU RESUMEPROC 00000A8C EQU RFNUMERR FFFFFFCD EQU RGBBLACK 00000C10 EQU RGBWHITE 00000C16 EQU RMVREFFAILED FFFFFF3B EQU RMVRESFAILED FFFFFF3C EQU RNDSEED 00000156 EQU ROM85 0000028E EQU ROMBASE 000002AE EQU ROMMAPHNDL 00000B06 EQU ROWBITS 00000C20 EQU ROZ 00000000 EQU SAVESEGHANDLE 00000930 EQU SBSTATE0 00000000 EQU SBSTATE1 00000001 EQU SCALE2XPIC 00002BAC CODE LABEL EXPORT SCCASTS 000002CE EQU SCCBSTS 000002CF EQU SCCRD 000001D8 EQU SCCWR 000001DC EQU SCRAPCOUNT 00000968 EQU SCRAPEND 00000980 EQU SCRAPHANDLE 00000964 EQU SCRAPINFO 00000960 EQU SCRAPNAME 0000096C EQU SCRAPSIZE 00000960 EQU SCRAPSTATE 0000096A EQU SCRAPTAG 00000970 EQU SCRAPVARS 00000960 EQU SCRATCH20 000001E4 EQU SCRATCH8 000009FA EQU SCRDMPENB 000002F8 EQU SCRDMPTYPE 000002F9 EQU SCREENBYTES 00000C24 EQU SCREENROW 00000106 EQU SCRHRES 00000104 EQU SCRNBASE 00000824 EQU SCRNVBLPTR 00000D10 EQU SCRVRES 00000102 EQU SCSIBASE 00000C00 EQU SCSIDMA 00000C04 EQU SCSIGLOBALS 00000C0C EQU SCSIHSK 00000C08 EQU SCSIPOLL 00000C2F EQU SDEXTDEVID 00000000 EQU SDMBUSERR 00000DC0 EQU SDMINITERR 0000000B EQU SDMJMPTBLPTR 00000DB8 EQU SDMJTINITERR 0000000A EQU SDMPRAMINITERR 0000000D EQU SDMPRIINITERR 0000000E EQU SDMSRTINITERR 0000000C EQU SDOSTYPE 00000001 EQU SDPARTITION 00000001 EQU SDREFNUM 00000002 EQU SDRESERVED 00000000 EQU SDRESERVED1 00000000 EQU SDRESERVED2 00000001 EQU SDSLOT 00000000 EQU SDSLOTNUM 00000002 EQU SDSRESOURCE 00000001 EQU SDSRSRCID 00000003 EQU SDVOLUME 00000260 EQU SECTNFERR FFFFFFAF EQU SEEKERR FFFFFFB0 EQU SEGHIENABLE 00000BB2 EQU SEINVREQUEST FFFFFFEC EQU SELECTMSG 0000000F EQU SENODB FFFFFFF8 EQU SENOMEMERR FFFFFFEB EQU SEOUTOFRANGE FFFFFFF1 EQU SEPROTERR FFFFFFF0 EQU SERIALVARS 000002D0 EQU SEVARBASE 00000C30 EQU SEVTENB 0000015C EQU SFSAVEDISK 00000214 EQU SHERRS 00000004 EQU SHEVTS 00000005 EQU SHFCTS 00000001 EQU SHFINX 00000006 EQU SHFXON 00000000 EQU SHIFTKEY 00000009 EQU SHNULL 00000007 EQU SHRINK75 00002B28 CODE LABEL EXPORT SHXOFF 00000003 EQU SHXON 00000002 EQU SIINITSDTBLERR 00000001 EQU SIINITSPTBLERR 00000003 EQU SIINITVBLQSERR 00000002 EQU SINFOPTR 00000CBC EQU SINITFLAGS 00000D90 EQU SIQTYPE 00000006 EQU SKTCLOSEDERR FFFFF3DB EQU SLOTNUMERR FFFFFE98 EQU SLOTPRTBL 00000D08 EQU SLOTQDT 00000D04 EQU SLOTTICKS 00000D14 EQU SLOTVBLQ 00000D0C EQU SMBADBOARDID FFFFFEC1 EQU SMBADREFID FFFFFEB6 EQU SMBADSLIST FFFFFEB5 EQU SMBADSPTRERR FFFFFEA6 EQU SMBLFIELDBAD FFFFFECB EQU SMBLKMOVEERR FFFFFEAC EQU SMBUSERRTO FFFFFEC0 EQU SMBYTELANESERR FFFFFEA5 EQU SMCKSTATUSERR FFFFFEAB EQU SMCODEREVERR FFFFFEB3 EQU SMCPUERR FFFFFEB2 EQU SMCRCFAIL FFFFFED3 EQU SMDISDRVRNAMERR FFFFFEA9 EQU SMDISPOSEPERR FFFFFEC8 EQU SMEMPTYSLOT FFFFFED4 EQU SMFHBLKDISPERR FFFFFEC9 EQU SMFHBLOCKRDERR FFFFFECA EQU SMFORMATERR FFFFFED2 EQU SMGETDRVRNAMERR FFFFFEAA EQU SMGETPRERR FFFFFEC6 EQU SMGLOBALS 00000CC4 EQU SMINTSTATVERR FFFFFEC4 EQU SMINTTBLVERR FFFFFEC3 EQU SMLWTSTBAD FFFFFECF EQU SMNEWPERR FFFFFEAD EQU SMNILSBLOCKERR FFFFFEB0 EQU SMNOBOARDID FFFFFEC5 EQU SMNOBOARDSRSRC FFFFFEC7 EQU SMNODIR FFFFFED0 EQU SMNOGOODOPENS FFFFFEA3 EQU SMNOJMPTBL FFFFFEC2 EQU SMNOMORESRSRCS FFFFFEA8 EQU SMNOSINFOARRAY FFFFFECE EQU SMOFFSETERR FFFFFEA4 EQU SMPRAMINITERR FFFFFEDC EQU SMPRIINITERR FFFFFEDB EQU SMRECNOTFND FFFFFEA1 EQU SMRESERVEDERR FFFFFEB4 EQU SMRESRVERR FFFFFECD EQU SMREVISIONERR FFFFFED1 EQU SMSDMINITERR FFFFFEDE EQU SMSELOOBERR FFFFFEAE EQU SMSGETDRVRERR FFFFFEA7 EQU SMSLOTOOBERR FFFFFEAF EQU SMSPOINTERNIL FFFFFEB1 EQU SMSRTINITERR FFFFFEDD EQU SMSRTOVRFLERR FFFFFEA2 EQU SMUNEXBUSERR FFFFFECC EQU SORTSAFTER 00000001 EQU SORTSBEFORE FFFFFFFF EQU SORTSEQUAL 00000000 EQU SOUNDACTIVE 0000027E EQU SOUNDBASE 00000266 EQU SOUNDDCE 0000027A EQU SOUNDLEVEL 0000027F EQU SOUNDPTR 00000262 EQU SOUNDVBL 0000026A EQU SPALARM 00000200 EQU SPATALKA 000001F9 EQU SPATALKB 000001FA EQU SPCLIKCARET 00000209 EQU SPCONFIG 000001FB EQU SPDADJERR FFFFFFB1 EQU SPFONT 00000204 EQU SPKBD 00000206 EQU SPMISC1 0000020A EQU SPMISC2 0000020B EQU SPPORTA 000001FC EQU SPPORTB 000001FE EQU SPPRINT 00000207 EQU SPVALID 000001F8 EQU SPVOLCTL 00000208 EQU SQZROW 00002A14 CODE LABEL EXPORT SRCDEVICE 000008A0 EQU SRSRCTBLPTR 00000D24 EQU SSCTSHOLD 00000004 EQU SSCUMERRS 00000000 EQU SSRDPEND 00000002 EQU SSWRPEND 00000003 EQU SSXOFFHOLD 00000005 EQU SSXOFFSENT 00000001 EQU STARTPTR 00000000 EQU STATUSERR FFFFFFEE EQU STIPPIC 00002AB8 CODE LABEL EXPORT STKLOWPT 00000110 EQU SWITCHERTPTR 00000286 EQU SYS 00000400 EQU SYSENVREC 00000000 TEMPLATE SYSEVTBUF 00000146 EQU SYSEVTMASK 00000144 EQU SYSPARAM 000001F8 EQU SYSVERSION 0000015A EQU SYSZONE 000002A6 EQU TABLESEED 00000D20 EQU TAGBC 00000000 EQU TAGDATA 000002FA EQU TBLALLOCERR FFFFFFF4 EQU TERMINATEMSG 00000011 EQU TGBUFFCODE 00000008 EQU THECHOOSER 00000001 EQU THECRSR 00000844 EQU THEGDEVICE 00000CC8 EQU THEZONE 00000118 EQU TICKS 0000016A EQU TIME 0000020C EQU TIMEDBRA 00000D00 EQU TIMESCCDB 00000D02 EQU TIMESCSIDB 00000DA6 EQU TK0BADERR FFFFFFB4 EQU TMFOERR FFFFFFD6 EQU TMWDOERR FFFFFF87 EQU TOEXTFS 000003F2 EQU TOOMANYREQS FFFFFBB7 EQU TOOMANYSKTS FFFFFBB6 EQU TRUE32B 00000001 EQU TSYSORCURZONE 0000000A EQU TWOSIDEERR FFFFFFB2 EQU TYBKFREE 00000000 EQU TYBKMASK 00000003 EQU TYBKNREL 00000001 EQU TYBKREL 00000002 EQU UNIMPERR FFFFFFFC EQU UNITEMPTYERR FFFFFFEA EQU UNITENTRIES 00000040 EQU UNITNTRYCNT 000001D2 EQU UNITTBLFULLERR FFFFFFE3 EQU UPDATEDEV 00000004 EQU UPDATEVT 00000006 EQU UPDPIXMEMERR FFFFFF83 EQU USEASYNC 00000002 EQU USEATALK 00000001 EQU USEEXTCLK 00000003 EQU USEFREE 00000000 EQU UTABLEBASE 0000011C EQU VBLADDR 00000006 EQU VBLCOUNT 0000000A EQU VBLINK 00000000 EQU VBLPHASE 0000000C EQU VBLQUEUE 00000160 EQU VBLTYPE 00000004 EQU VERERR FFFFFFAC EQU VERTRRATE 00000D30 EQU VIA 000001D4 EQU VIA2DT 00000D70 EQU VIDEOINFOOK 00000DB0 EQU VIDEOMAGIC 5A932BC7 EQU VIDMODE 00000C2E EQU VIDTYPE 00000C2D EQU VLCKDERR FFFFFFD2 EQU VOLGONEERR FFFFFF84 EQU VOLOFFLINERR FFFFFFCB EQU VOLONLINERR FFFFFFC9 EQU VTYPE 00000001 EQU VTYPERR FFFFFFFE EQU WARMSTART 00000CFC EQU WATCHCURSOR 00000004 EQU WHOLEERRORS 00000000 EQU WHOLESYSTEM 00000001 EQU WMGRCPORT 00000D2C EQU WMSTCONST 574C5343 EQU WPRERR FFFFFFD4 EQU WRGVOLTYPERR FFFFFF85 EQU WRITERR FFFFFFEC EQU WRPERMERR FFFFFFC3 EQU WRUNDERRUN FFFFFFB6 EQU WWEXIST 000008F2 EQU ZCBFREE 0000000C EQU ZSTART 00000002 CODE LABEL EXPORT _ADBOP 0000A07C OPWORD _ADBREINIT 0000A07B OPWORD _ADDCOMP 0000AA3B OPWORD _ADDDRIVE 0000A04E OPWORD _ADDPT 0000A87E OPWORD _ADDREFERENCE 0000A9AC OPWORD _ADDRESMENU 0000A94D OPWORD _ADDRESOURCE 0000A9AB OPWORD _ADDSEARCH 0000AA3A OPWORD _ALERT 0000A985 OPWORD _ALLOCATE 0000A010 OPWORD _ALLOCCONTIG 0000A210 OPWORD _ALLOCCURSOR 0000AA1D OPWORD _ANGLEFROMSLOPE 0000A8C4 OPWORD _APPENDMENU 0000A933 OPWORD _ATTACHVBL 0000A071 OPWORD _BACKCOLOR 0000A863 OPWORD _BACKPAT 0000A87C OPWORD _BACKPIXPAT 0000AA0B OPWORD _BEGINUPDATE 0000A922 OPWORD _BITAND 0000A858 OPWORD _BITCLR 0000A85F OPWORD _BITNOT 0000A85A OPWORD _BITOR 0000A85B OPWORD _BITSET 0000A85E OPWORD _BITSHIFT 0000A85C OPWORD _BITTST 0000A85D OPWORD _BITXOR 0000A859 OPWORD _BLOCKMOVE 0000A02E OPWORD _BRINGTOFRONT 0000A920 OPWORD _BUTTON 0000A974 OPWORD _CALCCMASK 0000AA4F OPWORD _CALCMASK 0000A838 OPWORD _CALCMENUSIZE 0000A948 OPWORD _CALCVBEHIND 0000A90A OPWORD _CALCVIS 0000A909 OPWORD _CAUTIONALERT 0000A988 OPWORD _CHAIN 0000A9F3 OPWORD _CHANGEDRESOURCE 0000A9AA OPWORD _CHAREXTRA 0000AA23 OPWORD _CHARWIDTH 0000A88D OPWORD _CHECKITEM 0000A945 OPWORD _CHECKUPDATE 0000A911 OPWORD _CLEARMENUBAR 0000A934 OPWORD _CLIPABOVE 0000A90B OPWORD _CLIPRECT 0000A87B OPWORD _CLOSE 0000A001 OPWORD _CLOSECPORT 0000A87D OPWORD _CLOSEDESKACC 0000A9B7 OPWORD _CLOSEDIALOG 0000A982 OPWORD _CLOSEPGON 0000A8CC OPWORD _CLOSEPICTURE 0000A8F4 OPWORD _CLOSEPORT 0000A87D OPWORD _CLOSERESFILE 0000A99A OPWORD _CLOSERGN 0000A8DB OPWORD _CLOSEWINDOW 0000A92D OPWORD _CMPSTRING 0000A03C OPWORD _COLOR2INDEX 0000AA33 OPWORD _COLORBIT 0000A864 OPWORD _COMPACTMEM 0000A04C OPWORD _CONTROL 0000A004 OPWORD _COPYBITS 0000A8EC OPWORD _COPYMASK 0000A817 OPWORD _COPYPIXMAP 0000AA05 OPWORD _COPYPIXPAT 0000AA09 OPWORD _COPYRGN 0000A8DC OPWORD _COULDALERT 0000A989 OPWORD _COULDDIALOG 0000A979 OPWORD _COUNT1RESOURCES 0000A80D OPWORD _COUNT1TYPES 0000A81C OPWORD _COUNTADBS 0000A077 OPWORD _COUNTMITEMS 0000A950 OPWORD _COUNTRESOURCES 0000A99C OPWORD _COUNTTYPES 0000A99E OPWORD _CREATE 0000A008 OPWORD _CREATERESFILE 0000A9B1 OPWORD _CURRESFILE 0000A994 OPWORD _DATE2SECS 0000A9C7 OPWORD _DEBUGGER 0000A9FF OPWORD _DEBUGSTR 0000ABFF OPWORD _DECSTR68K 0000A9EE OPWORD _DELAY 0000A03B OPWORD _DELCOMP 0000AA4D OPWORD _DELETE 0000A009 OPWORD _DELETEMENU 0000A936 OPWORD _DELMCENTRIES 0000AA60 OPWORD _DELMENUITEM 0000A952 OPWORD _DELSEARCH 0000AA4C OPWORD _DELTAPOINT 0000A94F OPWORD _DEQUEUE 0000A96E OPWORD _DETACHRESOURCE 0000A992 OPWORD _DIALOGSELECT 0000A980 OPWORD _DIFFRGN 0000A8E6 OPWORD _DISABLEITEM 0000A93A OPWORD _DISPMCINFO 0000AA63 OPWORD _DISPOSCCURSOR 0000AA26 OPWORD _DISPOSCICON 0000AA25 OPWORD _DISPOSCONTROL 0000A955 OPWORD _DISPOSCTABLE 0000AA24 OPWORD _DISPOSDIALOG 0000A983 OPWORD _DISPOSGDEVICE 0000AA30 OPWORD _DISPOSHANDLE 0000A023 OPWORD _DISPOSMENU 0000A932 OPWORD _DISPOSPIXMAP 0000AA04 OPWORD _DISPOSPIXPAT 0000AA08 OPWORD _DISPOSPTR 0000A01F OPWORD _DISPOSRGN 0000A8D9 OPWORD _DISPOSWINDOW 0000A914 OPWORD _DOVBLTASK 0000A072 OPWORD _DRAGCONTROL 0000A967 OPWORD _DRAGGRAYRGN 0000A905 OPWORD _DRAGTHERGN 0000A926 OPWORD _DRAGWINDOW 0000A925 OPWORD _DRAW1CONTROL 0000A96D OPWORD _DRAWCHAR 0000A883 OPWORD _DRAWCONTROLS 0000A969 OPWORD _DRAWDIALOG 0000A981 OPWORD _DRAWGROWICON 0000A904 OPWORD _DRAWMENUBAR 0000A937 OPWORD _DRAWNEW 0000A90F OPWORD _DRAWPICTURE 0000A8F6 OPWORD _DRAWSTRING 0000A884 OPWORD _DRAWTEXT 0000A885 OPWORD _DRVRINSTALL 0000A03D OPWORD _DRVRREMOVE 0000A03E OPWORD _DTINSTALL 0000A082 OPWORD _EJECT 0000A017 OPWORD _ELEMS68K 0000A9EC OPWORD _EMPTYHANDLE 0000A02B OPWORD _EMPTYRECT 0000A8AE OPWORD _EMPTYRGN 0000A8E2 OPWORD _ENABLEITEM 0000A939 OPWORD _ENDUPDATE 0000A923 OPWORD _ENQUEUE 0000A96F OPWORD _EQUALPT 0000A881 OPWORD _EQUALRECT 0000A8A6 OPWORD _EQUALRGN 0000A8E3 OPWORD _ERASEARC 0000A8C0 OPWORD _ERASEOVAL 0000A8B9 OPWORD _ERASEPOLY 0000A8C8 OPWORD _ERASERECT 0000A8A3 OPWORD _ERASERGN 0000A8D4 OPWORD _ERASEROUNDRECT 0000A8B2 OPWORD _ERRORSOUND 0000A98C OPWORD _EVENTAVAIL 0000A971 OPWORD _EXITTOSHELL 0000A9F4 OPWORD _FILLARC 0000A8C2 OPWORD _FILLCARC 0000AA11 OPWORD _FILLCOVAL 0000AA0F OPWORD _FILLCPOLY 0000AA13 OPWORD _FILLCRECT 0000AA0E OPWORD _FILLCRGN 0000AA12 OPWORD _FILLCROUNDRECT 0000AA10 OPWORD _FILLOVAL 0000A8BB OPWORD _FILLPOLY 0000A8CA OPWORD _FILLRECT 0000A8A5 OPWORD _FILLRGN 0000A8D6 OPWORD _FILLROUNDRECT 0000A8B4 OPWORD _FINDCONTROL 0000A96C OPWORD _FINDDITEM 0000A984 OPWORD _FINDWINDOW 0000A92C OPWORD _FINITQUEUE 0000A016 OPWORD _FIXATAN2 0000A818 OPWORD _FIXMUL 0000A868 OPWORD _FIXRATIO 0000A869 OPWORD _FIXROUND 0000A86C OPWORD _FLASHMENUBAR 0000A94C OPWORD _FLUSHEVENTS 0000A032 OPWORD _FLUSHFILE 0000A045 OPWORD _FLUSHVOL 0000A013 OPWORD _FMSWAPFONT 0000A901 OPWORD _FONTMETRICS 0000A835 OPWORD _FORECOLOR 0000A862 OPWORD _FP68K 0000A9EB OPWORD _FRAMEARC 0000A8BE OPWORD _FRAMEOVAL 0000A8B7 OPWORD _FRAMEPOLY 0000A8C6 OPWORD _FRAMERECT 0000A8A1 OPWORD _FRAMERGN 0000A8D2 OPWORD _FRAMEROUNDRECT 0000A8B0 OPWORD _FREEALERT 0000A98A OPWORD _FREEDIALOG 0000A97A OPWORD _FREEMEM 0000A01C OPWORD _FRONTWINDOW 0000A924 OPWORD _GET1IXRESOURCE 0000A80E OPWORD _GET1IXTYPE 0000A80F OPWORD _GET1NAMEDRESOURCE 0000A820 OPWORD _GET1RESOURCE 0000A81F OPWORD _GETADBINFO 0000A079 OPWORD _GETAPPPARMS 0000A9F5 OPWORD _GETAUXCTL 0000AA44 OPWORD _GETAUXWIN 0000AA42 OPWORD _GETBACKCOLOR 0000AA1A OPWORD _GETCCURSOR 0000AA1B OPWORD _GETCICON 0000AA1E OPWORD _GETCLIP 0000A87A OPWORD _GETCPIXEL 0000AA17 OPWORD _GETCREFCON 0000A95A OPWORD _GETCTABLE 0000AA18 OPWORD _GETCTITLE 0000A95E OPWORD _GETCTLACTION 0000A96A OPWORD _GETCTLVALUE 0000A960 OPWORD _GETCTSEED 0000AA28 OPWORD _GETCURSOR 0000A9B9 OPWORD _GETCVARIANT 0000A809 OPWORD _GETCWMGRPORT 0000AA48 OPWORD _GETDEFAULTSTARTUP 0000A07D OPWORD _GETDEVICELIST 0000AA29 OPWORD _GETDITEM 0000A98D OPWORD _GETEOF 0000A011 OPWORD _GETFILEINFO 0000A00C OPWORD _GETFNAME 0000A8FF OPWORD _GETFNUM 0000A900 OPWORD _GETFONTINFO 0000A88B OPWORD _GETFORECOLOR 0000AA19 OPWORD _GETFPOS 0000A018 OPWORD _GETGDEVICE 0000AA32 OPWORD _GETHANDLESIZE 0000A025 OPWORD _GETICON 0000A9BB OPWORD _GETINDADB 0000A078 OPWORD _GETINDRESOURCE 0000A99D OPWORD _GETINDTYPE 0000A99F OPWORD _GETITEM 0000A946 OPWORD _GETITEMCMD 0000A84E OPWORD _GETITEXT 0000A990 OPWORD _GETITMICON 0000A93F OPWORD _GETITMMARK 0000A943 OPWORD _GETITMSTYLE 0000A941 OPWORD _GETKEYS 0000A976 OPWORD _GETMAINDEVICE 0000AA2A OPWORD _GETMASKTABLE 0000A836 OPWORD _GETMAXCTL 0000A962 OPWORD _GETMAXDEVICE 0000AA27 OPWORD _GETMCENTRY 0000AA64 OPWORD _GETMCINFO 0000AA61 OPWORD _GETMENUBAR 0000A93B OPWORD _GETMHANDLE 0000A949 OPWORD _GETMINCTL 0000A961 OPWORD _GETMOUSE 0000A972 OPWORD _GETNAMEDRESOURCE 0000A9A1 OPWORD _GETNEWCONTROL 0000A9BE OPWORD _GETNEWCWINDOW 0000AA46 OPWORD _GETNEWDIALOG 0000A97C OPWORD _GETNEWMBAR 0000A9C0 OPWORD _GETNEWWINDOW 0000A9BD OPWORD _GETNEXTDEVICE 0000AA2B OPWORD _GETNEXTEVENT 0000A970 OPWORD _GETOSDEFAULT 0000A084 OPWORD _GETOSEVENT 0000A031 OPWORD _GETPATTERN 0000A9B8 OPWORD _GETPEN 0000A89A OPWORD _GETPENSTATE 0000A898 OPWORD _GETPICTURE 0000A9BC OPWORD _GETPIXEL 0000A865 OPWORD _GETPIXPAT 0000AA0C OPWORD _GETPORT 0000A874 OPWORD _GETPTRSIZE 0000A021 OPWORD _GETRESATTRS 0000A9A6 OPWORD _GETRESFILEATTRS 0000A9F6 OPWORD _GETRESINFO 0000A9A8 OPWORD _GETRESOURCE 0000A9A0 OPWORD _GETRMENU 0000A9BF OPWORD _GETSCRAP 0000A9FD OPWORD _GETSTRING 0000A9BA OPWORD _GETSUBTABLE 0000AA37 OPWORD _GETTRAPADDRESS 0000A146 OPWORD _GETVIDEODEFAULT 0000A080 OPWORD _GETVOL 0000A014 OPWORD _GETVOLINFO 0000A007 OPWORD _GETWINDOWPIC 0000A92F OPWORD _GETWMGRPORT 0000A910 OPWORD _GETWREFCON 0000A917 OPWORD _GETWTITLE 0000A919 OPWORD _GETWVARIANT 0000A80A OPWORD _GETZONE 0000A11A OPWORD _GLOBALTOLOCAL 0000A871 OPWORD _GRAFDEVICE 0000A872 OPWORD _GROWWINDOW 0000A92B OPWORD _HANDANDHAND 0000A9E4 OPWORD _HANDLEZONE 0000A126 OPWORD _HANDTOHAND 0000A9E1 OPWORD _HCLRRBIT 0000A068 OPWORD _HCREATE 0000A208 OPWORD _HDELETE 0000A209 OPWORD _HGETFILEINFO 0000A20C OPWORD _HGETSTATE 0000A069 OPWORD _HGETVINFO 0000A207 OPWORD _HGETVOL 0000A214 OPWORD _HIDECONTROL 0000A958 OPWORD _HIDECURSOR 0000A852 OPWORD _HIDEDITEM 0000A827 OPWORD _HIDEPEN 0000A896 OPWORD _HIDEWINDOW 0000A916 OPWORD _HILITECOLOR 0000AA22 OPWORD _HILITECONTROL 0000A95D OPWORD _HILITEMENU 0000A938 OPWORD _HILITEWINDOW 0000A91C OPWORD _HIWORD 0000A86A OPWORD _HLOCK 0000A029 OPWORD _HNOPURGE 0000A04A OPWORD _HOMERESFILE 0000A9A4 OPWORD _HOPEN 0000A200 OPWORD _HOPENRF 0000A20A OPWORD _HPURGE 0000A049 OPWORD _HRENAME 0000A20B OPWORD _HRSTFLOCK 0000A242 OPWORD _HSETFILEINFO 0000A20D OPWORD _HSETFLOCK 0000A241 OPWORD _HSETRBIT 0000A067 OPWORD _HSETSTATE 0000A06A OPWORD _HSETVOL 0000A215 OPWORD _HUNLOCK 0000A02A OPWORD _INDEX2COLOR 0000AA34 OPWORD _INFOSCRAP 0000A9F9 OPWORD _INITALLPACKS 0000A9E6 OPWORD _INITAPPLZONE 0000A02C OPWORD _INITCPORT 0000AA01 OPWORD _INITCURSOR 0000A850 OPWORD _INITDIALOGS 0000A97B OPWORD _INITEVENTS 0000A06D OPWORD _INITFONTS 0000A8FE OPWORD _INITFS 0000A06C OPWORD _INITGDEVICE 0000AA2E OPWORD _INITGRAF 0000A86E OPWORD _INITMENUS 0000A930 OPWORD _INITPACK 0000A9E5 OPWORD _INITPORT 0000A86D OPWORD _INITPROCMENU 0000A808 OPWORD _INITRESOURCES 0000A995 OPWORD _INITUTIL 0000A03F OPWORD _INITWINDOWS 0000A912 OPWORD _INITZONE 0000A019 OPWORD _INSERTMENU 0000A935 OPWORD _INSERTRESMENU 0000A951 OPWORD _INSETRECT 0000A8A9 OPWORD _INSETRGN 0000A8E1 OPWORD _INSMENUITEM 0000A826 OPWORD _INSTIME 0000A058 OPWORD _INTERNALWAIT 0000A07F OPWORD _INVALRECT 0000A928 OPWORD _INVALRGN 0000A927 OPWORD _INVERRECT 0000A8A4 OPWORD _INVERRGN 0000A8D5 OPWORD _INVERROUNDRECT 0000A8B3 OPWORD _INVERTARC 0000A8C1 OPWORD _INVERTCOLOR 0000AA35 OPWORD _INVERTOVAL 0000A8BA OPWORD _INVERTPOLY 0000A8C9 OPWORD _ISDIALOGEVENT 0000A97F OPWORD _KEYTRANS 0000A9C3 OPWORD _KILLCONTROLS 0000A956 OPWORD _KILLIO 0000A006 OPWORD _KILLPICTURE 0000A8F5 OPWORD _KILLPOLY 0000A8CD OPWORD _LAUNCH 0000A9F2 OPWORD _LINE 0000A892 OPWORD _LINETO 0000A891 OPWORD _LOADRESOURCE 0000A9A2 OPWORD _LOADSEG 0000A9F0 OPWORD _LOCALTOGLOBAL 0000A870 OPWORD _LODESCRAP 0000A9FB OPWORD _LONGMUL 0000A867 OPWORD _LOWORD 0000A86B OPWORD _MAKEITABLE 0000AA39 OPWORD _MAKERGBPAT 0000AA0D OPWORD _MAPPOLY 0000A8FC OPWORD _MAPPT 0000A8F9 OPWORD _MAPRECT 0000A8FA OPWORD _MAPRGN 0000A8FB OPWORD _MAXAPPLZONE 0000A063 OPWORD _MAXBLOCK 0000A061 OPWORD _MAXMEM 0000A11D OPWORD _MAXSIZERSRC 0000A821 OPWORD _MEASURETEXT 0000A837 OPWORD _MENUCHOICE 0000AA66 OPWORD _MENUKEY 0000A93E OPWORD _MENUSELECT 0000A93D OPWORD _METHODDISPATCH 0000A9F8 OPWORD _MODALDIALOG 0000A991 OPWORD _MOOV 0000A894 OPWORD _MOREMASTERS 0000A036 OPWORD _MOUNTVOL 0000A00F OPWORD _MOVE 0000A894 OPWORD _MOVECONTROL 0000A959 OPWORD _MOVEHHI 0000A064 OPWORD _MOVEPORTTO 0000A877 OPWORD _MOVETO 0000A893 OPWORD _MOVEWINDOW 0000A91B OPWORD _MUNGER 0000A9E0 OPWORD _NEWCDIALOG 0000AA4B OPWORD _NEWCONTROL 0000A954 OPWORD _NEWCWINDOW 0000AA45 OPWORD _NEWDIALOG 0000A97D OPWORD _NEWEMPTYHANDLE 0000A166 OPWORD _NEWGDEVICE 0000AA2F OPWORD _NEWHANDLE 0000A122 OPWORD _NEWMENU 0000A931 OPWORD _NEWPIXMAP 0000AA03 OPWORD _NEWPIXPAT 0000AA07 OPWORD _NEWPTR 0000A11E OPWORD _NEWRGN 0000A8D8 OPWORD _NEWSTRING 0000A906 OPWORD _NEWWINDOW 0000A913 OPWORD _NOTEALERT 0000A987 OPWORD _OBSCURECURSOR 0000A856 OPWORD _OFFLINE 0000A035 OPWORD _OFFSETPOLY 0000A8CE OPWORD _OFFSETRECT 0000A8A8 OPWORD _OFSETRGN 0000A8E0 OPWORD _OPCOLOR 0000AA21 OPWORD _OPEN 0000A000 OPWORD _OPENCPORT 0000AA00 OPWORD _OPENDESKACC 0000A9B6 OPWORD _OPENPICTURE 0000A8F3 OPWORD _OPENPOLY 0000A8CB OPWORD _OPENPORT 0000A86F OPWORD _OPENRESFILE 0000A997 OPWORD _OPENRF 0000A00A OPWORD _OPENRFPERM 0000A9C4 OPWORD _OPENRGN 0000A8DA OPWORD _OSDISPATCH 0000A88F OPWORD _OSEVENTAVAIL 0000A030 OPWORD _PACK0 0000A9E7 OPWORD _PACK1 0000A9E8 OPWORD _PACK10 0000A82C OPWORD _PACK11 0000A82D OPWORD _PACK12 0000A82E OPWORD _PACK13 0000A82F OPWORD _PACK14 0000A830 OPWORD _PACK15 0000A831 OPWORD _PACK2 0000A9E9 OPWORD _PACK3 0000A9EA OPWORD _PACK4 0000A9EB OPWORD _PACK5 0000A9EC OPWORD _PACK6 0000A9ED OPWORD _PACK7 0000A9EE OPWORD _PACK8 0000A816 OPWORD _PACK9 0000A82B OPWORD _PACKBITS 0000A8CF OPWORD _PAINTARC 0000A8BF OPWORD _PAINTBEHIND 0000A90D OPWORD _PAINTONE 0000A90C OPWORD _PAINTOVAL 0000A8B8 OPWORD _PAINTPOLY 0000A8C7 OPWORD _PAINTRECT 0000A8A2 OPWORD _PAINTRGN 0000A8D3 OPWORD _PAINTROUNDRECT 0000A8B1 OPWORD _PARAMTEXT 0000A98B OPWORD _PENMODE 0000A89C OPWORD _PENNORMAL 0000A89E OPWORD _PENPAT 0000A89D OPWORD _PENPIXPAT 0000AA0A OPWORD _PENSIZE 0000A89B OPWORD _PICCOMMENT 0000A8F2 OPWORD _PINRECT 0000A94E OPWORD _PLOTCICON 0000AA1F OPWORD _PLOTICON 0000A94B OPWORD _POPUPMENUSELECT 0000A80B OPWORD _PORTSIZE 0000A876 OPWORD _POSTEVENT 0000A02F OPWORD _PPOSTEVENT 0000A12F OPWORD _PRIMETIME 0000A05A OPWORD _PROTECTENTRY 0000AA3D OPWORD _PT2RECT 0000A8AC OPWORD _PTINRECT 0000A8AD OPWORD _PTINRGN 0000A8E8 OPWORD _PTRANDHAND 0000A9EF OPWORD _PTRTOHAND 0000A9E3 OPWORD _PTRTOXHAND 0000A9E2 OPWORD _PTRZONE 0000A148 OPWORD _PTTOANGLE 0000A8C3 OPWORD _PURGEMEM 0000A04D OPWORD _PURGESPACE 0000A162 OPWORD _PUTSCRAP 0000A9FE OPWORD _QDERROR 0000AA40 OPWORD _RANDOM 0000A861 OPWORD _RDRVRINSTALL 0000A04F OPWORD _READ 0000A002 OPWORD _READDATETIME 0000A039 OPWORD _READXPRAM 0000A051 OPWORD _REALCOLOR 0000AA36 OPWORD _REALFONT 0000A902 OPWORD _REALLOCHANDLE 0000A027 OPWORD _RECOVERHANDLE 0000A128 OPWORD _RECTINRGN 0000A8E9 OPWORD _RECTRGN 0000A8DF OPWORD _RELEASERESOURCE 0000A9A3 OPWORD _RELSTRING 0000A050 OPWORD _RENAME 0000A00B OPWORD _RESERROR 0000A9AF OPWORD _RESERVEENTRY 0000AA3E OPWORD _RESRVMEM 0000A040 OPWORD _RESTOREENTRIES 0000AA4A OPWORD _RGBBACKCOLOR 0000AA15 OPWORD _RGBFORECOLOR 0000AA14 OPWORD _RGETRESOURCE 0000A80C OPWORD _RMVEREFERENCE 0000A9AE OPWORD _RMVERESOURCE 0000A9AD OPWORD _RMVTIME 0000A059 OPWORD _RSRCMAPENTRY 0000A9C5 OPWORD _RSRCZONEINIT 0000A996 OPWORD _RSTFILLOCK 0000A042 OPWORD _SAVEENTRIES 0000AA49 OPWORD _SAVEOLD 0000A90E OPWORD _SCALEPT 0000A8F8 OPWORD _SCRNBITMAP 0000A833 OPWORD _SCROLLRECT 0000A8EF OPWORD _SECS2DATE 0000A9C6 OPWORD _SECTRECT 0000A8AA OPWORD _SECTRGN 0000A8E4 OPWORD _SEEDCFILL 0000AA50 OPWORD _SEEDFILL 0000A839 OPWORD _SELECTWINDOW 0000A91F OPWORD _SELITEXT 0000A97E OPWORD _SENDBEHIND 0000A921 OPWORD _SETADBINFO 0000A07A OPWORD _SETAPPBASE 0000A057 OPWORD _SETAPPLBASE 0000A057 OPWORD _SETAPPLLIMIT 0000A02D OPWORD _SETCCURSOR 0000AA1C OPWORD _SETCLIENTID 0000AA3C OPWORD _SETCLIP 0000A879 OPWORD _SETCPIXEL 0000AA16 OPWORD _SETCPORTPIX 0000AA06 OPWORD _SETCREFCON 0000A95B OPWORD _SETCTITLE 0000A95F OPWORD _SETCTLACTION 0000A96B OPWORD _SETCTLCOLOR 0000AA43 OPWORD _SETCTLVALUE 0000A963 OPWORD _SETCURSOR 0000A851 OPWORD _SETDATETIME 0000A03A OPWORD _SETDEFAULTSTARTUP 0000A07E OPWORD _SETDESKCPAT 0000AA47 OPWORD _SETDEVICEATTRIBUTE 0000AA2D OPWORD _SETDITEM 0000A98E OPWORD _SETEMPTYRGN 0000A8DD OPWORD _SETENTRIES 0000AA3F OPWORD _SETEOF 0000A012 OPWORD _SETFILEINFO 0000A00D OPWORD _SETFILLOCK 0000A041 OPWORD _SETFILTYPE 0000A043 OPWORD _SETFONTLOCK 0000A903 OPWORD _SETFPOS 0000A044 OPWORD _SETFRACTENABLE 0000A814 OPWORD _SETFSCALEDISABLE 0000A834 OPWORD _SETGDEVICE 0000AA31 OPWORD _SETGROWZONE 0000A04B OPWORD _SETHANDLESIZE 0000A024 OPWORD _SETITEM 0000A947 OPWORD _SETITEMCMD 0000A84F OPWORD _SETITEXT 0000A98F OPWORD _SETITMICON 0000A940 OPWORD _SETITMMARK 0000A944 OPWORD _SETITMSTYLE 0000A942 OPWORD _SETMAXCTL 0000A965 OPWORD _SETMCENTRIES 0000AA65 OPWORD _SETMCINFO 0000AA62 OPWORD _SETMENUBAR 0000A93C OPWORD _SETMFLASH 0000A94A OPWORD _SETMINCTL 0000A964 OPWORD _SETORIGIN 0000A878 OPWORD _SETOSDEFAULT 0000A083 OPWORD _SETPBITS 0000A875 OPWORD _SETPENSTATE 0000A899 OPWORD _SETPORT 0000A873 OPWORD _SETPT 0000A880 OPWORD _SETPTRSIZE 0000A020 OPWORD _SETRECRGN 0000A8DE OPWORD _SETRECT 0000A8A7 OPWORD _SETRESATTRS 0000A9A7 OPWORD _SETRESFILEATTRS 0000A9F7 OPWORD _SETRESINFO 0000A9A9 OPWORD _SETRESLOAD 0000A99B OPWORD _SETRESPURGE 0000A993 OPWORD _SETSTDCPROCS 0000AA4E OPWORD _SETSTDPROCS 0000A8EA OPWORD _SETSTRING 0000A907 OPWORD _SETTRAPADDRESS 0000A047 OPWORD _SETVIDEODEFAULT 0000A081 OPWORD _SETVOL 0000A015 OPWORD _SETWINCOLOR 0000AA41 OPWORD _SETWINDOWPIC 0000A92E OPWORD _SETWREFCON 0000A918 OPWORD _SETWTITLE 0000A91A OPWORD _SETZONE 0000A01B OPWORD _SHIELDCURSOR 0000A855 OPWORD _SHOWCONTROL 0000A957 OPWORD _SHOWCURSOR 0000A853 OPWORD _SHOWDITEM 0000A828 OPWORD _SHOWHIDE 0000A908 OPWORD _SHOWPEN 0000A897 OPWORD _SHOWWINDOW 0000A915 OPWORD _SHUTDOWN 0000A895 OPWORD _SINTINSTALL 0000A075 OPWORD _SINTREMOVE 0000A076 OPWORD _SIZECONTROL 0000A95C OPWORD _SIZERSRC 0000A9A5 OPWORD _SIZEWINDOW 0000A91D OPWORD _SLOPEFROMANGLE 0000A8BC OPWORD _SLOTVINSTALL 0000A06F OPWORD _SLOTVREMOVE 0000A070 OPWORD _SPACEEXTRA 0000A88E OPWORD _STACKSPACE 0000A065 OPWORD _STATUS 0000A005 OPWORD _STDARC 0000A8BD OPWORD _STDBITS 0000A8EB OPWORD _STDCOMMENT 0000A8F1 OPWORD _STDGETPIC 0000A8EE OPWORD _STDLINE 0000A890 OPWORD _STDOPCODEPROC 0000ABF8 OPWORD _STDOVAL 0000A8B6 OPWORD _STDPOLY 0000A8C5 OPWORD _STDPUTPIC 0000A8F0 OPWORD _STDRECT 0000A8A0 OPWORD _STDRGN 0000A8D1 OPWORD _STDRRECT 0000A8AF OPWORD _STDTEXT 0000A882 OPWORD _STDTXMEAS 0000A8ED OPWORD _STILLDOWN 0000A973 OPWORD _STOPALERT 0000A986 OPWORD _STRINGWIDTH 0000A88C OPWORD _STRIPADDRESS 0000A055 OPWORD _STUFFHEX 0000A866 OPWORD _SUBPT 0000A87F OPWORD _SWAPMMUMODE 0000A05D OPWORD _SYSBEEP 0000A9C8 OPWORD _SYSEDIT 0000A9C2 OPWORD _SYSENVIRONS 0000A090 OPWORD _SYSERROR 0000A9C9 OPWORD _SYSTEMCLICK 0000A9B3 OPWORD _SYSTEMEVENT 0000A9B2 OPWORD _SYSTEMMENU 0000A9B5 OPWORD _SYSTEMTASK 0000A9B4 OPWORD _TEACTIVATE 0000A9D8 OPWORD _TEAUTOVIEW 0000A813 OPWORD _TECALTEXT 0000A9D0 OPWORD EXPANDMEMREC 00000000 TEMPLATE EMCURVERSION 0101 TEMPLATE FIELD EMINTLGLOBALS 0006 TEMPLATE FIELD EMKEYCACHE 000E TEMPLATE FIELD EMKEYDEADSTATE 000A TEMPLATE FIELD EMSIZE 0002 TEMPLATE FIELD EMVERSION 0000 TEMPLATE FIELD SYSENVREC 00000000 TEMPLATE ATDRVRVERSNUM 000C TEMPLATE FIELD ENVIRONSVERSION 0000 TEMPLATE FIELD HASCOLORQD 0009 TEMPLATE FIELD HASFPU 0008 TEMPLATE FIELD KEYBOARDTYPE 000A TEMPLATE FIELD MACHINETYPE 0002 TEMPLATE FIELD PROCESSOR 0006 TEMPLATE FIELD SYSENV1SIZE 0010 TEMPLATE FIELD SYSTEMVERSION 0004 TEMPLATE FIELD SYSVREFNUM 000E TEMPLATE FIELD _TECLICK 0000A9D4 OPWORD _TECOPY 0000A9D5 OPWORD _TECUT 0000A9D6 OPWORD _TEDEACTIVATE 0000A9D9 OPWORD _TEDELETE 0000A9D7 OPWORD _TEDISPATCH 0000A83D OPWORD _TEDISPOSE 0000A9CD OPWORD _TEGETOFFSET 0000A83C OPWORD _TEGETTEXT 0000A9CB OPWORD _TEIDLE 0000A9DA OPWORD _TEINIT 0000A9CC OPWORD _TEINSERT 0000A9DE OPWORD _TEKEY 0000A9DC OPWORD _TENEW 0000A9D2 OPWORD _TEPASTE 0000A9DB OPWORD _TEPINSCROLL 0000A812 OPWORD _TESCROLL 0000A9DD OPWORD _TESELVIEW 0000A811 OPWORD _TESETJUST 0000A9DF OPWORD _TESETSELECT 0000A9D1 OPWORD _TESETTEXT 0000A9CF OPWORD _TESTCONTROL 0000A966 OPWORD _TESTDEVICEATTRIBUTE 0000AA2C OPWORD _TESTYLENEW 0000A83E OPWORD _TEUPDATE 0000A9D3 OPWORD _TEXTBOX 0000A9CE OPWORD _TEXTFACE 0000A888 OPWORD _TEXTFONT 0000A887 OPWORD _TEXTMODE 0000A889 OPWORD _TEXTSIZE 0000A88A OPWORD _TEXTWIDTH 0000A886 OPWORD _TICKCOUNT 0000A975 OPWORD _TRACKBOX 0000A83B OPWORD _TRACKCONTROL 0000A968 OPWORD _TRACKGOAWAY 0000A91E OPWORD _UNIMPLEMENTED 0000A89F OPWORD _UNIONRECT 0000A8AB OPWORD _UNIONRGN 0000A8E5 OPWORD _UNIQUE1ID 0000A810 OPWORD _UNIQUEID 0000A9C1 OPWORD _UNLOADSEG 0000A9F1 OPWORD _UNLODESCRAP 0000A9FA OPWORD _UNMOUNTVOL 0000A00E OPWORD _UNPACKBITS 0000A8D0 OPWORD _UPDATERESFILE 0000A999 OPWORD _UPDTCONTROL 0000A953 OPWORD _UPDTDIALOG 0000A978 OPWORD _UPRSTRING 0000A054 OPWORD _USERESFILE 0000A998 OPWORD _VALIDRECT 0000A92A OPWORD _VALIDRGN 0000A929 OPWORD _VINSTALL 0000A033 OPWORD _VREMOVE 0000A034 OPWORD _WAITMOUSEUP 0000A977 OPWORD _WAITNEXTEVENT 0000A860 OPWORD _WRITE 0000A003 OPWORD _WRITEPARAM 0000A038 OPWORD _WRITERESOURCE 0000A9B0 OPWORD _WRITEXPRAM 0000A052 OPWORD _XMUNGER 0000A819 OPWORD _XORRGN 0000A8E7 OPWORD _ZEROSCRAP 0000A9FC OPWORD _ZOOMWINDOW 0000A83A OPWORD POPLONG POPWORD RESLONG RESTREGS RESWORD SAVEREGS _CATMOVE _CLOSEWD _COPYFILE _DIRCREATE _FSCONTROL _GETCATINFO _GETDIRACCESS _GETFCBINFO _GETLOGININFO _GETTIMEOUT _GETVOLPARMS _GETWDINFO _LOCKRNG _MAPID _MAPNAME _MFFREEMEM _MFMAXMEM _MFTEMPDISPOSHANDLE _MFTEMPHLOCK _MFTEMPHUNLOCK _MFTEMPNEWHANDLE _MOVERENAME _OPENDENY _OPENRFDENY _OPENWD _SETCATINFO _SETDIRACCESS _SETPMSP _SETTIMEOUT _SETVOLINFO _TFSCORE _UNLOCKRNG Elapsed time: 25.75 seconds. Assembly complete - no errors found. 11322 lines.