Jürgen Kehrel
Apple-Assembler lernen Band 2: Nutzung besonderer Apple-Eigenschaften
]ürgen Kehrei· Apple-Assembler le...
55 downloads
1401 Views
67MB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
Jürgen Kehrel
Apple-Assembler lernen Band 2: Nutzung besonderer Apple-Eigenschaften
]ürgen Kehrei· Apple-Assembler lernen
Jürgen Kehrel
Apple-Assembler lernen ,Band 2: Nutzung besonderer Apple-Eigenschaften
Dr. Alfred Hüthig Verlag Heidelberg
Dieje nige n Bezeichnungen vo n im Buch genannte n Erzeugnissen , die zugleich ein getragene Warenze ichen sind , wurd en ni cht besonders ken ntlich gemacht. Es kann also aus de m Fe hlen de r Markierung ® nicht geschlossen we rden , daß die Bezeichnung ein freier Waren name ist. Ebe nsowe nig ist zu entnehme n , ob Patente oder Gebrauchsmu sterschu tz vorli egen.
Als Ergänzung zu diesem Buch ist gesondert lieferbar: »Begleitdiskette zu App le-Asse mbl e r lerne n , Bd . 2« ISBN 3-7785-1244-7
CIP- Kurzt ite laufn ahm e der Deutschen Bibliothek
Kehret, Jürgen: A ppl e-Assemb ler lern en / Jürgen Ke hre!. - Heidelberg: Hüthig Bd . 2. Nutzu ng besonderer A pple-E igenschaften. [Hauptbd.J. -1986 . ISBN 3-7785-1170-X © 1986 Dr. A lfred H üthi g Verlag G mbH Heidelberg Printed in Germany Satz, D ruck und Bindung: La ub GmbH, E lztal-Dallau
5
o. Vorwort " Apple-Assembler lernen" ist ein kompletter Kursus über die Assembler-Programmieru ng des 6502 und 65C02 auf dem Apple II . Im ersten Band lernten Sie sämtliche Maschinenbefehle und wichtige Grundalgorithmen. Der Umga ng mit dem Assembler ASSESSOR wurde geübt. Durch den Simulator IDUS, der sich zusammen mit ASSESSOR auf der Begleitdiskette zum ersten Band befindet, konnten Sie sich Ihre Programme in Zeitlupe ansehen und dabei viel durch Anschaulichkeit lernen. Mit diesen Grundkenntnissen sind Sie jetzt in der Lage , komplexere Aufgaben zu lösen. Der zweite Band stellt Programm e und Unterroutinen vor , um fast all e fundamenta len Probleme auf dem Apple in Maschinensprache zu lösen . Im Gegensatz zu den vielen kurzen Lektionen des ersten Bandes werden wir diesmal weit weniger Schritte ausführen. Die einzelnen Beispiele sind dafür aber auch bedeutend komplizierter , denn fast alle Programme dieses Bandes haben für sich eine sinnvolle Nutzanwendung. Wir werden Musik machen , Fenster und Schrift in hoch auflösender Grafik bearbeiten , Textfiles rasend schnell einlesen , die Möglichkeiten des Applesoft durch einen echten Overlay-Manager erweitern und als Krönung der Bemühungen ein Kopierprogramm schreiben , das auf einem 64K-Apple in 32 Sekunden eine Diskette inclusive Formatierung und Verify kopiert . Wie Sie schon gemerkt haben , ist die Assembler-Programmierung keine Beschäftigung, die man durch reines Zusehen lernt. Sie müssen selbst Programme schreiben, wenn Sie diese Sprache beherrschen wollen. Probieren Sie die Beispiele dieses Buches aus. Verändern Sie sie , experimentieren Sie damit , schreiben Sie ähnliche Programme. Wenn Ihre Fertigkeiten steigen , werden Sie Möglichkeiten finden , das eine oder andere Programm noch zu verbessern. Ideen sind nicht nur Eingabe , sie beruhen auch auf Arbeit und Erfahrung. Mit dem Durcharbeiten des ersten Bandes haben Sie Ihr "Freischwimmer-Zeugn is"
6
Vorwort
in Assembler erworben. Nach dem zweiten Band haben Sie den "Fahrtenschwimmer" errungen. Sie sind jetzt in der Lage , sich allein auf den vielen Pfaden der Apple-Assembler-Programmierung zurechtzufinden und vielleicht noch höhere Auszeichnungen zu ernten. Diese zwei Bände sind mit der tatkräftigen Unterstützung meiner Frau Christiane zustande gekommen , die nicht nur viele Fehler aufgespürt und mich darüberhinaus aufgerichtet hat , sondern die über anderthalb Jahre das meist nachmitternächtliche Arbeitsende mit erleiden mußte. Ihr gilt mein besonderer Dank.
Heidelberg, April 1986
Dr. JÜrgenB. Kehrel
7
Inhalt 5
O. Vorwort . . . . . . . . . . . . . . .
1. Eine Scheibe bleibt nicht matt . . . . . . . . . . . . 1.1 Ordnung im Zei lenchaos . . . . . . . 1.2 Der Niedergang der Zeilen . . . . . . 1.3 Der Vorhang fä llt. . . . . . . . . . . . 1.4 Ausdrucksvermögen . . . . . . . . . . 1.5 80 Zeichen : Schalten und Verwalten 2. Blockmalereien . . . . . . . .
2.1 2.2 2.3
. . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . . . . . . . . . . . . . . . . . . .
Aus 1 mach 2, das ist das LORES lxI. . . . . . . . . . . .. Switch softly . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mehr als ei n Regenbogen. . . . . . . . . . . . . . . . . . . .
3. Der kleinkarierte Apfel . . . . . . . . . . . . . . . . . . . . . . . . . . . ..
3.1 3.2 3.3 3.4 3.5 3.6 3.7
Hilfe , wo steht der Punkt . . . . . . . . . . . . . . . . . . . Was wären wir ohne ROM! ........ . .... . Eine Linie verschwindet. . . . . . . . . . . . . ..... . Wiederaufführung ... .. . . ....... . .. . ... .. Eine Tabell e mit Bildern . . . . . . . . . . . . . . . . . . . Punkte werden mobil ........ . . . . . . . . ..... Wir "fensterln " ein wenig .. . ..... .... .. . Zeichnen, ohne gesehen zu werden .... . . . . . . . . . Punkt, Punkt , Komma , Strich .... . .. .. ... .... Der Kopfstand der Bytes .... . ... . ... .... . ..
. . . . .
9 9 12 16 19 29 32 32 33 34 41 41 44 46
49 51 54 61
. . .
85
4. DastecktMUSICdrin . . . . . . . . . . . . . . . . . . . . . . . . . . . . ..
100
3.8 3.9 3.10
72
73
8
Inhalt
5. Der mobile Punkt . . . . . . . . . . . . . . . . . . . 5.1 Mit Geschenkpapier und Schleife: packen . . . . . . . . . . . . . . . . . 5.2 Alles ist fließend . . . . . . . . . . . 5.3 Das Zauberpaket wird entschnürt. 5.4 Sich regen bringt Segen. . . . . . .
. . . . . . . . . . . . .. Einpacken und Aus. .... ....... .. . . . . . . . . . . . . .. ....... ...... . .... ... ... ... .
6. Und immer schön variabel bleiben! . . . . . . . . . . . 6.1 Eine Tabelle ist aller Variablen Anfang 6.2 Wer suchet , derfindet . . . . . . . . . . . 6.3 Hin und her , das fä llt nicht schwer. . . . 6.4 Stühle rücken . . . . . . . . . . . . . . . . 6.5 Etwas Ordnung kann nicht schaden. . .
122 122 127 129 138 146
7. Kleinvieh macht auch Mist. . . . . . . . . . . . . . . . . . . . . . . . . . .. 7.1 Konstantim Wandel . . . . . . . . . . . . . . . . . . . . . .. 7.2 Ein Spürhund für Adressen. . . . . . . . . . . . . . . . . . .
155 155 159
8. Speicher-Recycling = Overlay . . . . . . . . . . . . . . . . . . . . . . . ..
168
9. Blitz-Leser 9.1 Ei ne klein e DOS-Enzyklopädie . . . . . . . . . . . . . .. .
191 202
lO.MehrPROalsCONTRA . . . . . . . . . . . . . 10.1 Gute Kontakte per Schnittstell e . 10.2 Wie spreche ich mit ProDOS? . . 10.3 Wo find ' ich ein Zuhause? . . . .
. . .. .. ..
208 208 222 223
11. Schnell wie der Wind . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 11 .1 Rund und dunkelbraun . . . . . . . . . . . . . . . . . . . .. 11.2 Von halben Bytes und 6&2 . ........ .. . .. . .. . . 11.3 Viele kleine Schalterchen . . . . . . . . . . . . . . . . .. . . 11.4 Das wirbelnde Byte: Byte-Bli zzard . . . .......... .
226 227 230 232 235
Anhänge
269
Stichwortverzeichnis
273
. . . .
. . . .
. . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
106 110 112 118
.. .. .. .. .. ..
. . . .
. . . . . .
106
. . . .
9
1. Eine Scheibe bleibt nicht matt Es gibt nur ganz wenige nützliche Programme , die ohne ein en Dialog mit dem Benutzer auskommen. Dabei steht der Bildschirm als Ausgabemedium an erster Stelle. Ein Programm begrüßt Sie , stellt Ihnen Fragen, macht Ihnen Bedienungsvorsch läge oder teilt Ihnen Fe hl ermeldun ge n mit. Ihre Tastaturein gaben werden normal erweise geechot, damit Sie Ihre Antworten verfo lge n und korrigieren können. Die Qualität ein es Programmes hängt - abgesehen von seinen "inneren" Werten - ganz wesentlich davo n ab , wie erfolgreich es seine Bildschirmausgaben bewälti gt. Wir werden uns deshalb zunächst damit beschäftige n, wie wir gezielt Texte an jede bel iebige Stelle des Bildschirms bringe n können.
1.1 Ordnung im Zeilenchaos Der Apple kann auf seinem Textbildschirm 24 Zeilen (0 - 23) mit je 40 Zeichen (0 - 39) darstellen , also insgesamt 960 Zeichen. Es existi eren zwei Schirmseiten, vo n denen normalerweise nur die Se ite 1 angezeigt und benutzt wird. (Das Wort "Seite" wird hier in einer anderen Bedeutung benutzt als bei dem Wort "Speicherseite" , die 256 Bytes umfaßt.) Im ROM des Apple sind keine Routinen für die Seite 2 vorhanden, so daß ihre Nutzu ng nur durch selbstgeschriebene Assembler-Routinen möglich ist. Da dazu der Aufwand meist größer als der E rfolg ist, führt die Textseite 2 ein Mauerblümchen-Dasein. Jedem Zeichen auf dem Bildschirm entspricht ein Byte im RAM des App le. Die Seite 1 benutzt Speicherstellen von $0400 bis $07 FF, di e Seite 2 von $0800 bis $OBFF. Jedes Zeichen wird durch se inen ASCII (America n Standard Code for Inform ation Interchange )-Wert repräse ntiert. Im Anhang finden Sie eine Tabelle, die Ihnen den Zusamm enhang zwischen ASCII-Code und dargestelltem
10
1. E ine Scheibe bl eibt nicht matt
Zeiche n ze igt. Die Attribu te NORMAL, INVE RS E und FLASH sin d beim Apple abweichend vo n der ASCII-Norm mit in jedes Byte kod iert worde n . Beim Apple IIe und IIc sind fe rne r noch zwei um schaltb are Zeiche nsätze vo rhanden , die bei dem selbe n Code tei lweise andere Bildschirmd arste llungen zur Folge ha be n . A uch hier zeigt Ihne n eine Tabelle im A nh ang die Z usammenhä nge. Die Organisation des Bildschirmspeichers ist beim A ppl e nicht ganz einfac h , auf de n ersten Blick sogar chaotisch. Aufeinanderfolge nde Zeichen innerh alb eine r Zeile stehe n a uch hinterein ande r im RAM. A ufei nande rfo lgende Zeile n stehe n aber leider nicht auch aufeinanderfo lgend im Speicher. Vielme hr wird folgendes Muster verwendet:
Zeile 0 1 2 3 4 5 6 7
Adresse $0400-427 $0480-4A7 $0500-527 $0 580-5A7 $0 600-627 $0 680-6A7 $0700-727 $0780-7A7
Zeile Adresse 8 $0428-44F 9 $04A8-4CF 10 $0528-54F 11 $05A8-5CF 12 $0628-64F 13 $06A8-6CF 14 $0728-74F 15 $07A8-7CF
Seite 1 Seite 2 $LOO $800 $L80 $880 $SOO $900 $580 $980 $600 IAOO $680 $A80 $700 $000 $780 $080 $L28 $828 $LA8 $ 8A8 $528 $928 $5A8 S9A8 $628 $m $6A8 $AA8 $728 ~828 $7A8 $OA8 $850 $LOO S800 $S50 $950 $500 $900 $650 IA50 $600 SAOO 1750 $850 $7 00 $800
sm
Abb. 1: Adress ierung der Textseiten 40Z/Z
Zeile 16 17 18 19 20 21 22 23
Adresse $0450-477 $04DO-4F7 $0550-577 $05DO-5F7 $0650-677 $06DO-6F7 $0750- 777 $07DO-7F7
Scratc h $0478-47F $04F8-4FF $0578-57F $05 F8-5FF $0678-67F $06F8-6FF $0778- 77F $07F8-7FF
1.1 Ordnung im Zei lenchaos
11
Wenn Sie horizontal durch diese Tabelle gehen , so sehen Sie, daß immer 7 Zeilen übersprungen werden. Z u $0400 bis $047F gehören also die Zeilen 0, 8 und 16. Es bleiben 8 Bytes üb rig, die nicht gesehen werden können. Sie sind als sogenannte "Scratchpad"-Stell en (k urzzeitige Zwischenspeicher) den Erweiterungskarten in den Steckleisten (S lots) 1 bis 7 und dem DOS zugeordnet. In ei nigen Asse mbler-Büchern werden Programme vorgestellt, die blitzschnell den Bildschirm löschen, indem der ganze Speicherbereich von $0400 bis $07FF mit Leerzeichen vo llgeschrieben wird. Wundern Sie sich bei solchen "Brutalprogrammen" nicht , wenn hinterher Ihr DOS nicht mehr richtig läuft. Um Text a uf den Bildschirm zu schreiben , müssen Sie die ASCII-Werte der Zeichen in die passenden Speicherstell en schreiben. Im Monitor des Apple existiert eine Routine BASCALC ($FBCl) , die die Anfangsadresse jeder Zei le berechnet, wenn ihr beim Aufruf im Akk umulator die Zei lennummer übergeben wird. Das Ergebnis wird in den Zero-Page-Speicherstellen BASL und BASH ($0028 und $0029) abgelegt. Durch die in direkte indizierte Adressierung mit dem Y-Register können Sie dann auf jedes Byte der Zeile zugreifen: STA (BASL) ,Y mit Y = 0 ... $27.
BASCALC $FBCl Berechnet Basisadresse einer Textzei le (Fenster werden nicht berücksichtigt) E ingabe: Akk u = Bildschirmzeile Ausgabe: BASL ($0028) = Basisadresse Lo BASH ($0029) = Basisadresse Hi
Die Benutzung vo n BASCALC ist recht bequem, für manche Fälle aber zu la ngsam . Dann müssen Sie mit Tabell en arbeiten. Bei unseren HIRES-Programmen we rden Sie ein Beisp iel für diese Techn ik finden.
1. Eine Scheibe bleibt nicht matt
12
1.2 Der Niedergang der Zeilen Scho n von BASIC aus werden Sie das Textfenster kennengelernt haben. D ie Größe des Fensters wird durch die Werte in den Speicherstellen $0020 bis $0023 bestimmt.
$0020 = WNDLFT = lin ker Rand ($00-$27) $0021 = WNDWDTH = Fe nsterbre ite ($00-$28) WNDLFT + WNDWDTH TEXT STROUT *01 SPEED DOSWRM
; Lo-Byte ;Hi-Byte ;Str ing ausgeben ;zurücksetzen
ASC 'Text mit Appl esoft' HEX 00 ; Ende-Kennung
Jede der hier vorgestellten Routin en hat ihre Vor- und Nachtei le. Welche Sie im konkreten Fall anwenden, hängt zum Te il von den Anforde rungen des Programms ab, ist aber auch Ihrer freien Entscheidung (= Geschmack?) unterworfen . Ich persön lich benutze am häufigsten "PRINTI" .
29
1.5 80 Zeichen: Schalten und Verwalten Professionelle Programme verl ange n in der Regel nach einer Textausga be mit 80 Zeichen pro Zeile. Beim alten Apple II + ist dies nur mit einer Z usa tzkarte zu erreichen. Am verbreitetsten ist das VIDEX-System, das einen eigenen Bildschirmspeicher besitzt. Nähere Informationen zum Aufbau des VIDEX-B ildschi rms finden Sie im Peeker Nr. 1/2 vo n 1985 ab Seite 42 . De r Apple IIe benötigt eine andere Zusatzkarte , die im Hc bereits fest eingeba ut ist. Die Hä lfte de r Daten fi ndet sich dabei an den se iben Speicherstell en wie bei der 40-ZeichenDarstell ung: von $0400 bis $07FF. Die andere Hä lfte befindet sich auf den se lben Ad resse n des Zusatzspeichers (AUX-Memory) der E rwe ite rungskarte. Da beide Speicherbereiche den se lben Adressraum belegen , muß zwischen ihnen hin- un d hergeschaltet werden. Dies wird von de r Anzeigeelektro ni k automatisch vo rgenom men. Die Spalten mit un gerader Numm er liege n im Ha uptspeicher (Mai n) , die Spalten mit gerader Num me r im Zusatzspeicher (AUX). AU X MAI N AUX MA IN AUX MAIN AUX MA lM AUX MAIN AUX $00 $00 $01 $01 $0 2 $02 $03 $03 $01. $01. $05
-
$01.00
A P
P
L
$01.80
A S
S
E M B
$0500
L
E
R N
E N
$0580
B
A N D
2
E
L
E
R
Abb. 2: Ad ressierun g der 80Z/Z Textseite
Um Daten direk t auf den 80-Zeichen -Schirm zu speichern oder zu lesen, müsse n Sie zu nächst den Softswitch 80STOREON ($C001) betätigen, in dem Sie irgendein en beli ebige n Wert dorthin speichern (STA $C001) . Wenn 80STORE auf diese Weise angeschaltet wurde , wird mit den Softswitches LOWSCR ($C054) lind HISCR ($C055) nicht mehr zwischen den Textseiten 1 lind 2 hin- lind
1. Eine Scheibe bl eibt nicht matt
30
hergeschaltet , sondern zwischen dem Haupt- und dem Erweiterungsspeicher der 80-Zeichenkarte. ungerade Spalten bearbeiten LDA UOO STA 80STOREO N ($C001) STA LOWSCR ($C054)
gerade Spal ten bearbeiten LDA UOO STA 80STOREON($C001) STA HI SCR ($C055)
80STORE wird wieder abgeschaltet durch das Schreiben nach 80STOREOFF ($COOO). Achtung: Di ese Adresse ist identisch mit der Tastaturad resse. Wenn Sie aus di eser Adresse lesen (z.B. LDA , BIT) , erhalten Sie die Tastat urinform ation. Wenn Sie in diese Adresse schreiben (z.B. STA) , schalten Sie 80STORE ab. Wenn Sie nur einfac h Texte über COUT auf den 80-Zeichen-Schi rm ausgeben wollen , brauchen Sie sich um die Softswitches ni cht zu kümmern . Sie müssen led iglich das Zusatz-ROM im Adressbereich von $C300-$C3FF einschalten durch ein "JSR $C300". COUT funkti oni ert dann automatisch auch mit der 80-Zeichenkarte, und Sie können unsere Druckroutinen PRINTI bis PRINTI benutze n. Ein Schönhei tsfehler ist allerd in gs dabei: der horizo ntale Tabulator funktioniert nicht richtig, da die 80-Zeichenkarte den horizonta len Cursorwert nicht bei $0025 so ndern bei $057B in einem der Scratchpad-Bytes verwa ltet. Erfreulicherweise tut auch die VIDEX-Karte dies, so daß das folgende Programm sowohl mit der VIDEX-Karte als auch mit de r Apple-Karte läuft .
PRINT DEMO 80Z/Z 1 2 3 4 5 6 7 8 9 10 11
12 13 14 15 16 17 18 19
;******************** PRINT DEMO 80Z/Z * ;******************** App1e IIe/e oder VIDEX 80 Zeiehenkarte in Slot 3 ORG $300 PTR HORZ DOSWRM CH BASIC I NT TAB V COUT SETINV SETNORM
EQU EQU EQU EQU EQU EQU EQU EQU EQU
$0006 $0008 $03DO $057B $C300 $FB5B $FDED $FE80 $FE84
31
1.5 80 Zeichen: Schalten un d Verwalten 0300: 0302: 0304 : 0307: 030A: 030B: 030D: 030F': 03 11 : 0313: 0315:
A9 85 20 20 18 A5 69 85 C9 90 4C
00 08 00 C3 18 03
20 21 22 23 24 08 25 OD 26 08 27 42 28 F'2 29 DO 03 30 31 0318 : A9 05 32 03 1A: A6 08 33 031C: 20 57 03 34 031F': CE CF' D2 35 36 0329: A9 07 032B: A6 08 37 032D: 20 54 03 38 0330: CA C5 D4 39 033C: 20 84 F'E 40 41 033F': A9 09 0341: A6 08 42 0343: 20 57 03 43 0346 : D7 C9 C5 44 45 0353: 60 46 0354: 20 80 F'E 47 0357: 8E 7B 05 48 035A: 20 5B F'B 49 035D: 68 50 51 035E: 85 06 0360: 68 52 0361: 85 07 53 54 0363: AO 00 0365: E6 06 55 0367: DO 02 56 0369: E6 07 57 036B: BI 06 58 036D : 48 59 60 036E: 09 80 0370: 20 ED F'D 61 0373: 68 62 0374: 30 EF' 63 64 0376: A5 07 0378: 48 65 0379: A5 06 66 037B: 48 67 037C: 60 68
DEM07 DM
DM2
PRINT8I PRINT8
PR8 PR8A
; ini tialisieren
LDA STA J SR JSR CLC LDA ADC STA CMP BLT JMP
*00 HORZ BASICINT DM2
LDA LDX JSR DCI LDA LDX JSR DCI JSR LDA LDX JSR DCI RTS
;Cursor vert. *5 ;Cursor horz. HORZ PRINT8 "NORMAL UND "
;80Z/Z ei n
HORZ *13 HORZ *66 DM DOSWRM
1f7
HORZ PRINT8I "JETZT INVERS" SETNORM *9 HORZ PRINT8 IOWIEDER NORMAL "
JSR SETINV STX CH JSR TABV PLA STA PTR PLA STA PTR+l LDY *00 INC PTR BNE PR8A I NC PTR+l LDA (PTR), Y PHA ORA U80 JSR COUT PLA BMI PR8 LDA PTR+l PHA LDA PTR PHA RTS
; Inversmaske ; Cursor horz. ;Cursor vert. ;Returnadresse ;vom Stack ;und speichern ;initia1 s ieren ;nächstes Z. ;Übertrag? ;JA ;Zeichen laden ;V orze ichen merken ;Bit 7 setze n ;ausgeben ;Vorzeichen holen ;Positiv a ls Ende ; Rü cksprungadresse ;auf den ;Stack schieben ;anspr in gen
32
2. Blockmalereien Neben der Textdarstellung besitzt de r Apple di e Fä higke it, Grafiken in nied riger und hoher Auflösung anzuzeigen. Die niedrigauflöse nde Grafi k (LORES) erfre ut sich nu r mäßiger Beliebtheit, obwo hl sie immerhin über 16 Farben verfü gt und einfach zu programmieren ist. Wenn Sie fa rbige Rechtecke darstellen müssen, gibt es zu LORES keine Alternative . Der Nachteil von LORES ist se in e grobe bl ockartige Struktur , da di e Anzeige aus 1920 kleinen Rechtecken besteht , die in 48 Reihen zu je 40 Spalten angeordn et sind .
2.1 Aus 1 mach 2, das ist das LO RES Ix1 Die LO RES-Grafik belegt den se lbe n Speicherpl atz wie die Textse iten. Es gibt ebenfa lls zwei anzeigbare LO RES-Se iten: LORESI beginnt bei $0400 und endet mit $07FF, wä hrend LORES2 den Speicher vo n $0800 bis $OBFF beansprucht. Zu jedem Byte gehören 2 überein ander liegende Rechtecke, deren Farbe un abhängig voneinander wählbar ist. Die Orga ni sati on des LORES-Bildschirms entspricht dem der Textseite, wenn Sie sich vorstellen, daß jede Textzeile horizo ntal in zwei Grafikzeilen gespalten ist. Zu Textzeile 0 gehören die Grafikzeilen 0 und 1, zu Textzeile 1 gehören die Grafikzeil en 2 und 3 usw. Jedes Speicherbyte besteht aus 2 Nibb les. In der hexadezima len Schreibweise sind sie mit den beiden Ziffe rn der HEX-Zahl identisch. $F6 besteht aus dem Nibble $F und dem Nibbl e $6 . Das linke Nibble bestimmt di e Farbe der unge radzahligen Grafikzeilen (= unten), das rechte Nibble ist für di e geradzahligen Zeil en (= oben) da. E in Nibbl e kann die 16 Werte von $0 bis $F ann ehm en. Ihn en entsprechen die 16 darstellbaren Fa rben.
2.2 Switch softly
33
LORES Farbtabelle
Wert Farbe
Wert Farbe
$0 $1 $2 $3 $4 $5 $6 $7
$8 $9 $A $B $C $D $E $F
Schwarz Fuchsinrot Dunkelblau Purpur Dunkelgrün Grau 1 Blau Hellblau
Braun Orange Grau 2 Rosa He llgrün Gelb Aquamari n Weiß
Die Farbbezeichnungen sind so von der Firma Apple angegeben worden. Die tatsächlichen Farben auf Ihrem Monitor kö nnen davon abwe ichen. Das Byte $6D wü rde demnach ein gelbes Rechteck über einem blauen ze igen.
$6 0
$00
$01/ $02 $ 03 o I 10 10 10 $OLOO hi 6 hi hi 10 10 10 10 _ .. _ .. $OLBO _hi.... -- hi .. ....hi _- - -_hi.... 10 .. -_ 10 .... .. .... 10 .. - ....10_.... $05 00 - -h--i hi hi hi
SOL $05 $06 $07 $OB . -10- .. --10 - .. - -10--- - -10---- 10 ~
~
hi hi 10 10 .. ........ hi hi 10 -_10.. .. hi hi ..
..
•
0 .
hi 10 hi 10 hi
S09 $OA 10 10 hi hi hi hi 10 _JQ ._ 10 _.19 ___ hi hi hi hi 10 10 10 _JQ_ hi hi hi hi
Abb . 3: Ad ressierung der LORES-Seite 1
2.2 Switch softly Bereits beim Textbildsch irm haben wir kennengelernt , daß die Anze ige des Apple durch ein ige Speicherstellen gesteuert wird , die "Softswitches" genannt werden. Wenn wir die 80-Zeichen-Karte des He und Hc einmal außer acht lassen , gibt es fo lgende Möglichkeiten:
34
2. Blockmalereien
Schalter
Fun kti on
$C050 TXTCLR $C051 TXTSET
Schaltet Grafik ein Schaltet Text ein
$C052 MIXCLR $C053 MIXSET
Nur Text oder Grafik Grafik mit 4 Zeilen Text
*
$C054 LOWSCR Seite 1 von Grafik oder Text Se ite 2 von Grafik oder Text $C055 HISCR $C056 LORES $C057 HIRES
ni edriga uflöse nde G rafik hochauflösende Grafik
*
*
* D iese Zustände sind nur sichtbar , wenn TXTCLR betätigt wird. Sie können die Schalter stellen, indem Sie entweder aus der Speicherstelle lesen oder in di ese schreiben. Durch die Befeh lsfo lge
LDA TXTCLR LDA MIXCLR LDA LOWSCR LDA LORES wird die Anzeige des gesamten LORES-Grafikschirms der Seite 1 ausgewählt. Es kommt dabei nicht auf die Reih enfolge an, in der die Schalter betätigt werden!
2.3 Mehr als ein Regenbogen Die von Applesoft benutzten Routinen für das Zeichen vo n LORES-Grafik sind Bestandteil des Monitors . Wir können sie von einem Assemb ler-Programm aus sehr einfach mitbenutzen. Sie funktionieren allerdings nur für die LORES-Seite l. Das fo lgende Demonstrationsprogramm setzt zunächst den LORES-Grafikschirm mit 4 Textzeilen am unteren Rand durch den Aufruf von SETGR ($FB40). Dies funktioniert allerdings nur , wenn vorher der Textbildschirm
2.3 Mehr als ein Regenbogen
35
angeschaltet war. Wo llen Sie auch von HGR nach LORES umschalten , müssen Sie di e Applesoft-Routine GR ($F390) benutzen.
SETGR $Fß40 Schaltet um auf Grafik und gem ischte Darstellung. Das Textfenster wird geöffn et, der obere Teil gelöscht, wenn es sich um LORES handelt. E ingabe: A usgabe: Y-Reg = $FF , BASLIH zeigt auf Zeile $17 COLOR = $00 gesetzt
GR $F390 Schaltet auf LORES-Grafik und gem ischte Darstellung. Textfenste r geöffnet, Curso r in der letzten Zeile, LORES-Farbe Schwarz ak tiv. E ingabe: A usga be: Y-Reg = $FF, BASLIH zeigt auf Zei le $17 COLOR = $00
Als nächstes werden 16 horizontale Linien in allen Farben gezeichneL Zum Setzen einer Farbe wird deren N umm er in den Akk umul ator geladen und dann SETCOL ($F864) aufgerufen. Hori zonta le Linien werden entsprechend dem BASIC-Befehl HLIN XL ,XR AT Y durch HLINE ($F819) gezogen, wobei die Koo rdin ate n im Y-Register (XL), der Zero-Page-Adresse H2 ($002C) (XR) und im Akk umul ator (Y) überge ben werden.
2. Blockmalereien
36
SETCOL $F864 Setzt die LORES-Farbe Eingabe: Akku = Farbnummer ($0 ... $F) Ausgabe: COLOR ($0030) gesetzt
HLINE $F819 Zeichnet horizontale Linie von XLinks nach XRechts in der Zeile Y. Eingabe: COLOR gesetzt , Y-Reg
= XL , H2 ($003C) = XR , Akku = Y
Ausgabe: -
Um den Bildschirm mit vertikalen Linien zu füllen, benutzt das Demo-Programm die Routine VLINE ($F828). Dies geschieht in einer Schleife, der das Y-Register als Laufvariable dient. Da die Farbwerte nur zwischen $00 und $OF liegen dürfen, wird mit einem "AND $OF" das obere Nibble ausgeblendet.
VLINE $F828 Zeichnet vertikale Linie von YOben bis YUnten in der Spa lte X. Eingabe: COLOR gesetzt , Akk u
= YO , V2 ($002D) = YU,
Y-Reg
=X
Ausgabe: -
Darunter kann dann der Benutzer eine Doppellinie eingeben , indem jeder Tastendruck als ASCII-Zeichen direkt in den LORES-Speicher geschrieben und damit sichtbar wird. Die Routine CLRTOP ($F836) löscht die oberen 40 LORES-Zeilen , läßt aber den Text intakt. Mit CLRSCR ($F832) können Sie den ganzen LORES-Schirm löschen , wenn Sie den Softswitch $C052 vorher betätigen. Bei der gem ischten Darstell ung fü llt sich das Textfenster mit in verse n @.
2.3 Mehr als ein R egenbogen
37
CLRTOP $F836 Löscht die oberen 40 Zei len de r LORES-Grafik 1. E ingabe : Ausgabe: Y-Reg = $FF, Akku = $27 , COLOR = $00
CLRSCR $F832 Löscht a lle 48 Zeilen der LORES-Grafik 1. E in gabe: A usgabe: Y-Reg = $FF, Akku = $2F, CO LOR = $00
CLRSC2 $F838 Löscht Y Z e il en der LORES-Grafik 1. E ingabe : Y-Reg = Zah l der zu lösche nde n Zei le n (von oben). A usgabe: Y-Reg = $ FF, Akku = Zei le nza hl , COLOR = $00
D en Absch luß des Demoprogramms bildet eine kleine B lockgrafik, di e Punkt für Punkt gesetzt wird. Die Koordinaten li egen in ein e r Tabelle und werden mit PLOT ($F800) um gesetzt.
PLOT $F800 Zeich net einen Punkt X ,Y in der Farbe COLO R. E ingabe: COLOR gesetzt , Akku Ausgabe: -
= Y , Y-Reg = X
2. Blockmalereien
38
LORES 1 2 3 4 5 6 7 8 9 10 11
0803: 20 40 F'B
0806: 0808: 0809: 080C: 080 E: 08 10: 0812: 0813: 08 16: 08 17 :
0819 08 1B 081C 08 1E 0821 0823 0825 0827 082A 082B
A2 8A 20 AO A9 85 8A 20 CA 10
AO 98 29 20 A9 85 A9 20 88 10
OF' 64 F8 00 27 2C 19 F8 EF
27 OF 64 F8 25 2D 10 28 F8 EE
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
;******************************* Lo-Res Beisp i elprogramm * ( C) 1986 Dr. Jürgen Kehrel * ;******************************* H2 V2
EQU $002C EQU $002D
KBD STROBE
EQU $COOO EQU $COIO
PLOT HLINE VLINE CLRSCR CLRTOP SETCOL SETGR
EQU EQU EQU EQU EQU EQU EQU
$F'800 $F'8 19 $F'828 $F'832 $F'836 $F'864 $F'B40
ORG $0803 START
J SR SETGR
;Grafik ein
16 horz. Lini en in a ll en Farben LOOP
LDX TXA JSR LDY LDA STA TXA JSR DEX BPL
UOF
;Beginn "Weiß"
SETCO L 41'$00 41'$27 H2
;Farbe ; X-Links ;X-Rechts ;Y-Wert
HLINE LOOP
Den Bildschirm mit vert. · Linien füllen LOOPI
LDY TYA AND JSR LDA STA LDA JSR DEY BPL
41'$27
;X-Wert
UOF SETCO L 41'$25
;ausblenden ;Y-Unten
V2
41'$10 VLINE
;Y-Oben
LOOPI
Eine "Zei l e " vom Benutzer eingeben l assen
2.3 Me hr als ein Rege nbogen
082D : 082F: 0832: 0834 : 0837: 083A: 083B: 083D:
083F: 0842: 0844: 0847: 0849: 084C: 084E: 084F: 0850: 085 3 : 0856 : 0857:
A2 AD 10 8D 9D E8 EO 90
20 A9 20 A2 BD FO A8 E8 BD 20 E8 DO
00 00 CO FB 10 CO DO 05 28 FO
36 F8 OF 64 F8 00 5A 08 OB
02 02 04 07 07 OA 09 OC OC OE OD 14 11 11 12 19 16 19 lC 16 16 18 17 17 IB IB
LOOP2
5A 08 00 F8 FO
06 OA OC 07 OB OA 06 06 OA 06 09 06 07 OB OC 06 08 OB 09 11 15 17 14 11 11 15
02 02 05 07 08 OA 08 OC OC OF OD 13 11 11 13 18 17 18 ID 16 16 19 19 IB IB
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
LDX LDA BPL STA STA 1NX CPX BLT
#$00 KBD LOOP2 STROBE $05DO,X #$28 LOOP2
Schirm löschen, Bild aufbauen
LOOP3
72
0859: 60
085A: 0862 : 086A: 086 E: 0876: 087E: 0886: 088A: 0892: 089A: 08A2: 08AA: 08B2: 08BA: 08C2: 08C8: 08DO: 08D8: 08EO: 08E6 08EE 08F6 08FE 0906 0908 0910
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
39
ENDE
JSR LDA JSR LDX LDA BEQ TAY 1NX LDA JSR 1NX BNE
;Weiß ; init. ;X-Wert
TAB , X PLOT
;Y-Wert
LOOP3
RTS
; Tabelle X, Y. TAB
CLRTOP #$OF SETCOL #$00 TAB , X ENDE
HEX HEX HEX HEX HEX HEX HEX HEX HEX HEX HEX HEX HEX HEX HEX HEX HEX HEX HEX HEX HEX HEX HEX HEX HEX HEX
(max. 254 Werte) 0206020702080209 020A020B020C030C 040C050C ;L 070707080709070A 070B080C090COAOB OAOAOA090A080A07 09060806 ;0 OC060C070C080C09 OCOAOCOBOCOCOD06 OE060F070F080E09 OD090DOAOEOBOFOC ;R 1406130612061106 110711081109110A 110BII0C12091309 120C130C140C :E 1906180617061607 160817091809190A 190B180C170C160C ;S lC091D091E09 ;1611161216131614 1615161616171717 181719161915 1814 1714191319121811 1711 ;B IBIIIB121B131B14 16151B161B17 :1
40
2. Block malereien
09 16: 091E : 0926: 092A: 0932: 093A: 0942: 094A:
10 10 IF 24 22 22 25 00
11 15 17 11 13 17 15
10 10 20 23 22 23 25
108 109 110 111 112 113 114 115
HEX HEX HEX HEX HEX HEX HEX HEX
1011101210131014 10151016 10171E17 ;L IFl72017 24 11231122112212 2213221422152216 22 172317241725 16 25 15251425132512 ; 0 ; ENOE 00
Zwei weitere LORES-Routinen haben wir nicht be nötigt:
NEXTCOL $F85F E rhöht die COLOR-Numme r um 3. Ei ngabe: Ausgabe: COLOR-Maske in beiden Nibbles um 3 erhö ht
SCRN $F871 Bestimmt die Farbe eines LORES-Pun ktes X,Y. Eingabe: Akku
= Y , Y-Reg = X
Ausgabe: A kku = Farbnummer des Punktes
41
3. Der kleinkarierte Apfel Der Monitor enthält keine Routinen für die hochaufl ösende Grafik des Apple, so daß wirfür unsere nächsten Versuche fast aussch ließlich auf den Applesoft-Interpreter angewiesen sind. Ein Listing ist von Apple nie veröffentli cht worden , aber freie Autoren haben dies nachgeholt , indem sie den Maschinencode von $DOOO bis $F7FF ana lysierten. In bezug auf die HIRES-Routinen sind alle App lesoft-Interpreter - vom Apple IIplus bis zum He - identisch, so daß die hier aufgeli steten Informationen als "sicher" gelten können. Wir wollen in diesem Buch nicht über die theoretischen und programmierpraktischen Prinzipien der Interpreter-Routinen reden, da all ein die Theorie über das Ziehen einer Diagona len auf einer Rasterseite ein paar Buchseiten füllt . Stattdessen werden wir lernen, die Routinen mit den richtigen Parametern aufzurufen und so alle Applesoft-Befehle auch von der Assemb ler-Ebe ne auszuführen .
3.1 Hilfe, wo steht der Punkt Die hochauflösende Grafik benutzt einen anderen Speicherbereich als di e Textoder LORES-Anzeige. HIRES 1 (HGRl) belegt $2000 bis $3FFF und HlRES 2 (HGR2) benötigt die Speicherplätze von $4000 bis $5FFF für sich. Die hochauflösende Grafik nutzt also zwei RAM-B löcke von je 8 KByte, die heute mitten im Hauptspeicher liegen. Vor einigen Jahren hatte der App le nur 16K RAM, und da lag die Grafik ganz oben. Der Speicher ist heute auf 128K gewachsen, aber da die ROM-Routinen noch immer die selben geblieben sind, müssen wir jetzt unsere Programme um die HIRES-Grafik herumschreiben. Wenn Sie di e Organisation des Textbi ldschirms schon kompliziert fanden, dann werden Sie beim HIRES-Schirm vielleicht ein verzweifeltes Läche ln aufsetzen. Bei näherem Hinsehen sind aber viele Parallelen zum Textbildschirm zu finden , so daß wir auch die HIRES "in den Griff bekommen" .
3. Der kleinkarierte Apfel
42
Der Apple hat ein e Auflösun g vo n 280 * 192 Punkten. Mit der doppelthochauflöse nden Grafik des IIc und des He mit 64k-Karte sind daneben noch 560 * 192 Punkte mögli ch. Wir werden an di eser Stelle aber auf die Doub le-HIRES ni cht weiter eingehen. In der Zeitschrift "Peekel''' sind ei nige Aufsä tze über DoubleHIRES erschienen. Um zu DHGR zu kommen, müssen Sie die fol ge nden Softswitches betätigen: STA STA STA STA STA STA
$C050 $C052 $C057 $COOl $COOD $C05E
TXTCLR MIXCLR HIRES SOSTORE SOCO L DHIRESON
STA C05F DHIRESOFF
Wenn Sie die 192 Punkte , die von 0 bis 191 (= $00 - $BF) gezählt werden , in Gruppen zu je 8 Zeilen aufteilen, erh alten Sie 24 Gruppen. Diese entsprechen den 24 Zeilen des Textbi ldschirms . Wenn Sie die jeweils oberste Lini e als "Grundlini e" beze ichn en, so fo lgen die 7 nächsten Lini en jewe il s mit einer um $0400 höheren Adresse im Speicher (siehe Abb. 4). Während beim LORES aus einer Textzeile zwei Grafikzeilen werden , di e durch die beiden Nibble jedes Bytes adressiert werden, spaltet sich bei der HIRES-Grafik jede Gruppe in 8 Grafikzei len auf, die alle ihre eige nen Speicherplätze besitze n. ________________
~-N~_~~~~~~OO~O~~~_N~~~~~~~~OO~O~~~_N~_~~~ ~~oooooooooooooO
$2000
~
$2060 ~
$2100
$2180
$2200 $2280 $2300 $ 2380 $2028 $20A8 $1128 $21A8
""-..1 11 ""-..1
p.,
1\
1\
1\
-
-
$2000
$noo
$ 2800 $2COO $ 3000 $ 3LOO $ 3800 $ 3COO
S2228
$22A8 $2318 $23A8 $2OS0 $ 2000 $2J1j0
$ 2100 $ 2150 $ 2200 $2350 $ 2300
Abb. 4: Adress ie run g der hochaufl öse nden Grafikseite 1
~NNNNNNN
3.1 Hilfe , wo steht der Punkt
43
Wenn Sie sich jetzt die Gruppen als Textzei len, die die Adresse der Grund linie der Gruppe tragen, vorste llen, so haben Sie den Rest der Orga nisation schon begriffe n. Die Grundlini en lassen sich wiederum in 3 Blöcke unterteil en. Zu Block 1 gehören die Zeilen $00 bis $3F, zu Block 2 di e Zei len $40 bis $7F und zu Block 3 die Zeilen $80 bis $BF. Diese sind den drei Blöcken der Textse ite vergleichbar (siehe Abb. 1). Di e Ze ilen $00, $40 und $80 sind die Grundlini en der Blöcke. Ihre Startadressen si nd $2000, $2028 und $2050 ($4000, $4028 und $4050 für HGR2). Der Abstand vo n $28 Bytes en tspricht ge nau dem Absta nd der Textze ilen 0, 8 und 16, die die Startlin ie n der Textblöcke sind . Die Grundlini en der Gruppen innerhalb eines Blocks sind rege lmäß ig angeordnet und gegenein ander um $80 Bytes versetzt , genau wi e die Textzeilen innerhalb eines Blocks. Die Analogie zum Textbildschirm ge ht so weit, daß auch beim HIRES-Schirm Scratch-Bytes ex istieren. Nur sin d es hi er achtm al so vie le , in sgesamt also 512 Bytes, die nicht angeze igt werden. Sie liegen jeweils "a m Ende" der Zei len im dritten (u nteren) Block . Im norm alen Grafik-B etrieb werde n sie nicht benutzt, stehen uns also als Zwischenspeicher zur Verfügung. Manche Autoren benutzen sie, um zeitweise nicht sichtbare Grafik-Obj ekte dort zu .,parken". Di ese Speicherung ist ni cht dauerhaft , da jeder HG R-B efehl bzw. sein Asse mbler-G egenstü ck auch diese unsichtbaren Bytes mit löscht. Die Scratdl-Bytes sind auch dafür vera ntwortlich, daß Sie ein HGR-Bild nur bis $3FF8 bzw. $5FF8 abzuspeichern brauche n. Ohne Informationsve rlust benötigt das Binärfile un te r DOS 3.3 dann nur noch 33 und nicht mehr 34 Sektoren. Einen Aspekt habe n wir bisher ni cht berücksichtigt : wie liegen die Punkte einer Zeile im Speicher? Zu nächst einmal die gute Nachricht: zu jeder Zeile gehören 40 Bytes , die hin tereinander im Speicher angeordnet sind. Das entspricht dem Textbil dschirm . Zu jedem Punkt auf de m Bil dsch irm gehört 1 Bit im Speicher. E in Punkt ist auf dem Bildsch irm sichtbar (an), wenn das zuge hörige Bit gesetzt (1) ist. Und jetzt die zwei schl echten Nachrichten: 1. Von jedem Byte werden nur die unteren 7 Bits angezeigt. Das Bit 7 (das 8. Bit! ) wird benutzt, um die Fa rbe der übrigen 7 Bits festzulegen. So kommt auch di e horizo ntale Auflös ung von 7 * 40 = 280 Punkte zusta nde. 2. Die Bitnummern im Speicher und auf dem Bildschirm sind genau um gekehrt angeordnet . Während Bit 0 im Speicher ga nz rechts steht. findet sich der zugehörige Punkt ga nz lin ks auf dem Bi ldschirm .
44
3. Der kl einkarierte Apfel
Abb. 5: Zuo rdnung VOll Bitmuster und Bildschirmpunkten
3.2 Was wären wir ohne ROM! Werfen Sie nicht gleich das Handtuch, wen n Sie die HIRES-Organisation nicht sofort verstanden haben. All e notwendigen Funktionen , um jeden HIRESPunkt setzen oder löschen zu können , sind fertig im ROM vorhanden. Zu diesen Routinen gehört ein Satz von Zero-Page-Variablen , die viele Parameter festlegen:
Byte
Funktion
$lA SHAPEL $lB SHAPEH $lCHCOLORl
Lo-Byte des Shapeanfangs Hi-Byte des Shapeanfangs aktive Farbmaske
$26 GBASL $27 GBASH
Lo-Grundadresse einer Grafikzeile Hi-Grundadresse einer Grafikzeile
$30HMASK
Bitmaske für einen Punkt
$EO XOL $El XOH $E2 YO
Lo-Byte der horizontalen Koordinate (XLo) Hi-Byte der horizontalen Koordinate (XHi) vertika le Koordinate (Y)
$E4HCOLORZ $E5HNDX $E6HPAG $E7 SCALEZ $E8 SHAPEPNT $E9 --$EA COLCOUNT
Farbmaske des HCOLOR-Befehls horizontaler Offset (= welches Byte der Zeile) Seitenanzeige ($20 = HGRl, $40 = HGR2) Skalierungsfaktor für Shapes Lo-Byte Zeiger auf Shape-Table-Anfang Hi-Byte Zeiger auf Shape-Table-Anfang Kollisionszähler
3.2 Was wären wir o hne ROM!
45
U m die HGR-Seiten a nzuze igen , müssen Sie ein paar Softswitches betätigen. Die Reihenfolge ist wiederum un erheb lich .
HI RES Seite 1 (HGR1) LDA LDA LDA LDA
TXT CLR MIXCLR LOWSCR HIRES
HIRES Seite 2 (HGR2) LDA LDA LDA LDA
TXTCLR MIXCLR HI SCR HIRES
In beiden Fällen wird der volle Grafik-Schirm ei ngeschaltet. Du rch MIXSET anstelle von MIXCLR können Sie wie bei der LORES-Grafik unte n 4 Textzeile n einbl e nden. Bei HGRI gehören diese zu TEXTI , bei HGR2 zu TEXT2! Dieser "gepokete" Aufruf löscht die vorhandene Grafik nicht. We nn Sie die Grafikse iten mit Löschen aufrufe n wo llen, benutze n Sie die App lesoft-Funktio nen HGR ($F3E2) bzw. HGR2 ($F3D8). HGR setzt die Softswitches für HGRI und gemischten Schirm. Nach HPAG wird $20 geschrieben und die Farbe HCOLORZ wi rd auf $00 (Schwa rz) gesetzt. Der Bere ich vo n $2000 bis $3FFF wird a uf Nu ll gesetzt. HGR2 führt dasse lbe für die zweite Seite aus, nur daß diesmal auf den volle n G rafikschirm geschaltet wird . Wo lle n Sie auc h die Seite 1 ganz sehen, so müssen Sie
JSR HGR STA MIXCLR ausführen.
HGR $F3E2 Wählt HGRl , gemischter Schirm. Löscht den Schirm . Eingabe: Ausgabe: HP AG
= $20,
HCOLORI
= $00
HGR2 $F3D8 Wählt HGR2 , voller Sch irm. Löscht den Schirm. E inga be: A usga be : HPAG
= $40, HCOLORI = $00
46
3. Der kle inka rierte Apfe l
Sie kö nne n die Löschro utine auch separat aufrufe n über HCLR ($F3F2). D urch eine n spätere n E instieg bei BKGND ($F3F6) ist es möglich , den Bildschirm in der gewünschten Farbe e inzufä rben .
HCLR $F3F2 Löscht de n a ktive n HIR ES-Schi rm. E inga be : HPAG = $20 für HGR1 , $40 für HGR2 A usgabe: HCOLOR = $00
BKGND $F3F6 Färbt a kti ve n HIRES-Schirm ein . E inga be : HPAG = $20 für HGR1, $40 für HGR2 HCO LOR1 = gew ünschter Farbcode A usgabe: -
3.3 Eine Linie verschwindet Z ur Fa rbenpracht de r H IRES-Grafik habe ich mich bisher ausgeschwiegen. D as hat seinen guten G rund . Der A ppl e ke nnt 8 Farben. Vier davo n sind paa rweise gle ich : Weiß1 und Weiß2 sowie Schwarz1 und Schwa rz2 . So mit ble iben 6 unterscheidbare Farbe n. Nicht jeder Pun kt ka nn abe r alle 6 Farben ann ehme n. W ie so häufig be i der A pple-Grafik liegen die Verhältnisse ko mplizierte r. Jedes Bit ka nn in e iner vo n zwei Farben erscheine n. D iese Farb en sin d Vio lett oder Bl au , wenn der P un kt eine gerade Spalte nnummer besitzt. Bei e in er ungeraden Spaltennumme r beste ht d ie A uswa hl aus Gr ün und Ora nge. D ie Farben Vio lett und Grün erscheinen , we nn das Farbbit (= B it 7) des Bytes nicht gesetzt (0) ist . Bei gesetzte m Farbbit (1) se hen wir Blau und O range. Eine Zeile beste ht also
3.3 Ei ne Linie verschwindet
47
immer abwechselnd aus violetten und grünen sowie aus blauen und ora nge n Punkten. Nehmen wir zunächst an, das Fa rbbit sei ge löscht. Wenn Sie den Punkt in Spalte oanschalten, erscheint er Violett. Ein Punkt in Spa lte 1 wird Grün wiedergegeben . Wenn Sie gleichzeiti g sowo hl den Pun kt in Spa lte 0 als auch den in Spalte 1 ansch alten , ve rschmelzen diese zu ei ner kurzen horizonta len Linie. die Weiß erschei nt. Allgemein gilt , daß zwe i benachbarte Pu nkte zusammen weiß ergeben. Wenn Sie eine violette Linie zeichnen wo llen, dürfen Sie also nur die Punkte in den geraden Spalten einschalten . Das ist leichter gesagt als getan. Da 7 Punkte zu einem Byte gehören, wechse lt die Anfangsfarbe von Byte zu Byte. Die geradza hligen Bytes beginnen mit Violett, die ungeradza hli ge n dagegen mit Grün. Eine grüne Lini e beginnt mit fo lgendem Pun ktem uster: VGVGVGV
*
*
*
VGVGVGV
GVGVGVG
*
*
*
*
*
*
*
daraus ergeben sich die folgenden Speicherbytes:
o
0 1 0 1 0 1 0 $2A
0101010 1 $55
o
0 1 0 1 0 1 0 $2A
Wie Sie sehen , sind die Bytes nicht identi sch. Das mittlere Byte muß einmal nach rechts ges hiftet (LSR) werden, um den Wert seiner Nachbarn zu erhalten. Wenn Sie das Farb bit unberücksichtigt lasse n, können Sie die beiden Formen durch einfaches Invertieren in ei nander überführen (EOR $7F). Wenn wir die Zeichenroutin en des Applesoft benutzen , wird die Verschiebung vom Programm berechnet . Dies ist auch der Grund für die vielen Bit- und Bytemasken auf der Zero-Page. Da es für jeweils 7 Pun kte nur ein Farbbit gibt , ist die Farbauswahl noch weiter eingeschränkt. So kann es z.B. keine grüne und orange Linie im gleichen Byte geben. Dies Prob lem betrifft beso nders verti kale Linien . Versuchen Sie einm al fo lgendes kurze BASIC-Programm: FARBTEST 10 REM Farbtest 20 HGR2 HCOLOR= 1: REM Grün 30 HPLOT 1 ,0 TO 1 ,19 1 40 GET A$: REM Tastendruck 50 HCOLOR= 5: REM Orange 60 HPLOT 5 ,0 TO 5 , 191 70 GET A$: REM Tastendruck 80 HPLOT 8,0 TO 8,191 90 GET A$: TEXT END
Zunächst wird eine vertikale grün e Linie gezeichn et. Dann fo lgt nach einem Tastendruck daneben eine orange Li ni e. Wenn Sie einen Fa rbm onitor besitzen,
48
3. Der kleinkarierte Apfel
können Sie erkennen , daß dabei die grüne Linie auch orange wird. Besitzer von Schwarz/Weiß-Monitoren kön nen bei gena uem Hinsehen erkenn en, daß die erste Lini e ein klein wenig nach rechts rutscht. Nach einem erneuten Tastendruck sollte eine weitere vertikale Lin ie erscheinen. Sie werden aber vergebli ch auf sie warten: die Linie bleibt verschwunden. Für die erste grüne Linie mußte das jeweilige Farbbit gelöscht sein. Die orange Lin ie benötigt dagegen ein gesetztes Farbbit. Da die Spalten 1 und 5 zum selben Byte gehören, wurde damit auch für die erste Lin ie das Farbbit gesetzt: sie wurde orange. Die dritte Lin ie haben wir in einer geradzahli gen Spalte gezeichnet. Dort sind aber nur die Farben Blau und Vio lett sichtbar. Unsere orange Linie bleibt im Verborgenen. Die gewünschte Farbe eines Punktes oder einer Linie wi rd durch die Speicherste Il e HCOLORZ ($00E4) bestimmt. Um dort das richtige Bitmuster zu setzen , benutzen wir die Routine SETHCOL ($F6EC). Die Farbnum mer wird im X-Register übergeben. Liegt der Wert über 7, wi rd ein "Illegal Quantity Error" ausgegeben. Wenn Sie möchten , können Sie HCOLORZ auch direkt mit einem Farbcode setzen.
HCOLOR Index HCOLOR Farbcode
Farbe
0 1 2 3 4 5 6 7
Schwarz 1 Grü n Vio lett Weiß 1 Schwarz 2 Ora nge Blau Weiß2
$00 $2A $55 $7F $80 $AA $D5 $FF
00000000 00101010 01010101 01111111 10000000 10101010 11010101 11111111
3.4 Wiederaufführung
49
SETHCOL $F6EC Setzt Colo rm as ke für Fa rben 1 bis 7 E ingabe: X-Reg = HCOLOR (1.. 7) Ausgabe: HCOLORZ = Farbcode
3.4 Wiederaufführung Für das Zeichnen von Punkten und einfache n Linienfolgen wollen wir uns noch einmal das Programm "BEISPIEL NR. 3B" auf Seite 18 des ersten Bandes ansehen. Dort wird zunächst di e zweite HIRES-Seite aufgerufe n und ge löscht. Anschließend wird die Farbe Blau direkt gesetzt. Zum Zeichnen von Punkte n und Linien gibt es in A pplesoft nur einen Befehl: HPLOT. In Asse mbl er müssen wir dagegen zwei Routinen benutzen : HPLOT ($F457) und HGLIN ($F53A) . HPLOT setzt einen einzigen Punkt. HGLIN zie ht eine Verbindungsline vom letzten gesetzten Punkt zu ein e m angegebenen E ndpunkt. Das bedeutet, daß vo r dem A ufruf vo n HGLIN wen igste ns einm al auch HPLOT a ufgerufe n werden mußte , da mit ein A nfangsp unkt ex istie rt. Verschiedene HGLIN-Aufrufe können a nschli eßend a nein a nde rge reiht werde n. Unser Beispielprogramm zeichne t ein Rechteck, inde m zunächst ein Eckpunkt mit HPLOT festge legt wird. Von ihm aus werden dann die vie r Seiten gezogen.
50
3. Der kleinkarierte Apfel
HPLOT $F457 Setzt einen Punkt X,Y
Eingabe: HP AG = $20 oder $40, HCOLORZ gesetzt Akku = Y, X-Reg = XLo, Y-Reg = XHi Ausgabe: HCOLORI = Farbmaske GBASLIH ze igt auf Startadresse der zu X, Y ge hörenden Zeile XOLlH, YO Koordinate von X,Y HMASK = Bitmaske , Y-Reg = HNDX = Spaltenindex
HGLIN $F53A
Zieht eine Verbindungslinie zwischen zwei Punkten Eingabe: XOLIH = X-Koordinate des 1. Punktes YO = Y-Koordinate des 1. Punktes HP AG = $20 oder $40 HCOLORZ richtig gesetzt Akku = XLo des 2. Punktes, X-Reg = XHi des 2. Punktes Y-Reg = Y des 2. Punktes Ausgabe: HPAG und HCOLORZ unverändert , HCOLORI gesetzt XOLIH und YO = Koordinaten des 2. Punktes GBASLIH = Startadresse der zu letzt bearbeiteten Ze ile HNDX = Spaltenindex des Endpunktes
Wenn Sie die Zero-Page-Variablen setze n wollen, ohne ein en sichtbaren Punkt zu zeichnen , können Sie das mit HPOS ($F411) tun und damit den (unsichtb aren) HIRES-Cursor positionieren. Mit HFIND ($F5CB) können Sie die internen Cursor-Daten wieder in X- und Y-Werte zurückrechnen.
3.5 E ine Tabelle mit Bilde rn
51
HPOS $F411 Berechnet di e interne n HIRES-Cursor-Werte E ingabe: HP AG = $20 oder $40 , HCOLORZ gesetzt Akku = Y , X-Reg = XLo, Y-Reg = XHi A usgabe: Akku = HCOLORI = Farbmaske GBASLIH zeigt a uf Startad resse de r zu X,Y gehö rende n Zei le XOLlH, YO Koordinaten von X ,Y HMASK = B itmaske , Y-Reg = HNDX = Spaltenindex
HFIND $FSCB Berechnet X,Y aus den internen Cursordaten E inga be: HBASLIH = Zeilenadresse HNDX = Spalten index HMASK = Bitmaske Ausgabe: XOLlXOH = X-Koordinate YO = Y-Koordinate
3.5 Eine Tabelle mit Bildern Einen le tzte n Punkt ha ben wir noch nicht besproche n: die Benutzung von Shapes (Formtabellen) . Vo n Basic aus können Sie durch .,DRA W I AT X ,Y" ganze Linienfolgen auf den HIRES-Schirm bringen. Dazu müssen Sie vorher eine Shapetabelle a nlegen , deren A ufbau im Applesoft-Handbuch beschrieben ist. Sie können diese Technik auch in Asse mbler nutzen. Der BASIC-Befehl "XDRA W" ist ebenfa ll s vor ha nden .
S2
3. Der kleinkarierte Apfel
Sowohl DRA W ($F601) als a uch XDRA W ($F6SD) we rde n in identische r Weise aufge rufe n. Z un ächst muß mit HPOS der interne Cursor auf den Startpunkt der Shape-Zeichnung gesetzt werden. Die Speicherstelle SCALEZ ($00E7) muß gesetzt und der Akk umul ato r mit dem Rotationswert geladen werden. Im X- und Y-Register sind die Startadresse der Shapedefinition (ni cht der Shapetabelle!!) zu übergeben.
DRAW $F601 Zeichnet ein Shape durch OR-Verknüpfung mit de m H intergrund . E inga be: Interne Cursord aten gesetzt (durch HPOS) X-Reg = Lo-Byte des Shapeanfangs Y-Reg = Hi-Byte des Shapea nfa ngs Akku = Rotationswert , SCALEZ = Ska lie run gsfaktor Ausgabe : COLCOUNT = $00 , wenn keine Ko llision mit gesetzten Bits so nst COLCOUNT = Za hl der Ko llisio ne n
XDRAW $F65D Zeichnet ein Shape durch XOR (= EOR)-Verkn üpfung mit dem Hintergrund . E ingabe: Interne Cursordaten gesetzt (durch HPOS) X-Reg = Lo-Byte des Shapea nfa ngs Y-Reg = Hi-Byte des Shapeanfangs Akku = Rotationswert , SCALEZ = Ska li erun gsfakto r A usgabe: COLCOUNT = $00 , wenn keine Ko llision mit gesetzte n Bits sonst COLCOUNT = Zah l der Kollisionen
Di e Routinen DRA W und XDRA W habe n den Nachteil, daß Sie imme r die Anfangsadresse des gewünschte n Shapes wissen müssen . Bei langen Shape-Ta-
3.S Eine Tabelle mit Bildern
S3
bellen müssen Sie dann einen langen Merkzette l auf Ihrem Tisch liege n haben. Viel wahrscheinlicher ist, daß Sie den Beginn der Shape-Tabelle wissen und die Nummer des Shapes in der Tabell e. Im Applesoft-ROM ex istiert zwar ein e Routine , die die Adresse eines Shapes berechnet, wir können sie aber nicht nutze n, da sie versucht , aus einem BASIC-Programm weitere Informationen zu lese n. Ein en Tei l dieser Routine bilden wir deshalb in un seren eige nen Programmen als Unterroutine nach . DRWPARA 1
2 3
4 5 6 7 8
9
0300 0302 0304 0306 0308: 0309: 030B : 030D : 030F : 0311 :
A5 85 A5 85 8A A2 D2 FO 90 4C
0314: 0315: 0317: 0319: 031A: 031B: 031 D: 03 1F : 0320: 0321: 0323: 0325: 0327: 0329:
OA 90 E6 18 A8 BI 65 AA C8 Bl 65 85 86 60
E8 lA E9 IB 00 lA 05 03 99 EI
03 IB lA lA lA E9 IB lA
10 11 12 13 14 15 16 17 18 19 20 21
;************************** DRWPARA * Berechnet die Anfangs- * adresse eines Shapes in * einer bekannten Shape- * ;tabel1e. Dem ROM ent lehnt * Aufruf: SHAPEPNT auf Be-** ginn der Tabelle gesetzt* X-Reg = Shapenummer * ; ************************** SHAPEL SHAPEH SHAPEPNT
EQU $OOlA EQU $OO lB EQU $00E8
ILQERR
EQU $E199 ORG $300
DRWPARA
22
23 24 25 26 27 28 29 30 31 32
NUMOK
33
34 35 36 37 38 39 40 41 42 43 44 45
KLEIN
LDA STA LDA STA TXA LDX CMP BEQ BCC JMP ASL BCC INC CLC TAY LDA ADC TAX INY LDA ADC STA STX RTS
;+$00E9
;nur Beispiel!
SHAPEPNT SHAPEL SHAPEPNT+l SHAPEH UOO (SHAPEL),X ;Maximalzah l NUMOK NUMOK ;( ILQERR ;gibt es nicht KLEIN SHAPEH
; *2 ;S hap e
START LINNUM+l CSWL+l HIMEMl CONNECT CLEAR
JSR LDA J SR AND CMP BGE CMP BNE JSR LDA J SR J SR RTS
SAVE ACC COUTl U7F U20 DRUCKBAR UOD FERTIG PRINT UOA OUTPUT RESTORE
; Reg i ster r etten ;Akku zurückladen ;40Z Bildschi r m ;Bit 7 löschen ; Leerzeichen ; für Druckzeil e ;Re turn ? ; ausge ben ;Gr a fik ze il e ;Zeilenvorschub ; ausgeben ;Registe r zu rück
Po si tion i n der Tabelle be s timmen Leerze i che n i st 1. Zeichen DRUCKBAR
SEC SBC STA LDA STA ASL ASL ROL ASL ROL
U20 ADRESSE UOO ADRESSE+l ADRESSE ADRESSE ADRESSE+l ADRESSE ADRESSE+l
;Druckzeichen im Akku ;ASCII für Leerze i chen ;merke n ;Hi-Byt e auf ; Null setzen ; *2 ( (192) ; *4 ( .(384) ;ev. Ubertrag ;*8 ( .(768) ;ev. Ubertrag
Zum berechneten Grundwert in der Tab e ll e die Anfangsadresse der Tabe ll e add i ere n für die tatsächliche Spe i cherpos iti on
72
8F31: 8F32: 8F34: 8F36 : 8F38: 8F3A: 8F3C:
18 A9 65 85 A9 65 85
00 06 06 93 07 07
73 74 75 76 77
78 79 80 81 82 83 84
CLC LDA ADC STA LDA ADC STA
# TABELLE ADRESSE+l ADRESSf+l
; Lo-By t e ; Hi-Byte
Die 8 Bytes des Zeiche ns in ei nen Zwische nspeicher l aden für die dann fol gende Umcodierung
89
3.10 Der Kopfstand der Bytes 8F3E: 8F40: 8F42 : 8F44: 8F47 : 8F48 :
8F4A: 8F4C: 8F4D: 8F4F: 8F51: 8F54 : 8F55 : 8F56: 8F58: 8F5B: 8F5C: 8F5E:
8F60: 8F63: 8F66: 8F68: 8F6B: 8F6E : 8F70: 8F73 : 8F75: 8F77:
8F78: 8F79: 8F7C : 8F7E: 8F81: 8F84 : 8F86:
AO BI 29 99 88 10
AO 18 A9 A2 7E 6A CA 10 20 88 10 30
8D EE DO EE AD C9 AD E9 BO 60
38 AD E9 8D AD E9 8D
07 06 7F DB 8F F6
07 00 07 DB 8F F9 60 8F EE BA
FF 61 03 62 61 68 62 92 01
61 E8 E6 62 8F E7
FF 8F 8F 8F 8F
8F 8F 8F 8F
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
LADEN
LDY LDA AND STA DEY BPL
U07 ;8 Bytes ( ADRESSE) , Y ;Bit 7 l ösche n U7F ZEICHEN ,Y ;Spe i cher LADEN
;weiter
Di e Bitwerte von horizontaler Anordnung (Bildschirm) umrec hnen in vertikal e Anordnung für de n Matrixdrucker LOOP ROLLEN
LDY CLC LDA LDX ROR ROR DEX BPL JSR DEY BPL BMI
U 07 UOO U07 ZEICHEN ,X ROLLEN ABLAGE LOOP FERTI G
;8 Bit im Byte ;Carry löschen ;Akku initi a li s i eren ;8 Bytes pro Zeiche n ;e ntspr. Bit in ;den Akku rol l en ; a lle Bytes? ;Nein, we it er ;im Puffer able gen ;all e Bits? ;Nei n , we it er ;JA
Umcodierte Bytes in ei nem Zwisc henp uffer merke n , bis e nt weder ein Return fo l gt oder der Puffer voll ist (640 Byt es) ABLAGE
TEST
STA INC BNE INC LDA CMP LDA SBC BGE RTS
$FFFF ; Dummy-Adresse ABLAGE+l ;~o-Byte we it ersetze n ; Ub er tr ag? TEST ;Hi-Byte ebenso ABLAGE+2 ;Pu ffe r-Vo ll t es t e n ABLAGE+l * erfolgt. In eine Zeil e passen SO Zeichen, die je S Bytes beanspruchen, also in sgesa mt 640 Bytes . Genauso groß ist der Druckspeicher. Die erste Besonderheit di eser Routine ist die Zeile 114, die sogenannten selbstmodifizierenden Code enth ält. Das ist ein Code , der sich während der Laufzeit eines Programms ändert , weil er vom Programm selbst modifiziert wird. Das wäre so , als wenn Sie in ein em BASIC-Programm durch das Programm selbst eine Adresse für einen POKE-Befehl errechnen lassen würden, um sie dann in das laufe nde Programm schreiben und danach ausführen zu lasse n. Di e Adresse für den STA-Befehl wird vom Programm während des Laufs errechn et. Der Wert $FFFF steht nur dort , damit der Assembler beim assembli eren für STA di e abso lute Adressierung berechnet und dann mit den FF FF zwei Bytes im Code freih ält , in di e später di e eigentli che Adresse eingesetzt wird . Wichtig bei jedem selbstmodifizierenden Code ist, daß eier Code initialisiert , d.h. auf seinen Startwert gesetzt werden muß. Dies geschieht erstmals beim Aufruf des Programms durch die Routine CLEA R, di e die Startadresse des Puffers (hi er $SFES) in elen Operanden des ST A einträgt (Zeile 176 bis 179). Die Routine ABLAGE setzt dann se lber bei jedem Aufruf diese Adresse um eins weiter. Irge ndwann ist der Druckpuffer einmal voll. Um dies festzustell en, findet ein Test statt. Wenn di e Abl ageadresse erhöht wo rden ist, wird sie mit der Adresse des Pufferendes verglichen. Ist diese erreicht , wird di e Druckroutine PRINT aufgerufen, die all e 640 Bytes ausgibt. an schließend den Puffer wieder löscht und in Zeile 114 ern eut die Startadresse des Puffers einträgt. Ist das Ende noch nicht erreicht , endet die Routine und das niichste Zeichen kann behandelt werden. Interessa nt ist noch der Vergleich der augenblickli chen Ablageadresse mit der Endadresse. Bei beiden Werten handelt es sich um 2-Byte Zahlen. Durch eine geschickte Kombination von Assembler-Befehlen kann in nur 4 Zeilen festgestellt we rden, ob die erste noch kleiner als di e zweite ist. Dazu wird das Lo-B yte der ersten Zahl in den Akkumul ator geladen, um mit dem Lo-Byte der zweiten Zahl verglich en zu werden. Diese zweite Zahl wird im übri gen vom Assembler errechnet, der durch den Befehl " < PU FFER + $280" zuerst die Länge des Puffers ($280 = 640) zur Startadresse zä hlt und von der Summe nur das Lo-B yte nimmt. War das Lo-Byte von ABLAGE kleiner als das VOll .,ENDE" , ist danach das Carry-Bit gelöscht , an so nsten gesetzt. Jetzt wird das Hi-B yte von ABLAGE geladen und das Hi-Byte vo n "END E" subtrahi ert. Ist vo rh er das Lo-Byte kleiner gewesen , so ist das Carry-B it gelöscht , sodaß zusätzlich eine 1 subtrahiert wird . Im anderen Fall wird kein Übertrag berü cksichti gt. Ist am Ende
3.10 Der Kopfsta nd der Bytes
95
diese r Zeilen das Carry-Bit gesetzt. ist di e erste Zahl gleich groß ode r größer als di e zwe ite. Ist das Ca rry-Bit gelöscht , war die erste Zahl kleiner. Nehmen wir drei Beispiele: di e erste Zahl sei nacheinander $6020, $6030 und $6040 . Die zweite Zahl sei immer $6030. Akku: Ver gl eich mit Carry danach:
$20 $30
$40 $30
$30 $30 1
0
Akku: $60 Subtraktion von $60 Übertrag : 1 Erge bni s: $F'F' Carry danach 0
$60 $60 0 $00
1 $60 $60 0 $00
1
1
Denken Sie dara n, daß der Ü bertrag bei einer Subtrakt ion gleich dem inverti erten Carry-B it ist (Bo rgefl agge !). Die PRINT-Routine berechn et durch Subtraktion des Pufferstarts von der letzten Ablageposition die Anzahl der Zeichen im Puffer, da diese dem Drucker vor dem Ausdruck der Zei le übermittelt werden muß. DRUCKEN enthält se lbstmodifizierende n Code in genau der se iben Art wie ABLAGE. Hi er wird die Initi ali sierun g von den Zeilen 140 bis 143 vorgenommen. Es werden so lange Zeichen aus dem Druckpuffer an den Drucker geschick t, bis all e Bytes gesendet wurden (Vergleich mit ABLAGE) . Dann wi rd der Puffer ge löscht (wir besprechen diesen Teil noch) und der selbst modifizierend e Code von ABLAGE wieder auf den Anfangswert gese tzt. Di e Druckroutin e OUTPUT ist Interface-spezifisch und gilt in di ese r Form nur für die oben gena nnten Karten. Das Byte wird dabe i direkt auf die HardwareAdressen der Interface-Karte geschrieben. Für andere Karten müsse n Sie dort deren Übergabe einsetzen, die Sie in der Betriebsanleitung des Interfaces finden. Unter den folgenden Routinen müßte auch eine für Sie dabei se in , z.B.: OUTPUT
PHA LDY OUTLOOP LDA AND CM P BNE PLA STA RTS
oder
U I0 $C080 , Y *%0000 0111 *%000000010 OUTLOOP $C080,Y
:Akku retten ; Slot 1 ;Status l ade n ;NO PAPER , SELECT und ;ACKNOWLEDGE t esten ;Dru cker nicht bereit ;Zeichen ausgeben ; f e rti g
96 OUTPUT
3. Der kleink ari erte Apfel
BIT BMI STA STA STA RTS
$C09 1 OUTPUT $C09 1 $C092 $C094
; S10t 1 ;z.8 .
C.ITOH 8510A
oder OUTPUT PHA OUTLOOP LDA $C091 AND U10 BNE OUTLOOP PLA STA $C090 RTS
retten S10t 1
; fertig
oder OUTPUT PHA OUTLOOP LDA $C099 AND U70 CMP U10 BNE OUTLOOP PLA STA $C098 RTS
retten *$30 für App1e IIe Super Seria1 Card
Vor dem eigentlichen Druckzwischenspeicher li egt noch ein weiterer kleiner Speicher, der die Werte zur Initialisierung des Druckers aufn imm t. Dem EPSON muß vor jeder Druckzeile fo lgende Seq uenz geschickt werden: ES CAPE 4 (Zeichenanzahl in 2 Bytes). Bei einem anderen Fabrikat müssen Sie diese Werte nach den Angaben im Handbuch anpassen. "ESCAPE 4" steht fes t in diesem Puffer. Die Anzah l der Zeichen kann aber schwanken, da nicht all e Zeil en ganz gefüllt sind. Deshalb stehen auch hier zunächst nur zwei FF FF als Stellvertreter. Vom Programm wird für jede Druckzeile die Byteanzahl eingesetzt (Z. 130-136). In DRUCKEN wird dann dieser Code vor dem Druckzwischenspeicher gesendet. In CLEAR wird der Druckzwischenspeicher auf Null gesetzt und die Anfangsadresse des Puffers wieder nach ABLAGE geschrieben, damit die nächste n Zeichen wieder von vorne beginnend abgelegt werden. An CLEAR können wir se hen, daß es keine allgemeingültigen E mpfehlunge n für kurze und schnelle Assembler-Programme geben kann. Wir haben in diesem Programm an zwei Stell en selbstmodifiz ierenden Code benutzt, um knapp und schnell unser Ziel zu erreichen. Die Aufgabe von CLEAR ist es nun , $280 (= 640) hintereinanderliegende Bytes im Spe icher zu löschen. Die Schwierigkeit li egt darin , daß sich die Anfa ngsad resse erst während der Assemblierung durch
*
*
97
3.10 Der Kopfstand der Bytes
die Länge des bis dorthin stehenden Codes ergibt. Unsere Routine so llte also mit jeder Start adresse laufen. Versuchen wir zunächst eine Lösung mit selbstmodifizierendem Code:
CLEARI 1
2 3 4 5 6 7 8 9
;******************************* Lö schprogramm für $280 Bytes * ;******************************* Variante 1 mit se1bstmodifiziere ndem Code. Zeitbedarf: 16693 Prozessortakte PUFFER
EQU $1234
; willkürlich
10 ORG $300
11
0300 0301 0303 0306: 0308:
08 A9 80 A9 80
34 OE 03 12 OF 03
12 13 14 15 16 17 18 19 20 21
Code initia1isieren START
CLD LDA STA LDA STA
1f PUFFER LÖSCH+2
Löschen
22
030B: A9 00 0300: 80 FF FF
0310: EE OE 03 0313: 00 03 0315: EE OF 03
23 24 25 26 27 28 29 30 31 32
CLEAR LÖSCH
LDA t$00 STA $FFFF
; Dummy
Adresse weitersetzen INC LÖSCH+l BNE TEST INC LÖSCH+2
; Lo ;Übertrag? ;Ja, auch Hi
Bereichsende testen
33
0318: 031B: 031E: 0320: 0323: 0326: 0328:
AD CD 00 AD CD 00 60
OE 29 EB OF 2A E3
0329: B4 14
03 03 03 03
34 35 36 37 38 39 40 41 42
LÖSCH+1 PUFFENDE CLEAR LÖSCH+2 PUFFENDE+1 CLEAR
; Lo-By te ;g1e ich ? ;Nein, weiter ; Hi-By te ;g1eich? ;Nein, weiter ;Ja, Ende
TEST
LDA CMP BNE LDA CMP BNE RTS
PUFFENDE
ADR PUFFER+$280 ;Puffergröße
Zu Demonstrationszwecken wurde der Puffer willkürlich nach $1234 gelegt . Seine Anfangsadresse wird vom Programm in die Zeile 24 geschrieben, bevor die adressierte Speicherstelle auf Nu ll gesetzt wird. Das Weitersetzen der Adresse und die Prüfung , ob das Ende des Puffers erreicht sind, geschehen ganz ähnlich wie in den Zeilen 114 bis 123 des Druckerprogramms.
98
3. Der kleinkarierte Apfel
Das Löschprogramm ar beitet ordentlich. Trotzdem habe ich es nicht benutzt , denn es ist mir zu langsam. Es benötigt 16693 Prozessortakte , um 640 Bytes zu löschen. Es geht viel Zeit damit verloren , daß nach jedem Byte die Adresse mit INe weitergesetzt und anschließend überprüft wird. Zudem geht dabei der Akkumu lator verloren und muß stets mit LDA *$00 neu geladen werden. Der Vorteil dieser Routine ist , daß sie verhältn ismäßig einfach zu ve rstehen ist. Unser zweites Programm benötigt nur noch 7084 Prozessortakte, ist also mehr als doppelt so schnell :
CLEAR2
0300: 0301 : 0303: 0305: 0307: 0309 : 030B: 0300: 030F: 0311 : 0312 : 03 14: 03 16: 0317: 0319:
08 A9 85 A9 85 A2 AO A9 91 C8 00 E6 CA 00 60
B4 06 11 07 03 80 00 06 FB 07 F6
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
;******************************* Löschprogramm für $280 Byt es * ;******************************* Variante 2 mit Ausnutzung a ller Regis ter. Laufzeit: 7084 Proze sso rtakte PTR PUFFER
EQU $0 006 EQU $1234
;+$0 007 ; willkür lich
ORG $300 3 Sch l eifendurchgänge. in de nen 1 x $80 und 2 x $100 Byt es ge l ösc ht werden. START
CLEAR
CLO LOA STA LOA STA LOX LOY LOA STA INY BNE INC OEX BNE RTS
* S PEICHER MOVMF' SHOWSP CROUT SIN SHOWM #<SP EICHER #>S PEICHER MOVMF' SHOWSP DOSWRM
;
;Mem -> SF'AC , dann ; mul tiplizieren ;anzeigen ; MF'AC - > Mem ;Spei cher a nzei gen ;S i nus berechnen ;MF'AC zeigen ;MF'AC - > Speicher ; Wa r ms tart über DOS
SPEICHER
DF'S 5
;Spe i cherplatz
SHOWM LOOP3
LDY LDA JSR LDA JSR INY CPY BLT JMP
;MF'AC anzei ge n
SHO WS P LOOP4
LDY LDA J SR LDA J SR INY CPY BLT JMP
#$00 MF'AC , Y PRBYTE :#= 11
11
COUT #$06 LO OP3 CROUT #$0 0 ;Speicher anze i gen SPEICHER,Y ;anze i gen PRBYTE ;HEX-Zahl =#= 11 ; Leerze i chen COUT 11
#$05 LOOP4 CROUT
; , dann zurück
Das Programm benutzt zwe i Monitor-Routinen , di e wir bisher noch nicht behandelt ha ben. CROUT ($FD8E) gibt ein " Caniage Return " ($8D) über COUT aus. PRBYTE ($FDDA) gibt das Byte im A kkumul ato r über COUTals 2-ziffrige HEX-Zahl aus.
5.3 Das Zauberpaket wi rd entschnürt
115
CROUT $FD8E Gibt $8D über COUT aus. E ingabe: Ausgabe : Akku = $8D
PRBYTE $FDDA G ibt Akk umul ator als ASCII-HEX-Zahl über COUT aus Eingabe: Akk u = HEX-Zahl Ausgabe: Akku zerstört!
Nach dem Löschen des Bildschirms sehen Sie in der e rsten Zeile die gepackte Zahl 10 , darunter die ungepackte Zah l, so wie sie im MFAC steht. Es fo lgt die gepackte Zahl 1/4. Das Endergebnis der Multipli kation (2.5) steht wiederum ungepack t im MFAC und wird darunter ausgegeben . Sch li eßlich wird das Ergeb nis noch in den Speicher kop iert und dabei erneut gepackt (MOVMF $EB2B). 84 20 00 00 00 84 AO 00 00 00 20
10 gepac kt 10 ungepackt
7F' 00 00 00 00
1/4 gepackt
82 AO 00 00 00 20 82 20 00 00 00
2.5 ungepackt 2.5 gepackt
80 99 35 78 6E 18 80 19 35 78 6E
SIN 2.5 ungepackt SIN 2.5 gepackt
Applesoft bietet einen ga nze n Satz von Funktionen an, a us dem wir ste llvertretend die Sinus-Funkt ion benutzen. A lle Funktionen wirken auf den MFAC und werden genau wie SIN ($EFF1) aufgerufe n. Das Rechen e rgebn is fi ndet sich wiede r im MFAC. Auch den Si nus von 2.5 sehen wir uns ungepackt und dann im SPEICHER gepackt an. D a bei kö nnen Sie festste llen, daß die ungepackte Form im Vorzeichenbyte gelegentli ch auch abweichende Werte aus Zwische nergebnissen e nthalten kann. Vo n Bede utung ist nur Bit 7.
116
5. Der mobile Punkt
FP-Operationen mit einem Operanden Alle folgenden Routinen beziehen sich auf den MFAC , der vorher entspreche nd gelade n werden muß .
NOT
FALSE TRUE FADDH NORM ZEROFAC LOG MULTlO
DIVIO RNDB SGNA
SGN
ABS INT SQR NEGOP EXP RND
COS SIN TAN ATN
$DE98 negiert MFAC MFAC = 00 => MFAC = 1 MFAC =F 00 => MFAC = 0 $DF5D trägt 0 im MFAC ein (nur $009D!) $DF60 trägt 1 im MFAC ein $E7AO addiert 0.5 zum MFAC $E82E norm ali siert MFAC mit 5. Mantissen-Byte $E84E setzt MFAC auf Null ($009D und $00A2) $E941 natürlicher Logarithmus vom MFAC $EA39 multiplizie rt MF AC mit 10 $EA55 dividiert MFAC durch 10 $EB72 das 5. Mantissen-Byte wird nach MF AC gerunde t $EB82 Vorzeiche n vo n MFAC testen. MFAC< 0 => Ak ku = $FF MFAC = 0 => Akku = $00 MFAC > 0 => A kku = $01 $EB90 trägt das Vo rzeichen vo m MFAC im MFAC ein (der alte Inh alt wird zerstö rt!) MFAC< 0 => MFAC = -1 MFAC = 0 => MFAC = 0 MFAC> 0 => MFAC = 1 $EBAF bildet den Betrag vo m MF AC $EC23 iso liert de n ganzzahligen A nteil $EE8D be rechnet die Quadratwurzel vo m MFAC $EEDO bi ldet den negativen Wert vom MFAC $EF09 ex poni ert MFAC zur Basis e (2.718 .. .) $EFAE berechnet eine "Zufallszahl " in Abhängigkeit vo n MFAC. In $00C9-CD muß vorher ein Startwert stehen. MFAC und $00C9-CD enthalten ne ue Zufallszahl. $EFEA be rechnet Cosinus vom MF AC $EFFl berechn et Sinus vom MF AC $F03A berechnet Tangens vom MFAC $F09E berechnet A rcustangens vo m MFAC
5.3 Das Zauberpaket wird entschnürt
117
Die fo lgenden Routinen benötigen 2 Operanden, von denen ei ner im MFAC und der andere im SFAC stehen muß. Mit Ausnahme der Potenzfunktion haben all e Routinen zwei E intrittspunkte: der erste nimm t an, daß MFAC schon ge laden ist , und überträgt vor der eigentli chen Operation die gepackte Fließkomma-Zahl , auf die de r Akk umul ato r und das Y-Register (Lo/Hi) zeigen , nach SFAC. Der zweite E intrittspunkt erwartet , daß MFAC und SFAC gelade n si nd , und führt sofort die Opera ti on aus. Vor dem A ufruf muß der Exponent von MF AC in den Akku mul ator geladen werden (LDA $9D)!! Das Ergebnis findet sich immer im MFAC.
FP·Operationen mit zwei Operanden FSUB FSUBT FADD FADDT FMULT FMULTT FDIV FDIVT FPWRT
$E7A7 überträgt ge packte Zahl (A ,Y) nac h SFAC und führt dann FSUBT aus $E7AA subtrahiert MFAC von SFAC (SFAC - MFAC) $E7BE überträgt gepackte Zahl (A,Y) nac h SFAC und führt dann FADDT aus $E7C1 add iert SFAC und MFAC (SFAC + MFAC) $E97F überträgt gepackte Zahl (A,Y) nach SFAC und führt dann FMULTT aus $E982 multipliziert SFAC und MFAC (SFAC * MFAC) $EA66 überträgt gepackte Zahl (A ,Y) nach SFAC und führt dann FDIVT aus $EA69 dividiert SFAC durch MFAC (SFAC/MFAC) $EE97 potenziert SFAC mit MFAC (SFAC i MFAC)
Es folgen noch eini ge weitere Routinen, die nicht in ein Schema passen.
Logische Operationen und Vergleiche NOT
OR
AND
$DE98 negiert MFAC MFAC = 00 => MFAC = 1 MFAC =1= 00 => MFAC = 0 $DF4F verknüpft SFAC und MF AC durch logisch es ODER. Ist ein Operand =1= 0, wird MFAC = 1, sonst ist MFAC = O. $DF55 verknü pft SFAC und MFAC durch logisches UND . Sind beide Opera nden =1= 0, wird MFAC = 1, so nst ist MFAC = 0
5. Der mobil e Punkt
118 COMP
$0016 1
2 3 4 5 6 FCOMP
$DF6A vergleicht SFAC mit MFAC. MFAC wird auf 1 gesetzt , wenn der Vergleich wahr ist, andernfa lls auf O. Di e Speicherstelle $0016 bestimmt den Typ des Vergleichs: Vergleich SFAC> MFAC SFAC = MFAC < = > SFAC ~ MFAC 42 1 SFAC< MFAC SFAC MFAC SFAC~ MFAC $EBB2 subtrahiert den MFAC vo n der gepackten Zahl , auf die der Akkumulator und das Y-Register (Lo/Hi) weisen. Setzt den Akk umul ator entsprechend dem Ergebnis. Zusätzlich wird die Nullflagge im Statusregister gesetzt, wenn beide Zahl en übereinstimmen. MFAC< Zahl => Ak ku = $FF MF AC = Zahl => Akku = $00 MFAC > Zahl => Akku = $01
*
5.4 Sich regen bringt Segen Alle bisherigen Ro uti nen gingen davon aus, daß sich di e Fli eßkomm a-Zahlen schon irgendwo im Speicher befinden. In einem Programm ist das zumeist aber nicht der Fall. Wir benötigen also weitere Möglichkeiten, um Zahl en inn erhalb des Speichers zu bewegen und um Zahl en zwischen der Fließ komma-Darstellung und anderen Betrachtungswe isen zu wandeln , de nn schließli ch sind in 5 Bytes gepackte Zahlen nicht sehr anschauli ch. Die fo lgenden Routi nen dienen dem Verschieben von Fli eßko mma-Zahlen un d der Umwandlung zwischen ge pack ter und ungepackter Fo rm . Der Akk umulator und das Y-Register ze igen gege benenfalls auf das Lo- bzw. das Hi-Byte der Anfa ngsad resse (Exponentenadresse). FP-Übertragungs-Routinen MOVESM
$E9E3 überträgt gepackte Zahl (A ,Y) nach SFAC. Die Vo rzeichen vo n MFAC und SFAC werden verknüpft und nach $OOAB gespeichert.
5.4 Sich rege n bringt Segen
MOVEFM MOVE2F MOVEIF MOVEZF MOVEMF MOVEFS MOVESF
119
$EAF9 überträgt gepackte Za hl (A ,Y) nach MFAC, legt ein auf Null gesetztes 5. Mantissen-Byte an $EBIE überträgt MFAC in den 2. H il fsfließkomma-Akkumul ator ($0098-9C) $EB21 überträgt MFAC in den 1. Hilfsfl ießkomma- Akkumulator ($0093-97) $EB23 überträgt MFAC in die Zero-Page Speicherstelle , auf die das X-Register weist $EB2B rundet MFAC und überträgt ihn als gepack te Zahl nach (X,Y)!!! $EB53 überträgt SFAC nach MFAC $EB63 überträgt MFAC nach SFAC
Die beiden wichtigsten Formen der Zahl endarsteIlung im Apple sind das Fließkomma-Format und das vorze ichen behaftete Ganzza hl- Fo rm at (signed Integer). Eine letzte Klasse von Routinen des Applesoft-Inte rpreters dient nun zur Umrechnung (Ko nvertierung) zwischen diesen beiden Syste men. E in Programm beispiel fo lgt in Kapitel 7.
FP -Konvertierungs-Routinen VARL
VARLl
MKINT
AYINT
GIVAYF
$DED5 überträgt den Wert ein er Vari ab len nach MFAC , wenn es sich um eine num erische Va ri able handelt. TXTPTR ($00B8/B9) muß auf das erste Zeichen des Variablenn amens zeigen. $DEE9 VPNT ($OOAO/A l ) enth ält die Sta rtad resse der 2-Byte-Integerzahl mit Vorzeichen, die nach MFAC übertragen wird. $EI08 verwandelt den MFAC in eine 2-Byte-Integerzahl in VPNT ($OOAO = Hi/$OOAl = Lo!!). MFAC muß positiv und < 32768 sein, so nst erfo lgt Fehlermeldung. $ElOC verwandelt den MFAC in eine 2-Byte-Integerza hl mit Vorzeichen in VPNT ($OOAO/Al = Hi/Lo!). MFAC muß zwischen -32768 und +32768 liegen, sonst erfolgt Fehlermeldung. $E2F2 verwandelt eine vo rzeichen behaftete 2-B yte-ln tegerzahl (Y-Reg = Lo, Akku = Hi) in ein e Fließkomma-Zahl in MFAC
120
SGNFLT
CONINT
GETADR
FLOAT QUINT
FIN
PRNTFAC FOUT
5. Der mobile Punkt $E301 die 1-Byte-Integerzahl ohn e(!) Vorzeichen im Y-Register wird in eine Fließkommazahl in MFAC umgewandelt. Der Akk umulato r muß beim Aufruf Null se in (Akku = 00). $E6FB verwandelt den MFAC in eine 1-Byte-Integerzahl im X-Register. Routine endet nicht mit RTS sondern mit JMP CHRGOT ! $E752 verwandelt den MFAC in eine 2-Byte-Integerzahl ohne Vorzeichen in LINNUM ($0050 = Lo, $0051 = Hi). Wertebereich 0 - 65535. $EB93 verwandelt die vorzeiche nbe haftete 1-Byte-Integerzahl im Akkumulator in eine Fließkomma-Zahl im MFAC. $EBF2 verwa ndelt MFAC in eine 4-Byte-Integerzahl mit Vorzeichen. Ergebnis wird von $009E bis $00A2 mit dem Vorzeichen in Bit 7 von $009E abgelegt. $EC4A verwandelt einen String in ein e Fließkommazahl. TXTPTR muß vor das e rste Zeichen zeigen. Zuerst "JSR CHRGET" ausführen , dann "JSR FIN". String muß mit gelöschtem Bit 7 im Speicher stehen und mi t ,,:", $00 oder Nichtzahl-Zeichen enden. $ED2E gibt den MFAC als Dezimalzahl über COUT aus. Benutzt FOUT , STROUT und COUT. $ED34 verwandelt den MFAC in einen Zahlenstring ab $0100 um (im Stack). String hat Bit 7 gelöscht und $00 als E ndm arke r. Akku (Lo) und Y -Register (Hi) zeigen auf den Stringanfang.
Wenn Sie in ei nem Programm kurzfristig den MFAC retten müsse n , können Sie die Routine PSHMFAC ($DElO) benutzen , um die Fließkomma-Zahl auf den Stack zu retten. Mit PULLSFAC ($DE47) kann sie von dort zurück in den SFAC geholt werden. Da beide Routinen den Stackpointer versetzen, können sie nicht einfach mit JSR aufgerufen werden. PSHMFAC zieht die ReturnAdresse vom Stack und legt sie (nach Addition von 1) in den Speicherstellen $005E und $005F ab. Die Routine endet mit einem JMP ($5E). PULLSFAC endet mit einem RTS . Da vorher aber bereits die Fließkomma-Werte vom Stack geholt werden, muß vor der Fließkomma-Zahl bereits die Rücksprungadresse auf dem Stack liege n und PULLSFAC mit ei nem JMP aufgerufen werden.
PSHMFAC
$DE10 sch iebt MFAC von hinten mit dem Vorzeichen beginnend auf den Stack. Holt sich vorher seine Rücksprungadresse vom Stack und springt sie späte r mit JMP 0 an.
5.4 Sich regen bringt Segen
PULLSFAC
121
$DE47 holt 6 Bytes vom Stack und legt sie im SFAC ab. Routine muß mit JMP aufgerufen werden (nicht JSR) und erwartet die Rücksprungadresse oberhalb der Zahl auf dem Stack.
Ein kurzes Beispiel so ll die Lage durchsichtig machen: LDA #<WEITER PHA LDA #) WEI TER PHA JSR PSHMF'AC JMP PULLSF'AC WEITER
;Returnadre sse für PULLSF'AC ; MF'AC - ) STACK ; Ih re Routinen ;STACK - ) SF'AC ;hierhin kehrt PULLSF'AC zurück
Ihre eigene n zwischengeschalteten Routinen müssen zwa ngsläufig den Stackpointer unverändert lasse n, d.h. er darf zwischenzeitlich verä ndert werden, wenn er vor dem Aufruf von PULLSFAC wieder auf seinen alten Wert zurückgebracht wird. Unser Fließkomma-Paket ist entschnürt. Aus Platzgründen können nicht für alle Routinen Anwendungen angegeben werden. Die verschiedenen Tabell en sind aber ausreichend , um ga nze Mathematik-Programme mit reell en Zahl en in Assembl er zu schreiben. Sie können alle Unterprogramme benutzen, auch wenn Sie nicht wissen, wie der Applesoft-Interpreter in tern z.B. einen Logarithmus-Wert berechn et. Auch im nächsten Kapitel über Appl esoft-Variablen werden wir einen Teil der Fli eßkom ma-Ro utin en sinnvo ll für uns nutze n.
122
6. Und immer schön variabel bleiben! Appl esoft hat eine weitere Eigenschaft, di e wir als Asse mbler-Programmi erer mitbenutzen kö nnen: di e Vari abl en. Wenn wir Programm e schreiben wollen, die sowohl aus BASIC als auch aus Teil en in Maschin ensprache bestehen, ist eine Ke nntnis über den Aufbau und di e Verwaltung der Applesoft- Va ri ablen unumgängli ch. Nur wenn wir auch von der Maschin ensp rache auf Vari abl en zugreife n kö nnen , ist es ein fach möglich, zwischen BASIC und Assembler Inform ationen auszu tauschen. Alles andere führt zu ein em zeit- und pl atzverschwendenden "herumpoken" .
6.1 Eine Tabelle ist aller Variablen Anfang Applesoft un terscheidet 3 Typen von einfac hen Va riablen, 3 Typen von Feldvari ablen und einen Fun kti onstyp. Sie werden in BASIC durch die Schrei bweise unterschieden: Reell e Zahl : nu r Na me z.B. A Ganzzahl : Na me mit angehängtem ,,% " z.B. A% Name mi t angehängtem ,,$" z.B. A$ Ze ichenkette : Fun ktion: Name mi t vorangestell tem "FN" z.B. FN A(B) Feld : Name wie oben, mit angehängtem In dex z.B. A(l), A %(1), A$ (l) Betrachte n wir zunächst di e einfac hen Va ri ablen. Applesoft legt alle ei nfac hen Vari abl en in einer Tabelle ab, die dem BASICProgramm normalerweise unmittelbar fo lgt. Auf der Null-Se ite ist der Ze iger VARTAB ($0069/6A) vorh anden, der imm er auf den Beginn der Tabelle ze igt. Dieser Wert ist mit dem BASIC-LOMEM: identi sch . Die Adresse des ersten
6.1 Eine Tabelle ist aller Variablen A nfang
123
Bytes hinter der Tabelle ist in ARYTAB ($006B/6C) abgelegt. Jeder E intrag in der Tabelle ist 7 Bytes lang , auch wenn nicht immer alle 7 Bytes benötigt werden.
DOS
HlM EM 1$73174)
normal $9600 Sir ingpool
fRETOP 1$6f!70)
frei STREHD 1$60/6E)
+ +
feldvariablen ARVTAB 1$6B/6C)
einfache Variablen VARTAB 1$69/6A)
LOMEM Applesoft- Programm normal ~ 0801
TXTTAB 1$67/6B)
Bildschirm
Abb . 8: Zeiger der Speicherbelegung
Die Auftei lung innerhalb der Tabell e geschi eht durch den Zeitpunkt der Variablendefinition. Die zuerst definierte Variable steht a n der untersten Position. Ihr folgt die a ls zweites definierte Variable usw. So kommt es , daß a lle Ty pen durcheinanderstehen. Die Funktionen finden sich ebe nfa ll s in der se iben Tabell e. Applesoft braucht also e in Unterscheidungsmerkmal, um die 4 Möglichkeiten ausein a nder zu ha lte n. Da sich Applesoft nur die ersten 2 Buchstaben vo n jeder Variablenbezeichnung merkt (HANS und HAUS bezeichnen für Applesoft also d ie gleiche Variable!), eigne n sich die bei den Bit 7 von jedem Namen sehr gut zu
124
6. U nd imm e r schön variabel bleiben!
diesem Zweck. E in gesetztes Bit 7 e rgibt eine n negativen Wert , ein ge löschtes Bit 7 ein en positive n We rt. Wir erhalten dami t: Variable n typ ree lle Zahl ganze Zahl Z eiche n kette Funkti o n
1. Zeiche n positiv 0 negativ 1 positiv 0 negati v 1
2. Zeiche n positiv 0 negati v 1 negati v 1 positiv 0
Die e rste n beide n Bytes jedes Tabelleneintrags enthalte n imme r die erste n beide n Bytes des Variable nn ame ns mit e ntsprechend gesetzten ode r ge löschte n Bits 7 . Ist die Variablenbezeichnung nur ein Zeichen lang, wird mit $00 bzw . $80 aufgefüllt. A => $41 $00 A % => $C1 $80 A$ => $41 $80 FN A(X) => $C1 $00 Die restlichen 5 Bytes habe n je nach Va riablentyp einen unterschiedlichen Inhalt. Bei den reellen Va riablen enthalten sie die gepackte Flie ßkomm aza hl. Die ganzen Zahlen belegen nur die e rsten beiden der 5 Bytes , die restlichen 3 sind mit $00 aufgefüllt. Die Z eichenketten passen nicht selber in die Tabelle , da ihre Länge bis zu 255 Z eiche n betragen kann . A pplesoft legt sie in de r R eihe nfo lge Ihres A uftrete ns bei H IMEM ($0073/74) beginnend abwärts ab (auf einige A usnahme n komme n wir späte r zu sprechen). Die Z eichenkette n stehen dabei in sich abe r wi eder aufwä rts. D as erste Byte der T abelle e nthält eine Längenangabe , das zweite und dritte Byte in der Ta belle zeigt auf das erste Byte de r Zeichenkette . Di e beide n letzte n Bytes sind leer ($00). We nn H IMEM bei $9600 li egt und " A BCDE" die erste definie rte Z eiche n kette ist , finden wir: $9600 = ??? ? 126 THEN PRINT CHR$ (7): GOTO 50 60 PRI NT Z$ : POKE 255,Y 70 Z$ = "-- - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - -- - - - " 80 VTAB 11: PRINT Z$: PRINT PRI NT "JETZIGE VARIABLENWERTE:": PRINT Z$: PRINT PRINT "A%= "A%;: HTAB 10 : PRINT "A = "A;: HTAB 20: PRINT "A $= "A$ 90 PRI NT "C= "C: PRINT "B(A%) = "B(A%): PRINT "C $= "C$: PRINT : PRI NT Z$ 100 PRINT PRINT "GEBEN SIE JETZT ZUNAECHST EI NE F'LIESS- KOMMAZAHL IN DAS LAUF'ENDE MASCHI NENPRO- GRAMM EIN (ENDE = weder " noch $00
6. Und immer schön vari abel bleiben!
140
CHRGOT $008 7 Läd Akku von der TXTPTR-Stelle. Leerzeichen ($20) werden übersprungen. Testet Zeichen.
E ingabe: Ausgabe: Akku = gelesenes Zeichen Carry-Bit = 1 ~ Ziffe r Carry-Bit = 0 ~ so nst. Zeichen Zero-B it = 1 ~ " oder $00 Zero-Bit = 0 ~ weder " noch $00
Wenn nun Applesoft auf ein & trifft , springt es nicht nur nach $03F5, sondern führt auch noch ein JSR CHRGET aus, so daß sich das auf & fo lgende Zeichen im Akkumul ator befind et und TXTPTR hinter das & zeigt. Mit diesem Wissen kö nnen wir jetzt eine Routine schreiben, die alle nach dem & stehenden Zeichen als Parameter auswertet . SWAPI 1 2 3 4 5 6 7 8 9 10 11
0300 0302 0305 0307 030A : 030C : 030 F :
A9 80 A9 80 A9 80 60
4C F5 03 10 F6 03 03 F7 03
03 10 : 0313: 031 5 03 17 03 19
20 85 84 A5 48
E3 DF 85 86 81
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
;******************************* Variablen- Tausch e r SWA PI * ;******************************* VARNAM VARPNT FORPNT AMPER OATA MI SMTCH CHKCOM PTRG ET
EQU EQU EQU EQU EQU EQU EQU EQU
$0081 $0083 $0085 $03 F5 $0995 $0076 $OEBE $OFE3
;+ $0082 ; + $0084 ;+ $0086
ORG $0300 LOA U 4C STA AMPER LOA * <START STA AMP ER+l LOA *> START STA AMPER+2 RTS START
JSR STA STY LOA PHA
PTRGET FORPNT FORPNT+l VARNAM
;JMP ; Ampersand Sprung; vektor setz en
; 1. Var i abl e ;Lo ; Hi Adresse ;1. Name nsze i chen ;retten
6.4 Stühlerücken 031A: 031C: 031D: 0320: 0323: 0324: 0326: 0328: 0329: 032B: 032D: 032F': 0331 : 0332 : 0334 : 0336 : 0337 : 0339: 033A : 033C:
A5 48 20 20 68 45 30 68 45 30 AO BI AA BI 91 8A 91 88 10 4C
82 BE DE E3 DF' 82 17 81 12 04 83 85 83 85 F'3 95 D9
033F': 4C 76 DD
141 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
LOOP
MISMATCH
LDA PHA JSR JSR PLA EOR BMI PLA EOR BMI LDY LDA TAX LDA STA TXA STA DEY BPL JMP
VARNAM+l CHKCOM PTRGET VARNAM+l MISMATCH
; 2. Namenszeichen ;retten ; 2. Vari able ; alter Name ;gleicher Typ?
;dito VARNAM MISMATCH ;geht nicht #$04 ;5 Bytes (VARPNT) , Y ;retten (F'ORPNT) , Y (VARPNT) , Y ; l. Hälfte (F'ORPNT) , Y ; 2. Hälfte LOOP DATA
JMP MISMTCH
; zum nächsten Be f ehl ;F'ehlermeldung
Die Zeilen 16 bis 22 stellen ein Startprogramm dar , das den Ampersand-Vektor auf den Begi nn des eigent lichen Programms (START) umsetzt. Dies muß nu r ein einziges Ma l geschehen, z.B . indem SWAP1mitteis BRUN gestartet wird . Bei jedem &-Zeichen springt dann der Interpreter nach START. Für den Aufruf vere inbaren wir folgende Syntax: & l.Variable, 2.Variab le. Wie wir wissen , zeigt TXTPTR auf das erste Zeichen nach dem &, hier also auf de n Beginn des ersten Variab lennamens. Wir können deshalb direkt PTRGET aufrufen , um die Va riab le zu finden. Die gefundene Ad resse speichern wir wieder nach FORPNT zwischen , während der Variab lenname (d ie bei den signifikanten Zeichen) auf den Stack gerettet wird (Z. 25 - 30). Auch PTRGET setzt den TXTPTR weiter, de r nun auf das Komma zeigt . CHKCOM ($DEBE) prüft das Vorhandensei n des Kommas und gibt im Fehlerfa ll ei n "SYNTAX ERROR" aus. Mit PTRGET suchen wir dann auch die zweite Variable. Da wir nur Variab len gleichen Typs vertauschen können, wird die Überei nstimmung anh and der Bits 7 geprüft. Wen n das erste und das zweite Na mensbyte jeweils paarweise miteinander EOR-verkn üpft werden , muß das Negativ-Bit im Statusregister gelöscht werden, da sich bei Gleichheit nie eine 1 ergeben kann. Bei Nichtübereinstimmung wird ein "TYPE MISMATCH ERROR" ausgegeben, den wir direkt im ROM aufrufe n.
142
6. Und immer schön variabel bleiben!
CHKCOM $DEBE Prüft , ob TXTPTR auf ein Komma ($2C) zeigt Eingabe: TXTPTR zeigt auf zu prüfendes Zeichen Ausgabe: Falls ja: führt CHRGET aus Fa ll s nein: Fehlermeldung "SYNTAX ERROR"
CHKOPN$DEBB Prüft , ob TXTPTR auf eine geöffnete Klammer ($28) zeigt Eingabe: TXTPTR zeigt auf zu prüfendes Zeichen A usgabe: Falls ja: führt CHRGET aus Falls nein: Fehlermeldung "SYNTAX ERROR"
CHKCLS $DEB8 Prüft , ob TXTPTR auf eine geschlossene Klammer ($29) zeigt Ei ngabe: TXTPTR zeigt auf zu prüfendes Zeichen Ausgabe: Fa lls ja: fü hrt CHRGET aus Falls nein: Fehlermeldung "SYNTAX ERROR"
6.4 Stühlerücken
143
SYNCHR $DECO Prüft , ob das Zeichen unter dem TXTPTR und der Akkumulator übe reinstimme n. E ingabe: TXTPTR zeigt auf zu prüfendes Zeichen Akku = Vergleichszeichen Ausgabe: Falls ja: führt CHRGET aus Fa lls nein: Feh le rmeldung "SYNTAX ERROR"
Um die Inhalte unserer zwe i Variablen zu tauschen, werden in eine r Schleife (Zeile 39 - 47) die 5 Bytes des Variablenwertes ve rtauscht , wobei uns das X-Register als Zwischenspeicher die nt. Unser Progra mm e ndet mit eine m Sprung nach DATA ($D995), das den TXTPTR bis zum nächsten ,,:" oder bis zum Ende der BASIC-Zeile vorsch ie bt un d dann mit RTS endet. A uf di ese Weise gelangen wir in unser aufrufendes BASIC-Programm zurück .
DATA $0995 Schiebt TXTPTR bis zum Befehlsende ($3A oder $00) weiter E ingabe: Ausgabe: T XTPTR a uf nächstes $3A oder $00 gesetzt
D a mit Sie SWAP auch gleich be nutzen können , folgt ein kurzes Demo-Progra mm.
SWAP1.DEMO 1 REM **** SWAP 1 - DEMO **** 5 HOME 10 PRINT CHR$ (4)"BRUN SWA Pl.OBJ" 20 A$ = "EINS":B $ = "ZWEI" 30 PRINT "A $="A $" B$="B$: GOSUB 130 40 & A$,B$ 50 PRINT "A$="A$ " B$="B$ 60 A = 123.45:B = 678.9 1 70 PRINT: PRINT "A="A" B="B: GOSUB 130 80 & A,B
144
6. Und imme r schön variabel bleiben!
90 PRINT "A="A" B="B 100 PRINT PRINT LI ST 110 ,120 110 REM JETZT FEHLER: 120 & A$,B 130 INVERSE: PRINT" SWA P ": NORMAL: RETURN Wie Sie leicht ausprobieren kö nnen , funkt io niert der Tausch sowoh l der beiden Zeichen ketten als auch der Fließkomma-Zah len . Erst in Zeile 120 erha lten wir eine Fehlermeldung , da beide Variablen nicht zum selben Typ gehören. Nebenbei bemerkt: das BASIC-Programm hat noch einen weiteren Fehler , da der Ablauf in die Unterroutine 130 führen und dort einen "Return without Gosub"Fehler bewirken würde. Dazu kommt es allerdings nicht , da bereits der Fehler in Zeile 120 das Programm zwangsweise beendet. Unsere Swap-Routine ist schon ganz praktisch, allerdings versagt sie bei Feldvariablen. Wie Sie aus Kapitel 6.1 wissen, sind bei Feldvariablen die Einträge unterschied lich lang, sodaß unser Austa usch von 5 Bytes nur für ree lle Zah len funktionieren, dagegen bei Zeichen ketten und Ganzzahlen Unordnung stiften würde. Mit einer kleinen Programmänderung können wir aber auch diesen Mangel noch beheben.
SWAP2
1 2 3 4 5 6 7 8 9 10 11
0300: 0302: 0305: 0307: 030A: 030C: 030F:
A9 8D A9 8D A9 8D 60
4C F5 03 10 F6 03 03 F7 03
0310: 0313 0315 0317
20 85 84 A5
E3 DF 85 86 81
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
;******************************* Variablen-Tauscher SWAP2 * ;******************************* FLENGTH VARNAM VARPNT FORPNT AMPER DATA MISMTCH CHKCOM PTRGET
EQU EQU EQU EQU EQU EQU EQU EQU EQU
$0064 $0081 $0083 $0085 $03F5 $D995 $DD76 $DEBE $DFE3
;+ $0082 ;+ $0084 ;+ $0086
ORG $0300
START
LDA STA LDA STA LDA STA RTS
U4C AM PER <START AMPER+l t>START AMPER+2
J SR STA STY LDA
PTRGET FORPNT FORPNT+l VARNAM
*
;JMP ;Ampersand Sprung;vektor setzen
1. Variable Lo Hi Adresse 1. Namenszeichen
6.4 Stüh lerücken
0319: 03 1A: 03 1C: 031D: 0320: 0323: 0324: 0326: 0328: 0329: 032B: 032D: 032F : 0330 : 0332: 0333 : 0335: 0337: 0338: 033A: 033B: 033D:
48 A5 48 20 20 68 45 30 68 45 30
82 BE DE E3 DF 82 18
81 13 A4 64 88 BI 83 AA BI 85 91 83 8A 91 85 88 10 F3 4C 95 D9
0340: 4C 76 DD
145
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
LOOP
MISMATCH
PHA LDA PHA JSR JSR PLA EOR BMI PLA EOR BMI LDY DEY LDA TAX LDA STA TXA STA DEY BPL JMP
VARNAM+l CHKCOM PTRGET VARNAM+l MISMATCH VARNAM MISMATCH FLENGTH
;retten ; 2. Namenszeichen ;retten ; 2. Variable ;alter Name ; glei cher Typ? ;dito ;geht nicht ;2/3/5:INT/STR/REAL
(VARPNT), Y ;retten (FORPNT) , Y (VARPNT),Y ;l. Hälfte (FORPNT), Y ; 2. Hälfte LOOP DATA
;zum nächsten Befehl
JMP MISMTCH
; Fehlermeldung
Die Modifikation ist nur gering, aber sehr wirkungsvoll. PTRGET legt bei Feldvariablen (nur dort!!) in der Speicherstell e FLENGTH ($0064) die Länge des Eintrags ab. Wir benutzen diesen Wert, um unsere Sch leife zu initialisieren. Auch hier soll Ihnen wieder eine Demo zeigen, daß unser Programm erfo lgreich arbeitet.
SWAP2.DEMO 1 REM **** SWAP2 - DEMO **** 5 PRINT CHR $ (4) "BRUN SWAP2.0BJ" 10 HOME : DlM A(2) 20 A(l) = 10:A(2 ) = 20: PRlNT A(l)" 30 & A( 1) , A(2) 40 PRlNT INVERSE: PRINT" SWAP 50 PRlNT: PRlNT A(l)" "A(2) 60 END
"A (2) NORMAL
Acht ung: SWAPI nur für einfache Variablen, SWAP2 nur für Feldvariablen benutzen!
146
6. Und imm er schön va ri abel bleiben!
6.5 Etwas Ordnung kann nicht schaden Mit der Routine SWAP haben wir schon einen wichtigen Tei l für ein Sortierprogramm geschrieben. Wir wollen hier keine allzu komplizierten Algorithmen entwickeln , sondern ein einfaches und kurzes Programm benutzen, das auf der Seite 3 Platz hat und einfach indizierte Zeichen ketten-Felder aufsteige nd nach ihren ASCII-Werten sortiert. Wir verwenden einen Blasen- oder "Bubble"-Sortieralgorithmus, der zwar nicht übermäßig schnell , dafür aber einfach zu verstehen ist.
Abb. 9: " Bubble"-Sort
6.5 Etwas Ordnung kann nicht schaden
147
Ein BASIC-Programm könnte folgendermaßen aussehen: BASIC,SORT 1 REM *** SORTIER-DEMONSTRAT ION *** 10 CLEAR: TEXT 20 HOME VTAB 5: INPUT "ANZAHL DER ZU SORTIEREND EN STRINGS? ";N 30 DIM A$(N) 40 B$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZ " 50 HOME VTAB 5: FLASH: PRINT "STRINGS WERDEN ERZEUGT": NORMAL 60 FOR I = 1 TO N: FOR J = 1 TO 10 70 A$(I) = A$( I) + MID$ (B $, INT ( RND (1) * 26) + 1,1 ) 80 NEXT J,I 90 HOME FOR I = 1 TO N: PRINT A$(I ) : NEXT PRINT 100 INPUT " SORTI ERBEG I NN";C$ 110 M = N: REM CA . 77 SEKUNDEN BEI N=100 120 FOR I = 1 TO M - 1 125 PRINT " . " ; 130 FOR J = I + 1 TO M 140 IF A$(I) < = A$(J) THEN 160 150 H$ = A$(I) :A$(I) = A$(J):A$(J) = H$ 160 NEXT J , I 170 PRINT INPUT " F'UER SORTIERTE LISTE";C $ 180 HO ME : VTAB 5: FOR I = 1 TO N 190 PRINT I ;: POKE 36,5: PRINT A$(I): NEXT I 200 END
Damit Sie den Verlauf besser verfolgen können , wird bei jedem Durchgang durch die äußere Schleife ein Punkt ausgegeben. Für 100 Zeichenketten mit der konstanten Länge 10 benötigt das BASIC-Programm ca . 77 Sekunden . Das fo lgende Maschinenprogramm verkürzt diese Zeit auf ca. 3,5 Sekunden. Es ist also gut 20-mal schneller. BSORT
1 2 3 4 5 6 7 8 9 10 11
12 13 14 15 16 17 18 19 20 21 22 23
;******************************* "Bubble-Sortierer " BSORT * ;******************************* ZAHL COUNT LI NKS RECHTS SUBF'LAG CMPFLG VARNAM LOWTR MF'AC SF'AC AMPER DATA MISMTCH STRCMP PTRGET BSSERR
EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU
$0000 $0002 $0004 $0006 $0014 $0016 $0081 $009B $009D $00A5 $03F5 $D995 $DD76 $DF'7D $DF'E3 $E1 96
ORG $0300
;+ ;+ ;+ ;+
$0001 $0003 $0005 $0007
;+ $0082 ;+ $009C
148
0300: 0302: 0305: 0307: 030A: 030C: 030F:
6. Und imm er schön variabel bleiben!
A9 8D A9 8D A9 8D 60
4C F5 03 10 F6 03 03 F7 03
0310: A9 40 0312: 85 14 0314: 20 E3 DF
0317: 0319: 031B : 031D: 031F: 0322:
0325: 0327: 0329: 032B: 032 E:
AO Bl 49 FO 20 4C
A5 45 30 20 4C
04 9B 01 06 57 03 96 EI
81 82 06 57 03 76 DD
033 1: A9 06 0333: 85 16
0335: 0337: 0338: 033A: 033C: 033 E: 0340:
A5 18 69 85 A5 69 85
9B 07 04 9C 00 05
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
0342: C8 0343 : Bl 9B 0345: 85 01
73 74 75 76 77
&- Vektor setzen LDA STA LDA STA LDA STA RTS
#$4C AMPER *<START AMPER+l *> START AMPER+2
;JMP ;Ampersand Sprung;vektor setzen
Variable suchen , nicht neu anlegen START
LDA #$40 STA SUBFLAG JSR PTRGET
;nicht neu ;einrichten ;l. Variable
Nur eindimensionale Felder LDY LDA EOR BEQ JSR JMP
#$04 (LOWTR) ,Y #$01 OKAY ENDE BSSERR
;Dimensionen ;nur 1 erlaubt ;Flagge zurück ;Bad Subscript Error
Prüfen, ob Zeichenkette OKAY
LDA EOR BMI JSR JMP
VARNAM VARNAM+l OKAYl ENDE MISMTCH
;l. Zeichen ; 2. Zeichen ;String ; Flagge zurück ;Fehlermeldung
Vergleichs flagge setzen für OKAYl
LDA #$06 STA CMPFLG
Auf Variable mit Index LDA CLC ADC STA LDA ADC STA
(
=
; (=
o
zeigen
LOWTR #$07 LINKS LOWTR+l #$00 LINKS+l
; auf l. Wert ;zeigen ;Übertrag
Feldgröße bestimmen. Wert-l ist die Anzahl der Durchläufe INY LDA (LOWTR) , Y ;Anzahl Hi STA ZAHL+l
6.5 Etwas Ordnu ng kann nicht schaden 0347 : 0348 : 034A: 034B : 0340: 034F': 0351 : 0353: 0355:
C8 BI 38 E9 85 BO C6 05 00
9B 01 00 02 01 01 07
0357: A9 00 0359: 85 14 035B : 4C 95 09
035E: 0360: 0362 : 0364:
A6 A4 84 86
01 00 02 03
0366 : A5 04 0368: A6 05
036A : 036B : 0360 : 036F': 0371 : 0372 : 0374: 0376: 0378 : 037A: 037C: 037E:
18 69 85 85 8A 69 85 85 A5 A6 85 86
03 AO 06 00 Al 07 04 05 A8 A9
0380: 20 70 DF' 0383: A5 90 0385: 00 OF'
0387: 0389: 038B: 038C: 038E: 0390: 039 1 :
AO BI AA BI 91 8A 91
02 04 06 04 06
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
NODEC
INY LDA SEC SBC STA BCS DEC ORA BNE
149 (LOWTR ) , Y
;dito Lo
*$01 ZAHL NODEC ZAHL+l ZAHL+l LOOPI
;-1
Flagge zurücksetzen , dann nächster Befehl ENDE
LDA *$00 STA SUBF'LAG JMP DATA
;ENDE ! !
Äuße re Sc hleife LOOPI
LDX LDY STY STX
ZAHL+l ZAHL COUNT COUNT+l
;Hi ;Lo
LDA LINKS LDX LINKS+l Inne re Schleife LOOP2
CLC ADC STA STA TXA ADC STA STA LDA LDX STA STX
*$03 MF'AC+3 RECHTS *$00 MF'AC+4 RECHTS+l LINKS LINKS+l SF'AC+3 SF'AC+4
JSR STRCMP LDA MF'AC BNE NOSWAP
;merken ;ev. Übertrag
;vergleichen
Variablen-Deskriptor tauschen SWAP
LDY LDA TAX LDA STA TXA STA
*$02 (LINKS), Y ;retten (RECHTS) , Y (LINKS), Y (RECHTS), Y
6. Und imm er schön variabel bleiben!
150 0393: 88 0394 : 10 F3
0396: 0398 : 039A: 039C: 039E: 03AO: 03A2: 03A4: 03A6: 03A8:
A5 DO C6 C6 A5 05 FO A5 A6 DO
02 02 03 02 02 03 06 06 07 CO
03AA: 03AC: 03AD: 03AF: 03Bl: 03B3: 03B5: 03B7: 03B9: 03BB: 03BD: 03BF: 03Cl: 03C3:
A5 18 69 85 90 E6 A5 DO C6 C6 A5 05 FO DO
04 03 04 02 05 00 02 01 00 00 01 94 99
132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
DEY BPL SWAP Schleifenenden, Zähler heruntersetzen NOSWAP INNEN
AUSSEN
ENDTEST ET
LDA BNE DEC DEC LDA ORA BEQ LDA LDX BNE
COUNT INNEN COUNT+l COUNT COUNT COUNT+l AUSSEN RECHTS RECHTS+l LOOP2
LDA CLC ADC STA BCC INC LDA BNE DEC DEC LDA ORA BEQ BNE
LINKS *$03 LINKS ENDTEST LI NKS+l ZAHL ET ZAHL+l ZAHL ZAHL ZAHL+l ENDE LOOPI
;innere Schleife
; hi ; immer
;Übertrag
Das BASIC-Programm zeigt die Leistungsfähigkeit und die Syntax von BSORT.
BSORT.DEMO 1 5 10 20 30 40 50 60 70 80 90 100 110 170 180 190
REM *** SORTIER-DEMONSTRATION *** CLEAR TEXT PRINT CHR$ (4); "BRUN BSORT . OBJ" HOME VTAB 5: INPUT "ANZAHL DER ZU SORTIERENDEN STRINGS? ";N DIM A$(N) B$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" HOME: VTAB 5 : FLASH: PRINT "STRINGS WERDEN ERZEUGT": NORMAL FOR I = 1 TO N: FOR J = 1 TO 10 A$(I) = A$(I) + MID$ (B$, INT ( RND (1) * 26) + 1 , 1 ) NEXT J,I HOME FOR I = 1 TO N: PRINT A$(I): NEXT PRINT INPUT " SORTIERBEGINN "; C$ & A$(l) PRINT: INPUT " FUER SORTIERTE LISTE"; C$ HOME: VTAB 5: FOR I = 1 TO N PRINT I ; : POKE 36 , 5 : PRINT A$(I): NEXT I
6.5 Etwas Ordnung kann nicht schaden
151
Zum Aufruf und zur Parameterübergabe benutzen wir wieder den A mpe rsandVektor, der in den Zeilen 26 bi s 32 initiali siert wird. Jeder Aufruf führt da nn zu START in Zeile 36. Vo r der Suche der Va riable n mittels PTRGET wird SUBFLAG ($0014) a uf $40 (B it 6) gesetzt. Das ve rhindert, daß PTRGET die bezeichnete Variable neu a nlegt, fa lls sie noch nicht existi ert , denn wir wollen nur vorhandene Felder sortieren. Da BSORT nu r für eindime nsio nale Felder geeignet ist , wird in Zeile 40/41 die Dimensionsanzahl ge prüft und im Fehlerfall die Meldung "BAD SUBSCRIPT ERROR" ausgegebe n, nachdem zuvor noch di e SUBFLAG zurückgesetzt wurde. Da BSORT nur Zeichenketten bearbeiten kann , muß geprüft werden , ob das aufgerufene Variab lenfeld einen String bezeichnet. Dazu werde n die vo n PTRGET in V ARNAM abgelegten ersten beiden Va ri ablenzeichen miteinander EOR-ve rknüpft. Bei ein e r Zeichen kette ist Bit 7 im ersten Byte gelöscht und im zweite n Byte gesetzt. Durch Excl usiv-ODER verknüpft e rhalte n wir ein gesetztes Bit 7 , also ein negatives Ergebn is. Bei den reellen Zahlen und den Ganzzah le n sind dagegen die Bits 7 e ntweder beide gesetzt ode r beide gelöscht , sodaß die Verknüpfung immer ein gelöschtes Bit 7 und damit ein positives E rgeb nis liefert. Unser Test verläuft also ganz ei nfach und endet im Feh lerfa ll in de r Meldung "TYPE MISMATCH ERROR" . In den Zeilen 59/60 wird die Vergleichflagge CMPFLG ($0016) auf $06 gebracht , um den Vergleichstyp 4 (SFAC) = (MFAC) => 2 (SFAC) > (MFAC) => 1.
152
6. Und immer schön variabel bleiben!
Sie können auch zwei Gru ndoperationen verbinden: < und = ergibt 4 + 2 = 6. Genau diesen Wert haben wir deshalb vorhin nach CMPFLG geschrie ben. Ist das Ergebnis des Vergleichs "wahr", so trägt STRCMP eine 1 in MFAC ein , für "fa lsch" wird eine 0 nach MFAC geschrie ben (gen au gesagt: 8180 00000000 für 1 und 00 00 00 00 00 00 für 0). Der Anfang der inneren Schleife LOOP2 tut nichts weiter, als das linke (feste) E lement nach (SFAC) und das rechte E lement nach (MFAC) ei nzutrage n. Bei jedem Durchgang durch die innere Schleife wird (MFAC) auf das nächste E lement weitergesetzt , bis wir das Feldende erreicht haben. Ist das lin ke E lement (SFAC) < = dem rechten E lement (MFAC) , dann stimmt die Reihenfo lge schon, und wir brauchen beide E lemente nicht zu vertauschen. Bei dem E rgeb nis "wahr" muß also der Tausch übersprungen werde n. "Wahr" bedeutet eine 1 im MFAC. Wird der Exponent vo n MFAC in den Akkumulator gelade n (Zei le 120) , so führt "wa hr" zu einem Löschen des Zero-Bits im Statusregister. "Wahr" ist also identisch mit ein em "NOT EQUAL TO ZERO" . Daraus fo lgt , daß unser Verzweigungsbefeh l zum Umgehen des A ustausches "BNE" heißen muß. D ie Z eilen 125 bis 133 so llten Ihnen bekannt vo rkomme n. Es handelt sich um die Routine SW AP , die all erdings hier nur die drei Bytes des Deskriptors umsetzen muß , die bei einem Feld in der Tabelle stehen. Wenn das rechte E lement am Feldende angelangt ist , fa ll en wir in die äußere Schleife. D iese setzt das lin ke E lement um eine Position weiter und fü hrt zurück in die innere Schleife, bis auch das linke E lement das Feldende erreicht und wir mit dem Sortieren fertig si nd . Das Feldende wird allerdings dabei nicht direkt getestet. Vielmehr laufen für die innere und äußere Sch leife je ein Zähl er (ZAHL und COUNT) mit. Ist COUNT gleich Null , ist di e innere Schl eife abgelaufen, ist dagegen auch ZAHL gleich Null , so ist das ganze Programm beendet. Da sowohl ZAHL als auch COUNT 2-Byte-Zäh ler sind , ist das Herunterzählen und Testen auf Null ein klein wenig komplizierter als bei einfac hen Zählbytes.
6.5 Etwas Ordnung kann nicht schaden
153
STRCMP $DF7D Vergleicht zwei Zeichenketten miteinander. Zeiger auf 1. String in SFAC+3/4, Zeiger auf2. String in MFAC+3/4. CMPFLG ($0016) gibt die Art des Vergleichs an. Ist der Vergleich "wahr" , wird MFAC auf 1 gesetzt , andernfa lls auf O. Ei ngabe : SFAC+3/4 = Zeiger auf 1. String-Deskriptor MFAC+3/4 = Zeiger auf 2. String-Deskriptor CMPFLG (SFAC) > (MFAC) => 1 (SFAC) = (MFAC) => 2 (SFAC) > = (MFAC) => 3 (SFAC) < (MFAC) => 4 (SFAC) < > (MFAC) => 5 (SFAC) < = (MFAC) => 6 Ausgabe: MFAC = 1 (wahr), MFAC VALTYP ($0011) = 0
= 0 (falsch)
BSORT eignet sich nur für Zeichenketten. Wollen Sie Zahlen miteinander vergleichen , so bietet uns Applesoft eine weitere Routine an , die genau wie STRCMP arbeitet, aber nur Fließkomma-Zah len vergleicht , die komplett in MFAC und SFAC stehen müssen. Sie können zu diesem Transport z.B. MOVFM ($EAF9) und MOVSM ($E9E3) benutzen.
154
6. Und immer schön variabel bleiben!
COMP $DF6A Vergleicht zwei F li eßkom ma-Zah len miteinander , die im SFAC und MFAC stehen. CMPFLG ($0016) gibt die Art des Vergleichs an. Ist der Vergleich "wahr", wird MFAC auf 1 gesetzt , andernfa lls auf O. E ingabe: SFAC = 1. FP-Z ahl MFAC = 2. FP-Zahl CMPFLG ~FAC > MFAC => 1 SFAC = MFAC => 2 SFAC > = MFAC => 3 SFAC< MFAC => 4 SFAC MFAC => 5 SFAC 6 iAusgabe: MFAC = 1 (wahr) , MFAC = 0 (fa lsch)
Wenn Sie ein uni verse lleres Sortierprogramm benötigen , finden Sie im "Peeker 1/86" eine Q uicksort-Routine vo n H. Grumser , die noch ca . 10-mal schn eller als BSORT ist. Sie hat allerd ings den Fehler , SUBFLAG nicht wieder auf $00 zu setzen , weshalb z.B . nachfo lge nde INPUT-Befeh le abstürze n. Mit Ihren jetzigen Ke nntnissen wird Ihnen die Korrektur des QUICKSORT aber ni cht mehr schwerfallen.
155
7. Kleinvieh macht auch Mist Bevor wir uns an die letzten drei großen Projekte dieses Buches machen , woll en wir die Anwe ndung unserer bisherigen Ke nntnisse mit ei n paa r praktischen Programme n übe n.
7.1 Konstant im Wandel D ie Umwand lung zwische n Zah le n mit ve rschiedener Z ahl e n basis gehört zu den alltäglichen Aufgaben eines Assembler-Progra mmi ere rs. Deshalb ist in ASSESSOR auch eine e ntspreche nde Routine eingeba ut (d ie Fragezeichen-Funktion) , die Sie ständig aufrufen kö nn en. Das Programm HEX-DEZ könn en Sie dagegen z .B. benutzen , wenn Sie BASIC-Programme schreibe n. Es wird in die unter BASIC fre ie Seite 3 geladen und mit de m A mpe rsand-Vekto r direkt a ufgerufen. Dabei be nutze n wir wieder za hlreiche ROM-Routine n, die fast die gesamte Arbeit für uns verrichten.
HEX-DEZ 1 2 3 4 5 6 7 8 9 10 11
12 '13 14 15 16 17
;********************* * HEX - DEZ CONVERT * * ;********************* ORG $300 A2L A2H LINNUM CHRGET TXTPTR DOSWRM AMPER F'RMEVL SYN ERR GETADR
EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU
$003 E $003F' $0050 $00B 1 $00B8 $03DO $03F'5 $DD7B $DEC9 $E752
7. Kleinvieh macht auch Mist
156
0300: 0302: 0305: 0307: 030A: 030C: 030F:
A9 8D A9 8D A9 8D 4C
4C F5 12 F6 03 F7 DO
03 03 03 03
0312: C9 44 0314: DO OE 0316: 0319: 031C: 031F: 0321:
20 20 20 A6 4C
Bl 7B 52 50 41
00 DD E7 F9
0324 : C9 48 0326: FO 03 0328: 4C C9 DE 032B: 032D: 032F: 0330: 0332 : 0334: 0337: 0339: 033C: 033E: 0340:
A2 A4 C8 09 81 20 DO 20 A5 A6 4C
00 B8 80 B8 Bl 00 F7 A7 FF 3F 3E 24 ED
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
LINPRT PRNTAX GETNUM
EQU $ED24 EQU $F941 EQU $FFA7 LDA STA LDA STA LDA STA JMP
U 4C AMPER *< START AMPER+l *) START AMPER+2 DOSWRM
START
CMP * 'D' BNE NODEZ Dezimal nach Hexadezimal JSR CHRGET ; l. Ziffer lesen JSR FRMEVL ;Ausdruck - ) FAC ;FAC - ) LINNUM,A-Y JSR GETADR LDX LI NNUM ;Lo JMP PRNTAX ;hex. ausgeben
NODEZ
HEXDEZ MASKE
CMP * 'H' BEQ HEXDEZ JMP SYNERR LDX LDY INY ORA STA JSR BNE JSR LDA LDX JMP
; ungül tig
; init. ; merken und ; auf l. Ziffer zeigen U80 ;Bit7 setze n (TXTPTR,X) ;X = 0 ! CHRGET ; nächstes Zeichen ; 0 = Ende MASKE ; ASCII - ) HEX GETNUM A2H ;Hi A2L ;Lo LINPRT ;dez . ausgeben *00 TXTPTR
Der Ampersand-Vektor wird in der uns schon bekannten Art auf START gesetzt. Wenn wir das Programm aufrufen wollen , geben wir ein & ein , gefolgt von "D" für eine Dezimalzahl oder "H " für eine HEX-Zahl. Danach steht die Zahl selber. Ihr Wertebereich umfaßt 0 bis 65535 ($0000 - $FFFF). Beim Auftreten des &-Zeichens springt der BASIC-Interpreter über $03F5 nach START, wobei sich das Zeichen nach dem & (hier also D oder H) im Akkumulator befindet. Wenn es ein "D" ist , gelangen die Zeilen 32 bis 37 zur Ausführung. JSR CHRGET stellt den TXTPTR auf das folgende Zeichen und holt es in den Akkumulator. Dies ist die Vorbedingung für die Routine FRMEVL ($DD7B) , die einen beliebigen Ausdruck an der TXTPTR-Stelle auswertet und nach MFAC schreibt. FRMEVL gehört zu den mächtigsten Teilen von Applesoft und verarbeitet auch beliebige Kombinationen aus Konstanten und Variablen. 25*A-1O wäre also z.B. erlaubt. Ist der Ausdruck
7.1 Konstant im Wandel
157
numerisch, steht in MFAC die ungepackte Fließkomma-Zahl. Ist der Ausdruck eine Zeichenkette, steht ein Zeiger auf den Deskriptor im dritten und vierten Byte des MFAC. GETADR ($E752) wandelt den MFAC in eine Ganzzahl in LINNUM ($0050/51) bzw. im Y-Register und im Akkumul ator um. PRNTAX ($F941) gibt schließlich diese Ganzzahl hexadezimal über COUT aus. Dazu muß das Hi-Byte im Akku und das Lo-Byte im X-Register stehen. Das X-Register wird aus LINNUM geladen , der Akku ist bereits korrekt gesetzt.
FRMEVL $DD7B Wertet beliebigen Ausdruck eines Typs aus. Eingabe: TXTPTR zeigt auf 1. Zeichen des Ausdrucks Ausgabe: TXTPTR zeigt hinter den A usdruck a) Ausdruck ist numerisch MFAC = Fließkomma-Zahl des Ausdrucks VALTYP ($0011) = $00 b) Ausdruck ist Zeichen kette MFAC+3/4 ($00AO/A1) e nthält Zeiger auf den Deskriptor VALTYP ($0011) = $FF
GETADR $E752 MFAC «65536) wird in 4-stellige Hexzahl ohne Vorzeichen in LINNUM umgewandelt. Eingabe: MFAC enthält Fließkomma-Zahl Ausgabe: LINNUM ($0050/51) = Ganzzahl-Anteil von MFAC Akku = Hi-Byte, Y-Reg = Lo-Byte
158
7. Kleinvieh macht auch Mist
PRNTAX $F941 Akkumul ator und X-Register werden als HEX-Zah l über COUT ausgegeben. E ingabe: Akku = Hi-Byte der Zahl X-Reg = Lo-Byte der Zahl A usgabe: Akku verändert
PRNTYX $F940 Y- und X-Register werden als HEX-Zah l über COUT ausgegeben. Eingabe: Y-Reg = H i-Byte der Zah l X-Reg = Lo-Byte der Zahl A usgabe: Akku verändert
War der Ken nbuchstabe ein "H ", werden die Zei len 43 bis 53 ausgeführt. In jedem anderen Fa ll wird "SYNTAX ERROR" ausgegeben.
SYNTERR $DEC9 Gibt "SYNTAX ERROR" aus E in gabe: Ausgabe: Fehlermeldung über COUT. Macht BASIC-Warmstart oder springt in eine ONERR-Behandlung.
Da wir unser Programm aus einer BASIC-Umgebu ng aufrufen , wird unsere E ingabezeile von Applesoft bearbeitet, d.h . sie wird bei einer Direkteingabe mit gelöschtem Bit 7 im Tastaturpuffer abgelegt. Die Zei len 43 bis 49 setzen wieder
7.2 E in Spürhund für Ad ressen
159
Bit 7, bis sie auf ein Zeil enende ($00) oder ein Befehlsende (: = $22) stoßen. GETNUM ($FFA 7) wa ndelt die ASCII-kodierte E ingabe in eine 2-Byte H EXZ ahl in A2L1H ($003E/3F) um . LINPRT ($ED24) schließlich gibt den Inh alt vo n Akk umulator (Hi) und X-Register (Lo-Byte) über COUT als Dezimalzahl aus.
GETNUM $FFA7 Wa ndelt eine 2 bis 4-stellige HEX-Za hl enke tte (ASCII-kodiert mit Bit 7 gesetzt) in eine 1-2 Byte HEX-Zahl in A2L und A2H. E inga be: Zeichen kette im Tastaturpuffer ab $0200 , B it 7 gesetzt Y-Reg = Position im Puffer (normal auf $00 setzen) A usgabe: A2L1H ($003E/3F) e nth ält HEX-Zahl (Lo/H i) .
LINPRT $ED24 G ibt 4-stellige HEX-Za hl dezim al über COUT aus . E inga be: X-R eg = H i-Byte, Akk u
= Lo-Byte
A usgabe : -
7.2 Ein Spürhund für Adressen E ine der sinnvo llsten A rten , die Asse mbler-Programm ierung zu e rlernen, ist das Di sassembli eren und Ve rstehen vo n fremden Programm en. D abei kann es sich um die eingebauten ROMs handeln oder um belie bige ladbare Maschinenprogramme , di e irgendetwas für Sie Interessantes tun . Der zu nächst schwierigste Teil bei diesem "Schnuppern " in fre mde n Geda nke ngängen ist es, einen Überblick über die verschi edenen T eile ein es Gesamt programms zu erhalten. In
160
7. Kleinvieh macht auch Mist
der R egel macht man sich da ran, kleine Teile , die leicht verstä ndlich sind , zu disassemblieren und zu ko mme ntieren . We nn Sie so eine n kleinen Teil verstande n habe n , ist es sicher interessan t zu wisse n, welche übrigen Tei le des Gesamtprogramms die von Ihnen verstande ne U nterrouti ne benutzen. Sie müssen dazu das gesamte Progra mm nach A ufrufe n für dieses U nterprogra mm durchsuchen . Da dies eine sehr zeitaufwä ndige Tätigkeit sein ka nn , schreiben wir uns für eine auto matische Suche ein kleines Program m. D ieses durchkämmt wie ei n Spürhund einen vo n Ihne n angegebenen Speicherbereich und listet Ihne n all e Zeilen , di e einen A ufruf der vo n Ihnen spezifizierte n Ad resse e nthalte n.
CROSSREFERENZ 1 2 3 4 5 6 7 8 9 10 11
0300: 0303 : 0304 : 0306: 0309: 030C: 030 E: 03 11 :
AD 18 69 8D AD 69 8D 4C
72
14 F9 73 00 FA 69
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 AA 35 36 37 03 38 AA 39 40 03 41 FF 42
;******************************* Cross referenz für Adressen * * (C) 1985 Dr. Jürgen Kehrel * ;******************************* Start mit BRUN unter DOS 3.3 Holt seine Ladeadresse aus dem DOS und initia l isiert CTRL-Y
* Adresse kön nen Sie sie abb rechen . E in Drücken vo n sprin gt zur schn ellstmöglichen A usga be . D ie Idee zu diesem Programm kam mir beim "File-Reade r" von Ulrich Stiehl (Apple DOS 3.3 , Seite 186 der 2. A uflage). Ich habe dieses Programm häufig benutzt, und Sie werden bei der Bildschirmausgabe einige Ähnlichkeiten e ntdecken kö nn en. Zwei Dinge habe n mich gestö rt : 1) Die Geschwindigkeit ist nicht gut regulierbar. Hier ist die Abhi lfe leicht möglich . 2) Die Diskette mit de m Textfile darf nicht schreibgeschützt sein. Dieses Problem ist schon schwieriger. U lrich Sti ehl wendet den vo n ihm e rdachte n "UNLOCK"-T rick an , um auf einfache Weise in den Besitz der T rack-Sektor-Liste (TSL) des Fi les zu kom men. UNLOCK schreibt aber auf die Diskette, auch wenn de r File nicht ges perrt sein so llte . Wenn wir den scho n aus dem le tzten Kapitel bekannten Fi le-Ma nager einsetzen, kö nne n wir mit relativ gerin gem Mehraufwand auch a n die TSL herankomm e n , ohne da ß dazu ein Schreibzugriff nötig wäre. Das Kommando " OPEN" des
192
9. Blitz-Leser
File-Managers (Achtung, nicht identisch mit dem DOS-Befehl OPEN ') liest ebenfalls die erste TSL des eröffneten Files ein. Die weitere Arbeit lassen wir durch einen zweiten Programm teil des DOS machen. Die RWTS (Read/Write Track/Sektor) liest ganze Sektoren in den Speicher. Dies geschieht über die RWTS bis zu 15-mal schneller als mit norm alen DOS 3.3-Kommandos , die viel Zeit für Ve rwa ltungsaufga ben verlieren. Nebenbei bemerkt: ProDOS besitzt schnellere Schreib- und Leseroutinen (RWTB = Read/Write Track/Block) als DOS , betreibt aber ein en noch größeren Verwaltungsa ufwa nd , so daß diese Vorteile zum Teil wieder ve rloren gehen. Wie für den File-Manager müssen wir auch hier eine Parameterliste anlegen und Vektoren auf der Seite 3 benutzen. Bevor wir dies im einzelnen besp rechen, könn en Sie sich jetzt schon in das Listing vertiefen.
A bb . 11: Ve rein fac hter A bl aufpl an des schne lle n Fil e-Lese rs
8. Blitz-Leser
FILELESER
193 1 2 3 4 5 6 7 8 9 10 11
0803 0804 0807 080A
D8 20 2F FB 20 58 FC A9 07
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
;******************************* Schne ll er File-L eser für * Text- Fi l es * (C) 1986 Dr. Jürgen Kehrel * ;******************************* Version 2.0
PTRIOB PTRFMPL PTRTSL PTRTRK PTRPUF YSAVE CH PROMPT PREG PTRPRT
EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU
$0000 $0002 $0004 $0006 $0007 $0009 $0024 $0033 $0048 $OO CE
IN
EQU $02 00
DOSCLD FLEMGR RWTS GETFMPL GETIOB CONNECT
EQU EQU EQU EQU EQU EQU
PUFFER
EQU $1000
KBD STROB E
EQU $COOO EQU $C010
TEXT TABV BELL CLREOP HOME WA I T RDKEY GETLN SETKBD SETVID COUT
EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU
;+$0001 ;+$0003 ;+$0005 ;+$0008 ;Cursor horz. ;Prompt ;P-Regis t er ;+$OOCF ; Tastaturpuf.
$03D3 $03D6 $03D9 $03DC $03 E3 $03 EA
$FB2F $FB5B $FBDD $FC42 $FC58 $FCA8 $FDOC $FD6A $FE89 $FE93 $FDED
;$10 00 - $8AFF
;Position ; Lösche n ;Warteschleife ;Taste le se n ; Zeile le se n
ORG $803 Titel und Menü ausgeben START
CLD J SR TEXT JSR HOME LDA n
; Binärmode
194
9. Blitz-Leser
080C: 080E: 0810: 0813: 0816: 082E: 082F: 0831 : 0833: 0835: 0838: 083B: 084B: 0855: 0857: 0859: 085B: 085E: 0864: 0866: 0868: 086A: 0860: 0870: 0872: 0875: 0877: 0878:
85 A9 20 20 AA 00 A9 85 A9 20 20 06 AO 80 A9 85 20 A8 80 A2 A9 20 AO 10 80 30 CA 00
24 OA 5B FB 3E OB AO 03
087A: 0870: 087F: 0882: 0885: 0892: 0894: 08Bl : 08B3: 08C7: 08CB: 080C: 08EA: 08EB: 08EE: 08FO: 08F2: 08F4: 08F6: 08F9:
20 A9 20 20 CC 80 C4 80 AO 80 BC AO 00 20 C9 FO C9 00 20 4C
58 OA 5B 3E C5 80 C9 80 AO 80 02 BC
06 24 14 5B 3E CF C2 00 10 24 3E BI 00 32 C4 A8 00 05 10 03
FB OB CE AE
OB B9
FC CO CO
EE FC FB OB C7 C5 AO 80 C5 C5
OC FO 80 OA 9B F5 58 FC 03 03
08FC: 20 EA 03 08FF: 20 3E OB
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
MENUE WARTEN
WARTEl MENUE I
EINGABE
STA CH LOA #10 JSR TABV JSR PRINT ASC "* SCHNELLER FILE-LESER *" HEX 00 LOA #6 STA CH LOA #20 JSR TABV JSR PRINT ASC "VON OR. JUERGEN" ASC " B. KEHREL" HEX 80 , 00 LOA #16 STA CH JSR PRI NT ASC "( 1986)" HEX 8000 LOX #$32 LOA #$C4 J SR WAI T LOA KBO BPL WARTE l STA STROBE BMI MENUEI OEX BNE WARTEN J SR LOA JSR J SR ASC HEX ASC HEX ASC HEX ASC ASC HEX JSR CMP BEQ CMP BNE JSR JMP
HOME #10 TAB V PRINT "LEGEN SI E 8080 "OIE OI SKETTE MIT OEM TEXTFILE" 8080 IN LAUFWERK I" " 80808080 " = START," " <ESC > ENOE " 00 ROKEY #$80 ;Return OIR #$9B ;Escape EI NGABE HOME OOSCLD
Lies OOS-Catalog OIR
J SR CONNECT J SR PRINT
;OOS anhängen
8. Blitz-Leser 0902 : 0905: 090F : 09 11 : 0914 :
AO C3 8D 20 4C
8D Cl 00 OC 31
195 84 D4 FD 09
0917: 091A: 091D: 0920: 092F :
20 20 87 05 8D
42 3E 87 09 00
FC OB 8D OE
093 1 : 0934: 0938: 093A: 093C: 093F: 0953: 095B: 095D: 095F: 0962: 0965: 0968: 096A: 096C: 096D: 096F:
20 AO A9 85 20 CE 8D A9 85 20 20 20 EO BO 8A DO 4C
3E 8D 05 24 3E Cl AO 3E 33 89 93 6A IF AB
OB 8D
0972 : 0974: 0976: 0979 : 097A:
AO A9 99 88 10
097C: 097D 0980 0982 0985 0986
CA BD 09 9D CA 10
0988 098B 098E
OB CD AO FE FE FD
03 7A 08
ID AO 78 OB FA 00 02 80 78 OB F5
8E F3 OA 20 EA 03 20 42 FC
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
HEX ASC HEX JSR JMP
A08D84 "CATALOG,Dl" 8DOO RDKEY FERTI G ;immer
Textfil e name (Eingabefile ) ZULANG
J SR JSR HEX INV HEX
CLREOP ; Lösche bis PRINT ;Seitenende 87878D ;Piep "EINGABE ZU LANG" 8DO O
FERTIG
JSR HEX LDA STA J SR ASC HEX LDA STA JSR JSR JSR CPX BGE TXA BNE JMP
PRINT A08D8DOO *5 CH PRIN'I' "NAME DES TEXTFILES ?" 8DAOAOAOAOA02DOO U3 E ; Pr ompt-Zeichen PROMPT SETKBD ; DOS abhängen SETVID GETLN ;Ein gabe von ; max. 30 Z *31 ZULANG LESEN MENUEI
;nur Return ;zurück
Tastat ur puffer - ) Fil ename npuffer LESEN LOESCH
COPY
LDY LDA STA DEY BPL DEX LDA ORA STA DEX BPL
*29 UAO FILE , Y
; Fil enamenpuffer ;löschen
LOESCH IN , X U80 FILE,X COPY
;o hn e PUFFER (PTRIOB), Y uO O U03 ;VO LUME ( PTRIOB ), Y ; Kommando UOC UO l ; "READ " (PTRIOB), Y
Sektor für Sektor die TS L abarbeiten
198
9. Blitz-Leser
OA53: OA55: OA57 : OA59: OA5B: OA50: OA5F: OA60: OA62: OA64: OA66 : OA69: OA6C:
A4 Bl FO AO 91 A4 C8 Bl AO 91 20 20 BO
06 04 24 04 00 06
OA6E: OA70: OA72: OA73 : OA75 : OA77: OA79: OA7B:
AO Bl 18 69 91 E6 E6 00
09 00
04 05 00 E3 03 09 03 AA
01 00 06 06 06
OA70: AO 09 OA7F: Bl 00 OA81 : 80 01 OB OA84: OA86: OA88: OA8A:
A9 85 A9 85
00 07 10 08
OA8C: OA8E: OA90 : OA92: OA94: OA96: OA98: OA9A: OA9C : OA9E: OAAl : OAA4:
AO Bl FO 09 C9 FO C9 BO 29 20 AO 10
00 07 76 80 80 06 AO 02 lF' EO F'O 00 CO 4C
OAA6: OAA9: OAAB: OAAO: OABO: OAB2:
2C C9 00 4C C9 00
10 CO 9B 03 37 OB AO OA
27 1 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 29 1 292 293 294 295 296 297 298 299 300 30 1 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324
REAOLOOP
LOY LOA BEQ LOY STA LOY INY LOA LOY STA JSR JSR BCS
PTRTRK (PTRTSL), Y Track REAOENO kein weiterer Sektor U 04 Track (PTRI OB) , Y PTRTRK ;Sektor (PTRTSL), Y ;Sektor U0 5 (PTRI OB),Y GETIOB RWTS IOERR ; RWTS-Fehler
LOY LOA CLC AOC STA INC INC BNE
; Puffer Hi-Byte U 09 ( PTRIOB ) , Y ;+1 U Ol (PTRIOB ), Y PTRTRK ; Zeiger in der TSL PTRTRK ;we it ersetzen REAOLOOP
Die eingelesenen Sektoren a nzei gen REAOENO
AUSGABEl
AUSGABE2
LEER
LOY U 09 ;Puffer Hi LOA (PTRI OB), Y STA TESTENO+ l ; Endwert "poken " LOA STA LOA STA
* PUFFER PTRPUF+l
LOY LOA BEQ ORA CMP BEQ CMP BGE ANO JSR LOA BPL
*0 (PTRPUF ), Y ZUENOE U80 U 80 AUSGABE2 U AO AUSGABE2 U1 F' COUT KBO VERZUG
BIT CMP BNE JMP CMP BNE
STROBE U 9B LEER AUSGABE4 U AO CR
; Fil e zu End e ;Bit7 setzen ; ? ;Ja, ausgeben ;Control l -Zeichen? ; Nein, ausgebe n ;%000 1 1111 (Inverse ) ; Tastendruck? ;Nein, we iter ;Ja, zurücksetzen ; Escape ? Abbruch Leertaste ? ande re testen
8. Bli tz-Leser OAB4: OAB7: OAB9: OABC:
AD 10 8D 30
00 CO F'B 10 CO 3B
OABE : OACO: OAC2: OAC4 : OAC7 :
C9 DO A9 8D F'O
8D 07 00 F'3 OA 30
OAC9: OACB: OACD: OADO: OAD2 : OAD4: OAD6:
C9 DO AD C9 BO 69 DO
88 15 F'3 OA F'B 04 05 17
OAD8: OADA: OADD: OADF':
84 20 A4 4C
09 DD F'B 09 F'9 OA
OAE2: OAE4: OAE6 : OAE9: OAEB : OAED: OAEF':
C9 DO AD C9 90 E9 8D
95 OC F'3 OA 05 EB 05 F'3 OA
OAF'2: OAF'4: OAF'6: OAF'9: OAF'A :
A9 F'O 20 C8 DO
F'F' 03 A8 F'C 92
OAF'C: OAF'E: OBOO : OB02 :
E6 A5 C9 90
08 08 F'F' 8A
OB04 OB06 OB08 OBOA OBOC OBOE OBI0 OB12 OB14
AO BI F'O AO 91 AO BI AO 91
01 04 25 04 00 02 04 05 00
199 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 . 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378
PAUSE
LDA BPL STA BMI
KBD PAUSE STROBE AUSGABE3
CMP BNE LDA STA BEQ
U 8D PF'EIL 11$00 VERZUG+l AUSGABE3
CMP BNE LDA CMP BCS ADC BNE
11$88 SCHNELL VERZUG+l U F'B PIEPS 11$5 POKE
PIEPS
STY JSR LDY JMP
YSAVE BELL YSAVE AUSGABE3
SCHNELL
CMP BNE LDA CMP BCC SBC STA
11$95 VERZUG VERZUG+l 11$5 PIEPS 11$5 VERZUG+l
LDA BEQ JSR INY BNE
U F'F' AUSGABE3 WAIT
INC LDA CMP BLT
PTRPUF'+l PTRPUF'+l U F'F' AUSGABE 1
CR
PF'EIL
POKE VERZUG AUSGABE3
TESTEND
;Pause bis Tastendru ck ; zurücksetzen ;direkt weiter ; !OB ; Hi -Byte J SR RWTS eigene Tabelle nutzen
Wenn nach de m JSR RWTS das Ca rry-Bit gesetzt ist , trat ein Fe hle r a uf, dessen Code im relativen Byte $OD zu finden ist. Die RWTS verwe ndet inte rn di e Speicherstell e $0048, die gleichzeitig auch vo m Mon ito r benutzt wird. D amit es hi er nicht zu Konfli kten kommt, können wir $0048 nach jedem JSR RWTS auf $00 setzen. Der Fi le-Manager besitzt noch me hr Befeh le als die RWTS . Fo lglich fällt a uch die Paramete rliste komplizie rter aus. Sie müssen allerdin gs nicht imme r alle
Be fehl : Byte $00 Byte $01 Byte $02 Byte $03 Byte $04 Byte $05 Byte $06 Byt e $07 Byte $08 Byte $09 Byte $OA Byte $OB Byte $OC Byte $OD Byte $O E Byte $OF' Byte $10 Byt e $11 Vo l. Dry. Dry. Sl ot Sl ot
DEL . CAT. 05 06
POS. INIT VERIF'Y OA OB OC DOS-P neuer Rec. Name num. Vol. Vol. Vol. Rec. Vol. Vol. Drv . Dry. Dry. off. Dry. Drv. Sl ot Sl ot Sl ot Sl ot Slot LOCK UNL. REN. 07 08 09
Adresse des Name Name F'ilenamens adr. ad r . der Aus f ü h run g n ach unbenutzt Lo- Byte der Adresse des F'ile-Manager-Arbeitsbereichs (45 Byte) Hi- Byte der Adresse des F'ile- Manager- Arbeitsbereichs TSL-Lo Lo-Byte des TSL-Puffers TSL-Puffer Lo TSL-Hi Hi - By t e des TSL-Puffers TSL- Puffer Hi DatenDa t en-Puffer Lo Puffer Da t en- Puffer Hi
OPEN CLOSE READ WRITE 01 02 03 04 Untergruppe RecordRec. länge nummer RecordVol. Dry. offset PufferSlot Typ l ä nge Byte oder Name adr. Pufferadr. F' e h 1 e r c 0 d e
~
(1l
C
z
a.
:::i
::::I:JCI
-
(1l
0
0
0
_.
,....,.
,....
§ ::;
:::i
c,
"""'
~
~,
C'O
1» =
:::s
Cl.
-:
(t>
(1)
,....,.
_ .
o..
:::i
::l
(D
(j)
c;n
~;;l l::1:l tT1(1l(JQ'
-l ::> ::r~ 5: CD c t:C '""d :::. 1»' cb ;;; ::> C C Ü ~ 5 ° ' 0. ~ ~ ~ . (1l ::> ClO'V> ...,::> ::> ;:; . ~ 3:: ;l> :5.. a. PO ;:r Z '"d ~ @ 5 ' c %0110 0000 = $60 Fehler ERR 56: BAD BUFFER ADDRESS (Zielgeb iet belegt), ER R 28: NO DEVICE CONNECTED (U nitnummer eines nicht existi erenden Datenspeichers) sowie ERR 27 : VO ERRO R.
10.1 Gute Ko ntak te per Schnittste ll e
211
$81: WRITE BLOCK
PARMCOUNT = 3 Unitnummer - 1 Byte (DSSS 0000) Quellpuffer - 2 Byte-Adresse Blocknummer - 2 Bytes Der entsprechende Block mit dem Speicherin halt ab "Quellpuffer" wird auf den angesprochenen Datenspeicher geschrieben . Bei der U nitnummer ist in B it 7 die Laufwerksnummer D (0 = Laufwerk 1, 1 = Laufwerk 2) und in den Bits 4-6 die Siotnummer S (1-7) anzugeben . S6 ,D2 ~ % 11100000 = $EO Fehler wie bei READ BLOCK , nur kom mt noch ERR 2B: DISK WRITE PROTECTED hinzu.
$82: GET TIME
PARMCOUNT
=
0
Dieses COMMAND wurde nachträglich "eingeflickt" und bewirkt einen Aufruf von $BF06 - hier sollte dann ein Sprung zur Uhrenro utine (Standard : $F142) ste hen . Die offizielle Uhr hat folgende A usgabe: $BF90/91: Lo/Hi von JJJJJJJM MMMlTTTT. J = Jahr nach 1900 , M = Monat (1-12) , T = Tag (1 -31). $BF92/93: Lo/H i von SSSSSSSS MMMMMMMM . S = Stunde , M = Min ute Fe hler: keine .
$CO: CREATE
PARMCOUNT = 7 Path-Name - 2 Byte-Adresse Acces s - 1 Byte File-Type - 1 Byte Aux-Type - 2 Bytes Storage-Type - 1 Byte Creation Dat e - 2 Bytes Creation Time - 2 Bytes Mit di esem COMMAND werden Daten- oeler D irectory-Files e rstellt. Soll eine bereits ex istiere nde Datei ne u angelegt werden, muß sie erst mit $Cl DESTROY gelöscht werden. Access enthält ei ne B itmaske mit fo lgender Bedeutung: Bit 7 gesetzt , wenn Datei gelöscht werden ka nn
212
10. Mehr PRO als CONTRA
Bit 6 gesetzt , wenn Bit 5 gesetzt , wenn Bit 4-2 ungenutzt Bit 1 gesetzt , wenn Bit 0 gesetzt , wenn CREATE setzt Bit
Datei umbenannt werden kann Datei Back-Up benötigt auf Datei geschrieben werden kann von Datei gelesen werden kann. 5 automatisch.
Fi le-Type umfaßt folgende Haupt-Filetypen : Typ
Name
Bedeutung
$00 $01 $04 $06 $OF $19 $lA $1B $EF $FO $F1 $FA $FB $FC $FD $FE $FF
BAD TXT BIN DIR ADB AWP ASP PAS CMD bis $F8 INT IVR BAS VAR REL SYS
ohne Typ Datei mit Fehlerb lock ASCII-Textdatei mit Bit 7 = 0 Binärfile Subdirectory Appleworks Datenbank Appleworks Textverarbeitung Appleworks Tabellenkalkulation ProDOS PASCAL Befehls-Datei Benutzerdefiniert Integer BASIC File (?) Integer BASIC Variablen (?) Applesoft BASIC File Applesoft BASIC Variablen relokatives Assemblermodu l von EDASM System-File
Aux-Type enthält je nach File-Type unterschiedliche Angaben: für TXT die Record-Länge (Lo/Hi) , für BIN, BAS, VAR und SYS die Lade-Adresse (Lo/Hi). Ansonsten wird diese Information nicht benötigt. Der Parameter " Path-Name" enthält die Adresse , auf der der Pathname selber in ASCII mit vorangestelltem Längenbyte stehen muß. Der letzte Name im angegebenen Path ist der Name des zukünftigen Fi les.
213
10.1 Gute Kontakte per Schnittstelle
Die Unterscheidung zwischen "Datenfile" und "Subdirectory" hä ngt nur vom angegebenen Storage Type ab: für $OD wird ein Subdirectory Key Block erstell t, für 0/1/2/3 wird ein Datenfi le erstellt, der immer den Storage Type 1 (Säm ling) hat. We nn DATE un d TIME angegeben sind 00) , werden die Werte aus dem Parameterb lock benutzt, ansonsten wird die System-Zeit eingesetzt. Fehler: ERR: 27 IIO ERROR , ERR: 2B WRITE PROTECTED , ERR 40: INVALID PATHNAME , ERR 44/45 : DIRECTORYIVOLUME NOT FOUND, ERR 47 : DUPLICATE FILENAME , ERR 48: VOLUME FULL, ERR 49: VOLUME DIRECTORY FULL, ERR 4B : UNSUPPORTED STORAGE TYPE (für CREATE mit Storage Types 0/1/2/3/$D) , ERR: 5A FILE STRUCTURE DAMAGED (BIT-MAP defekt) .
«>
$Cl: DESTROY PARMCOUNT = 1 Path-Name - 2 Byte-Adres s e
Der File, auf dessen Namen "Path-Name" zeigt (siehe CREATE) , wird aus dem Directory entfernt, die zum Fil e gehörigen Blocks werde n wieder freigegeben. DESTROY ist ni cht möglich , we nn a) der Fi le OPEN ist , b) im Access-Byte des File-Eintrags Bit 7 nicht gesetzt ist , c) der Fil e ei n Subdirectory ist , das seinerseits noch weitere File-E in träge enthält. In diesen Fällen fo lgt ERR 4E: FILE ACCESS ERROR, ERR 50: FILE IS OPEN Weitere Feh ler: ERR: 27 IIO ERROR , ERR: 2B WRITE PROTECTED, ERR: 40 INVALID PATHNAME , ERR: 44 DIRCTORY NOT FOUND , ERR: 45VOLUMENOTFOUND , ERR: 46FILENOTFOUND , ERR: 4A INCOMPATIBLE FILE FORMAT
$C2: RENAME PARMCOUNT = 2 Path-Name - 2 Byte-Adresse Neuer Path-Name - 2 Byte-Adre sse
RENAME ist für Volumes , Subdirectories und Datenfi les möglich. Zur Definition der Path-Namen siehe unter CREATE.
214
10 . Mehr PRO als CONTRA
Der Unterschied zwischen neuem und alte m Path muß im letzten Na mensteil beider Paths auftrete n, ansonsten fo lgt ERR 40: INVALID PATH NAME. A lle anderen Namenstei le der Pat hs müssen gleich sein. Für Volumes ist RENAME nur möglich, we nn auf de m Volum e kein File (auch das Di rectory selber) OPEN ist , ansonsten fo lgt ERR 50: FILE IS O PEN . Für Subdi recto rieslDatenfiles wird zusätzli ch geprüft, ob der Access des Files das entsprechende Bit (B it 6) gesetzt hat. Ist das nicht der Fall , fo lgt E RR 4E: FILE ACCESS ERR OR. Existiert bereits ein File mi t de m neuen Namen, fo lgt ERR 47: DUPLICATE FILENAME. Weitere Fehl er: E RR: 27 1/0 ERROR, ERR: 2B WRITE PROTECTED , ERR: 40 INVALID PATHNAME , ERR: 44 DIRCTORY NOT FOUND , E RR: 45VOLUMENOTFOUND,ERR: 46FILENOTFOUND , ERR: 4A INCOMPATIBLE FILE FORMAT, ERR: 4B UNSUPPORTED STOR AGE TYPE, ERR : 57 DUPLICATE VOLUME
$C3: SET FILE INFO
PARMCOUNT = 7 Pat h-Name - 2 Byte- Adresse Access - 1 Byte File-Type - 1 Byte Aux-Type - 2 Bytes Nu ll - Fe l d - 3 Bytes Modification Date - 2 Bytes Modification Time - 2 Bytes Dieses COMMAND verä nd ert die Attribute (Eigenschaften) eines Files. SET FILE INFO ka nn fü r Volume Directories nicht angewandt we rden ; ERR 40: INVALID PATHNAME . Mit diesem COMMAND kann z ..8. der Access ein es Files neu gesetzt we rden, da das Sperren eines Files gegen e in SET FILE INFO ni cht möglich ist . Z u Path-Name , Access, File-Type , A ux-Type siehe unter CREATE. Das Null-Fe ld ka nn beli ebige We rte ann ehmen. Es existiert lediglich , um für di e ersten 7 Parameter dasselbe Format des P ARMBLOCK wie für GET FILE INFO zu erh alte n. Wenn DATE und TIME spezifiziert sind, werden diese Angaben benutzt , anso nsten wird die System-Zeit eingesetzt. Fehler: ERR: 27 IIO ERROR , ERR: 2B WRITE PROTECTED , ERR 40: INVALID PATHNAME , E RR 44/45/46 : DIRECTORY/vOLUME/FILE NOT FOUND , E RR: 4A INCOMPATIBLE FILE FORMAT, ERR : 4B
10 .1 Gute Ko nta kte per Schnittstelle
215
UNSUPPORTED STORAGE TYPE, ERR: 4E FILE ACCESS ERROR, ERR: 5A FILE STRUCTURE DAMAGED (BIT-MAP defekt).
$C4: GET FILE INFO PARMCOUNT = $OA (10) Path-Name - 2 Byte-Adresse Access - 1 Byte-Resultat File-Type - 1 Byte-Resultat Aux-Type - 2 Byte-Resultat / TOTAL BLOCKS Storage-Type - 1 Byte-Resultat BLOCKS US ED - 2 Byte-Resultat / TOTAL BLOCKS USED Modification Date - 2 Byte-Resultat Modification Time - 2 Byte-Resulta t Create Date - 2-Byte Resultat Create Time - 2-Byte Resultat Dieses COMMAND stell t das Gegenstück zu SET FILE INFO da r. Es li est die Attribu te ein er Datei in die Parameterliste ein . Von Ihnen mu ß led iglich PARMCOUNT und der Zeiger auf den Path-Namen gesetzt sowie da hinter de r benötigte Platz freigehalte n we rde n. Für SubdirectorieslDatenfi les enthä lt der A ux-Type de n A ux-Type und BLOCKS USED gibt die A nzahl der vom Fil e be legte n Blocks an. Dem Null-Fe ld vo n SET FILE INFO entsprechen hier Storage-Type und BLOCKS USED. D iese beide n Parameter sind mit SET FILE INFO nicht verände rbar. Für Vo lume Directories wi rd anstell e des A ux-Type die Gesa mtkapazität des Volum es (TOTAL BLOCKS) und für BLOCKS USED die Gesamtza hl de r auf dem Vo lume belegten Blocks (TOTAL BLOCKS USED) zurückgeli efert. Z u den Defini tionen de r Para meter siehe CREATE. Für Storage-Type gilt: $0 = gelöschter Fi le $1 = Seedling (Sä mling) mit max. 1 Datenblock $2 = Sapling (Schöß li ng) mit einem Indexblock $3 = T ree (Ba um) mi t einem Maste rb lock $D = Subdirectory Fehler: E RR: 271/0 ERROR , ERR 40: INVALID PATHNAME , ERR 441 45/46: DIRECTO RYNOLUME/FILE NOT FOUND , ERR: 4A INCOMPATIBLE FILE FORMAT, ERR : 4B UNSUPPORTED STORAGE TYPE , E RR : 5A FILE ST RUCTURE DAMAGED (B IT-MAP defekt).
216
10. Mehr PRO als CONTRA
$C5: ON LINE
PARMCOUNT = 2 Unitnummer - 1 Byte (DSSS 0000) oder $00 ("Alle " ) Zielpuffer - 2 Byte- Adresse ON LINE schreibt den Volume-Namen der/des adressierten U nits (U nitnummer siehe READ BLOCK) ab der Adresse "Zielpuffer " in den Speicher. Wenn die Unitnummer mit $00 angegeben ist , werden sämtliche Units aus der DEVICE T ABLE bearbeitet. Bei einer spezifizierten Unitnummer $00) müssen $10 , ansonsten $100 Bytes bereitgestellt werden . Ist der entsprechende Speicherbereich als belegt deklariert , fo lgt ERR 56: BAD BUFFER ADDRESS. Pro U nit werden 16 Byte ausgegeben: O. Byte: DSSSNNNN (D = Drive , S = Slot, N = Länge Volume-Name 1. -15. Byte: Fehlercode oder Volume-Name ohne Schrägstrich Bei ERR: 57 enthält Byte 3 die Nummer des anderen Units mit gleichem Volume-Namen. Das E nde der E inträge ist durch $00 in Byte 0 und 1 gekennzeich net.
«>
Fehler: ERR: 28 NO DEVICE CONNECTED, ERR : 2E DISK SWITCHED AND FILE OPEN , ERR: 45 VOLUME NOT FOUND , ERR 52: NOT A PRODOS VOLUME, ERR 57: DUPLICATE VOLUME (wenn zwei Volumes den selben Namen haben und auf mindestens einem der beiden Volumes ein File OPEN ist).
$C6: SET PREFIX
PARMCOUNT = 1 Path-Name - 2 Byte-Adresse Dieses COMMAND setzt ein PREFIX und sucht das entsprechende Vo lume bzw. die entsprechende Subdirectory. Path-Name siehe CREATE. Ist das erste Zeichen ei n "I", so wird das alte Prefix ersetzt, ansonsten wird der neue Path-Name an das alte Prefix zu einem neuen Prefix angehängt. SET PREFIX ist auch mit einer Länge vo n $00 möglich , d.h. der Pathname besteht nur aus einem "I" . In diesem Fall wird das PREFIX gelöscht. Feh ler: ERR 40: INY ALID PATHNAME ("letztes File im Path-Name ist kei n Subdirectory" oder " Gesamt-Prefix länger als $40 Zeichen"), ERR: 44/45/46 DIRECTORYIVOLUMEIFILE NOTFOUND , ERR: 4A INCOMPATIBLE
10.1 G ute Kontakte per Schni ttstelle
217
FILE FORMAT, ERR: 4B UNSUPPORTED STORAGE TYPE, ERR: 5A FILE STRUCTURE DAMAGED (BIT-MAP defekt).
$C7: GET PREFIX PARMCOUNT = 1 Zi e lpuffer - 2 Byte-Adresse Das PREFIX wird in den Zielpuffer ($40 Bytes Platzbedarf) kopiert (beginnend mit Längenbyte und ein letzte r "I" angehängt). Ist kein PREFIX gesetzt , fo lgt Rücksprung ohne Feh le r. Fehler: ERR 56 : BAD BUFFER ADDRESS.
$C8: OPEN PARMCOUNT = 3 Pat h-Name - 2 Byte-Adresse Filepuffer - 2 Byte-Adresse Referenz-Nummer - 1 Byte Resultat OPEN sucht ein e Datei und reserviert für sie einen IIO-Puffer. Der Fi le muß bereits existieren , ansonsten folgt ERR 46: FILE NOT FOUND. In der System Bit Map wird der Filepuffer mi t einem Platzbedarf von $400 Bytes ab der angegebenen Startadresse (Lo-Byte muß $00 sein !!) geprüft und belegt. Ist der entsprechende Platz nicht frei , fo lgt ERR 56: BAD BUFFER ADDRESS. Die Referenz-Numme r (1-8) wird in den Parameterblock eingetrage n. Über diese Nummer finden alle zuk ünftigen Aktion en mit diesem File statt. Sie muß deshalb vom Programm zwischengespeichert werden. Es können maxim al 8 Files gleichzeitig geöffnet sein. Fehler: ERR: 27 IIO ERROR , ERR 40: INVALID PATHNAME , E RR: 42 MAXIMUM NUMBER OF FILES OPEN , ERR 44/45/46 : DIRECTORYI VOLUME/FILE NOT FOUND, ERR: 4B UNSUPPORTED STORAGE TYPE , ERR 50: FILE IS (ALREADY) OPEN , ERR : 5A FILE STRUCTURE DAMAGED (BIT-MAP defekt) .
$C9: NEWLINE PARMCOUNT = 3 Referenz-Numm er - 1 Byte AND-Maske - 1 Byte Ende-Zeichen - 1 Byte
218
10. Mehr PRO als CONTRA
Das Command NEWLINE kann nur auf OPEN Fi les angewa ndt we rden und setzt ei ne End-Bed ingung für READ. Wen n NEWLINE aktiv ist , wird bei jedem Byte , das via READ gelesen wi rd , zuerst mit dem Masken-Byte ein AND durchgeführt. Danach erfolgt ein Vergleich mit dem E nde-Zeichen. Bei Übereinstimmung wird READ beendet. Das BASIC.SYSTEM setzt fü r Textfiles die Maske auf $7F und das E nde-Zeichen auf $OD. Damit endet jedes READ spätes tens bei einem ($8D oder $OD). Ist die Maske auf $00 gesetzt , ist NEWLINE deaktiviert. Fehler: ERR 43: INVALID REFERENCE NUMBER.
$CA: READ
PARMCOUNT = 4 Referenz- Nummer - 1 Byte Zielpuffer - 2 Byte-Adresse Anforderun gs-Zäh ler - 2 Bytes Übertragungs-Zäh ler - 2 Bytes Result at READ kann nur auf OPEN Files angewendet werde n. Es we rden die im Anfo rderu ngs-Zähler angegebenen Bytes ab der momentanen "Position im File" in den Zielpuffer gelesen. Vor READ wird EOF (END OF FILE) geprüft und die zu übertrage nde A nza hl an Bytes gegebenenfa lls herabgesetzt. Ist das EOF bereits erreicht , folgt ERR 4C: END OF FILE ENCOUNTERED. Bei akti vem NEWLINE endet READ ebenfalls, wenn das Ende-Zeichen erkannt wurde. NEWLINE setzt die Lesegeschwindigkeit bei größeren Datenmengen deutlich herab, da READ für A nforderungen vo n kompletten Blöcken ansonsten über einen "Schn ellgang" verfügt, der direkt ins Zielgebiet und nicht in einen Zwischenpuffer liest. Wenn nicht der gesamte Ziel puffer als frei markiert ist , folgt ERR 56: BAD BUFFER ADDRESS. Nach dem E nde vo n READ wird im Pa rameterblock der Übertragungs-Zäh ler mit der A nzahl der tatsächlich transferierte n Bytes besetzt . READ ve rschiebt di.e "Position im Fi le" um die A nzahl der gelesenen Bytes. Fehler : ERR: 27 IIO ERROR , ERR 43: INVALID REFERENCE NUMBER , ERR 4E: FILE ACCESS ERROR (B it 0 nicht gesetzt), ERR: 5A FILE STRUCTURE DAMAGED (BIT-MAP defekt).
10.1 G ute Ko ntakte per Sch ni ttstelle
219
$CB: WRITE PARMCOUNT = 4 Referenz-Nummer - 1 Byte Quellpuffer - 2 Byte-Adresse Anforderun gs-Zäh l er - 2 Bytes Übertr agu ngs-Zäh l er - 2 Bytes WRITE kann nur auf OPEN Fi les angewendet werde n. Es werden die im A nforderu ngs-Zähler angegebenen Bytes ab der momentanen " Position im Fi le" aus dem Quellpuffer in de n File geschri eben. Der File wird gegebenenfalls durch A nh ängen weite rer Blocks und Erhöhung des Storage Type erweitert. A uch der EOF erhöht sich . Das MLI versucht imm er , alle angeforderten Bytes auf den File zu schreiben . E in A bbruch kann nur durch eine Fehl erbedingung erfo lgen. Bis zu 512 Bytes werden zun ächst in ein em Zwischenpuffer gehalten. E rst wenn der Puffer voll ist , die Datei mit CLOSE geschlossen oder der Puffer mit FLUSH entleert wird , werden sie tatsächlich auf die Diskette geschriebe n. Damit alle Dateien voll ständig sind , so llten Sie jede Datei schli eßen, bevor Sie eine Diskette wechseln oder den Rechner ausscha lten. Nach Beendigung von WRITE wird in den Übertragungs-Zähler im Parameterblock die A nzahl der ta tsächlich geschri ebe nen Bytes eingetrage n. Während WRITE verschiebt sich die "Positi on im Fil e" um die Anzahl der geschriebenen Bytes. Fehler: ERR: 27 IIO ERROR, ERR: 2B WRITE PROTECTED , ERR 43: INV ALID REFERENCE NUMBER, ERR 48: VOLUME FULL , ERR 4E: FILE ACCESS ERROR (B it 1 nicht gesetzt), ERR: 56 BAD BUFFER ADDRESS, ERR: SA FILE STRUCTURE DAMAGED (BIT-MAP defekt) .
$CC:CLOSE PARMCOUNT = 1 Referenz-Nummer - 1 Byte oder $00 ("All e " ) Dieses COMMAND schreibt den 1I0-Puffer auf den OPEN File und akt ualisiert den Dateieintrag. Der Fil e-Puffer wird wieder freigegeben. Bei einer spezifizierten Referenz-Nummer muß das F il e OPEN sein , so nst fo lgt ERR 43: INVALID REFERENCE NUMBER. Bei einem "A ll e" (= $00) werden all e OPEN Files gesch lossen , wenn gleichzeitig das LEVEL-Byte ($BF94) auf $00 gesetzt wurde. CLOSE ruft FLUSH auf.
220
10. Mehr PRO als CONTRA
Bei einem "A lle" werden Fehlernummern zwischengespeichert , d .h es werden all e OPEN F iles wirklich bearbeitet. Fehler : ERR: 27 VO ERROR, ERR: 2B WRITE PROTECTED, ERR: SA FILE STRUCTURE DAMAGED (BIT-MAP defekt).
$CD: FLUSH
PARMCOUNT = 1 Refere nz-Nummer - 1 Byte oder $00 ("Alle " ) Dieses COMMAND arbeitet wie CLOSE , nur daß de r File nicht geschl ossen und sein Puffer nicht fre igegeben wird. Wenn längere Zeit nicht auf ein File geschrieben wird , können mit FLUSH zwangsweise der VO-Puffer geleert und die Dateieinträge aktualisiert werden. Bei einem "A lle" muß $BF94 (LEVEL) $00 sein , um all e Files zu bearbeiten. Fehler: ERR: 27 VO ERROR, ERR: 2B WRITE PROTECTED , ERR: 43 INVALID REFERENCE NUMBER , ERR: SA FILE STRUCTURE DAMAGED (BIT-MAP defekt).
$CE: SET MARK
PARMCOUNT = 2 Refer enz-Nummer - 1 Byte Position gewünscht - 3 Bytes (Lo/Mid/Hi ) Dieses COMMAND ka nn nur auf OPEN Files angewandt werden. Es setzt die "Position im File", die für den nächsten Z ugriff mit READ oder WRITE benutzt wird. Wird vom Benutzer eine Position spezifiziert , die hinter dem momentanen EOF des Fi les liegt, fo lgt ERR 4D : POSITION OUT OF RANGE . Das erste Byte der Datei hat die Position $000000 . Wegen der möglichen Maximall änge ei nes Fi les muß die "Position im Fi le" ein e 3-Byte-Zahl sein , wo bei das niederwertigste Byte vo rne steht. Fehl er: ERR: 43 INVALID REFERENCE NUMBER , ERR: SA FILE STRUCTURE DAMAGED (BIT-MAP defekt).
$CF: GET MARK
PARMCOUNT = 2 Refe renz-Nummer - 1 Byte Position im Fil e - 3 Byte-Resultat (Lo/Mid/Hi)
10.1 Gute Kontakte per Schnittstelle
221
Dieses COMMAND kann nur auf OPEN Files angewandt werden . Es kopiert die momentane "Position im File" , also den Start des nächsten READ oder WRITE, in den PARMBLOCK. Fehler: ERR 43: INVALID REFERENCE NUMBER
$DO: SET EOF PARMCOUNT = 2 Referenz-Nummer - 1 Byte neuer EOF - 3 Bytes (Lo/Mid/Hi) Dieses COMMAND kann nur auf OPEN Files angewandt werden. Es setzt den EOF (End Of File ~ Dateigröße) eines Files. SET EOF ist nur für Datenfiles und nicht für Subdirectories möglich. Ist WRITE nicht erlaubt (Bit 1 im Access-Byte gelöscht) , fo lgt ERR 4E : FILE ACCESS ERROR. Bei einer Vergrößerung des EOF entstehen sogenannte "Loch-Dateien", deren Blöcke beim nächsten WRITE belegt werden. Bei einer Verkleinerung des Files werden Blöcke aus dem File wieder fre igegeben und innerhalb der Master/Indexblock(s) gelöscht. Feh ler: ERR: 27 IIO ERROR , ERR: 43 INVALID REFERENCE NUMBER, ERR: 4D POSITION OUT OF RANGE, ERR : SA FILE STRUCTURE DAMAGED (BIT-MAP defekt) .
$Dl: GETEOF PARMCOUNT = 2 Referenz-Nummer - 1 Byte EOF - 3 Byte-Resultat (Lo/Mid/Hi) Dieses COMMAND kann nur auf OPEN Files angewandt werden. Es kopiert den momentanen EOF des Files in den PARMBLOCK. Fehler: ERR 43: INVALID REFERENCE NUMBER
$D2: SET BUF PARMCOUNT = 2 Referenz-Nummer - 1 Byte Pufferstart - 2 Byte-Adresse (Lo/Hi) Dieses COMMAND kann nur auf OPEN Files angewandt werden . Es setzt einen ne uen Fi lepuffer, wobei der Inha lt des alten in den neue n Fi lepuffer
222
10. Mehr PRO als CONTRA
kopiert und der alte Filepuffer wieder freigegeben wird. Alter und ne uer Puffer dürfen sich nicht überschneiden , das La-Byte der Adresse muß $00 se in . Ist der Bere ich des neuen Filepuffers ($400 Bytes) nicht vollständig frei , folgt ERR 56 : BAD BUFFER ADDRESS. Fehler: ERR : 43 INVALID REFERENCE NUMBER $D3: GETBUF
PARMCOUNT = 2 Referenz-Nummer - 1 Byte Pufferstart - 2 Byte-Adresse Resultat (Lo/Hi) Dieses COMMAND kann nur auf OPEN Files angewandt werde n. Es schreibt die Startadresse des zugehörigen Filepuffers in den PARMBLOCK. Fehler: ERR 43: INVALID REFERENCE NUMBER.
10.2 Wie spreche ich mit ProDOS? Unter DOS 3.3 ist es eine gä ngige Praxis , Diskettenbefehle mit einem vo rangestellten Ctrl-D als Zeichenkette über COUT auszugeben. Unter ProDOS funktioniert dieses Verfahren nicht mehr. We nn nur PRODOS.SYSTEM im RAM ist , gibt es keine Möglichkeit mehr , mit Strings ein en Diskettenbefehl auszuführen . Befindet sich allerdings auch das BASIC.SYSTEM im Speicher was zur Ausführung eines Applesoftprogramms notwe ndig ist - , dann existiert eine A lternative : a) Sie legen die Zeichen kette (z.B. CATALOG) ohne Ctrl-D ab $0200 in den Tastatureingabe-Puffer. Das Bit 7 vo n jedem Zeichen muß gesetzt sein . Die Zeichen kette muß mit $8D (RETURN) abgeschlossen werden. b) Sie rufen den Co mm and-Handl er auf (JSR $BE03). Wurde der Befehl korrekt ausgeführt , ke hrt die Routine mit ge löschtem CarryBit zurück. Bei einem Feh ler erfo lgt eine Fehlermeldung und ein Programmabbruch. Die Befehle -, RUN, LOAD, CHAIN, OPEN, READ , WRITE, APPEND, POSITION, EXEC , IN* und PR* sind auf diese Weise nicht ausführbar. Noch von einer weiteren lieben Gewohn heit müssen wir uns unter ProDOS verabschieden . U nter DOS 3.3 konnten Sie die E in- lind A usgabe des Apple
10.3 Wo find' ich ein Zuhause?
223
umlenken , indem Sie di e neuen Ad ressen in die Vektoren CSW ($0036/37) und KSW ($0038/39) schrieben und anschließend die Routine CONNECT (JSR $03EA) aufriefen. Da die Adresse $03EA nicht mehr in Funktion ist , können Sie dieses Verfahren unter ProDOS nicht mehr anwenden. Wenn das BASIC.SYSTEM im Speicher steht, gibt es fol gende Alternative: a) Sie lasse n CSW und KSW unverändert. b) In den Ausgabe-Vektor $BE30/31 tragen Sie die gewünschte Ausgabeadresse ein (norm al COUTl $FDFO). c) In den E ingabe-Vektor $BE32/33 tragen Sie die gew ünschte E inga beadresse ein (normal KEYIN $FDlB). Das ist alles!
10.3 Wo fmd' ich ein Zuhause? Wenn Sie ein BASIC-Programm und ein Assembler-Programm gleichzeitig im Speicher halten wollen , benötigen Sie einen sicheren Ort für den Maschinencode. Vor allen Dingen muß er vor dem Übe rschreiben durch BASIC-Variablen geschützt werden. Wenn der Platz von $0300 bis $03CF nicht ausreicht , müssen wir einen anderen Platz wählen. U nter DOS 3.3 wurde zumeist der RAM-B ereich unter den DOS-Puffern (unterhalb $9600 bei MAXFILES 3) gewählt und dann HIMEM: unter das Programm gesetzt. Auch dieses Verfahren funktioniert unter ProDOS nicht mehr , denn ProDOS hat eine dynamisch e Pufferverwaltung. Das heißt , daß ProDOS selbsttätig Puffer einrichtet und löscht. Den Befehl MAXFILES gibt es nicht mehr. Das BASIC.SYSTEM liegt von $9AOO an aufwärts im RAM. Darunter befindet sich von $9600 (HIMEM:) bis $99FF ein Allzweckpuffer. Wird ein File geöffnet (OPEN) , wird dieser Allzweckpuffer nach $9200 (neues HIMEM:) verschoben und ab $9600 ein Filepuffer eingerichtet. Jedes weitere OPEN verschiebt den Allzweckpuffer und HIMEM: um weitere 1024 Bytes nach unten (bei 2 offenen Files nach $8EOO) und setzt den neuen Filepuffer an die alte Adresse des Allzweckpuffers (= unter den letzte n Filepuffer) . Lediglich bei einem EXECFile werden alle Puffer nach unten verschoben und der EXEC-Filepuffer bei $9600 eingerichtet. Wenn Files geschlossen (CLOSE) werden, wird der zugehörige Puffer aufge hoben und all e übrigen Puffer werden wieder nach oben geschoben.
224
10 . Mehr PRO als CONTRA
Der einzige sichere Ort für ein Assembler-Programm liegt zwischen dem BASIC.SYSTEM (BI) und den Filepuffern. Das BASIC.SYSTEM kann eine beliebig große Anzah l von Speicherseiten (je 256 Bytes) zwischen sich und dem ersten Puffer freihalten. D ie Anzahl der gewünschten Seiten ist in den Akkumulator zu laden und dann GETBUFR ($BEF5) aufzurufen. Wen n das Carry-B it gelöscht ist , war die Einrichtung des geschützten Bereichs erfolgreich. Der Akkumulator enthält dann das H i-B yte der unteren Pufferadresse (das Lo-Byte ist immer $00 , X- und Y-Register werden zerstört!). Der erste geschützte Bereich wird immer direkt unterhalb des BASIC.SYSTEM ($9AOO) eingerichtet , ega l wievie le Fi lepuffer gerade geöffnet sind. Seine Adresse ist deshalb vorhersehbar und Sie benötigen keinen relokativen Code für Ihr Assembler-Programm. Fordern Sie über GETBUFR weiteren Speicher an , so wird dieser unterhalb des zuletzt reservierten Bereichs eingerichtet.
LDA JSR BCS STA LDA STA
t2 GETBUFR FEHLER SPEICHER+l t$00 SPEICHER
; 512 Byt es freihalten ;Anforderung ; Fehlerbehandlun g ;Hi-Byte des Pufferanfangs ; Lo-Byte
Ab (SPEICHER) können Sie dann Ihr Masch inenprogramm laden. Sie können nachträglich auch noch weitere Programme in den reservierten Bereich laden , da ProDOS ihn intern (i n der System Bit Map , auf die wir hier nicht eingehen) als nicht belegt markiert hat. Sie können den reservierten Bereich nur als Ganzes wieder fre igeben. Dazu ist ein JSR FREEBUFR ($BEF8) notwendig. Die Fil epuffer werden dann wieder unter das BASIC.SYSTEM gesetzt. Wenn Sie Maschinenprogramme benutzen woll en , die unter DOS 3.3 geschrieben wurden (praktisch alle Programme dieses Buches) , ist zu beachten: a) Wenn das Programm völlig selbständig arbeitet und keine A ufrufe an das DOS macht (ROM-Aufrufe funktionieren weiterhin) , kann es den gesamten Speicher bis $BEFF belegen, da das BASIC. SYSTEM dann nicht benötigt wird. b) Wenn das Programm DOS-Aufrufe macht , sind die betreffenden Tei le völlig umzuschreiben. Entweder muß das MLI benutzt werden - dann ist nur PRODOS.SYSTEM notwendig - oder auch das BASIC.SYSTEM (dann ist der Speicher nur bis $9600 frei).
10.3 Wo find' ich ein Zuhause?
225
c) Wenn gleichzeitig auch Applesoft benutzt wird, muß das Masch in enprogramm zwischen dem BASIC.SYSTEM und den Fi lepuffern "versteckt" werden (siehe oben). Die entsprechenden Routinen sind zu ergänzen , der ORG muß angepaßt werden. Dafür sind alle Teile , die HIMEM: versetzen, zu streich en. Noch eine Schlußbemerkung: In diesem Buch ist nicht ausreichend Platz, um Beispielprogramme für alle neuen Möglichkeiten des ProDOS zu zeigen. "Appie ProDOS für Aufsteiger, Band 1 und 2" von Ulrich Stiehl, Hüthig Verlag He idelberg, gibt Ihnen viele kleine und große Anregungen für eigene Programme .
226
11. Schnell wie der Wind Dieses ist das letzte Ka pitel in dem zweibändigen Kursus "A pp le-A sse mb ler le rn en" . Sie ha ben bis jetzt fast alles gelernt , was man über die Assemb lerprogrammierung des 6502/65C02 wissen mu ß, und Sie haben se hr viel über Ihren A pple erfahre n . Kein Kursus kann alle Themenbereiche einer Sach e vollständig abdecken. Zwei Dinge haben wir völlig ausgelassen: die Steue rung des R echners mit Inte rrupts und di e A nwe ndung und Progra mmierun g der Maus. E in dritte r Be reich ist noch nicht ganz behandelt worde n: die Programmierun g von D iskettenzugriffen . W ir haben zwa r gelernt , mit D OS 3.3 und ProD O S umzugehe n, aber das ist nicht der einzige Weg . Die Betriebssysteme sind ja auch nur wieder Assembler-Programme , derer wir uns bedie nt habe n . Es gibt danebe n noch den ganz direkte n Weg durch das A nsprechen des Disk-Controlle rs und seine r Ha rdware-Ad ressen. In diesem Kapitel we rden wir nun ein schnelles Ko pierprogramm für D OS-, ProDOS-, CP/M- und PASCAL-D iskette n schreiben , das in ein em A rbeitsgang eine normale 35 Track Diskette fo rmatiert und ko pi ert. D iese A ufga be ist nur zu meistern , wenn wir di re kt die Hardwa re des Diskette n-Contro llers ansteuern. Da Sie nun schon ein recht e rfahrener Programmi ere r sind , we rde ich Ihnen keine Programm beschreibung mehr liefe rn . D as Listing ist aber reichlich kommentiert , sodaß Sie viele H ilfe n zu m Verständnis haben . E in paar D inge habe n wir noch nicht anges proche n, di e unbedingt zum Ve rstehe n eines Ko pierprogramms notwe ndig sind: der Aufbau ein er D iskette und die H ardware des Co ntro llers. Vo r dem eigentli chen Programm werden wir uns deshalb noch mit diesen T hemen beschäftigen müssen .
227
11.1 Rund und dunkelbraun
11.1 Rund und dunkelbraun E in e Diskette ist eine magnetisierbare Scheibe ähnlich ein em Tonband . Die Diskette wird beschrieben und von ihr wird ge lesen, während sie sich mit 300 Umdrehungen pro M inute unter einem Magnetkopf herbewegt. Auf diese Weise werden kreisförmige Spuren bearbeitet. Der Kopf kann radial bewegt werden und so verschiedene Spuren erreichen. Beim DISK II Laufwerk von Apple sind es 35 Spuren (= Tracks). Der Kopf wird durch einen Schrittmotor gesteuert , der unter der Kontrolle des 6502-Prozessors steht. Der Apple hat also keinen eigenen D isk-Prozessor. Es ist ferner kein Sensor vorhanden , der dem Rechner die absolute Kopfposition mitteilt . DOS und ProDOS ziehen deshalb den Kopf bis an einen mechanischen Ansch lag (Spur 0) , was das berühmte "Klappern" bewirkt . Von da an werden alle Kopfbewegungen im RAM protokolliert , damit die Betriebssysteme die Kopflage kennen. Auf jede Spur ist außerdem ein Bitmuster geschrieben , in das u.a. auch die Spurnummer codiert ist. Vor der ersten Benutzung muß eine Diskette formatiert werden. Dabei wird ein festgelegtes Bitmuster auf sie geschrieben , das eine Spur in 16 Datenfelder für je 256 Bytes aufteilt , die als Kreissegmente gleichmäßig auf der Spur verteilt liegen. E ine solche Diskette wird "softsektoriert" genannt im Gegensatz zu den heute nicht mehr gebräuchlichen hardsektorierten Disketten , bei denen jedes Datenfeld mÜ einem Loch in der Diskette gekennzeichnet war. Vor jedem Datenfeld liegt noch ein kleines Adressfeld, das die Nummer des Sektors , des Tracks und des Volumes der Diskette enthält. Adress- und Datenfeld bilden zusammen einen Sektor. Vor und hinter dem Adressfeld sowie vor und hinter dem Datenfeld befinden sich noch ein paar Bytes (je 3) , die einen Prolog (He ader) bzw. Epi log (Trailer) bi lden und zur Identifizierung der Felder dienen. Die Sektoren sind eingebettet in eine besondere Art von Bytes, den Synchronisations-Bytes (Syncs) , die dafür verantwortlich sind , die Elektronik des Controllers und den Datenstrom auf der sich drehenden Diskette im Gleichtakt zu halten. Es würde an dieser Stelle etwas weit führen, alle Details zu behandeln. Eine gute Beschreibung finden Sie in "Beneath Apple DOS", Quality Software. Der prinzipielle A ufbau eines Sektors lautet:
5-40 Syncs FF FF FF ... FF FF
Prolog 05 AA 96
5-8 Syncs FF FF FF ... FF FF
Prolog 05 AA AO
Volume Track Sektor Prüfsumme Epilog VOL VOL TRK TRK SEC SEC SUM SUM OE AA EB Da t e n 342 Oa t enb yt es
Prüfsumme SUM SUM
Epilog OE AA EB
228
11. Schne ll wie de r Wind
Sie werde n sich siche rlich wundern , wa rum hier 342 D ate nb ytes angegeben sind , o bwohl doch nur 256 Bytes im Sekto r ges peichert werden. D es R ätsels Lösung liegt in einer spezielle n Codi erun g, da die Speicherb ytes nicht einfach so auf di e Diskette geschrie ben we rde n können. A uf diese Weise werde n aus 256 Bytes im R AM die 342 Bytes des Diskettense kto rs. Be im Lesen müssen sie wiede r in 256 R AM-Bytes zurückverwa ndelt we rd en. Sowo hl am E nde des Daten- als auch des A dressfeldes liegt eine Prüfsumme , mit de r kontrolliert werden kann , ob di e Bytes des Feldes korrekt gelesen wurde n . Sie entsteht dadurch , daß alle Bytes eines Fe ldes beim Schreibe n mitein ander in eine r Kette EOR-verknüpft werd en. Die Zeit , in der 1 Byte auf di e D iskette geschriebe n wird , beträgt 32 Microseku nden oder 4 Prozessortakte pro B it. Da die U mdrehu ngsgeschwindigkeit einer D iskette ni e so ko nsta nt ist , daß auf ein Bit genau geschri eben ode r gelesen we rden kann , sind die Se kto re n "schwimm end" in die Sync-Bytes eingelagert, die 3 unterscheid bare Ty pe n vo n Zwische nräumen (GAP) bilden . Der größte Zwischenraum (GAP1) liegt zwischen A nfa ng und E nde ei ner Spur , da sich de r erste und le tzte Se ktor nicht überl appen dürfe n . Wir finden hier typischerweise ca . 70 Syncs . Zwischen den übrigen Sektore n liegt GAP3 mit ca. 20 Syncs . E in weiterer kleiner Zwischenra um (GAP2) li egt zwische n dem A dress- und D atenfeld eines Sektors. E r umfa ßt norm al 5-8 Syncs .
_L---IIL-.._.~II,--___~ GAP 1
Adre ssfeld
GAP 2
Dotenfeld
GAP J
Adres sfe ld GAP 2
Dafenfeld
GAP J
A bb . 12 : A ufba u ein es T rac ks
D ie absolute Länge des GAPs ist nicht ko nstant , da das Form atie rprogramm sie an die Geschwindigkeit des Laufwe rks anpaßt. E in langsa mes Laufwe rk hat längere GAPs als ein schnelles . Z um zweite n wird der U mfang eines Tracks imme r geringer , je weiter inn en der Track auf der D iskette liegt. Auch di ese U nterschi ede werden mit de n GAPs aufgefangen. D ie Formatierprogra mme der Firm a A ppl e sind imme r be müht , die Sektoren gleichmäßig über de n U mfa ng des T racks zu ve rteilen. E inige Schnell kopie rer mache n sich diese Mühe nicht. Sie wä hl en die GAPs 2 und 3 so kurz, das es auf einem schnelle n D ri ve und der innersten Spur noch reicht. Der A usgleich fin det nur über GAPl statt , wä hrend z.B . DOS sowohl GAPl als a uch GAP3 für jede D iskette einzeln a npaßt.
229
11 .1 Rund und dunkelbrau n DOS 3.3 GAP 1 GAP2 GAP3
Locksmith 5.0
73 7
19
107 8 16
Superquick
Byte- Blizzard
119 8
71 7
15
20
Sync-Bytes auf Track 0 (Mittelwerte aus 3 Messungen, DOS 3.3 = COPY A) Die ungleichmäßige Verte ilun g der Sektoren führt all erdings nach mein en Untersuchungen zu keinen meßba ren Geschwindigkeitsproblemen beim Lesen oder Schreiben (warum Locksm ith-kopierte Disketten sich langsa mer lesen, fo lgt später). Der Datenaustausch zwischen Rechner und Laufwerk führt über ein Datenregister auf dem Controller. Der normal e Weg , einen Sektor zu lesen, besteht darin, den Kopf auf die gewünschte Spur zu positionieren und solange das Datenregister zu lesen, bis das gesuchte Adressfeld vorbeikommt. Das unmittelbar fo lgende Datenfe ld wi rd dann ins RAM gelesen und wieder decod iert. DOS liest immer ei nen ganzen Sektor auf einmal , ProDOS soga r 2 Sektoren (= 1 Block). Geschrieben wird ga nz ähnlich. Zunächst wird solange das Datenregister gelesen, bis das gewünschte Adressfeld vorbeikommt. danach wird sofort auf "Schreiben" umgestellt und das alte Datenfeld mit neuen Daten überschri eben. Zwischen dem Prozessor des App le und dem Datenregister werden die Information en byteweise (= parallel) ausgetauscht. Vom Co ntroller we rden die Daten dann bitweise (= seriell) auf die Diskette geschri eben, alle 4 Mikroseku nde 1 Bit. Bei m Schreiben muß der Prozessor dem Datenregiste r exa kt all e 32 Mikrosekunde (8*4) ein Byte zur Verfügung stellen, damit der Datenstrom aufrecht erhalten werden kann . Das genaue Tim ing ist eine der schwierigsten Aufgaben für den Progra mmierer. Das Lesen ist ve rgleichsweise einfac h: hier wartet der Prozessor ein fach ab, bis ein Byte vollständig ist. Dies ist daran zu erke nnen , daß Bit 7 des Datenregisters gesetzt ist. Es wird eine Abrufschleife (Polling Loop) von 7 Takten Länge benutzt: LOOP LDA DATENREG BPL LOOP
Achten Sie darauf, daß nicht zufä llig ei ne Seitengrenze zwischen LOOP und dem Branch liegt, da sonst die Schleife 8 Takte benötigt und unzuverlässig wird!! Noch eine kleine Anmerkung: Sync-Bytes entstehen , wenn ein $FF dem Datenregister übergeben wird und dann 40 Mikrosekunden bis zum nächsten
230
11. Schnell wie de r Wi nd
$FF vergehen . Dadurch wird die Bitfolge 1111111100 auf die Diskette geschrieben (lO-Bit-Byte).
11.2 Von halben Bytes und 6&2 A uf Grund von Hardwa rebeschränkun gen muß ein Disk-Byte folgende Voraussetzungen erfüll en: a) Bit 7 muß gesetzt sein b) maximal zwei aufei nanderfolgende Bits dürfen gelöscht sein c) von solchen Paaren (b) ist nur ein es im Byte erlaubt. A uf einer norm alen 16-Spur-D iskette werden nun zwei Codierverfahren benutzt , um aus Speicher-Bytes die Disk-Bytes werden zu lassen . Das erste fi ndet sich nur im Adressfeld und wird als 4&4-Codierung bezeichnet. Jedes Speicher-Byte wird einfac h in zwei Bytes aufge teilt und die Lücken mi t 1 gefüllt: A us ABABABAB wi rd 1A1A1AIA und 1B1B1BlB. Der Nachteil dieses Verfa hrens ist , daß sich die Byteanzahl verdoppelt und damit die Speicherkapazi tät der Diskette sinkt. Sein Vorteil ist die Schn elligkeit , in der Codierung und Decodierung erfo lgen kö nnen . Deshalb wird diese 4&4-Codierung auch für die Ad ressfelder benutzt. Die 6&2-Codierung verpackt nun die Speicher-Bytes etwas ökonomischer , aber zugleich auch wesentlich komplizierter. A us 3 Speicher-Bytes werde n dabei nur 4 Disk-Bytes. Vo n jedem der 3 Speicher-Bytes werden die beiden unte rsten B it in einen Zwischenpuffer gespeichert. Die verbli ebenen 6 oberen Bits werde n zweimal nach rechts geschiftet . D ie entstehenden Rest-Bytes haben dadurch Werte zwischen %00000000 und %00111111 ($00 - $3F). Die dreimal zwei unteren Bits werden wiederum zu einem Rest-Byte zusammengesetzt . Der Bereich von $00 bis $3F umfaßt 64 verschiedene Mögli chkeiten. Zwichen $95 und $FF gi bt es 72 gül tige Disk-Bytes. Zwe i davon ($D5 und $AA) we rde n reserviert für Epi- und Prolog. Von den restlichen 70 werden nur die 64 benutzt , die wenigsten ein 11-Paar enthalten. Die U msetzung der Res t-B ytes in die D isk-Bytes geschieht über eine Tabelle. Auf diesem Wege werde n aus 256 Speicher-B ytes die 342 Disk-Bytes. Bei m Lesen müssen die Disk-Bytes wieder mit einer Tabelle in Rest-Bytes umgesetzt LInd anschließend zu den Speicher-By-
11.2 Von halben Bytes und 6&2
231
tes zurückgewande lt werden . Die erforderl ichen Programme für beide Richtungen sind recht komplex . E in Schritt wurde bisher nicht ganz richtig erklärt: die Reihenfolge , in der die Disk-Bytes auf die Diskette geschrie be n werden. Die Codierroutin e, auch "Prenibble" genannt, schreibt die beiden unteren Bits jedes Speicher-Bytes in vertauschter Reihenfolge in den Zwischenspeicher. Zusätzli ch werden die o be ren 6 Bits von unten nach oben im Speicher gelesen , die unteren 2 Bits aber von oben nach unten im Zwische nspeicher abgelegt. Die 256 Speiche r-B ytes werden gedrittelt und die Rest-Bytes im Zusatzpuffer werden zu je 2 Bits aus jedem Drittel zusammengesetzt. Das hört sich ungeheuer kompliziert an , ist aber in Asse mbler relativ einfach zu verwirklichen.
AAAAAAarn BBBBBBbn CCCCCCco DDDDDDdp EEEEEEeq
OOAAAAAA OOBBBBBB OOCCCCCC OODDDDDD OOEEEEEE
F'F'F'F'F'F'fr
OOF'F'F'F'F'F'
GGGGGGgs HHHHHHht
OOGGGGGG OOHHHHHH
IIIIIIiu
OOIIIIII
JJJJJJjv KKKKKKkw LLLLLLlx
OOJJJJJJ OOKKKKKK OOLLLLLL
Speicher-Bytes
Rest-Bytes Hauptpuffer
OOxlthpd OOwksgoc OOvjrfnb OOuiperna
Rest-Bytes Zusatzpuffer
Da sich 256 nicht o hn e Rest durch 3 teilen läßt, wird das letzte Drittel um zwei ungültige Bytes ergä nzt. W ir erhalten 256 Bytes im Hauptpuffe r und 86 Bytes im Zusatzpuffer. Auf die D iskette werden zunächst die Bytes aus dem Zusatzpuffer geschri eben und dann die Bytes des Hauptpuffers. A ls 343 . Byte schließt sich die Prüfsumme an, die sich aus der EOR-Ve rknüpfung der vora nstehe nde n 342 Bytes e rgibt. Der ganze Codierprozess ist sehr zeitaufwendig. Es ist nicht möglich, alle 32 Prozessortakte ei n Byte "fert ig" zu haben. Bei DOS und ProDOS wird deshalb das Cod ieren ein es Sektors vor dem Schreiben vorge nommen . Es ist nicht möglich, ein en Track bei einer D iskettenumdrehung zu beschreiben , weil die Pausen zwische n den Sektoren für die Cod ierung nicht a usreichen. DOS liest ein en Sektor in ein en Zwischerp uffe r und decod iert ihn nachträglich. Deshalb wird a uch hier ein Track nicht in einer Umdrehung gelesen. ProDOS ist dazu in der Lage, da die Decod ierung durch viele Tabellen direkt während des Lesens passiert.
232
11. Schnell wie der Wind
Bei einem schnelle n Kopierprogramm gibt es zwei Lös ungen : a) Die Disk-Bytes we rde n gar nicht decodie rt , sond ern im R AM zwische ngespeichert und vo n do rt un verände rt herausgeschrie ben . Diese Lösung ist e infac h, verbraucht aber viel Speiche r. b) Die Disk-Bytes werden decodi e rt, aber nach ein em a nderen Ve rfahre n. A us de m R A M werde n sie mit de r Gegenmethode wiede r zurückcodiert. Diese Lösung ist pl atzspare nd , aber kompliziert. U nser Kopie rprogra mm ve rwe ndet di e Methode b), die vo n O mega Ltd . für Locksmith "erfunden" wurde. De r zeitkritische Teil ist das Codie re n, nicht das D ecodiere n . D as Codie re n braucht viel Zeit , weil erst der Z usatzpuffe r aufgebaut werde n muß , da e r zuerst geschriebe n wird . Di e Lös ung steckt in folgende r Ü be rlegung: E in Ko pie rprogramm muß im RA M gar ni cht gültige Speicher-Bytes erze uge n. Es ist nu r wichtig, daß hinterher auf der Ko pi e die se Ibe n Disk-Bytes stehen . E in Sektor wird deshalb in V iere rgruppe n gelese n. Di e 6 gültigen Bits des erste n Bytes we rden einfach in die 2 freie n Bits der nac hfo lgende n 3 Bytes gepackt. D adurch e ntstehe n 258 Bytes (3*86). D ie 2 "übrigen" Bytes werde n in eine n Z usatzpuffe r geschrieben, da so nst jeder Sekto r me hr als eine Speiche rseite einn ehme n würde . Beim Schreiben der Kopie wird zun ächst das 1. Disk-Byte a us de n 3 erste n Bytes im R AM wieder he rausgelöst. Wä hre nd dann diese 3 Bytes geschrie be n we rden , ist genug Z eit , das 4 . D isk-Byte aus den nächsten 3 Bytes herauszulösen usw. A uf diese Weise ist es möglich , eine n Track in ein e r U mdrehung zu lesen und auch zu schreiben.
11.3 Viele kleine SchaIterchen Die Softswitches des Apple haben wir früh e r schon einmal ke nnengele rnt. A uch de r Disk-Cont rolle r besitzt 16 so lcher Ad ressen , die A n- und A usschalter für 8 Funktion en darstelle n . Sie liegen im Adressbereich $C080 ,X bis $C08F,X, wobei das X-Registe r de n 16-fache n We rt der Slotnummer e nthält. Ge rade A dressen schalte n "AUS" , ungerade "E IN" . $C080,X $C081,X $C082 ,X $C083 ,X
Phase Phase Phase Phase
0 a us 0 ein 1 aus 1 ein
11.3 Viele kleine Scha lterchen $C084,X $C085,X $C086,X $C087 ,X
Phase Phase Phase Phase
233
2 aus 2 ein 3 aus 3 ei n
$C088,X Motor aus $C089 ,X Motor ein $C08A,X Laufwerk 1 anwäh len $C08B ,X Laufwerk 2 anwä hlen $C08C ,X Datenregister übertragen $C08D,X Datenregister laden $C08E ,X Lese-Modus setzen $C08F ,X Schreib-Modus setzen Die Phasen gehören zum Steppenllotor des Kopfes. Wenn die Phasen in aufste igende r Reihenfolge angesprochen werden , bewegt sich der Kopf nach innen . Z ur Bewegung vo n einem Track zu m nächsten müssen 2 Phasen geschaltet we rden. Es existieren also 70 Positione n bei einer 35-Spur Diskette, die sogenann te n "Ha lf-Tracks", die abe r nur fü r Kopie rschutzmöglichkeite n ei ne Rolle spie len. Benutzt werde n nur die Positionen, die zu Phase 0 und Phase 2 gehören. Zu Track 0 gehört auch die Phase O. Für ei nen runden Motorl auf müssen definierte A nlauf- und Abschaltzeite n ein gehalten werden. Nach einem Spurwechsel muß dem Kopf eine Pa use zum A uspendeln gegeben werden. Die Laufwerksanwahl schaltet das La ufwe rk nicht an, so ndern wählt es nur für die nächste Benutzung vor. Die Ad ressen $C08C bis $C08F geben zusammen die Mögl ichkeit zu vier weite ren Tätigkeiten: $C08C mit $C08E: Datenregister lesen $C08D mit $C08E: Schreibschutz testen und Controller initi ali sieren $C08C mit $C08F: Datenregister all e 4 Takte um 1 B it weiterschieben $C08D mit $C08F: Datenregister beladen
234
11. Schnell wie der Wind
Beispiele:
Laufwerk anwähl en LDX U 60 LDA $C08A , X
Slot 6 Laufwerk 1
LDA $C08B,X
Laufwerk 2
Motor an/aus LDX U60 LDA $C088 ,X
Slot 6 Motor aus
LDA $C089,X
Motor an
1 oder mehrere Bytes lesen LDY LDA LDA LOOP LDA BPL LP2
U60 $C08E,X $C08C,X $C08C,X LOOP
LDA $C08C,X BPL LP2
;Slot 6 ; Lese-Modu s setzen ; Datenre gi ster normalisieren (1 Zugriff) ; Datenre gi ster laden ; bei MINUS ist Byte da ;siehe oben für jedes ; weitere Byte
Schreibschutz prüfen, Controller initi alisieren LDX LDA LDA BMI
U60 $C08D, X $C08E,X ERROR
;S l ot 6 ;B it 7 gesetzt, wenn schreibgeschützt
Schreiben mehrerer Bytes (vorher Controll er initialisieren) LDX U60 LDA BYTEl STA $C08F',X CMP $C08C,X
;Slot 6 ;Schreibmodus setzen ;schreiben
LDA BYTE2 STA $C08D,X ORA $C08C,X
;Wartezykl en einl egen ;2. Byte ;Datenregister l aden ;schreibe n
LDA BYTEn STA $C08D,X EOR $C08C,X
Wartezyklen ei nlegen n. Byt e Dat enregister l ade n schreiben
LDA $C08E,X LDA $C08C,X
Wartezyklen ein l egen Lesemodus setzen Datenregister normalisieren
; 1. Byte
11.4 D as wirbelnde Byte: Byte-Blizzard
235
Das Schreiben vo n Bytes ist sehr kritisch . Mit einem Test des Schreibschutzes muß zunächst der Controller initialisiert werden. Sodann wi rd das e rste Byte in den Akkumulator geladen und die Adresse $C08F,X angesprochen. Dadurch wird sowohl de r Schreibmodus gesetzt als auch das Datenregister gelade n. Mit eine m Zugriff a uf $C08C,X wird dieses Byte dann "a bgeschickt" . Ab jetzt läuft die Zeit. Das Laden des Datenregisters und das "Abschicken " des Bytes muß mit der indizierten Adressierung erfolgen. Ein absolutes Adressieren (z. B. STA $COEC) funktioniert nicht! Welchen Befehl Sie zum "Abschicken" nehmen , ist relativ gleichgü lti g: CMP, ORA oder EOR sind gleichermaßen geeignet und benötigen jeweils 4 Takte. STA ist nicht geeignet. Nach genau 32 Prozessortakten muß das Datenregister wieder geladen sein und sofort danach abgeschickt werden . Die Takte zäh len vom Begi nn des Absch ickens bis zum erneuten Abschicken. In dem Programm "Byte-Blizzard " sind an einigen Stellen die Takte mitgezählt, damit Sie eine Vorstellung von den Möglichkeite n ha ben . Achten Sie darauf, daß keine Seitenübergänge bei einigen Befehlen passieren: LDA $lFFO,X mit X =5 benötigt 4 Takte, mit X=$20 passiert ein Seitenübergang und es werden 5 Takte verbraucht. Außer dem 1. Byte werden alle übrigen mit der Kombination $C08D/$C08C geschrieben. Warten Sie nach dem Sch reiben des letzten Bytes a uch 32 Takte , bevor Sie den Lesemodus (LDA $C08E,X) wieder he rstellen. Wen n Sie hier ni cht la nge genug warten , wird Ihr Byte nicht vollständig geschri eben . Der Programmierer von DOS 3.3 hat z.B. eine zu kurze Pause gemacht, als er das Epi log-Byte $EB schreiben mußte. Es ist deshalb immer unvoll stä ndig und nicht korrekt lesbar. Warten Sie allerdi ngs mit dem Setzen des Lesemodus zu lange, schreibt der Controlle r aus dem leeren Datenregister lauter Nullen auf die Diskette. In ein e m Sekundenbruchtei l ist damit ein ganzer Track vernichtet!
Warnung: A lle Progra mme , die das Diskettenlaufwerk direkt ansprechen , können bei Programmierfehlern die eingelegte Diskette ruinieren. Probieren Sie deshalb solche Programme immer mit Di sketten , die auch gelöcht werden dürfen, in allen(!) Laufwerken aus. Es ist fe rn er ratsam , beim ersten Start jedes Assemb lerprogramms die Laufwerksklappen zu öffnen. Sicher ist Sicher!
11.4 Das wirbelnde Byte: Byte-Blizzard Das Kopierprogramm "Byte-Blizzard" kop ie rt eine normale 35-Track AppleDiskette auf einem Apple mit mindestens 64K Hauptspeicher in knapp 32 Se kunde n inclusive Fo rm atierung. Da die Fo rm atie run g fü r alle Betriebssy-
236
11. Schnell wie der Wind
sterne des Apple (DOS3 .3, ProDOS, PASCAL, CP/M) identisch ist und alle Sektoren übertragen werden , kann "Byte-Blizzard" Disketten von allen 4 Betriebssystemen kopieren. Jede geschriebene Spur wird zurückgelesen (Ver ify). In der fo lgenden Tabell e sind die Kopierzeiten für einige gebräuch liche Programme zusammengestellt. Bedingungen: 64K Apple IIe mit 2 Laufwerken DISK II am seiben Contro ll er in Siot 6, Mittelwerte aus drei handgestoppten Läufen inclusive Formatierung. Programm l. Locksmith 5 .0
2. 3. 4. 5. 6.
Superquick Byte-Blizzard COPY IIplus 5 . 5 CO PY II E "StiehP COPYA
Kopierzeit 26,6 30,5 31 , 8 41 , 9 65,1 98 , 6
Sek. Sek. Sek . Sek. Sek . Sek .
Verfahren direkt direkt direkt direkt RWTS RWTS
1 1 1 1 2 2
Pass Pass Pass Pass Pass Pass
"Lesegeschw. 23 , 4 17,2 17,3 20,4 17,3 17 , 3
Sek. Sek. Sek. Sek. Sek. Sek.
Beim Testen verschi ede ner Kopierprogramme fiel mir auf, daß sich die Ko pien unterschied lich gut lesen li eßen. Um zu meßbaren Ergebnissen zu kommen , ben utzte ich ein Assembler-Programm, daß alle Tracks von 0 bis 34 ($22) einliest. Auf jedem Track wird zunächst Sektor 0 und dann fortlaufend bis Sektor 15 ($F) gelesen, bevor zum nächsten Track gegangen wird . Es wird die Zeit gestoppt, die vom Lesen des ersten bis zum letzten Sektor der Diskette vergeht. Die Ergebn isse finden Sie in der ob igen Tabell e unter "Lesegeschwindigkeit". Hier wird ganz deutlich , daß Locksmith aus dem Ra hmen fä llt und auch COPY IIplus-Produkte noch merklich langsamer gelesen werden als die übrigen Kopien. Zunächst hatte ich die pauschale GAP-Verteilung von Locksm ith (siehe 11.1) in Verdacht, aber dann hätten sich auch Superq uick-Kopien schlecht lesen lasse n müssen. Des Rätsels Lösung fand sich schließlich in der "Sync-Signature". Dam it ist der Versatz der Tracks gegeneinander gemei nt. Wen n Sie Sektor $0 ei nes Tracks gelesen haben, gehen Sie sofort einen Track weiter nach innen und lesen den nächsten vorbeikommenden Sektor. Je nach Track-Versatz (Sync-Signature) kann das ein beli eb iger Sektor von $0 bis $F sein. Es läßt sich leicht zeigen, daß Disketten am schnellsten gelesen werden können, wenn ihre Tracks gegeneinander um -2 versetzt sind , d.h. nach Sektor $0 wird als nächstes der Sektor $E gelesen. Auch ein Wert von -3 ist fast ge nauso gut (Sektor $D). Den Zusammenhang zwischen Sync-Signatur und Lesegeschwindi gkeit finden Sie in der folgenden Grafik:
11
11.4 Das wirbelnde Byte: Byte-B lizzard
237
Sec 24
L e
s e
22
Z 20 e
18
I I
I
~ -8 -7 -6 -5 -4 -3 -2 -1
0
1
2
3
4
5
6
7
8
Sync - Signature Abb . 13 : Lesezeit pro D iskette in Ab hängigkeit von der Sync-Signature
D ie Kopier- und Formatierprogramme benutzen folgende Sync-Sign ature:
Programm DOS 3.3 ProDOS 1. 0 . 2 CP/M 2.2 USCD PASCAL COPYA COPY IIE Byte-Blizzard Superquick COPY IIplu s Locksmith 5.0
Sync-Si gnature -3 -2 -3 -3 -3 -3 -3
-3 (z.T. -2) +7 -1
Die Entwick le r vo n Locksmith scheinem diesem Aspekt ke ine Bedeutung beigemessen zu haben , denn sie wählten den schlechtestmögli che n Wert für ihr Programm a us. Superqu ick li egt genau zwische n - 2 und - 3, sodaß kleine Schwankungen der Diskettendrehzahl zu unterschiedlichen Ergebni ssen füh ren , die aber beide gute Leseergebnisse nac h sich zie he n. "Byte-Blizzard" ist meines Wissens der erste Schnell kopierer für den Apple , dessen Quellcode ga nz veröffentli cht wird. Der Q uellcode ist so umfangreich , daß es nicht mehr mitsamt den Ko mm e ntaren in den Asse mbler ASSESSOR paßt. Benutzen Sie das H ilfs progra mm KOMMEX , um eine "abgespeckte" Version zu erhalten. Sie können "Byte-Blizzard " als Anregung für Modifikatione n ne hme n. We nn Sie me hr oder weniger Speicher habe n , ist "Byte-Blizzard" leicht anzupassen.
238
11 . Schne ll wie der Wind
Auch Disketten mit bis zu 80 Track machen keine Schwierigkeiten. Lediglich 160-Track Disketten mit altenativer Spurumschaltung (Erphi-Contro ll er) erfordern größere Maßnahmen. Aber ansieh sollten Sie jetzt vor keinem Problem in Assembler mehr zurückschrecken.
BYTE-BLIZZARD 1
2 3
4 5 6 7
8 9
10 11
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
;******************************* Byte-Blizzard Version 1.0 von Dr. Jürgen B. Kehrel Dezember 1985
* * *
;******************************* Schne ll e Lese- (READ16) und Schreibroutinen (WRTRK ) in Anlehnung an Locksmi t h 5 .0 RDADR16 und SEEKABS sowie SUET und LUET nach DOS 3.3 Zero-Page Spe i cherstel l en SLOTI DRIVEI SLOT2 DRIVE2 TEMP I NDEX CHKSUM SEKTOR SYNCS CH PTR SPURIST SPURSOLL
EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU
$0006 $0007 $0008 $0009 $00 17 $0018 $00 19 $OO lE $OO lF $0024 $OOCE $OO EB $OO EC
;+$OOC F
; Reset-Vektor, Bildschirm SOFTEV ZEI LE14
EQU EQU
$03F2 $072A
; Tabellen zum Lesen RDTRANSI EQU RDTRANS2 EQU RDTRANS3 EQU
$0300 $0340 $0380
; Tabe llen zum Sc hreiben WRTRANSI WRTRANS2 WRTRANS3 WRTRANS4
EQU EQU EQU EQU
$0800 $0900 $OAOO $OBOO
Beginn des Datenpuffers
239
11.4 Das wirbelnde Byte: Byte-Blizzard
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
PUF'F'ER
EQU
$2000
; Tastatur KEY STROBE
EQU EQU
$COOO $COI0
; Apple //e , c 80-Zeichenkarte STR800F'F' EQU COL800F'F' EQU
$COOO $COOC
; Softswitches ROM LCRAMB2
EQU EQU
$C082 $C083
; Grundadressen Disk-Contro11er PHASEOOF' MOTOROF'F' MOTORON DRVIENAB DRV2ENAB DATASTRB LOADDATA INPUTMOD OUTMODUS DSTRBSL6 LDATASL6 INPMDSL6
EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU
$C080 $C088 $C089 $C08A $C08B $C08C $C08D $C08E $C08F' $COEC $COED $COEE
; RAM-Karte CARDOF'F' BANK
EQU EQU
$CF'F'F' $DOOO
; Monitor-ROM TEXT TABV BELL HOME CLREOL RDKEY CROUT COUT1 SETINV SETNORM SETKBD SETVID RESET
EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU
$F'B2F' $F'B5B $F'BDD $F'C58 $F'C9C $F'DOC $F'D8E $F'DF'O $F'E80 $F'E84 $F'E89 $F'E93 $F'F'F'C
240
11. Schnell wie der Wind
OCOO: 4C 00 10
OC03: OC05: OC08 : OCOB: OCOO: OCI0 :
OC13: OC15: OC18: OCIB: OCI0: OCIF: OC22: OC25: OC28: OC29:
A6 BO BO 10 BO 4C
A9 90 10 AO 00 20 80 00 88 00
08 80 8E 06 8C 19
FF 8F 8C 70 00 E4 EO EC
CO CO CO 16
CO CO 00 CO CO
F4
OC2B: 20 E7 00
OC2E: OC30: OC32: OC35: OC38: OC39: OC3C: OC30: OC3F: OC40: OC43: OC46 : OC49: OC4C: OC4F OC52 OC55 OC58
84 A9 80 00 98 00 AA A9 EA 8E 8E 8E 8E 8E 80 00 8E 8E
lE FF EO CO EC CO 32 OF FF 6F 75 7B 19 28 EO EC 31 40
OC OC OC 00 00 CO CO 00 00
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
$0300 - $03BF und $0800 - $OBFF mit Tabellen belegt, die vom Programm erzeugt werden. ORG
$OCOO
KALTSTRT JMP
START
Schreiben eines Tracks WRTRK
LOX LOA LOA BPL LOA JMP
SLOT2 LOAOOATA,X INPUTMOO, X WRSYNC OATASTRB,X WPROT
;Slot Copy ;Write-P rotected? ;Nein, we it er ;Ja ;zurück
viele Sync-Bytes schreiben WRSYNC
LOA STA ORA LOY BNE SYNCLOOP J SR WRSI STA WRS2 ORA OEY BNE JSR
UFF OUTMOOUS,X OATASTRB,X U70 SYNCLOOP WAIT27 LOATASL6 OSTRBSL6
GAP 1
;Write/Load ;Latch
SYNCLOOP
;36 Takte ;40 ;schreiben 4 ;6 ;9 (8)
WAIT23
;31
Seiteneins tie g für GAP 3 Adressen modifiz. je nach Sektor SYNCBYTE STY LOA WRS3 STA WRS4 ORA TYA ORA TAX LOA NOP STX STX STX STX STX WRS5 STA WRS6 ORA STX STX
SEKTOR UFF LOATASL6 OSTRBSL6 STORE UFF SYB1+2 SYB2+2 SYB3+2 ZPLl+2 ZPL2+2 LOATASL6 OSTRBSL6 ZPL3+2 ZPL4+2
;34 ;36 ;40 ;schreiben ;6 ;10 ;12 ;14 ;16 ;20 ;24 ;28 ;3 2 ;36 ;40 ;4 ;8 ;12
241
11.4 Das wirbelnde Byte: Byte-Blizzard OC5B : OC5E: OC61: OC64: OC67 : OC6A :
OC60: OC70: OC73: OC76: OC79: OC7C: OC7F': OC82: OC83: OC85: OC88:
OC8B: OC80: OC8E: OC9 1 : OC94: OC97: OC98:
OC9A: OC9C: OC9F': OCAI : OCA4: OCA6:
OCA9: OCAC: OCAF': OCB2 : OCB5: OCB7: OCB9: OCBC: OCBF': OCC2: OCC4:
8E 8E 8E 20 80 00
AE BO AE 10 AE 10 80 EA A9 80 00
A4 EA 20 80 00 88 00
A9 20 A9 20 A9 20
AO 20 AO 20 85 A5 20 AO 40 45 48
49 5B 71 EC EO EC
54 00 A9 00 F'E 00 31
00 00 00 00 CO CO
20 08 20 09 20 OA OF'
F'F' EO CO EC CO
IF' E4 00 EO CO EC CO F'4
05 07 00 AA 08 00 96 08 00
3B BO 36 BO 17 lE BE 3B 36 lE
OF' 00 OF' 00 00 OF' OF'
158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211
WRS7 WRS8
STX STX STX J SR STA ORA
ZPL5+2 ZPL6+2 LAST+2 WAITRTS LOATASL6 OSTRBSL6
;16 ;20 ;24 ;36 ;40 ;4
1. Byte zum Schreiben vorbere i ten
SYBl SYB2 SYB3
WRS9 WRSI0
LOX LOA LOX ORA LOX ORA STA NOP LOA STA ORA
PUF'F'ER+$54 WRTRANSl,X PUF'F'ER+$A9 WRTRANS2,X PUF'F'ER+$F'E WRTRANS3 , X NIBBTEMP U F'F' LOATASL6 OSTRBSL6
;8 ; 12 ;16 ;20 ;24 ;28 ;32 ;34 ;36 ;40 ;4
Spurspezifische Anzahl von Synchronisations- Bytes LOY NOP GAPISYNC JSR WRS11 STA WRS12 ORA OEY BNE
SYNCS WAIT27 LOATASL6 OSTRBSL6 GAPISYNC
;Anzah l (7) ;9 ;36 ;40 ;4 ;6 ;9 (8)
Adressfeld-Prolog schre ib e n LOA JSR LOA J SR LOA JSR
U 05 WBYTE16 UAA WBYTE14 t$96 WBYTE14
; 10 ;letztes F'F' kein Sync ;12 ;18+14=32 ; 12 ; 18+14=32
Adress-Bytes (VOL, TRK, SEC, CHK) LOA JSR LOA JSR STA LOA JSR LOA EOR EOR PHA
RVOL WROOOEVE TRACKC WROOOEVE TEMP SEKTOR WROOOEVI RVOL TRACKC SEKTOR
; 14 ;20+12=32 ; 14 ; 20+12=32 ;13 Anpassung ;16 ;22+10=32 ;14 ;18 ;21 ;24 merken
242 OCC5 OCC6 OCC8 OCCB: OCCE: OCCF: OCOl:
OC04 : OC06: OC09: OCOB: OCOE : OCEO :
11. Schnell wie der Wind 4A 09 80 00 68 09 20
A9 20 A9 20 A9 20
AA EO CO EC CO AA
07 00
OE 08 00 AA 08 00 EB 08 00
OCE3 : OCE4 : OCE5: OCE6: OCE7 : OCE9: OCEB:
EA EA 48 68 AO 07 A9 FF 00 03
OCEO: OCFO: OCF3: OCF6: OCF7:
20 80 00 88 00
OCF9: OCFB: OCFE: 0000: 0003: 0005:
A9 20 A9 20 A9 20
E4 00 EO CO EC CO F4
05 03 00 AA
08 00 AO 08 00
0008: OOOB: OOOE: 0011 : 0013:
AE BO 20 AO EA
31 OF 00 OB OB 00 54
0014: 0017: 001A: 0010 :
EE BE BO 80
30 00 00 EO
OF 20 OB CO
212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265
WRS13 WRS14
LSR ORA STA ORA PLA ORA JSR
U AA LOATASL6 OSTRBSL6 UAA WBYTE16
;26 ;28 ;32 ;4 ;8 zurück ; 10 ;16+16=32
Adressfe l d-Epilog schreiben LOA JSR LOA JSR LOA JSR
UOE WBYTE14 UAA WBYTE14 U EB WBYTE14
;12 ;18+14=32 ; 12 ;18+14=32 ;12 ; 18+14=32
7 Sync-Bytes GAP 2 NOP NOP PHA PLA LOY LOA BNE GAP2LOOP J SR GAP2 STA WRS15 ORA OEY BNE
U07 UFF GAP2 WAIT27 LOATASL6 OSTRBSL6
; 12 Tak te ;14 ;17 ;21 ;23 ;25 ;28 ; (32)
GAP2LOOP
Oatenfeld-Prolog schreiben LOA JSR LOA J SR LOA J SR
U05 WBYTE24 UAA WBYTE14 UAO WBYTE14
;alle FF ' s Sync
Oie 342 Oaten-Nibble schreiben
ZAPLOOP ZPLI WRS16
LOX LOA JSR LOY NOP
NIBBTEMP WRTRANS4,X WBYTE8 U 54
;vorab kodiert ; 18 ;24+8=32 ;12 ;14 Anpassung
INC LOX LOA STA
OUMMY PUFFER,Y WRTRANS4,X LOATASL6
20 Anpassu ng 24 28 32
11.4 Das wirbelnde Byte: Byte-Blizzard 0020: 0023: 0026: 0029: 002C: 002F: 0032: 0035: 0038: 003B: 003E: 0041 : 0044: 0047: 004A: 0040: 0050: 0053: 0054: 0056: 0059: 005C: 005F: 0060: 0061 : 0064: 0067: 006A: 006B: 006C:
00 AO BE BO 80 BE BO 80 00 AO BE 10 80 BE BO 80 00 88 30 AO BE 10 AA EA BO 80 00 48 68 4C
EC 31 A9 00 31 55 00 EO EC 31 54 00 31 AA 00 EO EC
006F: 0072: 0075: 0078: 007A: 007B: 007C: 007E: 007F: 0082: 0085: 0088: 0089: 008B: 008C: 008F:
AE BO 20 A5 OA A8 BI AA BO 80 00 C8 BI AA BO 20
FF 20 00 OB 00 00 lE
0092 0094 0097 0099
A9 20 A9 20
CO OF 20 OA OF 20 OB CO CO OF 20 09 OF 20 OB CO CO
19 31 OF 00 20 00 08 00 OB EO CO EC CO 14 00
CE 00 OB EO CO EC CO CE 00 OB 00 00
OE 08 00 AA 08 00
266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319
WRS17 ZPL2 ZPL3 WRS18 WRS19 ZPL4 ZPL5 WRS20 WRS21
ZPL6
WRS22 WRS23
LAST
WRS24 WRS25
243
ORA LOA LOX LOA STA LOX LOA STA ORA LOA LOX ORA STA LOX LOA STA ORA OEY BMI LOA LOX ORA TAX NOP LOA STA ORA PHA PLA JMP
OSTRBSL6 ;4 NIBBTEMP ;8 PUFFER+$A9,Y ;12 WRTRANS3 , X ;16 NIBBTEMP ;20 PUFFER+$55,Y ;24 WRTRANS4 , X ;28 LOATASL6 ;32 OSTRBSL6 ;4 NIBBTEMP ;8 PUFF'ER+$54,Y ;12 WRTRANS2,X ; 16 NIBBTEMP ;20 PUFFER+$AA,Y ;24 WRTRANS4,X ;28 ;32 LOATASL6 OSTRBSL6 ;4 ;6 LAST ;8 (9) NIBBTEMP ; 12 PUFFER ,Y ;16 WRTRANSl , X ;20 ;22 ;24 Anpassung WRTRANS4,X ;28 LOATASL6 ;32 OSTRBSL6 ;4 ;7 Anpassung ;11 dito ZAPLOOP ;14
LOX LOA JSR LOA ASL TAY LOA TAX LOA STA ORA INY LOA TAX LOA JSR
PUFFER+$FF WRTRANS4 , X WBYTE9 SEKTOR
;13 ;17 ;23+9=32 ;13 ; 15 ;17 (PTR), Y ;1. Extrabyte (22) ;24 WRTRANS4 , X ;28 LOATASL6 ;32 OSTRBSL6 ;4 ;6 (PTR) , Y ; 2. Extrabyte ( 1 1 ;13 WRTRANS4 , X ;17 WBYTE9 ;23+9=32
Oatenfeld-Epilog schreiben LOA JSR LOA JSR
UOE WBYTE14 UAA WBYTE14
12 18+14=32 12
244
11. Schnell wie der Wind
OD9C OD9E ODAl ODA3 :
A9 20 A9 20
ODA6: ODA9: ODAB: ODAC : ODAE : ODBO: ODB2:
EE C8 CO BO 84 4C
ODB5: ODB6: ODB9 : ODBC :
EA AD OD 60
ODBD: ODBE: ODBF : ODCO: ODC2: ODC5: ODC8: ODC9: ODCB: ODCD :
EA AA 4A 09 8D OD 8A 09 85 4C
A4
ODDO: 4C ODD3: ODD6: ODD7: ODD8 : ODDB : ODDC: ODDD: ODEO: ODE3:
EE EA EA EE EA EA 8D OD 60
ODE4: 80 ODE7: 48 ODE8: 68
EB LDA U EB 320 D8 OD 32 1 JSR WBYTE14 FF 322 LDA U FF D8 OD 323 J SR WBYTE14 ;Übergang 324 Prüfen , ob alle Sektoren geschr ieben 325 326 INC DUMMY ; 16 30 OF 327 lE LDY SEKTOR ; 19 328 ;21 INY 329 10 CPY U IO ;23 330 05 33 1 BCS TRKREADY ;25 (26) lE STY SEKTOR ;28 332 2E OC 333 JMP SYNCBYTE ;3 1 334 Trackfertig, Read, Sch l euse normal. 335 336 337 TRKREADY NO P EE CO 338 WRS26 LDA INPMDSL6 EC CO 339 WRS27 ORA DSTRBSL6 340 RTS 341 342 Schreibe Byte Odd-Even Codiert 343 344 WRODDEVE NOP 345 WRODDEV l TAX 346 LSR AA 347 ORA UAA ED CO 348 WRS28 STA LDATASL6 EC CO 349 WRS29 ORA DSTRBSL6 TXA 350 AA 35 1 ORA U AA 17 STA TEMP 352 D6 OD 353 JMP WBYTE1 8 354 Zeitverzögerung, dann schreiben 355 356 DC OD 357 WBYTE9 JMP WBYTE6 358 30 OF 359 WBYTE24 I NC DUMMY 360 WBYTE1 8 NOP 361 WBYTE16 NO? 30 OF 362 WBYTE14 INC DUMMY NOP 363 WBYTE8 364 WBYTE6 NO? STA LDATASL6 ED CO 365 WRS30 EC CO 366 WRS3 1 ORA DSTRBSL6 RTS 367 368 Zeitverzögerungen 369 370 STA DUMMY 30 OF 371 WAI T27 PHA 372 WAIT23 PLA 373
11.4 Das wirbelnde Byte: Byte-Blizzard ODE9: 8D 30 OF ODEC: 60
245
374 STA DUMMY 375 WAITRTS RTS 376 377 378 Merkbereich für Sektoren 379 DFS $10 380 SIM 381 Daten lesen, Puffer immer auf 382 Seitengrenze, Hi-Byte wird übergeben 383 384 X-Reg muß Slot*16 enthalten 385 LDA ZIELHI ODFD: AD 33 OF 386 READ16 OEOO: 8D 56 OE 387 STA RDNl+2 OE03: 8D 6A OE 388 STA RDN2+2 OE06 : 8D 7E OE 389 STA RDN3+2 OE09: 8D C4 OE 390 STA RDDl+2 391 Datenfeld lesen 32 Versuche 392 393 OEOC: AO 20 394 RDDAPROL LDY U20 DEY OEOE: 88 395 RDVERS OEOF: 10 02 BPL DAPROLI 396 OEll : 38 SEC 397 ;Fehl erausstieg OE12 : 60 RTS 398 399 400 Datenfeld-Prolog suchen 401 OE13: BD 8C CO 402 DAPROLI LDA DATASTRB,X OE16: 10 FB 403 BPL DAPROLI OE18: 49 D5 404 RDPROL2 EOR UD5 OEIA: DO F2 405 BNE RDVERS OEIC: EA 406 NOP OEID: BD 8C CO 407 RDPROL3 LDA DATASTRB,X OE20: 10 FB 408 BPL RDPROL3 OE22: C9 AA 409 CMP UAA OE24: DO F2 410 BNE RDPROL2 OE26: EA 411 NOP OE27: BD 8C CO 412 RDPROL4 LDA DATASTRB,X OE2A: 10 FB 413 BPL RDPROL4 OE2C: C9 AD 414 CMP UAD OE2E: DO E8 415 BNE RDPROL2 416 417 Disk-Nibble lesen und ab l ege n 418 OE30: AD 39 OF 419 LDA RSEC Index im ZusatzOE33: OA 420 ASL Puffer für die 2 OE34: 85 18 421 STA INDEX "Extrabytes" OE36: 24 17 422 BIT TEMP OE38: AE EC CO 423 RDNIBBL LDX DSTRBSL6 OE3B: 10 FB 424 BPL RDNIBBL OE3D: BD 00 OF 425 LDA LUET-$96,X OE40: 85 17 426 STA TEMP OE42: 85 19 427 STA CHKSUM
246 OE44: OE46: OE47: OE4A: OE4C: OE4F: OE51: OE54: OE57: OE59: OE5B: OE5E: OE60: OE63 : OE65 : OE68: OE6B: OE6D: OE6F: OE72: OE74: OE77: OE79: OE7C: OE7F : OE81: OE83: OE86: OE88: OE8B: OE8D: OE8F: OE91: OE92: OE94: OE96: OE99: OE9B: OE9E: OEAO: OEA2: OEA4: OEA6: OEA8: OEAB: OEAD: OEBO: OEB1: OEB3: OEB5:
11. Schnell wie der Wind AO EA AE 10 BD A6 ID 99 45 85 AE 10 BD A6 ID 99 45 85 AE 10 BD A6 ID 99 45 85 AE 10 BD 85 45 85 88 10 24 AE 10 BD A4 91 45 29 85 AE 10 BD C8 91 C5 DO
54 EC FB 00 17 00 00 19 19 EC FB 00 17 40 55 19 19 EC FB 00 17 80 AA 19 19 EC FB 00 17 19 19 B3 17 EC FB 00 18 CE 19 3F 19 EC FB 00
CO OF 03 20 CO OF 03 20 CO OF 03 20 CO OF
CO OF
CO OF
CE 19 IB
OEB7: AE EC CO
428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481
RDNIBBLl
RDNl RDNIBBL2
RDN2 RDNIBBL3
RDN3 RDNIBBL4
RDNIBBL5
RDNIBBL6
LDY NOP LDX BPL LDA LDX ORA STA EOR STA LDX BPL LDA LDX ORA STA EOR STA LDX BPL LDA LDX ORA STA EOR STA LDX BPL LDA STA EOR STA DEY BPL BIT LDX BPL LDA LDY STA EOR AND STA LDX BPL LDA INY STA CMP BNE
U 54 DSTRBSL6 RDNIBBLl LUET-$96 , X TEMP RDTRANS1, X PUFFER,Y CHKSUM CHKSUM DSTRBSL6 RDNIBBL2 LUET-$96 , X TEMP RDTRANS2 , X PUFFER+$55,Y CHKSUM CHKSUM DSTRBSL6 RDNIBBL3 LUET-$96,X TEMP RDTRANS3 , X PUFFER+$AA , Y CHKSUM CHKSUM DSTRBSL6 RDNIBBL4 LUET-$96,X TEMP CHKSUM CHKSUM RDNIBBLl TEMP DSTRBSL6 RDNIBBL5 LUET-$96,X INDEX (PTR), Y ;l. Extrabyte CHKSUM U 3F CHKSUM DSTRBSL6 RDNIBBL6 LUET-$96 , X (PTR) , Y CHKSUM RDERROR
Datenfeld-Epilog lesen RDDAEPIL LDX
DSTRBSL6
; 2. Extrabyte
11.4 Das wirbelnde Byte: Byte-Blizzard
OEBA : OEBC: OEBE: OECO: OEC2: OEC5: OEC7: OECA : OECC : OECE : OEOO: OEO I :
10 EO 00 A5 80 24 AE 10 EO 00 18 60
FB OE 12 17 FF 20 17 EC CO FB AA 02
OE02: 38 OE03 : 60
OE04 : OE06: OE08: OE09: OEOB:
omo:
AO 84 C8 00 E6 FO
OEOF: OEE2: OEE4: OEE6: OEE8 : OEE9 : OEEC: OEEE: OEFO: OEF2: OEF4: OEF7: OEF9: OEFB:
BO 10 C9 00 EA BO 10 C9 00 AO BO 10 C9 00
OEFO: OEFF : OFOl : OF04: OF06: OF07: OF09: OFOC: OFOE : OFI0:
A9 85 BD 10 2A 85 BD 10 25 99
FC 17 04 17 F3 8C CO FB 05 FO 8C CO FB AA
F2 03 8C CO FB 96 E7
00 19 8C CO FB 17 8C CO FB 17 38 OF
482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535
BPL CPX BNE LOA ROOl STA BIT ROOAEPIl LOX BPL CPX BNE CLC RTS ROERROR
247 ROOAEPIL UOE ROERROR TEMP PUFFER+$FF TEMP OSTRBSL6 ROOAEPIl UAA ROERROR
SEC RTS
Adressfeld lesen Adressfeld-Prolog suchen X muß Slot*16 enthalten! ROAOR16 VERSUCH
RAPROL RAPROLl RAPROL2
RAPROL3
LOY STY INY BNE INC BEQ
UFC TEMP
LOA BPL CMP BNE NOP LOA BPL CMP BNE LOY LDA BPL CMP BNE
OATASTRB,X RAPROL U05 VERSUCH
;Versuchszahl
RAPROL TEMP ROERROR
OATASTRB, X RAPROL2 UAA RAPROLl ;4 Bytes U03 OATASTRB,X RAPROL3 U96 RAPROLl
Adressfeld lesen , Bytes zusammensetzen ADRLOOP ADRI
ADR2
LOA STA LDA BPL ROL STA LDA BPL AND STA
;Chksum init. U OO CHKSUM DATASTRB,X ADRI TEMP DATASTRB , X AOR2 TEMP AORINFO.Y ;Werte merken
248 OF13 OF15 OF16
11. Schnell wie der Wind
45 19 88 10 E7
OF18: A8 OF19: DO B7
OFIB: OFIE: OF20: OF22: OF24: OF25: OF28: OF2A: OF2C: OF2E: OF2F:
OF30: OF31: OF32: OF33: OF34: OF35: OF36: OF37: OF38: OF39: OF3A: OF3B: OF3C: OF3D:
OF3E: OF40: OF42: OF45: OF47: OF48: OF4A: OF4B: OF4D: OF4F: OF51:
BD 10 C9 DO EA BD 10 C9 DO 18 60
8C CO FB DE AE 8C CO FB AA A4
00 00 00 00 00 00 00 00 00 00 00 00 00 00
A9 85 AD AO OA 26 88 DO 85 A9 65
00 CF 34 OF 05 CF FA CE lE CF
536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589
EOR DEY BPL
CHKSUM ADRLOOP
TAY BNE
RDERROR
;Chksum muß 0 sein
Adressfeld-Epilog l ese n RAEPIL
RAEPIl
LDA BPL CMP BNE NOP LDA BPL CMP BNE CLC RTS
DATASTRB , X RAEPIL #$DE RDERROR DATASTRB,X RAEPIl #$AA RDERROR
Variablen-Liste DUMMY NIBBTEMP STORE ZIELHI TRACK TRACKO TRACKC TRKPOS ADRINFO RSEC RTRK RVOL RDVER WRVERS
HEX HEX HEX HEX HEX HEX HEX HEX HEX HEX HEX HEX HEX HEX
00 00 00 00 00 00 00 00 00 00 00 00 00 00
(PTR) auf Merkbereich für 2 Zusatzbytes für jeden gelese nen Sektor zeigen lassen 32 ($20) Bytes pro Track erforderlich MERK
MLOOP
LDA STA LDA LDY ASL ROL DEY BNE STA LDA ADC
#$00 PTR+l TRACK #$05
; Hi- Byte ;Track im Durchgang ,. ,. 32
PTR+l
;Übertrag
MLOOP PTR #$ lE PTR+l
Lo-Byte $l EOO- $lFFF bei max. 16 Tracks
11.4 Das wirbelnde Byte: Byte-Blizzard OF53 : 85 CF OF55: 60
0F'56: OF59: OF5E: OF61: OF66: OF69 : OF6E : OF71: OF76: OF79: OF7E: OF81: OF86 : OF89: OF8E: OF9 1 :
96 9B A7 AO B4 B7 BO CB 06 OA OF E7 EO F2 F7 FB
97 90 AB AE B5 B9 BE CO 07 OB E5 E9 EE F3 F9 FC
9A 9E AC AF B6 BA BF CE 09 OC E6 EA EF F4 FA FO
OF96 : OF99: OF9E : OFAl : OFA6: OFA9: OFAE: OFBl: OFB6: OFB9: OFBE: OFCl: OFC6: OFC9: OFCE: 0F'01 : 0F'06: OF09: OFOE: OFEl: OFE6: OFE9: OFEE: OFFl: OFF'6: OFF9 :
00 FF 05 FF 07 FF OC FF 12 14 19 FF FF FF 10 FF 20 22 27 FF 2A 2C 31 F'F' 37 39
01 02 06 FF 08 FF 00 OE 13 15 lA FF FF FF lE FF 21 23 28 FF 2B 20 32 33 38 3A
FF 03 FF FF FF 09 FF OF FF 16 FF FF FF IB FF IF FF 24 FF FF FF 2E FF 34 FF 3B
STA PTR+l 590 591 RTS 592 593 594 Schreib-Übe r se tzungst abelle SÜT 595 HEX 96979A9B909E9FA6 596 SUET 9F A6 597 HEX A7ABACAOAEAFB2B3 B2 B3 HEX B4B5B6B7B9BABBBC 598 BB BC HEX BOBEBFCBCOCECF03 599 CF' 03 HEX 0607090AOBOCOOOE 600 00 OE HEX OFE5E6E7E9EAEBEC 601 EB EC HEX EOEEEFF2F3F4F5F6 602 F5 F6 HEX F7F9FAFBFCFOFEFF 603 FE FF 604 Le s e-Übersetzun gstabelle 605 Un gültige Oi s kb ytes = FF 606 indiziert zur Basis LUET- $96 607 muß auf $xx96 beginnen! 608 609 HEX 0001FFFF0203FF04 610 LUET FF 04 611 HEX 0506FFFFFFFFFFFF FF FF 612 HEX 0708FFFFFF090AOB OA OB HEX OCOOFFFFOEOFIOll 613 10 11 614 HEX 1213FF1415161718 17 18 HEX 191AFFFFFFFFFFFF 615 FF FF 616 HEX FFFFFFFFF'FIBFF'lC FF l C 617 HEX 101EFFFFFFIFFFFF FF FF 618 HEX 2021FF2223242526 25 26 619 HEX 2728FFFFFFFFFF29 FF 29 HEX 2A2BFF2C202E2F30 620 2F 30 HEX 3132FFFF33343536 621 35 36 HEX 3738FF393A3B3C30 622 3C 30
249
11. Schnell wie der Wind
250 OF'F'E: 3E 3F'
1000 : 1003: 1006: 1009: 100C:
100F' : 1012: 1015: 1018: 10lA: 101D : 1020: 1022: 1024: 1027: 102A: 102C: 102D: 1030: 1033 : 1035: 1038:
103B: 103D: 1040: 1043: 1045 : 1048: 104B: 104D:
1050 1053 1056 1059 105C 105F 1062 106A 1072
8D 8D 8D 20 20
AD AD AD 49 8D CD DO A9 8D CD DO OA OE 4D F'O AD 4C
A9 8D 8D A9 8D 8D 49 8D
AD 20 20 20 20 C2 C5 D2 C9
00 OC F'F' 2F' BB
CO CO CF' F'B 17
83 83 00 F'F' 00 00 13 55 00 00 09
CO CO DO
00 00 06 82 D4
DO DO
50 F'C F'2 10 F'D F3 A5 F4
82 89 93 58 8A D9 AD C4 CF
DO DO DO DO
CO 15
F'F' 03 FF 03 03
CO FE FE FC 15 D4 C2 AO CE
623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 CC C9 AO D6 AO BI
HEX
3E3F'
Ini tialisieren, Tabellen a nl ege n START
STA STA STA JSR JSR
STR800F'F' COL800F'F' CARDOF'F' TEXT MAKETABS
;80-Zeichen aus (IIefc) ;Zusatz-ROMs aus
Teste, ob Lang uage Card vorhanden
NOTLC
LDA LDA LDA EOR STA CMP BNE LDA STA CMP BNE ASL ASL EOR BEQ LDA JMP
LCRAMB2 LCRAMB2 BANK UF'F' BANK BANK NOTLC U55 BANK BANK NOTLC BANK BANK LCOK ROM LCERROR
;RAM-Read Bank 2 ;RAM-Write Bank 2 ;1. Byte der Karte ; invertieren ;zurückschreiben ;ist es verändert? ;kei ne Karte da ; %0101 0101 ;wieder gl eich?
;Ja, also Karte da ;ROMs ein ;F'e hl er, keine LC da
Reset-Vektor in der Seite 3 und in der LC zum Warmstart umsetzen LCOK
LDA STA STA LDA STA STA EOR STA
1f< WRMSTART RESET SOF'TEV 1f> WRMSTART RESET+l SOFTEV+l UA5 SOF'TEV+2
Warmstart WRMSTART LDA ROM JSR SETKBD JSR SETVID JSR HOME JSR PRINT4 ASC "BYTE-BLIZZARD DA DA Cl C5 D2 D3 AE BO AO
;ROM's e in
VERSION 1.0 ( 16 SEKTOREN)"
11.4 Das wirbelnde Byte: Byte-Blizzard 107A: 1082: 1087: 108A : 1092 : 109A: 10A2 : 10AA : 10Af : 10B2: 10B5: 10B7: 10B9: 10BB: lOBE : 10C l : 10C4 : 10C6 : 10C8 : 10CB : 10CE : 10Dl : 10D2 : 10D5 : 10DD: 10E5: 10ED : 10f5: 10f7: 10f8 : 10fB : 1103 : 110B: 1113 : l l1B : 111D: 1120 : 1123 : 11 2B: 1133 : 113B: 1143: 1146: 1147: 114A: 11 52 : 115A: 1162 : 116A : 116D: 116E : 1171 : 1179 : 1181 :
A8 Cf A8 AO D2 C5 CC CC 20 20 85 A5 85 20 20 20 AO A9 20 D4 C3 8D AO BO BO Bl B2 B3 8D AO Bl B9 B7 B5 B3 8D AO AD AD AD AD AD 8D AO BD AO D2 DO C6 8D AO BD C9
Bl D2 C3 Bl AE CE AC C2 B2 Af 07 08 06 C5 B7 20 10 OB 85 D2 CB
B6 C5 A9 B9 AO AO AO C5 15 16
AO BO Bl Bl B2 B3 AO B2 BO B8 B6 B4 8D AD AD AD AD AD AD CC AO D3 C5 AO C5
AO CC AO C9 BD CE
DE AO C3 AA AO
251
AO D3 CE A9 674 B8 B5 CA D5 CB C5 C8 C5 D2 47 675 676 677 678 679 680 681 682 683 684 685 686
JSR JSR STA LDA STA JSR JSR JSR WRMSTRTl LDY LDA JSR ASC
BO BO Bl Bl B2
687 688 BO BO Bl Bl B2 B2 B2 B2
BO Bl B2 B3
ASC BO BO Bl Bl B2 B2 B3 B3
BO B3 Bl B9 B7
689 690 B4 B5 B2 B3 BO Bl B8 B9
B6 B4 B2 BO
ASC B7 B8 B5 B6 B3 B4 Bl B2
8D AD AD AD AD AD AD
691 692 AD AD AD AD AD AD AD AD
AD AD AD AD
ASC AD AD AD AD AD AD AD AD
C5 D3 CE D2
HEX 8D ASC " L = LESEN, S = SCHREIB EN, P CE AC C3 C8 AC AO D5 C5
15 16 17 15 Cl BA
693 694 C5 D3 BD AO C2 C5 AO DO
C5 CB D4 AO C5 C8 C9
DCI " (C) 1985 AO C4 D2 C7 D2 C5 C4 C5
;herüberkopiere n ; Adressen modifiz. ;HTAB ; Zeile 11
HEX 8D 01234567890123456789012345678901234"
8D8D8D
------------------------- ------------ 11
HEX ASC " DO C5 AO AO C8 CC
ORIGNORM SLOTDRl DRIVEl SLOT2 SLOT l COPYNORM SLOTDR2 SLOTMODI U l0 UOB PRINT2 "TRACK:"
HEX 8D 00000000001111111111222222222233333"
HEX
695 AO 696 C9 CD AO D3 C8 C5 D2 AC BD AO C6 C5
DR. JUERGEN KEHREL, HEIDELBERG"
i =
8D IM SPEICHER ,
*=
fE HLER,
PRUEfEN"
GUT"
252 1189: 1191 : 1194: 1195 : 1198: 11AO: 11A8: IlBO: 11B8: 11BB: 11BD: 11CO: 11C8: 11DO: 11D7: 11D9: 11DC: 11E4: 11EC: 11F4 : 11F9: 11FC: 11FF: 1201: 1203: 1205: 1207 : 1209: 120B:
11. Schnell wie der Wind
C5 C7 8D AO AD AD AD AD AD 8D AO C5 CB C9 8D AO CB CE D4 D3 2C 20 C9 FO C9 FO C9 DO 4C
120E: 20 1211 : FO
1213: 1216: 1219: 121C : 121E: 121F: 1220: 1221: 1222: 1224: 1226: 1228: 122A:
20 AD 8D A5 4A 4A 4A 4A 09 85 A9 85 6C
122D : A9 122F : 20 1232: A9
D2 AC AO AE D5 D4 697 AD AD 698 AD AD AD AD AD AD AD AD AD AD AD AD AD AD AD AD AD AD 8D 699 AO C2 700 C9 C4 C5 AO C5 D4 D4 C5 CE CC C5 C7 8D 701 AO A8 702 A9 CF DO C9 AO AO A8 C2 C5 CE AO AO C3 BE AO 3F 10 CO 703 OC FD 704 CB 705 2A 706 C2 707 OC 708 9B 709 03 710 50 10 711 712 DD FB 713 E9 714 715 716 717 58 FC 718 F3 03 719 F4 03 720 06 721 722 723 724 725 CO 726 CF 727 00 728 CE 729 CE 00 730 731 732 733 OE 734 5B FB 735 00 736
AO BD AO HEX AD AD AD AD
ASC AD AD AD AD AD AD AD AD
8D
-------------------------------- - ---- "
HEX ASC
8D8D BEIDE DISKETTEN EINLEGEN"
C4 C9 D3 CE AO C5 C5 CE HEX 8D8D DCI (K)OPIEREN
(B)OOTEN
C5 D2 C5 A9 CF CF AO BC C5 AUSWAHL
SONICHT
BIT J SR CMP BEQ CMP BEQ CMP BNE JMP
STROBE RDKEY *"K" COPY *"B" REBOOT *$9B SON ICHT WRMSTART
JSR BEQ
BELL AUSWAHL
<ESC > 7 11
;Tastendruck ;Kopieren ;Beenden ; <ESC >
;nicht möglich ; immer
Reboot-Routine im aktuel len Slot REBOOT
J SR LDA STA LDA LSR LSR LSR LSR ORA STA LDA STA JMP
HOME SOFTEV+l SOFTEV+2 SLOTl
;Power-Up-Vektor ;zerstöre n *16
*$CO PTR+l *$00 PTR (PTR)
;Sprung z. Controller
Diskettenkopie COPY
LDA JSR LDA
*$OE TAB V *$00
; Zeile 14 ; ab Zeilenbeginn
11.4 Das wirbe lnde Byte: Byte-Blizzard 1234: 1236: 1239: 123B: 123E: 1241 : 1244 : 1246:
85 20 A9 8D 8D 8D A9 85
24 9C 00 37 35 36 16 IF'
1248: 124B: 124E: 1250: 1252: 1255: 1258: 125A: 125D: 125F' : 1261 : 1264 : 1267: 1269:
AD AD A6 A5 20 20 A9 20 A6 A5 20 20 A9 20
83 83 06 07 C9 DF' OA 95 08 09 C9 DF' OA 55
126C: 126E: 1271: 1273: 1275: 1278: 127A: 127D: 127F' : 1281 : 1284: 1286 : 1289 : 128C :
A9 8D A6 A5 20 A9 20 A6 A5 20 A9 20 CE DO
02 94 06 07 C9 OB 95 08 09 C9 OB 55 94 E3
F'C OF' OF' OF'
CO CO 14 14 12 14 14 13 12 14 12 14 13 12
128E: AD 82 CO 1291: 4C C4 10 1294: 00
1295: 1298: 129B: 129E : 12A l : 12M: 12A5 :
8D BD 20 AD 8D OA 85
34 89 6B 35 37 EB
OF' CO 15 OF' OF'
737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790
STA JSR LDA STA STA STA LDA STA
253 CH CLREOL uOO TRKPOS TRACKO TRACKC #$16 SYNCS
; Zeile l öschen ; ini tialisieren ;Track Origin a l ;Track Copy ;Sy nc für GAP3 auf ; $lA (22+4) setzen
ORIGINAL LDA LDA LDX LDA JSR JSR LDA JSR LDX LDA JSR JSR LDA JSR
LCRAMB2 LCRAMB2 SLOTl DRIVE1 DRVWAHL TRKOPOS #10 READTRKS SLOT2 DRIVE2 DRVWAHL TRKOPOS #10 WRITETRK
;RAM Read Bank2 ;RAM Write Bank2 ;Slot Original ;Drive Original ; Drive anwählen ;auf Spur 0 posit. ; 11 Tracks ;Tracks lesen
LDA STA COPYLOOP LDX LDA JSR LDA JSR LDX LDA JSR LDA JSR DEC BNE
#02 LOOPCNT SLOTl DRIVE1 DRVWAHL #11 READTRKS SLOT2 DRIVE2 DRVWAHL #11 WRITETRK LOOPCNT COPYLOOP
;2 Durchgänge
LDA JMP
ROM WRMSTRTl
HEX
00
LOOPCNT
;Drive anwäh len ;auf Track 0 zurück ;1 1 Track schreiben
;Slot Original ;Drive Original ;D rive anwählen ;12 Tracks/Durchgan g ;T racks lesen ; Dr ive anwählen ;12 Tracks schreiben ; F' ert ig ? ;Nein ;ROM ein ;NEU
Im Akku übergebene Anzahl von Tracks lesen READTRKS STA LDA JSR LDA STA ASL STA
TRACK MOTORON ,X PAUSE TRACKO TRKPOS SPURIST
;Anzahl der Tracks war ten Po s . Original für F'ehleranzeige *2
254 791 792 12A7 AC 34 OF 793 12M B9 FF 17 794 12AD 8D 32 OF 795 12BO 20 3E OF 796 12B3: A9 OC 797 12B5: AC 35 OF 798 12B8: 99 2A 07 799 12BB: A9 50 800 12BD: 8D 3C OF 80 1 802 803 804 805 12CO : A9 FF 806 12C2: AO 10 807 12C4: 88 808 12C5: 99 ED OD 809 12C8: DO FA 810 811 812 813 12CA: 84 lE 814 12CC: A6 06 815 12CE: 20 D4 OE 816 12D l: 90 lC 817 12D3: CE 3C OF 818 1·2D6 : 00 F6 819 820 12D8: AD 82 CO 821 12DB: 20 AF 15 822 12DE: 4C 4F 16 823 824 12El: CE 3C OF 825 12E4: DO E6 826 12E6: AD 82 CO 827 12E9: 20 AF 15 828 12EC: 4C 5C 16 829 830 831 12EF: AD 3A OF 832 12F2: CD 35 OF 833 12F5: DO EI 834 12F7: AC 39 OF 835 12FA: CO 10 836 12FC: BO DA 837 12FE: B9 ED OD 838 1301: FO 00 839 840 1303: 98 1304: OD 32 OF 841 1307: 8D 33 OF 842 843 844 845
11. Schnell wie der Wind
Lesepuffer setzen NXTTRK
LDY LDA STA JSR LDA LDY STA LDA STA
TRACK PUFTAB,Y STORE MERK #$OC TRACKO ZEILE14,Y #$50 RDVER
;Hi-Byte Grundwert ; (PTR) setzen ; L inv ; 5-Mal ; Zähler
Sektormerkbereich FF = Neu , 00 = gelesen
SIMLOOP
LDA LDY DEY STA BNE
#$FF #$ 10 SIM,Y SIMLOOP
;negativ ;16 Sektoren ;Auf negativ set zen ;Merkbereich ;Sch l eife
Sektoren l esen RDSEKTOR STY RDSI LDX READADR JSR BCC TRY DEC BNE
SEKTOR SLOT I RDADR16 ADROK RDVER READADR
;zu lesender Sektor ;S l ot Original ; Adressfeld lesen ;ohne Fehler ;Zah l der Versuche -1 ; neu versuchen
FEHLADR
LDA JSR JMP
ROM ORIGINV ADRFEHL
; ROM ein
DEC BNE LDA JSR JMP
RDVER RDSI ROM ORIGINV DATFEHL
LDA CMP BNE LDY CPY BGE LDA BEQ TYA ORA STA
RTRK TRACKO FEHLADR RSEC #$ 10 FEHLADR SIM,Y TRY
;ge1esener Track ;erwarteter Track
STORE ZIELHI
;Ab1ageort bestimmen
TRYl
ADROK
;Fehlermeldung ausgeben
;Datenfehler
;max. $F ;hatten wir schon
Daten in den Pufferbereich einlesen
255
11.4 Das wirbelnde Byte: Byte-Blizzard 130A: 1300: 130F' : 1312: 1314 : 1317: 1319: 131A: 131C:
131E: 1321 : 1323: 1326: 1328: 1329: 132C: 132F' : 1330: 1331 : 1334: 1337: 1339: 133C: 133E: 1340:
F'O 00 02 39 OF' 00 EO 00 A4 lE C8 CO 10 00 AC
20 BO AC A9 99
AC A9 99 A6 C8 8C 8C 98 OA 20 CE 30 AO C9 F'O 4C
35 OF' DE 2A 07 06 35 OF' 37 OF' EE 34 OA 00 9B 07 A7
14 OF' CO 12
1343 : BD 88 CO 1346: 60
1347 : 134A: 134D: 1350: 1351 : 1352 :
1355: 1358 : 135B: 135E: 136 1 : 1364 : 1365 :
2C 20 AD 68 68 4C
8D BD 20 AD 8D OA 85
10 CO 04 14 82 CO C4 10
34 89 6B 36 37 EB
OF' CO 15 OF' OF'
846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900
JSR BCS LOY LOA STA LOY INY CPY BNE
REA016 TRYl RSEC #$00 SIM,Y SEKTOR
;Oatenfeld lesen ;F'ehler, nächster Versuch ;Sektor markieren ;auf 00 (positiv) setzen
#$10 RDSEKTOR
;schon 16 ge l esen? ;Nein, also weiter
;nächsten Sektor
nächsten Track lesen
ALLTRK
LDY LDA STA LDX INY STY STY TYA ASL JSR DEC BMI LDA CMP BEQ JMP
TRACKO *"jll ZEI LE14 , Y SLOTI
LDA RTS
MOTOROF'F' , X ;Motor aus
;nächste Spur
TRACKO TRKPOS SEEKABS TRACK ALLTRK KEY #$9B ESCENDE NXTTRK
; *2
; <ESC > ;nächsten Track lesen
vorzeitiger Abbruch ESCENDE
BIT JSR LOA PLA PLA JMP
STROBE MOTOF'F' ROM
;Motoren aus ;h
JSR
WRMSTRTI
Kopie schreiben/verifizieren WRITETRK STA LDA JSR LDA STA ASL STA
TRACK MOTORON , X PAUSE TRACKC TRKPOS SPURIST
Schreibpuffer setzen
;Anzahl Tracks
; *2
256
11. Schnell wie der Wind
1367: 136A: 136D: 1370: 1373: 1375:
AC B9 8D 20 A9 8D
34 F'F' 32 3E 03 3D
1378 : 137A : 137D : 1380 : 1382:
A9 AC 99 A9 8D
13 36 OF' 2A 07 05 3C OF'
OF' 17 OF' OF' OF'
1385: 20 03 OC
1388: A9 10 138A: AC 36 OF' 138D: 99 2A 07
1390: 1392: 1395: 1398: 139B: 139C: 139D: 139E: 139F':
20 20 20 48 68 EA 88 DO
13A l: 13A3: 13A5 : 13A7: 13AA : 13AB:
AO 84 A9 99 88 10
A4
IF' EC OD EC OD EC OD
F'1 OF' lE F'F' ED OD F'A
13AD: A6 08 13AF' : 20 D4 OE 13B2 : BO 31
13B4: AD 39 OF'
90 1 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 93 1 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 95 1 952 953 954
WRNEXT
WRITE
LDY LDA STA J SR LDA STA
TRACK PUF'TAB , Y STORE MERK U03 WRVERS
LDA LDY STA LDA STA
U 13 TRACKC ZEILE14,Y U5 RDV ER
;Hi-Byte Grundwert ; (PTR) setzen ;3 Versuche ;Schreibe n ;wenig Versuche
1 Track formatieren und die Daten des Puffers schreiben JSR
WRTRK
Track verifizieren LDA LDY STA
U I0 ;Prüfe n TRACK C ZEILE14 , Y ;ausgebe n
F'ormatierung der Disk überprüfen. Näc hster l esbarer Sektor muß wieder der erste se in , sonst s ind di e Sync-F'e l der zu l a ng und der Track überschreibt sich selber VF'W
LOESCH
LDY JSR JSR J SR PHA PLA NOP DEY BNE
SYNCS WAI TRTS WAITRTS WA ITRTS
LDY STY LDA STA DEY BPL
UO F' SEKTOR UF'F' SIM,Y
;Pause für GAPI
VF'W ;16 Sek to re n ;auf () 0 initial. ; Zwischenspeicher für ;Sektor nummern
LOESCH
LDX SLOT2 JSR RDADR16 BCS NEUF'ORM
;nächstes Adressfeld ;nicht le sbar
war es der erste Sektor? LDA RSEC
;gelese ner Sektor
11.4 Das wirbelnde Byte: Byte-B lizzard 13B7 : FO 18 13B9: 20 BC 14 13BC: BO 27 13BE: AO 82 CO 13Cl: 4C 38 16
13C4: 13C7: 13C9 : 13CC : 13CF:
20 BO AC B9 FO
04 OE 00 39 OF EO 00 05
1301 : 20 59 14 1304: 90 20 1306 : CE 3C OF 1309 : 00 E9
130B: 130E: 13EO: 13E2 :
13E5: 13E8 : 13EA: 13EO: 13EF: 13F2: 13F4: 13F6: 13F9:
CE FO A9 80
AO FO 20 BO AO C9 00 20 4C
3D OF OE 20 3C OF
36 OF 04 00 39 OF 06 59 78
OF OE OF 14 13
13FC: CE 3C OF 13FF: 00 E9 1401 : FO BB 1403 : AC 39 OF 1406: A9 00 1408: 99 EO 00 140B: C6 lE 1400: 10 B5
955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 99 1 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009
257
BEQ JSR BCS
VTRK SYNCZAHL NEUFORM
NOTFOUNO LOA JMP
ROM FORMFEHL
Sektor 0 Syncs verkürzen neu kopieren ; Forma tierung
Ganzen Track lesen , alle Sektoren auf Vol l ständigkeit und Lesbarkeit prüfen JSR BCS LOY LOA BEQ
ROAOR1 6 VVFE RS EC SIM , Y VVFE
VTRK
JSR BCC
VREA016 VOKAY
VVFE
OEC BNE
ROVER ROSEKT
ROSEKT
;Verify-Feh l er ; gefunde ner Sektor ; schon gehabt? ;Ja ;Oaten prüfen
; neuer Versuch
Verify-Fehler OEC BEQ LOA STA
WRVERS NOTFOUNO *$20 ROVER
Das Ende der Spur wird abgewa rtet , dann wird neu format i ert NEUFORM NFORMl
TOWRITE
LOA TRACKC BEQ TOWRITE J SR ROAOR16 BCS NEUF1 LOA RSEC CMP *$O F BNE NEUFI J SR VREA016 JMP WRITE
; le tzter Sektor? ;Oaten l ese n ;Neu schreiben
NEUFI
OEC ROVER BNE NFORMI BEQ NOTFOUNO
VOKAY
LOY RSEC LOA HOO STA SIM,Y
; gelesener Sektor ; markieren
OEC SEKTOR BPL ROSEKT
;nächsten Se kt or ;weiterprüfe n
258
140F : 1411 : 1414 : 1417: 1419: 141C: 141 E: 142 1 : 1423 : 1426:
1428: 142A: 142D: 1430 : 1432 : 1435: 1437 : 1438: 143B : 143 E: 143F : 1440 : 1443: 1446 : 1448: 144B : 144D : 144F:
11. Schnell wie der Wind
A9 8D CE FO 20 BO AD DO 20 BO
A9 AC 99 DO 20 A6 C8 8C 8C 98 OA 20 CE 30 AD C9 DO 4C
20 3C 3C A5 D4 F6 39 Fl 59 EC
OF OF OE OF 14
AE 36 OF 2A 07 03 BC 14 08 36 OF 37 OF EE 34 OD 00 9B 03 47
14 OF CO 13
1452: 4C 67 13 1455 : BD 88 CO 1458: 60
1459: AO 20 145B: 88 145C: FO 5C 145E 1461 1463 1465
BD 10 C9 00
8C CO FB D5 F4
1010 1011 1012 10 13 10 14 1015 1016 1017 10 18 10 19 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063
Zurück zu Sektor 0, damit die Sektore n benachbarter Tracks in der richtigen Anordnung nebeneinander li ege n
SEEKO
LDA STA DEC BEQ JSR BCS LDA BNE J SR BCS
U20 RDVER RDV ER NOTFOUND RDADR16 SEEKO RSEC SEEKO VREAD16 SEEKO
;nicht Sektor 0 ;Daten l esen
Verify erfolgreich, a l so anzeigen LDA LDY STA BNE JSR LDX I NY STY STY TYA ASL J SR DEC BMI LDA CMP BNE JMP
UAE TRACKC ZEI LE14,Y ONTRKO SYNCZAHL SLOT2
GOWRNXT
JMP
WRNEXT
ALLWRT
LDA RTS
MOTOROFF,X ;Motor aus
ONTRKO
I,,·
; ausgeben ;Track 07 ;Synczahl verr i ngern ;nächste Spur
TRACKC TRKPOS SEEKABS TRACK ALLWRT KEY U9B GOWRNXT ESCENDE
; *2
; <ESC> 7 ;Ne i n, weiter ;Abbruch
a l le Datenbytes lesen und Checksum bilden gelesenen Datenbytes werden verworfen VREAD 16 VDATA , VDT
VDTO
LDY DEY BEQ
U20
;Versuchszahl
VDERR
; Lesefeh l er
LDA BPL CMP BNE
DATASTRB,X ;Datenprol og lese n VOT ;warten UD5 VOATA ;noch ni cht
11.4 Das wirbelnde Byte: Byte-Blizzard
1467: 1468: 146B: 146D: 146F: 1471 : 1473: 1476: 1478: 147A:
EA BD 10 C9 DO AO BD 10 C9 DO
8C CO FB AA F2 56 8C CO FB AD E7
147C: 147E: 1480 : 1483 : 1485: 1488: 1489: 148B:
84 A9 BC 10 59 EA C6 DO
18 00 8C CO FB 00 OF
148D: 1490: 1492 : 1495: 1496: 1498:
BC 10 59 EA E6 DO
8C CO FB 00 OF
149A : 149D: 149F: 14A2:
14M: 14A5: 14A8 : 14AA : 14AC: 14AE: 14AF: 14B2 : 14B4: 14B6: 14B8 : 14B9:
BC 10 D9 DO
EA BD 10 C9 DO EA BD 10 C9 DO 18 60
14BA: 38
18 F3
18 F3
8C CO FB 00 OF 16
8C CO FB DE OC 8C CO FB AA 02
1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117
VDTI
VDT2
NOP LDA BPL CMP BNE LDY LDA BPL CMP BNE
259 DATASTRB,X VDTI UAA VDTO U56 DATASTRB,X VDT2 UAD VDTO
Pause l esen warten ; muß kommen ;Datenbytes ; le se n ; warten ;muß kommen
Datenfeld l esen für Checksum-Prüfung Dat en werden ni ch t gespeichert
VDATI
VDAT2
STY LDA LDY BPL EOR NOP DEC BNE
INDEX UOO DATASTRB,X VDATI LUET-$96 ,Y
LDY BPL EOR NOP INC BNE
DATASTRB , X VDAT2 LUET- $96,Y
INDEX VDATI
INDEX VDAT2
Jetzt Checksum VDAT3
LDY BPL CMP BNE
DATASTRB , X VDAT3 LUET- $96,Y VDERR
Datenfeld-Epi l og prüfen
VDAT5
NOP LDA BPL CMP BNE NO P LDA BPL CMP BNE CLC RTS
VDERR
SEC
VDAT4
DATASTRB , X VDAT4 UDE VDERR DATASTRB,X VDAT5 UAA VDERR
260
11. Schnell wie der Wind
14BB: 60
14BC: 14BE: 14CO: 14C2 : 14C4 : 14C6: 14C8:
14C9: 14CA: 14CC: 14CF:
A9 C5 A5 E9 85 C9 60
00 IF IF 01 IF 06
4A 90 04 BO 8A CO 60
1400: BO 8B CO 1403: 60
1404: 1406: 1409: 140B: 140E:
140F: 14E2: 14E5: 14E8: 14EA: 14EC:
14EE : 14FO: 14F2: 14F4: 14F6: 14F8: 14FA: 14FC: 14F'D: 14FE: 1501: 1502:
A6 BO A6 BO 60
BO BO BO A9 85 A9
86 85 C5 FO A9 85 AO 18 98 20 88 10
06 88 CO 08 88 CO
8E CO 8C CO 89 CO 50 EB 00
17 EC EB 59 00 CE 03 44 15 F9
1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171
RTS Zahl der Sync-Bytes verringern SYNCZAHL LOA CMP LOA SBC STA CMP RTS
UO O SYNCS SYNCS UOl SYNCS U06
;noch 14+4 Syncs? ; akt. Anzah l ;-2 bei CC, -1 bei CS ; abspe ichern ; noch 10 (6+4) ? ;CS = OK, CC = Fehler
gewünschtes Laufwerk anwählen ORVWAHL
LSR BCC LOA RTS
; gerade/ungerade? ORV2 ;gerade - ) Drive 2 ORVIENAB,X ;Orive 1 an
ORV2
LOA RTS
ORV2ENAB ,X ;Orive 2 an
Motor für Orig. und Kopie aus MOTOFF
LOX LOA LOX LOA RTS
SLOTI MOTOROFF,X SLOT2 MOTOROFF , X
Auf Spur 0 positionieren . TRKOPOS
LOA LOA LOA LOA STA LOA
INPUTMOO ,X OATASTRB,X ;Schleuse normalisieren MOTORON,X U50 ;Spurist * 2 auf 80 (40) SPURIST UOO ; Spursol l * 2 auf 00
positioniert auf die gewünschte Spur SEEKABS
PHASOUT
STX STA CMP BEQ LOA STA LOY CLC TYA JSR OEY BPL
TEMP SPURSOLL SPURIST SPUROA UOO PTR U03 ARMMOVI PHASOUT
; Sloh16 ;gleich, Prozedur erfüllt ; Oelay-Index auf Maximum ;Ourchlaufzähler ;alle Ph asen aus
11.4 Das wirbelnde Byte: Byte-Blizzard
1504: 1506: 1508: 1509: 150B : 1500 :
A5 85 38 E5 FO BO
EB CF EC 31 06
150F: 49 FF 1511 : E6 EB 1513: 90 04
1515 : 1517 : 1519: 151B: 1510: 151F: 1521: 1523: 1524: 1525: 1528: 152B: 152E: 1530: 1531: 1534: 1537: 153A: 153C :
69 C6 C5 90 A5 C9 BO A8 38 20 B9 20 A5 18 20 B9 20 E6 00
FE EB CE 02 CE 08 01 42 15 50 15 60 15 CF 44 15 58 15 60 15 CE C6
153E: 20 60 15 1541 : 18
1542: 1544: 1546: 1547: 1549: 154A: 1540 : 154F :
1550 : 1553 1558 155B
A5 29 2A 05 AA BD A6 60
01 24 70 22
EB 03 17 80 CO 17
30 20 2C IF'
28 lE 26 lE
1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 11 98 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 10 lC 1224 10 lC 1225
POSIT
LDA STA SEC SBC BEQ BCS
261
SPURIST PTR+l
;Track jetzt *2 ;retten
SPURSOLL ISTDA AUSSEN
;- gewünschte Spur ;gleich, also Ende ;> Arm zu we it innen
nach innen bewegen EOR INC BCC
UFF SPURIST DELAYNDX
;Vorze ich enwechsel, -1 ;akt. Spur erhöht ; immer
nach außen bewegen AUSSEN
ADC DEC DELAYNDX CMP BCC LDA DIFFKLN CMP BCS TAY DELMAX SEC JSR LDA JSR LDA CLC J SR LDA JSR INC BNE
;nach auße n . -1, akt . Spur +1 ;Vergl Diff-l / De lay ; Di fferenz kleiner ; Del ay-Index kl einer ; ( $08 (Maximalwert) ;Nein, Y unverändert ;Akku neuer Del ay-Index ; Ph ase an zum Track ARMMOVER ;Arm bewegen PHONDEL ,Y ; Phase ON De l ay MSWAIT ;warten PTR+l ;alt e Spurnummer ;di ese Phase aus ARMMOVI ;aussc halten PHOFFDEL,Y ; Phase OFF Del ay MSWAIT ;warten PTR ; Du rc hlaufzähler +l POSIT ; imme r , neuer Du rchgang
ISTDA
MSWAIT
JSR CLC
UFE SPURIST PTR DIFFKLN PTR U08 DELMAX
;noch warten ;dann diese Phase aus
Phasen-Adre ss ie ru ng. ARMMOVER LDA ARMMOVl AND ROL ORA TAX LDA LDX SPURDA RTS
SPURIST U03
; Ein sprung "Track jetzt" ; Phasennr. ausblenden ; C=l ON, C=O OFF TEMP ;S l ot*16 einblenden ; Index Phase nanst euerung PHASEOOF ,X ; Phase sch a lt en TEMP ;S l oh16 zurück
Verzögerungs tabelle n für Armbewegungen PHONDEL
HEX
01302824201EIDIC ; Verzögerun g Ein
PHOFFDEL HEX
702C2622 1FIEIDIC ;Verzögerung Au s
262
1560: 1562: 1563: 1565: 1566: 1568: 156A:
156B: 1560: 156F : 1570 : 157 1 : 1573 : 1575: 1576: 1578: 157A: 157B: 1570:
157E : 1581 : 1583: 1585: 1588: 158A: 158B: 1580: 158E: 1590 : 1592: 1594: 1596 : 1598: 159A: 159B : 1590: 15AO: 15Al: 15A3: 15A5: 15A6 : 15A8: 15A9:
11. Schnell wie der Wind
A2 CA 00 38 E9 00 60
AO A9 38 48 E9 00 68 E9 00 88 00 60
20 A9 AO 20 84 68 85 68 85 AO E6 00 E6 BI 48 09 20 68 30 A5 48 A5 48 60
12 FO 01 F6
05 FF 01 FC 01 F6 FO
80 FE 15 02 5B FB 24 CE CF 00 CE 02 CF CE 80 FO FO EF CF CE
1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 127 1 1272 1273 1274 1275 1276 1277 1278 1279
Pause f ür Kopfbewegungen , MSWAIT LOX 41$12 ;kleine Schleife MSWI OEX BNE MSWI SEC SBC 41$0 1 ;große Sc hl e ife BNE MSWAIT RTS Pause für Motoranlauf PAUSE PAUSEI PAUSE2 PAUSE3
LOY LOA SEC PHA SBC BNE PLA SBC BNE OEY BNE RTS
41$05 U FF
;ca. 0,83 sec
41$0 1 PAUSE3
;wie Monitor
41$01 PAUSE2 PAUS EI
Oruckroutine, mehrere Ei nsprünge PRINT PRINTl PRINT2 PRINT3 PRINT4
PRI PR2
JSR LOA LOY JSR STY PLA STA PLA STA LOY I NC BNE INC LOA PHA ORA JSR PLA BMI LOA PHA LOA PHA RTS
SETI NV 41$15 41$02 TAB V CH PTR PTR+l 41$00 PTR PR2 PTR+l (PTR) , Y 41$80 COUTI
;Bit 7 se tzen ;ausgeben
PRI PTR+l
;Pos iti v Endeke nnun g ;Rücksprungadresse ;auf den Stack ;schieben und mit
PTR
;RTS anspringen
Origin a l- und Copyanzeige löschen
263
11.4 Das wirbelnde Byte: Byte-Blizzard
15AA : 20 B2 15 15AO: 00 16
15AF: 15B2 : 15B4: 15B7: 15BA : 15BF :
15C2 : 15C5: 15C7 : 15C9 : 15CC : 15CF : 1501 :
1504: 1507 : 150A : 1500 : 15E5: 15EO: 15F5: 15F8: 15FB: 15FD : 1600: 1608: 1610: 1613: 1616:
1619: 161C: 1610: 161E: 162 1 : 1624: 1627 : 162A: 1632: 1635:
20 A9 20 CF C7 4C
20 A9 AO 20 CB C9 4C
20 20 00 C7 CE BI C5 87 80 BE Cl C3 04 20 4C
BO 68 68 80 20 20 03 02 04 4C
80 04 83 02 C9 84
80 07 05 85 CF 45 84
58 8A 02 02 CF B6 AO 87 80 BE 03 CB BC OC 13
88 82 C2 7E C3 C5 DA 65
FE 15 C9 CE FE
FE 15 00 FE
FC 15 CF Cl C5 CB Al 87
1280 1281 1282 1283 1284 1285 1286 1287 1288 Cl 4C 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 CO CD 04 C9 AO CB
NORMAL
ORIGNORM COPYNORM
;immer
Original einlegen ORIGINV JSR ORIGNORM LOA JSR OCI JMP
SETINV t$04 PRINTI "ORIGINAL" SETNORM
Copy einlegen COPYINV JSR COPYNORM LOA LOY JSR OCI
SETINV t$07 t$05 PRINT2 "KOPIE"
JMP
SETNORM
Fehlermeldungen Programm benötigt 64K LCERROR
JSR JSR ASC
HOME PRINT4 "PROGRAMM BENOETIGT 16K-KARTE
HEX
8787878080
OCI
"» TASTENDRUCK BOOTET ABBRUCH
PLA PLA PLA PLA JMP
;2* JSR vom Stack
WRMSTART
Antwort von der Tast atu r Obergrenze ( ? ;Ja
JSR BEQ
BELL TASTE
;Piep ;neuer Versuch
;11 111
;zu klein ;Obergrenze ;zu groß ;%00001111 ; 1 Controller: 2 Drives
266
1715: 1716: 1718: 171B: 171E: 171F:
11. Schnell wie der Wind
48 09 BO 20 FO FD 20 8E FD 68 60
1720: 1722: 1723: 1725: 1727: 1729: 172B: 172E: 1730: 1733: 1735: 1737: 1739: 173B: 173D: 173F: 1740: 1741 :
A5 18 69 85 A2 AO BD 85 BD FO 85 B1 29 05 91 E8 E8 DO
1743: 1745: 1746: 1748 : 174A: 174C : 174F: 1751: 1754 : 1756: 1758: 175A: 175C: 175E: 1760: 1761 : 1762:
A5 18 69 85 A2 BD 85 BD FO 85 B1 29 05 91 E8 E8 DO
1764: 60
06 80 17 00 01 65 17 CE 66 17 OE CF CE OF 17 CE E8 08 80 17 00 79 17 CE 7A 17 OE CF CE OF 17 CE E8
1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473
Tastendruck ausgeben OK
PHA ORA JSR JSR PLA RTS
U BO COUT1 CROUT
;retten ; - ) ASCII ; ausgeben ; <e r>
;zurück ;das war's
Code-Modifikation für Slot SLOTMODI LDA CLC ADC STA LDX LDY OSLOTM LDA STA LDA BEQ STA LDA AND ORA STA INX INX BNE
SLOT1
CSLOTMOD LDA CLC ADC STA LDX CSLOTM LDA STA LDA BEQ STA LDA AND ORA STA INX INX BNE
SLOT2
MODEND
#$80 TEMP #$00 #$01 OSLMO,X PTR OSLMO+1,X CSLOTMOD PTR+1 (PTR), Y #$OF TEMP (PTR), Y
; Or i gina 1
OSLOTM
#$80 TEMP #$00 CSLMO ,X PTR CSLMO+1,X MODEND PTR+1 (PTR) , Y HO F TEMP (PTR), Y
;Copy
CSLOTM
RTS
Tabelle der zu modif. Adr esse n
11.4 Das wirbe lnde Byte: Byte-Blizzard
1765: 1767 : 1769 : 176B: 176D : 176F' : 1771: 1773 : 1775 : 1777:
38 47 5B 6F' 83 96 A8 B7 C7 00
OE OE OE OE OE OE OE OE OE 00
1779: 177B: 177D: 177F' : 1781 : 1783: 1785: 1787: 1789 : 178B: 178D: 178F' : 179 1 : 1793: 1795: 1797: 1799: 179B : 179D: 179F': 17Al : 17A3 : 17A5: 17A7 : 17A9 : 17AB: 17AD: 17AF': 17Bl : 17B3: 17B5: 17B7: 17B9 :
22 25 32 35 4F' 52 67 6A 85 88 91 94 C8 CB F'O F'3 ID 20 35 38 4D 50 64 67 82 85 B6 B9 C2 C5 DD EO 00
OC OC OC OC OC OC OC OC OC OC OC OC OC OC OC OC OD OD OD OD OD OD OD OD OD OD OD OD OD OD OD OD 00
17BB 17BD 17BE 17CO 17C l
A2 00 8A 29 CO 4A 4A
1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 150 1 1502 1503 1504 1505 1506 1507 1508 1509 15 10 1511 1512 1513 15 14 15 15 15 16 1517 15 18 15 19 1520 1521 1522 1523 1524 1525 1526 1527
267
OSLMO
ADR ADR ADR ADR ADR ADR ADR ADR ADR HEX
RDNIBBL RDNIBBLI RDNIBBL2 RDNIBBL3 RDNIBBL4 RDNIBBL5 RDN I BBL6 RDDAEPIL RDDAEPll 0000
CSLMO
ADR ADR ADR ADR ADR ADR ADR ADR ADR ADR ADR ADR ADR ADR ADR ADR ADR ADR ADR ADR ADR ADR ADR ADR ADR ADR ADR ADR ADR ADR ADR ADR HEX
WRS I WRS2 WRS3 WRS4 WRS5 WRS6 WRS7 WRS8 WRS9 WRSI0 WRS11 WRS12 WRS13 WRS14 GAP2 WRS15 WRS16 WRS17 WRS 18 WRS19 WRS20 WRS21 WRS22 WRS23 WRS24 WRS25 WRS26 WRS27 WRS28 WRS29 WRS30 WRS31 0000
Tabellen anlegen Sc hr e ibübe rse tzun gst ab . 4-mal kopie r en MAK ETABS LDX TABLOOP TXA AND LSR LSR
n oo n co
;800- 83F' ;840-87F' ;880-8BF' ; 8CO-8F'F'
00 10 20 30
268
11. Schnell wie der Wind
17C2: 17C5: 17C6: 17C7: 17CA: 17CB: 17CC: 17CF: 1700:
90 4A 4A 90 4A 4A 90 E8 00
00 08
1702 : 1704: 1707: 170A: 1700: 17EO: 17E3: 17E4 : 17E5: 17E6: 17E7: 17E9: 17EC: 17EO: 17EE: 17EF: 17FO: 17F2: 17F5: 17F6: 17F7 : 17F8 : 17FB: 17FC: 17FE:
A2 BO 90 90 90 90 8A OA OA 48 29 90 68 OA OA 48 29 90 68 OA OA 90 CA 10 60
3F 56 00 40 80 CO
17FF 1802 180A
00 09 00 OA EB OF OB OB OB OB
CO 00 03
CO 40 03
80 03 06
EO 00 BO AO 90 80 20
STA 1528 LSR 1529 LSR 1530 STA 1531 LSR 1532 LSR 1533 1534 STA 1535 INX BNE 1536 1537 LOX 1538 1539 LOOP2 LOA 1540 STA 1541 STA 1542 STA 1543 STA 1544 TXA 1545 ASL 1546 ASL 1547 PHA 1548 ANO 1549 STA 1550 PLA 1551 ASL 1552 ASL 1553 PHA 1554 ANO 1555 STA 1556 PLA 1557 ASL 1558 ASL 1559 STA 1560 OEX 1561 BPL 1562 RTS 1563 1564 Hi-Byte vom 1565 1566 1567 PUFTAB HEX 70 60 50 40 30 1568
WRTRANS1,X ;900-93F :00 ;940-97F:04 ;980-9BF:08 WRTRANS2,X ;9CO-9FF:OC ;AOO-A3F:00 ;A40-A7F :01 WRTRANS3,X ;A80-ABF:02 ;ACO-AFF:03 TABLOOP n 3F SUET,X WRTRANS4,X ;BOO-B3F WRTRANS4+$40,X ;B40-B7F WRTRANS4+$80,X ; B80-BBF WRTRANS4+$CO,X ;BCO-BFF
;300-30F:00 ;3 10-31F:40 nco ROTRANS1,X ;320-32F:80 ;330-33F:CO ;340-343:00 ;344-347:40 ;348-34B :80 ; 34C-34F : CO n co ROTRANS2,X ;37C-37F : CO ;380:00 ;38 1 :40 ROTRANS3,X ;382:80 ;383:CO LOOP2 ;3BF:CO Speicher für jeden Track EOOOBOA09080706050403020
269
Anhangl 6502/ 65C02-Tabelle Funclion
load
Mnemon .
Immedi. Zero-Po Zero , X Zero, Y Absol. Abs. X Abs, Y lind_ XI (Ind). Y Implizit Relaliv ( Ind ) Op Cy Op Cy Op Cy Op Cy Op Cy Op Cy Op Cy Op Cy Op Cy Op Cy Op Cy Op Cy Op Cy Akku
LOA LOX LOY
Store
A9 A2 AO
STA STX STY
AS A6
B5
4
B4
4
3 3
95
4
3
94
4
A4
3 3 3
85 86 84
B6
AO 4 AE AC
96
4
80 8E 8C
BO 4- B9 4' Al BE 4' BC 4-
6
Bl
5'
B2
S
90
6
91
6
92
S
5
99
5
81
Transfer
TAX TXA TAY TYA
AA 8A A8 98
Stack Ptr
TSX TXS
BA 9A
Stack
PHA PLA
48
PHP PLP CLC SEC CU SE I CLO SEO CLV
18 38 58 78 08 F8 B8
Status
R.
Flags
Jump
JMP JSR
Return
RTS RTI
Compare
CMP CPX CPY BIT
Branch
BMI BPL BEO BNE BCS BCC BVS BVC
N =O ZoO C =O V=O
C5 E4 C4 24
05
4
34
4
004'
CO EC CC 2C
3C
09 4' Cl
6
- Z - Z - Z -
NN N N-
-
Z Z Z Z
-
N -
- Z -
68
N -
- Z -
08 28
3 4
NVOIZC - - - 0 1 - - 0
- 0 - 1 0 1 -
6e 5/6 60 40
C9 EO CO 89
NN N-
3 4
7e 6-
4C 20
Sta tus
NVO I ZC
NVOIZC
01 5-
02
•
5
N N N 76
-
-ZC -ZC -ZC - Z -
30 2+
10 2..FO 2+
00 Ba 90 70 50
2 "" 2+ 2+ 2+ 2+
INC INX INY
IA
Decrement
OEC OEX OEY
3A
Add ISub!.
AOC SBC
69 E9
Boolean
A NO ORA EOR
29 09 49
SMt
ASL LSR
OA 4A
06 46
16 56
OE 4E
lE 716 SE 716
N -
o-
-Z C - ZC
ROlate
ROL ROR
2A 6A
26 66
36 76
2E 6E
3E 716 7E 7/6
N N -
- ZC - Z C
Sons tiges
NOP BRK
65C02
BRA
Increment
2
E6
2
5
F6
TSB
6
FE 716
6
CE 6 OE 7/6
65 ES
75 F5
4 4
60 EO
4 7D 4' 79 4' 4 FD 4- F9 4-
25 05 45
35 15 55
4
20 00 40
4 30 4' 4 10 4' 4 50 4-
5
61 El
39 4' 21 19 4- 01 59 4- 41
NNN-
- Z -
E8 C8 CA 88
N N N-
- Z - Z - Z -
NV- - Z C NV - - z C
31 11 51
32 12 52
N - - - z N - - - Z N - - - Z -
5' 5' 5'
2 7
- 1
80 3-
64 14 o.
74
•
DA 5A FA 7A ge le oe
9E
1 Takt mehr bei Sei lenübergang .
JMP (S HHLL) und JMP (SHHLL, Xl je 3 Bytcs: passen nicht in Systema tik kursiv = 65C02-Anderungen
NN-
- Z -
- Z -
5
,' = 2 T ak le bei N icht-Verzweigung, 3 Takte bei Verzweigung. 4 Takle bei Verzweigung mi t Sei lenübergang .
=
- Z -
72 F2
BYleanzaht
.=
- Z -
71 5' Fl 5'
EA 00
PHX PHY PLX PLY
TR8
EE
06
C6
S TZ
6
76 - - Z 76 - - Z -
270
A nhang2
Anhang 2: ASCII-Tabelle NUL @ § A B C EOT D E F BE LL G H TAB I K I FF RTN M 50 N 51 0 P XON 0 R 5 XOF F T U V W X Y Z E5C [A
00 01 02 03 04 05 06 07 08 09 OA OB OC OD OE OF 10 11 12 13 14 15 16 17 18 19 1A lB \ Ö lC
IÜ
10
lE _ lF 20 21 22 "" 23 S 24 % 25 & 26 27 28 29 2A + 2B 2C - 2D 2E 2F 30 31 32 33 4 34 5 35 6 36 37 38 39 3A 3B < 3C 3D > 3E ? 3F
()()()()()()()( 00000001 00000010 00000011 00000100 00000101 00000110 0000011 1 00001000 00001001 00001010 00001011 00001100 000011 01 000011 10 0000111 1 00010000 00010001 00010010 00010011 00010100 00010101 00010110 00010111 00011000 00011001 00011010 00011 011 000111 00 000 11101 00011110 00011111 00100000 00100001 00100010 00100011 00100100 00100101 00100110 00100111 00101000 00101001 00101010 00101011 001011 00 00101101 00101110 00101 11 1 00110000 00110001 001 10010 00110011 00110100 00110101 001 10110 00110111 00111000 001 11 001 00111010 0011101 1 001111 00 00111101 00111110 0011111 1
000 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063
@§ A B C D E F G H
K L M N
o P Q
R 5 T U V W X Y Z [A \ Ö
I
Ü
_
a b
c d
e f
9 h
m n
o q r
u v x
z
lä
Iö
IÜ - ß DEL
40 01000000 064 41 01000001 065 42 01000010 066 43 01000011 067 44 01000100 068 45 01000101 069 46 01000110 070 47 01000111 071 48 01001000 072 49 01001001 073 4A 01001010 074 4B 01001011 075 4C 01001 100 076 4D 010011 01 077 4 E 01001110 078 4 F 01001 11 1 079 50 0101 0000 080 51 01010001 061 52 01010010 062 53 01010011 083 54 01010100 084 55 01010101 085 56 01010110 086 57 0101011 1 087 58 01011000 088 59 01011001 089 5A 01011 010 080 5B 01011011 091 SC 01011100 092 5D 0101 11 01 093 SE 01011110 094 5F 01011111 095 60 01100000 096 61 01100001 097 62 01100010 098 63 01100011 099 64 01100100 100 65 01100101 101 66 01 100110 102 67 01100111 103 68 01101000 104 69 01101001 105 6A 01 101010 106 6B 011 01011 107 6C 011 011 00 108 6D 01101101 109 6E 01101110 110 6F 01101111 111 70 01 110000 11 2 71 01110001 113 72 01110010 11 4 73 0111001 1 115 74 01110100 116 75 01110101 117 76 01110110 118 77 01110111 119 78 01111000 120 79 01111001 121 7A 011 11010 122 7BOll11011123 ic 011111 00 124 7D 0111 11 01 125 7E 01 111110 126 7F 01111111 127
@§ A B C D F G H
K L M N
o P Q
R 5 T U V W X Y Z [A \ Ö ) Ü
_
"" S % &
+
-
< > ?
60 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F AO Al A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF BO BI B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
10000000 10000001 10000010 10000011 10000100 10000101 10000110 10000111 10001000 10001001 10001010 10001011 10001 100 10001101 10001110 10001 111 10010000 10010001 10010010 10010011 10010100 10010101 100101 10 10010111 10011000 10011001 10011010 10011011 10011100 100111 01 1001111 0 10011111 10100000 10100001 10100010 10100011 10100100 10100101 10100110 10100111 10101000 10101001 10101010 10101011 101011 00 10101 101 10101110 101 01111 10110000 10110001 10110010 101 10011 10110100 10110101 1011011 0 101101 11 10111000 101 11001 101 11010 10111011 101111 00 101111 01 10111 110 10111111
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
@§ A B C D E F G H I
co Cl C2 C3 C4 C5 C6 C7
es
C9 CA K CB CC M CD N CE o CF P DO Q Dl R D2 5 D3 T D4 U D5 V D6 W D7 X D8 Y D9 Z DA [ A DB \ Ö DC I Ü DD DE _ DF EO a EI b E2 c E3 d E4 e E5 f E6 9 E7 h E8 E9 EA EB EC m ED n EE o EF P FO q Fl F2 F3 F4 u F5 v f6 w F7 x F8 F9 z FA I ä FB I ö FC I ü FD - ß FE DE L FF
11 000000 11 000001 11 000010 11000011 11 000100 11 000101 11 00011 0 11 000111 11001000 11 001001 11 001010 11 001011 11 0011 00 11 001 101 11 0011 10 11 0011 11 1101 0000 11 010001 11010010 1101 0011 11 010100 11010101 11 0101 10 11 01 0111 11 011000 11 011001 11011010 11011011 11011100 11 01 11 01 11011110 110111 11 11100000 11100001 11100010 11100011 11100100 11100101 11 10011 0 11100111 11 101000 11101001 11101010 111 01011 11101100 11101101 11101110 111011 11 11110000 11110001 111 10010 1111 0011 11110100 1111 0101 1111 011 0 11110111 11111000 111 11001 11111 010 11 11 1011 111 11100 11 111101 11 111110 111 11111
192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255
Anhang3
271
Anhang 3: Bildschirmdarstellung 1. Zeichensatz
Zeichen
Darstell ung Nor
! " # $
% & ,
( )
*
+ , /
0 1 2 3 4 5 6 7 8 9
, < =
> ?
AO Al A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF BO BI B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
Zeichen
Fis
Inv
60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71
20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
72
73 74 75 76 77
78 79 7A 7B 7C 7D 7E 7F
@§
A B C D E F G H
I J K L M
N 0 P
Q R S T U V W X Y
Z [Ä /Ö
jÜ /\
-
Darstellung Nor
Fis
Inv
CO Cl C2 C3 . C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF DO D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A SB SC 5D SE 5F
00 01 02 03 04 05 06 07 08 09 OA OB OC OD OE OF 10 11
12 13
14 15 16 17 18 19 lA 1B lC 1D
lE IF
272
Anhang3 Zeichen
@ A B C D E F G H I
J K L M N
0 P Q R
S T U V W X Y Z
[
\ J 1\ -
Darstell ung Crtl 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
Zeichen IIplus IIe/llc
! " # $ % &
,
( )
*'
+ , -
a b c d e f g h i
J k I m
n
/ 0 1 2 3 4 5 6 7 8 9
,
-ß
?
rub
Darstellung No r EO EI E2 E3 E4 ES E6 E7 E8 E9 EA EB EC ED EE EF FO Fl F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF
Der zweite Zeichensatz des IIc un d des en hanced He e nthält vo n $40-$5F Mauszeichen und von $60-$7F den inversen Klei nbuchstaben-Zeichensatz.
273
Stichwortverzeichnis
Stichwortverzeichnis alphabetisches Verzeichnis
4&4-Codierung 230 6&2-Codierung 230 80STOREOFF 30 80STOREON 29 80Z/Z 29 80Z/Z Curso r 30 &-BeFehl 139
Blase n-Sort. 146 Blockgrafik 37 BLTU2185 BSORT 147 BSSERR 148 Bubble-Sort. 146 Byte-B lizzard 229 , 236
AlUH 164 A2UH 165 A4UH 164 Abrufsch leife 229 ABS 116 Access 211 Adressfe ld 227 A LLOCA TE INTERR UPT 209 Aillpersa nd 139 AND 117 ARYTAB 122, 125 ASCII 9 ATN 116 Ausgabe-Vektor 87, 223 AUX-Memo ry 29 Aux-Typ 212 AYINT 119
CATALOG 206 CHAIN-Progralllill 168 CHKCLS 142 CHKCOM 141 CHKOPN 142 CHKSTR 186 CHRGET 139 CHRGOT 140 CLEOLZ 15 CLOSE 206, 219 CLREOP 16 CLRFNBUF 186 CLRSC237 CLRSCR 37 CLRTOP 37 CMPLPRMS 188 Code , selbstillodif. 94 Code , verschiebbarer 162 Codierverfahren 230 COLCOUNT 44 COlllmand-Handler 222 COMP 118, 154 CON INT 120 CONNECT 87,188 COPYA 236 COPYBP 188 COPYFN 187
BASCALC 11 , 11 BASrc.SYSTEM 222 Basisadresse 70 BASUH 11 Bildschi rillausgabe 9 Bi ldschi rillspeicher 10 Bitg rafik-Mod us 96 BitIlluster 44 BKGND 46
274 COPY IIE 236 COPY IIplus 236 COS 116 COUT 19 CREATE 211 Cross-Reference 160 CROUT 115 CSWLlH 86 Ctrl-D 86 Ctrl-G 24 Cursor-Steuerung 24 DATA 143 Datenfeld 227 Datenregister 229 DATPTR 188 DCT203 DEALLOCATE INTERRUPT 210 DELETE 206 Deskriptoren-Stack 136 DESTROY213 Dimension 126 Disk-Controli er 226, 232 Diskette 227 Diskettenzugriff 226 DIVlO 116 DOS 86 DOSERR 188 Double-HIRES 42 DOWN-SCROLL 13 DRAW 52 DRAW154 Druckroutine 95 DRWPARA53 Ein-/Ausgabe 86 Eingabe-Vektor 87, 223 EOF221 Epilog 227 EPSON-Interface 90 EXP 116 Exponent 107 FADD 117 FADDH 116 FADDT 117 FALSE 116 Farbbit 47 , 59
Stichwortve rzeichnis FCOMP 118 FDIV 117 FDIVT 117 Feld 122 Feldvariablen 125-126 Fenster 61 Fenster-Demo 61 File-Lese r 191 File-Manager 187-188, 203 File-Puffer 205 Filepuffer 223 FILEREAD 188 Filetyp 188 Fi le-Typ 205 , 212 FIN 120, 135 FLASH 10, 25 FLENGHT127 Fließkomma-Akkum ul ator 110 Fließkomma-Format 106 Fließkomma-Paket 106 Fließkomma-Zahlen 111 Flimmern 72 FLOAT120 Floating-Point 106 FLUSH 220 FM-Arbeitsbereich 204 FM-Feh lercod e 204 FM-Parameterliste 204 FMULT 112 , 117 FMULTI 112, 117 FNDLIN 183 Formatieru ng 227 Form, gepackte 108 Form , norm alisierte 107 Form , ungepack te 108 FORPNT 137 FOUT 120 FP-Operationen 116-118 FPWRT 117 FP-Zahlen- Vergl. 154 FREEB UFR 224 FRESTR 186 FRETOP 124 FRMEVL 156 FSUB 117 FSUBT 117 Funktion 122, 125
275
Stichwortverzeichnis Ganzzahl122 GAP 228 Garbage Collection 125 , ]83 GBASLIH 44 GDBUFS 135 ge pack te Form 108 Geschwindigke it 28 GETADR 120, ]57 GETARYPT 128 GETBUF ]87 GETBUF222 GETBUFR 224 GETEOF221 GET FILE INFO 215 GETFMPL202 GETTOB 202 GETLN 134 GETLNI135 GETLNZ 134 GET MARK 220 GETNUM 159 GET PREFIX 217 GET TTME 211 GIVAYF 119 GR35 Grafik , doppelthochaufl . 42 Grafik , hochaufl öse nd e 41 Grafik , ni edriga uflöse nd 32 Half-Tracks 233 Hauptspeicher 29 HCLR 46 HCOLOR 48 HCOLOR144 HCOLORZ44 Header 227 HEX 24 60 HEX 2C60 HEX-DEZ 155 HFIND 51 HGLIN 50 HGR45 HGR245 HGR372 HGR472 HGR anzeigen 45 HGR-Drucker 85 HIGHDS 127 , 185
HIGHTR 185 HIMEM186 HIRES 34 HIRES] 41 HTRES241 1-URES-Adressierung 42,70 HIRES-Farben 46 HTRES-Routinen 41 HIRES-Schrift 73 HTRES-Scroll 54 HIRES verschieben 54 HISCR 29,34 HLINE 36 HMASK 44 HNDX44 HOME 16 HPAG44 HPLOT 50 HPOS 51 Informationsblock 126 TNIT 13, 203 , 207 INSDS2165 INSTDSP 165 TNT 116 In terface 95 Interrupt-Routinen 209 INVERSE 10 TOB 202 IIO-Block 202 Joy 104 Kommentar 183 Konvertierungs-Rout. 119 Kopierprogramm 226 Kopierzeiten 236 KSWLlH 86 Lautsprecher 100 LENGTH 165 LINGET 183 LTNPRT 159 Loch-Dateien 221 LOCK 206 Locksm ith 229 , 236 LOG 116 Logische Operationen 117
276
Stichwortverzeichnis
LOMEM 122, 183 LORES 34 LORES- Adress ierung 33 LORES-Farbtabe lle 33 LORES-Grafik 32 LORES-Seiten 32 Löschprogramm 97-98 Löschro utin e 16 LOWSCR 29, 34 LOWTR 127, 185
Null (Zah l) 109 NUMDIM 127 NUMTYP 127 NXTAl 165 NXTBUF 187
Machine-Language-Interface 208 MAIN-Memory 29 Mantisse 107 Matrixd ruck er 85 Matrize n 125 MAXFILES 223 MFAC 110 MISMTCH 141 MIXCLR 34 MIXSET 34 MKINT 119 MLI-A ufruf 208 MONZ 164 MOVE 189 MOVEIF 119 MOVE2F 119 MOVEFM 119 MOVEFS 119 MOVEMF 119 MOVESF 119 MOVESM 118 MOVEZF 119 MOVFM 112 MULTlO 116 Multi pli kation mit 7 71 MUSIC 100 Musikprogramm 101
Page-Fl ipping 72 Parameterli ste 187 Parameterübergabe 139 PARMBLOCK 209 PCADJ3 165 PCLlH 165 Pi 111 PLOT 37 Polling Loop 229 POSITION 207 PRBYTE 115 Prenibble 23 1 PRINT 20 PRNTAX 157 PRNTFAC 120 PRNTYX 158 ProDOS 86, 208 PRODOS.SYSTEM 222 PROGRAMMERS AID 101 Prolog 227 PROMPT 134 Prüfsumme 228 PSHMFAC 120 PTRGET 127- 128 Pufferverwaltung 223 PULLSFAC 121
NEGOP 116 NEWLINE 217 NEWSTT 190 NEXTCOL40 NOBUFS 187 NORM 116 NORMAL 10 no rm alisierte Form 107 NOT 11 6- 117
ON UN E 216 OPEN 188 , 191, 205,217 OR 117 Overlay-Manager 168
Querverweis 160 QUINT 120 QUIT210 RD2BYTE 188 READ 203 , 206, 218 READ BLOCK 210 REBOOT21O Ree lle Za hl 122 relokativ 162
277
Stichwortverzeichnis RENAME 206, 213 RESTORE 92, 188 Ringtausch 138 RND 116 RNDB 116 R ückspru ngadresse 167 RWTB 192 RWTS 192 RWTS -Parameterliste 202 Saplin g 215 SAVE 92 SCALEZ44 Schnelkopierer 228 Schrift-G enerato r 75 Schriftm at ri x 74 Scratch-Bytes 43 Scratchpad 11 SCRN 40 SCROLL 13 Seedlin g 215 SEEK 203 Sektor 227 selbstmodif. Code 94 SET BUF221 SETCOL36 SET EOF221 SET FILE INFO 214 SETGR 35 SETHCOL 49 SETINV 25 SETKBD 187 SET MARK 220 SETNORM 25 SET PREFIX 216 SETIXT 12 SETVID 187 SFAC 110 SGN 116 SGNA 116 SGNFLT 120 Shape-Ad resse 53 SHAPELIH 44 SHAPEPNT44 Shapes 51 SIN 116 SNGFLT 137 Softswitches 33 , 232 Sortieralgori thm us 146
Sortierprogramm 146 SPEED 28 Speicherbelegung 123 Speicher reservieren 224 SQR 116 Stack 167 Startad resse 164 Steppermotor 233 STKINI1 89 Storage-Typ 215 STR$ 69 STRCMP 151, 153 STRCPY 137 STREND 125 Strin gpoo l 185 STRLITl136 STROUT27 Strukturblock 126 Subdirectory 215 SUBFLAG 127 Superq uick 229, 236 Super Serial Card 96 SWAP 138 Sync-Bytes 229 SYNCHR 143 Synchro nisa tio ns-Byte 227 Sy ncs 227 Sy nc-Signature 236-237 SYNTERR 158 Tabelleneintrag 124 Tabu lator horz . 22 Tab ul ato r vert. 22 TABV22 TAN 116 TEMPPT 136 TEXT-Adressierung 10 Textausgabe 29 Textbildschirm 9 Textfenster 12 Textfile 191 Textpointer 139 To nerzeugung 100 T rack 227 Track-Sek to r-Li ste 202 Trailer 227 Tree 215 Trick-Byte 60
278 TRUE 116 TSL 202 TXTCLR34 TXTPTR 127, 139 TXTSET34 TYPE 191 Übertragungs-Ro utinen 118 UFO 105 Uhrenroutine 211 ungepackte Form 108 UNLOCK206 UNLOCK-Trick 191 VALTYP 127 Variab le, einfache 122, 125 Variable , Felder 126 Variab len-Kopf 126 Va ri ab lenn ame 124, 133 Variab len suchen 127 Variablen tauschen 138 Variablen-Übergabe 129 VARL 119 VARL1119 VARNAM 127 VARPNT 127 VARTAB 122 Vergleich 94, 118 VERIFY207
Stichwortverzeichnis verschiebbarer Code 162 Verzöge ru ngsschl eife 16 Videx-Karte 29 VLINE 36 Vorzeichen-Byte 113 VTAB 15 VTABZ 15 VTOC206 WAIT 16 Werteblock 126 WNDBTM 12 WNDLFT 12 WNDTOP 12 WNDWDTH 12 WRITE 203 , 206, 219 WRITE BLOCK 211 XDRAW 52 XDRAW154 Zahlen basis 155 Zeichenkette 122 Zeichen ketten-Vergl. 151 Zeichensatz 10 ZEROFAC 116 ZEROPRMS 187 Z usatzspeicher 29
numerisches Verzeichnis $OOOF NUMDIM 128 $0011 V AL TYP 128 $0012 NUMTYP 128 $0014 SUBFLAG 128 $0016 CMPFLG 151 $OOIA SHAPEL 44 $OOlB SHAPEH 44 $OOIC HCOLOR1 44 $0020 WNDLFT 12 $0021 WNDWDTH 12 $0022 WNDTOP 12 $0023 WNDBTM 12 $0024 CH 22 $0025 CV 22
$0026 GBASL 44 $0027 GBASH 44 $0028 BASL 11 $0029 BASH 11 $002F LENGTH 165 $0030 HMASK 44 $0033 PROMPT 134 $0036 CSWL 86 $0037 CSWH 86 $0038 KSWL 86 $0039 KSWH 86 $003A PC 165 $003C Al 164 $003E A2 165
279
Stichwortverzeichnis $0042 A4164 $0044 NXTB UF 187 $0050 LINNUM 184 $0052 TEMPPT 136 $0064 FLENGTH 128 $0067 TXTI AB 123 $0069 VATI AB 122 $006B ARYTAB 123 $006D STREND 125 $006F FRETOP 124 $0073 HIMEM 123 $007D DATPTR 188 $0081 V ARNAM 128 $0083 V ARPNT 128 $0085 FORPNT 137 $0094 HIGHDS 128 $009B LOWTR 128 $009D MFAC 110 $OOAO VPNT 137 $00A5 SFAC 110 $OOAD STRNG2 137 $00B1 CHRGET 139 $00B7 CHRGOT 140 $00B8 TXTPTR 139 $00E4 HCOLORZ 44 $00E5 HNDX 44 $00E6 HPAG 44 $00E7 SCALEZ 44 $00E8 SHAPEPNT 44 $OOEA COLCOUNT 44 $OOFI SPEED 28 $03DC GETFMPL 202 $03E3 GETIOB 202 $03EA CONNECT 87 $A095 CLRFNBUF 186 $AIAE ZEROPRMS 187 $A471 FILEREAD 188 $A47A RD2BYTE 188 $A6D2 DOSERR 188 $A71A CMPLPRMS 188 $A 743 COPYFN 187 $A 74E COPYBP 188 $A764 GETBUF 187 $BEF5 GETBUFR 224 $BEF8 FREEBUFR 224 $BFOO MLI 208
$COOO 80STOREOFF 30 $C001 80STOREON 29 $COOC COL800FF 239 $COOD 80COL 42 $C050 TXTCLR 34 $C051 TXTSET 34 $C052 MIXCLR 34 $C053 MIX SET 34 $C054 LOWSCR 29 , 34 $C055 HISCR 29, 34 $C056 LORES 34 $C057 HIRES 34 $C05E DHIRESON 42 $C05F DHIRESOFF 42 $D39A BLTU2 185 $D539 GDBUFS 135 $D61A FNDLIN 184 $D683 STKINI 189 $D7D2 NEWSTI 190 $D849 RESTORE 189 $D995 DATA 143 $DAOC LINGET 184 $DA9A STRCPY 137 $DB3A STROUT 27 $DD6C CHKSTR 186 $DD76 MISMTCH 148 $DD7B FRMEVL 157 $DEI0 PSHMFAC 120 $DE47 PULLSFAC 121 $DE98 NOT 116, 117 $DEB8 CHKCLS 142 $DEBB CHKOPN 142 $DEBE CHKCOM 142 $DECO SYNCHR 143 $DEC9 SYNTERR 158 $DED5 VARL 119 $DEE9 VARL1119 $DF4F OR 117 $DF55 AND 117 $DF5D FALSE 116 $DF60 TRUE 116 $DF6A COMP 118, 154 $DF7D STRCMP 151, 153 $DFE3 PTRGET 128 $E108 MKJNT 119 $ElOC A YINT 119 $E196 BSSERR 148
280 $E2F2 GIVA YF 119 $E301 SGNFLT 120 $E3E9 STRLTl 137 $E5FD FRESTR 186 $E6FB CONTNT 120 $E752 GETADR 120, 157 $E7AO FADDH 116 $E7A7 FSUB 117 $E7BE FADD 117 $E7Cl FADDT 117 $E82E NORM 116 $E84E ZEROF AC 116 $E941 LOG 116 $E97F FMULT 117 $E982 FMULTT 117 $E9E3 MOVESM 118 $EA39 MULTlO 116 $EA55 DIVI0 116 $EA66 FDIV 117 $EA69 FDIVT 117 $EAF9 MOVEFM 119 $EBIE MOVE2F 119 $EB21 MOVEIF 119 $EB23 MOVEZF 119 $EB2B MOVEMF 119 $EB53 MOVEFS 119 $EB63 MOVESF 119 $EB72 RNDB 116 $EB82 SGNA 116 $EB90 SGN 116 $EB93 FLOAT 120 $EBAF ABS 116 $EBB2 FCOMP 118 $EBF2 QUINT 120 $EC23 INT 116 $EC4A FIN 120, 136 $ED24 LINPRT 159 $ED2E PRNTFAC 120 $ED34 FOUT 120 $EE8D SQR 116 $EE97 FPWRT 117 $EEDO NEGOP 116 $EF09 EXP 116 $EFAE RND 116 $EFEA COS 116 $EFF1 STN 116 $F03A T AN 116 $F09E ATN 116
Stichwortverzeichnis $F28C HIMEM1 86 $F390 GR 35 $F3D8 HGR2 45 $F3E2 HGR 45 $F3F2 HCLR 46 $F3F6 BKGND 46 $F411 HPOS 51 $F457 HP LOT 50 $F53A HGLIN 50 $F5CB HFIND 51 $F60l DRA W 52 $F605 DRA Wl 54 $F65D XDRA W 52 $F66l XDRA W1 54 $F6EC SETHCOL 49 $F7AA FSUBT 117 $F7D9 GETARYPT 129 $F800 PLOT 37 $F819 HLINE 36 $F828 VLINE 36 $F832 CLRSCR 37 $F836 CLRTOP 37 $F838 CLRSC2 37 $F85F NEXTCOL 40 $F864 SETCOL 36 $F871 SCRN 40 $F88C INSDS2 166 $F8DO TNSTDSP 166 $F940 PRNTYX 158 $F941 PRNTAX 158 $F956 PCADJ3 166 $FB2F TNIT 13 $FB39 SETTXT 12 $FB40 SETGR 35 $FB5B TABV 22 $FBCl BASCALC 11 $FC22 VT AB 15 $FC24 VT ABZ 15 $FC42 CLREOP 16 $FC58 HO ME 16 $FC70 SCROLL 13 $FC9E CLEOLZ 15 $FCA8 WATT 16 $FCBA NXTA1167 $FDOC RDKEY 201 $FDlB KEYIN 201 $FD67 GETLNZ 134
281
Stichwortverzeichnis $FD6A GETLN 134 $FD6F GETLN1 135 $FD8E CROUT 115 $FDDA PRBYTE 115 $FDED COUT 19 $FE2C MOVE 190 $FE80 SETINV 25 $FE84 SETNORM 25
$FE89 SETKBD 187 $FE93 SETVID 187 $FF3F RESTORE 92 $FF4A SA VE 92 $FF58 IORTS 167 $FF69 MONZ 164 $FFA7 GETNUM 159
Programm-Verzeichnis BASIC.SORT ]47 BYTE-BLIZZARD 238 BSORT.DEMO 150 BSORT 147 CHAR.SET 81 CLEAR197 CLEAR298 CROSSREFERENZ 160 CROSS2167 DOWN-SCROLL 13 DRWPARA 53 FARBTEST47 FILELESER 192 FP-DEMO 113 HEX-DEZ 155 HGR-DRUCKER 87 HGR-TEST91 HGR-WINDOW 63 HGR.W.DEMO-STARTER 62 HGR.WINDOW.DEMO 62 HIRES-SCROLL 54 HPRINTER 75 JOY 104 LORES 38 MUSIC.DEMO 103
MUSIC 101 OVL-DEMO 182 OVL-MANAGER 172 SORTER 183 PRINTER 183 PRINT DEMO 80Z/Z 30 PRINTl20 PRINTI 20 PRINT3 23 PRINT424 PRINT526 PRINT627 PRINTI28 SWAPl.DEMO 143 SWAP1140 SWAP2.DEMO 145 SWAP2144 TL.DEMO 19 TEXTLOESCH I 17 TEXTLOESCH2 17 TEXTLOESCH318 TEXTLOESCH419 UFO 105 V AR-DEMO 130 VARIABLEN-DEMO 129
HÜChia
Arne SChäpers
ProDOS-Analyse Versionen 1.0.1, 1.0.2, 1.1.1
1985, 470 S., kart., DM 68,ISBN 3-7785-1134-3
"Die ProDOS Analyse" ist die umfangreichste und detaillierteste Darstellung , die jemals ein Apple-Betriebssystem erfahren hat. Wer die "I nnereien" von ProDOS bis zum letzten Byte, z. T. bis ins letzte Bit kennen lernen möchte, braucht dieses Buch. Das komplette Betriebssystem (Urlader, MLI, Disk-Driver, RAM-Disk-Driver und UhrRoutine) mit Ausnahme des BASIC-SYSTEM wird mit umfangreichen Kommentaren und Übersichtstabellen disassembliert. Dabei werden alle bisherigen Versionen von 1.0.1 bis 1.1.1 berücksichtigt. "Die ProDOS Analyse" beschreibt erstmals auch mehrere Programmfehler, die bis in die neueste Version zu finden sind . Auch die nicht im "Technical Reference Manual" aufgeführten Eigenschaften von Pro DOS werden analysiert und
Dr. Alfred Hüthig Verlag Im Weiher 10 6900 Heidelberg 1
besch rieben, z. B. die vertrackten eingebauten Testroutinen zur Identifikation der verschiedenen Apple II Modelle und eventuel ler Nachbaugeräte. Progffimmieffi~dieProDOS
versionsabhängig "patch en" möchten, erhalten hier den genauen Überblick, wo was geändert werden muß , damit dies kei ne negativen Konsequenzen hat. Durch die minutiöse theoretische Sezierung von ProDOS eröffnen sich völlig neue programmierpraktische Perspektiven.
Ulrich Stiehl
Apple-Assembler
1984,200 S., 3 Abb., kart., DM 34,ISBN 3-7785-1047-9 Begleitdiskette DM 28,ISBN 3-7785-1048-7
"Apple Assembler" wendet sich an alle, die bereits Anfängerkenntnisse der 6502Programmierung haben z. B. aufgrund des Buches "Apple Maschinensprache" und nunmehr ein Nachsch lagewerk für ihren Apple II Plus l Ile / lic suchen, in dem alle wichtigen ROM -Routinen sowie eine Vielzahl sonstiger Hilfsprogramme in seiner systematischen Form zusammengestellt werden . Insgesamt umfaßt dieses Buch über 40 Util ities, darunter mehrere völlig neuartige Programme wie Double-Lores, Double Hilres, Screen-Format u.a. Der erste Teil enthält ein Repetorium der wichtigsten Befehle, Adressierungsarten und sonstigen Besonderheiten des 6502. Im zweiten Tei l werden alle Adressen des Monitors zusammengestellt, die für . Assembler-Programmierer von Nutzen sein können . Darüber
hinaus findet der Leser Unterroutinen für hexadezimale Addition ISubtraktion IMultiplikation I Division, Binär-HexASCII-Umwandlung usw. Der dritte Teil befaßt sich mit der Speicherverwaltung der Language Card und der Ile64K-Karte und enthält MoveProgramme zum Versch ieben von Daten in die und aus der Language Card sowie der 64KKarte. Der vierte Teil ist dem Applesoft-ROM gewidmet und listet eine große Anzahl nützlicher Interpreter-Adressen. Bei den Uti lity-Programmen liegt das Schwergewicht auf Fließkommamathematik einschließlich Print Using. Der letzte Teil behandelt den Text- und Graphikspeicher. Neben einem professionellen Maskengeneratorprogramm werden auch Routinen zur Double-Lores und DoubleHires-Grafik vorgestellt.
Dr. Alfred Hüthig Verlag Im Weiher 10 6900 Heidelberg 1
HÜChlia
Jürgen Kehrel
Apple-Assembler lernen Band 1: Einführung in die Assembler-Programmierung des 6502 165C02
1985,234 S., kart. , DM 38,ISBN 3-7785-1151-3 Begleitdiskette: DM 44,ISBN 3-7785-1243-9
Das zwei bändige Werk "Apple Assemb ler lernen" ist ein kompletter Kurs in der Assemblerprogrammierung des 6502 und des 65C02 auf dem Apple 11, der nicht da aufhört, wo andere Einführungen auf "weiterführende Literatur" verweisen. Starkes Gewicht wird auf die praktische Anwendung gelegt. Deshalb gehört zum Kurs ein vollwertiger 2-Pass Assembler, der als einer von wenigen die erweiterten Befehle der neuen IIc und lI e Prozessoren 65C02 verarbeitet und der auch lange Programme von mehr als 1 000 Zeilen in wenigen Sekunden übersetzt. Zu seinen professionellen Eigenschaften gehören neben 15 PseudoOpcodes, die die Arbeit mit Strings und Tabellen zu einem Kinderspiel werden lassen, ein Zei leneditor mit viel Komfort und die Fähigkeit, Quellcode in versch iedenen Formaten zu schreiben und zu lesen. Ein interaktiver Debugger und Simu-
lator hilft Ihnen, eigene und fremde Maschinenprogramme zu verstehen. Mit seinen vielfältigen und mächtigen Möglichkeiten läßt er.Sie hinter die Kulissen Ihres Rechners schauen. Sie können "sehen" , was abläuft, Ih re Vorstellungskraft wird angeregt und nicht nur einfach Ih r Gedächtnis strapaziert. Alle Programme sind 100 % kompakter Maschinencode, nicht einfach compiliertes Basic. Im ersten Band erlernen Sie inn erhalb von 35 Lektionen sämtliche Maschinenbefehle des Apple und die wichtigen Grundalgorithmen. Der Umgang mit dem Assembler und dem Simulator wird geübt, und zum Nachschlagen steht eine ausführliche Befeh lsbeschreibung mit vielen praktischen Beispielen bereit.
Dr. Alfred Hüthig Verlag Im Weiher 10 6900 Heidelberg 1
Hü-ehia
Heinrich Kersten
Apple-CP IM: AssemblerProgrammierung für Einsteiger, Fortgeschrittene und 6502-Kenner
1986, ca. 200 S., kart., ca. DM 38,ISBN 3-7785-1379-6 Begleitdiskette: DM 44,ISBN 3-7785-1380-X
Das Buch beschreibt die Assembler-Programmierung im Rahmen des CP IMBetriebssystems. Es wurde vorrangig für die Besitzer von Apple li-Geräten konzipiert. Der überwiegende Teil des Buches ist aber geräteunabhängig und somit auch für die Benutzer anderer CP IMtüchtiger Fabrikate (mit 8080 I Z80-Prozessor) von Interesse.
ge Basisprogramme (Konvertierungen , Binär- und BCDArithmetik) , umfassende Diskussionen der Debugger, Assembler und Linker sowie des CP I M-Betriebssystems (Speicherverwaltung , BDOS und BIOS-Aufrufe, Bildschirmfunktionen) . Den Abschluß bilden lauffähige Beispielprogramme und Utilities und ein umfangreicher Tabellen-Anhang.
Einsteiger erhalten im ersten Abschnitt einen Intensiv-Kurs (auch in der DDT-Anwendung) . Für Kenner der 6502Programmierung werden viele Querverweise vorgestellt. Der Z80-Befehlsvorrat wird im Detail erläutert. Es folgen wichti-
Dr. Alfred Hüthig Verlag Im Weiher 10 6900 Heidelberg 1
HÜChia
Hans Gabriel
Das Buch zum Apple-Writer II/lle
1986,155 S. , kart., DM 35,ISBN 3-7785-1234-X Begleitdiskette DM 44,ISBN 3-7785-1337-0
"Das Buch zum Apple Writer 11 / lle" wendet sich an alle, die dieses Textverarbeitu ngssystem schon einsetzen oder noch einsetzen wollen. In einzelnen , in sich geschlossenen Kapiteln erlernt der Leser alle Funktionen und erzielt schnelle Erfolgserlebnisse. Im ersten Kapitel werden typische Arbeitsstellungen der Textverarbeitung und ihre systematische Bearbeitung vorgestellt. Das zweite Kapitel stellt in logischen Funkti onsgruppen die Befehle vor, mit denen der Applewriter während der Textarbeit di rekt gesteuert werden kann. Kapitel 3 zeigt die Programmierung des Applewriters in der TextKommando-Sprache TKS (WPL). Dazu werden Beispiele analysiert. Auf der Beg leitdiskette zum Buch, die seperat bezogen werden kann , sind darüber hinaus umfangreiche SChwerpunkterklärungen entDr. Alfred Hüthig Verlag Im Weiher 10 6900 Heidelberg 1
halten , die über die HelpFunktion vom Benutzer abgerufen werden können. Eine kleine Adreßdatenbank mit der dazugehörigen Dienstprogrammen zur Pflege der Daten und zu ihrem Einsatz in Einzeiund Serienbriefen befindet sich ebenfalls auf Diskette. " Das Buch zum Apple Writer II / lle" behandelt sowohl die alte Programmversion für den Apple IIplus als auch die neue Ausgabe, die 128-kByte auf dem Apple lIe oder Apple Ilc unterstützt.
Ulrich Stiehl
ProDOS für Aufsteiger Band 1
2. geänderte Auflage 1985, 208 s., kart., DM 28,ISBN 3-7785-1098-3
"Apple ProDOS für Aufsteiger" ist der Nachfolgeband zu "Apple DOS 3.3 - Tips und Tricks" . ApplesoftProgrammierer, die unter DOS 3.3 gearbeitet haben, werden sich schnell an ProDOS gewöhnen, da ProDOS und DOS 3.3 in dieser Hinsicht weitgehend kompatibel sind . Dagegen müssen AssemblerProgrammierer völlig umdenken. Deshalb liegt das Schwergewicht dieses Nachfolgebandes auf der Assemblerprogrammierung und der minutiösen Darstellung der ProDOS-internen Systemadressen , die jedoch auch für Applesoft-Programmierer von großer Bedeutung sind. Im ersten Teil wird zunächst ein allgemeiner Überblick über das neue "Professional Disk Operation System" gegeben. Im Anschluß daran folgt eine Gegenüberstellung der Geschwindigkeit des Diskettenzugriffs. Dann wird die interne Speicherorganisation detailliert beschrieben (Boot-Vorgang , Zero-Page, ProDOS-Vektoren , Basic-System-Puffer, BasicSystem-Global-Page, Basic-
I~
Command-Handler, 1/ 0Vektoren , ProDOS-GlobalPage, Language-CardOrganisation, Interrupt, DiskDrivewr, Reboot-Programm usw.). Ebenso ausführlich wird di e externe Speicherorgan isation geschildert (Spuren , Sektoren, Blocks, DirectoryStruktur, Volume Bit Map, Datastrukturen usw.). Schließlich wird das MLI (Machine Language Interface) mit zahlreichen praktischen Anwendungsbeispielen erläutert. Insgesamt enthält ProDOS-Buch ca. 70 Seiten mit eigens für dieses Werk entwickelten Programmen. Im zweiten Teil werden die Basic-System-Befehle für Applesoft-Programmierer systematisch erläutert. Allerdings wird die Kenntn is von "Apple DOS 3.3" vorausgesetzt. .. ProDOS für Aufsteiger" ist deshalb nicht nur für Assemblersondern auch für fortgeschrittene Appelsoft-Programmi erer ein unentbehrliches Nachschlage-und Handbuch für die Programmierpraxis.
Dr. Alfred Hüthig Verlag Im Weiher 10 6900 Heidelberg 1
,u
.: