Subversion Repositories pentevo

Rev

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

Rev Author Line No. Line
507 savelij 1
 
1120 savelij 2
; LAST UPDATE: 10.02.2024 savelij
507 savelij 3
 
1120 savelij 4
                include macros.a80
5
                include define.a80
6
                include global_vars.a80
7
                include ports_ngs.a80
8
                include sdcomand.a80
9
                include ports_ide.a80
10
                include nums_devices.a80
11
                include fat_dir.a80
680 savelij 12
 
1120 savelij 13
 INIT_VAR DRV_VAR
14
 SETVAR BUF_512_,       0x200                           ; буфер сектора
961 savelij 15
                include ../../fat_vars.a80
1120 savelij 16
 SETVAR_ALIGN
17
 SUBVAR (WORD + WORD + BYTE + BYTE)
18
 SETVAR LENGHT,         WORD                            ; длина файла в байтах
19
 SETVAR LOADSCS1,       WORD                            ; адрес вызываемого драйвера
20
 SETVAR MAS_SLA,        BYTE                            ; маска для MASTER/SLAVE
21
 SETVAR NUM_DEVICE,     BYTE                            ; номер устройства для запуска кода
680 savelij 22
 
1120 savelij 23
                ORG INITVAR
24
 
25
; на входе: A - номер выбранного устройства
26
;        BCDE - номер кластера запускаемого файла
507 savelij 27
                DI
28
                LD A,(NUM_DEVICE)
831 savelij 29
                CP _SD_SDZ
1120 savelij 30
                LD HL,READ_ZSD                          ; драйвер SD ZC карты           
507 savelij 31
                JR Z,SETLOADER
831 savelij 32
                CP _SD_SDG
1120 savelij 33
                LD HL,READ_NEOGS                        ; драйвер SD NGS карты
507 savelij 34
                JR Z,SETLOADER
831 savelij 35
                CP _HDD_NEMO_MASTER
1120 savelij 36
                LD HL,RD_HDD_NEMO                       ; драйвер HDD NEMO
37
        IFDEF ALL_DRVS
507 savelij 38
                JR Z,SETLOADER
831 savelij 39
                CP _HDD_SMUC_MASTER
1120 savelij 40
                LD HL,RD_HDD_SMUC                       ; драйвер HDD SMUC
585 savelij 41
                JR Z,SETLOADER
831 savelij 42
                CP _HDD_DIVIDE_MASTER
1120 savelij 43
                LD HL,RD_HDD_DIVIDE                     ; драйвер HDD DIVIDE
585 savelij 44
                JR Z,SETLOADER
1120 savelij 45
                LD HL,RD_HDD_PROFI                      ; драйвер HDD PROFI
46
        ENDIF
47
SETLOADER       LD (LOADSCS1),HL                        ; установили адрес читалки секторов
507 savelij 48
                LD A,(MAS_SLA)
49
                AND A
1120 savelij 50
                LD A,0xE0
507 savelij 51
                JR Z,SETMASL
1120 savelij 52
                LD A,0xF0
507 savelij 53
SETMASL         LD (MAS_SLA),A
1120 savelij 54
                LD BC,(FILE_SRC + _DIR_FstClusHI)
961 savelij 55
                LD (AFILCLS+2),BC
1120 savelij 56
                LD DE,(FILE_SRC + _DIR_FstClusLO)
961 savelij 57
                LD (AFILCLS),DE
1120 savelij 58
                LD A,(FILE_SRC + _DIR_Ext + 1)
706 Dimkam 59
                CP "P"
1120 savelij 60
                JP Z,RUNSPG2                            ; переход на запуск SPG файла
706 Dimkam 61
                CP "N"
1120 savelij 62
                JP Z,RUNSNA                             ; переход на запуск SNA файла
63
                CALL REALSEC                            ; преобразовали в номер сектора
64
                CALL LOADLST                            ; загрузили в буфер
507 savelij 65
                EXX
1120 savelij 66
                LD HL,(BUF_512_ + _DIR_Ext + 1)
67
                LD (0x5D45),HL                          ; адрес старта кода
68
                LD HL,(BUF_512_ + _DIR_Attr)
