Subversion Repositories pentevo

Rev

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

  1.  
  2. ; LAST UPDATE: 10.02.2024 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.                 include fat_dir.a80
  12.  
  13.  INIT_VAR DRV_VAR
  14.  SETVAR BUF_512_,       0x200                           ; буфер сектора
  15.                 include ../../fat_vars.a80
  16.  SETVAR_ALIGN
  17.  SUBVAR (WORD + WORD + BYTE + BYTE)
  18.  SETVAR LENGHT,         WORD                            ; длина файла в байтах
  19.  SETVAR LOADSCS1,       WORD                            ; адрес вызываемого драйвера
  20.  SETVAR MAS_SLA,        BYTE                            ; маска для MASTER/SLAVE
  21.  SETVAR NUM_DEVICE,     BYTE                            ; номер устройства для запуска кода
  22.  
  23.                 ORG INITVAR
  24.        
  25. ; на входе: A - номер выбранного устройства
  26. ;        BCDE - номер кластера запускаемого файла
  27.                 DI
  28.                 LD A,(NUM_DEVICE)
  29.                 CP _SD_SDZ
  30.                 LD HL,READ_ZSD                          ; драйвер SD ZC карты          
  31.                 JR Z,SETLOADER
  32.                 CP _SD_SDG
  33.                 LD HL,READ_NEOGS                        ; драйвер SD NGS карты
  34.                 JR Z,SETLOADER
  35.                 CP _HDD_NEMO_MASTER
  36.                 LD HL,RD_HDD_NEMO                       ; драйвер HDD NEMO
  37.         IFDEF ALL_DRVS
  38.                 JR Z,SETLOADER
  39.                 CP _HDD_SMUC_MASTER
  40.                 LD HL,RD_HDD_SMUC                       ; драйвер HDD SMUC
  41.                 JR Z,SETLOADER
  42.                 CP _HDD_DIVIDE_MASTER
  43.                 LD HL,RD_HDD_DIVIDE                     ; драйвер HDD DIVIDE
  44.                 JR Z,SETLOADER
  45.                 LD HL,RD_HDD_PROFI                      ; драйвер HDD PROFI
  46.         ENDIF
  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 + _DIR_FstClusHI)
  55.                 LD (AFILCLS+2),BC
  56.                 LD DE,(FILE_SRC + _DIR_FstClusLO)
  57.                 LD (AFILCLS),DE
  58.                 LD A,(FILE_SRC + _DIR_Ext + 1)
  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_ + _DIR_Ext + 1)
  67.                 LD (0x5D45),HL                          ; адрес старта кода
  68.                 LD HL,(BUF_512_ + _DIR_Attr)
  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 ибо на FAT сектор 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 RD_NEXT_CLUSTER                    ; получить номер следующего кластера
  110.                 LD (AFILCLS),DE
  111.                 LD (AFILCLS + 2),BC
  112.                 CALL CHECK_LAST_CLUSTER                 ; проверка на окончание 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. LOAD_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,.L1
  217.                 INC BC                                  ; BCDE = номер сектора откуда грузить
  218. .L1             LD A,IYL                                ; количество секторов для загрузки
  219.                 CP IXL                                  ; размер кластера
  220.                 JP C,.L2
  221.                 LD A,IXL                                ; размер кластера
  222. .L2             ADD A,IYH                               ; смещение в кластере
  223.                 CP IXL                                  ; размер кластера
  224.                 LD A,IYL                                ; количество секторов для загрузки
  225.                 JP C,.L5
  226.                 LD A,IXL                                ; размер кластера
  227.                 SUB IYH                                 ; смещение в кластере
  228. .L5             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,.L3
  237.                 SUB IXL                                 ; размер кластера
  238. .L3             LD IYH,A                                ; смещение в кластере
  239.                 JP C,.L4
  240.                 PUSH HL                                 ; сохранили адрес загрузки
  241.                 CALL RD_NEXT_CLUSTER                    ; прочитали номер следующего кластера
  242.                 CALL CHECK_LAST_CLUSTER                 ; проверили, а может это последний кластер?
  243.                 POP HL                                  ; восстановили адрес загрузки
  244.                 RET C                                   ; если последний, выходим
  245. .L4             LD A,IYL                                ; количество секторов для загрузки
  246.                 SUB IXH                                 ; TEMP VAR
  247.                 RET Z
  248.                 LD IYL,A                                ; количество секторов для загрузки
  249.                 JP NZ,LOAD_FILE
  250.                 RET
  251.  
  252. ; проверка номера кластера
  253. CHECK_LAST_CLUSTER
  254.                 LD A,(FATType)
  255.                 AND A
  256.                 JR NZ,.L1
  257.                 LD HL,0x0FF7
  258.                 SBC HL,DE
  259.                 RET
  260.  
  261. .L1             DEC A
  262.                 JR NZ,.L2
  263.                 LD HL,0xFFF7
  264.                 SBC HL,DE
  265.                 RET
  266.  
  267. .L2             LD HL,0x0FFF
  268.                 SBC HL,BC
  269.                 RET NZ
  270.                 LD HL,0xFFF7
  271.                 SBC HL,DE
  272.                 RET
  273.  
  274. ; чтение следующего кластера
  275. RD_NEXT_CLUSTER LD A,(FATType)
  276.                 AND A
  277.                 JR Z,.L1
  278.                 DEC A
  279.                 JR Z,.L2
  280.                 EX DE,HL
  281.                 ADD HL,HL
  282.                 EX DE,HL
  283.                 LD HL,0
  284.                 ADC HL,BC
  285.                 ADD HL,BC                               ; HLDE = BCDE * 2
  286.                 LD A,E
  287.                 LD E,D
  288.                 LD D,L
  289.                 LD C,H
  290.                 LD B,0
  291.                 CALL .L3
  292.                 INC HL
  293.                 LD C,(HL)
  294.                 INC HL
  295.                 LD B,(HL)
  296.                 RET
  297.  
  298. .L2             LD BC,0
  299.                 LD A,E
  300.                 LD E,D
  301.                 LD D,C
  302. .L3             PUSH AF
  303.                 PUSH BC
  304.                 LD HL,NumSecFAT1
  305.                 CALL BCDEHLP
  306.                 CALL LOADLST
  307.                 POP BC
  308.                 POP AF
  309.                 LD E,A
  310.                 LD D,0
  311.                 ADD HL,DE
  312.                 ADD HL,DE
  313.                 LD E,(HL)
  314.                 INC HL
  315.                 LD D,(HL)
  316.                 RET
  317.  
  318. .L1             LD H,D
  319.                 LD L,E
  320.                 ADD HL,HL
  321.                 ADD HL,DE
  322.                 SRL H
  323.                 RR L
  324.                 LD A,E
  325.                 LD E,H
  326.                 LD D,0
  327.                 LD B,D
  328.                 LD C,D
  329.                 SRL E
  330.                 PUSH AF
  331.                 PUSH HL
  332.                 LD DE,(NumSecFAT1)
  333.                 LD BC,(NumSecFAT1 + 2)
  334.                 CALL LOADLST
  335.                 POP BC
  336.                 LD A,B
  337.                 AND 1
  338.                 LD B,A
  339.                 ADD HL,BC
  340.                 LD B,(HL)
  341.                 INC HL
  342.                 LD A,H
  343.                 CP HIGH (BUF_512) + 2
  344.                 JR NZ,.L4
  345.                 PUSH BC
  346.                 LD BC,0
  347.                 INC DE
  348.                 CALL LOADLST
  349.                 POP BC
  350. .L4             POP AF
  351.                 LD D,(HL)
  352.                 LD E,B
  353.                 LD BC,0
  354.                 RRA
  355.                 JR NC,.L5
  356.         REPT 4
  357.                 SRL D
  358.                 RR E
  359.         ENDM
  360. .L5             LD A,D
  361.                 AND 0x0F
  362.                 LD D,A
  363.                 RET
  364.  
  365. ; преобразование номера кластера
  366. ; вычисление реального сектора
  367. ; на входе:  BCDE = номер кластера
  368. ; на выходе: BCDE = номер сектора
  369. REALSEC         LD A,B
  370.                 OR C
  371.                 OR D
  372.                 OR E
  373.                 JR NZ,REALSE1
  374.                 LD DE,(NumSecRootDir)
  375.                 LD BC,(NumSecRootDir + 2)
  376.                 RET
  377.  
  378. REALSE1         LD HL,0xFFFE
  379.                 EX DE,HL
  380.                 ADD HL,DE
  381.                 EX DE,HL
  382.                 INC HL
  383.                 ADC HL,BC                               ; номер кластера - 2
  384.                 LD A,(SecPerClus)
  385.                 JR REALSE2
  386.  
  387. REALSE3         SLA E
  388.                 RL D
  389.                 RL L
  390.                 RL H
  391. REALSE2         RRCA
  392.                 JR NC,REALSE3                           ; умножили на размер кластера
  393.                 LD B,H
  394.                 LD C,L
  395.                 LD HL,FirstSecData
  396.                 JP BCDEHLP                              ; прибавили смещение от начала раздела
  397.  
  398. ; BCDE / 512
  399. BCDE200         LD E,D
  400.                 LD D,C
  401.                 LD C,B
  402.                 LD B,0
  403.                 LD A,2
  404.                 JR BCDE_A
  405.  
  406. ; BCDE >> A = BCDE
  407. BCDE_A1         SRL B
  408.                 RR C
  409.                 RR D
  410.                 RR E
  411. BCDE_A          RRCA
  412.                 JR NC,BCDE_A1
  413.                 RET
  414.  
  415. ; (ADR) - BCDE = BCDE
  416. BCDEHLM         LD A,(HL)
  417.                 INC HL
  418.                 SUB E
  419.                 LD E,A
  420.                 LD A,(HL)
  421.                 INC HL
  422.                 SBC A,D
  423.                 LD D,A
  424.                 LD A,(HL)
  425.                 INC HL
  426.                 SBC A,C
  427.                 LD C,A
  428.                 LD A,(HL)
  429.                 SBC A,B
  430.                 LD B,A
  431.                 RET
  432.  
  433. ; (ADR) + BCDE = BCDE
  434. BCDEHLP         LD A,(HL)
  435.                 INC HL
  436.                 ADD A,E
  437.                 LD E,A
  438.                 LD A,(HL)
  439.                 INC HL
  440.                 ADC A,D
  441.                 LD D,A
  442.                 LD A,(HL)
  443.                 INC HL
  444.                 ADC A,C
  445.                 LD C,A
  446.                 LD A,(HL)
  447.                 ADC A,B
  448.                 LD B,A
  449.                 RET
  450.  
  451. ; HLDE + BC = HLDE
  452. HLDEPBC         EX DE,HL
  453.                 ADD HL,BC
  454.                 EX DE,HL
  455.                 LD BC,0
  456.                 ADC HL,BC
  457.                 RET
  458.  
  459. ; загрузка сектора в буфер
  460. LOADLST         LD HL,BUF_512_
  461.                 PUSH HL
  462.                 LD A,1
  463.                 CALL LOADSCS
  464.                 POP HL
  465.                 RET
  466.  
  467.                 include drivers/drv_zc.a80
  468.                 include drivers/drv_neogs.a80
  469.                 include drivers/drv_nemo.a80
  470.         IFDEF ALL_DRVS
  471.                 include drivers/drv_smuc.a80
  472.                 include drivers/drv_divide.a80
  473.                 include drivers/drv_profi.a80
  474.         ENDIF
  475.                 include spg2_run.a80
  476.                 include sna_run.a80
  477.