Subversion Repositories pentevo

Rev

Rev 1323 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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