69
                LD (LENGHT),HL                          ; установка длины файла в байтах
70
                LD DE,0x11
71
                ADD HL,DE                               ; пропуск HOBETA заголовка
507 savelij 72
                LD A,L
73
                AND A
1120 savelij 74
                JR Z,READ01                             ; если младший байт не 0
75
                INC H                                   ; старший +1
507 savelij 76
READ01          LD A,H
1120 savelij 77
                SRL A                                   ; делим на 2 ибо на FAT сектор 512 байт
78
                ADC A,0                                 ; учитываем чет/нечет
79
                DEC A                                   ; первый сектор загружен, грузить на 1 меньше
507 savelij 80
                EXX
1120 savelij 81
                JP Z,LDIRBUF                            ; если сектор 1 перенос и запуск
961 savelij 82
                DEC A
1120 savelij 83
                LD IXL,A                                ; запомнили количество секторов - 1
84
                JP Z,READ08                             ; если файл влез в 2 сектора
507 savelij 85
                EXX
1120 savelij 86
                CALL LD_ONES                            ; перенос остатков первого сектора
87
                PUSH DE                                 ; адрес куда далее грузить
507 savelij 88
                EXX
1120 savelij 89
                LD HL,1                                 ; один сектор уже загружен
90
                ADD HL,DE                               ; далее грузить со следующего сектора 
507 savelij 91
                EX DE,HL
92
                JR NC,READ04
1120 savelij 93
                INC BC                                  ; BCDE = BCDE + 1
94
READ04          POP HL                                  ; в HL адрес для продолжения загрузки
95
                LD IY,(SecPerClus)                      ; LY = количество секторов в кластере
507 savelij 96
                LD A,IXL
1120 savelij 97
                CP IYL                                  ; секторов осталось меньше чем в кластере
98
                JR C,READ02                             ; переход на дозагрузку остатка секторов
507 savelij 99
                INC IXL
100
                LD A,IYL
101
                CP 2
102
                JR C,READ07
103
                DEC A
104
                JR READ05
105
 
106
READ07          PUSH HL
961 savelij 107
                LD DE,(AFILCLS)
108
                LD BC,(AFILCLS + 2)
1120 savelij 109
                CALL RD_NEXT_CLUSTER                    ; получить номер следующего кластера
961 savelij 110
                LD (AFILCLS),DE
111
                LD (AFILCLS + 2),BC
1120 savelij 112
                CALL CHECK_LAST_CLUSTER                 ; проверка на окончание FAT цепочки
507 savelij 113
                POP HL
1120 savelij 114
                JR C,RUNLOAD                            ; если кластера закончились, то запуск загруженного
507 savelij 115
                PUSH HL
1120 savelij 116
                CALL REALSEC                            ; преобразование номера кластера в номер сектора
507 savelij 117
                POP HL
1120 savelij 118
                LD A,IXL                                ; сколько секторов осталось загрузить
119
                CP IYL                                  ; сравниваем с размером кластера
120
                JR C,READ02                             ; если осталось загрузить секторов меньше чем в кластере, то дозагружаем остаток
121
                LD A,IYL                                ; сколько секторов загружать
122
READ05          CALL LOADSCS                            ; загрузка секторов
123
                LD A,IXL                                ; сколько секторов всего загружать
124
                SUB IYL                                 ; минус сколько секторов только что загрузили
125
                JR Z,RUNLOAD                            ; сектора кончились, переходим на запуск
126
                LD IXL,A                                ; сколько секторов осталось загрузить
127
                JR READ07                               ; продолжаем загрузку
507 savelij 128
 
961 savelij 129
; размер кода в Hobeta менее 2 секторов
130
; копируем хвост первого сектора и догружаем из второго с переносом
131
READ08          EXX
132
                CALL LD_ONES
133
                PUSH DE
134
                EXX
135
                POP HL
136
                LD IXL,1
137
                JR READ03
138
 
1120 savelij 139
; загрузка количества секторов, если осталось менее размера кластера
507 savelij 140
READ02          AND A
141
                JR Z,READ03
142
                CALL LOADSCS
143
READ03          PUSH HL
144
                LD A,IXL
