P8000/firmware/TERMINAL/p8t.esc.s

655 lines
12 KiB
ArmAsm

!*******************************************************
* *
* T E R M I N A L *
* *
* mit Einchip-Mikrorechner U 882 und CRTC 8275 *
* ============================================ *
* *
* ESCAPE_SEQUENZ Module; Version 3.1: *
* - 24 Zeilen / 80 Zeichen *
* Inhalt: *
* - Auswertung der Escape-Sequenzen *
* *
********************************************************
Bearbeiter: Heller/Kuehle / WAT/WAE
Stand: 26.01.88
Name: P8T.ESCAPE !
ESCAPE_SEQUENZ MODULE
CONSTANT
! 'Z8T.VEREINBARUNGEN' !
PARA :=254
$LISTOFF
! Werte !
P01EXT := %96 ! P0:=A8...A14, P1:=AD0...AD7, Stack intern !
P01TRI := %9E ! tri state: P0,P1,AS,DS,R/W !
! Bit Definitionen !
B0 := %1 ! bit 0 !
B1 := %2 ! bit 1 !
B2 := %4 ! bit 2 !
B3 := %8 ! bit 3 !
B4 := %10 ! bit 4 !
B5 := %20 ! bit 5 !
B6 := %40 ! bit 6 !
B7 := %80 ! bit 7 !
NB0 := %FE ! negiertes bit 0 !
NB1 := %FD ! negiertes bit 1 !
NB2 := %FB ! negiertes bit 2 !
NB3 := %F7 ! negiertes bit 3 !
NB4 := %EF ! negiertes bit 4 !
NB5 := %DF ! negiertes bit 5 !
NB6 := %BF ! negiertes bit 6 !
NB7 := %7F ! negiertes bit 7 !
! Bildparameter !
ZEILENZAHL := 24
ZEICHENZAHL := 80
! Adressen !
BRAM := %1000 ! Bildwiederholspeicher !
ZADR_TAB := %1780 ! Tabelle der Zeilenanfangsadr. !
CRT_PAR := %1C00 ! Parameter lesen / schreiben !
CRT_COM := %1C01 ! Commands schreiben !
CRTL_STAT := %1C01 ! Status lesen !
ZG0 := %4000 ! ADM31-ASCII-Zeichensatz !
ZG1 := %2000 ! Alternativ-Zeichensatz !
BELL_ADR := %8000 ! Signalton !
! Display Commands !
RES_DISPL := %00
START_DISPL := %20
STOP_DISPL := %40
READ_LPEN := %60
LD_CURSOR := %80
ENABLE_INT := %A0
DISABLE_INT := %C0
PRES_COUNT := %E0
! Parameter fuer Display-Reset-Command !
RES1 := %4F ! 80 characters/row !
RES2 := %97 ! !
RES3 := %0B ! !
RES4 := %6C ! !
! Field Attribute Code !
FAC := %80 ! Field Attribute: Normal Mode !
FACH := %01 ! Highlight !
FACB := %02 ! Blink !
FACR := %10 ! Reverse video !
FACU := %20 ! Underline !
! ASCII Control Characters entsprechend ADM 31 !
NUL := %00 ! Null ^@ !
SOH := %01 ! Start of Heading ^A !
STX := %02 ! Start of Text ^B !
ETX := %03 ! End of Text ^C !
EOT := %04 ! End of Transmission ^D !
ENQ := %05 ! Inquiry (who are you) ^E !
ACK := %06 ! Acknewledge ^F !
BEL := %07 ! Bell ^G !
BS := %08 ! Backspace ^H !
HT := %09 ! Horizontal Tabulator ^I !
LF := %0A ! Line Feed ^J !
VT := %0B ! Vertical Tabulator ^K !
FF := %0C ! Forspace ^L !
CR := %0D ! Carriage Return ^M !
SO := %0E ! Shift out ^N !
SI := %0F ! Shift in ^O !
DLE := %10 ! Data Link Escape ^P !
DC1 := %11 ! Device Control ^Q !
DC2 := %12 ! ^R !
DC3 := %13 ! ^S !
DC4 := %14 ! ^T !
NAK := %15 ! Not Acknewl. ^U !
SYN := %16 ! Synchronous Idle ^V !
ETB := %17 ! End of Trans.-Block ^W !
CAN := %18 ! Cancel ^X !
EM := %19 ! End of Medium ^Y !
SBS := %1A ! Substitute ^Z !
ESC := %1B ! Escape Sequenz ^[ !
FS := %1C ! File Separator !
GS := %1D ! Group Separator ^] !
RS := %1E ! Cursor HOME ^^ !
US := %1F ! New Line ^~ !
$LISTON
$PAGE
EXTERNAL
PUTA PROCEDURE
SIO_OUT PROCEDURE
WRITE_CHAR PROCEDURE
READ_CHAR PROCEDURE
CHAR_ADRESSE PROCEDURE
BRAM_ADR PROCEDURE
LOAD_CURSOR PROCEDURE
CLEAR_SCREEN PROCEDURE
CLEAR_LINE PROCEDURE
ROLL_DOWN PROCEDURE
CLEAR_L LABEL
ROLL_U2 LABEL
ROLL_U3 LABEL
TAB LABEL
BACK_TAB LABEL
CH_del LABEL
CH_ins LABEL
P0, P1, P2, P3, STAT0, STAT1, STAT2 BYTE
CHAR_ADR WORD
SPALTZ, ZEILZ, CHAR, ESCH0 BYTE
GLOBAL
CLEAR_SC PAGE_ERASE LINE_ERASE LABEL
ESC_AUS2 LABEL
$SECTION SEC3 PROGRAM
ESC_SEQUENZ PROCEDURE
!*******************************************************
*
* Auswertung der ESC_Sequenzen
*
*******************************************************!
ENTRY
TCM STAT1,#B5 ! Cursor-Steuerung !
JP Z,CURSOR_CONTROL
TCM STAT1,#B7 ! Video-Atribute !
JP Z,VIDEO_CONTROL
CP CHAR,#'='
JR Z,CURSOR_FLAG
CP CHAR,#'G'
JR Z,VIDEO_FLAG
and STAT1,#NB4 ! ESC-Flag ruecksetzen !
CP CHAR,#':'
JR Z,CLEAR_SC
CP CHAR,#'*'
JR Z,CLEAR_SC
CP CHAR,#'U' ! set PGM !
JR Z,SET_PGM
cp CHAR,#'i' ! ESC i = TAB !
jp z,TAB ! in PUTA !
cp CHAR,#'I' ! ESC I = Back TAB !
jp z,BACK_TAB ! in PUTA !
CP CHAR,#'T' ! line erase? !
JR Z,LINE_ERASE
CP CHAR,#'Y' ! page erase? !
JR Z,PAGE_ERASE
CP CHAR,#'R' ! line delete? !
JR Z,LINE_DELETE
cp CHAR,#'Q' ! char_insert !
jr z,CHAR_INSERT
cp CHAR,#'W' ! char_delete? !
jp z,CHAR_DEL
cp CHAR,#'E' ! line_insert? !
jp z,LINE_INSERT
AND STAT1,#NB4 ! Escape_Flag ruecksetzen !
RET
CURSOR_FLAG:
! *** Flag setzen *** !
OR STAT1,#B5
RET
VIDEO_FLAG:
! *** Flag setzen *** !
OR STAT1,#B7
RET
CLEAR_SC:
! *** Bildschirm loeschen, Cursor unveraendert *** !
CALL CLEAR_SCREEN
RET
SET_PGM:
! *** set program mode *** !
OR STAT1,#B3 ! PGM-Flag setzen !
RET
LINE_ERASE:
! *** 'space' in Cursor-Zeile ab Cursor-Pos bis Ende *** !
ld r8,#HI ZADR_TAB
ld r9,#LO ZADR_TAB
add r9,ZEILZ ! Cursor-Zeile !
ld r15,SPALTZ
call CLEAR_L ! loeschen !
RET
PAGE_ERASE:
! *** 'space' in Cursor-Zeile ab Curs.-Pos. bis Schirm-Ende !
call LINE_ERASE ! 'space' ab Cursor bis Zeilen-Ende !
! rr8 enthaelt Adr. der Cursor-Zeile !
ld r7,ZEILZ ! Berechnung der Zahl der Zeilen !
inc r7
ld r6,#ZEILENZAHL
sub r6,r7 ! Anzahl !
jr ULE,PAGE_E0 ! Cursor steht in der letzen Zeile !
PAGE_E1:
incw rr8 ! naechste Zeile !
call CLEAR_LINE ! Zeile loeschen !
djnz r6,PAGE_E1
PAGE_E0:
ret ! Escape-Flag in LINE_ERASE rueckgesetzt !
LINE_DELETE:
! *** Cursor-Zeile loeschen, Cursor an Zeilenanfang *** !
clr SPALTZ ! Cursor auf Zeilenanfang !
call LOAD_CURSOR
call LINE_ERASE ! Zeile loeschen, rr8 laden !
ld r14,#ZEILENZAHL-1
sub r14,ZEILZ ! zu rollende Zeilen berechnen !
jr z,LINE_D0
call ROLL_U3 ! Eintrittspunkt ohne Zeil.-loeschen !
LINE_D0:
ret
CHAR_INSERT:
! *** Zeichen unter Cursor nach rechts verschieben *** !
ld PARA,#1
call CH_ins
ret
CHAR_DEL:
! *** Cursor-Zeichen loeschen, die anderen nachschieben *** !
ld PARA,#1
call CH_del
ret
LINE_INSERT:
! *** Zeile einschieben auf Cursor-Position *** !
clr SPALTZ ! Cursor auf Zeilenanfang !
call LOAD_CURSOR
ld r15,ZEILZ
call ROLL_DOWN
ret
END ESC_SEQUENZ
$PAGE
CURSOR_CONTROL PROCEDURE
!*******************************************************
*
* Positionierung des Cursors mittels
* Escape-Seq: 'ESC=YX', Y = row, X = column
*
*******************************************************!
ENTRY
LD R8,CHAR ! Positionswert lesen (ASCII) !
SUB R8,#%20 ! Position in Hex !
JR PL,CUCO0 ! Fehler, wenn negativ !
LD R8,#0 ! bei Fehler Wert:=0 !
CUCO0:
TCM STAT1,#B6 ! Zeile oder Spalte? !
JR Z,CUCO1 ! Flag=1: Spalte !
CP R8,#ZEILENZAHL-1
JR ULT,CUCO2
LD R8,#ZEILENZAHL-1
CUCO2:
LD ZEILZ,R8 ! Zeilenkoordinate eintragen !
OR STAT1,#B6 ! naechster Wert ist Spaltenkoordinate !
RET
CUCO1: ! Spalte !
CP R8,#ZEICHENZAHL-1
JR ULT,CUCO3
LD R8,#ZEICHENZAHL-1
CUCO3:
LD SPALTZ,R8 ! Spaltenkoordinate eintragen !
AND STAT1,#NB4 LAND NB5 LAND NB6
CALL LOAD_CURSOR ! Cursor positionieren !
RET
END CURSOR_CONTROL
$PAGE
VIDEO_CONTROL PROCEDURE
!*******************************************************
*
* Setzen und Ruecksetzen der
* Video Attribute Codes
*
*******************************************************!
ENTRY
tm STAT2,#B4 !Video attribute on/off ?!
jr nz,VIDEO1 !off!
! Abfrage der Parameter !
CP CHAR,#'0'
JR Z,ESCG0
CP CHAR,#'1'
JP Z,ESCG1
CP CHAR,#'2'
JR Z,ESCG2
CP CHAR,#'3'
JR Z,ESCG1
CP CHAR,#'4'
JR Z,ESCG4
CP CHAR,#'5'
JR Z,ESCG5
CP CHAR,#'6'
JR Z,ESCG6
CP CHAR,#'7'
JR Z,ESCG5
CP CHAR,#'8'
JR Z,ESCG8
CP CHAR,#'9'
JR Z,ESCG9
CP CHAR,#'A'
JR Z,ESCGA
CP CHAR,#'B'
JR Z,ESCGB
CP CHAR,#'C'
JR Z,ESCGC
CP CHAR,#'D'
JR Z,ESCGD
CP CHAR,#'E'
JR Z,ESCGE
CP CHAR,#'F'
JR Z,ESCGF
CP CHAR,#'('
JR Z,ESCG0
CP CHAR,#')'
JR z,ESCG8
VIDEO1:
and STAT1,#NB4 land NB7 !ESC- und Video-Flag ruecksetzen!
RET
ESCG0: ! Reset to Standard Video !
LD CHAR,#FAC
JR VOUT
ESCG2: ! Blinken ein !
LD CHAR,#FAC+FACB
JR VOUT
ESCG4: ! Reverse ein !
LD CHAR,#FAC+FACR
JR VOUT
ESCG6: ! Reverse + Blinken ein !
LD CHAR,#FAC+FACB+FACR
JR VOUT
ESCG8: ! Highlight aus !
LD CHAR,#FAC+FACH
JR VOUT
ESCGA: ! Highlight aus + Reverse ein !
LD CHAR,#FAC+FACR+FACH
JR VOUT
ESCGC: ! Unterstrich ein !
LD CHAR,#FAC+FACU
JR VOUT
ESCGE: ! Unterstrich ein + Highlight aus !
LD CHAR,#FAC+FACU+FACH
JR VOUT
VOUT:
AND STAT1,#NB4 LAND NB7 ! ESC- und Video-Flag ruecksetzen !
CALL PUTA ! Ausgabe Video Attribut !
RET
! *** Blank Routinen *** !
ESCG1: ! G1, G3 (blank area) !
LD CHAR,#%20 ! Space !
JR VOUTB
ESCG5: ! G5, G7 (blank + reverse) !
LD CHAR,#FAC+FACR
JR VOUTB
ESCG9: ! blank + highlight aus !
LD CHAR,#FAC+FACH
JR VOUTB
ESCGB: ! blank + reverse + highlight (aus) !
LD CHAR,#FAC+FACR+FACH
JR VOUTB
ESCGD: ! blank + underline !
LD CHAR,#FAC+FACU
JR VOUTB
ESCGF: ! blank + underline + highlight (aus) !
LD CHAR,#FAC+FACU+FACH
JR VOUTB
VOUTB:
AND STAT1,#NB4 LAND NB7
CALL PUTA
CALL BLANK_AREA ! Feld loeschen !
RET
END VIDEO_CONTROL
BLANK_AREA PROCEDURE
!*******************************************************
*
* Loeschen eines bezeichneten Feldes
* in einer Zeile (kein Rollen)
* Input: CHAR_ADR, SPALTZ
*
*******************************************************!
ENTRY
LD R8,CHAR_ADR
LD R9,CHAR_ADR+1
LD R10,#%20 ! Space !
LD R12,SPALTZ
OR STAT0,#B1 ! MCU-Zugriff !
BLANK0:
TCM STAT0,#B0 ! DMA aktiv?, wenn ja warten !
JR Z,BLANK0
INCW RR8
LDE R11,@RR8 ! lesen !
TCM R11,#B7 ! Video Control Char ? !
JR Z,BLANK1
LDE @RR8,R10 ! Blank ausgeben !
INC R12 ! Naechste Spalte !
CP R12,#ZEICHENZAHL
JR NZ,BLANK0
LD R10,#FAC ! Reset to standard Video !
LDE @RR8,R10
BLANK1:
AND STAT0,#NB1 ! MCU-Zugriff beendet !
RET
END BLANK_AREA
ESC_OUT_SEQ PROCEDURE
!*******************************************************
*
* Ausgabe der Escape_Sequenzen entspr. Funktionstaste
* Es werden 1...3 Zeichen gesendet:
*
*******************************************************!
ENTRY
! Ueberpruefung auf richtige Werte !
TCM CHAR,#%80 ! ESC-Folge: CHAR>%80 !
JP NZ,ESC_OUT0
CP CHAR,#%80 ! keine Wirkung !
JR Z,ESC_OUT0
!------------------------------------------------------!
cp CHAR,#%C2 !00 ?!
jr nz,FKT_TAS !nein!
ld CHAR,#'0'
call ESC_AUS2
ld ESCH0,#'0'
jp FKT_AUS
FKT_TAS:
tm STAT2,#B3 !VT100/ADM31 ?!
jp z,FKT_VT100
! Auswertung der Tasten-Codes ADM31 !
! Cursor Movement Tasten !
ld ESCH0,#FF !Forspace!
cp CHAR,#%CD
jp z,FKT_AUS
ld ESCH0,#BS !Backspace!
cp CHAR,#%CB
jp z,FKT_AUS
ld ESCH0,#LF !Linefeed!
cp CHAR,#%D0
jr z,FKT_AUS
ld ESCH0,#VT !Verticaltab!
cp CHAR,#%C8
jr z,FKT_AUS
ld ESCH0,#RS !Cursor home!
cp CHAR,#%CF
jr z,FKT_AUS
! Funktionstasten !
LD ESCH0,#'W' ! char delete !
CP CHAR,#%D2
JR Z,ESC_SEQ_AUS
LD ESCH0,#'Q' ! char insert !
CP CHAR,#%C9
JR Z,ESC_SEQ_AUS
LD ESCH0,#'R' ! line delete !
CP CHAR,#%D3
JR Z,ESC_SEQ_AUS
LD ESCH0,#'E' ! line insert !
CP CHAR,#%D1
JR Z,ESC_SEQ_AUS
LD ESCH0,#'Y' ! page erase !
CP CHAR,#%C7
JR Z,ESC_SEQ_AUS
ld ESCH0,#'I' ! BACK_TAB !
cp CHAR,#%81
jr z,ESC_SEQ_AUS
!------------------------------------------------------!
ESC_OUT0:
CLR CHAR
RET
!------------------------------------------------------!
ESC_SEQ_AUS:
! Senden der Escape_Sequenzen !
LD CHAR,#ESC ! Zeichen senden: ESC !
call ESC_AUS2
tm STAT2,#B3 !VT100/ADM31 ?!
jr nz,ESC_AUS3
ld CHAR,#'['
call ESC_AUS2
ESC_AUS3:
LD CHAR,ESCH0 ! Zeichen senden: x !
call ESC_AUS2
jr ESC_OUT0
! Ausgabe Cursor Movement Tasten ADM31 !
FKT_AUS:
ld CHAR,ESCH0
call ESC_AUS2
jr ESC_OUT0
ESC_AUS2:
TCM STAT0,#B3 ! on_line? !
JR Z,ESC_AUS1
CALL PUTA ! off_line !
ret
ESC_AUS1:
CALL SIO_OUT ! on_line !
ret
! Auswertung Funktionstasten VT100-Terminal !
FKT_VT100:
! Cursor Movement Tasten !
ld ESCH0,#'C' !Cursor right!
cp CHAR,#%CD
jr z,ESC_SEQ_AUS
ld ESCH0,#'D' !Cursor left!
cp CHAR,#%CB
jr z,ESC_SEQ_AUS
ld ESCH0,#'B' !Cursor down!
cp CHAR,#%D0
jr z,ESC_SEQ_AUS
ld ESCH0,#'A' !Cursor up!
cp CHAR,#%C8
jr z,ESC_SEQ_AUS
ld ESCH0,#'H' !Cursor home!
cp CHAR,#%CF
jr z,ESC_SEQ_AUS
! Funktionstasten !
ld ESCH0,#'P' !Delete character!
cp CHAR,#%D2
jr z,ESC_SEQ_AUS
ld ESCH0,#'@' !Insert character!
cp CHAR,#%C9
jr z,ESC_SEQ_AUS
ld ESCH0,#'M' !Delete line!
cp CHAR,#%D3
jr z,ESC_SEQ_AUS
ld ESCH0,#'L' !Insert line!
cp CHAR,#%D1
jr z,ESC_SEQ_AUS
ld ESCH0,#'J' !Erasing from cursor to end of screen!
cp CHAR,#%C7
jp z,ESC_SEQ_AUS
ld ESCH0,#'Z' !Cursor backward tab!
cp CHAR,#%81
jp z,ESC_SEQ_AUS
jp ESC_OUT0
END ESC_OUT_SEQ
END ESCAPE_SEQUENZ