Super Hardcopy für den MPS 802
Ein fantastisches Hardcopy-Programm für den MPS 802. Es druckt genau das aus, was im Moment auf dem Bildschirm zu sehen ist – egal, ob es der Text-Bildschirm oder eine HiRes-Grafik ist.
Obwohl der MPS 802 in der Grundausstattung nicht grafikfähig ist, gibt es seit kurzer Zeit schon Hardcopy-Programme, die einen Grafikausdruck mit diesem Drucker ermöglichen. Viele jedoch sind entweder nur sehr beschränkt anwendbar oder aber teilweise fehlerhaft. Dieses Programm bietet Ihnen folgende Vorzüge:
- Es wird wirklich das aufs Papier gebracht, was sich zur Zeit des Drucks am Bildschirm befindet. Es ist hierbei egal, ob es sich um eine HiRes-Grafik handelt oder um den normalen Textbildschirm.
- Der Beginn des Bildschirmspeichers beziehungsweise des HiRes-Bit-Map wird in jedem Fall vom Programm selbst ermittelt. (Im Speicher befindliche Bilder müssen zuerst auf den Bildschirm gebracht werden.)
- Im Falle einer LowRes-Hardcopy kann durch einfaches Drücken der SHIFT- und COMMODORE-Taste gleichzeitig zwischen Großschrift/Grafik-Modus und Klein/Großschrift-Modus gewählt werden. (Natürlich vor dem Aufruf der Routine.)
- Alle möglichen Parameter gelten sowohl für eine Hardcopy des LowRes- als auch des HiRes-Bildschirms.
- Einen besonderen Leckerbissen bietet das Programm im Erstellen von 4mal so großen HiRes-Hardcopys, ohne daß sich die Proportion im Vergleich zum Bildschirm ändert. Eine normale Hardcopy dieser Art benötigt zirka 15 bis 45 Minuten.
- Ein weiterer Vorteil besteht im Verbinden mehrerer Hardcopybilder, was sowohl längs mit Hilfe des Tabulators geschieht als auch untereinander, da nach beendetem Ausdruck des ersten Bildes kein Zeilenvorschub getätigt wird.
- Die Invertierung des HiRes-Bildes kann oft von Vorteil sein (siehe Bild 1 und 2). Bei Invertierung des LowRes-Bildes ist jedoch Vorsicht geboten, da der Druckknopf und das Fahrband hierbei sehr in Mitleidenschaft gezogen werden.
- Durch ein spezielles Unterprogramm kann auch die HiRes-Bit-Map unter dem ROM gelesen werden, das heißt, daß die HiRes-Bit-Map in jedem Bereich außer zwischen $C000 und $DFFF liegen darf (also auch für die bekannten Befehlserweiterungen wie Simons Basic geeignet!), da sich in diesem Bereich das Programm und der VIC-Steuerchip befinden.


