937 lines
19 KiB
ArmAsm
937 lines
19 KiB
ArmAsm
!*******************************************************
|
||
* *
|
||
* 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,TOUT10
|
||
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
|
||
TOUT10:
|
||
tm STAT3,#B4 !Eigentest ?!
|
||
jr z,TOUT10 !nein!
|
||
tm STAT3,#B5 !Error Tastatur ?!
|
||
jr z,TOUT7 !nein!
|
||
ld r6,#HI ERR
|
||
ld r7,#LO ERR
|
||
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,#%F3
|
||
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,#%F4
|
||
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 (c)zft/keaw%R%L#'
|
||
VAF array [* byte] := 'Video Attr. off (c)zft/keaw%R%L#'
|
||
ERR array [* byte] := 'Error Tastatur<'
|
||
$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
|
||
tm STAT3,#B7 !Taste mit Vorbyte E1 ?!
|
||
jr z,TGET0 !nein!
|
||
and ZBYTE,#NB4
|
||
jp TGETV
|
||
TGET0:
|
||
tm STAT0,#B5 !Taste mit Vorbyte E0 ?!
|
||
jp nz,TGETV !ja!
|
||
tm STAT3,#B2 !SHIFT-STATUS ein ?!
|
||
jr z,TGET1 !nein!
|
||
! SHIFT-STATUS !
|
||
cp ZBYTE,#%35 !Abtastcode 00H ... 35H ?!
|
||
jr ule,TGET2 !ja!
|
||
cp ZBYTE,#%56 !Abtastcode 56H ?!
|
||
jr nz,TGET1 !nein!
|
||
ld ZBYTE,#'>' !ZBYTE='>'!
|
||
jp TGETE
|
||
TGET2:
|
||
ld r2,#HI SHIFT_Tab
|
||
ld r3,#LO SHIFT_Tab
|
||
add r3,r1
|
||
adc r2,#0
|
||
ldc r1,@rr2 !Wert aus SHIFT_Tab!
|
||
tm STAT3,#B0 !CAPS-LOCK-STATUS ein ?!
|
||
jr z,TGET3 !nein!
|
||
cp ZBYTE,#'A' !Grossbuchstaben A ... Z ?!
|
||
jr ult,TGET3 !nein!
|
||
cp ZBYTE,#'Z'
|
||
jr ugt,TGET3 !nein!
|
||
or ZBYTE,#B5 !Grossbuchstaben ---> Kleinbuchstaben!
|
||
jr TGET3
|
||
! NORMAL-STATUS !
|
||
TGET1:
|
||
ld r2,#HI NORMAL_Tab
|
||
ld r3,#LO NORMAL_Tab
|
||
add r3,r1
|
||
adc r2,#0
|
||
ldc r1,@rr2 !Wert aus NORMAL_Tab!
|
||
tm STAT3,#B0 !CAPS-LOCK-STATUS ein ?!
|
||
jr z,TGET3 !nein!
|
||
cp ZBYTE,#'a' !Kleinbuchstaben a ... z ?!
|
||
jr ult,TGET3 !nein!
|
||
cp ZBYTE,#'z'
|
||
jr ugt,TGET3 !nein!
|
||
and ZBYTE,#NB5 !Kleinbuchstaben ---> Grossbuchstaben!
|
||
TGET3:
|
||
tm STAT3,#B1 !CTRL-STATUS ein ?!
|
||
jr z,TGET5 !nein!
|
||
cp ZBYTE,#'@' !CTRL-Zeichen @ ... DEL ?!
|
||
jr ult,TGETE !nein!
|
||
cp ZBYTE,#%7F
|
||
jr ugt,TGET5 !nein!
|
||
and ZBYTE,#NB5 land NB6 !CTRL-Zeichen!
|
||
jr TGETE
|
||
TGET5:
|
||
cp ZBYTE,#%F2 !ALT-Taste ?!
|
||
jr nz,TGET8 !nein!
|
||
|
||
! Umschaltung Zeichensaetze !
|
||
tm STAT1,#B0
|
||
jr z,TGET6
|
||
! Zeichensatz 1 (amerikanisch) !
|
||
and STAT1,#NB0
|
||
ld r4,#HI ZG0
|
||
ld r5,#LO ZG0
|
||
jr TGET7
|
||
! Zeichensatz 2 (Umlaute) !
|
||
TGET6:
|
||
or STAT1,#B0
|
||
ld r4,#HI ZG1
|
||
ld r5,#LO ZG1
|
||
TGET7:
|
||
ldc @rr4,r5
|
||
ld ZBYTE,#%80
|
||
jr TGETE
|
||
|
||
! Behandlung Umlaute !
|
||
TGET8:
|
||
tm STAT1,#B0 !Zeichensatz 2 ?!
|
||
jr z,TGETE !nein!
|
||
tm STAT3,#B0 !CAPS-LOCK-STATUS ein ?!
|
||
jr nz,TGETE !ja!
|
||
cp ZBYTE,#'[' !Zeichen [ ] ?!
|
||
jr ult,TGETE !nein!
|
||
cp ZBYTE,#']'
|
||
jr ugt,TGET9 !nein!
|
||
add r1,#%20 !ZBYTE=ZBYTE+20H!
|
||
jr TGETE
|
||
TGET9:
|
||
cp ZBYTE,#'{' !Zeichen { | } ?!
|
||
jr ult,TGETE !nein!
|
||
cp ZBYTE,#'}'
|
||
jr ugt,TGETE !nein!
|
||
sub r1,#%20 !ZBYTE=ZBYTE-20H!
|
||
jr TGETE
|
||
|
||
! Behandlung Taste mit Vorbyte E0 ... !
|
||
TGETV:
|
||
or ZBYTE,#B7
|
||
cp ZBYTE,#%9C !ENTER ?!
|
||
jr nz,TGETV1 !nein!
|
||
ld r1,#CR
|
||
jr TGETE
|
||
TGETV1:
|
||
cp ZBYTE,#%B5
|
||
jr nz,TGETE
|
||
ld r1,#'/'
|
||
TGETE:
|
||
ld CHAR,r1 !CHAR=ZBYTE!
|
||
and STAT0,#NB4 land NB5
|
||
and STAT3,#NB6 land NB7
|
||
|
||
pop rp
|
||
ret
|
||
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 [89 byte] :=
|
||
[%2B %1B %31 %32 %33 %34 %35 %36 %37 %38 %39 %30 %7E %27 %7F %81
|
||
%71 %77 %65 %72 %74 %7A %75 %69 %6F %70 %5D %2B %0D %09 %61 %73
|
||
%64 %66 %67 %68 %6A %6B %6C %5C %5B %08 %80 %23 %79 %78 %63 %76
|
||
%62 %6E %6D %2C %2E %2D %80 %2A %80 %20 %80 %F2 %F3 %F4 %F1 %80
|
||
%80 %80 %80 %80 %80 %08 %80 %37 %38 %39 %2D %34 %35 %36 %3D %31
|
||
%32 %33 %30 %2C %F0 %80 %3C %80 %80]
|
||
|
||
SHIFT_Tab array [54 byte] :=
|
||
[%2B %1B %21 %22 %40 %24 %25 %26 %2F %28 %29 %3D %3F %60 %7F %81
|
||
%51 %57 %45 %52 %54 %5A %55 %49 %4F %50 %7D %2A %0D %09 %41 %53
|
||
%44 %46 %47 %48 %4A %4B %4C %7C %7B %08 %00 %5E %59 %58 %43 %56
|
||
%42 %4E %4D %3B %3A %5F]
|
||
|
||
|
||
|
||
$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
|