Die folgende Auflistung von JOYCE (PCW8256, PCW8512) Internas ist entstanden teils aus
eigener Untersuchung teils aus Veröffentlichungen.
Stand: | Dezember 1988 | Werner Cirsovius |
| | 2000 Hamburg 20 |
| | Hohe Weide 44 |
Zu beachten ist, daß die angegebenen BIOS Addressen gültig sind für das BIOS 1.4
1 Hardware Ports
Die folgenden Ports sind beim JOYCE mindestens vorhanden:
PORT | Funktion |
00,01 | für den Floppy Controller |
(02..7F | ebenfalls Floppy Controller, s.u.) |
F0 .. F3 | für die Speicherbankumschaltung |
F4 | als Interruptkontrollport |
F5 | als Roller RAM Basisport |
F6 | hält vertikale Bildschirmposition |
F7 | als Bildschirmfarbport |
F8 | als Universalport |
FC | als Drucker Daten Port |
FD | als Drucker Status Port |
Erweiterungen
9F | KEMPTSTON Joystick |
A0 .. A7 | AMX Mause |
D0 .. D4 | KEMPSTON Mause |
D4,D5 | VORTEX System 2000 |
E0 .. E8 | für die Schnittstellenerweiterung (auch CASCADE Joystick) |
1.1 Floppy Controller
Offensichtlich ist Port 00 das Status Register und Port 1 das Datenregister.
Hierzu sei auf das Datenblatt des Bausteines µP 765 verwiesen.
Zu bemerken ist, daß das Z80 Adressbit A7 auf dem Chip Select Eingang des Controllers gelegt
ist, womit alle Ports im Bereich 00..7F festgelegt sind und nicht zur Verfügung stehen.
1.2 Speicherbankumschaltung
Die Segmentzuordnung ist wie folgt:
Segment | Port |
0000-3FFF | F0 |
4000-7FFF | F1 |
8000-BFFF | F2 |
C000-FFFF | F3 |
Für die jeweils 16kByte großen Blöcke ergibt sich:
Block | Bedeutung | Block | Bedeutung |
0 | XBIOS | 5 | TPA 4000-7FFF |
1 | Bildschirm | 6 | TPA 8000-BFFF |
2 | Bildschirm | 7 | COMMON C000-FFFF |
3 | BDOS,BIOS | 8 | CCP, Hash Tabellen |
4 | TPA 0000-3FFF | 9... | RAM Disk |
Die Ports können gelesen werden und halten dann einen Blockcode.
Der Blockcode ergibt sich aus dem Block+hex 80.
Ebenso kann dieser Code in die entsprechenden Port geschrieben werden:
Speicherbank | F0 | F1 | F2 | Funktion |
0 | 80 | 81 | 83 | BIOS, BDOS, Video RAM |
1 | 84 | 85 | 86 | TPA |
2 | 80 | 88 | 83 | CCP mit Hash Tabellen |
3 | 80 | 86+x | 83 | RAM Disk |
x (>2) | 80 | 81 | 82 | Bildschirm |
Bei allen Funktionen steht im Port F3 der Wert 87 für die COMMON Bank.
1.3 Bildschirmfarbport
Die Bits 7 und 6 des Ports F7 kontrollieren die Bildschirmfarbe:
Bit7 | Bit6 | Hintergrund | Schriftfarbe |
0 | 0 | dunkel | dunkel |
0 | 1 | dunkel | hell |
1 | 0 | hell | hell |
1 | 1 | hell | dunkel |
Zu beachten ist, daß diese Einstellung nur bei abgeschalteten Interrupts gültig ist.
Die Bits 7 und 6 des Ports F7 kontrollieren die Bildschirmfarbe:
1.4 Universalport
Die Daten zum Universalport liegen im Bereich 0 .. 15.
Von diesen 16 Möglichkeiten sind bisher bekannt:
1 | Booten des JOYCE |
7 | Bildschirm einschalten |
8 | Bildschirm ausschalten |
9 | Disketten Motor einschalten |
10 | Disketten Motor ausschalten |
11 | Ton einschalten |
12 | Ton ausschalten |
Als Status kann das Bit 6 des Universalport benutzt werden.
Das gesetzte Bit zeigt an, daß ein Zeilenrücklauf erfolgte.
Ist das Bit nach einen erneuten Lesen immer noch gesetzt, so weist das auf einen Bildrücklauf hin.
Mit dieser Methode kann eine Synchronisation bei Videoausgaben erfolgen.
1.5 Druckerstatusport
Die Bits des Ports FD sind - soweit bekannt - wie folgt definiert:
Bit | Bedeutung |
7 | Bügelstellung |
6 | Papier |
3 | Seitenanfang |
Im Zustand „alles klar" findet man das Bitmuster | 11000100 |
Nach einem Zeilenvorschub | 11001100 |
Nach einem Seitenvorschub | 00001100 |
Weitere Bits siehe in der Beispielroutine für die Ausgabe auf den Port.
1.6 Schnittstellenerweiterung
Die Port haben folgende Bedeutung:
E0 | SIO Daten Port |
E1 | SIO Kontroll Port |
E2 | CEN Spezial Port |
E3 | CEN Kontroll Port |
E4 | Timer Kanal 0 (Sender Baudrate) |
E5 | Timer Kanal 1 (Empfänger Baudrate) |
E6 | Timer Kanal 2 (CEN Timing) |
E7 | Timer Kontroll Port |
E8 | CEN Daten Port |
Die verwendeten Bausteine sind:
Für das SIO: |
Z80 DART, also ein zweifach UART.
Bei der Schnittstellenerweiterung wird das zweite UART für die CENTRONICS Schnittstelle verwendet. |
Für den Timer: |
INTEL 8253, ein dreifach-Timer.
Zwei Kanäle werden für unterschiedliche
Empfangs- und Sende-Baudrate bei der seriellen Schnittstelle verwendet, der dritte Kanal steuert ein Timing für das zweite UART.
|
Für genauere Informationen sei auf die Datenblätter der Bausteine verwiesen..
2 Bildschirmzugriffe
Der Zugriff auf den Bildschirm erfolgt über die Speicherbank 0 und sollte über den XBIOS Aufruf SCR_RUN_ROUTINE erfolgen.
Alternativ kann natürlich auch direkt über den entsprechenden BIOS Aufruf die Bank 0 gewählt werden.
2.1 Die Zeichenmatrix
Viele Darstellungen im JOYCE werden über Tabellen gesteuert, dies gilt ebenso für die Umsetzung der Tastatur in entprechende Werte wie hier für die Umsetzung eines Wertes in ein entsprechendes Zeichen.
Die Definitionstabelle für Zeichen ist zu finden ab Adresse B800. Für die Darstellung eines Zeichens ist eine 8x8 Matrix vorgesehen, also je 8 Byte für ein Zeichen.
Die Tabelle hat deshalb eine Länge von 8x256 also 2kBytes
2.2 Der Bildschirmspeicher
Der Bildschirmspeicher des JOYCE setzt sich zusammen aus Einzelmatrizen wie oben beschrieben.
Bei der Bildschirmgröße des JOYCE ergibt sich damit ein Umfang von 32x90x8 also 23040 Bytes.
Dies sind 32x8 oder 256 Zeilen auf dem Schirm.
Entgegen älteren Implementationen von VIDEO Speichern, bei denen jedes Zeichen einen festen Platz im Speicher hatte, ist die Anordnung im VIDEO Speicher des JOYCE willkürlich.
Allerdings kann wegen der Matrixgröße eines Zeichens von konsistenten Elementen bestehend aus 8 Zeilen eine Zusammenfassung in eben diese Gruppierung vorgenommen werden.
Die Zuordnung der jeweiligen Zeilen zu den realen Speicheradressen wird vorgenommen in einer weitern Tabelle, dem sog. „Roller RAM".
Diese Tabelle hält alle 256 Zeilen als kodierte 16 Bit Adressen.
Somit ist diese Tabelle 512 Bytes lang.
Kodiert sind die Adressen, da sie in Wirklichkeit aus 17 Bit bestehen.
Eine Möglichkeit, eine Gruppe von 8 Zeilen, also einer Textzeile, zu laden, zeigt das folgende Z80 Programm, das im COMMON Speicher liegen muß:
; ENTRY : Register HL zeigt auf 720 Byte Puffer
; Register E beinhaltet die gesuchte Zeile (0..31)
; Register D beinhaltet die gewünschte Laderichtung:
; 0 = Laden aus dem Puffer in das VIDEO RAM
; #0= Laden in den Puffer aus dem VIDEO RAM
; EXIT : Je nach Inhalt von Register D ist der Puffer oder das
; VIDEO RAM gefüllt
;
ROLLER equ 0b600h ; Roller RAM Start Adresse
length equ 720 ; Pufferspeicherbedarf
VIDSTR:
push hl
ld c,d
ld l,e ; Zeilennummer kopieren
ld h,0
add hl,hl ; *16 wegen 8 Zeilen = 16 Adressen
add hl,hl
add hl,hl
add hl,hl
ld de,ROLLER
add hl,de ; Roller RAM Adresse
ld e,(hl)
inc hl
ld d,(hl)
ld a,e
and 0111b
ld l,a
ld a,e
rla
ld e,a
ld a,d
rla
ld d,a
ld a,e
and 11110000b
or l
ld e,a
pop hl ; Puffer laden
ld a,c ; Option testen
cp 0
jr z,noswap
ex de,hl
noswap:
ld bc,length ; Zeile laden/speichern
ldir
ret
3 Tastaturzugriff
Die Zuordnung von Tasten zu einzelnen oder mehreren Werten ist ebenfalls in Tabellen zu finden.
Auch hier gilt das unter Absatz 2 Gesagte.
Entscheidend sein kann ein direkter Tastaturzugriff dann, wenn unabhängig von der Zuordnung z.B. Cursorsteuerungen über die Pfeile der Tastatur erfolgen soll.
Hier interessiert nur die Nummer der Taste, die über die XBIOS Funktion KM_KT_GET erfragt werden kann.
Bei anderen Tasten kann aber die Zuordnung schon von Interesse sein.
3.1 Einzeltasten
Bekanntlich gibt es 81 unterschiedliche Tasten beim JOYCE.
Diese können kombiniert werden mit z.B. der Taste ALT.
Je nach Kombination findet man im Speicher der Bank 0 folgende Tabellen:
1780 - 17D0 | Tastatur ohne Kombination |
17D1 - 1821 | Kombiniert mit SHIFT Taste |
1822 - 1872 | Kombiniert mit ALT Taste |
1873 - 18C3 | Kombiniert mit SHIFT+ALT Tasten |
18C4 - 1911 | Kombiniert mit EXTRA Taste. |
Für verschiedene BIOS Versionen gilt:
BIOS | Starttabelle |
1.4 | 1780 |
1.8 | 4848 |
1.12 | 477E |
Die Zuordnung von Taste „A", Nummer 69 (45 Hex), kombiniert mit Taste ALT findet man demnach in Adresse 1822+45=1867
3.2 Tokens
Die Tastaturabfrage und Umsetzung nach oben genannter Methode kann einen erweiterten Tasten Kode ergeben, nämlich 80 .. 9E.
Ein solcher Kode kann aus mehreren Werten, den Tokens, bestehen.
Um diese(n) Wert(e) zu erhalten, muß in der Token Tabelle gesucht werden.
Diese Tabelle ist dynamisch und hat einen Umfang von etwa 150 Bytes, also ca. 5 Werten pro Taste.
Real sind das jedoch nur 4 Werte, da pro Eintrag ein Byte zur Angabe der Länge benötigt wird.
Die Tabelle (Achtung: BIOS 1.4) beginnt bei 2876 (zu finden in Adresse 290F) und endet bei maximal 290D (in Adresse 2911).
Jeder Eintrag besteht aus der Länge gefolgt von den Zuweisungen.
Für den Erweiterungsstring 8F sieht dann der Eintrag wie folgt aus:
Länge : | 03 |
Werte : | 06 02 02 |
4 Interrupts
Bekanntlich verfügt die JOYCE CPU Z80 über drei unterschiedliche Interruptmodi.
Der JOYCE verwendet den Interruptmodus 1.
Dieser Modus führt die Instruktion RST 38 (Hex FF) aus.
In dieser Adresse 0038 steht ein Sprung auf eine Adresse, die zunächst den Block 0 einblendet.
Danach erfolgt ein indirekter Sprung auf eine Routine, die in der Adresse FEA7 steht, dies ist Adresse 1E40 (im Block 0!).
Eigene Interruptroutinen können dann eingefügt werden durch verbiegen des Wertes in der Adresse FEA7.
Zu beachten ist, daß keine BDOS-, BIOS- oder XBIOS-Aufrufe aus der eigenen Interrupt-Service-Routine erfolgen dürfen.
Eine Bildschirmausgabe ist dann nur über direkten Videozugriff möglich.
(Als gutes Beispiel für eigene Interruptroutinen sei verwiesen auf den Artikel „Immer im Bild - interruptgesteuerte Anzeigen auf dem JOYCE" in JOYCE Sonderheft Nr.3, DMV Verlag).
Als Ergänzung seien hier Beispiele von Ausgaberoutinen für den CEN und den parallene Port im Z80 Code angegeben:
CENTRONICS Port
reset equ 010h
cts equ 020h
dtroff equ 068h
dtron equ 0e8h
wrr5 equ 5
cport equ 0e3h
cenprt equ 0e8h
outcen:
push af ; Byte retten
loop:
call tstcen ; Test BUSY
jr nc,loop
pop af
out (cenprt),a ; Byte ausgeben
ld hl,strobe
ld b,strlen
ld c,cport
di
otir ; Strobe pulsen
ei
ret
tstcen:
ld a,reset
out (cport),a ; Externe Leitungen rücksetzen
in a,(cport) ; BUSY testen
and cts
ret z
scf
ret
strobe: db wrr5,dtron,wrr5,dtroff
strlen equ $-strobe
end
Parallel Port
cport equ 0fdh ; Kontroll Port
parport equ 0fch ; Daten Port
ena equ 00000001b
stat equ 00000010b ; Enable Status
data equ 00000100b ; Enable Daten
stable equ 00000001b ; Test Datn stabil
rdy equ 00000010b ; Fertig zur Ausgabe
any equ 01000000b ; Test ob Daten verfügbar
..off equ -1
outpar:
ex af,af` ; Byte retten
WtRdy:
call tstpar ; Test ob Drucker bereit
or a
jr nz,WtRdy ; .. warten
ex af,af`
ld e,a
ld d,data
call putpar ; Ausgabe auf Drucker
ei
ret
tstpar:
ld bc,parport
di
in a,(c)
ld de,stat*256+0
call putpar ; Status laden
inc c ; .. Port einstellen
WtStab:
in a,(c)
and stable
jr z,WtStab ; Warten bis Port stabil
dec c
in a,(c)
ei
and any ; Status holen
ret z ; .. Daten liegen an
ld a,..off
ret
putpar:
di
ld bc,cport ; Port laden
WtPrep:
in a,(c) ; Byte holen
and rdy
jr nz,WtPrep ; Warten bis fertig
ld bc,ena*256+parport
out (c),d ; .. Synchronisieren
dec b
out (c),e ; .. und Daten ausgeben
ret
end
>> ENDE <<
|