P8000/firmware/TERMINAL/p8t.5.vt100.s

918 lines
18 KiB
ArmAsm

!*******************************************************
* *
* T E R M I N A L *
* *
* mit Einchip-Mikrorechner U 882 und CRTC 8275 *
* ============================================ *
* *
* ESCAPE_VT100 Module; Version 1.0: *
* - 24 Zeilen / 80 Zeichen *
* Inhalt: *
* - Auswertung der VT100-Escape-Sequenzen *
* (ANSI-Standard 3.64) *
* *
********************************************************
Bearbeiter: Kuehle / WAE
Stand: 03.09.87
Disk: Kuehle (Mini)
Name: P8T.ESCVT100.S !
ESCAPE_VT100 MODULE
CONSTANT
! 'Z8T.VEREINBARUNGEN' !
! 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 ^~ !
! Temporaere Vereinbarungen Selektierung VT100-Escape-Sequenzen Gruppe 10 !
ADR :=22
SIG1 :=23
SIG3 :=24
ZSEM :=25 !Zaehler Semikolon ;!
ZESCF :=26 !Zaehler ESC-Folge!
ZAHL1 :=27 !Parameter n;row;column BCD-codiert!
ZAHL2 :=28
ZAHL3 :=29
ZAHL4 :=30
ZAHL5 :=31
PARA :=254 !Parameter fuer n;row;column binaer-codiert!
ZWSP1 :=14 !Zwischenspeicher row in CPR!
ZWSP2 :=15
S_ZEILZ :=42 !Save und Restore Cursor attributes ZEILZ!
S_SPALTZ:=43 ! SPALTZ!
$PAGE
EXTERNAL
PUTA PROCEDURE
WRITE_CHAR PROCEDURE
READ_CHAR PROCEDURE
BRAM_ADR PROCEDURE
LOAD_CURSOR PROCEDURE
CLEAR_LINE PROCEDURE
ROLL_DOWN PROCEDURE
CLEAR_B LABEL
ROLL_U2 LABEL
LINE_FEED LABEL
CARRIAGE_RETURN LABEL
CLEAR_SC LABEL
PAGE_ERASE LABEL
ESC_AUS2 LABEL
LINE_ERASE LABEL
STAT0, STAT1, STAT2 BYTE
CHAR_ADR WORD
SPALTZ, ZEILZ, CHAR BYTE
GLOBAL
C_left C_rigth C_ft LABEL
CH_del CH_ins LABEL
$SECTION SEC5 PROGRAM
ESC_VT100 PROCEDURE
ENTRY
inc r10 !Zaehler ESCF erhoehen!
cp ZESCF,#10 !max. Laenge ESC-Folge ?!
jr ugt,ESC_ERROR !Zeichen nach ESC>10!
cp ZESCF,#1 !1.Zeichen nach ESC ?!
jp nz,ESC11 !nein!
! Set Anfangsbedingungen Behandlung ESC-Folgen !
clr SIG1
clr SIG3
clr ZSEM
clr ZAHL1
clr ZAHL2
clr ZAHL3
clr ZAHL4
clr ZAHL5
!Behandlung 1.Zeichen nach ESC!
cp CHAR,#'['
jr z,Z1_1
cp CHAR,#'D'
jr z,INDEX_down
cp CHAR,#'E'
jr z,NEXT_line
cp CHAR,#'M'
jr z,INDEX_up
cp CHAR,#'7'
jr z,SAVE_c
cp CHAR,#'8'
jr z,RESTORE_c
cp CHAR,#'('
jr z,Z1_2
cp CHAR,#')'
jr z,Z1_3
cp CHAR,#'#'
jr z,Z1_4
!ESC-Folgen nicht behandeln (z.Zt.)
TAB STOPS
MODES
SCROLLING REGION
STATUS REPORT
WHAT ARE YOU
PRINTER SUPPORT COMMANDS
CURSOR POSITION REPORT
CHARACTER SETS (G0 and G1)
MISCELLANEOUS
PERSOFT VT100 EXTENSION !
ESC_NBH:
!Fehler in ESC-Folge
Zeichen nach ESC>10
Kein gueltiger Final-character
n;row;column ungueltig
u.a.m.!
ESC_ERROR:
!Ende ESC-Folge
ESC-Folge okay und behandelt !
ESC_ENDE:
and STAT1,#NB4 !ESC-Flag reset!
ret !Ruecksprung!
!1.Zeichen nach ESC!
Z1_1:
or SIG1,#B0
ret
Z1_2:
or SIG1,#B1
ret
Z1_3:
or SIG1,#B2
ret
Z1_4:
or SIG1,#B3
ret
! C U R S O R M O V E M E N T C O M M A N D S
*********************************************** !
! Index down, with scroll ESC D
*********************************** !
INDEX_down:
call LINE_FEED
jr ESC_ENDE
! Next line, with scroll ESC E
*********************************** !
NEXT_line:
call LINE_FEED
call CARRIAGE_RETURN
jr ESC_ENDE
! Index up, with scroll ESC M
*********************************** !
INDEX_up:
dec ZEILZ
jr pl,up1 !ZEILZ>=0!
clr ZEILZ
ld PARA,#1
call LI_ins
jr ESC_ENDE
up1:
call LOAD_CURSOR
jr ESC_ENDE
! Save cursor attributes ESC 7
*********************************** !
SAVE_c:
ld S_ZEILZ,ZEILZ
ld S_SPALTZ,SPALTZ
jr ESC_ENDE
! Restore cursor attributes ESC 8
*********************************** !
RESTORE_c:
ld ZEILZ,S_ZEILZ
ld SPALTZ,S_SPALTZ
call LOAD_CURSOR
jr ESC_ENDE
! 1.Zeichen war !
ESC11:
tm SIG1,#B0 !"[" ?!
jr z,ESC_NBH !ESC-Folgen nicht behandeln!
cp ZESCF,#2 !2. Zeichen nach ESC ?!
jr nz,ESC21 !nein!
cp CHAR,#'?' !2. Zeichen ist Fragezeichen ?!
jr nz,ESC21 !nein!
or SIG3,#B0 !set Kennz. fuer "?"!
ret
ESC21:
cp CHAR,#%3f !Final-Character ?!
jr ule,ESC41 !kein Buchstabe!
tm SIG1,#B5 !Fehler in ESC-Folge ?!
jr nz,ESC_ERROR !ja!
! Final-Character Gross- und Kleinbuchstaben
****************************************** !
cp CHAR,#'J'
jp z,C_screen !Erasing screen!
cp CHAR,#'K'
jp z,C_line
cp CHAR,#'H'
jp z,C_da !Direct cursor addressing!
cp CHAR,#'f'
jp z,C_da !Direct cursor addressing!
cp CHAR,#'m'
jp z,CH_atb !CHARACTER ATTRIBUTES!
cp CHAR,#'n'
jp z,CPR !CURSOR POSITIONS REPORT!
! Umwandlung Parameter "n" von BCD-codiert in BINAER-codiert!
tm SIG3,#3 !War "?" und ";" in ESC-Folge ?!
jp nz,ESC_ERROR !ja!
clr ZSEM
call BCD_BIN !Umwandlung BCD in Binaer!
cp PARA,#0 !kein Parameter ?!
jr nz,ESC22 !nein!
inc PARA !PARA=1!
ESC22:
! Selectierung Final-Character !
cp CHAR,#'L'
jp z,LI_ins !Insert n lines!
cp CHAR,#'M'
jp z,LI_del !Delete n lines!
cp CHAR,#'@'
jp z,CH_ins !Insert n characters!
cp CHAR,#'P'
jp z,CH_del !Delete n characters!
cp CHAR,#'A'
jp z,C_unl !Cursor up n lines!
cp CHAR,#'B'
jp z,C_dnl !Cursor down n lines!
cp CHAR,#'C'
jp z,C_rnc !Cursor rigth n columns!
cp CHAR,#'D'
jp z,C_lnc !Cursor left n columns!
cp CHAR,#'Z'
jp z,C_bt !Cursor backwards tabs!
cp CHAR,#'I'
jp z,C_ft !Cursor forwards tabs!
jp ESC_NBH
! Behandlung Parameter n;row;column (ASCII-Ziffern 0 ... 9 in ESC-Folge
******************************************************************** !
ESC41:
cp CHAR,#%30
jp ult,ESC43 !kein ASCII-Zeichen 0 ... 9!
cp CHAR,#%39
jr ugt,ESC42 !kein ASCII-Zeichen 0 ... 9!
! Behandlung ASCII-Zeichen 0 ... 9
. Umwandlung in BCD-Zahl
. begrenzt durch ";"
. max. 2-stellig 0 ... 99 sonst Fehler in ESC-Folge!
cp CHAR,#%30 !"0" ?!
jr nz,ESC44 !nein!
tm SIG1,#B4 !Vornullenunterdrueckung ?!
jr z,ESC45 !ja!
jr ESC46 !nein!
ESC44:
or SIG1,#B4 !Vornullenunterdrueckung "aus"!
ESC46:
or SIG3,#B2 !Set "Zahl war"!
and CHAR,#%0F !ASCII-Zahl ---> Binaerzahl!
tm SIG1,#B6 !L-Teil abspeichern ?!
jr z,ESC47 !ja!
tm SIG1,#B7 !H-Teil abspeichern ?!
jr nz,ESC48 !nein Fehler!
or SIG1,#B7 !Set "H-Teil"!
ld r6,ZAHL1(r9) !r6=ZAHL1(ZSEM)!
SWAP ADR
or ADR,CHAR !r6=r6 "or" CHAR!
ld ZAHL1(r9),r6 !ZAHL1(ZSEM)=r6!
ESC45:
ret
ESC47:
or SIG1,#B6 !Set "L-Teil"!
ld r6,CHAR
ld ZAHL1(r9),r6 !ZAHL1(ZSEM)=r6!
jr ESC45
ESC42:
cp CHAR,#';'
jr nz,ESC48
or SIG3,#B1 !Set ";"!
and SIG1,#%2F !SIG1(4,6,7)=0!
inc r9 !ZSEM=ZSEM+1!
cp ZSEM,#4 !Zaehler ";">4 ?!
jr ule,ESC45 !nein!
ESC48:
or SIG1,#B5 !Set "error" ESC-Folge!
jr ESC45
ESC43:
cp CHAR,#'-'
jp z,ESC_NBH !PERSOFT VT100 EXTENSION!
jr ESC48
! Umwandlung BCD-Zahl in Binaerzahl
Input-Parameter: ZSEM Zeiger ZAHL1 ... ZAHL5
Output-Parameter: PARA Binaerzahl
*************************************************** !
BCD_BIN:
ld r7,ZAHL1(r9) !SIG1=ZAHL1(ZSEM)!
and SIG1,#%0F !SIG1(4-7)=0!
ld PARA,r7 !PARA=SIG1!
ld r7,ZAHL1(r9) !SIG1=ZAHL1(ZSEM)!
and SIG1,#%F0 !SIG1(0-3)=0!
swap SIG1
ld r8,#10 !SIG3=10!
BCD1:
cp SIG1,#0 !SIG1=0 ?!
jr z,BCD2 !ja!
sra SIG1 !c=1 ?!
jr nc,BCD3 !nein!
add PARA,SIG3 !PARA=PARA+SIG3!
BCD3:
add r8,r8 !SIG3=SIG3+SIG3!
jr BCD1
BCD2:
ret
! C U R S O R M O V E M E N T C O M M A N D S
*********************************************** !
! Cursor up n lines E S C [ n A
********************************* !
C_unl:
call C_up
jp ESC_ENDE
C_up:
sub ZEILZ,PARA !ZEILZ=ZEILZ-PARA!
jr pl,C_up1 !ZEILZ>=0!
clr ZEILZ !ZEILZ=0!
C_up1:
call LOAD_CURSOR
ret
! Cursor down n lines E S C [ n B
******************************** !
C_dnl:
call C_down
jp ESC_ENDE
C_down:
add ZEILZ,PARA !ZEILZ=ZEILZ+PARA!
cp ZEILZ,#ZEILENZAHL-1 !ZEILZ>(ZEILENZAHL-1) ?!
jr ule,down1 !nein!
ld ZEILZ,#ZEILENZAHL-1
down1:
call LOAD_CURSOR
ret
! Cursor rigth n columns E S C [ n C
********************** !
C_rnc:
call C_rigth
jp ESC_ENDE
C_rigth:
add SPALTZ,PARA !SPALTZ=SPALZ+PARA!
cp SPALTZ,#ZEICHENZAHL-1 !SPALTZ>(ZEICHENZAHL-1) ?!
jr ule,rigth1 !nein!
ld SPALTZ,#ZEICHENZAHL-1
rigth1:
call LOAD_CURSOR
ret
! Cursor left n columns E S C [ n D
********************************* !
C_lnc:
call C_left
jp ESC_ENDE
C_left:
sub SPALTZ,PARA !SPALTZ=SPALTZ-PARA!
jr pl,left1 !SPALTZ>=0!
clr SPALTZ
left1:
call LOAD_CURSOR
ret
! Direct cursor addressing E S C [ row;col H
E S C [ row;col f
*********************************************** !
C_da:
tm SIG3,#B0 !"?" in ESC-Folge ?!
jr nz,da1 !ja!
tm SIG3,#B1 !";" in ESC-Folge ?!
jr z,da2 !nein!
cp ZSEM,#1 !nur 1 x ";" in ESC-Folge ?!
jr nz,da1 !nein!
clr ZSEM !Zeiger Umwandlung ZAHL1!
call BCD_BIN
cp PARA,#0 !row-Parameter=0 ?!
jr z,da3 !ja!
cp PARA,#ZEILENZAHL !PARA>ZEILENZAHL ?!
jr ugt,da7 !ja!
dec PARA !PARA=PARA-1!
jr da3
da7:
ld ZEILZ,#ZEILENZAHL-1
jr da4
da3:
ld ZEILZ,PARA
da4:
ld r9,#1 !ZSEM=1 Zeiger Umwandlung ZAHL2!
call BCD_BIN
cp PARA,#0 !col-Parmeter=0 ?!
jr z,da5 !ja!
cp PARA,#ZEICHENZAHL !PARA>ZEICHENZAHL ?!
jr ugt,da8 !ja!
dec PARA !PARA=PARA-1!
da5:
ld SPALTZ,PARA !SPALTZ=PARA!
jr da6
da8:
ld SPALTZ,#ZEICHENZAHL-1
da6:
call LOAD_CURSOR
da1:
jp ESC_ENDE
da2:
tm SIG3,#B2 !war Zahl ?!
jr nz,da1
!Cursor home !
clr SPALTZ
clr ZEILZ
jr da6
! Cursor backwards tabs E S C [ n Z
***************************************** !
C_bt:
cp PARA,#10 !PARA>10 ?!
jr ugt,bt2 !ja!
bt1:
sub SPALTZ,#8 !SPALTZ=SPALTZ-8!
dec PARA
jr nz,bt1 !PARA=0 ?!
!ja!
and SPALTZ,#%F8 !TAB-Position setzen!
jr pl,bt3 !SPALTZ>=0 ?!
!ja!
bt2:
clr SPALTZ
bt3:
call LOAD_CURSOR
jp ESC_ENDE
! Cursor forward tabs E S C [ n I
***************************************** !
C_ft:
cp PARA,#10 !PARA>10 ?!
jr ugt,ft2 !ja!
ft1:
add SPALTZ,#8 !SPALTZ=SPALTZ+8!
dec PARA
jr nz,ft1 !PARA=0 ?!
!ja!
and SPALTZ,#%F8 !TAB-Position setzen!
cp SPALTZ,#ZEICHENZAHL-1 !SPALTZ>ZEICHENZAHL-1 ?!
jr ule,ft3 !nein!
ft2:
ld SPALTZ,#ZEICHENZAHL-1
ft3:
call LOAD_CURSOR
jp ESC_ENDE
! E R A S I N G
************* !
! From cursor to end of screen E S C [ J ; E S C [ 0 J
From top of screen to cursor E S C [ 1 J
Entire screen E S C [ 2 J
***************************************************** !
C_screen:
tm SIG3,#3 !War "?" oder ";" in ESC-Folge ?!
jp nz,ESC_ERROR !ja!
clr ZSEM
call BCD_BIN !Umwandlung BCD in Binaer!
cp PARA,#0 !PARA=... ?!
jr z,sc1
cp PARA,#1
jr z,sc2
cp PARA,#2
jp nz,ESC_ERROR
! Entire screen !
call CLEAR_SC
jp ESC_ENDE
! From cursor to end of screen !
sc1:
call PAGE_ERASE
jp ESC_ENDE
! From top of screen to cursor !
sc2:
call ELINE_CTB
cp ZEILZ,#0 !ZEILZ=0 ?!
jp z,ESC_ENDE
ld r6,ZEILZ !Zaehler!
sc3:
decw rr8 !BRAM-Adr. erniedrigen!
call CLEAR_LINE !Zeile loeschen!
djnz r6,sc3 !Zaehler=0 ?!
!ja!
jp ESC_ENDE
! From cursor to end of line E S C [ K ; E S C [ 0 K
From begin of line to cursor E S C [ 1 K
Entire line containing cursor E S C [ 2 K
****************************************************** !
C_line:
tm SIG3,#3 !War "?" oder ";" in ESC-Folge ?!
jp nz,ESC_ERROR !ja!
clr ZSEM
call BCD_BIN !Umwandlung BCD in Binaer!
cp PARA,#0 !PARA=... ?!
jr z,line1
cp PARA,#1
jr z,line2
cp PARA,#2
jp nz,ESC_ERROR
! Entire line containing cursor !
ld r8,#HI ZADR_TAB
ld r9,#LO ZADR_TAB
add r9,ZEILZ
call CLEAR_LINE
jp ESC_ENDE
! From cursor to end of line !
line1:
call LINE_ERASE
jp ESC_ENDE
! From begin of line to cursor !
line2:
call ELINE_CTB
jp ESC_ENDE
ELINE_CTB:
ld r8,#HI ZADR_TAB !BRAM-Adr. einstellen!
ld r9,#LO ZADR_TAB
add r9,ZEILZ
call CLEAR_B
ret
! C O M P U T E R E D I T I N G
******************************* !
! Insert n characters E S C [ n @
***************************************** !
CH_ins:
ld r8,#HI ZADR_TAB !BRAM-Adr. einstellen!
ld r9,#LO ZADR_TAB
add r9,ZEILZ
ld r15,SPALTZ
call BRAM_ADR
ld r11,PARA !Zaehler!
C_ins1:
push r8 !Store BRAM-Adr.!
push r9
push r15
cp ZAHL5,#ZEICHENZAHL-1 !r15=(ZEICHENZAHL-1) ?!
jr nz,C_ins2 !nein!
ld r13,#FAC !letzte Spalte!
call WRITE_CHAR
jr C_ins0
C_ins2:
call READ_CHAR !Zeichen lesen!
ld r13,#' '
call WRITE_CHAR !Schreiben " "!
C_ins3:
ld r13,r12 !Zeichen umladen!
add r9,PARA !BRAM-Adr. erhoehen!
adc r8,#0
add r15,PARA
cp ZAHL5,#ZEICHENZAHL-1 !r15>(ZEICHENZAHL-1) ?!
jr ugt,C_ins4 !ja!
call READ_CHAR !Zeichen lesen!
cp ZAHL5,#ZEICHENZAHL-1 !r15=ZEICHENZAHL-1 ?!
jr nz,C_ins5 !nein!
cp ZAHL2,#FAC !r12=FAC ?!
jr z,C_ins4 !ja!
call WRITE_CHAR !vorher gelesenes Zeichen schreiben!
jr C_ins4
C_ins5:
call WRITE_CHAR !vorher gelesenes Zeichen schreiben!
JR C_ins3
C_ins4:
djnz r11,C_ins6 !Zaehler=0 ?!
C_ins0:
pop r15 !Restore!
pop r9
pop r8
jp ESC_ENDE !ja!
C_ins6:
pop r15 !Restore BRAM-Adr.!
pop r9
pop r8
incw rr8 !BRAM-Adr. erhoehen!
inc r15
jr C_ins1
! Delete n characters E S C [ n P
**************************************** !
CH_del:
ld r8,#HI ZADR_TAB !BRAM-Adr. einstellen!
ld r9,#LO ZADR_TAB
add r9,ZEILZ
ld r15,SPALTZ
call BRAM_ADR
jr nz,C_del1
ld r13,#FAC
call WRITE_CHAR
jp ESC_ENDE
C_del1:
push r8 !Store BRAM-Adr.!
push r9
push r15
add r15,PARA !r15=r15+PARA!
cp ZAHL5,#ZEICHENZAHL-1 !r15>=(ZEICHENZAHL-1) ?!
jr ugt,C_del2 !ja!
add r9,PARA !BRAM-Adr. erhoehen!
adc r8,#0
call READ_CHAR !Zeichen lesen!
cp ZAHL5,#ZEICHENZAHL-1 !r15=ZEICHENZAHL-1 ?!
jr nz,C_del5 !nein!
cp ZAHL2,#FAC !r12=FAC ?!
jr z,C_del2 !ja!
ld r13,#FAC
call WRITE_CHAR
C_del5:
ld r13,r12 !Umladen gelesenes Zeichen!
jr C_del3
C_del2:
ld r13,#' '
C_del3:
pop r15 !Restore BRAM-Adr.!
pop r9
pop r8
call WRITE_CHAR !Zeichen schreiben!
djnz r11,C_del4 !Zaehler=0 ?!
jp ESC_ENDE !ja!
C_del4:
inc r15 !BRAM-Adr. erhoehen!
incw rr8
jr C_del1
! Delete n lines E S C [ n M
***************************************** !
LI_del:
ld r14,#ZEILENZAHL
sub r14,ZEILZ !Zaehler fuer Rollen!
cp PARA,ZAHL4 !PARA>r14 ?!
jr ule,L_del1 !nein!
ld PARA,r14 !PARA=r14!
L_del1:
ld r8,#HI ZADR_TAB !BRAM-Adr. einstellen!
ld r9,#LO ZADR_TAB
add r9,ZEILZ
djnz r14,L_del2
call CLEAR_LINE !letzte Zeile!
jp ESC_ENDE
L_del2:
push r8 !Store BRAM-Adr.!
push r9
push r14
or STAT0,#B2 !Rollbit set!
call ROLL_U2 !Zeile loeschen rollen up!
pop r14 !Restore!
pop r9
pop r8
dec PARA !PARA=PARA-1!
jp z,ESC_ENDE
jr L_del2
! Insert n lines E S C [ n L
***************************************** !
LI_ins:
ld r15,#ZEILENZAHL
sub r15,ZEILZ
cp PARA,ZAHL5 !PARA>r15 ?!
jr ule,L_ins1 !nein!
ld PARA,r15 !PARA=r15!
L_ins1:
ld r15,ZEILZ
call ROLL_DOWN !Rollen 1 x down!
dec PARA !PARA=PARA-1!
jp z,ESC_ENDE
jr L_ins1
! C H A R A C T E R A T T R I B U T E S
*************************************** !
CH_atb:
tm STAT2,#B4 !Video Attr. on/off ?!
jp nz,ESC_NBH !off!
tm SIG3,#B0 !"?" in ESC-Folge ?!
jp nz,ESC_ERROR
clr CHAR
ld r7,#%FF !SIG1=FF!
atb1:
inc r7 !SIG1=SIG1+1!
ld r8,ZAHL1(r7) !SIG3=ZAHL1(SIG1)!
cp SIG3,#0
jr z,atb5 !all attributes off!
cp SIG3,#1
jr z,atb2
cp SIG3,#4
jr z,atb3
cp SIG3,#5
jr z,atb4
cp SIG3,#7
jp nz,ESC_ERROR
! Reverse video on !
or CHAR,#FACR
jr atb5
! Blink on !
atb4:
or CHAR,#FACB
jr atb5
! Underscore on !
atb3:
or CHAR,#FACU
jr atb5
! Bold on (Highlight !
atb2:
or CHAR,#FACH
atb5:
dec ZSEM !ZSEM<0 ?!
jr pl,atb1 !nein!
and STAT1,#NB4 !reset ESC-Flag!
or CHAR,#FAC
call PUTA
jp ESC_ENDE
! CURSOR POSITIONS REPORT
Inkoved by ESC [ 6 n
Response is row and col ESC [ row ; col R
*********************************************** !
CPR:
tm SIG3,#3 !"?" oder ";" in ESC-Folge ?!
jp nz,ESC_ERROR
clr ZSEM
call BCD_BIN
cp PARA,#6 !PARA=6 ?!
jp nz,ESC_ERROR
ld r6,ZEILZ
inc r6
call BIN_ASCII !row!
ld ZWSP1,r7 !Zehner!
ld ZWSP2,r6 !Einer!
ld r6,SPALTZ
inc r6
call BIN_ASCII !col!
and STAT1,#NB4 !Reset ESC-Flag!
ld CHAR,#ESC
call ESC_AUS2 !Ausgabe ESC!
and STAT1,#NB4 !Reset ESC-Flag!
ld CHAR,#'['
call ESC_AUS2 !Ausgabe "["!
! Ausgabe row !
cp ZWSP1,#'0' !Zehner='0' ?!
jr z,CPR1
ld CHAR,ZWSP1
call ESC_AUS2
CPR1:
ld CHAR,ZWSP2
call ESC_AUS2
ld CHAR,#';'
call ESC_AUS2 !Ausgabe ";"!
! Ausgabe col !
cp SIG1,#'0' !Zehner='0' ?!
jr z,CPR2
ld CHAR,r7
call ESC_AUS2
CPR2:
ld CHAR,r6
call ESC_AUS2
ld CHAR,#'R'
call ESC_AUS2 !Ausgabe R!
jp ESC_ENDE
! Umwandlung ZEILZ,SPALTZ in ASCII-Ziffern - Ausgabe row;col !
BIN_ASCII:
ld r7,#%FF !SIG1=FF!
AS1:
inc r7
sub r6,#10 !ADR=ADR-10!
jr pl,AS1
add r6,#10 !Einer!
ld r8,#HI ASCII_ZI
ld r9,#LO ASCII_ZI
add r9,r7 !r9=r9+SIG1!
adc r8,#0
ldc r7,@rr8 !SIG1=(rr8)!
ld r8,#HI ASCII_ZI
ld r9,#LO ASCII_ZI
add r9,r6 !r9=r9+ADR!
adc r8,#0
ldc r6,@rr8 !ADR=(rr8)!
ret
END ESC_VT100
ASCII_ZI array [* byte] := '0123456789'
END ESCAPE_VT100