Subversion Repositories pentevo

Rev

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

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