; hb0.asm Stand 03.01.90 ; A = EPROM-FLOPPY ; B = ECMA 70 ; C = NDR-80 SPUR ; D,E = 8" DD ; F = Ram-Floppy ; SPEZIAL-CBIOS FUER MC-CP/M-COMPUTER ; MIT BOOT AUF MINI-LAUFWERKEN MACLIB DISKDEF ; BIBLIOTHEKSPROGRAMM DES MACRO ; ASSEMBLERS ZUR DEF. DER LAUFWERKE VERS EQU 22 ; NUMMER DER CPM VERSION ORG 0EA00H ; ANFANGSADRESSE DES PROGRAMMS CPMB EQU 0D400H BDOS EQU 0DC06H ; ADRESSE DES BDOS CPML EQU $-CPMB ; LAENGE DES CPM SYSTEMS BIOS EQU $ ; ADRESSE DES BIOS BIAS EQU 0 ; ADRESSE DES BIAS RETRY EQU 4 ; WIEDERHOLUNGSFAKTOR FUR FEHLERHAFTE ; DISKETTEN-OPERATIONEN NSECTS EQU CPML/128 ; LAENGE DES CPM SYSTEMS IN SEKTOREN ; (128 BYTE PRO SEKTOR ) CDISK EQU 4 ; ADRESSE FUER EINE SPEICHERSTELLE, ; DIE ; DIE NUMMER DES ZULETZT BENUTZ- ; TEN LAUFWERKS ; BEINHALTET BUFF EQU 80H ; ADRESSE STANDARD DISKETTENPUFFER RDDAT EQU 88H ;BASIS-ADRESSE F]R 1 MBYTE-RAM-FLOPPY ;UND DATENPORT RDSEKT EQU 89H ;SEKTOR-PORT RDSPUR EQU 8AH ;SPUR-PORT RDSTAT EQU 8BH ;STATUS-PORT LOSEPR EQU 006H HISEPR EQU 002H TRAEPR EQU 000H EPRFL EQU 005H ; IM FOLGENDEN STEHEN DIE 17 VON CPM DEFINIERTEN ; SPRUNGVEKTOREN ZU DEN EINZELNEN EIN-/AUSGABE- ; FUNKTIONEN UND DISKETTEN-ROUTINEN JMP BOOT ; KALTSTART WBOOTE: JMP WBOOT ; WARMSTART JMP 0F012H ; PRUEFEN OB ZEICHEN AN DER KONSOLE ? JMP CONIN ; ZEICHEN VON DER KONSOLE EINLESEN JMP 0F009H ; ZEICHEN AN DIE KONSOLE AUSGEBEN JMP 0F00FH ; ZEICHEN AUF DRUCKER AUSGEBEN JMP 0F00CH ; ZEICHEN AN DIE STANZE SENDEN JMP 0F006H ; ZEICHEN VON LESER HOLEN JMP HOME ; AUF SPUR 00 VON GEWAEHLTER DISKETTE JMP SELDSK ; DISKETTENLAUFWERK AUSWAEHLEN JMP SETTRK ; SPURNUMMER SETZEN JMP SETSEC ; SEKTORENNUMMER SETZEN JMP SETDMA ; DMA-ADRESSE SETZEN JMP RDFLO ; AUSGEWAEHLTEN SEKTOR LESEN JMP WRFLO ; AUF AUSGEWAEHLTEN SEKTOR SCHREIBEN JMP LISTST ; LIEFERT DEN STATUS VOM DRUCKER JMP SECTRAN ; UMKODIERUNG DER SEKTOREN TABBASE: DB 00000000B ; LAUFWERK A (0) (Eprom-FLOPPY) DB 00000000B ; DUMMY-WERT DB 00000000B ; DUMMY-WERT DB 00000000B ; DUMMY-WERT DB 10000011B ; LAUFWERK B (1) (MINI) DB 11010000B DB 00000000B DB 00000000B DB 10010111B ; LAUFWERK C (2) DS, DD, NDR 80 Spur ; Bit7=1=MINI, Bit6-3:0010 DB 11010100B ; Vorderseite DB 11010101B ; R}ckseite mit SSO: Bit 0 = 1 DB 00000000B ; DB 00000111B ; LAUFWERK D (3) (MAXI DD) DB 01000000B DB 00000000B DB 00000000B DB 00000111B ; LAUFWERK E (4) (MAXI DD) DB 01000001B DB 00000000B DB 00000000B DB 00000000B ; LAUFWERK F (5) (RAM-FLOPPY) DB 00000000B ; DUMMY-WERT DB 00000000B ; DUMMY-WERT DB 00000000B ; DUMMY-WERT MON80 EQU 0F01EH ; MONITORADRESSEN (WPROM) RMON80 EQU 0F01EH CONIN: CALL 0F003H ; DIE ROUTINE HOLT EIN ZEICHEN VON ; TASTATUR AB, SETZT DAS HOECHSTE BIT ; (PARITY BIT) AUF NULL ANI 7FH RET BOOT: LXI SP,BUFF+80H ; STACKPOINTER MIT 0FFH LADEN. ;DIESE ADRESSE ; ENTSPRICHT DEM DISKETTENPUFFER AUF ; "ZERO-PAGE". XRA A STA CDISK ; NUMMER DES AUSGEWAEHLTEN LAUFWERKS ; 00H = LAUFWERK A STA WRTFLG ; DIESES FLAG ZEIGT AN, OB EINE ; SCHREIBOPERATION DURCHGEFUEHRT ; WURDE UND DER DISKETTENPUFFER AUF ; DIE DISKETTE ZURUECKGESCHRIEBEN ; WERDEN MUSS. MVI A,0FFH STA IOLALT ; BISHER KEIN LAUFWERK BENUTZT UND ; DAMIT DISKETTENPUFFER UNDEFINIERT LXI H,WBOOT ; ADRESSE DES WARMSTARTS SHLD 0F033H+1 ; WARMSTARTADRESSE IM MONITOR ABLEGEN SHLD 0F036H+1 JMP GOCPM ; CPM AUFRUFEN WBOOT: LXI SP,BUFF+80H ; STACKPOINTER MIT 0FFH LADEN. DIESE ; ADRESSE ENTSPRICHT DEM DISKETTEN- ; PUFFER AUF DER "ZERO-PAGE". LDA WRTFLG ; SCHREIBOPERATION DURCHGEFUEHRT ? ORA A JZ NOTBAC ; KEINE SCHREIBOPERATION DURCHGEFUEHRT CALL PUTBACK ; FALLS DAS FLAG WRTFLAG GESETZT IST, ; SO ; MUSS DER DISKETTENPUFFER ZURUECK- ; GESCHRIEBEN WERDEN. AN DIESER STELLE ; AUFPASSEN, DASS NICHT VERSEHENTLICH ; DER WARMSTART AUF DEM NEUEM LAUFWERK ; DURCHGEFUEHRT WIRD, DA SONST DATEN ; VERNICHTET WERDEN KOENNEN NOTBAC: MVI A,RETRY ; ZAHL DER VERSUCHE BEI BOOT-FEHLER STA REPEAT ; ZAHL SPEICHERN MVI A,0FFH ; NUMMER DER ZULETZT BENUTZTEN SPUR. STA IOLALT ; ABSPEICHERUNG VON 0FFH NACH WARMSTART, ; UM PUFFER ALS UNBENUTZT ZU MARKIEREN, ; DAMIT DER PUFFERINHALT NICHT ZU ; FALSCHEN DATEN FUEHRT. WBOOT0: LXI H,CPMB ; START ADRESSE DES CPM SYSTEMS MVI D,NSECTS/2 ; ANZAHL DER SEKTOREN A 256 BYTES ; (LAENGE DES CPM SYSTEMS) MVI A,0 OUT LOSEPR OUT HISEPR OUT TRAEPR MVI C,EPRFL RDSEC: MVI B,0 ;256 BYTES KOPIEREN DB 0EDH, 0B2H ;INIR -Z80 DCR D ;SEKTOR-Z[HLER JNZ RDSEC ; NAECHSTEN SEKTOR LADEN. ; WENN CPM VOLLSTAENDIG GELADEN ; DANN AUFRUFEN GOCPM: LXI B,BUFF ; DMA-ADRESSE MIT DER STANDARD-ADRESSE ; FUER DEN DISKETTEN-PUFFER LADEN CALL SETDMA ; DMA-ADRESSE SETZEN MVI A,JMP ; BEFEHLSCODE FUER SPRUNGBEFEHL STA 0 ; SPRUNGBEFEHL UND SPRUNGADRESSE ; FUER WARMSTART AN DER ADRESSE 0000H ; ABLEGEN LXI H,WBOOTE ; ADRESSE DES WARMSTARTS SHLD 1 STA 5 ; SPRUNGBEFEHL UND ADRESSE FUER ; BDOS EINTRITTSPUNKT AN 0005H ; ABLEGEN LXI H,BDOS ; BDOS ADRESSE SHLD 6 STA 7*8 ; SPRUNGBEFEHL UND SPRUNGADRESSE FUER ; RESTART BEFEHL (RST7) ABLEGEN LXI H,MON80 ; SPRUNGADRESSE FUER RST7 BEFEHL SHLD 7*8+1 LDA CDISK ; LAUFWERKSNUMMER MOV C,A JMP CPMB ; Start CP/M BOOTERR: LDA REPEAT ; FEHLERROUTINE BEIM BOOTEN DCR A ; WEITERER LESEVERSUCH ? STA REPEAT JZ MON80 ; ABBRUCH DES BOOTEN JMP WBOOT0 ; TRY AGAIN LISTST: XRA A ; DER WERT 00H IM AKKU NACH DEM AUFRUF ; VON LISTST ZEIGT DEM SYSTEM AN, ; DASS DIE DRUCKERSCHNITTSTELLE KEINE ; WEITEREN ZEICHEN AUFNEHMEN KANN. ; FUNKTION LISTST NICHT IMPLEMENTIERT. RET HOME: MVI C,0 ; POSITIONIERUNG DES LAUFWERKSKOPF AUF ; 00 POSITION DES SELEKTIERTEN LAUFWERKS JMP SETTRK ; AUF DIE GEWAHLTE SPUR POSITIONIEREN SELDSK: LXI H,0 ; DURCH DEN AUFRUF VON SELDSK WIRD DAS ; GEWUENSCHTE LAUFWERK AUSGEWAEHLT. ; DIE LAUFWERKSWAHL ERFOLGT AN HAND DES ; C-REGISTERS. ; 00H = LAUFWERK A, 01H = LAUFWERK B ETC. ; NACH DEM AUFRUF STEHT IM H+L REGISTER ; DER "DISK PARAMETER HEADER" MIT DEN ; KENNDATEN DES LAUFWERKS. DER WERT 0H ; ZEIGT DIE WAHL EINES NICHT EXISTIEREN- ; DEN LAUFWERKS AN. MOV A,C CPI NDISKS ; LAUFWERKSNUMMER < MAX. LAUFWERKSZAHL RNC ; RUECKSPRUNG BEI FALSCHEM LAUFWERK STA IOL ; SPEICHERUNG DER LAUFWERKSNUMMER (0..3) MOV L,C ; ERSTELLUNG DES DISK PARAMETER HEADERS DAD H ; LAUFWERKSNUMMER * 16 DAD H PUSH H ; REGISTERPAAR SICHERN LXI D,TABBASE ; ADRESSE DER KENNDATEN DAD D SHLD TABADR ; ADRESSE DER KENNDATEN DER AKTUELLEN ; DISK POP H ; REGISTERPAAR RESTAURIEREN DAD H DAD H LXI D,DPBASE ; ADRESSE DER DISKETTEN PARAMETER TABELLE ; DPBASE, DURCH DISKDEF MACRO DEFINIERT DAD D RET SETTRK: LXI H,IOT ; ROUTINE ZUR POSITIONIERUNG AUF EINE ; BESTIMMTE SPUR DES GEW[HLTEN LAUFWERKS. ; SPURNUMMER BEFINDET SICH IM C-REGISTER. ; IOT STELLT DIE SPEICHERSTELLE FUER DIE ; SPURENNUMMER DAR. MOV M,C ; SPURNUMMER ABSPEICHERN RET SETSEC: LXI H,IOS ; SETSEC SPEICHERT NUMMER DES GEWUENSCHTEN ; SEKTORS IN DER SPEICHERSTELLE IOS AB. ; DIE NUMMER DES SEKTORS BEFINDET SICH ; BEIM AUFRUF IM C-REGISTER. MOV M,C RET SECTRAN: MOV A,D ; UM DIE ZUGRIFFSZEIT AUF DIE DISKETTE ; ZU ERHOEHEN, KOENNEN ZWISCHEN ZWEI ZU ; LESENDEN ODER ZU SCHREIBENDENEN ; SEKTOREN, EINIGE SEKTOREN UEBERSPRUNGEN ; WERDEN. DANN IST ES NOETIG DIE ; GEWUENSCHTE SEKTORENNUMMER IN DIE ; TATSAECHLICHE SEKTORENNUMMER AN HAND ; TABELLE DES DISKDEF MACROS UMZURECHNEN. ; BEIM AUFRUF BEFINDET SICH DIE SEKTOREN- ; NUMMER IN B+C UND DIE ADRESSE DER ; UMRECHNUNGSTABELLE IN D+E. ORA E JZ SE1 ; SPRUNG FALLS KEINE UMRECHNUNG NOETIG. MVI B,0 ; UMRECHNUNG DER SEKTORENNUMMER XCHG DAD B MOV C,M SE1: MOV L,C ; ABSPEICHERUNG DER EVENT. NEUEN ; SEKTORNUMMER IN IOS. MOV A,C STA IOS MVI H,0 ; SEKTORENZAHL ZWISCHEN 0 UND 255 MAXIMAL RET SETDMA: MOV L,C ; DMA-ADRESSE SETZEN MOV H,B SHLD IOD ; SPEICHERSTELLE FUER DMA-ADRESSE RET ; DIE AUFRUFE READ UND WRITE BENUTZTEN BEIDE ; DAS UNTERPROGRAMM EXEC IM MONITOR (EPROM). ; BEIM AUFRUF MUSS FOLGENDES GELTEN: ; DMA-ADRESSE IN H+L ; SPURNUMMER IN REGISTER D ; SEKTORNUMMER IN REGISTER E ; PHYSIKALISCHE LAUFWERKSADRESSE IN C ; DIE GEWUENSCHTE OPERATION WIRD DURCH ; WIRD DURCH DEN WERT DES B-REGISTERS ; FESTGELEGT: ; B = 0 RESTORE ; 1 READ ; 2 WRITE ; FUER DIE LESE- UND SCHREIBOPERATIONEN ; WERDEN 1K SPEICHERPLATZ IM MONITORBEREICH ; BENUTZT, DIE NACH EINEM WARMSTART AUF ; DIE DISKETTE ZURUECKGESCHRIEBEN WERDEN ; MUESSEN. BUFFER EQU 0F800H ; ADRESSE DES PUFFERBEREICHS IM MONITOR ; FREIES GEBIET BIS 0FFFFH (NUR MONITORBEFEHLE) RDFLO: LDA IOL ; NUMMER DES SELEKTIERTEN LAUFWERKS CPI 5 ; RAM-FLOPPY ? JZ RDRFL CPI 0 JZ REPROM ;EPROM-FLOPPY MVI A,01H ; KENNUNG FUER LESEZUGRIFF JMP DOFLO ; OPERATION AUSFUEREN WRFLO: LDA IOL ; NUMMER DES SELEKTIERTEN LAUFWERKS CPI 5 ; RAM-FLOPPY ? JZ WRRFL CPI 0 JZ WEPROM ;EPROM-FLOPPY MVI A,02H ; KENNUNG FUER SCHREIBZUGRIFF DOFLO: STA ZUGRIFF ; SPEICHERSTELLE FUER KENNUNG LHLD TABADR ; ADRESSE DER TABELLE MIT DEN KENNDATEN MOV A,M ; MODUS ANI 10000000B ; MAXI- ODER MINI-LAUFWERK ? STA MINMAX MOV A,M ; MODUS ANI 00000001B ; NUMMER DES ERSTEN SEKTORS ? STA SECOFF LDA IOS ; SEKTORNUMMER MOV E,A MVI D,00H ; MASKE FUER SEKTORPOSITION IM PUFFER MOV A,M ; MODUS LXI H,BUFFER ; ADRESSE DES DISKETTENPUFFERS RRC ANI 00000011B ; ZAHL DER BYTES PRO SEKTOR JZ DOFLO1 ; 128 BYTES PRO SEKTOR MOV B,A ; ZAHL DER BYTES PRO SEKTOR DOFLO2: MOV A,E ; SEKTORENNUMMER RAR ; DIVISION DURCH 2 ANI 01111111B MOV E,A MOV A,D ; MASKE FUER SEKTORPOSITION IM PUFFER STC ; CARRY-FLAG SETZEN RAL ; MASKE SCHIEBEN MOV D,A DCR B ; ENDE ? JNZ DOFLO2 LDA IOS ; SEKTORENNUMMER ANA D ; NUMMER DES SEKTORS IM PUFFER JZ DOFLO1 ; ERSTER SEKTOR IM PUFFER LXI B,128 DOFLO3: DAD B ; PUFFERADRESSE UM 128 ERHOEHEN DCR A JNZ DOFLO3 DOFLO1: SHLD BUFFADR ; ADRESSE DES GESUCHTEN SEKTORS IM ; DISKETTEN-PUFFER ABSPEICHERN MOV A,E ; SEKTORNUMMER STA SEC ; SPEICHERSTELLE FUER SEKTORNUMMER LDA SECALT ; ALTE SEKTORENNUMMER CMP E ; GLEICHER SEKTOR ? JNZ DOFLO4 LDA IOL ; LAUFWERKSNUMMER LXI H,IOLALT ; ALTE LAUFWERKSNUMMER CMP M ; GLEICHES LAUFWERK ? JNZ DOFLO4 LDA IOT ; SPURNUMMER LXI H,IOTALT ; ALTE SPURNUMMER CMP M ; GLEICHE SPUR ? JNZ DOFLO4 CALL COPSEK ; SEKTOR SCHON IM PUFFER XRA A RET DOFLO4: LDA WRTFLG ; ALTEN PUFFERINHALT ZURUECKSCHREIBEN ? ORA A CNZ PUTBACK ; SEKTOR ZURUECKSCHREIBEN JC ERROR ; FEHLER AUFGETRETEN ? LDA IOT ; SPURNUMMER MOV D,A LHLD TABADR ; ADRESSE DER KENNDATEN MOV A,M ANI 01111000B ; MODUS DER SPEICHERUNG INX H ; ADRESSE DER VORDERSEITE MOV C,M ; ADRESSE IM C-REGISTER SICHERN INX H ; ADRESSE DER RUECKSEITE JZ DOFLO6 ; EINSEITIGE DISKETTE CPI 00010000B ; GERADZAHLIGE SPUREN AUF DER ; VORDERSEITE ? JNZ DOFLO7 MOV A,D ; SPURNUMMER STC CMC RAR ; GERAD- ODER UNGERADZAHLIG ? MOV D,A ; NEUE SPURNUMMER JNC DOFLO6 ; GERADZAHLIG MOV C,M ; ADRESSE DER RUECKSEITE JMP DOFLO6 DOFLO7: CPI 00011000B ; UNGERADZAHLIGE SPUREN AUF DER ; VORDERSEITE ? JNZ DOFLO8 MOV A,D ; SPURNUMMER STC CMC RAR ; GERAD- ODER UNGERADZAHLIG ? MOV D,A ; NEUE SPURNUMME JC DOFLO6 ; GERADZAHLIG MOV C,M ; ADRESSE DER RUECKSEITE JMP DOFLO6 DOFLO8: CPI 00100000B ; SPUREN 0 BIS N AUF DER VORDERSEITE ? JNZ DOFLO9 INX H ; ADRESSE FUER ZAHL DER SPUREN AUF ; VORDERSEITE MOV A,D ; SPURNUMMER CMP M ; VORDERSEITE ? JC DOFLO6 ; VORDERSEITE SUB M ; SPUREN FUER VORDERSEITE ABZIEHEN INR A MOV D,A ; NEUE SPURNUMMER DCX H ; ADRESSE DER RUECKSEITE MOV C,M JMP DOFLO6 DOFLO9: ; SPUREN 0 BIS N AUF DER RUECKSEITE INX H ; ADRESSE FUER ZAHL DER SPUREN AUF ; VORDERSEITE MOV A,D ; SPURNUMMER CMP M ; VORDERSEITE ? JNC DOFLO6 ; VORDERSEITE SUB M ; SPUREN FUER VORDERSEITE ABZIEHEN INR A MOV D,A ; NEUE SPURNUMMER DCX H ; ADRESSE DER RUECKSEITE MOV C,M DOFLO6: MOV A,D ; SPURNUMMER STA TRAK MOV A,C ; KENNUNG DES LAUFWERKS STA DISK CALL DODISK ; DISKETTENZUGRIFF AUSFUEHREN JC ERROR ; FEHLER AUFGETRETEN ? LXI D,OLDSECT ; SPEICHERSTELLE FUER ALTE DATEN LXI H,NEWSECT ; SPEICHERSTELLE FUER NEUE DATEN MVI B,8 ; 8 BYTES KOPIEREN DOFLO5: MOV A,M ; BYTE LADEN STAX D ; BYTE SPEICHERN INX H ; ADRESSEN ERHOEHEN INX D DCR B ; WEITERES BYTE ? JNZ DOFLO5 CALL COPSEK ; SEKTOR KOPIEREN XRA A RET ERROR: MVI A,01H ; KENNUNG FUER FEHLER ORA A RET ; KOPIEREN DES GEWUENSCHTEN SEKTORS IM PUFFER COPSEK: LHLD IOD ; DMA-ADRESSE (ZIELADRESSE BEI READ) XCHG LHLD BUFFADR ; ADRESSE DES PUFFERS ; (STARTADRESSE BEI READ) LDA ZUGRIFF ; KENNUNG FUER ZUGRIFF CPI 1 ; LESEZUGRIFF ? JZ COPSEK1 XCHG ; START- UND ZIELADRESSE AUSTAUSCHEN MVI A,1 ; MARKIERUNG FUER BESCHRIEBENEN SEKTOR STA WRTFLG ; PUFFER ENTHAELT NUN DATEN ZUM ; SCHREIBEN AUF DIE DISKETTE. DAS ; ZURUECKSCHREIBEN ERFOLGT ALLERDINGS ; ERST BEIM NAECHSTEN WARMSTART ODER ; BEI EINER LESE/SCHREIBOPERATION AUF ; EINEN SEKTOR, DER JETZT NICHT IM ; PUFFER LIEGT. DAS FLAG WRTFLG ZEIGT ; NOTWENDIGKEIT DES ZURUECKSCHREIBENS ; DES PUFFERS AN. COPSEK1: LXI B,128 ; ZAHL DER ZU VERSCHIEBENDEN ZEICHEN DB 0EDH,0B0H ; LDIR ; MIT Z80 BEFEHL WERDEN DIE 128 BYTE ; UEBERTRAGEN XRA A RET ; DIE FOLGENDEN ROUTINEN FUEHREN DEN ZUGRIFF AUF ; DISKETTE AUS PUTBACK: LXI H,OLDSECT ; ADRESSE DER DATEN FUER ZUGRIFF MVI B,2 ; KENNUNG FUER SCHREIBZUGRIFF JMP DODISK1 DODISK: LXI H,NEWSECT ; ADRESSE DER DATEN FUER ZUGRIFF MVI B,1 ; KENNUNG FUER LESEZUGRIFF DODISK1: MVI A,RETRY ; ZAEHLER FUER ZUGRIFFSWIEDERHOLUNG STA REPEAT XRA A ; FLAG WRTFLG LOESCHEN STA WRTFLG SHLD BACKADR ; ADRESSE SICHERN DODISK2: LHLD BACKADR MOV C,M ; LAUFWERKSKENNUNG INX H MOV D,M ; SPURNUMMER INX H MOV A,M ; NUMMER DES ERSTEN SEKTORS EINER SPUR INX H ADD M ; SEKTORNUMMER MOV E,A INX H MOV A,M ; MINI- ODER MAXI-LAUFWERK ? LXI H,BUFFER ; ADRESSE DES DISKETTENPUFFERS RLC JNC DODISK3 ; MAXI CALL 0F027H ; ZUGRIFF AUF MINI-LAUFWERK JMP DODISK4 DODISK3: CALL 0F024H ; ZUGRIFF AUF MAXI-LAUFWERK DODISK4: RNC ; RUECKSPRUNG FALLS KEIN FEHLER ; AUFGETRETEN LXI H,REPEAT ; ADRESSE DES WIEDERHOLUNGSFAKTORS DCR M JNZ DODISK2 ; WEITERER VERSUCH STC ; KENNUNG FUER FEHLER RET RDRFL: CALL RFLADR ; BERECHNUNG DER RAM-FLOPPY ADRESSE DB 0EDH,0B2H ; KOPIEREN MIT Z80 BEFEHL INIR RET WRRFL: CALL RFLADR ; BERECHNUNG DER RAM-FLOPPY ADRESSE DB 0EDH,0B3H ; KOPIEREN MIT Z80 BEFEHL OTIR RET RFLADR: LDA IOT ; SPUR-NUMMER OUT RDSPUR ; AUSGABE NACH PORT 8AH = SPUR LDA IOS ; SEKTORNUMMER OUT RDSEKT ; AUSGABE NACH PORT 89H = SEKTOR LHLD IOD ; DMA-ADRESSE LADEN MVI C,RDDAT ; REGISTER C = DATENPORT MVI B,128 ; 128 BYTE KOPIEREN XRA A ; AKKU L\SCHEN RET REPROM: CALL EPROAD DB 0EDH, 0B2H RET WEPROM: CALL EPROAD DB 0EDH, 0B3H RET EPROAD: MVI A,0 OUT LOSEPR LDA IOS DB 0CBH, 27H DB 0CBH, 27H DB 0CBH, 27H OUT HISEPR LDA IOT OUT TRAEPR LHLD IOD MVI C,EPRFL MVI B,128 XRA A RET DISKS 6 ; AN DIESER STELLE WERDEN ZWAR ACHT ; DISKETTEN- LAUFWERKE DEFINIERT, ABER ; IN WIRKLICHKEIT NUR 4 LAUFWERKE ; BENUTZT. JEDES DER VIER VORHANDENEN ; LAUFWERKE WIRD ALS LAUFWERK MIT ZWEI ; KOEPFEN (DOUBLE SIDED) DEFINIERT, ; WOBEI DANN JEDE SEITE ALS EIN EIGENES ; LAUFWERK ANGESPROCHEN WIRD. ; LAUFWERK 5 FUER RAM-FLOPPY BENUTZT. DISKDEF 0,0,31,0,2048,84,64,0,2 ; Laufwerk A = Eprom-Floppy DISKDEF 1,0,31,0,1024,143,64,64,4 ; Laufwerk 1 = B ; BEDEUTUNG DER PARAMETER ; 0 = NUMMER DES LAUFWERKS ; 0 = NUMMER DES ERSTEN SEKTORS ; 31 = NUMMER DES LETZTEN SEKTORS ; 0 = OPTIONALER VERSCHIEBUNGSFAKTOR ZUM ; VERSETZEN ABSPEICHERN DER SEKTOREN ; 1024 = GROESSE EINES BLOCKS ; 143 = ZAHL DER MAX. MOEGLICHEN BLOECKE ; 64 = ZAHL DER DIRECTORY EINTRITTSPUNKTE ; 64 = ZAHL DER GEPRUEFTEN EINTRITTSPUNKTE ; 4 = ADDITIVE KONSTANTE ZUM ANSPRECHEN DER ; SPUR 00 DISKDEF 2,0,39,0,2048,389,256,256,4 ; C = NDR 2 * 80 DISKDEF 3,1,64,0,2048,300,256,256,2 ; 8 SS, DD DISKDEF 4,3 ; 8 SS, DD DISKDEF 5,0,31,0,2048,512,512,0,0 ; RAM FLOPPY ENDEF ; SPEICHERSTELLEN FUER DAS PROGRAMM ; DIE REIHENFOLGE DER DATEN DARF NICHT ; VERAENDERT WERDEN ! WRTFLG: DS 1 ; BEI GESETZEM FLAG (WERT UNGLEICH 0) MUSS ; DER INHALT DES DISKETTENPUFFER AUF DIE ; DISKETTE ZURUECKGESCHRIEBEN WERDEN. REPEAT: DS 1 ; WIEDERHOLUNGSFAKTOR BEI DISKETTENFEHLER BUFFADR: DS 2 ; ADRESSE DES ZU BEARBEITENDEN SEKTORS MIT ; MIT 128 BYTES IM SEKTORENPUFFER BACKADR: DS 2 ; HILFSSPEICHERSTELLE FUER PUTBACK/DODISK ZUGRIFF: DS 1 ; KENNUNG FUER NAECHSTEN ZUGRIFF ; 1 = READ / 2 = WRITE NEWSECT: EQU $ DISK: DS 1 ; LAUFWERK FUER NAECHSTEN ZUGRIFF TRAK: DS 1 ; SPURNUMMER FUER NAECHSTEN ZUGRIFF SECOFF: DS 1 ; NUMMER DES ERSTEN SEKTORS (O ODER 1) SEC: DS 1 ; SEKTORNUMMER FUER NAECHSTEN ZUGRIFF MINMAX: DS 1 ; KENNUNG FUER MINI- UND MAXI-LAUFWERKE ; 00H = MAXI / 80H = MINI IOL: DS 1 ; LAUFWERKSNUMMER (CP/M) IOT: DS 1 ; SPRUNUMMER (CP/M) IOS: DS 1 ; SEKTORNUMMER (CP/M) OLDSECT: EQU $ DS 1 ; LAUFWERK FUER PUTBACK DS 1 ; SPURNUMMER FUER PUTBACK DS 1 ; NUMMER DES ERSTEN SEKTORS (O ODER 1) SECALT: DS 1 ; SEKTORNUMMER FUER PUTBACK DS 1 ; KENNUNG FUER MINI- UND MAXI-LAUFWERKE IOLALT: DS 1 ; ALTE LAUFWERKSNUMMER (CP/M) IOTALT: DS 1 ; ALTE SPRUNUMMER (CP/M) IOSALT: DS 1 ; ALTE SEKTORNUMMER (CP/M) IOD: DS 2 ; DMA ADRESSE (CP/M) TABADR: DS 2 ; ADRESSE DER TABELLE MIT DEN KENNDATEN END