Subversion Repositories pentevo

Rev

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

Rev Author Line No. Line
13 ddp 1
.NOLIST
288 ddp 2
.INCLUDE "m128def.inc"
3
.INCLUDE "_macros.asm"
79 ddp 4
 
5
.MACRO  SDCS_SET
6
        SBI     PORTB,0
7
.ENDMACRO
8
 
9
.MACRO  SDCS_CLR
10
        CBI     PORTB,0
11
.ENDMACRO
12
 
13
.MACRO  LED_ON
14
        CBI     PORTB,7
15
.ENDMACRO
16
 
17
.MACRO  LED_OFF
18
        SBI     PORTB,7
19
.ENDMACRO
20
 
13 ddp 21
.LIST
22
.LISTMAC
23
 
24
.DEF    POLY_LO =R06    ;всегда = $21
25
.DEF    POLY_HI =R07    ;всегда = $10
26
.DEF    FF_FL   =R08
27
.DEF    CRC_LO  =R09
28
.DEF    CRC_HI  =R10
29
.DEF    ADR1    =R11
30
.DEF    ADR2    =R12
31
.DEF    FF      =R13    ;всегда = $FF
32
.DEF    ONE     =R14    ;всегда = $01
33
.DEF    NULL    =R15    ;всегда = $00
34
.DEF    DATA    =R16
35
.DEF    TEMP    =R17
36
.DEF    COUNT   =R18
37
.DEF    BITS    =R19
38
.DEF    GUARD   =R22
39
;локально используются: R0,R1,R20,R21,R24,R25
40
 
41
.EQU    DBSIZE_HI       =HIGH(4096)
42
.EQU    DBMASK_HI       =HIGH(4095)
43
.EQU    nCONFIG         =PORTF0
44
.EQU    nSTATUS         =PORTF1
45
.EQU    CONF_DONE       =PORTF2
46
 
42 ddp 47
.EQU    SOH             =$01
48
.EQU    EOT             =$04
49
.EQU    ACK             =$06
50
.EQU    NAK             =$15
51
.EQU    CAN             =$18
13 ddp 52
 
42 ddp 53
.EQU    CMD_17          =$51    ;read_single_block
54
.EQU    ACMD_41         =$69    ;sd_send_op_cond
13 ddp 55
 
42 ddp 56
.EQU    ANSI_RED        =$31
57
.EQU    ANSI_GREEN      =$32
58
.EQU    ANSI_YELLOW     =$33
59
.EQU    ANSI_WHITE      =$37
60
 
183 ddp 61
.EQU    FLASHSIZE=480   ;размер обновляемой области FLASH в блоках по 256 байт
79 ddp 62
.EQU    MAIN_VERS=$EFF8 ;указатель на описатель версии осн.прошивки
63
;
64
;--------------------------------------
65
;
13 ddp 66
.DSEG
67
        .ORG    $0100
68
BUFFER:                 ;главный буфер
69
        .ORG    $0200
70
BUFSECT:                ;буфер сектора
71
        .ORG    $0400
72
BUF4FAT:                ;временный буфер (FAT и т.п.)
73
        .ORG    $0600
74
HEADER:                 ;заголовок файла
75
        .ORG    $0680
76
CAL_FAT:.BYTE   1       ;тип обнаруженной FAT
77
MANYFAT:.BYTE   1       ;количество FAT-таблиц
78
BYTSSEC:.BYTE   1       ;количество секторов в кластере
79
ROOTCLS:.BYTE   4       ;сектор начала root директории
80
SEC_FAT:.BYTE   4       ;количество секторов одной FAT
81
RSVDSEC:.BYTE   2       ;размер резервной области
82
STARTRZ:.BYTE   4       ;начало диска/раздела
83
FRSTDAT:.BYTE   4       ;адрес первого сектора данных от BPB
84
SEC_DSC:.BYTE   4       ;количество секторов на диске/разделе
85
CLS_DSC:.BYTE   4       ;количество кластеров на диске/разделе
86
FATSTR0:.BYTE   4       ;начало первой FAT таблицы
87
FATSTR1:.BYTE   4       ;начало второй FAT таблицы
88
TEK_DIR:.BYTE   4       ;кластер текущей директории
89
KCLSDIR:.BYTE   1       ;кол-во кластеров директории
90
NUMSECK:.BYTE   1       ;счетчик секторов в кластере
91
TFILCLS:.BYTE   4       ;текущий кластер
92
MPHWOST:.BYTE   1       ;кол-во секторов в последнем кластере
79 ddp 93
KOL_CLS:.BYTE   4       ;кол-во кластеров файла минус 1
313 ddp 94
SDHC:   .BYTE   1
42 ddp 95
STEP:
96
SDERROR:.BYTE   1
79 ddp 97
LASTSECFLAG:
98
        .BYTE   1
99
;
100
;--------------------------------------
101
;
13 ddp 102
.CSEG
79 ddp 103
        .ORG    $F000
13 ddp 104
BOOTLOADER_BEGIN:
105
RESET:  CLI
79 ddp 106
;Причина реcета? Если Watchdog то на основную программу
13 ddp 107
        IN      DATA,MCUCSR
79 ddp 108
        ANDI    DATA,0B00001000
109
        BREQ    START1
13 ddp 110
        JMP     0
111
;
112
BAD_BOOTLDR_CRC:
113
START1: CLR     NULL
114
        LDI     GUARD,$5A
115
        LDI     TEMP,$01
116
        MOV     ONE,TEMP
117
        LDI     TEMP,$FF
118
        MOV     FF,TEMP
119
        LDI     TEMP,$21
120
        MOV     POLY_LO,TEMP
121
        LDI     TEMP,$10
122
        MOV     POLY_HI,TEMP
123
;WatchDog OFF, если вдруг включен
124
        LDI     TEMP,0B00011111
125
        OUT     WDTCR,TEMP
126
        OUT     WDTCR,NULL
79 ddp 127
;
128
        LED_ON
13 ddp 129
        SBI     DDRB,7
79 ddp 130
;стек
13 ddp 131
        LDI     TEMP,LOW(RAMEND)
132
        OUT     SPL,TEMP
133
        LDI     TEMP,HIGH(RAMEND)
134
        OUT     SPH,TEMP
135
;проверка CRC загрузчика
136
        LDIZ    BOOTLOADER_BEGIN*2              ;адрес в байтах
137
        OUT     RAMPZ,ONE
138
        LDIY    BOOTLOADER_END-BOOTLOADER_BEGIN ;длина в словах
139
        RCALL   CALK_CRC_FLASH
42 ddp 140
        BRNE    BAD_BOOTLDR_CRC ;что делать, если не правильная crc у bootloaderа ? я делаю перезапуск.
13 ddp 141
;хочет ли пользователь обновиться ?
68 ddp 142
        SBIS    PINC,7           ;нажат "SoftReset" ?
143
        RJMP    UPDATE_ME
79 ddp 144
;проверка CRC осн.программы
42 ddp 145
START8: RCALL   CRCMAIN
13 ddp 146
        BRNE    UPDATE_ME        ;если некорректная CRC
79 ddp 147
;
148
;запуск watchdog-а (по срабатыванию переход на осн.программу)
173 ddp 149
START9: CBI     PORTE,6
150
        LDI     TEMP,0B00011000
13 ddp 151
        OUT     WDTCR,TEMP
152
GAVGAV: RJMP    GAVGAV
153
;
79 ddp 154
;--------------------------------------
155
;проверка CRC осн.программы после обновления
42 ddp 156
CHECKIT:RCALL   NEWLINE
157
        LDIZ    MSG_RECHECK*2
158
        RCALL   PRINTSTRZ
159
        RCALL   CRCMAIN
160
        BRNE    CHK_BAD
161
        LDIZ    MSG_MAINOK*2
162
        RCALL   PRINTSTRZ
163
        RCALL   NEWLINE2
164
        LDIZ    MSG_MAIN*2
165
        RCALL   PRINTSTRZ
166
        LDIZ    MAIN_VERS*2
167
        RCALL   PRINTVERS
168
        RCALL   NEWLINE2
169
        RJMP    START9
170
;
171
CHK_BAD:LDI     DATA,ANSI_RED
172
        RCALL   ANSI_COLOR
173
        LDIZ    MSG_MAINBAD*2
174
        RCALL   PRINTSTRZ
175
        RCALL   DELAY_3SEC
176
;
13 ddp 177
;--------------------------------------
178
;
179
UPDATE_ME:
180
        LDI     TEMP,      0B01111001 ;
79 ddp 181
        OUT     PORTB,TEMP
13 ddp 182
        LDI     TEMP,      0B10000111 ; LED on, spi outs
79 ddp 183
        OUT     DDRB,TEMP
42 ddp 184
 
185
        LDI     TEMP,      0B00001000 ; ATX on
186
        OUTPORT DDRF,TEMP
187
        OUTPORT PORTF,TEMP
13 ddp 188
;SPI init
189
        LDI     TEMP,(1<<SPI2X)
190
        OUT     SPSR,TEMP
191
        LDI     TEMP,(1<<SPE)|(1<<DORD)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)
192
        OUT     SPCR,TEMP
193
;UART1 Set baud rate
194
        OUTPORT UBRR1H,NULL
68 ddp 195
        LDI     TEMP,5     ;115200 baud @ 11059.2 kHz, Normal speed
13 ddp 196
        OUTPORT UBRR1L,TEMP
197
;UART1 Normal Speed
198
        OUTPORT UCSR1A,NULL
199
;UART1 data8bit, 2stopbits
200
        LDI     TEMP,(1<<UCSZ1)|(1<<UCSZ0)|(1<<USBS)
201
        OUTPORT UCSR1C,TEMP
202
;UART1 Разрешаем передачу
203
        LDI     TEMP,(1<<TXEN)
204
        OUTPORT UCSR1B,TEMP
79 ddp 205
;вывод информации о версиях
42 ddp 206
        LDIZ    MSG_TITLE*2
207
        RCALL   PRINTSTRZ
208
        LDIZ    MSG_BOOT*2
209
        RCALL   PRINTSTRZ
210
        LDIZ    BOOT_VERS*2
211
        RCALL   PRINTVERS
212
        RCALL   NEWLINE
213
        LDIZ    MSG_MAIN*2
214
        RCALL   PRINTSTRZ
215
        TST     CRC_LO
216
        BREQ    UP01
217
        LDIZ    MSG_BADCRC*2
218
        RCALL   PRINTSTRZ
219
        RJMP    UP02
220
UP01:   LDIZ    MAIN_VERS*2
221
        RCALL   PRINTVERS
79 ddp 222
UP02:   RCALL   NEWLINE
223
;ждём включения ATX, а потом ещё чуть-чуть.
68 ddp 224
UP11:   SBIS    PINF,0 ;PINC,5 ; а если powergood нет вообще ?
42 ddp 225
        RJMP    UP11
68 ddp 226
        LDI     DATA,5
227
        RCALL   DELAY
42 ddp 228
 