145
                LD L,A
146
                LD H,0
147
                ADD HL,DE
148
                EX DE,HL
149
                JR NC,READ06
150
                INC BC
151
READ06          CALL LOADLST
152
                LD BC,(LENGHT)
153
                EX DE,HL
1120 savelij 154
                LD HL,0x11
507 savelij 155
                ADD HL,BC
156
                LD B,H
157
                LD C,L
158
                EX DE,HL
159
                POP DE
160
                LD A,B
161
                AND 1
162
                LD B,A
605 savelij 163
                OR C
164
                JR Z,RUNLOAD
507 savelij 165
                LDIR
1120 savelij 166
; запуск загруженного
167
RUNLOAD         LD HL,0x2758
507 savelij 168
                EXX
1120 savelij 169
                LD IY,0x5C3A
507 savelij 170
                EI
1120 savelij 171
                JP 0x1B7D                               ; запуск перенесенной бейсик проги
507 savelij 172
 
1120 savelij 173
LDIRBUF         LD HL,0x200 - 0x11
174
                LD DE,(BUF_512_ + 0x0B)
507 savelij 175
                AND A
176
                SBC HL,DE
177
                JR NC,LDIRBUF1
178
                CALL LD_ONES
179
                JP RUNLOAD
180
 
1120 savelij 181
LDIRBUF1        LD HL,BUF_512_ + 0x11
182
                LD DE,(BUF_512_ + 9)
183
                LD BC,(BUF_512_ + 0x0B)
507 savelij 184
                LDIR
185
                JP RUNLOAD
186
 
1120 savelij 187
; перенос куска из уже загруженного сектора, если файл = 501 байт и менее
188
LD_ONES         LD HL,BUF_512_ + 0x11
189
                LD DE,(BUF_512_ + 9)
190
                LD BC,0x200-0x11
507 savelij 191
                LDIR
192
                RET
193
 
1120 savelij 194
; загрузить сектора с выбранного устройства
507 savelij 195
LOADSCS         PUSH HL
196
                LD HL,(LOADSCS1)
197
                EX (SP),HL
198
                RET
199
 
961 savelij 200
; чтение файла
201
; BCDE - номер кластера откуда грузить
202
; IXL - размер кластера 
203
; IXH - временные переменные
204
; IYL - количество секторов для загрузки
205
; IYH - смещение в кластере
1120 savelij 206
LOAD_FILE       PUSH BC                                 ; старшие 16 бит номера кластера
207
                PUSH DE                                 ; младшие 16 бит номера кластера
208
                PUSH HL                                 ; сохранили адрес загрузки
209
                CALL REALSEC                            ; перевели номер кластера в номер сектора
961 savelij 210
                LD IX,(SecPerClus)
1120 savelij 211
                LD A,IYH                                ; смещение в кластере
507 savelij 212
                LD L,A
213
                LD H,0
214
                ADD HL,DE
215
                EX DE,HL
1120 savelij 216
                JR NC,.L1
217
                INC BC                                  ; BCDE = номер сектора откуда грузить
218
.L1             LD A,IYL                                ; количество секторов для загрузки
219
                CP IXL                                  ; размер кластера
220
                JP C,.L2
221
                LD A,IXL                                ; размер кластера
222
.L2             ADD A,IYH                               ; смещение в кластере
223
                CP IXL                                  ; размер кластера
224
                LD A,IYL                                ; количество секторов для загрузки
225
                JP C,.L5
226
                LD A,IXL                                ; размер кластера
227
                SUB IYH                                 ; смещение в кластере
228
.L5             LD IXH,A                                ; TEMP VAR, сколько секторов сейчас грузим
229
                POP HL                                  ; восстановили адрес загрузки
230
                CALL LOADSCS                            ; загрузили сектора
507 savelij 231
                POP DE
1120 savelij 232
                POP BC                                  ; восстановили номер кластера
233
                LD A,IYH                                ; смещение в кластере
234
                ADD A,IXH                               ; TEMP VAR
235
                CP IXL                                  ; размер кластера
236
                JP C,.L3
237
                SUB IXL                                 ; размер кластера
