887 lines
17 KiB
ArmAsm
887 lines
17 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,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
|