Programmbeschreibung
- Programmierung: Das Programm (Listing 1) ist in 6510 Maschinensprache geschrieben und auf Grund seiner Vielfältigkeit stark in Unterprogramme gegliedert. Im Prinzip besteht es aber aus drei großen Hauptabschnitten, nämlich der normalen Low- beziehungsweise HiRes-Hardcopy sowie der vierfach vergrößerten HiRes-Hardcopy, der wegen ihrer außergewöhnlichen Ausführung ein extra Programmabschnitt zugewiesen worden ist. Einzelheiten hierzu können aus dem kommentierten Assemblerlisting (Listing 2) entnommen werden, das wir Ihnen nicht vorenthalten möchten.
- Ausführungsdaten: Das Programm läuft erwartungsgemäß sehr schnell ab und benötigt für eine einfache HiRes-Hardcopy je nach Größe zwischen einer und fünf Minuten. Eine LowRes-Hardcopy dauert maximal eine Minute. Hingegen braucht der Drucker für eine vierfache HiRes-Hardcopy zwischen 5 und 45 Minuten, weil der Weg, den der Druckkopf zurücklegt, sich vervielfacht.
- Speicheraufteilung: Das als MSE-Listing abgedruckte Programm startet bei $C000 und endet bei $C332. Sollte dieser Bereich bei Ihnen belegt sein, so ändern Sie die Startadresse des Assemblerprogramms und assemblieren es neu.
- Syntax: SYS 49152, Größe, Invertierung, Tabulator
Parameter: a) Größe: 1 = normal (9,5 x 6,2 cm – 320 x 200 einfache Nadelpunkte) 2 = doppelt (19 x 12,4 cm – 320 x 200 vierfache Nadelpunkte) b) Invertierung: 0 = ohne Invertierung
1 = mit Invertierungc) Tabulator: von 0 bis 40 wenn Größe = 1,
fällt weg, wenn Größe = 2 - Verwendung: Das auf Diskette (oder Kassette) durch den MSE abgespeicherte Programm mit LOAD"HC MPS-802",8,1 laden, danach NEW zur Rückstellung der Zeiger eingeben. Sobald Sie das Programm gestartet haben, können Sie es jederzeit mit einem einfachen Druck auf die STOP-Taste unterbrechen, alle geöffneten Kanäle werden ordnungsgemäß wieder geschlossen.
Nun ist der letzte Zweifel über die Grafikfähigkeit des MPS-802 beseitigt. Viel Vergnügen mit Ihrem neuen Hardcopy-Programm!
(R. Sucher/og)PROGRAMM : HC MPS-802 C000 C332 ----------------------------------- C000 : 20 28 C0 E0 03 B0 28 86 E4 C008 : FB 20 28 C0 E0 02 B0 1F 55 C010 : 86 FC A0 00 84 FD A4 FB FF C018 : C0 02 F0 16 20 28 C0 E0 E0 C020 : 29 B0 0C 86 FD 4C 32 C0 02 C028 : 18 20 FD AE 4C 9E B7 4C D7 C030 : 48 B2 AD 02 DD 09 03 8D CA C038 : 02 DD 20 E7 FF A9 04 A2 D0 C040 : 04 A0 00 20 94 C0 A9 05 98 C048 : A2 04 A0 05 20 94 C0 A9 B2 C050 : 06 A2 04 A0 06 20 94 C0 F2 C058 : A2 06 20 C9 FF A9 15 20 20 C060 : D2 FF A9 0D 20 D2 FF 20 17 C068 : CC FF A9 00 85 FE 85 72 E9 C070 : AD 00 DD 49 FF 29 03 18 43 C078 : 6A 6A 6A 85 FF AD 11 D0 B6 C080 : 29 20 C9 20 D0 19 AD 18 EC C088 : D0 29 08 0A 0A 05 FF 85 04 C090 : FF 4C A2 C0 20 BA FF A9 A1 C098 : 00 20 BD FF 4C C0 FF 4C 7B C0A0 : 1E C1 A5 FB C9 02 F0 24 40 C0A8 : A9 00 85 71 20 E1 FF F0 D4 C0B0 : 18 20 92 C1 F0 06 20 EB 4D C0B8 : C1 20 05 C2 20 27 C2 D0 0B C0C0 : EB 20 39 C2 20 46 C2 D0 43 C0C8 : DF 4C 6B C1 A5 FF 48 A5 A7 C0D0 : FE 48 A9 00 85 71 20 E1 85 C0D8 : FF F0 40 20 92 C1 F0 09 70 C0E0 : 20 71 C2 20 EB C1 20 4D 55 C0E8 : C2 20 27 C2 D0 E8 20 39 24 C0F0 : C2 68 85 FE 68 85 FF A9 2D C0F8 : 00 85 71 20 E1 FF F0 1B 33 C100 : 20 92 C1 F0 09 20 9C C2 81 C108 : 20 EB C1 20 4D C2 20 27 4C C110 : C2 D0 E8 20 39 C2 20 46 2F C118 : C2 D0 B1 4C 6B C1 AD 18 E4 C120 : D0 29 F0 4A 4A 05 FF 85 E2 C128 : FF A2 06 20 C9 FF A9 18 71 C130 : 20 D2 FF A9 0D 20 D2 FF 0B C138 : 20 CC FF A2 04 20 C9 FF 7B C140 : A2 19 20 E1 FF F0 24 20 0B C148 : DF C2 A0 00 B1 FE 20 0F 62 C150 : C3 20 D2 FF C8 C0 28 D0 AD C158 : F3 A9 0D 20 D2 FF 98 18 27 C160 : 65 FE 85 FE 90 02 E6 FF 3A C168 : CA D0 D7 20 CC FF A2 06 F8 C170 : 20 C9 FF A9 24 20 D2 FF 38 C178 : A9 0D 20 D2 FF 20 CC FF 3E C180 : A2 06 20 C3 FF A9 05 20 47 C188 : C3 FF A9 04 20 C3 FF 4C EE C190 : E7 FF 78 A9 34 85 01 A9 91 C198 : 00 AA 9D 34 03 E8 E0 08 E6 C1A0 : D0 F8 A9 80 85 02 A0 00 52 C1A8 : B1 FE A2 00 0A 90 0A 48 5F C1B0 : BD 34 03 05 02 9D 34 03 CD C1B8 : 68 E8 E0 08 D0 EE 46 02 6F C1C0 : C8 C0 08 D0 E3 A9 37 85 78 C1C8 : 01 58 A5 FC F0 0F A2 00 10 C1D0 : BD 34 03 49 FF 9D 34 03 55 C1D8 : E8 E0 08 D0 F3 A9 00 AA 2E C1E0 : DD 34 03 D0 05 E8 E0 08 DD C1E8 : D0 F6 60 A2 05 20 C9 FF 18 C1F0 : A0 00 B9 34 03 20 D2 FF 02 C1F8 : C8 C0 08 D0 F5 A9 0D 20 5E C200 : D2 FF 4C CC FF A2 04 20 E4 C208 : C9 FF 18 A5 FD 65 71 AA B2 C210 : F0 08 A9 20 20 D2 FF CA A1 C218 : D0 FA A9 FE 20 D2 FF A9 9B C220 : 8D 20 D2 FF 4C CC FF 18 CD C228 : A5 FE 69 08 85 FE 90 02 3E C230 : E6 FF E6 71 A5 71 C9 28 5B C238 : 60 A2 04 20 C9 FF A9 0D 4C C240 : 20 D2 FF 4C CC FF E6 72 A0 C248 : A5 72 C9 19 60 A2 04 20 27 C250 : C9 FF A9 0E 20 D2 FF A5 29 C258 : 71 AA F0 08 A9 20 20 D2 1D C260 : FF CA D0 FA A9 FE 20 D2 10 C268 : FF A9 8D 20 D2 FF 4C CC 9B C270 : FF 20 D2 C2 A2 00 A9 C0 DF C278 : 85 02 B9 34 03 18 0A 90 2D C280 : 0A 48 A5 02 19 40 03 99 2B C288 : 40 03 68 46 02 46 02 E8 59 C290 : E0 04 D0 E9 C8 C0 08 D0 38 C298 : DB 4C C4 C2 20 D2 C2 A2 0C C2A0 : 00 A9 03 85 02 B9 34 03 AB C2A8 : 18 4A 90 0A 48 A5 02 19 37 C2B0 : 40 03 99 40 03 68 06 02 70 C2B8 : 06 02 E8 E0 04 D0 E9 C8 15 C2C0 : C0 08 D0 DB A0 00 B9 40 A5 C2C8 : 03 99 34 03 C8 C0 08 D0 5A C2D0 : F5 60 A9 00 AA 9D 40 03 FE C2D8 : E8 E0 08 D0 F8 A8 60 A5 EE C2E0 : FD F0 09 A8 A9 20 20 D2 6E C2E8 : FF 88 D0 FA AD 18 D0 29 F0 C2F0 : 02 C9 02 D0 05 A9 11 20 94 C2F8 : D2 FF A5 FB C9 02 D0 05 AD C300 : A9 0E 20 D2 FF A5 FC F0 16 C308 : 05 A9 12 20 D2 FF 60 29 6B C310 : 7F 48 29 20 D0 0A 68 48 91 C318 : 29 40 D0 0C 68 09 40 60 A8 C320 : 68 48 29 40 D0 06 68 60 9E C328 : 68 09 20 60 68 29 3F 09 08 C330 : 80 60 84
10 -.li4,4,0 100 -;****************** 110 -;* hardcopykoenig * 120 -;* fuer mps-802 * 130 -;* (c) 1985 * 140 -;* ralph sucher * 150 -;****************** 1000 -.ba $c000 1005 - jsr ctrl ;parameterkontrolle - groesse 1010 - cpx #$03 ;groesser 2 ? 1015 - bcs illegal ;illegal quantity 1020 - stx $fb ;groesse in $fb 1025 - jsr ctrl 1030 - cpx #$02 ;invers 1035 - bcs illegal 1040 - stx $fc ;nach $fc 1045 - ldy #$00 ;tab=0 1050 - sty $fd 1055 - ldy $fb 1060 - cpy #$02 ;wenn groesse=2 1065 - beq start 1070 - jsr ctrl 1075 - cpx #$29 ;tab. groesser 40 ? 1080 - bcs illegal 1085 - stx $fd ;nach $fd 1090 - jmp start 1095 -ctrl clc 1100 - jsr $aefd 1105 - jmp $b79e 1110 -illegal jmp $b248 1115 -start lda $dd02 1120 - ora #$03 1125 - sta $dd02 ;bits auf ausgabe 1130 - jsr $ffe7 ;close and clear all 1135 - lda #$04 1140 - ldx #$04 1145 - ldy #$00 1150 - jsr open ;open 4,4,0 1155 - lda #$05 1160 - ldx #$04 1165 - ldy #$05 1170 - jsr open ;open 5,4,5 1175 - lda #$06 1180 - ldx #$04 1185 - ldy #$06 1190 - jsr open ;open 6,4,6 1195 - ldx #$06 1200 - jsr $ffc9 1205 - lda #$15 1210 - jsr $ffd2 1215 - lda #$0d 1220 - jsr $ffd2 1225 - jsr $ffcc ;print#6,chr$(21) 1230 - lda #$00 1235 - sta $fe ;low-byte der startadresse 1240 - sta $72 1245 - lda $dd00 1250 - eor #$ff 1255 - and #$03 1260 - clc 1265 - ror 1270 - ror 1275 - ror 1280 - sta $ff ;hi-byte 1.teil 1285 - lda $d011 1290 - and #$20 1295 - cmp #$20 1300 - bne lores ;hires on ? 1305 - lda $d018 1310 - and #$08 1315 - asl 1320 - asl 1325 - ora $ff 1330 - sta $ff ;hi-byte 2.teil 1335 - jmp hires 1340 -open jsr $ffba 1345 - lda #$00 1350 - jsr $ffbd 1355 - jmp $ffc0 1360 -lores jmp lowres 1365 -hires lda $fb ;4-fach ? 1370 - cmp #$02 1375 - beq hires4 1380 -hires1 lda #$00 ;normaler hiresausdruck 1385 - sta $71 ;zeichenzaehler (0-40) 1390 -new jsr $ffe1 ;stop ? 1395 - beq end1 1400 - jsr himode ;umformung der daten 1405 - beq next 1410 - jsr print5 ;print#5,a$ : einlesen 1415 - jsr print1 ;print#4,chr$(254) : und drucken 1420 -next jsr char ;noch ein zeichen ? 1425 - bne new 1430 - jsr carrige ;neue zeile 1435 - jsr line 1440 - bne hires1 ;noch eine zeile ? 1445 -end1 jmp close ;close und end 1450 -hires4 lda $ff ;4-fache hires-hardcopy 1455 - pha ;rettung hi-byte 1460 - lda $fe 1465 - pha ;und low-byte 1470 - lda #$00 ;zeichenzaehler (0-40) 1475 - sta $71 1480 -line1 jsr $ffe1 ;stop ? 1485 - beq end4 1490 - jsr himode ;umformung der daten 1495 - beq next1 1500 - jsr part1 ;dehnung 1.teil 1505 - jsr print5 ;daten einlesen 1510 - jsr print4 ;und drucken 1515 -next1 jsr char ;noch ein zeichen ? 1520 - bne line1 1525 - jsr carrige ;neue zeile 1530 - pla ;low-byte holen 1535 - sta $fe 1540 - pla ;und auch hi-byte 1545 - sta $ff 1550 - lda #$00 ;zeichenzaehler (0-40) 1555 - sta $71 1560 -line2 jsr $ffe1 ;stop ? 1565 - beq end4 1570 - jsr himode ;umformung der daten 1575 - beq next2 1580 - jsr part2 ;dehnung 2.teil 1585 - jsr print5 ;daten einlesen 1590 - jsr print4 ;und drucken 1595 -next2 jsr char ;noch ein zeichen ? 1600 - bne line2 1605 - jsr carrige ;neue zeile 1610 - jsr line 1615 - bne hires4 ;nocheinmal 1620 -end4 jmp close ;close und ende 1625 -lowres lda $d018 ;low-res hardcopy 1630 - and #$f0 1635 - lsr 1640 - lsr 1645 - ora $ff 1650 - sta $ff ;hi-byte 2.teil 1655 - ldx #$06 1660 - jsr $ffc9 1665 - lda #$18 1670 - jsr $ffd2 1675 - lda #$0d 1680 - jsr $ffd2 1685 - jsr $ffcc ;print#6,chr$(24) ! 1690 - ldx #$04 1695 - jsr $ffc9 1700 - ldx #$19 1705 -zeile jsr $ffe1 ;stop ? 1710 - beq close 1715 - jsr lowmode ;druckermodus ? 1720 - ldy #$00 1725 -zeichen lda ($fe),y ;daten lesen 1730 - jsr ascii ;umformen 1735 - jsr $ffd2 ;und drucken 1740 - iny 1745 - cpy #$28 ;noch ein zeichen 1750 - bne zeichen 1755 - lda #$0d ;neue zeile 1760 - jsr $ffd2 1765 - tya 1770 - clc 1775 - adc $fe 1780 - sta $fe 1785 - bcc again 1790 - inc $ff 1795 -again dex 1800 - bne zeile ;noch eine zeile ? 1805 -close jsr $ffcc ;ende 1810 - ldx #$06 1815 - jsr $ffc9 1820 - lda #$24 1825 - jsr $ffd2 1830 - lda #$0d 1835 - jsr $ffd2 ;standartwert 1840 - jsr $ffcc 1845 - ldx #$06 1850 - jsr $ffc3 1855 - lda #$05 1860 - jsr $ffc3 1865 - lda #$04 1870 - jsr $ffc3 1875 - jmp $ffe7 ;close all 1880 -himode sei ;subroutinen 1885 - lda #$34 1890 - sta $01 1895 - lda #$00 1900 - tax 1905 -clear sta $0334,x 1910 - inx 1915 - cpx #$08 1920 - bne clear 1925 - lda #$80 1930 - sta $02 1935 - ldy #$00 1940 -move lda ($fe),y 1945 - ldx #$00 1950 -turn asl 1955 - bcc weiter 1960 - pha 1965 - lda $0334,x 1970 - ora $02 1975 - sta $0334,x 1980 - pla 1985 -weiter inx 1990 - cpx #$08 1995 - bne turn 2000 - lsr $02 2005 - iny 2010 - cpy #$08 2015 - bne move 2020 - lda #$37 2025 - sta $01 2030 - cli 2035 - lda $fc 2040 - beq space 2045 - ldx #00 2050 -revers lda $0334,x 2055 - eor #$ff 2060 - sta $0334,x 2065 - inx 2070 - cpx #08 2075 - bne revers 2080 -space lda #$00 2085 - tax 2090 -zero cmp $0334,x 2095 - bne return 2100 - inx 2105 - cpx #$08 2110 - bne zero 2115 -return rts 2120 -print5 ldx #$05 2125 - jsr $ffc9 2130 - ldy #$00 2135 -print lda $0334,y 2140 - jsr $ffd2 2145 - iny 2150 - cpy #$08 2155 - bne print 2160 - lda #$0d 2165 - jsr $ffd2 2170 - jmp $ffcc 2175 -print1 ldx #$04 2180 - jsr $ffc9 2185 - clc 2190 - lda $fd 2195 - adc $71 2200 - tax 2205 - beq goon 2210 - lda #$20 2215 -goto jsr $ffd2 2220 - dex 2225 - bne goto 2230 -goon lda #$fe 2235 - jsr $ffd2 2240 - lda #$8d 2245 - jsr $ffd2 2250 - jmp $ffcc 2255 -char clc 2260 - lda $fe 2265 - adc #$08 2270 - sta $fe 2275 - bcc help 2280 - inc $ff 2285 -help inc $71 2290 - lda $71 2295 - cmp #$28 2300 - rts 2305 -carrige ldx #$04 2310 - jsr $ffc9 2315 - lda #$0d 2320 - jsr $ffd2 2325 - jmp $ffcc 2330 -line inc $72 2335 - lda $72 2340 - cmp #$19 2345 - rts 2350 -print4 ldx #$04 2355 - jsr $ffc9 2360 - lda #$0e 2365 - jsr $ffd2 2370 - lda $71 2375 - tax 2380 - beq out 2385 - lda #$20 2390 -rueck jsr $ffd2 2395 - dex 2400 - bne rueck 2405 -out lda #$fe 2410 - jsr $ffd2 2415 - lda #$8d 2420 - jsr $ffd2 2425 - jmp $ffcc 2430 -part1 jsr clm 2435 -save1 ldx #$00 2440 - lda #$c0 2445 - sta $02 2450 - lda $0334,y 2455 -neu1 clc 2460 - asl 2465 - bcc old1 2470 - pha 2475 - lda $02 2480 - ora $0340,y 2485 - sta $0340,y 2490 - pla 2495 -old1 lsr $02 2500 - lsr $02 2505 - inx 2510 - cpx #$04 2515 - bne neu1 2520 - iny 2525 - cpy #$08 2530 - bne save1 2535 - jmp change 2540 -part2 jsr clm 2545 -save2 ldx #$00 2550 - lda #$03 2555 - sta $02 2560 - lda $0334,y 2565 -neu2 clc 2570 - lsr 2575 - bcc old2 2580 - pha 2585 - lda $02 2590 - ora $0340,y 2595 - sta $0340,y 2600 - pla 2605 -old2 asl $02 2610 - asl $02 2615 - inx 2620 - cpx #$04 2625 - bne neu2 2630 - iny 2635 - cpy #$08 2640 - bne save2 2645 -change ldy #$00 2650 -chagain lda $0340,y 2655 - sta $0334,y 2660 - iny 2665 - cpy #$08 2670 - bne chagain 2675 - rts 2680 -clm lda #$00 2685 - tax 2690 -clr sta $0340,x 2695 - inx 2700 - cpx #$08 2705 - bne clr 2710 - tay 2715 - rts 2720 -lowmode lda $fd 2725 - beq shift 2730 - tay 2735 - lda #$20 2740 -tab jsr $ffd2 2745 - dey 2750 - bne tab 2755 -shift lda $d018 2760 - and #$02 2765 - cmp #$02 2770 - bne gross 2775 - lda #$11 2780 - jsr $ffd2 2785 -gross lda $fb 2790 - cmp #$02 2795 - bne invers 2800 - lda #$0e 2805 - jsr $ffd2 2810 -invers lda $fc 2815 - beq rts 2820 - lda #$12 2825 - jsr $ffd2 2830 -rts rts 2835 -ascii and #$7f 2840 - pha 2845 - and #$20 2850 - bne cont 2855 - pla 2860 - pha 2865 - and #$40 2870 - bne up1 2875 - pla 2880 - ora #$40 2885 - rts 2890 -cont pla 2895 - pha 2900 - and #$40 2905 - bne up2 2910 - pla 2915 - rts 2920 -up1 pla 2925 - ora #$20 2930 - rts 2935 -up2 pla 2940 - and #$3f 2945 - ora #$80 2950 - rts