Rev 1026 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
801 | savelij | 1 | |
1186 | savelij | 2 | ; LAST UPDATE: 14.02.2025 savelij |
801 | savelij | 3 | |
4 | TITLE "call_trdos.a80" |
||
5 | |||
1026 | savelij | 6 | INIT_VAR 1 |
7 | SETVAR ERR_NO_TRDOS_DISK |
||
8 | SETVAR ERR_DISK_ERROR |
||
9 | SETVAR ERR_NO_DISK |
||
10 | SETVAR ERR_DISK_READ_ONLY |
||
11 | |||
12 | |||
801 | savelij | 13 | SEL_FILES_WIN LD HL,ERS_FLAGS |
14 | BIT B_VIEW_IMG,(HL) |
||
15 | JP Z,RESTART |
||
1186 | savelij | 16 | JP FILE_BROWSER |
801 | savelij | 17 | |
18 | VIEW_IMAGE DI |
||
19 | LD BC,ADR_CAT_FAT |
||
20 | LD L,(IX+_TEK_PKT_L) |
||
21 | LD H,(IX+_TEK_PKT_H) |
||
22 | ADD HL,HL |
||
23 | ADD HL,BC |
||
24 | LD C,(HL) |
||
25 | INC HL |
||
1026 | savelij | 26 | LD B,(HL) ; получили текущий выбранный номер |
801 | savelij | 27 | LD A,6 |
1026 | savelij | 28 | RST8 _COM_FAT,_POS_FILES ; установка внутреннего указателя FAT драйвера |
801 | savelij | 29 | LD HL,BUF_FILEITEM |
1026 | savelij | 30 | RST8 _COM_FAT,_READ_DIR ; получили описатель по установленному номеру |
31 | LD DE,0x0B |
||
801 | savelij | 32 | ADD HL,DE |
33 | LD A,(HL) |
||
34 | SBC HL,DE |
||
1026 | savelij | 35 | AND 0x10 |
36 | JP NZ,_RULILKA ; попытка просмотра директории |
||
801 | savelij | 37 | PUSH HL |
1026 | savelij | 38 | CALL REST_COLCURS ; стирание цветного курсора |
39 | CALL REST2X2 ; восстановление экрана под курсором мыши |
||
801 | savelij | 40 | POP HL |
1026 | savelij | 41 | CALL CPETR3 ; проверка расширения |
42 | JP Z,_RULILKA ;попытка просмотра не поддерживаемого расширения (SCL, TRD ONLY) |
||
801 | savelij | 43 | |
44 | LD (TYPE_FILE),A |
||
45 | PUSH AF |
||
1026 | savelij | 46 | RST8 _COM_FAT,_OPEN_FILE |
801 | savelij | 47 | POP AF |
48 | DEC A |
||
1026 | savelij | 49 | LD HL,ADR_CAT ; TYPE_FILE = 1 - TRD |
801 | savelij | 50 | JR Z,VIEWIMG1 |
1026 | savelij | 51 | LD HL,ADR_CAT+0x200 ; TYPE_FILE = 2 - SCL |
801 | savelij | 52 | VIEWIMG1 PUSH AF |
53 | LD A,5 |
||
1026 | savelij | 54 | RST8 _COM_FAT,_READ_FILE |
801 | savelij | 55 | POP AF |
56 | JR Z,VIEWIMG3 |
||
57 | LD DE,ADR_CAT |
||
1026 | savelij | 58 | LD HL,ADR_CAT+0x200+8 |
801 | savelij | 59 | LD A,(HL) |
60 | PUSH AF |
||
61 | INC HL |
||
1026 | savelij | 62 | VIEWIMG2 LD BC,0x0E |
801 | savelij | 63 | LDIR |
64 | INC DE |
||
65 | INC DE |
||
66 | DEC A |
||
67 | JR NZ,VIEWIMG2 |
||
1026 | savelij | 68 | LD HL,ADR_CAT+0x0A00 |
801 | savelij | 69 | SCF |
70 | SBC HL,DE |
||
71 | LD B,H |
||
72 | LD C,L |
||
73 | LD H,D |
||
74 | LD L,E |
||
75 | INC DE |
||
76 | LD (HL),0 |
||
77 | LDIR |
||
78 | LD HL,DSKINFO |
||
1026 | savelij | 79 | LD DE,ADR_CAT+0x8E1 |
801 | savelij | 80 | LD BC,DSK_END-DSKINFO |
81 | LDIR |
||
82 | POP AF |
||
1026 | savelij | 83 | LD (ADR_CAT+0x8E4),A |
801 | savelij | 84 | VIEWIMG3 LD HL,ERS_FLAGS |
1026 | savelij | 85 | RES B_RUN_FAT,(HL) ; вывод окна для TR-DOS |
86 | SET B_VIEW_IMG,(HL) ; просмотр образа TR-DOS |
||
801 | savelij | 87 | |
88 | JP VIEW_ALL |
||
89 | |||
90 | GLUBOOT LD HL,ERS_FLAGS |
||
1026 | savelij | 91 | RES B_RUN_FAT,(HL) ; запуск с дискеты |
92 | RES B_VIEW_IMG,(HL) ; работа с реальным каталогом TR-DOS |
||
93 | LD A,(DRV_SYM) |
||
94 | LD C,1 |
||
95 | CALL FTR_DOS |
||
801 | savelij | 96 | LD HL,ADR_CAT |
97 | LD DE,8 |
||
1026 | savelij | 98 | LD BC,0x0105 |
99 | CALL FTR_DOS;TO_DOS4BAS ;загрузили 9 сектор |
||
100 | LD A,(ADR_CAT+0xE7) |
||
101 | CP 0x10 ; проверка на признак TR_DOS |
||
102 | JP NZ,CMP_VIRTUAL ; ошибка, диск не TR-DOS |
||
801 | savelij | 103 | LD HL,ADR_CAT |
104 | LD DE,0 |
||
1026 | savelij | 105 | LD BC,0x0905 |
106 | CALL FTR_DOS;TO_DOS4BAS ;загрузка TR-DOS диры |
||
107 | LD A,(ADR_CAT+0x8E7) |
||
108 | CP 0x10 ; проверка на признак TR_DOS |
||
801 | savelij | 109 | JP NZ,_STUPID |
110 | VIEW_ALL LD IX,ADR_CAT |
||
1026 | savelij | 111 | LD DE,0x10 |
112 | LD A,(ADR_CAT+0x8E4) |
||
801 | savelij | 113 | AND A |
114 | JP Z,NO_BAS |
||
1026 | savelij | 115 | LD B,A ; сколько файлов надо просмотреть |
116 | LD C,0 ; обнуление счетчика найденного |
||
801 | savelij | 117 | EXX |
118 | PUSH IX |
||
119 | POP DE |
||
120 | EXX |
||
121 | FIND_BASIC LD A,(IX+8) |
||
1026 | savelij | 122 | CP "B" ; ищем только басик файлы |
801 | savelij | 123 | JR NZ,FINDBAS1 |
124 | LD A,(IX+0) |
||
1026 | savelij | 125 | DEC A ; проверка на удаленный файл |
801 | savelij | 126 | JR Z,FINDBAS1 |
127 | EXX |
||
128 | PUSH IX |
||
1026 | savelij | 129 | POP HL ; откуда переносить описатель |
130 | LD BC,0x10 |
||
801 | savelij | 131 | LDIR |
132 | EXX |
||
133 | INC C |
||
134 | FINDBAS1 ADD IX,DE |
||
135 | DJNZ FIND_BASIC |
||
1026 | savelij | 136 | LD IX,WIN_FILES ; окно для вывода басик файлов |
801 | savelij | 137 | OUT_HOB LD (IX+_NUM_PKT),0 |
138 | LD (IX+_NUM_KOL_L),C |
||
1026 | savelij | 139 | LD (IX+_NUM_KOL_H),B ; полное количество найденного |
801 | savelij | 140 | LD (IX+_TEK_PKT_L),0 |
1026 | savelij | 141 | LD (IX+_TEK_PKT_H),0 ; обнуляем позицию файлов и курсора |
801 | savelij | 142 | REOUT_HOB LD A,B |
1026 | savelij | 143 | OR C ; проверка количества найденного |
144 | JP Z,NO_BAS ; если 0, то нет басиков |
||
801 | savelij | 145 | LD HL,ERS_FLAGS |
1026 | savelij | 146 | RES 2,(IY+55) ; предположительно файлов менее высоты окна |
801 | savelij | 147 | LD A,B |
148 | AND A |
||
149 | LD A,V_FILE-2 |
||
1026 | savelij | 150 | JR NZ,FINDBAS2 ; если более 256 файлов, то полная высота окна |
801 | savelij | 151 | LD A,C |
152 | CP V_FILE-1 |
||
153 | JR C,FINDBAS2 |
||
1026 | savelij | 154 | SET 2,(IY+55) ; файлов больше высоты окна |
801 | savelij | 155 | LD A,V_FILE-2 |
156 | FINDBAS2 LD C,A |
||
157 | ADD A,2 |
||
1026 | savelij | 158 | LD (IX+_V_SIZE),A ; установка вычисленной высоты окна |
159 | LD (IX+_H_SIZE),H_FILE ; установка ширины окна |
||
801 | savelij | 160 | FINDBAS6 BIT B_RUN_FAT,(HL) |
1026 | savelij | 161 | JR Z,FINDBAS5 ; если работа с TR-DOS, то переходим на вывод окна |
801 | savelij | 162 | LD A,C |
163 | CP FH_FILE-1 |
||
164 | JR C,FINDBAS9 |
||
165 | LD C,FH_FILE-2 |
||
166 | FINDBAS9 LD A,C |
||
167 | LD (KOL4OUT),A |
||
168 | LD (IX+_V_SIZE),FH_FILE |
||
169 | LD (IX+_H_SIZE),FV_FILE |
||
1026 | savelij | 170 | RST8 _WINW |
801 | savelij | 171 | JR FINDBAS7 |
172 | |||
173 | FINDBAS5 LD A,(ERS_FLAGS) |
||
174 | AND M_RUN_FAT |
||
175 | JR NZ,FINDBAS8 |
||
176 | LD (IX+_H_SIZE),H_FILE-4 |
||
1026 | savelij | 177 | FINDBAS8 |
178 | RST8 _WINW |
||
179 | FINDBAS7 CALL OUT_TEK_DIR ; выводим кусочек директории |
||
801 | savelij | 180 | JP _RULILKA |
181 | |||
1026 | savelij | 182 | ; вывод части директории с указанной позиции |
183 | OUT_TEK_DIR LD L,(IX+_TEK_PKT_L) ; вывод диры TR-DOS диска |
||
184 | LD H,(IX+_TEK_PKT_H) ; получили номер текущей позиции |
||
185 | LD E,(IX+_NUM_PKT) ; получили позицию курсора в окне |
||
801 | savelij | 186 | XOR A |
187 | LD D,A |
||
1026 | savelij | 188 | SBC HL,DE ; вычислили позицию файла с которого будем выводить |
801 | savelij | 189 | ADD HL,HL |
190 | LD A,(ERS_FLAGS) |
||
191 | AND M_RUN_FAT |
||
1026 | savelij | 192 | JR NZ,OUT_TEK_FAT ; переход если для FAT |
193 | ; вывод для TR-DOS файлов |
||
801 | savelij | 194 | LD DE,ADR_CAT |
195 | ADD HL,HL |
||
196 | ADD HL,HL |
||
1026 | savelij | 197 | ADD HL,HL ; умножили на размер описателя |
198 | ADD HL,DE ; вычислили адрес описателя с которого будем выводить |
||
801 | savelij | 199 | LD C,(IX+_V_SIZE) |
200 | DEC C |
||
1026 | savelij | 201 | DEC C ; вычислили сколько выводить |
801 | savelij | 202 | LD D,(IX+_X_COORD) |
203 | LD E,(IX+_Y_COORD) |
||
204 | INC D |
||
205 | INC D |
||
1026 | savelij | 206 | INC E ; вычислили позицию вывода на экран |
207 | FINDBAS3 LD B,8 ; печатаем только имя |
||
801 | savelij | 208 | PUSH DE |
209 | FINDBAS4 LD A,(HL) |
||
210 | INC HL |
||
211 | CALL PRT_SYM |
||
212 | DJNZ FINDBAS4 |
||
1026 | savelij | 213 | LD DE,8 ; 8 символов напечатали, остальные 8 пропускаем |
801 | savelij | 214 | ADD HL,DE |
215 | POP DE |
||
216 | INC E |
||
217 | DEC C |
||
1026 | savelij | 218 | JR NZ,FINDBAS3 ; если не кончились переходим на печать следующего имени |
801 | savelij | 219 | RET |
220 | |||
1026 | savelij | 221 | ; вывод диры на FAT |
801 | savelij | 222 | OUT_TEK_FAT LD DE,ADR_CAT_FAT |
223 | ADD HL,DE |
||
224 | LD D,(IX+_X_COORD) |
||
225 | LD E,(IX+_Y_COORD) |
||
226 | INC D |
||
1026 | savelij | 227 | INC E ; вычислили позицию вывода на экран |
801 | savelij | 228 | LD C,0 |
229 | KOL4OUT EQU $-1 |
||
230 | OTF2 PUSH BC |
||
231 | LD C,(HL) |
||
232 | INC HL |
||
233 | LD B,(HL) |
||
234 | INC HL |
||
235 | PUSH HL |
||
236 | PUSH DE |
||
237 | LD A,6 |
||
1026 | savelij | 238 | RST8 _COM_FAT,_POS_FILES |
801 | savelij | 239 | LD HL,BUF_FILEITEM |
1026 | savelij | 240 | RST8 _COM_FAT,_READ_DIR |
801 | savelij | 241 | POP DE |
242 | PUSH DE |
||
1026 | savelij | 243 | LD BC,0x0B |
801 | savelij | 244 | ADD HL,BC |
245 | LD A,(HL) |
||
246 | SBC HL,BC |
||
1026 | savelij | 247 | AND 0x10 |
248 | LD A,0 ; символ папки |
||
801 | savelij | 249 | JR NZ,OTF4 |
1026 | savelij | 250 | LD A,1 ; символ файла |
801 | savelij | 251 | OTF4 CALL PRTSPECSYM |
252 | LD HL,OUT_NAME_FILET |
||
1026 | savelij | 253 | RST8 _COM_FAT,_GET_LONGNAME |
801 | savelij | 254 | LD (LONG_NAME),A |
255 | CALL FILENAME8_3 |
||
256 | POP DE |
||
257 | POP HL |
||
258 | POP BC |
||
259 | INC E |
||
260 | DEC C |
||
261 | JR NZ,OTF2 |
||
262 | RET |
||
263 | |||
264 | FILENAME8_3 LD A,(ERS_FLAGS) |
||
265 | AND M_RUN_FAT |
||
266 | JR NZ,OTF5 |
||
267 | LD B,8 |
||
268 | OTF1 LD A,(HL) |
||
269 | INC HL |
||
270 | CALL PRT_SYM |
||
271 | DJNZ OTF1 |
||
272 | RET |
||
273 | |||
274 | OTF5 EX DE,HL |
||
275 | LD A,H |
||
276 | ADD A,A |
||
277 | ADD A,A |
||
278 | ADD A,A |
||
279 | LD H,A |
||
280 | INC H |
||
281 | LD (OUT_NAME_FILE+1),HL |
||
282 | LD HL,OUT_NAME_FILET |
||
283 | LD BC,0 |
||
284 | LONG_NAME EQU $-2 |
||
285 | LD A,FV_FILE6 |
||
286 | CP C |
||
287 | JR Z,OTF7 |
||
288 | JR NC,OTF6 |
||
289 | EX DE,HL |
||
290 | LD HL,FV_FILE6 |
||
291 | ADD HL,DE |
||
292 | LD (HL),">" |
||
293 | INC HL |
||
294 | LD (HL),0 |
||
295 | JR OTF7 |
||
296 | |||
297 | OTF6 SUB C |
||
298 | ADD HL,BC |
||
299 | LD C,A |
||
300 | LD D,H |
||
301 | LD E,L |
||
302 | INC DE |
||
303 | LD (HL)," " |
||
304 | LDIR |
||
305 | XOR A |
||
306 | LD (DE),A |
||
307 | OTF7 LD HL,OUT_NAME_FILE |
||
1026 | savelij | 308 | RST8 _PRINT_MESSAGE |
801 | savelij | 309 | RET |
310 | |||
311 | NO_BAS LD HL,ERS_FLAGS |
||
312 | BIT B_VIEW_IMG,(HL) |
||
1186 | savelij | 313 | JP NZ,FILE_BROWSER |
801 | savelij | 314 | LD IX,NOBASIC |
1026 | savelij | 315 | RST8 _WINW |
801 | savelij | 316 | JP _RULILKA |
317 | |||
318 | RUNFILE DI |
||
1026 | savelij | 319 | CALL SHUT2AY ; бумкалка в AY |
801 | savelij | 320 | LD HL,ERS_FLAGS |
321 | BIT B_VIEW_IMG,(HL) |
||
322 | JR Z,RUNFILE2 |
||
323 | LD IX,FAT_FILES |
||
324 | LD HL,ERS_FLAGS |
||
325 | SET B_VIEW_IMG,(HL) |
||
1026 | savelij | 326 | JP RUN_HOB ; переход на загрузку и запуск из SCL образа |
801 | savelij | 327 | |
328 | RUNFILE2 LD L,(IX+_TEK_PKT_L) |
||
1026 | savelij | 329 | LD H,(IX+_TEK_PKT_H) ; номер выбранного файла |
801 | savelij | 330 | LD DE,ADR_CAT |
331 | ADD HL,HL |
||
332 | ADD HL,HL |
||
333 | ADD HL,HL |
||
334 | ADD HL,HL |
||
1026 | savelij | 335 | ADD HL,DE ; откуда имя файла взять |
801 | savelij | 336 | RUNFILE1 LD DE,RUNNAM |
337 | LD BC,8 |
||
338 | LDIR |
||
1026 | savelij | 339 | LD HL,0x3E08+0xA7 |
340 | LD DE,0xFFFF |
||
341 | LD C,0xA8 ; 21 символ UDG |
||
801 | savelij | 342 | LDDR |
343 | LD HL,RUN_BASIC |
||
1026 | savelij | 344 | LD DE,0x5D3B |
801 | savelij | 345 | LD BC,ERUN_BASIC-RUN_BASIC |
1026 | savelij | 346 | LDIR ; перенос бейсик проги для запуска |
347 | CALL MEMSET ; выставили режим компа |
||
801 | savelij | 348 | CALL FOR_RUN |
349 | EI |
||
1026 | savelij | 350 | LD BC,0xFF56 |
351 | CALL 0x1EB7 |
||
352 | LD HL,0x1B7D ; запуск перенесенной бейсик проги |
||
801 | savelij | 353 | PUSH HL |
1026 | savelij | 354 | LD HL,0x6000 |
355 | LD DE,0x6001 |
||
356 | LD BC,0xFF00-0x6000 |
||
801 | savelij | 357 | LD (HL),0 |
1026 | savelij | 358 | JP 0x33C3 |
801 | savelij | 359 | |
360 | FOR_RUN SET 3,(IY+1) |
||
361 | LD IY,ERR_NR |
||
1026 | savelij | 362 | LD (IY),0xFF |
801 | savelij | 363 | SET 7,(IY+1) |
364 | RES 4,(IY+1) |
||
1026 | savelij | 365 | LD HL,0x2758 |
801 | savelij | 366 | EXX |
1026 | savelij | 367 | LD A,0xC9 |
801 | savelij | 368 | LD (TRD_5CC2),A |
369 | LD HL,0 |
||
370 | LD (NEWPPC),HL |
||
371 | XOR A |
||
372 | LD (NSPPS),A |
||
373 | RET |
||
374 | |||
1026 | savelij | 375 | ; круговой перебор имени дисковода 1-4 (A-D) |
376 | NEXTDRIVE LD A,(TXT_DRIVE) ; взяли букву текущего дисковода |
||
377 | INC A ; +1, то есть выбрали следующий по порядку |
||
378 | SUB 0x10 ; превратили в номер |
||
379 | CP "5" ; если превысили 4 |
||
801 | savelij | 380 | JR C,SELDRV1 |
1026 | savelij | 381 | SUB 4 ; то изменили на номер первый |
801 | savelij | 382 | JR SELDRV1 |
383 | |||
384 | NEXTVIRT LD HL,MAINLOP |
||
385 | PUSH HL |
||
386 | LD A,(ERS_FLAGS) |
||
387 | AND M_CLOCK_ON |
||
388 | RET Z |
||
1186 | savelij | 389 | LD H,CMOS.VIRT_REAL_DRIVE |
801 | savelij | 390 | CALL READCMOS |
1026 | savelij | 391 | AND 3 ; A = сдвинутый номер виртуального дисковода |
801 | savelij | 392 | INC A |
393 | CP 4 |
||
394 | JR C,NEXTVIRT1 |
||
395 | XOR A |
||
1026 | savelij | 396 | NEXTVIRT1 LD D,A ; сохранили виртуальный дисковод |
801 | savelij | 397 | LD A,L |
1026 | savelij | 398 | AND %11111100 ; A = сбросили старый номер виртуального дисковода |
399 | OR D ; добавили новый номер виртуального дисковода |
||
801 | savelij | 400 | LD L,A |
1026 | savelij | 401 | CALL WRITECMOS ; сохранили номер реального и виртуального дисковода |
402 | ; RST8 _MOUNTER,_MOUNT_RAMDISK ; монтирование рамдиска |
||
801 | savelij | 403 | CALL REST2X2 |
404 | CALL PRT_VIRTDRV |
||
405 | LD A,(ERS_FLAGS) |
||
406 | AND M_MOUSE_ON |
||
407 | RET Z |
||
408 | JP DRAW_MOUSE |
||
409 | |||
1026 | savelij | 410 | ; изменение номера дисковода и сохранение в кмосе если таковой обнаружен |
411 | SELDRV LD A,(LAST_K) ; взяли номер дисковода |
||
412 | SELDRV1 SUB "1" ; обратили в бинарный вид для записи в переменную |
||
413 | LD HL,MAINLOP ; адрес куда вернуться после записи |
||
801 | savelij | 414 | PUSH HL |
1026 | savelij | 415 | SELDRVPP LD (DRV_SYM),A ; сохранили новый номер реального дисковода |
801 | savelij | 416 | RLCA |
417 | RLCA |
||
1026 | savelij | 418 | LD D,A ; сдвинутый номер виртуального дисковода |
801 | savelij | 419 | LD A,(ERS_FLAGS) |
420 | AND M_CLOCK_ON |
||
1026 | savelij | 421 | RET Z ; если кмос не найден, выходим |
1186 | savelij | 422 | LD H,CMOS.VIRT_REAL_DRIVE |
801 | savelij | 423 | CALL READCMOS |
1026 | savelij | 424 | AND %11110011 ; сбросили старый номер реального дисковода |
425 | OR D ; добавили новый номер реального дисковода |
||
801 | savelij | 426 | LD L,A |
1026 | savelij | 427 | CALL WRITECMOS ; сохраняем в кмосе |
428 | CALL SET_DRIVE ; установка изменения |
||
429 | CALL REST2X2 ; восстановили под курсором мыши |
||
430 | CALL PRT_DRV_SYM ; перепечатали строку о дисководах |
||
801 | savelij | 431 | LD A,(ERS_FLAGS) |
432 | AND M_MOUSE_ON |
||
433 | RET Z |
||
1026 | savelij | 434 | JP DRAW_MOUSE ; нарисовали мышь на старом месте |
801 | savelij | 435 | |
1026 | savelij | 436 | ; FIX mouse key if no mouse |
801 | savelij | 437 | ONERNCLS LD A,(ERS_FLAGS) |
438 | AND M_MOUSE_ON |
||
439 | JR Z,ONERNC1 |
||
1026 | savelij | 440 | LD A,0xFA |
441 | IN A,(0xDF) |
||
801 | savelij | 442 | RRA |
443 | JP NC,_STUPID |
||
444 | ONERNC1 POP AF |
||
445 | EX (SP),HL |
||
446 | RET |
||
447 | |||
1026 | savelij | 448 | SET_DOS_PAGE PUSH HL |
449 | DOSIX PUSH IX |
||
450 | JP TO_DOS |
||
451 | |||
452 | ; проверка наличия маркера рамдиска, при отсуствии создание диска на 640КБ |
||
453 | DISK_NONE |
||
454 | PEC_ON M_SHADOW_BF |
||
455 | LD A,RAM_RAMDISK |
||
456 | LD BC,WIN_P1 |
||
457 | OUT (C),A |
||
458 | LD HL,0x7FFF |
||
459 | LD A,(HL) |
||
460 | DEC H |
||
461 | CP "R" |
||
462 | JR NZ,DISK_NONE1 |
||
463 | LD A,(HL) |
||
464 | CP "D" |
||
465 | DISK_NONE1 EX AF,AF' |
||
466 | LD A,ZXSTD_CPU1 |
||
467 | OUT (C),A |
||
468 | PEC_OFF M_SHADOW_BF |
||
469 | EX AF,AF' |
||
470 | LD HL,ERS_FLAGS |
||
471 | RES B_LOAD_IMG,(HL) |
||
472 | JP NZ,CREATE_TRDRAM ; маркер не обнаружен, создать |
||
473 | RET |
||
474 | |||
475 | DIV10 LD D,0x30-1 |
||
476 | INC D |
||
477 | SUB 0x0A |
||
478 | JR NC,$-3 |
||
479 | ADD A,0x0A+0x30 |
||
480 | RET |
||
481 | |||
482 | _RETRY LD A,"R" |
||
483 | JR $+4 |
||
484 | |||
485 | _IGNORE LD A,"I" |
||
486 | LD HL,0x3F7E |
||
487 | EX (SP),HL |
||
488 | DI |
||
489 | JP TO_DOS |
||
490 | |||
491 | ; вызов вместо 0x3D13 |
||
492 | FTR_DOS ;jp 0x3D13 |
||
493 | PUSH HL |
||
494 | LD HL,(ERR_SP) |
||
495 | LD (DOSVARS.TMP_ERR_SP),HL |
||
496 | LD HL,DSK_ERR_CAPTURE |
||
497 | LD (TRD_5CC3),HL |
||
498 | LD HL,DERROR |
||
499 | EX (SP),HL |
||
500 | LD (ERR_SP),SP |
||
501 | EX AF,AF' |
||
502 | LD A,0xC3 |
||
503 | LD (TRD_5CC2),A |
||
504 | XOR A |
||
505 | LD (TRD_5D0F),A |
||
506 | LD (TRD_5D10),A |
||
507 | LD (DOSVARS.DSKERR),A |
||
508 | LD (DOSVARS.COPY_1F),A |
||
509 | DEC A |
||
510 | LD (ERR_NR),A |
||
511 | LD A,(TRD_5D19) |
||
512 | LD (TRD_5CF6),A |
||
513 | EX AF,AF' |
||
514 | JP 0x3D13 |
||
515 | |||
516 | ; возврат из 0x3D13 и проверка на ошибку |
||
517 | DERROR DI |
||
518 | LD HL,(DOSVARS.TMP_ERR_SP) |
||
519 | LD (ERR_SP),HL |
||
520 | LD A,(TRD_5D16) |
||
521 | AND 3 |
||
522 | LD (TRD_5D19),A |
||
523 | LD HL,TRD_5CC2 |
||
524 | LD (HL),0xC9 |
||
525 | LD HL,(DOSVARS.COPY_1F) |
||
526 | LD A,(TRD_5D0F) |
||
527 | LD H,A |
||
528 | LD A,L |
||
529 | AND A |
||
530 | JR NZ,.L1 |
||
531 | LD A,H |
||
532 | AND A |
||
533 | RET Z ; ошибок нет |
||
534 | .L1 LD A,H |
||
535 | LD C,ERR_NO_DISK |
||
536 | CP 6 ; нет диска |
||
537 | JR Z,.L2 |
||
538 | LD C,ERR_DISK_READ_ONLY |
||
539 | LD A,0x40 |
||
540 | AND L |
||
541 | JR NZ,.L2 |
||
542 | LD A,(TRD_5CF4) |
||
543 | CP 8 |
||
544 | JR NZ,.L2 |
||
545 | LD C,ERR_DISK_ERROR ; ошибка диска |
||
546 | .L2 LD A,C |
||
547 | LD (DOSVARS.DSKERR),A |
||
548 | CP ERR_DISK_ERROR |
||
549 | PUSH AF |
||
550 | CALL Z,STOPDSK |
||
551 | POP AF |
||
552 | LD IX,(DOSVARS.CURR_IX) |
||
553 | LD A,H |
||
554 | CP 6 |
||
555 | RET NZ |
||
556 | JP _STUPID ; диска нет |
||
557 | |||
558 | ; остановка дискеты |
||
559 | STOPDSK LD A,(TRD_5D16) |
||
560 | PUSH AF |
||
561 | XOR 3 |
||
562 | CALL .L1 |
||
563 | POP AF |
||
564 | .L1 LD HL,0x02B9 |
||
565 | PUSH HL |
||
566 | JP 0x3D2F |
||
567 | |||
568 | ; перехват адреса 0x5CC2 |
||
569 | DSK_ERR_CAPTURE |
||
570 | DI |
||
571 | POP DE |
||
572 | LD HL,0x0D6B |
||
573 | AND A |
||
574 | SBC HL,DE |
||
575 | JR NZ,.L1 |
||
576 | LD A,B |
||
577 | LD (DOSVARS.COPY_1F),A |
||
578 | RET |
||
579 | |||
580 | .L1 LD HL,0x10 |
||
581 | AND A |
||
582 | SBC HL,DE |
||
583 | RET Z |
||
584 | LD HL,0x1A1B |
||
585 | AND A |
||
586 | SBC HL,DE |
||
587 | RET Z |
||
588 | AND A |
||
589 | LD HL,0x028E |
||
590 | SBC HL,DE |
||
591 | SCF |
||
592 | RET Z |
||
593 | LD HL,0x031E |
||
594 | AND A |
||
595 | SBC HL,DE |
||
596 | SCF |
||
597 | RET Z |
||
598 | LD HL,0x1F54 |
||
599 | AND A |
||
600 | SBC HL,DE |
||
601 | SCF |
||
602 | RET Z |
||
603 | LD HL,0x0333 |
||
604 | AND A |
||
605 | SBC HL,DE |
||
606 | JR Z,RAI |
||
607 | PUSH DE |
||
608 | LD HL,(TRD_5D02) |
||
609 | LD DE,(TRD_5D04) |
||
610 | RET |
||
611 | |||
612 | IF 0 |
||
613 | ; перехват дисковой ошибки для обработки |
||
801 | savelij | 614 | ONERR EX (SP),HL |
615 | PUSH AF |
||
616 | |||
617 | PUSH DE |
||
618 | PUSH HL |
||
1026 | savelij | 619 | LD DE,0x1303 |
801 | savelij | 620 | AND A |
621 | SBC HL,DE |
||
622 | POP HL |
||
623 | POP DE |
||
624 | JR Z,ONERR1 |
||
625 | PUSH DE |
||
626 | PUSH HL |
||
1026 | savelij | 627 | LD DE,0x0D6B |
801 | savelij | 628 | AND A |
629 | SBC HL,DE |
||
630 | POP HL |
||
631 | POP DE |
||
632 | JR NZ,ONERNCLS |
||
633 | ; LD A,H |
||
1026 | savelij | 634 | ; CP HIGH (0x0D6B) |
801 | savelij | 635 | ; JR NZ,ONERNCLS |
636 | ; LD A,L |
||
1026 | savelij | 637 | ; CP LOW (0x0D6B) |
801 | savelij | 638 | ; JR NZ,ONERNCLS |
639 | |||
640 | ONERR1 POP HL |
||
641 | POP HL |
||
642 | POP HL |
||
643 | POP HL |
||
644 | POP HL |
||
1026 | savelij | 645 | ENDIF |
646 | RAI |
||
801 | savelij | 647 | EI |
648 | CALL GLUDIN |
||
649 | LD HL,TRD_5CF4 |
||
1026 | savelij | 650 | LD A,(HL) ; взяли номер сектора |
801 | savelij | 651 | INC A |
652 | CALL DIV10 |
||
653 | LD (NUM_SEC_TXT+1),A |
||
654 | LD A,D |
||
655 | LD (NUM_SEC_TXT),A |
||
656 | INC HL |
||
1026 | savelij | 657 | LD A,(HL) ; взяли номер трека |
801 | savelij | 658 | SRL A |
659 | LD E,A |
||
660 | ADC A,"0" |
||
661 | SUB E |
||
1026 | savelij | 662 | LD (SIDE_DISK),A ; сторона диска |
801 | savelij | 663 | LD A,E |
664 | CALL DIV10 |
||
665 | LD (NUM_TRK_TXT+1),A |
||
666 | LD A,D |
||
667 | LD (NUM_TRK_TXT),A |
||
1026 | savelij | 668 | LD IX,DSK_ERR ; окно выводим полностью |
669 | RST8 _WINW |
||
801 | savelij | 670 | JP _RULILKA |
671 | |||
1026 | savelij | 672 | RESET_VG LD C,0xFF |
801 | savelij | 673 | XOR A |
1026 | savelij | 674 | LD IX,0x3FF0 ; OUT (C),A |
801 | savelij | 675 | CALL DOSIX |
676 | LD A,(DRV_SYM) |
||
1026 | savelij | 677 | OR 0x3C |
678 | LD HL,0x2A53 |
||
679 | CALL SET_DOS_PAGE ; установка DOS страницы |
||
680 | LD A,0x68 ; шаг назад |
||
681 | LD C,0x1F |
||
682 | JP DOSIX |
||
683 | ; LD HL,DSTUPID |
||
684 | ; LD (ERR_SP),HL |
||
685 | ; LD A,0xC3 |
||
686 | ; LD (TRD_5CC2),A |
||
687 | ; LD HL,ONERR |
||
688 | ; LD (TRD_5CC3),HL |
||
689 | ; RET |