Subversion Repositories pentevo

Rev

Rev 1067 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
801 savelij 1
 
1067 savelij 2
; LAST UPDATE: 24.02.2023 savelij
801 savelij 3
 
999 savelij 4
; загрузка выбранного шрифта
801 savelij 5
LOAD_FONT       LD HL,FONTS
6
                LD DE,CMP4FONTS
7
                JR FATBOOT4
8
 
999 savelij 9
; загрузка tap файла
801 savelij 10
EMULTAPLOAD     LD HL,TAPES
11
                LD DE,CMP4TAPES
12
                JR FATBOOT4
13
 
999 savelij 14
; загрузка полного rom файла для обновления 512KB
801 savelij 15
LOAD4FLASH_FULL LD HL,ROMS
16
                LD DE,CMP4ROMS
17
                LD A,8
18
                LD (CMP_ROMSIZE),A
19
                JR FATBOOT4
20
 
999 savelij 21
; загрузка USER ROM файла для обновления 64KB
801 savelij 22
LOAD4FLASH_CUST LD HL,ROMS
23
                LD DE,CMP4ROMS
24
                LD A,1
25
                LD (CMP_ROMSIZE),A
26
                JR FATBOOT4
27
 
999 savelij 28
; загрузка образа на рамдиск
801 savelij 29
COPYIMAGE       LD HL,IMAGES
30
                LD DE,CMP4IMAGE
31
                JR FATBOOT4
32
 
999 savelij 33
; загрузка HOBETA файла для запуска
801 savelij 34
FATBOOT         LD HL,HOBETA
35
                LD DE,CMP4HOBETA
36
FATBOOT4        LD (GDE_EXT_FILES),HL
37
                LD (CMP_FOUNDED),DE
38
SELECT_DEVICE   DI
39
                LD HL,ERS_FLAGS
999 savelij 40
                SET B_RUN_FAT,(HL)              ; работать будем с FAT
41
        RST8 _COM_DEV,_KOL_VOL
801 savelij 42
                LD A,E
43
                AND A
44
                JP Z,_STUPID
1026 savelij 45
                LD HL,ADR_CAT-0x100             ; адрес куда положить таблицу найденных разделов
999 savelij 46
        RST8 _COM_DEV,_GET_FNDVOLUME            ; получение таблицы найденных разделов
47
                LD B,E                          ; счетчик количества найденных разделов
48
                LD IX,SEL_FAT_DEV               ; адрес описателя окна выбора разделов
49
                LD (IX+_NUM_PKT),D              ; номер пункта в окне
50
                LD (IX+_TEK_PKT_L),D            ; номер текущего пункта
51
                LD (IX+_NUM_KOL_L),E            ; количество пунктов в окне
801 savelij 52
                INC E
53
                INC E
999 savelij 54
                LD (IX+_V_SIZE),E               ; установили высоту выводимого окна
55
                LD DE,6                         ; шаг по таблице найденных разделов -2
801 savelij 56
                EXX
57
                LD HL,TXT_FAT_SEL
999 savelij 58
                LD DE,SEL_FAT_DRV               ; адрес где будет формироваться текст окна выбора разделов
801 savelij 59
                LD BC,ETXT_FAT_SEL-TXT_FAT_SEL
60
                LDIR
61
                EX DE,HL
62
                EXX
63
FATBOOT1        EXX
1026 savelij 64
                LD (HL),0x0D
801 savelij 65
                INC HL
66
                LD (HL),3
67
                INC HL
68
                EXX
999 savelij 69
                LD A,(HL)                       ; взяли номер раздела
801 savelij 70
                INC HL
999 savelij 71
                LD C,(HL)                       ; MASTER или SLAVE
801 savelij 72
                INC HL
73
                ADD A,C
74
                ADD A,C
999 savelij 75
                SUB 4                           ; -4, ибо дисководы не учитываются
801 savelij 76
                EXX
77
                EX DE,HL
999 savelij 78
                LD HL,TXT4MENU_DEVICE           ; адрес таблицы текста о разделах
801 savelij 79
                LD C,A
831 savelij 80
                ADD A,A
81
                ADD A,A
82
                ADD A,C
83
                ADD A,A
999 savelij 84
                ADD A,A                         ; умножено на 20
831 savelij 85
                LD C,A
801 savelij 86
                LD B,0
999 savelij 87
                ADD HL,BC                       ; получили адрес откуда текст взять
88
                LD BC,20                        ; длина переноса 20 байт
801 savelij 89
                EXX
90
                LD A,L
91
                EXX
92
                RRCA
93
                RRCA
94
                RRCA
1026 savelij 95
                AND 0x1F
999 savelij 96
                ADD A,"E"                       ; буква найденного устройства
801 savelij 97
                LD (DE),A
98
                INC DE
999 savelij 99
                LDIR                            ; перенос текста из выбранной таблицы
801 savelij 100
                EXX
999 savelij 101
                LD A,(HL)                       ; тип раздела
801 savelij 102
                EXX
103
                LD C,A
104
                ADD A,A
105
                ADD A,A
999 savelij 106
                ADD A,C                         ; умноженно на 5
107
                LD HL,TXT4MENU_TYPE             ; адрес таблицы текста типов разделов
801 savelij 108
                LD C,A
109
                ADD HL,BC
110
                LD C,5
999 savelij 111
                LDIR                            ; перенос текста из выбранной таблицы
801 savelij 112
                EX DE,HL
113
                EXX
114
                ADD HL,DE
115
                DJNZ FATBOOT1
116
                EXX
117
                LD (HL),0
118
                INC HL
119
                LD B,(IX+_V_SIZE)
120
                DEC B
121
                DEC B
122
                LD C,B
123
                LD A,"E"
124
                LD (IX+_ADR_HOTKEY_L),L
999 savelij 125
                LD (IX+_ADR_HOTKEY_H),H         ; адрес таблицы горячих клавиш выбора FAT устройства
801 savelij 126
                LD (HL),B
127
                INC HL
999 savelij 128
FATBOOT3        LD (HL),A                       ; формирование таблицы горячих клавиш
801 savelij 129
                INC HL
130
                INC A
131
                DJNZ FATBOOT3
999 savelij 132
                LD (SELFATDEVEXE),HL            ; положили адрес таблицы адресов вызова выбранного
801 savelij 133
                LD B,C
999 savelij 134
FATBOOT2        LD (HL),LOW (SEL_FAT)           ; формирование таблицы адресов вызывов
801 savelij 135
                INC HL
136
                LD (HL),HIGH (SEL_FAT)
137
                INC HL
138
                DJNZ FATBOOT2
139
                LD A,C
140
                EXX
141
                DEC A
142
                JR Z,SEL_FAT
999 savelij 143
        RST8 _WINW
144
                JP _RULILKA                     ; возвращаемся к общему управлению
801 savelij 145
 
146
FILES_BROWSE    LD HL,SUPPORT_EXT
147
                LD DE,CMP4TAPES
148
                DI
149
                LD (GDE_EXT_FILES),HL
150
                LD (CMP_FOUNDED),DE
151
                LD HL,ERS_FLAGS
152
                SET B_RUN_FAT,(HL)
153
                JR SEL_FILES
154
 
999 savelij 155
; переключение на устройства и вывод найденного на нем
801 savelij 156
SEL_FAT         DI
999 savelij 157
                LD A,(IX+_TEK_PKT_L)            ; взяли номер выбранного устройства
158
        RST8 _COM_DEV,_SET_VOL                  ; выбрали устройство по номеру
159
SEL_FILES
160
        RST8 _COM_DEV,_KOL_VOL
801 savelij 161
                LD A,E
162
                AND A
163
                JP Z,_STUPID
164
                CALL SEARCH_FILE
1026 savelij 165
; если файл найден только один
166
;               LD HL,1
167
;               AND A
168
;               SBC HL,BC                       ; найденно что-то одно?
169
;               JR NZ,SEL_FAT1                  ; если найдено >1, то продолжаем
170
;               PUSH BC                         ; сохранили количество найденного
171
;               LD BC,(ADR_CAT_FAT)             ; взяли номер единственного найденного
172
;               LD A,6
173
;       RST8 _COM_FAT,_POS_FILES
174
;               LD HL,BUF_FILEITEM
175
;       RST8 _COM_FAT,_READ_DIR                 ; получили описатель
176
;               POP BC                          ; вернули количество найденного
177
;               LD DE,0x0B
178
;               ADD HL,DE
179
;               LD A,(HL)                       ; взяли флаговый байт того что нашли
180
;               AND 0x10
181
;               LD HL,0                         ; если запускаем, то номер 0 из найденного
182
;               JR Z,RUN_HOB1                   ; если это файл сразу запускаем
183
;SEL_FAT1
184
                LD IX,FAT_FILES                 ; если дира, то выводим в окно
