Subversion Repositories pentevo

Rev

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