128er
Tips&Tricks

Tips & Tricks zum C 128

Beachtenswert ist diesmal ein vollwertiges Software-Interface zum Anschluß eines Centronics-Druckers an den C128. Der Kauf eines teuren Hardware-Interfaces erübrigt sich damit.

Besitzen Sie einen Drucker mit parallelem Dateneingang und einen C 128? Und Sie sind der Meinung, daß sich diese beiden im C 128-Modus nicht kombinieren lassen? (Ohne den Kauf eines teuren Hardware-Interfaces natürlich.)

Irrtum! Das Programm »Interface« lenkt sämtliche Druckerausgaben auf den User-Port, an dem es einen Centronics-Port simuliert. Sie benötigen lediglich noch zwei Stecker und ein paar Kabel.

Am besten, Sie tippen das Programm (Listing 1) im C 64-Modus mit Hilfe des MSE ein. Im C 128-Modus laden Sie es dann absolut, das heißt mit »,8,1«.

Nach der Initialisierung mit »SYS 5120« meldet sich das Interface mit seiner Einschaltmeldung. Man hat jetzt zwei Kanäle zur Verfügung:

Um die zusätzlichen Eigenheiten des Interfaces zu nutzen, ist das Steuer-Byte (Adresse 5126) interessant.

Setzt man hier das Bit 2, so wird nach jedem Carriage Return ein Zeilenvorschub (Linefeed) ausgegeben (POKE 5126,4).

Setzt man das Bit 3, so kann man das Interface durch Betätigen der Restore-Taste initialisieren (POKE 5126,8)

Will man beide Funktionen aktivieren, so geschieht dies durch POKE 5126,12.

Ausgeschaltet wird das Interface entweder mit »POKE 5126, PEEK(5126) AND 251« und anschließendem Drücken von RUN/STOP-RESTORE, oder durch »SYS 5123«.

Noch ein Wort zur Codewandlung: Ist die ASCII/DIN-Taste gedrückt, so liefern die Umlaute einen anderen Code. Das Interface berücksichtigt selbständig, ob diese Taste gedrückt ist oder nicht und schaltet gegebenenfalls eine zusätzliche Codewandlung ein.

(Marcus Heinze/tr)
User-Port-PinsNameCentronics-Pins
AGND (Masse)16
BBusy-Flag Datenleitung11
Cd0Bit 02
Dd1Bit 13
Ed2Bit 24
Fd3Bit 35
Hd4Bit 46
Jd5Bit 57
Kd6Bit 68
Ld7Bit 79
MPA2-Strobe1
Stecker:User-Port: TRW 251-12-50-170
Drucker: Amphenol (36polig)
Kabel:Flach- oder Rundkabel, maximal 1,5 Meter Länge
Verkabelungsplan

Flimmerproblem beim C 128 beseitigt

Einigen C 128-Besitzern, die das Programm »80-Zeichen-Grafik« aus der Ausgabe 12/85 abgetippt haben, wird das merkwürdige »kräuseln« am rechten Bildschirmrand unangenehm aufgefallen sein. Um diesen Fehler zu beseitigen, gehen Sie wie folgt vor:

Nach dem Einschalten des Computers ist die Befehlsfolge POKE 54874,25 : ? PEEK (54875) einzugeben. Als Ergebnis gibt es nun zwei Möglichkeiten: Bei der ersten Version des C 128 erscheint eine »64« und bei der zweiten eine »71«. Erscheint die »71«, muß der Basic-Lader der 80-Zeichen-Grafik folgendermaßen geändert werden.

In Zeile 14040 muß die »64« durch »71« und in Zeile 14080 die Zahl »128« durch »135« ersetzt werden. Besitzt jemand nur den Maschinensprache-Teil, so kann er das Programm durch die Befehle: POKE 6752,71: POKE 6789,135 anpassen. Die nötigen Änderungen für das Programm »Doppelte Grafikauflösung« aus der Ausgabe 11/85 sehen dann so aus: POKE 5150,135 : POKE 5158,71.

Es existieren anscheinend zwei Versionen des VDC-8563-Chips. Überprüft man deren Statusanzeige, so kann man feststellen, welche der beiden Versionen vorliegt.

