C 64
Hardcopy

Hardcopy mit eingebautem Interface

Ein Programm für alle, die sich noch kein teures Interface leisten wollen, aber trotzdem Hardcopies auf Druckern mit Centronics-Schnittstelle ausdrucken möchten.

Mit diesem Hardcopy-Programm, in das eine Centronics-Schnittstelle integriert ist, ist es nun möglich, Hardcopies ohne teuere Interfaces zu drucken. (Diese Routine ist speziell auf den Star SG-10 abgestimmt. Hinweise für andere Drucker entnehmen Sie bitte dem Text.) Dazu benötigen Sie nur eine Verbindung zwischen User-Port (C 64) und Centronics (Drucker). Diese Verbindung, die nicht länger als 1,5 Meter sein sollte, ist gemäß Bild 1 zu verdrahten.

Das Programm enthält eine Routine zur Ausgabe eines Bytes auf den User-Port. Außerdem ist eine Routine zur Ausgabe längerer Strings auf den Port integriert. Falls Sie diese beiden Unterprogramme selbst benutzen wollen, dürfte es nicht schwierig sein, sie mit Hilfe des dokumentierten Assembler-Listings (Listing 2) zu übernehmen. Das Programm selbst benutzt keine Betriebssystem-Routinen und kann deshalb sogar unter dem ROM arbeiten. Um es dorthin zu bekommen, muß man lediglich die Startadresse im Quelltext (erstellt mit Hypra-Ass) entsprechend ändern. Es wird dann auch mit dieser Adresse angesprungen (SYS adr.).

In der vorliegenden Version, die mit Simons Basic zusammenarbeitet, ist es SYS 28672. Beim Starten muß allerdings die HiRes-Grafik eingeschaltet sein, damit das Programm den Anfang der Bitmap finden kann, andernfalls springt es in das aufrufende Programm zurück.

Das bedeutet im Klartext: Sie müssen sich ein kleines Programm schreiben, das die Grafik auf den Bildschirm bringt und dabei die Hardcopyroutine aufruft.

Bitte geben Sie Listing 1 mit Hilfe des MSE ein und speichern es. Gestartet wird es über SYS 28672.

Wie schon erwähnt, wird der Drucker über ein User-Port/Centronics-Kabel mit dem C 64 verbunden. Die Verschaltung der beiden Stecker entnehmen Sie bitte Bild 1. Beachten Sie, daß die Verbindung nicht länger als maximal 1,5 Meter sein sollte, da sonst Datenverluste auftreten könnten. Falls Sie einen anderen Drucker als den Star SG-10 besitzen, müssen Sie die Einschaltsequenz für Grafikmodus ändern. Diese befindet sich in Zeile 1470 des Source-Listings (Listing 2). Sie wird vor jeder Zeile an den Drucker geschickt. Danach folgen 320 Grafik-Byte. Deshalb muß auch der Zeilenabstand auf 8/72 inch festgelegt werden. Tragen Sie eine entsprechende Sequenz in der Zeile 1480 des Quell-Listings ein. Gegebenenfalls müssen Sie auch die Zeilen 520/530 ändern, falls die neue Bytefolge länger beziehungsweise kürzer ist.

Bildschirmausdruck »Verdrahtungsschema User-Port-Centronics« mit der Zuordnung der User-Port-Pins A bis M zu den Signalen und den Pins des Centronics-Steckers
Bild 1. So verbinden Sie den User-Port mit dem Centronics-Stecker. Die Verbindung sollte nicht länger als maximal 1,5 Meter sein, um eine optimale, das heißt ohne Verluste arbeitende Übertragung zu erreichen.

Benutzen Sie einen anderen Computer als den C 64, so lassen Sie den Teil zum Ausrechnen der Startadresse der Bitmap aus. Dann müssen Sie vor jedem Aufruf die Adresse der Bitmap in NBY+1 und NBY+2 POKEn. Ebenfalls geändert werden muß die Adresse des CIA in den Zeilen 510 und 1500 bis 1600.