79 ddp 229
        LDIZ    MSG_CFGFPGA*2
42 ddp 230
        RCALL   PRINTSTRZ
79 ddp 231
;загрузка FPGA
13 ddp 232
        INPORT  TEMP,DDRF
233
        SBR     TEMP,(1<<nCONFIG)
234
        OUTPORT DDRF,TEMP
235
 
236
        LDI     TEMP,147 ;40 us @ 11.0592 MHz
237
LDFPGA1:DEC     TEMP    ;1
238
        BRNE    LDFPGA1 ;2
239
 
240
        INPORT  TEMP,DDRF
241
        CBR     TEMP,(1<<nCONFIG)
242
        OUTPORT DDRF,TEMP
243
 
79 ddp 244
LDFPGA2:SBIS    PINF,nSTATUS
245
        RJMP    LDFPGA2
13 ddp 246
 
247
        LDIZ    PACKED_FPGA*2
248
        OUT     RAMPZ,ONE
249
        LDIY    BUFFER
250
;(не трогаем стек! всё ОЗУ под буфер)
68 ddp 251
        LDI     TEMP,$80
252
MS:     ELPM    R0,Z+
13 ddp 253
        ST      Y+,R0
254
;-begin-PUT_BYTE_1---
255
        OUT     SPDR,R0
79 ddp 256
PUTB1:  SBIS    SPSR,SPIF
13 ddp 257
        RJMP    PUTB1
258
;-end---PUT_BYTE_1---
259
        SUBI    YH,HIGH(BUFFER) ;
260
        ANDI    YH,DBMASK_HI    ;Y warp
261
        ADDI    YH,HIGH(BUFFER) ;
68 ddp 262
M0:     LDI     R21,$02
13 ddp 263
        LDI     R20,$FF
68 ddp 264
M1:
265
M1X:    ADD     TEMP,TEMP
266
        BRNE    M2
267
        ELPM    TEMP,Z+
268
        ROL     TEMP
269
M2:     ROL     R20
270
        BRCC    M1X
271
        DEC     R21
13 ddp 272
        BRNE    X2
68 ddp 273
        LDI     DATA,2
274
        ASR     R20
275
        BRCS    N1
276
        INC     DATA
277
        INC     R20
278
        BREQ    N2
279
        LDI     R21,$03
13 ddp 280
        LDI     R20,$3F
68 ddp 281
        RJMP    M1
282
X2:     DEC     R21
13 ddp 283
        BRNE    X3
68 ddp 284
        LSR     R20
285
        BRCS    MS
286
        INC     R21
287
        RJMP    M1
288
X6:     ADD     DATA,R20
289
N2:     LDI     R21,$04
290
        LDI     R20,$FF
291
        RJMP    M1
292
N1:     INC     R20
293
        BRNE    M4
294
        INC     R21
295
N5:     ROR     R20
296
        BRCS    DEMLZEND
297
        ROL     R21
298
        ADD     TEMP,TEMP
299
        BRNE    N6
300
        ELPM    TEMP,Z+
301
        ROL     TEMP
302
N6:     BRCC    N5
303
        ADD     DATA,R21
304
        LDI     R21,6
305
        RJMP    M1
306
X3:     DEC     R21
307
        BRNE    X4
308
        LDI     DATA,1
309
        RJMP    M3
310
X4:     DEC     R21
13 ddp 311
        BRNE    X5
68 ddp 312
        INC     R20
313
        BRNE    M4
314
        LDI     R21,$05
13 ddp 315
        LDI     R20,$1F
68 ddp 316
        RJMP    M1
317
X5:     DEC     R21
318
        BRNE    X6
319
        MOV     R21,R20
320
M4:     ELPM    R20,Z+
321
M3:     DEC     R21
322
        MOV     XL,R20
323
        MOV     XH,R21
324
        ADD     XL,YL
13 ddp 325
        ADC     XH,YH
326
LDIRLOOP:
327
        SUBI    XH,HIGH(BUFFER) ;
328
        ANDI    XH,DBMASK_HI    ;X warp
329
        ADDI    XH,HIGH(BUFFER) ;
68 ddp 330
        LD      R0,X+
13 ddp 331
        ST      Y+,R0
332
;-begin-PUT_BYTE_2---
333
        OUT     SPDR,R0
79 ddp 334
PUTB2:  SBIS    SPSR,SPIF
13 ddp 335
        RJMP    PUTB2
336
;-end---PUT_BYTE_2---
337
        SUBI    YH,HIGH(BUFFER) ;
338
        ANDI    YH,DBMASK_HI    ;Y warp
339
        ADDI    YH,HIGH(BUFFER) ;
340
        DEC     DATA
341
        BRNE    LDIRLOOP
68 ddp 342
        RJMP    M0
343
;теперь можно юзать стек
344
DEMLZEND:
345
        SBIS    PINF,CONF_DONE
346
        RJMP    DEMLZEND
13 ddp 347
;SPI reinit
348
        LDI     TEMP,(1<<SPE)|(0<<DORD)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)
349
        OUT     SPCR,TEMP
173 ddp 350
        SBI     PORTE,6
79 ddp 351
        LED_OFF
42 ddp 352
        RCALL   NEWLINE
353
        LDIZ    MSG_TRYUPDATE*2
354
        RCALL   PRINTSTRZ
355
        LDIZ    MSG__SDCARD*2
356
        RCALL   PRINTSTRZ
13 ddp 357
;
358
;--------------------------------------
359
;инициализация SD карточки
313 ddp 360
        STS     SDHC,NULL
173 ddp 361
        SDCS_SET
13 ddp 362
        LDI     TEMP,32
363
        RCALL   SD_RD_DUMMY
173 ddp 364
        SDCS_CLR
313 ddp 365
        SER     COUNT
366
SDINIT1:LDIZ    CMD00*2     ;CMD0 (go_idle_state)
13 ddp 367
        RCALL   SD_WR_PGM_6
313 ddp 368
        DEC     COUNT
13 ddp 369
        BRNE    SDINIT2
313 ddp 370
        LDI     DATA,1  ;нет карты
13 ddp 371
        RJMP    SD_ERROR
372
SDINIT2:CPI     DATA,$01
373
        BRNE    SDINIT1
374
 
313 ddp 375
        LDIZ    CMD08*2     ;CMD8 (send_if_cond)
13 ddp 376
        RCALL   SD_WR_PGM_6
377
        LDI     R24,$00
378
        SBRS    DATA,2
379
        LDI     R24,$40
380
        LDI     TEMP,4
381
        RCALL   SD_RD_DUMMY
382
 
313 ddp 383
SDINIT3:LDI     DATA,$40+55 ;CMD55
384
        RCALL   SD_WR_CMD
173 ddp 385
        LDI     TEMP,2
386
        RCALL   SD_RD_DUMMY
313 ddp 387
        LDI     DATA,$40+41 ;ACMD41 (sd_send_op_cond)
13 ddp 388
        RCALL   SD_EXCHANGE
389
        MOV     DATA,R24
390
        RCALL   SD_EXCHANGE
313 ddp 391
        RCALL   SD_WR_CMX4
13 ddp 392
        TST     DATA
313 ddp 393
        BREQ    SDINIT5
394
        SBRS    DATA,2
395
        RJMP    SDINIT3
13 ddp 396
 
313 ddp 397
SDINIT4:LDI     DATA,$40+1  ;CMD1 (send_op_cond)
398
        RCALL   SD_WR_CMD
13 ddp 399
        TST     DATA
400
        BRNE    SDINIT4
313 ddp 401
        RCALL   SD_CRC_OFF
402
        ;RCALL   SD_SETBLKLEN
403
        RJMP    SDINIT9
13 ddp 404
 
313 ddp 405
SDINIT5:RCALL   SD_CRC_OFF
406
        ;RCALL   SD_SETBLKLEN
407
        TST     R24
408
        BREQ    SDINIT9
409
        LDI     DATA,$40+58 ;CMD58 (read_ocr)
410
        RCALL   SD_WR_CMD
411
        RCALL   SD_RECEIVE
412
        STS     SDHC,DATA
413
        LDI     TEMP,3+2
414
        RCALL   SD_RD_DUMMY
415
SDINIT9:
13 ddp 416
;
417
;--------------------------------------
418
;поиск FAT, инициализация переменных
419
WC_FAT: LDIX    0
420
        LDIY    0
421
        RCALL   LOADLST
313 ddp 422
        RCALL   FAT_CHKSIGN
423
        BREQ    WC_FAT1
424
SDERR3: LDI     DATA,3  ;не найдена FAT
425
        RJMP    SD_ERROR
426
WC_FAT1:LDI     ZL,$BE
13 ddp 427
        LD      DATA,Z
313 ddp 428
        ANDI    DATA,$7F
13 ddp 429
        BRNE    RDFAT05
430
        LDI     ZL,$C2
431
        LD      DATA,Z
432
        CPI     DATA,$01
433
        BREQ    RDFAT06
313 ddp 434
        CPI     DATA,$04
435
        BREQ    RDFAT06
436
        CPI     DATA,$06
437
        BREQ    RDFAT06
13 ddp 438
        CPI     DATA,$0B
439
        BREQ    RDFAT06
440
        CPI     DATA,$0C
441
        BREQ    RDFAT06
442
        CPI     DATA,$0E
443
        BRNE    RDFAT05
313 ddp 444
RDFAT06:LDI     ZL,$C6
13 ddp 445
        LD      XL,Z+
446
        LD      XH,Z+
447
        LD      YL,Z+
448
        LD      YH,Z
449
        RJMP    RDFAT00
450
RDFAT05:LDIZ    BUF4FAT
451
        LDD     BITS,Z+$0D
452
        LDI     DATA,0
453
        LDI     TEMP,0
454
        LDI     COUNT,8
455
RDF051: ROR     BITS
456
        ADC     DATA,NULL
457
        DEC     COUNT
458
        BRNE    RDF051
459
        DEC     DATA
460
        BRNE    RDF052
461
        INC     TEMP
462
RDF052: LDD     DATA,Z+$0E
463
        LDD     R0,Z+$0F
464
        OR      DATA,R0
465
        BREQ    RDF053
466
        INC     TEMP
467
RDF053: LDD     DATA,Z+$13
468
        LDD     R0,Z+$14
469
        OR      DATA,R0
470
        BRNE    RDF054
471
        INC     TEMP
472
RDF054: LDD     DATA,Z+$20
473
        LDD     R0,Z+$21
474
        OR      DATA,R0
475
        LDD     R0,Z+$22
476
        OR      DATA,R0
477
        LDD     R0,Z+$23
478
        OR      DATA,R0
479
        BRNE    RDF055
480
        INC     TEMP
481
RDF055: LDD     DATA,Z+$15
482
        ANDI    DATA,$F0
483
        CPI     DATA,$F0
484
        BRNE    RDF056
485
        INC     TEMP
486
RDF056: CPI     TEMP,4
487
        BREQ    RDF057
313 ddp 488
        RJMP    SDERR3
