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 | ;--------------------------------------- |