Subversion Repositories pentevo

Rev

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

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