489
;
490
RDF057: LDIY    0
13 ddp 491
        LDIX    0
492
RDFAT00:STSX    STARTRZ+0
493
        STSY    STARTRZ+2
494
        RCALL   LOADLST
313 ddp 495
        RCALL   FAT_CHKSIGN
496
        BREQ    RDF011
497
SDERR3A:RJMP    SDERR3
498
RDF011: LDIZ    BUF4FAT
499
        LDD     DATA,Z+11       ;BPB_BytsPerSec
500
        TST     DATA
501
        BRNE    SDERR3A
502
        LDD     DATA,Z+12       ;BPB_BytsPerSec
503
        CPI     DATA,$02
504
        BRNE    SDERR3A
505
RDF012: LDIY    0
13 ddp 506
        LDD     XL,Z+22
507
        LDD     XH,Z+23         ;bpb_fatsz16
508
        MOV     DATA,XH
509
        OR      DATA,XL
510
        BRNE    RDFAT01         ;если не fat12/16 (bpb_fatsz16=0)
511
        LDD     XL,Z+36         ;то берем bpb_fatsz32 из смещения +36
512
        LDD     XH,Z+37
513
        LDD     YL,Z+38
514
        LDD     YH,Z+39
515
RDFAT01:STSX    SEC_FAT+0
516
        STSY    SEC_FAT+2       ;число секторов на fat-таблицу
517
        LDIY    0
518
        LDD     XL,Z+19
519
        LDD     XH,Z+20         ;bpb_totsec16
520
        MOV     DATA,XH
521
        OR      DATA,XL
522
        BRNE    RDFAT02         ;если не fat12/16 (bpb_totsec16=0)
523
        LDD     XL,Z+32         ;то берем из bpb_totsec32 смещения +32
524
        LDD     XH,Z+33
525
        LDD     YL,Z+34
526
        LDD     YH,Z+35
527
RDFAT02:STSX    SEC_DSC+0
528
        STSY    SEC_DSC+2       ;к-во секторов на диске/разделе
529
;вычисляем rootdirsectors
530
        LDD     XL,Z+17
531
        LDD     XH,Z+18         ;bpb_rootentcnt
532
        LDIY    0
533
        MOV     DATA,XH
534
        OR      DATA,XL
535
        BREQ    RDFAT03
536
        LDI     DATA,$10
537
        RCALL   BCDE_A
538
        MOVW    YL,XL           ;это реализована формула
539
                                ;rootdirsectors = ( (bpb_rootentcnt*32)+(bpb_bytspersec-1) )/bpb_bytspersec
540
                                ;в Y rootdirsectors
541
                                ;если fat32, то Y=0 всегда
542
RDFAT03:PUSH    YH
543
        PUSH    YL
544
        LDD     DATA,Z+16       ;bpb_numfats
545
        STS     MANYFAT,DATA
546
        LDSX    SEC_FAT+0
547
        LDSY    SEC_FAT+2
548
        DEC     DATA
549
RDF031: LSL     XL
550
        ROL     XH
551
        ROL     YL
552
        ROL     YH
553
        DEC     DATA
554
        BRNE    RDF031
555
        POP     R24
556
        POP     R25
557
                                ;полный размер fat-области в секторах
558
        RCALL   HLDEPBC         ;прибавили rootdirsectors
559
        LDD     R24,Z+14
560
        LDD     R25,Z+15        ;bpb_rsvdseccnt
561
        STS     RSVDSEC+0,R24
562
        STS     RSVDSEC+1,R25
563
        RCALL   HLDEPBC         ;прибавили bpb_resvdseccnt
564
        STSX    FRSTDAT+0
565
        STSY    FRSTDAT+2       ;положили номер первого сектора данных
566
        LDIZ    SEC_DSC
567
        RCALL   BCDEHLM         ;вычли из полного к-ва секторов раздела
568
        LDIZ    BUF4FAT
569
        LDD     DATA,Z+13
570
        STS     BYTSSEC,DATA
571
        RCALL   BCDE_A          ;разделили на к-во секторов в кластере
572
        STSX    CLS_DSC+0
573
        STSY    CLS_DSC+2       ;положили кол-во кластеров на разделе
574
 
313 ddp 575
;microsoft-recommended FAT type determination (FAT12 <4085; FAT16 <65525; else FAT32)
576
        LDI     DATA,2
577
        TST     YH
13 ddp 578
        BRNE    RDFAT04
313 ddp 579
        TST     YL
580
        BRNE    RDFAT04
581
        CPI     XL,$F5
582
        CPC     XH,FF
583
        BRCC    RDFAT04
13 ddp 584
        LDI     DATA,1
313 ddp 585
        LDI     TEMP,$0F
586
        CPI     XL,$F5
587
        CPC     XH,TEMP
588
        BRCC    RDFAT04
589
        LDI     DATA,0
590
;alternative FAT type determination
591
;        PUSHY
592
;        PUSHX
593
;        LSL     XL
594
;        ROL     XH
595
;        ROL     YL
596
;        ROL     YH
597
;        RCALL   RASCHET
598
;        LDI     DATA,1
599
;        POPX
600
;        POPY
601
;        BREQ    RDFAT04
602
;        LSL     XL
603
;        ROL     XH
604
;        ROL     YL
605
;        ROL     YH
606
;        LSL     XL
607
;        ROL     XH
608
;        ROL     YL
609
;        ROL     YH
610
;        RCALL   RASCHET
611
;        LDI     DATA,2
612
;        BREQ    RDFAT04
613
;        CLR     DATA
13 ddp 614
RDFAT04:STS     CAL_FAT,DATA
615
;для fat12/16 вычисляем адрес первого сектора директории
616
;для fat32 берем по смещемию +44
617
;на выходе YX == сектор rootdir
618
        LDIX    0
619
        LDIY    0
620
        TST     DATA
621
        BREQ    FSRROO2
622
        DEC     DATA
623
        BREQ    FSRROO2
624
        LDD     XL,Z+44
625
        LDD     XH,Z+45
626
        LDD     YL,Z+46
627
        LDD     YH,Z+47
628
FSRROO2:STSX    ROOTCLS+0
629
        STSY    ROOTCLS+2       ;сектор root директории
630
        STSX    TEK_DIR+0
631
        STSY    TEK_DIR+2
632
 
633
FSRR121:PUSHX
634
        PUSHY
635
        LDSX    RSVDSEC
636
        LDIY    0
637
        LDIZ    STARTRZ
638
        RCALL   BCDEHLP
639
        STSX    FATSTR0+0
640
        STSY    FATSTR0+2
641
        LDIZ    SEC_FAT
642
        RCALL   BCDEHLP
643
        STSX    FATSTR1+0
644
        STSY    FATSTR1+2
645
        POPY
646
        POPX
647
 
648
        LDI     TEMP,1
649
        MOV     R0,XL
650
        OR      R0,XH
651
        OR      R0,YL
652
        OR      R0,YH
653
        BREQ    LASTCLS
654
NEXTCLS:PUSH    TEMP
655
        RCALL   RDFATZP
656
        RCALL   LST_CLS
657
        POP     TEMP
68 ddp 658
        BRCC    LASTCLS
13 ddp 659
        INC     TEMP
660
        RJMP    NEXTCLS
661
LASTCLS:STS     KCLSDIR,TEMP
662
        LDIY    0
663
        RCALL   RDDIRSC
664
;
665
;--------------------------------------
666
;поиск файла в директории
667
        LDIY    0               ;номер описателя файла
668
        RJMP    FNDMP32
669
 
670
FNDMP31:ADIW    YL,1            ;номер++               ─────────┐
671
        ADIW    ZL,$20          ;следующий описатель             │
672
        CPI     ZH,HIGH(BUF4FAT+512);                            │
673
                                ;вылезли за сектор?              │
674
        BRNE    FNDMP32         ;нет ещё                         │
675
        RCALL   RDDIRSC         ;считываем следующий             │
676
        BRNE    FNDMP37         ;кончились сектора в директории ═│═╗
677
FNDMP32:LDD     DATA,Z+$0B      ;атрибуты                        │ ║
678
        SBRC    DATA,3          ;длиное имя/имя диска?           │ ║
679
        RJMP    FNDMP31         ;да ────────────────────────────┤ ║
680
        SBRC    DATA,4          ;директория?                     │ ║
681
        RJMP    FNDMP31         ;да ────────────────────────────┤ ║
682
        LD      DATA,Z          ;первый символ                   │ ║
683
        CPI     DATA,$E5        ;удалённый файл?                 │ ║
684
        BREQ    FNDMP31         ;да ────────────────────────────┘ ║
685
        TST     DATA            ;пустой описатель? (конец списка)  ╚═ в этой директории
686
        BREQ    FNDMP37         ;да ═════════════════════════════════ нет нашёго файла
687
        PUSH    ZL
688
        MOVW    XL,ZL
689
        LDIZ    FILENAME*2
690
;        OUT     RAMPZ,ONE
691
DALSHE: ELPM    DATA,Z+
692
        TST     DATA
693
        BREQ    NASHEL
694
        LD      TEMP,X+
695
        CP      DATA,TEMP
696
        BREQ    DALSHE
697
;не совпало
698
        MOV     ZH,XH
699
        POP     ZL
700
        RJMP    FNDMP31
701
;нет такого файла
702
FNDMP37:
79 ddp 703
        LDI     DATA,4  ;нет файла
13 ddp 704
        RJMP    SD_ERROR
705
;найден описатель
706
NASHEL: MOV     ZH,XH
707
        POP     ZL
708
;
709
;--------------------------------------
710
;инициализация переменных
711
;для последующего чтения файла
712
;Z указывает на описатель файла
713
        LDD     XL,Z+$1A
714
        LDD     XH,Z+$1B
715
        LDD     YL,Z+$14
716
        LDD     YH,Z+$15        ;считали номер первого кластера файла
717
        STSX    TFILCLS+0
718
        STSY    TFILCLS+2
719
        LDD     XL,Z+$1C
720
        LDD     XH,Z+$1D
721
        LDD     YL,Z+$1E
722
        LDD     YH,Z+$1F        ;считали длину файла
79 ddp 723
        MOV     DATA,XL
724
        OR      DATA,XH
725
        OR      DATA,YL
726
        OR      DATA,YH
727
        BRNE    F01
728
        RJMP    SDUPD_ERR
729
F01:    LDI     R24,LOW(511)
13 ddp 730
        LDI     R25,HIGH(511)
731
        RCALL   HLDEPBC
732
        RCALL   BCDE200         ;получили кол-во секторов
79 ddp 733
        SBIW    XL,1
734
        SBC     YL,NULL
735
        SBC     YH,NULL
13 ddp 736
        LDS     DATA,BYTSSEC
737
        DEC     DATA
738
        AND     DATA,XL
739
        INC     DATA
740
        STS     MPHWOST,DATA    ;кол-во секторов в последнем кластере
741
        LDS     DATA,BYTSSEC
79 ddp 742
        RCALL   BCDE_A
