;****************************** ; ; IBM 3101 Terminal Driver ; ;****************************** ;1.0 03-Oct-84 DFP written at @LMS by David Pallmann. ASMMSG "IBM 3101 Terminal Driver" SEARCH SYS SEARCH SYSSYM SEARCH TRM OBJNAM IBM.TDV TFEATS=TD$EOS!TD$EOL!TD$MLT ESC=33 ;********* ; IBM ;********* ;Terminal driver communications area IBM: 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: ; insert/delete line ; insert/delete character ; dim video attribute ; erase to end of screen ; erase to end of line ; multi-byte keystrokes 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,#ESC ; altmode 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,#ESC ; escape? BEQ INPM ; yes - could be multi-byte sequence LCC #0 ; no - normal processing 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,#ESC BNE INMX ;Escape sequences are translated directly by setting bit 7 on ;This will cause them to map to 240-377 ESCAPE: MOVB (A0)+,D1 ; get the second character LEA A0,ESCTBL ;point to translation table 10$: TSTB @A0 ;end of table? BEQ INMX ; yes - escape sequence is invalid CMMB (A0)+,D1 ;match? BEQ 20$ ; yes INC A0 ; no - increment index BR 10$ ; and try next table entry 20$: MOVB @A0,D1 ;put translated char in D1 BR INMX ; and return to program ESCTBL: BYTE 'A,'K-'@ ;UP ARROW becomes ^K BYTE 'D,'H-'@ ;LEFT ARROW becomes ^H BYTE 'C,'L-'@ ;RIGHT ARROW becomes ^L BYTE 'B,'J-'@ ;DOWN ARROW becomes ^J BYTE 0,0 INMX: LCC #0 ; reset the flags INMX2: RTN 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 CRTU ; no ;Cursor positioning - D1 contains X,Y coordinates TTYI BYTE ESC,'Y,0,0 ADDW #37_8.+37,D1 RORW D1,#8. TTY ;send row ROLW D1,#8. TTY ;send column RTN ;Special commands - D1 contains the command code in the low byte CRTU: AND #377,D1 ; strip the high byte ;Command processing per director tables 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 ; 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 CRTX: POP A2 ; restore A2 RTN ;Escape sequence translation table ; EXTB: BYTE 67,73,105,111,120,121,122,124,127,131,377,377 EVEN ;Byte offset and data tables follow for all commands ; CRCA: WORD C0-.,C1-.,C2-.,C3-.,C4-.,C5-.,C6-.,C7-. WORD C8-.,C9-.,C10-.,C11-.,C12-.,C13-.,C14-.,C15-. WORD C16-.,C17-.,C18-.,C19-.,C20-.,C21-.,C22-.,C23-. WORD 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-.,C59-. WORD C60-.,C61-.,C62-.,C63-.,C64-.,C65-.,C66-.,C67-.,C68-.,C69-. WORD C70-.,C71-.,C72-.,C73-.,C74-.,C75-.,C76-.,C77-.,C78-.,C79-. WORD C80-.,C81-.,C82-.,C83-.,C84-.,C85-.,C86-.,C87-.,C88-.,C89-. WORD C90-.,C91-.,C92-.,C93-.,C94-.,C95-.,C96-.,C97-.,C98-.,C99-. WORD C100-.,C101-.,C102-.,C103-.,C104-.,C105-. CRCB: PAGE ;*************************** ; ; Special CRT Functions ; ;*************************** C0: BYTE ESC,'L,0 ;clear screen C1: BYTE ESC,'H,0 ;cursor home C2: BYTE 15,0 ;cursor return C3: BYTE ESC,'A,0 ;cursor up C4: BYTE ESC,'B,0 ;cursor down C5: BYTE ESC,'D,0 ;cursor left C6: BYTE ESC,'C,0 ;cursor right C7: BYTE ESC,':,0 ;lock keyboard C8: BYTE ESC,';,0 ;unlock keyboard C9: BYTE ESC,'I,0 ;erase to end of line C10: BYTE ESC,'J,0 ;erase to end of screen C11: ;enter backgroud display mode (reduced intensity). C12: ;enter foreground display mode (normal intensity) C13: ;enable protected fields C14: ;disable protected fields C15: ;delete line C16: ;insert line C17: ;delete character C18: ;insert character C19: ;read cursor address C20: ;read character at current cursor position C21: ;start blink field C22: ;end blink field C23: ;start line drawing mode (enable alternate character set) C24: ;end line drawing mode (disable alternate character set) C25: ;set horizontal position C26: ;set vertical position C27: ;set terminal attributes C28: ;cursor on C29: ;cursor off C30: ;start underscore [102] C31: ;end underscore [102 C32: ;start reverse video [102] C33: ;end reverse video [102] C34: ;start reverse blink [102] C35: ;end reverse blink [102] C36: ;turn off screen display [102] C37: ;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: ;bottom intersect C46: ;horizontal line C47: ;vertical line C48: ;intersection C49: ;solid block C50: ;slant block C51: ;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 line 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: ;send message to host message field C64: ;up-arrow C65: ;down-arrow C66: ;raised dot C67: ;end of line marker C68: ;horizontal tab symbol C69: ;paragraph C70: ;dagger C71: ;section C72: ;cent sign C73: ;one-quarter C74: ;one-half C75: ;degree C76: ;trademark C77: ;copyright C78: ;registered C79: ;print screen C80: ;reserved for set to wide mode C81: ;reserved for set to normal mode C82: ;enter transparent print mode C83: ;exit transparent print mode C84: ;begin writing to alternate page C85: ;end writing to alternate page C86: ;toggle page C87: ;copy to alternate page C88: ;insert column C89: ;delete column C90: ;block fill with attribute C91: ;block fill with character C92: ;draw a box C93: ;scroll box up one line C94: ;scroll box down one line C95: ;select jump scroll C96: ;select fast smooth scroll C97: ;select med-fast smooth scroll C98: ;select med-slow smooth scroll C99: ;select slow smooth scroll C100: ;start underscore/blink C101: ;end underscore/blink C102: ;start underscore/reverse C103: ;end underscore/reverse C104: ;start underscore/reverse/blink C105: BYTE 0 ;end underscore/reverse/blink EVEN END .