new stuff

This commit is contained in:
Oliver Lehmann 2007-03-21 14:48:41 +00:00
parent 36c6368fed
commit f4949b5d07
3 changed files with 2053 additions and 0 deletions

View File

@ -0,0 +1,665 @@
!*******************************************************
* *
* 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 ESCG8
VIDEO1:
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
!------------------------------------------------------!
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,#%86
jp z,FKT_AUS
ld ESCH0,#BS !Backspace!
cp CHAR,#%88
jp z,FKT_AUS
ld ESCH0,#LF !Linefeed!
cp CHAR,#%8A
jr z,FKT_AUS
ld ESCH0,#VT !Verticaltab!
cp CHAR,#%8B
jr z,FKT_AUS
ld ESCH0,#RS !Cursor home!
cp CHAR,#%8C
jr z,FKT_AUS
ld ESCH0,#BS
cp CHAR,#%9D
jr z,FKT_AUS
ld ESCH0,#%09
cp CHAR,#%89
jr z,FKT_AUS
! Funktionstasten !
LD ESCH0,#'W' ! char delete !
CP CHAR,#%8F
JR Z,ESC_SEQ_AUS
LD ESCH0,#'Q' ! char insert !
CP CHAR,#%85
JR Z,ESC_SEQ_AUS
LD ESCH0,#'R' ! line delete !
CP CHAR,#%84
JR Z,ESC_SEQ_AUS
LD ESCH0,#'E' ! line insert !
CP CHAR,#%81
JR Z,ESC_SEQ_AUS
LD ESCH0,#'Y' ! page erase !
CP CHAR,#%83
JR Z,ESC_SEQ_AUS
ld ESCH0,#'T'
cp CHAR,#%82
jr z,ESC_SEQ_AUS
ld ESCH0,#'I' ! BACK_TAB !
cp CHAR,#%87
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,#%86
jr z,ESC_SEQ_AUS
ld ESCH0,#'D' !Cursor left!
cp CHAR,#%88
jr z,ESC_SEQ_AUS
ld ESCH0,#'B' !Cursor down!
cp CHAR,#%8A
jr z,ESC_SEQ_AUS
ld ESCH0,#'A' !Cursor up!
cp CHAR,#%8B
jr z,ESC_SEQ_AUS
ld ESCH0,#'H' !Cursor home!
cp CHAR,#%8C
jr z,ESC_SEQ_AUS
ld ESCH0,#BS
cp CHAR,#%9D
jr z,FKT_AUS
! Funktionstasten !
ld ESCH0,#'P' !Delete character!
cp CHAR,#%8F
jr z,ESC_SEQ_AUS
ld ESCH0,#'@' !Insert character!
cp CHAR,#%85
jr z,ESC_SEQ_AUS
ld ESCH0,#'M' !Delete line!
cp CHAR,#%84
jr z,ESC_SEQ_AUS
ld ESCH0,#'L' !Insert line!
cp CHAR,#%81
jr z,ESC_SEQ_AUS
ld ESCH0,#'J' !Erasing from cursor to end of screen!
cp CHAR,#%83
jp z,ESC_SEQ_AUS
ld ESCH0,#'K'
cp CHAR,#%82
jp z,ESC_SEQ_AUS
ld ESCH0,#'Z' !Cursor backward tab!
cp CHAR,#%87
jp z,ESC_SEQ_AUS
ld ESCH0,#'I'
cp CHAR,#%89
jp z,ESC_SEQ_AUS
jp ESC_OUT0
END ESC_OUT_SEQ
END ESCAPE_SEQUENZ

View File