801 savelij 185
                JP OUT_HOB
186
 
999 savelij 187
; запуск выбранного кодового файла из HOBETA файла или вход/выход в диры
801 savelij 188
RUN_HOB         DI
999 savelij 189
                CALL SHUT2AY                    ; бумкалка в AY
801 savelij 190
                LD L,(IX+_TEK_PKT_L)
999 savelij 191
                LD H,(IX+_TEK_PKT_H)            ; HL = номер выбранного файла
801 savelij 192
RUN_HOB1        LD DE,ADR_CAT_FAT
193
                ADD HL,HL
999 savelij 194
                ADD HL,DE                       ; откуда номер файла взять
801 savelij 195
                LD C,(HL)
196
                INC HL
999 savelij 197
                LD B,(HL)                       ; получили текущий выбранный номер
1026 savelij 198
                LD (NUMFAT_SELECT),BC
801 savelij 199
                LD A,6
999 savelij 200
        RST8 _COM_FAT,_POS_FILES                ; установка внутреннего указателя FAT драйвера
801 savelij 201
                LD HL,BUF_FILEITEM
999 savelij 202
        RST8 _COM_FAT,_READ_DIR                 ; получили описатель по установленному номеру
1026 savelij 203
                LD DE,0x0B                      ; нужен байт по смещению
999 savelij 204
                ADD HL,DE                       ; для определения файл или директория
205
                LD A,(HL)                       ; из этого байта нужен один бит
801 savelij 206
                SBC HL,DE
1026 savelij 207
                AND 0x10                        ; проверили
999 savelij 208
                JP Z,GO_RUN_HOB                 ; если это файл, то запускаем кодовый блок
209
        RST8 _COM_FAT,_ENTER_DIR                ; входим в выбранную директорию
210
                PUSH HL                         ; сохранили адрес где описатель выбранного файла лежит
801 savelij 211
                LD HL,BUF_RDPATH
999 savelij 212
        RST8 _COM_FAT,_GET_PATH                 ; получить путь к файлу после входа в директорию
213
                LD A,(HL)                       ; взяли букву устройства текущего пути
214
                SUB "E"                         ; преобразовали в номер устройства
801 savelij 215
                LD D,A
216
                LD E,0
217
                LD HL,BUF_LEVDIR
218
                SRL D
219
                RR E
220
                SRL D
221
                RR E
222
                ADD HL,DE
999 savelij 223
                EX (SP),HL                      ; сохранили адрес описателя FAT устройства, восстановили адрес описателя файла
224
                LD A,(HL)                       ; будем проверять первый символ имени предыдущего описателя
225
                POP HL                          ; восстановили адрес описателя FAT устройства 
226
                CP "."                          ; если первый символ имени не ".", то сохраняем текущие значения окошка и  
227
                JR NZ,SNYT0                     ; входим в диру
228
                LD C,(HL)                       ; при выходе из директории восстанавливаем позиции в окне
801 savelij 229
                INC HL
230
                LD B,(HL)
231
                INC HL
232
                PUSH HL
233
                ADD HL,BC
234
                DEC HL
235
                LD A,(HL)
236
                DEC HL
237
                LD C,(HL)
238
                DEC HL
239
                LD B,(HL)
240
                POP DE
241
                AND A
242
                SBC HL,DE
243
                EX DE,HL
244
                DEC HL
245
                LD (HL),D
246
                DEC HL
247
                LD (HL),E
248
                LD (IX+_TEK_PKT_L),C
249
                LD (IX+_TEK_PKT_H),B
250
                LD (IX+_NUM_PKT),A
999 savelij 251
                CALL SEARCH_FILE                ; поиск по маске в директории в которую вошли
801 savelij 252
                LD (IX+_NUM_KOL_L),C
999 savelij 253
                LD (IX+_NUM_KOL_H),B            ; установили количество найденных по маске файлов в этой директории
254
                JP REOUT_HOB                    ; вывели новое содержимое окна
801 savelij 255
 
999 savelij 256
; при входе в диру сохранение текущих данных окна
801 savelij 257
SNYT0           LD C,(HL)
258
                INC HL
999 savelij 259
                LD B,(HL)                       ; BC = смещение до первой свободной ячейки
801 savelij 260
                INC HL
999 savelij 261
                PUSH HL                         ; HL = адрес начала самих ячеек
262
                ADD HL,BC                       ; HL = адрес первой свободной ячейки
801 savelij 263
                LD D,(IX+_TEK_PKT_H)
264
                LD E,(IX+_TEK_PKT_L)
265
                LD A,(IX+_NUM_PKT)
266
                LD (HL),D
267
                INC HL
268
                LD (HL),E
269
                INC HL
270
                LD (HL),A
271
                INC HL
999 savelij 272
                POP DE                          ; DE = адрес начала самих ячеек
801 savelij 273
                AND A
274
                SBC HL,DE
275
                EX DE,HL
276
                DEC HL
277
                LD (HL),D
278
                DEC HL
279
                LD (HL),E
280
                LD C,(IX+_NUM_KOL_L)
281
                LD B,(IX+_NUM_KOL_H)
282
                CALL SEARCH_FILE
283
                JP OUT_HOB
284
 
999 savelij 285
; BCDE = (ADR) - BCDE
821 savelij 286
BCDEHLM         LD A,(HL)
287
                INC HL
288
                SUB E
289
                LD E,A
290
                LD A,(HL)
291
                INC HL
292
                SBC A,D
293
                LD D,A
294
                LD A,(HL)
295
                INC HL
296
                SBC A,C
297
                LD C,A
298
                LD A,(HL)
299
                SBC A,B
300
                LD B,A
301
                RET
302
 
1026 savelij 303
SELMOUNT        LD HL,BUF_FILEITEM+0x1C
304
                LD BC,0x0A
821 savelij 305
                LD DE,0
306
                CALL BCDEHLM
1067 savelij 307
                JP NZ,LOADIMAGE                 ; образ меньше или больше стандартного, загрузка в рамдиск
308
; размер TRD образа стандартного размера
999 savelij 309
                LD HL,ERS_FLAGS
310
                BIT B_VIEW_IMG,(HL)
311
                LD IX,RUN_IMAGE                 ; окно выбора загрузки/монтирования
312
        RST8 _WINW
801 savelij 313
                JP _RULILKA
314
 
999 savelij 315
RUNIMG_A        XOR A
316
                JR RUNIMG_ALL
317
 
318
RUNIMG_B        LD A,1
319
                JR RUNIMG_ALL
320
 
321
RUNIMG_C        LD A,2
322
                JR RUNIMG_ALL
323
 
324
RUNIMG_D        LD A,3
325
; запуск Basic файла с принудительным переключением виртуального и реального дисковода на указанный номер
326
RUNIMG_ALL      PUSH AF
327
        RST8 _MOUNTER,_LOADIMAGE
1026 savelij 328
                POP AF
329
                PUSH AF
999 savelij 330
        RST8 _MOUNTER,_SET_VIRTREAL
331
                POP AF
1026 savelij 332
                CALL SETUP_DRIVE
999 savelij 333
                LD HL,ERS_FLAGS
334
                BIT B_VIEW_IMG,(HL)
335
                JP Z,RESTART
336
                RES B_VIEW_IMG,(HL)
337
                JP RUNMOUNT
338
 
339
; только загрузка образа
340
LOADIMAGE
341
        RST8 _MOUNTER,_LOADIMAGE
342
                LD HL,ERS_FLAGS
343
                BIT B_VIEW_IMG,(HL)
344
                JP Z,RESTART
345
                RES B_VIEW_IMG,(HL)
346
                JP START_IMG
347
 
801 savelij 348
MOUNT_A         XOR A
999 savelij 349
; запуск Basic файла с принудительным переключением виртуального и реального дисковода на указанный номер
817 savelij 350
MOUNT_ALL       PUSH AF
999 savelij 351
        RST8 _MOUNTER,_OPEN_MOUNT               ; !!!
1026 savelij 352
                POP AF
353
                PUSH AF
999 savelij 354
        RST8 _MOUNTER,_SET_VIRTREAL
817 savelij 355
                POP AF
1026 savelij 356
                CALL SETUP_DRIVE
801 savelij 357
                LD HL,ERS_FLAGS
358
                BIT B_VIEW_IMG,(HL)
359
                JP Z,RESTART
360
                RES B_VIEW_IMG,(HL)
361
                JP RUNMOUNT
362
 
363
MOUNT_B         LD A,1
364
                JR MOUNT_ALL
365
 
366
MOUNT_C         LD A,2
367
                JR MOUNT_ALL
368
 
369
MOUNT_D         LD A,3
370
                JR MOUNT_ALL
371
 
1026 savelij 372
SEL4COPY_A      XOR A
373
                JR SEL4COPY
374
 
