> S/Term  Terminal part of STerm : (4 07-Jan-1998 V0.20 JGH: Started from XTerm 0.16 2/ 31-Jan-1998 V0.21 JGH: Char31 not printed EQUW Ansi_ABCD:EQUW AnsiDisp: EQUW Ansi_FH: EQUW AnsiDisp ^EQUW AnsiDisp: EQUW Ansi_M: EQUW AnsiDisp: EQUW AnsiDisp rEQUW AnsiDisp: EQUW Ansi_U: EQUW AnsiDisp: EQUW AnsiDisp >EQUW AnsiDisp: EQUW AnsiDisp: EQUW AnsiDisp: EQUW AnsiDisp >EQUW AnsiDisp: EQUW AnsiDisp: EQUW AnsiDisp: EQUW AnsiDisp : #\ ----------------------------- #\ INITIALISE TERMINAL FUNCTIONS #\ ----------------------------- 2.TermInit:\ Initialise terminal functions ALDA #0:STA YOffset:STA AnsiLength:\ Initialise ANSI EJMP SerialOn:\ Enable serial input : &\ -------------------------------- #\ ESS CHARACTERS AS A TERMINAL &\ -------------------------------- .TermEnter 8LDA #225:LDX #128:JSR OsbyteAX:\ f0=128  function key GTXA:TAY:LDX #2:LDA #138:JSR OSBYTE:\ Send to output buffer JMP TermLoop0 :  .TermFKey KTXA:LDX #0:LDY #0:RTS:\ Return holding key number : \ ------------------------ \ GENERAL SUPPORT ROUTINES \ ------------------------ >.OsbyteA: LDX #0:\ Osbyte A,0,0 >.OsbyteAX:LDY #0:JMP OSBYTE:\ Osbyte A,X,0 F.SerialOn:LDX #2:TXA:JMP OSBYTE:\ Serial input enabled : N.TableCall:\ Entry; A=entry number; A, X, Y passed on  .STX temp:PHA:ASL A:TAX:LDA Table,X:STA jmp (LDA Table+1,X:STA jmp+1:PLA:LDX temp  CLC:JMP (jmp) *: 45.SetXYPosition:\ Entry; X,Y=posn >%LDA #31:JSR OSWRCH:TXA:JSR OSWRCH H"TYA:SEC:SBC YOffset:JMP OSWRCH R: \G.GetXYPosition:\ Exit; A=&86, X=, Y= (adjusted) f3LDA #&86:JSR OSBYTE:TYA:CLC:ADC YOffset:TAY:RTS p: z \ --------------------------  \ CHARACTER DISPLAY ROUTINES  \ -------------------------- .ReadAndDisplayChar HLDA #145:LDX #1:JSR OSBYTE:TYA:\ Read from input buffer .DisplayChar ILDX AnsiLength:BNE AnsiChar:\ Within an Ansi sequence ;CMP #31:BEQ Control:\ Ignore 31 DCMP #30:BCS Print:\ Printable and HOME HCMP #27:BEQ AnsiChar0:\ Start of Ansi sequence @CMP #7:BCC Control:CMP #14:BCC Print:\ Chars 7..13 ok  .Control >LDA #"|":JSR OSWRCH:TYA:A #"@":\ Display CTRL char  .Print JMP OSWRCH : .AnsiChar0 $ELDX #0:STX AnsiLength:\ Start Ansi sequence . .AnsiChar 8#STA AnsiString,X:INC AnsiLength BCMP #"[":BEQ DisplayRet L4CMP #"@":BCC DisplayRet:\ Ends with letter V: `\Translate II to numbers: j8LDA #1:STA AnsiNumbers+0:STA AnsiNumbers+1:\Defaults tLDY #0:LDX #2 ~.AnsiLoop2 LDA #0:STA temp .AnsiLoop3 1LDA AnsiString,X:INX:CMP #"0":BCC AnsiNumber CMP #"9"+1:BCS AnsiNumber =PHA:LDA temp:ASL A:STA temp:ASL A:ASL A:ADC temp:STA temp -PLA: #15:ADC temp:STA temp:JMP AnsiLoop3 .AnsiNumber *PHA:LDA temp:STA AnsiNumbers,Y:INY:PLA CMP #";":BEQ AnsiLoop2 : 7\ A=Letter, X=>after Letter, Y=number of parameters /PHA:JSR GetXYPosition:PLA:\ X,Y=posn 7 #31:JSR TableCall:BCS P%+5:\ If CC, set XY posn  ;JSR SetXYPosition:LDA #0:STA AnsiLength:\Clear sequence .AnsiNull:.DisplayRet RTS (: 2\ --------------------- <\ ANSI DISPLAY ROUTINES F\ --------------------- P\Entry; A=code, XY=posn, CC Z#\Exit; CC-> XY=posn to restore d\ CS-> ignore XY n: x&.AnsiDisp:\Called to show unknowns %LDA #30:JSR OSWRCH:TXA:PHA:LDX #1 .AnsiLoop0 7LDA AnsiString,X:CMP #" ":BCS AnsiNullOk:LDA #"*" .AnsiNullOk /JSR OSWRCH:INX:CPX AnsiLength:BNE AnsiLoop0 5LDA #32:.AnsLp2:JSR OSWRCH:INX:CPX #20:BNE AnsLp2 \JSR &FFE0:PLA:TAX  .AnsiRet  CLC:RTS : .AnsiDisplay "JSR AnsiNull:JMP SetXYPosition : \ ----------- \ CURSOR \ ----------- ".Ansi_ABCD ,; #15:SEC:SBC #3:\ A=8,9,10,11 6=LDX AnsiNumbers+0:\ X=parameter @.Ansi_ABCD_Lp J+JSR OSWRCH:DEX:BNE Ansi_ABCD_Lp:SEC:RTS T: ^\ ---------------- h\ POSITION r\ ---------------- | .Ansi_FH 'LDX AnsiNumbers+1:LDY AnsiNumbers+0 DEX:DEY:RTS : \ ------------- \ DISPLAY \ -------------  .Ansi_J @LDA #12:JSR OSWRCH:SEC:RTS:\ Assume [2J - : \ ------------- \ ERASE IN \ -------------  .Ansi_K  TXA:PHA ILDA AnsiNumbers+0:PHA:BEQ Ansi_K0:\ Erase Cursor->End, Needs 80- NLDA #13:JSR OSWRCH:\ Erase Start->Cursor and Start->End &BPLA:PHA:CMP #1:BEQ Ansi_K1:\ Start->Cursor, Needs 0@LDX #0:\ Start->End, Needs 80 : .Ansi_K0 D1TXA: #&FF:SEC:ADC #80:TAX:\ Do 80-X N .Ansi_K1 X9PLA:LDA #" ":JSR Ansi_ABCD_Lp:\ Erase line part bPLA:TAX:CLC:RTS l: v\ ------------------------ \ SET ATTRIBUTES (S) \ ------------------------  .Ansi_M \ 3x = foreground colour x \ 4x = Background colour x  SEC:RTS : \ ----------------- \ SET SCROLL REGION \ -----------------  .Ansi_R 0LDA AnsiString+2:CMP #"A":BCC Ansi_R_params LDA #0:STA YOffset CLDA #26:JSR OSWRCH:SEC:RTS:\ Host must now send a POSN  : .Ansi_R_params  !LDA AnsiNumbers+0:STA YOffset *LDA #28:JSR OSWRCH 4LDA #00:JSR OSWRCH >+LDA AnsiNumbers+0:SEC:SBC #1:JSR OSWRCH HLDA #79:JSR OSWRCH R+LDA AnsiNumbers+1:SEC:SBC #1:JSR OSWRCH \CSEC:RTS:\ Host must now send a POSN f: p\ ------------- z\ POSITION \ -------------  .Ansi_S !STX XStore:STY YStore:SEC:RTS : \ ---------------- \ POSITION \ ----------------  .Ansi_U LDX XStore:LDY YStore:RTS : : .FTP_Down:JMP 0 .FTP_Up: JMP 0 : ] SA$="*Save _TERM"+~(start%256)+" "+~mcode%+" "+~O%+" "+~start%+" "+~start% $A$: OSCLIA$