plato:source:plaopl:comput
Table of Contents
COMPUT
Table Of Contents
- [00008] EXECUTION OF COMPUTE COMMAND
Source Code
- COMPUT.txt
- COMPUT
- * /--- FILE TYPE = E
- * /--- BLOCK COMPUT 00 000 79/12/03 22.46
- IDENT PLAT2$
- LCC OVERLAY(PLATO,1,0)
- END
- IDENT COMPUT
- TITLE EXECUTION OF COMPUTE COMMAND
- *
- *
- CST
- *
- *
- COMPUT$ OVFILE
- *
- *
- *
- EXT PROCESS,PROCESX
- EXT NGETVAR
- EXT FGETVAR
- EXT ECSPRTY HANDLE ECS PARITY ERRORS
- EXT CSPREAD CHECKS STRING BOUNDS AND SPREADS CHARS
- EXT POSTOR
- * INTO TAG FOR COMPILE.
- EXT COMPCOM SPECIAL ENTRY TO -COMPILE-.
- *COMPCOM GENERATES CODE EVEN FOR SIMPLE REFERENCES.
- EXT QCMPCOM ENTRY TO -COMPILE- FOR 3 TAGS
- * QCMPCOM GENERATES THE SIMPLEST POSSIBLE GETVAR CODE
- *
- *********************************************************
- *
- *COMPUTE RESULT,START,COUNT,POINTER (OPTIONAL) (EXECUTION)
- *
- *CHECK GETVAR CODE FOR POINTER. IF 0, THEN THERE IS NO
- *POINTER AND THE COMPILED CODE WILL NOT BE SAVED. OTHERWISE,
- *CHECK POINTER TO SEE WHETHER THIS -INTERPRETIVE- CALC
- *IS ALREADY COMPILED IN ECS. IF NOT, COMPILE AND ADD
- *CODE TO ECS BUFFER -COMPBUF- FOR LATER REUSE.
- *
- *RESULT GETS THE RESULT OF EXECUTING THE CALC,
- *START IS LOCATION OF CHAR STRING,
- *COUNT IS CHAR COUNT OF STRING,
- *AND POINTER CONTAINS NOT ONLY POINTER TO MACHINE CODE
- *IN ECS, BUT SECURITY FIELDS TO MAKE SURE IT
- *IS APPROPRIATE AND SAFE TO JUMP INTO THAT CODE.
- *WHEN CODE IS READ FROM ECS, THE FIRST WORD IS CHECKED
- *FOR EQUALITY WITH POINTER.
- *
- *POINTER DATA FORMAT---
- * 6/46B,12/STATION,19/CLOCK,
- * 1/I-F BIT,4/CALC ADDR,7/ECS WORD COUNT,11/ECS ADDRESS
- *
- *INITIAL 46B (PASS CODE) INSURES NO CONFUSION BETWEEN
- *HEADER WORD AND CALC CODE, SINCE TUTOR MACHINE CODE
- *NEVER STARTS WITH A PASS. NEVERTHELESS IT IS
- *THEORETICALLY POSSIBLE FOR A POINTER TO AGREE WITH AN
- *INTEGER LITERAL PLANTED AT THE BEGINNING OF THE CODE.
- *SUCH A LITERAL IS SEARCHED FOR WHEN THE INITIAL
- *COMPILATION IS DONE, AND IF PRESENT CAUSES THE MACHINE
- *CODE NOT TO BE SAVED.
- *
- *I-F BIT TELLS WHETHER CALC RESULT IS INTEGER-FLOATING.
- *MACHINE CODE STARTS WITH LITERALS--CALC ADDRESS POINTS
- *TO BEGINNING OF CALC PROPER.
- *ECS ADDRESS IS RELATIVE TO BEGINNING OF COMPBUF BUFFER.
- *
- **********************************************************
- * /--- BLOCK START 00 000 79/12/02 05.23
- COMPTOV OVRLAY
- SX7 -1 FLAG -STORE- CODE NOT PRESENT
- SA7 JJSTORE
- SA7 TFORMOK CALC OK IF CERROR IS -1
- AX5 XCMNDL RIGHT-ADJUST EXTRA-STORAGE POINTER
- MX0 2*XCODEL+XCMNDL
- BX5 -X0*X5
- SA1 B5+X5 PICK UP LAST TWO ARGUMENTS
- BX7 X1 SAVE THIS
- SA7 SAVCOD
- BX5 X1
- LX5 XCODEL 4TH ARGUMENT---POINTER
- MX2 XCODEL TOP 20 BITS
- BX2 X2*X5
- ZR X2,ONLY3 IF -GETVAR- CODE=0 (NO 4TH ARG)
- NGETVAR 4
- SX7 A1 GET POINTER ADDRESS
- SA7 POINTER AND SAVE IT
- SA2 STATION NOW BUILD 46B--STATION
- MX0 48 TO CHECK FOR POSSIBLE CORRECT POINTER
- BX2 -X0*X2 4096 STATIONS MAXIMUM
- SX3 46B PASS CODE HEADER
- LX3 12
- BX7 X2+X3 MERGE 46B WITH STATION
- LX7 42
- SA7 SAVID SAVE THIS IDENTIFICATION
- BX3 X7-X1 COMPARE WITH POINTER
- MX7 18 12 BITS OF STATION, 6 BITS OF 46B PASS CODE
- BX7 X7*X3
- NZ X7,NOTREDY JUMP IF CALC NOT ALREADY COMPILED
- *
- BX7 X1 THIS STRING HAS ALREADY BEEN COMPILED
- LX7 37 SHIFT I/F BIT TO SIGN POSITION
- SA7 IFFLAG SAVE FOR END CHECK ON NEED FOR ROUNDING
- MX0 49
- BX0 -X0*X1 11-BIT ECS ADDRESS RELATIVE TO COMPBUF
- SA2 COMPBFA
- IX0 X0+X2 ABSOLUTE ECS ADDRESS
- MX2 42
- BX2 -X2*X1
- AX2 11 ECS WORD COUNT (INCLUDES HEADER WORD)
- SB1 X2 ECS COUNT IN B1
- SA0 INFO-1 CM ADDRESS TO READ INTO
- + RE B1 READ THE BLOCK IN
- - RJ ECSPRTY
- SA2 A0 EXAMINE HEADER WORD
- BX7 X1-X2 MUST MATCH POINTER WORD
- NZ X7,NOTREDY JUMP IF MACHINE CODE HAS BEEN OVERWRITTEN
- NG X7,NOTREDY BY LATER COMPILATIONS.
- AX1 18 GET CALC STARTING LOCATION
- MX0 56 4 BITS
- BX0 -X0*X1
- SB1 X0 START OF CALC RELATIVE TO INFO
- SETUP RJ SETUP1
- JP INFO+B1 EXECUTE THE CALC
- *
- * /--- BLOCK SETUP 00 000 79/12/03 22.46
- *
- SETUP1 EQ * MUST PRESERVE X5,X6
- SX7 -1 SET CALC ERROR TO -OK-
- SA7 TFORMOK
- SB3 A5
- SX7 B5-B3 SAVE COMMAND BIAS
- SA7 OLDB5
- SB3 READYR RETURN TO READYR
- SB5 INFO BIAS FOR LITERAL IN CALC
- EQ SETUP1
- *
- *
- READYR BX6 X1 RESULT RETURNED IN X1
- * MOVED TO X6 FOR PUTVAR MACRO
- SA1 OLDB5 MUST RESTORE B5
- MX7 59 -1
- SA7 A1 CLEAR OLDB5
- SB5 X1
- SB5 A5+B5
- SA5 A5 RESTORE X5
- SA2 IFFLAG
- PL X2,IRESULT JUMP IF INTEGER RESULT
- *
- FPUTVAR 1 STORE FLOATING RESULT
- EQ PROCESX
- *
- IRESULT NPUTVAR 1 STORE INTEGER RESULT
- EQ PROCESX
- *
- *
- ONLY3 RJ EVAL PREPARE FOR COMPILATION
- RJ QCMPCOM COMPILE
- BX5 X1 FOR GETVAR
- LX5 2*XCODEL -GETVAR- CODE IN UPPER 20 BITS
- BX6 X1
- LX6 60-XCODEAL-4 MOVE I/F BIT TO SIGN BIT
- SA6 IFFLAG STORE IT
- RJ SETUP1 SET THINGS UP
- PL X6,INT X6 NOT TOUCHED BY SETUP1
- FGETVAR 2
- EQ READYR DONE
- INT NGETVAR 2
- EQ READYR DONE
- *
- *
- * /--- BLOCK READY 00 000 79/07/15 16.01
- *
- *
- NOTREDY RJ EVAL NOT COMPILED YET
- RJ COMPCOM COMPILE MACHINE CODE
- BX7 X1 PICK OUT I/F BIT
- LX7 60-XCODEAL-4
- SA7 IFFLAG I/F BIT IN SIGN BIT
- MX0 60-XCODEAL
- BX7 -X0*X1 SAVE CALC LOCATION
- SB1 X7 SAVE CALC LOCATION
- AX7 4 SHOULD BE <16 LITERALS IN FRONT OF CALC
- NZ X7,NOSAVE JUMP IF MACHINE CODE WILL NOT BE SAVED
- AX1 XCODEAL+3 GET I/F BIT
- LX1 4
- SX7 X1+B1 MERGE CALC BIAS AND I/F BIT
- SA1 COMPPNT POINTER TO NEXT AVAILABLE LOCATION
- *IN ECS BUFFER COMPBUF.
- SA3 INX NUMBER OF WORDS OF MACHINE CODE
- SX6 46B CHECK THAT THERE ARE NO LITERALS
- LX6 54 STARTING WITH 46B
- SA6 X3+INFO PLANT SUCH A LITERAL FOR A SEARCH
- MX0 6
- SB2 1
- SA2 INFO-1
- CLOOP SA2 A2+B2 PICK UP NEXT LITERAL OR INSTRUCTION
- BX2 X2-X6 X6 CONTAINS 46B AT LEFT
- BX2 X0*X2 MASK FIRST 6 BITS
- NZ X2,CLOOP LOOP UNTIL PLANTED WORD FOUND
- SB2 A2 A2 SHOULD EQUAL A6
- SB2 A6-B2
- NZ B2,NOSAVE JUMP IF CANNOT SAVE CODE DUE TO 46B PRESENT
- SX2 X3+1 PLUS HEADER WORD
- BX3 X2
- AX3 7
- NZ X3,NOSAVE JUMP IF MORE THAN 126 WORDS IN CALC
- IX6 X1+X2 NEW COMPPNT
- SX0 X6-COMPBFL SUBTRACT COMPBUF LENGTH
- NG X0,ISROOM JUMP IF THERE IS ROOM FOR THIS CALC
- SX1 B0 ELSE RESET POINTER (CIRCULAR BUFFER)
- BX6 X2
- ISROOM SA6 A1 UPDATE COMPPNT
- LX7 7
- BX7 X2+X7 MERGE ECS WORD COUNT
- LX7 11
- BX7 X1+X7 MERGE ECS ADDRESS
- SA3 SAVID RETRIEVE 46-STATION CODE
- BX7 X7+X3 MERGE TO MAKE 60-BIT POINTER
- SA3 SYSCLOK SYSTEM TIME (INT NUM OF MS)
- AX3 8 KEEP TO NEAREST 0.25 SEC
- MX0 -19 KEEP 19 BITS (2**17 SEC IS ABOUT 1.5 DAYS)
- * /--- BLOCK IRESULT 00 000 79/07/15 16.01
- BX3 -X0*X3
- LX3 23 POSITION FOR MERGE
- BX7 X3+X7 MERGE IN TIME
- SA7 INFO-1 PLACE HEADER IN FRONT OF CALC
- SA0 A7 A0 IS CM ADDRESS FOR EC WRITE
- SA3 POINTER GET ADDRESS OF POINTER
- SA7 X3 UPDATE POINTER
- SB2 X2 WORD COUNT INCLUDES HEADER
- SA3 COMPBFA COMPBFA CONTAINS BUFFER INITIAL ADDRESS
- IX0 X1+X3
- + WE B2 SEND HEADER AND CALC TO ECS
- - RJ ECSPRTY
- EQ SETUP GO EXECUTE THE CALC
- *
- *
- *
- EVAL EQ *
- SA5 A5 CALC NOT ALREADY COMPILED
- LX5 XCODEL SO NEED STRING ADDRESS AND CHAR COUNT
- NGETVAR 2
- SX7 A1 SAVE STRING ADDRESS
- SA7 IFFLAG AVAILABLE TEMP
- SA1 SAVCOD EXTRA STORAGE ARGUMENTS
- BX5 X1
- NGETVAR INC GET CHAR COUNT
- SX7 6 BAD FORM
- ZR X1,BADFORM
- NG X1,BADFORM
- SX2 101 ALLOW 100 CHARS
- IX2 X1-X2 CHECK FOR POSSIBLE SHOW BUFFER OVERFLOW
- NG X2,EVAL2
- SX7 16 TOO COMPLICATED TO COMPILE
- BADFORM SA7 TFORMOK
- EQ PROCESX
- EVAL2 SA2 IFFLAG RESTORE ADDRESS
- SA0 X2
- RJ CSPREAD SPREAD PACKED STRING FOR COMPILE
- MX7 0
- SA7 INX COMPILE INTO INFO BUFFER
- EQ EVAL
- *
- *
- NOSAVE SX7 B0 CLEAR POINTER IF MACHINE CODE NOT SAVED
- SA2 POINTER
- SA7 X2
- EQ SETUP EXECUTE THE CALC
- *
- *
- POINTER BSS 1 POINTS TO MACHINE CODE
- IFFLAG BSS 1 SIGN BIT ON IF MACHINE CODE FLOATING POINT
- SAVID BSS 1 SAVE 46B-STATION BITS
- SAVCOD BSS 1 SAVE CODE FIELDS
- *
- ENDOV
- OVTABLE
- END COMPUT$
plato/source/plaopl/comput.txt ยท Last modified: 2023/08/05 18:54 by Site Administrator