375
SEL4COPY_B      LD A,1
376
                JR SEL4COPY
377
 
378
SEL4COPY_C      LD A,2
379
                JR SEL4COPY
380
 
381
SEL4COPY_D      LD A,3
382
SEL4COPY        LD C,1
383
                CALL FTR_DOS
384
        RST8 _COM_FAT,_OPEN_FILE
385
                LD HL,0
386
                LD (TRD_5CF4),HL
387
                LD HL,BUF_FILEITEM
388
                LD BC,(NUMFAT_SELECT)
389
        RST8 _COM_FAT,_READ_DIR
390
                LD BC,(BUF_FILEITEM + 0x1D)
391
                LD DE,0x40
392
                CALL DIVIDE16
393
                LD (FILESIZE_BLOCKS),BC
394
                LD IX,WINCOPY_IMAGE
395
        RST8 _WINW
396
                LD A,0x11
397
                CALL SET_7FFD
398
                XOR A
399
.L1             PUSH AF
400
                LD HL,0xC000
401
                LD A,0x20
402
        RST8 _COM_FAT,_READ_FILE
403
                PUSH AF
404
                LD HL,0xC000
405
                LD DE,(TRD_5CF4)
406
                LD BC,0x4006
407
                CALL FTR_DOS
408
                POP HL
409
                POP AF
410
                CALL DRAW_PROGRESS              ; рисование индикатора копирования
411
                INC A
412
                BIT 0,L
413
                JR Z,.L1
414
; файл кончился
415
.L2             LD A,0x10
416
                CALL SET_7FFD
417
                JP RESTART
418
 
419
; запуск, загрузка или монтирование файлов
999 savelij 420
GO_RUN_HOB
421
        RST8 _COM_FAT,_OPEN_FILE
801 savelij 422
                LD DE,8
423
                ADD HL,DE
424
                PUSH HL
425
                LD HL,(BUF_FILEITEM+8)
426
                LD DE,"RT"
427
                AND A
428
                SBC HL,DE
429
                POP HL
999 savelij 430
                JP Z,SELMOUNT                   ; перехода на загрузку TRD образа
801 savelij 431
                LD A,(HL)
432
                CP "$"
999 savelij 433
                JR Z,GORUNHOB1                  ; переход на загрузку HOBETA
801 savelij 434
                CP "S"
999 savelij 435
                JP NZ,LOAD_IMAGE                ; переход на загрузку SCL образа
801 savelij 436
                INC HL
437
                LD A,(HL)
438
                DEC HL
439
                CP "P"
999 savelij 440
                JR Z,GORUNHOB1                  ; переход на загрузку SPG
801 savelij 441
                CP "N"
442
                LD A,(HL)
999 savelij 443
                JP NZ,LOAD_IMAGE                ; переход на загрузку образа
444
GORUNHOB1
445
        RST8 _COM_DEV,_KOL_VOL                  ; запрос у менеджера устройств о текущем устройстве
446
                LD A,D                          ; взяли номер текущего устройства
801 savelij 447
                LD HL,ADR_CAT_FAT
999 savelij 448
        RST8 _COM_DEV,_GET_FNDVOLUME
801 savelij 449
                ADD A,A
450
                ADD A,A
451
                ADD A,A
452
                LD C,A
453
                LD B,0
454
                ADD HL,BC
999 savelij 455
                LD A,(HL)                       ; взяли тип раздела
456
;               SUB 4                           ; пропускаем дисководы
457
                LD D,A                          ; номер текущего устройства
801 savelij 458
                INC HL
999 savelij 459
                LD E,(HL)                       ; взяли местоположение носителя (MASTER/SLAVE)
801 savelij 460
                PUSH DE
1026 savelij 461
                LD HL,0x5800
462
                LD DE,0x5801
463
                LD BC,0x02FF
801 savelij 464
                LD (HL),L
999 savelij 465
                LDIR                            ; зачернили экран для маскировки запускалки
801 savelij 466
                LD HL,RUN_CODE
1026 savelij 467
                LD DE,0x5D3B
801 savelij 468
                LD BC,ERUN_CODE-RUN_CODE
469
                LDIR
999 savelij 470
                CALL MEMSET                     ; выставили режим компа
801 savelij 471
                CALL FOR_RUN
1026 savelij 472
                LD HL,0x4200                    ; куда скопировать переменные FAT текущего выбранного раздела
999 savelij 473
        RST8 _INST_FATBOOT
801 savelij 474
                POP DE
1026 savelij 475
                LD (0x42FE),DE
476
                JP 0x4300
801 savelij 477
 
999 savelij 478
; загрузка шрифта для текстмода
801 savelij 479
LOAD_FNT        LD HL,ADR_CAT
480
LOAD_FNT1       LD A,4
999 savelij 481
        RST8 _COM_FAT,_READ_FILE
482
        PEC_ON M_FONT_BF
801 savelij 483
                LD HL,ADR_CAT
484
                LD DE,0
1026 savelij 485
                LD BC,0x800
801 savelij 486
                LDIR
999 savelij 487
        PEC_OFF M_FONT_BF
801 savelij 488
                JP RESTART
489
 
999 savelij 490
; загрузка FDI образа
801 savelij 491
LOAD_FDI        LD A,E
492
                CP "N"
999 savelij 493
                JR Z,LOAD_FNT                   ; переход на загрузку фонта
801 savelij 494
                LD HL,ERS_FLAGS
495
                SET B_LOAD_IMG,(HL)
999 savelij 496
                LD A,RAM_RAMDISK                ; страница начала рамдиска
497
                PUSH AF                         ; сохранили на стеке
498
                CALL SET4MBPAGE                 ; включили ее
801 savelij 499
                LD HL,FDI_TABLE_CYL
500
                LD DE,FDI_TABLE_CYL+1
1026 savelij 501
                LD BC,0x3FFF
801 savelij 502
                LD (HL),0
999 savelij 503
                LDIR                            ; очистка страницы с описателями дорожек
1026 savelij 504
                LD IXH,0xFF
999 savelij 505
                CALL LOAD1SECFDI                ; принудительная загрузка первого сектора
1026 savelij 506
                LD A,(0xC006)                   ; взяли количество сторон
801 savelij 507
                DEC A
1026 savelij 508
                LD A,(0xC004)                   ; взяли количество дорожек
801 savelij 509
                JR Z,LOADFDI1
999 savelij 510
                ADD A,A                         ; если сторон 2, то умножили количество дорожек на 2
511
LOADFDI1        LD C,A                          ; количество дорожек
1026 savelij 512
                LD HL,(0xC00A)
801 savelij 513
                LD (START_DATA),HL
1026 savelij 514
                LD DE,0x4000                    ; адрес буфера начала описателей дорожек
515
                LD HL,0xC00F                    ; адрес начала выборки описателей дорожек в FDI заголовке
801 savelij 516
LOADFDI3        BIT 1,H
999 savelij 517
                CALL NZ,LOAD1SECFDI             ; если вышли за пределы сектора меняем указатель и грузим следующий сектор в буфер
518
                LD A,(HL)                       ; биты 8-15 смещения дорожки от начала
1026 savelij 519
                AND 0x3F                        ; взяли для 8-13 биты - смещение в блоках в странице
999 savelij 520
                LD (DE),A                       ; уложили смещение в блоках в странице
521
                LD A,(HL)                       ; взяли биты 14-15
522
                INC HL                          ; следующий байт FDI заголовка
523
                INC D                           ; здесь положим смещение в страницах до нужной дорожки
801 savelij 524
                BIT 1,H
999 savelij 525
                CALL NZ,LOAD1SECFDI             ; если вышли за пределы сектора меняем указатель и грузим следующий сектор в буфер
526
                LD B,A                          ; сохранили нужные 14-15 биты
527
                LD A,(HL)                       ; взяли 16-23 биты смещения дорожки от начала
801 savelij 528
                RL B
529
                RLA
530
                RL B
531
                RLA
999 savelij 532
                LD (DE),A                       ; укладка битов смещения номера страницы
801 savelij 533
                INC D
999 savelij 534
        REPT 4
801 savelij 535
                INC HL
999 savelij 536
        ENDM
801 savelij 537
                BIT 1,H
999 savelij 538
                CALL NZ,LOAD1SECFDI             ; если вышли за пределы сектора меняем указатель и грузим следующий сектор в буфер
539
                LD B,(HL)                       ; взяли количество секторов на дорожке
801 savelij 540
                LD A,B
541
                AND A
542
                JP Z,LOADFDI_ERR
543
                INC HL
544
                INC HL
545
LOADFDI4        INC HL
546
                BIT 1,H
999 savelij 547
                CALL NZ,LOAD1SECFDI             ; если вышли за пределы сектора меняем указатель и грузим следующий сектор в буфер
548
                LDI                             ; перенос номера сектора
801 savelij 549
                DEC DE
550
                INC C
551
                INC D
552
                BIT 1,H
999 savelij 553
                CALL NZ,LOAD1SECFDI             ; если вышли за пределы сектора меняем указатель и грузим следующий сектор в буфер
554
                LD A,(HL)                       ; взяли размер сектора
801 savelij 555
                EX DE,HL
556
                LD (HL),1
557
                AND A
558
                JR Z,LOADFDI2
559
                LD (HL),2
560
                DEC A
561
                JR Z,LOADFDI2
562
                LD (HL),4
563
                DEC A
564
                JR Z,LOADFDI2
565
                LD (HL),8
566
LOADFDI2        EX DE,HL
567
                INC D
999 savelij 568
        REPT 5
801 savelij 569
                INC HL
999 savelij 570
        ENDM
571
                DJNZ LOADFDI4                   ; возвращаемся для продолжения, пока сектора дорожки не кончатся
1026 savelij 572
                LD D,0x40
801 savelij 573
                INC E
574
                DEC C
999 savelij 575
                JR NZ,LOADFDI3                  ; возвращаемся для продолжения пока не кончатся дорожки
801 savelij 576
                DEC HL
577
                BIT 1,H
999 savelij 578
                CALL NZ,LOAD1SECFDI             ; если вышли за пределы сектора меняем указатель и грузим следующий сектор в буфер
801 savelij 579
                PUSH HL
580
                LD A,H
581
                AND 1
582
                LD B,A
583
                LD C,L
584
                LD A,IXH
585
                ADD A,A
586
                ADD A,B
587
                LD B,A
588
                LD HL,0
589
START_DATA      EQU $-2
590
                AND A
591
                SBC HL,BC
592
                EX DE,HL
593
                POP HL
594
                LD A,D
595
                AND A
596
                JR Z,LOADFDI7
597
LOADFDI8        INC H
598
                BIT 1,H
999 savelij 599
                CALL NZ,LOAD1SECFDI             ; если вышли за пределы сектора меняем указатель и грузим следующий сектор в буфер
801 savelij 600
                DEC D
601
                JR NZ,LOADFDI8
602
LOADFDI7        ADD HL,DE
603
                BIT 1,H
999 savelij 604
                CALL NZ,LOAD1SECFDI             ; если вышли за пределы сектора меняем указатель и грузим следующий сектор в буфер
605
                PUSH HL                         ; сохранили адрес на начало начала секторов
1026 savelij 606
                LD DE,0xC000
801 savelij 607
                AND A
608
                SBC HL,DE
999 savelij 609
                LD (OSTAT_SECT),HL              ; сколько байт перенести из хвоста сектора в буфере в начало страницы
801 savelij 610
                LD B,H
611
                LD C,L
1026 savelij 612
                LD HL,0x200
801 savelij 613
                SBC HL,BC
999 savelij 614
                LD (NACH_SECT),HL               ; сколько байт перенести из начала сектора в буфере в конец страницы
615
                POP HL                          ; восстановили сдрес начала секторов, далее загрузка всех секторов в память
801 savelij 616
LOADFDI5        POP AF
617
                INC A
618
                CALL SET4MBPAGE
619
                PUSH AF
620
                BIT 1,H
621
                CALL NZ,LOAD1SECFDI
622
                EX AF,AF'
1026 savelij 623
                LD DE,0x4000
801 savelij 624
                LD BC,0
625
NACH_SECT       EQU $-2
626
                LDIR
627
                EX AF,AF'
628
                JP C,ELOAD_IMAGE
629
                EX DE,HL
1026 savelij 630
                LD A,0x1F
999 savelij 631
        RST8 _COM_FAT,_READ_FILE
801 savelij 632
                JP C,ELOAD_IMAGE
633
                PUSH HL
1026 savelij 634
                LD HL,0xC000
801 savelij 635
                PUSH HL
636
                LD A,1
999 savelij 637
        RST8 _COM_FAT,_READ_FILE
801 savelij 638
                POP HL
639
                POP DE
640
                LD BC,0
641
OSTAT_SECT      EQU $-2
642
                LDIR
643
                JR LOADFDI5
644
 
645
LOADFDI_ERR     LD A,RAM_RAMDISK
646
                CALL SET4MBPAGE
1026 savelij 647
                LD HL,0x7FFF
801 savelij 648
                LD (HL),0
649
                DEC H
650
                LD (HL),0
1026 savelij 651
                LD A,ZXSTD_CPU1
801 savelij 652
                CALL SET4MBPAGE
653
                LD SP,(LD_FILE_SP)
654
                POP IY
655
                POP IX
656
                JP LDFDI_ERROR
657
 
999 savelij 658
; создание таблицы описателей для пустого рамдиска
801 savelij 659
CREATE_TRD640   PUSH IX
660
                PUSH IY
661
                LD (LD_FILE_SP),SP
662
                LD SP,ADR_CAT
663
                JR ELT4
664
 
665
CREATE_RAMTABL  PUSH IX
666
                PUSH IY
667
                LD (LD_FILE_SP),SP
668
                LD SP,ADR_CAT
999 savelij 669
; создание таблицы описателя для загруженных TRD и SCL образов
670
END_LOAD_TRD    LD A,RAM_DATARAMD               ; нужна страница откуда начинается загруженный образ
801 savelij 671
                CALL SET4MBPAGE
1026 savelij 672
                LD HL,(0x48E1)                  ; первый свободный трек сектор
801 savelij 673
                LD A,L
674
                LD L,H
675
                LD H,0
676
                ADD HL,HL
677
                ADD HL,HL
678
                ADD HL,HL
679
                ADD HL,HL
680
                OR L
999 savelij 681
                LD L,A                          ; количество занятых секторов с директорией
1026 savelij 682
                LD DE,(0x48E5)                  ; количество свободных секторов
801 savelij 683
                ADD HL,DE
684
                ADD HL,HL
685
                ADD HL,HL
686
                ADD HL,HL
999 savelij 687
                ADD HL,HL                       ; H = количество дорожек
801 savelij 688
                LD A,H
1026 savelij 689
                CP 0xA0
801 savelij 690
                JR NC,ELT3
1026 savelij 691
ELT4            LD A,0xA0
801 savelij 692
ELT3            EX AF,AF'
999 savelij 693
                LD A,RAM_RAMDISK                ; нужна страница начала рамдиска, где будет таблица описателей
801 savelij 694
                CALL SET4MBPAGE
1026 savelij 695
                LD HL,0x4000
801 savelij 696
                PUSH HL
1026 savelij 697
                LD DE,0x4001
698
                LD BC,0x3FFF
801 savelij 699
                LD (HL),L
999 savelij 700
                LDIR                            ; очистили страницу
701
                POP DE                          ; адрес начала
702
                LD HL,0                         ; смещение в блоках и страницах
801 savelij 703
                EX AF,AF'
704
ELT2            EX AF,AF'
1026 savelij 705
                LD BC,0x1000                    ; счетчик номеров секторов и их номера
801 savelij 706
                LD A,L
707
                RRCA
708
                RRCA
999 savelij 709
                LD (DE),A                       ; смещение в блоках дорожки в странице
801 savelij 710
                INC D
711
                LD A,H
999 savelij 712
                LD (DE),A                       ; смещение в страницах до дорожки
801 savelij 713
                INC D
714
ELT1            INC C
715
                LD A,C
999 savelij 716
                LD (DE),A                       ; номер сектора
801 savelij 717
                INC D
718
                LD A,2
999 savelij 719
                LD (DE),A                       ; размер сектора
801 savelij 720
                INC D
999 savelij 721
                DJNZ ELT1                       ; вносим в таблицу все номера секторов с размерами
1026 savelij 722
                LD D,0x40                       ; вернули указатель в начало
999 savelij 723
                INC E                           ; для следующей дорожки
1026 savelij 724
                LD BC,0x40
999 savelij 725
                ADD HL,BC                       ; переход к следующей дорожке
801 savelij 726
                EX AF,AF'
727
                DEC A
999 savelij 728
                JR NZ,ELT2                      ; повторяем для всех дорожек
729
; общий выход из загрузки с возвратом стандартной страницы в окне проецирования 1
801 savelij 730
ELOAD_IMAGE     LD A,RAM_RAMDISK
731
                CALL SET4MBPAGE
1026 savelij 732
                LD HL,0x7FFF
801 savelij 733
                LD (HL),"R"
734
                DEC H
735
                LD (HL),"D"
736
                CALL SET_RAMD_NAME
1026 savelij 737
                LD A,ZXSTD_CPU1
801 savelij 738
                CALL SET4MBPAGE
739
                LD SP,0
740
LD_FILE_SP      EQU $-2
741
                POP IY
742
                POP IX
743
                LD HL,ERS_FLAGS
744
                BIT B_VIEW_IMG,(HL)
