503 lines
10 KiB
ArmAsm
503 lines
10 KiB
ArmAsm
!*******************************************************
|
|
* *
|
|
* 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
|