Subversion Repositories pentevo

Rev

Rev 952 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.  
  2. ; LAST UPDATE: 16.02.2025 savelij
  3.  
  4. MASTER          EQU 0
  5. SLAVE           EQU 0x80
  6.  
  7. EXTERNAL        EQU 0                   ; внешний вызов
  8. INTERNAL        EQU 1                   ; внутренний вызов
  9. INT4EXT         EQU 3                   ; внутренний вызов для вызвавшей проги
  10.  
  11. B_SDZ           EQU %00000001
  12. B_SDG           EQU %00000010
  13. B_HDD           EQU %00000100
  14. B_NEW_SD        EQU %01000000
  15. B_INST_SDG      EQU %10000000
  16.  
  17. CRC_SIZE        EQU 0xE0
  18.  
  19. ; вызов выбранного драйвера
  20. TO_DRV          PUSH HL
  21.                 LD L,A
  22.                 LD A,IYL
  23.                 AND A
  24.                 LD A,L
  25.                 JR NZ,TO_DRV1
  26.                 CALL P5_READ_BYTE
  27.                 LD A,(RREG_A)
  28.                 LD DE,(RREG_E)
  29.                 LD BC,(RREG_C)
  30.                 LD HL,(RREG_L)
  31.                 EX (SP),HL
  32. TO_DRV1         LD HL,(DEVMAN_VARS.GO_DEV)
  33.                 EX (SP),HL
  34.                 RET
  35.  
  36. ; внешний вызов менеджера устройств
  37. COM_DEV         EX AF,AF'
  38.                 CALL P5_READ_BYTE
  39.                 LD A,(NEXTBYTERST8)
  40.                 PUSH IY
  41.                 LD IYL,EXTERNAL                 ; внешний вызов
  42. NEXT_ICOM_DEV   PUSH IX
  43.                 PUSH HL
  44.                 LD HL,EXITDEV
  45.                 EX (SP),HL
  46.                 PUSH HL
  47.                 ADD A,A
  48.                 ADD A,LOW (TABLDEV)
  49.                 LD L,A
  50.                 ADC A,HIGH (TABLDEV)
  51.                 SUB L
  52.                 LD H,A
  53.                 LD A,(HL)
  54.                 INC HL
  55.                 LD H,(HL)
  56.                 LD L,A
  57.                 EX AF,AF'
  58.                 EX (SP),HL
  59.                 RET
  60.  
  61. EXITDEV         POP IX
  62.                 POP IY
  63.                 RET
  64.  
  65. ; внутренний вызов менеджера устройств
  66. ICOM_DEV        EX AF,AF'
  67.                 EX (SP),HL
  68.                 LD A,(HL)
  69.                 INC HL
  70.                 EX (SP),HL
  71.                 PUSH IY
  72.                 LD IYL,INTERNAL                 ; внутренний вызов
  73.                 JR NEXT_ICOM_DEV
  74.  
  75. TABLDEV         DW DEVFIND                      ; 00 поиск устройств
  76.                 DW SET_VOL                      ; 01 выбор раздела
  77.                 DW KOL_VOL                      ; 02 запрос найденого
  78.                 DW GET_FNDVOLUME                ; 03 получить таблицу найденных разделов
  79.                 DW TO_DRV                       ; 04 вызов драйвера выбранного устройства
  80.                 DW SET_DEVICE                   ; 05 установка битов устройства и LBA режима
  81.                 DW CONTROL_SD                   ; 06 контроль наличия SD карт
  82.                 DW COMHDDNEX                    ; 07 прямой вызов драйвера HDD NEMO
  83.                 DW FREINIT_VOL                  ; 08 полная переинициализация раздела
  84.                 DW SET_SECTOR_NUM               ; 09 установка номера сектора для чтения/записи
  85.  
  86. ; ФОРМАТ ТАБЛИЦЫ НАЙДЕННЫХ РАЗДЕЛОВ
  87. ; +0(1)-нумерацию смотреть в сорце nums_devices.a80
  88. ; +1(1)-для SD-всегда 0
  89. ;       иначе HDD/CD 0-MASTER, 1-SLAVE
  90. ; +2(1)-тип раздела, в таблице только
  91. ; разделы:
  92. ; 00=01-FAT12
  93. ; 01=04,06,0E-FAT16
  94. ; 02=0B,0C-FAT32
  95. ; +3(4)-стартовый сектор раздела
  96. ; +7(1)-резерв
  97.  
  98. ; точка входа для поиска разделов
  99. ; HL-адрес куда покласть таблицу разделов
  100. ; на выходе:
  101. ; A-кол-во разделов
  102. DEVFIND         LD A,(DEVMAN_VARS.FLAGS_DRV)
  103.                 AND B_NEW_SD
  104.                 JR NZ,.L1
  105.                 LD HL,CRC_SIZE
  106.                 LD IX,BUF_VOLUMES
  107.         ROMCALL CRC16_FAST,ROM_RST81
  108.                 LD BC,(BUF_VOLUMES + 0xFE)
  109.                 AND A
  110.                 SBC HL,BC
  111.                 JP Z,KOL_VOL
  112. .L1             LD HL,DEVMAN_VARS.FLAGS_DRV
  113.                 LD A,B_NEW_SD!0xFF
  114.                 AND (HL)
  115.                 LD (HL),A
  116.                 PUSH IY
  117.                 XOR A
  118.                 LD (DEVMAN_VARS.KOLDVOL),A
  119.                 LD HL,BUF_VOLUMES
  120.                 LD DE,BUF_VOLUMES+1
  121.                 LD BC,0xEF
  122.                 LD (HL),B
  123.                 LDIR
  124.                 LD IX,DEVMAN_VARS.DEVICES
  125.                 LD IYL,INTERNAL
  126.                 LD A,(HDDTIMEOUT)
  127. .L2             EI
  128.                 HALT
  129.                 HALT
  130.                 DI
  131.                 DEC A
  132.                 JR NZ,.L2
  133.                 INC A
  134.                 LD (HDDTIMEOUT),A
  135. ; NEMO
  136.  
  137. ; ===== test =====
  138.         IFNDEF TESTEMUFDD
  139.                 LD HL,BUF_512                   ; адрес буфера для загрузки сектора (512 байт)
  140.                 CALL COMHDDN
  141.                 DB _DEV_INIT                    ; инициализация устройства с определением что подключено
  142.                 LD A,H
  143.                 AND A
  144.                 JR NZ,.L3
  145.                 LD (IX+0),_HDD_NEMO_MASTER+MASTER
  146.                 INC IX
  147.         ENDIF
  148. ; ===== test =====
  149.  
  150. .L3    
  151. ; SD ON NEOGS
  152.                 LD H,CMOS.BYTE_01
  153.         ROMCALL READCMOS,ROM_RST82
  154.                 LD A,L
  155.                 AND CMOS_EC.M_SD_NGS_ONOFF      ; проверка разрешения доступа к SD карте NEOGS
  156.                 JR Z,.L4                        ; если запрещен, то не вызываем
  157.                 CALL INSTSDD                    ; уcтановка драйвера SD карты на NEOGS
  158.                 AND A
  159.                 JR NZ,.L4                       ; не инициализировать если NEOGS не найден
  160.                 LD HL,DEVMAN_VARS.FLAGS_DRV
  161.                 SET 7,(HL)                      ; драйвер установился
  162.                 CALL COMSDG
  163.                 DB _DEV_INIT                    ; инициализация SD карты на NEOGS
  164.                 AND A
  165.                 JR NZ,.L4
  166.                 LD (IX+0),_SD_SDG
  167.                 INC IX
  168. .L4
  169. ; USB FLASH
  170.         IF USB_ENABLE
  171.                 CALL COMUSBF
  172.                 DB _DEV_INIT
  173.                 AND A
  174.                 JR Z,.L8
  175.                 LD (IX+0),_SL_USBF
  176.                 INC IX
  177.         ENDIF
  178. .L8
  179. ; SD ON Z-CONTROLLER
  180.                 CALL COMSDZ
  181.                 DB _DEV_INIT                    ; инициализация SD карты
  182.                 AND A
  183.                 JR NZ,.L5
  184.                 LD (IX+0),_SD_SDZ
  185.                 INC IX
  186. .L5             LD (IX+0),0xFF                  ; далее нет найденных устройств
  187.                 CALL FIND_SD
  188.                 LD HL,DEVMAN_VARS.DEVICES
  189.                 LD IX,BUF_VOLUMES
  190.                 LD A,(HL)
  191.                 INC A
  192.                 JR Z,.L7
  193. .L6             CALL FINDVOL
  194.                 INC HL
  195.                 LD A,(HL)
  196.                 INC A
  197.                 JR NZ,.L6
  198. .L7             CALL SETVOLD                    ; вычисление количества найденных разделов на всех устройствах
  199.                 POP IY
  200.                 SCF
  201.                 JP Z,KOLVOL1                    ; переход если ничего не найдено
  202.                 DEC A
  203.                 LD (DEVMAN_VARS.SETDVOL),A
  204. ; ====инициализация переменных всех найденных разделов====
  205. INIT_VOLS       LD IX,BUF_VOLUMES
  206.                 LD A,(DEVMAN_VARS.SETDVOL)
  207.                 PUSH AF                         ; сохранили текущий выбранный раздел
  208.                 LD A,(DEVMAN_VARS.KOLDVOL)
  209.                 LD E,A
  210.                 LD D,0
  211. IV_SETDRV2      PUSH AF
  212.                 LD A,D
  213.                 LD (DEVMAN_VARS.SETDVOL),A
  214.                 LD A,(IX+0)
  215.                 CP _SD_SDZ
  216.                 LD HL,COMSDZ
  217.                 JR Z,IV_SETDRV1
  218.                 CP _SL_USBF
  219.                 LD HL,COMUSBF
  220.                 JR Z,IV_SETDRV1
  221.                 CP _SD_SDG
  222.                 LD HL,COMSDG
  223.                 JR Z,IV_SETDRV1
  224.                 LD HL,COMHDDN
  225. IV_SETDRV1      LD (DEVMAN_VARS.GO_DEV),HL      ; установили адрес текущего вызываемого драйвера
  226.                 LD A,(IX+2)
  227.                 LD HL,BUF_VOLUMES
  228.                 PUSH DE
  229.                 CALL ICOM_FAT
  230.                 DB _INIT_FATVARS
  231.                 PUSH AF
  232.                 CALL SAVE_FNDVOL
  233.                 POP AF
  234.                 POP DE
  235.                 CALL C,DEL_VOL                  ; раздел неизвестен или не отформатирован, удаляем описатель
  236.                 INC D
  237.                 LD BC,8
  238.                 ADD IX,BC
  239.                 POP AF
  240.                 DEC A
  241.                 JR NZ,IV_SETDRV2
  242. ; ====инициализация переменных всех найденных разделов====
  243.                 POP AF
  244.                 CALL SET_VOL1                   ; восстановление текущего выбранного раздела
  245.                 LD A,(DEVMAN_VARS.KOLDVOL)
  246.                 DEC A
  247.                 CALL C,SET_VOL1                 ; если выбран не существующий раздел, то принудительно выбираем последний найденный
  248.                 CALL ICOM_FAT
  249.                 DB _INIT_TEKDIR
  250.                 LD HL,CRC_SIZE
  251.                 LD IX,BUF_VOLUMES
  252.         ROMCALL CRC16_FAST,ROM_RST81
  253.                 LD (BUF_VOLUMES + 0xFE),HL
  254. KOL_VOL         LD A,IYL
  255.                 AND A
  256.                 JR NZ,IKOL_VOL
  257.                 LD HL,(DEVMAN_VARS.ADRTEKV)     ; адрес текущего выбранного раздела
  258.                 INC HL
  259.                 INC HL
  260.                 LD A,(HL)                       ; тип раздела
  261.                 LD HL,(DEVMAN_VARS.KOLDVOL)     ; D-номер выбранного раздела, E-количество найденных разделов
  262.                 LD (RREG_E),HL
  263.                 AND A
  264. KOLVOL1         PUSH AF
  265.                 POP HL
  266.                 LD (RREG_F),HL
  267.                 RET
  268.  
  269. ; удаление раздела из таблицы
  270. DEL_VOL         PUSH DE
  271.                 PUSH IX
  272.                 POP HL
  273.                 EX DE,HL
  274.                 LD HL,8
  275.                 ADD HL,DE
  276.                 LD C,L
  277.                 LD A,26*8
  278.                 SUB C
  279.                 LD C,A
  280.                 LD B,0
  281.                 LDIR
  282.                 LD BC,-8
  283.                 ADD IX,BC
  284.                 LD HL,DEVMAN_VARS.KOLDVOL
  285.                 DEC (HL)
  286.                 POP DE
  287.                 DEC D
  288.                 RET
  289.  
  290. FINDVOL         PUSH HL
  291.                 LD A,(HL)
  292.                 LD (DEVMAN_VARS.TEK_TYPE),A
  293.                 AND 0x7F
  294.                 CP _HDD_NEMO_MASTER
  295.                 LD HL,COMHDDN
  296.                 JR Z,FINDVOL1
  297.                 CP _SD_SDG
  298.                 LD HL,COMSDG
  299.                 JR Z,FINDVOL1
  300.                 LD HL,COMSDZ
  301. FINDVOL1        LD (DEVMAN_VARS.GO_DEV),HL      ; выставили адрес вызова нужного драйвера
  302.                 LD DE,0
  303.                 LD B,D
  304.                 LD C,D                          ; читать сектор 0
  305.                 LD A,1                          ; 1 сектор
  306.                 LD HL,BUF_512                   ; адрес буфера чтения
  307.                 PUSH HL
  308.                 LD IYL,INTERNAL
  309.                 CALL TO_DRV
  310.                 DB _DEV_READ
  311.                 DEC HL
  312.                 LD D,(HL)
  313.                 DEC HL
  314.                 LD E,(HL)
  315.                 LD HL,0xAA55
  316.                 AND A
  317.                 SBC HL,DE
  318.                 POP IY
  319.                 LD (DEVMAN_VARS.ADRTEKV),IX
  320.                 CALL Z,READ_MBR
  321.                 POP HL
  322.                 RET
  323.  
  324. ; запрос найденого и текущего выбранного устройства
  325. IKOL_VOL        LD HL,(DEVMAN_VARS.ADRTEKV)     ; адрес текущего выбранного раздела
  326.                 INC HL
  327.                 INC HL
  328.                 LD A,(HL)                       ; тип раздела
  329.                 LD DE,(DEVMAN_VARS.KOLDVOL)     ; D-номер выбранного раздела, E-количество найденных разделов
  330.                 LD HL,BUF_VOLUMES               ; адрес начала таблицы найденных разделов
  331.                 AND A
  332.                 RET
  333.  
  334. ; вычисление количества найденных разделов на всех устройствах
  335. SETVOLD         LD A,IXL
  336.                 RRCA
  337.                 RRCA
  338.                 RRCA
  339.                 AND 0x1F
  340.                 LD (DEVMAN_VARS.KOLDVOL),A
  341.                 RET
  342.  
  343. ; выбор раздела и инит его переменных
  344. FREINIT_VOL     LD L,A
  345.                 LD A,IYL
  346.                 AND A
  347.                 JR Z,FREINITVOL1
  348.                 LD A,(RREG_A)
  349. FREINITVOL1     LD IYL,INTERNAL
  350.                 CALL SET_VOL1
  351.                 CALL INIT_FATVARS
  352.                 JP INIRTSC
  353.  
  354. ; выбор раздела
  355. SET_VOL         LD L,A
  356.                 LD A,IYL
  357.                 AND A
  358.                 LD A,L
  359.                 JR NZ,SET_VOL1
  360.                 LD A,(RREG_A)
  361.                 LD HL,KOLVOL1
  362.                 PUSH HL
  363. SET_VOL1        PUSH AF
  364.                 CALL SAVE_FNDVOL
  365.                 POP AF
  366. SET_VOL_MNT     LD HL,DEVMAN_VARS.KOLDVOL
  367.                 CP (HL)
  368.                 CCF
  369.                 RET C
  370.                 LD (DEVMAN_VARS.SETDVOL),A
  371.                 LD L,A
  372.                 LD H,0
  373.                 ADD HL,HL
  374.                 ADD HL,HL
  375.                 ADD HL,HL
  376.                 LD DE,BUF_VOLUMES
  377.                 ADD HL,DE
  378.                 LD (DEVMAN_VARS.ADRTEKV),HL
  379.                 LD A,(HL)
  380. ;               CP 4
  381. ;               LD HL,DISKETA           ; все еще отсутствует
  382. ;               JR C,SET_DRV
  383.                 CP _SL_USBF
  384.                 LD HL,COMUSBF
  385.                 JR Z,SET_DRV
  386.                 CP _SD_SDZ
  387.                 LD HL,COMSDZ
  388.                 JR Z,SET_DRV
  389.                 CP _SD_SDG
  390.                 LD HL,COMSDG
  391.                 JR Z,SET_DRV
  392.                 LD HL,COMHDDN
  393. SET_DRV         LD (DEVMAN_VARS.GO_DEV),HL
  394.                 CALL LOAD_FNDVOL
  395. .L1             LD HL,CRC_SIZE
  396.                 PUSH IX
  397.                 LD IX,BUF_VOLUMES
  398.         ROMCALL CRC16_FAST,ROM_RST81
  399.                 POP IX
  400.                 LD (BUF_VOLUMES + 0xFE),HL
  401.                 XOR A
  402.                 RET
  403.  
  404. SAVE_FNDVOL
  405. ;               PUSH IX
  406. ;               LD HL,CRC_SIZE
  407. ;               LD IX,FATVAR.ERORDRV
  408. ;       ROMCALL CRC16_FAST,ROM_RST81
  409. ;               POP IX
  410. ;               LD (BUF_VOLUMES + 0xFE),HL      ; вычисление CRC раздела перед сохранением
  411.         EVOPORT WIN_P1,RAM_FATVARS
  412.                 LD A,(DEVMAN_VARS.SETDVOL)
  413.                 ADD A,HIGH (CPU1+BUF_ALLVOL)+4
  414.                 LD D,A
  415.                 LD E,0
  416.                 LD HL,BUF_CURRFATVAR
  417.                 LD BC,0x100
  418.                 LDIR
  419.                 RET
  420.  
  421. LOAD_FNDVOL
  422.         EVOPORT WIN_P1,RAM_FATVARS
  423.                 LD A,(DEVMAN_VARS.SETDVOL)
  424.                 ADD A,HIGH (CPU1+BUF_ALLVOL)+4
  425.                 LD H,A
  426.                 LD L,0
  427.                 LD DE,BUF_CURRFATVAR
  428.                 LD BC,0x100
  429.                 LDIR
  430. ;               PUSH IX
  431. ;               LD HL,CRC_SIZE
  432. ;               LD IX,BUF_VOLUMES
  433. ;       ROMCALL CRC16_FAST,P_ADDON1
  434. ;               POP IX
  435. ;               LD DE,(BUF_VOLUMES + 0xFE)
  436. ;               AND A
  437. ;               SBC HL,DE
  438. ;               JP NZ,REDEVFIND
  439.                 CALL ICOM_FAT
  440.                 DB _INIT_TEKDIR
  441.                 RET
  442.  
  443. CMP_SDCARD      LD A,(DEVMAN_VARS.SETDVOL)
  444.                 CP _SD_SDG
  445.                 JR NZ,CMPSDCARD1
  446.                 LD H,CMOS.BYTE_01
  447.         ROMCALL READCMOS,ROM_RST82
  448.                 LD A,L
  449.                 AND CMOS_EC.M_SD_NGS_ONOFF      ; проверка разрешения доступа к SD карте NEOGS
  450.                 RET Z
  451. CMPSDCARD1      PUSH IY
  452.                 LD IYL,INTERNAL
  453.                 CALL TO_DRV
  454.                 DB _DEV_STATUS
  455.                 POP IY
  456.                 INC A
  457.                 RET
  458.  
  459. READ_MBR        LD DE,0x01BE                    ; смещение в 0 секторе устройства до таблицы MBR
  460.                 PUSH IY
  461.                 ADD IY,DE                       ; установили указатель на начало описателей разделов
  462.                 LD BC,0x0400                    ; разделов максимум 4 и обнулили счетчик разделов с FAT
  463. .L1             LD A,(IY)                       ; первый байт 16 байтного описателя
  464.                 AND A                           ; должен быть равен 0
  465.                 JR Z,.L2
  466.                 CP 0x80                         ; или 0x80 (признак загрузочного раздела)
  467.                 JR NZ,.L3
  468. .L2             LD A,(IY+4)                     ; байт типа раздела
  469.                 CALL CP_RAZD                    ; проверка типа раздела
  470.                 JR NZ,.L3                       ; если не FAT то проверяем следующую 16 байтную запись
  471.                 INC C
  472. .L3             LD DE,0x10
  473.                 ADD IY,DE
  474.                 DJNZ .L1                        ; проверяем следующую 16 байтную запись в MBR
  475.                 LD A,C
  476.                 AND A
  477.                 POP HL
  478.                 JP NZ,SCANMBR
  479.                 PUSH HL
  480.                 POP IY
  481.                 LD C,(IY+0x0D)
  482.                 XOR A
  483.                 LD E,A
  484.                 LD B,8
  485. .L4             RR C
  486.                 ADC A,0
  487.                 DJNZ .L4
  488.                 DEC A
  489.                 JR NZ,.L5
  490.                 INC E
  491. .L5             LD A,(IY+0x0E)
  492.                 OR (IY+0x0F)
  493.                 JR Z,.L10
  494.                 INC E
  495. .L10
  496. ;               LD A,(IY+0x13)
  497. ;               OR (IY+0x14)
  498. ;               JR Z,.L6
  499. ;               INC E
  500. ;.L6            LD A,(IY+0x20)
  501. ;               OR (IY+0x21)
  502. ;               OR (IY+0x22)
  503. ;               OR (IY+0x22)
  504. ;               JR Z,.L7
  505. ;               INC E
  506. .L7             LD A,(IY+0x15)
  507.                 AND 0xF0
  508.                 CP 0xF0
  509.                 JR NZ,.L8
  510.                 INC E
  511. .L8             LD A,E
  512.                 CP 3;4
  513.                 RET NZ
  514.                 LD A,(DEVMAN_VARS.TEK_TYPE)
  515.                 BIT 7,A
  516.                 LD B,0
  517.                 JR Z,.L9
  518.                 INC B
  519. .L9             AND 0x7F
  520.                 LD C,A
  521.                 PUSH IX
  522.                 POP HL
  523.                 XOR A
  524.                 LD (HL),C
  525.                 INC HL
  526.                 LD (HL),B
  527.                 INC HL
  528.                 LD (HL),0xFF
  529.                 INC HL
  530.                 LD (HL),A
  531.                 INC HL
  532.                 LD (HL),A
  533.                 INC HL
  534.                 LD (HL),A
  535.                 INC HL
  536.                 LD (HL),A
  537.                 INC HL
  538.                 LD (HL),A
  539.                 LD DE,8
  540.                 ADD IX,DE
  541. INIT_VOL        PUSH IY
  542.                 LD IYL,INTERNAL
  543.                 CALL SETVOLD
  544.                 DEC A
  545.                 LD (DEVMAN_VARS.SETDVOL),A
  546.                 LD L,A
  547.                 LD H,0
  548.                 ADD HL,HL
  549.                 ADD HL,HL
  550.                 ADD HL,HL
  551.                 LD DE,BUF_VOLUMES
  552.                 ADD HL,DE
  553.                 LD (DEVMAN_VARS.ADRTEKV),HL
  554.                 LD A,(HL)
  555.                 AND 0x7F
  556. ;               CP 4
  557. ;               LD HL,DISKETA           ; все еще отсутствует
  558. ;               JR C,DSET_DRV
  559.                 CP _SL_USBF
  560.                 LD HL,COMUSBF
  561.                 JR Z,DSET_DRV
  562.                 CP _SD_SDZ
  563.                 LD HL,COMSDZ
  564.                 JR Z,DSET_DRV
  565.                 CP _SD_SDG
  566.                 LD HL,COMSDG
  567.                 JR Z,DSET_DRV
  568.                 LD HL,COMHDDN
  569. DSET_DRV        LD (DEVMAN_VARS.GO_DEV),HL
  570.                 CALL IKOL_VOL
  571.                 CALL ICOM_FAT
  572.                 DB _INIT_FATVARS
  573.                 LD (IX-6),A
  574.                 POP IY
  575.                 RET
  576.  
  577. ; на входе:
  578. ; A-BIT 7-0/1-MASTER/SLAVE
  579. ; биты 6-0-тип носителя
  580. SCANMBR         LD DE,0x01BE
  581.                 ADD HL,DE
  582.                 EXX
  583.                 LD A,(DEVMAN_VARS.TEK_TYPE)
  584.                 BIT 7,A
  585.                 LD B,0
  586.                 JR Z,.L4
  587.                 INC B
  588. .L4             AND 0x7F
  589.                 LD C,A
  590.                 EXX
  591.                 LD A,4
  592. .L1             PUSH AF
  593.                 LD A,(HL)
  594.                 LD C,4
  595.                 ADD HL,BC
  596.                 LD C,0x0C
  597.                 AND A
  598.                 JR Z,.L2
  599.                 CP 0x80
  600.                 JR NZ,.L3
  601. .L2             LD A,(HL)
  602.                 AND A
  603.                 JR Z,.L3
  604.                 CALL CP_RAZD
  605.                 JR NZ,.L3
  606.                 EXX
  607.                 LD (IX+0),C
  608.                 LD (IX+1),B
  609.                 EXX
  610.                 LD (IX+2),E                     ; установка типа FAT
  611.                 PUSH IX
  612.                 POP DE
  613.                 INC DE
  614.                 INC DE
  615.                 INC DE
  616.                 LD C,4
  617.                 ADD HL,BC
  618.                 LDI
  619.                 LDI
  620.                 LDI
  621.                 LDI
  622.                 LD (IX+7),0                     ; резервный байт
  623.                 LD C,8
  624.                 ADD IX,BC
  625.                 LD C,4
  626. .L3             ADD HL,BC
  627.                 POP AF
  628.                 DEC A
  629.                 JR NZ,.L1
  630.                 RET
  631.  
  632. SET_DEVICE      PUSH AF
  633.                 PUSH HL
  634.                 LD A,B
  635.                 AND 0x0F
  636.                 LD B,A
  637.                 LD HL,(DEVMAN_VARS.ADRTEKV)
  638.                 INC HL
  639.                 LD A,(HL)
  640.                 AND 1                           ;MASTER или SLAVE?
  641.                 RLCA
  642.                 RLCA
  643.                 RLCA
  644.                 RLCA
  645.                 OR 0xE0                         ; всегда LBA режим
  646.                 OR B
  647.                 LD B,A                          ; установили выбранное устройство MASTER или SLAVE
  648.                 POP HL
  649.                 POP AF
  650.                 RET
  651.  
  652. ; проверка типа раздела
  653. CP_RAZD         LD E,1                          ; FAT16
  654.                 CP 4
  655.                 RET Z
  656.                 CP 6
  657.                 RET Z
  658.                 CP 0x0E
  659.                 RET Z
  660.                 LD E,2                          ; FAT32
  661.                 CP 0x0B
  662.                 RET Z
  663.                 CP 0x0C
  664.                 RET Z
  665.                 LD E,0                          ; FAT12
  666.                 CP 1
  667.                 RET
  668.  
  669. ; функция вызова драйвера HDD NEMO
  670. COMHDDNEX       CALL P5_READ_BYTE
  671.                 LD A,(RREG_AA)
  672.                 EX AF,AF'
  673.                 LD A,(RREG_A)
  674.                 LD DE,(RREG_E)
  675.                 LD BC,(RREG_C)
  676.                 LD HL,(RREG_L)
  677.                 CALL COMHDDN
  678.                 LD (RREG_A),A
  679.                 LD (RREG_L),HL
  680.                 LD (RREG_E),DE
  681.                 LD (RREG_C),BC
  682.                 RET
  683.  
  684. ; копирование таблицы найденных разделов во внешнюю программу
  685. GET_FNDVOLUME   LD BC,0x100                     ; перенос 256 байт
  686.                 LD DE,(RREG_L)                  ; адрес куда переносить
  687.                 LD HL,BUF_VOLUMES & 0x3FFF;BUF_TABLVOL-CPU2
  688.                 JP LDIR_BYTES
  689.  
  690. CONTROL_SD      LD A,(DEVMAN_VARS.FLAGS_DRV)
  691.                 PUSH AF
  692.                 CALL FIND_SD
  693.                 LD C,A
  694.                 AND 3
  695.                 LD (RREG_A),A
  696.                 LD A,C
  697.                 POP BC
  698.                 CP B
  699.                 JP NZ,SD_CARD_LOST
  700.                 RET
  701.  
  702. FIND_SD         PUSH IY
  703.                 LD IYL,INTERNAL
  704.                 LD E,0
  705.                 LD A,(DEVMAN_VARS.FLAGS_DRV)
  706.                 AND B_INST_SDG
  707.                 JR Z,CRTLSD1                    ; если драйвер не установлен
  708.                 PUSH HL
  709.                 PUSH DE
  710.                 CALL COMSDG
  711.                 DB _DEV_STATUS
  712.                 POP DE
  713.                 POP HL
  714.                 AND A
  715.                 SET 1,E                         ; есть SD карта NEOGS
  716.                 JR Z,CRTLSD1
  717.                 RES 1,E                         ; карты нет
  718.                 EX DE,HL
  719.                 LD HL,DEVMAN_VARS.FLAGS_DRV
  720.                 RES 7,(HL)
  721.                 EX DE,HL
  722. CRTLSD1         PUSH HL
  723.                 CALL COMSDZ
  724.                 DB _DEV_STATUS
  725.                 POP HL
  726.                 AND A
  727.                 SET 0,E                         ; есть SD карты ZC
  728.                 JR Z,CRTLSD2
  729.                 RES 0,E                         ; карты нет
  730. CRTLSD2         POP IY
  731.                 LD HL,DEVMAN_VARS.FLAGS_DRV
  732.                 LD A,%11111100
  733.                 AND (HL)
  734.                 OR E
  735.                 LD (HL),A
  736.                 RET
  737.  
  738. ; HLBCDE - номер сектора
  739. SET_SECTOR_NUM
  740.                 LD HL,(RREG_L)
  741.                 LD (NUMSEC_LBA48+4),HL
  742.                 LD HL,(RREG_C)
  743.                 LD (NUMSEC_LBA48+2),HL
  744.                 LD HL,(RREG_E)
  745.                 LD (NUMSEC_LBA48),HL
  746.                 RET
  747.