745
                RET Z
746
                RES B_VIEW_IMG,(HL)
999 savelij 747
; загрузка каталога TR-DOS и поиск выбранного и запуск выбранного BASIC файла
748
START_IMG       LD H,VIRT_REAL_DRIVE
801 savelij 749
                CALL READCMOS
750
                AND 3
751
                LD C,A
817 savelij 752
                PUSH AF
999 savelij 753
        RST8 _MOUNTER,_CLOSEMOUNT               ; !!!
817 savelij 754
                POP AF
999 savelij 755
RUNMOUNT        PUSH AF
1026 savelij 756
                AND 3
999 savelij 757
                CALL SETUP_DRIVE                ; переключение TR-DOS на указанный номер
758
        RST8 _MOUNTER,_GET_VIRT_BITS
759
                POP AF
801 savelij 760
                LD C,1
1026 savelij 761
                CALL FTR_DOS;TO_DOS4BAS
801 savelij 762
                LD HL,ADR_CAT
763
                LD DE,0
1026 savelij 764
                LD BC,0x0905
765
                CALL FTR_DOS;TO_DOS4BAS                 ; загрузка TR-DOS диры
801 savelij 766
                DI
767
                LD IX,WIN_FILES
768
                LD B,(IX+8)
769
                INC B
770
                LD IX,ADR_CAT
1026 savelij 771
                LD DE,0x10
801 savelij 772
NEXT_BAS        LD A,(IX+8)
773
                ADD IX,DE
774
                CP "B"
775
                JR NZ,NEXT_BAS
776
                DJNZ NEXT_BAS
777
                PUSH IX
778
                POP HL
779
                SBC HL,DE
780
                LD IX,WIN_FILES
781
                JP RUNFILE1
782
 
783
SET_RAMD_NAME   DEC H
784
                XOR A
785
                LD (HL),A
786
                LD BC,CONF_128
787
                OUT (C),A
788
                PUSH HL
789
                LD HL,TXT_NONE
790
                LD DE,IN_RAMDISK
791
                LD BC,ETXT_NONE-TXT_NONE
792
                LDIR
793
                LD HL,ERS_FLAGS
794
                BIT B_LOAD_IMG,(HL)
795
                LD BC,CONF_128
1026 savelij 796
                LD A,0x10
801 savelij 797
                OUT (C),A
798
                POP HL
799
                RET Z
800
                LD DE,BUF_FILEITEM
801
                LD B,8
802
                CALL SRN1
803
                LD B,3
804
SRN1            LD A,(DE)
805
                LD (HL),A
806
                DEC H
807
                INC DE
808
                DJNZ SRN1
809
                RET
810
 
999 savelij 811
; загрузка следующего сектора заголовка FDI
801 savelij 812
LOAD1SECFDI     PUSH HL
813
                PUSH BC
814
                PUSH DE
815
                PUSH AF
1026 savelij 816
                LD HL,0xC000
801 savelij 817
                LD A,1
999 savelij 818
        RST8 _COM_FAT,_READ_FILE
801 savelij 819
                INC IXH
820
                POP AF
821
                POP DE
822
                POP BC
823
                POP HL
824
                RES 1,H
825
                RET
826
 
999 savelij 827
; включение в 1 окно проецирования заданной страницы
801 savelij 828
SET4MBPAGE      PUSH BC
829
                LD B,A
999 savelij 830
        PEC_ON M_SHADOW_BF
801 savelij 831
                LD A,B
832
                LD BC,WIN_P1
833
                OUT (C),A
834
                LD B,A
999 savelij 835
        PEC_OFF M_SHADOW_BF
801 savelij 836
                LD A,B
837
                POP BC
838
                RET
839
 
840
LOADIMAGE4      PUSH IX
841
                PUSH IY
842
                LD (LD_FILE_SP),SP
843
                LD SP,ADR_CAT
844
                LD A,RAM_TAPE
999 savelij 845
; загрузка TRD или TAP образа
801 savelij 846
LOADIMAGE3      PUSH AF
847
                CALL SET4MBPAGE
1026 savelij 848
                LD HL,0x4000
849
                LD A,0x20
999 savelij 850
        RST8 _COM_FAT,_READ_FILE
801 savelij 851
                JR C,END_LOAD_TAP
852
                POP AF
853
                INC A
854
                JR LOADIMAGE3
855
 
856
END_LOAD_TAP    XOR A
857
                CALL SET4MBPAGE
858
                LD H,A
859
                LD L,A
1026 savelij 860
                LD (0x4000),HL
861
                LD (0x4002),A
862
                LD A,ZXSTD_CPU1
801 savelij 863
                CALL SET4MBPAGE
864
                LD SP,(LD_FILE_SP)
865
                POP IY
866
                POP IX
867
                LD H,CMOS_BYTE_00
868
                CALL READCMOS
869
                OR M_EMUL_TAPE
870
                LD L,A
871
                CALL WRITECMOS
872
                AND M_AUTO_TAPE
873
                JP Z,RESTART
874
                JP TAPELOAD1
875
 
876
LOAD_IMAGE      DI
999 savelij 877
                LD D,A                          ; первый символ расширения
801 savelij 878
                INC HL
999 savelij 879
                LD E,(HL)                       ; второй символ расширения
801 savelij 880
                CP "B"
881
                JR NZ,LOADIMAGE1_
882
                LD A,E
883
                CP "M"
999 savelij 884
                JR Z,LOADIMAGE2                 ; BMP
885
LOADIMAGE1_     CP "T"                          ; TAP или TRD ?
801 savelij 886
                JR NZ,LOADIMAGE1
887
                LD A,E
888
                CP "A"
999 savelij 889
                JP Z,LOADIMAGE4                 ; TAP
801 savelij 890
LOADIMAGE1      LD A,D
891
                CP "R"
892
                LD HL,FLASHER
999 savelij 893
                JR Z,LOAD_IMAGE8                ; TRD
801 savelij 894
LOADIMAGE2      LD HL,RESTART
895
LOAD_IMAGE8     PUSH HL
896
                PUSH IX
897
                PUSH IY
898
                LD (LD_FILE_SP),SP
899
                LD SP,ADR_CAT
900
                LD A,D
999 savelij 901
                CP "S"                          ; это SCL файл?
801 savelij 902
                JR Z,LOAD_IMAGE2
999 savelij 903
                CP "F"                          ; это FDI файл?
801 savelij 904
                JP Z,LOAD_FDI
999 savelij 905
                CP "B"                          ; это BMP файл?
801 savelij 906
                JP Z,BMPVIEW
999 savelij 907
                CP "T"                          ; это TRD файл?
801 savelij 908
                JR NZ,LOAD_ROM
909
                LD HL,ERS_FLAGS
910
                SET B_LOAD_IMG,(HL)
911
                LD A,RAM_DATARAMD
999 savelij 912
; загрузка TRD или TAP образа
801 savelij 913
LOAD_IMAGE1     PUSH AF
914
                CALL SET4MBPAGE
915
                LD HL,CPU1
1026 savelij 916
                LD A,0x20
999 savelij 917
        RST8 _COM_FAT,_READ_FILE
801 savelij 918
                JP C,END_LOAD_TRD
919
                POP AF
920
                INC A
921
                JR LOAD_IMAGE1
922
 
999 savelij 923
LOAD_ROM        CP "R"                          ; это ROM файл?
801 savelij 924
                JP NZ,ELOAD_IMAGE
925
                LD A,RAM_FLASHER
926
                CALL LOAD_IN_PAGE
927
                LD SP,(LD_FILE_SP)
928
                POP IY
929
                POP IX
930
                RET
931
 
932
LOAD_IN_PAGE    PUSH AF
933
                CALL SET4MBPAGE
934
                LD HL,CPU1
1026 savelij 935
                LD A,0x20
999 savelij 936
        RST8 _COM_FAT,_READ_FILE
801 savelij 937
                JR C,LOADINPAGE1
938
                POP AF
939
                INC A
940
                JR LOAD_IN_PAGE
941
 
942
LOADINPAGE1     POP AF
999 savelij 943
                LD A,ZXSTD_CPU1
801 savelij 944
                JP SET4MBPAGE
945
 
999 savelij 946
; меню выбора на какую букву диска SCL образ переключить
947
LOAD_IMAGE2     LD IX,LOAD_SCL
948
        RST8 _WINW
949
                JP _RULILKA
950
 
951
SCL_A           XOR A
952
                JR SCL_ALL
953
 
954
SCL_B           LD A,1
955
                JR SCL_ALL
956
 
957
SCL_C           LD A,2
958
                JR SCL_ALL
959
 
960
SCL_D           LD A,3
961
SCL_ALL         PUSH AF
962
        RST8 _MOUNTER,_SET_VIRTREAL
963
                POP AF
