F.I.G. MACRO V04.00 00:02:08 PAGE 1 1 .TITLE F.I.G. 2 ; **************************************************************** 3 ; 4 ; PDP-11 FORTH INTRODUCTION PDP-11 FORTH 5 ; 6 ; **************************************************************** 7 ; 8 ; 9 ; 10 ; PDP-11 FORTH RT-11, RSX-11M, AND STAND-ALONE JANUARY 1980 11 ; 12 ; 13 ; 14 ; DEVELOPED BY THE 15 ; FORTH INTEREST GROUP / FORTH IMPLEMENTATION TEAM 16 ; P.O. BOX 1105 17 ; SAN CARLOS, CA. 94070 18 ; 19 ; 20 ; IMPLEMENTED BY 21 ; JOHN S. JAMES 22 ; P.O. BOX 348 23 ; BERKELEY, CA. 94701 24 ; 25 ; 26 ; THIS SYSTEM IS IN THE PUBLIC DOMAIN AND CAN BE USED 27 ; WITHOUT RESTRICTION. PLEASE CREDIT THE FORTH INTEREST 28 ; GROUP IF YOU REPUBLISH SUBSTANTIAL PORTIONS. 29 ; 30 ; 31 ; THE FORTH INTEREST GROUP / FORTH IMPLEMENTATION TEAM 32 ; ALSO HAS DEVELOPED NEARLY IDENTICAL VERSIONS OF THIS 33 ; SYSTEM FOR THE 34 ; 8080 35 ; 6800 36 ; 6502 37 ; 9900 38 ; PACE 39 ; 40 ; 41 ; FOR MORE INFORMATION, WRITE: 42 ; 43 ; JOHN S. JAMES 44 ; P.O. BOX 348 45 ; BERKELEY, CA. 94701 46 ; 47 ; OR 48 ; 49 ; FORTH INTEREST GROUP 50 ; P.O. BOX 1105 51 ; SAN CARLOS, CA. 94070 52 ; 53 ; 54 ; 'PDP' AND 'RSX' ARE TRADEMARKS OF DIGITAL EQUIPMENT CORPORATION. F.I.G. MACRO V04.00 00:02:08 PAGE 2 1 ; THIS FORTH SYSTEM HAS 2 ; - FULL LENGTH NAMES 3 ; - EXTENSIVE COMPILE-TIME CHECKS AND ERROR MESSAGES 4 ; - DOUBLE INTEGER I/O 5 ; - A FORTH ASSEMBLER, PERMITTING STRUCTURED, INTERACTIVE 6 ; DEVELOPMENT OF DEVICE HANDLERS, SPEED-CRITICAL 7 ; ROUTINES, AND LINKAGE TO OPERATING SYSTEMS OR TO 8 ; SUBROUTINE PACKAGES WRITTEN IN OTHER LANGUAGES. 9 ; - STRING-HANDLING ROUTINES 10 ; - A STRING-SEARCH EDITOR 11 ; - LINKED VOCABULARIES 12 ; - HOOKS FOR MULTITASKING/MULTIUSER (CURRENTLY SINGLE TASK) 13 ; - AND AS CURRENTLY CONFIGURED IT RUNS IN A 24K BYTE 14 ; TASK IMAGE (THIS INCLUDES BUFFERS, OPERATING-SYSTEM 15 ; AREA, AND ROOM FOR SUBSTANTIAL ADDITIONAL FORTH 16 ; PROGRAMMING) ON ANY PDP-11 OR LSI-11 CPU, WITH OR 17 ; WITHOUT HARDWARE MULTIPLY/DIVIDE. THIS DISKETTE 18 ; WILL BOOT AND RUN STAND-ALONE; ALSO IT CONTAINS A 19 ; SOURCE PROGRAM WHICH CAN BE ASSEMBLED TO RUN 20 ; UNDER RT-11, RSX-11M, OR STAND-ALONE. THIS SYSTEM 21 ; CAN BE MODIFIED TO INTERFACE WITH ANY OTHER OPERATING 22 ; SYSTEM WHICH SUPPORTS READ AND WRITE A CHARACTER, 23 ; DETECT A CHARACTER (OPTIONAL), AND READ AND WRITE 24 ; A DISK BLOCK. 25 ; 26 ; 27 ; IT IS ALIGNED WITH THE 1978 STANDARD OF THE FORTH INTERNATIONAL 28 ; STANDARDS TEAM. 29 ; 30 ; 31 ; 32 ; RECOMMENDED DOCUMENTATION: 33 ; - A FORTH LANGUAGE MANUAL. WE PARTICULARLY RECOMMEND EITHER 34 ; (A) 'USING FORTH', BY FORTH, INC. 35 ; OR 36 ; (B) 'A FORTH PRIMER', BY W. RICHARD STEVENS, KITT 37 ; PEAK NATIONAL OBSERVATORY. 38 ; EITHER IS AVAILABLE THROUGH THE FORTH INTEREST GROUP, 39 ; P.O. BOX 1105, SAN CARLOS, CA. 94070. 40 ; - PDP-11 FORTH USER'S GUIDE, AVAILABLE FROM JOHN S. JAMES, 41 ; ADDRESS ABOVE. 42 ; - FORTH REFERENCE CARD FOR THE FORTH IMPLEMENTATION TEAM 43 ; COMMON MODEL, AVAILABLE FROM FIG. 44 ; - 'FIG-FORTH INSTALLATION MANUAL', ALSO FROM FIG. 45 ; 46 ; 47 ; 48 ; ACKNOWLEDGMENTS: 49 ; THIS FORTH SYSTEM (IN 'FORTH.MAC') IS A GROUP PRODUCT 50 ; OF THE FORTH IMPLEMENTATION TEAM OF THE FORTH INTEREST 51 ; GROUP (P.O. BOX 1105, SAN CARLOS CA. 94070). THE IMPLEMENTER 52 ; IS RESPONSIBLE FOR THIS PDP-11 VERSION OF THE MODEL, AND FOR 53 ; THE SOFTWARE ON SCREENS IN 'FORTH.DAT'. ALTHOUGH THE LATTER 54 ; IS NOT AN OFFICIAL RELEASE OF THE F.I.G., THE CONTRIBUTIONS 55 ; FROM MEMBERS OF THE GROUP ARE TOO NUMEROUS TO CITE 56 ; INDIVIDUALLY. 57 ; IN ADDITION WE APPRECIATE THE PDP-11 CODING F.I.G. MACRO V04.00 00:02:08 PAGE 2-1 58 ; IMPROVEMENTS SUGGESTED BY STUART R. DOLE, DOLE & FARMER, 59 ; PO BOX 142, PETALUMA, CA. 94952; BY PAUL EDELSTEIN; 60 ; BY RICK STEVENS OF KITT PEAK; AND OTHERS. F.I.G. MACRO V04.00 00:02:08 PAGE 3 1 ; **************************************************************** 2 ; 3 ; BRINGING UP THE SYSTEM 4 ; 5 ; **************************************************************** 6 ; 7 ; 8 ; 9 ; TO RUN STAND-ALONE: 10 ; - BOOT THE DISKETTE LIKE ANY OTHER SYSTEM DISK, FROM DX0. 11 ; FORTH SHOULD COME UP AND TYPE 'FIG FORTH' AND THE VERSION 12 ; NUMBER. TEST AS DESCRIBED FOR RT-11 BELOW. 13 ; - MAKE A COPY OF THE DISK; THIS STAND-ALONE SYSTEM DOES NOT 14 ; PROTECT AGAINST ACCIDENTALLY OVERWRITING THE SYSTEM OR THE 15 ; SOURCE PROGRAMS. TO MAKE AN EXACT COPY OF THE ENTIRE DISK, 16 ; 1. PUT A BLANK DISK INTO THE SECOND DRIVE (DX1). FOR 17 ; SAFETY, SET THE WRITE-PROTECT SWITCH ON THE DRIVE 18 ; WHICH CONTAINS THE ORIGINAL SYSTEM DISK. 19 ; 2. TYPE '38 LOAD', AND CARRIAGE RETURN. THE SYSTEM SHOULD 20 ; RESPOND 'OK'. THEN TYPE 'COPY' AND RETURN. EACH OF 21 ; THE 77 TRACKS WILL BE READ FROM DX0 AND WRITTEN ON DX1. 22 ; - NOTE THE LAYOUT OF THE DISKETTE. IT IS SET UP TO BOOT AND 23 ; RUN STAND-ALONE, BUT IT ALSO CONTAINS AN RT-11 DIRECTORY, 24 ; AND A MACRO-11 SOURCE PROGRAM 'FORTH.MAC' (WHICH PRODUCED 25 ; THIS LISTING). THIS ALLOWS THE SAME DISK TO BE BOOTED 26 ; AND RUN, OR TO PROVIDE SOURCE FOR MODIFICATION AND RE-ASSEMBLY. 27 ; AS PROVIDED, THE FILE 'FORTH.DAT' CONTAINS FORTH SCREENS 28 ; 1-70. YOU CAN USE LOCATIONS BEYOND 70, BUT THESE WILL 29 ; OVERWRITE THE 'FORTH.MAC' SOURCE PROGRAM. STAND-ALONE USERS 30 ; MAY NEVER NEED TO USE THIS SOURCE, AND MAY WANT TO REMOVE IT 31 ; AND USE THE SPACE FOR SOMETHING ELSE. MAKE A COPY FIRST. 32 ; - STAND-ALONE USERS CAN ADD THEIR OWN OPERATIONS AND THEN 33 ; SAVE A BOOTABLE IMAGE OF THE NEW SYSTEM. THE NEW OPERATIONS 34 ; WILL BE AVAILABLE WHEN THE DISK IS BOOTED IN THE FUTURE. 35 ; THE LOADER WHICH IS USED WILL ONLY LOAD IMAGES UP TO 7.9K; 36 ; THIS LEAVES SEVERAL HUNDRED BYTES FOR NEW OPERATIONS, WHICH 37 ; CAN INCLUDE EXTENDING THE SYSTEM BY BRINGING IN SOURCE OR 38 ; OBJECT CODE. TO SAVE THE CURRENT SYSTEM, EXECUTE 'FORTH DEFINITIONS' 39 ; IF NECESSARY TO GET INTO THE FORTH VOCABULARY, THEN 'DECIMAL 34 LOAD'. 40 ; SOME WARNING MESSAGES WILL BE PRINTED (MSG #4); THEY CAN BE 41 ; IGNORED. 42 ; - IF YOU DO WANT TO RE-ASSEMBLE THE SYSTEM FOR STAND-ALONE 43 ; USE (WHICH MOST USERS SHOULD NEVER FIND NECESSARY), 44 ; YOU MUST USE RT-11 TO EDIT AND ASSEMBLE 'FORTH.MAC'. NOTE 45 ; THAT ALTHOUGH THIS LISTING IS ASSEMBLED FOR STAND-ALONE, 46 ; THE SOURCE PROGRAM SUPPLIED IS SET FOR RT-11 ASSEMBLY; 47 ; COMMENT OUT THE 'RT11' DEFINITION, AND REMOVE THE COMMENTING 48 ; ON 'ALONE'. ASSEMBLE, LINK, AND RUN, AND THE SYSTEM SHOULD 49 ; COME UP STAND-ALONE. IMMEDIATELY REMOVE THE RT-11 SYSTEM DISK 50 ; AND PLACE THE FORTH DISK IN DRIVE ZERO. TO REVISE 51 ; THE BOOTABLE IMAGE ON THE FORTH DISK SO THAT YOUR NEW SYSTEM 52 ; BOOTS STAND-ALONE, LIST SCREEN 34 (DECIMAL), AND FOLLOW THE 53 ; INSTRUCTIONS THERE. THE RUN TAKES ABOUT ONE MINUTE. 54 ; - THE BOOTABLE SYSTEM DOES NOT USE HARDWARE MULTIPLY AND DIVIDE. 55 ; IF YOU DON'T HAVE RT-11 TO EDIT AND RECOMPILE WITH 'EIS' 56 ; CONDITIONAL ASSEMBLY, THE MULTIPLY/DIVIDE ROUTINES CAN BE 57 ; PATCHED. IF YOU PATCH FROM THE KEYBOARD MONITOR, THE F.I.G. MACRO V04.00 00:02:08 PAGE 3-1 58 ; RESTART ADDRESS IS 1000 OCTAL ( COLD START) OR 1004 (WARM 59 ; START). SAVE THE NEW VERSION AS A BOOTABLE SYSTEM, AS 60 ; DESCRIBED ABOVE. 61 ; - THE SKEWED DISK I/O OPERATIONS SKIP TRACK ZERO, FOR COMPATIBILITY 62 ; WITH STANDARD PDP-11 SECTOR SKEWING. THE PHYSICAL READ 63 ; OPERATIONS ('RTS', 'WTS', 'NRTS', 'NWTS') CAN READ ANY SECTOR, 64 ; HOWEVER. 65 ; - ALSO THE SYSTEM AS DISTRIBUTED SKIPS THE FIRST 56 SECTORS 66 ; (7 SCREENS) IN ORDER TO SKIP THE BOOT BLOCK AND AN 67 ; RT-11 DIRECTORY. THIS CAUSES THE SCREEN POSITIONS TO BE THE 68 ; SAME FOR STAND-ALONE AND FOR RT-11 (WHICH ACCESSES THE FILE 69 ; 'FORTH.DAT'). YOU CAN CHANGE THIS BY CHANGING THE VALUE OF 70 ; THE VARIABLES 'S-SKIP' (NUMBER OF SCREENS SKIPPED) AND 71 ; 'S-USE' (NUMBER OF SCREENS USED BEFORE ACCESSING THE 72 ; SECOND DISK). THESE VARIABLES CAN BE CHANGED AT ANY TIME, 73 ; SO DISK SCREENS CAN BE READ INTO BUFFERS AND THEN FLUSHED 74 ; TO DIFFERENT LOCATIONS ON THE DISK. 75 ; - ADVANCED USERS MAY NOTE THAT THIS SYSTEM IS DESIGNED TO 76 ; ALLOW THE MEMORY LAYOUT - NUMBER AND LOCATION OF DISK 77 ; BUFFERS, LOCATION OF THE STACK, ETC. - TO BE CHANGED 78 ; DYNAMICALLY, WITHOUT REASSEMBLY. 79 ; 80 ; 81 ; TO BRING UP THIS SYSTEM UNDER RT-11: 82 ; - BE SURE THAT RT-11 IS SELECTED BELOW. THE LINES DEFINING 83 ; 'RSX11M' AND 'ALONE' SHOULD BE COMMENTED OUT; 'RT11' SHOULD 84 ; NOT BE. NOTE THAT THIS DISK IS DISTRIBUTED READY FOR RT-11 85 ; ASSEMBLY (EVEN THOUGH THIS LISTING IS FOR STAND-ALONE). 86 ; - IF YOU HAVE HARDWARE MULTIPLY/DIVIDE, ALSO REMOVE THE 87 ; SEMICOLON FROM THE LINE DEFINING 'EIS'. 88 ; - IF YOU ARE USING AN OLDER VERSION OF RT-11 (VERSION 2), 89 ; YOU MAY NEED TO USE THE MACROS '..V2..' AND '.REGDEF'. 90 ; - ASSEMBLE, LINK, AND RUN. THE SYSTEM SHOULD COME UP AND 91 ; TYPE 'FIG-FORTH' AND THE VERSION NUMBER. 92 ; - TEST THAT IT IS UP BY TRYING SOME ARITHMETIC OR DEFINITIONS, E.G. 93 ; 88 88 * . (NOTE THAT THE '.' MEANS PRINT) 94 ; : SQUARE DUP * ; 95 ; 25 SQUARE . 96 ; OR TYPE 'VLIST' FOR A LIST OF ALL THE FORTH OPERATIONS IN THE 97 ; DICTIONARY. 98 ; - THE DISK SHOULD WORK IF THE DISKETTE IS IN DRIVE 'DK'. 99 ; MAKE SURE THAT 'DK' IS ASSIGNED TO WHATEVER PHYSICAL 100 ; DRIVE YOU ARE USING - OR CHANGE LINE 'RTFILE:' IN 101 ; 'FORTH.MAC'. TEST THE DISK BY TYPING 102 ; 1 LIST 103 ; WHICH SHOULD LIST THE SCREEN WHICH LOADS THE EDITOR, 104 ; ASSEMBLER, AND STRING ROUTINES. 105 ; - IN CASE YOU NEED TO GET A LISTING FROM THE ASSEMBLY OF 106 ; 'FORTH.MAC' (NOT USUALLY NECESSARY), AND YOUR SYSTEM HAS 107 ; ONLY DISKETTES (NO LARGER DISKS), THE 'ALLOCATE' OPTION 108 ; IS NECESSARY BECAUSE OF THE SIZE OF THE '.LST' FILE 109 ; (AROUND 230 BLOCKS). FIRST COPY 'FORTH.MAC' ONTO A 110 ; SEPARATE DISKETTE BY ITSELF. THEN EXECUTE 111 ; .MACRO /LIST:FORTH.LST /ALLOCATE:300. /NOOBJECT 112 ; AND REPLY 'FORTH.MAC' WHEN ASKED FOR 'FILES?'. 113 ; 114 ; F.I.G. MACRO V04.00 00:02:08 PAGE 3-2 115 ; 116 ; TO BRING UP THE SYSTEM UNDER RSX-11M: 117 ; - THE DISKETTE PROVIDED IS IN RT-11 FILE FORMAT. THE TWO FILES 118 ; MUST BE COPIED OFF THE DISKETTE INTO AN RSX DIRECTORY. THE 119 ; 'FORTH.DAT' FILE MUST BE COPIED IN IMAGE MODE. ANY RSX 120 ; DIRECTORY MAY BE USED. ASSUMING THE DISKETTE IS IN DRIVE 0, 121 ; USE THE RSX COMMANDS: 122 ; >FLX =DX:FORTH.MAC/RT 123 ; >FLX =DX:FORTH.DAT/RT/IM 124 ; INCIDENTALLY, 'FORTH.DAT' IS THE SYSTEM'S 'VIRTUAL MEMORY' 125 ; FILE, USED FOR DISK I/O. THE REST OF THE SYSTEM (THIS 126 ; PROGRAM ALONE) CAN RUN INDEPENDENTLY, EVEN IF 'FORTH.DAT' 127 ; IS NOT AVAILABLE. 128 ; - EDIT 'FORTH.MAC' TO SELECT RSX ASSEMBLY. CHANGE THE SEMICOLON 129 ; TO COMMENT OUT 'RT11' NOT 'RSX11'. LET 'EIS' BE DEFINED IF 130 ; YOU HAVE HARDWARE MULTIPLY/DIVIDE. 131 ; - ASSEMBLE, TASK BUILD, AND RUN. TEST AS WITH RT11 ABOVE. 132 ; - THE DISK I/O SHOULD WORK IF 'FORTH.DAT' IS IN THE DEFAULT 133 ; DEVICE AND DIRECTORY. TEST AS ABOVE. 134 ; 135 ; 136 ; 137 ; THE SYSTEM AS SUPPLIED RESERVES 8000. BYTES FOR YOUR FORTH 138 ; PROGRAMMING AND STACK. THIS IS ENOUGH FOR SUBSTANTIAL PROJECTS. 139 ; (NOTE THAT THE EDITOR, ASSEMBLER, AND STRING PACKAGE, IF LOADED, 140 ; USE MORE THAN 5K OF THIS.) TO CHANGE THIS MEMORY SIZE, CHANGE 141 ; THE '8000.' WHICH IS IN THE LINES FOLLOWING THE LABEL 'DP:', 142 ; NEAR THE END OF THIS PROGRAM. INCIDENTALLY, VERY FEW JOBS 143 ; (E.G. RECURSION) WILL EVER USE MORE THAN 100 WORDS OF THIS SPACE 144 ; FOR THE STACK; THE REST OF THE SPACE IS AVAILABLE FOR A STRING 145 ; STACK (IF USED) OR FOR YOUR PROGRAMS - AND FORTH OBJECT CODE IS 146 ; CONSIDERABLY MORE COMPACT THAN ASSEMBLY. 147 ; 148 ; 149 ; 150 ; THE FORTH VIRTUAL FILE 'FORTH.DAT' IS USED FOR STORING SOURCE 151 ; PROGRAMS (OR DATA). THIS FILE HAS 70 1-K SCREENS (1-70), 152 ; I.E. 140 PDP-11 DISK BLOCKS. SCREENS 4 AND 5 ARE USED BY THE 153 ; SYSTEM FOR STORING ERROR AND WARNING MESSAGES. SCREENS 6-30 154 ; CONTAIN A TEXT EDITOR, ASSEMBLER, STRING PACKAGE, AND MISCELLANEOUS 155 ; EXAMPLES. SCREENS 40 THROUGH 47 CONTAIN A BINARY STAND-ALONE 156 ; SYSTEM (NOT USED UNDER RT-11 OR RSX-11M). USERS MAY WANT 157 ; TO SAVE THEIR SOURCE PROGRAMS AND DATA IN THE BLANK SCREENS. 158 ; THE SIZE OF THIS FORTH SCREENS FILE ('FORTH.DAT') CAN BE INCREASED 159 ; IF NEEDED. IF THE SYSTEM IS TO BE BOOTED STAND-ALONE, THE LOCATION 160 ; OF THE SYSTEM BINARY IMAGE ON THE DISK MUST NOT BE CHANGED; 161 ; THEREFORE, IF THE DISK IS TO BE USED TO RUN STAND-ALONE, DO NOT 162 ; USE RT-11 TO MOVE 'FORTH.DAT' TO ANOTHER PLACE ON THE DISK. 163 ; 164 ; 165 ; 166 ; 167 ; 168 ; NOTE THAT THE RT-11 AND RSX-11M SYSTEMS DO NOT ECHO CHARACTERS 169 ; WHICH ARE INPUT FROM THE TERMINAL. INSTEAD, THEY LET THE OPERATING 170 ; SYSTEM (RT-11 OR RSX-11M) ECHO THEM. THIS IS DONE SO THAT TYPING 171 ; CONVENTIONS WILL BE THE SAME AS THE USER IS FAMILIAR WITH. ALSO, F.I.G. MACRO V04.00 00:02:08 PAGE 3-3 172 ; TO AVOID SWAPPING DELAYS, THE RSX VERSION OF 'KEY' READS A LINE OF 173 ; CHARACTERS AT A TIME. 174 ; 175 ; 176 ; 177 ; 178 ; CHANGE THESE LINES TO CONTROL CONDITIONAL ASSEMBLY: 179 ; 180 ;RT11=1 ; COMMENTED OUT UNLESS RT-11 181 ;RSX11=1 ; COMMENTED OUT UNLESS RSX11M 182 000001 ALONE=1 ; COMMENTED OUT UNLESS STAND-ALONE 183 ;EIS=1 ; COMMENTED OUT UNLESS HARDWARE MULTIPLY-DIVIDE 184 ;LINKS=1 ; COMMENTED OUT UNLESS SUBROUTINE LINKAGE FROM 185 ; FORTH TO OTHER LANGUAGES 186 ; 187 ;.PAGE 188 ; **************************************************************** 189 ; 190 ; VARIATIONS FROM F.I.G. MODEL 191 ; 192 ; **************************************************************** 193 ; 194 ; 195 ; 'FIRST' AND 'LIMIT' HAVE BEEN MADE USER VARIABLES, NOT CONSTANTS. 196 ; THEREFORE WHEN THEY ARE USED, 'FIRST @' AND 'LIMIT @' ARE 197 ; REQUIRED. 198 ; 199 ; ';CODE' AND 'FORTH' ARE NOT PURE CODE, SO THEY WERE MOVED TO THE 200 ; END OF THE DICTIONARY. THIS IS SO THE BULK OF THE DICTIONARY 201 ; COULD BE PUT IN PROM OR USED RE-ENTRANTLY. 202 ; 203 ; THE MACHINE-INDEPENDENT I/O SECTION WAS MOVED TO NEAR THE END OF 204 ; THE DICTIONARY, BECAUSE IT IS NOT ALWAYS PURE CODE, AND ALSO TO 205 ; ALLOW THE I/O TO BE REDEFINED WITHOUT REASSEMBLY. 206 ; 207 ; THIS SYSTEM MUST TEST FOR FIRST-TIME-THROUGH TERMINAL AND DISK 208 ; I/O, TO AVOID ERRONEOUS ATTEMPT TO OPEN FILES TWICE AT LATER COLD 209 ; STARTS. IT CLEARS DISK BUFFERS AT COLD START. 210 ; 211 ; CHANGES IN V 1.3.1 (PH): 212 ; - CHANGED VERSION NUMBER FROM "1.3" TO "1.3.1". 213 ; - CHANGED CPU FROM "11" (OCTAL) TO "11." (DECIMAL). 214 ; - ADDED "BIC #177600,(S)" TO CLEAR PARITY BIT & UPPER 215 ; BYTE FOR STANDALONE TERMINAL ASCII OUTPUT. 216 ; - CHANGED ".WORD" TO ".BLKW" IN DSKBUF AREA SO STANDALONE 217 ; BINARY IMAGE CAN BE VERIFIED TO FIT IN 017400 BYTES, 218 ; TO GUARANTEE ROOM FOR THE 2-SECTOR BOOT LOADER. 219 ; F.I.G. MACRO V04.00 00:02:08 PAGE 4 1 ; **************************************************************** 2 ; 3 ; SET UP REGISTERS AND MACROS. 4 ; 5 ; **************************************************************** 6 ; 7 ; 8 000002 W=%2 ; TEMPORARY USED BY 'NEXT' MACRO (THE INNER INTERPRETER) 9 000003 U=%3 ; POINTER TO THE USER AREA 10 000004 IP=%4 ; FORTH INSTRUCTION COUNTER 11 000005 S=%5 ; FORTH STACK POINTER 12 000006 RP=SP ; FORTH RETURN-STACK POINTER 13 ; 14 ; NOTE - CODE ROUTINES CAN USE REGISTERS 0, 1, 4, AND 5, WITHOUT 15 ; RESTORING THEM. 16 ; 17 ; 18 ; MACRO DEFINITIONS 19 ; 20 ; 21 ; 22 ; THE 'HEAD' MACRO CREATES A FORTH DICTIONARY HEADER. ITS ARGUMENTS ARE: 23 ; (1) LENGTH BYTE - THE LENGTH OF THE NAME BEING DEFINED. THE SIGN BIT 24 ; OF THE LENGTH BYTE MUST BE SET, SO THAT THE SYSTEM WILL RECOGNIZE 25 ; THE END OF A VARIABLE-LENGTH NAME FIELD; THEREFORE THE LENGTH BYTE 26 ; IS GIVEN AS 200 OCTAL PLUS THE LENGTH. IF THE OPERATION IS 27 ; IMMEDIATE, THE BIT NEXT TO THE SIGN BIT IS ALSO SET, SO THE LENGTH 28 ; BYTE IS GIVEN AS 300 OCTAL PLUS THE LENGTH. 29 ; (2) NAME - THE NAME OF THE OPERATION BEING DEFINED. 30 ; (3) LCHAR - THE ASCII VALUE OF THE LAST CHARACTER OF THE NAME, WITH THE 31 ; SIGN BIT SET. THE NAME FIELD MUST HAVE AN EVEN LENGTH (INCLUDING 32 ; THE LENGTH BYTE), SO IF THE NUMBER OF CHARACTERS IN THE NAME IS 33 ; EVEN, 'LCHAR' WILL BE GIVEN AS 240 (200 PLUS CODE FOR A SPACE). 34 ; (4) LABEL - THE ASSEMBLY-LANGUAGE LABEL ASSOCIATED WITH THE 'CODE FIELD' 35 ; OF THIS DICTIONARY HEADER. THESE LABELS ARE USED IN THE PRECOMPILED- 36 ; FORTH SECTION OF THE SYSTEM. WHEN POSSIBLE, THE FORTH OPERATION 37 ; NAME ITSELF IS USED AS THE ASSEMBLY LABEL; OTHERWISE AN ABBREVIATION 38 ; IS USED. BY CONVENTION, THESE NAMES ARE LIMITED TO FIVE CHARACTERS, 39 ; FOR CONSISTENCY AMONG VARIOUS ASSEMBLERS FOR DIFFERENT MICROPROCESSORS. 40 ; (THE FORTH IMPLEMENTATION TEAM USES THE SAME LABELS IN ALL OF ITS 41 ; VERSIONS.) 42 ; (5) CODE - POINTER TO THE MACHINE-LANGUAGE "CODE ROUTINE" ASSOCIATED 43 ; WITH THIS OPERATION TYPE OR DATA TYPE. E.G. FOR ANY COLON DEFINITION, 44 ; THIS ARGUMENT IS 'DOCOL', THE LABEL OF A FIVE-INSTRUCTION ASSEMBLY 45 ; ROUTINE WHICH USES THE RETURN STACK TO HANDLE THE NESTED EXECUTION 46 ; OF ANOTHER LEVEL OF FORTH OPERATIONS. FOR ANY CONSTANT, THIS CODE 47 ; ROUTINE IS 'DOCON', AND SIMILARLY FOR ALL OTHER DATA TYPES. 48 ; THE CODE ARGUMENT MAY BE OMITTED. IN THAT CASE, THE 'HEAD' 49 ; MACRO LEAVES THE CODE FIELD POINTING TWO BYTES BEYOND ITSELF, WHERE 50 ; MACHINE-LANGUAGE CODE MUST BEGIN - AND THE OPERATION SO DEFINED IS 51 ; CALLED A "PRIMITIVE". THE "NUCLEUS SECTION" OF THIS VERSION OF 52 ; FORTH CONTAINS ABOUT 45 PRIMITIVES, FROM WHICH THE WHOLE SYSTEM 53 ; IS BUILT; IN EFFECT, THESE PRIMITIVES DEFINE THE VIRTUAL FORTH 54 ; MACHINE. (A FEW OPERATIONS IN THE "PRECOMPILED FORTH" SECTION 55 ; OF THE SYSTEM HAVE BEEN REPLACED WITH PRIMITIVES, TO OPTIMIZE 56 ; EXECUTION SPEED. AND WHEN A FORTH ASSEMBLER IS ADDED TO THIS 57 ; SYSTEM, USERS WILL BE ABLE TO DEFINE THEIR OWN PRIMITIVES DIRECTLY F.I.G. MACRO V04.00 00:02:08 PAGE 4-1 58 ; IN FORTH, IMMEDIATELY READY FOR EXECUTION.) 59 ; 60 ; THE 'HEAD' MACRO CREATES A FORTH HEADER CONSISTING OF 61 ; LENGTH BYTE - SIGN BIT SET 62 ; NAME OF THE OPERATION - VARIABLE LENGTH - SIGN BIT SET ON LAST CHAR. 63 ; LINK FIELD, WHICH POINTS TO THE BEGINNING OF THE PREVIOUS DICTIONARY 64 ; HEADER (USED AT COMPILE TIME) 65 ; CODE POINTER. 66 ; 67 000000 LINK=0 ; LAST LINK FIELD IS 0, INDICATING END OF THE DICTIONARY. 68 69 ; 70 .MACRO HEAD,LENGTH,NAME,LCHAR,LABEL,CODE 71 LINK2=. 72 .BYTE LENGTH 73 .ASCII ^NAME^ 74 .EVEN 75 .=.-1 76 .BYTE LCHAR ; LAST CHARACTER OF NAME (OR BLANK FILL), 77 ; PASSED IN OCTAL, WITH HIGH BIT SET. 78 .WORD LINK 79 LINK=LINK2 80 LABEL: .IF NB CODE 81 .WORD CODE 82 .IFF 83 .WORD .+2 84 .ENDC 85 .ENDM 86 ; 87 ; 88 ; 89 ; THE 'NEXT' MACRO TRANSFERS CONTROL FROM ONE FORTH OPERATION TO THE 90 ; 'CODE ROUTINE' OF THE NEXT. NOTICE THAT ONLY TWO INSTRUCTION 91 ; EXECUTIONS ARE REQUIRED TO TRANSFER CONTROL FROM USEFUL OPERATIONS 92 ; OF ONE FORTH PRIMITIVE TO THOSE OF THE NEXT. 93 ; 94 .MACRO NEXT 95 MOV (IP)+,W 96 JMP @(W)+ 97 .ENDM 98 ; 99 ; 100 ; MACRO CALLS 101 ; 102 ; 103 .IFDF RT11 104 .MCALL .RCTRLO,.TTYIN,.TTINR,.TTYOUT,.EXIT,.TRPSET 105 .MCALL .SETTOP,.DSTATUS,.FETCH,.LOOKUP,.READW,.WRITW 106 .ENDC 107 ; 108 ; 109 .IFDF RSX11 110 .MCALL QIOW$C,EXIT$S,ALUN$C,ASTX$S,SVTK$S 111 .MCALL FDBDF$,FDRC$A,FDBK$A,FDOP$A,FSRSZ$ 112 .MCALL OPEN$M,READ$,WRITE$,WAIT$,CLOSE$ 113 .MCALL QIOW$ 114 .ENDC F.I.G. MACRO V04.00 00:02:08 PAGE 5 1 ; **************************************************************** 2 ; 3 ; START-UP TABLE 4 ; 5 ; **************************************************************** 6 ; 7 ; AT STARTUP, MOST OF THESE VALUES ARE MOVED INTO THE USER AREA 8 ; (STARTING AT 'XDP:'); THEY ARE NORMALLY ACCESSED THERE. THE VALUES 9 ; HERE ARE NOT USUALLY CHANGED, BUT THEY MAY BE CHANGED E.G. TO 10 ; CONTROL WHAT HAPPENS AT COLD START. THIS TABLE COULD BE MOVED OUT OF 11 ; LOW MEMORY IF NECESSARY FOR ROM SYSTEMS. 12 ; 13 ; 14 ; 15 000000 GFORTH:: ; GLOBAL LABEL - NORMALLY NOT USED 16 000000 000167 007726 ORIGIN: JMP CENT ; COLD START ENTRY POINT 17 000004 000167 010004 JMP WENT ; WARM START ENTRY ADDRESS 18 ; NOTE - COLD START WIPES OUT ANY NEW DICTIONARY DEFINITIONS, AND 19 ; THEN DOES A WARM START. WARM START CLEANS UP STACKS, TERMINAL 20 ; BUFFER, ETC. 21 000010 000013 .WORD 11. ; CPU 22 000012 000000 .WORD 0 ; REVISION 23 000014 015420' .WORD TASK-10 ; POINTER TO LATEST WORD DEFINED 24 000016 000010 .WORD 10 ; BACKSPACE CHARACTER 25 000020 043444' .WORD XUP ; POINTER TO USER AREA 26 ; NOTE - THE USER AREA IS A HOOK IN THIS SYSTEM TO ALLOW MULTITASKING 27 ; TO BE ADDED LATER. 28 000022 035134' .WORD XS0 ; POINTER TO BEGINNING OF THE STACK 29 000024 043444' .WORD XR0 ; POINTER TO BEGINNING OF RETURN STACK 30 000026 043154' .WORD XTIB ; POINTER TO TERMINAL INPUT BUFFER 31 000030 000037 .WORD 37 ; MAXIMUM NAME-FIELD WIDTH, NORMALLY 31 32 000032 000000 .WORD 0 ; WARNING MODE; 0=ERROR #, 1=DISK MESSAGE 33 ; NOTE - WARNING MODE INITIALIZED TO ZERO, IN CASE DISK ISN'T UP. 34 000034 015434' .WORD XDP ; FENCE TO PROTECT AGAINST ACCIDENTAL 35 ; 'FORGET' OF THE SYSTEM. 36 000036 015434' .WORD XDP ; POINTER TO NEXT AVAILABLE DICTIONARY 37 ; LOCATION (RETURNED BY 'HERE'). 38 000040 015416' .WORD XXVOC ; POINTER TO INITIAL VOCABULARY LINK 39 000042 035140' .WORD DSKBUF ; INITIALIZE 'FIRST' 40 000044 043154' .WORD ENDBUF ; INITIALIZE 'LIMIT' 41 000046 000000 .WORD 0 ; AVAILABLE 42 000050 000000 .WORD 0 ; AVAILABLE 43 ; F.I.G. MACRO V04.00 00:02:08 PAGE 6 1 ; **************************************************************** 2 ; 3 ; NUCLEUS 4 ; 5 ; **************************************************************** 6 ; 7 ; 8 ; 9 ; THE NUCLEUS CONTAINS THE PRIMITIVES FROM WHICH THE SYSTEM IS BUILT. 10 ; 11 ; 12 ; 13 ; 14 000052 HEAD 203,LIT,324,LIT ; ***** LIT 15 ; USED ONLY BY COMPILER. PUSH FOLLOWING LITERAL ONTO STACK. 16 000062 012445 MOV (IP)+,-(S) 17 000064 NEXT 18 ; 19 000070 HEAD 207,EXECUTE,305,EXEC ; ***** EXECUTE 20 ; EXECUTE FORTH WORD WHOSE CODE ADDRESS IS ON STACK 21 000104 012502 MOV (S)+,W 22 000106 000132 JMP @(W)+ 23 ; 24 ; 25 000110 HEAD 206,BRANCH,240,BRAN ; ***** BRANCH 26 ; USED ONLY BY COMPILER. FORTH BRANCH TO ADDRESS WHICH FOLLOWS. 27 000124 061404 ADD (IP),IP 28 000126 NEXT 29 ; 30 000132 HEAD 207,0BRANCH,310,ZBRAN ; ***** 0BRANCH 31 ; USED ONLY BY COMPILER. FORTH BRANCH IF TOP OF STACK 32 ; IS ZERO (FALSE). 33 000146 005725 TST (S)+ 34 000150 001003 BNE 3$ 35 000152 061404 ADD (IP),IP 36 000154 NEXT 37 000160 062704 000002 3$: ADD #2,IP 38 000164 NEXT 39 ; 40 000170 HEAD 206,(LOOP),240,XLOOP ; ***** (LOOP) 41 ; USED ONLY BY COMPILER. INCREMENT LOOP INDEX BY 1, BRANCH 42 ; IF BELOW LIMIT. 43 000204 005216 INC (RP) 44 000206 021666 000002 CMP (RP),2(RP) 45 000212 002003 BGE 1$ 46 000214 061404 ADD (IP),IP 47 000216 NEXT 48 000222 062706 000004 1$: ADD #4,RP 49 000226 062704 000002 ADD #2,IP 50 000232 NEXT 51 ; 52 000236 HEAD 207,(+LOOP),251,XPLOO ; ***** (+LOOP) 53 ; USED ONLY BY COMPILER. INCREMENT LOOP INDEX BY TOP OF STACK, 54 ; MAYBE BRANCH. 55 000252 061516 ADD (S),(RP) 56 000254 005725 TST (S)+ 57 000256 002414 BLT 2$ F.I.G. MACRO V04.00 00:02:08 PAGE 6-1 58 000260 026616 000002 CMP 2(RP),(RP) 59 000264 003403 BLE 1$ 60 000266 061404 ADD (IP),IP 61 000270 NEXT 62 000274 062706 000004 1$: ADD #4,RP 63 000300 062704 000002 ADD #2,IP 64 000304 NEXT 65 000310 021666 000002 2$: CMP (RP),2(RP) ; HANDLE NEGATIVE INCREMENT 66 000314 003767 BLE 1$ 67 000316 061404 ADD (IP),IP 68 000320 NEXT 69 ; 70 000324 HEAD 204,(DO),240,XDO ; ***** (DO) 71 ; USED ONLY BY COMPILER. SET UP 'DO' LIMIT AND INDEX. 72 000336 016546 000002 MOV 2(S),-(RP) 73 000342 011546 MOV (S),-(RP) 74 000344 062705 000004 ADD #4,S 75 000350 NEXT 76 ; 77 000354 HEAD 201,I,311,I ; ***** I 78 ; RETURN CURRENT LOOP INDEX TO STACK. 79 000362 011645 MOV (RP),-(S) 80 000364 NEXT 81 ; 82 000370 HEAD 205,DIGIT,324,DIGIT ; ***** DIGIT 83 ; USED BY COMPILER. 84 ; ( ASCII-DIGIT BASE ==> DIGIT-VALUE TRUE (OR FALSE)) 85 000402 162765 000060 000002 SUB #60,2(S) ; VALID DIGIT IS ASCII 60 - 86 000410 026527 000002 000011 CMP 2(S),#11 ; IF GREATER THAN 9, 87 000416 003407 BLE 1$ 88 000420 162765 000007 000002 SUB #7,2(S) ; SUBTRACT 7. 89 000426 026527 000002 000012 CMP 2(S),#12 ; AND THEN IF <10 (A) 90 000434 002412 BLT 2$ ; ERROR 91 000436 005765 000002 1$: TST 2(S) ; IF LESS THAN ZERO, ERROR 92 000442 002407 BLT 2$ 93 000444 026515 000002 CMP 2(S),(S) ; OR IF NOT LESS THAN BASE, ERR 94 000450 002004 BGE 2$ 95 000452 012715 000001 MOV #1,(S) ; VALID RETURN 96 000456 NEXT 97 000462 062705 000002 2$: ADD #2,S 98 000466 005015 CLR (S) ; ERROR - RETURN '0' FLAG 99 000470 NEXT 100 ; 101 ; 102 000474 HEAD 206,(FIND),240,PFIND ; ***** (FIND) 103 ; USED BY COMPILER. FIND A WORD IN THE DICTIONARY. 104 ; ( STRING-ADDRESS NFA ==> PFA LENGTH TRUE (OR FALSE)). 105 ; STRING-ADDRESS IS ADDRESS OF THE LENGTH BYTE OF THE 106 ; STRING BEING SOUGHT. NFA IS NAME-FIELD ADDRESS OF 107 ; WORD IN DICTIONARY WHERE SEARCH BEGINS. PFA IS 108 ; PARAMETER-FIELD ADDRESS OF THE DICTIONARY ENTRY 109 ; WHICH IS FOUND. IF WORD NOT FOUND, ONLY ONE RESULT 110 ; (0, FALSE) IS RETURNED. 111 ; SETUP - GET ARGS, PRESERVE NEEDED REGISTERS 112 000510 012500 MOV (S)+,R0 ; DICTIONARY ADDRESS 113 000512 012501 MOV (S)+,R1 ; STRING ADDRESS 114 000514 010546 MOV R5,-(RP) ; PRESERVE REGISTERS F.I.G. MACRO V04.00 00:02:08 PAGE 6-2 115 000516 010446 MOV R4,-(RP) 116 000520 010346 MOV R3,-(RP) 117 000522 005046 CLR -(RP) ; SPACE TO STORE LENGTH BYTE 118 ; PREPARE R2 FOR FAST COMPARE 119 000524 011102 MOV (R1),R2 120 000526 042702 100200 BIC #100200,R2 121 ; 122 000532 FCOMP: 123 ; FAST TEST TO ELIMINATE MOST WORDS 124 ; COMPARE FIRST WORD TO SPECIALLY PREPARED R2 125 ; THEN INCREMENT TO FIND END OF NAME. 126 000532 011003 FAST: MOV (R0),R3 127 000534 042703 100300 BIC #100300,R3 128 000540 020203 CMP R2,R3 129 000542 001406 BEQ NOFAST ; NO FAST ELIMINATION POSSIBLE 130 000544 005720 XMATCH: TST (R0)+ ; BRANCH HERE IF NO MATCH THIS TIME 131 000546 100376 BPL XMATCH 132 ; R0 NOW POINTS TO LINK 133 000550 005710 TST (R0) 134 000552 001435 BEQ FAILED 135 000554 011000 MOV (R0),R0 136 000556 000765 BR FCOMP 137 ; END OF FAST ELIMINATION TEST 138 ; 139 000560 011016 NOFAST: MOV (R0),(RP) ; SAVE LENGTH BYTE 140 000562 010105 MOV R1,R5 ; SET R5 141 000564 000407 BR NOFST1 142 ; NOW DO THE MAIN LOOP TO CHECK FOR MATCH 143 000566 005725 MLOOP: TST (R5)+ 144 000570 011504 MOV (R5),R4 145 000572 011003 MOV (R0),R3 146 000574 042703 100000 BIC #100000,R3 147 000600 020304 CMP R3,R4 148 000602 001360 BNE XMATCH 149 000604 032720 100000 NOFST1: BIT #100000,(R0)+ 150 000610 001766 BEQ MLOOP 151 ; IF GET HERE, FOUND IT. 152 000612 012602 MOV (RP)+,R2 ; POP AND SAVE LENGTH BYTE 153 000614 012603 MOV (RP)+,R3 ; RESTORE REGISTERS 154 000616 012604 MOV (RP)+,R4 155 000620 012605 MOV (RP)+,R5 156 000622 062700 000004 ADD #4,R0 ; GET PARAMETER FIELD ADDRESS 157 000626 010045 MOV R0,-(S) 158 000630 042702 177400 BIC #177400,R2 ; R2 CONTAINS LENGTH BYTE 159 000634 010245 MOV R2,-(S) 160 000636 012745 000001 MOV #1,-(S) 161 000642 NEXT 162 000646 005726 FAILED: TST (RP)+ ; POP LENGTH BYTE 163 000650 012603 MOV (RP)+,R3 ; RESTORE REGISTERS 164 000652 012604 MOV (RP)+,R4 165 000654 012605 MOV (RP)+,R5 166 000656 005045 CLR -(S) ; REPLACE LENGTH BYTE WITH 167 ; FAILURE FLAG. 168 000660 NEXT ; WE ARE DONE - FAILURE TO FIND 169 ; 170 000664 HEAD 207,ENCLOSE,305,ENCL ; ***** ENCLOSE 171 ; USED BY COMPILER. BREAK NEXT WORD OUT OF INPUT BUFFER. F.I.G. MACRO V04.00 00:02:08 PAGE 6-3 172 ; ( START-ADDRESS DELIMITER ==> ADDRESS OFFSET END NEXT-CHARACTER) 173 000700 011500 MOV (S),R0 ; DELIMITER 174 000702 016501 000002 MOV 2(S),R1 ; STARTING ADDRESS 175 000706 162705 000004 SUB #4,S ; MAKE SPACE FOR RESULTS 176 000712 122100 ENC1: CMPB (R1)+,R0 177 000714 001776 BEQ ENC1 ; SKIP OVER LEADING DELIMITERS 178 000716 162701 000001 SUB #1,R1 179 000722 010165 000004 MOV R1,4(S) 180 000726 105711 ENC2: TSTB (R1) ; TEST FOR NULL 181 000730 001420 BEQ ENC4 182 000732 122100 CMPB (R1)+,R0 ; NOT NULL, SO FIND END OF TOKEN 183 000734 001374 BNE ENC2 184 000736 010115 MOV R1,(S) 185 000740 162701 000001 SUB #1,R1 186 000744 010165 000002 ENC3: MOV R1,2(S) ; FINISH UP AND RETURN 187 000750 016501 000006 MOV 6(S),R1 188 000754 160115 SUB R1,(S) 189 000756 160165 000002 SUB R1,2(S) 190 000762 160165 000004 SUB R1,4(S) 191 000766 NEXT 192 000772 010115 ENC4: MOV R1,(S) ; HANDLE NULL CASE 193 000774 020165 000004 CMP R1,4(S) 194 001000 001361 BNE ENC3 195 001002 062701 000001 ADD #1,R1 196 001006 000756 BR ENC3 197 198 ; 199 ; 200 ; THE NEXT 4 HEADERS POINT TO INSTALLATION-DEPENDENT TERMINAL I/O 201 ; ROUTINES. 202 ; 203 ; 204 001010 HEAD 204,EMIT,240,EMIT,PEMIT ; ***** EMIT 205 ; 206 001022 HEAD 203,KEY,331,KEY,PKEY ; ***** KEY 207 ; 208 001032 HEAD 211,?TERMINAL,314,QTERM,PQTER ; ***** ?TERMINAL 209 ; 210 001050 HEAD 202,CR,240,CR,PCR ; ***** CR 211 ; 212 ; 213 ; 214 ; 215 ; 216 001060 HEAD 205,CMOVE,305,CMOVE ; ***** CMOVE 217 ; MOVE BYTES IN MEMORY. ( FROM TO N ==>) 218 001072 005715 TST (S) 219 001074 001407 BEQ 2$ ; NO MOVE 220 001076 016500 000002 MOV 2(S),R0 221 001102 016501 000004 MOV 4(S),R1 222 001106 112120 1$: MOVB (R1)+,(R0)+ 223 001110 005315 DEC (S) 224 001112 001375 BNE 1$ 225 001114 062705 000006 2$: ADD #6,S 226 001120 NEXT 227 ; 228 ; F.I.G. MACRO V04.00 00:02:08 PAGE 6-4 229 001124 HEAD 202,U*,240,USTAR ; ***** U* 230 ; ( N1 N2 ==> PRODUCT). PRODUCT IS 32-BIT DOUBLE INTEGER, 231 ; HIGH WORD TOP. 232 ; THIS MUST BE UNSIGNED MULTIPLICATION. 233 001134 004767 000004 JSR PC,UMULT 234 001140 NEXT 235 001144 UMULT: 236 ; THE VALUES TO MULTIPLY ARE ON THE STACK. 237 001144 012502 MOV (S)+,R2 238 001146 012746 000020 MOV #20,-(RP) ; SET LOOP COUNT 239 001152 005000 CLR R0 240 001154 005001 CLR R1 241 001156 006101 2$: ROL R1 242 001160 006100 ROL R0 243 001162 006102 ROL R2 244 001164 103002 BCC 1$ 245 001166 061501 ADD (S),R1 246 001170 005500 ADC R0 247 001172 005316 1$: DEC (RP) 248 001174 001370 BNE 2$ 249 001176 010115 MOV R1,(S) 250 001200 010045 MOV R0,-(S) 251 001202 005726 TST (RP)+ ; POP TEMPORARY 252 001204 000207 RTS PC 253 ; 254 001206 HEAD 202,U/,240,USLAS ; ***** U/ 255 ; THIS DIVISION MUST BE UNSIGNED. 256 001216 004767 000004 JSR PC,UDIV 257 001222 NEXT 258 001226 UDIV: 259 ; THE VALUES TO DIVIDE ARE ON THE STACK 260 001226 012502 MOV (S)+,R2 ; DIVISOR 261 001230 012500 MOV (S)+,R0 262 001232 012501 MOV (S)+,R1 263 001234 012745 000020 MOV #20,-(S) ; LOOP COUNT 264 001240 006301 1$: ASL R1 265 001242 006100 ROL R0 266 001244 001405 BEQ 2$ ; NO NEED TO SUBTRACT 267 001246 160200 SUB R2,R0 268 001250 005201 INC R1 269 001252 103002 BCC 2$ 270 001254 060200 ADD R2,R0 ; MUST RESTORE 271 001256 005301 DEC R1 272 001260 005315 2$: DEC (S) ; LOOP SIXTEEN TIMES 273 001262 001366 BNE 1$ 274 001264 005725 TST (S)+ ; POP TO DISCARD COUNT 275 001266 010045 MOV R0,-(S) ; REMAINDER 276 001270 010145 MOV R1,-(S) ; QUOTIENT 277 001272 000207 RTS PC 278 ; 279 001274 HEAD 203,AND,304,AND ; ***** AND 280 ; BITWISE AND. ( N1 N2 ==> N3). 281 001304 005115 COM (S) 282 001306 042515 BIC (S)+,(S) 283 001310 NEXT 284 ; 285 001314 HEAD 202,OR,240,OR ; ***** OR F.I.G. MACRO V04.00 00:02:08 PAGE 6-5 286 001324 052515 BIS (S)+,(S) 287 001326 NEXT 288 ; 289 001332 HEAD 203,XOR,322,XOR ; ***** XOR 290 .IFDF EIS 291 MOV (S)+,R0 292 XOR R0,(S) 293 .IFF 294 001342 011546 MOV (S),-(RP) 295 001344 046516 000002 BIC 2(S),(RP) 296 001350 042515 BIC (S)+,(S) 297 001352 052615 BIS (RP)+,(S) 298 .ENDC 299 001354 NEXT 300 ; 301 001360 HEAD 203,SP@,300,SPAT ; ***** SP@ 302 001370 010501 MOV S,R1 303 001372 010145 MOV R1,-(S) 304 001374 NEXT 305 ; 306 001400 HEAD 203,SP!,241,SPSTO ; ***** SP! 307 001410 016305 000006 MOV 6(U),S ; OFFSET 6 IN USER AREA 308 309 001414 NEXT 310 ; 311 001420 HEAD 203,RP!,241,RPSTO ; ***** RP! 312 001430 016706 176370 MOV ORIGIN+24,RP 313 001434 NEXT 314 ; 315 001440 HEAD 202,<;S>,240,SEMIS ; ***** ;S 316 001450 012604 MOV (RP)+,IP 317 001452 NEXT 318 ; 319 001456 HEAD 205,LEAVE,305,LEAVE ; ***** LEAVE 320 001470 011666 000002 MOV (RP),2(RP) 321 001474 NEXT 322 ; 323 001500 HEAD 202,^/>R/,240,TOR ; ***** >R 324 001510 012546 MOV (S)+,-(RP) 325 001512 NEXT 326 ; 327 001516 HEAD 202,R>,240,FROMR ; ***** R> 328 001526 012645 MOV (RP)+,-(S) 329 001530 NEXT 330 ; 331 001534 HEAD 201,R,322,R ; ***** R 332 001542 011645 MOV (RP),-(S) 333 001544 NEXT 334 ; 335 001550 HEAD 202,0=,240,ZEQU ; ***** 0= 336 001560 005715 TST (S) 337 001562 001402 BEQ 1$ 338 001564 005015 CLR (S) 339 001566 000402 BR 2$ 340 001570 012715 000001 1$: MOV #1,(S) 341 001574 2$: 342 001574 NEXT F.I.G. MACRO V04.00 00:02:08 PAGE 6-6 343 ; 344 001600 HEAD 202,0<,240,ZLESS ; ***** 0< 345 001610 005715 TST (S) 346 001612 100402 BMI 1$ 347 001614 005015 CLR (S) 348 001616 000402 BR 2$ 349 001620 012715 000001 1$: MOV #1,(S) 350 001624 2$: 351 001624 NEXT 352 ; 353 001630 HEAD 201,+,253,PLUS ; ***** + 354 001636 062515 ADD (S)+,(S) 355 001640 NEXT 356 ; 357 001644 HEAD 202,D+,240,DPLUS ; ***** D+ 358 001654 066565 000002 000006 ADD 2(S),6(S) ; ADD LOW 359 001662 005565 000004 ADC 4(S) 360 001666 061565 000004 ADD (S),4(S) ; ADD HIGH 361 001672 062705 000004 ADD #4,S 362 001676 NEXT 363 ; 364 001702 HEAD 205,MINUS,323,MINUS ; ***** MINUS 365 ; CHANGE SIGN. 366 001714 005415 NEG (S) 367 001716 NEXT 368 ; 369 001722 HEAD 206,DMINUS,240,DMINU ; ***** DMINUS 370 ; CHANGE SIGN OF DOUBLE INTEGER WORD ON STACK. 371 001736 005415 NEG (S) 372 001740 005465 000002 NEG 2(S) 373 001744 005615 SBC (S) 374 001746 NEXT 375 ; 376 001752 HEAD 204,OVER,240,OVER ; ***** OVER 377 ; ( N1 N2 ==> N1 N2 N1) 378 001764 016545 000002 MOV 2(S),-(S) 379 001770 NEXT 380 ; 381 001774 HEAD 204,DROP,240,DROP ; ***** DROP 382 002006 062705 000002 ADD #2,S 383 002012 NEXT 384 ; 385 002016 HEAD 204,SWAP,240,SWAP ; ***** SWAP 386 002030 016501 000002 MOV 2(S),R1 387 002034 011565 000002 MOV (S),2(S) 388 002040 010115 MOV R1,(S) 389 002042 NEXT 390 ; 391 002046 HEAD 203,DUP,320,DUP ; ***** DUP 392 002056 011545 MOV (S),-(S) 393 002060 NEXT 394 ; 395 002064 HEAD 202,+!,240,PSTOR ; ***** +! 396 ; ADD NUMBER SECOND ON STACK TO ADDRESS ON TOP. 397 002074 066575 000002 000000 ADD 2(S),@(S) 398 002102 062705 000004 ADD #4,S 399 002106 NEXT F.I.G. MACRO V04.00 00:02:08 PAGE 6-7 400 ; 401 002112 HEAD 206,TOGGLE,240,TOGGL ; ***** TOGGLE 402 ; ( BYTE-ADDRESS BIT-PATTERN ==> ) EXCLUSIVE-OR INTO MEMORY BYTE. 403 002126 016545 000002 MOV 2(S),-(S) ; PUSH THE BYTE 404 002132 117515 000000 MOVB @(S),(S) ; TO BE TOGGLED 405 ; AVOID USING 'XOR' INSTRUCTION - NOT AVAILABLE ON ALL PDP-11 406 002136 011546 MOV (S),-(RP) 407 002140 046516 000002 BIC 2(S),(RP) 408 002144 042515 BIC (S)+,(S) 409 002146 052615 BIS (RP)+,(S) 410 002150 016545 000002 MOV 2(S),-(S) ; SET UP RETURN ADDRESS 411 002154 116575 000002 000000 MOVB 2(S),@(S) ; PUT THE TOGGLED BYTE BACK TO MEM. 412 002162 062705 000006 ADD #6,S ; ADJUST STACK POINTER 413 002166 NEXT 414 ; 415 002172 HEAD 201,@,300,AT ; ***** @ 416 002200 017515 000000 MOV @(S),(S) 417 002204 NEXT 418 ; 419 002210 HEAD 202,C@,240,CAT ; ***** C@ 420 002220 117501 000000 MOVB @(S),R1 421 002224 042701 177400 BIC #177400,R1 422 002230 010115 MOV R1,(S) 423 002232 NEXT 424 ; 425 002236 HEAD 201,!,241,STORE ; ***** ! 426 002244 016575 000002 000000 MOV 2(S),@(S) 427 002252 062705 000004 ADD #4,S 428 002256 NEXT 429 ; 430 002262 HEAD 202,C!,240,CSTOR ; ***** C! 431 002272 116575 000002 000000 MOVB 2(S),@(S) 432 002300 062705 000004 ADD #4,S 433 002304 NEXT 434 ; 435 ; F.I.G. MACRO V04.00 00:02:08 PAGE 7 1 ; **************************************************************** 2 ; 3 ; PRE-COMPILED FORTH SECTION 4 ; 5 ; **************************************************************** 6 ; 7 ; 8 ; 9 ; NOTE - A FEW OF THE FOLLOWING OPERATIONS HAVE BEEN 10 ; CONVERTED TO CODE FOR SPEED. HOWEVER, THE WORD ORDER 11 ; IN THE DICTIONARY HAS NOT BEEN CHANGED. 12 ; 13 002310 HEAD 301,:,272,COLON,DOCOL ; ***** : 14 002316 004202' 004074' 003150' .WORD QEXEC,SCSP,CURR,AT,CONT,STORE,CREAT,RBRAC,PSCOD 002324 002176' 003132' 002242' 002332 006700' 004412' 004562' 15 002340 010446 DOCOL: MOV IP,-(RP) 16 002342 010204 MOV W,IP 17 002344 NEXT 18 ; 19 002350 HEAD 301,<;>,273,SEMI,DOCOL ; ***** ; 20 002356 004256' 004346' 001446' .WORD QCSP,COMP,SEMIS,SMUDG,LBRAC,SEMIS 002364 004440' 004374' 001446' 21 ; 22 002372 HEAD 210,CONSTANT,240,CON,DOCOL ; ***** CONSTANT 23 002410 006700' 004440' 003416' .WORD CREAT,SMUDG,COMMA,PSCOD 002416 004562' 24 002420 011245 DOCON: MOV (W),-(S) 25 002422 NEXT 26 ; 27 002426 HEAD 210,VARIABLE,240,VAR,DOCOL ; ***** VARIABLE 28 002444 002406' 004562' .WORD CON,PSCOD 29 002450 010245 DOVAR: MOV W,-(S) 30 002452 NEXT 31 ; 32 002456 HEAD 204,USER,240,USER,DOCOL ; ***** USER 33 ; CREATE A NEW USER VARIABLE. ( N ==> ). 34 002470 002406' 004562' .WORD CON,PSCOD 35 002474 011245 DOUSE: MOV (W),-(S) 36 002476 060315 ADD U,(S) 37 002500 NEXT 38 ; 39 ; 40 ; 41 ; CONSTANTS 42 ; 43 002504 HEAD 201,0,260,ZERO,DOCON ; ***** 0 44 002512 000000 .WORD 0 45 ; 46 002514 HEAD 201,1,261,ONE,DOCON ; ***** 1 47 002522 000001 .WORD 1 48 ; 49 002524 HEAD 201,2,262,TWO,DOCON ; ***** 2 50 002532 000002 .WORD 2 51 ; 52 002534 HEAD 201,3,263,THREE,DOCON ; ***** 3 53 002542 000003 .WORD 3 F.I.G. MACRO V04.00 00:02:08 PAGE 7-1 54 ; 55 002544 HEAD 202,BL,240,BL,DOCON ; ***** BL 56 ; BLANK. 57 002554 000040 .WORD 40 58 ; 59 002556 HEAD 203,C/L,314,CL,DOCON ; ***** C/L 60 ; # OF CHARACTERS PER LINE 61 002566 000100 .WORD 100 62 ; 63 ; 'FIRST' AND 'LIMIT' MOVED TO USER AREA 64 ; 65 002570 HEAD 205,B/BUF,306,BBUF,DOCON ; ***** B/BUF 66 ; BYTES PER DISK-BLOCK BUFFER. 67 002602 002000 .WORD 1024. 68 ; 69 002604 HEAD 205,B/SCR,322,BSCR,DOCON ; ***** B/SCR 70 ; DISK BLOCKS PER FORTH SCREEN. 71 002616 000001 .WORD 1 72 ; 73 002620 HEAD 207,+ORIGIN,316,PORIG,DOCOL ; ***** +ORIGIN 74 ; RETURNS ADDRESS, GIVEN OFFSET FROM ORIGIN. 75 002634 000060' 000000' 001634' .WORD LIT,ORIGIN,PLUS,SEMIS 002642 001446' 76 ; 77 ; USER VARIABLES 78 ; 79 002644 HEAD 202,S0,240,SZERO,DOUSE ; ***** S0 80 ; STACK ORIGIN. 81 002654 000006 .WORD 6 82 ; 83 002656 HEAD 202,R0,240,RZERO,DOUSE ; ***** R0 84 ; RETURN STACK ORIGIN. 85 002666 000010 .WORD 10 86 ; 87 002670 HEAD 203,TIB,302,TIB,DOUSE ; ***** TIB 88 ; TERMINAL INPUT BUFFER. 89 002700 000012 .WORD 12 90 ; 91 002702 HEAD 205,WIDTH,310,WIDTH,DOUSE ; ***** WIDTH 92 ; MAXIMUM NAME LENGTH (DEFAULT, 31 CHARACTERS). 93 002714 000014 .WORD 14 94 ; 95 002716 HEAD 207,WARNING,307,WARN,DOUSE ; ***** WARNING 96 ; WARNING MODE (DEFAULT, GIVE MESSAGE NUMBER AT ERROR 97 ; OR WARNING CONDITION, DON'T GO TO DISK FOR MESSAGE). 98 002732 000016 .WORD 16 99 ; 100 002734 HEAD 205,FENCE,305,FENCE,DOUSE ; ***** FENCE 101 ; PREVENTS 'FORGET' BELOW THIS 'FENCE' SETTING. 102 002746 000020 .WORD 20 103 ; 104 002750 HEAD 202,DP,240,DP,DOUSE ; ***** DP 105 ; DICTIONARY POINTER TO NEXT AVAILABLE SPACE. 106 002760 000022 .WORD 22 107 ; 108 002762 HEAD 210,VOC-LINK,240,VOCL,DOUSE ; ***** VOC-LINK 109 ; VOCABULARY LINK (MAINLY FOR FUTURE USE). F.I.G. MACRO V04.00 00:02:08 PAGE 7-2 110 003000 000024 .WORD 24 111 ; 112 003002 HEAD 205,FIRST,324,FIRST,DOUSE ; ***** FIRST 113 ; ADDRESS OF BEGINNING OF DISK BUFFER. 114 003014 000026 .WORD 26 115 ; 116 003016 HEAD 205,LIMIT,324,LIMIT,DOUSE ; ***** LIMIT 117 ; ADDRESS JUST BEYOND END OF DISK BUFFERS. 118 003030 000030 .WORD 30 119 ; 120 ; POSITIONS 32 AND 34 ARE AVAILABLE FOR EXPANSION. 121 ; THEY ARE INITIALIZED FROM BOOT-UP TABLE, AT COLD START. 122 ; 123 003032 HEAD 203,BLK,313,BLK,DOUSE ; ***** BLK 124 ; CURRENT DISK BLOCK BEING LOADED (0=TERMINAL) 125 003042 000036 .WORD 36 126 ; 127 003044 HEAD 202,IN,240,IN,DOUSE ; ***** IN 128 ; OFFSET IN TERMINAL INPUT BUFFER. 129 003054 000040 .WORD 40 130 ; 131 003056 HEAD 203,OUT,324,OUT,DOUSE ; ***** OUT 132 ; OFFSET IN OUTPUT LINE. 133 003066 000042 .WORD 42 134 ; 135 003070 HEAD 203,SCR,322,SCR,DOUSE ; ***** SCR 136 ; CURRENT FORTH DISK SCREEN. 137 003100 000044 .WORD 44 138 ; 139 003102 HEAD 206,OFFSET,240,OFSET,DOUSE ; ***** OFFSET 140 ; OFFSET TO GET TO ANOTHER DISK DRIVE. 141 003116 000046 .WORD 46 142 ; 143 003120 HEAD 207,CONTEXT,324,CONT,DOUSE ; ***** CONTEXT 144 003134 000050 .WORD 50 145 ; 146 003136 HEAD 207,CURRENT,324,CURR,DOUSE ; ***** CURRENT 147 003152 000052 .WORD 52 148 ; 149 003154 HEAD 205,STATE,305,STATE,DOUSE ; ***** STATE 150 003166 000054 .WORD 54 151 ; 152 003170 HEAD 204,BASE,240,BASE,DOUSE ; ***** BASE 153 003202 000056 .WORD 56 154 ; 155 003204 HEAD 203,DPL,314,DPL,DOUSE ; ***** DPL 156 ; OFFSET OF DECIMAL POINT AFTER DOUBLE-INTEGER INPUT. 157 003214 000060 .WORD 60 158 ; 159 003216 HEAD 203,FLD,304,FLD,DOUSE ; ***** FLD 160 ; OUTPUT FIELD WIDTH. 161 003226 000062 .WORD 62 162 ; 163 003230 HEAD 203,CSP,320,CSP,DOUSE ; ***** CSP 164 ; USED BY COMPILER TO HOLD CURRENT STACK POSITION, 165 ; FOR ERROR CHECKING. 166 003240 000064 .WORD 64 F.I.G. MACRO V04.00 00:02:08 PAGE 7-3 167 ; 168 003242 HEAD 202,R#,240,RNUM,DOUSE ; ***** R# 169 ; CURSOR POSITION (FOR SOME EDITORS). 170 003252 000066 .WORD 66 171 ; 172 003254 HEAD 203,HLD,304,HLD,DOUSE ; ***** HLD 173 ; POINTS TO LAST CHARACTER HELD IN 'PAD' 174 003264 000070 .WORD 70 175 ; 176 003266 HEAD 203,USE,305,USE,DOUSE ; ***** USE 177 003276 000072 .WORD 72 178 ; 179 003300 HEAD 204,PREV,240,PREV,DOUSE ; ***** PREV 180 003312 000074 .WORD 74 181 ; 182 ; 183 ; END OF USER AREA 184 ; 185 ; 186 003314 HEAD 202,1+,240,ONEP ; ***** 1+ 187 003324 005215 INC (S) 188 003326 NEXT 189 ; 190 003332 HEAD 202,2+,240,TWOP ; ***** 2+ 191 003342 062715 000002 ADD #2,(S) 192 003346 NEXT 193 ; 194 003352 HEAD 204,HERE,240,HERE,DOCOL ; ***** HERE 195 003364 002756' 002176' 001446' .WORD DP,AT,SEMIS 196 ; 197 003372 HEAD 205,ALLOT,324,ALLOT,DOCOL ; ***** ALLOT 198 003404 002756' 002072' 001446' .WORD DP,PSTOR,SEMIS 199 ; 200 003412 HEAD 201,<,>,254,COMMA,DOCOL ; ***** , 201 003420 003362' 002242' 002530' .WORD HERE,STORE,TWO,ALLOT,SEMIS 003426 003402' 001446' 202 ; 203 ; THIS SYSTEM DOES NOT USE 'C,' 204 ; 205 003432 HEAD 201,-,255,SUB ; ***** - 206 003440 162515 SUB (S)+,(S) 207 003442 NEXT 208 ; 209 003446 HEAD 201,=,275,EQUAL ; ***** = 210 003454 026525 000002 CMP 2(S),(S)+ 211 003460 001402 BEQ 1$ 212 003462 005015 CLR (S) 213 003464 000402 BR 2$ 214 003466 012715 000001 1$: MOV #1,(S) 215 003472 2$: NEXT 216 ; 217 003476 HEAD 201,^//,276,GREAT ; ***** > 226 003534 026525 000002 CMP 2(S),(S)+ 227 003540 003002 BGT 1$ 228 003542 005015 CLR (S) 229 003544 000402 BR 2$ 230 003546 012715 000001 1$: MOV #1,(S) 231 003552 2$: NEXT 232 ; 233 003556 HEAD 203,ROT,324,ROT ; ***** ROT 234 003566 011500 MOV (S),R0 235 003570 016515 000004 MOV 4(S),(S) 236 003574 016565 000002 000004 MOV 2(S),4(S) 237 003602 010065 000002 MOV R0,2(S) 238 003606 NEXT 239 ; 240 003612 HEAD 205,SPACE,305,SPACE,DOCOL ; ***** SPACE 241 003624 000060' 000040 001020' .WORD LIT,40,EMIT,SEMIS 003632 001446' 242 ; 243 003634 HEAD 204,-DUP,240,DDUP ; ***** -DUP 244 003646 005715 TST (S) 245 003650 001401 BEQ 1$ 246 003652 011545 MOV (S),-(S) 247 003654 1$: NEXT 248 ; 249 003660 HEAD 210,TRAVERSE,240,TRAV,DOCOL ; ***** TRAVERSE 250 ; MOVE (FORWARDS OR BACKWARDS) ACROSS A (VARIABLE LENGTH) 251 ; DICTIONARY NAME FIELD. 252 003676 002026' .WORD SWAP 253 003700 001762' 001634' 000060' XXN1: .WORD OVER,PLUS,LIT,177,OVER,CAT,LESS,ZBRAN,XXN1-. 003706 000177 001762' 002216' 003714 003502' 000144' 177760 254 003722 002026' 002004' 001446' .WORD SWAP,DROP,SEMIS 255 ; 256 003730 HEAD 206,LATEST,240,LATES,DOCOL ; ***** LATEST 257 003744 003150' 002176' 002176' .WORD CURR,AT,AT,SEMIS 003752 001446' 258 ; 259 ; THE NEXT 4 OPERATORS CAN DEPEND ON COMPUTER WORD SIZE. 260 ; THEY CONVERT ADDRESSES WITHIN THE NAME FIELDS OF FORTH 261 ; DICTIONARY ENTRIES. 262 ; 263 003754 HEAD 203,LFA,301,LFA,DOCOL ; ***** LFA 264 003764 000060' 000004 003436' .WORD LIT,4,SUB,SEMIS 003772 001446' 265 ; 266 003774 HEAD 203,CFA,301,CFA,DOCOL ; ***** CFA 267 004004 002530' 003436' 001446' .WORD TWO,SUB,SEMIS 268 ; 269 004012 HEAD 203,NFA,301,NFA,DOCOL ; ***** NFA 270 004022 000060' 000005 003436' .WORD LIT,5,SUB,LIT,-1,TRAV,SEMIS 004030 000060' 177777 003674' 004036 001446' 271 ; 272 004040 HEAD 203,PFA,301,PFA,DOCOL ; ***** PFA F.I.G. MACRO V04.00 00:02:08 PAGE 7-5 273 004050 002520' 003674' 000060' .WORD ONE,TRAV,LIT,5,PLUS,SEMIS 004056 000005 001634' 001446' 274 ; 275 ; THE NEXT 7 OPERATIONS ARE USED BY THE COMPILER, FOR 276 ; COMPILE-TIME SYNTAX-ERROR CHECKS. 277 ; 278 004064 HEAD 204,!CSP,240,SCSP,DOCOL ; ***** !CSP 279 004076 001366' 003236' 002242' .WORD SPAT,CSP,STORE,SEMIS 004104 001446' 280 ; 281 004106 HEAD 206,?ERROR,240,QERR,DOCOL ; ***** ?ERROR 282 004122 002026' 000144' 000010 .WORD SWAP,ZBRAN,XXN2-.,ERROR,BRAN,XXN3-. 004130 006530' 000122' 000004 283 004136 002004' XXN2: .WORD DROP 284 004140 001446' XXN3: .WORD SEMIS 285 ; 286 004142 HEAD 205,?COMP,320,QCOMP,DOCOL ; ***** ?COMP 287 004154 003164' 002176' 001556' .WORD STATE,AT,ZEQU,LIT,21,QERR,SEMIS 004162 000060' 000021 004120' 004170 001446' 288 ; 289 004172 HEAD 205,?EXEC,303,QEXEC,DOCOL ; ***** ?EXEC 290 004204 003164' 002176' 000060' .WORD STATE,AT,LIT,22,QERR,SEMIS 004212 000022 004120' 001446' 291 ; 292 004220 HEAD 206,?PAIRS,240,QPAIR,DOCOL ; ***** ?PAIRS 293 004234 003436' 000060' 000023 .WORD SUB,LIT,23,QERR,SEMIS 004242 004120' 001446' 294 ; 295 004246 HEAD 204,?CSP,240,QCSP,DOCOL ; ***** ?CSP 296 004260 001366' 003236' 002176' .WORD SPAT,CSP,AT,SUB,LIT,24,QERR,SEMIS 004266 003436' 000060' 000024 004274 004120' 001446' 297 ; 298 004300 HEAD 210,?LOADING,240,QLOAD,DOCOL ; ***** ?LOADING 299 004316 003040' 002176' 001556' .WORD BLK,AT,ZEQU,LIT,26,QERR,SEMIS 004324 000060' 000026 004120' 004332 001446' 300 ; 301 004334 HEAD 207,COMPILE,305,COMP,DOCOL ; ***** COMPILE 302 ; COMPILE THE EXECUTION ADDRESS FOLLOWING. 303 004350 004152' 001524' 002054' .WORD QCOMP,FROMR,DUP,TWOP,TOR,AT,COMMA,SEMIS 004356 003340' 001506' 002176' 004364 003416' 001446' 304 ; 305 004370 HEAD 301,[,333,LBRAC,DOCOL ; ***** [ 306 ; STOP COMPILATION, ENTER EXECUTION STATE. 307 004376 002510' 003164' 002242' .WORD ZERO,STATE,STORE,SEMIS 004404 001446' 308 ; 309 004406 HEAD 201,],335,RBRAC,DOCOL ; ***** ] 310 ; ENTER COMPILATION STATE. 311 004414 000060' 000300 003164' .WORD LIT,300,STATE,STORE,SEMIS 004422 002242' 001446' 312 ; 313 004426 HEAD 206,SMUDGE,240,SMUDG,DOCOL ; ***** SMUDGE 314 ; ALTER LATEST WORD NAME (SO THAT DICTIONARY SEARCH F.I.G. MACRO V04.00 00:02:08 PAGE 7-6 315 ; WON'T FIND A PARTIALLY-COMPLETE ENTRY. 316 004442 003742' 000060' 000040 .WORD LATES,LIT,40,TOGGL,SEMIS 004450 002124' 001446' 317 ; 318 004454 HEAD 203,HEX,330,HEX,DOCOL ; ***** HEX 319 004464 000060' 000020 003200' .WORD LIT,20,BASE,STORE,SEMIS 004472 002242' 001446' 320 ; 321 004476 HEAD 207,DECIMAL,314,DEC,DOCOL ; ***** DECIMAL 322 004512 000060' 000012 003200' .WORD LIT,12,BASE,STORE,SEMIS 004520 002242' 001446' 323 ; 324 004524 HEAD 205,OCTAL,314,OCTAL,DOCOL ; ***** OCTAL 325 004536 000060' 000010 003200' .WORD LIT,10,BASE,STORE,SEMIS 004544 002242' 001446' 326 ; 327 004550 HEAD 207,<(;CODE)>,251,PSCOD,DOCOL ; ***** (;CODE) 328 ; USED ONLY BY COMPILER; COMPILED BY ';CODE'. 329 004564 001524' 003742' 004046' .WORD FROMR,LATES,PFA,CFA,STORE,SEMIS 004572 004002' 002242' 001446' 330 ; 331 ; 332 ; ***** THE DEFINITION OF ';CODE' WAS MOVED TO THE END OF 333 ; THE DICTIONARY, BECAUSE IT IS NOT PURE CODE (IT IS PATCHED 334 ; WHEN A FORTH ASSEMBLER IS LOADED). 335 336 ; 337 004600 HEAD 207,^/,276,DOES,DOCOL ; ***** DOES> 342 004634 001524' 003742' 004046' .WORD FROMR,LATES,PFA,STORE,PSCOD 004642 002242' 004562' 343 004646 010446 DODOE: MOV IP,-(RP) 344 004650 012204 MOV (W)+,IP 345 004652 010245 MOV W,-(S) 346 004654 NEXT 347 ; 348 004660 HEAD 205,COUNT,324,COUNT,DOCOL ; ***** COUNT 349 ; CONVERT STRING TO THE FORMAT USED BY 'TYPE'. 350 004672 002054' 003322' 002026' .WORD DUP,ONEP,SWAP,CAT,SEMIS 004700 002216' 001446' 351 ; 352 004704 HEAD 204,TYPE,240,TYPE,DOCOL ; ***** TYPE 353 004716 003644' 000144' 000030 .WORD DDUP,ZBRAN,XXL2-.,OVER,PLUS,SWAP,XDO 004724 001762' 001634' 002026' 004732 000334' 354 004734 000360' 002216' 001020' XXL1: .WORD I,CAT,EMIT,XLOOP,XXL1-.,BRAN,XXL3-. 004742 000202' 177770 000122' 004750 000004 355 004752 002004' XXL2: .WORD DROP 356 004754 001446' XXL3: .WORD SEMIS 357 ; 358 004756 HEAD 206,=CELLS,240,ECELL,DOCOL ; ***** =CELLS 359 ; NOTE - I NEED THIS, TO FORCE EVEN ADDRESS. 360 004772 002054' 002520' 001302' .WORD DUP,ONE,AND,PLUS,SEMIS F.I.G. MACRO V04.00 00:02:08 PAGE 7-7 005000 001634' 001446' 361 ; 362 005004 HEAD 211,-TRAILING,307,DTRAI,DOCOL ; ***** -TRAILING 363 005022 002054' 002510' 000334' .WORD DUP,ZERO,XDO 364 005030 001762' 001762' 001634' XXW6: .WORD OVER,OVER,PLUS,ONE,SUB,CAT 005036 002520' 003436' 002216' 365 005044 002552' 003436' 000144' .WORD BL,SUB,ZBRAN,XXW7-.,LEAVE,BRAN,XXWA-. 005052 000010 001466' 000122' 005060 000006 366 005062 002520' 003436' XXW7: .WORD ONE,SUB 367 005066 000202' 177740 001446' XXWA: .WORD XLOOP,XXW6-.,SEMIS 368 ; 369 005074 HEAD 204,(."),240,PDOTQ,DOCOL ; ***** (.") 370 ; USED ONLY BY COMPILER. COMPILED BY '."' 371 005106 001540' 004670' 002054' .WORD R,COUNT,DUP,ONEP,ECELL 005114 003322' 004770' 372 005120 001524' 001634' 001506' .WORD FROMR,PLUS,TOR,TYPE,SEMIS 005126 004714' 001446' 373 ; 374 005132 HEAD 302,.",240,DOTQ,DOCOL ; ***** ." 375 ; TYPE ASCII MESSAGE. 376 005142 000060' 000042 003164' .WORD LIT,34.,STATE,AT,ZBRAN,XXL6-. 005150 002176' 000144' 000026 377 005156 004346' 005104' 005750' .WORD COMP,PDOTQ,WORD,HERE,CAT,ONEP,ECELL 005164 003362' 002216' 003322' 005172 004770' 378 005174 003402' 000122' 000012 .WORD ALLOT,BRAN,XXL7-. 379 005202 005750' 003362' 004670' XXL6: .WORD WORD,HERE,COUNT,TYPE 005210 004714' 380 005212 001446' XXL7: .WORD SEMIS 381 ; 382 005214 HEAD 206,?ALIGN,240,QALIG,DOCOL ; ***** ?ALIGN 383 005230 003362' 002520' 001302' .WORD HERE,ONE,AND,ALLOT,SEMIS 005236 003402' 001446' 384 ; 385 005242 HEAD 206,EXPECT,240,EXPEC,DOCOL ; ***** EXPECT 386 ; READ N CHARACTERS TO MEMORY (AND TERMINATE WITH NULLS). 387 ; ( ADDRESS N ==>). 388 005256 001762' 001634' 001762' .WORD OVER,PLUS,OVER,XDO 005264 000334' 389 005266 001030' 002054' 000060' XXK1: .WORD KEY,DUP,LIT,16,PORIG,AT,EQUAL,ZBRAN,XXK2-. 005274 000016 002632' 002176' 005302 003452' 000144' 000040 390 005310 002004' 000060' 000010 .WORD DROP,LIT,10,OVER,I,EQUAL,DUP,FROMR 005316 001762' 000360' 003452' 005324 002054' 001524' 391 005330 002530' 003436' 001634' .WORD TWO,SUB,PLUS,TOR,SUB,BRAN,XXK3-. 005336 001506' 003436' 000122' 005344 000060 392 005346 002054' 000060' 000015 XXK2: .WORD DUP,LIT,15,EQUAL,ZBRAN,XXK4-. 005354 003452' 000144' 000016 393 005362 001466' 002004' 002552' .WORD LEAVE,DROP,BL,ZERO,BRAN,XXK5-. 005370 002510' 000122' 000004 394 005376 002054' XXK4: .WORD DUP 395 005400 000360' 002270' 002510' XXK5: .WORD I,CSTOR,ZERO,I,ONEP,CSTOR,ZERO,I,TWOP,CSTOR 005406 000360' 003322' 002270' 005414 002510' 000360' 003340' F.I.G. MACRO V04.00 00:02:08 PAGE 7-8 005422 002270' 396 ; NOTE DIFFERENCE FOR STAND-ALONE, BELOW 397 .IFDF ALONE 398 005424 001020' 000202' 177636 XXK3: .WORD EMIT,XLOOP,XXK1-.,DROP,SEMIS 005432 002004' 001446' 399 .IFF 400 XXK3: .WORD DROP,XLOOP,XXK1-.,DROP,SEMIS 401 .ENDC 402 ; 403 005436 HEAD 205,QUERY,331,QUERY,DOCOL ; ***** QUERY 404 005450 002676' 002176' 000060' .WORD TIB,AT,LIT,120,EXPEC,ZERO,IN,STORE,SEMIS 005456 000120 005254' 002510' 005464 003052' 002242' 001446' 405 ; 406 005472 HEAD 301,X,200,NULL,DOCOL ; ***** THE NULL 407 ; THE NULL OPERATION (ASCII 0) STOPS INTERPRETATION/COMPILATION 408 ; AT END OF A TERMINAL INPUT LINE, OR A DISK SCREEN. ALL DISK 409 ; BUFFERS MUST TERMINATE WITH NULLS, AND 'EXPECT' PLACES NULLS 410 ; AFTER EACH TERMINAL INPUT LINE. 411 ; NOTE THAT THE 'X' IN THE HEADER ABOVE WILL BE CHANGED TO A NULL. 412 005500 003040' 002176' .WORD BLK,AT 413 005504 000144' 000046 002520' .WORD ZBRAN,XXJ2-.,ONE,BLK,PSTOR,ZERO,IN,STORE 005512 003040' 002072' 002510' 005520 003052' 002242' 414 005524 003040' 002176' 002614' .WORD BLK,AT,BSCR,MOD,ZEQU,ZBRAN,XXJ1-.,QEXEC,FROMR,DROP 005532 010536' 001556' 000144' 005540 000010 004202' 001524' 005546 002004' 415 005550 000122' 000006 XXJ1: .WORD BRAN,XXJ4-. 416 005554 001524' 002004' XXJ2: .WORD FROMR,DROP 417 005560 001446' XXJ4: .WORD SEMIS 418 ; 419 005562 HEAD 204,FILL,240,FILL,DOCOL ; ***** FILL 420 005574 002026' 001506' 001762' .WORD SWAP,TOR,OVER,CSTOR,DUP,ONEP,FROMR 005602 002270' 002054' 003322' 005610 001524' 421 005612 002520' 003436' 001070' .WORD ONE,SUB,CMOVE,SEMIS 005620 001446' 422 ; 423 005622 HEAD 205,ERASE,305,ERASE,DOCOL ; ***** ERASE 424 005634 002510' 005572' 001446' .WORD ZERO,FILL,SEMIS 425 ; 426 005642 HEAD 206,BLANKS,240,BLANK,DOCOL ; ***** BLANKS 427 005656 002552' 005572' 001446' .WORD BL,FILL,SEMIS 428 ; 429 005664 HEAD 204,HOLD,240,HOLD,DOCOL ; ***** HOLD 430 005676 000060' 177777 003262' .WORD LIT,-1,HLD,PSTOR,HLD,AT,CSTOR,SEMIS 005704 002072' 003262' 002176' 005712 002270' 001446' 431 ; 432 005716 HEAD 203,PAD,304,PAD,DOCOL ; ***** PAD 433 005726 003362' 000060' 000104 .WORD HERE,LIT,104,PLUS,SEMIS 005734 001634' 001446' 434 ; 435 005740 HEAD 204,WORD,240,WORD,DOCOL ; ***** WORD 436 005752 003040' 002176' 000144' .WORD BLK,AT,ZBRAN,XXI1-.,BLK,AT,BLOCK,BRAN,XXI2-. 005760 000014 003040' 002176' F.I.G. MACRO V04.00 00:02:08 PAGE 7-9 005766 011316' 000122' 000006 437 005774 002676' 002176' XXI1: .WORD TIB,AT 438 006000 003052' 002176' 001634' XXI2: .WORD IN,AT,PLUS,SWAP,ENCL,HERE,LIT,42,BLANK,IN 006006 002026' 000676' 003362' 006014 000060' 000042 005654' 006022 003052' 439 006024 002072' 001762' 003436' .WORD PSTOR,OVER,SUB,TOR,R,HERE,CSTOR,PLUS 006032 001506' 001540' 003362' 006040 002270' 001634' 440 006044 003362' 003322' 001524' .WORD HERE,ONEP,FROMR,CMOVE,SEMIS 006052 001070' 001446' 441 ; 442 ; 443 006056 HEAD 210,(NUMBER),240,PNUMB,DOCOL ; ***** (NUMBER) 444 006074 003322' 002054' 001506' XXF3: .WORD ONEP,DUP,TOR,CAT,BASE,AT,DIGIT 006102 002216' 003200' 002176' 006110 000400' 445 006112 000144' 000054 002026' .WORD ZBRAN,XXG4-.,SWAP,BASE,AT,USTAR,DROP 006120 003200' 002176' 001132' 006126 002004' 446 006130 003564' 003200' 002176' .WORD ROT,BASE,AT,USTAR,DPLUS 006136 001132' 001652' 447 006142 003212' 002176' 003322' .WORD DPL,AT,ONEP,ZBRAN,XXG5-.,ONE,DPL,PSTOR 006150 000144' 000010 002520' 006156 003212' 002072' 448 006162 001524' 000122' 177706 XXG5: .WORD FROMR,BRAN,XXF3-. 449 006170 001524' 001446' XXG4: .WORD FROMR,SEMIS 450 ; 451 006174 HEAD 206,NUMBER,240,NUMB,DOCOL ; ***** NUMBER 452 006210 002510' 002510' 003564' .WORD ZERO,ZERO,ROT,DUP,ONEP,CAT,LIT,55,EQUAL 006216 002054' 003322' 002216' 006224 000060' 000055 003452' 453 006232 002054' 001506' 001634' .WORD DUP,TOR,PLUS,LIT,-1 006240 000060' 177777 454 006244 003212' 002242' 006072' XXF6: .WORD DPL,STORE,PNUMB,DUP,CAT,BL,SUB 006252 002054' 002216' 002552' 006260 003436' 455 006262 000144' 000026 002054' .WORD ZBRAN,XXF7-.,DUP,CAT,LIT,56,SUB 006270 002216' 000060' 000056 006276 003436' 456 006300 002510' 004120' 002510' .WORD ZERO,QERR,ZERO,BRAN,XXF6-. 006306 000122' 177734 457 006312 002004' 001524' 000144' XXF7: .WORD DROP,FROMR,ZBRAN,XXFA-.,DMINU 006320 000004 001734' 458 006324 001446' XXFA: .WORD SEMIS 459 ; 460 006326 HEAD 205,-FIND,304,DFIND,DOCOL ; ***** -FIND 461 006340 002552' 005750' 003362' .WORD BL,WORD,HERE,COUNT,UPPER,HERE,CONT,AT,AT,PFIND 006346 004670' 006416' 003362' 006354 003132' 002176' 002176' 006362 000506' 462 006364 002054' 001556' 000144' .WORD DUP,ZEQU,ZBRAN,XXE3-.,DROP,HERE,LATES,PFIND 006372 000012 002004' 003362' 006400 003742' 000506' 463 006404 001446' XXE3: .WORD SEMIS 464 ; 465 006406 HEAD 205,UPPER,322,UPPER,DOCOL ; ***** UPPER F.I.G. MACRO V04.00 00:02:08 PAGE 7-10 466 ; SETS STRINGS TO UPPER CASE - TO ALLOW 467 ; LOWER AS WELL AS UPPER CASE FROM TERMINAL. 468 006420 001762' 001634' 002026' .WORD OVER,PLUS,SWAP,XDO 006426 000334' 469 006430 000360' 002216' 000060' XXE2: .WORD I,CAT,LIT,140,GREAT,I,CAT,LIT,173,LESS 006436 000140 003532' 000360' 006444 002216' 000060' 000173 006452 003502' 470 006454 001302' 000144' 000012 .WORD AND,ZBRAN,XXE1-.,I,LIT,40,TOGGL 006462 000360' 000060' 000040 006470 002124' 471 006472 000202' 177734 001446' XXE1: .WORD XLOOP,XXE2-.,SEMIS 472 ; 473 006500 HEAD 207,(ABORT),251,PABOR,DOCOL ; ***** (ABORT) 474 006514 007652' 001446' .WORD ABORT,SEMIS 475 ; 476 006520 HEAD 205,ERROR,322,ERROR,DOCOL ; ***** ERROR 477 006532 002730' 002176' 001606' .WORD WARN,AT,ZLESS,ZBRAN,XXN4-.,PABOR 006540 000144' 000004 006512' 478 006546 003362' 004670' 004714' XXN4: .WORD HERE,COUNT,TYPE,PDOTQ 006554 005104' 479 006556 003 .BYTE 3 480 006557 040 077 040 .ASCII / ? / 481 .EVEN 482 006562 011552' 001406' 003052' .WORD MESS,SPSTO,IN,AT,BLK,AT,QUIT,SEMIS 006570 002176' 003040' 002176' 006576 007574' 001446' 483 ; 484 006602 HEAD 203,ID.,256,IDDOT,DOCOL ; ***** ID. 485 006612 005724' 000060' 000040 .WORD PAD,LIT,40,LIT,137,FILL,DUP 006620 000060' 000137 005572' 006626 002054' 486 006630 004046' 003762' 001762' .WORD PFA,LFA,OVER,SUB,PAD,SWAP,CMOVE 006636 003436' 005724' 002026' 006644 001070' 487 006646 005724' 004670' 000060' .WORD PAD,COUNT,LIT,37,AND,TYPE,SPACE,SEMIS 006654 000037 001302' 004714' 006662 003622' 001446' 488 ; 489 006666 HEAD 206,CREATE,240,CREAT,DOCOL ; ***** CREATE 490 006702 006336' 000144' 000020 .WORD DFIND,ZBRAN,XXD2-.,DROP,NFA,IDDOT 006710 002004' 004020' 006610' 491 006716 000060' 000004 011552' .WORD LIT,4,MESS,SPACE 006724 003622' 492 006726 003362' 002054' 002216' XXD2: .WORD HERE,DUP,CAT,WIDTH,AT,MIN,ONEP,ALLOT 006734 002712' 002176' 010210' 006742 003322' 003402' 493 006746 005226' 002054' 000060' .WORD QALIG,DUP,LIT,240,TOGGL,HERE,ONE,SUB 006754 000240 002124' 003362' 006762 002520' 003436' 494 006766 000060' 000200 002124' .WORD LIT,200,TOGGL,LATES,COMMA,CURR,AT,STORE 006774 003742' 003416' 003150' 007002 002176' 002242' 495 007006 003362' 003340' 003416' .WORD HERE,TWOP,COMMA,SEMIS 007014 001446' 496 ; 497 007016 HEAD 311,[COMPILE],335,BCOMP,DOCOL ; ***** [COMPILE] F.I.G. MACRO V04.00 00:02:08 PAGE 7-11 498 007034 006336' 001556' 002510' .WORD DFIND,ZEQU,ZERO,QERR,DROP,CFA,COMMA,SEMIS 007042 004120' 002004' 004002' 007050 003416' 001446' 499 ; 500 007054 HEAD 307,LITERAL,314,LITER,DOCOL ; ***** LITERAL 501 007070 003164' 002176' 000144' .WORD STATE,AT,ZBRAN,XXD6-.,COMP,LIT,COMMA 007076 000010 004346' 000060' 007104 003416' 502 007106 001446' XXD6: .WORD SEMIS 503 ; 504 007110 HEAD 310,DLITERAL,240,DLITE,DOCOL ; ***** DLITERAL 505 007126 003164' 002176' 000144' .WORD STATE,AT,ZBRAN,XXN5-.,SWAP,LITER,LITER 007134 000010 002026' 007066' 007142 007066' 506 007144 001446' XXN5: .WORD SEMIS 507 ; 508 007146 HEAD 202,U<,240,ULESS,DOCOL ; ***** U< 509 ; UNSIGNED LESS-THAN, NEEDED FOR '?STACK' 510 ; : U< >R 0 R> 0 DMINUS D+ SWAP DROP 0< ; 511 007156 001506' 002510' 001524' .WORD TOR,ZERO,FROMR,ZERO,DMINU,DPLUS 007164 002510' 001734' 001652' 512 007172 002026' 002004' 001606' .WORD SWAP,DROP,ZLESS,SEMIS 007200 001446' 513 ; 514 007202 HEAD 206,?STACK,240,QSTAC,DOCOL ; ***** ?STACK 515 ; ERROR CHECK. 516 007216 002652' 002176' 002530' .WORD SZERO,AT,TWO,SUB,SPAT,ULESS,ONE,QERR 007224 003436' 001366' 007154' 007232 002520' 004120' 517 007236 001366' 003362' 000060' .WORD SPAT,HERE,LIT,200,PLUS,ULESS,TWO,QERR 007244 000200 001634' 007154' 007252 002530' 004120' 518 007256 001446' .WORD SEMIS 519 ; 520 007260 HEAD 211,INTERPRET,324,INTER,DOCOL ; ***** INTERPRET 521 007276 006336' XXE4: .WORD DFIND 522 007300 000144' 000036 003164' .WORD ZBRAN,XXEA-.,STATE,AT,LESS 007306 002176' 003502' 523 007312 000144' 000012 004002' .WORD ZBRAN,XXE5-.,CFA,COMMA,BRAN,XXE6-. 007320 003416' 000122' 000006 524 007326 004002' 000102' XXE5: .WORD CFA,EXEC 525 007332 007214' 000122' 000034 XXE6: .WORD QSTAC,BRAN,XXE7-. 526 007340 003362' 006206' 003212' XXEA: .WORD HERE,NUMB,DPL,AT,ONEP,ZBRAN,XXF4-.,DLITE,BRAN,XXF5-. 007346 002176' 003322' 000144' 007354 000010 007124' 000122' 007362 000006 527 007364 002004' 007066' XXF4: .WORD DROP,LITER 528 007370 007214' XXF5: .WORD QSTAC 529 007372 000122' 177702 XXE7: .WORD BRAN,XXE4-. 530 ; 531 007376 HEAD 211,IMMEDIATE,305,IMMED,DOCOL ; ***** IMMEDIATE 532 007414 003742' 000060' 000100 .WORD LATES,LIT,100,TOGGL,SEMIS 007422 002124' 001446' 533 ; 534 007426 HEAD 212,VOCABULARY,240,VOCAB,DOCOL ; ***** VOCABULARY 535 007446 004612' 000060' 120201 .WORD BUILD,LIT,120201,COMMA,CURR,AT,CFA,COMMA 007454 003416' 003150' 002176' F.I.G. MACRO V04.00 00:02:08 PAGE 7-12 007462 004002' 003416' 536 007466 003362' 002776' 002176' .WORD HERE,VOCL,AT,COMMA,VOCL,STORE,DOES 007474 003416' 002776' 002242' 007502 004632' 537 007504 003340' 003132' 002242' DOVOC: .WORD TWOP,CONT,STORE,SEMIS 007512 001446' 538 ; 539 ; 540 ; ***** THE DEFINITION OF 'FORTH' WAS MOVED TO NEAR THE END OF THE 541 ; DICTIONARY, BECAUSE IT IS NOT PURE CODE. 542 ; 543 ; 544 007514 HEAD 213,DEFINITIONS,323,DEFIN,DOCOL ; ***** DEFINITIONS 545 007534 003132' 002176' 003150' .WORD CONT,AT,CURR,STORE,SEMIS 007542 002242' 001446' 546 ; 547 007546 HEAD 301,(,250,PAREN,DOCOL ; ***** ( 548 007554 000060' 000051 005750' .WORD LIT,51,WORD,SEMIS 007562 001446' 549 ; 550 007564 HEAD 204,QUIT,240,QUIT,DOCOL ; ***** QUIT 551 007576 002510' 003040' 002242' .WORD ZERO,BLK,STORE,LBRAC 007604 004374' 552 007606 001426' 001056' 005446' XXB1: .WORD RPSTO,CR,QUERY,INTER,STATE,AT 007614 007274' 003164' 002176' 553 007622 001556' 000144' 000010 .WORD ZEQU,ZBRAN,XXB2-.,PDOTQ 007630 005104' 554 007632 003 .BYTE 3 555 007633 040 117 113 .ASCII / OK/ 556 .EVEN 557 007636 000122' 177746 XXB2: .WORD BRAN,XXB1-. 558 ; 559 007642 HEAD 205,ABORT,324,ABORT,DOCOL ; ***** ABORT 560 007654 001406' 004510' 003622' .WORD SPSTO,DEC,SPACE 561 007662 001056' 005104' .WORD CR,PDOTQ 562 007666 023 .BYTE 23 563 007667 106 111 107 .ASCII /FIG-FORTH V 1.3.1 / 007672 055 106 117 007675 122 124 110 007700 040 040 126 007703 040 061 056 007706 063 056 061 007711 040 564 .EVEN 565 007712 015406' 007532' 007574' .WORD FORTH,DEFIN,QUIT 566 ; 567 ; COLD AND WARM STARTS 568 ; 569 007720 HEAD 204,COLD,240,COLD ; ***** COLD 570 007732 CENT: ; COLD START ENTRY POINT 571 007732 016767 170056 005454 MOV ORIGIN+14,FORTH+6 ; SET 'FORTH' VOCABULARY FROM STARTUP TABLE 572 007740 016703 170054 MOV ORIGIN+20,U ; INITIALIZE USER POINTER 573 ; NOTE - FOR SMALLER STAND-ALONE BOOT, INITIALIZE AREAS IN 574 ; HIGH MEMORY WHICH MUST BE INITIALIZED. 575 ; CLEAR DISK BUFFERS ON FIRST TIME THROUGH 576 007744 016700 170072 MOV ORIGIN+42,R0 ; 'FIRST' - BEGINNING OF DISK BUFFERS 577 007750 016701 170070 MOV ORIGIN+44,R1 ; 'LIMIT' - JUST BEYOND DISK BUFFERS F.I.G. MACRO V04.00 00:02:08 PAGE 7-13 578 007754 005020 1$: CLR (R0)+ 579 007756 020001 CMP R0,R1 580 007760 002775 BLT 1$ 581 ; NOW INITIALIZE 'OUT', 'OFFSET', 'USE' AND 'PREV' 582 007762 005063 000042 CLR 42(U) ; CLEAR 'OUT' 583 007766 005063 000046 CLR 46(U) ; CLEAR 'OFFSET' 584 007772 016763 170044 000072 MOV ORIGIN+42,72(U) ; TO 'USE' 585 010000 016763 170036 000074 MOV ORIGIN+42,74(U) ; TO 'PREV' 586 ; END OF SPECIAL HIGH-MEMORY INITIALIZE 587 010006 012701 000030 MOV #30,R1 ; ON COLD START, MOVE 24. BYTES 588 010012 000402 BR W2 589 010014 WENT: ; WARM START ENTRY POINT 590 010014 012701 000012 MOV #12,R1 ; ON WARM START, MOVE TEN BYTES 591 010020 012705 000022' W2: MOV #ORIGIN+22,R5 ; START MOVING FROM HERE 592 010024 016700 167770 MOV ORIGIN+20,R0 ; MOVE TO THE USER AREA 593 010030 062700 000006 ADD #6,R0 ; PLUS 6 594 010034 060501 ADD R5,R1 ; COMPUTE LOOP STOP ADDRESS 595 010036 012520 1$: MOV (R5)+,(R0)+ 596 010040 020501 CMP R5,R1 597 010042 002775 BLT 1$ 598 010044 016706 167754 MOV ORIGIN+24,RP ; INITIALIZE THE RETURN-STACK POINTER 599 ; NOW SET FORTH'S INSTRUCTION COUNTER, AND GO 600 010050 012704 010060' MOV #GO,IP ; START EXECUTION WITH 'ABORT' 601 010054 NEXT 602 ; NOTE - NORMALLY THE ABOVE INSTRUCTION WOULD BE 'MOV #ABORT+2,IP'. 603 ; IT HAS BEEN CHANGED HERE TO ALLOW USER TO PATCH A DIFFERENT 604 ; START-UP. BUT THE SYSTEM WON'T WORK UNTIL SOME OF THE WORK 605 ; OF 'ABORT' HAS BEEN DONE, SO THAT WORK IS REPEATED. THE USER 606 ; CAN PATCH OVER THE 'ABORT' AND THE ZEROS. 607 ; 608 010060 001406' 004510' 015406' GO: .WORD SPSTO,DEC,FORTH,DEFIN,ABORT,0,0,0 010066 007532' 007652' 000000 010074 000000 000000 609 ; 610 ; 611 ; 612 ; 613 ; 614 010100 HEAD 204,S->D,240,STOD ; ***** S->D 615 010112 005045 CLR -(S) ; SIGN EXTEND WITH ZEROS 616 010114 005765 000002 TST 2(S) ; BUT IF NEGATIVE, 617 010120 100001 BPL 1$ 618 010122 005315 DEC (S) ; CHANGE THE ZEROS TO ONES 619 010124 1$: NEXT 620 ; 621 ; NOTE - THIS SYSTEM DOESN'T NEED THE OPERATIONS '+-' AND 'D+-', 622 ; BECAUSE 'M*' AND 'M/' ARE DEFINED IN CODE. 623 ; 624 010130 HEAD 203,ABS,323,ABS,DOCOL ; ***** ABS 625 010140 002054' 001606' 000144' .WORD DUP,ZLESS,ZBRAN,XXR5-.,MINUS 010146 000004 001712' 626 010152 001446' XXR5: .WORD SEMIS 627 ; 628 010154 HEAD 204,DABS,240,DABS,DOCOL ; ***** DABS 629 010166 002054' 001606' 000144' .WORD DUP,ZLESS,ZBRAN,XXRB-.,DMINU 010174 000004 001734' 630 010200 001446' XXRB: .WORD SEMIS F.I.G. MACRO V04.00 00:02:08 PAGE 7-14 631 ; 632 010202 HEAD 203,MIN,316,MIN,DOCOL ; ***** MIN 633 010212 001762' 001762' 003532' .WORD OVER,OVER,GREAT,ZBRAN,XXR7-.,SWAP 010220 000144' 000004 002026' 634 010226 002004' 001446' XXR7: .WORD DROP,SEMIS 635 ; 636 010232 HEAD 203,MAX,330,MAX,DOCOL ; ***** MAX 637 010242 001762' 001762' 003502' .WORD OVER,OVER,LESS,ZBRAN,XXR6-.,SWAP 010250 000144' 000004 002026' 638 010256 002004' 001446' XXR6: .WORD DROP,SEMIS 639 ; 640 010262 HEAD 202,M*,240,MSTAR ; ***** M* 641 .IFDF EIS ; HARDWARE MULTIPLY/DIVIDE? 642 MOV (S)+,R0 643 MUL (S),R0 644 MOV R1,(S) 645 MOV R0,-(S) 646 NEXT 647 .IFF 648 010272 016546 000002 MOV 2(S),-(RP) ; USE RETURN STACK FOR SAVING SIGN 649 010276 100002 BPL 1$ 650 010300 005465 000002 NEG 2(S) ; GET ABSOLUTE VALUE 651 010304 005715 1$: TST (S) 652 010306 100002 BPL 2$ 653 010310 005416 NEG (RP) ; ADJUST SIGN WHICH WAS SAVED 654 010312 005415 NEG (S) ; GET ABSOLUTE VALUE 655 010314 004767 170624 2$: JSR PC,UMULT 656 010320 005726 TST (RP)+ ; NEGATIVE RESULT? 657 010322 100007 BPL 3$ ; NO 658 ; IF GET HERE, NEGATE THE DOUBLE-INTEGER NUMBER ON THE STACK 659 010324 005115 COM (S) 660 010326 005165 000002 COM 2(S) 661 010332 062765 000001 000002 ADD #1,2(S) 662 010340 005515 ADC (S) 663 010342 3$: NEXT 664 .ENDC 665 ; 666 010346 HEAD 202,M/,240,MSLAS ; ***** M/ 667 .IFDF EIS ; HARDWARD MULTIPLY/DIVIDE? 668 MOV 2(S),R0 669 MOV 4(S),R1 670 DIV (S)+,R0 671 MOV R1,2(S) 672 MOV R0,(S) 673 NEXT 674 .IFF 675 010356 016546 000002 MOV 2(S),-(RP) ; SAVE DIVIDEND SIGN 676 010362 001001 BNE 5$ ; ZERO WOULDN'T INDICATE 677 010364 005216 INC (RP) ; A SIGN CHANGE. 678 010366 011646 5$: MOV (RP),-(RP) ; DUPLICATE IT 679 010370 100011 BPL 1$ 680 ; IF GET HERE, TAKE ABSOLUTE VALUE OF DOUBLE-INTEGER DIVIDEND. 681 010372 005165 000002 COM 2(S) 682 010376 005165 000004 COM 4(S) 683 010402 062765 000001 000004 ADD #1,4(S) 684 010410 005565 000002 ADC 2(S) 685 010414 005715 1$: TST (S) ; IS DIVISOR NEGATIVE? F.I.G. MACRO V04.00 00:02:08 PAGE 7-15 686 010416 100002 BPL 2$ 687 010420 005416 NEG (RP) ; IF YES, NEGATE QUOTIENT SIGN 688 010422 005415 NEG (S) ; AND TAKE ABS. VALUE OF DIVISOR 689 010424 004767 170576 2$: JSR PC,UDIV 690 010430 005726 TST (RP)+ ; NEGATIVE QUOTIENT? 691 010432 100001 BPL 3$ ; NO 692 010434 005415 NEG (S) ; NEGATE THE QUOTIENT 693 010436 005726 3$: TST (RP)+ ; NEGATIVE DIVIDEND? 694 010440 100002 BPL 4$ ; NEGATE THE REMAINDER 695 010442 005465 000002 NEG 2(S) 696 010446 4$: NEXT 697 .ENDC 698 ; 699 010452 HEAD 201,*,252,STAR,DOCOL ; ***** * 700 010460 010270' 002004' 001446' .WORD MSTAR,DROP,SEMIS 701 ; 702 010466 HEAD 204,/MOD,240,SLMOD,DOCOL ; ***** /MOD 703 010500 001506' 010110' 001524' .WORD TOR,STOD,FROMR,MSLAS,SEMIS 010506 010354' 001446' 704 ; 705 010512 HEAD 201,/,257,SLASH,DOCOL ; ***** / 706 010520 010476' 002026' 002004' .WORD SLMOD,SWAP,DROP,SEMIS 010526 001446' 707 ; 708 010530 HEAD 203,MOD,304,MOD,DOCOL ; ***** MOD 709 010540 010476' 002004' 001446' .WORD SLMOD,DROP,SEMIS 710 ; 711 010546 HEAD 205,*/MOD,304,SSMOD,DOCOL ; ***** */MOD 712 010560 001506' 010270' 001524' .WORD TOR,MSTAR,FROMR,MSLAS,SEMIS 010566 010354' 001446' 713 ; 714 010572 HEAD 202,*/,240,SSLA,DOCOL ; ***** */ 715 010602 010556' 002026' 002004' .WORD SSMOD,SWAP,DROP,SEMIS 010610 001446' 716 ; 717 010612 HEAD 205,M/MOD,304,MSMOD,DOCOL ; ***** M/MOD 718 010624 001506' 002510' 001540' .WORD TOR,ZERO,R,USLAS,FROMR 010632 001214' 001524' 719 010636 002026' 001506' 001214' .WORD SWAP,TOR,USLAS,FROMR,SEMIS 010644 001524' 001446' 720 ; 721 ; 722 ; 723 ; 724 ; F.I.G. MACRO V04.00 00:02:08 PAGE 8 1 ; **************************************************************** 2 ; 3 ; DISK I/O (SECTION COMMON TO ALL OPERATING SYSTEMS) 4 ; NOTE THAT EACH OPERATING SYSTEM DEFINED 'R/W' - READ 5 ; OR WRITE A 1024-BYTE RANDOM-ACCESS BLOCK. 6 ; 7 ; **************************************************************** 8 ; 9 ; 10 ; 'USE' AND 'PREV' MOVED TO USER AREA 11 ; 12 010650 HEAD 204,+BUF,240,PBUF,DOCOL ; ***** +BUF 13 010662 002600' 000060' 000004 .WORD BBUF,LIT,4,PLUS,PLUS,DUP,LIMIT,AT,EQUAL 010670 001634' 001634' 002054' 010676 003026' 002176' 003452' 14 010704 000144' 000010 002004' .WORD ZBRAN,XXT1-.,DROP,FIRST,AT 010712 003012' 002176' 15 010716 002054' 003310' 002176' XXT1: .WORD DUP,PREV,AT,SUB,SEMIS 010724 003436' 001446' 16 ; 17 010730 HEAD 206,UPDATE,240,UPDAT,DOCOL ; ***** UPDATE 18 010744 003310' 002176' 002176' .WORD PREV,AT,AT,LIT,100000,OR,PREV 010752 000060' 100000 001322' 010760 003310' 19 010762 002176' 002242' 001446' .WORD AT,STORE,SEMIS 20 ; 21 010770 HEAD 215,EMPTY-BUFFERS,323,MTBUF,DOCOL ; ***** EMPTY-BUFFERS 22 011012 003012' 002176' 003026' .WORD FIRST,AT,LIMIT,AT,OVER,SUB,ERASE,SEMIS 011020 002176' 001762' 003436' 011026 005632' 001446' 23 ; 24 011032 HEAD 205,FLUSH,310,FLUSH,DOCOL ; ***** FLUSH 25 ; SOME SYSTEMS DEFINE THIS IN THE EDITOR, NOT HERE. 26 011044 003026' 002176' 003012' .WORD LIMIT,AT,FIRST,AT,XDO 011052 002176' 000334' 27 011056 000360' 002176' 001606' XXTA: .WORD I,AT,ZLESS,ZBRAN,XXT7-.,I,TWOP,I,AT 011064 000144' 000024 000360' 011072 003340' 000360' 002176' 28 011100 000060' 077777 001302' .WORD LIT,77777,AND,ZERO,RW 011106 002510' 015202' 29 011112 002600' 000060' 000004 XXT7: .WORD BBUF,LIT,4,PLUS,XPLOO,XXTA-.,MTBUF,SEMIS 011120 001634' 000250' 177732 011126 011010' 001446' 30 ; 31 011132 HEAD 203,DR0,260,DRZER,DOCOL ; ***** DR0 32 ; SELECT DRIVE #0 - NOT USED WITH RT11 OR RSX11 33 011142 002510' 003114' 002242' .WORD ZERO,OFSET,STORE,SEMIS 011150 001446' 34 ; 35 011152 HEAD 203,DR1,261,DRONE,DOCOL ; ***** DR1 36 ; SELECT DRIVE #1 - NOT USED IN RSX11 OR RT11 37 011162 000060' 000360 003114' .WORD LIT,240.,OFSET,STORE,SEMIS 011170 002242' 001446' 38 ; 39 011174 HEAD 206,BUFFER,240,BUFFE,DOCOL ; ***** BUFFER 40 011210 003274' 002176' 002054' .WORD USE,AT,DUP,TOR 011216 001506' F.I.G. MACRO V04.00 00:02:08 PAGE 8-1 41 011220 010660' 000144' 177774 XXT2: .WORD PBUF,ZBRAN,XXT2-.,USE,STORE 011226 003274' 002242' 42 011232 001540' 002176' 001606' .WORD R,AT,ZLESS,ZBRAN,XXT3-. 011240 000144' 000024 43 011244 001540' 003340' 001540' .WORD R,TWOP,R,AT,LIT,77777,AND 011252 002176' 000060' 077777 011260 001302' 44 011262 002510' 015202' .WORD ZERO,RW 45 011266 001540' 002242' 001540' XXT3: .WORD R,STORE,R,PREV,STORE,FROMR,TWOP,SEMIS 011274 003310' 002242' 001524' 011302 003340' 001446' 46 ; 47 011306 HEAD 205,BLOCK,313,BLOCK,DOCOL ; ***** BLOCK 48 ; CHANGED TO MASK OFF THE UPDATE BIT WHEN COMPARING 49 011320 003114' 002176' 001634' .WORD OFSET,AT,PLUS,TOR 011326 001506' 50 011330 003310' 002176' 002054' .WORD PREV,AT,DUP,AT,LIT,077777,AND,R,SUB,ZBRAN,XXT4-. 011336 002176' 000060' 077777 011344 001302' 001540' 003436' 011352 000144' 000066 51 011356 010660' 001556' 000144' XXT5: .WORD PBUF,ZEQU,ZBRAN,XXT6-. 011364 000024 52 011366 002004' 001540' 011206' .WORD DROP,R,BUFFE 53 011374 002054' 001540' 002520' .WORD DUP,R,ONE,RW,TWO,SUB 011402 015202' 002530' 003436' 54 011410 002054' 002176' 000060' XXT6: .WORD DUP,AT,LIT,077777,AND,R,SUB,ZEQU 011416 077777 001302' 001540' 011424 003436' 001556' 55 011430 000144' 177724 .WORD ZBRAN,XXT5-. 56 011434 002054' 003310' 002242' .WORD DUP,PREV,STORE 57 011442 001524' 002004' 003340' XXT4: .WORD FROMR,DROP,TWOP,SEMIS 011450 001446' 58 ; 59 ; 60 ; 61 ; 62 ; 63 ; 64 011452 HEAD 206,(LINE),240,PLINE,DOCOL ; ***** (LINE) 65 011466 001506' 002564' 002600' .WORD TOR,CL,BBUF,SSMOD,FROMR,BSCR 011474 010556' 001524' 002614' 66 011502 010456' 001634' 011316' .WORD STAR,PLUS,BLOCK,PLUS,CL,SEMIS 011510 001634' 002564' 001446' 67 ; 68 011516 HEAD 205,.LINE,305,DLINE,DOCOL ; ***** .LINE 69 011530 011464' 005020' 004714' .WORD PLINE,DTRAI,TYPE,SEMIS 011536 001446' 70 ; 71 011540 HEAD 207,MESSAGE,305,MESS,DOCOL ; ***** MESSAGE 72 011554 002730' 002176' 000144' .WORD WARN,AT,ZBRAN,XXW5-.,DDUP,ZBRAN,XXW3-.,LIT,4 011562 000034 003644' 000144' 011570 000022 000060' 000004 73 011576 003114' 002176' 002614' .WORD OFSET,AT,BSCR,SLASH,SUB,DLINE 011604 010516' 003436' 011526' 74 011612 000122' 000016 XXW3: .WORD BRAN,XXW4-. 75 011616 005104' XXW5: .WORD PDOTQ 76 011620 006 .BYTE 6 F.I.G. MACRO V04.00 00:02:08 PAGE 8-2 77 011621 115 123 107 .ASCII /MSG # / 011624 040 043 040 78 .EVEN 79 011630 013146' .WORD DOT 80 011632 001446' XXW4: .WORD SEMIS 81 ; 82 011634 HEAD 204,LOAD,240,LOAD,DOCOL ; ***** LOAD 83 011646 003040' 002176' 001506' .WORD BLK,AT,TOR,IN,AT,TOR,ZERO,IN,STORE 011654 003052' 002176' 001506' 011662 002510' 003052' 002242' 84 011670 002614' 010456' 003040' .WORD BSCR,STAR,BLK,STORE,INTER,FROMR,IN,STORE 011676 002242' 007274' 001524' 011704 003052' 002242' 85 011710 001524' 003040' 002242' .WORD FROMR,BLK,STORE,SEMIS 011716 001446' 86 ; 87 011720 HEAD 303,-->,276,ARROW,DOCOL ; ***** --> 88 011730 004314' 002510' 003052' .WORD QLOAD,ZERO,IN,STORE,BSCR,BLK,AT,OVER 011736 002242' 002614' 003040' 011744 002176' 001762' 89 011750 010536' 003436' 003040' .WORD MOD,SUB,BLK,PSTOR,SEMIS 011756 002072' 001446' 90 ; 91 ; 92 ; 93 ; 94 ; NOTE - THE INSTALLATION-DEPENDENT I/O IS AT THE END 95 ; OF THE DICTIONARY - JUST BELOW 'TASK'. 'XI/O' IS THE 96 ; PRIMITIVE READ OR WRITE OF A 512-BYTE BLOCK. 97 ; 98 ; 99 ; 100 ; 101 ; 102 ; F.I.G. MACRO V04.00 00:02:08 PAGE 9 1 ; **************************************************************** 2 ; 3 ; MISCELLANEOUS HIGHER LEVEL 4 ; 5 ; **************************************************************** 6 ; 7 ; 8 011762 HEAD 301,',247,TICK,DOCOL ; ***** ' 9 011770 006336' 001556' 002510' .WORD DFIND,ZEQU,ZERO,QERR,DROP,LITER,SEMIS 011776 004120' 002004' 007066' 012004 001446' 10 ; 11 012006 HEAD 206,FORGET,240,FORGE,DOCOL ; ***** FORGET 12 012022 003150' 002176' 003132' .WORD CURR,AT,CONT,AT,SUB,LIT,30,QERR,TICK,DUP 012030 002176' 003436' 000060' 012036 000030 004120' 011766' 012044 002054' 13 012046 002744' 002176' 003502' .WORD FENCE,AT,LESS,LIT,25,QERR 012054 000060' 000025 004120' 14 012062 002054' 004020' 002756' .WORD DUP,NFA,DP,STORE,LFA,AT,CONT,AT 012070 002242' 003762' 002176' 012076 003132' 002176' 15 012102 002242' 001446' .WORD STORE,SEMIS 16 ; 17 ; 18 ; 19 ; 20 012106 HEAD 204,BACK,240,BACK,DOCOL ; ***** BACK 21 012120 003362' 003436' 003416' .WORD HERE,SUB,COMMA,SEMIS 012126 001446' 22 ; 23 012130 HEAD 305,BEGIN,316,BEGIN,DOCOL ; ***** BEGIN 24 012142 004152' 003362' 002520' .WORD QCOMP,HERE,ONE,SEMIS 012150 001446' 25 ; 26 012152 HEAD 305,ENDIF,306,ENDIF,DOCOL ; ***** ENDIF 27 012164 004152' 002530' 004232' .WORD QCOMP,TWO,QPAIR,HERE,OVER,SUB,SWAP,STORE,SEMIS 012172 003362' 001762' 003436' 012200 002026' 002242' 001446' 28 ; 29 012206 HEAD 304,THEN,240,THEN,DOCOL ; ***** THEN 30 012220 012162' 001446' .WORD ENDIF,SEMIS 31 ; 32 012224 HEAD 302,DO,240,DO,DOCOL ; ***** DO 33 012234 004346' 000334' 003362' .WORD COMP,XDO,HERE,LIT,3,SEMIS 012242 000060' 000003 001446' 34 ; 35 012250 HEAD 304,LOOP,240,LOOP,DOCOL ; ***** LOOP 36 012262 000060' 000003 004232' .WORD LIT,3,QPAIR,COMP,XLOOP,BACK,SEMIS 012270 004346' 000202' 012116' 012276 001446' 37 ; 38 012300 HEAD 305,+LOOP,320,PLOOP,DOCOL ; ***** +LOOP 39 012312 000060' 000003 004232' .WORD LIT,3,QPAIR,COMP,XPLOO,BACK,SEMIS 012320 004346' 000250' 012116' 012326 001446' 40 ; F.I.G. MACRO V04.00 00:02:08 PAGE 9-1 41 012330 HEAD 305,UNTIL,314,UNTIL,DOCOL ; ***** UNTIL 42 012342 002520' 004232' 004346' .WORD ONE,QPAIR,COMP,ZBRAN,BACK,SEMIS 012350 000144' 012116' 001446' 43 ; 44 012356 HEAD 303,END,304,END,DOCOL ; ***** END 45 012366 012340' 001446' .WORD UNTIL,SEMIS 46 ; 47 012372 HEAD 305,AGAIN,316,AGAIN,DOCOL ; ***** AGAIN 48 012404 002520' 004232' 004346' .WORD ONE,QPAIR,COMP,BRAN,BACK,SEMIS 012412 000122' 012116' 001446' 49 ; 50 012420 HEAD 306,REPEAT,240,REPEAT,DOCOL ; ***** REPEAT 51 012434 001506' 001506' 012402' .WORD TOR,TOR,AGAIN,FROMR,FROMR,TWO,SUB,ENDIF,SEMIS 012442 001524' 001524' 002530' 012450 003436' 012162' 001446' 52 ; 53 012456 HEAD 302,IF,240,IF,DOCOL ; ***** IF 54 012466 004346' 000144' 003362' .WORD COMP,ZBRAN,HERE,ZERO,COMMA,TWO,SEMIS 012474 002510' 003416' 002530' 012502 001446' 55 ; 56 012504 HEAD 304,ELSE,240,ELSE,DOCOL ; ***** ELSE 57 012516 002530' 004232' 004346' .WORD TWO,QPAIR,COMP,BRAN,HERE,ZERO,COMMA 012524 000122' 003362' 002510' 012532 003416' 58 012534 002026' 002530' 012162' .WORD SWAP,TWO,ENDIF,TWO,SEMIS 012542 002530' 001446' 59 ; 60 012546 HEAD 305,WHILE,305,WHILE,DOCOL ; ***** WHILE 61 012560 012464' 003340' 001446' .WORD IF,TWOP,SEMIS 62 ; 63 ; 64 ; 65 ; 66 012566 HEAD 206,SPACES,240,SPACS,DOCOL ; ***** SPACES 67 012602 002510' 010240' 003644' .WORD ZERO,MAX,DDUP,ZBRAN,XXR4-.,ZERO,XDO 012610 000144' 000014 002510' 012616 000334' 68 012620 003622' 000202' 177774 XXRA: .WORD SPACE,XLOOP,XXRA-. 69 012626 001446' XXR4: .WORD SEMIS 70 ; 71 012630 HEAD 202,^/<#/,240,BDIGS,DOCOL ; ***** <# 72 012640 005724' 003262' 002242' .WORD PAD,HLD,STORE,SEMIS 012646 001446' 73 ; 74 012650 HEAD 202,#>,240,EDIGS,DOCOL ; ***** #> 75 012660 002004' 002004' 003262' .WORD DROP,DROP,HLD,AT,PAD,OVER,SUB,SEMIS 012666 002176' 005724' 001762' 012674 003436' 001446' 76 ; 77 012700 HEAD 204,SIGN,240,SIGN,DOCOL ; ***** SIGN 78 012712 003564' 001606' 000144' .WORD ROT,ZLESS,ZBRAN,XXR1-.,LIT,55,HOLD 012720 000010 000060' 000055 012726 005674' 79 012730 001446' XXR1: .WORD SEMIS 80 ; 81 012732 HEAD 201,#,243,DIG,DOCOL ; ***** # F.I.G. MACRO V04.00 00:02:08 PAGE 9-2 82 012740 003200' 002176' 010622' .WORD BASE,AT,MSMOD,ROT,LIT,11,OVER,LESS 012746 003564' 000060' 000011 012754 001762' 003502' 83 012760 000144' 000010 000060' .WORD ZBRAN,XXR2-.,LIT,7,PLUS 012766 000007 001634' 84 012772 000060' 000060 001634' XXR2: .WORD LIT,60,PLUS,HOLD,SEMIS 013000 005674' 001446' 85 ; 86 013004 HEAD 202,#S,240,DIGS,DOCOL ; ***** #S 87 013014 012736' 001762' 001762' XXR3: .WORD DIG,OVER,OVER,OR,ZEQU,ZBRAN,XXR3-.,SEMIS 013022 001322' 001556' 000144' 013030 177764 001446' 88 ; 89 013034 HEAD 203,D.R,322,DDOTR,DOCOL ; ***** D.R 90 013044 001506' 002026' 001762' .WORD TOR,SWAP,OVER,DABS,BDIGS,DIGS,SIGN,EDIGS 013052 010164' 012636' 013012' 013060 012710' 012656' 91 013064 001524' 001762' 003436' .WORD FROMR,OVER,SUB,SPACS,TYPE,SEMIS 013072 012600' 004714' 001446' 92 ; 93 013100 HEAD 202,.R,240,DOTR,DOCOL ; ***** .R 94 013110 001506' 010110' 001524' .WORD TOR,STOD,FROMR,DDOTR,SEMIS 013116 013042' 001446' 95 ; 96 013122 HEAD 202,D.,240,DDOT,DOCOL ; ***** D. 97 013132 002510' 013042' 003622' .WORD ZERO,DDOTR,SPACE,SEMIS 013140 001446' 98 ; 99 013142 HEAD 201,.,256,DOT,DOCOL ; ***** . 100 013150 010110' 013130' 001446' .WORD STOD,DDOT,SEMIS 101 ; 102 013156 HEAD 201,?,277,QUEST,DOCOL ; ***** ? 103 013164 002176' 013146' 001446' .WORD AT,DOT,SEMIS 104 ; 105 013172 HEAD 202,U.,240,UDOT,DOCOL ; ***** U. 106 013202 002510' 013130' 001446' .WORD ZERO,DDOT,SEMIS 107 ; 108 ; UTILITY SECTION. 109 ; 110 ; 111 013210 HEAD 204,LIST,240,LIST,DOCOL ; ***** LIST 112 ; ( N---. LIST GIVEN SCREEN.) 113 013222 004510' 001056' 002054' .WORD DEC,CR,DUP,SCR,STORE,PDOTQ 013230 003076' 002242' 005104' 114 013236 006 .BYTE 6 115 013237 123 103 122 .ASCII /SCR # / 013242 040 043 040 116 .EVEN 117 013246 013146' 000060' 000020 .WORD DOT,LIT,20,ZERO,XDO 013254 002510' 000334' 118 013260 001056' 000360' 002540' XXZ1: .WORD CR,I,THREE,DOTR,SPACE 013266 013106' 003622' 119 013272 000360' 003076' 002176' .WORD I,SCR,AT,DLINE,XLOOP,XXZ1-.,CR,SEMIS 013300 011526' 000202' 177754 013306 001056' 001446' 120 ; 121 013312 HEAD 205,INDEX,330,INDEX,DOCOL ; ***** INDEX F.I.G. MACRO V04.00 00:02:08 PAGE 9-3 122 ; LIST FIRST LINE OF A RANGE OF DISK SCREENS. 123 013324 001056' 003322' 002026' .WORD CR,ONEP,SWAP,XDO 013332 000334' 124 013334 001056' 000360' 002540' XXZ2: .WORD CR,I,THREE,DOTR,SPACE,ZERO,I,DLINE 013342 013106' 003622' 002510' 013350 000360' 011526' 125 013354 001046' 000144' 000004 .WORD QTERM,ZBRAN,XXZ3-.,LEAVE 013362 001466' 126 013364 000202' 177746 001446' XXZ3: .WORD XLOOP,XXZ2-.,SEMIS 127 ; 128 013372 HEAD 205,TRIAD,304,TRIAD,DOCOL ; ***** TRIAD 129 ; LIST DISK SCREENS THREE PER PAGE. 130 013404 000060' 000014 001020' .WORD LIT,14,EMIT ; FORM FEED 131 013412 002540' 010516' 002540' .WORD THREE,SLASH,THREE,STAR,THREE 013420 010456' 002540' 132 013424 001762' 001634' 002026' .WORD OVER,PLUS,SWAP,XDO 013432 000334' 133 013434 001056' 000360' 013220' XXZ4: .WORD CR,I,LIST,XLOOP,XXZ4-.,CR,LIT,17,MESS,CR,SEMIS 013442 000202' 177770 001056' 013450 000060' 000017 011552' 013456 001056' 001446' 134 ; 135 013462 HEAD 205,VLIST,324,VLIST,DOCOL ; ***** VLIST 136 013474 000060' 000200 003064' .WORD LIT,200,OUT,STORE,CONT,AT,AT 013502 002242' 003132' 002176' 013510 002176' 137 013512 003064' 002176' 000060' XXZ5: .WORD OUT,AT,LIT,100,GREAT,ZBRAN,XXZ6-. 013520 000100 003532' 000144' 013526 000012 138 013530 001056' 002510' 003064' .WORD CR,ZERO,OUT,STORE 013536 002242' 139 013540 002054' 006610' 003622' XXZ6: .WORD DUP,IDDOT,SPACE,SPACE,PFA,LFA,AT 013546 003622' 004046' 003762' 013554 002176' 140 013556 002054' 001556' 001046' .WORD DUP,ZEQU,QTERM,OR,ZBRAN,XXZ5-.,DROP,SEMIS 013564 001322' 000144' 177722 013572 002004' 001446' 141 ; 142 .IFDF LINKS 143 HEAD 205,VLINK,313,XVLINK,DOCON ; ***** VLINK 144 ; THIS IS ONLY USED FOR LINKAGE FROM FORTH TO SUBROUTINES 145 ; IN OTHER LANGUAGES. SEE USER'S GUIDE FOR DOCUMENTATION. 146 .WORD VLINK 147 .ENDC 148 ; 149 ; 150 ; 151 ; 152 ; 153 ; F.I.G. MACRO V04.00 00:02:08 PAGE 10 1 ; **************************************************************** 2 ; 3 ; INSTALLATION-DEPENDENT SECTION (TERMINAL AND DISK I/O, AND TRAPS) 4 ; 5 ; **************************************************************** 6 ; 7 ; 8 ; *************** 9 ; 10 ; RSX-11M TERMINAL I/O 11 ; 12 ; *************** 13 ; 14 .IFDF RSX11 15 ; 16 .EVEN 17 ; NOTE - FOR RSX-11 ON HEAVILY LOADED MACHINES, IT IS BETTER 18 ; FOR 'KEY' TO READ A WHOLE LINE AT A TIME, AND UNPACK IT. 19 ; ALSO, 'KEY' SHOULD EMIT A LINE FEED WHEN A CARRIAGE RETURN 20 ; HAS BEEN READ. 21 22 PEMIT: JSR R1,ITERM ; INITIALIZE RSX? 23 ; INCREMENT 'OUT', UNLESS A CONTROL CHARACTER BEING OUTPUT. 24 CMP (S),#40 ; TEST FOR CONTROL CHARACTER 25 BLT 1$ 26 INC 42(U) ; INCREMENT 'OUT' 27 1$: 28 JSR R1,XCOUT ; OUTPUT A CHARACTER 29 NEXT 30 ; 31 PKEY: JSR R1,ITERM ; INITIALIZE RSX? 32 TST INTERM ; ZERO MEANS READ NEW LINE 33 BNE XCHAR 34 XLINE: MOV #XBUFF,INTERM ; READ NEW LINE 35 QIOW$C IO.RVB,4,4,,IOSTAT,, 36 ADD #XBUFF,IOSTAT+2 ; TERMINATE LINE WITH CR 37 MOVB #15,@IOSTAT+2 38 XCHAR: TST -(S) ; DECREMENT STACK POINTER 39 MOVB @INTERM,(S) ; FOR THIS BYTE INSTRUCTION 40 INC INTERM 41 BIC #177600,(S) 42 CMP (S),#15 ; IF CR IS BEING SENT, 43 BNE XRETRN 44 CLR INTERM ; THEN READ NEW LINE NEXT TIME. 45 MOV #12,-(S) ; AND ALSO EMIT A LINE FEED 46 JSR R1,XCOUT 47 XRETRN: NEXT 48 ; 49 PQTER: JSR R1,ITERM ; INITIALIZE RSX? 50 MOV QFLAG,-(S) 51 CLR QFLAG 52 NEXT 53 ; PUT THE AST ROUTINE HERE 54 AST1: MOV (RP)+,QFLAG ; SET UP FOR NEXT '?TERMINAL'; 55 ; NOTE THAT 'RP' IS SYSTEM STACK. 56 CMP QFLAG,#3 ; TEST FOR ^C 57 BNE 1$ F.I.G. MACRO V04.00 00:02:08 PAGE 10-1 58 MOV #GO,IP 59 1$: ASTX$S 60 ; 61 ; 62 PCR: JSR R1,ITERM ; INITIALIZE RSX? 63 MOV #15,-(S) 64 JSR R1,XCOUT 65 MOV #12,-(S) 66 JSR R1,XCOUT 67 NEXT 68 ; 69 XCOUT: MOV (S)+,IOCHR 70 QIOW$C IO.WVB!TF.WAL,4,4,,IOSTAT,, 71 RTS R1 72 ; 73 ITERM: ; INITIALIZE RSX IF FIRST TIME THROUGH 74 CMP INTERM,#-1 ; FIRST TIME TERMINAL I/O? 75 BNE RSXRTS 76 CLR INTERM ; YES 77 ALUN$C 4,TI,0 ; ASSIGN LUN 78 QIOW$C IO.ATA,4,,,,, ; ATTACH - UNSOLICITED I/O 79 SVTK$S #TRAPV,#6 ; SET UP FOR TRAPS 80 RSXRTS:RTS R1 81 INTERM: .WORD -1 ; FLAG FOR FIRST TIME TERMINAL I/O. 82 ; DO NOT REINITIALIZE 'INTERM' AT COLD START, LEST ASSIGNMENT DONE TWICE. 83 IOCHR: .WORD 0 ; TEMPORARY AREA FOR 'KEY' AND 'EMIT' 84 QFLAG: .WORD 0 ; FOR '?TERMINAL' 85 XBUFF: .BLKB 82. ; TERMINAL BUFFER FOR RSX LINE I/O 86 ; 87 ; 88 ; 89 HEAD 203,BYE,305,BYE ; ***** BYE (LOG OFF) 90 CLOSE$ #FDBIO ; CLOSE DISK I/O 91 EXIT$S 92 ; 93 ; 94 ; *************** 95 ; 96 ; RSX11-M DISK I/O 97 ; 98 ; *************** 99 ; 100 HEAD 204,XI/O,240,XIO ; ***** XI/O (RSX) 101 ; PHYSICAL READ-WRITE 102 ; ADDRESS BLOCK# FLAG ==> REPORT. READS OR WRITES A 512-BYTE BLOCK. 103 ; FLAG 1=READ, 0=WRITE. REPORT '0'=GOOD I/O, '1'=I/O ERROR. 104 ; IF REPORT IS '1', THEN NEXT ON STACK IS '1'=OPEN ERROR, 105 ; '2'=READ ERROR, '3'=WRITE ERROR, '4'=WAIT ERROR, '5'=ARGUMENT 106 ; ERROR (FLAG NOT '0' OR '1'). 107 CLR DSKERR ; FOR I/O ERROR REPORT 108 TST OPENF ; DISK FILE ALREADY OPENED? 109 BNE 2$ 110 OPEN$M #FDBIO 111 BCC 2$ 112 MOV #1,DSKERR ; ERROR IN OPEN 113 BR ERRR 114 2$: MOV #1,OPENF ; INDICATE FILE IS OPEN F.I.G. MACRO V04.00 00:02:08 PAGE 10-2 115 CLR VIRBLK 116 MOV 2(S),VIRBLK+2 ; SET UP VIRTUAL BLOCK NUMBER 117 MOV 4(S),IOADDR ; SET UP I/O ADDRESS 118 TST (S) ; WAS TOP OF STACK - READ OR WRITE? 119 BEQ WRITE 120 CMP (S),#1 121 BEQ READ 122 MOV #5,DSKERR ; ERROR, FLAG NOT EITHER '0' OR '1' 123 BR ERRR 124 READ: READ$ #FDBIO,IOADDR,,#VIRBLK,#2 125 BCC WAIT 126 MOV #2,DSKERR ; ERROR IN READ 127 BR ERRR 128 WRITE: WRITE$ #FDBIO,IOADDR,,#VIRBLK,#2 129 BCC WAIT 130 MOV #3,DSKERR ; ERROR IN WRITE 131 BR ERRR 132 WAIT: WAIT$ 133 BCC DONE 134 MOV #4,DSKERR ; ERROR IN WAIT 135 BR ERRR 136 DONE: ADD #6,S 137 CLR -(S) ; INDICATE GOOD I/O 138 BR DONE2 139 ERRR: ADD #6,S 140 MOV DSKERR,-(S) ; RETURN THE ERROR INDICATOR 141 MOV #1,-(S) ; INDICATE ERROR IN I/O 142 DONE2: NEXT 143 FSRSZ$ 0 144 FDBIO: FDBDF$ 145 FDRC$A FD.RWM 146 FDBK$A ,512.,,2,IOSTAT 147 FDOP$A 3,DESCR,,FO.MFY 148 DESCR: .WORD 0,0 ; USE DEFAULT DEVICE 149 .WORD 0,0 ; AND DIRECTORY. 150 .WORD FILSZ,FIL 151 FIL: .ASCII /FORTH.DAT/ 152 FILSZ=.-FIL 153 .EVEN 154 ; 155 OPENF: .WORD 0 ; FLAG FOR FIRST TIME DISK I/O 156 ; DO NOT INITIALIZE 'OPENF' AT COLD START 157 DSKERR: .WORD 0 ; SPACE FOR DISK ERROR MESSAGE 158 IOADDR: .WORD 0 ; ADDRESS FOR DISK READ/WRITE 159 IOSTAT: .BLKW 2 ; I/O STATUS REPORT 160 VIRBLK: .BLKW 2 ; VIRTUAL BLOCK NUMBER 161 ; 162 HEAD 212,BLOCK-READ,240,BREAD,DOCOL ; ***** BLOCK-READ 163 ; ( ADDRESS BLOCK# ==> REPORT). REPORT: 0=GOOD READ, ELSE ERROR 164 .WORD ONE,XIO,SEMIS 165 ; 166 HEAD 213,BLOCK-WRITE,305,BWRIT,DOCOL ; ***** BLOCK-WRITE 167 ; ( ADDRESS BLOCK# ==> REPORT). REPORT: 0=GOOD WRITE, ELSE ERROR 168 .WORD ZERO,XIO,SEMIS 169 ; 170 HEAD 203,I/O,317,IO,DOCOL ; ***** I/O 171 ; READ OR WRITE 512-BYTE BLOCK, HANDLE ERRORS. F.I.G. MACRO V04.00 00:02:08 PAGE 10-3 172 ; ( ADDRESS BLOCK# FLAG(1=READ,0=WRITE) ==> ) 173 .WORD DUP,ONE,EQUAL,ZBRAN,XXS1-.,DROP,BREAD 174 .WORD ZBRAN,XXS2-.,CR,PDOTQ 175 .BYTE 22 176 .ASCII /DISK READ ERROR # / 177 .EVEN 178 .WORD DOT,ABORT 179 XXS2: .WORD BRAN,XXS3-. 180 XXS1: .WORD ZEQU,ZBRAN,XXS4-.,BWRIT,ZBRAN,XXS5-. 181 .WORD CR,PDOTQ 182 .BYTE 23 183 .ASCII /DISK WRITE ERROR # / 184 .EVEN 185 .WORD DOT,ABORT 186 XXS5: 187 XXS4: 188 XXS3: .WORD SEMIS 189 ; 190 HEAD 203,R/W,327,RW,DOCOL ; ***** R/W 191 ; READ OR WRITE 1024-BYTE SCREEN. ( ADDRESS SCREEN# FLAG ==> ) 192 ; NOTE THAT SCREEN N IS BLOCKS 2N-1 AND 2N. 193 .WORD TOR,TWO,STAR,OVER,OVER,ONE,SUB,R,IO 194 .WORD SWAP,LIT,512.,PLUS 195 .WORD SWAP,FROMR,IO,SEMIS 196 ; 197 .ENDC 198 ; 199 ; *************** 200 ; 201 ; RT-11 TERMINAL I/O 202 ; 203 ; *************** 204 ; 205 .IFDF RT11 206 ITERM: CMP INTERM,#-1 207 BNE RTRTS 208 CLR INTERM 209 .RCTRLO ; RESET CNTL-O 210 .TRPSET #TRAPBL,#TRAPZ 211 RTRTS: RTS R1 212 ; 213 PEMIT: 214 JSR R1,ITERM 215 ; INCREMENT 'OUT', UNLESS A CONTROL CHARACTER BEING OUTPUT. 216 CMP (S),#40 ; TEST FOR CONTROL CHARACTER 217 BLT 1$ 218 INC 42(U) ; INCREMENT 'OUT' 219 1$: 220 JSR R1,XCOUT 221 NEXT 222 ; 223 PKEY: JSR R1,ITERM 224 .TTYIN 225 BIC #177600,R0 226 CMP R0,#12 ; IGNORE LINEFEED 227 BEQ PKEY 228 MOV R0,-(S) F.I.G. MACRO V04.00 00:02:08 PAGE 10-4 229 NEXT 230 ; 231 PQTER: JSR R1,ITERM 232 MOV 44,-(RP) ; SAVE JSW 233 BIS #10100,44 ; SET BITS 6 AND 12 OF JSW 234 .TTINR 235 BCC 1$ 236 ; IF CARRY SET, NO CHARACTER - SUPPLY ZERO 237 CLR R0 238 1$: BIC #177600,R0 239 CMP R0,#12 ; IGNORE LINEFEED 240 BNE 2$ 241 CLR R0 242 2$: MOV R0,-(S) 243 MOV (RP)+,44 ; RESTORE JSW 244 NEXT 245 ; 246 PCR: JSR R1,ITERM 247 MOV #15,-(S) 248 JSR R1,XCOUT 249 MOV #12,-(S) 250 JSR R1,XCOUT 251 NEXT 252 ; 253 XCOUT: MOV (S)+,R0 254 .TTYOUT 255 RTS R1 256 ; 257 INTERM: .WORD -1 ; FLAG FOR FIRST TIME TERMINAL I/O 258 ; DO NOT INITIALIZE 'INTERM' AT COLD START 259 IOCHR: .WORD 0 ; TEMPORARY AREA FOR 'KEY', 'EMIT' 260 ; 261 HEAD 203,BYE,305,BYE ; ***** BYE (RT) 262 .EXIT 263 ; 264 ; 265 ; *************** 266 ; 267 ; RT-11 DISK I/O 268 ; 269 ; *************** 270 ; 271 HEAD 204,XI/O,240,XIO ; ***** XI/O (RT) 272 CLR DSKERR 273 TST OPENF 274 BNE RTOPEN 275 MOV #1,OPENF ; INDICATE FILE IS OPEN 276 ; NOW OPEN THE FILE 277 .SETTOP #-2 278 MOV #RTSTAT,R1 279 .DSTATUS R1,#RTFILE 280 BCC 1$ 281 MOV #1,DSKERR 282 BR RTRET 283 1$: TST 4(R1) ; HANDLER IN? 284 BNE 2$ 285 .FETCH HANDLR,#RTFILE F.I.G. MACRO V04.00 00:02:08 PAGE 10-5 286 BCC 2$ 287 MOV #2,DSKERR 288 BR RTRET 289 2$: .LOOKUP #LOOK1,#0,#RTFILE 290 BCC RTOPEN 291 MOV #3,DSKERR 292 BR RTRET 293 RTOPEN: ; FILE IS OPEN - NOW READ IT 294 MOV 2(S),R1 ; BLOCK # 295 DEC R1 ; BEGINS AT 1 IN FORTH 296 MOV 4(S),IOADDR ; BUFFER ADDRESS 297 TST (S) 298 BEQ WRITE 299 CMP (S),#1 300 BEQ READ 301 MOV #5,DSKERR 302 BR RTRET 303 READ: .READW #RTBLK,#0,IOADDR,,R1 304 BCC 1$ 305 MOV #6,DSKERR 306 1$: BR RTRET 307 WRITE: .WRITW #RTBLK,#0,IOADDR,,R1 308 BCC 2$ 309 MOV #7,DSKERR 310 2$: BR RTRET 311 RTRET: ADD #6,S 312 MOV DSKERR,-(S) 313 TST DSKERR 314 BEQ 1$ 315 MOV #1,-(S) ; INDICATE ERROR OCCURRED 316 1$: NEXT 317 RTFILE: .RAD50 /DK FORTH DAT/ 318 RTBLK: .BYTE 0,10 319 .WORD 0,0,256.,0 320 ; 321 OPENF: .WORD 0 ; FLAG FOR FIRST TIME DISK I/O 322 DSKERR: .WORD 0 ; SPACE FOR DISK ERROR MESSAGE 323 IOADDR: .WORD 0 ; ADDRESS FOR DISK READ/WRITE 324 RTSTAT: .BLKW 4 ; DISK I/O STATUS 325 LOOK1: .BLKW 3 ; EMT ARGUMENT BLOCK 326 TRAPBL: .BLKW 2 ; EMT ARGUMENT BLOCK 327 ; 328 HEAD 212,BLOCK-READ,240,BREAD,DOCOL ; ***** BLOCK-READ 329 ; ( ADDRESS BLOCK# ==> REPORT). REPORT: 0=GOOD READ, ELSE ERROR 330 .WORD ONE,XIO,SEMIS 331 ; 332 HEAD 213,BLOCK-WRITE,305,BWRIT,DOCOL ; ***** BLOCK-WRITE 333 ; ( ADDRESS BLOCK# ==> REPORT). REPORT: 0=GOOD WRITE, ELSE ERROR 334 .WORD ZERO,XIO,SEMIS 335 ; 336 HEAD 203,I/O,317,IO,DOCOL ; ***** I/O 337 ; READ OR WRITE 512-BYTE BLOCK, HANDLE ERRORS. 338 ; ( ADDRESS BLOCK# FLAG(1=READ,0=WRITE) ==> ) 339 .WORD DUP,ONE,EQUAL,ZBRAN,XXS1-.,DROP,BREAD 340 .WORD ZBRAN,XXS2-.,CR,PDOTQ 341 .BYTE 22 342 .ASCII /DISK READ ERROR # / F.I.G. MACRO V04.00 00:02:08 PAGE 10-6 343 .EVEN 344 .WORD DOT,ABORT 345 XXS2: .WORD BRAN,XXS3-. 346 XXS1: .WORD ZEQU,ZBRAN,XXS4-.,BWRIT,ZBRAN,XXS5-. 347 .WORD CR,PDOTQ 348 .BYTE 23 349 .ASCII /DISK WRITE ERROR # / 350 .EVEN 351 .WORD DOT,ABORT 352 XXS5: 353 XXS4: 354 XXS3: .WORD SEMIS 355 ; 356 HEAD 203,R/W,327,RW,DOCOL ; ***** R/W 357 ; READ OR WRITE 1024-BYTE SCREEN. ( ADDRESS SCREEN# FLAG ==> ) 358 ; NOTE THAT SCREEN N IS BLOCKS 2N-1 AND 2N. 359 .WORD TOR,TWO,STAR,OVER,OVER,ONE,SUB,R,IO 360 .WORD SWAP,LIT,512.,PLUS 361 .WORD SWAP,FROMR,IO,SEMIS 362 ; 363 ; 364 .ENDC 365 ; 366 ; *************** 367 ; 368 ; STAND-ALONE TERMINAL I/O 369 ; 370 ; **************** 371 ; 372 .IFDF ALONE 373 013576 PEMIT: 374 ; INCREMENT 'OUT', UNLESS A CONTROL CHARACTER BEING OUTPUT. 375 013576 021527 000040 CMP (S),#40 ; TEST FOR CONTROL CHARACTER 376 013602 002402 BLT 1$ 377 013604 005263 000042 INC 42(U) ; INCREMENT 'OUT' 378 013610 005737 177564 1$: TST @#177564 379 013614 001775 BEQ 1$ 380 013616 042715 177600 BIC #177600,(S) ; CLEAR UPPER BITS FOR ASCII 381 013622 012537 177566 MOV (S)+,@#177566 ; ONLY OUTPUTS LOW 8 BITS 382 013626 NEXT 383 ; 384 013632 105737 177560 PKEY: TSTB @#177560 385 013636 001775 BEQ PKEY 386 013640 005037 177560 CLR @#177560 387 013644 113701 177562 MOVB @#177562,R1 388 013650 042701 177600 BIC #177600,R1 389 013654 022701 000177 CMP #177,R1 390 013660 001002 BNE 1$ 391 013662 012701 000010 MOV #10,R1 392 013666 010145 1$: MOV R1,-(S) 393 013670 NEXT 394 ; 395 013674 105737 177560 PQTER: TSTB @#177560 396 013700 001403 BEQ 1$ 397 013702 013745 177562 MOV @#177562,-(S) 398 013706 000401 BR 2$ 399 013710 005045 1$: CLR -(S) F.I.G. MACRO V04.00 00:02:08 PAGE 10-7 400 013712 005037 177560 2$: CLR @#177560 401 013716 NEXT 402 ; 403 013722 005737 177564 PCR: TST @#177564 404 013726 001775 BEQ PCR 405 013730 012737 000015 177566 MOV #15,@#177566 406 013736 005737 177564 1$: TST @#177564 407 013742 001775 BEQ 1$ 408 013744 012737 000012 177566 MOV #12,@#177566 409 013752 NEXT 410 ; 411 013756 HEAD 203,BYE,305,BYE ; ***** BYE (ALONE) 412 413 013766 000000 HALT 414 ; 415 ; *************** 416 ; 417 ; STAND-ALONE DISK I/O 418 ; 419 ; *************** 420 ; 421 177170 RXCS=177170 ; CONTROL AND STATUS REGISTER 422 177172 RXDB=177172 ; DATA BUFFER REGISTER 423 ; 424 ; 425 013770 HEAD 204,NRTS,240,NRTS ; ***** NRTS 426 ; ADDRN TRN SECN...ADDR1 TR1 SEC1 N -> FLAG 427 ; READ N SECTORS. USES R0, R1, R2 428 ; THIS OPERATION IS IN CODE TO KEEP UP WITH DISK TIMING FOR 429 ; STANDARD PDP-11 SECTOR SKEWING. 430 014002 012501 MOV (S)+,R1 ; # OF SECTORS TO READ 431 014004 012702 000010 1$: MOV #10,R2 ; RETRY COUNT 432 014010 012700 000007 21$: MOV #7,R0 ; 'READ' COMMAND 433 014014 004767 000172 JSR PC,DRIV2 ; ADJUST R0 COMMAND 434 ; IF SECOND DRIVE 435 014020 010037 177170 MOV R0,@#RXCS ; READ COMMAND 436 014024 032737 000200 177170 2$: BIT #200,@#RXCS ; WAIT FOR TRANSFER FLAG 437 014032 001774 BEQ 2$ 438 014034 011537 177172 MOV (S),@#RXDB ; SECTOR # 439 014040 032737 000200 177170 3$: BIT #200,@#RXCS ; WAIT FOR TRANSFER FLAG 440 014046 001774 BEQ 3$ 441 014050 016537 000002 177172 MOV 2(S),@#RXDB ; TRACK # 442 014056 032737 000040 177170 4$: BIT #40,@#RXCS ; WAIT FOR DONE FLAG 443 014064 001774 BEQ 4$ 444 ; CHECK FOR ERROR 445 014066 005737 177170 TST @#RXCS 446 014072 002423 BLT 20$ ; ERROR 447 ; 448 014074 012737 000003 177170 MOV #3,@#RXCS ; 'EMPTY' COMMAND 449 ; EMPTY THE CONTROLLER'S BUFFER 450 014102 016500 000004 MOV 4(S),R0 ; ADDRESS TO RECEIVE DATA 451 014106 012745 000200 MOV #200,-(S) ; COUNT OF TIMES TO LOOP 452 014112 032737 000200 177170 6$: BIT #200,@#RXCS ; WAIT FOR TRANSFER FLAG 453 014120 001774 BEQ 6$ 454 014122 113720 177172 MOVB @#RXDB,(R0)+ 455 014126 005315 DEC (S) ; DECREMENT THE COUNT 456 014130 001370 BNE 6$ F.I.G. MACRO V04.00 00:02:08 PAGE 10-8 457 014132 005725 TST (S)+ ; POP THE COUNT 458 ; CHECK FOR ERROR 459 014134 005737 177170 TST @#RXCS 460 014140 002015 BGE 7$ 461 014142 20$: ; ERROR, SO RE-TRY 462 014142 012737 040000 177170 MOV #40000,@#RXCS ; CLEAR ERROR STATUS 463 014150 032737 000040 177170 22$: BIT #40,@#RXCS 464 014156 001774 BEQ 22$ 465 014160 005302 DEC R2 ; RE-TRY COUNT 466 014162 003312 BGT 21$ 467 014164 012745 177777 MOV #-1,-(S) 468 014170 NEXT ; ERROR EXIT 469 014174 062705 000006 7$: ADD #6,S ; GOOD READ, SO POP THE 3 ARGS 470 014200 005301 DEC R1 471 014202 001300 BNE 1$ ; LOOP UNLESS ALL SECTORS READ 472 ; 473 014204 005045 CLR -(S) ; GOOD-READ INDICATOR 474 014206 NEXT ; EXIT 475 ; 476 ; SUBROUTINE TO ADJUST COMMAND FOR SECOND DISK DRIVE 477 ; NOTE - 'NWTS' ALSO USES THIS SUBROUTINE. 478 ; NOTE USE OF R0, AND OF FORTH STACK. 479 014212 026527 000002 000114 DRIV2: CMP 2(S),#114 ; TRACK > 76 ? 480 014220 003405 BLE 10$ 481 014222 162765 000115 000002 SUB #115,2(S) ; SUBTRACT 77 482 014230 052700 000020 BIS #20,R0 ; SET UNIT-SELECT BIT 483 014234 000207 10$: RTS PC 484 ; 485 014236 HEAD 204,NWTS,240,NWTS ; ***** NWTS 486 ; ADDRN TRN SECN...ADDR1 TR1 SEC1 N -> FLAG 487 ; WRITE N SECTORS. USES R0, R1, R2. 488 014250 012501 MOV (S)+,R1 ; # OF SECTORS TO BE WRITTEN 489 014252 012702 000010 1$: MOV #10,R2 ; RE-TRY COUNT 490 014256 012737 000001 177170 21$: MOV #1,@#RXCS ; 'FILL' COMMAND 491 014264 032737 000200 177170 2$: BIT #200,@#RXCS ; WAIT FOR TRANSFER FLAG 492 014272 001774 BEQ 2$ 493 ; NOW FILL THE BUFFER 494 014274 016500 000004 MOV 4(S),R0 495 014300 012745 000200 MOV #200,-(S) ; COUNT 496 014304 032737 000200 177170 3$: BIT #200,@#RXCS ; WAIT FOR TRANSFER FLAG 497 014312 001774 BEQ 3$ 498 014314 112037 177172 MOVB (R0)+,@#RXDB ; MOVE ONE BYTE 499 014320 005315 DEC (S) 500 014322 001370 BNE 3$ 501 014324 005725 TST (S)+ ; POP STACK 502 ; CHECK FOR ERROR 503 014326 005737 177170 TST @#RXCS 504 014332 002432 BLT 20$ ; ERROR 505 ; 506 014334 012700 000005 MOV #5,R0 ; 'WRITE' COMMAND 507 014340 004767 177646 JSR PC,DRIV2 ; ADJUST IF SECOND DRIVE 508 014344 010037 177170 MOV R0,@#RXCS ; 'WRITE' COMMAND 509 014350 032737 000200 177170 5$: BIT #200,@#RXCS ; WAIT FOR TRANSFER FLAG 510 014356 001774 BEQ 5$ 511 014360 011537 177172 MOV (S),@#RXDB ; MOVE SECTOR # 512 014364 032737 000200 177170 6$: BIT #200,@#RXCS ; WAIT FOR TRANSFER FLAG 513 014372 001774 BEQ 6$ F.I.G. MACRO V04.00 00:02:08 PAGE 10-9 514 014374 016537 000002 177172 MOV 2(S),@#RXDB ; MOVE TRACK # 515 014402 032737 000040 177170 7$: BIT #40,@#RXCS ; WAIT FOR DONE FLAG 516 014410 001774 BEQ 7$ 517 ; CHECK FOR ERROR 518 014412 005737 177170 TST @#RXCS 519 014416 002015 BGE 10$ 520 014420 20$: ; ERROR SO RE-TRY 521 014420 012737 040000 177170 MOV #40000,@#RXCS ; CLEAR ERROR STATUS 522 014426 032737 000040 177170 22$: BIT #40,@#RXCS 523 014434 001774 BEQ 22$ 524 014436 005302 DEC R2 ; RE-TRY COUNT 525 014440 003306 BGT 21$ 526 014442 012745 177777 MOV #-1,-(S) ; ERROR INDICATOR 527 014446 NEXT ; EXIT 528 014452 062705 000006 10$: ADD #6,S ; GOOD WRITE, SO POP THE 3 ARGS 529 014456 005301 DEC R1 530 014460 001274 BNE 1$ ; LOOP UNLESS ALL SECTORS WRITTEN 531 ; 532 014462 005045 CLR -(S) ; GOOD-WRITE INDICATOR 533 014464 NEXT 534 ; 535 014470 HEAD 203,RTS,323,RTS,DOCOL ; ***** RTS 536 ; ADDR TR SEC -> 537 ; READ A SINGLE SECTOR. 538 014500 002520' 014000' 000144' .WORD ONE,NRTS,ZBRAN,1$-.,PDOTQ 014506 000036 005104' 539 014512 026 .BYTE 26 540 014513 104 111 123 .ASCII /DISK READ ERROR IN RTS/ 014516 113 040 122 014521 105 101 104 014524 040 105 122 014527 122 117 122 014532 040 111 116 014535 040 122 124 014540 123 541 .EVEN 542 014542 007574' .WORD QUIT 543 014544 001446' 1$: .WORD SEMIS 544 ; 545 014546 HEAD 203,WTS,323,WTS,DOCOL ; ***** WTS 546 ; ADDR TR SEC -> 547 ; WRITE A SINGLE SECTOR. 548 014556 002520' 014246' 000144' .WORD ONE,NWTS,ZBRAN,1$-.,PDOTQ 014564 000040 005104' 549 014570 030 .BYTE 30 550 014571 104 111 123 .ASCII /DISK WRITE ERROR IN WTS / 014574 113 040 127 014577 122 111 124 014602 105 040 105 014605 122 122 117 014610 122 040 111 014613 116 040 127 014616 124 123 040 551 .EVEN 552 014622 007574' .WORD QUIT 553 014624 001446' 1$: .WORD SEMIS 554 ; F.I.G. MACRO V04.00 00:02:08 PAGE 10-10 555 ; 556 014626 HEAD 205,SKEW1,261,SKEW1,DOCOL ; ***** SKEW1 557 ; SEQUENCE -> TRACK SECTOR 558 ; HANDLE THE SECTOR SKEWING. 559 ; NOTE - 'SEQUENCE #' IS ZERO-ORIGIN INDEX OF SECTOR (SKEWED). 560 ; NOTE - 'SKEW1' DOES SKEWING OF ONLY ONE DRIVE; 'SKEW' GENERALIZES 561 ; 'SKEW1' TO BOTH DRIVES. 562 014640 002054' 000060' 000032 .WORD DUP,LIT,32,SLASH,SWAP 014646 010516' 002026' 563 014652 001762' 000060' 000006 .WORD OVER,LIT,6,STAR,OVER,DUP,PLUS,PLUS,SWAP 014660 010456' 001762' 002054' 014666 001634' 001634' 002026' 564 014674 000060' 000032 010536' .WORD LIT,32,MOD,LIT,15,SLASH,PLUS 014702 000060' 000015 010516' 014710 001634' 565 014712 000060' 000032 010536' .WORD LIT,32,MOD,ONEP 014720 003322' 566 014722 002026' 003322' 002026' .WORD SWAP,ONEP,SWAP,SEMIS 014730 001446' 567 ; 568 014732 HEAD 206,S-SKIP,240,SSKIP,DOVAR ; ***** S-SKIP 569 ; VARIABLE - NUMBER OF SECTORS SKIPPED AT BEGINNING OF DISK. 570 ; DEFAULT IS 56 DECIMAL (SKIP AN RT-11 DIRECTORY). ALSO, TRACK 571 ; ZERO IS SKIPPED, FOR COMPATIBILITY. 572 014746 000070 .WORD 56. 573 ; 574 014750 HEAD 206,S-USED,240,SUSED,DOVAR ; ***** S-USED 575 ; VARIABLE - NUMBER OF SECTORS USED ON ON ONE DISK. 576 ; NORMALLY, S-USED + S-SKIP = 1976. (2002. - 26. OF TR 0). 577 014764 003600 .WORD 1920. 578 ; 579 014766 HEAD 204,SKEW,240,SKEW,DOCOL ; ***** SKEW 580 ; SEQUENCE# -> TRACK SECTOR 581 015000 002054' 003322' 014762' .WORD DUP,ONEP,SUSED,AT,GREAT,ZBRAN,1$-. 015006 002176' 003532' 000144' 015014 000036 582 015016 014762' 002176' 003436' .WORD SUSED,AT,SUB,SSKIP,AT,PLUS,SKEW1 015024 014744' 002176' 001634' 015032 014636' 583 015034 002026' 000060' 000115 .WORD SWAP,LIT,77.,PLUS,SWAP 015042 001634' 002026' 584 015046 000122' 000012 .WORD BRAN,2$-. 585 015052 014744' 002176' 001634' 1$: .WORD SSKIP,AT,PLUS,SKEW1 015060 014636' 586 015062 001446' 2$: .WORD SEMIS 587 ; 588 015064 HEAD 206,NSETUP,240,NSET,DOCOL ; ***** NSETUP 589 ; ADDR SEQUENCE# N -> ADDRN TRN SECN...ADDR1 TR1 SEC1 590 ; THIS PREPARES A WHOLE SCREEN (IF N=8) FOR 'NRTS' OR 'NWTS'. 591 015100 003564' 001762' 000060' .WORD ROT,OVER,LIT,128.,STAR,PLUS,ROT,ROT 015106 000200 010456' 001634' 015114 003564' 003564' 592 015120 001762' 001634' 002520' .WORD OVER,PLUS,ONE,SUB,SWAP,ONE,SUB,SWAP 015126 003436' 002026' 002520' 015134 003436' 002026' 593 015140 000334' .WORD XDO 594 015142 000060' 000200 003436' 2$: .WORD LIT,128.,SUB,DUP,I,SKEW,ROT F.I.G. MACRO V04.00 00:02:08 PAGE 10-11 015150 002054' 000360' 014776' 015156 003564' 595 015160 000060' 177777 000250' .WORD LIT,-1,XPLOO,2$-. 015166 177754 596 015170 002004' 001446' .WORD DROP,SEMIS 597 ; 598 015174 HEAD 203,R/W,327,RW,DOCOL ; ***** R/W 599 ; READ OR WRITE 1024-BYTE SCREEN. 600 ; ADDR BLOCK# FLAG(R=1,W=0) -> 601 015204 001506' 002520' 003436' .WORD TOR,ONE,SUB,LIT,8.,STAR,FROMR 015212 000060' 000010 010456' 015220 001524' 602 ; CHANGE THE SCREEN # TO FIRST SEQUENCE #. 603 ; IF READ, SETUP AND READ 8 SECTORS 604 015222 000144' 000054 000060' .WORD ZBRAN,1$-.,LIT,8.,NSET,LIT,8.,NRTS 015230 000010 015076' 000060' 015236 000010 014000' 605 015242 000144' 000030 005104' .WORD ZBRAN,2$-.,PDOTQ 606 015250 020 .BYTE 20 607 015251 104 111 123 .ASCII /DISK READ ERROR / 015254 113 040 122 015257 105 101 104 015262 040 105 122 015265 122 117 122 015270 040 608 .EVEN 609 015272 007574' .WORD QUIT 610 015274 000122' 000050 2$: .WORD BRAN,3$-. 611 ; SETUP AND WRITE 8 SECTORS 612 015300 000060' 000010 015076' 1$: .WORD LIT,8.,NSET,LIT,8.,NWTS 015306 000060' 000010 014246' 613 015314 000144' 000030 005104' .WORD ZBRAN,4$-.,PDOTQ 614 015322 020 .BYTE 20 615 015323 104 111 123 .ASCII /DISK WRITE ERROR/ 015326 113 040 127 015331 122 111 124 015334 105 040 105 015337 122 122 117 015342 122 616 .EVEN 617 015344 007574' .WORD QUIT 618 015346 4$: 619 015346 001446' 3$: .WORD SEMIS 620 ; 621 .ENDC 622 ; 623 ; *************** 624 ; 625 ; TRAP RECOVERY SECTION, RSX-11M 626 ; 627 ; *************** 628 ; 629 .IFNDF ALONE ; STAND-ALONE MUST HANDLE OWN INTERRUPTS. 630 HEAD 205,TRAPS,323,TRAPS,DOCOL ; ***** TRAPS 631 .WORD CR,PDOTQ 632 .BYTE 14 633 .ASCII /TRAP-ERROR, / F.I.G. MACRO V04.00 00:02:08 PAGE 10-12 634 .EVEN 635 .WORD DOT,SWAP,UDOT,UDOT,QUIT 636 .ENDC 637 ; 638 .IFDF RSX11 639 TRAPV: .WORD TRAP0,TRAP1,TRAP2,TRAP3,TRAP4,TRAP5 640 TRAP0: CLR R1 ; TRAP # 0 641 BR TRAPZ 642 TRAP1: MOV #1,R1 ; TRAP # 1 643 ADD #6,SP ; DROP MMU INFO 644 BR TRAPZ 645 TRAP2: MOV #2,R1 646 BR TRAPZ 647 TRAP3: MOV #3,R1 648 BR TRAPZ 649 TRAP4: MOV #4,R1 650 BR TRAPZ 651 TRAP5: MOV #5,R1 652 BR TRAPZ 653 ; TO RETURN FROM TRAP HANDLER, SET UP STACK, ETC. FOR FORTH 'TRAPS' 654 ; DON'T USE RTT OR RTI. 655 TRAPZ: MOV (SP)+,-(S) ; PC 656 MOV (SP)+,-(S) ; PS 657 MOV R1,-(S) ; TRAP # 658 MOV #TRAPS+2,IP ; EXECUTE 'TRAPS' 659 NEXT 660 ; 661 .ENDC 662 ; **************** 663 ; 664 ; TRAP RECOVERY SECTION, RT-11 665 ; 666 ; **************** 667 .IFDF RT11 668 TRAPZ: BCS 1$ 669 ; IF CARRY CLEAR, TRAP 4 670 MOV #4,R1 671 BR 2$ 672 1$: MOV #10,R1 673 2$: MOV (SP)+,-(S) ; PC 674 MOV (SP),-(S) ; PS 675 MOV R1,-(S) ; TRAP # 676 MOV #3$,-(SP) ; SO RTI WILL RESTORE PC TO '3$' 677 .TRPSET #TRAPBL,#TRAPZ ; RE-SET TRAPS 678 RTI 679 3$: MOV #TRAPS+2,IP ; EXECUTE 'TRAPS' 680 NEXT 681 .ENDC 682 ; 683 ; F.I.G. MACRO V04.00 00:02:08 PAGE 11 1 ; NOTE - '.W' ('DW') IS USED ONLY FOR TESTING - TO GET OCTAL OUTPUT 2 ; WHEN '.' IS NOT WORKING DURING SYSTEM DEVELOPMENT. 3 ; 4 ; 5 ; HEAD 202,.W,240,DW ; ***** .W 6 ; MOV (S),XOUT 7 ; ROL XOUT 8 ; ROL XOUT 9 ; MOV XOUT,IOCHR 10 ; ROR XOUT 11 ; BIC #177776,IOCHR 12 ; ADD #60,IOCHR 13 ; MOV IOCHR,-(S) 14 ; JSR R1,XCOUT 15 ; MOV #5,XCOUNT 16 ;XLP: ROL XOUT 17 ; ROL XOUT 18 ; ROL XOUT 19 ; ROL XOUT 20 ; MOV XOUT,IOCHR 21 ; ROR XOUT 22 ; BIC #177770,IOCHR 23 ; ADD #60,IOCHR 24 ; MOV IOCHR,-(S) 25 ; JSR R1,XCOUT 26 ; DEC XCOUNT 27 ; BNE XLP 28 ; MOV #40,IOCHR 29 ; MOV IOCHR,-(S) 30 ; JSR R1,XCOUT 31 ; NEXT 32 ;XOUT: .WORD 0 33 ;XCOUT: .WORD 0 34 ; 35 ; 36 ; 37 ; 38 ; 39 ; **************************************************************** 40 ; 41 ; THE FOLLOWING TWO DEFINITIONS ARE NOT PURE CODE, SO THEY WERE 42 ; MOVED HERE, NEAR THE END OF THE DICTIONARY. 43 ; 44 ; **************************************************************** 45 ; 46 015350 HEAD 305,<;CODE>,305,SEMIC,DOCOL ; ***** ;CODE 47 ; CREATE NEW DATA TYPE WITH CODE ROUTINE WRITTEN IN ASSEMBLY. 48 015362 004256' 004346' 004562' .WORD QCSP,COMP,PSCOD,LBRAC,SMUDG,SEMIS 015370 004374' 004440' 001446' 49 ; NOTE: LATER, THE ASSEMBLER WILL PATCH THIS DEFINITION. 50 ; 51 015376 HEAD 305,FORTH,310,FORTH,DODOE ; ***** FORTH 52 015410 007504' .WORD DOVOC 53 015412 120201 .WORD 120201 ; DUMMY HEADER AT INTERSECTION 54 015414 015420' .WORD TASK-10 55 015416 000000 XXVOC: .WORD 0 ; THE VOCABULARY LINK (FOR FUTURE USE) 56 015420 HEAD 204,TASK,240,TASK,DOCOL ; ***** TASK F.I.G. MACRO V04.00 00:02:08 PAGE 11-1 57 015432 001446' .WORD SEMIS 58 ; 59 ; 60 ; 61 ; F.I.G. MACRO V04.00 00:02:08 PAGE 12 1 ; **************************************************************** 2 ; 3 ; STACKS AND BUFFERS 4 ; 5 ; **************************************************************** 6 ; 7 ; NOTE - 'UP', 'OPENF', 'INTERM', AND DISK BUFFERS ARE 8 ; INITIALIZED AT COLD START, OR AT FIRST TIME THROUGH. 9 .EVEN 10 015434 XDP: ; DICTIONARY STARTS HERE 11 015434 .BLKB 8000. ; FOR DICTIONARY AND COMP. STACK 12 ; INCREASE THIS NUMBER TO USE A LARGER MEMORY SIZE. 13 035134 XS0: ; START OF COMPUTATION STACK 14 035134 .BLKW 2 ; IN CASE OF EMPTY STACK 15 ; 16 ; 17 ; 18 ; 19 ; 20 035140 DSKBUF: ; ROOM FOR 3 1K DISK BUFFERS 21 ; INITIALIZE BUFFERS' UPDATE BITS, AND TERMINATING NULLS, TO ZERO. 22 ; NOTE - THESE BUFFERS ARE CLEARED AT COLD START, ANYWAY, 23 ; BECAUSE A STAND-ALONE BOOT MAY NOT INITIALIZE HIGH MEMORY; 24 ; AND ALSO SO THAT THE NUMBER OR LOCATION OF BUFFERS CAN BE 25 ; CHANGED AT RUN TIME. 26 035140 .BLKW 1 27 035142 .BLKB 1024. 28 037142 .BLKW 1 29 037144 .BLKW 1 30 037146 .BLKB 1024. 31 041146 .BLKW 1 32 041150 .BLKW 1 33 041152 .BLKB 1024. 34 043152 .BLKW 1 35 043154 ENDBUF: ; CAUTION - 'ENDBUF' - 'DSKBUF' MUST BE EXACT MULTIPLE 36 ; OF THE BUFFER LENGTH PLUS 4. 37 ; 38 ; 39 ; 40 ; 41 ; 42 ; 'XTIB', 'XR0', AND 'XUP' ARE ONLY USED IN BOOT-UP TABLE; 43 ; THEREFORE THE AREAS DEFINED HERE CAN BE MOVED AT RUN TIME. 44 043154 XTIB: .BLKW 42. ; TERMINAL INPUT BUFFER 45 043300 .BLKW 50. ; FOR RETURN STACK 46 043444' XR0=. 47 043444 XUP: .BLKW 100 ; ROOM FOR 100 USER VARIABLES 48 ; 49 ; 50 .IFDF RT11 51 ; DISK HANDLER GOES HERE 52 HANDLR: .WORD .+2 53 .ENDC 54 ; 55 ; 56 ; NOTE - CHANGE THE FOLLOWING LINE TO '.END' IF LINKING TO OTHER LANGUAGES. 57 000000' .END ORIGIN F.I.G. MACRO V04.00 00:02:08 PAGE 12-1 SYMBOL TABLE ABORT 007652R DOES 004632R INDEX 013322R PORIG 002632R THEN 012216R ABS 010136R DOT 013146R INTER 007274R PQTER 013674R THREE 002540R AGAIN 012402R DOTQ 005140R IP =%000004 PREV 003310R TIB 002676R ALLOT 003402R DOTR 013106R KEY 001030R PSCOD 004562R TICK 011766R ALONE = 000001 DOUSE 002474R LATES 003742R PSTOR 002072R TOGGL 002124R AND 001302R DOVAR 002450R LBRAC 004374R QALIG 005226R TOR 001506R ARROW 011726R DOVOC 007504R LEAVE 001466R QCOMP 004152R TRAV 003674R AT 002176R DP 002756R LESS 003502R QCSP 004256R TRIAD 013402R BACK 012116R DPL 003212R LFA 003762R QERR 004120R TWO 002530R BASE 003200R DPLUS 001652R LIMIT 003026R QEXEC 004202R TWOP 003340R BBUF 002600R DRIV2 014212R LINK = 015420R QLOAD 004314R TYPE 004714R BCOMP 007032R DRONE 011160R LINK2 = 015420R QPAIR 004232R U =%000003 BDIGS 012636R DROP 002004R LIST 013220R QSTAC 007214R UDIV 001226R BEGIN 012140R DRZER 011140R LIT 000060R QTERM 001046R UDOT 013200R BL 002552R DSKBUF 035140R LITER 007066R QUERY 005446R ULESS 007154R BLANK 005654R DTRAI 005020R LOAD 011644R QUEST 013162R UMULT 001144R BLK 003040R DUP 002054R LOOP 012260R QUIT 007574R UNTIL 012340R BLOCK 011316R ECELL 004770R MAX 010240R R 001540R UPDAT 010742R BRAN 000122R EDIGS 012656R MESS 011552R RBRAC 004412R UPPER 006416R BSCR 002614R ELSE 012514R MIN 010210R REPEAT 012432R USE 003274R BUFFE 011206R EMIT 001020R MINUS 001712R RNUM 003250R USER 002466R BUILD 004612R ENCL 000676R MLOOP 000566R ROT 003564R USLAS 001214R BYE 013764R ENC1 000712R MOD 010536R RP =%000006 USTAR 001132R CAT 002216R ENC2 000726R MSLAS 010354R RPSTO 001426R VAR 002442R CENT 007732R ENC3 000744R MSMOD 010622R RTS 014476R VLIST 013472R CFA 004002R ENC4 000772R MSTAR 010270R RW 015202R VOCAB 007444R CL 002564R END 012364R MTBUF 011010R RXCS = 177170 VOCL 002776R CMOVE 001070R ENDBUF 043154R NFA 004020R RXDB = 177172 W =%000002 COLD 007730R ENDIF 012162R NOFAST 000560R RZERO 002664R WARN 002730R COLON 002314R EQUAL 003452R NOFST1 000604R S =%000005 WENT 010014R COMMA 003416R ERASE 005632R NRTS 014000R SCR 003076R WHILE 012556R COMP 004346R ERROR 006530R NSET 015076R SCSP 004074R WIDTH 002712R CON 002406R EXEC 000102R NULL 005476R SEMI 002354R WORD 005750R CONT 003132R EXPEC 005254R NUMB 006206R SEMIC 015360R WTS 014554R COUNT 004670R FAILED 000646R NWTS 014246R SEMIS 001446R W2 010020R CR 001056R FAST 000532R OCTAL 004534R SIGN 012710R XDO 000334R CREAT 006700R FCOMP 000532R OFSET 003114R SKEW 014776R XDP 015434R CSP 003236R FENCE 002744R ONE 002520R SKEW1 014636R XLOOP 000202R CSTOR 002270R FILL 005572R ONEP 003322R SLASH 010516R XMATCH 000544R CURR 003150R FIRST 003012R OR 001322R SLMOD 010476R XOR 001340R DABS 010164R FLD 003224R ORIGIN 000000R SMUDG 004440R XPLOO 000250R DDOT 013130R FLUSH 011042R OUT 003064R SPACE 003622R XR0 = 043444R DDOTR 013042R FORGE 012020R OVER 001762R SPACS 012600R XS0 035134R DDUP 003644R FORTH 015406R PABOR 006512R SPAT 001366R XTIB 043154R DEC 004510R FROMR 001524R PAD 005724R SPSTO 001406R XUP 043444R DEFIN 007532R GFORTH 000000RG PAREN 007552R SSKIP 014744R XXB1 007606R DFIND 006336R GO 010060R PBUF 010660R SSLA 010600R XXB2 007636R DIG 012736R GREAT 003532R PCR 013722R SSMOD 010556R XXD2 006726R DIGIT 000400R HERE 003362R PDOTQ 005104R STAR 010456R XXD6 007106R DIGS 013012R HEX 004462R PEMIT 013576R STATE 003164R XXEA 007340R DLINE 011526R HLD 003262R PFA 004046R STOD 010110R XXE1 006472R DLITE 007124R HOLD 005674R PFIND 000506R STORE 002242R XXE2 006430R DMINU 001734R I 000360R PKEY 013632R SUB 003436R XXE3 006404R DO 012232R IDDOT 006610R PLINE 011464R SUSED 014762R XXE4 007276R DOCOL 002340R IF 012464R PLOOP 012310R SWAP 002026R XXE5 007326R DOCON 002420R IMMED 007412R PLUS 001634R SZERO 002652R XXE6 007332R DODOE 004646R IN 003052R PNUMB 006072R TASK 015430R XXE7 007372R F.I.G. MACRO V04.00 00:02:08 PAGE 12-2 SYMBOL TABLE XXFA 006324R XXK1 005266R XXN4 006546R XXT1 010716R XXW6 005030R XXF3 006074R XXK2 005346R XXN5 007144R XXT2 011220R XXW7 005062R XXF4 007364R XXK3 005424R XXRA 012620R XXT3 011266R XXZ1 013260R XXF5 007370R XXK4 005376R XXRB 010200R XXT4 011442R XXZ2 013334R XXF6 006244R XXK5 005400R XXR1 012730R XXT5 011356R XXZ3 013364R XXF7 006312R XXL1 004734R XXR2 012772R XXT6 011410R XXZ4 013434R XXG4 006170R XXL2 004752R XXR3 013014R XXT7 011112R XXZ5 013512R XXG5 006162R XXL3 004754R XXR4 012626R XXVOC 015416R XXZ6 013540R XXI1 005774R XXL6 005202R XXR5 010152R XXWA 005066R ZBRAN 000144R XXI2 006000R XXL7 005212R XXR6 010256R XXW3 011612R ZEQU 001556R XXJ1 005550R XXN1 003700R XXR7 010226R XXW4 011632R ZERO 002510R XXJ2 005554R XXN2 004136R XXTA 011056R XXW5 011616R ZLESS 001606R XXJ4 005560R XXN3 004140R . ABS. 000000 000 043644 001 ERRORS DETECTED: 0 VIRTUAL MEMORY USED: 8704 WORDS ( 34 PAGES) DYNAMIC MEMORY AVAILABLE FOR 67 PAGES DK:FORTH,DK:FORTH=DK:FORTH