PIO Programmierung KC85

von Ralf Däubner

Hallo…

 

Auf dem Clubtreffen wurde ich gefragt, wie das M001 anzusprechen ist. Ich hatte nur eine kleine Schaltung mit, welche eine 4 Stellige Dezimalanzeige realisiert. Das ganze habe ich mit nur einem PIO-Port realisiert. Mittlerweile gibt es 3(5) Module, wo man einfache Eingaben und oder Ausgaben realisieren kann. Das wären M001 DIO, M008/M021 Joystick (Centronics) und das M066 Sound. Während das letztere vermutlich mehr für Eingaben, dafür ist der darin erhältliche AY ursprünglich gemacht, genutzt wird, können die 2 erstgenannten beides mit gleicher Geschwindigkeit. (Ebenso das M010 ADU für die Eingabe eines Analogsignal und das DAU zur Ausgabe einer Analogspannung.) Das Schalten der Module erfolgt, sofern nötig, in BASIC mittels SWITCH 8,1 , wobei die erste Ziffer den Modulschacht kennzeichnet. Aber in 4er Schritten, dessen Angabe nun in Dezimaler Form erfolgt. Das Grundgerät hat daher die Schächte 8 und 12, die D004 Floppy Disk Basis die Schächte 240 und 244. Analog haben die D002 je nach Adressierung 16, 20, 24 und 28. Also ist zu jedem vorhergehenden Modulschacht 4 dazu zuaddieren. Die Hexadezimalen Angaben auf den Geräten beziehen sich auf den im Einschaltzustand vorhandenen CAOS-Mode, da BASIC nur als Programmiersprache, aber nicht als Bestandteil des Betriebssystem gesehen wird. Im Handbuch zum D002 Busdriver gibt es sogar eine Zeichnung. Dieses zeigt sich nicht nur zur PIO gesprächig, Das Beispiel zeigt auch die Abfrage des ADU.

 

M001:

 

Leider schweigt sich hier das Handbuch doch etwas aus, allerdings gab es in der Mikroprozessortechnik immerhin ein kleines Beispiel für die Eingabe. Hierbei handelt es sich um eine Erweiterung des M001 zu einem Joystick (Spielknüppel) Modul. Ebenso gibt es im Handbuch zur D002 ein Beispiel zur Ausgabe, im dem Fall 2 M001 mit 4 7-Segmentanzeigen.

Der Modul besitzt neben der CTC eine Z80-PIO (U855). Die Adressen der PIO sind 6 und 4 für PORT A sowie 7 und 5 für PORT B. Die Initialisierung erscheint im ersten Augenblick sehr verwirrend, ist aber doch recht einfach.

 

10 OUT 6,207 : OUT 6,0 :rem Initalisierung Bit-Ausgabe.

20 OUT 4,15 : Rem Ausgabe der Zahl 15 an dem PIO-PORT A.

 

Die PORT‘s organisieren sich:

 

DB 0=1

DB 1=2

DB 2=4

DB 3=8

DB 4=16

DB 5=32

DB 6=64

DB 7=128

 

Wobei in dem vorherigen Beispiel die ersten 4 Datenbits auf High geschalten werden. Dieses ist beim Basteln zu beachten. Durch die Interne Schutzschaltung ist es möglich, eine LED direkt mit den Datenbits zu verbinden.

 

Im Beispiel der MP als Joystick-Modul werden die letzten 3 höheren Datenbit zur Erzeugung der 5V herangezogen. Die Initialisierung erfolgt hier mit:

 

10 OUT 6,255: OUT 6,31

20 OUT 4,240

 

Und die Eingabe:

30 KA=NOT(INP(4)and31):PRINT AT(10,10);KA

40 GOTO 30

 

Ebenso ist auch hier ein Assemblerbeispiel mit aufgeführt.

 

Das M008/M021:

 

Dieses besitzt keine Steuerlogik, weshalb der Modul auf eine feste Adresse geschalten ist. Zu dem Modul gibt es einen Centronic-Treiber und einen Joysticktreiber. Somit ist die Funktion im Grunde festgelegt. Unabhängig von diesen Treibern konnte die PIO auch so Abgefragt werden.

 

1 CLS
2 OUT 143,255: OUT 143,31 :REM INIT KANAL B
3 X=INP(141) :REM EINGABE
4 PRINT AT(1,1);X :REM AUSGABE AUF CRT
5 GOTO3

 

Das M066 Sound

 

Kernpunkt dieser Neuentwicklung ist der Soundchip AY, welcher ursprünglich für Spielautomaten entwickelt wurde. Demzufolge gibt es bei diesen auch aus Kostengründen 2 PIO-Ports, allerdings auch nur bei den „großen“. Das ermöglichte neben der Soundausgabe auch die Realisierung eines Joysticks mit 4 Aktionstasten. Was einige Konsolenhersteller nicht davon abhielt, Game-Pads (Sonderform des Joystick) mit 4 Aktionstasten zu bauen.

 

Die Ein bzw Ausgabe wird über den Register 7 geregelt, Intern sind Pull-Up Widerstände, was eben auch ein Schalten gegen Masse bedingt. Somit ist es auch nicht verwunderlich, das als Beispielprogramm eines ist, was den AY etwas ausreizt.

 

10 CLS

11 OUT 56,7: Rem Register 7 setzen

12 OUT 57,190

20 OUT 56,14:rem Register 14(port a) abfragen. Register 15 ist Port B

30 X=INP(56):PRINT AT(0,0);X

40 IF X=254 THEN T1=239:GOSUB 1000

50 IF X=253 THEN T1=213:GOSUB 1000

60 IF X=251 THEN T1=190:GOSUB 1000

70 IF X=247 THEN T1=179:GOSUB 1000

80 IF X=239 THEN T1=159:GOSUB 1000

90 IF X=223 THEN T1=142:GOSUB 1000

100 IF X=191 THEN T1=127:GOSUB 1000

110 IF X=127 THEN T1=119:GOSUB 1000

120 IF X=252 THEN T1=225:GOSUB 1000

130 IF X=249 THEN T1=201:GOSUB 1000

140 IF X=231 THEN T1=169:GOSUB 1000

150 IF X=207 THEN T1=150:GOSUB 1000

160 IF X=159 THEN T1=134:GOSUB 1000

200 GOTO 20

1000 REM SOUND ENGINE

1010 BASE=56

1020 OUT BASE,0

1030 OUT BASE+1,T1:REM TONHOEHE FEIN

1040 OUT BASE,1

1050 OUT BASE+1,0:REM TEILER GROB

1080 OUT BASE,8

1090 OUT BASE+1,16:REM LAUTSTAERKE

1100 OUT BASE,11

1110 OUT BASE+1,50

1120 OUT BASE,12

1130 OUT BASE+1,50

1140 OUT BASE,13

1150 OUT BASE+1,3

2000 RETURN

 

Also im Grunde recht einfach.