918 lines
18 KiB
ArmAsm
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
|