Das Schneider CPC Systembuch

Die Abteilungen des Betriebssystems

Amsdos

Disketten-Monitor

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 - Write
Write
Erklärung zu den Anschlüssen: Vcc und Vss
Erklärung zu den Anschluss-Bezeichnungen: Vcc und Vss
vs
. 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 - Read
READ
, 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 - Write
WRITE
,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: KERNEL
KL
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: KERNEL
KL
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 - Read
READ
TRACK RDFAR: DEFW RETURN ; FAR ADDRESS: Dummy zeigt auf ein Return. DEFB 0 ; ROM-Konfiguration: ROM-Status
Anschluss eines Zusatz-ROM: ROM-Status
ROM-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 - Write
WRITE
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 - Read
READ
; 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 - Write
WRITE
; 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 INSTRUCTION
E
","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 INSTRUCTION
E
"+#80 DEFB "M","LOW KERNEL JUMPBLOCK: 000E: LOW PCBC INSTRUCTION
LOW KERNEL JUMPBLOCK: 001E: LOW PCHL INSTRUCTION
E
","S","S","Operationen: BD5B / 349A / 349A: FLO SUBA","G","LOW KERNEL JUMPBLOCK: 000E: LOW PCBC INSTRUCTION
LOW KERNEL JUMPBLOCK: 001E: LOW PCHL INSTRUCTION
E
"+#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 ENTRY
RST
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 - Read
READ
: 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 - Write
WRITE
. ; 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 - Write
WRITE
: 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 - Write
Write
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 ENTRY
RST
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 ENTRY
RST
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 INSTRUCTION
E
,(IX+6) ; LOW KERNEL JUMPBLOCK: 000E: LOW PCBC INSTRUCTION
LOW KERNEL JUMPBLOCK: 001E: LOW PCHL INSTRUCTION
E
= 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 ENTRY
RST
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 ENTRY
RST
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 Vss
vs
. 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: READY
ready
. 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 INTERRUPT
b
)=ftrk+ LOW KERNEL JUMPBLOCK: 000B: LOW KL LOW PCHL
LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL
LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPT
b
\ 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 INTERRUPT
b
)=1 + LOW KERNEL JUMPBLOCK: 000B: LOW KL LOW PCHL
LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL
LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPT
b
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(block*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 - Read
READ
,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 - Write
WRITE
,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 Vss
vs
. 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 INTERRUPT
B
= 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 INTERRUPT
B
" 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: INT
INT
(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

Valid HTML   Valid CSS