Subversion Repositories pentevo

Rev

Rev 553 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.  
  2. ;LAST UPDATE: 01.10.2011 savelij
  3.  
  4. SMUC            EQU 0
  5.  
  6. MASTER          EQU 0
  7. SLAVE           EQU 0X80
  8.  
  9. DRV_A           EQU 0           ;DRIVE A
  10. DRV_B           EQU 1           ;DRIVE B
  11. DRV_C           EQU 2           ;DRIVE C
  12. DRV_D           EQU 3           ;DRIVE D
  13. SDZ             EQU 4           ;SD КАРТА НА ZC
  14. SDG             EQU 5           ;SD КАРТА НА NeoGS
  15. HDDN            EQU 6           ;HDD НА NEMO
  16. HDDS            EQU 7           ;HDD НА SMUC
  17.  
  18. ;ВЫЗОВ ВЫБРАННОГО ДРАЙВЕРА
  19. TO_DRV          PUSH HL
  20.                 LD L,A
  21.                 LD A,IYL
  22.                 AND A
  23.                 LD A,L
  24.                 JR NZ,TO_DRV1
  25.                 RST 0X10
  26.                 LD A,(REG_A)
  27.                 LD DE,(REG_E)
  28.                 LD BC,(REG_C)
  29.                 LD HL,(REG_L)
  30.                 EX (SP),HL
  31. TO_DRV1         LD HL,(GO_DEV)
  32.                 EX (SP),HL
  33.                 RET
  34.  
  35. ;ВНЕШНИЙ ВЫЗОВ МЕНЕДЖЕРА УСТРОЙСТВ
  36. COM_DEV         EX AF,AF'
  37.                 RST 0X10
  38.                 LD A,(NEXTBYTERST8)
  39.                 PUSH IY
  40.                 LD IYL,0                        ;ВНЕШНИЙ ВЫЗОВ
  41. NEXT_ICOM_DEV   PUSH IX
  42.                 PUSH HL
  43.                 LD HL,EXITDEV
  44.                 EX (SP),HL
  45.                 PUSH HL
  46.                 ADD A,A
  47.                 ADD A,LOW (TABLDEV)
  48.                 LD L,A
  49.                 ADC A,HIGH (TABLDEV)
  50.                 SUB L
  51.                 LD H,A
  52.                 LD A,(HL)
  53.                 INC HL
  54.                 LD H,(HL)
  55.                 LD L,A
  56.                 EX AF,AF'
  57.                 EX (SP),HL
  58.                 RET
  59.  
  60. EXITDEV         POP IX
  61.                 POP IY
  62.                 RET
  63.  
  64. ;ВНУТРЕННИЙ ВЫЗОВ МЕНЕДЖЕРА УСТРОЙСТВ
  65. ICOM_DEV        EX AF,AF'
  66.                 EX (SP),HL
  67.                 LD A,(HL)
  68.                 INC HL
  69.                 EX (SP),HL
  70.                 PUSH IY
  71.                 LD IYL,1                        ;ВНУТРЕННИЙ ВЫЗОВ
  72.                 JR NEXT_ICOM_DEV
  73.  
  74. TABLDEV         DW DEVFIND                      ;00 ПОИСК УСТРОЙСТВ
  75.                 DW SET_VOL                      ;01 ВЫБОР РАЗДЕЛА
  76.                 DW KOL_VOL                      ;02 ЗАПРОС НАЙДЕНОГО
  77.                 DW SET_DEVICE                   ;03 УСТАНОВКА БИТОВ УСТРОЙСТВА И LBA РЕЖИМА
  78.                 DW TO_DRV                       ;04 ВЫЗОВ ДРАЙВЕРА ВЫБРАННОГО УСТРОЙСТВА
  79.                 DW COMHDDNEX                    ;05 ПРЯМОЙ ВЫЗОВ ДРАЙВЕРА HDD NEMO (ВРЕМЕННАЯ ФУНКЦИЯ)
  80.  
  81. ;ФОРМАТ ТАБЛИЦЫ НАЙДЕННЫХ РАЗДЕЛОВ
  82. ;+0(1)-0-DRIVE A
  83. ;      1-DRIVE B
  84. ;      2-DRIVE C
  85. ;      3-DRIVE D
  86. ;      4-SD КАРТА ZC
  87. ;      5-SD КАРТА NEOGS
  88. ;      6-HDD NEMO
  89. ;      7-HDD SMUC
  90. ;+1(1)-ДЛЯ SD-ТУПО 0
  91. ;      ИНАЧЕ HDD/CD 0-MASTER, 1-SLAVE
  92. ;+2(1)-ТИП РАЗДЕЛА, В ТАБЛИЦЕ ТОЛЬКО
  93. ;РАЗДЕЛЫ:
  94. ;00=01-FAT12
  95. ;01=06,0E-FAT16
  96. ;02=0B,0C-FAT32
  97. ;+3(4)-СТАРТОВЫЙ СЕКТОР
  98. ;+7(1)-РЕЗЕРВ
  99.  
  100. ;ТОЧКА ВХОДА ДЛЯ ПОИСКА РАЗДЕЛОВ
  101. ;HL-АДРЕС КУДА ПОКЛАСТЬ ТАБЛИЦУ РАЗДЕЛОВ
  102. ;НА ВЫХОДЕ:
  103. ;A-КОЛ-ВО РАЗДЕЛОВ
  104. DEVFIND         XOR A
  105.                 LD (KOLDVOL),A                  ;КОЛИЧЕСТОВ НАЙДЕННЫХ РАЗДЕЛОВ
  106.                 LD IX,ADRTVOL                   ;АДРЕС ТАБЛИЦЫ НАЙДЕННЫХ РАЗДЕЛОВ
  107.                 LD A,IYL
  108.                 LD IYL,1
  109.                 AND A
  110.                 JR NZ,DEVFIND1
  111.                 LD HL,FOR_EXTERN
  112.                 PUSH HL
  113. ;NEMO
  114. DEVFIND1        LD HL,BUFFSEC                   ;АДРЕС БУФЕРА ДЛЯ ЗАГРУЗКИ СЕКТОРА (512 БАЙТ)
  115.                 CALL COMHDDN
  116.                 DB Hddinit                      ;ИНИЦИАЛИЗАЦИЯ УСТРОЙСТА С ОПРЕДЕЛЕНИЕМ ЧТО ПОДКЛЮЧЕНО
  117.                 LD A,H
  118.                 AND A
  119.                 LD A,HDDN+MASTER
  120.                 LD HL,BUFFSEC
  121.                 PUSH IY
  122.                 CALL Z,RD0HDD                   ;ПОИСК РАЗДЕЛОВ НА НАЙДЕННОМ УСТРОЙСТВЕ - HDD MASTER
  123.                 POP IY
  124. ;SMUC
  125.                 IF SMUC=1
  126.                 LD HL,BUFFSEC
  127.                 CALL COMHDDS
  128.                 DB 0                            ;ИНИЦИАЛИЗАЦИЯ УСТРОЙСТА С ОПРЕДЕЛЕНИЕМ ЧТО ПОДКЛЮЧЕНО
  129.                 LD A,H
  130.                 AND A
  131.                 LD A,HDDS+MASTER
  132.                 LD HL,BUFFSEC
  133.                 PUSH IY
  134.                 CALL Z,RD0HDDS                  ;ПОИСК РАЗДЕЛОВ НА НАЙДЕННОМ УСТРОЙСТВЕ - HDD MASTER
  135.                 POP IY
  136.                 ENDIF
  137. ;SD ON NEOGS
  138.                 CALL INSTSDD                    ;УCТАНОВКА ДРАЙВЕРА SD КАРТЫ НА NEOGS
  139.                 AND A
  140.                 JR NZ,DEVFND1                   ;НЕ ИНИЦИАЛИЗИРОВАТЬ ЕСЛИ NEOGS НЕ НАЙДЕН
  141.                 CALL COMSDG
  142.                 DB 0                            ;ИНИЦИАЛИЗАЦИЯ SD КАРТЫ НА NEOGS
  143.                 AND A
  144.                 PUSH IY
  145.                 CALL Z,RD0SDG                   ;ПОИСК РАЗДЕЛОВ НА УСТРОЙСТВЕ
  146.                 POP IY
  147. ;SD ON Z-CONTROLLER
  148. DEVFND1         CALL COMSDZ
  149.                 DB 0                            ;ИНИЦИАЛИЗАЦИЯ SD КАРТЫ
  150.                 AND A
  151.                 PUSH IY
  152.                 CALL Z,RD0SD                    ;ПОИСК РАЗДЕЛОВ НА УСТРОЙСТВЕ
  153.                 POP IY
  154.                 LD IYL,0
  155.                 CALL SETVOLD                    ;ВЫЧИСЛЕНИЕ КОЛИЧЕСТВА НАЙДЕННЫХ РАЗДЕЛОВ НА ВСЕХ УСТРОЙСТВАХ
  156.                 SCF
  157.                 RET Z                           ;ВЫХОД ЕСЛИ НЕ НАЙДЕН НЕ ОДИН РАЗДЕЛ
  158.                 DEC A
  159.                 CALL SET_VOL1                   ;ВЫБОР ПОСЛЕДНЕГО НАЙДЕНОГО УСТРОЙСТВА
  160.                 RET C
  161. ;ЗАПРОС НАЙДЕНОГО И ТЕКУЩЕГО ВЫБРАННОГО УСТРОЙСТВА
  162. IKOL_VOL        LD HL,(ADRTEKV)                 ;АДРЕС ТЕКУЩЕГО ВЫБРАННОГО РАЗДЕЛА
  163.                 INC HL
  164.                 INC HL
  165.                 LD A,(HL)                       ;ТИП РАЗДЕЛА
  166.                 LD DE,(KOLDVOL)                 ;D-НОМЕР ВЫБРАННОГО РАЗДЕЛА, E-КОЛИЧЕСТВО НАЙДЕННЫХ РАЗДЕЛОВ
  167.                 LD HL,ADRTVOL                   ;АДРЕС НАЧАЛА ТАБЛИЦЫ НАЙДЕННЫХ РАЗДЕЛОВ
  168.                 AND A
  169.                 RET
  170.  
  171. KOL_VOL         LD HL,(ADRTEKV)                 ;АДРЕС ТЕКУЩЕГО ВЫБРАННОГО РАЗДЕЛА
  172.                 INC HL
  173.                 INC HL
  174.                 LD A,(HL)                       ;ТИП РАЗДЕЛА
  175.                 LD HL,(KOLDVOL)                 ;D-НОМЕР ВЫБРАННОГО РАЗДЕЛА, E-КОЛИЧЕСТВО НАЙДЕННЫХ РАЗДЕЛОВ
  176.                 LD (REG_E),HL
  177.                 AND A
  178.                 PUSH AF
  179.                 POP HL
  180.                 LD (REG_F),HL
  181.                 RET
  182.  
  183. FOR_EXTERN      PUSH AF
  184.                 POP HL
  185.                 LD (REG_F),HL
  186.                 LD BC,0X100                     ;ПЕРЕНОС ДО 256 БАЙТ
  187.                 LD DE,(REG_L)                   ;АДРЕС КУДА ПЕРЕНОСИТЬ
  188.                 LD HL,ADRTVOL
  189.                 LD A,D
  190.                 CP 0XC0                         ;ВЕРХНЯЯ ГРАНИЦА АДРЕСА ПЕРЕНОСА
  191.                 JR NC,LDIR4EXTRN
  192.                 CP 0X7F                         ;НИЖНЯЯ ГРАНИЦА АДРЕСА ПЕРЕНОСА
  193.                 JR C,LDIR4EXTRN
  194.                 PUSH BC
  195.                 LD BC,WIN_A1                    ;ЕСЛИ ПЕРЕНОС В ПРЕДЕЛАХ 2-ГО ОКНА
  196.                 LD A,0X7D
  197.                 OUT (C),A                       ;ВКЛЮЧИЛИ СТРАНИЦУ 2-ГО ОКНА В 1-У ОКНО
  198.                 LD A,D
  199.                 SUB 0X40
  200.                 LD D,A                          ;АДРЕС ПЕРЕНОСА УМЕНЬШИЛИ
  201.                 POP BC
  202.                 LD A,E
  203.                 AND A                           ;ПРОВЕРКА НА ВЫРАВНИВАНИЕ 256 БАЙТ
  204.                 JR Z,LDIR4EXTRN2
  205.                 NEG
  206.                 LD C,A
  207.                 NEG
  208.                 LD B,0
  209.                 LDIR                            ;ЕСЛИ НЕ ВЫРОВНЕНО, ТО ПЕРЕНОСИМ НАЧАЛО ТАБЛИЦЫ
  210.                 LD C,A
  211.                 LD B,0
  212. LDIR4EXTRN2     LDIR                            ;ПЕРЕНЕСЛИ ОСТАТОК ТАБЛИЦЫ
  213.                 LD BC,WIN_A1
  214.                 LD A,0X7A
  215.                 OUT (C),A                       ;ВЕРНУЛИ СТРАНИЦУ В 1-Е ОКНО
  216.                 JR LDIR4EXTRN1
  217.  
  218. LDIR4EXTRN      LDIR
  219. LDIR4EXTRN1     LD HL,(KOLDVOL)
  220.                 LD (REG_E),HL
  221.                 RET
  222.  
  223. ;ВЫЧИСЛЕНИЕ КОЛИЧЕСТВА НАЙДЕННЫХ РАЗДЕЛОВ НА ВСЕХ УСТРОЙСТВАХ
  224. SETVOLD         LD A,IXL
  225.                 RRCA
  226.                 RRCA
  227.                 RRCA
  228.                 AND 0X1F
  229.                 LD (KOLDVOL),A
  230.                 AND A
  231.                 RET
  232.  
  233. ;ПОИСК РАЗДЕЛОВ НА SD КАРТЕ NEOGS
  234. RD0SDG          LD HL,BUFFSEC
  235.                 LD A,SDG
  236.                 PUSH AF
  237.                 LD DE,0
  238.                 LD B,D
  239.                 LD C,E
  240.                 PUSH HL
  241.                 CALL COMSDG
  242.                 DB 2
  243.                 JR RD0HDD_
  244.  
  245. ;ПОИСК РАЗДЕЛОВ НА SD КАРТЕ Z-КОНТРОЛЛЕРА
  246. RD0SD           LD HL,BUFFSEC
  247.                 LD A,SDZ
  248.                 PUSH AF
  249.                 LD DE,0
  250.                 LD B,D
  251.                 LD C,E
  252.                 PUSH HL
  253.                 CALL COMSDZ
  254.                 DB 2
  255.                 JR RD0HDD_
  256.  
  257. ;ПОИСК РАЗДЕЛОВ НА HDD SMUC
  258.                 IF SMUC=1
  259. RD0HDDS         PUSH AF
  260.                 PUSH HL
  261.                 LD (ADRTEKV),IX
  262.                 LD B,A
  263.                 AND 0X80
  264.                 RLCA
  265.                 LD (IX+1),A
  266.                 LD A,B
  267.                 LD DE,0
  268.                 LD B,D
  269.                 LD C,E
  270.                 CALL COMHDDS
  271.                 DB 2
  272.                 JR RD0HDD_
  273.                 ENDIF
  274.  
  275. ;ПОИСК РАЗДЕЛОВ НА HDD NEMO
  276. RD0HDD          PUSH AF
  277.                 PUSH HL
  278.                 LD (ADRTEKV),IX
  279.                 LD B,A
  280.                 AND 0X80
  281.                 RLCA
  282.                 LD (IX+1),A
  283.                 LD A,B
  284.                 LD DE,0
  285.                 LD B,D
  286.                 LD C,E
  287.                 CALL COMHDDN
  288.                 DB 2
  289. RD0HDD_         LD DE,0X01BE            ;СМЕЩЕНИЕ В 0 СЕКТОРЕ УСТРОЙСТВА ДО ТАБЛИЦЫ MBR
  290.                 POP IY
  291.                 PUSH IY
  292.                 ADD IY,DE               ;УСТАНОВИЛИ УКАЗАТЕЛЬ НА НАЧАЛО ОПИСАТЕЛЕЙ РАЗДЕЛОВ
  293.                 LD BC,0X0400            ;РАЗДЕЛОВ МАКСИМУМ 4 И ОБНУЛИЛИ СЧЕТЧИК РАЗДЕЛОВ С FAT
  294. RD0HDD0         LD A,(IY)               ;ПЕРВЫЙ БАЙТ 16 БАЙТНОГО ОПИСАТЕЛЯ
  295.                 AND A                   ;ДОЛЖЕН БЫТЬ РАВЕН 0
  296.                 JR Z,RD0HDD1
  297.                 CP 0X80                 ;ИЛИ 0X80 (ПРИЗНАК ЗАГРУЗОЧНОГО РАЗДЕЛА)
  298.                 JR NZ,RD0HDD2
  299. RD0HDD1         LD A,(IY+4)             ;БАЙТ ТИПА РАЭДЕЛА
  300.                 CALL CP_RAZD            ;ПРОВЕРКА ТИПА РАЗДЕЛА
  301.                 JR NZ,RD0HDD2           ;ЕСЛИ НЕ FAT ТОПРОЕВЕРЯЕМ СЛЕДУЮЩУЮ 16 БАЙТНУЮ ЗАПИСЬ
  302.                 INC C
  303. RD0HDD2         LD DE,0X10
  304.                 ADD IY,DE
  305.                 DJNZ RD0HDD0            ;ПРОВЕРЯЕМ СЛЕДУЮЩУЮ 16 БАЙТНУЮ ЗАПИСЬ В MBR
  306.                 LD A,C
  307.                 AND A
  308.                 POP HL
  309.                 JP NZ,SCANMBR
  310.                 PUSH HL
  311.                 POP IY
  312.                 LD C,(IY+0X0D)
  313.                 XOR A
  314.                 LD E,A
  315.                 LD B,8
  316.                 RR C
  317.                 ADC A,0
  318.                 DJNZ $-4
  319.                 DEC A
  320.                 JR NZ,$+3
  321.                 INC E
  322.                 LD A,(IY+0X0E)
  323.                 OR (IY+0X0F)
  324.                 JR Z,$+3
  325.                 INC E
  326.                 LD A,(IY+0X13)
  327.                 OR (IY+0X14)
  328.                 JR NZ,$+3
  329.                 INC E
  330.                 LD A,(IY+0X20)
  331.                 OR (IY+0X21)
  332.                 OR (IY+0X22)
  333.                 OR (IY+0X22)
  334.                 JR NZ,$+3
  335.                 INC E
  336.                 LD A,(IY+0X15)
  337.                 AND 0XF0
  338.                 CP 0XF0
  339.                 JR NZ,$+3
  340.                 INC E
  341.                 LD A,E
  342.                 CP 4
  343.                 INC SP
  344.                 INC SP
  345.                 RET NZ
  346.                 DEC SP
  347.                 DEC SP
  348.                 POP AF
  349.                 BIT 7,A
  350.                 LD B,0
  351.                 JR Z,$+3
  352.                 INC B
  353.                 AND 0X7F
  354.                 LD C,A
  355.                 PUSH IX
  356.                 POP HL
  357.                 XOR A
  358.                 LD (HL),C
  359.                 INC HL
  360.                 LD (HL),B
  361.                 INC HL
  362.                 LD (HL),0XFF
  363.                 INC HL
  364.                 LD (HL),A
  365.                 INC HL
  366.                 LD (HL),A
  367.                 INC HL
  368.                 LD (HL),A
  369.                 INC HL
  370.                 LD (HL),A
  371.                 INC HL
  372.                 LD (HL),A
  373.                 LD DE,8
  374.                 ADD IX,DE
  375.                 CALL SETVOLD
  376.                 DEC A
  377.                 LD (IX-6),0XFF
  378.                 JP SET_VOL
  379.  
  380. ;НА ВХОДЕ:
  381. ;A-BIT 7-0/1-MASTER/SLAVE
  382. ;BITS 6-0-ТИП НОСИТЕЛЯ
  383. SCANMBR         POP AF
  384.                 LD DE,0X01BE
  385.                 ADD HL,DE
  386.                 EXX
  387.                 BIT 7,A
  388.                 LD B,0
  389.                 JR Z,$+3
  390.                 INC B
  391.                 AND 0X7F
  392.                 LD C,A
  393.                 EXX
  394.                 LD B,0
  395.                 LD A,4
  396. SCNMBR0         EX AF,AF'
  397.                 LD A,(HL)
  398.                 LD C,4
  399.                 ADD HL,BC
  400.                 LD C,0X0C
  401.                 AND A
  402.                 JR Z,SCNMBR1
  403.                 CP 0X80
  404.                 JR NZ,SCNMBR2
  405. SCNMBR1         LD A,(HL)
  406.                 AND A
  407.                 JR Z,SCNMBR2
  408.                 CALL CP_RAZD
  409.                 JR NZ,SCNMBR2
  410. SCNMBR3         EXX
  411.                 LD (IX),C
  412.                 LD (IX+1),B
  413.                 EXX
  414.                 LD (IX+2),E
  415.                 LD C,4
  416.                 PUSH IX
  417.                 POP DE
  418.                 INC DE
  419.                 INC DE
  420.                 INC DE
  421.                 ADD HL,BC
  422.                 LDI
  423.                 LDI
  424.                 LDI
  425.                 LDI
  426.                 LD (IX+7),0
  427. SCNMBR4         LD C,8
  428.                 ADD IX,BC
  429.                 LD C,4
  430. SCNMBR2         ADD HL,BC
  431.                 EX AF,AF'
  432.                 DEC A
  433.                 JR NZ,SCNMBR0
  434. SCNMBR5         CALL SETVOLD
  435.                 SCF
  436.                 RET Z
  437.                 DEC A
  438. ;ВЫБОР РАЗДЕЛА
  439. SET_VOL         LD L,A
  440.                 LD A,IYL
  441.                 AND A
  442.                 LD A,L
  443.                 JR NZ,SET_VOL1
  444.                 LD A,(REG_A)
  445. SET_VOL1        LD HL,KOLDVOL
  446.                 CP (HL)
  447.                 CCF
  448.                 RET C
  449.                 LD (SETDVOL),A
  450.                 LD L,A
  451.                 LD H,0
  452.                 ADD HL,HL
  453.                 ADD HL,HL
  454.                 ADD HL,HL
  455.                 LD DE,ADRTVOL
  456.                 ADD HL,DE
  457.                 LD (ADRTEKV),HL
  458.                 LD A,(HL)
  459.                 CP 4
  460. ;               LD HL,DISKETA           ;ЕЩЕ НЕ ОСИЛИЛ
  461.                 JR C,SET_DRV
  462.                 SUB 4
  463.                 LD HL,COMSDZ
  464.                 JR Z,SET_DRV
  465.                 DEC A
  466.                 LD HL,COMSDG
  467.                 JR Z,SET_DRV
  468.                 DEC A
  469.                 LD HL,COMHDDN
  470.                 IF SMUC=1
  471.                 JR Z,SET_DRV
  472.                 LD HL,COMHDDS
  473.                 ENDIF
  474. SET_DRV         LD (GO_DEV),HL
  475.                 XOR A
  476.                 RET
  477.  
  478. SET_DEVICE      PUSH AF
  479.                 PUSH HL
  480.                 LD A,B
  481.                 AND 0X0F
  482.                 LD B,A
  483.                 LD HL,(ADRTEKV)
  484.                 INC HL
  485.                 LD A,(HL)
  486.                 AND 1                           ;MASTER ИЛИ SLAVE?
  487.                 RLCA
  488.                 RLCA
  489.                 RLCA
  490.                 RLCA
  491.                 OR 0XE0                         ;ВСЕГДА LBA РЕЖИМ
  492.                 OR B
  493.                 LD B,A                          ;УСТАНОВИЛИ ВЫБРАННОЕ УСТРОЙСТВО MASTER ИЛИ SLAVE
  494.                 POP HL
  495.                 POP AF
  496.                 RET
  497.  
  498. ;ПРОВЕРКА ТИПА РАЗДЕЛА
  499. CP_RAZD         LD E,1                  ;FAT16
  500.                 CP 4
  501.                 RET Z
  502.                 CP 6
  503.                 RET Z
  504.                 CP 0X0E
  505.                 RET Z
  506.                 LD E,2                  ;FAT32
  507.                 CP 0X0B
  508.                 RET Z
  509.                 CP 0X0C
  510.                 RET Z
  511.                 LD E,0                  ;FAT12
  512.                 CP 1
  513.                 RET
  514.  
  515. ;ВРЕМЕННАЯ ФУНКЦИЯ ВЫЗОВА ДРАЙВЕРА HDD NEMO
  516. COMHDDNEX       RST 0X10
  517.                 LD A,(REG_A)
  518.                 LD DE,(REG_E)
  519.                 LD BC,(REG_C)
  520.                 LD HL,(REG_L)
  521.                 JP COMHDDN
  522.