plato:source:plaopl:eformat
Table of Contents
EFORMAT
Table Of Contents
- [00005] OUTPUT FORMATTING
- [00019] -EFORMAT- OUTPUT TO ECS FORMAT BUFFER
- [00181] -WFORMAT- WAIT FOR FORMAT INITIALIZATION
- [00200] -FORMREQ- PROCESS FORMATTER REQUESTS
- [00275] RXCB/WXCB READ/WRITE ECS CIRCULAR BUFFER
Source Code
- EFORMAT.txt
- EFORMAT
- * /--- FILE TYPE = E
- * /--- BLOCK IDENT 00 000 79/06/19 18.19
- IDENT EFORMAT
- TITLE OUTPUT FORMATTING
- *
- * GET COMMON SYMBOL TABLE
- *
- CST
- *
- *
- EXT ECSPRTY SYSTEM ECS ERROR ACTION
- *
- *
- QDIV EQU 10 DIVIDING POINT FOR QUEUE CHOICE
- FASTMAX EQU 20 UPPER LIMIT FOR FAST QUEUE
- *
- * /--- BLOCK EFORMAT 00 000 79/10/08 23.15
- TITLE -EFORMAT- OUTPUT TO ECS FORMAT BUFFER
- *
- * 'IT IS ASSUMED THAT A5/B5/B7 ARE NOT USED HERE, SINCE
- * EFORMAT CAN BE CALLED FROM THE EXECUTOR (E.G., -SEND-).
- *
- *
- *
- * -EFORMAT-
- * OUTPUT *MOUT* BUFFER TO ECS FORMAT BUFFER
- *
- * EACH BUFFER CONSISTS OF A HEADER WORD, GIVING THE
- * LENGTH AND STATION NUMBER, FOLLOWED BY THE
- * CONTENTS OF THE MOUT BUFFER.
- *
- * ON THE BASIS OF WHETHER MOUTLOC IS LESS THAN
- * *QDIV*, THE OUTPUT IS PLACED EITHER IN THE FAST
- * FORMAT QUEUE OR THE MAIN BUFFER. THE RESULT IS
- * THAT SHORT AMOUNTS OF OUTPUT WILL RECEIVE PRIORITY
- * PROCESSING BY THE FORMATTER.
- * MOUTS LONGER THAN *QDIV* BUT LESS THAN *FASTMAX*
- * MAY ALSO BE ROUTED TO THE FAST FORMAT QUEUE IF
- * *FQHIGH* IS NON-ZERO
- *
- * 'A SPECIAL CASE IS THAT OF ALL-STATION -SEND- COMMANDS. 'SO
- * AS TO PRESERVE CORRECT TIME-ORDERING, THE ALL-STATION
- * SEND DRIVES EFORMAT FOR EACH STATION SENT TO. 'THE STATION
- * TO BE SENT TO IS SPECIFIED IN FORCSTN (NORMALLY NEGATIVE).
- * 'AT THE END OF THE EFORMAT CALL THE MOUT BUFFER IS RE-
- * INITIALIZED BY EFORMAT, TO BE READY FOR THE NEXT MESSAGE
- * TO BE SENT.
- *
- *
- ENTRY EFORMAT
- EFORMAT EQ *
- SA1 MOUTLOC CHECK IF ANY OUTPUT
- ZR X1,EFEND
- NG X1,EFEND
- SX0 X1-MOUTEND+1 CHECK IF TOO MUCH OUTPUT
- PL X0,EFEND
- *
- * /--- BLOCK EFORMAT 00 000 79/10/11 23.56
- *
- * SPECIAL HANDLING FOR -SEND-
- *
- EF100 SA2 FORCSTN OVERRIDE STATION FOR -SEND-
- NG X2,EF101 JUMP IF NO OVERRIDE
- CALL DMPSYSB
- SA3 STATION
- BX6 X3
- SA6 LFORCST SAVE SENDING STATION NO.
- SA2 FORCSTN
- BX6 X2
- SA6 A3 OVERRIDE STATION
- CALL LODSYSB GET SENT-TO STATION BANK
- *
- * DECIDE WHICH FORMAT BUFFER TO USE
- *
- EF101 INTLOK X,I.EFORM,W INTERLOCK FORMAT BUFFER
- SA1 MOUTLOC LENGTH OF OUTPUT
- SX1 X1+1 LENGTH OF OUTPUT + HEADER
- BX6 X1
- LX6 24 POSITION LENGTH OF OUTPUT
- SA2 STATION
- BX6 X2+X6 ATTACH STATION NUMBER
- SA6 POBUFF STORE HEADER WORD
- SA2 FORCSTN
- PL X2,EF114 IF SEND CASE, LONG QUEUE
- SA2 SUBMOUT CHECK IF OUTPUT ALREADY PENDING
- SA3 OUTMOUT
- IX2 X3-X2
- PL X2,EF112 JUMP IF FORMAT CAUGHT UP
- SA2 STFLAGS
- LX2 60-TPFQS POSITION PLATO-FORMAT QUEUE BIT
- NG X2,EF114 PREVIOUS OUTPUT IN LONG QUEUE
- EQ EF115 PREVIOUS OUTPUT IN FAST QUEUE
- *
- EF112 SX4 X1-FASTMAX CHECK IF TOO LONG FOR FAST QUE
- PL X4,EF114
- SX4 X1-QDIV-1 CHECK FOR SHORT OUTPUT LENGTH
- NG X4,EF115 ROUTE SHORT OUTPUT TO FAST QUE
- SA1 FQHIGH CHECK IF SHOULD FORCE FAST QUE
- NZ X1,EF115
- *
- * OUTPUT TO MAIN (LONG OUTPUT) FORMAT BUFFER
- *
- EF114 CALL WXCB,POBUFF,LONGQD
- SX0 1 X0 = 1 = LONG OUTPUT QUEUE
- ZR X6,EFFLOW IF LONG OUTPUT BUFFER IS FULL
- EQ EF120
- *
- * OUTPUT TO HIGH PRIORITY FORMAT BUFFER
- *
- EF115 CALL WXCB,POBUFF,FASTQD
- MX0 0 X0 = 0 = FAST OUTPUT QUEUE
- ZR X6,EFFLOW IF HIGH PRIORITY BUFFER IS FULL
- *
- * /--- BLOCK EFORMAT 00 000 79/10/10 20.46
- *
- EF120 SA2 FORCSTN
- PL X2,EF130 IF SEND CASE NO UPDATES
- LX0 TPFQS-1 POSITION FAST/LONG QUEUE BIT
- SX2 1
- LX2 TPFQS-1 POSITION MASK FOR QUEUE BIT
- SA1 STFLAGS
- BX1 -X2*X1 CLEAR CURRENT VALUE
- BX6 X0+X1 ATTACH NEW VALUE
- SA6 A1
- SA1 SUBMOUT INCREMENT NUMBER OF MOUTS SENT
- SX6 1 INCREMENT *MOUT* SUBMITTED
- IX6 X1+X6
- SA6 A1
- EQ EF140
- EF130 SA2 LFORCST (X2) = ORIGINAL STATION
- BX6 X2
- SA6 STATION RESTORE STATION NUMBER
- CALL LODSYSB
- * SET TBPAUSE TO -1 SO THAT OK/NO WILL BE PLACED AT END
- * OF MOUT BUFFER INSTEAD OF AT BEGINNING';
- MX6 -1
- SA6 TBPAUSE
- EF140 INTCLR X,I.EFORM
- EFEND MX6 0
- SA6 MOUTLOC REINITIALIZE MOUT BUFFER
- MX6 -1
- SA6 FORCSTN RE-INITIALIZE FORCSTN
- EQ EFORMAT
- *
- *
- * PROCESS BUFFER OVERFLOW
- *
- EFFLOW BSS 0
- SA2 =5AFASTL CONFIG PARM - FAST OUTPUT QUEUE
- ZR X0,EFFLOW1 IF FAST OUTPUT QUEUE TOO SHORT
- SA2 =5AFORML CONFIG PARM - LONG OUTPUT QUEUE
- EFFLOW1 BSS 0
- SB1 3 (B1) = (S=LOG) DAYFILE PARAM
- CALL S=CONF ISSUE DAYFILE / B-DISPLAY MSGS
- SA1 FORFLOW INCREMENT OVERFLOW COUNT
- SX6 X1+1
- SA6 A1
- INTCLR X,I.EFORM CLEAR FORMAT BUFFER INTERLOCK
- CALL DMPSYSB RETURN /STATION/ BANK
- SA2 FORCSTN CHECK FOR SPECIAL -SEND-
- NG X2,EFFLOW2
- SA2 LFORCST
- BX6 X2
- SA6 STATION
- EFFLOW2 BSS 0
- CALL WFORMAT
- CALL ECSREQ PROCESS FRAMAT ECS REQUESTS
- CALL S=WAIT,100 IDLE FOR A WHILE
- CALL LODSYSB RE-LOAD /STATION/ BANK
- EQ EF100
- *
- *
- LFORCST BSS 1 SAVE ORIGINAL STATION NO.
- *
- *
- * /--- BLOCK WFORMAT 00 000 79/07/15 23.38
- TITLE -WFORMAT- WAIT FOR FORMAT INITIALIZATION
- *
- *
- *
- * -WFORMAT-
- * IDLE EXECUTOR WHILE FORMAT INITIALIZE FLAG SET
- *
- ENTRY WFORMAT
- WFORMAT EQ *
- SX0 FORINIP FRAMAT INITIALIZATION FLAG
- RX1 X0 (-RXX- 1 WD READ, MAY CHG *A1*)
- PL X1,WFORMAT
- CALL ECSREQ PROCESS FRAMAT ECS REQUESTS
- CALL S=BMSG,(=18CWAITING FOR FRAMAT)
- CALL S=WAIT,100 IDLE FOR A WHILE
- EQ WFORMAT
- *
- *
- * /--- BLOCK FORMREQ 00 000 81/06/29 10.39
- TITLE -FORMREQ- PROCESS FORMATTER REQUESTS
- *
- *
- *
- * -FORMREQ-
- * PROCESS ACTION REQUESTS MADE BY FORMATTER
- *
- * FORMAT OF REQUEST WORD -
- * 1ST 24 BITS = REQUEST INFO
- * NEXT 12 = LENGTH OF REQUEST (=1)
- * NEXT 12 = REQUEST TYPE
- * 0 = NO-OP
- * 1 = *CATCHUP* REQUEST
- * 2 = PARCELS AT MINIMUM THRESHOLD
- * NEXT 12 = STATION NUMBER
- *
- * FORMAT OF *CATCHUP* REQUEST -
- * 1ST 06 BITS = UNUSED
- * NEXT 18 = MILLISECOND DELAY TIME
- * NEXT 12 = 1 = REQUEST LENGTH
- * NEXT 12 = 1 = REQUEST TYPE
- * NEXT 12 = STATION
- *
- *
- ENTRY FORMREQ
- FORMREQ EQ *
- FR020 SX0 FORINIP FRAMAT INITIALIZATION FLAG
- RX1 X0 (-RXX- 1 WD READ, MAY CHG *A1*)
- NG X1,FR980
- SX6 20 SET UP MAX NUMBER OF REQUESTS
- SA6 FREQCNT TO PROCESS IN ONE POLL
- *
- FR100 SA1 FREQCNT
- SX6 X1-1 COUNT DOWN PERMISSIBLE ACTIONS
- NG X6,FORMREQ IF WE HAVE DONE THE MAXIMUM
- SA6 A1
- CALL RXCB,POBUFF,FREQQD,0
- ZR X6,FORMREQ EXIT IF NOTHING TO PROCESS
- EQ FPROC GO TO PROCESS REQUEST
- *
- FR980 CALL ECSREQ PROCESS ECS REQUESTS
- CALL S=WAIT,50 WAIT FOR FORMAT READY
- EQ FR020
- *
- *
- FREQCNT BSS 1
- *
- *
- * /--- BLOCK FORMREQ 00 000 81/06/24 22.29
- *
- * PROCESS NEXT FORMAT REQUEST
- *
- FPROC MX0 -12
- SA1 POBUFF 24/INFO, 12/1, 12/TYPE, 12/STN
- LX1 60-12
- BX2 -X0*X1 PICK OFF FORMAT REQUEST TYPE
- SB1 X2
- JP B1+*+1
- *
- + EQ FR100 0 = NO-OP
- + EQ "CRASH" 1 = CATCHUP (UNUSED)
- + EQ FR2001 2 = MINIMUM PARCELS LEFT
- SPACE 5,11
- * PRESS KEY INDICATING PARCELS AT MINIMUM THRESHOLD
- FR2001 LX1 12 POSITION STATION NUMBER
- BX6 -X0*X1
- SA6 INFO
- CALL PRESKEY,FR200A,INFO
- EQ FR100
- FR200A CON CATCHUP
- *
- *
- * /--- BLOCK -RXCB- 00 000 81/06/29 10.40
- TITLE RXCB/WXCB READ/WRITE ECS CIRCULAR BUFFER
- *
- *
- *
- * -RXCB- READ ECS CIRCULAR BUFFER
- * ON ENTRY - B1 = CM BUFFER ADDRESS
- * B2 = ADDR OF CIRCULAR BUFFER DESCRIPTOR
- * B3 = MAXIMUM LENGTH OF DATA ALLOWED
- * = 0 = NO BOUNDS TEST
- * ON EXIT - X6 = +N = NUMBER CPU WORDS OF DATA READ
- * 0 = BUFFER EMPTY
- * -1 = BUFFER ENTRY TOO LONG
- *
- * -WXCB- WRITE ECS CIRCULAR BUFFER
- * ON ENTRY - B1 = CM BUFFER ADDRESS
- * B2 = ADDR OF CIRCULAR BUFFER DESCRIPTOR
- * ON EXIT - X6 = 1 = DATA WRITTEN TO BUFFER
- * 0 = BUFFER FULL
- * X1 = NUMBER OF WORDS SHORT (IF X6=0)
- *
- * FORMAT OF CIRCULAR BUFFER DESCRIPTOR WORD -
- * 1ST 18 BITS = LENGTH OF BUFFER
- * NEXT 21 = ECS ADDRESS OF BUFFER
- * NEXT 21 = ECS ADDRESS OF BUFFER IN/OUT PTRS
- *
- * FORMAT OF 1ST WORD OF CIRCULAR BUFFER ENTRIES -
- * 1ST 24 BITS = UNUSED BY BUFFER ROUTINES
- * NEXT 12 = CPU WORD COUNT
- * NEXT 12 = PPU WORD COUNT (IF APPLICABLE)
- * NEXT 12 = UNUSED BY BUFFER ROUTINES
- *
- * /--- BLOCK -RXCB- 00 000 81/07/26 12.57
- *
- *
- RXCB EQ *
- *
- * READ CIRCULAR BUFFER IN/OUT POINTERS
- *
- MX7 -21 X7 = MASK
- SA1 B2 X1 = CIRCULAR BUFFER DESCRIPTOR
- ZR X1,RXC190
- BX4 -X7*X1 X4 = ECS ADDR OF IN/OUT PTRS
- BX0 X4
- SA0 RXPTRS
- + RE 2 READ IN/OUT POINTERS TO CM
- RJ ECSPRTY
- SA2 A0 X2 = *IN* POINTER
- SA3 A0+1 X3 = *OUT* POINTER
- IX6 X2-X3
- ZR X6,RXC190 JUMP IF BUFFER EMPTY
- *
- * READ 1ST WORD OF BUFFER ENTRY
- *
- AX1 21 POSITION ADDRESS OF BUFFER
- BX7 -X7*X1 X7 = ECS ADDRESS OF BUFFER
- IX0 X3+X7 COMPUTE ADDRESS OF NEXT ENTRY
- SA0 B1 A0 = CM ADDRESS
- + RE 1 READ 1ST WORD OF BUFFER ENTRY
- RJ ECSPRTY
- *
- * DETERMINE REMAINING AMOUNT TO READ
- *
- AX1 21
- SX1 X1 X1 = LENGTH OF CIRCULAR BUFFER
- MX0 -12
- SA2 A0 LOAD ENTRY HEADER WORD
- AX2 24
- BX2 -X0*X2 X2 = CPU WORD COUNT
- SX0 X2-1
- ZR X0,RXC120 JUMP IF SINGLE WORD ENTRY
- ZR B3,RXC115 JUMP IF NO BOUNDS TEST
- SB1 X2
- LT B3,B1,RXC195 JUMP IF ENTRY TOO LONG
- *
- RXC115 IX0 X2+X3 COMPUTE ENDING ADDRESS OF READ
- IX0 X1-X0
- NG X0,RXC130 JUMP IF MUST READ TWO SEGMENTS
- *
- * /--- BLOCK -RXCB- 00 000 79/03/11 21.29
- *
- * READ REMAINDER OF DATA BLOCK IN ONE TRANSFER
- *
- SA0 A0+1 ADVANCE CM ADDRESS
- SB1 X2-1 GET LENGTH OF REMAINING DATA
- SX6 1
- IX0 X3+X6 ADVANCE ECS ADDRESS
- IX0 X0+X7
- + RE B1 READ REMAINING DATA TO CM
- RJ ECSPRTY
- *
- RXC120 IX3 X2+X3 ADVANCE *OUT* POINTER
- EQ RXC140
- *
- * READ REMAINDER OF DATA BLOCK IN TWO TRANSFERS
- *
- RXC130 SA0 A0+1 ADVANCE CM ADDRESS
- SX3 X3+1 ADVANCE *OUT* POINTER
- IX6 X1-X3 COMPUTE LENGTH OF 1ST TRANSFER
- SB1 X6
- IX0 X3+X7 ADVANCE ECS ADDRESS
- + RE B1 READ TO END OF CIRCULAR BUFFER
- RJ ECSPRTY
- SA0 A0+B1 ADVANCE CM ADDRESS
- IX3 X2-X6 COMPUTE LTH OF REMAINING DATA
- SX3 X3-1 ADJUST FOR HEADER WORD
- SB1 X3
- BX0 X7 RE-SET ECS ADDR TO FWA OF BUFF
- + RE B1 READ FROM BEGIN OF BUFFER
- RJ ECSPRTY
- *
- * /--- BLOCK -RXCB- 00 000 81/06/29 10.39
- *
- * UPDATE CIRCULAR BUFFER *OUT* POINTER
- *
- RXC140 IX0 X3-X1 CHECK IF AT END OF BUFFER
- NG X0,RXC142
- SX3 0 RE-SET *OUT* TO FWA OF BUFFER
- *
- RXC142 BX6 X3
- SA6 RXPTRS+1 CM ADDRESS OF *OUT* PTR
- SX0 1
- IX0 X0+X4 SET ECS ADDRESS OF *OUT* PTR
- WX6 X0 (-WXX- 1 WD WRITE, MAY CHG *A6*)
- BX6 X2 X6 = NUMBER CPU WORDS DATA READ
- EQ RXCB
- *
- RXC190 MX6 0 X6 = 0 = NO DATA IN BUFFER
- EQ RXCB
- *
- RXC195 MX6 -1 X6 = -1 = BUFFER ENTRY TOO LONG
- EQ RXCB
- *
- * /--- BLOCK -WXCB- 00 000 79/03/13 13.58
- *
- *
- WXCB EQ *
- *
- * READ CIRCULAR BUFFER IN/OUT POINTERS
- *
- MX7 -21 X7 = MASK
- SA1 B2 X1 = CIRCULAR BUFFER DESCRIPTOR
- BX4 -X7*X1 X4 = ECS ADDR OF IN/OUT PTRS
- BX0 X4
- SA0 RXPTRS
- + RE 2 READ IN/OUT POINTERS TO CM
- RJ ECSPRTY
- *
- * CHECK IF SUFFICIENT SPACE IN BUFFER FOR DATA
- *
- BX5 X1
- AX5 42 POSITION LENGTH OF BUFFER
- SX5 X5 X5 = LENGTH OF CIRCULAR BUFFER
- SA2 A0+1 X2 = *OUT* POINTER
- SA3 A0 X3 = *IN* POINTER
- IX6 X2-X3
- ZR X6,WXC120 CHECK IF BUFFER EMPTY
- PL X6,WXC122
- *
- WXC120 IX6 X5+X6 COMPUTE AMOUNT OF FREE SPACE
- *
- WXC122 SX6 X6-1 X6 = NUM WORDS OF BUFFER FREE
- MX0 -12
- SA2 B1 LOAD ENTRY HEADER WORD
- AX2 24
- BX2 -X0*X2 X2 = LENGTH OF DATA
- IX0 X6-X2
- NG X0,WXC190 CHECK IF SUFFICIENT SPACE
- *
- * /--- BLOCK -WXCB- 00 000 79/03/11 17.42
- *
- * CHECK IF DATA WILL WRAP AROUND BUFFER
- *
- MX0 -21
- AX1 21 POSITION ECS ADDR OF BUFFER
- BX7 -X0*X1 X7 = ECS ADDRESS OF BUFFER
- SA0 B1 A0 = CM ADDRESS OF DATA
- IX0 X2+X3 COMPUTE LWA FOR TRANSFER
- IX0 X5-X0
- NG X0,WXC130 JUMP IF MUST DO TWO TRANSFERS
- *
- * COPY DATA TO CIRCULAR BUFFER IN SINGLE TRANSFER
- *
- IX0 X3+X7 SET ECS ADDRESS FOR TRANSFER
- SB1 X2 SET LENGTH FOR TRANSFER
- + WE B1 WRITE DATA TO CIRCULAR BUFFER
- RJ ECSPRTY
- IX3 X2+X3 ADVANCE *IN* POINTER
- EQ WXC140
- *
- * COPY DATA TO CIRCULAR BUFFER IN TWO TRANSFERS
- *
- WXC130 IX6 X5-X3 COMPUTE LTH OF 1ST TRANSFER
- IX0 X3+X7 SET ECS ADDRESS FOR TRANSFER
- SB1 X6 SET LENGTH FOR TRANSFER
- + WE B1 WRITE TO END OF CIRCULAR BUFFER
- RJ ECSPRTY
- SA0 A0+B1 ADVANCE CM ADDRESS
- IX3 X2-X6 COMPUTE REMAINING LTH OF DATA
- SB1 X3 SET LENGTH FOR TRANSFER
- BX0 X7 SET ECS ADDRESS FOR TRANSFER
- + WE B1 WRITE FROM BEGIN OF BUFFER
- RJ ECSPRTY
- *
- * /--- BLOCK -WXCB- 00 000 79/03/20 11.34
- *
- * UPDATE CIRCULAR BUFFER *IN* POINTER
- *
- WXC140 IX0 X3-X5 CHECK IF AT END OF BUFFER
- NG X0,WXC142
- SX3 0 RE-SET *IN* TO FWA OF BUFFER
- *
- WXC142 BX6 X3
- SA6 RXPTRS CM ADDRESS OF *IN* PTR
- WX6 X4 (-WXX- 1 WD WRITE, MAY CHG *A6*)
- SX6 1 X6 = 1 = DATA WRITTEN
- EQ WXCB
- *
- WXC190 MX6 0 X6 = 0 = BUFFER FULL
- BX1 -X0 (X1) = NUMBER OF WORDS SHORT
- EQ WXCB
- *
- *
- *
- END
plato/source/plaopl/eformat.txt ยท Last modified: 2023/08/05 18:54 by Site Administrator