|
Das nun folgende Basic-Programm und die RSX-Erweiterung bilden zusammen einen vollwertigen Amsdos: Disketten-MonitorDisketten-Monitor, mit dem man Sektoren lesen, ändern und wieder auf Diskette schreiben kann.
Das Programm enthält einige Grundlagen: UnterprogrammeUnterprogramme, die sicher auch für andere Anwendungen ganz interessant sind. Es wurde deshalb mit Programmiertechnik: KommentareKommentaren nicht gegeizt.
Das Programm ist so gestaltet, dass automatisch das eingelegte Diskettenformat erkannt wird. Man braucht also den Sektornummern-Offset, mit dem der Format-Typ gekennzeichnet wird, nicht mitanzugeben.
Außerdem besteht die Möglichkeit, zu einer Blocknummer (aus dem Inhaltsverzeichnis) sich Spur- und Sektor-Nummern der beiden betroffenen Sektoren ausrechnen zu lassen, wozu die beiden Functions in Zeile 1340/1350 dienen. Man kann sich aber auch mit Hilfe der Cursortasten sektor- oder spurweise durch die Diskette tasten.
Sektor-Inhalte können direkt auf dem Bildschirm geändert werden, wobei man hier volle 'Cursor-Freiheit' hat. Die Änderungen werden natürlich zuerst nur im Puffer im RAM des Rechners vorgenommen, und müssen zum Schluss mit der Sektor-Schreib-Option auf die Diskette zurückgeschrieben werden. Das ist aber auch gut so, weil man so immer noch die Möglichkeit zu einem Rückzieher hat.
Und vor Allem gilt: Wenn nicht ganz gewichtige Gründe dagegen sprechen: Immer nur mit einer Kopie arbeiten. Die Gefahr, dass man einen Sektor 'versaut' ist einfach zu groß!
; Sektor-Read und -Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: RD und WR - read und write Erklärung zu den Anschluss-Bezeichnungen: WR - WriteWrite Erklärung zu den Anschlüssen: Vcc und Vss Erklärung zu den Anschluss-Bezeichnungen: Vcc und Vssvs. 27.5.86 (c) G.Woigk
; ---------------------- ----------- -----------
;
; Kommandos: |Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: RD und WR - read und write Erklärung zu den Anschluss-Bezeichnungen: RD - ReadREAD, drive,track,sektor,pufferadresse
; |Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: RD und WR - read und write Erklärung zu den Anschluss-Bezeichnungen: WR - WriteWRITE,drive,track,sektor,pufferadresse
; |MESSAGE [,0] --> Meldungen ein,[aus]
;
; Bei der Sektor-Nummer muss der Format-kennzeichnende Offset mit angegeben
; werden.
;
ORG 40000
;
KLFIND: EQU #BCD4 ; MAIN FIRMWARE JUMPBLOCK: KERNEL Die Firmware des Schneider CPC: KERNELKL FIND Befehls-Elemente: CommandsCOMMAND
INTRO: EQU #BCD1 ; KERNEL: BCD1: KL LOG EXTKL LOG EXT
;
INIT: LD HL,SPACE ; RSX-Befehle einbinden.
LD BC,TABEL
Maschinencode über HIMEM: CALLCALL INTRO
;
LD HL,RDPUF ; FAR ADDRESS für &84 Low Level Disc Driving: &84 Read SektorRead Sektor bestimmen.
Maschinencode über HIMEM: CALLCALL FIND
LD HL,WRPUF ; FAR ADDRESS für &85 Low Level Disc Driving: &85 Write SektorWrite Sektor bestimmen.
Maschinencode über HIMEM: CALLCALL FIND
LD HL,MESPUF ; FAR ADDRESS für &81 Low Level Disc Driving: &81 Message on/offMessage ON/OFF bestimmen.
;
FIND: PUSH HL ; MAIN FIRMWARE JUMPBLOCK: KERNEL Die Firmware des Schneider CPC: KERNELKL FIND Befehls-Elemente: CommandsCOMMAND aufrufen um in Adresse & Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROM
Maschinencode über HIMEM: CALLCALL KLFIND ; in HL und C zu erhalten.
POP IX
RET NC ; Aber nichts eintragen, falls nicht gefunden.
LD (IX+1),L
LD (IX+2),H ; FAR ADDRESS basteln.
LD (IX+3),C
RETURN: RET ; fertig.
;
RDPUF: DEFB #84 ; Name: Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: RD und WR - read und write Erklärung zu den Anschluss-Bezeichnungen: RD - ReadREAD TRACK
RDFAR: DEFW RETURN ; FAR ADDRESS: Dummy zeigt auf ein Return.
DEFB 0 ; ROM-Konfiguration: ROM-Status Anschluss eines Zusatz-ROM: ROM-StatusROM-Status.
;
WRPUF: DEFB #85 ; Name: Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: RD und WR - read und write Erklärung zu den Anschluss-Bezeichnungen: WR - WriteWRITE TRACK
WRFAR: DEFW RETURN
DEFB 0
;
MESPUF: DEFB #81 ; Name: Low Level Disc Driving: &81 Message on/offMessage ON/OFF
MESFAR: DEFW RETURN
DEFB 0
;
SPACE: DEFS 4 ; Platz für verkettete Trees: ListenListe der RSX-Kommandos.
;
TABEL: DEFW BCD1: KL LOG EXT: 2. Namenstabelle (NAMTAB)NAMTAB ; Zeiger -> Namenstabelle
JP Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: RD und WR - read und write Erklärung zu den Anschluss-Bezeichnungen: RD - ReadREAD ; Vektor -> Routine Low Level Disc Driving: &84 Read SektorRead Sektor.
JP Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: RD und WR - read und write Erklärung zu den Anschluss-Bezeichnungen: WR - WriteWRITE ; Vektor -> Routine Low Level Disc Driving: &85 Write SektorWrite Sektor.
JP MESS ; Vektor -> Message-Routine.
;
BCD1: KL LOG EXT: 2. Namenstabelle (NAMTAB)NAMTAB: DEFB "R","LOW KERNEL JUMPBLOCK: 000E: LOW PCBC INSTRUCTION LOW KERNEL JUMPBLOCK: 001E: LOW PCHL INSTRUCTIONE","Operationen: BD5B / 349A / 349A: FLO SUBA","D"+#80
DEFB "W","R","I","T","LOW KERNEL JUMPBLOCK: 000E: LOW PCBC INSTRUCTION LOW KERNEL JUMPBLOCK: 001E: LOW PCHL INSTRUCTIONE"+#80
DEFB "M","LOW KERNEL JUMPBLOCK: 000E: LOW PCBC INSTRUCTION LOW KERNEL JUMPBLOCK: 001E: LOW PCHL INSTRUCTIONE","S","S","Operationen: BD5B / 349A / 349A: FLO SUBA","G","LOW KERNEL JUMPBLOCK: 000E: LOW PCBC INSTRUCTION LOW KERNEL JUMPBLOCK: 001E: LOW PCHL INSTRUCTIONE"+#80
DEFB 0
;
; --------------------------
;
MESS: DEC Operationen: BD5B / 349A / 349A: FLO SUBA ; |MESSAGE --> Meldungen EIN
CPL ; |MESSAGE,0 --> Meldungen AUS
Speicheraufteilung durch ein Vordergrund-Programm: RST 3 LOW KERNEL JUMPBLOCK: 0000 - RST 0: LOW RESET ENTRY LOW KERNEL JUMPBLOCK: 0008 - RST 1: LOW LOW JUMP LOW KERNEL JUMPBLOCK: 0010 - RST 2: LOW SIDE CALL LOW KERNEL JUMPBLOCK: 0018 - RST 3: LOW FAR CALL LOW KERNEL JUMPBLOCK: 0020 - RST 4: LOW RAM LAM LOW KERNEL JUMPBLOCK: 0028 - RST 5: LOW FIRM JUMP LOW KERNEL JUMPBLOCK: 0030 - RST 6: LOW USER RESTART LOW KERNEL JUMPBLOCK: 0038 - RST 7: LOW INTERRUPT ENTRYRST 3*8
DEFW MESFAR
RET
;
Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: RD und WR - read und write Erklärung zu den Anschluss-Bezeichnungen: RD - ReadREAD: LD HL,RDFAR ; Lade Zeiger auf FAR ADDRESS für Low Level Disc Driving: &84 Read SektorRead Sektor.
JR P1 ; und sonst identisch mit Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: RD und WR - read und write Erklärung zu den Anschluss-Bezeichnungen: WR - WriteWRITE.
;
Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: RD und WR - read und write Erklärung zu den Anschluss-Bezeichnungen: WR - WriteWRITE: LD HL,WRFAR ; Lade Zeiger auf FAR ADDRESS für Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: RD und WR - read und write Erklärung zu den Anschluss-Bezeichnungen: WR - WriteWrite Sector.
P1: LD (FARPTR),HL ; Zeiger auf FAR ADDRESS nach Speicheraufteilung durch ein Vordergrund-Programm: RST 3 LOW KERNEL JUMPBLOCK: 0000 - RST 0: LOW RESET ENTRY LOW KERNEL JUMPBLOCK: 0008 - RST 1: LOW LOW JUMP LOW KERNEL JUMPBLOCK: 0010 - RST 2: LOW SIDE CALL LOW KERNEL JUMPBLOCK: 0018 - RST 3: LOW FAR CALL LOW KERNEL JUMPBLOCK: 0020 - RST 4: LOW RAM LAM LOW KERNEL JUMPBLOCK: 0028 - RST 5: LOW FIRM JUMP LOW KERNEL JUMPBLOCK: 0030 - RST 6: LOW USER RESTART LOW KERNEL JUMPBLOCK: 0038 - RST 7: LOW INTERRUPT ENTRYRST 3 eintragen.
;
CP 4 ; Prüfe Anzahl der Basic und Maschinencode: ParameterParameter:
RET NZ ; Zurück, wenn nicht 4.
;
LD Operationen: BD5B / 349A / 349A: FLO SUBA,255 ; Diskettenmeldungen abschalten.
Speicheraufteilung durch ein Vordergrund-Programm: RST 3 LOW KERNEL JUMPBLOCK: 0000 - RST 0: LOW RESET ENTRY LOW KERNEL JUMPBLOCK: 0008 - RST 1: LOW LOW JUMP LOW KERNEL JUMPBLOCK: 0010 - RST 2: LOW SIDE CALL LOW KERNEL JUMPBLOCK: 0018 - RST 3: LOW FAR CALL LOW KERNEL JUMPBLOCK: 0020 - RST 4: LOW RAM LAM LOW KERNEL JUMPBLOCK: 0028 - RST 5: LOW FIRM JUMP LOW KERNEL JUMPBLOCK: 0030 - RST 6: LOW USER RESTART LOW KERNEL JUMPBLOCK: 0038 - RST 7: LOW INTERRUPT ENTRYRST 3*8
DEFW MESFAR
;
LD L,(IX+0) ; *** Basic und Maschinencode: ParameterParameter bestimmen: ***
LD H,(IX+1) ; HL = 4. Par. = Adresse des I/O-Puffers.
LD C,(IX+2) ; C = 3. Par. = Das Identifikationsfeld in jedem Sektor: 3. SektornummerSektornummer.
LD D,(IX+4) ; D = 2. Par. = Spurnummer.
LD LOW KERNEL JUMPBLOCK: 000E: LOW PCBC INSTRUCTION LOW KERNEL JUMPBLOCK: 001E: LOW PCHL INSTRUCTIONE,(IX+6) ; LOW KERNEL JUMPBLOCK: 000E: LOW PCBC INSTRUCTION LOW KERNEL JUMPBLOCK: 001E: LOW PCHL INSTRUCTIONE = 1. Par. = Laufwerksnummer.
;
Speicheraufteilung durch ein Vordergrund-Programm: RST 3 LOW KERNEL JUMPBLOCK: 0000 - RST 0: LOW RESET ENTRY LOW KERNEL JUMPBLOCK: 0008 - RST 1: LOW LOW JUMP LOW KERNEL JUMPBLOCK: 0010 - RST 2: LOW SIDE CALL LOW KERNEL JUMPBLOCK: 0018 - RST 3: LOW FAR CALL LOW KERNEL JUMPBLOCK: 0020 - RST 4: LOW RAM LAM LOW KERNEL JUMPBLOCK: 0028 - RST 5: LOW FIRM JUMP LOW KERNEL JUMPBLOCK: 0030 - RST 6: LOW USER RESTART LOW KERNEL JUMPBLOCK: 0038 - RST 7: LOW INTERRUPT ENTRYRST 3*8 ; &84 oder &85 aufrufen via FAR Maschinencode über HIMEM: CALLCALL.
FARPTR: DEFW #0000
;
MESSON: XOR Operationen: BD5B / 349A / 349A: FLO SUBA ; Disketten-Meldungen wieder zulassen.
Speicheraufteilung durch ein Vordergrund-Programm: RST 3 LOW KERNEL JUMPBLOCK: 0000 - RST 0: LOW RESET ENTRY LOW KERNEL JUMPBLOCK: 0008 - RST 1: LOW LOW JUMP LOW KERNEL JUMPBLOCK: 0010 - RST 2: LOW SIDE CALL LOW KERNEL JUMPBLOCK: 0018 - RST 3: LOW FAR CALL LOW KERNEL JUMPBLOCK: 0020 - RST 4: LOW RAM LAM LOW KERNEL JUMPBLOCK: 0028 - RST 5: LOW FIRM JUMP LOW KERNEL JUMPBLOCK: 0030 - RST 6: LOW USER RESTART LOW KERNEL JUMPBLOCK: 0038 - RST 7: LOW INTERRUPT ENTRYRST 3*8
DEFW MESFAR
;
RET ; und fertig.
1000 DEFINT a-z:GOTO 2550
1001 '
1010 ' +-----------------------------------------------------------------------+
1020 ' | Amsdos: Disketten-MonitorDisketten-Monitor Erklärung zu den Anschlüssen: Vcc und Vss Erklärung zu den Anschluss-Bezeichnungen: Vcc und Vssvs. 27.5.86 (c) G.Woigk |
1030 ' | ----------------- ----------- ----------- |
1040 ' | |
1050 ' | **** Achtung: Möglichst immer mit einer Sicherheitskopie **** |
1060 ' | **** der bearbeiteten Diskette arbeiten! **** |
1070 ' +-----------------------------------------------------------------------+
1071 '
1080 ' +------------------------------+----------------------------------------+
1090 ' | Amsdos: Auswertung der Result-PhaseAuswertung der Result-Phase: | |
1100 ' +------------------------------+ |
1110 ' | Ausgabe: f=0 --> alles o.k. sonst f=Fehlercode |
1120 ' | typ, ftrk und spt bestimmt. |
1130 ' +-----------------------------------------------------------------------+
1131 '
1140 f=(PEEK(&BE4C)AND &08) ' *** Fehlercode wie für DERR produzieren: ***
1150 f=f+(PEEK(&BE4D)AND &37) ' Datenbreite: Bits Port B - Input: &F5xx: Bit 0: Port B - Input: &F5xx: Bit 4: Port B - Input: &F5xx: Bit 5: Port B - Input: &F5xx: Bit 6: Port B - Input: &F5xx: Bit 7: Port C - Output: &F6xx: Bit 4: Port C - Output: &F6xx: Bit 5:Bit 3 aus Statusreg. 0: Drive not Erklärung zu den Bezeichnungen: READY Erklärungen zu den Anschlussbezeichnungen: READYready.
1160 IF f THEN f=f+&40 ' Datenbreite: Bits Port B - Input: &F5xx: Bit 0: Port B - Input: &F5xx: Bit 4: Port B - Input: &F5xx: Bit 5: Port B - Input: &F5xx: Bit 6: Port B - Input: &F5xx: Bit 7: Port C - Output: &F6xx: Bit 4: Port C - Output: &F6xx: Bit 5:Bits 0,1,2,4,5 aus Statusreg. 1 holen.
1170 ' ' Datenbreite: Bits Port B - Input: &F5xx: Bit 0: Port B - Input: &F5xx: Bit 4: Port B - Input: &F5xx: Bit 5: Port B - Input: &F5xx: Bit 6: Port B - Input: &F5xx: Bit 7: Port C - Output: &F6xx: Bit 4: Port C - Output: &F6xx: Bit 5:Bit 6: Amsdos-Fehlercodes: FDC-Fehler:FDC-Fehler falls ein Datenbreite: Bits Port B - Input: &F5xx: Bit 0: Port B - Input: &F5xx: Bit 4: Port B - Input: &F5xx: Bit 5: Port B - Input: &F5xx: Bit 6: Port B - Input: &F5xx: Bit 7: Port C - Output: &F6xx: Bit 4: Port C - Output: &F6xx: Bit 5:Bit gesetzt.
1171 '
1220 ' +------------------------------------------------------------------+----+
1230 ' | Berechnung von Track und Das Identifikationsfeld in jedem Sektor: 3. SektornummerSektornummer der Sektoren eines Die Speicherkonfiguration im Schneider CPC: BlockBlocks: | |
1240 ' +------------------------------------------------------------------+ |
1250 ' |Eingabe: Die Speicherkonfiguration im Schneider CPC: Blockblock = Blocknummer, Result-Phase-Bytes des Die Abteilungen des Betriebssystems: AmsdosAmsdos |
1260 ' |Ausgabe: unterer Sektor: trk0, sek0 = Track und Sektor |
1270 ' | oberer Sektor: trk1, sek1 = Track und Sektor |
1280 ' | typ, ftrk und spt. |
1290 ' +-----------------------------------------------------------------------+
1300 '
1340 DEF FNt(LOW KERNEL JUMPBLOCK: 000B: LOW KL LOW PCHL LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPTb)=ftrk+ LOW KERNEL JUMPBLOCK: 000B: LOW KL LOW PCHL LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPTb \ spt ' Formel: Track aus 512-Byte-Blocknummer.
1350 DEF FNs(LOW KERNEL JUMPBLOCK: 000B: LOW KL LOW PCHL LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPTb)=1 + LOW KERNEL JUMPBLOCK: 000B: LOW KL LOW PCHL LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPTb Die Kodierung der Tintennummern in den Bildschirm-Bytes: Mode 2: Die Kodierung der Tintennummern in den Bildschirm-Bytes: Mode 1: Die Kodierung der Tintennummern in den Bildschirm-Bytes: Mode 0:MOD spt ' Formel: Sektor aus 512-Byte-Blocknummer.
1330 '
1180 typ=PEEK(&BE51)AND &Der Zeichensatz des Schneider CPC: &C0 = 192C0 ' Sektornummern-Offset (Format-Typ).
1190 spt=9+(typ=&0):sek=MIN(sek,spt) ' Sektoren pro Track.
1191 ftrk = ((typ+&40)AND &FF)\&40 ' Nummer der ersten freien Spur.
1360 '
1370 trk0 = FNt(Die Speicherkonfiguration im Schneider CPC: Blockblock*2) : sek0 = FNs(Die Speicherkonfiguration im Schneider CPC: Blockblock*2)
1390 trk1 = FNt(Die Speicherkonfiguration im Schneider CPC: Blockblock*2+1) : sek1 = FNs(Die Speicherkonfiguration im Schneider CPC: Blockblock*2+1)
1400 '
1410 RETURN
1420 '
1430 ' +------------------------+----------------------------------------------+
1440 ' | Loggin einer Diskette. | |
1450 ' +------------------------+ |
1460 ' | Eingabe: d$ = Laufwerk |
1470 ' | Ausgabe: f=0 -> o.k. / f<>0 -> Der Linien-Algorithmus: Fehler 3Fehler |
1471 ' | typ |
1480 ' +-----------------------------------------------------------------------+
1490
1500 PRINT CHR$(21);:LOCATE 1,1 ' Textausgabe abstellen wegen "bad Befehls-Elemente: Commandscommand"
1505 |MESSAGE,0:|DRIVE,@d$ ' Laufwerk anschmeissen
1510 PRINT CHR$(6);:|MESSAGE
1515 GOSUB 1140 ' Result-Phase auswerte n
1520 IF f=0 THEN RETURN ' --> o.k.
1530 GOSUB 1630 ' Der Linien-Algorithmus: Fehler 3Fehler behandeln
1540 IF f THEN RETURN ' --> cancel
1550 GOTO 1500 ' --> retry
1560 '
1570 ' +----------------------------------+------------------------------------+
1580 ' | Behandlung von Diskettenfehlern: | |
1590 ' +----------------------------------+ |
1600 ' | Ausgabe: f=0 -> retry / f=1 -> cancel |
1610 ' +-----------------------------------------------------------------------+
1615 '
1620 GOSUB 1140:IF f=0 THEN RETURN ' Liegt überhaupt ein Der Linien-Algorithmus: Fehler 3Fehler vor?
1630 CLS#7:PRINT#7,"Laufwerk ";d$;
1640 IF f AND &35 THEN PRINT#7," Lesefehler,";
1650 IF f AND &02 THEN PRINT#7," schreibgeschützt,";
1660 IF f AND &08 THEN PRINT#7," nicht bereit,";
1670 PRINT#7," -- Versuch wiederholen? [J/N]";CHR$(7);
1675 '
1680 i$=UPPER$(INKEY$):IF I$="" THEN 1680
1685 '
1690 IF i$="J" THEN f=0:RETURN
1700 IF i$="N" THEN f=1:RETURN
1710 PRINT#7,CHR$(7);:GOTO 1680
1720 '
1730 ' +------------------------+----------------------------------------------+
1740 ' | Sektor schreiben/lesen | |
1750 ' +------------------------+ |
1760 ' | Eingabe: s=1 -> Schreiben / l=1 -> Lesen |
1770 ' | Ausgabe: f=0 -> o.k. / f>0 -> Der Linien-Algorithmus: Fehler 3Fehler. |
1780 ' +-----------------------------------------------------------------------+
1790 '
1800 CLS#7:IF l=s THEN RETURN
1810 GOSUB 1500:IF f THEN RETURN ' Loggin
1820 IF l THEN PRINT#7,"Sektor lesen: ";
1830 IF s THEN PRINT#7,"Sektor schreiben: ";
1840 PRINT#7,"Laufwerk ";d$;" / Track";trk;"/ Sektor";sek
1850 PRINT#7,"Optionen: Q-Quit / crsr / T-Track / S-Sektor/ ENTER";
1855 '
1860 i$=UPPER$(INKEY$):IF i$="" THEN 1860 ELSE i=ASC(i$)
1865 '
1880 IF i$="Q"THEN RETURN
1890 IF i=240 AND trk<39 THEN trk=trk+1 ' Erklärung zu den verwendeten Bezeichnungen: CursorCursor hoch
1900 IF i=241 AND trk>0 THEN trk=trk-1 ' Erklärung zu den verwendeten Bezeichnungen: CursorCursor runter
1910 IF i=242 THEN sek=sek-1:IF sek=0 THEN trk=trk-1:sek=spt ' Erklärung zu den verwendeten Bezeichnungen: CursorCursor links
1920 IF i=243 THEN sek=sek+1:IF sek>spt THEN trk=trk+1:sek=1 ' Erklärung zu den verwendeten Bezeichnungen: CursorCursor rechts
1930 IF i$="T"THEN INPUT#7," -- Track:",trk
1940 IF i$="S"THEN INPUT#7," -- Sector:",sek
1950 trk=MAX(MIN(trk,39),0) ' 0 ... Track ... 39
1960 sek=MAX(MIN(sek,spt),1) ' 1 ... Sektor ... spt
1970 IF i<>13 THEN 1810
1980 IF l THEN |Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: RD und WR - read und write Erklärung zu den Anschluss-Bezeichnungen: RD - ReadREAD,ASC(d$)-65,trk,sek+typ,puffer
1990 IF s THEN |Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: RD und WR - read und write Erklärung zu den Anschluss-Bezeichnungen: WR - WriteWRITE,ASC(d$)-65,trk,sek+typ,puffer
2000 GOSUB 1140 ' Result Phase
2010 IF f THEN GOSUB 1500:IF f=0 THEN 1980 ' Der Linien-Algorithmus: Fehler 3Fehler -> Loggin & Retry
2020 RETURN
2030 '
2040 ' +-------------------------------------------+
2050 ' | Pufferinhalt auf dem Bildschirm ausgeben. |
2060 ' +-------------------------------------------+
2070 '
2080 LOCATE 1,1:LOCATE#1,1,1:LOCATE#2,1,1:ZONE 3
2090 FOR y=basis TO basis+240 STEP 16
2100 PRINT#2,"&";HEX$(y-puffer,3);" >"
2110 FOR Die verwendeten Abkürzungen bedeuten: x:x=y TO y+15
2120 PRINT HEX$(PEEK(Die verwendeten Abkürzungen bedeuten: x:x),2),
2130 PRINT#1,CHR$(1);CHR$(PEEK(Die verwendeten Abkürzungen bedeuten: x:x)AND &7F);
2140 NEXT:PRINT
2150 NEXT:Die verwendeten Abkürzungen bedeuten: x:x=0:y=0
2160 RETURN
2170 '
2180 ' +----------------------+------------------------------------------------+
2190 ' | Pufferinhalt ändern | |
2200 ' +----------------------+ |
2205 ' | Eingabe: basis = Startadresse des dargestellten Bereiches. |
2210 ' +-----------------------------------------------------------------------+
2220 '
2230 LOCATE Die verwendeten Abkürzungen bedeuten: x:x+1,y+1:Maschinencode über HIMEM: CALLCALL &TEXT VDU: BB81: TXT CUR ONBB81 ' Cursorklecks darstellen.
2235 '
2240 i$=INKEY$:IF i$="" THEN 2240 ELSE i=ASC(i$) ' Auf Tastendruck warten.
2245 '
2250 Maschinencode über HIMEM: CALLCALL &TEXT VDU: BB84: TXT CUR OFFBB84 ' Cursorklecks entfernen.
2260 IF i=13 THEN RETURN ' ENTER -> fertig
2270 IF i=240 THEN y=y-1 ' Erklärung zu den verwendeten Bezeichnungen: CursorCursor hoch
2280 IF i=241 THEN y=y+1 ' Erklärung zu den verwendeten Bezeichnungen: CursorCursor runter
2290 IF i=242 THEN Die verwendeten Abkürzungen bedeuten: x:x=x-1 ' Erklärung zu den verwendeten Bezeichnungen: CursorCursor links
2300 IF i=243 THEN Die verwendeten Abkürzungen bedeuten: x:x=Die verwendeten Abkürzungen bedeuten: x:x+1 ' Erklärung zu den verwendeten Bezeichnungen: CursorCursor rechts
2310 IF Die verwendeten Abkürzungen bedeuten: x:x=66 THEN Die verwendeten Abkürzungen bedeuten: x:x=50:y=y+1 ' \
2320 IF Die verwendeten Abkürzungen bedeuten: x:x<0 THEN Die verwendeten Abkürzungen bedeuten: x:x=65:y=y-1 ' \
2330 IF Die verwendeten Abkürzungen bedeuten: x:x=47 THEN Die verwendeten Abkürzungen bedeuten: x:x=0:y=y+1 ' > Bereichsgrenzen überprüfen.
2340 IF Die verwendeten Abkürzungen bedeuten: x:x=49 THEN Die verwendeten Abkürzungen bedeuten: x:x=46 ' /
2350 y=(y+16)Die Kodierung der Tintennummern in den Bildschirm-Bytes: Mode 2: Die Kodierung der Tintennummern in den Bildschirm-Bytes: Mode 1: Die Kodierung der Tintennummern in den Bildschirm-Bytes: Mode 0:MOD 16 ' /
2360 IF i>&EE THEN 2230
2361 '
2365 ' ******* Pufferinhalt ändern *******
2366 '
2370 IF Die verwendeten Abkürzungen bedeuten: x:x<48 THEN IF Die verwendeten Abkürzungen bedeuten: x:x Die Kodierung der Tintennummern in den Bildschirm-Bytes: Mode 2: Die Kodierung der Tintennummern in den Bildschirm-Bytes: Mode 1: Die Kodierung der Tintennummern in den Bildschirm-Bytes: Mode 0:MOD 3=2 THEN Die verwendeten Abkürzungen bedeuten: x:x=Die verwendeten Abkürzungen bedeuten: x:x+1:PRINT" "; ' auf legale Position
2380 IF Die verwendeten Abkürzungen bedeuten: x:x=48 OR Die verwendeten Abkürzungen bedeuten: x:x=49 THEN 2230 ' überprüfen.
2390 IF x>49 THEN 2470
2400 i=VAL("&0"+i$):IF i=0 AND i$<>"0" THEN 2230 ' Erklärung zu den verwendeten Bezeichnungen: CursorCursor steht im Bereich
2410 z=basis+y*16+Die verwendeten Abkürzungen bedeuten: x:x\3 ' des Hex-Auszuges:
2420 IF Die verwendeten Abkürzungen bedeuten: x:x Die Kodierung der Tintennummern in den Bildschirm-Bytes: Mode 2: Die Kodierung der Tintennummern in den Bildschirm-Bytes: Mode 1: Die Kodierung der Tintennummern in den Bildschirm-Bytes: Mode 0:MOD 3=0 THEN POKE z,(PEEK(z)AND &F)+i*16
2430 IF Die verwendeten Abkürzungen bedeuten: x:x Die Kodierung der Tintennummern in den Bildschirm-Bytes: Mode 2: Die Kodierung der Tintennummern in den Bildschirm-Bytes: Mode 1: Die Kodierung der Tintennummern in den Bildschirm-Bytes: Mode 0:MOD 3=1 THEN POKE z,(PEEK(z)AND &Der Zeichensatz des Schneider CPC: &F0 = 240F0)+i
2440 PRINT UPPER$(i$);:LOCATE 51+Die verwendeten Abkürzungen bedeuten: x:x\3,y+1
2450 PRINT CHR$(1);CHR$(PEEK(z)AND &7F);
2460 i=243:GOTO 2270
2465 '
2470 z=basis+y*16+x-50:POKE z,i ' Erklärung zu den verwendeten Bezeichnungen: CursorCursor steht im Bereich
2480 PRINT CHR$(1);i$;:LOCATE (x-50)*3+1,y+1 ' der ASCII-Darstellung:
2490 PRINT HEX$(i,2);:i=243:GOTO 2270
2500 '
2510 ' +-----------------------------------+
2520 ' | *** Start des Hauptprogramms *** |
2525 ' | *** Initialisierungen *** |
2530 ' +-----------------------------------+
2540 '
2550 CLOSEIN:CLOSEOUT
2560 IF HIMEM>30000 THEN MEMORY 29999:LOAD"sector.bin",40000:Maschinencode über HIMEM: CALLCALL 40000
2570 puffer=30000:trk=0:d$="Operationen: BD5B / 349A / 349A: FLO SUBA":basis=puffer
2590 PAPER 0:PEN 1:INK 0,0:INK 1,26:Die Kodierung der Tintennummern in den Bildschirm-Bytes: Mode 2: Die Kodierung der Tintennummern in den Bildschirm-Bytes: Mode 1: Die Kodierung der Tintennummern in den Bildschirm-Bytes: Mode 0:MODE 2
2600 PRINT Datentypen: StringsSTRING$(240,"#");Datentypen: StringsSTRING$(160,"#")
2610 WINDOW 3,78,2,4:CLS:PRINT
2620 PRINT" KIO - Diskettenmonitor /// Erklärung zu den Anschlüssen: Vcc und Vss Erklärung zu den Anschluss-Bezeichnungen: Vcc und Vssvs. 1.0 /// 27.5.86 /// (c) G.Woigk"
2630 WINDOW#7,1,80,7,8
2640 WINDOW#1,58,73,10,25
2650 WINDOW#2,1,7,10,25
2660 WINDOW#0,8,73,10,25
2670 GOSUB 2080:GOSUB 1140 ' Diskparameter bestimmen und
2671 ' ' Pufferinhalt ausgeben.
2672 ' +-------------+
2673 ' | Hauptmenue: |
2674 ' +-------------+
2675 '
2680 CLS#7
2690 PRINT#7,"L = laden / S = speichern / Operationen: BD5B / 349A / 349A: FLO SUBA,LOW KERNEL JUMPBLOCK: 000B: LOW KL LOW PCHL LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPTB = Laufwerk wählen";
2700 PRINT#7," / <,> / ?-Die Speicherkonfiguration im Schneider CPC: BlockBlock / M = Ändern";
2705 '
2710 i$=UPPER$(INKEY$):IF i$=""THEN 2710 ELSE i=ASC(i$)
2715 '
2720 IF i$="L" THEN s=0:l=1:GOSUB 1800:GOTO 2670
2730 IF i$="S" THEN s=1:l=0:GOSUB 1800:GOTO 2680
2740 IF i$="Operationen: BD5B / 349A / 349A: FLO SUBA"OR i$="LOW KERNEL JUMPBLOCK: 000B: LOW KL LOW PCHL LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPTB" THEN d$=i$:GOSUB 1500:GOTO 2680
2750 IF i=242 AND basis>puffer THEN basis=puffer:GOTO 2670
2760 IF i=243 AND basis=puffer THEN basis=puffer+256:GOTO 2670
2770 IF i$="M" THEN GOSUB 2220:GOTO 2680
2780 IF i$<>"?"THEN 2680
2781 '
2782 ' *** Laufwerksdaten und Sektoren für Die Speicherkonfiguration im Schneider CPC: BlockBlock bestimmen ***
2783 '
2790 GOSUB 1500:IF f THEN 2680 ' Loggin
2800 CLS#7:PRINT#7,"Laufwerk ";d$;": Amsdos: FormateFormat = ";
2810 IF typ=0 THEN PRINT#7,"IBM";
2820 IF typ=&40 THEN PRINT#7,"Einleitung: CP/MCP/M";
2830 IF typ=&Der Zeichensatz des Schneider CPC: &C0 = 192C0 THEN PRINT#7,"Daten";
2840 INPUT#7," -- Die Speicherkonfiguration im Schneider CPC: BlockBlock: ",Die Speicherkonfiguration im Schneider CPC: Blockblock
2850 Die Speicherkonfiguration im Schneider CPC: Blockblock=MAX(MIN(Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: INT - Interrupt Besonderheiten der Z80 im Schneider CPC: normaler Interrupt Die Besonderheiten des FDC 765 im Schneider CPC: INTINT(Die Speicherkonfiguration im Schneider CPC: Blockblock),255),0):GOSUB 1310
2860 PRINT#7,"Die Speicherkonfiguration im Schneider CPC: BlockBlock"Die Speicherkonfiguration im Schneider CPC: Blockblock"= Track"trk0"Sektor"sek0" -- Track"trk1"Sektor"sek1
2870 trk=trk0:sek=sek0:GOTO 2690
| |