@ -0,0 +1,502 @@
!*******************************************************
* *
* T E R M I N A L *
* *
* mit Einchip-Mikrorechner U 882 und CRTC 8275 *
* ============================================ *
* *
* INIT Module; Version 4.2: *
* - 24 Zeilen / 80 Zeichen *
* Inhalt: *
* - Initialisierung Rechner, Bildspeicher, CRTC *
* - Interrupt-Service-Routinen *
* *
********************************************************
Bearbeiter: Heller/Kuehle / WAT/WAE
Stand: 29.09.88
Name: P8T.INIT !
INIT MODULE
CONSTANT
! 'P8T.VEREINBARUNGEN' !
! Werte !
P01EXT := %96 ! P0:=A8...A14, P1:=AD0...AD7, Stack intern !
P01TRI := %9E ! tri state: P0,P1,AS,DS,R/W !
SBUFL := 45 ! SIO-Puffer-Laenge !
ZDMA := 26 ! DMA ausschalten: 26*1.08=28 mys !
ZVSY := 160 ! VSYN: 192*1.08=172.8 mys !
! 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 !
! spezielle Ausgabeadressen (nur High-Teil) !
ZG0 := %40 ! ADM31-ASCII-Zeichensatz !
ZG1 := %20 ! Alternativ-Zeichensatz !
BELL_ADR := %80 ! Signalton !
TRES := %C0 ! Schieberegister ruecksetzen !
! 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
$PAGE
! Parameter fuer Display-Reset-Command !
RES1 := %4F ! 80 characters/row !
RES2 := %97 ! !
RES3 := %CC ! 13. Linie Unterstrich, 13 Linien !
RES4 := %6A ! visible video control !
!ruhender Cursor-Block!
RES5 := %4A !volles Feld blinkend!
RES6 := %7A !Unterstrich!
RES7 := %6C !changed for 4!
! 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 ^~ !
DEL := %7F ! Delete !
$PAGE
EXTERNAL
MAIN PROCEDURE
SIO_OUT PROCEDURE
GLOBAL
$SECTION SECR REGISTER
$REL 0
! Ports, Status- und Hilfsregister: Reg.-Grp. 0 !
P0, P1, P2, P3, STAT0, STAT1, STAT2, BDR BYTE
CHAR_ADR WORD
SPALTZ, ZEILZ, CHAR, STAT3 BYTE
$REL %20
! Tastatureingabe !
VBYTE, ZBYTE BYTE
$REL %2C
! Hilfregister fuer Escape_Sequenzen !
LPOS_ADR WORD
ESCH0 BYTE
$REL %30
! SIO-Input-Puffer: Reg.-Grp. 3, 4, 5 !
SINPTR, SOUTPTR, SCOUNT BYTE
SWERT ARRAY [SBUFL BYTE]
$SECTION SEC0 PROGRAM
$REL 0
INTERRUPT ARRAY [6 WORD] := [IRP32 IRP33 IRP31 IRP30 IRT0 IRT1]
$PAGE
JP_MESSAGE PROCEDURE
ENTRY
jr INITIAL
END JP_MESSAGE
! Message: Copyright Name Version Datum !
MESSAGE array [* byte] := '(C) ZFT/KEAW 4.2 Jan88'
INITIAL PROCEDURE
!*******************************************************
*
* Initialisierung :
* Ports, Register, SIO, Tastatur, CRTC
*
*******************************************************!
ENTRY
! Ports !
LD P01M,#P01EXT
LD P2M,#%FF ! P20...P27 Input !
LD P3,#%2F ! Anfangszustand, P35=1 !
LD P3M,#%51 ! DM aktiv !
! Timer T0 !
LD PRE0,#%0D ! PRE0:=3, modulo n, int. Clock !
! Timer T1 !
LD PRE1,#%06 ! PRE1:=1, single pass, int. Clock !
ld T1,#ZDMA ! Zeitkonstante fuer DMA-Dauer !
! Register !
LD SPL,#%80 ! init Stackpointer !
LD SPH,#%00
CLR IRQ ! no Int.request !
! Register loeschen !
SRP #%00
CLR R4
LD R5,#6
REG0:
LD @5,4
INC 5
CP 5,#%80
JR NZ,REG0
CLR R5
! Zeilenadressen-Tabelle laden !
srp #%10
ld r0,#HI ZADR_TAB
ld r1,#LO ZADR_TAB
ld r2,#HI BRAM
ld r3,#LO BRAM
ld r5,#ZEILENZAHL
ZADR1:
ld r6,r2
and r6,#%0F ! BRAM_ADR codieren !
or r6,r3 ! r6 enthaelt codierte ADR !
lde @rr0,r6 ! codierte ADR in Tabelle !
incw rr0
add r3,#ZEICHENZAHL ! naechste Adr. in rr2 !
jr nc,ZADR0 ! Uebertrag? !
inc r2
ZADR0:
djnz r5,ZADR1 ! Schleifenzaehler !
! SIO Vorbereiten !
LD SINPTR,#SWERT ! Input-Pointer laden !
LD SOUTPTR,#SWERT ! Output-Pointer laden !
LD BDR,#%02 ! Baudratenregister laden, 9600 Baud !
LD T0,BDR ! Baudrate in T0 !
OR TMR,#%03 ! T0 laden und starten !
! Scheinausgabe SIO in MAIN1 !
or STAT0,#B3 ! on_line ein !
or STAT2,#B3 !ADM31-Mode!
! IBM (XT) Tastatur und Zeichengenerator vorbereiten !
SRP #%20
ld r2,#%04
ld r3,#%84
LD R4,#ZG0 ! nur High-Adr interessant !
LDC @RR4,R5 ! Scheinausgabe zum Einschalten ZG0 !
ld r4,#TRES
ldc @rr4,r5 ! Schieberegister ruecksetzen !
! Vorbereitung Zeilenrefresh !
LD CHAR_ADR,#HI BRAM
SRP #%10
ld r0,#HI ZADR_TAB
ld r1,#LO ZADR_TAB
LD R5,#ZEILENZAHL
! CRTC initialisieren !
CALL RESET_DISPLAY
JP MAIN
END INITIAL
$PAGE
IRP31 PROCEDURE
!*******************************************************
*
* Zeilenrefresh im Tristate-Zustand
* Input: rr0, aktuelle Tabellen-Adresse
* Output: rr2, aktuelle BRAM-ADR
*
*******************************************************!
ENTRY
PUSH RP
SRP #%10
lde r2,@rr0 ! codierte BRAM_Adr.in r2 !
ld r3,#%F0 ! Adr. decodieren zu BRAM_ADR !
and r3,r2
and r2,#%0F
or r2,#%10 ! BRAM_ADR in rr2 !
inc r1 ! rr0 zeigt auf die naechste ZADR !
lde r4,@rr2 ! Zeilen-Start-Adr. in DMA-Zaehler laden !
djnz r5,UL2
ld r5,#ZEILENZAHL
ld r1,#LO ZADR_TAB
UL2:
OR STAT0,#B0 ! STAT0_0:=1 !
LD P01M,#P01TRI ! Tristate ein !
LD IMR,#%20 ! Int. T1 freigeben !
OR TMR,#%0C ! laden und starten !
AND P3,#NB5 ! P35 := 0, DMA ein !
TCM STAT0,#B1 ! MCU-Zugriff aktiv? !
JR NZ,UL4
EI ! T1-Int freigeben !
UL5:
TCM STAT0,#B0 ! DMA noch aktiv !
JR Z,UL5
UL4:
POP RP
IRET
END IRP31
IRT1 PROCEDURE
!*******************************************************
*
* DMA-Zugriff ausschalten
*
*******************************************************!
ENTRY
OR P3,#B5 ! P35:=1, DMA aus !
LD P01M,#P01EXT ! Ports normal !
AND STAT0,#NB0 ! STAT0_0:=0 !
AND IRQ,#NB2 ! 2. Int-Req. von P31 loeschen !
LD IMR,#%0F ! IRP31, IRP32, IRP33, IRP30 freigeben !
LD T1,#ZDMA ! Zeitdauer des DMA !
AND P3,#NB6 ! P36:=0, VSYN:=0 !
IRET
END IRT1
$PAGE
IRP32 PROCEDURE
!*******************************************************
*
* Bildruecklauf einleiten
* Laenge des VSYN-Signals durch T1 festlegen
*
*******************************************************!
ENTRY
OR P3,#B6 ! P36:=1, VSYN:=1 !
ld T1,#ZVSY ! Zeitdauer VSYN !
LD IMR,#%2A ! IRT1, IRP33, IRP30 freigeben !
OR TMR,#%0C ! laden und starten !
IRET
END IRP32
IR_REST PROCEDURE
!*******************************************************
*
* Timer 0 Routine (wird nicht benutzt)
*
*******************************************************!
ENTRY
IRT0:
IRET
END IR_REST
IRP33 PROCEDURE
!*******************************************************
*
* Tastatur-Eingabe-Routine (P33-Int.)
* IBM (XT) Tastatur
* - Tastatur-Flags:
* - STAT0_4 = 1 nach Uebernahme des Zeichenbytes
* - STAT0_5 = 1 nach Uebernahme des Vorbytes E0
*
*******************************************************!
ENTRY
tcm STAT0,#B4
jr z,TINT0
push rp
srp #%20
tcm STAT0,#B5
jr z,TINT1
tcm P2,#%E0
jr nz,TINT0
ld r0,P2
or STAT0,#B5
jr TINT0
TINT1:
ld r1,P2 !Lesen von Port 2!
or STAT0,#B4
TINT0:
ld r4,#TRES
TINTW:
tcm STAT0,#B0 ! DMA aktiv?, wenn ja, warten !
jr z,TINTW
ldc @rr4,r5 ! Schieberegister ruecksetzen !
pop rp
IRET
END IRP33
$PAGE
IRP30 PROCEDURE
!*******************************************************
*
* Serielle Eingabe-Routine
* Zeichen werden im SPUFFER abgelegt
*
*******************************************************!
ENTRY
TCM STAT0,#B7 ! Fehlerbit gesetzt? !
JR Z,SINT1
CP SIO,#NUL ! gelesenes Zeichen=00? !
JR Z,SINT1 ! Zeichen 00 ignorieren !
cp SIO,#DEL ! gelesenes Zeichen=7F? !
jr z,SINT1 ! DEL ignorieren !
LD @SINPTR,SIO ! SIO lesen !
and @SINPTR,#NB7 ! bit 7 ausblenden !
OR STAT0,#B6 ! Zeichenbit setzen !
INC SINPTR ! Pointer erhoehen !
inc SCOUNT ! Counter erhoehen !
cp SCOUNT,#SBUFL-9
jr lt,SINT2 ! Sprung, wenn r2 kleiner !
tcm STAT1,#B2 ! CRTL_S bereits gesendet? !
jr z,SINT3 ! wenn ja, Sprung !
or STAT1,#B2 ! CTRL_S-Flag setzen !
push CHAR
ld CHAR,#DC3 ! CTRL_S !
call SIO_OUT
pop CHAR
SINT3:
cp SCOUNT,#SBUFL ! Puffer Ende erreicht? !
jr nz,SINT2
or STAT0,#B7 ! Fehler-Flag setzen !
SINT2:
CP SINPTR,#SWERT+SBUFL ! Endwert ueberschritten? !
JR NZ,SINT1
LD SINPTR,#SWERT ! Inpointer ruecksetzen !
SINT1:
IRET
END IRP30
RESET_DISPLAY PROCEDURE
!*******************************************************
*
* Ruecksetzen und Initialisierung des 8275
* Ruecksetzen der internen Zaehler des CRTC
*
*******************************************************!
ENTRY
LD R8,#HI CRT_COM
LD R9,#LO CRT_COM
LD R10,#RES_DISPL
LDE @RR8,R10 ! Ausgabe Command !
! Parameter ausgeben !
DEC R9 ! CRT_PAR ADR einstellen !
LD R11,#%4 ! Zaehler !
LD R12,#HI RES_DISPL_PAR
LD R13,#LO RES_DISPL_PAR
PARLOOP:
LDC R10,@RR12 ! Parameter holen !
LDE @RR8,R10 ! Ausgabe Parameter !
INCW RR12
DJNZ R11,PARLOOP
! Zaehler ruecksetzen !
LD R10,#PRES_COUNT
inc r9 ! rr8=Command-Addr !
LDE @RR8,R10 ! Ausgabe Command !
lde @rr8,r10 ! Wiederholung !
RET
END RESET_DISPLAY
RES_DISPL_PAR ARRAY [4 BYTE] := [RES1 RES2 RES3 RES7]
END INIT