238
.L3             LD IYH,A                                ; смещение в кластере
239
                JP C,.L4
240
                PUSH HL                                 ; сохранили адрес загрузки
241
                CALL RD_NEXT_CLUSTER                    ; прочитали номер следующего кластера
242
                CALL CHECK_LAST_CLUSTER                 ; проверили, а может это последний кластер?
243
                POP HL                                  ; восстановили адрес загрузки
244
                RET C                                   ; если последний, выходим
245
.L4             LD A,IYL                                ; количество секторов для загрузки
246
                SUB IXH                                 ; TEMP VAR
507 savelij 247
                RET Z
1120 savelij 248
                LD IYL,A                                ; количество секторов для загрузки
249
                JP NZ,LOAD_FILE
507 savelij 250
                RET
251
 
1120 savelij 252
; проверка номера кластера
253
CHECK_LAST_CLUSTER
254
                LD A,(FATType)
507 savelij 255
                AND A
1120 savelij 256
                JR NZ,.L1
257
                LD HL,0x0FF7
507 savelij 258
                SBC HL,DE
259
                RET
260
 
1120 savelij 261
.L1             DEC A
262
                JR NZ,.L2
263
                LD HL,0xFFF7
507 savelij 264
                SBC HL,DE
265
                RET
266
 
1120 savelij 267
.L2             LD HL,0x0FFF
507 savelij 268
                SBC HL,BC
269
                RET NZ
1120 savelij 270
                LD HL,0xFFF7
507 savelij 271
                SBC HL,DE
272
                RET
273
 
1120 savelij 274
; чтение следующего кластера
275
RD_NEXT_CLUSTER LD A,(FATType)
507 savelij 276
                AND A
1120 savelij 277
                JR Z,.L1
507 savelij 278
                DEC A
1120 savelij 279
                JR Z,.L2
507 savelij 280
                EX DE,HL
281
                ADD HL,HL
282
                EX DE,HL
283
                LD HL,0
284
                ADC HL,BC
1120 savelij 285
                ADD HL,BC                               ; HLDE = BCDE * 2
507 savelij 286
                LD A,E
287
                LD E,D
288
                LD D,L
289
                LD C,H
290
                LD B,0
1120 savelij 291
                CALL .L3
507 savelij 292
                INC HL
293
                LD C,(HL)
294
                INC HL
295
                LD B,(HL)
296
                RET
297
 
1120 savelij 298
.L2             LD BC,0
507 savelij 299
                LD A,E
300
                LD E,D
301
                LD D,C
1120 savelij 302
.L3             PUSH AF
507 savelij 303
                PUSH BC
961 savelij 304
                LD HL,NumSecFAT1
507 savelij 305
                CALL BCDEHLP
306
                CALL LOADLST
307
                POP BC
308
                POP AF
309
                LD E,A
310
                LD D,0
311
                ADD HL,DE
312
                ADD HL,DE
313
                LD E,(HL)
314
                INC HL
315
                LD D,(HL)
961 savelij 316
                RET
507 savelij 317
 
1120 savelij 318
.L1             LD H,D
507 savelij 319
                LD L,E
320
                ADD HL,HL
321
                ADD HL,DE
322
                SRL H
323
                RR L
324
                LD A,E
325
                LD E,H
326
                LD D,0
327
                LD B,D
328
                LD C,D
329
                SRL E
330
                PUSH AF
331
                PUSH HL
961 savelij 332
                LD DE,(NumSecFAT1)
333
                LD BC,(NumSecFAT1 + 2)
507 savelij 334
                CALL LOADLST
335
                POP BC
336
                LD A,B
337
                AND 1
338
                LD B,A
339
                ADD HL,BC
340
                LD B,(HL)
341
                INC HL
342
                LD A,H
1120 savelij 343
                CP HIGH (BUF_512) + 2
344
                JR NZ,.L4
507 savelij 345
                PUSH BC
346
                LD BC,0
347
                INC DE
348
                CALL LOADLST
349
                POP BC
1120 savelij 350
.L4             POP AF
507 savelij 351
                LD D,(HL)
352
                LD E,B
353
                LD BC,0
354
                RRA
1120 savelij 355
                JR NC,.L5