13 ddp 743
        STSX    KOL_CLS+0
744
        STSY    KOL_CLS+2
745
        STS     NUMSECK,NULL
746
;
747
;--------------------------------------
748
;загружаем данные из файла, шьём во флеш
749
        RCALL   NEXTSEC
79 ddp 750
        STS     LASTSECFLAG,DATA
13 ddp 751
        STS     STEP,NULL
752
 
753
        LDIY    BUFSECT
754
        LDIX    HEADER
755
        CLR     CRC_LO
756
        CLR     CRC_HI
757
        LDI     R20,128
758
SDUPD01:LD      DATA,Y+
759
        ST      X+,DATA
760
        RCALL   CRC_UPDATE
761
        DEC     R20
762
        BRNE    SDUPD01
763
        OR      CRC_LO,CRC_HI
79 ddp 764
        BRNE    SDUPD_ERR
765
        RCALL   CHECK_SIGNATURE
766
        BRNE    SDUPD_ERR
13 ddp 767
 
768
        LDI     XL,LOW(HEADER+$40)
769
;        LDI     XH,HIGH(HEADER+$40)
770
        CLR     ADR1
771
        CLR     ADR2
772
SDUPD13:LDI     COUNT,8
773
        LD      BITS,X+
774
SDUPD12:LSR     BITS
775
        BRCS    SDUPD20
776
;"пустой" блок
777
        MOV     FF_FL,FF
778
        RCALL   BLOCK_FLASH
148 ddp 779
        BREQ    SDUPD50
79 ddp 780
 
781
SDUPD11:LED_OFF
148 ddp 782
        SBRS    ADR1,5
79 ddp 783
        LED_ON  ;мигать при обновлении
13 ddp 784
 
785
        DEC     COUNT
786
        BRNE    SDUPD12
787
        RJMP    SDUPD13
148 ddp 788
;
789
SDUPD_ERR:RJMP  SDUPD_ERR1
790
;
13 ddp 791
;подготавливаем данные
792
;если необходимо загружаем с SD
793
SDUPD20:PUSHX
794
        PUSH    BITS
795
        PUSH    COUNT
796
        LDS     DATA,STEP
797
        TST     DATA
798
        BRNE    SDUPD30
799
;
800
        LDIY    BUFSECT+128
801
        LDIX    BUFFER
802
        CLR     R20
803
SDUPD21:LD      DATA,Y+
804
        ST      X+,DATA
805
        DEC     R20
806
        BRNE    SDUPD21
807
        STS     STEP,ONE
148 ddp 808
        RJMP    SDUPD40
13 ddp 809
;
810
SDUPD30:LDIY    BUFSECT+384
811
        LDIX    BUFFER
812
        LDI     R20,128
813
SDUPD31:LD      DATA,Y+
814
        ST      X+,DATA
815
        DEC     R20
816
        BRNE    SDUPD31
817
 
79 ddp 818
        LDS     DATA,LASTSECFLAG
819
        TST     DATA
820
        BREQ    SDUPD_ERR
13 ddp 821
        RCALL   NEXTSEC
79 ddp 822
        STS     LASTSECFLAG,DATA
13 ddp 823
        STS     STEP,NULL
824
 
825
        LDIY    BUFSECT
826
        LDIX    BUFFER+128
827
        LDI     R20,128
828
SDUPD32:LD      DATA,Y+
829
        ST      X+,DATA
830
        DEC     R20
831
        BRNE    SDUPD32
832
;шьём блок
148 ddp 833
SDUPD40:POP     COUNT
13 ddp 834
        POP     BITS
835
        POPX
836
        CLR     FF_FL
837
        RCALL   BLOCK_FLASH
838
        BRNE    SDUPD11
839
;
148 ddp 840
SDUPD50:
841
        CLR     ADR1
842
        CLR     ADR2
843
SDUPD53:LDI     COUNT,8
844
        LD      BITS,X+
845
SDUPD52:LSR     BITS
846
        BRCS    SDUPD60
847
;"пустой" блок
848
        RCALL   INCEEADR
849
        BREQ    SDUPD90
850
SDUPD51:
851
        DEC     COUNT
852
        BRNE    SDUPD52
853
        RJMP    SDUPD53
854
;подготавливаем данные
855
;если необходимо загружаем с SD
856
SDUPD60:PUSHX
857
        PUSH    BITS
858
        PUSH    COUNT
859
        LDS     DATA,STEP
860
        TST     DATA
861
        BRNE    SDUPD70
862
;
863
        LDIY    BUFSECT+128
864
        LDIX    BUFFER
865
        CLR     R20
866
SDUPD61:LD      DATA,Y+
867
        ST      X+,DATA
868
        DEC     R20
869
        BRNE    SDUPD61
870
        STS     STEP,ONE
871
        RJMP    SDUPD80
872
 
873
SDUPD70:LDIY    BUFSECT+384
874
        LDIX    BUFFER
875
        LDI     R20,128
876
SDUPD71:LD      DATA,Y+
877
        ST      X+,DATA
878
        DEC     R20
879
        BRNE    SDUPD71
880
 
881
        LDS     DATA,LASTSECFLAG
882
        TST     DATA
883
        BREQ    SDUPD_ERR1
884
        RCALL   NEXTSEC
885
        STS     LASTSECFLAG,DATA
886
        STS     STEP,NULL
887
 
888
        LDIY    BUFSECT
889
        LDIX    BUFFER+128
890
        LDI     R20,128
891
SDUPD72:LD      DATA,Y+
892
        ST      X+,DATA
893
        DEC     R20
894
        BRNE    SDUPD72
895
;пишем блок EEPROM
896
SDUPD80:POP     COUNT
897
        POP     BITS
898
        POPX
899
        RCALL   BLOCK_EEWRITE
900
        BRNE    SDUPD51
901
 
42 ddp 902
SDUPD90:RJMP    CHECKIT ;проверка CRC основной программы и если всё Ok её запуск.
13 ddp 903
;
148 ddp 904
SDUPD_ERR1:
905
        LDI     DATA,5  ;ошибка в файле (CRC/signature/length)
906
;
13 ddp 907
;--------------------------------------
148 ddp 908
;ошибка при попытке обновления с SD
909
SD_ERROR:
910
        STS     SDERROR,DATA
911
        SDCS_SET
912
        LDI     TEMP,LOW(RAMEND)
913
        OUT     SPL,TEMP
914
        LDI     TEMP,HIGH(RAMEND)
915
        OUT     SPH,TEMP
916
 
917
        RCALL   NEWLINE
918
        LDIZ    MSG_SDERROR*2
919
        RCALL   PRINTSTRZ
920
        LDI     DATA,ANSI_RED
921
        RCALL   ANSI_COLOR
922
        LDS     DATA,SDERROR
923
        CPI     DATA,1
924
        BRNE    SD_ERR2
925
        LDIZ    MSG_CARD*2
926
        RCALL   PRINTSTRZ
927
        RJMP    SD_NOTFOUND
928
SD_ERR2:
929
        CPI     DATA,2
930
        BRNE    SD_ERR3
931
        LDIZ    MSG_READERROR*2
932
        RCALL   PRINTSTRZ
933
        RJMP    SD_ERR9
934
SD_ERR3:
935
        CPI     DATA,3
936
        BRNE    SD_ERR4
937
        LDIZ    MSG_FAT*2
938
        RCALL   PRINTSTRZ
939
        RJMP    SD_NOTFOUND
940
SD_ERR4:
941
        CPI     DATA,4
942
        BRNE    SD_ERR5
943
        LDIZ    MSG_FILE*2
944
        RCALL   PRINTSTRZ
945
SD_NOTFOUND:
946
        LDIZ    MSG_NOTFOUND*2
947
        RCALL   PRINTSTRZ
948
        RJMP    SD_ERR9
949
SD_ERR5:
950
        LDIZ    MSG_WRONGFILE*2
951
        RCALL   PRINTSTRZ
952
SD_ERR9:
953
;
954
        LDS     ZL,SDERROR
955
SD_ERR1:LED_OFF
956
        LDI     DATA,5
957
        RCALL   BEEP
958
        LED_ON
959
        LDI     DATA,5
960
        RCALL   DELAY
961
        DEC     ZL
962
        BRNE    SD_ERR1
963
;обновление по RS-232
964
;UART1 Разрешаем приём/передачу
965
        LDI     TEMP,(1<<RXEN)|(1<<TXEN)
966
        OUTPORT UCSR1B,TEMP
967
;
968
        RCALL   NEWLINE
969
        LDIZ    MSG_TRYUPDATE*2
970
        RCALL   PRINTSTRZ
971
        LDIZ    MSG__RS232*2
972
        RCALL   PRINTSTRZ
973
;инициируем обмен по протоколу XModem-CRC
974
        LDI     TEMP,20 ;если в течении ~60 секунд не начнётся обмен - будет перезагрузка бутлоадера (20*timeout=60)
975
UUPD00: PUSH    TEMP
976
        LDI     DATA,$43
977
        LDIY    HEADER
978
        RCALL   XMODEM_PACKET_RECEIVER
979
        POP     TEMP
980
        BRNE    UUPD01
981
        DEC     TEMP
982
        BRNE    UUPD00
983
        RJMP    START8  ;проверка CRC основной программы и если всё Ok её запуск.
984
 
985
UUPD01: OR      CRC_LO,CRC_HI
986
        BREQ    UUPD03
987
UUPD04:
988
        LDI     DATA,CAN
989
        RCALL   WRUART
990
        RCALL   WRUART
991
        RCALL   WRUART
992
        RCALL   WRUART
993
        RCALL   WRUART
994
        RCALL   DELAY_3SEC
995
        LDIZ    MSG_CLRCURRLINE*2
996
        RCALL   PRINTSTRZ
997
        RCALL   NEWLINE
998
        LDI     DATA,ANSI_RED
999
        RCALL   ANSI_COLOR
1000
        LDIZ    MSG_WRONGDATA*2
1001
        RCALL   PRINTSTRZ
1002
        RCALL   DELAY_3SEC
1003
        RJMP    START8  ;проверка CRC основной программы и если всё Ok её запуск.
1004
UUPD03:
1005
        RCALL   CHECK_SIGNATURE
1006
        BRNE    UUPD04
1007
;-------
1008
        LDI     XL,LOW(HEADER+$40)
1009
;        LDI     XH,HIGH(HEADER+$40)
1010
        CLR     ADR1
1011
        CLR     ADR2
1012
UUPD13: LDI     COUNT,8
1013
        LD      BITS,X+
1014
UUPD12: LSR     BITS
1015
        BRCS    UUPD14
1016
;пропускаем "пустой" блок
1017
        RCALL   INCADR
1018
        BREQ    UUPD20
1019
UUPD11: DEC     COUNT
1020
        BRNE    UUPD12
1021
        RJMP    UUPD13
1022
;загружаем блок
1023
UUPD14: LDIY    BUFFER
1024
        LDI     DATA,ACK
