GophHub - zajo/appler/src/PHISFLOP.INC


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.