Subversion Repositories pentevo

Rev

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

  1.  
  2. ;LAST UPDATE: 13.03.2020 savelij
  3.  
  4.                 include ../../macros.a80
  5.                 include ../../define.a80
  6.                 include ../../global_vars.a80
  7.                 include ../../ports_ngs.a80
  8.                 include ../../sdcomand.a80
  9.                 include ../../ports_ide.a80
  10.                 include ../../nums_devices.a80
  11.  
  12. DRV_VAR         EQU 0X4000
  13.  
  14.                 ORG DRV_VAR+0X200
  15.                 include fat_vars.a80
  16.  
  17.                 ORG DRV_VAR+0X300
  18.  
  19. BUF_512_        EQU DRV_VAR                     ;200 БУФЕР СЕКТОРА
  20. NUM_DEVICE      EQU DRV_VAR+0X2FF               ;1 НОМЕР УСТРОЙСТВА ДЛЯ ЗАПУСКА КОДА
  21. MAS_SLA         EQU NUM_DEVICE-1                ;1 МАСКА ДЛЯ MASTER/SLAVE
  22. LOADSCS1        EQU MAS_SLA-2                   ;2 АДРЕС ВЫЗЫВАЕМОГО ДРАЙВЕРА
  23. LENGHT          EQU LOADSCS1-2                  ;2 ДЛИНА ФАЙЛА В БАЙТАХ
  24.  
  25. ;[ТОЧКА ВХОДА]
  26. ;НА ВХОДЕ: A-НОМЕР ВЫБРАННОГО УСТРОЙСТВА
  27. ;       BCDE-НОМЕР КЛАСТЕРА ЗАПУСКАЕМОГО ФАЙЛА
  28.                 DI
  29.                 LD A,(NUM_DEVICE)
  30.                 CP _SD_SDZ
  31.                 LD HL,READ_SD                   ;ДРАЙВЕР SD ZC КАРТЫ           
  32.                 JR Z,SETLOADER
  33.                 CP _SD_SDG
  34.                 LD HL,READNGS                   ;ДРАЙВЕР SD NGS КАРТЫ
  35.                 JR Z,SETLOADER
  36.                 CP _HDD_NEMO_MASTER
  37.                 LD HL,RD_HDDN                   ;ДРАЙВЕР HDD NEMO
  38.                 JR Z,SETLOADER
  39.                 CP _HDD_SMUC_MASTER
  40.                 LD HL,RD_HDDS                   ;ДРАЙВЕР HDD SMUC
  41.                 JR Z,SETLOADER
  42.                 CP _HDD_DIVIDE_MASTER
  43.                 LD HL,RD_HDDD                   ;ДРАЙВЕР HDD DIVIDE
  44.                 JR Z,SETLOADER
  45.                 LD HL,RD_HDDP                   ;ДРАЙВЕР HDD PROFI
  46. SETLOADER       LD (LOADSCS1),HL                ;УСТАНОВИЛИ АДРЕС ЧИТАЛКИ СЕКТОРОВ
  47.                 LD A,(MAS_SLA)
  48.                 AND A
  49.                 LD A,0XE0
  50.                 JR Z,SETMASL
  51.                 LD A,0XF0
  52. SETMASL         LD (MAS_SLA),A
  53.                 LD HL,(FILE_SRC+0X14)
  54.                 LD (AFILCLS+2),HL
  55.                 LD HL,(FILE_SRC+0X1A)
  56.                 LD (AFILCLS),HL
  57.                 LD A,(FILE_SRC+9)
  58.                 CP "P"
  59.                 JP Z,RUNSPG2                    ;ПЕРЕХОД НА ЗАПУСК SPG ФАЙЛА
  60.                 CP "N"
  61.                 JP Z,RUNSNA                     ;ПЕРЕХОД НА ЗАПУСК SNA ФАЙЛА
  62.                 CALL REALSEC                    ;ПРЕОБРАЗОВАЛИ В НОМЕР СЕКТОРА
  63.                 CALL LOADLST                    ;ЗАГРУЗИЛИ В БУФЕР
  64.                 EXX
  65.                 LD HL,(BUF_512_+9)
  66.                 LD (0X5D45),HL                  ;АДРЕС СТАРТА КОДА
  67.                 LD HL,(BUF_512_+0X0B)
  68.                 LD (LENGHT),HL                  ;УСТАНОВКА ДЛИНЫ ФАЙЛА В БАЙТАХ
  69.                 LD DE,0X11
  70.                 ADD HL,DE                       ;ПРОПУСК HOBETA ЗАГОЛОВКА
  71.                 LD A,L
  72.                 AND A
  73.                 JR Z,READ01                     ;ЕСЛИ МЛАДШИЙ БАЙТ НЕ 0
  74.                 INC H                           ;СТАРШИЙ +1
  75. READ01          LD A,H
  76.                 SRL A                           ;ДЕЛИМ НА 2 ИБО НА ФАТЕ СЕКТОР 512 БАЙТ
  77.                 ADC A,0                         ;УЧИТЫВАЕМ ЧЕТ/НЕЧЕТ
  78.                 DEC A                           ;ПЕРВЫЙ СЕКТОР ЗАГРУЖЕН, ГРУЗИТЬ НА 1 МЕНЬШЕ
  79.                 EXX
  80.                 JP Z,LDIRBUF                    ;ЕСЛИ СЕКТОР 1 ПЕРЕНОС И ЗАПУСК
  81.                 LD IXL,A                        ;ЗАПОМНИЛИ КОЛИЧЕСТВО СЕКТОРОВ-1
  82.                 EXX
  83.                 CALL LD_ONES                    ;ПЕРЕНОС ОСТАТКОВ ПЕРВОГО СЕКТОРА
  84.                 PUSH DE                         ;АДРЕС КУДА ДАЛЕЕ ГРУЗИТЬ
  85.                 EXX
  86.                 LD HL,1                         ;ОДИН СЕКТОР УЖЕ ЗАГРУЖЕН
  87.                 ADD HL,DE                       ;ДАЛЕЕ ГРУЗИТЬ СО СЛЕДУЮЩЕГО СЕКТОРА
  88.                 EX DE,HL
  89.                 JR NC,READ04
  90.                 INC BC                          ;BCDE=BCDE+1
  91. READ04          POP HL                          ;В HL АДРЕС ДЛЯ ПРОДОЛЖЕНИЯ ЗАГРУЗКИ
  92.                 LD IY,(BYTSSEC)                 ;LY=КОЛ-ВО СЕКТОРОВ В КЛАСТЕРЕ
  93.                 LD A,IXL
  94.                 CP IYL                          ;СЕКТОРОВ ОСТАЛОСЬ МЕНЬШЕ ЧЕМ В КЛАСТЕРЕ
  95.                 JR C,READ02                     ;ПЕРЕХОД НА ДОЗАГРУЗКУ ОСТАТКА СЕКТОРОВ
  96.                 INC IXL
  97.                 LD A,IYL
  98.                 CP 2
  99.                 JR C,READ07
  100.                 DEC A
  101.                 JR READ05
  102.  
  103. READ07          PUSH HL
  104.                 CALL RDFATZP                    ;ПОЛУЧИТЬ НОМЕР СЛЕДУЮЩЕГО КЛАСТЕРА
  105.                 CALL LST_CLS                    ;ПРОВЕРКА НА ОКОНЧАНИЕ FAT ЦЕПОЧКИ
  106.                 POP HL
  107.                 JR C,RUNLOAD                    ;ЕСЛИ КЛАСТЕРА ЗАКОНЧИЛИСЬ, ТО ЗАПУСК ЗАГРУЖЕННОГО
  108.                 PUSH HL
  109.                 CALL REALSEC                    ;ПРЕОБРАЗОВАНИЕ НОМЕРА КЛАСТЕРА В НОМЕР СЕКТОРА
  110.                 POP HL
  111.                 LD A,IXL                        ;СКОЛЬКО СЕКТОРОВ ОСТАЛОСЬ ЗАГРУЗИТЬ
  112.                 CP IYL                          ;СРАВНИВАЕМ С РАЗМЕРОМ КЛАСТЕРА
  113.                 JR C,READ02                     ;ЕСЛИ ОСТАЛОСЬ ЗАГРУЗИТЬ СЕКТОРОВ МЕНЬШЕ ЧЕМ В КЛАСТЕРЕ, ТО ДОЗАГРУЖАЕМ ОСТАТОК
  114.                 LD A,IYL                        ;СКОЛЬКО СЕКТОРОВ ЗАГРУЖАТЬ
  115. READ05          CALL LOADSCS                    ;ЗАГРУЗКА СЕКТОРОВ
  116.                 LD A,IXL                        ;СКОЛЬКО СЕКТОРОВ ВСЕГО ЗАГРУЖАТЬ
  117.                 SUB IYL                         ;МИНУС СКОЛЬКО СЕКТОРОВ ТОЛЬКО ЧТО ЗАГРУЗИЛИ
  118.                 JR Z,RUNLOAD                    ;СЕКТОРА КОНЧИЛИСЬ, ПЕРЕХОДИМ НА ЗАПУСК
  119.                 LD IXL,A                        ;СКОЛЬКО СЕКТОРОВ ОСТАЛОСЬ ЗАГРУЗИТЬ
  120.                 JR READ07                       ;ПРОДОЛЖАЕМ ЗАГРУЗКУ
  121.  
  122. ;ЗАГРУЗКА КОЛИЧЕСТВА СЕКТОРОВ, ЕСЛИ ОСТАЛОСЬ МЕНЕЕ РАЗМЕРА КЛАСТЕРА
  123. READ02          AND A
  124.                 JR Z,READ03
  125.                 CALL LOADSCS
  126. READ03          PUSH HL
  127.                 LD A,IXL
  128.                 LD L,A
  129.                 LD H,0
  130.                 ADD HL,DE
  131.                 EX DE,HL
  132.                 JR NC,READ06
  133.                 INC BC
  134. READ06          CALL LOADLST
  135.                 LD BC,(LENGHT)
  136.                 EX DE,HL
  137.                 LD HL,0X11
  138.                 ADD HL,BC
  139.                 LD B,H
  140.                 LD C,L
  141.                 EX DE,HL
  142.                 POP DE
  143.                 LD A,B
  144.                 AND 1
  145.                 LD B,A
  146.                 OR C
  147.                 JR Z,RUNLOAD
  148.                 LDIR
  149. ;[ЗАПУСК ЗАГРУЖЕННОГО]
  150. RUNLOAD         LD HL,0X2758
  151.                 EXX
  152.                 LD IY,0X5C3A
  153.                 EI
  154.                 JP 0X1B7D                       ;ЗАПУСК ПЕРЕНЕСЕННОЙ БЕЙСИК ПРОГИ
  155.  
  156. LDIRBUF         LD HL,0X200-0X11
  157.                 LD DE,(BUF_512_+0X0B)
  158.                 AND A
  159.                 SBC HL,DE
  160.                 JR NC,LDIRBUF1
  161.                 CALL LD_ONES
  162.                 JP RUNLOAD
  163.  
  164. LDIRBUF1        LD HL,BUF_512_+0X11
  165.                 LD DE,(BUF_512_+9)
  166.                 LD BC,(BUF_512_+0X0B)
  167.                 LDIR
  168.                 JP RUNLOAD
  169.  
  170. ;[ПЕРЕНОС КУСКА ИЗ УЖЕ ЗАГРУЖЕННОГО СЕКТОРА, ЕСЛИ ФАЙЛ=501 БАЙТ И МЕНЕЕ]
  171. LD_ONES         LD HL,BUF_512_+0X11
  172.                 LD DE,(BUF_512_+9)
  173.                 LD BC,0X200-0X11
  174.                 LDIR
  175.                 RET
  176.  
  177. ;[ЗАГРУЗИТЬ СЕКТОРА С ВЫБРАННОГО УСТРОЙСТВА]
  178. LOADSCS         PUSH HL
  179.                 LD HL,(LOADSCS1)
  180.                 EX (SP),HL
  181.                 RET
  182.  
  183. ;[ЧТЕНИЕ ФАЙЛА]
  184. ;IXL-РАЗМЕР КЛАСТЕРА
  185. ;IXH-TEMP VAR        
  186. ;IYL-КОЛИЧЕСТВО СЕКТОРОВ ДЛЯ ЗАГРУЗКИ
  187. ;IYH-СМЕЩЕНИЕ В КЛАСТЕРЕ
  188. LD_FILE         PUSH BC                         ;СТАРШИЕ 16 БИТ НОМЕРА КЛАСТЕРА
  189.                 PUSH DE                         ;МЛАДШИЕ 16 БИТ НОМЕРА КЛАСТЕРА
  190.                 PUSH HL                         ;СОХРАНИЛИ АДРЕС ЗАГРУЗКИ
  191.                 CALL REALSEC                    ;ПЕРЕВЕЛИ НОМЕР КЛАСТЕРА В НОМЕР СЕКТОРА
  192.                 LD IX,(BYTSSEC)
  193.                 LD A,IYH                        ;СМЕЩЕНИЕ В КЛАСТЕРЕ
  194.                 LD L,A
  195.                 LD H,0
  196.                 ADD HL,DE
  197.                 EX DE,HL
  198.                 JR NC,LDFILE1
  199.                 INC BC                          ;BCDE=НОМЕР СЕКТОРА ОТКУДА ГРУЗИТЬ
  200. LDFILE1         LD A,IYL                        ;КОЛИЧЕСТВО СЕКТОРОВ ДЛЯ ЗАГРУЗКИ
  201.                 CP IXL                          ;РАЗМЕР КЛАСТЕРА
  202.                 JP C,LDFILE2
  203.                 LD A,IXL                        ;РАЗМЕР КЛАСТЕРА
  204. LDFILE2         ADD A,IYH                       ;СМЕЩЕНИЕ В КЛАСТЕРЕ
  205.                 CP IXL                          ;РАЗМЕР КЛАСТЕРА
  206.                 LD A,IYL                        ;КОЛИЧЕСТВО СЕКТОРОВ ДЛЯ ЗАГРУЗКИ
  207.                 JP C,LDFILE5
  208.                 LD A,IXL                        ;РАЗМЕР КЛАСТЕРА
  209.                 SUB IYH                         ;СМЕЩЕНИЕ В КЛАСТЕРЕ
  210. LDFILE5         LD IXH,A                        ;TEMP VAR, СКОЛЬКО СЕКТОРОВ СЕЙЧАС ГРУЗИМ
  211.                 POP HL                          ;ВОССТАНОВИЛИ АДРЕС ЗАГРУЗКИ
  212.                 CALL LOADSCS                    ;ЗАГРУЗИЛИ СЕКТОРА
  213.                 POP DE
  214.                 POP BC                          ;ВОССТАНОВИЛИ НОМЕР КЛАСТЕРА
  215.                 LD A,IYH                        ;СМЕЩЕНИЕ В КЛАСТЕРЕ
  216.                 ADD A,IXH                       ;TEMP VAR
  217.                 CP IXL                          ;РАЗМЕР КЛАСТЕРА
  218.                 JP C,LDFILE3
  219.                 SUB IXL                         ;РАЗМЕР КЛАСТЕРА
  220. LDFILE3         LD IYH,A                        ;СМЕЩЕНИЕ В КЛАСТЕРЕ
  221.                 JP C,LDFILE4
  222.                 PUSH HL                         ;СОХРАНИЛИ АДРЕС ЗАГРУЗКИ
  223.                 CALL RDFATZP                    ;ПРОЧИТАЛИ НОМЕР СЛЕДУЮЩЕГО КЛАСТЕРА
  224.                 CALL LST_CLS                    ;ПРОВЕРИЛИ, А МОЖЕТ ЭТО ПОСЛЕДНИЙ КЛАСТЕР?
  225.                 POP HL                          ;ВОССТАНОВИЛИ АДРЕС ЗАГРУЗКИ
  226.                 RET C                           ;ЕСЛИ ПОСЛЕДНИЙ, ВЫХОДИМ
  227. LDFILE4         LD A,IYL                        ;КОЛИЧЕСТВО СЕКТОРОВ ДЛЯ ЗАГРУЗКИ
  228.                 SUB IXH                         ;TEMP VAR
  229.                 RET Z
  230.                 LD IYL,A                        ;КОЛИЧЕСТВО СЕКТОРОВ ДЛЯ ЗАГРУЗКИ
  231.                 JP NZ,LD_FILE
  232.                 RET
  233.  
  234. ;[ПРОВЕРКА НОМЕРА КЛАСТЕРА]
  235. LST_CLS         LD A,(CAL_FAT)
  236.                 AND A
  237.                 JR NZ,LST_CL1
  238.                 LD HL,0X0FF7
  239.                 SBC HL,DE
  240.                 RET
  241.  
  242. LST_CL1         DEC A
  243.                 JR NZ,LST_CL2
  244.                 LD HL,0XFFF7
  245.                 SBC HL,DE
  246.                 RET
  247.  
  248. LST_CL2         LD HL,0X0FFF
  249.                 SBC HL,BC
  250.                 RET NZ
  251.                 LD HL,0XFFF7
  252.                 SBC HL,DE
  253.                 RET
  254.  
  255. ;[ЧТЕНИЕ СЛЕДУЮЩЕГО КЛАСТЕРА]
  256. RDFATZP         LD BC,(AFILCLS+2)
  257.                 LD DE,(AFILCLS)
  258.                 LD A,(CAL_FAT)
  259.                 AND A
  260.                 JR Z,RDFATS0
  261.                 DEC A
  262.                 JR Z,RDFATS1
  263.                 EX DE,HL
  264.                 ADD HL,HL
  265.                 EX DE,HL
  266.                 LD HL,0
  267.                 ADC HL,BC
  268.                 ADD HL,BC
  269.                 LD A,E
  270.                 LD E,D
  271.                 LD D,L
  272.                 LD C,H
  273.                 LD B,0
  274.                 CALL RDFATS2
  275.                 INC HL
  276.                 LD C,(HL)
  277.                 INC HL
  278.                 LD B,(HL)
  279. RDFATS5         LD (AFILCLS+2),BC
  280.                 LD (AFILCLS),DE
  281.                 RET
  282.  
  283. RDFATS1         LD BC,0
  284.                 LD A,E
  285.                 LD E,D
  286.                 LD D,C
  287. RDFATS2         PUSH AF
  288.                 PUSH BC
  289.                 LD HL,FATSTR
  290.                 CALL BCDEHLP
  291.                 CALL LOADLST
  292.                 POP BC
  293.                 POP AF
  294.                 LD E,A
  295.                 LD D,0
  296.                 ADD HL,DE
  297.                 ADD HL,DE
  298.                 LD E,(HL)
  299.                 INC HL
  300.                 LD D,(HL)
  301.                 JR RDFATS5
  302.  
  303. RDFATS0         LD H,D
  304.                 LD L,E
  305.                 ADD HL,HL
  306.                 ADD HL,DE
  307.                 SRL H
  308.                 RR L
  309.                 LD A,E
  310.                 LD E,H
  311.                 LD D,0
  312.                 LD B,D
  313.                 LD C,D
  314.                 SRL E
  315.                 PUSH AF
  316.                 PUSH HL
  317.                 LD HL,FATSTR
  318.                 CALL BCDEHLP
  319.                 CALL LOADLST
  320.                 POP BC
  321.                 LD A,B
  322.                 AND 1
  323.                 LD B,A
  324.                 ADD HL,BC
  325.                 LD B,(HL)
  326.                 INC HL
  327.                 LD A,H
  328.                 CP HIGH (BUF_512_)+2
  329.                 JR NZ,RDFATS4
  330.                 PUSH BC
  331.                 LD BC,0
  332.                 INC DE
  333.                 CALL LOADLST
  334.                 POP BC
  335. RDFATS4         POP AF
  336.                 LD D,(HL)
  337.                 LD E,B
  338.                 LD BC,0
  339.                 RRA
  340.                 JR NC,RDFATS3
  341.                 REPT 4
  342.                 SRL D
  343.                 RR E
  344.                 ENDM
  345. RDFATS3         LD A,D
  346.                 AND 0X0F
  347.                 LD D,A
  348.                 JR RDFATS5
  349.  
  350. ;[ПРЕОБРАЗОВАНИЕ НОМЕРА КЛАСТЕРА]
  351. ;ВЫЧИСЛЕНИЕ РЕАЛЬНОГО СЕКТОРА
  352. ;НА ВХОДЕ BCDE=НОМЕР FAT
  353. ;НА ВЫХОДЕ BCDE=АДРЕС СЕКТОРА
  354. REALSEC         LD BC,(AFILCLS+2)
  355.                 LD DE,(AFILCLS)
  356.                 LD A,B
  357.                 OR C
  358.                 OR D
  359.                 OR E
  360.                 JR NZ,REALSE1
  361.                 LD DE,(FATSTR)
  362.                 LD BC,(FATSTR+2)
  363.                 LD HL,SEC_FAT
  364.                 LD A,(MANYFAT)
  365. .L0             DEC A
  366.                 JP Z,BCDEHLP
  367.                 PUSH HL
  368.                 PUSH AF
  369.                 CALL BCDEHLP
  370.                 POP AF
  371.                 POP HL
  372.                 JP .L0
  373.  
  374. REALSE1         LD HL,0XFFFE
  375.                 EX DE,HL
  376.                 ADD HL,DE
  377.                 EX DE,HL
  378.                 INC HL
  379.                 ADC HL,BC                       ;НОМЕР КЛАСТЕРА-2
  380.                 LD A,(BYTSSEC)
  381.                 JR REALSE3
  382.  
  383. REALSE2         SLA E
  384.                 RL D
  385.                 RL L
  386.                 RL H
  387. REALSE3         RRCA
  388.                 JR NC,REALSE2                   ;УМНОЖИЛИ НА РАЗМЕР КЛАСТЕРА
  389.                 LD B,H
  390.                 LD C,L
  391.                 LD HL,STARTRZ
  392.                 CALL BCDEHLP                    ;ПРИБАВИЛИ СМЕЩЕНИЕ ОТ НАЧАЛА ДИСКА
  393.                 LD HL,FRSTDAT
  394.                 JP BCDEHLP                      ;ПРИБАВИЛИ СМЕЩЕНИЕ ОТ НАЧАЛА РАЗДЕЛА
  395.  
  396. ;[BCDE/512]
  397. BCDE200         LD E,D
  398.                 LD D,C
  399.                 LD C,B
  400.                 LD B,0
  401.                 LD A,2
  402.                 JR BCDE_A
  403.  
  404. ;[BCDE>>A=BCDE]
  405. BCDE_A1         SRL B
  406.                 RR C
  407.                 RR D
  408.                 RR E
  409. BCDE_A          RRCA
  410.                 JR NC,BCDE_A1
  411.                 RET
  412.  
  413. ;[(ADR)-BCDE=BCDE]
  414. BCDEHLM         LD A,(HL)
  415.                 INC HL
  416.                 SUB E
  417.                 LD E,A
  418.                 LD A,(HL)
  419.                 INC HL
  420.                 SBC A,D
  421.                 LD D,A
  422.                 LD A,(HL)
  423.                 INC HL
  424.                 SBC A,C
  425.                 LD C,A
  426.                 LD A,(HL)
  427.                 SBC A,B
  428.                 LD B,A
  429.                 RET
  430.  
  431. ;[(ADR)+BCDE=BCDE]
  432. BCDEHLP         LD A,(HL)
  433.                 INC HL
  434.                 ADD A,E
  435.                 LD E,A
  436.                 LD A,(HL)
  437.                 INC HL
  438.                 ADC A,D
  439.                 LD D,A
  440.                 LD A,(HL)
  441.                 INC HL
  442.                 ADC A,C
  443.                 LD C,A
  444.                 LD A,(HL)
  445.                 ADC A,B
  446.                 LD B,A
  447.                 RET
  448.  
  449. ;[HLDE+BC=HLDE]
  450. HLDEPBC         EX DE,HL
  451.                 ADD HL,BC
  452.                 EX DE,HL
  453.                 LD BC,0
  454.                 ADC HL,BC
  455.                 RET
  456.  
  457. ;[ЗАГРУЗКА СЕКТОРА В БУФЕР]
  458. LOADLST         LD HL,BUF_512_
  459.                 PUSH HL
  460.                 LD A,1
  461.                 CALL LOADSCS
  462.                 POP HL
  463.                 RET
  464.  
  465. ;[INCLUDES]
  466.                 include drivers/drv_zc.a80
  467.                 include drivers/drv_neogs.a80
  468.                 include drivers/drv_nemo.a80
  469.                 include drivers/drv_smuc.a80
  470.                 include drivers/drv_divide.a80
  471.                 include drivers/drv_profi.a80
  472.                 include spg2_run.a80
  473.                 include sna_run.a80
  474.