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.

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