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		20-APR-90
/						9/8/77
/
/
/EDIT HISTORY:
/
/24-JUL-78	FIXED THE CRT POSITION ERROR	[N1]
/
/16-APR-90	MODIFIED CODE FOR VT220 	[N2]
/








	TASK=	CRT
	CUR=	CRTFLD
	INIWT=	0
	VERS=	3

	TASK2=	CRTMSG
	CUR2=	CRTFLD
	INIWT2=	0
	VERS2=	3

	TASK3=	RFRESH
	CUR3=	CRTFLD
	INIWT3=	0
	VERS3=	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,, AND NOT TO ENCODE THE NEXT /%TN CHARACTER BEFORE SENDING IT TO THE CRT. /%TN 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 THE 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 VT05 CRT DISPLAY TERMINAL COMMANDS / / IFNDEF EPLTEST < 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 > IFDEF EPLTEST < /FOR TESTING AT EPL VTKCF= 6030 VTKSF= 6031 VTKCC= 6032 VTKRS= 6034 VTKIE= 6035 VTKRB= 6036 VTTFL= 6040 VTTSF= 6041 VTTCF= 6042 VTTPC= 6044 VTTSK= 6045 VTTLS= 6046 > / / / 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 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 TAD ("[) JMS CRT09 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 CRTXDF /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
/ CRTA, 0 /LOCAL TEMPORIES CRTB, 0 CRTC, 0 PAGE
/ 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. CRT09, 0 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 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 CRT09 /NO, RETURN ISZ CRTEVF /SET THE FLAG PENDING NOW! CAL /NOW WE'LL WAIT FOR THE BUFFER WAITE /TO EMPTY SOME. PCRTEVF,CRTEVF JMP I CRT09 /AND RETURN. / / 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
/ / / VT05 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 .+3 /NO, GO ON VTKCF /YES, CLEAR IT AND EXIT. JMP CRTI2 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 CRTI1 /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 CRTI1, TAD (CRTEVF) /EXIT AND WAKE UP TASK LEVEL CRTI2, CIF 0 /OR JUST EXIT. POSTDS PAGE
/ / / 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. / / START2, 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 START2 /MESSAGE ALREADY DISPLAYED, EXIT. ISZ CMGC ISZ CMGB JMP CMG01 JMS ERRMSG /QUEUE FULL, ISSUE ERROR MESSAGE JMP START2 /EXIT.
/ / ADD A NEW MESSAGE / CMG02, TAD I CMGA /ADD THE NEW TEXT ADDRESS TO THE DCA I CMGC /MESSAGE BUFFER. JMS CMG07 /GO DISPLAY THE NEW MESSAGE TAD (BELL) /NOW RING THE ALERT ALARM CAL RUN JMP START2 /ALL DONE, EXIT. / / DELETE A MESSAGE / CMG03, CLB TAD I CMGC /LOOK FOR THE MESSAGE IN THE QUEUE. SNA JMP START2 /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 START2 /MESSAGE NOT IN QUEUE, EXIT. CMG04, 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 START2
/ / 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 CRTXDF / 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 CRTDMG, ZBLOCK 3 CMG02A, 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 CRTM00 CRTM00 CRTM00 CRTM00 CRTM00 CRTM00 0000
/ / / ASCII ADDRESSES FOR MESSAGE LINES / / CMSADD, 6161 /LINE 11 DECIMAL 6162 6163 6164 6165 6166 6167 6170 6171 6261 / ERRMSG, 0 TAD TTYMSG /IS THE ERROR MESSAGE ACTIVE ? SZA CLA JMP START2 /YES, JUST EXIT CAL /NO, SEND "CRT MESSAGE QUEUE SEND /EXCEEDED" TO CONSOLE TELETYPE TTYST TTYMSG JMP I ERRMSG / TTYMSG, ZBLOCK 3 0 0 TEXT "]3CRT MESSAGE QUEUE EXCEEDED"
/ / / TASK TO REFRESH THE PRODUCT DATA WHEN THE MACHINE STOPS / / START3, 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 START3 /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