Subversion Repositories pentevo

Rev

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

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