home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 25 / CD_ASCQ_25_1095.iso / dos / prg / cpe50 / fdc.asm < prev    next >
Assembly Source File  |  1995-08-29  |  16KB  |  842 lines

  1.  ; ********************************************* FDC emulation
  2.  
  3.     IDEAL
  4.     INCLUDE "cpe2\macros.inc"
  5.  
  6. EXTRN UnpackArea:PROC,PackArea:PROC
  7.  
  8. EXTRN srF:WORD
  9.  
  10. EXTRN dradir:BYTE,draname:BYTE,mvadir:BYTE,mvaname:BYTE
  11. PUBLIC outFA,outFB,inpFB,OpenDriveA,CloseDisk,DiskChange,dcstat,fha
  12. PUBLIC DiskBuf,thistrack
  13.  
  14. P386
  15.  
  16. GROUP   DGROUP _stack,_data
  17.  
  18. SEGMENT _text PAGE PUBLIC 'CODE'
  19. ASSUME CS:_text
  20. ASSUME DS:DGROUP
  21.  
  22. CloseDisk:
  23.     PUSHAD
  24.     MOV     BX,[fha]
  25.     CMP     BX,0ffffh
  26.     JE      CLDS_NoDiskFile
  27.     MOV     AH,3Eh
  28.     INT     21h
  29. CLDS_NoDiskFile:
  30.     POPAD
  31.     RET
  32.  
  33. OpenDriveA:
  34.     PUSH    ES
  35.     PUSHAD
  36.     CALL    CloseDisk
  37.     MOV     [diskchange],0
  38.     MOV     DX,OFFSET dradir
  39.     MOV     AX,3d02h
  40.     INT     21h
  41.     JC      ODRA_CheckMV
  42.     MOV     [fha],AX
  43.     MOV     BX,AX
  44.     MOV     AX,3f00h
  45.     MOV     CX,9
  46.     MOV     DX,OFFSET DiskType
  47.     INT     21h
  48.     CMP     [DWORD PTR DiskType+4],'KSID' ; recognized: NORMDISK and CRUXDISK
  49.     JNE     ODRA_Fault
  50.     CMP     [DWORD PTR DiskType],'MRON'
  51.     JE      ODRA_AllOK
  52.     CMP     [DWORD PTR DiskType],'XURC'
  53.     JNE     ODRA_Fault
  54. ODRA_AllOK:
  55.     MOV     [dcstat],0
  56.     MOV     [dcbytecnt],0
  57.     MOV     [dccommand],0
  58.     CALL    DCSeekCurr
  59.     JMP     ODRA_End
  60. ODRA_CheckMV:
  61.     MOV     EAX,[DWORD PTR draname]
  62.     MOV     [DWORD PTR mvaname],EAX
  63.     MOV     EAX,[DWORD PTR draname+4]
  64.     MOV     [DWORD PTR mvaname+4],EAX
  65.     MOV     EAX,[DWORD PTR draname+8]
  66.     MOV     [DWORD PTR mvaname+8],EAX
  67.     XOR     EDI,EDI
  68.     MOV     DI,OFFSET mvaname
  69.     PUSH    DS
  70.     POP     ES
  71.     MOV     CX,12
  72.     MOV     AL,'.'
  73.     REPNE   SCASB
  74.     MOV     [DWORD PTR EDI-1],'KSD.'
  75.     MOV     DX,OFFSET mvadir
  76.     MOV     AX,3d02h
  77.     INT     21h
  78.     JC      ODRA_Fault
  79.     MOV     [fha],AX
  80.     MOV     BX,AX
  81.     MOV     AX,3f00h
  82.     MOV     CX,4
  83.     MOV     DX,OFFSET DiskType
  84.     INT     21h
  85.     CMP     [DWORD PTR DiskType],'- VM' ; recognize MV - CPCEMU Disk-File
  86.     JNE     ODRA_Fault
  87.     MOV     AX,3f00h
  88.     MOV     CX,252
  89.     MOV     DX,OFFSET DiskBuf+4
  90.     INT     21h
  91.     MOV     AX,[WORD PTR DiskBuf+032h]
  92.     MOV     [tracklen],AX
  93.     MOV     AL,[BYTE PTR DiskBuf+030h]
  94.     MOV     [BYTE PTR DiskType+8],AL
  95.     JMP     ODRA_AllOK
  96. ODRA_Fault:
  97.     MOV     [fha],0ffffh
  98. ODRA_End:
  99.     POPAD
  100.     POP     ES
  101.     RET
  102.  
  103. CorrectParms:
  104.     AND     [BYTE PTR dccmdparms],1
  105.     PUSH    AX
  106.     MOV     AL,[BYTE PTR dccmdparms]
  107.     MOV     [dccurrdrive],AL
  108.     POP     AX
  109.     RET
  110.  
  111. DCSetStatusRegs:
  112.     PUSH    AX
  113.     MOV     AL,[dccurrdrive]
  114.     AND     AL,3
  115.     MOV     [DCsReg0],AL
  116.     MOV     [DCsReg1],0
  117.     MOV     [DCsReg2],0
  118.     MOV     [DCsReg3],AL
  119.     OR      [DCsReg3],20h
  120.     CMP     [dccurrdrive],0
  121.     JNE     DCSSR_NotDriveA
  122.     TEST    [dcfaxx],1
  123.     JZ      DCSSR_NotDriveA
  124.     CMP     [fha],0ffffh
  125.     JNE     DCSSR_DiskInDrive
  126. DCSSR_NotDriveA:
  127.     OR      [DCsReg0],0c8h
  128.     XOR     [DCsReg3],20h
  129. DCSSR_DiskInDrive:
  130.     CMP     [CurrTrack],0
  131.     JNE     DCSSR_NotTrack0
  132.     OR      [DCsReg3],10h
  133. DCSSR_NotTrack0:
  134.     CMP     [tracktoohi],0
  135.     JE      DCSSR_TrackOK
  136.     OR      [DCsReg0],0c0h
  137. DCSSR_TrackOK:
  138.     POP     AX
  139.     RET
  140.  
  141. DCRecalibrate:
  142.     RET
  143.  
  144. DCGetInfo:
  145.     CALL    CorrectParms
  146.     CMP     [BYTE PTR dccmdparms],0
  147.     JNE     DC_WrongDrive
  148.     PUSH    AX
  149.     MOV     [dcdata],0
  150.     MOV     AL,[DCsReg3]
  151.     MOV     [BYTE PTR dcdata],AL
  152. DCGI_End:
  153.     POP     AX
  154.     RET
  155.  
  156. DCGetTrack:
  157.     CALL    CorrectParms
  158.     CMP     [lastfdcmd],8
  159.     JE      DCGT_Return80
  160.     CMP     [BYTE PTR dccmdparms],0
  161.     JNE     DC_WrongDrive
  162.     PUSH    AX
  163.     MOV     AH,[CurrTrack]
  164.     MOV     [BYTE PTR dcdata+1],AH
  165.     MOV     AH,[DCsReg0]
  166.     MOV     [BYTE PTR dcdata],AH
  167.     MOV     [DCsReg0],80h
  168.     POP     AX
  169.     RET
  170. DCGT_Return80:
  171.     MOV     [dcdata],80h
  172.     MOV     [dcbytecnt],1
  173.     RET
  174.  
  175. DCSeek0:
  176.     CALL    CorrectParms
  177.     CMP     [BYTE PTR dccmdparms],0
  178.     MOV     [DCsReg0],20h
  179.     JNE     DC_WrongDrive
  180.     PUSHAD
  181.     MOV     AH,[BYTE PTR dccmdparms]
  182.     MOV     [dccurrdrive],AH
  183.     CALL    DCSetStatusRegs
  184.     OR      [DCsReg0],20h
  185.     CMP     [dccurrdrive],0
  186.     JNE     DCS0_End
  187.     MOV     [CurrTrack],0
  188.     CALL    DCSeekCurr
  189. DCS0_End:
  190.     POPAD
  191.     RET
  192.  
  193. DCWrite:
  194.     CALL    CorrectParms
  195.     CMP     [BYTE PTR dccmdparms],0
  196.     JNE     DC_WrongDrive
  197.     MOV     [dccommand],OFFSET Writecmd
  198.     MOV     [dccppt],OFFSET DiskBuf
  199.     MOV     [dcbytecnt],512
  200.     MOV     [dcstat],1
  201.     MOV     [wrinprogr],1
  202.     RET
  203.  
  204. DCWritectd:
  205.     PUSHAD
  206.     MOV     [wrinprogr],0
  207.     MOV     [dcextdata],0
  208.     MOV     [dcdpt],OFFSET dcdata
  209.     MOV     AH,[BYTE PTR dccmdparms]
  210.     MOV     [dccurrdrive],AH
  211.     CALL    DCSetStatusRegs
  212.     MOV     AH,[DCsReg0]
  213.     MOV     [BYTE PTR dcdata],AH
  214.     MOV     AH,[DCsReg1]
  215.     MOV     [BYTE PTR dcdata+1],AH
  216.     MOV     AH,[DCsReg2]
  217.     MOV     [BYTE PTR dcdata+2],AH
  218.     MOV     AH,[CurrTrack]
  219.     MOV     [BYTE PTR dcdata+3],AH
  220.     MOV     [BYTE PTR dcdata+4],0
  221.     MOV     AH,[BYTE PTR dccmdparms+3]
  222.  
  223.     CMP     [DWORD PTR DiskType],'XURC'
  224.     JE      DCWR_Writeprotected
  225.     CMP     [DWORD PTR DiskType],'- VM'
  226.     JE      DCWR_Writeprotected
  227.     TEST    [DCsReg0],0c0h
  228.     JNZ     DCWR_Erreur
  229.     CMP     [fha],0ffffh
  230.     JE      DCWR_Erreur
  231.     MOV     BP,0
  232. DCWR_WriteLoop:
  233.     MOV     [BYTE PTR dcdata+5],AH
  234.     PUSH    AX
  235.     MOV     CX,[trackoffshi]
  236.     MOV     DX,[trackoffslo]
  237.     MOV     BX,[fha]
  238.     MOV     AX,4200h
  239.     INT     21h                     ; seek track start
  240.     MOV     SI,OFFSET idfield
  241.     XOR     BX,BX
  242.     POP     AX
  243. DCWR_Loop1:
  244.     CMP     [BYTE PTR SI],255
  245.     JE      DCWR_Erreur
  246.     CMP     [SI],AH
  247.     JE      DCWR_found
  248.     ADD     BX,512
  249.     INC     SI
  250.     JMP     DCWR_Loop1
  251. DCWR_found:
  252.     PUSH    SI
  253.     MOV     CX,512
  254.     PUSH    ES
  255.     PUSH    DS
  256.     POP     ES
  257.     MOV     DI,BX
  258.     ADD     DI,OFFSET thistrack
  259.     MOV     SI,OFFSET DiskBuf
  260.     ADD     SI,BP
  261.     REP     MOVSB
  262.     POP     ES
  263.     POP     SI
  264.  
  265.     CMP     AH,[BYTE PTR dccmdparms+5]
  266.     JE      DCWR_AllWritten
  267.     INC     AH
  268.     ADD     BP,512
  269.     JMP     DCWR_WriteLoop
  270. DCWR_AllWritten:
  271.     MOV     BX,[fha]
  272.     MOV     DX,OFFSET thistrack
  273.     MOV     AX,4000h
  274.     MOV     CX,5120
  275.     INT     21h
  276. DCWR_DontWrite:
  277.     POPAD
  278.     RET
  279. DCWR_Erreur:
  280.     OR      [BYTE PTR dcdata+1],4
  281.     JMP     DCWR_DontWrite
  282. DCWR_Writeprotected:
  283.     OR      [dcdata],0C0h
  284.     OR      [dcdata+1],2
  285.     JMP     DCWR_DontWrite
  286.  
  287. DCReadSec:
  288.     CALL    CorrectParms
  289.     CMP     [BYTE PTR dccmdparms],0
  290.     JNE     DC_WrongDrive
  291.     PUSHAD
  292.     MOV     AH,[BYTE PTR dccmdparms]
  293.     MOV     [dccurrdrive],AH
  294.     CALL    DCSetStatusRegs
  295.     MOV     AH,[DCsReg0]
  296.     MOV     [BYTE PTR dcdata],AH
  297.     MOV     AH,[DCsReg1]
  298.     MOV     [BYTE PTR dcdata+1],AH
  299.     MOV     AH,[DCsReg2]
  300.     MOV     [BYTE PTR dcdata+2],AH
  301.     MOV     BP,0
  302.     MOV     AH,[BYTE PTR dccmdparms+3]
  303.  
  304.     TEST    [DCsReg0],0c0h
  305.     JNZ     DCRS_AllRead
  306.     CMP     [fha],0ffffh
  307.     JE      DCRS_AllRead
  308. DCRS_ReadLoop:
  309.     MOV     [BYTE PTR dcdata+5],AH
  310.     PUSH    AX
  311.     MOV     BX,OFFSET thistrack
  312.     MOV     SI,OFFSET idfield
  313.     POP     AX
  314. DCRS_Loop1:
  315.     CMP     [BYTE PTR SI],255
  316.     JE      DCRS_Erreur
  317.     CMP     [SI],AH
  318.     JE      DCRS_found
  319.     ADD     BX,512
  320.     INC     SI
  321.     JMP     DCRS_Loop1
  322. DCRS_found:
  323.     INC     SI
  324.     PUSH    SI
  325.     PUSH    AX
  326.     MOV     CX,512
  327.     MOV     SI,BX
  328.     MOV     DI,OFFSET DiskBuf
  329.     ADD     DI,BP
  330.     PUSH    ES
  331.     PUSH    DS
  332.     POP     ES
  333.     REP     MOVSB
  334.     POP     ES
  335.     POP     AX
  336.     POP     SI
  337.     MOV     CX,0
  338.     MOV     DX,0
  339.     ADD     BP,512
  340.     CMP     [BYTE PTR dccmdparms+5],AH
  341.     JE      DCRS_AllRead
  342.     INC     AH
  343.     JMP     DCRS_ReadLoop
  344.  
  345. DCRS_AllRead:
  346.  
  347.     MOV     [dcextdata],BP
  348.     MOV     BP,OFFSET DiskBuf
  349.     MOV     [dcedp],BP
  350. DCRS_Ret:
  351.     POPAD
  352.     RET
  353.  
  354. DCRS_Erreur:
  355.     OR      [BYTE PTR dcdata+1],4
  356.     JMP     DCRS_AllRead
  357.  
  358. DCSeek:
  359.     CALL    CorrectParms
  360.     CMP     [BYTE PTR dccmdparms],0
  361.     MOV     [DCsReg0],32
  362.     JNE     DC_WrongDrive
  363.     PUSHAD
  364.     MOV     AH,[BYTE PTR dccmdparms]
  365.     MOV     [dccurrdrive],AH
  366.     CMP     [dccurrdrive],0
  367.     JNE     DCSeekEnd
  368.     MOV     AH,[BYTE PTR dccmdparms+1]
  369.     MOV     [CurrTrack],AH
  370.     CALL    DCSetStatusRegs
  371.  
  372.     OR      [DCsReg0],32                    ; seek completed
  373.     CALL    DCSeekCurr
  374. DCSeekEnd:
  375.     POPAD
  376.     RET
  377.  
  378. DCGetID:
  379.     CALL    CorrectParms
  380.     CMP     [BYTE PTR dccmdparms],0
  381.     JNE     DC_WrongDrive
  382.     PUSHAD
  383.     MOV     AH,[BYTE PTR dccmdparms]
  384.     MOV     [dccurrdrive],AH
  385.     CALL    DCSetStatusRegs
  386.     TEST    [DCsReg0],0c0h
  387.     JNZ     DCGI_OK
  388.     MOV     BP,OFFSET dcdata
  389.     MOV     EAX,0
  390.     MOV     [BP],EAX
  391.     MOV     AL,[CurrTrack]
  392.     MOV     [BP+3],AL
  393.     ADD     BP,4
  394.     MOV     sFree,[IDTPtr]
  395.     MOV     AH,[sFree]
  396.     MOV     BL,[sFree+66]
  397.     INC     sFree
  398.     CMP     AH,0FFh
  399.     JNE     DCGI_Wback
  400.     MOV     sFree,OFFSET idfield
  401.     MOV     AH,[sFree]
  402.     MOV     BL,[sFree+66]
  403.     INC     sFree
  404. DCGI_Wback:
  405.     MOV     [IDTPtr],sFree
  406.     XOR     AL,AL
  407.     MOV     [BP],AX
  408.     MOV     [BP+2],BL
  409.    ;    CMP     [fha],0ffffh
  410.    ;    JNE     DCGI_OK
  411.    ;    MOV     [BYTE PTR dcdata],32
  412. DCGI_OK:
  413.     MOV     AH,[DCsReg0]
  414.     MOV     [BYTE PTR dcdata],AH
  415.     MOV     AH,[DCsReg1]
  416.     MOV     [BYTE PTR dcdata+1],AH
  417.     MOV     AH,[DCsReg2]
  418.     MOV     [BYTE PTR dcdata+2],AH
  419.  
  420.     POPAD
  421.     RET
  422.  
  423. DCSeekCurr:
  424.     MOV     [IDTPtr],OFFSET idfield
  425.     CMP     [DWORD PTR DiskType],'XURC'
  426.     JE      DCSC_Packed
  427.     CMP     [DWORD PTR DiskType],'- VM'
  428.     JE      DCSC_MV
  429.  
  430.     PUSHAD
  431.     MOV     EAX,0
  432.     MOV     AL,[CurrTrack]
  433.     CMP     AL,[DiskType+8]
  434.     JC      DCSC_TrackOK
  435.     MOV     [tracktoohi],1
  436.     JMP     DCSC_End
  437. DCSC_TrackOK:
  438.     MOV     [tracktoohi],0
  439.     MOV     EBX,5252
  440.     MUL     EBX
  441.     ADD     EAX,9
  442.     PUSH    EAX
  443.     ROL     EAX,16
  444.     MOV     CX,AX
  445.     ROL     EAX,16
  446.     MOV     DX,AX
  447.     MOV     EAX,4200h
  448.     MOV     BX,[fha]
  449.     CMP     BX,0ffffh
  450.     JE      DCSC_End
  451.     INT     21h
  452.     MOV     BX,[fha]
  453.     MOV     AX,3f00h
  454.     MOV     DX,OFFSET idfield
  455.     MOV     CX,132
  456.     INT     21h
  457.     MOV     AX,3f00h
  458.     MOV     DX,OFFSET thistrack
  459.     MOV     CX,5120
  460.     INT     21h
  461.     POP     EAX
  462.     ADD     EAX,132
  463.     ROL     EAX,16
  464.     MOV     CX,AX
  465.     ROL     EAX,16
  466.     MOV     DX,AX
  467.     MOV     [trackoffslo],DX
  468.     MOV     [trackoffshi],CX
  469. DCSC_End:
  470.     POPAD
  471.     RET
  472.  
  473. DCSC_MV:
  474.     PUSHAD
  475.     MOV     EAX,0
  476.     MOV     AL,[CurrTrack]
  477.     CMP     AL,[DiskType+8]
  478.     JC      DCSC_MV_TrackOK
  479.     MOV     [tracktoohi],1
  480.     JMP     DCSC_MV_End
  481. DCSC_MV_TrackOK:
  482.     MOV     [tracktoohi],0
  483.     XOR     EBX,EBX
  484.     MOV     BX,[tracklen]
  485.     MUL     EBX
  486.     ADD     EAX,256
  487.     PUSH    EAX
  488.     ROL     EAX,16
  489.     MOV     CX,AX
  490.     ROL     EAX,16
  491.     MOV     DX,AX
  492.     MOV     EAX,4200h
  493.     MOV     BX,[fha]
  494.     CMP     BX,0ffffh
  495.     JE      DCSC_MV_End
  496.     INT     21h
  497.     MOV     BX,[fha]
  498.     MOV     AX,3f00h
  499.     MOV     DX,OFFSET DiskBuf
  500.     MOV     CX,256
  501.     INT     21h
  502.     MOVZX   CX,[BYTE PTR DiskBuf+015h]
  503.     MOV     [BYTE PTR ECX+idfield],0ffh
  504.     XOR     EAX,EAX
  505. DCSC_MV_BuildIDfield:
  506.     MOV     AX,CX
  507.     DEC     AX
  508.     SHL     AX,3
  509.     ADD     AX,018h
  510.     MOV     BL,[BYTE PTR EAX+DiskBuf+2]
  511.     MOV     [BYTE PTR ECX+idfield-1],BL
  512.     MOV     BL,[BYTE PTR EAX+DiskBuf+3]
  513.     MOV     [BYTE PTR ECX+idfield+65],BL
  514.     LOOP    DCSC_MV_BuildIDField
  515.  
  516.     MOV     BX,[fha]
  517.     MOV     AX,3f00h
  518.     MOV     DX,OFFSET thistrack
  519.     MOV     CX,5120
  520.     INT     21h
  521.     POP     EAX
  522.     ADD     EAX,132
  523.     ROL     EAX,16
  524.     MOV     CX,AX
  525.     ROL     EAX,16
  526.     MOV     DX,AX
  527.     MOV     [trackoffslo],DX
  528.     MOV     [trackoffshi],CX
  529. DCSC_MV_End:
  530.     POPAD
  531.     RET
  532.  
  533. DCSC_Packed:
  534.     PUSHAD
  535.     XOR     AX,AX
  536.     MOV     AL,[CurrTrack]
  537.     CMP     AL,[DiskType+8]
  538.     JC      DCSC_PCKD_TrackOK
  539.     MOV     [tracktoohi],1
  540.     JMP     DCSC_PCKD_End
  541. DCSC_PCKD_TrackOK:
  542.     MOV     [tracktoohi],0
  543.     ADD     AL,AL
  544.     ADD     AL,AL
  545.     ADD     AL,9
  546.     MOV     DX,AX
  547.     XOR     CX,CX
  548.     MOV     AX,4200h
  549.     MOV     BX,[fha]
  550.     CMP     BX,0ffffh
  551.     JE      DCSC_PCKD_End
  552.     INT     21h
  553.     MOV     DX,OFFSET DiskBuf
  554.     MOV     CX,4
  555.     MOV     AX,3f00h
  556.     INT     21h
  557.     MOV     EAX,[DWORD PTR DiskBuf]
  558.     MOV     DX,AX
  559.     ROL     EAX,16
  560.     MOV     CL,AL
  561.     XOR     CH,CH
  562.     PUSH    AX
  563.     MOV     AX,4200h
  564.     INT     21h
  565.     POP     AX
  566.     CMP     AH,0
  567.     JE      DCSC_PCKD_ButNotThis
  568.     MOV     DX,OFFSET DiskBuf+8
  569.     MOV     CX,5252
  570.     MOV     AX,3f00h
  571.     INT     21h
  572.     PUSH    ES
  573.     PUSH    DS
  574.     POP     ES
  575.     MOV     SI,OFFSET DiskBuf
  576.     MOV     [DWORD PTR SI],'XURC'
  577.     MOV     [DWORD PTR SI+4],'KCAP'
  578.     MOV     DI,OFFSET thistrack
  579.     MOV     CX,5252
  580.     PUSHAD
  581.     CALL    FAR UnpackArea
  582.     POPAD
  583.     MOV     SI,DI
  584.     MOV     CX,132
  585.     MOV     DI,OFFSET idfield
  586.     REP     MOVSB
  587.     MOV     DI,OFFSET thistrack
  588.     MOV     CX,5120
  589.     REP     MOVSB
  590.     POP     ES
  591.     JMP     DCSC_PCKD_End
  592. DCSC_PCKD_ButNotThis:
  593.     MOV     DX,OFFSET idfield
  594.     MOV     CX,132
  595.     MOV     AX,3f00h
  596.     INT     21h
  597.     MOV     DX,OFFSET thistrack
  598.     MOV     CX,5120
  599.     MOV     AX,3f00h
  600.     INT     21h
  601. DCSC_PCKD_End:
  602.     POPAD
  603.     RET
  604.  
  605. DC_WrongDrive:
  606.         PUSH    AX
  607.         MOV     AL,[DCsReg0]
  608.         AND     AX,020h
  609.         OR      AL,0C8h
  610.     MOV     [dcdata],AX
  611.         POP     AX
  612.     MOV     [dcbytecnt],1
  613.     MOV     [dcextdata],0
  614.     RET
  615.  
  616. outFA:  MOV     [BYTE PTR dcFAxx],AL
  617.         AND     AL,3
  618.     MOV     [dccurrdrive],AL
  619.     MOV     [dcstat],0
  620.     MOV     [dcbytecnt],0
  621.     RET
  622.  
  623. outFB:  CMP     sC,7Eh
  624.     JE      outFB7E
  625.     CMP     sC,7Fh
  626.     JE      outFB7F
  627. outFBend:
  628.     RET
  629.  
  630. outFB7E:
  631.     RET
  632.  
  633. outFB7F:
  634.     CMP     [dcstat],0
  635.     JE      oFB7F_newcmd
  636.     CMP     [dcstat],1
  637.     JE      oFB7F_parms
  638.     DEC     [dcbytecnt]
  639.     JS      outFB7F_cmdfinish
  640.     MOV     BP,[dcdpt]
  641.     MOV     [BP],AL
  642.     INC     BP
  643.     MOV     [dcdpt],BP
  644. outFB7F_end:
  645.     RET
  646. outFB7F_cmdfinish:
  647.     MOV     [dcstat],0
  648.     RET
  649. oFB7F_parms:
  650.     MOV     BP,[dccppt]
  651.     MOV     [BP],AL
  652.     INC     BP
  653.     MOV     [dccppt],BP
  654.     DEC     [dcbytecnt]
  655.     JNE     outFB7F_end
  656. oFB7F_stage2:
  657.     MOV     BP,[dccommand]
  658.     PUSH    AX
  659.     MOVZX   AX,[BP+2]
  660.     MOV     [dcbytecnt],AX
  661.     POP     AX
  662.     MOV     BP,[BP+4]
  663.     MOV     [dcstat],2
  664.     CMP     [dcbytecnt],0
  665.     JNE     oFB7F_2ok
  666.     MOV     [dcstat],0
  667. oFB7F_2ok:
  668.     MOV     [dcextdata],0
  669.     JMP     BP
  670. oFB7F_newcmd:
  671.     XCHG    [thisfdcmd],AL
  672.     MOV     [lastfdcmd],AL
  673.     MOV     AL,[thisfdcmd]
  674.     CMP     [diskchange],0
  675.     JE      oFB7F_NoDiskChange
  676.     CALL    OpenDriveA
  677. oFB7F_NoDiskChange:
  678.     MOV     BP,OFFSET dccommands
  679. oFB7Fnc_loop:
  680.     CMP     [DWORD PTR BP],0
  681.     JE      oFB7F_invalid
  682.     CMP     AL,[BYTE PTR BP]
  683.     JE      oFB7Fnc_found
  684.     ADD     BP,6
  685.     JMP     oFB7Fnc_loop
  686. oFB7F_invalid:
  687.     MOV     [dcdata],80h
  688.     MOV     [dcbytecnt],1
  689.     MOV     [dcstat],2
  690.     MOV     [dcdpt],OFFSET dcdata
  691.     MOV     [dcextdata],0
  692.     JMP     outFB7F_end
  693. oFB7Fnc_found:
  694.     MOV     [dccommand],BP
  695.     PUSH    AX
  696.     MOVZX   AX,[BP+1]
  697.     MOV     [dcbytecnt],AX
  698.     POP     AX
  699.     MOV     [dccppt],OFFSET dccmdparms
  700.     MOV     [dcdpt],OFFSET dcdata
  701.     MOV     [dcstat],1
  702.     CMP     [dcbytecnt],0
  703.     JE      oFB7F_stage2
  704.     RET
  705.  
  706. inpFB:  CMP     sC,7fh  ; *?*
  707.     JE      inpFB7F
  708.     CMP     sC,7eh
  709.     JE      inpFB7E
  710. inpFBxx: CMP    sC,0edh
  711.     JE      inpFBED
  712.     RET
  713.  
  714. inpFBED:
  715.     MOV     AL,[BYTE PTR sRF]
  716.     RET
  717.  
  718. inpFB7E:                                ; on PC: Main Status Register 3F4
  719.     MOV     AX,80h
  720.  
  721.     CMP     [wrinprogr],0
  722.     JNE     inpFB7E_Write
  723.     CMP     [dcstat],2
  724.     JNE     inpFB7Estatnot2
  725.     OR      AL,40h
  726.     CMP     [dcextdata],0
  727.     JE      inpFB7Enoext
  728.     OR      AL,20h
  729.     JMP     inpFB7Eend
  730. inpFB7Enoext:
  731.     OR      AL,10h
  732.     JMP     inpFB7Eend
  733. inpFB7Estatnot2:
  734.     CMP     [fha],0ffffh
  735.     JNE     inpFB7Eend
  736. inpFB7Eend:
  737.     RET
  738. inpFB7E_Write:
  739.     OR      AL,60h
  740.     RET
  741.  
  742. inpFB7F:
  743.     CMP     [dcstat],1
  744.     JE      oFB7F_parms
  745.     CMP     [dcstat],2
  746.     JNE     inpFB7Fend
  747.     CMP     [dcextdata],0
  748.     JE      inpFB7F_normdata
  749.     DEC     [dcextdata]
  750.     MOV     BP,[dcedp]
  751.     MOV     AL,[BP]
  752.     INC     BP
  753.     MOV     [dcedp],BP
  754.     JMP     inpFB7Fend
  755. inpFB7F_normdata:
  756.     DEC     [dcbytecnt]
  757.     MOV     BP,[dcdpt]
  758.     MOV     AL,[BP]
  759.     INC     BP
  760.     MOV     [dcdpt],BP
  761.     CMP     [dcbytecnt],0
  762.     JNE     inpFB7Fend
  763.     MOV     [dcstat],0
  764. inpFB7Fend:
  765.     RET
  766.  
  767. inpFB7Ffinish:
  768.     MOV     [dcstat],0
  769.     RET
  770.  
  771. ENDS
  772.  
  773. SEGMENT _data PAGE PUBLIC 'DATA'
  774.  
  775.  
  776. fha         dw    0
  777. MACRO   FCMD c1,c2,c3,c4
  778.     db    c1,c2,c3,0
  779.     dw    c4
  780. ENDM
  781.  
  782. LABEL dccommands WORD
  783.         FCMD    8,0,2,DCGetTrack
  784.         FCMD    7,1,0,DCSeek0
  785.         FCMD    3,2,0,DCRecalibrate
  786.         FCMD    4,1,1,DCGetInfo
  787.         FCMD    15,2,0,DCSeek
  788.         FCMD    04Ah,1,7,DCGetID
  789.         FCMD    045h,8,0,DCWrite
  790.         FCMD    046h,8,7,DCReadSec
  791.         FCMD    066h,8,7,DCReadSec
  792.         dd      0
  793.  
  794. LABEL Writecmd WORD
  795.     FCMD    0ffh,0,7,DCWritectd
  796.  
  797.         EVEN
  798.  
  799.  
  800. dcFAxx      db    0,0
  801. dccommand   dw    ?
  802. dcstat      db    0,0
  803. dcbytecnt   dw    0
  804. dccmdparms  dw    10 DUP (?)
  805. dcdata      dw    20 DUP (?)
  806. dcextdata   dw    ?
  807. dcedp       dw    ?
  808. dcdpt       dw    ?
  809. dccppt      dw    ?
  810. dccurrdrive db    0
  811. CurrTrack   db    0
  812. idfield     dw    66 DUP (?)
  813. trackoffslo dw    ?
  814. trackoffshi dw    ?
  815. IDTPtr      dw    ?
  816. diskchange  dw    0
  817. DCsReg0     db    0
  818. DCsReg1     db    0
  819. DCsReg2     db    0
  820. DCsReg3     db    0
  821. tracktoohi  db    0,0
  822.  
  823. thisfdcmd   db    0
  824. lastfdcmd   db    0
  825.  
  826. DiskType    db    10 DUP (0)
  827.  
  828. tracklen    dw    0
  829.  
  830. wrinprogr   dw 0
  831.  
  832. ENDS
  833.  
  834. SEGMENT _stack PARA STACK 'STACK'
  835.  
  836. DiskBuf     db    5300 DUP (?)
  837. thistrack   db    5300 DUP (?)
  838.  
  839. ENDS
  840.  
  841. END
  842.