1025
UUPD15: RCALL   XMODEM_PACKET_RECEIVER
1026
        BRNE    UUPD16
1027
        CPI     DATA,EOT
1028
        BREQ    UUPD19
1029
        LDI     DATA,NAK
1030
        RJMP    UUPD15
1031
UUPD16: LDI     DATA,ACK
1032
UUPD17: RCALL   XMODEM_PACKET_RECEIVER
1033
        BRNE    UUPD18
1034
        CPI     DATA,EOT
1035
        BREQ    UUPD19
1036
        LDI     DATA,NAK
1037
        RJMP    UUPD17
1038
 
1039
UUPD19: RJMP    UUPD_F3
1040
 
1041
;шьём принятый блок (два XModem-ых пакета по 128 байт)
1042
UUPD18: CLR     FF_FL
1043
        RCALL   BLOCK_FLASH
1044
        BRNE    UUPD11
1045
;-------
1046
UUPD20:
1047
        LDI     XL,LOW(HEADER+$40)
1048
;        LDI     XH,HIGH(HEADER+$40)
1049
        CLR     ADR1
1050
        CLR     ADR2
1051
UUPD23: LDI     COUNT,8
1052
        LD      BITS,X+
1053
UUPD22: LSR     BITS
1054
        BRCC    UUPD24
1055
;пропускаем блок
1056
        RCALL   INCADR
1057
        BREQ    UUPD30
1058
UUPD21: DEC     COUNT
1059
        BRNE    UUPD22
1060
        RJMP    UUPD23
1061
;стираем "пустой" блок
1062
UUPD24: MOV     FF_FL,FF
1063
        RCALL   BLOCK_FLASH
1064
        BRNE    UUPD21
1065
;-------
1066
UUPD30: CLR     ADR1
1067
        CLR     ADR2
1068
UUPD33: LDI     COUNT,8
1069
        LD      BITS,X+
1070
UUPD32: LSR     BITS
1071
        BRCS    UUPD34
1072
;пропускаем "пустой" блок
1073
        RCALL   INCEEADR
1074
        BREQ    UUPD_FINISH
1075
UUPD31: DEC     COUNT
1076
        BRNE    UUPD32
1077
        RJMP    UUPD33
1078
;загружаем блок
1079
UUPD34: LDIY    BUFFER
1080
        LDI     DATA,ACK
1081
UUPD35: RCALL   XMODEM_PACKET_RECEIVER
1082
        BRNE    UUPD36
1083
        CPI     DATA,EOT
1084
        BREQ    UUPD39
1085
        LDI     DATA,NAK
1086
        RJMP    UUPD35
1087
UUPD36: LDI     DATA,ACK
1088
UUPD37: RCALL   XMODEM_PACKET_RECEIVER
1089
        BRNE    UUPD38
1090
        CPI     DATA,EOT
1091
        BREQ    UUPD39
1092
        LDI     DATA,NAK
1093
        RJMP    UUPD37
1094
 
1095
UUPD39: RJMP    UUPD_F3
1096
 
1097
;пишем в EEPROM принятый блок (два XModem-ых пакета по 128 байт)
1098
UUPD38: RCALL   BLOCK_EEWRITE
1099
        BRNE    UUPD31
1100
;-------
1101
UUPD_FINISH:
1102
        LDI     DATA,ACK
1103
        RCALL   WRUART
1104
        RCALL   RDUART
1105
UUPD_F3:CPI     DATA,EOT ; обязательно должно придти EOT
1106
        LDI     DATA,ACK
1107
        BREQ    UUPD_F1
1108
UUPD_F2:LDI     DATA,CAN
1109
        RCALL   WRUART
1110
        RCALL   WRUART
1111
        RCALL   WRUART
1112
        RCALL   WRUART
1113
UUPD_F1:RCALL   WRUART
1114
        RCALL   DELAY_3SEC
1115
        LDIZ    MSG_CLRCURRLINE*2
1116
        RCALL   PRINTSTRZ
1117
        RJMP    CHECKIT ;проверка CRC основной программы и если всё Ok её запуск.
1118
;
1119
;--------------------------------------
1120
;XMODEM_PACKET_RECEIVER
1121
;in:    DATA == <C>, <NAK> или <ACK>
1122
;       Y == указатель на буфер
1123
;out:   sreg.Z == SET - timeout (Y без изменений)
1124
;                 CLR - Ok! (Y=+128)
1125
XMRXERR:SUBI    YL,128
1126
        SBC     YH,NULL
1127
        LDI     DATA,NAK
1128
;
1129
XMODEM_PACKET_RECEIVER:
1130
        RCALL   WRUART
1131
        LDI     TEMP,6 ;таймаут 3 сек.
1132
 
1133
XMRX3:  LED_OFF
1134
        SBRC    TEMP,0
1135
        LED_ON  ;мигать при ожидании
1136
 
1137
        LDI     R20,$00 ;\
1138
        LDI     R21,$70 ; > ~0,5 сек
1139
        LDI     ZL,$05  ;/
1140
XMRX1:  SUBI    R20,1
1141
        SBCI    R21,0
1142
        SBCI    ZL,0
1143
        BRNE    XMRX2
1144
        DEC     TEMP
1145
        BRNE    XMRX3
1146
        CLR     DATA
1147
XMRX9:  RET
1148
 
1149
XMRX2:  RCALL   INUART
1150
        BREQ    XMRX1
1151
        CPI     DATA,EOT
1152
        BREQ    XMRX9
1153
        CPI     DATA,SOH
1154
        BRNE    XMRX1
1155
 
1156
        LED_OFF
1157
        SBRS    ADR1,1
1158
        LED_ON
1159
 
1160
        RCALL   RDUART  ;block num
1161
        RCALL   RDUART  ;block num (inverted)
1162
        CLR     CRC_LO
1163
        CLR     CRC_HI
1164
        LDI     R20,128
1165
XMRX4:  RCALL   RDUART
1166
        ST      Y+,DATA
1167
        RCALL   CRC_UPDATE
1168
        DEC     R20
1169
        BRNE    XMRX4
1170
 
1171
        RCALL   RDUART
1172
        MOV     TEMP,DATA
1173
        RCALL   RDUART
1174
        CP      DATA,CRC_LO
1175
        BRNE    XMRXERR
1176
        CP      TEMP,CRC_HI
1177
        BRNE    XMRXERR
1178
        CLZ
1179
        RET
1180
;
1181
;--------------------------------------
1182
;
1183
CHECK_SIGNATURE:
1184
        LDIZ    SIGNATURE*2
1185
        OUT     RAMPZ,ONE
1186
        LDIX    HEADER
1187
CHKSIG1:ELPM    DATA,Z+
1188
        LD      TEMP,X+
1189
        CP      DATA,TEMP
1190
        BRNE    CHKSIG9
1191
        CPI     DATA,$1A
1192
        BRNE    CHKSIG1
1193
CHKSIG9:RET
1194
;
1195
;======================================
13 ddp 1196
;out:   DATA
1197
SD_RECEIVE:
1198
        SER     DATA
1199
; - - - - - - - - - - - - - - - - - - -
1200
;in:    DATA
1201
;out:   DATA
1202
SD_EXCHANGE:
1203
        OUT     SPDR,DATA
79 ddp 1204
SDEXCH: SBIS    SPSR,SPIF
13 ddp 1205
        RJMP    SDEXCH
1206
        IN      DATA,SPDR
1207
        RET
1208
;
1209
;--------------------------------------
1210
;in;    TEMP - n
1211
SD_RD_DUMMY:
1212
        SER     DATA
1213
        RCALL   SD_EXCHANGE
1214
        DEC     TEMP
1215
        BRNE    SD_RD_DUMMY
1216
        RET
1217
;
1218
;--------------------------------------
313 ddp 1219
;in:    DATA
1220
SD_WR_CMD:
1221
        PUSH    DATA
1222
        LDI     TEMP,2
1223
        RCALL   SD_RD_DUMMY
1224
        POP     DATA
1225
        RCALL   SD_EXCHANGE
1226
        CLR     DATA
1227
        RCALL   SD_EXCHANGE
1228
SD_WR_CMX4:
1229
        CLR     DATA
1230
        RCALL   SD_EXCHANGE
1231
        CLR     DATA
1232
        RCALL   SD_EXCHANGE
1233
        CLR     DATA
1234
        RCALL   SD_EXCHANGE
1235
        SER     DATA
1236
        RCALL   SD_EXCHANGE
1237
        RJMP    SD_WAIT_NOTFF
1238
;
1239
;--------------------------------------
13 ddp 1240
;in:    Z
1241
SD_WR_PGM_6:
173 ddp 1242
        LDI     TEMP,2
1243
        RCALL   SD_RD_DUMMY
13 ddp 1244
        LDI     TEMP,6
1245
SD_WR_PGX:
1246
        OUT     RAMPZ,ONE
1247
SDWRP61:ELPM    DATA,Z+
1248
        RCALL   SD_EXCHANGE
1249
        DEC     TEMP
1250
        BRNE    SDWRP61
1251
; - - - - - - - - - - - - - - - - - - -
1252
;out:   DATA
1253
SD_WAIT_NOTFF:
551 ddp 1254
        LDI     TEMP,255
13 ddp 1255
SDWNFF2:SER     DATA
1256
        RCALL   SD_EXCHANGE
1257
        CPI     DATA,$FF
1258
        BRNE    SDWNFF1
1259
        DEC     TEMP
1260
        BRNE    SDWNFF2
1261
SDWNFF1:RET
1262
;
1263
;--------------------------------------
1264
;in:    Z - куда
1265
;       Y,X - №сектора
1266
SD_READ_SECTOR:
79 ddp 1267
        SDCS_CLR
13 ddp 1268
 
1269
        PUSHZ
313 ddp 1270
        LDS     DATA,SDHC
13 ddp 1271
        SBRC    DATA,6
1272
        RJMP    SDRDSE1
1273
        LSL     XL
1274
        ROL     XH
1275
        ROL     YL
1276
        MOV     YH,YL
1277
        MOV     YL,XH
1278
        MOV     XH,XL
1279
        CLR     XL
1280
SDRDSE1:
173 ddp 1281
        LDI     TEMP,3+2
13 ddp 1282
        RCALL   SD_RD_DUMMY
1283
 
1284
        LDI     DATA,CMD_17
1285
        RCALL   SD_EXCHANGE
1286
        MOV     DATA,YH
1287
        RCALL   SD_EXCHANGE
1288
        MOV     DATA,YL
1289
        RCALL   SD_EXCHANGE
1290
        MOV     DATA,XH
1291
        RCALL   SD_EXCHANGE
1292
        MOV     DATA,XL
1293
        RCALL   SD_EXCHANGE
1294
        SER     DATA
1295
        RCALL   SD_EXCHANGE
1296
 
1297
        SER     R24
1298
SDRDSE2:RCALL   SD_WAIT_NOTFF
1299
        DEC     R24
1300
        BREQ    SDRDSE8
1301
        CPI     DATA,$FE
1302
        BRNE    SDRDSE2