964
; загрузка SCL образа
965
LOAD_SCL_IMAGE  LD HL,DSKINFO
1026 savelij 966
                LD DE,ADR_CAT+0xF00
801 savelij 967
                LD BC,DSK_END-DSKINFO
999 savelij 968
                LDIR                            ; сохранение инфы для создания заголовка дискеты
801 savelij 969
                LD HL,ERS_FLAGS
970
                SET B_LOAD_IMG,(HL)
971
                LD A,RAM_DATARAMD
972
LOAD_IMAGE4     PUSH AF
999 savelij 973
                CALL SET4MBPAGE                 ; включили первую страницу откуда рамдиск начинается
1026 savelij 974
                LD HL,0x5000
975
                LD A,0x18
999 savelij 976
        RST8 _COM_FAT,_READ_FILE
977
                PUSH AF                         ; сохранили флаг окончания загрузки на случай окончания образа
1026 savelij 978
                LD HL,0x4000
999 savelij 979
                PUSH HL                         ; сохранили адрес начала каталога
801 savelij 980
                LD (HL),L
981
                LD D,H
982
                LD E,L
983
                INC DE
1026 savelij 984
                LD BC,0xFFF
999 savelij 985
                LDIR                            ; зачистка области первой дорожки для формирования каталога диска
1026 savelij 986
                LD HL,0x5008                    ; адрес количества файлов в SCL образе
999 savelij 987
                LD A,(HL)                       ; взяли количество файлов как счетчик
988
                INC HL                          ; перешли на первый описатель файла
801 savelij 989
                EXX
999 savelij 990
                LD HL,0                         ; номер абсолютного сектора
991
                LD D,L                          ; приращение секторов не может быть более 255 секторов
992
                LD B,A                          ; сохранение количества файлов
801 savelij 993
                EXX
999 savelij 994
                POP DE                          ; вернули адрес начала каталога диска
801 savelij 995
LOAD_IMAGE3     EX AF,AF'
1026 savelij 996
                LD BC,0x0D
999 savelij 997
                LDIR                            ; перенесли 13 байт тела описателя
998
                LD A,(HL)                       ; забрали размер файла в секторах
999
                LDI                             ; перенесли еще байт
801 savelij 1000
                EXX
1001
                LD E,A
999 savelij 1002
                PUSH HL                         ; сохранили текщее значение номера сектора
1003
                ADD HL,DE                       ; увеличили текщее значение на размер файла в секторах
801 savelij 1004
                EXX
1005
                EX (SP),HL
1006
                LD A,L
1007
                ADD HL,HL
1008
                ADD HL,HL
1009
                ADD HL,HL
1010
                ADD HL,HL
1011
                INC H
1026 savelij 1012
                AND 0x0F
801 savelij 1013
                LD L,A
1014
                EX (SP),HL
999 savelij 1015
                POP BC                          ; восстановили текщий номер сектора
801 savelij 1016
                EX DE,HL
1017
                LD (HL),C
1018
                INC HL
999 savelij 1019
                LD (HL),B                       ; уложили после текущего описателя
801 savelij 1020
                INC HL
1021
                EX DE,HL
1022
                EX AF,AF'
1023
                DEC A
999 savelij 1024
                JR NZ,LOAD_IMAGE3               ; если файлы не кончились продолжаем
1025
                PUSH HL                         ; сохранили адрес начала данных
1026 savelij 1026
                LD HL,ADR_CAT+0xF00
1027
                LD DE,0x48E1
801 savelij 1028
                LD BC,DSK_END-DSKINFO
1029
                LDIR
1030
                EXX
999 savelij 1031
                LD DE,2544                      ; стандартный размер дискеты
801 savelij 1032
                EX DE,HL
1033
                AND A
1034
                SBC HL,DE
1026 savelij 1035
                LD (0x48E5),HL                  ; количество свободных секторов
801 savelij 1036
                EX DE,HL
1037
                LD A,L
1038
                ADD HL,HL
1039
                ADD HL,HL
1040
                ADD HL,HL
1041
                ADD HL,HL
1042
                INC H
1026 savelij 1043
                AND 0x0F
801 savelij 1044
                LD L,A
1026 savelij 1045
                LD (0x48E1),HL                  ; первый свободный трек и сектор
801 savelij 1046
                LD A,B
1026 savelij 1047
                LD (0x48E4),A                   ; количество файлов на диске
801 savelij 1048
                EXX
999 savelij 1049
                POP DE                          ; восстановление адреса начала данных
1026 savelij 1050
                LD HL,0x8000                    ; конец окна проецирования
801 savelij 1051
                AND A
999 savelij 1052
                SBC HL,DE                       ; получили количество байт для сдвига
801 savelij 1053
                LD B,H
1054
                LD C,L
1026 savelij 1055
                LD HL,0x5000                    ; начало данных на рамдиске
801 savelij 1056
                EX DE,HL
999 savelij 1057
                LDIR                            ; сдвинули, после переноса DE = адрес куда далее грузить
801 savelij 1058
                LD A,D
1026 savelij 1059
                CP 0x7E
801 savelij 1060
                JR NC,LOAD_IMAGE7
1061
                EX DE,HL
1026 savelij 1062
                LD A,0x7F
801 savelij 1063
                SUB H
1064
                SRL A
1065
                LD IXL,A
999 savelij 1066
        RST8 _COM_FAT,_READ_FILE
1026 savelij 1067
                LD DE,0x8000
801 savelij 1068
                EX DE,HL
1069
LOAD_IMAGE7     AND A
999 savelij 1070
                SBC HL,DE                       ; получили сколько байт осталось до конца окна
801 savelij 1071
                LD (OST_HWOST),HL
1072
                LD (KUDA_HWOST),DE
1073
                LD DE,0
1074
                EX DE,HL
1075
                SBC HL,DE
1076
                LD A,1
1077
                AND H
1078
                LD H,A
1079
                LD (NEXT4PAGE),HL
999 savelij 1080
                POP AF                          ; восстановили флаг последней загрузки
1081
                JP C,END_LOAD_TRD               ; если файл уже кончился, то выход
801 savelij 1082
                JR LOAD_IMAGE5
1083
 
1026 savelij 1084
LOAD_IMAGE6     LD DE,0x4000
801 savelij 1085
                LD BC,0
1086
NEXT4PAGE       EQU $-2
1087
                LDIR
1088
                EX AF,AF'
1089
                JP C,END_LOAD_TRD
1090
                EX DE,HL
1026 savelij 1091
                LD A,0x1F
999 savelij 1092
        RST8 _COM_FAT,_READ_FILE
801 savelij 1093
                JP C,END_LOAD_TRD
1094
LOAD_IMAGE5     LD HL,ADR_CAT
1095
                PUSH HL
1096
                LD A,1
999 savelij 1097
        RST8 _COM_FAT,_READ_FILE
1098
                EX AF,AF'                       ; спрятали флаг загрузки сектора
1099
                POP HL                          ; восстановили адрес куда сектор в буфер загрузили
801 savelij 1100
                LD DE,0
999 savelij 1101
KUDA_HWOST      EQU $-2                         ; куда ложить остаток в окне
801 savelij 1102
                LD BC,0
999 savelij 1103
OST_HWOST       EQU $-2                         ; сколько переносить в конец страницы
801 savelij 1104
                LDIR
1105
                POP AF
1106
                INC A
1107
                PUSH AF
1108
                CALL SET4MBPAGE
1109
                JR LOAD_IMAGE6
1110
 
999 savelij 1111
; проверка заголовка HOBETA файла
1112
;на выходе: флаг С=1-не соотвествует
801 savelij 1113
CMP4HOBETA      SUB 1
1114
                RET NZ
1115
                LD A,(BUF_RDSEC+8)
999 savelij 1116
                CP "C"                          ; проверка что это кодовый блок, а не что-то другое
801 savelij 1117
                SCF
1118
                RET NZ
999 savelij 1119
                PUSH DE                         ; сохранили адрес складирования для дальнейшей проверки
1120
                LD BC,BUF_RDSEC                 ; возвращаемся в начало сектора
1121
                CALL HOB_CRC                    ; считаем CRC HOBETA заголовка
801 savelij 1122
                LD A,(BC)
1123
                INC BC
1124
                LD E,A
1125
                LD A,(BC)
999 savelij 1126
                LD D,A                          ; в "DE" рассчитанное CRC HOBETA заголовка
1127
                AND A                           ; в "HL" взятое из смещения +0x0F от начала файла
1128
                SBC HL,DE                       ; сравниваем 
1129
                POP DE                          ; если не совпало то возможно это не HOBETA
801 savelij 1130
                SCF
999 savelij 1131
                RET NZ                          ; пропускаем файл
801 savelij 1132
                EXX
1133
                LD HL,(BUF_RDSEC+9)