Genau dies wird auch in der Initialisierungs-Routine für den VDC (ab $E179) gemacht. Hier wird die Adresse $D600 gelesen und die Bit 0 bis 2 getestet. Sind diese Bit alle gelöscht, so wird in das VDC-Register 25 eine 64 geschrieben, andernfalls kommt in das Register 25 eine 71.

Will man die hochauflösende Grafik einschalten, so muß im Register 25 das Bit 7 gesetzt und das Bit 6 gelöscht werden. Verändert man hierbei die Bit 0 bis 3, so hat das ein Verschieben des Bildschirms nach links oder rechts zur Folge. Der VDC greift nun auf einen anderen Teil seines Video-RAMs zu, und es kommt somit im Grafik-Modus zu dem bekannten »Kräuseln«.

(P. Guth/ah)
PROGRAMM : INTERFACE 5120 1400 157F
-----------------------------------
1400 : 4C 07 14 4C 13 15 00 78   29
1408 : A9 FF 8D 03 DD AD 02 DD   84
1410 : 09 04 8D 02 DD A9 53 8D   52
1418 : 20 03 A9 14 8D 21 03 A9   E8
1420 : 74 8D 26 03 A9 14 8D 27   05
1428 : 03 A2 00 BD 2A 15 20 D2   A6
1430 : FF E8 C9 00 D0 F5 A9 42   FE
1438 : 8D 18 03 A9 14 8D 19 03   DF
1440 : 58 60 A9 08 2D 06 14 F0   69
1448 : 07 58 20 07 14 6C 00 0A   1D
1450 : 4C 40 FA 20 02 F2 F0 03   00
1458 : 4C 82 F6 20 12 F2 A5 BA   6C
1460 : C9 04 D0 03 4C 71 14 C9   F4
1468 : 05 D0 03 4C 71 14 4C 56   B5
1470 : F1 4C 69 F1 48 A5 9A C9   D0
1478 : 04 D0 03 4C 89 14 C9 05   99
1480 : D0 03 4C EA 14 68 4C 79   EB
1488 : EF 68 20 AA 14 C9 0D F0   AE
1490 : 03 4C EB 14 A9 04 2D 06   B2
1498 : 14 D0 05 A9 0D 4C A7 14   85
14A0 : A9 0A 20 EB 14 A9 0D 4C   2F
14A8 : EB 14 C9 1D D0 02 A9 20   B7
14B0 : C9 80 10 0F C9 41 30 07   15
14B8 : C9 5D 10 03 18 69 20 20   22
14C0 : D1 14 60 C9 C1 30 F8 C9   02
14C8 : DE 10 F4 38 E9 80 4C BF   46
14D0 : 14 48 A5 D3 29 10 D0 02   46
14D8 : 68 60 68 C9 BB 30 07 C9   B0
14E0 : BF 10 03 18 E9 3F 48 4C   BE
14E8 : D8 14 68 C9 22 D0 08 A5   32
14F0 : 11 49 FF 85 11 A9 22 8D   58
14F8 : 01 DD AD 0D DD AD 00 DD   FC
1500 : 29 FB 8D 00 DD 09 04 8D   DC
1508 : 00 DD A9 10 2C 0D DD F0   E8
1510 : FB 18 60 78 A2 F1 A9 4C   37
1518 : 8E 20 03 8D 21 03 A2 79   D1
1520 : A9 EF 8E 26 03 8D 27 03   68
1528 : 58 60 12 0E 31 32 38 20   BD
1530 : C3 45 4E 54 52 4F 4E 49   1F
1538 : 43 53 2D C9 4E 54 45 52   EB
1540 : 46 41 43 45 20 20 20 20   64
1548 : 20 D6 45 52 53 49 4F 4E   C8
1550 : 20 32 2E 30 92 20 28 43   6C
1558 : 29 20 42 59 20 CD 2E C8   08
1560 : 45 49 4E 5A 45 20 31 37   B1
1568 : 2E 31 31 2E 31 39 38 35   69
1570 : 20 49 4E 20 C5 52 4C 41   6F
1578 : 4E 47 45 4E 0D 00 20      6B
Listing 1. Das Maschinenprogramm »Interface 5120« geben Sie am besten im C 64-Modus mit dem MSE ein.
.opt p,oo
*=   $1400
print    = $ffd2
         jmp init	;einschalten des nterfaces = sys 5120
         jmp exit     ;ausschalten des nterfaces = sys 5123