(Richard Gresek/dm)
PROGRAMM : CENT'HARDCOPY  7000 7130
-----------------------------------
7000 : AD 18 D0 29 0C 0A 0A 0A   60
7008 : 0A 8D 5A 70 AD 00 DD 4A   64
7010 : 6E 5A 70 4A 6E 5A 70 AD   E8
7018 : 5A 70 49 C0 8D 5A 70 A9   D5
7020 : 00 8D 59 70 AD 11 D0 29   44
7028 : 20 D0 01 60 78 A9 35 85   B1
7030 : 01 A9 FF 8D 03 DD A9 11   9F
7038 : A0 71 8D 02 71 8C FB 70   81
7040 : A9 0E A0 71 20 E3 70 A9   7D
7048 : 19 8D 2C 71 A9 28 8D 2D   CD
7050 : 71 A9 08 8D 2E 71 A0 08   4B
7058 : AD 00 60 A2 01 2A CA D0   A0
7060 : FC 2E 2F 71 EE 59 70 D0   8A
7068 : 03 EE 5A 70 88 D0 E9 EE   1C
7070 : 5C 70 38 AD 59 70 E9 08   99
7078 : 8D 59 70 AD 5A 70 E9 00   54
7080 : 8D 5A 70 EE 62 70 D0 03   27
7088 : EE 63 70 CE 2E 71 D0 C6   5D
7090 : A9 01 8D 5C 70 18 AD 59   DA
7098 : 70 69 08 8D 59 70 AD 5A   F5
70A0 : 70 69 00 8D 5A 70 CE 2D   35
70A8 : 71 D0 A6 A9 0E A0 71 8D   27
70B0 : 02 71 8C FB 70 A9 09 A0   C7
70B8 : 71 20 E3 70 A9 6F 8D 02   91
70C0 : 71 A9 72 8D FB 70 A9 2F   9C
70C8 : 8D 62 70 A0 71 8C 63 70   A0
70D0 : 20 E3 70 A9 0D 20 11 71   2C
70D8 : CE 2C 71 D0 29 A9 37 85   FA
70E0 : 01 58 60 8C EB 70 8D EA   05
70E8 : 70 AD 00 20 20 11 71 EE   61
70F0 : EA 70 D0 03 EE EB 70 AD   12
70F8 : EB 70 C9 41 D0 EB AD EA   AF
7100 : 70 C9 40 30 E4 60 4C 4C   86
7108 : 70 1B 67 05 40 01 1B 41   7B
7110 : 08 8D 01 DD AD 0D DD AD   F1
7118 : 00 DD 29 FB 8D 00 DD 09   33
7120 : 04 8D 00 DD A9 10 2C 0D   8C
7128 : DD F0 FB 60 EA EA EA EA   10
Listing 1. »Cent'Hardcopy« – bitte mit dem MSE eingeben
10   -;++++++++++++++++++++++++++++++++
20   -;+++++                      +++++
30   -;+++++ hardcopy fuer        +++++
40   -;+++++ centronics drucker   +++++
50   -;+++++   (star sg)          +++++
60   -;+++++ am user-port         +++++
70   -;++++++++++++++++++++++++++++++++
80   -;+++++                +++++++++++
90   -;+++++ von            +++++++++++
100  -;+++++ richard gresek +++++++++++
110  -;+++++                +++++++++++
120  -;++++++++++++++++++++++++++++++++
130  -.li1,3
140  -.ba $7000
150  -;
160  -;
170  -;++++++++++++++++++++++++++++++++
180  -;ausrechnen der     +++++++++++++
190  -;startadresse der   +++++++++++++
200  -;bitmap,pruefen     +++++++++++++
210  -;ob graphic ein     +++++++++++++
220  -;++++++++++++++++++++++++++++++++
230  -start     lda $d018      ;bits 12-13
240  -          and #$0c       ;der bitmap
250  -          asl            ;ins hi-byte
260  -          asl
270  -          asl
280  -          asl
290  -          sta nby+2
300  -          lda $dd00      ;bits14-15 aus cia2 holen
310  -          lsr
320  -          ror nby+2      ;ins hi-byte schieben
330  -          lsr
340  -          ror nby+2
350  -          lda nby+2      ;bits 1-2 der cia2 low-aktiv
360  -          eor #$c0       ;deshalb umkehren mit eor #%1100 0000
370  -          sta nby+2      ;und zuruck ins hi-byte des bitmapzeiger
380  -          lda #00
390  -          sta nby+1      ;lo-byte des bitmapzeiger = 0
400  -          lda $d011      ;bit5=1 =>hi-res graphic ein=> ausdrucken
410  -          and #32
420  -          bne begin
430  -          rts            ;bit5=0 >zuruck ins hauptprogramm
440  -;++++++++++++++++++++++++++++++++
450  -;hauptprogramm   ++++++++++++++++
460  -;++++++++++++++++++++++++++++++++
470  -begin     sei            ;interrupt abschalten
480  -          lda #$35       ;ganzes ram bis auf i/o
490  -          sta 01         ;einblenden
500  -          lda #$ff       ;port b cia2 auf augang
510  -          sta $dd03
520  -          lda #<(zeabst+3);endadresse
530  -          ldy #>(zeabst+3)
540  -          sta contl+1
550  -          sty conth+1
560  -          lda #<(zeabst) ;startadresse
570  -          ldy #>(zeabst) ;der bytefolge fuer zeilenabstand 8/72 inch
580  -          jsr strout     ;bytefolge auf parallel-port ausgeben
590  -          lda #25        ;25 zeilen*40 spalten
600  -          sta zeile
610  -zei       lda #40
620  -          sta spalte
630  -spa       lda #8         ;8 byte in jedem kaestchen
640  -          sta byz
650  -by        ldy #8
660  -nby       lda $6000      ;byte aus bitmap holen
670  -loop      ldx #01        ;+++++++++++++++++++++++++++++++++++++++
680  -loo       rol            ;bit nr.x ins carry
690  -          dex
700  -          bne loo        ;+++++++++++++++++++++++++++++++++++++++
710  -st        rol schl       ;carry ins aktuelle byte einfuegen
720  -          inc nby+1      ;+++++++++++++++++++++++++++++++++++++++
730  -          bne we         ;bitmapzeiger erhoehen
740  -          inc nby+2      ;+++++++++++++++++++++++++++++++++++++++
750  -we        dey            ;schon 8 bit zusammen?
760  -          bne nby        ;nein >naechstes byte holen
770  -          inc loop+1     ;naechste bitspalte
780  -          sec
790  -          lda nby+1      ;+++++++++++++++++++++++++++++++++++++++++++++++
800  -          sbc #8         ;bitmapzeiger auf byte nr.1 der naechsten spalte
810  -          sta nby+1      ;setzen
820  -          lda nby+2
830  -          sbc #00
840  -          sta nby+2      ;+++++++++++++++++++++++++++++++++++++++
850  -          inc st+1       ;zeiger auf aktuelles byte im ausgabestring
860  -          bne we1        ;   erhoehen
870  -          inc st+2       ;+++++++++++++++++++++++++++++++++++++++
880  -we1       dec byz        ;alle 8 byte des kaestchens fertig?
890  -          bne by         ;nein=>sprung
900  -          lda #01        ;1.bitspalte der naechsten spalte
910  -          sta loop+1
920  -          clc            ;+++++++++++++++++++++++++++++++++++++++
930  -          lda nby+1      ;bitmapzeiger auf 1.byte der naechsten spalte
940  -          adc #8         ;stellen
950  -          sta nby+1
960  -          lda nby+2
970  -          adc #00
980  -          sta nby+2      ;+++++++++++++++++++++++++++++++++++++++
990  -          dec spalte     ;zeile fertig?
1000 -          bne spa        ;nein >neachste spalte
1010 -          lda #<(zeabst) ;++++++++++++++++++++++++++++++++++++++++
1020 -          ldy #>(zeabst) ;graphic-einschaltsequenz schicken
1030 -          sta contl+1    ;(vor jeder zeile)
1040 -          sty conth+1
1050 -          lda #<(einsch)
1060 -          ldy #>(einsch)
1070 -          jsr strout     ;++++++++++++++++++++++++++++++++++++++++
1080 -          lda #<(schl+$140)
1090 -          sta contl+1    ;zusammengestellte graphiczeile
1100 -          lda #>(schl+$140)
1110 -          sta conth+1    ;auf einmal ausgeben
1120 -          lda #<(schl)
1130 -          sta st+1
1140 -          ldy #>(schl)
1150 -          sty st+2
1160 -          jsr strout     ;+++++++++++++++++++++++++++++++++++++++
1170 -          lda #13        ;return auf drucker schicken (neue zeile)
1180 -          jsr cout
1190 -          dec zeile      ;alle zeilen fertig?
1200 -          bne ze         ;nein>naechste zeile
1210 -          lda #$37       ;basic+kernal einschalten
1220 -          sta 01
1230 -          cli            ;irq zulassen
1240 -          rts
1250 -;++++++++++++++++++++++++++++++++
1260 -;strout-ausgabe eines    ++++++++
1270 -;beliebig langen strings ++++++++
1280 -;auf parallelport        ++++++++
1290 -;                        ++++++++
1300 -;++++++++++++++++++++++++++++++++
1310 -strout    sty lade+2     ;hi-byte der startadr.
1320 -          sta lade+1     ;lo-byte  --"--
1330 -lade      lda $2000      ;byte des string holen
1340 -          jsr cout       ;auf port ausgeben
1350 -          inc lade+1     ;zeiger erhoehen
1360 -          bne we2
1370 -          inc lade+2
1380 -we2       lda lade+2
1390 -conth     cmp #$41       ;hi-byte der akt. adresse=hi-b(endadr.)?
1400 -          bne lade       ;nein >weiter
1410 -          lda lade+1     ;lo-byte der adresse=lo-b(endadr.)?
1420 -contl     cmp #64
1430 -          bmi lade       ;nein >weiter
1440 -          rts            ;zurueck ins hauptprogramm
1450 -ze        jmp zei
1460 -;-----------------------------
1470 -einsch    .by27,103,5,64,1;sequenz zum einschalten des graphicmodus
1480 -zeabst    .by27,65,8     ;zeilenabstand 8/72 inch
1490 -;++++++++++++++++++++++++++++++++
1500 -cout      sta $dd01      ;daten auf leitung
1510 -          lda $dd0d      ;icr loeschen
1520 -          lda $dd00      ;
1530 -          and #$fb       ;pa2 (strobe)-signal
1540 -          sta $dd00
1550 -          ora #04        ;=>zeichen fuer
1560 -          sta $dd00      ;'data auf leitung'
1570 -          lda #$10       ;flag2-busy
1580 -warte     bit $dd0d      ;busy low?
1590 -          beq warte      ;+> nein
1600 -          rts
1610 -;+++++++++++++++++++++++++++++++
1620 -;   variablen       ++++++++++++
1630 -;+++++++++++++++++++++++++++++++
1640 -zeile     nop            ;zeilenzaehler
1650 -spalte    nop            ;spaltenzaehler
1660 -byz       nop            ;bytezaehler fuer jedes kaestchen
1670 -;+++++++++++++++++++++++++++++++
1680 -schl      nop            ;anfang des auszugebenden strings
Listing 2. Das dokumentierte Assembler-Listing der Centronics-Hardcopy
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →