Subversion Repositories pentevo

Rev

Rev 627 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  1. ;---------------------------------------------------------------
  2. ;  ДРАЙВЕР ДИСКОВОЙ СИСТЕМЫ
  3. ;  ВХОД :
  4. ;       RQCHAN          - КАНАЛ
  5. ;       RQCOM           - КОМАНДА
  6. ;       RQBLN           - ЧИСЛО БЛОКОВ
  7. ;       RQTRACK         - ДОРОЖКА
  8. ;       RQBLOCK         - БЛОК
  9. ;       RQBADR          - АДРЕС БУФЕРА
  10. ;
  11.  
  12. ;----------------------------------0201 0202 0801(cd7f3a)
  13. ; ГЛОБАЛЬНЫЕ КОНСТАНТЫ
  14. ;
  15. _REPN   EQU     5       ; ЧИСЛО ПОВТОРОВ ПРИ НЕУДАЧЕ
  16.  
  17. PDISK: LD      (IX-_RQCHAN),C
  18.         LD      HL,RQCHAN+1
  19.         INC     DE
  20.         LD      BC,8
  21.         EX      DE,HL
  22.         RST     8
  23.         DB      3,0FEH
  24.         EI
  25.         PUSH    IY
  26.         CALL    DISK
  27.         POP     IY
  28.         RET
  29.  
  30. PSCHK: EI
  31.         LD      (RQCOM),A
  32.         LD      (IX-_RQCHAN),C
  33.         PUSH    HL
  34.         PUSH    DE
  35.         PUSH    IY
  36.         LD      (RQBADR),DE
  37.         CALL    DISK
  38.         POP     IY
  39.         POP     DE
  40.         POP     HL
  41.         RET
  42.  
  43. ;
  44. ; СТАРТОВЫЙ ВХОД
  45. ;
  46. DISK:
  47.         LD      A,(RQCHAN)      ;НОМЕР КАНАЛА
  48.         LD      HL,CHTBL        ;ТАБЛИЦА КАНАЛОВ
  49.         CALL    _IND
  50.         PUSH    HL              ;ОПИСАТЕЛЬ
  51.         POP     IY
  52.  
  53.         LD      A,(RQCOM)       ;КОМАНДА
  54.         CP      _SETCH
  55.         JP      Z,CHSET         ;НАЗНАЧИТЬ КАНАЛ
  56.  
  57.         LD      A,(IY+DVALID)   ;ПРИЗНАК ДЕЙСТВИТЕЛЬНОСТИ БЛОКА
  58.         CP      0FFH            ;БЛОК ДЕЙСТВИТЕЛЕН?
  59.  
  60.         LD      A,_CHNFND       ;КАНАЛ НЕ ПРИСОЕДИНЕН
  61.         RET     NZ
  62.  
  63.         LD      A,(RQCOM)       ;КОМАНДА
  64.         CP      _GETCH          ;КОНТРОЛЬ?
  65.         JP      Z,CHCHK         ;ПОЛУЧИТЬ ОПИСАТЕЛЬ
  66.  
  67.         CP      _RESET          ;СБРОС?
  68.         JR      Z,DISK4         ;АДРЕСАЦИЯ НЕДЕЙСТВИТЕЛЬНА
  69.  
  70.         CP      _RECAL          ;РЕКАЛИБРОВКА?
  71.         JR      Z,DISK4         ;АДРЕСАЦИЯ НЕДЕЙСТВИТЕЛЬНА
  72.  
  73.         DEC     (IX-_RQBLOCK)   ;НОМЕР БЛОКА ПРИВЕДЕН
  74.  
  75.         LD      DE,(RQTRACK)    ;НОМЕР ДОРОЖКИ
  76.         LD      L,(IY+_DTRACK)
  77.         LD      H,(IY+_DTRACK+1) ;ЧИСЛО ДОРОЖЕК НА ДИСКЕ
  78.         DEC     HL              ;HL - НОМЕР ПОСЛЕДНЕЙ ДОРОЖКИ
  79.         XOR     A               ;CLC
  80.         SBC     HL,DE
  81.         LD      A,_ADRERR       ;ОШИБКА АДРЕСАЦИИ
  82.         RET     C
  83.                                 ;DE - НОМЕР ДОРОЖКИ
  84.         LD      A,(IY+_DHEADF)   ;ЧИСЛО ФИКСИРОВАННЫХ ГОЛОВОК
  85.         ADD     A,(IY+_DHEADR)   ;ОБЩЕЕ ЧИСЛО ГОЛОВОК
  86.         LD      C,A
  87.         LD      B,0
  88.                                 ;DE-НОМЕР ДОРОЖКИ
  89.                                 ;BC-ЧИСЛО ГОЛОВОК
  90.         CALL    DIV             ;DE/BC=DE.HL
  91.                                 ;DE-НОМЕР ЦИЛИНДРА
  92.                                 ;HL-НОМЕР ГОЛОВКИ
  93.         LD      (IX-_RQHEAD),L  ;НОМЕР ГОЛОВКИ
  94.  
  95.         LD      L,(IY+_DBEGCYL)  ;НАЧАЛЬНЫЙ ЦИЛИНДР
  96.         LD      H,(IY+_DBEGCYL+1)
  97.  
  98.         ADD     HL,DE
  99.         LD      (RQCYL),HL      ;НОМЕР ЦИЛИНДРА
  100.  
  101. DISK4: LD      A,_REPN
  102.         LD      (REP),A         ;СЧЕТЧИК ЧИСЛА ПОВТОРОВ
  103.  
  104. DISK5:  LD      A,(RQCOM)
  105.         PUSH    AF
  106.         CALL    DEXEC           ;ИСПОЛНЕНИЕ КОМАНДЫ
  107.         LD      E,A
  108.         POP     AF
  109.         LD      (RQCOM),A
  110.         LD      A,E
  111.         OR      A
  112.         RET     Z               ;A = 00H - УДАЧА
  113.         LD      (IX-_BUFT),0FFH ;СБРОС БУФЕРА
  114.         AND     80H
  115.         LD      A,E
  116.         RET     Z               ;ФАТАЛЬНАЯ ОШИБКА
  117.         DEC     (IX-_REP)
  118.         JR      NZ,DISK5        ;СЛЕДУЮЩАЯ ПОПЫТКА
  119.         RET                     ;A-КОД ОШИБКИ
  120.  
  121. ;-----------------------
  122. ;ДЕЛЕНИЕ DE:C=DE.HL
  123. DIV:    LD      HL,0
  124.         LD      A,16            ;СЧЕТЧИК ЦИКЛОВ
  125. DIV1:
  126.         EX      AF,AF'
  127.  
  128.         ADD     HL,HL           ;СДВИГ HL
  129.  
  130.         XOR     A               ;A=0
  131.         SLA     E               ;СДВИГ DE
  132.         RL      D
  133.         ADC     A,L
  134.         LD      L,A
  135.         SBC     HL,BC
  136.  
  137.         INC     DE
  138.         JR      NC,DIV2
  139.         ADD     HL,BC           ;ВОССТАНОВЛЕНИЕ ОСТАТКА
  140.         DEC     DE
  141. DIV2:   EX      AF,AF'
  142.         DEC     A               ;СЧЕТЧИК ЦИКЛОВ
  143.         JR      NZ,DIV1
  144.         RET
  145.  
  146. ;-----------------------
  147. ;ИСПОЛНЕНИЕ КОМАНДЫ
  148. DEXEC: LD      A,(RQCOM)       ;КОМАНДА
  149.         LD      H,A
  150.         CP      _WRITE+1
  151.         LD      A,_COMERR
  152.         RET     NC
  153.         LD      A,H
  154.         LD      HL,CMTBL        ;ТАБЛИЦА КОМАНД
  155.         CALL    _IND
  156.         JP      (HL)
  157. ;-----------------------
  158. ;ТАБЛИЦА КОМАНД
  159. CMTBL:  DW      DRES            ;СБРОС
  160.         DW      DJMP            ;ПОЗИЦИОНИРОВАНИЕ
  161.         DW      DJMP            ;ФОРМАТИРОВАНИЕ
  162.         DW      DJMP            ;РЕКАЛИБРОВКА
  163.         DW      DRD             ;ЧТЕНИЕ
  164.         DW      DWRS            ;ЗАПИСЬ СЕКТОРАМИ
  165.         DW      DWR             ;ЗАПИСЬ
  166. ;-----------------------
  167. ;ПЕРЕДАЧА УПРАВЛЕНИЯ ДРАЙВЕРУ
  168. DJMP:   PUSH    IY
  169.         POP     BC
  170.         LD      A,(IY+_DTYP)     ;ТИП ДРАЙВЕРА
  171.         CP      MAXDRVN+1       ;ДОПУСТИМЫЙ НОМЕР?
  172.         JR      C,DJMP1
  173.         LD      A,_DTYPER       ;НЕДОПУСТИМЫЙ НОМЕР
  174.         RET
  175. DJMP1: LD      HL,DCTBL        ;ТАБЛИЦА ДРАЙВЕРОВ
  176.         CALL    _IND            ;ТИП ДРАЙВЕРА
  177.         LD      A,L
  178.         OR      H
  179.         LD      A,_DRNFND       ;ДРАЙВЕР ОТСУТСТВУЕТ
  180.         RET     Z
  181.         LD      A,(RQCOM)       ;КОМАНДА
  182.         CALL    _IND
  183.         JP      (HL)            ;ПЕРЕХОД К ДРАЙВЕРУ
  184. ;-----------------------
  185. ;СБРОС
  186. DRES:  LD      (IX-_BUFT),0FFH ;СБРОС БУФЕРА
  187.         JR      DJMP
  188. ;-----------------------
  189. ;ЧТЕНИЕ
  190. DRD:    CALL    FIND            ;ПОИСК БЛОКА В БУФЕРЕ
  191.         JR      Z,DRD1          ;БЛОК В БУФЕРЕ
  192.         LD      (IX-_RQCOM),_SEEK ;ПОЗИЦИОНИРОВАНИЕ
  193.         CALL    DJMP
  194. ;        OR      A
  195.         RET     NZ              ;ОШИБКА ПОЗИЦИОНИРОВАНИЯ
  196.         LD      (IX-_RQCOM),_READ ;ЧТЕНИЕ
  197.         CALL    DJMP
  198. ;        OR      A
  199.         RET     NZ              ;ОШИБКА ЧТЕНИЯ
  200. DRD1:   CALL    BLKRD           ;ЧТЕНИЕ БУФЕРА
  201.         JR      NZ,DRD          ;СЛЕДУЮЩИЙ БЛОК
  202.         RET
  203. ;-----------------------
  204. ;ЗАПИСЬ
  205. DWR:   LD      (IX-_RQCOM),_SEEK ;ПОЗИЦИОНИРОВАНИЕ
  206.         CALL    DJMP
  207. ;        OR      A
  208.         RET     NZ              ;ОШИБКА ПОЗИЦИОНИРОВАНИЯ
  209. DWR1:   CALL    FIND            ;ПОИСК БЛОКА В БУФЕРЕ
  210.         JR      Z,DWR2          ;БЛОК В БУФЕРЕ
  211.         LD      (IX-_RQCOM),_READ ;ЧТЕНИЕ
  212.         CALL    DJMP
  213. ;        OR      A
  214.         RET     NZ              ;ОШИБКА ЧТЕНИЯ
  215. DWR2:   CALL    BLKWR           ;ЗАПИСЬ В БУФЕР
  216.         LD      (IX-_RQCOM),_WRITE ;ЗАПИСЬ
  217.         CALL    DJMP
  218.         POP     HL              ;АДРЕС В БУФЕРЕ
  219. ;        OR      A
  220.         RET     NZ              ;ОШИБКА ЗАПИСИ
  221.         CALL    BLKF
  222.         JR      NZ,DWR1         ;СЛЕДУЮЩИЙ БЛОК
  223.         RET
  224. ;-----------------------
  225. ;ЗАПИСЬ СЕКТОРАМИ
  226. DWRS:   LD      A,_COMERR       ;ЗАПРЕЩЕННАЯ КОМАНДА
  227.         OR      A
  228.         RET
  229. ;-----------------------
  230. ;ПОИСК БЛОКА В БУФЕРЕ
  231. ;ВХОД:(BC)-БЛОК ОПИСАНИЯ КАНАЛА
  232. ;ВЫХОД: А - РЕЗУЛЬТАТ ПОИСКА
  233. ;         0 - БЛОК НАЙДЕН
  234. ;       0FFH- БЛОК НЕ НАЙДЕН
  235. ;
  236. FIND:  PUSH    BC
  237.         LD      B,(IY+_DFN)      ;РАЗМЕР СЕКТОРА
  238.         LD      C,0FFH
  239.         LD      A,(RQBLOCK)     ;ПРИВЕДЕННЫЙ НОМЕР БЛОКА
  240.         INC     B
  241.         JR      FIND2           ;СЕКТОР=128 БАЙТ?
  242. FIND1: SRL     A               ;ВЫЧИСЛЕНИЕ ПРИВЕДЕННОГО НОМЕРА СЕКТОРА
  243.         SLA     C               ;CALACULATE ~MASK
  244. FIND2:  DJNZ    FIND1
  245.         LD      (RQSECT),A      ;ПРИВЕДЕННЫЙ НОМЕР СЕКТОРА
  246.         LD      A,(RQBLOCK)
  247.         OR      C
  248.         XOR     C               ;RQBLOCK & MASK => A
  249.         LD      C,0
  250.         SRL     A
  251.         RR      C
  252.         LD      B,A
  253.         LD      HL,BUF_MON
  254.         LD      (DCBUF),HL      ;АДРЕС БУФЕРА
  255.         ADD     HL,BC
  256.         LD      (LOCBUF),HL     ;АДРЕС БЛОКА В БУФЕРЕ
  257. ;
  258.         LD      A,(RQCHAN)      ;НОМЕР КАНАЛА БУФЕРА
  259.         CP      (IX-_BUFT)      ;НОМЕРА КАНАЛОВ СОВПАДАЮТ?
  260.         JR      NZ,FIND3        ;НЕТ
  261.  
  262.         LD      HL,(RQTRACK)    ;ДОРОЖКА В ЗАПРОСЕ
  263.         LD      BC,(BUFTRK)     ;ДОРОЖКА В БУФЕРЕ
  264.         SBC     HL,BC           ;(CY=0)
  265.         JR      NZ,FIND3        ;НОМЕРА ДОРОЖЕК НЕ СОВПАДАЮТ
  266.  
  267.         LD      A,(RQSECT)      ;НОМЕР СЕКТОРА В ЗАПРОСЕ
  268.         CP      (IX-_BUFSEC)    ;ЕСТЬ СОВПАДЕНИЕ?
  269.         JR      NZ,FIND3        ;НЕТ
  270.         XOR     A               ;ПРИЗНАК СОВПАДЕНИЯ
  271.         JR      FIND4
  272. FIND3:
  273.         LD      A,(RQCHAN)      ;НОМЕР КАНАЛА
  274.         LD      (BUFT),A        ;СОСТОЯНИЕ БУФЕРА
  275.  
  276.         LD      HL,(RQTRACK)    ;ДОРОЖКА(LB)
  277.         LD      (BUFTRK),HL
  278.  
  279.         LD      A,(RQSECT)      ;
  280.         LD      (BUFSEC),A      ;СЕКТОР
  281.         LD      A,0FFH
  282.         AND     A               ;ФЛАГ НОВОГО СЕКТОРА
  283. FIND4: POP     BC
  284.         RET
  285.  
  286. ;-----------------------
  287. ;ЧТЕНИЕ БЛОКА В БУФЕРЕ
  288. BLKRD:  PUSH    AF
  289.         PUSH    DE
  290.         LD      BC,128          ;РАЗМЕР БЛОКА
  291.         LD      DE,(RQBADR)     ;ПРИЕМНИК
  292.         LD      HL,(LOCBUF)     ;ИСТОЧНИК
  293.         RST     8               ;ПЕРЕСЫЛКА
  294.         DB      0FEH,3
  295.         EX      DE,HL           ;АДРЕС ПОЛЬЗОВАТЕЛЯ
  296.         POP     DE
  297.         POP     AF
  298. BLKF:   LD      (RQBADR),HL     ;АДРЕС ПОЛЬЗОВАТЕЛЯ
  299.         LD      L,_REPN
  300.         LD      (IX-_REP),L     ;ОБНОВИТЬ СЧЕТЧИК ПОВТОРОВ
  301.         INC     (IX-_RQBLOCK)
  302.         DEC     (IX-_RQBLN)     ;БЛОК ПОСЛЕДНИЙ?
  303.         RET
  304. ;-----------------------
  305. ;ЗАПИСЬ БЛОКА В БУФЕР
  306. BLKWR:  PUSH    DE
  307.         LD      BC,128          ;РАЗМЕР БЛОКА
  308.         LD      DE,(LOCBUF)     ;ПРИЕМНИК
  309.         LD      HL,(RQBADR)     ;ИСТОЧНИК
  310.         RST     8               ;ПЕРЕСЫЛКА
  311.         DB      3,0FEH
  312.         POP     DE
  313.         EX      (SP),HL         ;АДРЕС ПОЛЬЗОВАТЕЛЯ
  314.         JP      (HL)
  315. ;-----------------------
  316. ;НАЗНАЧЕНИЕ КАНАЛА
  317. CHSET: LD      (IY),0FFH       ;ПРИЗНАК РЕАЛЬНОСТИ
  318.         PUSH    IY
  319.         POP     DE
  320.         INC     DE
  321.         LD      HL,(RQBADR)
  322.         LD      BC,22H
  323.         RST     8
  324.         DB      3,0FEH
  325.         EI
  326.         LD      (IX-_RQCOM),_RESET ;СБРОС КАНАЛА
  327.         CALL    DISK
  328.         LD      (IX-_RQCOM),_RECAL ;РЕКАЛИБРОВКА
  329.         JP      DISK
  330. ;-----------------------
  331. ;ПОЛУЧИТЬ БЛОК ОПИСАНИЯ КАНАЛА
  332. CHCHK: PUSH    IY
  333.         POP     HL
  334.         INC     HL
  335.         LD      DE,(RQBADR)
  336.         LD      BC,22H
  337.         RST     8
  338.         DB      0FEH,3
  339.         EI
  340.         XOR     A               ;УСПЕХ
  341.         RET
  342. ;-----------------------
  343. ; ИНДЕКСИРОВАНИЕ
  344. _IND:   CALL    ADD_HL_2A
  345.         LD      E,(HL)
  346.         INC     HL
  347.         LD      D,(HL)
  348.         EX      DE,HL
  349.         RET
  350.