999 savelij 1134
                DEC HL                          ; для загрузки масимум 40960 байт (160 секторов)
1026 savelij 1135
                LD DE,(BUF_RDSEC+0x0B)
999 savelij 1136
                ADD HL,DE                       ; проверяем выход за пределы озу
1137
                EXX                             ; если вылет за предел озу
1138
                RET C                           ; пропускаем файл
801 savelij 1139
                EXX
1140
                LD HL,(BUF_RDSEC+9)
1026 savelij 1141
                LD DE,0x6000                    ; проверяем адрес загрузки
999 savelij 1142
                AND A                           ; адрес загрузки не должен быть ниже 0x6000
801 savelij 1143
                SBC HL,DE
999 savelij 1144
                EXX                             ; если адрес загрузки ниже 0x6000
801 savelij 1145
                RET
1146
 
999 savelij 1147
; на входе:  BC - адрес заголовка
1148
; на выходе: HL - HOBETA CRC
1026 savelij 1149
HOB_CRC         LD A,0x0F
801 savelij 1150
                LD HL,0
1151
                EXX
1152
                LD E,0
1153
                EXX
1154
HOBCRC1         EX AF,AF'
1155
                LD A,(BC)
1156
                LD E,A
1157
                LD D,A
1158
                ADD HL,DE
1159
                EXX
1160
                LD A,E
1161
                INC E
1162
                EXX
1163
                LD E,A
1164
                LD D,0
1165
                ADD HL,DE
1166
                EX AF,AF'
1167
                INC BC
1168
                DEC A
1169
                JR NZ,HOBCRC1
1170
                RET
1171
 
1026 savelij 1172
CMP4FONTS       LD DE,(BUF_FILEITEM+0x1C)
1173
                LD HL,(BUF_FILEITEM+0x1E)
801 savelij 1174
                LD A,H
1175
                OR L
1176
                OR E
1177
                SCF
1178
                RET NZ
1179
                LD A,D
1180
                CP 8
1181
                SCF
1182
                RET NZ
1183
                AND A
1184
                RET
1185
 
1026 savelij 1186
CMP4ROMS        LD DE,(BUF_FILEITEM+0x1C)
1187
                LD HL,(BUF_FILEITEM+0x1E)
801 savelij 1188
                LD A,H
1189
                OR D
1190
                OR E
1191
                SCF
1192
                RET NZ
1193
                LD A,L
1194
                CP 8
1195
CMP_ROMSIZE     EQU $-1
1196
                SCF
1197
                RET NZ
1198
CMP4ROMS1       AND A
1199
                RET
1200
 
1201
CMP4FDI         EXX
1202
                LD HL,BUF_RDSEC
1203
                LD A,(HL)
1204
                CP "F"
1205
                SCF
1206
                RET NZ
1207
                INC HL
1208
                LD A,(HL)
1209
                CP "D"
1210
                SCF
1211
                RET NZ
1212
                INC HL
1213
                LD A,(HL)
1214
                CP "I"
1215
                SCF
1216
                RET NZ
1217
                INC HL
1218
                INC HL
999 savelij 1219
                LD A,(HL)                       ; количество цилиндров
1026 savelij 1220
                CP 0x57
801 savelij 1221
                CCF
1222
                RET C
1223
                INC HL
999 savelij 1224
                LD A,(HL)                       ; должен быть 0
801 savelij 1225
                AND A
1226
                SCF
1227
                RET NZ
1228
                INC HL
999 savelij 1229
                LD A,(HL)                       ; количество сторон
801 savelij 1230
                AND A
1231
                SCF
1232
                RET Z
1233
                CP 3
1234
                CCF
1235
                RET C
1236
                INC HL
999 savelij 1237
                LD A,(HL)                       ; должно быть 0
801 savelij 1238
                AND A
1239
                SCF
1240
                RET NZ
1241
                EXX
1242
                AND A
1243
                RET
1244
 
1245
CMP4IMAGE       CP 3
1246
                JR Z,CMP4FDI
1247
                CP 4
1248
                JR Z,CMP4BMP
1249
                SUB 1
999 savelij 1250
                RET Z                           ; для TRD проверка не нужка
1251
; для SCL проверка наличия слова "SINCLAIR" в первых 8 байтах
801 savelij 1252
                EXX
1253
                LD HL,BUF_RDSEC
1254
                LD DE,SIGN_SCL
1255
                LD B,8
1256
CMP4IMAGE1      LD A,(DE)
1257
                CP (HL)
1258
                SCF
1259
                RET NZ
1260
                INC DE
1261
                INC HL
1262
                DJNZ CMP4IMAGE1
1263
                EXX
1264
                AND A
1265
CMP4TAPES       RET
1266
 
1267
CMP4BMP         EXX
1268
                LD HL,BUF_RDSEC
1269
                LD A,"B"
1270
                SUB (HL)
1271
                SCF
1272
                RET NZ
1273
                INC HL
1274
                LD A,"M"
1275
                SUB (HL)
1276
                SCF
1277
                RET NZ
1026 savelij 1278
                LD HL,(BUF_RDSEC+0x12)
801 savelij 1279
                LD DE,320
1280
                AND A
1281
                SBC HL,DE
1282
                SCF
1283
                RET NZ
1026 savelij 1284
                LD HL,(BUF_RDSEC+0x16)
801 savelij 1285
                LD DE,200
1286
                AND A
1287
                SBC HL,DE
1288
                SCF
1289
                RET NZ
1026 savelij 1290
                LD A,(BUF_RDSEC+0x1C)
801 savelij 1291
                CP 4
1292
                SCF
1293
                RET NZ
1294
                EXX
1295
                AND A
1296
                RET
1297
 
1298
SEARCH_FILE     LD A,1
1299
                LD HL,(GDE_EXT_FILES)
999 savelij 1300
        RST8 _COM_FAT,_SET_MASK_EXT
1301
                LD DE,ADR_CAT_FAT               ; адрес буфера куда складировать найденное
1302
        RST8 _COM_FAT,_FIND_FILEITEM
1303
                LD H,A                          ; номер страницы где найденное брать
801 savelij 1304
                LD A,B
1305
                OR C
1306
                JR NZ,SEARCHF1
1307
                PUSH IX
1308
                LD IX,NOBASIC
999 savelij 1309
        RST8 _WINW
801 savelij 1310
                POP IX
999 savelij 1311
        RST8 _COM_DEV,_KOL_VOL
801 savelij 1312
                DEC E
1313
                JP Z,NO_BAS
1314
                JP SELECT_DEVICE
1315
 
1316
SEARCHF1        PUSH BC
1317
                PUSH HL
999 savelij 1318
        RST8 _SORT_FINDFILES
1319
        PEC_ON M_SHADOW_BF
801 savelij 1320
                POP AF
1321
                LD BC,WIN_P1
1322
                OUT (C),A
1323
                LD HL,CPU1
999 savelij 1324
                LD DE,ADR_CAT_SCRH              ; адрес буфера складирования по маске
1026 savelij 1325
                LD BC,0x1000
801 savelij 1326
                LDIR
1327
                LD BC,WIN_A1
1026 savelij 1328
                LD A,0x7A
801 savelij 1329
                OUT (C),A
999 savelij 1330
        PEC_OFF M_SHADOW_BF
801 savelij 1331
                POP BC
1332
                LD DE,ADR_CAT_FAT
999 savelij 1333
                LD HL,ADR_CAT_SCRH              ; адрес буфера складирования по маске
801 savelij 1334
SEARCHF3        PUSH BC
1335
                LD C,(HL)
1336
                INC HL
1337
                LD B,(HL)
1338
                DEC HL
1339
                LD A,6
999 savelij 1340
        RST8 _COM_FAT,_POS_FILES
801 savelij 1341
                PUSH HL
1342
                LD HL,BUF_FILEITEM
999 savelij 1343
        RST8 _COM_FAT,_READ_DIR
801 savelij 1344
                PUSH DE
1026 savelij 1345
                LD DE,0x0B
801 savelij 1346
                ADD HL,DE
1347
                LD A,(HL)
1026 savelij 1348
                AND 0x10
801 savelij 1349
                JR NZ,SEARCHF4
999 savelij 1350
        RST8 _COM_FAT,_OPEN_FILE
801 savelij 1351
                LD HL,BUF_RDSEC
1352
                LD A,1
999 savelij 1353
        RST8 _COM_FAT,_READ_FILE
801 savelij 1354
                LD HL,BUF_FILEITEM
1355
                CALL CP_EXT
1356
                CALL 0
1357
CMP_FOUNDED     EQU $-2
1358
SEARCHF4        POP DE
1359
                POP HL
1360
                JR NC,SEARCHF5
1361
                INC HL
1362
                INC HL
1363
                JR SEARCH6
1364
 
1365
SEARCHF5        LDI
1366
                LDI
