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:

PORTFunktion
00,01für den Floppy Controller
(02..7Febenfalls Floppy Controller, s.u.)
F0 .. F3für die Speicherbankumschaltung
F4als Interruptkontrollport
F5als Roller RAM Basisport
F6hält vertikale Bildschirmposition
F7als Bildschirmfarbport
F8als Universalport
FCals Drucker Daten Port
FDals Drucker Status Port

Erweiterungen

9FKEMPTSTON Joystick
A0 .. A7AMX Mause
D0 .. D4KEMPSTON Mause
D4,D5VORTEX System 2000
E0 .. E8fü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:
SegmentPort
0000-3FFFF0
4000-7FFFF1
8000-BFFFF2
C000-FFFFF3

Für die jeweils 16kByte großen Blöcke ergibt sich:

BlockBedeutungBlockBedeutung
0XBIOS5TPA 4000-7FFF
1Bildschirm6TPA 8000-BFFF
2Bildschirm7COMMON C000-FFFF
3BDOS,BIOS8CCP, Hash Tabellen
4TPA 0000-3FFF9...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:

SpeicherbankF0F1F2Funktion
0808183BIOS, BDOS, Video RAM
1848586TPA
2808883CCP mit Hash Tabellen
38086+x83RAM Disk
x (>2)808182Bildschirm

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:

Bit7Bit6HintergrundSchriftfarbe
00dunkeldunkel
01dunkelhell
10hellhell
11helldunkel

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:

1Booten des JOYCE
7Bildschirm einschalten
8Bildschirm ausschalten
9Disketten Motor einschalten
10Disketten Motor ausschalten
11Ton einschalten
12Ton 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:

BitBedeutung
7Bügelstellung
6Papier
3Seitenanfang

Im Zustand „alles klar" findet man das Bitmuster11000100
Nach einem Zeilenvorschub11001100
Nach einem Seitenvorschub00001100

Weitere Bits siehe in der Beispielroutine für die Ausgabe auf den Port.

1.6 Schnittstellenerweiterung

Die Port haben folgende Bedeutung:

E0SIO Daten Port
E1SIO Kontroll Port
E2CEN Spezial Port
E3CEN Kontroll Port
E4Timer Kanal 0 (Sender Baudrate)
E5Timer Kanal 1 (Empfänger Baudrate)
E6Timer Kanal 2 (CEN Timing)
E7Timer Kontroll Port
E8CEN 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 - 17D0Tastatur ohne Kombination
17D1 - 1821Kombiniert mit SHIFT Taste
1822 - 1872Kombiniert mit ALT Taste
1873 - 18C3Kombiniert mit SHIFT+ALT Tasten
18C4 - 1911Kombiniert mit EXTRA Taste.

Für verschiedene BIOS Versionen gilt:

BIOSStarttabelle
1.41780
1.84848
1.12477E

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