; terminal driver for IBM 3101 (model 1x) ; ; Copyright [c] Noel Alaska Systems Technology, 1983. ; ; modified for 1.0b input specs per Alpha-Micro, and ; for SuperVue function bitmap specs per Jim Rea. SEARCH SYS SEARCH SYSSYM SEARCH TRM OBJNAM 0,0,[TDV] ; Bitmap of defined functions (for new tdv format) FN.1 =^B0000011001111111 ; 0 - 15 FN.2 =^B0000000000000000 ; 16 - 31 FN.3 =^B0000000000000000 ; 32 - 47 FN.4 =^B0000000000000000 ; 48 - 63 FN.5 =^B0000000000000000 ; 64 - 79 FN.6 =^B0000000000000000 ; 80 - 95 FN.7 =^B0000000000000000 ; 96 - 111 FN.8 =^B0000000000000000 ; 112 - 127 FN.9 =^B0000000000000000 ; 128 - 143 FN.A =^B0000000000000000 ; 144 - 159 ;************************ ;* IBM10 * TDV communications area ;************************ IBM10: WORD 2000 ; new format BR INPUT ; Handle INPUT routine. RTN ; No OUTPUT routine. BR ECHO ; Handle keyboard ECHO. BR TCRT ; Handle CRT. RTN ; INIT routine. (none) WORD 0 ; IMPURE area size (bytes) BYTE 24.,80. ; Terminal size. LWORD 1420 ; Alpha-Micro function word WORD FN.2 ; Vendor's function bitmap WORD FN.1 WORD FN.4 WORD FN.3 WORD FN.6 WORD FN.5 WORD FN.8 WORD FN.7 WORD FN.A WORD FN.9 BLKW 6. WORD [SUP],[ER],[VUE] WORD 0,0,0 ECHO: JMP ECHO2 ; "the long branch" TCRT: JMP CRT ; "the long branch" ;************************ ;* INPUT * Input routine for IBM 3101 model 10 ;************************ INPUT: BMI INMLT ; skip if multi-byte processing ANDB #177,D1 ; remove parity CKLESC: CMPB D1,#33 ; escape? BEQ INPM ; yes - could be multi-byte sequence INX: LCC #0 ; no - normal processing RTN INPM: LCC #PS.N ; possible multi-byte - return N flag RTN ; --- get here for multi-byte sequence --- INMLT: MOVB (A0)+,D1 ; get the first character ANDB #177,D1 DECB D0 ; no translation if single character BNE INMNOT INMX: LCC #0 ; reset the flags INMX2: RTN ;Escape code translation INMNOT: MOVB (A0)+,D1 ; get the second character ANDB #177,D1 ; remove parity LEA A6,XLAT ; index the translation table 10$: MOVB (A6)+,D7 ; get character BEQ 30$ ; end of table - take char(s) as is CMPB D1,D7 ; this one it? BEQ 20$ ; yes - INC A6 ; no - keep looken BR 10$ 20$: MOVB @A6,D1 ; translate the sequence BR INMX 30$: CALL 40$ ; accept sequence 'as is' MOVB #33,@A6 35$: CALL 40$ MOVB D1,@A6 DEC D0 BEQ INMX2 MOVB (A2)+,D1 BR 35$ 40$: MOV T.IBF(A5),A6 ; subroutine inserts char ADD T.ICC(A5),A6 INC T.ICC(A5) INC T.BCC(A5) RTN XLAT: BYTE 'A,13 ; cursor home BYTE 'B,12 ; cursor down BYTE 'C,14 ; cursor right BYTE 'D,10 ; cursor left BYTE 'I,31 ; erase to end of line BYTE 'H,36 ; cursor home (beginning of text) BYTE 'K,25 ; erase input (go to start of line) BYTE 0,0 EVEN ;************************ ;* ECHO * standard crt echo routine ;************************ ECHO2: CMPB D1,#25 ; ^U ? BEQ CTRLU CMPB D1,#177 ; Rubout ? BNE ECHX RUBOUT: CMPB D6,#11 ; was it tab? BEQ RBTB ; YES KRTG: MOV #3,D3 ; set char count PEA ERUB ; set buf addr POP D1 TRMBFQ ; queue up space/bs/space RTN ERUB: BYTE 10,40,10,0 RBTB: CLR D3 MOVW T.POB(A5),D3 ; get begin position MOV T.ICC(A5),D2 ; get input char count MOV T.IBF(A5),A6 ; get input base KRTS: DEC D2 ; dec # chars BMI KRTQ ; YES MOVB (A6)+,D1 ; fwd scan CMPB D1,#11 ; TAB BEQ KRTT CMPB D1,#15 ; CR BEQ KRTC CMPB D1,#33 ; ESCAPE BEQ KRTI CMPB D1,#40 ; CTL CHAR BLO KRTS CMPB D1,#176 ; RUBOUT BHI KRTS KRTI: INC D3 ; bump position BR KRTS KRTT: ADD #10,D3 ; tab adjust AND #^C7,D3 BR KRTS KRTC: CLR D3 ; zero for CR BR KRTS KRTQ: COM D3 ; compute # BS's AND #7,D3 INC D3 MOV #10,D1 TRMBFQ ; queue BS's ECHX: RTN CTRLU: TST D6 ; anything to clear? BEQ CTUX ; NO CLR D3 MOVW T.POO(A5),D3 ; compute # spaces SUBW T.POB(A5),D3 BEQ ECHX CMP D3,T.ILS(A5) ; make sure <= terminal width BLOS CLUA MOV T.ILS(A5),D3 CLUA: MOV #10,D1 ; queue BS's TRMBFQ ASL D1,#2 ; queue spaces TRMBFQ MOV #10,D1 ; queue BS's TRMBFQ CTUX: RTN ;************************ ;* CRT * crt routine for IBM 3101 model 10 ;************************ CRT: TSTW D1 ; is it cursor position? BMI CRTS ; NO TTYI ; send position command BYTE 233,'Y,0,0 ADD #17437,D1 ; add position offsets ROR D1,#8. ; send row TTY ROL D1,#8. ; send col TTY RTN CRTS: AND #377,D1 ; ignore all but code PUSH A2 CMP D1,#CRCB-CRCA-1 ; valid? BHI CRTX ; NO LEA A2,CRCA ; index table ADD D1,A2 ; get command code MOVB @A2,D1 ; point to data ADD D1,A2 TTYL @A2 ; print it CRTX: POP A2 SSTS -(SP) ; stack status 1$: SVLOK ; lock so things can't change MOVW @A5,D7 ANDW #T$OIP,D7 ; is output in progress? BNE 2$ ; YES - wait TST T.OQX(A5) ; is output queued? BNE 2$ ; YES - wait LSTS (SP)+ ; restore status RTN ; return to user 2$: JWAIT J.TOW ; let TRMSER wake us (UNLOCK's) BR 1$ ; re-test ;BYTE OFFSET AND DATA TABLES FOLLOW FOR ALL COMMANDS CRCA: BYTE C0-.,C1-.,C2-.,C3-.,C4-.,C5-.,C6-.,C7-.,C8-.,C9-.,C10-. CRCB: C0: BYTE 233,'L,0 ;CLEAR SCREEN C1: BYTE 233,'H,0 ;CURSOR HOME C2: BYTE 215,0 ;CURSOR RETURN C3: BYTE 233,'A,0 ;CURSOR UP C4: BYTE 233,'B,0 ;CURSOR DOWN C5: BYTE 233,'D,0 ;CURSOR LEFT C6: BYTE 233,'C,0 ;CURSOR RIGHT C7: ;LOCK KEYBOARD C8: BYTE 0 ;UNLOCK C9: BYTE 233,'I,0 ;ERASE TO END OF LINE C10: BYTE 233,'J,0 ;ERASE TO END OF SCREEN BYTE 0 EVEN END