Subversion Repositories pentevo

Rev

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