1303
 
1304
        POPZ
1305
        LDI     R24,$00
1306
        LDI     R25,$02
1307
SDRDSE3:RCALL   SD_RECEIVE
1308
        ST      Z+,DATA
1309
        SBIW    R24,1
1310
        BRNE    SDRDSE3
1311
 
173 ddp 1312
        LDI     TEMP,2+2
13 ddp 1313
        RCALL   SD_RD_DUMMY
173 ddp 1314
;SDRDSE4:RCALL   SD_WAIT_NOTFF
1315
;        CPI     DATA,$FF
1316
;        BRNE    SDRDSE4
13 ddp 1317
 
79 ddp 1318
        SDCS_SET
13 ddp 1319
        RET
1320
 
79 ddp 1321
SDRDSE8:LDI     DATA,2  ;ошибка при чтении сектора
13 ddp 1322
        RJMP    SD_ERROR
1323
;
1324
;--------------------------------------
313 ddp 1325
;
1326
SD_CRC_OFF:
1327
        LDI     DATA,$40+59 ;CMD59 (crc_on_off)
1328
        RCALL   SD_WR_CMD
1329
        TST     DATA
1330
        BRNE    SD_CRC_OFF
1331
;        RET
1332
SD_SETBLKLEN:
1333
        LDIZ    CMD16*2     ;CMD16 (set_blocklen)
1334
        RCALL   SD_WR_PGM_6
1335
        TST     DATA
1336
        BRNE    SD_SETBLKLEN
1337
        RET
1338
;
1339
;--------------------------------------
1340
;out:   sreg.Z  SET==signature exist
1341
;       Z==BUF4FAT+$01FF
1342
FAT_CHKSIGN:
1343
        LDIZ    BUF4FAT+$01FE
1344
        LD      DATA,Z+
1345
        CPI     DATA,$55
1346
        LD      DATA,Z
1347
        BRNE    FAT_CHKSIG9
1348
        CPI     DATA,$AA
1349
FAT_CHKSIG9:
1350
        RET
1351
;
1352
;--------------------------------------
79 ddp 1353
;чтение сектора данных
13 ddp 1354
LOAD_DATA:
1355
        LDIZ    BUFSECT
1356
        RCALL   SD_READ_SECTOR  ;читать один сектор
1357
        RET
1358
;
1359
;--------------------------------------
79 ddp 1360
;чтение сектора служ.инф. (FAT/DIR/...)
13 ddp 1361
LOADLST:LDIZ    BUF4FAT
1362
        RCALL   SD_READ_SECTOR  ;читать один сектор
1363
        LDIZ    BUF4FAT
1364
        RET
1365
;
1366
;--------------------------------------
1367
;чтение сектора dir по номеру описателя (Y)
1368
;на выходе: DATA=#ff (sreg.Z=0) выход за пределы dir
1369
RDDIRSC:PUSHY
1370
        MOVW    XL,YL
1371
        LDIY    0
1372
        LDI     DATA,$10
1373
        RCALL   BCDE_A
1374
        PUSH    XL
1375
        LDS     DATA,BYTSSEC
1376
        PUSH    DATA
1377
        RCALL   BCDE_A
1378
        LDS     DATA,KCLSDIR
1379
        DEC     DATA
1380
        CP      DATA,XL
1381
        BRCC    RDDIRS3
1382
        POP     YL
1383
        POP     YL
1384
        POPY
1385
        SER     DATA
1386
        TST     DATA
1387
        RET
1388
RDDIRS3:LDSY    TEK_DIR+2
1389
        MOV     DATA,XL
1390
        TST     DATA
1391
        LDSX    TEK_DIR+0
1392
        BREQ    RDDIRS1
1393
RDDIRS2:PUSH    DATA
1394
        RCALL   RDFATZP
1395
        POP     DATA
1396
        DEC     DATA
1397
        BRNE    RDDIRS2
1398
RDDIRS1:RCALL   REALSEC
1399
        POP     R0
1400
        DEC     R0
1401
        POP     DATA
1402
        AND     DATA,R0
1403
        ADD     XL,DATA
1404
        ADC     XH,NULL
1405
        ADC     YL,NULL
1406
        ADC     YH,NULL
1407
        RCALL   LOADLST
1408
        POPY
1409
        CLR     DATA
1410
        RET
1411
;
1412
;--------------------------------------
68 ddp 1413
;out:   sreg.C == CLR - EOCmark
1414
;(chng: TEMP)
1415
LST_CLS:LDI     TEMP,$0F
1416
        LDS     DATA,CAL_FAT
13 ddp 1417
        TST     DATA
1418
        BRNE    LST_CL1
68 ddp 1419
        CPI     XL,$F7
1420
        CPC     XH,TEMP
13 ddp 1421
        RET
1422
LST_CL1:DEC     DATA
1423
        BRNE    LST_CL2
68 ddp 1424
        CPI     XL,$F7
1425
        CPC     XH,FF
13 ddp 1426
        RET
68 ddp 1427
LST_CL2:CPI     XL,$F7
1428
        CPC     XH,FF
1429
        CPC     YL,FF
1430
        CPC     YH,TEMP
1431
        RET
13 ddp 1432
;
1433
;--------------------------------------
1434
;
1435
RDFATZP:LDS     DATA,CAL_FAT
1436
        TST     DATA
1437
        BREQ    RDFATS0         ;FAT12
1438
        DEC     DATA
1439
        BREQ    RDFATS1         ;FAT16
1440
;FAT32
1441
        LSL     XL
1442
        ROL     XH
1443
        ROL     YL
1444
        ROL     YH
1445
        MOV     DATA,XL
1446
        MOV     XL,XH
1447
        MOV     XH,YL
1448
        MOV     YL,YH
1449
        CLR     YH
1450
        RCALL   RDFATS2
1451
        ADIW    ZL,1
1452
        LD      YL,Z+
1453
        LD      YH,Z
313 ddp 1454
        ANDI    YH,$0F  ;
13 ddp 1455
        RET
1456
;FAT16
1457
RDFATS1:LDIY    0
1458
        MOV     DATA,XL
1459
        MOV     XL,XH
1460
        CLR     XH
1461
RDFATS2:PUSH    DATA
1462
        PUSHY
1463
        LDIZ    FATSTR0
1464
        RCALL   BCDEHLP
1465
        RCALL   LOADLST
1466
        POPY
1467
        POP     DATA
1468
        ADD     ZL,DATA
1469
        ADC     ZH,NULL
1470
        ADD     ZL,DATA
1471
        ADC     ZH,NULL
1472
        LD      XL,Z+
1473
        LD      XH,Z
1474
        RET
1475
;FAT12
1476
RDFATS0:MOVW    ZL,XL
1477
        LSL     ZL
1478
        ROL     ZH
1479
        ADD     ZL,XL
1480
        ADC     ZH,XH
1481
        LSR     ZH
1482
        ROR     ZL
1483
        MOV     DATA,XL
1484
        MOV     XL,ZH
1485
        CLR     XH
1486
        CLR     YL
1487
        CLR     YH
1488
        LSR     XL
1489
        PUSH    DATA
1490
        PUSHZ
1491
        LDIZ    FATSTR0
1492
        RCALL   BCDEHLP
313 ddp 1493
        PUSHX
13 ddp 1494
        RCALL   LOADLST
313 ddp 1495
        POPX
13 ddp 1496
        POPY
1497
        ANDI    YH,$01
1498
        ADD     ZL,YL
1499
        ADC     ZH,YH
1500
        LD      YL,Z+
1501
        CPI     ZH,HIGH(BUF4FAT+512)
1502
        BRNE    RDFATS4
1503
        PUSH    YL
1504
        LDIY    0
1505
        ADIW    XL,1
1506
        RCALL   LOADLST
1507
        POP     YL
1508
RDFATS4:POP     DATA
1509
        LD      XH,Z
1510
        MOV     XL,YL
1511
        LDIY    0
1512
        LSR     DATA
1513
        BRCC    RDFATS3
1514
        LSR     XH
1515
        ROR     XL
1516
        LSR     XH
1517
        ROR     XL
1518
        LSR     XH
1519
        ROR     XL
1520
        LSR     XH
1521
        ROR     XL
1522
RDFATS3:ANDI    XH,$0F
1523
        RET
1524
;
1525
;--------------------------------------
1526
;вычисление реального сектора
1527
;на входе YX==номер FAT
1528
;на выходе YX==адрес сектора
1529
REALSEC:MOV     DATA,YH
1530
        OR      DATA,YL
1531
        OR      DATA,XH
1532
        OR      DATA,XL
1533
        BRNE    REALSE1
1534
        LDIZ    FATSTR1
1535
        LDSX    SEC_FAT+0
1536
        LDSY    SEC_FAT+2
1537
        RJMP    BCDEHLP
1538
REALSE1:SBIW    XL,2            ;номер кластера-2
1539
        SBC     YL,NULL
1540
        SBC     YH,NULL
1541
        LDS     DATA,BYTSSEC
1542
        RJMP    REALSE2
1543
REALSE3:LSL     XL
1544
        ROL     XH
1545
        ROL     YL
1546
        ROL     YH
1547
REALSE2:LSR     DATA
1548
        BRCC    REALSE3
1549
                                ;умножили на размер кластера
1550
        LDIZ    STARTRZ
1551
        RCALL   BCDEHLP         ;прибавили смещение от начала диска
1552
        LDIZ    FRSTDAT
1553
        RJMP    BCDEHLP         ;прибавили смещение от начала раздела
1554
;
1555
;--------------------------------------
1556
;YX>>9 (деление на 512)
1557
BCDE200:MOV     XL,XH
1558
        MOV     XH,YL
1559
        MOV     YL,YH
1560
        LDI     YH,0
1561
        LDI     DATA,1
1562
; - - - - - - - - - - - - - - - - - - -
1563
;YXDATA>>до"переноса"
1564
;если в DATA вкл.только один бит, то получается
1565
;YX=YX/DATA
1566
BCDE_A1:LSR     YH
1567
        ROR     YL
1568
        ROR     XH
1569
        ROR     XL
1570
BCDE_A: ROR     DATA
1571
        BRCC    BCDE_A1
1572
        RET
1573
;
1574
;--------------------------------------
1575
;YX=[Z]-YX
1576
BCDEHLM:LD      DATA,Z+
1577
        SUB     DATA,XL
1578
        MOV     XL,DATA
1579
        LD      DATA,Z+
1580
        SBC     DATA,XH
1581
        MOV     XH,DATA
1582
        LD      DATA,Z+
1583
        SBC     DATA,YL
1584
        MOV     YL,DATA
1585
        LD      DATA,Z
1586
        SBC     DATA,YH
1587
        MOV     YH,DATA
1588
        RET
1589
;
1590
;--------------------------------------
1591
;YX=YX+[Z]
1592
BCDEHLP:LD      DATA,Z+
1593
        ADD     XL,DATA
1594
        LD      DATA,Z+
1595
        ADC     XH,DATA
