;***************************************************************************; ; ; ; Hazeltine 1500 Terminal Driver ; ; By David F. Pallmann ; ; ; ; MODIFIED FOR SUPERVUE TERMINALS BY GLEN A FINE ;***************************************************************************; SEARCH SYS SEARCH SYSSYM SEARCH TRM OBJNAM HA1500.TDV TFEATS=TD$LID!TD$CID!TD$DIM!TD$EOS!TD$EOL!TD$BLN!TD$UND!TD$RVA!TD$MLT LI=126. ;Hazeltine 1500 lead-in code (tilde) ;******************** ;* HZ1500 * ;******************** ;Terminal driver communications area HZ1500: WORD TD$NEW ;terminal attributes BR JMPINP ;input routine RTN ;output routine BR ECHO ;echo routine BR JMPCRT ;crt control RTN ;no init routine yet WORD 0 ;no impure area yet BYTE 24. ;number of rows BYTE 80. ;number of columns ; LWORD TFEATS ;terminal has: LWORD ^H0FFFFFFFF ; insert/delete line BLKB 32. ; insert/delete character WORD [SUP],[ER ],[VUE] ; dim video attribute RAD50 /FKEYS/ ; erase to end of screen ; erase to end of line JMPINP: JMP INP ;go handle input characters JMPCRT: JMP CRT ;go handle tcrt codes ;******************** ;* ECHO * ;******************** ;Special echo processing is performed here ;Rubouts will backspace and erase the previous character ;Control-U will erase the entire line by backspacing and erasing ECHO: CMPB D1,#25 ;control-u BEQ CTRLU CMPB D1,#177 ;rubout BNE ECHX ;Rubouts are handled by the old backspace-and-erase game ;Special handling must be performed if we are rubbing out a tab ;D6 contains the character being rubbed out RUBOUT: CMPB D6,#11 ;was it a tab? BEQ RBTB ; yes ;Rubout was of a printable character - queue up the backspace sequence KRTG: MOV #3,D3 ;set character count LEA A6,ERUB ;set buffer address MOV A6,D1 ; into d1 TRMBFQ ;queue the backspace sequence RTN ERUB: BYTE 10,40,10,0 ;Rubout was of a tab - we must calculate how big the tab was and backup over it RBTB: CLR D3 ;preclear D3 MOVW T.POB(A5),D3 ;set beginning position count MOV T.ICC(A5),D2 ;set input character count MOV T.IBF(A5),A6 ;set input buffer base KRTS: DEC D2 ;done with scan? BMI KRTQ ; yes MOVB (A6)+,D1 ;scan forward calculating position CMPB D1,#11 ; tab BEQ KRTT CMPB D1,#15 ; cr BEQ KRTC CMPB D1,#33 ; escape BEQ KRTI CMPB D1,#40 ; control-char BLO KRTS CMPB D1,#172 BHI KRTS KRTI: INC D3 ;increment position for one character BR KRTS KRTT: ADD #10,D3 ;adjust position for tab AND #^C7,D3 BR KRTS KRTC: CLR D3 ;clear position for cr BR KRTS KRTQ: COM D3 ;calculate necessary backspaces AND #7,D3 INC D3 MOV #10,D1 ;set immediate backspace character TRMBFQ ;queue the backspaces ECHX: RTN ;Echo a control-u by erasing the entire line CTRLU: TST D6 ;no action if nothing to erase BEQ CTUX CLR D3 ;preclear D3 MOVW T.POO(A5),D3 ;calculate backspace number to erase the line SUBW T.POB(A5),D3 BEQ ECHX CMP D3,T.ILS(A5) ;insure not greater than terminal width BLOS CLUA MOV T.ILS(A5),D3 CLUA: MOV #10,D1 ;queue up backspaces TRMBFQ ASL D1,#2 ;queue up spaces TRMBFQ MOV #10,D1 ;queue up backspaces TRMBFQ CTUX: RTN ;******************** ;* INP * ;******************** ;Input character processing subroutine ;Return a negative flag to indicate possible multi-byte key codes ;Detect a negative flag which indicates the multi-byte processing return INP: BMI INMLT ;skip if multi-byte processing CMPB D1,#1 ;function code? BEQ INPM ; yes - could be multi-byte sequence CMPB D1,#33 ;escape? BEQ INPM ; yes - could be multi-byte sequence AND #177,D1 ;strip char to 7 bits CMPB D1,#'_ ;underscore? BEQ 100$ ; yes - swap case CMPB D1,#177 ;del? BNE 110$ ; no 100$: XORB #40,D1 ;swap case bit 110$: LCC #0 RTN INPM: LCC #PS.N ;possible multi-byte - return N flag RTN ;Multi-byte processing is done here ;This occurs when TRMSER has accumulated all bytes of a multi-byte keystroke ;D0 contains the character count and A0 indexes the data string ;A5 indexes the terminal definition block and must be preserved ;The translated character must be returned in D1 for storage ;This routine may destroy only A0,A3,A6,D0,D6,D7 INMLT: MOVB (A0)+,D1 ;get the first character DECB D0 ;no translation if single character BEQ INMX CMPB D1,#1 ;function sequences start with SOH BEQ INMF ; function sequence - ;Escape sequences are translated directly by setting bit 7 on ;This will cause them to map to 240-377 MOVB (A0)+,D1 ;get the second character INMG: ORB #200,D1 ;set bit 7 on BIT #T$XLT,@A5 ;are we doing translation? BEQ INMNOT ; no - check for another translation INMX: LCC #0 ;reset the flags INMX2: RTN ;Function codes require additional translation so that they become 200-237 INMF: MOVB (A0)+,D1 ;get the second character SUBB #'@,D1 ;offset so that F1 becomes 0 BR INMG ; and go finish up ;Come here if program is not doing translation and we must do our own INMNOT: LEA A6,XLTTBL ;index the translation table 10$: MOVB (A6)+,D7 ;get character BEQ INMX2 ; end of table - ignore the character CMPB D1,D7 ;is it in the table? BEQ 20$ ; yes - INC A6 ; no - bypass translation BR 10$ ;loop for more - ;Come here to translate the character 20$: MOVB @A6,D1 ;translate the character BR INMX ;Translation table XLTTBL: ;;; BYTE 314,3 ;CANCEL = Control-C ;;; BYTE 302,3 ;SHIFT + CANCEL = Control-C ;;; BYTE ,15 ;EXECUTE = Return ;;; BYTE 276,15 ;SHIFT + EXECUTE = Return ;;; BYTE 313,'U-100 ;DEL LINE = Control-U BYTE 000,000 PAGE ;******************** ;* CRT * ;******************** ;Special crt control processing ;D1 contains the control code for X,Y positioning or special commands ;If D1 is positive we have screen positioning (row in hi byte, col in lo byte) ;If D1 is negative we have the special command in the low byte CRT: TSTW D1 ;is it cursor position? BMI CRTS ; no ;Cursor positioning - D1 contains X,Y coordinates TTYI ;send position command BYTE LI,17.,0,0 ADD #95._10-1,D1 CMPB D1,#31. BHIS 100$ ADDB #96.,D1 100$: TTY ;send column first ROR D1,#8. TTY ;send row second RTN ;Special commands - D1 contains the command code in the low byte CRTS: AND #377,D1 ;strip the high byte BNE CRTU ; and branch unless clear screen TTYI ;special case for clear screen BYTE LI,28.,0 EVEN CRTZ: TTYL CRTNUL ;output some nulls RTN ;Command processing per director tables CRTU: PUSH A2 ;save A2 ASL D1 ; times 2 (word offset). CMP D1,#CRCB-CRCA ;check for valid code BHI CRTX ; and bypass if bad LEA A2,CRCA-2 ;index the table ADD D1,A2 ;add command code MOVW @A2,D1 ;pick up data field offset ADD D1,A2 ;make absolute data address TTYL @A2 ;print the data field CMPB @A2,#36 ;sleep if home command BEQ CRTXZ CMPB 1(A2),#100 ;sleep if erase command BHI CRTXZ CRTX: POP A2 ;restore A2 RTN CRTXZ: POP A2 ;restore A2 BR CRTZ ; and go output nulls ;Escape sequence translation table ; EXTB: BYTE 67,73,105,111,120,121,122,124,127,131,377,377 ;Null characters for long commands ; CRTNUL: BYTE 200,200,200,200,200,200,200,200,200,200,200,0 EVEN ;Byte offset and data tables follow for all commands ; CRCA: WORD C1-.,C2-.,C3-.,C4-.,C5-.,C6-.,C7-.,C8-. WORD C9-.,C10-.,C11-.,C13-.,C14-. WORD C15-.,C16-.,C17-.,C18-.,C19-.,C20-.,C21-.,C22-. WORD C23-.,C24-.,C25-.,C26-.,C27-.,C28-.,C29-. WORD C30-.,C31-.,C32-.,C33-.,C34-.,C35-.,C36-.,C37-.,C38-.,C39-. WORD C40-.,C41-.,C42-.,C43-.,C44-.,C45-.,C46-.,C47-.,C48-.,C49-. WORD C50-.,C51-.,C52-.,C53-.,C54-.,C55-.,C56-.,C57-.,C58-. WORD C60-.,C61-.,C62-.,C63-.,C64-.,C65-.,C66-.,C67-.,C68-.,C69-. WORD C70-.,C71-.,C72-.,C73-.,C74-.,C75-.,C76-.,C77-.,C78-. CRCB: PAGE C1: BYTE LI,22,0 ;cursor home (move to column 1,1) C2: BYTE 15,12,0 ;cursor return (move to column 1) C3: BYTE LI,14,0 ;cursor up C4: BYTE 12,0 ;cursor down C5: BYTE 10,0 ;cursor left C6: BYTE 20,0 ;cursor right C7: BYTE 0 ;lock keyboard C8: BYTE 0 ;unlock keyboard C9: BYTE LI,17,0 ;erase to end o C10: BYTE LI,30,0 ;erase to end of screen C11: BYTE LI,31,0 ;enter backgroud display mode (reduced intensity). C12: BYTE LI,37,0 ;enter foreground display mode (normal intensity) C13: BYTE 0 ;enable protected fields C14: BYTE ;disable protected fields C15: BYTE LI,19.,0 ;delete line C16: BYTE LI,26.,0 ;insert line C17: BYTE 0 ;delete character C18: BYTE 0 ;insert character C19: BYTE 0 ;read cursor address C20: 0 ;read character at current cursor position C21: BYTE 0 ;start blink field C22: BYTE 0 ;end blink field C23: ;start line drawing mode (enable alternate character set) C24: ;end line drawing modable alternate character set) C25: ;set horizontal position C26: BYTE 0 ;set vertical position C27: BYTE 0 ;set terminal attributes C28: BYTE 0 ;cursor on C29: BYTE 0 ;cursor off C30: BYT ;start underscore [102] C31: BYTE 0 ;end underscore [102 C32: BYTE LI,31,0 C33: BYTE LI,37,0 C34: BYTE LI,31,0 C35: BYTE LI,37,0 C36: BYTE 0;3,'o,0 ;turn off screen display [102] C37: BYTE 0;3,'n,0 ;turn on screen display [102] C38: ;top left corner C39: ;top right corner C40: ;bottom left corner C41: ;bottom right corner C42: ;top intersect C43: ;right intersect C44: ;left intersect C45: BYTE 0;,0 ;bottom intersect C46: BYTE 0;,0 ;horizontal line C47: BYTE 0;,0 ;vertical line C48: BYTE 0;,0 ;intersection C49: ;solid block C50: ;slant block C51: BYTE 0;,0 ;cross-hatch block C52: ;double line horizontal C53: ;double line vertical C54: ;send message to function key line C55: ;send message to shifted function key C56: ;set normal display format C57: ;set horizontal split (follow with row code) C58: ;set vertical split (39 char columns) C59: ;set vertical split (40 char columns) C60: ;set vertical split column to next char C61: ;activate split segment 0 C62: ;activate split segment 1 C63: BYTE 0 ;send message to host message field C64: BYTE '^,0 ;up-arrow C65: BYTE '|,0 ;down-arrow C66: BYTE '`,0 ;raised dot C BYTE 0 ;end of line marker C68: BYTE '[,0 ;horizontal tab symbol C69: BYTE ' ,0 ;paragraph C70: BYTE ' ,0 ;dagger C71: BYTE ' ,0 ;section C72: BYTE ' ,0 ;cent sign C73: BYTE ' ,0 ;one-quarter C74: BYTE ' ,0 ;one-half C75: BYTE,0 ;degree C76: BYTE ' ,0 ;trademark C77: BYTE ' ,0 ;copyright C78: BYTE ' ,0 ;registered EVEN END .