forked from mist64/c64ref
-
Notifications
You must be signed in to change notification settings - Fork 0
/
kernal_128intern.txt
565 lines (419 loc) · 26.6 KB
/
kernal_128intern.txt
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
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
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
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
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
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
320
321
322
323
324
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
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
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
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
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
- C64 KERNAL API (Commodore 128 intern)
-
- Schieb, Thrun, Wobel: Commodore 128 intern
- ISBN 3-89011-098-3
-
- Corrections (typos as well as content), translations etc.
- welcome at: https://github.com/mist64/c64ref
-
----------------------------------------------
-
# This plain text file is formatted so that it can be automatically
# parsed in order to create cross-references etc.
# * Lines starting with "-" is top-level information. The first line
# is the title. Lines starting with "--" are separators.
# * Lines starting with "#" are internal comments.
# * Hex addresses start at column 0.
# * Symbols start at column 7.
# * The description starts at column 15.
# * All lines of the description until the first blank line are
# combined into the heading.
# * The remaining text is in MarkDown format.
# The encoding is UTF-8.
$FF81 CINIT Video-Controller und Editor initialisieren
Es werden die Funktionstasten auf Standard
gelegt, beide Video-Controller initialisiert und der 40/80-
Zeichen-Modus in Abhängigkeit der 40/80-Zeichen-Taste
eingeschaltet. Weiterhin werden der Tastaturbuffer gelöscht
sowie alle Flags rückgesetzt und ein CLRCH ausgeführt.
$FF84 IOINIT Initialisierung der Ein/Ausgabegeräte
Die Ein/Ausgabegeräte werden initialisiert, d.h.
die RESET-Leitung auf dem IEC-Bus wird aktiviert. Ange-
schlossene Drucker werden in den Anfangszustand versetzt und
die Floppy löscht ihre Kanäle - hört sich also an, als ob sie
gerade eingeschaltet worden wäre.
$FF87 RAMTAS BASIC-Warmstart
Diese Routine initialisiert die Zeropage, setzt die
Zeiger für SYSTOP und SYSBOT (also die Speicherunter- und -
obergrenze), setzt die Zeiger für die RS-232-Ein/Ausgabebuffer
und den Kassettenbuffer zurück.
$FF8A RESTOR Systemvektoren initialisieren
Es werden die Systemvektoren ab Adresse $0314
bis $0332 (inkl.) auf Normalwert gesetzt. Diese Routine sollte
aufgerufen werden, wenn Sie zu viele Vektoren verbogen und
die Übersicht verloren haben oder wenn Sie beispielsweise ein
Erweiterungspaket ausschalten wollen. Diese Routine ruft die
folgende VECTOR-Routine mit gelöschtem CARRY auf.
$FF8D VECTOR Systemvektoren kopieren oder rücksetzen
Diese Routine kopiert die 16 Vektoren ab $0314
in den durch das X- (Low) und Y-Register (High) definierten
Speicher, sofern das CARRY-Flag gesetzt ist. Bei gelöschtem
CARRY-Flag werden die Vektoren ab $0314 mit dem durch das
X- und Y-Register angegebenen Bereich geladen.
**Eingabeparameter**: .X, .Y, CARRY
**Beispiel**:
LDX #$00 ;Lo-Byte von $1000
LDY #$10 ;Hi-Byte von $1000
CLC ;Lösche Carry zum Kopieren ($1000)->($0314)
JSR $FF80 ;Belege Vektoren neu
$FF90 SETMSG DOS-Meldungen ermöglichen/verhindern
Die Routine speichert den Wert des <Akku> in
der Zeropage-Adresse $9D. Sollen Systemmeldungen ausgegeben
werden, so ist das Bit 7 des <Akkus> zu setzen. Ist $9D positiv,
so werden Systemmeldungen verhindert.
**Eingabeparameter**: .A
$FF93 SECND Sekundäradresse nach LISTEN senden
Es wird die zu sendende Sekundäradresse im
<Akku> übergeben. Die Routine gibt den <Akku> dann als
Sekundäradresse auf dem IEC-Bus aus.
**Eingabeparameter**: .A
**Beispiel**:
;LISTEN wurde gesendet
LDA #$F0 ;Sekadr. 0 bei CLOSE
JSR $FF93 ;Sekundaradresse senden
$FF96 TKSA Sekundäradresse nach TALK senden
Adäquat zu der vorhergehenden Routine sendet
diese Routine die Sekundäradresse - übergeben im <Akku> -
nach erfolgtem TALK-Signal an den IEC-Bus.
**Eingabeparameter**: .A
$FF99 MEMTOP Setzen/Holen der Speicherobergrenze
Ist das CARRY-Flag gesetzt, so wird im X-
Register (Lo) und Y-Register (Hi) die maximal verfügbare
Speicherstelle übergeben. Wird die Routine mit gelöschtem
CARRY angesprungen, so wird die Speicherobergrenze mit den
beiden Registern belegt.
**Eingabeparameter**: .X, .Y (bei gelöschtem CARRY), CARRY
**Ausgabeparameter**: .X, .Y (bei gesetztem CARRY)
**Beispiel**:
;Auslesen der Speicherobergrenze
SEC ;Auslesen der Obergrenze
JSR $FF99 ;Hole Obergrenze
STX $FC ;zwischenspeichern
STY $FD ;zwischenspeichern
LDX #$00 ;Lo-Byte von $1000
LDY #$10 ;Hi-Byte von $1000
CLC ;Flag zum Setzen des MEMTOP
JSR $FF99 ;Setze Speicherobergrenze
$FF9C MEMBOT Setzen/Holen der Speicheruntergrenze
Genauso wie bei der Routine MEMTOP wird bei
gelöschtem CARRY-Flag die Untergrenze des verfügbaren
Speichers mit den beiden Registern X ^Lo) und Y (Hi) belegt.
Ist das CARRY-Flag gesetzt, so wird die Speicheruntergrenze
ausgelesen und in den beiden Registern übergeben.
**Eingabeparameter**: .X, .Y (bei gelöschtem CARRY), CARRY
**Ausgabeparameter**: .X, .Y (bei gesetztem CARRY)
$FF9F KEY Ermitteln gedrückter Tasten
Diese Routine ist elementar zur Tastatur-
dekodierung. Die Tastatur wird auf eine gedrückte Taste anhand
der Tastaturdekodiertabellen überprüft. Wird eine gedrückte
Taste ermittelt, so wird der ASCII-Wert errechnet und dieser
dem Tastaturbuffer (ab $034A) hinzugefügt.
$FFA2 SETTMO Setzen des Timeout-Flags für IEEE
Die Routine speichert den im <Akku> überge-
benen Wert als Timeout-Flag für die IEEE-Routinen an Adresse
$0A0E. Um den Timeout in den IEEE-Routinen zu
ermöglichen, muß das Bit 7 des <Akkus> gesetzt sein.
**Eingabeparameter**: .A
$FFA5 ACPTR Holt ein Byte vom seriellen Bus
Die Routine holt ein Byte vom seriellen IEC-Bus.
Das geholte Zeichen wird im Akku übergeben. Das Statusbyte
ST an $90 wird entsprechend der Aktion gesetzt.
**Ausgabeparameter**: .A
$FFA8 CIOUT Ausgabe eines Zeichens auf IEC-Bus
Diese Routine ist das Gegenstück zu ACPTR. Das
im <Akku> übergebene Zeichen wird auf dem lEC-Bus ausge-
geben. Auch hier wird das Statusbyte ST an $90 entsprechend
der Aktion geändert.
**Eingabeparameter**: .A
$FFAB UNTLK UNTALK auf lEC-Bus senden
Diese Routine wird beim Schließen bzw. Umlegen
eines Eingabekanals aufgerufen. Sie bringt das zum Reden
(TALK) gebrachte Gerät zum Schweigen.
$FFAE UNLSN UNLISTEN auf IEC-Bus senden
Entsprechend zu UNTALK wird bei dieser
Routine ein empfangendes Gerät vorerst abgeschaltet. Dies wird
beim Schließen oder Umlegen eines Ausgabekanals gemacht.
$FFB1 LISTN Senden von LISTEN an ein Gerät
Es wird ein am IEC-Bus angeschlossenes Gerät
zum Empfang aufgefordert. Dazu wird das Signal LISTEN über
den IEC-Bus geschickt. Im <Akku> wird die Geräteadresse des
anzusprechenden Gerätes übergeben. Beispielsweise wird bei
einem Drucker ein LISTEN gesendet, bevor die Zeichen zur
Ausgabe über den IEC-Bus wandern. Wenn Sie LISTEN ver-
wenden, so müssen Sie die auszugebenden Zeichen über die
Routine CIOUT ausgeben (nicht über BSOUTÜ). Zum Schließen
des Kanals verwenden Sie dann die Routine UNLISTEN. Es
kann immer nur ein Gerät am IEC-Bus aktiv sein. Um diese
komplizierten Arbeiten zu vereinfachen, können Sie im
Betriebssystem Kanäle öffnen und schließen. BSOUT und
BASIN übernehmen dann das Senden von LISTEN und
UNLISTEN sowie TALK und UNTALK.
**Eingabeparameter**: .A
**Beispiel**:
;LISTEN an Drucker senden
LDA #$24 ;Geräteadresse Drucker & LISTEN ein
JSR $FFB1
$FFB4 TALK Senden von TALK an ein Gerät
Entsprechend der Routine LISTN sendet diese
Routine das Kommando TALK an ein beliebiges Gerät. Die
Geräteadresse ist im <Akku> zu übergeben. Das Kommando
TALK fordert ein am IEC-Bus angeschlossenes Gerät zum
Reden, also zum Senden von Informationen auf.
**Eingabeparameter**: .A
$FFB7 READST Holen des I/O-Statusbytes
Es wird der aktuelle Systemstatus im <Akku>
zurückgegeben. Ist die RS232 aktiv, so wird das Statusbyte
übergeben und direkt im Speicher gelöscht. Sollten Sie also das
Statusbyte öfters benötigen, so speichern Sie es zwischen. Ist ein
anderer als der RS232-Kanal geöffnet, so wird das Statusbyte
von Adresse $90 übergeben.
**Ausgabeparameter**: .A
$FFBA SETLFS Fileparameter setzen
Diese Routine wird überall dort benötigt, wo man
Files öffnen muß. Man übergibt die logische File-nummer im
<Akku>, die Geräteadresse im X-Register und die Sekun-
däradresse im Y-Register. Die Routine speichert diese Werte an
den Zeropage-Adressen $B8 bis $BA ab.
**Eingabeparameter**: .A, .X, .Y
$FFBD SETNAM Setzen der Filenamenparameter
In der Routine werden die Informationen für den
Filenamen in der Zeropage gespeichert. Diese Angaben sind alle
vor dem Öffnen eines Kanales zu machen. Im <Akku> wird die
Länge des Filenamens übergeben, im X-Register das Lo-Byte
der Adresse und im Y-Register das Hi-Byte der Adresse, an der
der Filename gespeichert ist. Ferner müssen Sie mit der
SETBNK-Routine die Konfigurationsindizes für den Filenamen
und den zu bearbeitenden Speicherbereich übergeben.
**Eingabeparameter**: .A, .X, .Y
**Beispiel**:
;Eröffnen eines des Directory-Files auf Diskette
LDA #$0C ;Bereich im RAM-Bank 0
TAX ;Filename auch in RAM-Bank 0
JSR $FF68 ;SETBNK aufrufen
LDA #$01 ;Logische Filenummer
LDX #$08 ;Geräteadresse
LDY #$00 ;Sekundäradresse für Lesen
JSR $FFBA ;SETLFS
LDA #$01 ;Länge des Filenamens
LDX #$00 ;Lo-Byte der Adresse, an der der
LDY #$10 ;Filename gespeichert ist ($1000)
JSR $FFBD ;SETNAM
JSR $FFC0 ;OPEN - Öffnen des Kanals
und an Adresse $1000:
01000 24 ....
$FFC0 OPEN Öffnen einer Datei
Es wird die durch die Routinen SETNAM,
SETLFS und SETBNK definierte Datei in die Liste der
logischen Filenummern aufgenommen. Erst ab diesem Augen-
blick können die logischen Filenummern bei den Routinen
CKOUT und CHKIN angegeben werden. Beachten Sie, daß Sie
maximal neun Files auf einmal öffnen können.
$FFC3 CLOSE Schließen einer logischen Datei
Es wird die im <Akku> übergebene logische Datei
geschlossen. Dabei werden alle gespeicherten Werte wie
Geräteadresse, Sekundäradresse etc. in der dafür vorgesehenen
Tabelle gelöscht. Ist die Aktion nicht problemlos verlaufen, so
wird das CARRY-Flag gesetzt.
**Eingabeparameter**: .A
**Ausgabeparameter**: CARRY
**Beispiel**:
;Beispiel für CLOSE
LDA #$01 ;Schließen der Beispieldatei von SETNAM
JSR $FFC3 ;CLOSE ausführen
BCS Error ;Fehler aufgetreten
$FFC6 CHKIN Logische Datei als Eingabekanal definieren
Im X-Register wird die logische Dateinummer
übergeben, die als Eingabekanal benutzt werden soll. Die ange-
gebene logische Dateinummer muß natürlich bereits mit dem
OPEN-Kommando geöffnet worden sein. Wird nach dem Aufruf
des CHKIN-Kommandos die BASIN-Routine aufgerufen, so
erfolgt die Eingabe nicht von Tastatur, sondern von dem
geöffneten Gerät; dies kann beispielsweise die Floppy sein. Zu
beachten ist, daß zum Einlesen von Tastatur kein CHKIN not-
wendig ist, da die Tastatur Standard-Eingabegerät ist. Nach
einem CLOSE oder CLRCH ist die Tastatur automatisch wieder
das Eingabegerät. Auch bei dieser Routine wird das CARRY als
OK-Flag benutzt.
**Eingabeparameter**: .X
**Ausgabeparameter**: CARRY
**Beispiel**:
;Einlesen der Directory
JSR DIROP ;OPEN 1,8,0,"$" (selbstdefinierte Routine)
LDX #$01 ;LFN der eröffneten Datei
JSR $FFC6 ;CHKIN ausführen
JSR $FFCF ;BASIN - Zeichen holen
$FFC9 CKOUT Logische Datei als Ausgabedatei definieren
Entsprechend zu CHKIN definiert diese Routine
ein im X-Register zu übergebene Datei als Ausgabedatei. Die
Datei muß ordnungsgemäß geöffnet worden sein, beispielsweise
würde eine Datei, die mit OPEN 1,8,0,"$" geöffnet wurde und
mit CKOUT als Ausgabedatei definiert werden soll, einen
Fehler hervorrufen, weil diese Datei zum Lesen und nicht zum
Schreiben geöffnet wurde. Nach Definition einer Ausgabedatei
ist nicht mehr der Bildschirm, sondern die definierte Datei
Ausgabegerät. Alle über BSOUT auzugebenen Zeichen werden
an dieses Gerät gesandt. Das CARRY-Flag dient als Fehlermel-
der. Ist es gelöscht, war die Aktion erfolgreich.
**Eingabeparameter**: .X
**Ausgabeparameter**: CARRY
$FFCC CLRCH Ein/Ausgabekanäle schließen
Diese Routine löscht evtl, mit CHKIN und/oder
CKOUT definierte Ein- und Ausgabedateien. Es wird an das
Eingabegerät ein UNTALK und an das Ausgabegerät ein
UNLISTEN gesendet. Der Bildschirm ist wieder Ausgabe - und
die Tastatur Eingabegerät. Die Dateien werden nicht geschlossen,
es erfolgt also kein CLOSE. Es werden weder Ein- noch
Ausgabeparameter übergeben.
$FFCF BASIN Ein Zeichen von Eingabekanal holen
Die eröffnete und mit CHKIN als Eingabedatei
definierte Datei (sonst Tastatur) übergibt ein Zeichen im
<Akku>.
**Ausgabeparameter**: .A
$FFD2 BSOUT Ein Zeichen auf Ausgabekanal ausgeben
Es wird das im <Akku> übergebene Zeichen auf
die eröffnete und mit CKOUT als Ausgabedatei definierte Datei
ausgegeben. Ist der Bildschirm Ausgabedatei (Default), so wird
das ASCII-Zeichen in den darzustellenden POKE-Code
umgerechnet (ein recht aufwendiges Verfahren. Interessierte
sollten sich den entsprechenden Teil im Kernal im C-Bereich
ansehen).
**Eingabeparameter**: .A
**Beispiel**:
;Wechseln des 40/80-Zeichen-Modus
LDA #$1B ;<ESC>
JSR BSOUT ;$FFD2, Zeichen ausgeben
LDA #"X" ;<ESC>-X zum Uechseln des Bildschirmstatus
JSR BSOUT ;ausgeben
(Es gibt allerdings eine spezielle Routine, die man anspringen
kann)
$FFD5 LOADSP Laden einer Datei in den Speicher
Bevor mit LOADSP eine Datei geladen werden
kann, muß das Gerät, die Sekundäradresse, der Filename etc.
durch die Routinen SETLFS, SETNAM und SETBNK definiert
worden sein. Im X- (Lo) und Y-Register (Hi) wird die Adresse
angegeben, ab der die zu ladende Datei abgelegt werden soll.
**Eingabeparameter**: .X, .Y
**Beispiel**:
;Laden eines Overlay o.ä.
JSR PREP ;SETLFS, SETBNK, SETNAM etc.
LDX #$00 ;Lo-Byte von $1000
LDY #$10 ;Hi-Byte von $1000 (Ladeadresse)
JSR $FFD5 ;Lade Datei ab $1000
$FFD8 SAVESP Abspeichern eines Bereiches auf Datei
Diese Routine speichert einen Speicherbereich auf
eine Datei (Diskette, Kassette) ab. Dazu muß man, wie bei der
LOADSP-Routine, zunächst Geräteadresse, Sekundäradresse,
RAM-Bank, Filename etc. durch die Routinen SETBNK,
SETLFS und SETNAM definieren. Im Akku wird die Zeropage-
Adresse angegeben, an der die Anfangsadresse des abzu-
speichernden Bereiches steht. Im X- (Lo) und Y-Register (Hi)
wird entsprechend die Endadresse des abzuspeichernden
Bereiches angegeben.
**Eingabeparameter**: .A, .X, .Y, Zeropage
**Beispiel**:
;Abspeichern des Bereiches $1000 bis $1100
JSR PREP ;SETLFS, SETNAM, SETBNK etc. aufrufen
LDA #$00 ;Lo-Byte von $1000
STA $FC ;in Zeropage speichern
LDA #$10 ;Hi-Byte von $1000
STA $FD ;in Zeropage speichern
LDA #$FC ;der Pointer befindet sich an $FC
LDX #$00 ;Lo-Byte der Endadresse $1100
LDY #$11 ;Hi-Byte der Endadresse $1100
JSR $FFD8 ;SAVESP - Speichern des Bereiches $1000-$1100
$FFDB SETTIM Setzen der Systemuhr TI
Die Routine setzt die Systemuhr TI, die ab
Adresse $A0 definiert ist. Diese Uhr wird von der Kernal-IRQ-
Routine gesteuert und ist nicht sehr genau. Legen Sie auf eine
genauere Uhr Wert, so benutzen Sie die Timer in den beiden
CIAs. (Siehe auch entsprechendes Kapitel) Das höchstwertige
Byte der 24-Stunden-Uhr wird im Y-Register übergeben.
**Eingabeparameter**: .A, .X, .Y
**Beispiel**:
;Rücksetzen der Systemuhr
LDA #$00 ;Rücksetzen bedeutet
TAY ;auf 0,0,0 setzen
TAX ;Alle drei Register auf null
JSR $FFDB ;SETTIM
$FFDE RDTIM Auslesen der Systemuhr
Diese Routine liest die 24-Stunden-Uhr aus und
übergibt die drei Bytes den Registern Y (höchstwertig), X und
<Akku> (niederwertig).
**Ausgabeparameter**: .A, .X, .Y
**Beispiel**:
;Auslesen der 24-Stunden-Uhr
JSR $FFDE ;RDTIM aufrufen
STY $FC ;MSB merken
STX $FD ;mittleres Byte merken
STA $FE ;LSB merken
$FFE1 STOP Abfrage der Stop-Taste
Wenn bis zum letzten IRQ-Aufruf die Stop-Taste
betätigt worden ist, so wird das ZERO-Flag gesetzt und es wird
ein CLRCH ausgeführt. Wurde die Stop-Taste nicht betätigt, so
wird das ZERO-Flag gelöscht.
**Ausgabeparameter**: ZERO-Flag
**Beispiel**:
;Auf STOP prüfen
JSR $FFE1 ;STOP-Taste gedrückt?
BEQ Jawoll ;Ist gedrückt
$FFE4 GETIN Holt ein Zeichen aus Tastaturbuffer oder RS232
Holt von der definierten Eingabedatei ein
Zeichen. Ist kein Zeichen bereit gestellt, so wird der <Akku>
mit null übergeben.
**Ausgabeparameter**: .A
$FFE7 CLALL Alle offenen Dateien schließen
Alle mittels OPEN eröffneten Dateien werden
geschlossen oder besser gelöscht - es wird nämlich kein CLOSE
ausgeführt. Beispielsweise bei offenen Floppy-Dateien kann dies
sehr ärgerlich sein (WRITE FILE OPEN ERROR ist eine
Konsequenz). Ferner wird nach dem Löschen der logischen
Dateien ein CLRCH (s.o.) ausgeführt. CLALL ist also mit Vor-
sicht anzuwenden.
$FFEA LIDTIM Systemuhr anpassen (updaten)
Diese Routine wird vornehmlich von der IRQ-
Routine aufgerufen. Es wird die Drei-Byte-24-Stunden-Uhr um
eine Einheit hochgezählt.
$FFED SCRORG Größe des aktuellen Fensters holen
Die Routine SCRORG holt die aktuellen
Fensterwerte in die Register. Der <Akku> enthält nach dem
Aufruf die maximale Spaltenzahl, im Y-Register befindet sich
die Anzahl der Zeilen im Fenster und im X-Register die Anzahl
der Spalten des Fensters.
**Ausgabeparameter**: .A, .X, .Y
$FFF0 PLOT Cursor-Position holen/setzen
Je nach Zustand des CARRY-Flags wird entweder
die Cursorposition geholt oder gesetzt. X- und Y-Register sind
auf jeden Fall die Kommunikationsregister. Das Y-Register
definiert die Zeile (Erste Zeile im Fenster ist null) und das X-
Register die Spalte des Cursors. Ist das CARRY-Flag gesetzt, so
wird die aktuelle Cursorpostion im Fenster in X- und Y-
Register zurückgegeben.
**Eingabeparameter**: .X, .Y, CARRY
**Beispiel**:
;Einen Stern (*) in die Fenstermitte setzen
JSR $FFED ;SCRORG aufrufen
TXA ;Spaltenzahl nach <Akku>
LSR A ;Divisiondurch zwei (Mitte)
TAX ;und als Spalte wieder nach X
TYA ;Zeilenzahl nach <Akku>
LSR A ;Divisiondurch zwei (Mitte)
TAY ;und wieder als Zeile nach Y
CLC ;Gelöschtes Carry=Setzen Cursorposition
JSR $FFF0 ;Setze Cursorposition
LDA #"*" ;<Akku> mit Stern laden
JSR $FFD2 ;und ausgeben.
$FFF3 IOBASE Holt die Basisadresse des I/O-Bereiches
Es wird die Adresse des Ein- und Ausgabebe-
reiches in X- (Lo) und Y-Register (Hi) übergeben. Diese
Adresse ist beim C128 natürlich immer $D000. Für spätere
Erweiterungen bzw. Verschiebungen ist es aus Kompatibilitäts-
gründen ratsam, diese Routine in die Software mit zu integrieren
und sich darauf zu beziehen.
**Ausgabeparameter**: .X, .Y
**Beispiel**:
;Anfang des Programmes:
JSR $FFF3 ;IOBASE
STX $FD ;Lo-Byte merken
STY $FE ;Hi-Byte merken
Im Programm bezieht man diese Adresse dann wie folgt ein:
STA ($FD),Y ;In I/O-Bereich