summaryrefslogtreecommitdiff
path: root/FileIO.S
blob: 291294c35fbcff8920c9d59c8bc4633055e1ad2a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167

		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$:
		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
		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$
		st.b	(a1)			; ReplyByte setzen
	;;	bra.s	99$			; --->
3$:
99$:		movem.l	(SP)+,d0/a0-a2
		rts


		END