1367
SEARCH6         POP BC
1368
                DEC BC
1369
                LD A,B
1370
                OR C
1371
                JR NZ,SEARCHF3
1372
                LD HL,ADR_CAT_FAT
1373
                EX DE,HL
1374
                SBC HL,DE
1375
                SRL H
1376
                RR L
1377
                LD B,H
1378
                LD C,L
1379
                RET
1380
 
1381
CPETR3          PUSH BC
1382
                PUSH DE
1383
                PUSH HL
1384
                LD C,0
1385
                LD DE,VIEW_IMAGES
1026 savelij 1386
                JR GDE_EXT_FILES.L1
801 savelij 1387
 
1388
CP_EXT          PUSH BC
1389
                PUSH DE
1390
                PUSH HL
1391
                LD C,0
1392
                LD DE,0
1393
GDE_EXT_FILES   EQU $-2
1026 savelij 1394
.L1             LD A,(DE)
801 savelij 1395
                AND A
1026 savelij 1396
                JR Z,.L3
801 savelij 1397
                INC C
1398
                PUSH DE
1399
                PUSH HL
1400
                CALL COMPARF
1401
                POP HL
1402
                POP DE
1026 savelij 1403
                JR Z,.L2
801 savelij 1404
                INC DE
1405
                INC DE
1406
                INC DE
1026 savelij 1407
                JR .L1
801 savelij 1408
 
1026 savelij 1409
.L2             LD A,C
1410
.L3             AND A
801 savelij 1411
                POP HL
1412
                POP DE
1413
                POP BC
1414
                RET
1415
 
1416
COMPARF         PUSH DE
1417
                LD DE,8
1418
                ADD HL,DE
1419
                POP DE
1420
                LD B,3
1026 savelij 1421
.L1             LD A,(DE)
801 savelij 1422
                CP "A"
1026 savelij 1423
                JR C,.L2
801 savelij 1424
                AND %11011111
1026 savelij 1425
.L2             CP (HL)
801 savelij 1426
                RET NZ
1427
                INC HL
1428
                INC DE
1026 savelij 1429
                DJNZ .L1
801 savelij 1430
                RET
1431
 
999 savelij 1432
; прошиватель пзу с индикацией процесса
801 savelij 1433
FLASHER         LD BC,PENT_CONF
1434
                XOR A
1435
                OUT (C),A
999 savelij 1436
        PEC_ON M_SHADOW_BF
1026 savelij 1437
                LD BC,0xFF77
1438
                LD A,0xA3
999 savelij 1439
                OUT (C),A                       ; принудительное включение турбо режима 7МГЦ
801 savelij 1440
                LD A,(CMP_ROMSIZE)
1441
                DEC A
1442
                JR NZ,FLASHER6
1443
                LD IX,UPDATE_CUSTOM
999 savelij 1444
        RST8 _WINW
801 savelij 1445
                LD SP,ADR_CAT
999 savelij 1446
        PEC_ON M_SHADOW_BF+M_FLASH_BF
801 savelij 1447
                LD BC,WIN_A0
1026 savelij 1448
                LD A,0x7F
999 savelij 1449
                OUT (C),A                       ; отключение пзу в окне 0
1069 dimkam 1450
 
1451
                call rom_read_id        ; чтение ID чипа
1452
                ex de,hl
1453
                xor a                           ;стираем только чипы с блоками по 64к
1454
                ld hl,0xe220
1455
                sbc hl,de
1456
                jr z,FLASHER_CUST_ERASE
1457
                xor a
1458
                ld hl,0xa401
1459
                sbc hl,de
1460
                jr nz,FLASHER_CUST_PROG
1461
FLASHER_CUST_ERASE
801 savelij 1462
                LD E,0
1463
                LD HL,0
999 savelij 1464
                CALL ERASE_BLK                  ; стирание CUSTOM ROM страницы
1069 dimkam 1465
FLASHER_CUST_PROG
801 savelij 1466
                LD A,RAM_FLASHER
1467
                LD E,0
999 savelij 1468
                CALL FLASH_64KB                 ; программирование CUSTOM ROM страницы
801 savelij 1469
                JP EFLASHER
1470
 
999 savelij 1471
FLASHER6        LD IX,ERASE_ROM                 ; вывод окна о стирании FLASH
1472
        RST8 _WINW
1473
                LD IX,UPDATE_WIN                ; вывод окна об обновлении FLASH
1474
        RST8 _WINW
801 savelij 1475
                LD IX,ERASE_ROM
1476
                LD SP,ADR_CAT
999 savelij 1477
        PEC_ON M_SHADOW_BF+M_FLASH_BF           ; разрешение программирования FLASH
801 savelij 1478
                LD BC,WIN_A0
1026 savelij 1479
                LD A,0x7F
999 savelij 1480
                OUT (C),A                       ; отключение rom в окне 0
801 savelij 1481
                LD A,3
999 savelij 1482
                CALL SETWIN_INDICAT             ; установка индикатора процесса
1069 dimkam 1483
 
1484
                call erase_all_chip
1485
;               LD E,0
1486
;               LD HL,0
1487
;FLASHER4       CALL ERASE_BLK                  ; стирание блока 64КБ
1488
;               CALL INC_INDICAT                ; обновление индикатора процесса
1489
;               INC E                           ; следующий блок        
1490
;               BIT 3,E
1491
;               JR Z,FLASHER4
801 savelij 1492
                LD IX,UPDATE_WIN
999 savelij 1493
                LD A,RAM_FLASHER                ; страница начала загруженного ROM файла
801 savelij 1494
                LD E,0
999 savelij 1495
FLASHER3        CALL FLASH_64KB                 ; прошивание одной 64КБ страницы
1496
                INC E                           ; следующая 64кб страница
801 savelij 1497
                BIT 3,E
1498
                JR Z,FLASHER3
1499
EFLASHER        LD BC,WIN_P3
1500
                XOR A
999 savelij 1501
                OUT (C),A                       ; включение RAM в окне 3
1026 savelij 1502
                LD A,(CPU3+0x20)
801 savelij 1503
                XOR B
1026 savelij 1504
                LD (CPU3+0x20),A                ; меняем байт для нарушения CRC контроля и полного реинита
1505
                LD A,(CPU1+BUF_TABLVOL+0xFE)
801 savelij 1506
                XOR B
1026 savelij 1507
                LD (CPU1+BUF_TABLVOL+0xFE),A    ; аналогично для DEVICE MANAGER
999 savelij 1508
        PEC_OFF M_FLASH_BF
1026 savelij 1509
                LD HL,0x79ED                    ; OUT (C),A
1510
                LD (0xFFFE),HL                  ; укладка команды OUT (C),A
1511
                LD BC,0xBC77
801 savelij 1512
                LD A,2
1026 savelij 1513
                JP 0xFFFE
801 savelij 1514
 
999 savelij 1515
; прошивание одной 64КБ страницы
1516
; вход: A = номер 16КБ страницы откуда брать байты для прошивания
1517
;       E = номер прошиваемой 64КБ страницы
801 savelij 1518
FLASH_64KB      LD HL,0
1519
                PUSH AF
1520
                LD A,E
1521
                ADD A,2
999 savelij 1522
                CALL SETWIN_INDICAT             ; обновление индикатора процесса
801 savelij 1523
                POP AF
1524
FLASHER2        PUSH AF
1525
                LD BC,WIN_P0
999 savelij 1526
                OUT (C),A                       ; включение страницы RAM откуда брать байты для прошивания
801 savelij 1527
                PUSH IX
1528
                LD IX,0
999 savelij 1529
FLASHER1        LD A,(IX)                       ; взяли байт для прошивания
801 savelij 1530
                INC A
999 savelij 1531
                JR Z,FLASHER5                   ; если байт = 0xFF, то не прошиваем
801 savelij 1532
                DEC A
999 savelij 1533
                CALL PGM_BYTE                   ; прошили байт
801 savelij 1534
FLASHER5        INC IX
1535
                INC HL
1536
                LD A,H
1026 savelij 1537
                AND 0x0F
801 savelij 1538
                OR L
999 savelij 1539
                CALL Z,INC_INDICAT              ; обновили индикатор если прошили 4КБ
801 savelij 1540
                LD A,IXH
1026 savelij 1541
                AND 0x40
999 savelij 1542
                JR Z,FLASHER1                   ; продолжаем пока не кончится страница выборки байт
801 savelij 1543
                POP IX
1544
                POP AF
999 savelij 1545
                INC A                           ; следующая страница откуда байты брать для прошивания
1546
                LD D,A                          ; временно сохранили
1547
                LD A,H                          ; проверка на окончание 64КБ страницы 
801 savelij 1548
                AND A
999 savelij 1549
                LD A,D                          ; восстановили
801 savelij 1550
                JR NZ,FLASHER2
1551
                RET