summaryrefslogtreecommitdiff
path: root/FileIO.S
diff options
context:
space:
mode:
authorChristian A. Weber <chris@gna.ch>2020-06-27 02:17:36 +0200
committerChristian A. Weber <chris@gna.ch>2020-06-27 02:17:36 +0200
commitda0299fc11263c63bf48d4d525718c2a58bec78a (patch)
tree304784c320f6d197bc2a6e054886df4d08874080 /FileIO.S
parente70f34444ab59e8a2e1ebc9d52dc5ce09827f64c (diff)
downloadgameexec-da0299fc11263c63bf48d4d525718c2a58bec78a.tar.gz
gameexec-da0299fc11263c63bf48d4d525718c2a58bec78a.tar.bz2
gameexec-da0299fc11263c63bf48d4d525718c2a58bec78a.zip
ReadFile, WriteFile, LoadFile Copy-Paste von SysCDisk und CDisk in FileIO ausgelagert
Diffstat (limited to 'FileIO.S')
-rw-r--r--FileIO.S170
1 files changed, 170 insertions, 0 deletions
diff --git a/FileIO.S b/FileIO.S
new file mode 100644
index 0000000..74cd21b
--- /dev/null
+++ b/FileIO.S
@@ -0,0 +1,170 @@
+
+ IDNT FileIO
+ SECTION text,CODE
+
+
+ INCLUDE "MyExec.i"
+
+ XREF ProcessNextRequest
+
+ IFND SYSTEM
+ XREF GetD7A4A5
+ ENDC
+
+ IFD RAMVERSION
+ XREF ProcessFFSPacket ; Für ramdrive.device
+ ENDC
+
+ 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
+
+ XDEF ReplyPacket ; Internal helper for CDisk.S/SysCDisk.S
+
+
+
+***************************************************************************
+** **
+** R E A D F I L E - Datei von Disk an angegebene Adresse laden **
+** **
+** Parameter : D0.L : DiskAdresse (Disk/Track/Offset) der Datei **
+** A0.L : Ladeadresse **
+** **
+** Resultat : nix **
+** **
+***************************************************************************
+
+ReadFileFunc: movem.l d1/a0-a1,-(SP)
+ moveq #0|DPF_REPLYBYTE,d1 ; LESEN
+ bra.s APost ; Paket aufgeben
+
+
+***************************************************************************
+** **
+** W R I T E F I L E - Existierende 'Datei' auf Disk überschreiben **
+** **
+** Parameter : D0.L : DiskAdresse (Disk/Track/Offset) der Datei **
+** A0.L : Adresse der Daten für das File **
+** **
+** Resultat : nix **
+** **
+***************************************************************************
+
+WriteFileFunc: movem.l d1/a0-a1,-(SP)
+ move.b #DPF_WRITE|DPF_REPLYBYTE,d1 ; SCHREIBEN
+ bra.s APost ; Paket aufgeben
+
+
+***************************************************************************
+** **
+** 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 APost ; Paket aufgeben
+
+LoadFastFileFunc:
+ movem.l d1/a0-a1,-(SP)
+ moveq #DPF_REPLYBYTE|DPF_ALLOCFASTMEM,d1 ; Packet Flags
+ ;; bra.s APost ; Paket aufgeben
+
+APost: lea -dp_SIZEOF-2(SP),SP ; DiskPacket erstellen
+ move.l a0,dp_Address(SP) ; Ladeadresse eintragen
+ movea.l SP,a0 ; A0 : Packet
+ move.l d0,dp_FileName(a0) ; Dateinamen eintragen
+ lea dp_SIZEOF(SP),a1 ; A1 : End-Flag
+ clr.b (a1) ; löschen
+ move.l a1,dp_Reply(a0)
+ move.b d1,dp_Flags(a0) ; DPF_REPLYBYTE [|DPF_WRITE] usw.
+ bsr SendPacketFunc
+1$:
+ SMSG <"Waiting ...">
+ tst.b (a1) ; Warten bis File geladen/geschrieben
+ beq.s 1$
+ move.l dp_Address(SP),d0 ; Resultat: Adresse
+ lea dp_SIZEOF+2(SP),SP ; DiskPacket freigeben
+ SMSG <"LoadFile done">
+ 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:
+ IFD SYSTEM
+ movem.l a0-a1,-(SP)
+ ELSE
+ movem.l d7/a0-a1/a4-a5,-(SP)
+ bsr GetD7A4A5 ; Für ProcessNextRequest() in CDisk.S (nicht in SysCDisk.S)
+ ENDC
+ movea.l a0,a1 ; Packet
+ lea meb_DiskList(a6),a0
+ jsr meb_AddTail(a6) ; Packet anhängen
+ bsr ProcessNextRequest ; System ankicken
+ IFD SYSTEM
+ movem.l (SP)+,a0-a1
+ ELSE
+ movem.l (SP)+,d7/a0-a1/a4-a5
+ ENDC
+ rts
+
+
+***************************************************************************
+
+ *** Packet (A0) beantworten
+
+ReplyPacket: movem.l d0/a0-a2,-(SP)
+ movea.l a0,a2 ; A2 : Packet
+ moveq #0,d0
+ move.b dp_Flags(a2),d0
+
+ ;;; SMSG <"ReplyPacket($%08lx), flags=$%02ld">,a2,d0
+
+ IFD CRUNCH
+ btst #DPB_CRUNCHED,d0
+ beq.s 1$
+ movea.l dp_Address(a2),a0 ; A0 : Start der gecrunchten Daten
+ move.l dp_FileSize(a2),d0 ; D0 : File-Länge gecruncht
+ move.l (a0),dp_FileSize(a2) ; Echte Länge für User
+ SMSG <"Decrunching %ld to %ld bytes at $%08lx">,d0,(a0),a0
+ bsr PPDecrunch ; File decrunchen
+1$:
+ ENDC
+ movea.l dp_Reply(a2),a1 ; A1 : User's Reply-Adresse
+ btst #DPB_REPLYHANDLER,d0
+ beq.s 2$
+ SMSG <"Calling reply handler $%08lx">,a1
+ movea.l a2,a0 ; A0 : Packet für User
+ jsr (a1) ; ReplyHandler aufrufen
+ bra.s 99$ ; --->
+2$:
+ btst #DPB_REPLYBYTE,d0
+ beq.s 3$
+ SMSG <"Setting reply byte $%08lx">,a1
+ st.b (a1) ; ReplyByte setzen
+ ;; bra.s 99$ ; --->
+3$:
+99$: movem.l (SP)+,d0/a0-a2
+ rts
+
+
+ END