View File

@ -0,0 +1,886 @@
!*******************************************************
* *
* T E R M I N A L *
* *
* mit Einchip-Mikrorechner U 882 und CRTC 8275 *
* ============================================ *
* *
* HAUPT Module; Version 5.0: *
* - Anpassung an IBM (XT) Tastatur *
* - 24 Zeilen / 80 Zeichen *
* Inhalt: *
* - MAIN Procedure mit Steuerschleife *
* - UP's: PUTA, TGETCHAR, SGETCHAR, START_DISPLAY *
* SIO_OUT, BREAK *
* *
********************************************************
Bearbeiter: Heller/Kuehle / WAT/WAE
Stand: 20.01.88
Name: P8T.MAIN !
HAUPT MODULE
CONSTANT
! 'Z8T.VEREINBARUNGEN' !
$LISTOFF
! Werte !
P01EXT := %96 ! P0:=A8...A14, P1:=AD0...AD7, Stack intern !
P01TRI := %9E ! tri state: P0,P1,AS,DS,R/W !
SBUFL := 45 ! SIO-Puffer-Laenge !
! 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 ! ASCII-Zeichensatz !
ZG1 := %2000 ! Alternativ-Zeichensatz !
BELL_ADR := %8000 ! Akustischer Signalgeber !
! 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
ZESCF :=26 !Zaehler ESC-Folge!
PARA :=254 !Parameter fuer n;row;column!
$PAGE
EXTERNAL
CHAR_ADRESSE PROCEDURE
ADR_DEC PROCEDURE
READ_ADR PROCEDURE
WR_ADR PROCEDURE
WRITE_CHAR PROCEDURE
CURSOR_POS PROCEDURE
LOAD_CURSOR PROCEDURE
ROLL PROCEDURE
CLEAR_LINE PROCEDURE
CLEAR_SCREEN PROCEDURE
ESC_SEQUENZ PROCEDURE
ESC_OUT_SEQ PROCEDURE
BREAK PROCEDURE
ESC_VT100 PROCEDURE
C_left LABEL
C_rigth LABEL
C_ft LABEL
P0, P1, P2, P3, STAT0, STAT1, STAT2 BYTE
CHAR_ADR, LPOS_ADR WORD
SPALTZ, ZEILZ, CHAR, BDR, STAT3 BYTE
VBYTE, ZBYTE BYTE
SINPTR, SOUTPTR, SCOUNT BYTE
SWERT ARRAY [SBUFL BYTE]
GLOBAL
LINE_FEED CARRIAGE_RETURN LABEL
TAB LABEL
BACK_TAB LABEL
$SECTION SEC1 PROGRAM
MAIN PROCEDURE
!*******************************************************
*
* Terminal - Steuerschleife
* Input: Tastatur (TGETCHAR), bzw. SIO
* Output: Bildschirm (PUTA), bzw. SIO
*
*******************************************************!
ENTRY
CALL CLEAR_SCREEN ! loeschen + FAC am Zeilenende setzen !
CALL LOAD_CURSOR ! Cursor auf Anfangsposition setzen !
LD IMR,#%01 ! IRP32 -> VTRC freigeben !
CALL START_DISPLAY ! CRTC starten !
EI
LD SIO,#%00 ! Scheinausgabe SIO !
! Ausgabe Terminalgenerierung ADM31 oder VT100 umschaltbar ueber F1
Ausgabe Generierung Video Attribute umschaltbar ueber F2!
TOUT1:
tm STAT0,#B3 !online/offline ?!
jr nz,TOUT2 !online!
and STAT2,#NB5 !set war offline!
jr TOUT3
TOUT2:
or STAT2,#B5 !set war online!
TOUT3:
and STAT0,#NB3 !set offline!
call CURSOR_HOME
call CLEAR_SCREEN
tm STAT2,#B3 !ADM31/VT100 ?!
jr nz,TOUT4 !ADM31!
ld r6,#HI VT1
ld r7,#LO VT1
jr TOUT5
TOUT4:
ld r6,#HI ADM
ld r7,#LO ADM
TOUT5:
ldc r8,@rr6
ld CHAR,r8
cp CHAR,#'='
jr z,TOUT6
cp CHAR,#'#'
jr z,TOUT7
call PUTA
incw rr6
jr TOUT5
TOUT6:
tm STAT2,#B4 !Video Attribute on/off ?!
jr nz,TOUT8 !off!
ld r6,#HI VAN
ld r7,#LO VAN
jr TOUT5
TOUT8:
ld r6,#HI VAF !on!
ld r7,#LO VAF
jr TOUT5
TOUT7:
tm STAT2,#B5 !war on/off ?!
jr nz,TOUT9
and STAT0,#NB3 !set offline!
jr MAIN0
TOUT9:
or STAT0,#B3 !set online!
MAIN0:
TM STAT0,#B4 ! Zeichen im TPUFFER? !
JR NZ,MAIN1 ! wenn ja, Sprung !
TM STAT0,#B3 ! on_line? !
JR Z,MAIN0 ! wenn nein, Warteschleife !
TM STAT0,#B6 ! Zeichen im SPUFFER? !
JR Z,MAIN0 ! wenn nein, Warteschleife !
! Input ueber SIO im on_line Mode !
CALL SGETCHAR ! Zeichen aus SPUFFER in CHAR !
CALL PUTA ! Auswertung des Zeichens !
JR MAIN0 ! Warteschleife !
MAIN1:
! Input ueber Tastatur !
CALL TGETCHAR ! Zeichen aus TPUFFER in CHAR
dabei Tastaturanpassung !
CP CHAR,#%F0 ! on/off Taste? !
JR NZ,MAIN10
! Umschaltung on / off !
CLR CHAR ! neutralen Wert in CHAR !
TM STAT0,#B3
JR NZ,OFFLINE
OR STAT0,#B3 ! on_line ein !
JR MAIN0
OFFLINE:
AND STAT0,#NB3 ! off_line ein !
JR MAIN0
MAIN10:
CP CHAR,#%F1 ! Break-Taste? !
JR NZ,MAIN11
CALL BREAK ! Breakfunktion ausfuehren !
JR MAIN0
! Umschaltung VT100 <---> ADM31 ueber Taste MOD
********************************************* !
MAIN11:
cp CHAR,#%90
jr nz,MAIN14
tm STAT2,#B3 !VT100/ADM31 ?!
jr nz,ADM31
! Umschaltung VT100 ---> ADM31 !
or STAT2,#B3
jp TOUT1
! Umschaltung ADM31 ---> VT100 !
ADM31:
and STAT2,#NB3
jp TOUT1
! Umschaltung Video Attribute on <---> off ueber Taste VIDEO
********************************************************** !
MAIN14:
cp CHAR,#%A0
jr nz,MAIN13
tm STAT2,#B4 !Video Attribute on/off ?!
jr nz,V_off
or STAT2,#B4 !Video attributes off!
jp TOUT1
V_off:
and STAT2,#NB4 !Video attributes on!
jp TOUT1
MAIN13:
TCM CHAR,#B7 ! CHAR_7=1? !
JR NZ,MAIN12 ! wenn ja, Escape-Sequenz ausgeben !
CALL ESC_OUT_SEQ
JR MAIN0
MAIN12:
! on_line oder off_line Mode? !
TM STAT0,#B3 ! on_line? !
JR NZ,MAIN2 ! wenn ja, SIO_out !
! Output auf Bildschirm im off_line Mode !
CALL PUTA
JR MAIN0 ! Warteschleife !
MAIN2:
! Output ueber SIO im on_line Mode !
CALL SIO_OUT
JR MAIN0 ! Warteschleife !
END MAIN
ADM array [* byte] := 'ADM31/9600 baud/='
VT1 array [* byte] := 'VT100/9600 baud/='
VAN array [* byte] := 'Video Attr. on%R%L#'
VAF array [* byte] := 'Video Attr. off%R%L#'
$PAGE
PUTA PROCEDURE
!*******************************************************
*
* Zeichen in CHAR auswerten
* Cursor setzen, Bildram beschreiben
*
*******************************************************!
ENTRY
! Abfrage auf Program Mode (PGM) !
!------------------------------------------------------!
! Im PGM werden alle Zeichen direkt ohne interne Verarbeitung
angezeigt. Einschalten mit ESC U, aus mit ESC u bzw. ESC X !
TCM STAT1,#B3 ! PGM-Flag setzen !
JR NZ,PUTA1
CP CHAR,#ESC ! Escape-Zeichen !
JR NZ,PUTA2
OR STAT1,#B4 ! Escape_Flag setzen !
JR PUTA0
PUTA2:
TCM STAT1,#B4 ! Escape_Flag gesetzt? !
jr NZ,PUTA0
and STAT1,#NB4 ! ESC-Flag ruecksetzen !
cp CHAR,#'X' ! clear PGM mit ESC X !
jr z,CLEAR_PGM
cp CHAR,#'u' ! clear PGM mit ESC u !
jr nz,PUTA0
CLEAR_PGM:
and STAT1,#NB3 ! PGM-Flag ruecksetzen !
jr PUTA0
!------------------------------------------------------!
PUTA1:
! Normal Mode !
TCM STAT1,#B4 ! Escape-Flag gesetzt ? !
JP Z,ESC_FLG
CP CHAR,#%20 ! Control oder sichtbares Zeichen? !
JR ULT,PUTA_CONTROL
!------------------------------------------------------!
PUTA0:
! Behandlung sichtbarer Zeichen !
CALL CHAR_ADRESSE ! aktuelle Bildramadr. berechnen !
LD CHAR_ADR,R12 ! Berechnete Adresse ablegen !
LD CHAR_ADR+1,R13
CALL CURSOR_POS ! Cursor berechnen und setzen !
CALL ROLL ! Rollen, falls Rollflag gesetzt !
LD R8,CHAR_ADR
LD R9,CHAR_ADR+1
LD R13,CHAR
CALL WRITE_CHAR ! Zeichen in Bildram eintragen !
RET
!------------------------------------------------------!
PUTA_CONTROL:
! Abfrage der CTRL-Zeichen !
CP CHAR,#CR ! CTRL M !
JR Z,CARRIAGE_RETURN
CP CHAR,#LF ! CTRL J !
JR Z,LINE_FEED
CP CHAR,#BS ! CTRL H !
JR Z,BACK_SPACE
CP CHAR,#VT ! CTRL K !
JR Z,VERT_TAB
CP CHAR,#FF ! CTRL L !
JR Z,FOR_SPACE
CP CHAR,#ESC ! CTRL [ !
JP Z,ESC_SEQ
CP CHAR,#RS ! CTRL ^ !
JP Z,CURSOR_HOME
cp CHAR,#HT ! CTRL I !
jr z,TAB
CP CHAR,#BEL ! CTRL G !
JP Z,BELL
RET
!------------------------------------------------------!
! Bearbeitung der Steuerzeichen !
CARRIAGE_RETURN:
! *** Cursor auf linken Rand *** !
CLR SPALTZ
CALL LOAD_CURSOR
RET
LINE_FEED:
! *** Cursor eine Zeile nach unten *** !
INC ZEILZ
CP ZEILZ,#ZEILENZAHL
JR NZ,NEUE_ZEILE
LD ZEILZ,#ZEILENZAHL-1 ! Cursor bleibt nach Rollen
in der letzen Zeile !
OR STAT0,#B2 ! Rollflag setzen !
CALL ROLL ! Rollen, falls Rollflag gesetzt !
NEUE_ZEILE:
CALL LOAD_CURSOR
RET
BACK_SPACE:
! *** Cursor ein Zeichen nach links *** !
tm STAT2,#B3 !ADM31-/VT100-Terminal ?!
jr nz,BACK_SPACE_ADM31
! VT100-Terminal !
ld PARA,#1
call C_left
ret
! ADM31-Terminal !
BACK_SPACE_ADM31:
DEC SPALTZ
BACK_SPACE1: ! Entry fuer BACK-TAB !
cp SPALTZ,#ZEICHENZAHL
jr ult,BSP0
LD SPALTZ,#ZEICHENZAHL-1
DEC ZEILZ
JR PL,BSP0
CLR ZEILZ ! Cursor bleibt unveraendert !
CLR SPALTZ ! in der linken oberen Ecke !
BSP0:
CALL LOAD_CURSOR
RET
BACK_TAB:
! *** ESC I: Cursor eine Tab-Pos. zurueck *** !
dec SPALTZ
and SPALTZ,#%F8 ! Tab-Position !
jr BACK_SPACE1
TAB:
! *** Cursor auf Tab-Position *** !
tm STAT2,#B3 !ADM31-/VT100-Terminal ?!
jr nz,TAB_ADM31
! VT100-Terminal !
ld PARA,#1
call C_ft
ret
! ADM31-Terminal !
TAB_ADM31:
add SPALTZ,#%08
and SPALTZ,#%F8 ! Tab-Position !
jr FOR_SPACE1
$PAGE
VERT_TAB:
! *** Cursor eine Zeile nach oben *** !
DEC ZEILZ
JR PL,VT0
CLR ZEILZ ! Cursor bleibt in der 1.Zeile,
wenn er sie erreicht hat !
VT0:
CALL LOAD_CURSOR
RET
FOR_SPACE:
! *** Cursor ein Zeichen nach rechts *** !
tm STAT2,#B3 !ADM31-/VT100-Terminal ?!
jr nz,FOR_SPACE_ADM31
! VT100-Terminal !
ld PARA,#1
call C_rigth
ret
! ADM31-Terminal!
FOR_SPACE_ADM31:
INC SPALTZ
FOR_SPACE1: ! Entry fuer TAB-Funktion !
CP SPALTZ,#ZEICHENZAHL
JR ULT,FF0
CLR SPALTZ
JR LINE_FEED ! ZEILZ erhoehen, rollen !
FF0:
CALL LOAD_CURSOR
RET
CURSOR_HOME:
! *** Cursor wird auf Pos. 1,1 gesetzt *** !
LD ZEILZ,#0
LD SPALTZ,#0
CALL LOAD_CURSOR
RET
ESC_SEQ:
! *** ESC-Flag setzen *** !
OR STAT1,#B4
clr ZESCF !ZESCF=0!
RET
BELL:
! *** akustisches Signal *** !
PUSH RP
SRP #%20
LD R8,#HI BELL_ADR
LD R9,#LO BELL_ADR
LDC @RR8,R9 ! Scheinausgabe zur Impulserzeug. !
POP RP
RET
! Behandlung ESC-Folgen
Bit 3 in STAT2: 0 ---> VT100-Terminal
1 ---> ADM31-Terminal !
ESC_FLG:
tm STAT2,#B3
jp nz,ESC_SEQUENZ !ADM31-Terminal!
jp ESC_VT100 !VT100-Terminal!
END PUTA
$PAGE
TGETCHAR PROCEDURE
!*******************************************************
*
* Spezielle Anpassung an IBM (XT) Tastatur
* Input: ZBYTE Abtastcode
* Output: CHAR ASCII-Zeichen
*
*******************************************************!
ENTRY
push rp
srp #%20
tcm r1,#B7 !Taste mit Vorbyte E1 ?!
jr z,TGET0
tcm r0,#B0
jr z,TGET2
jr TGET3
TGET0:
ld r6,r1
clr r1
tcm r0,#B0
jr z,TGET3
ld r1,r6
sub r1,#B7
add r3,r1
jr nc,TGET1
inc r2
TGET1:
ldc r1,@rr2 !Wert aus SHIFT_Tab!
! NORMAL-STATUS !
ld r2,#HI NORMAL_Tab
ld r3,#LO NORMAL_Tab
jr TGET3
TGET2
ld r6,r1
clr r1
tcm r6,#%40
jr nz,TGET3
cp r6,#%7B
jr gt,TGET3
and r6,#%1F
ld r1,r6
jr TGET3
TGET3:
tcm r0,#%08
jr nz,TGET7
tcm r0,#%02
jr nz,TGET3
cp r1,#%41
jr lt,TGET3
cp r1,#%5A
jr gt,TGET3
add r1,#%20
TGET3:
ld CHAR,r1
tcm r0,#%04
jr nz,TGET5
tcm STAT1,#%01
jr z,TGET6
or STAT1,#%01
ld r4,#%020
ld r5,#%00
ldc @rr4,r5
jr TGET6
TGET5:
tcm STAT1,#%01
jr nz,TGET6
! Zeichensatz 1 (amerikanisch) !
and STAT1,#NB0
ld r4,#HI ZG0
ld r5,#LO ZG0
ldc @rr4,r5
TGET6:
and STAT0,#NB4 land NB5
pop rp
ret
TGET7:
tm STAT1,#%01
jr z,TGET3
tm r0,#%02
jr z,TGET8
cp r1,#%7A
jr ule,TGET3
cp r1,#%7E
jr nc,TGET3
sub r1,#%20
jr TGET3
TGET8:
cp r1,#%5A
jr ule,TGET3
cp r1,#%5E
jr nc,TGET3
add r1,#%20
jr TGET3
END TGETCHAR
$PAGE
!
Abtastcode Normal ASCII SHIFT ASCII
Dez/Hex
---------------------------------------------
0 00 + 2B + 2B
1 01 ESC 1B ESC 1B
2 02 1 31 Ausr.Z. 21
3 03 2 32 " 22
4 04 3 33 @ Par* 40
5 05 4 34 $ 24
6 06 5 35 % 25
7 07 6 36 & 26
8 08 7 37 / 2F
9 09 8 38 ( 28
10 0A 9 39 ) 29
11 0B 0 30 = 3D
12 0C ~ sz* 7E ? 3F
13 0D ' 27 ` 60
14 0E DEL 7F DEL 7F
15 0F BTAB 09 BTAB 09
16 10 q 71 Q 51
17 11 w 77 W 57
18 12 e 65 E 45
19 13 r 72 R 52
20 14 t 74 T 54
21 15 z 7A Z 5A
22 16 u 75 U 55
23 17 i 69 I 49
24 18 o 6F O 4F
25 19 p 70 P 50
26 1A ] ue* 5D } Ue* 7D
27 1B + 2B * 2A
28 1C CR 0D CR 0D
29 1D TAB 82 TAB 82
30 1E a 61 A 41
31 1F s 73 S 53
32 20 d 64 D 44
33 21 f 66 F 46
34 22 g 67 G 47
35 23 h 68 H 48
36 24 j 6A J 4A
37 25 k 6B K 4B
38 26 l 6C L 4C
39 27 oe* 5C | Oe* 7C
40 28 [ ae* 5B { Ae* 7B
41 29 BS 08 BS 08
42 2A SHIFT 80 SHIFT 80
43 2B # 23 ^ 5E
44 2C y 79 Y 59
45 2D x 78 X 58
46 2E c 63 C 43
47 2F v 76 V 56
48 30 b 62 B 42
49 31 n 6E N 4E
50 32 m 6D M 4D
51 33 , 2C ; 3B
52 34 . 2E : 3A
53 35 - 2D _ 5F
54 36 SHIFT 80
55 37 * 2A
56 38 CTRL 80
57 39 SP 20
58 3A CAPS L. 80
59 3B SI/S0 F2
60 3C MOD F3
61 3D VIDEO F4
62 3E BREAK F1
63 3F F1 80
64 40 F2 80
65 41 F3 80
66 32 F4 80
67 43 F5 80
68 44 F6 80
69 45 CE 08
70 46 F10 80
71 47 7 37
72 48 8 38
73 49 9 39
74 4A - 5F
75 4B 4 34
76 4C 5 35
77 4D 6 36
78 4E = 3D
79 4F 1 31
80 50 2 32
81 51 3 33
82 52 0 30
83 53 , 2C
84 54 OFF F0
85 55 80
86 56 < 3C > 3E
87 57 F7 80
88 58 F8 80
* Zeichengenerator ZG1 (Umlaute)
!
NORMAL_Tab array [85 byte] :=
[%00 %00 %81 %F1 %00 %00 %86 %87 %88 %89 %8A %8B %8C %09 %F0 %00
%00 %00 %00 %00 %00 %00 %00 %00 %00 %00 %00 %1B %00 %9D %0D %00
%80 %82 %81 %85 %00 %00 %00 %00 %00 %00 %00 %00 %2C %00 %00 %00
%30 %31 %32 %33 %34 %35 %36 %37 %38 %39 %00 %2E %00 %2D %00 %00
%83 %80 %84 %00 %00 %00 %00 %00 %00 %00 %00 %00 %00 %8F %08 %80
%2B %90 %A0 %80 %80]
$PAGE
START_DISPLAY PROCEDURE
!*******************************************************
*
* CRTC starten
*
*******************************************************!
ENTRY
LD R8,#HI CRT_COM
LD R9,#LO CRT_COM
LD R10,#START_DISPL
LDE @RR8,R10
RET
END START_DISPLAY
SGETCHAR PROCEDURE
!*******************************************************
*
* Zeichen wird aus Sio-Puffer gelesen
* und in Zelle CHAR abgelegt
*
*******************************************************!
ENTRY
dec SCOUNT ! Counter erniedrigen !
cp SCOUNT,#0
jr nz,SGET1 ! Sprung wenn Counter > 0 !
tcm STAT1,#B2 ! Wurde CTRL_S gesendet? !
jr nz,SGET2
ld CHAR,#DC1 ! CTRL_Q !
call SIO_OUT ! CTRL_Q senden !
and STAT1,#NB2 ! CTRL_S-Flag ruecksetzen !
SGET2:
AND STAT0,#NB6
AND STAT0,#NB7
SGET1:
LD CHAR,@SOUTPTR ! Zeichen lesen !
INC SOUTPTR ! Outpointer erhoehen !
CP SOUTPTR,#SWERT+SBUFL ! Endwert ueberschritten? !
JR NZ,SGET0
LD SOUTPTR,#SWERT ! Init-Wert !
SGET0:
RET
END SGETCHAR
SIO_OUT PROCEDURE
!*******************************************************
*
* Ausgabe ueber SIO in on_line Mode
* Es werden nur ASCII-Zeichen %01...%7F ausgegeben
* Das NUL-Zeichen %00 wird unterdrueckt.
*
*******************************************************!
ENTRY
CP CHAR,#%00 ! NUL-Zeichen? !
JR Z,SIO0 ! wenn ja, Aussprung !
SIO1:
TM IRQ,#B4 ! Sender bereit !
JR Z,SIO1 ! warten auf Sendebereitschaft !
LD SIO,CHAR ! Zeichen senden !
AND IRQ,#NB4 ! TX-Flag ruecksetzen !
SIO0:
RET
END SIO_OUT
BREAK PROCEDURE
!*******************************************************
*
*
* Break-Funktion ausfuehren:
* Senden %00 fuer die Dauer der halbierten Baudrate
*
*******************************************************!
ENTRY
TCM STAT0,#B3 ! nur bei on_line wirksam !
JR NZ,BREAK0
CP CHAR,#%F1 ! nochmalige Pruefung !
JR NZ,BREAK0
CLR CHAR ! NUL in CHAR !
PUSH RP
SRP #%20 ! Reg-Gr. 2 !
LD R7,BDR ! aktuelle Baudrate holen !
ADD R7,R7 ! Baudrate halbieren !
LD T0,R7 ! neue Zeitkonst. in T0 !
OR TMR,#%03 ! T0 laden und starten !
BREAK2:
TM IRQ,#B4 ! Sender bereit !
JR Z,BREAK2 ! warten auf Sendebereitschaft !
LD SIO,CHAR ! Zeichen senden !
AND IRQ,#NB4 ! TX-Flag ruecksetzen !
BREAK1:
TM IRQ,#B4 ! Senden beendet? !
JR Z,BREAK1
LD T0,BDR ! aktuelle Baudrate wieder laden !
OR TMR,#%03 ! T0 laden und starten !
POP RP
BREAK0:
RET
END BREAK
END HAUPT