File CRT.PA (PAL assembler source file)

Directory of image this file is from
This file as a plain text file

/ CRT DISPLAY AND MESSAGE HANDLER		1-SEP-91
/
/
/
/	 CCCC  RRRR   TTTTT
/	C      R   R    T
/	C      R   R    T
/	C      RRRR     T
/	C      R R      T
/	C      R  R     T
/	 CCCC  R   R    T
/
/
/

/
/EDIT HISTORY:
/
/24-JUL-78	FIXED THE CRT POSITION ERROR	[N1]
/
/16-APR-90	(LHN)
/		MODIFIED CODE FOR VT220 	[N2]
/
/30-AUG-90	(LHN)
/	1)  DELETE MACHINE STOP IF MESSAGE QUE IS FULL
/	2)  ADD CODE TO LEAVE ADDRESS OF THE MOST RECENT
/	    OPERATOR MESSAGE IN SMGADR FOR 'TALLEY'
/
/04-APR-91	(LHN)
/	1)  ADDED OPERATOR MESSAGES, CRTM22 AND CRTM23
/	2)  ADDED CODE TO RUN TALLEY IF MACHINE IS 
/	      STOPPED WHEN A CRT MESSAGE IS RECEIVED
/
/
/12-JUN-91	(LHN)		FOR VERSION 4A
/	1)  DELETED EPLTEST FLAG CONDITIONALS
/	2)  CHANGED TTYST CALL TO TTY
/	3)  ADDED VTDINP TASK TO DO KEYBOARD INPUT 
/	      FOR ROLL DATA
/
/25-JUL-91	(LHN)
/	1) FINISHING VTDINP CODE
/
/
/22-AUG-91	(LHN)		FOR VERSION 4B
/	1)  CHANGED SHIFT CODE TO 2 DIGITS
/	2)  ADDED CRTM24 TO MESSAGE LIST.
/	3)  "!" CHARACTER JUST OUTPUTS ESC.
/	4)  CHANGED VTDINP TO USE WAITM.
/
/1-SEP-91	(LHN)
/	1)  ADDED CODE FOR SECOND CRT
/

