;D:KTTY.ACT›; Terminal emulation for the masses›; Emulates a VT-52, Option quits,›; Start scrolls.› ›MODULE› CARD ARRAY LBASE(24)› BYTE ARRAY LCUR(24)› › BYTE CX, CY, LMAR, DLTOGGLE,TSTATE,› consol = $D01F› › CARD SDLST = $230,› SAVEDL, HELPLINE› ›;Create a display list and display it›;›; Uses: LBASE, LCUR, LMAR, SAVEDL,›; Modifies: DLTOGGLE, SCREEN MEMORY› › › ›PROC HACKDISPLAY()› BYTE ARRAY DBASE› BYTE I› CARD J, TBASE› DBASE = DLTOGGLE*85+SAVEDL+72› DLTOGGLE = 1 - DLTOGGLE› TBASE = DBASE› FOR I = 0 TO 2 DO› DBASE(I) = $70› OD› FOR I = 0 TO 23 DO› DBASE ==+ 3› DBASE(0) = $42› J = LCUR(I)› J = LBASE(J) + LMAR - LMARGN› DBASE(1) = J› DBASE(2) = J RSH 8› OD› DBASE(3) = $00› DBASE(4) = $42› DBASE(5) = HELPLINE› DBASE(6) = HELPLINE RSH 8› DBASE(7) = $41› DBASE(8) = TBASE› DBASE(9) = TBASE RSH 8› SDLST = TBASE› RETURN› › › ›PROC CFLIP()› BYTE POINTER M› BYTE I› I = LCUR(CY)› M = LBASE(I) + CX› M^ ==! $80› RETURN› › › ›PROC LCLEAR(BYTE LINE)› BYTE I› BYTE ARRAY T› I = LCUR(LINE)› T = LBASE(I)-2› FOR I = 0 TO 81 DO› T(I) = 0› OD› RETURN› › › ›PROC TINIT()› CARD I, J› ;First, find 24 valid lines in› ;Sbuf. Valid lines don't cross 4K› J = SBUF› FOR I = 0 TO 23› DO› IF (J RSH 12) <>› ((J + 81) RSH 12)› THEN› J = (J & $F000) + $1000› FI› LBASE(I) = J+2› J ==+ 82› LCUR(I) = I ;set up current line order› LCLEAR(I)› OD› ;Now set up a display list› SAVEDL = SDLST› HELPLINE = SDLST+32› PUT(125)› PRINTE("OPTION quits, (SHIFT)+START scrolls")› DLTOGGLE = 0› TSTATE = 'N› CX = 0› CY = 0› LMAR = 0› CFLIP()› HACKDISPLAY()› RETURN› › › ›BYTE FUNC TPUTN(BYTE C)› BYTE I, TEMP› BYTE POINTER M› BYTE ARRAY TOSCR = [$40 $00 $20 $60]› CFLIP()› IF C < 32 THEN› IF C = 27 THEN› RETURN('E)› ELSEIF C = 10 THEN› IF CY < 23 THEN› CY ==+ 1› ELSE› LCLEAR(0)› TEMP = LCUR(0)› FOR I = 0 TO 22› DO› LCUR(I) = LCUR(I+1)› OD› LCUR(23) = TEMP› HACKDISPLAY()› FI› › ELSEIF C = 13 THEN› CX = 0› › ELSEIF C = 7 THEN ;BELL› SETCOLOR(4, 0, 14)› I = RTCLOCK + 2› WHILE I <> RTCLOCK DO OD› SETCOLOR(4, 0, 0)› › ELSEIF C = 8 THEN ;BACKSPACE› IF CX > 0 THEN› CX ==- 1› FI› › ELSEIF C = 9 THEN ;TAB› IF CX < 72 THEN› CX = (CX + 8) & $F8› FI› › ELSEIF C = 12 THEN› FOR I = 0 TO 23 DO› LCLEAR(I)› OD› CX = 0› CY = 0› › FI› ELSE ;printing char› I = LCUR(CY)› M = LBASE(I) + CX› M^ = TOSCR((C & $60) RSH 5)› % (C & $9F)› IF CX < 79 THEN CX ==+ 1› FI› FI› CFLIP()› RETURN('N)› › › ›BYTE FUNC TPUTE(BYTE C)› BYTE TEMP, I› BYTE ARRAY M› IF C = 'A THEN› IF CY > 0 THEN› CY ==- 1› FI› › ELSEIF C = 'B THEN› IF CY < 23 THEN› CY ==+ 1› FI› › ELSEIF C = 'C THEN› IF CX < 79 THEN› CX ==+ 1› FI› › ELSEIF C = 'D THEN› IF CX > 0 THEN› CX ==- 1› FI› › ELSEIF C = 'H THEN› CX = 0› CY = 0› › ELSEIF C = 'I THEN› IF CY > 0 THEN› CY ==- 1› ELSE› LCLEAR(23)› TEMP = LCUR(23)› FOR I = 0 TO 22 DO› LCUR(23-I) = LCUR(22-I)› OD› LCUR(0) = TEMP› HACKDISPLAY()› FI› › ELSEIF C = 'J OR C = 'K THEN› I = LCUR(CY)› M = LBASE(I)› FOR I = CX TO 79 DO› M(I) = 0› OD› IF C = 'J THEN› FOR I = CY+1 TO 23 DO› LCLEAR(I)› OD› FI› ELSEIF C = 'Y THEN› RETURN('R)› ELSEIF C = 'Z THEN› PUTD(2, 27)› PUTD(2, '/)› PUTD(2, 'Z)› FI› CFLIP()› RETURN('N)› › › ›PROC TPUTSW(BYTE C)› IF TSTATE = 'N THEN› TSTATE = TPUTN(C)› ELSEIF TSTATE = 'E THEN› TSTATE = TPUTE(C)› ELSEIF TSTATE = 'R THEN› IF C < 32 THEN C = 32 FI› CY = C - 32› IF CY > 23 THEN CY = 23 FI› TSTATE = 'C› ELSEIF TSTATE = 'C THEN› IF C < 32 THEN C = 32 FI› CX = C - 32› IF CX > 79 THEN CX = 79 FI› CFLIP()› TSTATE = 'N› ELSE› TSTATE = 'N › FI› RETURN› › › ›PROC TQUIT()› SDLST = SAVEDL› PUT(125)› RETURN› › › ›PROC TTYMode()› BYTE c, SKSTAT = $D20F, OLDSCROLL› › StartR()› › TINIT()› OLDSCROLL = RTCLOCK - 1› DO› IF ch <> $FF THEN› c = GetD(1)› IF c = 155 THEN c = 13› ELSEIF c = 127 THEN c = 9› ELSEIF c = $7E THEN c = backs› FI› PutD(2, c)› IF localecho = 1 THEN› TPUTSW(c)› FI› FI› › IF ncib() > 0 THEN› c = GetD(2) & $7F ;strip parity› TPUTSW(c)› FI› › consol = 8› IF (consol & 4) = 0 THEN› EXIT› › ELSEIF (CONSOL & 1) = 0› AND RTCLOCK <> OLDSCROLL THEN› ;START - SHIFT LEFT & RIGHT› IF (SKSTAT & 8) = 0 THEN› IF LMAR > 0 THEN› LMAR ==- 1› FI› ELSE› IF LMAR < 40+LMARGN THEN› LMAR ==+ 1› FI› FI› HACKDISPLAY()› OLDSCROLL = RTCLOCK› FI› OD› TQUIT()› StopR()› RETURN› ›;End of D:KTTY.ACT››