home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol172 / fl3.asm < prev    next >
Encoding:
Assembly Source File  |  1984-05-30  |  9.1 KB  |  538 lines

  1. ;This is a disk I/O driver for CPM+ and a Versafloppy II it is a self conta-
  2. ;ined unit and could be easly modified to other disk formats. 
  3. ;
  4. ;    John Monahan    (201) 783-1548        (Feb 1983)
  5. ;
  6. ;    FLOPPY DISK MODULES FOR CPM3 WITH VERSAFLOPPY II
  7. ;
  8.     ; DEFINE LOGICAL VALUES:
  9. TRUE        EQU    -1
  10. FALSE        EQU    NOT TRUE
  11.  
  12. ; DETERMINE IF BANK SELECTING:
  13. BANKED        EQU    TRUE        ;FULL BLOWN VERSION
  14. ;
  15. ;------    FLOPPY DISK PARAMETERS ---------------------------------
  16. ;
  17. X    EQU    60H        ;BASE ADDRESS OF PORTS FOR 1791
  18. RSET    EQU    X+0        ;CONTROLLER RESET ADDRESS
  19. SELECT    EQU    X+3        ;DRIVE SELECT PORT
  20. STATUS    EQU    X+4        ;STATUS PORT
  21. TRACK    EQU    X+5        ;TRACK PORT
  22. SECTOR    EQU    X+6        ;SECTOR PORT
  23. DATA    EQU    X+7        ;DATA PORT
  24. CMD    EQU    X+4        ;COMMAND PORT
  25. RDACMD    EQU    0C0H        ;READ ADDRESS CODE
  26. RDCMD    EQU    088H        ;READ SECTOR CODE
  27. WRCMD    EQU    0A8H        ;WRITE SECTOR CODE
  28. WRTCMD    EQU    0F4H        ;WRITE TRACK CODE
  29. RSCMD    EQU    009H        ;RESTORE COMMAND
  30. SKNCMD    EQU    019H        ;SEEK NO VERIFY
  31. SKCMD    EQU    1DH        ;SEEK WITH VERIFY
  32. STDSDT    EQU    26        ;STANDARD 8" 26 SECTORS/TRACK
  33. STDDDT    EQU    50        ;STANDARD DD 8" 50 SECTORS/TRACK
  34. NBYTES    EQU    128        ;BYTES/SECTOR 
  35. NTRKS    EQU    77        ;TRACKS/DISK
  36. ;
  37. ;
  38. ;   ASCII CHARACTERS
  39. ;
  40. CR:    EQU    0DH         ;CARRIAGE RETURN
  41. LF:    EQU    0AH         ;LINE FEED
  42. BELL:    EQU    7         ;DING
  43. ;
  44.  
  45.     ; DEFINE PUBLIC LABELS:
  46.     PUBLIC    DPH1,DPH2        ;DISK PARAMETER HEADERS
  47.  
  48.     ; DEFINE EXTERNAL LABELS:
  49.     EXTRN    @ADRV,@RDRV
  50.     EXTRN    @DMA,@TRK,@SECT
  51.     EXTRN    @DBNK            ;BANK FOR DMA OPERATION
  52.     EXTRN    @ERMDE            ;BDOS ERROR MODE
  53.     EXTRN    ?WBOOT            ;WARM BOOT VECTOR
  54.     EXTRN    ?PMSG            ;PRINT MESSAGE @<HL> UP TO 00, SAVES
  55.                     ; [BC] AND [DE]
  56.     EXTRN    ?PDERR            ;PRINT BIOS DISK ERROR HEADER
  57.     EXTRN    ?CONIN,?CONO        ;CONSOLE IN AND OUT
  58.     EXTRN    ?CONST            ;CONSOLE STATUS
  59.     EXTRN    ?BNKSL            ;SELECT PROCESSOR MEMORY BANK
  60.     EXTRN    @CBNK
  61.  
  62.     EXTRN    ?SMSG            ;TALK STRING (Note this is a routine
  63.                     ;I have to send speech to my speech
  64.                     ;synthesis board you can remove 
  65.                     ;references to it)
  66.  
  67.  
  68.     ; INCLUDE CP/M 3.0 DISK DEFINITION MACROS:
  69.     MACLIB    CPM3
  70.  
  71.     ; INCLUDE Z-80 MACRO LIBRARY:
  72.     MACLIB    Z80
  73.  
  74.     IF    BANKED
  75.     DSEG            ;PUT IN OP SYS BANK IF BANKING
  76.     ELSE
  77.     CSEG            ;ELSE KEEP IN COMMON MEMORY
  78.     ENDIF
  79.  
  80.     ; EXTENDED DISK PARAMETER HEADER FOR DRIVE 0:
  81.     DW    FWRITEA        ;FLOPPY SECTOR WRITE
  82.     DW    FREADA        ;FLOPPY SECTOR READ
  83.     DW    FLOGA        ;FLOPPY LOGIN PROCEDURE
  84.     DW    FINIT        ;FLOPPY DRIVE INITIALIZATION ROUTINE
  85.     DB    0        ;RELATIVE DRIVE 0 ON THIS CONTROLLER
  86.     DB    -1        ;MEDIA TYPE:
  87.  
  88. DPH1:    DPH    SKEW6,SDFLOPPY,,
  89.  
  90.     ; EXTENDED DISK PARAMETER HEADER FOR DRIVE 1:
  91.     DW    FWRITEB        ;FLOPPY SECTOR WRITE
  92.     DW    FREADB        ;FLOPPY SECTOR READ
  93.     DW    FLOGB        ;FLOPPY LOGIN PROCEDURE
  94.     DW    FINIT        ;FLOPPY DRIVE INITIALIZATION ROUTINE
  95.     DB    1        ;RELATIVE DRIVE 1 ON THIS CONTROLLER
  96.     DB    -1        ;MEDIA TYPE:
  97.  
  98. DPH2:    DPH    SKEW6,SDFLOPPY,,
  99.  
  100. ;    DRIVE TRANSLATION TABLES AND DISK PARAMETER BLOCKS:             
  101.     ; MAKE SURE DPB'S ARE IN COMMON MEMORY:
  102.     CSEG
  103.  
  104.     ; 128 BYTE SECTORS, DSDD DISK PARAMETER BLOCK:
  105. DDFLOPPY:    DPB    128,50,77,2048,64,2
  106.  
  107.     ; 128 BYTE SECTORS, SSSD DISK PARAMETER BLOCK (IBM 3740):
  108. SDFLOPPY:    DPB    128,26,77,1024,64,2
  109.  
  110.  
  111.     IF    BANKED
  112.     DSEG            ;CAN SET BACK TO BANKED SEGMENT IF BANKING
  113.     ENDIF
  114.  
  115. SKEW6:    SKEW    26,6,1
  116. ;
  117. SKEW1:    SKEW    50,1,1
  118. ;
  119. ;
  120.     ;;;;; DCBINIT:
  121.     ; INITIALIZATION FOR EACH DRIVE PERFORMED HERE:
  122. FINIT:
  123.     RET            ;WE DON'T DO ANY PARTICULAR DRIVE INITS
  124.  
  125.  
  126.     ;;;;; DCBLOGIN
  127.     ; ROUTINE LOGS IN SELECTED DRIVE -- IF HI BIT OF TYPE FLAG IN XDPH
  128.     ;  IS SET THEN DRIVE RECALIBRATION IS PERFORMED, DISK FORMAT IS
  129.     ;  INSPECTED TO DETERMINE DENSITY AND DPB TYPE TO USE:
  130. FLOGA:    MVI    C,0
  131.     CALL    GETTYPE        ;FIND OUT IF SD OR DD DISK
  132.     STA    UNITA        ;STORE DENSITY FLAG
  133.     ANI    01000000B
  134.     JNZ    DDFMT
  135.     LXI    H,TALKSD
  136.     CALL    ?SMSG
  137.     LXI    H,SKEW6        ;DROP IN THE SD SKEW TABLE ADDRESS
  138.     SHLD    DPH1
  139.     LXI    H,SDFLOPPY    ;AND THE SD DPB ADDRESS
  140.     SHLD    DPH1+12
  141.     RET
  142. DDFMT:    LXI    H,TALKDD
  143.     CALL    ?SMSG
  144.     LXI    H,SKEW1        ;NEED TO PLACE ADDRESS BACK BECAUSE MAY HAVE
  145.     SHLD    DPH1        ;A SD DISK THERE PREVIOUSLY
  146.     LXI    H,DDFLOPPY
  147.     SHLD    DPH1+12
  148.     RET
  149. ;
  150. FLOGB:    MVI    C,1
  151.     CALL    GETTYPE        ;FIND OUT IF SD OR DD DISK
  152.     ORI    01H
  153.     STA    UNITB        ;STORE DENSITY FLAG
  154.     ANI    01000000B
  155.     JNZ    DDFMTB
  156.     LXI    H,TALKSD
  157.     CALL    ?SMSG
  158.     LXI    H,SKEW6        ;DROP IN THE SD SKEW TABLE ADDRESS
  159.     SHLD    DPH2
  160.     LXI    H,SDFLOPPY    ;AND THE SD DPB ADDRESS
  161.     SHLD    DPH2+12
  162.     RET
  163. DDFMTB:    LXI    H,TALKDD
  164.     CALL    ?SMSG
  165.     LXI    H,SKEW1        ;NEED TO PLACE ADDRESS BACK BECAUSE MAY HAVE
  166.     SHLD    DPH2        ;A SD DISK THERE PREVIOUSLY
  167.     LXI    H,DDFLOPPY
  168.     SHLD    DPH2+12
  169.     RET
  170. ;
  171. ; THIS ROUTINE SETS UP THE FLOPPY DISK UNIT BYTE
  172. ; THE REQUIRED DRIVE IS IN [A]
  173. ;
  174. GETTYPE:MOV    A,C        ;FIND OUT TYPE OF DRIVE
  175.     ANI    0FH
  176.     ORI    40H        ;COME UP DEFALT IN 8" DD
  177.     STA    UNIT
  178.     MVI    B,5        ;MAX NO OF RETRYS
  179.     CALL    USL1
  180.     LDA    UNIT
  181.     ANI    01000000B    ;GET DENSITY FLAG
  182.     RET
  183. ;
  184. USL1:    PUSH    B
  185.     PUSH    H
  186.     DB    0EDH,73H
  187.     DW    SPSV        ;-----<LD  (SPSV),SP
  188.     POP    H
  189.     CALL    DRVSET        ;SELECT DRIVE IN HARDWARE
  190.     CALL    IDRD        ;TRY READING TRACK ID
  191.     POP    B
  192.     RZ            ;IF CORRECT DENSITY WILL BE Z
  193.     DCR    B        ;DECREASE 5.......0 IF Z THEN ERROR
  194.     JZ    SPECIAL
  195.     CALL    CHGTYP
  196.     JMP    USL1        
  197. ;
  198. SPECIAL:LXI    H,DENSERR
  199.     CALL    ?PMSG
  200.     JMP    0F000H        ;ABORT TO MONITOR
  201. ;
  202. ;
  203. CHGTYP:    LDA    UNIT
  204.     ADI    01000000B    ;TOGGLE DENSITY BIT
  205.     ANI    01111111B    ;CLEAR BIT 7
  206.     STA    UNIT
  207.     RET
  208. ;
  209. ;    READ A SECTOR
  210. FREADA:    LDA    UNITA
  211.     JMP    FREAD
  212. FREADB:    LDA    UNITB
  213. FREAD:    STA    UNIT
  214.     LXI    B,302H
  215. READ1:    PUSH    B
  216.     CALL    RDSC
  217.     POP    B
  218.     RZ
  219.     CALL    FRETRY
  220.     JMP    READ1        
  221. ;
  222. ;    WRITE A SECTOR
  223. FWRITEA:LDA    UNITA
  224.     JMP    FWRITE
  225. FWRITEB:LDA    UNITB
  226. FWRITE:    STA    UNIT
  227.     LXI    B,302H
  228. WRITE1:    PUSH    B
  229.     CALL    WRSC    
  230.     POP    B
  231.     RZ
  232.     CALL    FRETRY
  233.     JMP    WRITE1          
  234. ;
  235. FRETRY:    DCR    B          
  236.     JNZ    RETRY2
  237.     MVI    B,3
  238.     DCR    C
  239.     JNZ    RETRY1
  240.     POP    PSW
  241.     XRA    A
  242.     INR    A
  243. RETRY2:    RET
  244. ;
  245. RETRY1:    PUSH    B
  246.     PUSH    H
  247.     DB    0EDH,73H
  248.     DW    SPSV        ;------<<<<<<LD    (SPSV),SP
  249.     POP    H
  250.     MVI    A,RSCMD
  251.     CALL    SEEK4
  252.     XRA    A
  253.     POP    B
  254.     RET
  255. ;
  256. ;    SELECT DRIVE IN HARDWARE
  257. ;
  258. DRVSET: LXI    D,UNIT
  259.     LDAX    D
  260.     ANI    0E0H
  261.     MOV    C,A        ;STORE DRIVE TYPE IN [C]
  262.     LDAX    D
  263.     ANI    03
  264.     MOV    B,A        ;STORE DRIVE # IN [B]
  265.     MVI    A,1
  266.     JZ    DRVSEL        
  267. CKDRV1:    RLC
  268.     DCR    B          
  269.     JNZ    CKDRV1    
  270. DRVSEL:    ORA    C        ;COMBINE TYPE & DRIVE#
  271.     ANI    7FH
  272.     MOV    B,A        ;[B] CONTAINS INFO FOR HARDWARE
  273.     MVI    A,STDSDT    ;SETUP FOR SD
  274.     STA    COUNT        ;STORE AS 26 SECTORS/TRACK
  275.     MVI    A,40H        ;WAS IT DD
  276. DRV1:    CMP    C
  277.     JNZ    CKDRV        
  278.     MVI    A,STDDDT    ;SETUP FOR DD 
  279.     STA    COUNT        ;SET TO 50 SECTORS/TRACK
  280. CKDRV:    MOV    A,B        ;GET HARDWARE SELECT DATA
  281.     CMA            ;HARDWARE IS INVERTED
  282.     OUT    SELECT
  283.     LDAX    D
  284.     STA    UNITCK
  285.     CALL    DELAY
  286. RDYCK:    IN    STATUS
  287.     ANI    80H
  288.     JNZ    END2
  289.     RET
  290. ;
  291. ;    READ PRESENT DISK ADDRESS
  292. IDRD:    CALL    WAIT
  293.     LXI    H,IDSV
  294.     LXI    B,600H+DATA    ;READ 6 BYTES
  295.     MVI    A,0F8H
  296.     STA    ERMASK
  297.     CALL    SWEB
  298.     MVI    A,RDACMD    ;DO THE ID READ
  299.     CALL    RDSCID
  300.     LDA    IDSV
  301.     CPI    NTRKS        ;IS IT REASONABLE
  302.     JNC    SEEK0
  303.     OUT    TRACK    
  304.     XRA    A
  305.     RET
  306. ;
  307. RDSCID:    STA    CMDSV
  308.     DI
  309.     OUT    CMD
  310.     NOP
  311.     INIR
  312.     DI
  313.     JMP    ENDX
  314. ;
  315. DELAY:    MVI    A,80        ;DELAY ~32 MS (DOES NOT SEEM TO BE CRITICAL)
  316. DELAY1:    MVI    B,0
  317. M0:    DCR    B        
  318.     JNZ    M0
  319.     DCR    A
  320.     JNZ    DELAY1        
  321.     RET
  322. ;
  323. ;    READ SECTOR COMMAND
  324. RDSC:    CALL    DRINIT
  325.     MVI    A,RDCMD
  326. RDSCO:    STA    CMDSV
  327.     DI
  328.  
  329.     IF    BANKED
  330.     JMP    ADJBNKS
  331.     
  332.     CSEG
  333.  
  334. ADJBNKS:LDA    @CBNK
  335.     PUSH    PSW
  336.     LDA    @DBNK
  337.     CALL    ?BNKSL
  338.     MVI    A,RDCMD
  339.     OUT    CMD
  340.     NOP
  341.     INIR
  342.     POP    PSW
  343.     CALL    ?BNKSL    
  344.     DI
  345.     JMP    ENDX    
  346.  
  347.     DSEG
  348.  
  349.     ELSE
  350.  
  351.     OUT    CMD
  352.     NOP
  353.     INIR
  354.     DI
  355.     JMP    ENDX    
  356.  
  357.     ENDIF
  358. ;
  359. ;    WRITE SECTOR COMMAND
  360. WRSC:    CALL    DRINIT
  361.     MVI    A,WRCMD
  362.     STA    CMDSV
  363.     DI    
  364.  
  365.     IF    BANKED
  366.     JMP    ADJBBB
  367.     
  368.     CSEG
  369.  
  370. ADJBBB:    LDA    @CBNK
  371.     PUSH    PSW
  372.     LDA    @DBNK
  373.     CALL    ?BNKSL
  374.     MVI    A,WRCMD
  375.     OUT    CMD
  376.     NOP
  377.     OUTIR
  378.     POP    PSW
  379.     CALL    ?BNKSL    
  380.     DI
  381.     JMP    ENDX    
  382.  
  383.     DSEG
  384.  
  385.     ELSE
  386.  
  387.     OUT    CMD
  388.     NOP
  389.     OUTIR
  390.     DI            ;FOLLOW INTO ENDX
  391.  
  392.     ENDIF
  393. ;
  394. ;    END  OF COMMAND
  395. ENDX:    CALL    WAIT
  396.     IN    STATUS
  397.     MOV    D,A
  398.     LDA    ERMASK
  399.     ANA    D
  400.     RZ
  401. END1:    MOV    A,D
  402. END2:    STA    ERSTAT
  403.     CALL    DELAY
  404.     DB    0EDH,7BH
  405.     DW    SPSV        ;------< LXI    SP,(SPSV)
  406.     XRA    A
  407.     DCR    A        ;RETURN NZ TO INDICATE AN ERROR
  408.     STA    UNITCK
  409.     RET
  410. ;
  411. ;    DRIVE INITIALIZATION
  412. ;
  413. DRINIT:    POP    H
  414.     DB    0EDH,73H
  415.     DW    SPSV        ;-------< LD    (SPSV),SP
  416.     PUSH    H
  417.     LDA    UNIT
  418.     MOV    D,A
  419.     LDA    UNITCK
  420.     CMP    D
  421.     JZ    DINIT1        
  422.     CALL    DRVSET
  423.     CALL    IDRD
  424. DINIT1:    CALL    SEEK
  425.     MVI    A,0FEH
  426.     STA    ERMASK
  427. ;
  428. TRINT:    LHLD    @DMA        ;SETUP DMA ADDRESS AND BYTE COUNT
  429.     LDA    @SECT
  430.     OUT    SECTOR
  431.     LXI    B,NBYTES*100H+DATA
  432. ;
  433. SWEB:    IN    SELECT        ;ENABLE WAIT STATES
  434.     ANI    7FH
  435.     OUT    SELECT
  436.     RET
  437. ;
  438. ;    SEEK TRACK
  439. ;
  440. SEEK:    CALL    RDYCK
  441.     MVI    C,NTRKS        ;MUST BE REASONABLE TRACK #
  442.     LDA    @TRK        ;ALWAYS < 0FFH TRACKS FOR FLOPPY
  443.     CMP    C
  444.     JC    SEEK1        
  445. SEEK0:    MVI    A,0FH
  446.     JMP    END2        
  447. SEEK1:    MOV    C,A
  448.     IN    TRACK
  449.     CMP    C
  450.     RZ            ;IF SAME TRACK NO NEED TO SEEK
  451.     MVI    A,SKCMD
  452. SEEK4:    STA    CMDSV
  453.     MVI    B,210
  454. S0:    DCR    B        
  455.     JNZ    S0
  456.     CALL    WAIT
  457.     LDA    @TRK
  458.     OUT    DATA
  459.     MVI    A,80H
  460.     STA    ERMASK
  461.     LDA    CMDSV
  462.     OUT    CMD
  463.     MVI    B,10
  464. D0:    DCR    B        
  465.     JNZ    D0    
  466.     CALL    ENDX
  467.     CALL    DELAY
  468.     LDA    CMDSV
  469.     CPI    RSCMD        ;NO NEED TO CHECK RESTORE COMMAND
  470.     RZ
  471.     IN    STATUS
  472.     ANI    10H
  473.     JNZ    SEEK2        
  474.     IN    TRACK
  475.     CMP    C
  476.     RZ
  477. SEEK2:    MVI    A,20H
  478. END2JP:    JMP    END2  
  479. ;
  480. WAIT:    MVI    E,0
  481.     PUSH    B
  482.     MVI    C,2
  483. WAIT2:    IN    STATUS
  484.     ANI    1
  485.     JZ    DWAIT            
  486.     DCR    B
  487.     JNZ    WAIT2            
  488.     DCR    E
  489.     JNZ    WAIT2            
  490.     DCR    C
  491.     JNZ    WAIT2            
  492.     POP    B
  493.     IN    SELECT            ;IF BY THIS TIME NOT READY FORCE
  494.     ORI    80H            ;A HARDWARE RESET
  495.     OUT    RSET
  496. F0:    DCR    B            
  497.     JNZ    F0            
  498.     IN    RSET
  499.     CALL    FRCINT
  500.     MVI    A,RSCMD
  501.     CALL    SEEK4
  502.     MVI    A,0FEH
  503.     JMP    END2JP    
  504. ;
  505. ;    DISABLE WAIT STATES
  506. DWAIT:    POP    B            ;TO BALANCE THE ABOVE PUSH IN WAIT
  507.     IN    SELECT
  508.     ORI    80H
  509.     OUT    SELECT
  510.     RET
  511. ;
  512. ;    FORCE CHIP INTERUPT
  513. FRCINT:    MVI    A,0D0H
  514.     OUT    CMD
  515.     MVI    A,10
  516. FRC1:    DCR    A
  517.     JNZ    FRC1            
  518.     IN    STATUS
  519.     RET
  520. ;
  521. ;
  522. TALKSD    DB    'FLOPPY IS SINGLE DENSITY',0
  523. TALKDD    DB    'FLOPPY IS DOUBLE DENSITY',0
  524. DENSERR    DB    CR,LF,'Could not determine disk density/format',0
  525. ;
  526. ;
  527. UNIT    DS    1        ;STORE FOR FLOPPY NEW UNIT BYTE
  528. ERMASK    DS    1        ;FLOPPY ERROR MASK
  529. ERSTAT    DS    1        ;FLOPPY ERROR FLAG STORE
  530. CMDSV    DS    1        ;COMMAND SAVE 
  531. SPSV    DS    2        ;SP SAVE 
  532. COUNT    DS    1        ;SECTORS/TRACK STORE
  533. UNITCK    DS    1        ;OLD FLOPPY UNIT BYTE
  534. UNITA    DS    1        ;STORE OF DENSITY DATA FOR DRIVE A
  535. UNITB    DS    1        ;STORE OF DENSITY DATA FOR DRIVE B
  536. IDSV    DS    7        ;6 BYTES (USED FOR TRACK ID COMMAND)
  537. ;
  538.