Subversion Repositories pentevo

Rev

Rev 507 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

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