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