new stuff
This commit is contained in:
parent
36c6368fed
commit
f4949b5d07
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
Loading…
Reference in New Issue