steuer   .byte%00000000 ;
init     sei
         lda #$ff  	; i/o register
         sta $dd03 	; port b auf
         lda $dd02 	; ausgang setzen
         ora #$04  	;
         sta $dd02 	;
         lda #<open  	 ;kanal fuer ausgabe
         sta $0320 	;auf interface
         lda #>open 	;setzen
         sta $0321 	;(ckout vector)
         lda #<output   ;output vector
         sta $0326 	;auf interface
         lda #>output   ;setzen
         sta $0327 	;
         ldx #$00  	;systemmeldung
l00      lda text,x	;
         jsr print	;
         inx 	;
         cmp #$00 	;
         bne l00	;
         lda #<nmistr   ;nmi vector
         sta $0318	;auf interface
         lda #>nmistr   ;setzen
         sta $0319	;
         cli
         rts
nmistr   lda #%00001000
         and steuer
         beq l1
         cli
         jsr init
         jmp ($0a00)
l1       jmp $fa40 	;nmi routine kernal
open     jsr $f202	;sucht logische filenummer ( in x )
         beq opn	;gefunden -> ausgabe setzen
         jmp $f682	; betriebssystemmeldung ausgeben
opn      jsr $f212	;flparam
         lda $ba  	;aktuelles geraet
         cmp #$04       ; =4 "?
         bne l02        ; nein
         jmp l05        ; ja , nummer des ausgabegeraetes setzen
l02      cmp #$05  ; =5 "?
         bne l03        ; nein
         jmp l05        ; ja , nummer des ausgabegeraetes setzen
l03      jmp $f156 	;nummer des ausgabegeraetes setzen
 ; verkuerztes ckout; mit ueberpruefung ob auf bildschirm, usw
l05      jmp $f169 	; nummer des ausgabegeraetes setzen
 ;
output   pha 	;akku retten
         lda $9a 	;aktuelle geraete nummer
         cmp #$04
         bne l06
         jmp prlell
l06      cmp #$05
         bne l09
         jmp druck
l09      pla
         jmp $ef79 	;print
prlell   pla
         jsr codew
         cmp #$0d
         beq l13
         jmp drucke
l13      lda #%00000100  ; auf zusaetzliches
         and steuer          ; line feed pruefen
         bne l15
         lda #$0d
         jmp l14
l15      lda #$0a
         jsr drucke
         lda #$0d
l14      jmp drucke
;
codew    cmp #29	;  cursor right
         bne cw
         lda #32        ; =space
cw       cmp #$80  	; groesser 127 "?
         bpl l16   	;
         cmp #65   	; kleiner "a"
         bmi l17   	;
         cmp #93   	;
         bpl l17   	; groesser"ue"
         clc
         adc #32   	; in kleinschrift wandeln
l17      jsr codew2
         rts
l16      cmp #193	; groesser gross "a"
         bmi l17
         cmp #222  	; s.o.
         bpl l17
         sec
         sbc #128
         jmp l17
codew2   pha 	;akku retten
         lda $d3 	; ascii/din
         and #%00010000   ;umgeschaltet "?
         bne wandel
gewandeltpla
         rts 	;nein;zurueck
 ;wandel pla  	;zurueck
wandel   pla        	;ja;wandeln
         cmp #187
         bmi lr 	; kleiner als 188
         cmp #191
         bpl lr 	; groesser als 190
         clc
         sbc #63
lr       pha
         jmp gewandelt
;
druck    pla
drucke   cmp #$22
         bne lp
         lda $11
         eor #$ff
         sta $11
         lda #$22
lp       sta $dd01	;akku auf bus legen
         lda $dd0d	;output bits loeschen
         lda $dd00	;strobe setzen
         and #$fb 	;
         sta $dd00	;
         ora #$04 	;und wieder
         sta $dd00	;loeschen
;
         lda #$10       ; auf
l07      bit $dd0d	; acknowledge
         beq l07        ; warten
         clc
         rts
exit     sei
         ldx #$f1
         lda #$4c
         stx $0320
         sta $0321
         ldx #$79
         lda #$ef
         stx $0326
         sta $0327
         cli
         rts
text     .byte18,14
         .asc "128 Centronics-Interface     Version 2.0"
         .byte146
         .byte$20
         .asc" ((c) by M.Heinze 17.11.1985 in Erlangen"
         .byte$0d
         .byte00
Listing 2. Der dokumentierte Quellcode zum »Interface 5120«.
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →