Subversion Repositories pentevo

Rev

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

  1.  
  2. ; LAST UPDATE: 10.01.2023 savelij
  3.  
  4.                 include macros.a80
  5.                 include global_vars.a80
  6.                 include sdcomand.a80
  7.  
  8. CHARS           EQU 0XC000                      ;АДРЕС ШРИФТА ПЕРЕНЕСЕННОГО ИЗ ROM BASIC48
  9. PEREM           EQU CHARS+0X400                 ;АДРЕС НАЧАЛА ПЕРЕМЕННЫХ И БУФЕРОВ
  10.                                          
  11. SD__RSTR        EQU P_DATA
  12. SD__SEND        EQU P_DATA
  13.  
  14. ;ВХОДНЫЕ ПАРАМЕТРЫ ОБЩИЕ:
  15. ;HL-АДРЕС ЗАГРУЗКИ В ПАМЯТЬ
  16. ;BCDE-32-Х БИТНЫЙ НОМЕР СЕКТОРА
  17. ;A-КОЛИЧЕСТВО БЛОКОВ (БЛОК=512 БАЙТ)
  18. ;ТОЛЬКО ДЛЯ МНОГОБЛОЧНОЙ ЗАПИСИ/ЧТЕНИИ
  19.  
  20. ;ОШИБКИ ВЫДАВАЕМЫЕ НА ВЫХОДЕ:
  21. ;A=0-ИНИЦИАЛИЗАЦИЯ ПРОШЛА УСПЕШНО
  22. ;A=1-КАРТА НЕ НАЙДЕНА ИЛИ НЕ ОТВЕТИЛА
  23. ;A=2-КАРТА ЗАЩИЩЕНА ОТ ЗАПИСИ
  24. ;A=3-ПОПЫТКА ЗАПИСИ В СЕКТОР 0 КАРТЫ
  25.  
  26. TDIRCLS         EQU PEREM                       ;0X400 БУФЕР КЛАСТЕРОВ ROOT ДИРЕКТОРИИ
  27. BUF_512_        EQU TDIRCLS+0X0400              ;0X200 БУФЕР СЕКТОРА
  28. CAL_FAT         EQU BUF_512_+0X0200             ;1 КАЛИБР FAT
  29. BYTSSEC         EQU CAL_FAT+1                   ;1 КОЛИЧЕСТВО СЕКТОРОВ В КЛАСТЕРЕ
  30. ROOTCLS         EQU BYTSSEC+1                   ;4 СЕКТОР НАЧАЛА ROOT ДИРЕКТОРИИ
  31. ROOTSEC         EQU ROOTCLS+4                   ;2 РАЗМЕР В СЕКТОРАХ ROOT ДИРЕКТОРИИ
  32. SEC_FAT         EQU ROOTSEC+2                   ;4 КОЛИЧЕСТВО СЕКТОРОВ ОДНОЙ FAT
  33. RSVDSEC         EQU SEC_FAT+4                   ;2 РАЗМЕР РЕЗЕРВНОЙ ОБЛАСТИ
  34. STARTRZ         EQU RSVDSEC+2                   ;4 НАЧАЛО ДИСКА/РАЗДЕЛА
  35. FRSTDAT         EQU STARTRZ+4                   ;4 АДРЕС ПЕРВОГО СЕКТОРА ДАННЫХ ОТ BPB
  36. SEC_DSC         EQU FRSTDAT+4                   ;4 КОЛИЧЕСТВО СЕКТОРОВ НА ДИСКЕ/РАЗДЕЛЕ
  37. CLS_DSC         EQU SEC_DSC+4                   ;4 КОЛИЧЕСТВО КЛАСТЕРОВ НА ДИСКЕ/РАЗДЕЛЕ
  38. FATSTR          EQU CLS_DSC+4                   ;4 НАЧАЛО ПЕРВОЙ FAT ТАБЛИЦЫ
  39. FB_EXT          EQU FATSTR+4                    ;B БУФЕР 8.3 ДЛЯ ПОИСКА ИМЕНИ
  40. ADRPATH         EQU FB_EXT+0X0B                 ;2 АДРЕС ПУТИ К ИМЕНИ ФАЙЛА
  41. ADR_LD          EQU ADRPATH+2                   ;2 АДРЕС ЗАГРУЗКИ
  42.  
  43.                 ORG 0X6000
  44.                 DI
  45.                 XOR A
  46.                 OUT (0XFE),A
  47.                 LD HL,0X4000
  48.                 LD DE,0X4001
  49.                 LD BC,0X1800
  50.                 LD (HL),A
  51.                 LDIR
  52.                 LD BC,0X2FF
  53.                 LD (HL),5
  54.                 LDIR
  55.                 LD HL,0X3D00
  56.                 LD DE,CHARS+0X100
  57.                 LD BC,0X300
  58.                 LDIR
  59.                 LD HL,TXT_VERS
  60.                 CALL PRINT_MSG
  61.                 LD HL,F_PATH
  62.                 CALL START
  63.                 JR C,ERROR
  64.                 LD HL,TXT_OK
  65.                 CALL PRINT_MSG
  66.                 JP FLASHER
  67.  
  68. ERROR           CP 0XEE
  69.                 LD HL,TXT_SDERROR
  70.                 JR Z,ERROR1
  71.                 CP 0XDD
  72.                 LD HL,TXT_FATERROR
  73.                 JR Z,ERROR1
  74.                 CP 0X99
  75.                 LD HL,TXT_SIZEERROR
  76.                 JR Z,ERROR1
  77.                 LD HL,TXT_FILENONE
  78. ERROR1          CALL PRINT_MSG
  79.                 LD HL,TXT_RESET
  80.                 CALL PRINT_MSG
  81. ERROR2          XOR A
  82.                 IN A,(0XFE)
  83.                 CPL
  84.                 AND 0X1F
  85.                 JR Z,ERROR2
  86. ERROR3          XOR A
  87.                 IN A,(0XFE)
  88.                 CPL
  89.                 AND 0X1F
  90.                 JR NZ,ERROR3
  91.         PEC_ON M_SHADOW_BF
  92.                 JP EFLASHER
  93.  
  94. ;ПУТЬ ДО ФАЙЛА ОТ ROOT
  95. F_PATH          DB "ZXEVO.ROM",0
  96.  
  97. ;ВЫДАЧА ОШИБКИ "НЕТ КАРТОЧКИ"
  98. ZAW003          LD A,0XEE
  99.                 SCF
  100.                 RET
  101.  
  102. WR_STAT         POP HL
  103.                 SCF
  104.                 RET
  105.  
  106. ;НА ВХОДЕ:
  107. ;HL-ТЕКСТОВАЯ СТРОКА ПУТИ ОТ ROOT
  108. ;DE-АДРЕС КУДА ГРУЗИТЬ
  109. START           LD IYL,2
  110.                 LD (ADRPATH),HL
  111.                 LD (ADR_LD),DE
  112.                 LD A,3
  113.                 OUT (P_CONF),A
  114.                 XOR A
  115.                 OUT (P_DATA),A
  116.                 LD BC,P_DATA
  117.                 LD DE,0X10FF
  118.                 OUT (C),E
  119.                 DEC D
  120.                 JR NZ,$-3
  121.                 LD A,1
  122.                 OUT (P_CONF),A
  123.                 XOR A
  124.                 EX AF,AF'
  125. ZAW001          LD HL,CMD00
  126.                 CALL OUTCOM             ;ПЕРЕВОДИМ КАРТОЧКУ В РЕЖИМ SPI КОМАНДОЙ 0
  127.                 CALL IN_OOUT            ;ЖДЕМ ОТВЕТА
  128.                 EX AF,AF'
  129.                 DEC A
  130.                 JR Z,ZAW003             ;ЖДЕМ ПО СЧЕПТЧИКУ 256 РАЗ
  131.                 EX AF,AF'
  132.                 DEC A
  133.                 JR NZ,ZAW001            ;ЖДЕМ ПОКА КАРТА ОТВЕТИТ БАЙТОМ 1
  134.                 LD BC,SD__RSTR
  135.                 LD HL,CMD08
  136.                 CALL OUTCOM             ;ОПРЕДЕЛЯЕМ СПЕЦИФИКАЦИЮ КАРТЫ
  137.                 CALL IN_OOUT            ;В "A" ОТВЕТ КАРТЫ R1
  138.                 IN H,(C)
  139.                 NOP
  140.                 IN H,(C)       
  141.                 NOP
  142.                 IN H,(C)
  143.                 NOP
  144.                 IN H,(C)                ;ПРОЧИТАЛИ ОСТАЛЬНЫЕ БАЙТЫ В НИКУДА
  145.                 BIT 2,A                 ;ЕСЛИ ОШИБКА, ТО
  146.                 LD HL,0                 ;КАРТА СПЕЦИФИКАЦИИ 1.0
  147.                 JR NZ,ZAW006            ;ИНАЧЕ
  148.                 LD H,0X40               ;КАРТА СПЕЦИФИКАЦИИ 2.0
  149. ZAW006          LD A,CMD_55
  150.                 CALL OUT_COM            ;ЗАПУСКАЕМ ВНУТРЕННЮЮ ИНИЦИАЛИЗАЦИЮ КАРТЫ
  151.                 CALL IN_OOUT
  152.                 LD BC,SD__SEND
  153.                 LD A,ACMD_41
  154.                 OUT (C),A
  155.                 LD A,H
  156.                 OUT (C),A
  157.                 XOR A
  158.                 OUT (C),A
  159.                 NOP
  160.                 OUT (C),A
  161.                 NOP
  162.                 OUT (C),A
  163.                 DEC A
  164.                 OUT (C),A
  165.                 CALL IN_OOUT
  166.                 AND A
  167.                 JR NZ,ZAW006            ;ЖДЕМ ПОКА КАРТЫ ПЕРЕЙДЕТ В РЕЖИМ ГОТОВНОСТИ
  168. ZAW004          LD A,CMD_59
  169.                 CALL OUT_COM            ;ПРИНУДИТЕЛЬНО ОТКЛЮЧАЕМ CRC16
  170.                 CALL IN_OOUT
  171.                 AND A
  172.                 JR NZ,ZAW004
  173. ZAW005          LD HL,CMD16
  174.                 CALL OUTCOM             ;ПРИНУДИТЕЛЬНЫЙ РАЗМЕР СЕКТОРА 512 БАЙТ
  175.                 CALL IN_OOUT
  176.                 AND A
  177.                 JR NZ,ZAW005
  178.  
  179. ;ИНИЦИАЛИЗАЦИЯ ПЕРЕМЕННЫХ FAT
  180. WC_FAT          LD DE,0
  181.                 LD B,D
  182.                 LD C,E
  183.                 CALL LOADLST            ;ЧИТАЕМ СЕКТОР 0 КАРТОЧКИ
  184.                 PUSH HL
  185.                 POP IX
  186.                 LD DE,0X01BE
  187.                 ADD HL,DE               ;ПЕРЕХОДИМ НА СМЕЩЕНИЕ ДЛЯ ПРОВЕРОК
  188.                 LD A,(HL)               ;ПРОВЕРЯМ ЧТОБЫ БЫЛ 0, КАРТОЧКИ НЕ МОГУТ БЫТЬ ЗАГРУЗОЧНЫМИ
  189.                 AND 0X7F
  190.                 JR NZ,RDFAT05           ;ЕСЛИ НЕ 0, ПРОВЕРИТЬ ДРУГОЕ
  191.                 LD DE,4
  192.                 ADD HL,DE               ;ПЕРЕХОДИМ К ПРОВЕРКЕ ТИПА РАЗДЕЛА
  193.                 LD A,(HL)
  194.                 LD B,0
  195.                 CP 1                    ;FAT12?
  196.                 JR Z,RDFAT06
  197.                 LD B,2
  198.                 CP 0X0B                 ;FAT32?
  199.                 JR Z,RDFAT06
  200.                 CP 0X0C                 ;FAT32?
  201.                 JR Z,RDFAT06
  202.                 LD B,1
  203.                 CP 4                    ;FAT14?
  204.                 JR Z,RDFAT06
  205.                 CP 6                    ;FAT16?
  206.                 JR Z,RDFAT06
  207.                 CP 0X0E                 ;FAT16?
  208.                 JR NZ,RDFAT05
  209. RDFAT06         LD A,B                  ;БЕРЕМ ИЗ "B" ТИП РАЗДЕЛА
  210.                 LD (CAL_FAT),A          ;СОХРАНИЛИ
  211.                 ADD HL,DE
  212.                 CALL LOADZP             ;БЕРЕМ НОМЕР СЕКТОРА НАЧАЛА ОСНОВНОГО РАЗДЕЛА
  213.                 JR RDFAT00              ;ПЕРЕХОДИМ К ИНИЦИАЛИЗАЦИИ ПЕРЕМЕННЫХ ДЛЯ РАБОТЫ С ФАТОМ
  214.  
  215. ;MBR НЕ ОБНАРУЖЕН, ПРОВЕРЯЕМ СЕКТОР 0 КАРТЫ КАК ОПИСАТЕЛЬ
  216. RDFAT05         LD C,(IX+0X0D)          ;C=КОЛИЧЕСТВО СЕКТОРОВ В КЛАСТЕРЕ
  217.                 XOR A
  218.                 LD E,A
  219.                 LD B,8
  220.                 RR C
  221.                 ADC A,0
  222.                 DJNZ $-4                ;КОЛИЧЕСТВО СЕКТОРОВ В КЛАСТЕРЕ ДОЛЖНО БЫТЬ СТЕПЕНЬЮ 2
  223.                 DEC A
  224.                 JR NZ,$+3               ;ПРОВЕРИЛИ КОЛИЧЕСТВО БИТ
  225.                 INC E                   ;+1, ЕСТЬ ТАКОЕ
  226.                 LD A,(IX+0X0E)
  227.                 OR (IX+0X0F)
  228.                 JR Z,$+3                ;КОЛИЧЕСТВО ЗАРЕЗЕРВИРОВАННЫХ СЕКТОРОВ ДОЛЖНО БЫТЬ >0
  229.                 INC E                   ;+1, ЕСТЬ ТАКОЕ
  230.                 LD A,(IX+0X13)
  231.                 OR (IX+0X14)
  232.                 JR NZ,$+3               ;КОЛИЧЕСТВО СЕКТОРОВ НА РАЗДЕЛЕ ДЛЯ ФАТ16?
  233.                 INC E
  234.                 LD A,(IX+0X20)
  235.                 OR (IX+0X21)
  236.                 OR (IX+0X22)
  237.                 OR (IX+0X23)
  238.                 JR NZ,$+3               ;КОЛИЧЕСТВО СЕКТОРОВ НА РАЗДЕЛЕ ДЛЯ ФАТ32?
  239.                 INC E                   ;ОДНО ИЗ НИХ ДОЛЖНО БЫТЬ =0, ДРУГОЕ >0
  240.                 LD A,(IX+0X15)
  241.                 AND 0XF0
  242.                 CP 0XF0
  243.                 JR NZ,$+3               ;СТАРШИЕ БИТЫ ДОЛЖНЫ БЫТЬ В 1
  244.                 INC E
  245.                 LD A,E
  246.                 CP 4                    ;УСЛОВИЯ СОВПАЛИ?
  247.                 LD A,0XDD               ;FAT НЕ НАЙДЕН
  248.                 SCF
  249.                 RET NZ
  250.                 LD A,0XFF
  251.                 LD (CAL_FAT),A          ;ТИП ФАТ ПОКА НЕ ОПРЕДЕЛЕН
  252.                 LD DE,0
  253.                 LD B,D
  254.                 LD C,E
  255.  
  256. RDFAT00         LD (STARTRZ),DE
  257.                 LD (STARTRZ+2),BC       ;ПОЛОЖИЛИ НОМЕР СТАРТОВОГО СЕКТОРА РАЗДЕЛА
  258.                 CALL LOADLST            ;ЗАГРУЗИЛИ ЕГО
  259.                 LD HL,0
  260.                 LD DE,(BUF_512_+0X16)   ;BPB_FATSZ16
  261.                 LD A,D
  262.                 OR E
  263.                 JR NZ,RDFAT01           ;ЕСЛИ НЕ FAT12/16 (BPB_FATSZ16=0)
  264.                 LD DE,(BUF_512_+0X24)
  265.                 LD HL,(BUF_512_+0X26)   ;BPB_FATSZ32
  266.                                         ;ТО БЕРЕМ ИЗ СМЕЩЕНИЯ +36
  267. RDFAT01         LD (SEC_FAT+2),HL
  268.                 LD (SEC_FAT),DE         ;ЧИСЛО СЕКТОРОВ НА FAT-ТАБЛИЦУ
  269.                 LD HL,0
  270.                 LD DE,(BUF_512_+0X13)   ;BPB_TOTSEC16
  271.                 LD A,D
  272.                 OR E
  273.                 JR NZ,RDFAT02           ;ЕСЛИ НЕ FAT12/16 (BPB_TOTSEC16=0)
  274.                 LD DE,(BUF_512_+0X20)
  275.                 LD HL,(BUF_512_+0X22)   ;BPB_TOTSEC32
  276.                                         ;ТО БЕРЕМ ИЗ СМЕЩЕНИЯ +32
  277. RDFAT02         LD (SEC_DSC+2),HL
  278.                 LD (SEC_DSC),DE         ;К-ВО СЕКТОРОВ НА ДИСКЕ/РАЗДЕЛЕ
  279.  
  280. ;ВЫЧИСЛЯЕМ ROOTDIRSECTORS
  281.                 LD DE,(BUF_512_+0X11)   ;BPB_ROOTENTCNT
  282.                 LD HL,0
  283.                 LD A,D
  284.                 OR E
  285.                 JR Z,RDFAT03
  286.                 LD B,H
  287.                 LD C,L
  288.                 LD A,0X10
  289.                 CALL BCDE_A
  290.                 EX DE,HL
  291.  
  292. ;ЭТО РЕАЛИЗОВАНА ФОРМУЛА
  293. ;ROOTDIRSECTORS=((BPB_ROOTENTCNT*32)+(BPB_BYTSPERSEC-1))/BPB_BYTSPERSEC
  294. ;В HL=ROOTDIRSECTORS. ЕСЛИ FAT32, ТО HL=0 ВСЕГДА
  295.  
  296. RDFAT03         PUSH HL                 ;ROOTDIRSECTORS
  297.                 LD (ROOTSEC),HL
  298.                 LD A,(BUF_512_+0X10)
  299.                 LD DE,(SEC_FAT)
  300.                 LD HL,(SEC_FAT+2)
  301.                 DEC A
  302.                 EX DE,HL
  303.                 ADD HL,HL
  304.                 EX DE,HL
  305.                 ADC HL,HL
  306.                 DEC A
  307.                 JR NZ,$-6
  308.                 POP BC                  ;ПОЛНЫЙ РАЗМЕР FAT-ОБЛАСТИ В СЕКТОРАХ
  309.                 CALL HLDEPBC            ;ПРИБАВИЛИ ROOTDIRSECTORS
  310.                 LD BC,(BUF_512_+0X0E)   ;BPB_RSVDSECCNT
  311.                 LD (RSVDSEC),BC
  312.                 CALL HLDEPBC            ;ПРИБАВИЛИ BPB_RESVDSECCNT
  313.                 LD (FRSTDAT),DE
  314.                 LD (FRSTDAT+2),HL       ;ПОЛОЖИЛИ НОМЕР ПЕРВОГО СЕКТОРА ДАННЫХ
  315.                 LD B,H
  316.                 LD C,L
  317.                 LD HL,SEC_DSC           ;BCDE+32-ОЕ ЧИСЛО ПО АДРЕСУ HL
  318.                 CALL BCDEHLM            ;ВЫЧЛИ ИЗ ПОЛНОГО К-ВА СЕКТОРОВ РАЗДЕЛА
  319.                 LD A,(BUF_512_+0X0D)
  320.                 LD (BYTSSEC),A
  321.                 CALL BCDE_A             ;РАЗДЕЛИЛИ НА К-ВО СЕКТОРОВ В КЛАСТЕРЕ
  322.                 LD (CLS_DSC),DE
  323.                 LD (CLS_DSC+2),BC       ;ПОЛОЖИЛИ КОЛ-ВО КЛАСТЕРОВ НА РАЗДЕЛЕ
  324.  
  325.                 LD A,(CAL_FAT)
  326.                 CP 0XFF
  327.                 JR NZ,RDFAT04
  328.                 LD DE,(SEC_FAT-1)       ;ЕСЛИ РАЗРЯДНОСТЬ ФАТА НЕ ОПРЕДЕЛЕНА, ОПРЕДЕЛЯЕМ
  329.                 LD BC,(SEC_FAT+1)       ;ВЗЯЛИ КОЛИЧЕСТВО КЛАСТЕРОВ НА РАЗДЕЛЕ
  330.                 LD E,0
  331.                 PUSH BC
  332.                 PUSH DE
  333.                 SRL B
  334.                 RR C
  335.                 RR D
  336.                 RR E
  337.                 LD HL,CLS_DSC
  338.                 PUSH HL
  339.                 CALL HLBCDEM
  340.                 LD A,E
  341.                 AND 0X80
  342.                 OR D
  343.                 OR C
  344.                 OR B
  345.                 LD A,2
  346.                 POP HL
  347.                 POP DE
  348.                 POP BC
  349.                 JR Z,RDFAT04
  350.                 CALL HLBCDEM
  351.                 LD A,D
  352.                 OR C
  353.                 OR B
  354.                 LD A,1
  355.                 JR Z,RDFAT04
  356.                 XOR A
  357.  
  358. ;ДЛЯ FAT12/16 ВЫЧИСЛЯЕМ АДРЕС ПЕРВОГО СЕКТОРА ДИРЕКТОРИИ
  359. ;ДЛЯ FAT32 БЕРЕМ ПО СМЕЩЕМИЮ +44, НА ВЫХОДЕ BCDE-СЕКТОР ROOTDIR
  360. RDFAT04         PUSH AF
  361.                 LD DE,(RSVDSEC)
  362.                 LD BC,0
  363.                 LD HL,STARTRZ
  364.                 CALL BCDEHLP
  365.                 LD (FATSTR),DE
  366.                 LD (FATSTR+2),BC        ;ВЫЧИСЛИЛИ И ПОЛОЖИЛИ НОМЕР СЕКТОРА НАЧАЛА FAT-ЕАБЛИЦ
  367.                 POP AF
  368.                 LD (CAL_FAT),A          ;УТОЧНИЛИ ТИП ФАТА
  369.                 AND A
  370.                 LD DE,0
  371.                 LD B,D
  372.                 LD C,E
  373.                 JR Z,FSRROO2            ;FAT12-NONE
  374.                 DEC A
  375.                 JR Z,FSRROO2            ;FAT16
  376.                 LD DE,(BUF_512_+0X2C)
  377.                 LD BC,(BUF_512_+0X2E)   ;FAT32
  378. FSRROO2         LD (ROOTCLS),DE
  379.                 LD (ROOTCLS+2),BC       ;ПОЛОЖИЛИ НОМЕР КЛАСТЕР ROOT ДИРЕКТОРИИ
  380.  
  381.                 LD HL,(ADRPATH)         ;ВЕРНУЛИ АДРЕС СТРОКИ ПУТИ ДО ФАЙЛА
  382. FINDFL1         PUSH BC
  383.                 PUSH DE                 ;СОХРАНИЛИ НОМЕР КЛАСТЕРА
  384.                 CALL FNDBUF             ;РАСПАКОВКА ЧАСТИ ТЕКСТОВОЙ СТРОКИ ДЛЯ СОЗДАНИЯ МАСКИ ПОИСКА
  385.                 POP DE
  386.                 POP BC                  ;ВОССТАНОВИЛИ НОМЕР КЛАСТЕРА
  387.                 PUSH HL                 ;СОХРАНИЛИ ТЕКУЩИЙ АДРЕС ТЕКСТОВОЙ СТРОКИ
  388.  
  389.                 LD HL,TDIRCLS           ;АДРЕС ТАБЛИЦЫ КЛАСТЕРОВ ТЕКУЩЕЙ ДИРЕКТОРИИ
  390.                 LD A,D
  391.                 OR E
  392.                 OR B
  393.                 OR C
  394.                 CALL SAVEZP             ;СОХРАНИЛИ В ТАБЛИЦУ НОМЕР ТЕКУЩЕГО КЛАСТЕРА
  395.                 JR Z,LASTCLS            ;ЕСЛИ НОМЕР КЛАСТЕРА 0, ТО ЭТО ROOT ДИРА (ДЛЯ ФАТ12/16)
  396. NEXTCLS         PUSH HL
  397.                 CALL RDFATZP            ;ЧИТАЕМ СЛЕДУЩИЙ НОМЕР КЛАСТЕРА ИЗ ЦЕПОЧКИ ДИРЕКТОРИИ
  398.                 CALL LST_CLS            ;ПРОВЕРЯЕМ НА КОНЕЦ ЦЕПОЧКИ
  399.                 POP HL
  400.                 JR C,LASTCLS
  401.                 CALL SAVEZP             ;ЕСЛИ НЕПОСЛЕДНИЙ СОХРАНЯЕМ В ТАБЛИЦУ
  402.                 JR NEXTCLS              ;СЛЕДУЮЩИЙ НОМЕР КЛАСТЕРА
  403.  
  404. LASTCLS         LD BC,0XFFFF
  405.                 CALL SAVEZP             ;КЛАДЕМ МАРКЕР КОНЦА ЦЕПОЧКИ
  406.  
  407. FINDFL          INC BC                  ;ИЩЕМ ПО ЗАДАННОЙ МАСКЕ НАЧИНАЯ С 0
  408.                 CALL RDDIRSC            ;ГРУЗИМ ПО НОМЕРУ ОПИСАТЕЛЯ СЕКТОР ДИРЕКТОРИИ
  409.                 LD A,C
  410.                 AND 0X0F                ;В СЕКТОРЕ МАКСИМУМ 16 ОПИСАТЕЛЕЙ
  411.                 LD E,A
  412.                 LD D,0
  413.                 EX DE,HL
  414.                 ADD HL,HL
  415.                 ADD HL,HL
  416.                 ADD HL,HL
  417.                 ADD HL,HL
  418.                 ADD HL,HL
  419.                 ADD HL,DE               ;ПОЛУЧИЛИ АДРЕС НУЖНОГО ОПИСАТЕЛЯ
  420.                 LD A,(HL)               ;ПРОВЕРЯЕМ ПЕРВЫЙ БАЙТ ИМЕНИ ОПИСАТЕЛЯ
  421.                 AND A
  422.                 LD A,0XAA               ;ЕСЛИ БАЙТ =0, ТО
  423.                 JP Z,WR_STAT            ;ПЕРЕХОД ПО ОШИБКЕ = ФАЙЛ НЕ НАЙДЕН
  424.                 PUSH HL
  425.                 PUSH BC
  426.                 CALL COMPARE            ;СРАВНИВАЕМ С ЗАДАННОЙ МАСКОЙ
  427.                 POP BC
  428.                 POP DE
  429.                 PUSH DE
  430.                 POP IX                  ;СОДЕРЖИМОЕ IX=АДРЕС ОПИСАТЕЛЯ
  431.                 JR NZ,FINDFL            ;НЕ СОВПАДАЕТ, ПЕРЕХОДИМ К СЛЕДУЮЩЕМУ ОПИСАТЕЛЮ
  432.                 LD A,(IX+0X1F)
  433.                 OR (IX+0X1D)
  434.                 OR (IX+0X1C)
  435.                 LD A,0X99
  436.                 JP NZ,WR_STAT
  437.                 LD A,(IX+0X1E)
  438.                 CP 8
  439.                 LD A,0X99
  440.                 JP NZ,WR_STAT
  441.                 CALL RD_CLAS            ;ЗАБИРАЕМ НОМЕР КЛАСТЕРА ИЗ НАЙДЕННОГО ОПИСАТЕЛЯ
  442.                 EX (SP),HL              ;ВОССТАНОВИЛИ ТЕКУЩИЙ АДРЕС В СТРОКЕ ПУТИ ДО ФАЙЛА
  443.                 INC SP
  444.                 INC SP                  ;МАСКИРОВКА НА СТЕКЕ АДРЕСА РАЗМЕРА В БАЙТАХ ТЕКУЩЕГО ФАЙЛА
  445.                 LD A,(HL)
  446.                 AND A                   ;ТЕКСТОВАЯ СТРОКА КОНЧИЛАСЬ?
  447.                 JR NZ,FINDFL1           ;ЕСЛИ НЕТ, ТО ИЩЕМ ДАЛЬШЕ
  448.                 LD A,(IX+0X0B)          ;ПРОВЕРЯЕМ ЭТО ДИРА ИЛИ ФАЙЛ?
  449.                 AND 0X10
  450.                 JR NZ,FINDFL            ;ЕСЛИ ДИРА, ТО ПРОДОЛЖАЕМ ПОИСК
  451.  
  452.                 PUSH BC
  453.                 PUSH DE
  454.                 LD IX,IXBASE
  455.                 LD (IX+0),0
  456.                 LD (IX+1),2
  457.                 CALL SETWIN_INDICAT
  458.                 LD HL,TXT_LOAD
  459.                 CALL PRINT_MSG
  460.                 POP DE
  461.                 POP BC
  462.  
  463.                 LD A,(BYTSSEC)          ;ВЗЯЛИ РАЗМЕР КЛАСТЕРА В СЕКТОРАХ
  464.                 LD IXH,A                ;СОХРАНИЛИ
  465.                 LD IYH,0                ;ИЗНАЧАЛЬНОЕ СМЕЩЕНИЕ В КЛАСТЕРЕ
  466.  
  467. FINDFL2         LD A,RAM_FLASHER
  468.                 LD HL,CPU2
  469. FINDFL3         PUSH AF
  470.                 PUSH HL
  471.                 CALL SET4MBPAGE
  472.                 LD IXL,0X20
  473.                 CALL LD_FILE
  474.                 JR C,FINDFL4
  475.                 CALL INC_INDICAT
  476.                 POP HL
  477.                 POP AF
  478.                 INC A
  479.                 JR FINDFL3
  480.  
  481. FINDFL4         POP HL
  482.                 POP AF
  483.                 XOR A
  484.                 RET
  485.  
  486. ;HL-АДРЕС ЗАГРУЗКИ
  487. ;IXL-КОЛИЧЕСТВО СЕКТОРОВ ДЛЯ ЗАГРУЗКИ
  488. ;IXH-РАЗМЕР КЛАСТЕРА
  489. ;IYL-
  490. ;IYH-СМЕЩЕНИЕ В КЛАСТЕРЕ
  491. LD_FILE         PUSH BC
  492.                 PUSH DE
  493.                 PUSH HL
  494.                 CALL REALSEC            ;ПЕРЕВЕЛИ НОМЕР КЛАСТЕРА В НОМЕР СЕКТОРА
  495.                 LD A,IYH
  496.                 LD L,A
  497.                 LD H,0
  498.                 ADD HL,DE
  499.                 EX DE,HL
  500.                 JR NC,LD_FILE1
  501.                 INC BC                  ;BCDE=НОМЕР СЕКТОРА ОТКУДА ГРУЗИТЬ
  502. LD_FILE1        LD A,IXL
  503.                 CP IXH
  504.                 JP C,LD_FILE2
  505.                 LD A,IXH
  506. LD_FILE2        ADD A,IYH
  507.                 CP IXH
  508.                 LD A,IXL
  509.                 JP C,LD_FILE5
  510.                 LD A,IXH
  511.                 SUB IYH
  512. LD_FILE5        LD IYL,A                ;СКОЛЬКО СЕКТОРОВ СЕЙЧАС ГРУЗИМ
  513.                 POP HL                  ;ВОССТАНОВИЛИ АДРЕС ЗАГРУЗКИ
  514.                 CALL RDMULTI            ;ЗАГРУЗИЛИ СЕКТОРА
  515.                 POP DE
  516.                 POP BC                  ;ВОССТАНОВИЛИ НОМЕР КЛАСТЕРА
  517.                 LD A,IYH
  518.                 ADD A,IYL
  519.                 CP IXH
  520.                 JP C,LD_FILE3
  521.                 SUB IXH
  522. LD_FILE3        LD IYH,A
  523.                 JP C,LD_FILE4
  524.                 PUSH HL                 ;СОХРАНИЛИ АДРЕС ЗАГРУЗКИ
  525.                 CALL RDFATZP            ;ПРОЧИТАЛИ НОМЕР СЛЕДУЮЩЕГО КЛАСТЕРА
  526.                 CALL LST_CLS            ;ПРОВЕРИЛИ, А МОЖЕТ ЭТО ПОСЛЕДНИЙ КЛАСТЕР?
  527.                 POP HL                  ;ВОССТАНОВИЛИ АДРЕС ЗАГРУЗКИ
  528.                 RET C                   ;ЕСЛИ ПОСЛЕДНИЙ, ВЫХОДИМ
  529. LD_FILE4        LD A,IXL
  530.                 SUB IYL
  531.                 RET Z
  532.                 LD IXL,A
  533.                 JP NZ,LD_FILE
  534.                 RET
  535.  
  536. SET_PAGE        PUSH BC
  537.                 LD BC,0X7FFD
  538.                 OUT (C),A
  539.                 POP BC
  540.                 RET
  541.  
  542. SAVEZP          LD (HL),E
  543.                 INC HL
  544.                 LD (HL),D
  545.                 INC HL
  546.                 LD (HL),C
  547.                 INC HL
  548.                 LD (HL),B
  549.                 INC HL
  550.                 RET
  551.  
  552. LOADZP          LD E,(HL)
  553.                 INC HL
  554.                 LD D,(HL)
  555.                 INC HL
  556.                 LD C,(HL)
  557.                 INC HL
  558.                 LD B,(HL)
  559.                 INC HL
  560.                 RET
  561.  
  562. ;ЧТЕНИЕ СЕКТОРА DIR ПО НОМЕРУ BC
  563. RDDIRSC         PUSH BC
  564.                 LD D,B
  565.                 LD E,C
  566.                 LD BC,0
  567.                 LD A,0X10
  568.                 CALL BCDE_A
  569.                 LD A,E
  570.                 PUSH AF
  571.                 LD A,(BYTSSEC)
  572.                 PUSH AF
  573.                 CALL BCDE_A
  574.                 LD HL,TDIRCLS
  575.                 EX DE,HL
  576.                 ADD HL,HL
  577.                 ADD HL,HL
  578.                 ADD HL,DE
  579.                 CALL LOADZP
  580.                 CALL REALSEC
  581.                 POP AF
  582.                 DEC A
  583.                 LD L,A
  584.                 POP AF
  585.                 AND L
  586.                 LD L,A
  587.                 LD H,0
  588.                 ADD HL,DE
  589.                 EX DE,HL
  590.                 LD HL,0
  591.                 ADC HL,BC
  592.                 LD B,H
  593.                 LD C,L
  594.                 CALL LOADLST
  595.                 POP BC
  596.                 RET
  597.  
  598. ;ПРОВЕРКА НА ПОСЛЕДНИЙ КЛАСТЕР В ЦЕПОЧКЕ
  599. LST_CLS         LD A,(CAL_FAT)          ;ЗАВИСИТ ОТ РАЗРЯДНОСТИ ФАТА
  600.                 AND A
  601.                 JP NZ,LST_CL1
  602.                 LD HL,0X0FF7            ;ПРОВЕРКА ДЛЯ ФАТ12
  603.                 SBC HL,DE
  604.                 RET
  605.  
  606. LST_CL1         DEC A
  607.                 JP NZ,LST_CL2
  608. LST_CL3         LD HL,0XFFF7            ;ПРОВЕРКАМ ДЛЯ ФАТ16 И МЛАДШИХ БИТ ФАТ32
  609.                 SBC HL,DE
  610.                 RET
  611.  
  612. LST_CL2         LD HL,0X0FFF            ;ПРОВЕРКА ДЛЯ СТАРШИХ БИТ ФАТ32
  613.                 SBC HL,BC
  614.                 RET NZ
  615.                 JP LST_CL3
  616.  
  617. ;ЧТЕНИЕ СЛЕДУЮЩЕГО НОМЕРА КЛАСТЕРА В ЦЕПОЧКЕ
  618. RDFATZP         LD A,(CAL_FAT)          ;ЧТЕНИЕ ЗАВИСИТ ОТ РАЗРАДНОСТИ ФАТА
  619.                 AND A
  620.                 JP Z,RDFATS0            ;ПЕРЕХОД ВПЕРЕД ДЛЯ ФАТ12
  621.                 DEC A
  622.                 JP Z,RDFATS1            ;ПЕРЕХОД ВПЕРЕД ДЛЯ ФАТ16
  623.                 EX DE,HL                ;ЗДЕСЬ ЧТЕНИЕ ДЛЯ ФАТ32
  624.                 ADD HL,HL
  625.                 EX DE,HL
  626.                 LD HL,0
  627.                 ADC HL,BC
  628.                 ADC HL,BC               ;УМНОЖИЛИ НОМЕР КЛАСТЕРА НА 2
  629.                 LD A,E
  630.                 LD E,D
  631.                 LD D,L
  632.                 LD C,H
  633.                 LD B,0                  ;РАЗДЕЛИЛИ НОМЕР КЛАСТЕРА НА 256
  634.                 CALL RDFATS2            ;ЧИТАЕМ МЛАДШИЕ 16 БИТ ИСПОЛЬЗУЯ ЧТЕНИЕ ДЛЯ ФАТ16
  635.                 INC HL
  636.                 LD C,(HL)
  637.                 INC HL
  638.                 LD B,(HL)               ;ПРОЧИТАЛИ ПОСЛЕДУЮЩИЕ СТАРШИЕ 16 БИТ
  639.                 RET
  640.  
  641. RDFATS1         LD BC,0
  642.                 LD A,E
  643.                 LD E,D
  644.                 LD D,C                  ;РАЗДЕЛИЛИ НОМЕР КЛАСТЕРА НА 256, СТАРШИЕ 16 БИТ =0
  645. RDFATS2         PUSH AF                 ;ОБЩЕЕ ЧТЕНИЕ 16 БИТНОГО НОМЕРА КЛАСТЕРА ДЛЯ ФАТ16/32
  646.                 PUSH BC
  647.                 LD HL,FATSTR
  648.                 CALL BCDEHLP
  649.                 CALL LOADLST            ;ЗАГРУЗИЛИ ВЫЧИСЛЕННЫЙ НОМЕР СЕКТОРА
  650.                 POP BC
  651.                 POP AF
  652.                 LD E,A
  653.                 LD D,0
  654.                 ADD HL,DE
  655.                 ADD HL,DE               ;ВЫЧИСЛИЛИ СМЕЩЕНИЕ ДО НУЖНОГО НОМЕРА В ЗАГРУЖЕННОМ СЕКТОРЕ
  656.                 LD E,(HL)
  657.                 INC HL
  658.                 LD D,(HL)               ;ПОЛУЧИЛИ 16 БИТ НОМЕРА КЛАСТЕРА
  659.                 RET
  660.  
  661. ;ЧТЕНИЕ 12 БИТНОГО НОМЕРА КЛАСТЕРА ИЗ ЦЕПОЧКИ ДЛЯ ФАТ12
  662. RDFATS0         LD H,D
  663.                 LD L,E
  664.                 ADD HL,HL
  665.                 ADD HL,DE               ;HL=HL*3
  666.                 SRL H
  667.                 RR L                    ;HL=HL/2 - В ИТОГЕ УМНОЖИЛИ НОМЕР КЛАСТЕРА НА 1,5
  668.                 LD A,E                  ;A-НАМ ИНТЕРЕСЕН ТОЛЬКО БИТ НОМЕР СТАРОГО НОМЕРА КЛАСТЕРА
  669.                 LD E,H
  670.                 LD D,0
  671.                 LD B,D
  672.                 LD C,D                  ;РАЗДЕЛИЛИ НОМЕР КЛАСТЕРА НА 256
  673.                 SRL E
  674.                 PUSH AF
  675.                 PUSH HL
  676.                 LD HL,FATSTR
  677.                 CALL BCDEHLP
  678.                 CALL LOADLST            ;ЗАГРУЗИЛИ ВЫЧИСЛЕННЫЙ СЕКТОР
  679.                 POP BC
  680.                 LD A,B
  681.                 AND 1
  682.                 LD B,A                  ;BC=СМЕЩЕНИЕ В ЗАГРУЖЕННОМ СЕКТОРЕ
  683.                 ADD HL,BC               ;HL=АДРЕС ОТКУДА ЧИТАТЬ БАЙТЫ НОМЕРА КЛАСТЕРА
  684.                 LD B,(HL)               ;ПРОЧИТАЛИ МЛАДШУЮ ЧАСТЬ НОМЕРА КЛАСТЕРА
  685.                 INC HL                  ;АДРЕС СЛЕДУЮЩЕГО БАЙТА
  686.                 LD A,H
  687.                 CP HIGH (BUF_512_)+2    ;ПРОВЕРКА НА ПЕРЕХОД ГРАНИЦЫ ЗАГРУЖЕННОГО СЕКТОРА
  688.                 JP NZ,RDFATS4
  689.                 PUSH BC                 ;ВЫХЛД ЗА ПРЕДЕЛЫ ТЕКУЩЕГО ЗАГРУЖЕННОГО СЕКТОРА
  690.                 LD BC,0
  691.                 INC DE
  692.                 CALL LOADLST            ;ЗАГРУЖАЕМ СЛЕДУЮЩИЙ СЕКТОР ФАТ ТАБЛИЦЫ
  693.                 POP BC
  694. RDFATS4         POP AF
  695.                 LD D,(HL)               ;ЧИТАЕМ СТАРШИЕ БИТЫ НОМЕРА КЛАСТЕРА
  696.                 LD E,B                  ;ТЕПЕРЬ DE=НОМЕР СЛЕДУЮЩЕГО КЛАСТЕРА В ЦЕПОЧКЕ
  697.                 LD BC,0
  698.                 RRA                     ;ПРОВЕРЯЕМ БИТ 0 СТАРОГО НОМЕРА КЛАСТЕРА
  699.                 JP NC,RDFATS3
  700.                 SRL D                   ;СДВИГАЕМ НОМЕР ПРОЧИТАННОГО НОМЕРА КЛАСТЕРА В МЛАДШИЕ 12 БИТ
  701.                 RR E
  702.                 SRL D
  703.                 RR E
  704.                 SRL D
  705.                 RR E
  706.                 SRL D
  707.                 RR E
  708. RDFATS3         LD A,D
  709.                 AND 0X0F
  710.                 LD D,A                  ;СБРОСИЛИ НЕЗНАЧАЩИЕ СТАРШИЕ 4 БИТА У ПОЛУЧЕННОГО НОМЕРА КЛАСТЕРА
  711.                 RET
  712.  
  713. ;ВЫЧИСЛЕНИЕ РЕАЛЬНОГО СЕКТОРА
  714. ;НА ВХОДЕ BCDE=НОМЕР КЛАСТЕРА FAT
  715. ;НА ВЫХОДЕ BCDE=НОМЕР РЕАЛЬНОГО СЕКТОРА
  716. REALSEC         LD A,B
  717.                 OR C
  718.                 OR D
  719.                 OR E
  720.                 JP NZ,REALSE1           ;BCDE=0?
  721.                 LD HL,SEC_FAT           ;ЭТО ROOT ДИРЕКТОРИЯ У ФАТ12/16
  722.                 LD DE,(FATSTR)          ;МЕСТОПОЛОЖЕНИЕ ROOT ДИРЫ СРАЗУ ПОСЛЕ ФАТ ТАБЛИЦЫ
  723.                 LD BC,(FATSTR+2)
  724.                 PUSH HL
  725.                 CALL BCDEHLP            ;ПРИБАВИЛИ К НАЧАЛУ ФАТ ТАБЛИЦЫ ЕЕ РАЗМЕР
  726.                 POP HL
  727.                 JP BCDEHLP              ;ПРИБАВИЛИ ЕЩЕ РАЗ И ПОЛУЧИЛИ НОМЕР СЕКТОРА НАЧАЛА ROOT ДИРЫ
  728.  
  729. REALSE1         LD HL,0XFFFE
  730.                 EX DE,HL
  731.                 ADD HL,DE
  732.                 EX DE,HL
  733.                 INC HL
  734.                 ADC HL,BC               ;HLDE=НОМЕР КЛАСТЕРА-2
  735.                 LD A,(BYTSSEC)          ;НУЖНО УМНОЖИТЬ НА РАЗМЕР КЛАСТЕРА
  736.                 JP REALSE2
  737.  
  738. REALSE3         SLA E
  739.                 RL D
  740.                 RL L
  741.                 RL H
  742. REALSE2         RRCA
  743.                 JP NC,REALSE3           ;УМНОЖИЛИ НА РАЗМЕР КЛАСТЕРА
  744.                 LD B,H
  745.                 LD C,L
  746.                 LD HL,STARTRZ
  747.                 CALL BCDEHLP            ;ПРИБАВИЛИ СМЕЩЕНИЕ ОТ НАЧАЛА ДИСКА
  748.                 LD HL,FRSTDAT
  749.                 JP BCDEHLP              ;ПРИБАВИЛИ СМЕЩЕНИЕ ОТ НАЧАЛА РАЗДЕЛА
  750.  
  751. ;BCDE=BCDE/512
  752. BCDE200         LD E,D
  753.                 LD D,C
  754.                 LD C,B
  755.                 LD B,0
  756.                 LD A,2
  757.                 JP BCDE_A
  758.  
  759. ;BCDE>>A=BCDE
  760. BCDE_A1         SRL B
  761.                 RR C
  762.                 RR D
  763.                 RR E
  764. BCDE_A          RRCA
  765.                 JP NC,BCDE_A1
  766.                 RET
  767.  
  768. ;(ADR)-BCDE=BCDE
  769. BCDEHLM         LD A,(HL)
  770.                 INC HL
  771.                 SUB E
  772.                 LD E,A
  773.                 LD A,(HL)
  774.                 INC HL
  775.                 SBC A,D
  776.                 LD D,A
  777.                 LD A,(HL)
  778.                 INC HL
  779.                 SBC A,C
  780.                 LD C,A
  781.                 LD A,(HL)
  782.                 SBC A,B
  783.                 LD B,A
  784.                 RET
  785.  
  786. ;(ADR)+BCDE=BCDE
  787. BCDEHLP         LD A,(HL)
  788.                 INC HL
  789.                 ADD A,E
  790.                 LD E,A
  791.                 LD A,(HL)
  792.                 INC HL
  793.                 ADC A,D
  794.                 LD D,A
  795.                 LD A,(HL)
  796.                 INC HL
  797.                 ADC A,C
  798.                 LD C,A
  799.                 LD A,(HL)
  800.                 ADC A,B
  801.                 LD B,A
  802.                 RET
  803.  
  804. ;BCDE-(ADR)=BCDE
  805. HLBCDEM         LD A,E
  806.                 SUB (HL)
  807.                 INC HL
  808.                 LD E,A
  809.                 LD A,D
  810.                 SBC A,(HL)
  811.                 INC HL
  812.                 LD D,A
  813.                 LD A,C
  814.                 SBC A,(HL)
  815.                 INC HL
  816.                 LD C,A
  817.                 LD A,B
  818.                 SBC A,(HL)
  819.                 LD B,A
  820.                 RET
  821.  
  822. ;HLDE+BC=HLDE
  823. HLDEPBC         EX DE,HL
  824.                 ADD HL,BC
  825.                 EX DE,HL
  826.                 LD BC,0
  827.                 ADC HL,BC
  828.                 RET
  829.  
  830. ;ГРУЗИЛКА ОДНОГО СЕКТОРА
  831. LOADLST         LD HL,BUF_512_          ;АДРЕС БУФЕРА СЕКТОРА
  832.                 LD A,1                  ;ГРУЗИТЬ 1 СЕКТОР
  833.                 CALL RDMULTI            ;ЗАГРУЗИЛИ СЕКТОР
  834.                 LD HL,BUF_512_          ;НА ВЫХОДЕ HL=АДРЕС НАЧАЛА БУФЕРА ЗАГРУЖЕННОГО СЕКТОРА
  835.                 RET
  836.  
  837. ;ПОДАЧА КОМАНДЫ В SD КАРТУ БЕЗ ПАРАМЕТРОВ
  838. OUTCOM          PUSH BC
  839.                 LD BC,0X0600+SD__SEND   ;ВЫДАТЬ В ПОРТ 6 БАЙТ
  840.                 OTIR
  841.                 POP BC
  842.                 RET
  843.  
  844. ;ВЫДАЧА В ПОРТ SD КАРТЫ КОМАНДЫ С ПАРАМЕТРОМ 0
  845. OUT_COM         PUSH BC
  846.                 LD BC,SD__SEND
  847.                 OUT (C),A               ;ОТПРАВИЛИ КОД КОМАНДЫ
  848.                 XOR A
  849.                 OUT (C),A               ;БИТЫ 31-24 ПАРАМЕТРА
  850.                 NOP
  851.                 OUT (C),A               ;БИТЫ 23-16 ПАРАМЕТРА
  852.                 NOP
  853.                 OUT (C),A               ;БИТЫ 15-8 ПАРАМЕТРА
  854.                 NOP
  855.                 OUT (C),A               ;БИТЫ 7-0 ПАРАМЕТРА
  856.                 DEC A
  857.                 OUT (C),A               ;БЕЗ CRC16
  858.                 POP BC
  859.                 RET
  860.  
  861. SECM200         PUSH HL
  862.                 PUSH BC
  863.                 LD A,CMD_58
  864.                 CALL OUT_COM
  865.                 CALL IN_OOUT
  866.                 LD BC,SD__RSTR
  867.                 IN H,(C)
  868.                 NOP
  869.                 IN A,(C)
  870.                 NOP
  871.                 IN A,(C)
  872.                 NOP
  873.                 IN A,(C)
  874.                 BIT 6,H
  875.                 POP HL
  876.                 JP NZ,SECN200
  877.                 EX DE,HL
  878.                 ADD HL,HL
  879.                 EX DE,HL
  880.                 ADC HL,HL
  881.                 LD H,L
  882.                 LD L,D
  883.                 LD D,E
  884.                 LD E,0
  885. SECN200         LD A,CMD_18
  886.                 LD C,SD__SEND
  887.                 OUT (C),A
  888.                 NOP
  889.                 OUT (C),H
  890.                 NOP
  891.                 OUT (C),L
  892.                 NOP
  893.                 OUT (C),D
  894.                 NOP
  895.                 OUT (C),E
  896.                 LD A,0XFF
  897.                 OUT (C),A
  898.                 POP HL
  899.                 RET
  900.  
  901. IN_OOUT         PUSH DE
  902.                 LD DE,0X04FF
  903. IN_WAIT         IN A,(SD__RSTR)
  904.                 CP E
  905.                 JP NZ,IN_EXIT
  906. IN_NEXT         DEC D
  907.                 JP NZ,IN_WAIT
  908. IN_EXIT         POP DE
  909.                 RET
  910.  
  911. CMD00           DB 0X40,0X00,0X00,0X00,0X00,0X95        ;GO_IDLE_STATE
  912. CMD08           DB 0X48,0X00,0X00,0X01,0XAA,0X87        ;SEND_IF_COND
  913. CMD16           DB 0X50,0X00,0X00,0X02,0X00,0XFF        ;SET_BLOCKEN
  914.  
  915. ;МНОГО СЕКТОРНОЕ ЧТЕНИЕ С SD КАРТЫ
  916. RDMULTI         EX AF,AF'
  917.                 CALL SECM200
  918.                 EX AF,AF'
  919.                 LD BC,SD__RSTR
  920. RDMULT1         EX AF,AF'
  921. RDMULT2         CALL IN_OOUT
  922.                 CP 0XFE
  923.                 JP NZ,RDMULT2
  924.                 INIR
  925.                 NOP
  926.                 INIR
  927.                 NOP
  928.                 IN A,(C)
  929.                 NOP
  930.                 IN A,(C)
  931.                 EX AF,AF'
  932.                 DEC A
  933.                 JP NZ,RDMULT1
  934.                 LD A,CMD_12
  935.                 CALL OUT_COM
  936.                 CALL IN_OOUT
  937.                 INC A
  938.                 JP NZ,$-4
  939.                 RET
  940.  
  941. ;ВЫБОРКА НОМЕРА КЛАСТЕРА ИЗ ФАЙЛОВОГО ОПИСАТЕЛЯ
  942. RD_CLAS         EX DE,HL
  943.                 LD DE,0X14              ;СТАРШИЕ 16 БИТ ЧИТАЕМ ИЗ СМЕЩЕНИЯ +20
  944.                 ADD HL,DE
  945.                 LD C,(HL)
  946.                 INC HL
  947.                 LD B,(HL)
  948.                 LD E,5                  ;МЛАДШИЕ 16 БИТ ЧИТАЕМ ИЗ СМЕЩЕНИЯ +26
  949.                 ADD HL,DE
  950.                 LD E,(HL)
  951.                 INC HL
  952.                 LD D,(HL)
  953.                 INC HL
  954.                 RET
  955.  
  956. ;ПРОВЕРКА ПО МАСКЕ
  957. COMPARE         LD DE,FB_EXT
  958.                 LD B,0X0B
  959.                 LD A,(DE)
  960.                 CP (HL)
  961.                 RET NZ
  962.                 INC HL
  963.                 INC DE
  964.                 DJNZ $-5
  965.                 RET
  966.  
  967. ;РАСПАКОВЩИК ПУТИ К ФАЙЛУ
  968. FNDBUF          LD BC,0X0802
  969.                 LD DE,FB_EXT
  970. FNDBUF4         LD A,(HL)
  971.                 INC HL
  972.                 CP 0X2E
  973.                 JR Z,FNDBUF2
  974.                 CP 0X5C
  975.                 JR Z,FNDBUF5
  976.                 LD (DE),A
  977.                 INC DE
  978.                 DJNZ FNDBUF4
  979.                 LD A,(HL)
  980.                 AND A
  981.                 RET Z
  982.                 INC HL
  983.                 JR FNDBUF3
  984.  
  985. FNDBUF5         LD A,C
  986.                 AND A
  987.                 RET Z
  988. FNDBUF2         LD A,B
  989.                 AND A
  990.                 JR Z,FNDBUF3
  991.                 LD A,0X20
  992.                 LD (DE),A
  993.                 INC DE
  994.                 DJNZ $-2
  995. FNDBUF3         LD B,3
  996.                 DEC C
  997.                 DEC HL
  998.                 LD A,(HL)
  999.                 CP 0X5C
  1000.                 JR Z,FNDBUF4
  1001.                 INC HL
  1002.                 JR FNDBUF4
  1003.  
  1004.                 include flasher.a80
  1005.  
  1006. ;ПРОШИВАТЕЛЬ ПЗУ С ИНДИКАЦИЕЙ ПРОЦЕССА
  1007. FLASHER         LD BC,PENT_CONF
  1008.                 XOR A
  1009.                 OUT (C),A
  1010.         PEC_ON M_SHADOW_BF
  1011.                 LD BC,0XFF77
  1012.                 LD A,0XA3
  1013.                 OUT (C),A                       ;ПРИНУДИТЕЛЬНОЕ ВКЛЮЧЕНИЕ ТУРБО РЕЖИМА 7МГЦ
  1014.         PEC_ON M_SHADOW_BF + M_FLASH_BF         ;РАЗРЕШЕНИЕ ПРОГРАММИРОВАНИЯ FLASH
  1015.                 LD BC,WIN_A0
  1016.                 LD A,0X7F
  1017.                 OUT (C),A                       ;ОТКЛЮЧЕНИЕ ROM В ОКНЕ 0
  1018.                 LD IX,IXBASE
  1019.                 LD (IX+0),12
  1020.                 LD (IX+1),4
  1021.                 LD HL,TXT_ERASE
  1022.                 CALL PRINT_MSG
  1023.                 CALL SETWIN_INDICAT             ;УСТАНОВКА ИНДИКАТОРА ПРОЦЕССА
  1024.                 LD E,0
  1025.                 LD HL,0
  1026. FLASHER4        CALL ERASE_BLK                  ;СТИРАНИЕ БЛОКА 64КБ
  1027.                 CALL INC_INDICAT                ;ОБНОВЛЕНИЕ ИНДИКАТОРА ПРОЦЕССА
  1028.                 INC E                           ;СЛЕДУЮЩИЙ БЛОК
  1029.                 BIT 3,E
  1030.                 JR Z,FLASHER4
  1031.                 LD BC,WIN_A3
  1032.                 LD A,0X7F
  1033.                 OUT (C),A
  1034.                 LD (IX+0),12
  1035.                 LD (IX+1),6
  1036.                 LD HL,TXT_WRITE
  1037.                 REPT 8
  1038.                 CALL PRINT_MSG
  1039.                 ENDM
  1040.                 LD A,RAM_FLASHER                ;СТРАНИЦА НАЧАЛА ЗАГРУЖЕННОГО ROM ФАЙЛА
  1041.                 LD E,0
  1042. FLASHER3        CALL FLASH_64KB                 ;ПРОШИВАНИЕ ОДНОЙ 64КБ СТРАНИЦЫ
  1043.                 INC (IX+1)
  1044.                 INC E                           ;СЛЕДУЮЩАЯ 64КБ СТРАНИЦА
  1045.                 BIT 3,E
  1046.                 JR Z,FLASHER3
  1047. EFLASHER        LD BC,WIN_P3
  1048.                 XOR A
  1049.                 OUT (C),A                       ;ВКЛЮЧЕНИЕ RAM В ОКНЕ 3
  1050.                 LD A,(CPU3+0X20)
  1051.                 XOR B
  1052.                 LD (CPU3+0X20),A                ;МЕНЯЕМ БАЙТ ДЛЯ НАРУШЕНИЯ CRC КОНТРОЛЯ И ПОЛНОГО РЕИНИТА
  1053.                 LD A,(CPU1+BUF_TABLVOL+0XFE)
  1054.                 XOR B
  1055.                 LD (CPU1+BUF_TABLVOL+0XFE),A    ;АНАЛОГИЧНО ДЛЯ DEVICE MANAGER
  1056.         PEC_OFF M_FLASH_BF
  1057.                 LD HL,0X79ED                    ;OUT (C),A
  1058.                 LD (0XFFFE),HL                  ;УКЛАДКА КОМАНДЫ OUT (C),A
  1059.                 LD BC,0XBC77
  1060.                 LD A,2
  1061.                 JP 0XFFFE
  1062.  
  1063. ;ПРОШИВАНИЕ ОДНОЙ 64КБ СТРАНИЦЫ
  1064. ;ВХОД: A=НОМЕР 16КБ СТРАНИЦЫ ОТКУДА БРАТЬ БАЙТЫ ДЛЯ ПРОШИВАНИЯ
  1065. ;      E=НОМЕР ПРОШИВАЕМОЙ 64КБ СТРАНИЦЫ
  1066. FLASH_64KB      LD HL,0
  1067.                 PUSH AF
  1068.                 LD A,E
  1069.                 ADD A,2
  1070.                 CALL SETWIN_INDICAT             ;ОБНОВЛЕНИЕ ИНДИКАТОРА ПРОЦЕССА
  1071.                 POP AF
  1072. FLASHER2        PUSH AF
  1073.                 LD BC,WIN_P0
  1074.                 OUT (C),A                       ;ВКЛЮЧЕНИЕ СТРАНИЦЫ RAM ОТКУДА БРАТЬ БАЙТЫ ДЛЯ ПРОШИВАНИЯ
  1075.                 PUSH IX
  1076.                 LD IX,0
  1077. FLASHER1        LD A,(IX)                       ;ВЗЯЛИ БАЙТ ДЛЯ ПРОШИВАНИЯ
  1078.                 INC A
  1079.                 JR Z,FLASHER5                   ;ЕСЛИ БАЙТ = FF, ТО НЕ ПРОШИВАЕМ
  1080.                 DEC A
  1081.                 CALL PGM_BYTE                   ;ПРОШИЛИ БАЙТ
  1082. FLASHER5        INC IX
  1083.                 INC HL
  1084.                 LD A,H
  1085.                 AND 0X0F
  1086.                 OR L
  1087.                 CALL Z,INC_INDICAT              ;ОБНОВИЛИ ИНДИКАТОР ЕСЛИ ПРОШИЛИ 4КБ
  1088.                 LD A,IXH
  1089.                 AND 0X40
  1090.                 JR Z,FLASHER1                   ;ПРОДОЛЖАЕМ ПОКА НЕ КОНЧИТСЯ СТРАНИЦА ВЫБОРКИ БАЙТ
  1091.                 POP IX
  1092.                 POP AF
  1093.                 INC A                           ;СЛЕДУЮЩАЯ СТРАНИЦА ОТКУДА БАЙТЫ БРАТЬ ДЛЯ ПРОШИВАНИЯ
  1094.                 LD D,A                          ;ВРЕМЕННО СОХРАНИЛИ
  1095.                 LD A,H                          ;ПРОВЕРКА НА ОКОНЧАНИЕ 64КБ СТРАНИЦЫ
  1096.                 AND A
  1097.                 LD A,D                          ;ВОССТАНОВИЛИ
  1098.                 JR NZ,FLASHER2
  1099.                 RET
  1100.  
  1101. SET4MBPAGE      PUSH BC
  1102.                 LD B,A
  1103.         PEC_ON M_SHADOW_BF
  1104.                 LD A,B
  1105.                 LD BC,WIN_P2
  1106.                 OUT (C),A
  1107.                 LD B,A
  1108.         PEC_OFF M_SHADOW_BF
  1109.                 LD A,B
  1110.                 POP BC
  1111.                 RET
  1112.  
  1113. ;H-X, L-Y
  1114. ADRDIS          LD (ASD+1),A
  1115.                 LD A,L
  1116.                 AND 0X18
  1117.                 OR 0X40
  1118.                 EX AF,AF'
  1119.                 LD A,L
  1120.                 AND 7
  1121.                 RRCA
  1122.                 RRCA
  1123.                 RRCA
  1124.                 ADD A,H
  1125.                 LD L,A
  1126.                 EX AF,AF'
  1127.                 LD H,A
  1128.                 LD E,L
  1129. ADRATR          LD A,H
  1130.                 RRCA
  1131.                 RRCA
  1132.                 RRCA
  1133.                 AND 3
  1134.                 OR 0X58
  1135.                 LD D,A
  1136. ASD             LD A,0
  1137.                 RET
  1138.  
  1139. IXBASE          DB 0,0
  1140.  
  1141. ;                       12345678901234567890123456789012
  1142. TXT_VERS        DB 0,0,"*** Fast update PentEvo ROM ***",0
  1143. TXT_ERASE       DB 0,4,"Erase FLASH 01234567",0
  1144. TXT_WRITE       DB 0,6,"Write pages 0",0
  1145. TXT_1           DB 12,7,"1",0
  1146. TXT_2           DB 12,8,"2",0
  1147. TXT_3           DB 12,9,"3",0
  1148. TXT_4           DB 12,10,"4",0
  1149. TXT_5           DB 12,11,"5",0
  1150. TXT_6           DB 12,12,"6",0
  1151. TXT_7           DB 12,13,"7",0
  1152. TXT_LOAD        DB 0,2,"Loading file ZXEVO.ROM...",0
  1153. TXT_OK          DB 25,2,"Ok",0
  1154. TXT_SDERROR     DB 0,2,"SD card not found",0
  1155. TXT_FILENONE    DB 0,2,"File ZXEVO.ROM not found",0
  1156. TXT_FATERROR    DB 0,2,"FAT not found",0
  1157. TXT_RESET       DB 0,4,"Press any key for RESET",0
  1158. TXT_SIZEERROR   DB 0,2,"ZXEVO.ROM size error",0
  1159.  
  1160. ;HL-XY КООРДИНАТА
  1161. ;DE-АДРЕС ТЕКСТА
  1162. PRINT_MSG       LD A,(HL)
  1163.                 INC HL
  1164.                 LD C,(HL)
  1165.                 INC HL
  1166.                 PUSH HL
  1167.                 LD L,C
  1168.                 LD H,A
  1169.                 CALL ADRDIS
  1170.                 EX DE,HL
  1171.                 POP HL
  1172. PRINTMSG2       LD A,(HL)
  1173.                 INC HL
  1174.                 AND A
  1175.                 RET Z
  1176.                 PUSH DE
  1177.                 PUSH HL
  1178.                 LD BC,CHARS
  1179.                 LD L,A
  1180.                 LD H,C
  1181.                 ADD HL,HL
  1182.                 ADD HL,HL
  1183.                 ADD HL,HL
  1184.                 ADD HL,BC
  1185.                 REPT 8
  1186.                 LD A,(HL)
  1187.                 LD (DE),A
  1188.                 INC HL
  1189.                 INC D
  1190.                 ENDM
  1191.                 POP HL
  1192.                 POP DE
  1193.                 INC DE
  1194.                 JR PRINTMSG2
  1195.  
  1196. ;УСТАНОВКА АДРЕСА РИСОВАНИЯ ИНДИКАТОРНОЙ ПОЛОСКИ
  1197. SETWIN_INDICAT  PUSH HL
  1198.                 PUSH DE
  1199.                 PUSH BC
  1200.                 LD H,(IX)
  1201.                 LD L,(IX+1)
  1202.                 CALL ADRDIS
  1203.                 LD (ADRSTARTIND),DE
  1204.                 POP BC
  1205.                 POP DE
  1206.                 POP HL
  1207.                 RET
  1208.  
  1209. ;РИСОВАНИЕ СЛЕДУЮЩЕГО ЦВЕТНОГО КВАДРАТИКА
  1210. INC_INDICAT     PUSH HL
  1211.                 LD HL,0
  1212. ADRSTARTIND     EQU $-2
  1213.                 LD (HL),0X0F
  1214.                 INC HL
  1215.                 LD (ADRSTARTIND),HL
  1216.                 POP HL
  1217.                 RET
  1218.