/ TASK= CRT CUR= CRTFLD INIWT= 0 VERS= 4 TASK2= VTDINP CUR2= CRTFLD INIWT2= 0 VERS2= 4 TASK3= CRTMSG CUR3= CRTFLD INIWT3= 0 VERS3= 3 TASK4= RFRESH CUR4= CRTFLD INIWT4= 0 VERS4= 1 FIELD CRTFLD%10 *CRTLOC
/ / /%RT CRT DISPLAY HANDLER TECHNIQUE / /%TW THE CRT DISPLAY TEXT DATA IS IN THE / STANDARD STRIPPED ASCII FORMAT WITH SOME OF THE / CHARACTERS REDEFINED. THE FOLLOWING CHARACTERS ARE / NOT PRINTED, BUT ARE DECODED FOR SPECIAL FUNCTIONS: / / / /%TN 1) & IS A "NULL" CHARACTER AND CAUSES THE /%TN CRT HANDLER TO GET THE NEXT TEXT /%TN CHARACTER. THE NULL CHARACTER GREATLY /%TN SIMPLIFIES PLACING DATA IN TEXT STRINGS /%TN FOR OUTPUT. IT ALSO SIMPLIFIES TEXT /%TN FORMATTING IN CHARACTER PAIRS. /%TN / /%TN 2) ! TELLS THE CRT OUTPUT HANDLER THAT THE /%TN NEXT TEXT CHARACTERS ARE A CRT CONTROL /%TN SEQUENCE. THE ! IS REPLACED BY "ESC [". /%TN THE FOLLOWING SPECIAL CODES ARE VALID: /%TN /%TN ![D CURSOR, BACKSPACE (MOVE TO THE LEFT) /%TN ![C CURSOR, SPACE FORWARD (MOVE TO RIGHT) /%TN ![A CURSOR, UP /%TN ![B CURSOR, DOWN /%TN ![1;1H CURSOR HOME /%TN ![J ERASE TO THE END OF THE SCREEN /%TN ![K ERASE TO THE END OF THE LINE /%TN ![L;CH CURSOR ADDRESS FOLLOWS /%TN / /%TN 3) ' CAUSES THE CRT HANDLER TO EMIT 8 /%TN SPACES. THIS IS NOT A REAL "TAB" CHAR- /%TN ACTER AS THE 8 SPACES ARE ADDED FROM /%TN THE CURRENT POSITION, AND DO NOT COR- /%TN RESPOND TO THE NEXT TAB STOP. /%TN / /%TN 4) $ TELLS THE CRT OUTPUT HANDLER TO /%TN OUTPUT THE NEXT CHARACTER IN LOWER /%TN CASE. THIS USED TO SEND SETUP /%TN COMMANDS TO THE VT220 TERMINAL. THE /%TN $ IS NOT OUTPUT. /
/ / /%RX VT220 CRT DISPLAY TERMINAL COMMANDS / / VTKCF= 6320 /CLEAR THE KEYBOARD FLAG VTKSF= 6321 /SKIP IF THE KEYBOARD FLAG IS SET VTKCC= 6322 /CLEAR THE AC AND THE KEYBOARD FLAG VTKRS= 6324 /READ THE KEYBOARD BUFFER STATICALLY VTKIE= 6325 /PUT AC BIT 11 IN THE INTERRUPT ENABLE F-F VTKRB= 6326 /CLEAR THE AC, READ THE KEYBOARD BUFFER, AND /CLEAR THE KEYBOARD FLAG VTTFL= 6330 /SET THE DISPLAY FLAG VTTSF= 6331 /SKIP IF THE DISPLAY FLAG IS SET VTTCF= 6332 /CLEAR THE DISPLAY FLAG VTTPC= 6334 /LOAD THE DISPLAY BUFFER AND DISPLAY VTTSK= 6335 /SKIP IF THE VT05 INTERRUPT OCCURRED VTTLS= 6336 /LOAD THE DISPLAY BUFFER, DISPLAY, AND /CLEAR THE DISPLAY FLAG / /%RX SECOND CRT DISPLAY TERMINAL COMMANDS / CONKCF= 6360 /CLEAR THE KEYBOARD FLAG CONKSF= 6361 /SKIP IF THE KEYBOARD FLAG IS SET CONKCC= 6362 /CLEAR THE AC AND THE KEYBOARD FLAG CONKRS= 6364 /READ THE KEYBOARD BUFFER STATICALLY CONKIE= 6365 /PUT AC BIT 11 IN THE INTERRUPT ENABLE F-F CONKRB= 6366 /CLEAR THE AC, READ THE KEYBOARD BUFFER, AND /CLEAR THE KEYBOARD FLAG CONTFL= 6370 /SET THE DISPLAY FLAG CONTSF= 6371 /SKIP IF THE DISPLAY FLAG IS SET CONTCF= 6372 /CLEAR THE DISPLAY FLAG CONTPC= 6374 /LOAD THE DISPLAY BUFFER AND DISPLAY CONTSK= 6375 /SKIP IF THE DEVICE INTERRUPT OCCURRED CONTLS= 6376 /LOAD THE DISPLAY BUFFER, DISPLAY, AND /CLEAR THE DISPLAY FLAG / / / DEFINITIONS / / ESC= 233 /ESCAPE CHARACTER TO START CURSOR SEQUENCE
/ / /%R CRT DISPLAY INTERRUPT HANDLER / /%TW COME HERE WHEN A CRT DISPLAY INTERRUPT HANDLER / NEEDS MORE CHARACTERS FOR THE DISPLAY. IF / NO MORE CHARACTERS ARE LEFT, SHUT OFF THE CRT / DISPLAY INTERRUPT. / / START, CLB /FIRST ADD US TO THE SKIP CHAIN. CAL SKPINS CRTINT CAL SKPINS CONINT CRTOUT, CLB CAL /GO TO SLEEP 'TIL NEEDED. RECEIVE MADDR, 0 DCA .+1 /SAVE THE CDF TO THE MESSAGE. MSGCDF, HLT TAD I MADDR /GET THE CRT MESSAGE ADDRESS. TAD (-2) DCA CRTA CDF CUR JMS CRT01 /GO PROCESS THE TEXT MESSAGE. TAD MSGCDF /SET UP AND POST THE MESSAGE EVENT DCA MEVCDF /FLAG AC7775 TAD MADDR CAL POST MEVCDF, 0 JMP CRTOUT /GO BACK FOR ANOTHER MESSAGE.
/ / / OUTPUT THE TEXT STRING / / CRT01, 0 TAD (CRT8B) /RESET THE CHARACTER FETCHER TO THE DCA CRT8A /FIRST SEQUENCE TAD (ESC) /TELL THE CRT TO LOOK FOR A CURSOR JMS CRT09 /ADDRESS TAD ("[) JMS CRT09 JMS CRT10 /OUTPUT THE LINE NUMBER TAD (";) /ADD THE SEPARATOR JMS CRT09 JMS CRT10 /NOW ADD THE COLUMN NUMBER TAD ("H) /LAST ADD THE TERMINITOR JMS CRT09 CRT02, JMS CRT08 /GET THE NEXT TEXT CHARACTER SNA /IS THE CHARACTER ZERO? JMP I CRT01 /YES, END OF MESSAGE, RETURN TAD (-40) /IS THE CHARACTER < 40? SMA JMP CRT03 /NO, GO ON, MIGHT BE A CONTROL CHAR TAD (340) /YES, REFORM THE CHARACTER AND PUT JMS CRT09 /IT IN THE RING BUFFER JMP CRT02 /ON TO THE NEXT CHARACTER CRT03, TAD (-10) /IS THE CHARACTER > 50 ? SPA SZA JMP CRT04 /YES, CHECK FOR CONTROL CHAR TAD (250 /NO, REFORM THE CHARACTER AND JMS CRT09 / PUT IT IN THE BUFFER. JMP CRT02 /GO FOR THE NEXT CHARACTER CRT04, TAD (7) SZA /IS THE CHARACTER NOW=0 (!) JMP CRT05 /NO, GO ON TAD (ESC) /YES, START THE CURSOR SEQUENCE JMS CRT09 / WITH THE ESC CHARACTER. JMP CRT02 /ON TO THE NEXT CHARACTER
/ CRT05, TAD (-6) /IS THE CHARACTER NOW =0 (') SZA JMP CRT06 /NO, GO ON TAD (-10) /YES, EMIT 8 SPACES DCA CRTC TAD (240) JMS CRT09 /ADD A SPACE TO THE RING BUFFER ISZ CRTC /ALL DONE ? JMP .-3 /NO, DO ANOTHER. JMP CRT02 /GET NEXT CHARACTER CRT06, IAC /IS THE CHARACTER NOW =0 (&) SNA JMP CRT02 /YES, JUST IGNORE IT IAC IAC /IS THE CHARACTER NOW = 0 ($) SZA JMP CRT07 /NO, GO ON JMS CRT08 /YES, GET THE NEXT CHARACTER TAD (140-244) / MAKE IT LOWER CASE CRT07, TAD (244) /NOTHING SPECIFIED, REFORM THE JMS CRT09 /CHARACTER AND BUFFER IT JMP CRT02 /ON TO THE NEXT .... CRT08, 0 JMP I .+1 /ENTER THE NEXT CHARACTER SEQUENCE. CRT8A, CRT8B AND (0077) /MASK OFF THE JUNK AND JMP I CRT08 / RETURN. CRT8B, CDF CRTXFLD /GET THE NEXT WORD OF TEXT. TAD I CRTA ISZ CRTA CDF CUR DCA CRTB TAD CRTB BSW JMS CRT8A /END OF THE FIRST SEQUENCE. TAD CRTB JMS CRT8A /END OF THE SECOND SEQUECNCE. JMP CRT8B
/ / / OUTPUT TWO CURSOR ADDRESS CHARACTERS / / CRT10, 0 JMS CRT08 /GET THE FIRST CURSOR CHARACTER TAD (200) / MAKE IT ASCII JMS CRT09 / AND ADD IT TO THE BUFFER JMS CRT08 /NOW DO THE SECOND CHARACTER TAD (200) JMS CRT09 JMP I CRT10 /ALL DONE RETURN CRTA, 0 /LOCAL TEMPORIES CRTB, 0 CRTC, 0 PAGE
/ / / / CRT OUTPUT BUFFER / / ORDER IS VERY IMPORTANT ! / / CRTBUF, ZBLOCK 20 /CHARACTER RING BUFFER. CRTBIN, CRTBUF /BUFFER INPUT POINTER. CRTBOT, CRTBUF /BUFFER OUTPUT POINTER. CRTNUM, 0 /BUFFER CHARACTER COUNTER. CRTEVF, 0 /TASK LEVEL EVENT FLAG. CRTACT, 0 /CRT DISPLAY ACTIVE FLAG. / / / PUT A CHARACTER IN THE CRT OUTPUT BUFFERS / / CRT09, 0 MQL /SAVE THE NEW CHARACTER. JMS CRTMOP /FIRST LOAD MOP'S CRT BUFFER. TAD CONSTT /IS THE CONSOLE CRT BEING USED SNA CLA / BY THE FOREGROUND? JMP I CRT09 /YES, JUST RETURN. JMS CRTCON /NO, IT'S OURS, LOAD CONSOLE'S BUFFER JMP I CRT09 /RETURN
/ / / LOAD MAIN OPERATOR'S CRT OUTPUT BUFFER / / CRTMOP, 0 MQA DCA I CRTBIN /ADD THE CHARACTER TO THE RING / BUFFER. CLB IAC /INCREMENT THE CHARACTER INPUT TAD CRTBIN / POINTER - KEEPING IT WITHIN AND (0017) / THE BUFFER. TAD (CRTBUF) DCA CRTBIN CIF CUR ///TURN INTERRUPTS OFF FOR A MO. ISZ CRTNUM ///INCREMENT THE BUFFER CHARACTER ///COUNTER. TAD CRTACT ///IS THE DISPLAY ACTIVE? SNA CLA /// VTTFL ///NO, START IT UP TAD CRTNUM ///IS THE BUFFER FULL? TAD (-17) /// SPA CLA /// JMP I CRTMOP ///NO, RETURN ISZ CRTEVF ///SET THE FLAG PENDING NOW! CAL ///NOW WE'LL WAIT FOR THE BUFFER WAITE / TO EMPTY SOME. CRTEVF JMP I CRTMOP /AND RETURN.
/ / / MAIN OPERATORS VT200 INTERRUPT LEVEL CODE / / CRTINT, ZBLOCK 2 VTTSK /SKIP IF CRT INTERRUPTS. JMP I CRTINT /ELSE BACK INTO THE SKIP CHAIN. CIF CDF CUR VTKSF /KEYBOARD FLAG SET? JMP CRTI1 /NO, GO ON VTKRB /YES, READ THE NEW CHARACTER AND JMS VTDINT / GO PUT IT IN THE INPUT BUFFER. JMP CRTXIT /NOW EXIT INTERRUPT LEVEL. CRTI1, VTTCF /CLEAR THE CRT DISPLAY FLAG. CLB DCA CRTACT /CLEAR THE CRT ACTIVE FLAG. TAD I CRTBOT /GET THE NEXT CHARACTER FOR OUTPUT. SNA /IS IT ZERO - BUFFER EMPTY? JMP CRTI2 /YES VTTLS /NO, SEND IT TO THE CRT. DCA CRTACT /CLEAR THE CRT ACTIVE FLAG. DCA I CRTBOT /PUT A ZERO WHERE WE TOOK CHAR. IAC /INCREMENT THE BUFFER'S OUTPUT TAD CRTBOT / POINTER, KEEPING IT WITHIN THE AND (0017) / BUFFER. TAD (CRTBUF) DCA CRTBOT CLB CMA /DECREMENT THE BUFFER CHARACTER TAD CRTNUM / COUNTER. SMA /[N1] BUT KEEP IT POSITIVE OR 0 !!! DCA CRTNUM AC7776 /CHECK FOR 2 OR LESS CHARACTER TAD CRTNUM / LEFT IN BUFFER. SMA CLA CRTI2, TAD (CRTEVF) /EXIT AND WAKE UP TASK LEVEL CRTXIT, CIF 0 / OR JUST EXIT. POSTDS
/ PAGE
/ / / / CRT INPUT BUFFER / / ORDER IS VERY IMPORTANT ! / / VTIBIN, VTIBUF /VT BUFFER INPUT POINTER VTIBOT, VTIBUF /VT BUFFER OUTPUT POINTER VTINUM, 0 /VT BUFFER CHARACTER COUNT VTIBUF, ZBLOCK 10 /VT INPUT RING BUFFER VTIEVF, 0 /VT INPUT EVENT FLAG / / / LOAD CONSOLE CRT'S OUTPUT BUFFER / / CRTCON, 0 MQA DCA I CONBIN /ADD THE CHARACTER TO THE RING / BUFFER. CLB IAC /INCREMENT THE CHARACTER INPUT TAD CONBIN / POINTER - KEEPING IT WITHIN AND (0017) / THE BUFFER. TAD (CONBUF) DCA CONBIN CIF CUR ///TURN INTERRUPTS OFF FOR A MO. ISZ CONNUM ///INCREMENT THE BUFFER CHARACTER ///COUNTER. TAD CONACT ///IS THE DISPLAY ACTIVE? SNA CLA /// CONTFL ///NO, START IT UP TAD CONNUM ///IS THE BUFFER FULL? TAD (-17) /// SPA CLA /// JMP I CRTCON ///NO, RETURN ISZ CONEVF ///SET THE FLAG PENDING NOW! CAL ///NOW WE'LL WAIT FOR THE BUFFER WAITE / TO EMPTY SOME. CONEVF JMP I CRTCON /AND RETURN.
/ / / CONSOLE VT200 INTERRUPT LEVEL CODE / / CONINT, ZBLOCK 2 CONTSK /SKIP IF CONSOLE CRT INTERRUPTS. JMP I CONINT /ELSE BACK INTO THE SKIP CHAIN. / TAD CONSTT /IS THE CONSOLE CRT OURS ? / SNA CLA / JMP I CONINT /NO, BACK IN THE SKIP CHAIN, / TTYM IS USING THE CONSOLE. CIF CDF CUR CONKSF /KEYBOARD FLAG SET? JMP CONI1 /NO, GO ON CONKRB /YES, READ THE NEW CHARACTER AND JMS VTDINT / GO PUT IT IN THE INPUT BUFFER. JMP CONXIT /NOW EXIT INTERRUPT LEVEL. CONI1, CONTCF /CLEAR THE CRT DISPLAY FLAG. CLB DCA CONACT /CLEAR THE CRT ACTIVE FLAG. TAD I CONBOT /GET THE NEXT CHARACTER FOR OUTPUT. SNA /IS IT ZERO - BUFFER EMPTY? JMP CONI2 /YES CONTLS /NO, SEND IT TO THE CRT. DCA CONACT /CLEAR THE CRT ACTIVE FLAG. DCA I CONBOT /PUT A ZERO WHERE WE TOOK CHAR. IAC /INCREMENT THE BUFFER'S OUTPUT TAD CONBOT / POINTER, KEEPING IT WITHIN THE AND (0017) / BUFFER. TAD (CONBUF) DCA CONBOT CLB CMA /DECREMENT THE BUFFER CHARACTER TAD CONNUM / COUNTER. SMA /[N1] BUT KEEP IT POSITIVE OR 0 !!! DCA CONNUM AC7776 /CHECK FOR 2 OR LESS CHARACTER TAD CONNUM / LEFT IN BUFFER. SMA CLA CONI2, TAD (CONEVF) /EXIT AND WAKE UP TASK LEVEL CONXIT, CIF 0 / OR JUST EXIT. POSTDS
/ / / / MAIN OPERATOR'S VT200 INPUT INTERRUPT CODE / / VTDINT, 0 DCA VTDIA /SAVE NEW CHARACTER LOCALLY. TAD I VTIBOT /IS THIS BUFFER LOCATION FREE ? SZA CLA JMP VTDI1 /NO, JUST EXIT. TAD VTDIA /YES, GET THE CHARACTER AND PUT IT DCA I VTIBOT / IN THE BUFFER. CLB IAC /INCREMENT THE BUFFER'S OUTPUT TAD VTIBOT / POINTER, KEEPING IT WITHIN THE AND (0007) / BUFFER. TAD (VTIBUF) DCA VTIBOT ISZ VTINUM /INCREMENT THE BUFFER CHARACTER NOP / COUNTER. VTDI1, TAD (VTIEVF) /GET OUR EVENT FLAG ADDRESS AND JMP I VTDINT / RETURN. VTDIA, 0 / / / GET THE NEXT CHARACTER FROM THE VT INPUT BUFFER / / VTNXCR, 0 CLB TAD I VTIBIN /GET THE NEXT CHARACTER FROM THE MQL / INPUT BUFFER. DCA I VTIBIN /REPLACE NEW CHAR WITH A ZERO. IAC /INCREMENT THE BUFFER INPUT TAD VTIBIN / POINTER, KEEPING IT WITHIN AND (0007) / THE BUFFER. TAD (VTIBUF) DCA VTIBIN CIF CUR ///TURN INTERRUPTS OFF A MO. CLB CMA ///DECREMENT THE BUFFER TAD VTINUM /// CHARACTER COUNTER, BUT SMA /// DON'T LET GO NEGATIVE. DCA VTINUM /// MQA ///RETURN WITH THE CHARACTER JMP I VTNXCR /// IN THE AC.
/ PAGE
/ / / / V V TTTTT DDDD IIIII N N PPPP / V V T D D I N N P P / V V T D D I NN N P P / V V T D D I N N N PPPP / V V T D D I N NN P / V V T D D I N N P / V T DDDD IIIII N N P / / / / / VTDINP TASK TO LET THE OPERATOR ENTER PRODUCT / DATA FROM THE CRT. THE ENTERED DATA IS SENT TO / ROLLDT TO BE VALIDATED AND PUT INTO THE PROPER / LOCATIONS. / / / / / OPERATOR DATA MESSAGE FORMAT / / /RTMSG, ZBLOCK 3 /RTS8 OVERHEAD /RTTYPE, MESSAGE TYPE = * /RTSIND, STATUS INDICATOR /RTFUNC, FUNCTION CODE /RTDECF, CHARACTER COUNT OF DATA /RTDBUF, DATA CHARACTER 1 / ... / ... / DATA CHARACTER N (UP TO 13) / 0 /
/ START2, CLB JMS VTGCHR /GET THE NEXT CHARACTER FROM DCA VTICHR / THE INPUT AND SAVE IT. / / TAD VTICHR /IS THE CHARACTER = CR ? TAD (-15) SZA CLA JMP VTIN5 /NO, GO ON TAD VTDFLG /YES, IS THERE DATA FOR ROLLDT ? SNA CLA JMP VTIN3 /NO, JUST MOVE TO THE NEXT / CRT FIELD. VTIN1, CAL /YES, SET THE INPUT BUFFER SENDW / TO ROLLDT. ROLLDT VTDMSG CLB TAD VTDTYP /WAS THE DATA CORRECT ? SMA CLA JMP VTIN3 /YES, GO ON. CIF CUR ///NO, INTERRUPTS OFF FOR THIS. TAD (VTIBUF) ///RESET (EMPTY) THE INPUT BUFFER DCA VTIBIN /// TO BE SURE WE DO NOT OVERRUN TAD (VTIBUF) /// IT. THIS IS POSSIBLE WHEN DCA VTIBOT /// THE MACHINE IS RUNNING FAST DCA VTINUM /// AND UP/DOWN ARROWS ARE /// ENTERED QUICKLY. TAD (-10) ///SET UP AND FLUSH OUR INPUT DCA VTINA /// BUFFER. TAD (VTIBUF) /// DCA VTINB /// VTIN2, DCA I VTINB /// ISZ VTINB /// ISZ VTINA /// JMP VTIN2 /// ISZ VTCCNT ///SET FLAG SO THAT TIMER RESETS. JMP VTIN4 ///NOW REDISPLAY THE CRT FIELD. VTIN3, AC0001 /+1 IF NO DATA ERROR. VTIN4, JMS VTDSET /UPDATE THE CRT FIELD JMS VTDFRM / AND SHOW IT. JMP START2
/ / VTIN5, TAD VTICHR /IS THE CHARACTER = ESC ? TAD (-33) SZA CLA JMP VTIN9 /NO, GO ON. JMS VTGCHR /YES, GET THE THE NEXT CHAR. TAD (-133) /IS IT A "[" ? SNA CLA JMP VTIN7 /YES, GO ON. VTIN6, DCA VTDFLG /NO, FORCE A DATA ERROR AND JMP VTIN1 / SEND THE MESSAGE TO ROLLDT. VTIN7, JMS VTGCHR /YES, GET THE CURSOR CHAR. TAD (-104) /IS IT LEFT ARROW ? SNA JMP VTIN8 /YES, GO BACK UP CURSOR. IAC /IS IT A RIGHT ARROW ? SNA JMP VTIN3 /YES, SHOW NEXT CRT FIELD. IAC /IS IT DOWN ARROW ? SNA JMP VTIN3 /YES, SHOW NEXT CRT FIELD. IAC /IS IT UP ARROW ? SZA CLA JMP VTIN6 /NO, SEND THE MESSAGE TO / ROLLDT TO SHOW ERROR. VTIN8, AC7777 /YES, BACK UP THE CRT FIELD. JMP VTIN4 / / VTIN9, TAD VTICHR /IS THE CHARACTER A RUBOUT ? TAD (-177) SZA CLA JMP VTIN11 /NO, GO ON. CLB CMA /YES, DECREMENT THE MESSAGE TAD VTDFLG / DATA COUNTER, BUT NOT PAST SPA / ZERO. JMP VTIN10 DCA VTDFLG CLB CMA /NOW DECREMENT THE MESSAGE TAD VTBPTR / BUFFER POINTER. DCA VTBPTR VTIN10, JMS VTDFRM /NOW, SHOW THE USER WHAT'S LEFT. JMP START2
/ / VTIN11, TAD VTIMAX /IF VTIMAX = 0, CRT FIELD 0 IN USE, SNA CLA / IGNORE THE INPUT. JMP START2 TAD VTICHR /WE HAVE A NEW INPUT CHARACTER. SNA /IS IT ZERO ? JMP START2 /YES, IGNORE IT. TAD (7640) /NO, CONVERT IT TO UPPER CASE AND SMA TAD (7740) TAD (340) DCA I VTBPTR / PUT IT IN THE MESSAGE BUFFER. ISZ VTBPTR ISZ VTDFLG /INCREMENT THE MESSAGE COUNTER TAD VTDFLG /IS THE MESSAGE BUFFER EXCEEDED ? TAD VTIMAX SMA SZA CLA JMP VTIN6 /YES, GO FORCE INPUT ERROR. JMS VTDFRM /NO, SHOW THE USER WHAT WAS ENTERED. JMP START2 /NOW, GO WAIT FOR THE NEXT CHAR. VTINA, 0 /LOCAL TEMPORARIES. VTINB, 0 VTBPTR, 0 /MESSAGE BUFFER POINTER. VTICHR, 0 /STORAGE FOR THE NEW CHARACTER. PAGE
/ / / FORMAT THE INPUT FOR THE CRT TASK / / VTDFRM, 0 CLB TAD VTDFLG /GET THE INPUT LENGTH SO FAR CIA DCA VTDA TAD (VTDBUF) /SET UP ADDRESS OF INPUT DCA VTDB TAD (CRTI1A) /SET UP ADDRESS OF CRT TEXT DCA VTPKA TAD (VTPK2) /RESET THE CHARACTER PACKER DCA VTPK1 TAD VTDFLG /IS THE MESSAGE BUFFER EMPTY? SZA CLA JMP VTDF1 /NO, GO ON. TAD VTICLR /YES, MAY BE FIRST TIME THRU, JMS VTDSHO / CLEAR CURRENT CRT FIELD. VTDF1, TAD VTDA /HAS ANY DATA BEEN ENTERED? SNA CLA JMP VTDF3 /NO, GO ON VTDF2, TAD I VTDB /GET THE NEXT CHARACTER FROM ISZ VTDB / THE MESSAGE BUFFER. JMS VTPACK /PUT IT IN THE CRT STRING. ISZ VTDA JMP VTDF2 /LOOP 'TIL DONE. VTDF3, TAD VTIMAX /COMPUTE CHARACTERS NEEDED TO TAD VTDFLG / FILL CRT TEXT. SMA JMP VTDF5 DCA VTDA /SAVE LOOP COUNTER. VTDF4, TAD (40) /ADD A SPACE TO THE CRT TEXT. JMS VTPACK ISZ VTDA JMP VTDF4 /LOOP 'TIL DONE.
/ VTDF5, TAD ("!) /ADD THE CURSOR CONTROL TO JMS VTPACK / REMOVE THE REVERSE VIDEO TAD ("[) JMS VTPACK TAD ("0) JMS VTPACK TAD ("$) JMS VTPACK TAD ("M) JMS VTPACK JMS VTPACK /NOW ADD TWO CHARACTERS OF ZERO JMS VTPACK / TO FLUSH THE TEXT PACKER. TAD (CRTI01) /GO QUE INPUT FOR DISPLAY JMS VTDSHO JMP I VTDFRM VTDA, 0 /LOCAL TEMPORARIES. VTDB, 0 VTIMAX, 0 /VALID INPUT DATA LENGTH.
/ / / GET (OR WAIT FOR) THE NEXT INPUT CHARACTER / / VTGCHR, 0 CLB CIF CUR ///INTERRUTPS OFF FOR THIS. TAD VTINUM ///IS THERE A CHARACTER IN THE SZA CLA /// INPUT BUFFER ? JMP VTGC3 ///YES, GO GET IT. CLB IAC ///NO, SET THE VT INPUT EVENT DCA VTIEVF /// FLAG PENDING. TAD VTCQUE ///IS THE INPUT TIMEOUT PENDING? SZA CLA /// JMP VTGC2 ///YES, NO NEED TO QUE IT. VTGC1, CAL ///NOW, START THE INPUT TIMEOUT. SEND CLOCK VTCQUE TAD (4000+VTDINP) / SET THE CLOCK EVENT DCA VTCQUE / PENDING. DCA VTCCNT /CLEAR TIMER CHARACTER COUNTER. VTGC2, / CAL /NOW WE CAN WAIT FOR SOME / WAITE / INPUT OR TO TIME OUT. / VTIEVF IOF ///NEED INTERRUPTS OFF FOR THIS. TAD (4000+VTDINP) ///SET VT THE INPUT EVENT DCA VTIEVF /// PENDING. CIF 0 WAITM /NOW JUST WAIT FOR SOMETING TO EFWT / HAPPEN. CLB TAD VTIEVF /DID WE GET A CHARACTER ? SNA CLA JMP VTGC3 /YES, GO TO IT. TAD VTCQUE /NO, DID THE TIMER FIRE ? SZA CLA JMP VTGC2 /NO, WAIT SOME MORE. TAD VTCCNT /YES, TIMER FIRED, DID WE SEE SZA CLA / A CHARACTER DURING TIMER? JMP VTGC1 /YES, RESET THE TIMER. CLB CMA /NO, TIMEOUT, SET THE CRT DCA VTTPTR / POINTER TO -1, THEN UPDATE AC0001 / IT TO CRT FIELD 0. JMS VTDSET JMP VTGC2 /GO WAIT SOME MORE. VTGC3, ISZ VTCCNT /BUMP THE TIMER CHARACTER NOP / COUNTER. JMS VTNXCR /GO GET A CHARACTER FROM THE AND (0177) / INPUT BUFFER AND JMP I VTGCHR / RETURN IT TO THE CALLER. / VTCKEF, 0 /CLOCK MESSAGE EVENT FLAG. VTCCNT, 0 /TIMER CHARACTER COUNTER.
/ PAGE
/ / / SET UP FOR DATA DISPLAY / / VTDLEN= VTDLND-VTDLST%4 /LENGTH OF THE CRT FIELD TABLE / / VTDSET, 0 SNA /IF AC = 0, DO NOT REDISPLAY THE JMP VTDS1 / CURRENT CRT FIELD. TAD VTTPTR /ADD THE AC INTO THE CRT FIELD DCA VTTPTR / POINTER. TAD VTICLR /CLEAR THE CURRENT CRT DATA JMS VTDSHO / FIELD. TAD VTITXT /REDISPLAY CRT TEXT FROM THE JMS VTDSHO / CURRENT DATA FIELD. VTDS1, TAD VTTPTR /TRAP THE FIELD POINTER WITHIN SPA / THE TABLE. TAD (VTDLEN+1) DCA VTTPTR TAD VTTPTR TAD (-VTDLEN) SMA SZA CLA DCA VTTPTR TAD VTTPTR /GET THE ADDRESS OF THE DATA CLL RTL / FOR THIS CRT FIELD TAD (VTDLST) DCA VTSA TAD I VTSA /GET THE FIELD LENGTH ISZ VTSA DCA VTIMAX TAD I VTSA /MOVE THE CRT DATA TEXT ADDRESS DCA VTITXT AC7776 /GET THE ADDRESS OF CRT LOCATION TAD I VTSA / PARAMETERS FOR THIS DATA FIELD. ISZ VTSA DCA VTSB AC7776 /GET THE ADDRESS OF CRT LOCATION TAD (CRTI01) / PARAMETERS FOR THE INPUT CRT TEXT DCA VTSC / FIELD. CDF CRTXFLD /MOVE THE CRT LOCATION PARAMETERS TAD I VTSB / TO OUR INPUT CRT TEXT FIELD. ISZ VTSB DCA I VTSC ISZ VTSC TAD I VTSB DCA I VTSC CDF CUR
/ TAD I VTSA /SET UP THE ADDRESS OF THE CRT TEXT ISZ VTSA / TO CLEAR THE INPUT FIELD DCA VTICLR TAD I VTSA /GET THE DATA TYPE CODE FOR THIS BSW / INPUT FIELD AND MOVE INTO THE AND (0077) / MESSAGE TO ROLLDT. DCA VTDIND TAD I VTSA AND (0077) DCA VTDFNC TAD ("*) /RESET THE MESSAGE TYPE DCA VTDTYP DCA VTDFLG /CLEAR THE INPUT COUNT FLAG. TAD (VTDBUF) /RESET THE ROLLDT MESSAGE BUFFER DCA VTBPTR / POINTER. JMP I VTDSET VTSA, 0 /LOCAL VARIABLES VTSB, 0 VTSC, 0 / VTTPTR, 0 /INDEX FOR CRT FIELD TABLE. VTITXT, 0 /ADDRESS OF CRT DATA FIELD VTICLR, 0 /ADDRESS OF CRT CLEAR TEXT VTCQUE, ZBLOCK 3 /MESSAGE FOR KEYBOARD TIME OUT. 0 /MARKTIME 0; 1750 / FOR 10 SECONDS.
/ / / PACK CHARACTERS INTO CRT TEXT FIELD / / VTPACK, 0 AND (0077) JMP I .+1 VTPK1, VTPK2 JMP I VTPACK /RETURN VTPK2, BSW /SHIFT THE FIRST CHARACTER DCA VTPKB / AND SAVE IT. JMS VTPK1 TAD VTPKB /ADD FIRST CHARACTER TO SECOND CDF CRTXFLD DCA I VTPKA / AND PUT IT IN THE CRT TEXT CDF CUR ISZ VTPKA JMS VTPK1 JMP VTPK2 VTPKA, 0 /TEST DESTINATION ADDRESS. VTPKB, 0 PAGE
/ / / TABLE OF DEFINITIONS FOR CRT DATA FIELDS / / VTDLST, 0 /CRT FIELD 0 (NO CURSOR BLOCK 0 / SHOWING.) 0 0 / -12 /- LENGTH OF NEXT ROLL NUMBER CRTX01 /ADDRESS OF CRT DATA STORAGE TEXT CRTC06 /ADDRESS OF TEXT TO CLEAR CRT FIELD 0102 /DATA TYPE CODE FOR ROLLDT / -4 /- LENGTH OF NEXT ROLL PUTUP CRTX02 CRTC07 0103 / -2 /- LENGTH OF NEXT ROLL SAMPLING CRTX03 / CODE CRTC08 0104 / -3 /- LENGTH OF NEXT ROLL SLIT WIDTH CRTX04 CRTC09 0105 / -3 /- LENGTH OF NEXT ROLL CHOP LENGTH CRTX05 CRTC10 0106 / -13 /- LENGTH OF DATE CRTX11 CRTC11 1002 / -2 /- LENGTH OF SHIFT CODE CRTX12 CRTC12 1003 / -2 /- LENGTH OF OPERATOR CODE CRTX13 CRTC13 1004
/ -12 /- LENGTH OF CURRNET ROLL NUMBER CRTX06 CRTC01 0402 / -4 /- LENGTH OF NEXT ROLL PUTUP CRTX07 CRTC02 0403 / -2 /- LENGTH OF NEXT ROLL SAMPLING CRTX08 / CODE CRTC03 0404 / VTDLND, -3 /- LENGTH OF NEXT ROLL SLIT WIDTH CRTX09 CRTC04 0405 / / / OPERATOR DATA MESSAGE FOR ROLLDT / / VTDMSG, ZBLOCK 3 /RTS8 OVERHEAD VTDTYP, "* /MESSAGE TYPE - ALWAYS * VTDIND, 0 /RT01 STYLE INDICATOR STATUS VTDFNC, 0 /RT01 STYLE FUNCTION CODE VTDFLG, 0 /CRT INPUT DATA COUNT VTDBUF, ZBLOCK 14 /CRT INPUT DATA 0 /JUST FOR INSURANCE / / / SEND A CRT TEXT STRING TO THE CRT TASK / / VTDSHO, 0 SNA /IF AC = 0, JUST RETURN. JMP I VTDSHO DCA VTSMA /SAVE CRT MESSAGE ADDRESS AND SEND CAL / IT TO THE CRT TASK. SENDW CRT VTSMSG JMP I VTDSHO VTSMSG, ZBLOCK 3 VTSMA, 0
/ / / SAVE CRT STOP MESSAGE ADDRESS FOR "TALLEY" / / CALLED FROM CRTMSG / CMG08, 0 DCA CMG08A /SAVE THE MESSAGE ADDRESS FOR TAD CMG08A / USE HERE. CDF 20 /SAVE THE MESSAGE ADDRESS IN DCA I (SMGADR) / "TALLEY"S FIELD CDF CUR DBRI50 /IS THE MACHINE RUNNING ? SPA CLA JMP I CMG08 /YES, JUST RETURN AC7775 /WHEN THE MACHINE IS STOPPED, TAD CMG08A / COMPUTE THE ADDRESS OF THE DCA CMG08A / STOP MESSAGE CONTROL WORD. CDF CRTXFLD TAD I CMG08A /DOES THE CONTROL WORD = 0 ? CDF CUR SNA CLA /YES, DO NOT FORCE IT TO PRINT JMP I CMG08 / JUST RETURN NOW CDF 20 /TO FORCE THE MESSAGE TO BE LOGGED, ISZ I (STPMGF) / SET MACHINE STOP MESSAGE CDF CUR / FLAG FOR "TALLEY" AND TAD (TALLEY) / RUN "TALLEY" CAL RUN JMP I CMG08 /NOW RETURN CMG08A, 0 PAGE
/ / / / CCCC RRRR TTTTT M M SSSS GGG / C R R T M M S G G / C R R T MM MM S G / C RRRR T M M M SSS G / C R R T M M S G GGG / C R R T M M S G G / CCCC R R T M M SSSS GGG / / / / / THIS TASK MAINTAINS THE OPERATOR MESSAGE AREA / ON THE CRT DISPLAY. STANDARD RTS/8 MESSAGES / ARE SENT TO THIS TASK WHICH SPECIFY WHICH / MESSAGE TO PROCESS, AND WHETHER TO ADD OR / DELETE AN OPERATOR MESSAGE FROM THE CRT. / / / / MESSAGE FORMAT: / / CRTMSG, ZBLOCK 3 / MESSAGE NUMBER AND DIRECTION / / / WHERE: / / BIT 0 DIRECTION CONTROL / 0=ADD THIS MESSAGE / 1=DELETE THIS MESSAGE / / BITS 2-11 THE MESSAGE NUMBER / /
/ / /%R CRT OPERATOR MESSAGE DISPLAY ROUTINE / /%TW COME HERE TO ADD OR DELETE AN OPERATOR MESSAGE / FROM THE CRT. / / START3, CLB CAL /GO TO SLEEP TIL SOMEONE NEEDS US. RECEIVE CMADDR, 0 DCA .+1 /SAVE CDF TO MESSAGE FIELD. CCDF, HLT TAD I CMADDR /GET THE MESSAGE DATA WORD. DCA CMGD CDF CUR TAD CCDF /POST THE SENDER'S MESSAGE NOW. DCA CMG00 AC7775 TAD CMADDR CAL POST CMG00, 0 CLB TAD (-11) /SET UP THE LOOP COUNTER DCA CMGB TAD (CMSGBUF) /SET UP THE ADDRESS OF THE START OF DCA CMGC /THE MESSAGE BUFFER. AC3777 AND CMGD /GET THE ADDRESS OF THE TAD (CMSGTBL) /TEXT FOR THIS MESSAGE DCA CMGA TAD CMGD SPA /IS THE MESSAGE TO BE ADDED ? JMP CMG03 /NO, DELETED SNA CLA /IS THE DATA = 0 ? JMP CMG05 /YES, REFRESH THE MESSAGE AREA. CMG01, TAD I CMGC /LOOK FOR A OPEN SPOT FOR THE NEW SNA / MESSAGE. JMP CMG02 /FOUND A SPOT, GO ON. CIA TAD I CMGA /ALSO CHECK IF THE MESSAGE IS IN SNA CLA / THE QUEUE ALREADY. JMP START3 /MESSAGE ALREADY DISPLAYED, EXIT. ISZ CMGC ISZ CMGB JMP CMG01 JMS ERRMSG /QUEUE FULL, ISSUE ERROR MESSAGE JMP START3 /EXIT.
/ / ADD A NEW MESSAGE / CMG02, TAD I CMGA /ADD THE NEW TEXT ADDRESS TO THE DCA I CMGC /MESSAGE BUFFER. TAD I CMGA /SAVE THE ADDRESS OF THIS MESSAGE JMS CMG08 / FOR 'TALLEY' JMS CMG07 /GO DISPLAY THE NEW MESSAGE TAD (BELL) /NOW RING THE ALERT ALARM CAL RUN JMP START3 /ALL DONE, EXIT. / / DELETE A MESSAGE / CMG03, CLB TAD I CMGC /LOOK FOR THE MESSAGE IN THE QUEUE. SNA JMP START3 /END OF LIST, NOT THERE, EXIT. CIA TAD I CMGA SNA CLA JMP CMG04 /FOUND IT, GO REMOVE IT. ISZ CMGC ISZ CMGB JMP CMG03 JMP START3 /MESSAGE NOT IN QUEUE, EXIT. CMG04, CDF 20 /CLEAR THE MESSAGE ADDRESS WE LEFT DCA I (SMGADR) / FOR 'TALLEY'. THIS KEEPS OLD CDF CUR / MESSAGES OFF THE SAMPLE TALLEY / FOR NORMAL STOPS. CLB IAC /COMPRESS THE MESSAGE QUEUE TAD CMGC DCA CMGD CMG04A, TAD I CMGD DCA I CMGC ISZ CMGD ISZ CMGC ISZ CMGB JMP CMG04A
/ / DISPLAY THE REMAINING MESSAGES / CMG05, CLB TAD (CMSGBUF) /RESET POINTER TO MESSAGE LIST DCA CMGA TAD (CMSGBUF) DCA CMGC TAD (-11) /SET UP THE LOOP COUNTERS. DCA CMGB CMG06, JMS CMG07 /GO DISPLAY THIS MESSAGE ISZ CMGA ISZ CMGC ISZ CMGB JMP CMG06 JMP START3 / / LOCATE AND DISPLAY A MESSAGE LINE / CMG07, 0 TAD I CMGA /GET THE ADDRESS OF THE MESSAGE SNA TAD (CRTM00) /IF ZERO, CLEAR THIS LINE DCA CMG02A /SAVE ADDRESS IN RTS8 MESSAGE AC7776 /FORM THE ADDRESS FOR THE CURSOR TAD CMG02A / LINE NUMBER FOR THE MESSAGE DCA CMGD / HEADER TAD CMGC /CONVERT THE MESSAGE POINTER TO TAD (-CMSGBUF) / AN INDEX AND GET THE LINE TAD (CMSADD) / ADDRESS IN THE ASCII LINE DCA CMGE / NUMBER TABLE. TAD I CMGE /PUT THE ASCII LINE NUMBER IN THE CDF CRTXFLD / MESSAGE HEADER DCA I CMGD CAL /GO TELL THE CRT HANDLER TO SENDW / DISPLAY THIS MESSAGE CRT CRTDMG CLB JMP I CMG07 /RETURN TO OUR CALLER. CMGA, 0 /LOCAL TEMPORIES. CMGB, 0 CMGC, 0 CMGD, 0 CMGE, 0
/ PAGE
/ / / ACTIVE MESSAGE DISPLAY BUFFER / / CMSGBUF,0 0 0 0 0 0 0 0 0 0 0 0 0 /GUARD JUNK USED DURING COMPRESSION / / / ORDERED LIST OF MESSAGE ADDRESSES / / CMSGTBL,CRTM00 CRTM01 CRTM02 CRTM03 CRTM04 CRTM05 CRTM06 CRTM07 CRTM08 CRTM09 CRTM10 CRTM11 CRTM12 CRTM13 CRTM14 CRTM15 CRTM16 CRTM17 CRTM18 CRTM19 CRTM20 CRTM21 CRTM22 CRTM23 CRTM24 CRTM25 CRTM00 CRTM00 0000
/ / / ASCII ADDRESSES FOR MESSAGE LINES / / CMSADD, 6161 /LINE 11 DECIMAL 6162 6163 6164 6165 6166 6167 6170 6171 6260 CRTDMG, ZBLOCK 3 /MESSAGE TO SENT TO 'CRT' CMG02A, 0 ERRMSG, 0 TAD TTYMSG /IS THE ERROR MESSAGE ACTIVE ? SZA CLA JMP I ERRMSG /YES, JUST EXIT CAL /NO, SEND "CRT MESSAGE QUEUE SEND /EXCEEDED" TO CONSOLE TELETYPE TTY TTYMSG JMP I ERRMSG / TTYMSG, ZBLOCK 3 0 0 TEXT "CRT MESSAGE QUEUE EXCEEDED"
/ / / / RRRR FFFFF RRRR EEEEE SSSS H H / R R F R R E S H H / R R F R R E S H H / RRRR FFFF RRRR EEEE SSS HHHHH / R R F R R E S H H / R R F R R E S H H / R R F R R EEEEE SSSS H H / / / / / / TASK TO REFRESH THE PRODUCT DATA WHEN THE MACHINE STOPS / / START4, CLB CAL SUSPND /GO TO SLEEP 'TIL NEEDED. CLB TAD (REFTBL) /SET UP A POINTER TO THE TEXT TO DCA REFRA / DISPLAY. REFR1, TAD I REFRA /GET THE NEXT MESSAGE ADDRESS ISZ REFRA SNA /IS IT ZERO ? JMP START4 /YES, END OF LIST DCA REFRB /NO, LET'S GO DISPLAY IT. CAL SENDW CRT REFMG JMP REFR1 /GO AROUND AGAIN. REFRA, 0 REFMG, ZBLOCK 3 REFRB, 0 REFTBL, CRTD01 CRTD02 CRTD03 CRTD04 CRTD05 CRTD06 CRTD07 0 PAGE NOPUNCH /THE CRTTXT FILE FOLLOWS XLIST 1



Feel free to contact me, David Gesswein djg@pdp8online.com with any questions, comments on the web site, or if you have related equipment, documentation, software etc. you are willing to part with.  I am interested in anything PDP-8 related, computers, peripherals used with them, DEC or third party, or documentation. 

PDP-8 Home Page   PDP-8 Site Map   PDP-8 Site Search