1596
        LD      DATA,Z+
1597
        ADC     YL,DATA
1598
        LD      DATA,Z
1599
        ADC     YH,DATA
1600
        RET
1601
;
1602
;--------------------------------------
1603
;YX=YX+R25R24
1604
HLDEPBC:ADD     XL,R24
1605
        ADC     XH,R25
1606
        ADC     YL,NULL
1607
        ADC     YH,NULL
1608
        RET
1609
;
1610
;--------------------------------------
1611
;
1612
RASCHET:RCALL   BCDE200
1613
        LDIZ    SEC_FAT
1614
        RCALL   BCDEHLM
1615
        MOV     DATA,XL
1616
        ANDI    DATA,$F0
1617
        OR      DATA,XH
1618
        OR      DATA,YL
1619
        OR      DATA,YH
1620
        RET
1621
;
1622
;--------------------------------------
79 ddp 1623
;чтение очередного сектора файла в BUFSECT
1624
;out:   DATA == 0 - считан последний сектор файла
13 ddp 1625
NEXTSEC:LDIZ    KOL_CLS
1626
        LD      DATA,Z+
1627
        LD      TEMP,Z+
1628
        OR      DATA,TEMP
1629
        LD      TEMP,Z+
1630
        OR      DATA,TEMP
1631
        LD      TEMP,Z+
1632
        OR      DATA,TEMP
1633
        BREQ    LSTCLSF
1634
        LDSX    TFILCLS+0
1635
        LDSY    TFILCLS+2
1636
        RCALL   REALSEC
1637
        LDS     DATA,NUMSECK
1638
        ADD     XL,DATA
1639
        ADC     XH,NULL
1640
        ADC     YL,NULL
1641
        ADC     YH,NULL
1642
        RCALL   LOAD_DATA
1643
        LDSX    TFILCLS+0
1644
        LDSY    TFILCLS+2
1645
        LDS     DATA,NUMSECK
1646
        INC     DATA
1647
        STS     NUMSECK,DATA
1648
        LDS     TEMP,BYTSSEC
1649
        CP      TEMP,DATA
1650
        BRNE    NEXT_OK
1651
 
1652
        STS     NUMSECK,NULL
1653
        RCALL   RDFATZP
1654
        STSX    TFILCLS+0
1655
        STSY    TFILCLS+2
1656
        LDIZ    KOL_CLS
1657
        LD      DATA,Z
1658
        SUBI    DATA,1
1659
        ST      Z+,DATA
1660
        LD      DATA,Z
1661
        SBC     DATA,NULL
1662
        ST      Z+,DATA
1663
        LD      DATA,Z
1664
        SBC     DATA,NULL
1665
        ST      Z+,DATA
1666
        LD      DATA,Z
1667
        SBC     DATA,NULL
1668
        ST      Z+,DATA
79 ddp 1669
NEXT_OK:SER     DATA
13 ddp 1670
        RET
1671
 
1672
LSTCLSF:LDSX    TFILCLS+0
1673
        LDSY    TFILCLS+2
1674
        RCALL   REALSEC
1675
        LDS     DATA,NUMSECK
1676
        ADD     XL,DATA
1677
        ADC     XH,NULL
1678
        ADC     YL,NULL
1679
        ADC     YH,NULL
1680
        RCALL   LOAD_DATA
1681
        LDS     DATA,NUMSECK
1682
        INC     DATA
1683
        STS     NUMSECK,DATA
1684
        LDS     TEMP,MPHWOST
79 ddp 1685
        SUB     DATA,TEMP
13 ddp 1686
        RET
1687
;
79 ddp 1688
;======================================
13 ddp 1689
;
42 ddp 1690
PRINTVERS:
1691
        LDI     DATA,ANSI_GREEN
1692
        RCALL   ANSI_COLOR
1693
        LDI     COUNT,12
1694
PRVERS2:ELPM    DATA,Z+
1695
        TST     DATA
1696
        BREQ    PRVERS1
1697
        BRMI    PRVERS1
1698
        RCALL   WRUART
1699
        DEC     COUNT
1700
        BRNE    PRVERS2
1701
PRVERS1:LDI     DATA,$20
1702
        RCALL   WRUART
1703
        LDI     ZL,$FC
183 ddp 1704
        ELPM    XL,Z+
42 ddp 1705
        ELPM    XH,Z+
1706
        MOV     DATA,XL
1707
        ANDI    DATA,$1F
1708
        BREQ    PRVERS9
1709
        MOV     TEMP,XH
1710
        LSL     XL
1711
        ROL     TEMP
1712
        LSL     XL
1713
        ROL     TEMP
1714
        LSL     XL
1715
        ROL     TEMP
1716
        ANDI    TEMP,$0F
1717
        BREQ    PRVERS9
1718
        CPI     TEMP,13
1719
        BRCC    PRVERS9
1720
        MOV     COUNT,XH
1721
        LSR     COUNT
1722
        ANDI    COUNT,$3F
1723
        CPI     COUNT,9
1724
        BRCS    PRVERS9
1725
        RCALL   DECBYTE
1726
        LDI     DATA,$2E
1727
        RCALL   WRUART
1728
        MOV     DATA,TEMP
1729
        RCALL   DECBYTE
1730
        LDI     DATA,$2E
1731
        RCALL   WRUART
1732
        LDI     DATA,$20
1733
        RCALL   HEXBYTE
1734
        MOV     DATA,COUNT
1735
        RCALL   DECBYTE
183 ddp 1736
        SBRC    XH,7
42 ddp 1737
PRVERS9:RET
1738
;
13 ddp 1739
;--------------------------------------
42 ddp 1740
;
183 ddp 1741
BETA:   LDIZ    MSG_BETA*2
68 ddp 1742
        RJMP    PRINTSTRZ
1743
;
1744
;--------------------------------------
1745
;
42 ddp 1746
ANSI_COLOR:
1747
        PUSH    DATA
1748
        LDI     DATA,$1B
1749
        RCALL   WRUART
1750
        LDI     DATA,$5B
1751
        RCALL   WRUART
1752
        POP     DATA
1753
        RCALL   HEXBYTE
1754
        LDI     DATA,$6D
1755
        RJMP    WRUART
1756
;
1757
;--------------------------------------
1758
;
1759
NEWLINE2:
1760
        LDIZ    MSG_NEWLINE2*2
1761
        RJMP    PRINTSTRZ
1762
;
1763
NEWLINE:LDIZ    MSG_NEWLINE*2
1764
;
1765
; - - - - - - - - - - - - - - - - - - -
1766
;in:    Z == указательна строку (в старших 64K)
1767
PRINTSTRZ:
13 ddp 1768
        OUT     RAMPZ,ONE
42 ddp 1769
PRSTRZ1:ELPM    DATA,Z+
13 ddp 1770
        TST     DATA
42 ddp 1771
        BREQ    PRSTRZ2
13 ddp 1772
        RCALL   WRUART
42 ddp 1773
        RJMP    PRSTRZ1
1774
PRSTRZ2:RET
13 ddp 1775
;
1776
;--------------------------------------
42 ddp 1777
;byte in dec to uart
1778
;in:    DATA == byte (0..99)
1779
DECBYTE:SUBI    DATA,208
1780
        SBRS    DATA,7
1781
        SUBI    DATA,48
1782
        SUBI    DATA,232
1783
        SBRS    DATA,6
1784
        SUBI    DATA,24
1785
        SUBI    DATA,244
1786
        SBRS    DATA,5
1787
        SUBI    DATA,12
1788
        SUBI    DATA,250
1789
        SBRS    DATA,4
1790
        SUBI    DATA,6
1791
;
1792
; - - - - - - - - - - - - - - - - - - -
1793
;byte in hex to uart
1794
;in:    DATA == byte
1795
HEXBYTE:PUSH    DATA
1796
        SWAP    DATA
1797
        RCALL   HEXHALF
1798
        POP     DATA
1799
HEXHALF:ANDI    DATA,$0F
1800
        CPI     DATA,$0A
1801
        BRCS    HEXBYT1
1802
        ADDI    DATA,$07
1803
HEXBYT1:ADDI    DATA,$30
1804
;
1805
; - - - - - - - - - - - - - - - - - - -
13 ddp 1806
;in:    DATA == передаваемый байт
1807
WRUART: PUSH    TEMP
1808
WRU_1:  INPORT  TEMP,UCSR1A
1809
        SBRS    TEMP,UDRE
1810
        RJMP    WRU_1
1811
        OUTPORT UDR1,DATA
1812
        POP     TEMP
1813
        RET
1814
;
1815
;--------------------------------------
1816
;out:   DATA == принятый байт
1817
RDUART: INPORT  DATA,UCSR1A
1818
        SBRS    DATA,RXC
1819
        RJMP    RDUART
1820
        INPORT  DATA,UDR1
1821
        RET
1822
;
1823
;--------------------------------------
1824
;out:   sreg.Z == CLR - есть данные (DATA == принятый байт)
1825
;                 SET - нет данных
1826
INUART: INPORT  DATA,UCSR1A
1827
        SBRS    DATA,RXC
1828
        RJMP    INU9
1829
        INPORT  DATA,UDR1
1830
        CLZ
1831
INU9:   RET
1832
;
1833
;--------------------------------------
79 ddp 1834
;in:    DATA == продолжительность *0.1 сек
1835
BEEP:   OUT     SPCR,NULL       ;SPI off
13 ddp 1836
BEE2:   LDI     TEMP,100;100 периодов 1кГц
173 ddp 1837
BEE1:   SBI     DDRE,6
1838
        CBI     PORTE,6
13 ddp 1839
        RCALL   BEEPDLY
173 ddp 1840
        CBI     DDRE,6
1841
        SBI     PORTE,6
13 ddp 1842
        RCALL   BEEPDLY
1843
        DEC     TEMP
1844
        BRNE    BEE1
1845
        DEC     DATA
1846
        BRNE    BEE2
1847
        RET
1848
 
1849
BEEPDLY:LDI     R24,$64
1850
        LDI     R25,$05
1851
BEEPDL1:SBIW    R24,1
1852
        BRNE    BEEPDL1
1853
        RET
1854
;
1855
;--------------------------------------
1856
;
1857
DELAY_3SEC:
1858
        LDI     DATA,30
1859
; - - - - - - - - - - - - - - - - - - -
79 ddp 1860
;in:    DATA == продолжительность *0.1 сек
13 ddp 1861
DELAY:
1862
        LDI     R20,$1E ;\
1863
        LDI     R21,$FE ;/ 0,1 сек @ 11.0592MHz
1864
DELAY1: LPM             ;3
1865
        LPM             ;3
1866
        LPM             ;3
1867
        LPM             ;3
1868
        SUBI    R20,1   ;1
1869
        SBCI    R21,0   ;1
1870
        SBCI    DATA,0  ;1
1871
        BRNE    DELAY1  ;2(1)
1872
        RET
1873
;
1874
;--------------------------------------
79 ddp 1875
;проверка CRC осн.программы
1876
CRCMAIN:LDIZ    $0000                           ;адрес в байтах
1877
        OUT     RAMPZ,NULL
