P8000/firmware/TERMINAL/p8t.main.s

937 lines
19 KiB
ArmAsm
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

!*******************************************************
* *
* 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