Subversion Repositories pentevo

Rev

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

  1.  
  2. ; LAST UPDATE: 01.11.2023 savelij
  3.  
  4. ; 07.07.2021 перед вызовом LD_FILE в реги BCDE загружается номер кластера откуда читать
  5.  
  6. ;SPG runner, version 0.2
  7. ;EVO version
  8.  
  9. ;данный код использует одну внешнюю
  10. ;функцию - LOADING
  11. ;у неё только 2 входных параметра:
  12. ;HL - адрес куда грузить
  13. ;B  - кол-во блоков размером в 2к,
  14. ;     которые нужно загрузить
  15.  
  16. ;перед первым вызовом LOADING'а, оная
  17. ;должна быть спозиционирована на начало
  18. ;файла SPG
  19.  
  20. ;затем, при каждом последующем обращении
  21. ;к ней, должен грузиться очередной кусок
  22. ;данного файла.
  23. ;  Т.е. после каждого обращения к данной
  24. ;процедуре, она должна сохранять позицию
  25. ;в нутри файла и продолжать читать даные
  26. ;из него с того  же  места,  на  котором
  27. ;остановились при прошлом обращении...
  28.  
  29. ;        ORG $
  30. PAGER   EQU 0X5000;0X4800
  31. LOBU    EQU 0XA000
  32. ;---------------------------------------
  33. RUNSPG2 LD IYH,0
  34.         LD HL,LOBU
  35.         LD B,1
  36.         CALL LOADING
  37.         LD HL,LOBU+32
  38.         LD DE,IDNT
  39.         LD B,12;см.описание заголовка SPG
  40. RAZ     LD A,(DE)
  41.         CP (HL)
  42.         RET NZ
  43.         INC HL
  44.         INC DE
  45.         DJNZ RAZ
  46. ;в кратце тут идет сканирование блоков, которые по страницам грузятся.
  47. ;блоков максимум 12 может быть
  48.  
  49.         LD A,(HL)
  50.         CP 3
  51.         RET NC;выходим, если версия выше 0.2 (0X02)
  52.         CP 2
  53.         JR C,OF4;SPG версии 0X00 или 0X01
  54. ;SPGv0.2:
  55.         LD A,15
  56.         LD (VrS+1),A
  57.         LD A,16
  58.         LD (V2A+1),A
  59.         LD (V2F+1),A
  60.         LD A,4
  61.         LD (V2B+1),A
  62.         LD A,15
  63.         LD (V2C+1),A
  64. ;SPGv0.0/0.1:
  65. OF4     ;LD HL,SPGLOG:CALL SPGLOG
  66.         LD HL,LOBU
  67.         LD DE,PAGER
  68.         LD BC,0X0800
  69.         LDIR
  70. ;-------
  71.         LD HL,MANAG0
  72.         LD DE,PAGER
  73.         LD BC,32
  74.         LDIR;кидаем манагер сраниц в заголовок SPG (ибо первые 32б там не пользуются)
  75.         XOR A
  76.         CALL PAGER;включаем 0ю страницу
  77. ;-------
  78. V2A     LD A,8
  79.         LD (C0),A;счетчик!
  80. ;тут далее переносятся нужные переменные из заголовка SPG файла, там расположение стека, стартовый адресс и т.д.
  81.         LD HL,(PAGER+64)
  82.         LD (SAR+1),HL
  83.  
  84.         LD A,(PAGER+66)
  85.         LD (SPA+1),A
  86.         LD HL,(PAGER+74)
  87.         LD A,H
  88.         CP 0X40
  89.         JR NC,NSPZ
  90.         LD HL,(SPBU)
  91. NSPZ    LD (SSPA+1),HL
  92.  
  93.         LD HL,(PAGER+68)
  94.         LD (V2E+1),HL
  95.  
  96.         LD HL,(PAGER+76)
  97.                 LD A,H
  98.                 OR L
  99.                 JR Z,V2Di
  100.         LD (V2D+1),HL
  101. V2Di    LD BC,(PAGER+78)
  102.         LD A,B
  103.         OR C
  104.         JR Z,MAA
  105.         LD A,B
  106.         OR A
  107.         JR Z,MAA
  108.         LD B,1
  109.         LD A,C
  110.         CP 0X41
  111.         JR C,MAA
  112.         LD C,0
  113. MAA     LD (LAA+1),BC
  114.  
  115.         LD IX,PAGER+128
  116. GROP    LD A,(IX+2)
  117.         CP 14
  118.         JR C,NSPL
  119.         LD A,13;ограничение на макс размер блока, дабы на поврежденных SPG не получить затирание всей памяти.
  120. NSPL    LD (SPGL+1),A
  121.  
  122.         LD A,(IX+3)
  123. VrS     AND 7
  124.         DI
  125.         CALL PAGER;на выходе в A
  126. ;                     знач. порта 0X7FFD
  127.  
  128.         LD HL,PAGER+512
  129.         LD E,(IX)
  130.         LD D,(IX+1)
  131.         LD BC,0X0600
  132.         CALL LC
  133.         EX DE,HL
  134.         LD A,H
  135.         CP 0XA0
  136.         JR C,DIPL;типо загрузили все блоки (условие: когда адрес загрузки блока ниже 0XA000 переходим к стадии запуска SPG)
  137. SPGL    LD B,1
  138.         LD A,B
  139.         OR A
  140.         CALL NZ,LOADING;иначе грузим очередной блок SPG файла в память (в заданную страницу)
  141.  
  142. V2B     LD DE,8
  143.         ADD IX,DE;собственно переходим к описателю след. блока
  144.  
  145.         LD A,(C0)
  146.         DEC A
  147.         LD (C0),A
  148.         JR NZ,GROP;идем на загрузку след блока, если счетчик не говорит обратного
  149. ;-------
  150. ;тут выставляем нужный стек, прерывания и т.д. ну и включаем нужную страницу (что в заголовке SPG указана)
  151. ;и делаем JP на заданный адрес
  152. ;экран чистить не нужно
  153. DIPL    DI
  154.         LD A,63
  155.         LD I,A
  156.         IM 1
  157.         LD IY,0X5C3A
  158.  
  159.         LD HL,PAGER
  160. V2E     LD DE,0
  161.         LD BC,32
  162.         LDIR
  163.  
  164. LAA     LD BC,0
  165.         LD A,B
  166.         OR C
  167.         JR Z,SPA
  168.         LD HL,PAGER+192
  169. V2D     LD DE,0X5B00
  170.         LDIR
  171.  
  172. SPA     LD A,0
  173. V2C     AND 7
  174.         CALL PAGER
  175.  
  176.         LD A,(PAGER+67);опять смотрим заголовок SPG файла
  177.         CP 1
  178.         JR NZ,NNx
  179.         LD A,(DRVE)
  180.         LD (0X5CF6),A
  181.  
  182. NNx     LD A,(V2C+1)
  183.         CP 7
  184.         JR Z,SSPA
  185.         LD HL,PAGER+49
  186.         LD E,5
  187. OUTZ    LD C,(HL)
  188.         INC HL
  189.         LD B,(HL)
  190.         INC HL
  191.         LD A,B
  192.         OR C
  193.         JR Z,OUTz
  194.         LD A,(HL)
  195.         OUT (C),A
  196. OUTz    INC HL
  197.         DEC E
  198.         JR NZ,OUTZ
  199.  
  200. SSPA    LD SP,0
  201. SAR     JP 0
  202. ;-------
  203. LC      LD A,(C0)
  204. V2F     CP 8
  205.         RET NZ;вызывается только когда счетчик обнулился, чтобы только один раз оную вызвать
  206.         LD A,D
  207.         CP 0XA0
  208.         JR NC,V01;самый первый блок может грузиться в адрес ниже 0Xa000
  209.  
  210.         LD (SREZ+4),DE
  211.         ADD A,6
  212.         LD D,A
  213.         PUSH DE
  214.         LD HL,(SAR+1)
  215.         LD (SR1+1),HL;стартовый адрес выставляем
  216.         LD DE,PAGER+0X20
  217.         LD (SAR+1),DE;тут резидент будет (пересылает блок, что оказался вместе с заголовком SPG, ибо грузим блоки по 2кб)
  218.         LD HL,SREZ
  219.         LD BC,16
  220.         LDIR
  221.         POP DE
  222.         RET
  223.  
  224. V01     LDIR
  225.         RET
  226.  
  227. SREZ    LD HL,PAGER+512
  228.         LD DE,0
  229.         LD BC,0X0600
  230.         LDIR
  231. SR1     JP 0
  232.  
  233. IDNT    DB "SpectrumProg"
  234. ;-------
  235. SPBU    DW 0X6000
  236. C0      NOP
  237. DRVE    DB 0;номер активного дисковода
  238.  
  239. ;---------------------------------------
  240. MANAG0  ;I:A - num of PAGE (VALID: 0-15)
  241.         PUSH BC
  242.         LD C,A
  243.         AND %11111000
  244.         LD A,C
  245.         JR Z,K128
  246.         AND 7
  247.         OR %01000000
  248. K128    OR 16
  249.         LD BC,0X7FFD
  250.         OUT (C),A
  251.         POP BC
  252.         RET
  253. ;---------------------------------------
  254.  
  255. LOADING         PUSH IX
  256.                 LD A,B
  257.                 ADD A,A
  258.                 ADD A,A
  259.                 LD IYL,A
  260.                 LD DE,(AFILCLS)
  261.                 LD BC,(AFILCLS + 2)
  262.                 CALL LOAD_FILE
  263.                 LD (AFILCLS),DE
  264.                 LD (AFILCLS + 2),BC
  265.                 POP IX
  266.                 RET
  267.  
  268. ;---------------------------------------
  269.