1878
        LDIY    FLASHSIZE<<7                    ;длина в словах
1879
; - - - - - - - - - - - - - - - - - - -
13 ddp 1880
;in:    Z == адрес в байтах
1881
;       Y == кол-во слов
1882
;out:   sreg.Z == SET - crc ok!
1883
CALK_CRC_FLASH:
1884
        MOV     CRC_LO,FF
1885
        MOV     CRC_HI,FF
1886
CCRCFL1:ELPM    DATA,Z+
1887
        RCALL   CRC_UPDATE
1888
        ELPM    DATA,Z+
1889
        RCALL   CRC_UPDATE
79 ddp 1890
 
1891
        LED_OFF
13 ddp 1892
        SBRS    ZH,5
79 ddp 1893
        LED_ON  ;мигать при подсчёте CRC
13 ddp 1894
 
1895
        SBIW    YL,1
1896
        BRNE    CCRCFL1
1897
        OR      CRC_LO,CRC_HI
1898
        RET
1899
;
1900
;--------------------------------------
1901
;in:    DATA - byte
1902
;       CRC_LO,CRC_HI
1903
;out:   CRC_LO,CRC_HI
1904
;cng:   TEMP
1905
CRC_UPDATE:
1906
        EOR     CRC_HI,DATA
1907
        LDI     TEMP,8
1908
CRC_UP2:LSL     CRC_LO
1909
        ROL     CRC_HI
1910
        BRCC    CRC_UP1
1911
        EOR     CRC_LO,POLY_LO
1912
        EOR     CRC_HI,POLY_HI
1913
CRC_UP1:DEC     TEMP
1914
        BRNE    CRC_UP2
1915
        RET
1916
;
1917
;--------------------------------------
1918
;in:    [BUFFER] == data
1919
;       ADR1 == mid address
1920
;       ADR2 == high address
1921
;       FF_FL == $FF - erase only
1922
;out:   sreg.Z == SET - это был последний блок (выше по адресам обновлять запрещено!)
1923
;       ADR1 == mid address
1924
;       ADR2 == high address
1925
BLOCK_FLASH:
1926
        CLR     ZL
1927
        MOV     ZH,ADR1
1928
        OUT     RAMPZ,ADR2
1929
        LDI     GUARD,$A5
1930
        LDI     DATA,(1<<PGERS)|(1<<SPMEN) ;page erase
1931
        RCALL   DO_SPM
1932
 
1933
        INC     FF_FL
1934
        BREQ    BLKFL1
1935
 
1936
        CLR     ZL
1937
        MOV     ZH,ADR1
1938
        OUT     RAMPZ,ADR2
1939
        LDIY    BUFFER
1940
        LDI     TEMP,$80
1941
BLKFL2: LD      R0,Y+
1942
        LD      R1,Y+
1943
        LDI     DATA,(1<<SPMEN) ;transfer data from RAM to Flash page buffer
1944
        RCALL   DO_SPM
1945
        ADIW    ZL,2
1946
        DEC     TEMP
1947
        BRNE    BLKFL2
1948
 
1949
        CLR     ZL
1950
        MOV     ZH,ADR1
1951
        OUT     RAMPZ,ADR2
1952
        LDI     DATA,(1<<PGWRT)|(1<<SPMEN)  ;execute page write
1953
        RCALL   DO_SPM
1954
BLKFL1:
1955
        LDI     DATA,(1<<RWWSRE)|(1<<SPMEN) ;re-enable the RWW section
1956
        RCALL   DO_SPM
1957
        LDI     GUARD,$5A
1958
 
1959
        TST     FF_FL
1960
        BREQ    INCADR
1961
 
1962
        LDIY    BUFFER
1963
        CLR     ZL
1964
        MOV     ZH,ADR1
1965
        OUT     RAMPZ,ADR2
1966
        CLR     R20
1967
BLKFL3: ELPM    DATA,Z+
1968
        LD      TEMP,Y+
1969
        CP      DATA,TEMP
1970
        BRNE    FLASH_ERROR
1971
        DEC     R20
1972
        BRNE    BLKFL3
1973
;
1974
;--------------------------------------
1975
;out:   sreg.Z == SET - это был последний блок (выше по адресам обновлять запрещено!)
1976
;chng:  TEMP
1977
INCADR:
1978
        ADD     ADR1,ONE
1979
        ADC     ADR2,NULL
1980
        MOV     TEMP,ADR2
1981
        CPI     TEMP,HIGH(FLASHSIZE)
1982
        BRNE    INCADR9
1983
        MOV     TEMP,ADR1
1984
        CPI     TEMP,LOW(FLASHSIZE)
1985
INCADR9:RET
1986
;
1987
;--------------------------------------
148 ddp 1988
;in:    [BUFFER] == data
1989
;       ADR1 == low address
1990
;       ADR2 == high address
1991
;out:   sreg.Z == SET - это был последний блок (выше по адресам обновлять запрещено!)
1992
;       ADR1 == low address
1993
;       ADR2 == high address
1994
BLOCK_EEWRITE:
1995
        LDIY    BUFFER
1996
        LDI     GUARD,$A5
1997
 
1998
WEEWE:  SBIC    EECR,EEWE
1999
        RJMP    WEEWE
2000
WSPMEN: LDS     TEMP,SPMCSR
2001
        SBRC    TEMP,SPMEN
2002
        RJMP    WSPMEN
2003
        OUT     EEARH,ADR2
2004
        OUT     EEARL,ADR1
2005
        LD      DATA,Y+
2006
        OUT     EEDR,DATA
2007
        CPI     GUARD,$A5
2008
        BRNE    CRITICAL_ERROR
2009
        SBI     EECR,EEMWE
2010
        SBI     EECR,EEWE
2011
 
2012
        LED_OFF
2013
        SBRS    ADR1,4
2014
        LED_ON  ;мигать при записи EEPROM
2015
 
2016
        INC     ADR1
2017
        BRNE    WEEWE
2018
        LDI     GUARD,$5A
13 ddp 2019
;
148 ddp 2020
;--------------------------------------
2021
;out:   sreg.Z == SET - это был последний блок (выше по адресам обновлять запрещено!)
2022
;chng:  TEMP
2023
INCEEADR:
2024
        ADD     ADR2,ONE
2025
        MOV     TEMP,ADR2
2026
        CPI     TEMP,HIGH(4096)
2027
        RET
2028
;
2029
;--------------------------------------
2030
;
13 ddp 2031
FLASH_ERROR:
42 ddp 2032
        LDI     DATA,30
2033
        RCALL   BEEP
13 ddp 2034
CRITICAL_ERROR:
2035
        RJMP    START1
2036
;
2037
;--------------------------------------
2038
;in:    DATA == значение для SPMCSR
2039
DO_SPM: PUSH    TEMP
2040
WAIT1SPM:                       ; check for previous SPM complete
2041
        INPORT  TEMP,SPMCSR
2042
        SBRC    TEMP,SPMEN
2043
        RJMP    WAIT1SPM
2044
        CLI
2045
WAIT_EE:SBIC    EECR,EEWE       ; check that no EEPROM write access is present
2046
        RJMP    WAIT_EE
2047
        OUTPORT SPMCSR,DATA     ; SPM timed sequence
2048
        CPI     GUARD,$A5       ;1
2049
        BRNE    CRITICAL_ERROR  ;1
2050
        SPM
2051
        NOP
2052
        NOP
2053
        NOP
2054
        NOP
2055
WAIT2SPM:                       ; check for previous SPM complete
2056
        INPORT  TEMP,SPMCSR
2057
        SBRC    TEMP,SPMEN
2058
        RJMP    WAIT2SPM
2059
        POP     TEMP
2060
        RET
2061
;
2062
;--------------------------------------
2063
;
2064
CMD00:  .DB     $40,$00,$00,$00,$00,$95
2065
CMD08:  .DB     $48,$00,$00,$01,$AA,$87
2066
CMD16:  .DB     $50,$00,$00,$02,$00,$FF
2067
FILENAME:       .DB     "ZXEVO_FWBIN",0
2068
SIGNATURE:      .DB     "ZXEVO",$1A
42 ddp 2069
MSG_NEWLINE2:
2070
        .DB     $0D,$0A
2071
MSG_NEWLINE:
2072
        .DB     $0D,$0A,$1B,"[1",$3B,"37m",0
2073
MSG_BADCRC:
2074
        .DB     $1B,"[31mBad CRC!",0
2075
MSG_BOOT:
2076
        .DB     "boot: ",0,0
183 ddp 2077
MSG_BETA:
2078
        .DB     " beta",0
42 ddp 2079
MSG_MAIN:
2080
        .DB     "main: ",0,0
2081
MSG_SDERROR:
2082
        .DB     "SD error: ",0,0
2083
MSG_CARD:
2084
        .DB     "Card",0,0
2085
MSG_READERROR:
2086
        .DB     "Read error",0,0
2087
MSG_FAT:
2088
        .DB     "FAT",0
2089
MSG_FILE:
2090
        .DB     "File",0,0
2091
MSG_WRONGFILE:
2092
        .DB     "Wrong file",0,0
2093
MSG_NOTFOUND:
2094
        .DB     " not found",0,0
2095
MSG_CFGFPGA:
2096
        .DB     $0D,$0A,"Set temporary configuration...",0,0
2097
MSG_TRYUPDATE:
2098
        .DB     "Try update from ",0,0
2099
MSG__SDCARD:
2100
        .DB     "SD-card...",0,0
2101
MSG__RS232:
47 ddp 2102
        .DB     "RS-232...",$0D,$0A,$1B,"[0mNow, start file transfer using X-Modem-CRC protocol. ",$1B,"[30m",0
68 ddp 2103
MSG_CLRCURRLINE:
2104
        .DB     $0D,$1B,"[K",0,0
42 ddp 2105
MSG_WRONGDATA:
2106
        .DB     "Data is corrupt! Update is canceled.",0,0
2107
MSG_RECHECK:
2108
        .DB     "Recheck flash...   ",0
2109
MSG_MAINOK:
2110
        .DB     "Ok!",0
2111
MSG_MAINBAD:
2112
        .DB     "Update is failure.",0,0
13 ddp 2113
MSG_TITLE:
288 ddp 2114
.INCLUDE "evotitle.inc"
13 ddp 2115
;
2116
PACKED_FPGA:
2117
.NOLIST
288 ddp 2118
.INCLUDE "fpga.inc"
13 ddp 2119
.LIST
2120
;
2121
;--------------------------------------
2122
;
42 ddp 2123
        .ORG    FLASHEND-$0007
2124
BOOT_VERS:
2125
        .DW     0,0,0,0,0,0     ;здесь будет строчка описателя bootloader-а
2126
        .DW     0               ;здесь будет дата(версия) bootloader-а
2127
        .DW     0               ;здесь будет CRC bootloader-а
13 ddp 2128
BOOTLOADER_END: