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
|