Rev 1120 | Details | Compare with Previous | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 507 | savelij | 1 | |
| 1186 | savelij | 2 | ; LAST UPDATE: 06.02.2025 savelij |
| 961 | savelij | 3 | |
| 4 | ; 07.07.2021 перед вызовом LD_FILE в реги BCDE загружается номер кластера откуда читать |
||
| 5 | |||
| 507 | savelij | 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 |
||
| 1186 | savelij | 260 | LD DE,(FATVAR.AFILCLS) |
| 261 | LD BC,(FATVAR.AFILCLS + 2) |
||
| 1120 | savelij | 262 | CALL LOAD_FILE |
| 1186 | savelij | 263 | LD (FATVAR.AFILCLS),DE |
| 264 | LD (FATVAR.AFILCLS + 2),BC |
||
| 507 | savelij | 265 | POP IX |
| 266 | RET |
||
| 267 | |||
| 268 | ;--------------------------------------- |