From 02a2dcac1a41872e1fec6d3b37ddd7ecae57eae4 Mon Sep 17 00:00:00 2001 From: "Christian A. Weber" Date: Thu, 16 Apr 1992 23:00:42 +0000 Subject: Initial revision --- SysCDisk.S | 303 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 303 insertions(+) create mode 100644 SysCDisk.S (limited to 'SysCDisk.S') diff --git a/SysCDisk.S b/SysCDisk.S new file mode 100644 index 0000000..2d56e30 --- /dev/null +++ b/SysCDisk.S @@ -0,0 +1,303 @@ + + IDNT SysCDisk + SECTION text,CODE + + INCLUDE "MyExec.i" + INCLUDE "exec/macros.i" + INCLUDE "dos/dos.i" + + XREF _DOSBase,@CheckFile + +;CRUNCH + + XREF _RawPrintfFunc + IFD CRUNCH + XREF PPDecrunch + ENDC + + XDEF InitDiskFunc ; Disk-System initialisieren + XDEF SetNoDiskHandlerFunc + XDEF ReadFileFunc ; 'Datei' lesen + XDEF WriteFileFunc ; 'Datei' schreiben + XDEF LoadFileFunc ; Speicher reservieren & File lesen + XDEF LoadFastFileFunc ; FAST alloc & File lesen + XDEF SendPacketFunc ; Asynchronen Lese-Request schicken + + +*************************************************************************** +** ** +** I N I T D I S K - Disk-System init, Recalibrate, Timer alloc ... ** +** ** +** Parameter : nix ** +** ** +*************************************************************************** + +InitDiskFunc: movem.l d0/a0,-(SP) + + clr.l InsertDiskRoutine + + *** DiskRequest-Liste initialisieren + + lea meb_DiskList(a6),a0 + jsr meb_NewList(a6) + + movem.l (SP)+,d0/a0 + rts + + +*************************************************************************** +** ** +** S E T N O D I S K H A N D L E R - NoDisk-Handler setzen ** +** ** +** Parameter : A0.L: InsertDisk-Handler oder 0 ** +** ** +*************************************************************************** + +SetNoDiskHandlerFunc: + move.l a0,InsertDiskRoutine + rts + + +************************************************************************** +** ** +** R E A D F I L E - 'Datei' von Disk lesen & MFM-dekodieren ** +** ** +** Parameter : D0.L : DiskAdresse (Disk/Track/Offset) der Datei ** +** A0.L : Ladeadresse ** +** ** +** Resultat : D0.L : Fehlernummer, 0 if successful ** +** Z-Bit: gesetzt if OK, gelöscht wenn Fehler ** +** ** +************************************************************************** + +ReadFileFunc: movem.l a0-a1,-(SP) + lea -dp_SIZEOF-2(SP),SP ; DiskPacket erstellen + move.l d0,dp_FileName(SP) + move.l a0,dp_Address(SP) + movea.l SP,a0 ; A0 : Packet + lea dp_SIZEOF(SP),a1 ; A1 : End-Flag + clr.b (a1) ; löschen + move.l a1,dp_Reply(a0) + move.b #DPF_REPLYBYTE,dp_Flags(a0) + bsr.s SendPacketFunc +1$: tst.b (a1) ; Warten bis File geladen! + beq.s 1$ + lea dp_SIZEOF+2(SP),SP ; DiskPacket freigeben + moveq #0,d0 ; Success ** DEBUG ** + movem.l (SP)+,a0-a1 + rts + + +************************************************************************** +** ** +** L O A D F I L E - Speicher reservieren, Datei von Disk lesen ** +** ** +** Parameter : D0.L : DiskAdresse (Disk/Track/Offset) der Datei ** +** ** +** Resultat : D0.L : Adresse des Files, 0 if error ** +** Z-Bit: gelöscht wenn OK, gesetzt wenn Error ** +** ** +************************************************************************** + +LoadFileFunc: movem.l d1/a0-a1,-(SP) + moveq #DPF_REPLYBYTE|DPF_ALLOCMEM,d1 ; Packet Flags + bra.s DoLoadFile ; ---> + +LoadFastFileFunc: + movem.l d1/a0-a1,-(SP) + moveq #DPF_REPLYBYTE|DPF_ALLOCFASTMEM,d1 ; Packet Flags + ;; bra.s DoLoadFile ; ---> + +DoLoadFile: lea -dp_SIZEOF-2(SP),SP ; DiskPacket erstellen + movea.l SP,a0 ; A0 : Packet + lea dp_SIZEOF(SP),a1 ; A1 : End-Flag + move.l d0,dp_FileName(a0) + clr.b (a1) ; End-Flag löschen + move.l a1,dp_Reply(a0) + move.b d1,dp_Flags(a0) ; ReplyType & MemoryType + bsr.s SendPacketFunc +1$: tst.b (a1) ; Warten bis File geladen! + beq.s 1$ + move.l dp_Address(SP),d0 ; Resultat: Adresse + lea dp_SIZEOF+2(SP),SP ; Doesn't change CCR + movem.l (SP)+,d1/a0-a1 + rts + + +************************************************************************** +** ** +** S E N D P A C K E T - Asynchronen Read-Request aufgeben ** +** ** +** Parameter : A0.L : Zeiger auf struct DiskPacket ** +** ** +** Resultat : nix ** +** ** +************************************************************************** + +SendPacketFunc: movem.l d7/a0-a1/a4-a5,-(SP) + movea.l a0,a1 ; Packet + lea meb_DiskList(a6),a0 + jsr meb_AddTail(a6) ; Packet anhängen + bsr.s ProcessNextRequest ; System ankicken + movem.l (SP)+,d7/a0-a1/a4-a5 + rts + + +************************************************************************** + + *** Nächsten Request aus Diskliste verarbeiten + +ProcessNextRequest: + movem.l d0-d7/a0-a5,-(SP) + + lea meb_DiskList(a6),a0 + jsr meb_RemHead(a6) ; setzt CCR + beq .EndProcReq ; Kein Request pending ---> + movea.l d0,a2 ; A2 : Aktuelles Packet + + *** "Loading 'filename' (flags)" auf Debug-Konsole ausgeben + + moveq #0,d0 + move.b dp_Flags(a2),d0 + move.w d0,-(SP) + move.l dp_FileName(a2),-(SP) + pea LoadingFmt(PC) + bsr _RawPrintfFunc + lea 10(SP),SP + + *** Packet bearbeiten + + movea.l a6,a5 ; A5 : MyExecBase + + movea.l dp_FileName(a2),a0 + bsr @CheckFile + move.l d0,d2 ; D2 : File-Länge + move.l d2,-(SP) + bne 1$ ; OK --> + pea NotFoundText(PC) + bsr _RawPrintfFunc + addq.w #4,SP + bra .Error +1$ + btst.b #DPB_ALLOCMEM,dp_Flags(a2) ; CHIP-Alloc gewünscht ? + beq.s .NoChipAlloc ; nein ---> + move.l d2,d0 ; File-Länge + movea.l a5,a6 ; MyExecBase + jsr meb_AllocMem(a6) + bra.s .AllocCont ; ---> +.NoChipAlloc: + btst.b #DPB_ALLOCFASTMEM,dp_Flags(a2) ; FAST-Alloc gewünscht? + beq.s .NoFastAlloc ; nein ---> + move.l d2,d0 ; File-Länge + movea.l a5,a6 ; MyExecBase + jsr meb_AllocFastMem(a6) +.AllocCont: move.l d0,dp_Address(a2) ; Adresse ins Packet +.NoFastAlloc: + + move.l dp_FileName(a2),d1 + move.l #MODE_OLDFILE,d2 + movea.l _DOSBase,a6 + JSRLIB Open + move.l d0,d7 + bne.s 2$ + + movea.l dp_FileName(a2),a0 + lea df0buf,a1 +.copy: move.b (a0)+,(a1)+ + bne.s .copy + + move.l #buf,d1 + JSRLIB Open + move.l d0,d7 + beq.s .Error +2$ + move.l d7,d1 + move.l dp_Address(a2),d2 + move.l #10000000,d3 + JSRLIB Read + + move.l d0,-(SP) + pea BytesFmt(PC) + bsr _RawPrintfFunc + lea 8(SP),SP + + move.l d7,d1 + JSRLIB Close + + movea.l a2,a0 + movea.l a5,a6 ; MyExecBase + bsr.s ReplyPacket ; Packet (A0) beantworten + +.EndProcReq: movem.l (SP)+,d0-d7/a0-a5 + rts + +.Error: movea.l a5,a6 ; MyExecBase + jmp meb_ColdReboot(a6) ; Raus hier! + + +*************************************************************************** + + *** Packet (A0) beantworten + +ReplyPacket: movem.l a0-a2,-(SP) + movea.l a0,a2 ; A2 : Packet + movea.l dp_Reply(a2),a1 ; A1 : User's Reply-Adresse + + *** Text ausgeben + + move.l dp_Address(a2),-(SP) + pea LoadedFmt(PC) + bsr _RawPrintfFunc + lea 8(SP),SP + + IFD CRUNCH + bclr.b #DPB_CRUNCHED,dp_Flags(a2) + beq.s 1$ + movea.l dp_Address(a2),a0 ; A0 : Decrunch-Start + move.l dp_FileSize(a2),d0 ; D0 : File-Länge gecruncht + move.l (a0),dp_FileSize(a2) ; Echte Länge für User + bsr PPDecrunch +1$: + ENDC + btst.b #DPB_REPLYHANDLER,dp_Flags(a2) + beq.s 2$ + movea.l a2,a0 ; A0 : Packet für User + jsr (a1) ; ReplyHandler aufrufen + bra.s 99$ ; ---> +2$: + btst.b #DPB_REPLYBYTE,dp_Flags(a2) + beq.s 3$ + st.b (a1) ; ReplyByte setzen + ;; bra.s 99$ ; ---> +3$: +99$: movem.l (SP)+,a0-a2 + rts + +************************************************************************** +** ** +** W R I T E F I L E - Existierende 'Datei' auf Disk überschreiben ** +** ** +** Parameter : D0.L : FN_-Konstante (von DiskMaker erzeugt) ** +** A0.L : Adresse der Daten für das File ** +** ** +************************************************************************** + +WriteFileFunc: rts + + +************************************************************************** +* D A T E N (auch im CODE-Segment wegen PC-relativ) * +************************************************************************** + +InsertDiskRoutine: ds.l 1 ; User's InsertDisk handler + + +LoadingFmt: dc.b "Loading '%s' (flags=$%02x) ... ",0 +BytesFmt: dc.b "%ld bytes ",0 +LoadedFmt: dc.b "at $%08lx",10,13,0 +NotFoundText: dc.b "file not found",10,13,0 + +buf: dc.b "DF0:" +df0buf: ds.b 64 + + END -- cgit v1.2.3