|
|
DataMuseum.dkPresents historical artifacts from the history of: Philips Data Systems |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Philips Data Systems Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 42826 (0xa74a)
Notes: pts_type(SC)
Names: »DRDY02.SC«
└─⟦f350e1b7a⟧ Bits:30009678 Philips computer tape "600219"
└─⟦this⟧ »MONGEN/DRDY02.SC«
IDENT DRDY02 REL 11.0 81-05-25 870105041100 = 1 ECB-ADDRESS CHECKED IN ERROR-ROUTINE REL 11.0 81-02-03 = 2 ECB-ADDRESS CHECKED IF LRC-ERROR OCCURED REL 11.0 81-02-13 = 3 ASS. ERROR IF FAST0=1, TRASPA=1 AND WHATDY=1 REL 11.0 81-02-17 = 4 GREEK CHARACTER SET HANDLING & NEW CONDITIONS REL 11.0 81-04-06 * ************************************************************ * * * * PHILIPS TERMINAL SYSTEM P T S * DRDY02 = DRIVER VIDEO DISPLAY * * * ************************************************************ * * THIS DRIVER HANDLES OUTPUT TO THE VIDEO * DISPLAYS PTS 6342, 6344, 6346 AND TO THE * DISPLAYS PTS 6351, 6385 AND 6386. * THE DRIVER INCLUDES DEVICE DEPENDENT ECHO- * FUNCTIONS WHICH MAKES IT POSSIBLE TO USE * THE DISPLAY AS AN ECHO-DEVICE TO ANY KEY- * BOARD. * * * THE FOLLOWING ORDERS ARE TREATED : * * ORDER 00 TEST STATUS * 05 BASIC WRITE * 06 STANDARD WRITE * 0B SET CURSOR AND WRITE * 31 ERASE * * * NORMAL REGISTER USAGE : * * REGISTER A1 = RETURN CODE * A2 = OUTPUT CHARACTER * A3 = BUFFER INDEX * A4 = WORKING REGISTER * A5 = STACK BASE * A6 = DWT-ADDRESS * A7 = ORDER * A8 = ECB-ADDRESS * * * ENTRIES * * ENTRY DYAD ADDRESS TO ADDRESSBLOCK * * * EXTERNALS * * * TOSS ROUTINES * EXTRN LENDER I/O-REQUEST ERROR EXTRN LENDIS END I/O-REQUEST EXTRN STABLK START OF BLOCK EXTRN OUTPUT SEND EXTRN ENDBLK END OF BLOCK EXTRN GETCHR FETCH CHARACTER FROM ECB-BUFFER EXTRN ECHRTN RETURN TO KEYBOARD EXTRN TENDIO END OF I/O * * DWT DISPLACEMENTS * EXTRN DWTDEV TERMINAL DEVICE STATUS EXTRN DWTST DEVICE STATUS EXTRN DWTOR ORDER EXTRN DWTSB2 STACK BASE * * ECB DISPLACEMENTS * EXTRN ECBBA BUFFER ADDRESS EXTRN ECBRL REQUESTED LENGTH EXTRN ECBEL EFFECTIVE LENGTH EXTRN ECBRC RETURN CODE EXTRN ECBCW CONTROL WORD * ************************************************************ * * CONSTANTS * ************************************************************ * * DWT DISPLACEMENTS * DWTAP EQU /2 HEAD POSITION POINTER DWTBC EQU /1 POSITION COUNTER DWTLIN EQU /4 LINES DWTPOS EQU /5 POSITIONS DWTBLC EQU /6 CHARACTERS IN BLOCK * * CHARACTERS * DUMMY EQU /3 DUMMY CHARACTER BACKSP EQU /08 NON-DESTRUCTIVE BACKSPACE LF EQU /0A LINE FEED HOME EQU /0B CURSOR HOME CLEHOM EQU /0C CLEAR AND CURSOR HOME CR EQU /0D CARRIAGE RETURN CURRIG EQU /10 CURSOR RIGHT SCADD EQU /11 SET CURSOR ADDRESS ULSTOP EQU /13 UNDERLINE STOP FASOUT EQU /14 FAST OUTPUT STILL EQU /18 CURSOR STEADY CTYCOD EQU /1B SET COUNTRY CODE LISTOP EQU /1F LOW INTENSITY STOP SPACE EQU /20 SPACE * * RETURN CODES * CCERR EQU /4 CODE CHECK ERROR * * OTHER * MINBLK EQU 6 BLOCK SIZE FASTNR EQU 6 LEAST NUMBER OF CHARS TO SEND WITH FAST OUTPUT * ************************************************************ * * ADDRESS BLOCK * ************************************************************ DATA DVBLEN BUFFER LENGTH DATA 2 DEVICE INDEX DYAD EQU * DATA ACDY DRIVER ACTIVATION ADDRESS DATA ABDY ABORT ROUTINE DATA 0 NO INTERRUPT HANDLER DATA RCDY RECOVERY ROUTINE DATA ECHODY ECHO ROUTINE * ************************************************************ * * CONDITIONAL ASSEMBLY * ************************************************************ * * IF THE CONSTANT X:A IS SET TO 1, FAST OUTPUT * WILL BE USED IF A NUMBER (SEE THE CONSTANT "FASTNR") * OF CONSECUTIVE CHARACTERS IN THE ECB-BUFFER ARE * FOUND EQUAL. * X:A EQU 0 FASTO EQU 1 * * * BY SETTING X:B=1 THE DRIVER HANDLES OTHER DISPLAYS THAN PTS 6344 * 6346, 6385 AND 6386. * X:B EQU 0 WHATDY EQU 0 * * * BY SETTING X:C TO 1 LOWER CASE CHAR. GENERATOR * (COLUMNS 6 AND 7) CAN BE USED X:C EQU 1 LOWCHA EQU 0 * * * BY MEANS OF CONDITIONAL ASSEMBLY IT IS POSSIBLE * TO SUPPRESS ECHOING OF END OF RECORD CHARACTER. * THIS IS ATTAINED BY SETTING THE CONSTANT X:G=0 * X:D EQU 0 EORECH EQU 0 * * BY SETTING THE CONSTANT TRASPA = 1 IT IS * POSSIBLE TO SUPPRESS TRAILING BLANKS, /12, /1E AND /1F. * X:E EQU 0 TRASPA EQU 1 * * BY SETTING X:F = 1, CURSOR WILL BE STEADY * INSTEAD OF BLINKING. * X:F EQU 1 STEADY EQU 1 * * BY MEANS OF CONDITIONAL ASSEMBLY IT IS POS- * SIBLE TO CHOOSE BETWEEN TEN DIFFERENT * CHARACTER SETS, IF PTS 6385 IS USED. * * CODE COUNTRY * 0 GB/NL/B * 1 D/A/L/CH * 2 F/CH/B/L * 3 E * 4 I/CH * 5 S/SF * 6 DK/N * 7 P * 8 YU * 9 US X:G EQU 0 COUNTRY EQU 0 * * MEMORY MANAGEMENT BUFFER SIZE * X:H EQU 82 DVBLEN EQU 512 * * MAXIMUM BLOCK SIZE * X:J EQU 140 MAXBLK EQU X:J * * X:I SHOULD BE SET TO 1 IF A PTS 6385 OR 86 IS INCLUDED IN SYSTEM =4 * X:I EQU 0 PLASM EQU 1 * * IF X:K = 1 IT IS POSSIBLE TO USE GREEK =4 * CHARACTER SET =4 * X:K EQU 0 =4 GREECE EQU X:K =4 * EJECT * ***************************************************** * * A C T I V A T I O N P A R T * * THIS PART MAKES A START OF BLOCK, CHECKS THE * REQUESTED ORDER AND BRANCHES TO THE APPROPRIATE * PART OF THE DRIVER. * ******************************************************* * ACDY EQU * LDK A3,0 RESET BUFFER INDEX CM DWTBLC+DWTDEV,A6 CLEAR CHARACTER COUNTER LDKL A2,MAXBLK MAX. BLOCK SIZE CF A5,STABLK START OF BLOCK RF(NZ) DYER10 * * TEST ORDER * LDR A7,A7 GET ORDER RF(Z) DY100 ORDER 00, TEST STATUS * SUK A7,/5 RF(Z) DY200 ORDER 05, BASIC WRITE * SUK A7,1 RF(Z) DY300 ORDER 06,STANDARD WRITE * SUK A7,/5 ABL(Z) DY600 ORDER 0B, SET CURSOR AND WRITE * SUK A7,/26 ABL(Z) DY700 ORDER 31, ERASE * * I/O-REQUEST ERROR * REQERR EQU * CF A5,ENDBLK END OF BLOCK ABL LENDER SET RETURN CODE AND END I/O EJECT * ************************************************************ * * ORDER 00, TEST STATUS. * THIS PART SENDS A DUMMY CHARACTER TO THE DISPLAY * AND SETS BIT 15 IN THE RETURN CODE IF THE DISPLAY * IS NOT OPERABLE. * THE CURSOR POSITION IS RETURNED IN CONTROL WORD OF * ECB, WITH LINE NUMBER IN LEFT BYTE AND COLUMN IN * THE RIGHT. * ************************************************************ * DY100 EQU * LDK A2,DUMMY CF A5,OUTPUT SEND DUMMY RF(NZ) DYER10 * LD A4,DWTAP+DWTDEV,A6 GET CURSOR POSITION ST A4,ECBCW,A8 SAVE CURSOR POSITION IN ECB * ABL ENDIO EJECT * ************************************************************ * * ORDER 05, BASIC WRITE. * THIS ORDER SENDS THE REQUESTED NUMBER OF * CHARACTERS TO THE DISPLAY AND SETS THE * INTERNAL CURSOR POSITION COUNTER TO HOME * POSITION. (/0101) * ************************************************************ * DY200 EQU * IFT TRASPA=1 CF A15,TRASP SUPPRESS TRAILING SPACES XIF DY205 EQU * CF A15,GETCHR FETCH CHARACTER FROM ECB-BUFFER LDR A1,A1 IS THERE ANY CHARACTER TO SEND ? RF(NP) DY210 NO IFT GREECE=1 =4 CF A15,GRCHAR =4 XIF * CF A5,OUTPUT YES ! SEND CHARACTER RF(NZ) DYER05 * CF A15,POSUPD UPDATE POSITION COUNTER * * CHECK IF MAX. BLOCKSIZE IS REACHED. START A * NEW BLOCK IF IT IS. * IM DWTBLC+DWTDEV,A6 INCREMENT CHARACTER COUNTER LDKL A2,MAXBLK GET BLOCKSIZE CW A2,DWTBLC+DWTDEV,A6 BLOCK FILLED ? * RB(G) DY205 NO ! NEXT CHARACTER * CF A5,ENDBLK YES ! END BLOCK RF(NZ) DYER05 LDKL A2,MAXBLK GET BLOCKSIZE CF A5,STABLK START NEW BLOCK RF(NZ) DYER05 CM DWTBLC+DWTDEV,A6 RESET CHARACTER COUNTER RB DY205 NEXT CHARACTER * DY210 EQU * CF A15,UPDAPP RESET POSITION COUNTER * LDKL A4,/0101 SET HEAD POSITION COUNTER ST A4,DWTAP+DWTDEV,A6 TO HOME POSITION. (/0101) CM DWTBLC+DWTDEV,A6 RESET CHARACTERS-IN-BLOCK COUNTER * ABL DY493 END REQUEST * DYER05 EQU * CM DWTBLC+DWTDEV,A6 RESET CHARACTERS-IN-BLOCK COUNTER BEFORE RF DYER10 ERROR ROUTINE IS ENTERED EJECT * ************************************************************ * * ORDER 06, STANDARD WRITE. * THIS PART CHECKS IF THE REQUESTED LENGTH IS ZERO. * IF IT IS, CARRIAGE RETURN AND LINE FEED ARE SENT, AND * THE REQUEST IS COMPLETED. * ELSE THIS PART LOOKS FOR A CONTROL CHARACTER IN THE FIRST WORD * IN THE ECB-BUFFER AND CARRIES OUT THE DESIRED FUNCTION. * THEN IT CHECKS AND SENDS THE REST OF THE CHARACTERS * IN THE ECB-BUFFER TO THE DISPLAY UNLESS A SPECIAL * CHARACTER ( /07, /11, /12, /13, /14, /1E, /1F, /AE ) IS RECOGNIZED. * IF A SPECIAL CHARACTER IS FOUND, THE APPROPRIATE FUNCTION * IS CARRIED OUT BEFORE NEXT CHARACTER IS SENT. * WHEN ALL CHARACTERS ARE SENT, THE CURSOR POSITION IS * SAVED IN THE CONTROL WORD OF ECB. * ************************************************************ * DY300 EQU * * * TEST REQUESTED LENGTH * LD A2,ECBRL,A8 GET REQUESTED LENGTH. IS IT ZERO ? RF(Z) DY307 YES ! * * TEST CONTROL CHARACTER * DY305 EQU * LD A2,ECBBA,A8 GET BUFFER ADDRESS LC A2,1,A2 GET CONTROL CHARACTER ANK A2,/FF ADK A3,2 INCREMENT BUFFER INDEX * SUK A2,/2B RF(Z) DY335 NO MOVING OF CURSOR DY307 EQU * * LDK A4,1 FIRST POSITION AND ONE LINE FEED. SC A4,DWTAP+DWTDEV+1,A6 RESET HEAD POSITION COUNTER * SUK A2,/5 TWO LINE FEED ? RF(NZ) DY310 NO ! LDK A4,2 YES ! INDICATE TWO LINE FEED * DY310 EQU * SUK A2,1 ERASE ? RF(Z) DY330 YES ! CONTROL CHARACTER MEANS ERASE * LDK A2,CR CARRIAGE RETURN * DY320 EQU * CF A5,OUTPUT SEND DYER10 RF(NZ) DYER15 * SUK A4,1 READY ? RF(N) DY335 YES ! START WRITING ON DISPLAY * LC A1,DWTLIN+DWTDEV,A6 MAX. NUMBER OF LINES ON DISPLAY CC A1,DWTAP+DWTDEV,A6 ALREADY ON LAST LINE ? RF(NG) DY325 YES ! * LDKL A2,/100 NO ! INCREMENT LINE COUNTER ADS A2,DWTAP+DWTDEV,A6 DY325 EQU * LDK A2,LF LINE FEED CHARACTER RB DY320 SEND NEXT LINE FEED * DY330 EQU * SC A4,DWTAP+DWTDEV,A6 RESET LINE COUNTER LDK A2,CLEHOM CLEAR AND CURSOR HOME LDK A4,0 INDICATE ONLY ONE CHARACTER TO SEND RB DY320 SEND EJECT * * * WRITING PART, ORDER 06 (ALSO USED BY ORDER 0B). * * DY335 EQU * IFT TRASPA=1 CF A15,TRASP SUPPRESS TRAILING SPACES XIF DY340 EQU * CF A15,GETCHR GET CHARACTER FROM ECB-BUFFER * LDR A1,A1 LAST CHARACTER ? ABL(NP) DY405 YES ! IFT GREECE=1 =4 CF A15,GRCHAR =4 XIF * LDR A4,A2 CHECK CODE LIMITS SUK A4,/20 RF(N) DY380 TEST IF SPECIAL CHARACTER SUK A4,/5F RF(P) DY380 TEST IF SPECIAL CHARACTER IFT FASTO=1 IFT WHATDY=1 LDK A4,0 RESET A4 BEFORE ENTERING THE OUTPUT SEQ. LD A1,DWTDEV,A6 6344, 6385 OR 6386 ? ANKL A1,/1000 RF(NZ) FAST80 NO ! XIF IFT FASTO=1 * * * FAST OUTPUT SHOULD BE USED IF A NUMBER OF * CHARACTERS ARE FOUND EQUAL. * * LD A1,ECBBA,A8 GET BUFFER ADDRESS ADR A1,A3 ADD BUFFER INDEX * * LC A4,DWTBC+DWTDEV,A6 GET POSITION ON THE LINE AD A4,DWTAP+DWTDEV,A6 ANK A4,/FF * FAST10 EQU * ADK A4,1 INCREMENT CHARACTER COUNTER CCR A2,A1 NEXT CHAR. IN BUFFER EQUAL TO CURRENT ? RF(NE) FAST40 NO ! * CC A4,DWTPOS+DWTDEV,A6 MAX. POSITIONS ? RF(NL) FAST40 YES ! * CW A3,ECBRL,A8 REQUESTED LENGTH ? RF(NL) FAST40 YES ! * ADK A1,1 INCREMENT COUNTERS ADK A3,1 RB FAST10 CHECK NEXT CHARACTER * FAST40 EQU * LD A1,DWTAP+DWTDEV,A6 GET NUMBER OF EQUAL CHARACTERS AD A1,DWTBC+DWTDEV,A6 ANK A1,/FF SUR A4,A1 * CWK A4,FASTNR COND. FOR FAST OUTPUT FULLFILLED ? RF(L) FAST80 NO ! * * YES ! SEND CHARACTERS WITH FAST OUTPUT * ADS A4,DWTBC+DWTDEV,A6 UPDATE POSITION COUNTER * SLC A3,8 SAVE BUFFER POINTER ADR A4,A3 * IFT LOWCHA=0 LDR A3,A2 SUK A3,/5F RF(NP) FAST30 SUK A2,/20 FAST30 EQU * XIF IFT FASTO=1 LDR A3,A2 PUT CHARACTER INTO A3 * CF A5,FASTER * LDR A3,A4 RESTORE BUFFER POINTER SRL A3,8 * LC A4,DWTBC+DWTDEV,A6 GET CURSOR POSITION ANK A4,/FF AD A4,DWTAP+DWTDEV,A6 * CF A5,CURPOS SET CURSOR RB DY340 NEXT CHARACTER FAST80 EQU * XIF * IFT LOWCHA=0 LOWER CASE NOT USED LDR A1,A2 SUK A1,/5F RF(NP) DY360 SUK A2,/20 DY360 EQU * XIF DY370 EQU * CF A5,OUTPUT SEND CHARACTER DYER15 ABL(NZ) DYER20 CF A15,POSUPD POSITION COUNTER UPDATE IFT FASTO=1 IFT WHATDY=1 LD A1,DWTDEV,A6 6344, 6385 OR 6386 ? ANKL A1,/1000 RF(NZ) FAST90 NO ! XIF IFT FASTO=1 SUK A4,1 DECREMENT CHARACTER COUNTER RB(NP) DY340 ALL CHECKED CHARS. SENT ! NEXT ! LD A2,ECBBA,A8 GET CHARACTER TO SEND AGAIN ADR A2,A3 LC A2,-1,A2 ANK A2,/7F MASK CHARACTER RB FAST80 FAST90 EQU * XIF RB DY340 NEXT CHARACTER * * TEST IF SPECIAL CHARACTER * DY380 EQU * LDK A4,0 RESET A4 LDR A1,A2 CHARACTER * SUK A1,/07 BELL ( /07 ) ? RF(Z) DY467 YES ! SEND * SUK A1,/A TABULATION ( /11 ) ? ABL(Z) ADY140 YES ! GO TO TABULATION ROUTINE * SUK A1,/3 FAST OUTPUT ( /14 ) ? RF(Z) DY390 YES ! GO TO THAT ROUTINE * SUK A1,/9A POINT ( /AE ) ? RF(Z) DY410 YES ! LOAD AND SEND IFF WHATDY+PLASM=0 =4 * IF PTS 6344 IS USED LD A4,DWTDEV,A6 CHECK IF PTS 6344 IS USED ANKL A4,/3000 RF(NZ) DY385 NO ! XIF * ADK A1,/9C UNDERLINE START ( /12 ) ? RF(Z) DY467 YES ! * SUK A1,/1 UNDERLINE STOP ( /13 ) ? RF(Z) DY467 YES ! * SUK A1,/B LOW INTENSITY START ( /1E) ? RF(Z) DY467 YES ! * SUK A1,/1 LOW INTENSITY STOP ( /1F ) ? RF(Z) DY467 YES ! * * ILLEGAL CHARACTER * DY385 EQU * LDK A1,CCERR CODE CHECK ERROR ORS A1,ECBRC,A8 SET RETURN CODE OF ECB RB DY340 NEXT CHARACTER EJECT * * ROUTINE FOR FAST OUTPUT * DY390 EQU * IFT TRASPA=1 LD A4,ECBCW,A8 RESTORE OLD REQ. LEN. ST A4,ECBRL,A8 XIF CF A15,GETCHR GET OUTPUT CHARACTER * LD A4,ECBRL,A8 REQUESTED LENGTH SUR A4,A3 GET NUMBER OF CHARACTERS TO SEND RF(NP) DY400 NONE ! IFT GREECE=1 =4 CF A15,GRCHAR =4 XIF * LDR A3,A2 LOAD CHARACTER IN A3 * CF A5,FASTER SEND WITH FAST OUTPUT * DY400 EQU * LD A3,ECBRL,A8 GET REQ. LEN. TO STORE IN EFF. LEN * DY405 RF DY470 GO TO COMMON END * * SEND A POINT * DY410 EQU * LDK A2,/2E GET CODE FOR POINT RB DY370 SEND POINT * DY467 EQU * CF A5,OUTPUT SEND SPECIAL CHARACTER RF(NZ) DYER20 NOT OK ! ABL DY340 NEXT CHARACTER ! EJECT ************************************************************ * * TABULATION * ************************************************************ ADY140 EQU * CF A15,GETCHR GET FIRST ASCII CHARACTER LDR A4,A2 CF A15,GETCHR GET SECOND ASCII CHARACTER ANK A2,/F ANK A4,/F RF(E) ADY144 ADY143 ADK A2,/A FROM DECIMAL TO HEXADECIMAL SUK A4,1 RB(NE) ADY143 ADY144 LC A4,DWTAP+DWTDEV+1,A6 SUR A2,A4 SUBTRACT HEAD POSITION POINTER LC A4,DWTBC+DWTDEV,A6 SUR A2,A4 AND REQUESTS POSITION COUNTER TO GET NUMBER OF SPACES TO SEND ABL(NP) DY340 NEXT CHARACTER LDR A4,A2 ADY145 LDK A2,CURRIG CURSOR RIGHT CF A5,OUTPUT RF(NZ) DYER20 CF A15,POSUPD POSITION COUNTER UPDATING SUK A4,1 READY ? RB(NE) ADY145 NO ABL DY340 NEXT CHARACTER EJECT ************************************************************** * * COMMON END. ALL CHARACTERS ARE SENT. RESET MODES WHICH * HAS BEEN SET UP BY SPECIAL CHARACTERS. * ************************************************************* * DY470 EQU * LDK A2,ULSTOP UNDERLINE STOP CF A5,OUTPUT SEND DYER20 RF(NZ) DYER30 * LDK A2,LISTOP LOW INTENSITY STOP CF A5,OUTPUT SEND RF(NZ) DYER30 * CF A15,UPDAPP UPDATE HEAD POSITION COUNTER * DY493 EQU * IFT TRASPA=1 LD A2,ECBCW,A8 ST A2,ECBRL,A8 RESTORE OLD REQUESTED LENGTH XIF ST A3,ECBEL,A8 STORE EFF. LENGTH IN ECB LD A2,DWTAP+DWTDEV,A6 SET HEAD POSITION POINTER ST A2,ECBCW,A8 IN CONTROL WORD OF ECB ENDIO EQU * CF A5,ENDBLK END OF BLOCK RF(NZ) DYER30 ABL LENDIS END I/O EJECT ************************************************************ * * ORDER 0B, SET CURSOR AND WRITE. * THIS ORDER SETS CURSOR TO THE POSITION GIVEN IN * THE CONTROL WORD OF ECB AND SENDS THE CHARACTERS * TO THE DISPLAY, CHECKING THE SAME SPECIAL CHARAC- * TERS AS ORDER 06. * ************************************************************ * DY600 EQU * IFT WHATDY=1 LD A4,DWTDEV,A6 6344, 6346, 6385 OR 6386 ? ANKL A4,/1000 RF(Z) DY610 YES ! * GET LINE LC A4,ECBCW,A8 GET REQUESTED LINE CC A4,DWTLIN+DWTDEV,A6 OUTSIDE SCREEN? RF(NG) ADY207 NO! LC A4,DWTLIN+DWTDEV,A6 YES! SET CURSOR AT END OF LINE ADY207 EQU * LC A3,DWTAP+DWTDEV,A6 GET ACTUAL LINE ADY210 CWR A4,A3 RF(N) ADY250 REQUESTED LINE ABOVE ACTUAL RF(E) ADY300 SAME LINE LDK A2,LF LINE FEED ADK A3,1 INCREMENT ACTUAL LINE NUMBER ADY230 CF A5,OUTPUT SEND RF(NZ) DYER30 LDR A4,A4 REQUESTED LINE RB(NZ) ADY210 NOT EQUAL ZERO LDK A4,1 RF ADY300 ADY250 LDK A2,HOME HOME LDK A3,1 RESET ACTUAL LINE NUMBER ST A3,DWTAP+DWTDEV,A6 RESET POSITION RB ADY230 * * * GET POSITION * ADY300 SC A4,DWTAP+DWTDEV,A6 UPDATE HEAD LINE COUNTER LC A4,ECBCW+1,A8 GET REQUESTED POSITION CC A4,DWTPOS+DWTDEV,A6 OUTSIDE SCREEN? RF(NG) ADY303 NO! LC A4,DWTPOS+DWTDEV,A6 SET LAST LINE ADY303 EQU * CWK A4,1 FIRST POSITION ? RF(NE) ADY305 NO CWR A4,A3 FIRST LINE ? RF(NE) ADY305 NO LDK A2,HOME CURSOR GO HOME RF ADY330 ADY305 RF(NL) ADY307 REQ. POS NOT ZERO LDK A4,1 ADY307 LC A3,DWTAP+DWTDEV+1,A6 GET ACTUAL POSITION CC A3,DWTPOS+DWTDEV,A6 MAX-POS? RF(NG) ADY310 NO! SUK A3,1 ADY310 CWR A4,A3 FORWARDS OR BACKWARDS RF(E) ADY370 POSITION FOUND RF(N) ADY340 BACK LDK A2,CURRIG CURSOR RIGHT ADK A3,1 UPDATE POSITION COUNTER ADY330 CF A5,OUTPUT SEND RF(NZ) DYER30 RB ADY310 ADY340 SUR A3,A4 ACTUAL POS. - WANTED POS. CWR A3,A4 COMPARE BACKSTEPS WITH CR-WAY RF(L) ADY345 BACKSPACE WAY LDK A2,CR CARRIAGE RETURN LDK A3,1 INDICATE FIRST POSITION RB ADY330 ADY345 LDK A2,BACKSP BACKSPACE CF A5,OUTPUT SEND RF(NZ) DYER30 SUK A3,1 LAST BACKSPACE ? RB(NE) ADY345 ADY370 SC A4,DWTAP+DWTDEV+1,A6 UPDATE HEAD POSITION POINTER RF DY620 DY610 EQU * XIF LD A4,ECBCW,A8 GET REQUESTED CURSOR POSITION ST A4,DWTAP+DWTDEV,A6 UPDATE HEAD POSITION COUNTER CF A5,CURPOS SET CURSOR ON DISPLAY * DY620 EQU * LDK A3,2 START BUFFER INDEX ABL DY335 SEND CHARACTERS WITH STANDARD WRITE EJECT ************************************************************ * * CURPOS = SUBROUTINE TO SET CURSOR * AT ENTRY A4 = CURSOR POS (POSITION AND LINE) * ************************************************************ CURPOS EQU * LDK A2,SCADD SET CURSOR ADDRESS CF A5,OUTPUT SEND RF(NZ) DYER30 * LDR A2,A4 GET POSITIONS CC A4,DWTPOS+DWTDEV,A6 MORE THAN MAX. POSITIONS ? RF(NG) CURR10 NO ! LC A2,DWTPOS+DWTDEV,A6 YES ! SET MAX. POSITIONS * CURR10 ADK A2,/1F CONVERT CF A5,OUTPUT SEND DYER30 RF(NZ) DYER40 * LDR A2,A4 SRL A2,8 GET LINES CC A2,DWTLIN+DWTDEV,A6 MORE THAN MAX. LINES ? RF(NG) CURR20 NO ! LC A2,DWTLIN+DWTDEV,A6 YES ! SET MAX LINES * CURR20 EQU * ADK A2,/1F CONVERT CF A5,OUTPUT SEND RF(NZ) DYER40 RTN A5 EJECT ************************************************************ * * ORDER 31, ERASE. * SENDS THE NUMBER OF SPACES THAT IS GIVEN IN CONTROL * WORD OF ECB. THE CURSOR IS NOT MOVED. * ************************************************************ * DY700 EQU * LD A4,ECBCW,A8 GET NUMBER OF CHARACTERS TO ERASE IFT WHATDY=1 LD A1,DWTDEV,A6 PTS 6344,6385 OR 6386 ? ANKL A1,/1000 RF(Z) DY750 YES ! * LD A2,DWTPOS+DWTDEV,A6 MAX. CHARACTERS ANK A2,/FF LC A3,DWTAP+DWTDEV+1,A6 CURRENT POSITION ANK A3,/FF SUR A2,A3 NR OF CHARS. TO END OF SCREEN LDR A3,0 ADJUST ADK A2,1 ADJUST LENGTH CWR A4,A2 OUTSIDE SCREEN ? RF(L) DY710 NO ! LDR A4,A2 YES ! MODIFY LENGTH LDR A3,1 ADJUST DY710 EQU * ADR A3,A4 CHARACTERS TO ERASE LDK A2,/20 SPACE DY720 EQU * SUK A4,1 DECREMENT NUMBER OF CHARACTERS RF(N) DY730 ERASE READY * CF A5,OUTPUT SEND RF(NZ) DYER40 RB DY720 * DY730 EQU * CF A5,ENDBLK END OF BLOCK RF(NZ) DYER40 LDKL A2,MAXBLK BLOCK SIZE CF A5,STABLK START OF NEW BLOCK RF(NZ) DYER40 LDR A4,A3 RESET COUNTER LDR A2,BACKSP CURSOR LEFT DY740 EQU * SUK A4,1 CURSOR IN ORIGINAL POSITION ? ABL(N) ENDIO YES ! CF A5,OUTPUT NO ! SEND ANOTHER BACKSPACE RF(NZ) DYER40 RB DY740 DY750 EQU * XIF LDK A3,/20 SPACE CF A5,FASTER SEND WITH FAST OUTPUT ABL ENDIO EJECT ************************************************************ * * ECHODY, DEVICE-DEPENDENT ECHO-ROUTINE * THIS ROUTINE CHECKS IF THE ECHO-CHARCTER * IS A BACKSPACE, CLEAR OR EOR-KEY ( IF * "SUPPRESS ECHOING OF EOR" IS REQUESTED * AT SYSGEN ). ELSE THE CHARACTER WILL BE * SENT TO THE DISPLAY. * ************************************************************ * ECHODY EQU * LDR A7,A7 END OF ECHOING ? RF(NN) EDY110 NO ! * * CF A15,UPDAPP UPDATE HEAD POSITION COUNTER CF A15,TENDIO END I/O LD A1,DWTBLC+DWTDEV,A6 BLOCK RESERVED ? RF(Z) EDY130 NO, RETURN TO KEYBOARD RF EDY120 * EDY110 EQU * LDR A4,A1 SAVE "MORE CHARACTERS" INDICATION IFT GREECE=1 =4 CF A15,GRCHAR =4 =4 XIF =4 LDR A3,A2 SAVE CHARACTER * IFT EORECH=0 SUK A3,/80 RF(NN) EDY130 NOT TO BE ECHOED ADK A3,/80 XIF LD A1,DWTBLC+DWTDEV,A6 BLOCK RESERVED ? RF(Z) EDY116 NO ! CWK A1,MINBLK YES ! IS IT FULL ? RF(L) EDY118 NO ! CM DWTBLC+DWTDEV,A6 YES ! CLEAR CHARACTER COUNTER CF A5,ENDBLK FINISH BLOCK RF(NZ) DYER40 EDY116 EQU * LDK A2,MINBLK CF A5,STABLK DECLARE BLOCK RF(NZ) DYER40 EDY118 EQU * LDR A2,A3 RELOAD CHARACTER * SUK A3,/18 CLEAR ? RF(Z) DY850 YES ! ADK A3,/10 BACKSPACE ? RF(Z) DY800 YES ! * * * SEND CHARACTER TO ECHO-DEVICE * IM DWTBLC+DWTDEV,A6 INCREMENT COUNTER CF A5,OUTPUT SEND DYER40 RF(NZ) DYER45 CF A15,POSUPD POSITION COUNTER UPDATING SUK A4,1 MORE CHARACTERS ? RF(Z) EDY130 YES ! * EDY120 EQU * CF A5,ENDBLK END OF BLOCK RF(NZ) DYER45 CM DWTBLC+DWTDEV,A6 RESET COUNTER EDY130 ABL ECHRTN RETURN TO KEYBOARD EJECT ************************************************************ * * BACKSPACE * CHECKS CURSOR POSITION, MOVES CURSOR ONE STEP * BACKWARDS, SENDS A SPACE AND MOVES CURSOR ONE * STEP BACKWARDS AGAIN. * ************************************************************ * DY800 EQU * LC A3,DWTBC+DWTDEV,A6 GET POSITION COUNTER ANK A3,/FF RB(Z) EDY120 FIRST POSITION * CF A5,ENDBLK FINISH OLD BLOCK RF(NZ) DYER45 LDK A2,MINBLK CF A5,STABLK START A NEW BLOCK RF(NZ) DYER45 * LDK A4,2 SET "SEND AGAIN" FLAG SUK A3,1 INDICATE ONE BACKSTEP SC A3,DWTBC+DWTDEV,A6 SET POSITION COUNTER ADK A3,1 GET POSITION ON LINE AD A3,DWTAP+DWTDEV,A6 CC A3,DWTPOS+DWTDEV,A6 LAST POSITION ON LINE ? RF(L) DY810 NO ! RB(G) DY800 NO, OUTSIDE ! * * DY805 EQU * * LDK A2,SPACE SPACE CF A5,OUTPUT SEND RF(NZ) DYER45 * DY810 EQU * LDK A2,BACKSP NON-DESTRUCTIVE BACKSPACE CF A5,OUTPUT SEND RF(NZ) DYER45 * SUK A4,1 SEND AGAIN ? RB(NZ) DY805 YES ! * NO, BACKSPACE FINISHED RB EDY120 EJECT ******************************************************** * * CLEAR * CHECKS CURSOR POSITION, SETS CURSOR WHERE LAST * REQUEST ENDED AND SENDS SPACES TO ERASE THE * CHARACTERS WRITTEN DURING CURRENT REQUEST. * ************************************************************ * DY850 EQU * CF A5,ENDBLK FINISH OLD BLOCK RF(NZ) DYER45 LDKL A2,MAXBLK GET BLOCKSIZE CF A5,STABLK START OF BLOCK DYER45 RF(NZ) DYER48 LC A3,DWTBC+DWTDEV,A6 GET POSITION COUNTER ANK A3,/FF RB(Z) EDY120 FIRST POSITION * IFT WHATDY=1 LD A1,DWTDEV,A6 PTS 6344, 6385 OR 6386 ? ANKL A1,/1000 RF(Z) DY860 YES ! CF A5,BACCAN ERASE CURRENT REQUEST RB EDY120 XIF DY860 EQU * LD A4,DWTAP+DWTDEV,A6 GET HEAD POSITION COUNTER CF A5,CURPOS SET CURSOR * LDR A4,A3 GET POSITION COUNTER ADK A4,1 UPDATE POSITION COUNTER LDK A3,SPACE GET SPACE TO SEND CF A5,FASTER SEND WITH FAST OUTPUT * SC A1,DWTBC+DWTDEV,A6 RESET POSITION COUNTER RB EDY120 IFT WHATDY=1 EJECT ************************************************************ * * BACCAN = SUBROUTINE TO POSITION CURSOR * AT THE PLACE BEFORE REQUEST IF * CLEAR. * ************************************************************ BACCAN EQU * CM DWTBLC+DWTDEV,A6 RESET CHARACTER COUNTER LDR A4,A3 LC A2,DWTBC+DWTDEV,A6 GET POSITION COUNTER ANK A2,/FF AD A2,DWTAP+DWTDEV,A6 ADD HEAD POSITION COUNTER ANK A2,/FF CC A2,DWTPOS+DWTDEV,A6 LAST POSITION RF(NP) BACA10 NO LDK A2,SPACE DESTRUCTIVE SPACE RF BACA20 BACA10 EQU * IM DWTBLC+DWTDEV,A6 INCREMENT CHARACTER COUNTER LDKL A2,MAXBLK-3 GET BLOCKSIZE - 3 CW A2,DWTBLC+DWTDEV,A6 WILL IT BE OVERFLOW IN BLOCK ? RF(G) BACA30 NO ! * CF A5,ENDBLK YES ! END OLD BLOCK RF(NZ) DYER50 LDKL A2,MAXBLK BLOCK SIZE CF A5,STABLK START A NEW BLOCK RF(NZ) DYER50 CM DWTBLC+DWTDEV,A6 RESET CHARACTER COUNTER BACA30 EQU * LDK A2,BACKSP BACKSPACE CF A5,OUTPUT SEND RF(NZ) DYER50 LDK A2,SPACE DESTRUCTIVE SPACE CF A5,OUTPUT SEND RF(NZ) DYER50 LDK A2,BACKSP BACKSPACE BACA20 CF A5,OUTPUT SEND RF(NZ) DYER50 SUK A4,1 RB(NE) BACA10 NGR A3,A3 NEGATE REGISTER ADS A3,DWTBC+DWTDEV,A6 UPDATE POSITION COUNTER RTN A5 XIF EJECT ************************************************************ * * FASTER = SUBROUTINE FOR FAST OUTPUT * AT ENTRY A4 = NUMBER OF CHARACTERS * A3 = CHARACTER TO SEND * ************************************************************ FASTER EQU * IFT WHATDY=1 LD A2,DWTDEV,A6 PTS ANKL A2,/1000 6342 OR 6351 ? RF(Z) FAS005 NO ! * * SIMULATED "FAST OUTPUT" FOR PTS 6342 AND 6351 * LC A2,DWTBC+DWTDEV,A6 AD A2,DWTAP+DWTDEV,A6 GET POSITION ANK A2,/FF ADR A2,A4 ADD NUMBER OF CHARACTERS * LD A1,DWTPOS+DWTDEV,A6 GET MAX. POSITIONS ANK A1,/FF SUR A1,A2 COMPARE RF(NN) FAS002 LENGTH OK ADR A4,A1 ADJUST LENGTH ADK A4,1 ADJUST NUMBER OF CHARACTERS * FAS002 EQU * * LDR A2,A4 PUT TWO COUNTERS IN A4 SLL A2,8 ORR A4,A2 * FAS004 EQU * LDR A2,A3 GET CHARACTER TO SEND CF A5,OUTPUT SEND RF(NZ) DYER50 SUK A4,1 DECREMENT COUNTER LDK A2,/FF ANR A2,A4 RB(P) FAS004 NEXT CHARACTER * CF A5,ENDBLK START A NEW BLOCK TO RF(NZ) DYER50 AVOID OVERFLOW IN LDKL A2,MAXBLK THE OLD ONE CF A5,STABLK RF(NZ) DYER50 * SRL A4,8 GET LENGTH COUNTER FAS003 EQU * LDK A2,BACKSP CF A5,OUTPUT SEND BACKSPACE RF(NZ) DYER50 SUK A4,1 DECREMENT COUNTER RB(P) FAS003 NEXT RTN A5 FAS005 EQU * XIF CC A4,DWTPOS+DWTDEV,A6 TEST NUMBER OF CHARACTERS RF(L) FAS010 NUMBER OF CHAR NOT TOO LONG LC A4,DWTPOS+DWTDEV,A6 GET MAX. POSITIONS ON DISPLAY FAS010 EQU * ADK A4,/20 ADD CONSTANT LDK A2,FASOUT FAST OUTPUT CF A5,OUTPUT SEND DYER48 RF(NZ) DYER50 LDR A2,A4 NO OF CHAR ANK A2,/FF CF A5,OUTPUT SEND RF(NZ) DYER50 LDR A2,A3 CF A5,OUTPUT SEND RF(NZ) DYER50 RTN A5 EJECT **************************************************** * * ERROR ROUTINE. ENTERED WHEN RETURN CODE IS SET * AFTER STABLK, OUTPUT OR ENDBLK. * ****************************************************** DYER50 EQU * LD A7,DWTST,A6 SLC A7,2 ECHO ? ABL(N) ECHRTN YES ! RETURN FROM ECHO * SRC A1,5 OUTPUT ERROR (HER) ? RF(N) RCDY YES ! GO TO RECOVERY SLC A1,5 NO ! RESTORE A1 * LD A7,DWTOR,A6 GET ORDER. ORDER 00 ? ANK A7,/FF RF(Z) DYER52 YES ! SUK A7,5 ORDER 5 ? RF(Z) DYER52 YES ! SUK A7,/2B ORDER 31 ? RF(Z) DYER52 YES ! * SRC A1,2 LRC-ERROR ? RF(N) DYER70 YES ! SLC A1,2 DYER52 SRC A1,3 LINK ERROR ? RF(NN) DYER55 NO ! LDKL A1,/2000 YES ! SET SHIFTED "NOT OPERABLE" BIT DYER55 SLC A1,3 SHIFT BACK * LDR A8,A8 =1 RF(Z) DYER60 NO ECB-ADDRESS (SYSTEM START) =1 CM ECBCW,A8 CLEAR INSIGNIFICANT CONTROL WORD DYER60 EQU * =1 ABL LENDIS COMPLETE REQUEST * * LRC-ERROR * DYER70 EQU * LDKL A5,DWTSB2 INITIALIZE A5 STACK ADR A5,A6 LDR A8,A8 ECB-ADDRESS = ZERO ? = 2 ABL(Z) ENDIO YES, DON'T SEND AGAIN = 2 IFT WHATDY=1 LD A4,DWTDEV,A6 6344,6385 OR 6386 ? ANKL A4,/1000 RF(Z) DYER90 YES ! LC A4,DWTBC+DWTDEV,A6 GET NUMBER OF POS. TO BACK ANK A4,/FF RF(Z) DYER80 CF A5,BACCAN SEND BACKSPACES AND RUB OUT LDK A3,2 SET BUFFER INDEX DYER80 ABL DY335 SEND AGAIN DYER90 EQU * XIF * LD A4,DWTAP+DWTDEV,A6 GET HEAD POS. COUNTER CF A5,CURPOS SET CURSOR ON DISPLAY LDK A3,0 RESET BUFFER INDEX LD A7,DWTOR,A6 GET ORDER ANK A7,/FF ABL ACDY EJECT ************************************************************ * * UPDAPP = SUBROUTINE TO UPDATE HEAD * POSITION POINTER WHEN END * OF REQUEST IS REACHED * ************************************************************ UPDAPP EQU * LC A2,DWTBC+DWTDEV,A6 GET POSITION COUNTER ANK A2,/FF ADS A2,DWTAP+DWTDEV,A6 UPDATE HEAD POSITION POINTER LDK A2,0 SC A2,DWTBC+DWTDEV,A6 RESET POSITION COUNTER RTN A15 ************************************************************ * * POSUPD = SUBROUTINE TO UPDATE ACTUAL POSITION * COUNTER WHEN REQUEST RUNNING. * A CHECK THAT POINTER NOT EXCEEDS THE LIMIT IS DONE * ************************************************************ POSUPD EQU * LC A2,DWTBC+DWTDEV,A6 GET POSITION COUNTER AD A2,DWTAP+DWTDEV,A6 INCLUDE HEAD POSITION POINTER ANK A2,/FF CC A2,DWTPOS+DWTDEV,A6 END OF ROW ? RF(G) POSU10 IM DWTBC+DWTDEV,A6 POSITION COUNTER POSU10 RTN A15 IFT GREECE=1 =4 EJECT =4 *************************************************** =4 * * GRCHAR = SUBROUTINE TO CONVERT GREEK CHARACTERS =4 * BEFORE THEY ARE SENT TO THE DISPLAY =4 * *************************************************** =4 GRCHAR EQU * = LDR A1,A2 IS IT A GREEK CHARACTER ? =4 SUK A1,/B9 =4 RF(P) GRCH10 NO =4 ADK A1,9 =4 RF(N) GRCH10 NO =4 * =4 ADKL A1,GRTAB GET THE CORRECT CODE FROM =4 LCR A2,A1 THE CHARACTER TABLE =4 * =4 GRCH10 EQU * =4 RTN A15 =4 * =4 GRTAB EQU * =4 DATA /2223,/263B,/405B,/5C5D,/5E5F =4 XIF =4 IFT TRASPA=1 EJECT ************************************************** * * TRASP = SUBROUTINE THAT ELIMINATES TRAILING * SPACES FROM ECB-BUFFER. IT ALSO DE- * LETES LOW INTENSITY START, HIGH * INTENSITY START. * AND TABULATIONS * ************************************************** * TRASP EQU * LD A1,ECBBA,A8 GET BUFFER ADDRESS (BA) LD A2,ECBRL,A8 GET REQUESTED LENGTH(RL) ADR A1,A2 GET END OF BUFFER SKIP05 CWK A2,2 RF(NG) SKIP30 RL < 3 SUK A1,1 DECR. BA LCR A4,A1 GET CHAR ANK A4,/FF SUK A4,/20 SPACE ? RF(Z) SKIP07 YES ADK A4,1 LOW INT. STOP ? RF(Z) SKIP07 YES ! ADK A4,1 LOW INT. START ? RF(Z) SKIP07 YES ! CWK A2,4 RF(NG) SKIP30 REQ, LENGTH < 5 LC A4,-2,A1 GET CHARACTER SUK A4,/11 TABULATION CHARACTER ? RF(NZ) SKIP30 YES ! SKIP07 SUK A2,1 DECR RL RB SKIP05 GET NEXT SKIP30 EQU * LD A4,ECBRL,A8 ST A4,ECBCW,A8 SAVE OLD REQ. LENGTH * ST A2,ECBRL,A8 STORE NEW RL * RTN A15 XIF EJECT ************************************************************ * * RCDY = RECOVERY ROUTINE * CLEARS DISPLAY AND SETS CURSOR & HEAD POSITION * COUNTER TO HOME POSITION ( /0101 ). * ************************************************************ * RCDY EQU * LDKL A2,/7FFF ANS A2,DWTST,A6 INDICATE BUSY * LDKL A2,MAXBLK MAX. BLOCK SIZE CF A5,STABLK START OF BLOCK RCER RB(NZ) DYER50 IFT PLASM=0 =4 IFF STEADY+COUNTRY=0 LD A2,DWTDEV,A6 GET DEVICE STATUS ANKL A2,/2000 PTS 6385 OR 6386 ? RF(Z) RCDY20 NO ! LDK A3,/40 SET UP TRANSFER COUNTER * RCDY10 LDK A2,STILL-1 SET UP CURSOR BLINKING ADK A2,STEADY ADJUST TO STEADY IF SO CF A5,OUTPUT SEND CURSOR INFORMATION RB(NZ) RCER SUK A3,1 DECREMENT TRANSFER COUNTER RB(P) RCDY10 NOT ENOUGH TRANSFERS LDK A2,CTYCOD SEND "SET COUNTRY CODE" CF A5,OUTPUT RB(NZ) RCER LDK A2,COUNTRY SEND "COUNTRY CODE" ORK A2,/30 MAKE ASCII DIGIT CF A5,OUTPUT RB(NZ) RCER RCDY20 EQU * XIF * LDK A2,CLEHOM CLEAR AND CURSOR HOME CF A5,OUTPUT SEND RB(NZ) RCER * LDKL A2,/0101 HOME POSITION ST A2,DWTAP+DWTDEV,A6 SET HEAD POSITION COUNTER LDK A2,0 SC A2,DWTBC+DWTDEV,A6 RESET CURRENT POSITION COUNTER * ABL ENDIO * **************************************** * * ABORT ROUTINE * **************************************** * ABDY EQU * CF A15,UPDAPP UPDATE HEAD POS. POINTER ABL LENDIS END I/O END