Subversion Repositories pentevo

Rev

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

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