Raw File
1 ; _____________________________________________
2 ; | |
3 ; | Project: APPLER |
4 ; | File: PHISFLOP.ASM |
5 ; | Compiler: 16-bit TASM (2.5) |
6 ; | |
7 ; | Subject: Phisical Floppy Emulation |
8 ; | |
9 ; | Author: Alexander Patalenski |
10 ; |_____________________________________________|
11
12 ; This file is included in EMULATE.ASM
13
14 ;-------------- Phisical Floppy emulation entries ------------------------------
15
16 assume CS:Emulate,DS:Apple,ES:Video,SS:Data
17
18 UseNextFreeSpace
19 C0D0r:
20 C0D1r:
21 C0D2r:
22 C0D3r:
23 C0D4r:
24 C0D5r:
25 C0D6r:
26 C0D7r: push cs
27 push di
28 jmp ChangePhase
29 C0D0w:
30 C0D1w:
31 C0D2w:
32 C0D3w:
33 C0D4w:
34 C0D5w:
35 C0D6w:
36 C0D7w: Save ax
37 call ChangePhase
38 Restore ax
39 sahf
40 DoNext
41
42 C0D8r: push cs
43 push di
44 jmp MotorOFF
45 C0D8w: Save ax
46 call MotorOFF
47 Restore ax
48 sahf
49 DoNext
50
51 C0D9r: push cs
52 push di
53 jmp MotorON
54 C0D9w: Save ax
55 call MotorON
56 Restore ax
57 sahf
58 DoNext
59
60 C0DAr:
61 C0DBr: push cs
62 push di
63 jmp ChangeDrive
64 C0DAw:
65 C0DBw: Save ax
66 call ChangeDrive
67 Restore ax
68 sahf
69 DoNext
70 CheckAddress
71
72 UseNextFreeSpace
73 C0DCr: push cs
74 push di
75 jmp StrobeData
76 C0DCw: Save ax
77 call StrobeData
78 Restore ax
79 sahf
80 DoNext
81
82 C0DDr: mov al,0FFh
83 mov bl,ch
84 jmp di
85 C0DDw: Save ax
86 mov al,bh
87 call LatchData
88 Restore ax
89 sahf
90 DoNext
91
92 C0DEr: push cs
93 push di
94 call PF_ReadMode
95 jmp ReadWProtSwitch
96 C0DEw: Save ax
97 call PF_ReadMode
98 Restore ax
99 sahf
100 DoNext
101
102 C0DFr: push di
103 call PF_WriteMode
104 mov al,0FFh
105 ret
106 C0DFw: Save ax
107 call PF_WriteMode
108 Restore ax
109 sahf
110 DoNext
111 CheckAddress
112
113 ;-------------- Phisical Floppy emulation subroutines --------------------------
114
115 Peripher segment public
116 assume CS:Peripher,DS:Nothing,ES:Nothing
117
118 PF_Flags db 00000000b
119 even
120 PF_BufferPtr dw 0 ; Byte pointer in the R/W buffer
121 WriteLatch db 0 ; Write Latch register
122 even
123 PPort??8 dw 378h
124 PPort??A dw 37Ah
125
126
127 PhisFloppyINIT Proc near
128 mov dx,PPort??8
129 mov al,01100000b
130 out dx,al
131 ret
132 PhisFloppyINIT Endp
133
134 PhisFloppyTINI Proc near
135 mov dx,PPort??8
136 mov al,01100000b
137 out dx,al
138 ret
139 PhisFloppyTINI Endp
140
141 ResetPhisFloppy Proc near
142 call PF_ReadMode
143 mov al,0
144 call ChangeDrive
145 call MotorOFF
146 ret
147 ResetPhisFloppy Endp
148
149 even
150 MotorON Proc far
151 Save cx,dx
152 mov cx,seg MotorOFF_C
153 mov dx,offset MotorOFF_C
154 xor ax,ax
155 call TimerReq
156 or PF_Flags,00000011b
157 test PF_Flags,10000000b
158 jnz MotorON10
159 mov dx,PPort??8
160 in al,dx
161 and al,10111111b
162 out dx,al
163 MotorON10: Restore cx,dx
164 mov bl,ch
165 ret
166 MotorON Endp
167
168 even
169 MotorOFF Proc far
170 test PF_Flags,00000010b
171 jz MotorOFF10
172 and PF_Flags,11111101b
173 Save cx,dx
174 mov cx,seg MotorOFF_C
175 mov dx,offset MotorOFF_C
176 mov ax,MotorOffDelay
177 call TimerReq
178 Restore cx,dx
179 MotorOFF10: mov bl,ch
180 ret
181 MotorOFF_C: call PF_FlushBuffer
182 and PF_Flags,11111100b
183 mov bx,dx
184 mov dx,PPort??8
185 in al,dx
186 or al,01000000b
187 out dx,al
188 mov dx,bx
189 mov bl,ch
190 ret
191 MotorOFF Endp
192
193 even
194 ChangeDrive Proc far
195 ror al,1
196 xor al,PF_Flags
197 jns ChangeDrive10
198 xor PF_Flags,10000000b
199 test PF_Flags,00000001b
200 jz ChangeDrive10
201 mov bx,dx
202 mov dx,PPort??8
203 in al,dx
204 xor al,01000000b
205 out dx,al
206 mov dx,bx
207 ChangeDrive10: mov bl,ch
208 ret
209 ChangeDrive Endp
210
211 even
212 ChangePhase Proc far
213 call PF_FlushBuffer
214 and ax,111b
215 mov bx,ax
216 Save dx
217 mov dx,PPort??8
218 in al,dx
219 and al,ChangePhase_and[BX]
220 or al,ChangePhase_or [BX]
221 out dx,al
222 Restore dx
223 mov bl,ch
224 ret
225 ChangePhase_and db 11111101b,11111111b,11111011b,11111111b,11110111b,11111111b,11101111b,11111111b
226 ChangePhase_or db 00000000b,00000010b,00000000b,00000100b,00000000b,00001000b,00000000b,00010000b
227 ChangePhase Endp
228
229 even
230 PF_ReadMode Proc far
231 and PF_Flags,10111111b
232 mov bx,PF_BufferPtr
233 add bx,ReadAdd
234 cmp bx,TrackBufferLen
235 jb PF_ReadMode10
236 sub bx,TrackBufferLen
237 PF_ReadMode10: mov PF_BufferPtr,bx
238 mov WriteCNT,0
239 mov bl,ch
240 ret
241 PF_ReadMode Endp
242
243 even
244 PF_WriteMode Proc far
245 or PF_Flags,01000000b
246 mov bx,PF_BufferPtr
247 add bx,WriteAdd
248 cmp bx,TrackBufferLen
249 jb PF_WriteMode10
250 sub bx,TrackBufferLen
251 PF_WriteMode10: mov PF_BufferPtr,bx
252 test PF_Flags,00000100b
253 jnz PF_WriteMode20
254 mov PF_BufferPtr,0
255 or PF_Flags,00010100b
256 PF_WriteMode20: or PF_Flags,00001000b
257 mov bl,ch
258 ret
259 PF_WriteMode Endp
260
261 even
262 StrobeData Proc far
263 mov ah,PF_Flags
264 test ah,01000000b
265 jnz StrobeData40
266 test ah,00000100b
267 jnz StrobeData10
268 call PF_LoadBuffer
269 mov PF_BufferPtr,0
270 mov ah,PF_Flags
271 StrobeData10: mov bx,PF_BufferPtr
272 mov al,PF_TrackBuffer[bx]
273 test ah,00000001b
274 jz StrobeData30
275 inc bx
276 cmp bx,TrackBufferLen
277 jb StrobeData20
278 xor bx,bx
279 and PF_Flags,11111011b
280 StrobeData20: mov PF_BufferPtr,bx
281 StrobeData30: mov bl,ch
282 ret
283 StrobeData40: test ah,00000001b
284 jz StrobeData60
285 mov bx,PF_BufferPtr
286 mov al,WriteLatch
287 mov PF_TrackBuffer[bx],al
288 inc bx
289 cmp bx,TrackBufferLen
290 jb StrobeData50
291 xor bx,bx
292 StrobeData50: mov PF_BufferPtr,bx
293 mov bx,WriteCNT
294 inc bx
295 mov WriteCNT,bx
296 cmp bx,FormatLimit
297 jb StrobeData60
298 or PF_Flags,00010000b
299 StrobeData60: mov bl,ch
300 ret
301 StrobeData Endp
302
303 even
304 LatchData Proc far
305 mov WriteLatch,al
306 mov bl,ch
307 ret
308 LatchData Endp
309
310 even
311 ReadWProtSwitch Proc far
312 mov bx,dx
313 mov dx,PPort??A
314 in al,dx
315 mov dx,bx
316 shr al,1
317 sbb al,al
318 mov bl,ch
319 ret
320 ReadWProtSwitch Endp
321
322
323 TimerPort = 40h
324 TimerStep = 3818 ; round((4*8*1.19318)*100h)
325 MaxWaitCount = 100
326 TimerCounter dw 0
327 WaitCount dw 23
328
329 PF_LoadBuffer Proc near ; Saves all registers
330 SaveAll
331 pushf
332 cli
333 cld
334 mov ax,Apple
335 mov ds,ax
336 xor ax,ax
337 mov al,DS:[0C0DDh]
338 mov WaitCount,ax
339 mov ax,cs
340 mov ds,ax
341 mov es,ax
342 mov di,offset PF_TrackBuffer
343 mov dx,PPort??8
344 mov al,14h
345 out 43h,al
346 xor ax,ax
347 out TimerPort,al
348 mov TimerCounter,ax
349 @@05: Save di
350 mov bx,7
351 @@10: in al,dx
352 or al,al
353 jns @@10
354 jmp @@15
355 @@15: mov di,offset StosBuffer
356 mov cx,WaitCount
357 rep stosb
358 @@20: in al,dx
359 shl ax,1
360 dec bx
361 jnz @@15
362 Restore di
363 mov al,ah
364 or al,80h
365 stosb
366 cmp di,offset PF_TrackBuffer+TrackBufferLen
367 jb @@05
368 popf
369 RestoreAll
370 or PF_Flags,00000100b
371 and PF_Flags,11100111b
372 ret
373 PF_LoadBuffer Endp
374
375 PF_FlushBuffer Proc near ; Saves all registers
376 test PF_Flags,00011000b
377 jz PF_FBExit
378
379 ; Write Track
380
381 PF_FBExit: and PF_Flags,11111011b
382 ret
383 PF_FlushBuffer Endp
384
385
386 PF_TrackBuffer db TrackBufferLen dup(0)
387 StosBuffer db MaxWaitCount dup(0)
388
389 Peripher Ends
390
Generated by GNU Enscript 1.6.6, and GophHub 1.3.