home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / ENTERPRS / CPM / UTILS / S / UZI.ARK / DEVFLOP.C < prev    next >
Text File  |  1988-11-30  |  7KB  |  330 lines

  1. /**************************************************
  2. UZI (Unix Z80 Implementation) Kernel:  devflop.c
  3. ***************************************************/
  4.  
  5.  
  6. #include "unix.h"
  7. #include "extern.h"
  8.  
  9. extern ei();
  10.  
  11.  
  12. #define NUMTRKS 76
  13. #define NUMSECS 26
  14.  
  15. static char ftrack, fsector, ferror;
  16. static char *fbuf;
  17.  
  18. static read(), write(), reset();
  19.  
  20.  
  21. fd_read(minor, rawflag)
  22. int16 minor;
  23. int rawflag;
  24. {
  25.     return (fd(1, minor, rawflag));
  26. }
  27.  
  28. fd_write(minor, rawflag)
  29. int16 minor;
  30. int rawflag;
  31. {
  32.     return (fd(0, minor, rawflag));
  33. }
  34.  
  35.  
  36.  
  37. static
  38. fd(rwflag, minor, rawflag)
  39. int rwflag;
  40. int minor;
  41. int rawflag;
  42. {
  43.     register unsigned nblocks;
  44.     register unsigned firstblk;
  45.  
  46.     if (rawflag)
  47.     {
  48.         if (rawflag == 2)
  49.         {
  50.             nblocks = swapcnt >> 7;
  51.             fbuf = swapbase;
  52.             firstblk = 4*swapblk;
  53.         }
  54.         else
  55.         {
  56.             nblocks = udata.u_count >> 7;
  57.             fbuf = udata.u_base;
  58.             firstblk = udata.u_offset.o_blkno * 4;
  59.         }       
  60.     }
  61.     else
  62.     {
  63.         nblocks = 4;
  64.         fbuf = udata.u_buf->bf_data;
  65.         firstblk = udata.u_buf->bf_blk * 4;
  66.     }
  67.  
  68.     ftrack = firstblk / 26; 
  69.     fsector = firstblk % 26 + 1;
  70.     ferror = 0;
  71.  
  72.     for (;;)
  73.     {
  74.         if (rwflag)
  75.             read();
  76.         else
  77.             write();
  78.  
  79.         ifnot (--nblocks)
  80.             break;
  81.  
  82.         if (++fsector == 27)
  83.         {
  84.             fsector = 1;
  85.             ++ftrack;
  86.         }
  87.         fbuf += 128;
  88.     }
  89.  
  90.     if (ferror)
  91.     {
  92.         kprintf("fd_%s: error %d track %d sector %d\n",
  93.                     rwflag?"read":"write", ferror, ftrack, fsector);
  94.         panic("");
  95.     }
  96.  
  97.     return(nblocks);
  98. }
  99.  
  100.  
  101. fd_open(minor)
  102. int minor;
  103. {
  104.     if (in(0x80) & 0x81)
  105.     {
  106.         udata.u_error = ENXIO;
  107.         return (-1);
  108.     }
  109.     reset();
  110.     return(0);
  111. }
  112.  
  113.  
  114. fd_close(minor)
  115. int minor;
  116. {
  117.     return(0);
  118. }
  119.  
  120.  
  121. fd_ioctl(minor)
  122. int minor;
  123. {
  124.     return(-1);
  125. }
  126.  
  127.  
  128.  
  129. #asm 8080
  130. ; ALL THE FUNCTIONS IN HERE ARE STATIC TO THIS PACKAGE
  131.  
  132. ;
  133. ;THESE ARE 1771 FLOPPY DISK CONTROLLER COMMANDS,
  134. ;I/O PORT ADDRESSES, AND FLAG MASKS:
  135. ;
  136. RESTOR  EQU     08H     ;6MS STEP,LOAD HEAD
  137. SEEK    EQU     18H     ;6MS STEP,LOAD HEAD
  138. READC   EQU     88H     ;NO HEAD LOAD
  139. WRITEC  EQU     0A8H    ;NO HEAD LOAD
  140. RESET   EQU     0D0H    ;RESET STATUS COMMAND
  141. STATUS  EQU     80H
  142. COMAND  EQU     80H
  143. TRACK   EQU     81H
  144. SECTOR  EQU     82H
  145. DATA    EQU     83H
  146. BUSY    EQU     01
  147. RDMASK  EQU     10011111B
  148. WRMASK  EQU     0FFH
  149. ;
  150. ;
  151. ;THIS FLOPPY READ ROUTINE CALLS FREAD2. IF THE
  152. ;READ IS UNSUCCESSFUL, THE DRIVE IS HOMED,
  153. ;AND THE READ IS RETRIED.
  154. ;
  155. read?:  PUSH    B
  156.         CALL    FREAD2
  157.         LDA     ferror?
  158.         ANA     A       ;SET FLAGS
  159.         JZ      RDONE   ;READ WAS OK
  160.         CALL    FHOME
  161.         CALL    FREAD2
  162. RDONE:
  163.         POP     B
  164.         RET
  165. ;
  166. FREAD2: CALL    FWAIT
  167.         LDA     fsector?
  168.         OUT     SECTOR
  169.         CALL    FTKSET
  170.         MVI     A,11
  171. FREAD3: STA     TRYNUM
  172.         CALL    FWAIT
  173.         LHLD    fbuf?
  174.         MVI     C,DATA
  175.         MVI     B,128
  176.         MVI     D,03
  177.         DI              ;ENTERING CRITICAL SECTION
  178.         MVI     A,READC
  179.         OUT     COMAND
  180.         XTHL    ;SHORT DELAY
  181.         XTHL
  182.         XTHL
  183.         XTHL
  184. .1LOOP: IN      STATUS
  185.         ANA     D
  186.         DCR     A
  187.         JZ      .1LOOP
  188. .Z80
  189.         INI
  190. .8080
  191.         JNZ     .1LOOP
  192.         CALL    ei?             ;LEAVING CRITICAL SECTION
  193.         CALL    FWAIT
  194.         IN      STATUS
  195.         ANI     RDMASK
  196.         JZ      FR1END
  197.         LDA     TRYNUM
  198.         DCR     A
  199.         JNZ     FREAD3
  200.         MVI     A,1
  201. FR1END: STA     ferror?
  202.         RET
  203. ;
  204. ;THIS IS THE FLOPPY WRITE ROUTINE. IT CALLS
  205. ;THE ACTUAL WRITING SUBROUTINE, AND IF IT
  206. ;WAS UNSUCCESSFUL, RESETS THE HEAD AND
  207. ;TRIES AGAIN.
  208. ;
  209. write?: PUSH    B
  210.         CALL    FWR2
  211.         LDA     ferror?
  212.         ANA     A
  213.         JZ      WDONE
  214.         CALL    FHOME
  215.         CALL    FWR2
  216.         LDA     ferror?
  217. WDONE:  POP     B
  218.         RET
  219. ;
  220. FWR2:   CALL    FWAIT
  221.         LDA     fsector?
  222.         OUT     SECTOR
  223.         XTHL
  224.         XTHL
  225.         MVI     A,RESET
  226.         OUT     COMAND
  227.         XTHL
  228.         XTHL
  229.         XTHL
  230.         XTHL
  231.         IN      STATUS
  232.         ANI     00100000B
  233.         JZ      FWR5    ;JMP IF HEAD NOT LOADED
  234.         LDA     ftrack? ;DESIRED TRACK
  235.         MOV     C,A
  236.         IN      TRACK   ;ACTUAL TRACK
  237.         CMP     C
  238.         JZ      FWR4    ;IF TRACK CORRECT
  239.         CALL    FTKSET
  240.         CALL    FWAIT
  241.         LXI     H,30    ;15MS DELAY
  242.         CALL    DELAY
  243.         JMP     FWR4
  244. FWR5:   CALL    FTKSET
  245.         LXI     H,50    ;25 MS DELAY
  246.         CALL    DELAY
  247.         CALL    FWAIT
  248.         LXI     H,20    ;15 MS DELAY
  249.         CALL    DELAY
  250. FWR4:   MVI     A,11
  251. FWR3:   STA     TRYNUM
  252.         CALL    FWAIT
  253.         LHLD    fbuf?
  254.         MVI     C,DATA
  255.         MVI     B,128
  256.         MVI     D,01
  257.         MVI     A,WRITEC
  258.         DI              ;ENTERING CRITICAL SECTION
  259.         OUT     COMAND
  260. .1A:    IN      STATUS
  261.         ANI     01
  262.         JZ      .1A
  263. .1B:    IN      STATUS
  264.         ANI     02
  265.         JNZ     .2LOOP
  266.         IN      STATUS
  267.         ANI     01
  268.         JZ      .2ERROR
  269.         JMP     .1B
  270. .2LOOP: IN      STATUS
  271.         XRA     D
  272.         JZ      .2LOOP
  273. .Z80
  274.         OUTI
  275. .8080
  276.         JNZ     .2LOOP
  277.         CALL    ei?             ;LEAVING CRITICAL SECTION
  278.         CALL    FWAIT
  279.         IN      STATUS
  280.         ANI     WRMASK
  281.         JZ      FW2END
  282. .2ERROR: LDA    TRYNUM
  283.         DCR     A
  284.         JNZ     FWR3
  285.         MVI     A,1
  286. FW2END: STA     ferror?
  287.         RET
  288. ;
  289. ;THESE 3 SUBROUTINES ARE USED BY THE FREAD2 AND
  290. ;FWR2 ROUTINES:
  291. ;
  292. FTKSET: CALL    FWAIT
  293.         LDA     ftrack?
  294.         OUT     DATA
  295.         MVI     A,SEEK
  296.         OUT     COMAND
  297.         RET
  298. ;
  299. FWAIT:  IN      STATUS
  300.         ANI     10000001B
  301.         JNZ     FWAIT
  302.         RET
  303. ;
  304. reset?:
  305. FHOME:  PUSH    B
  306.         CALL    FWAIT
  307.         MVI     A,RESTOR
  308.         OUT     COMAND
  309.         POP     B
  310.         RET
  311. ;
  312.         
  313.  
  314. ;THIS IS USED IN SEVERAL PLACES. IT GIVES
  315. ; ( .5 * HL ) MILLISECONDS OF DELAY.
  316. ;
  317. DELAY:  MVI     B,154
  318. .Z80
  319. DELAY1: DJNZ    DELAY1  ;.5 MS DELAY
  320. .8080
  321.         DCX     H
  322.         MOV     A,H
  323.         ORA     L
  324.         JNZ     DELAY   ;LOOP HL TIMES
  325.         RET
  326.  
  327. TRYNUM: DS      1
  328. #endasm
  329.  
  330.