961 savelij 356
        REPT 4
507 savelij 357
                SRL D
358
                RR E
961 savelij 359
        ENDM
1120 savelij 360
.L5             LD A,D
361
                AND 0x0F
507 savelij 362
                LD D,A
961 savelij 363
                RET
507 savelij 364
 
1120 savelij 365
; преобразование номера кластера
366
; вычисление реального сектора
367
; на входе:  BCDE = номер кластера
368
; на выходе: BCDE = номер сектора
961 savelij 369
REALSEC         LD A,B
507 savelij 370
                OR C
371
                OR D
372
                OR E
373
                JR NZ,REALSE1
961 savelij 374
                LD DE,(NumSecRootDir)
375
                LD BC,(NumSecRootDir + 2)
376
                RET
507 savelij 377
 
1120 savelij 378
REALSE1         LD HL,0xFFFE
507 savelij 379
                EX DE,HL
380
                ADD HL,DE
381
                EX DE,HL
382
                INC HL
1120 savelij 383
                ADC HL,BC                               ; номер кластера - 2
961 savelij 384
                LD A,(SecPerClus)
385
                JR REALSE2
507 savelij 386
 
961 savelij 387
REALSE3         SLA E
507 savelij 388
                RL D
389
                RL L
390
                RL H
961 savelij 391
REALSE2         RRCA
1120 savelij 392
                JR NC,REALSE3                           ; умножили на размер кластера
507 savelij 393
                LD B,H
394
                LD C,L
961 savelij 395
                LD HL,FirstSecData
1120 savelij 396
                JP BCDEHLP                              ; прибавили смещение от начала раздела
507 savelij 397
 
1120 savelij 398
; BCDE / 512
507 savelij 399
BCDE200         LD E,D
400
                LD D,C
401
                LD C,B
402
                LD B,0
403
                LD A,2
404
                JR BCDE_A
405
 
1120 savelij 406
; BCDE >> A = BCDE
507 savelij 407
BCDE_A1         SRL B
408
                RR C
409
                RR D
410
                RR E
411
BCDE_A          RRCA
412
                JR NC,BCDE_A1
413
                RET
414
 
1120 savelij 415
; (ADR) - BCDE = BCDE
507 savelij 416
BCDEHLM         LD A,(HL)
417
                INC HL
418
                SUB E
419
                LD E,A
420
                LD A,(HL)
421
                INC HL
422
                SBC A,D
423
                LD D,A
424
                LD A,(HL)
425
                INC HL
426
                SBC A,C
427
                LD C,A
428
                LD A,(HL)
429
                SBC A,B
430
                LD B,A
431
                RET
432
 
1120 savelij 433
; (ADR) + BCDE = BCDE
507 savelij 434
BCDEHLP         LD A,(HL)
435
                INC HL
436
                ADD A,E
437
                LD E,A
438
                LD A,(HL)
439
                INC HL
440
                ADC A,D
441
                LD D,A
442
                LD A,(HL)
443
                INC HL
444
                ADC A,C
445
                LD C,A
446
                LD A,(HL)
447
                ADC A,B
448
                LD B,A
449
                RET
450
 
1120 savelij 451
; HLDE + BC = HLDE
507 savelij 452
HLDEPBC         EX DE,HL
453
                ADD HL,BC
454
                EX DE,HL
455
                LD BC,0
456
                ADC HL,BC
457
                RET
458
 
1120 savelij 459
; загрузка сектора в буфер
573 savelij 460
LOADLST         LD HL,BUF_512_
507 savelij 461
                PUSH HL
462
                LD A,1
463
                CALL LOADSCS
464
                POP HL
465
                RET
466
 
680 savelij 467
                include drivers/drv_zc.a80
468
                include drivers/drv_neogs.a80
469
                include drivers/drv_nemo.a80
1120 savelij 470
        IFDEF ALL_DRVS
680 savelij 471
                include drivers/drv_smuc.a80
472
                include drivers/drv_divide.a80
473
                include drivers/drv_profi.a80
1120 savelij 474
        ENDIF
680 savelij 475
                include spg2_run.a80
706 Dimkam 476
                include sna_run.a80