Subversion Repositories pentevo

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1029 chrv 1
 
2
AVRA   Ver. 1.2.3 evoflash.asm Mon Nov 14 18:42:55 2011
3
 
4
 
5
          .LIST
6
          .LISTMAC
7
 
8
          .DEF    FF_FL   =R08
9
          .DEF    FF      =R13    ;всегда = $FF
10
          .DEF    ONE     =R14    ;всегда = $01
11
          .DEF    NULL    =R15    ;всегда = $00
12
          .DEF    DATA    =R16
13
          .DEF    TEMP    =R17
14
          .DEF    COUNT   =R18
15
          .DEF    BITS    =R19
16
         ;локально используются: R0,R1,R20,R21,R24,R25
17
 
18
          .EQU    DBSIZE_HI       =HIGH(4096)
19
          .EQU    DBMASK_HI       =HIGH(4095)
20
          .EQU    nCONFIG         =PORTF0
21
          .EQU    nSTATUS         =PORTF1
22
          .EQU    CONF_DONE       =PORTF2
23
 
24
          .EQU    CMD_17          =$51    ;read_single_block
25
          .EQU    ACMD_41         =$69    ;sd_send_op_cond
26
 
27
          .EQU    SD_CS0          =$57
28
          .EQU    SD_CS1          =$5F
29
          .EQU    FLASH_LOADDR    =$F0
30
          .EQU    FLASH_MIDADDR   =$F1
31
          .EQU    FLASH_HIADDR    =$F2
32
          .EQU    FLASH_DATA      =$F3
33
          .EQU    FLASH_CTRL      =$F4
34
          .EQU    SCR_LOADDR      =$40
35
          .EQU    SCR_HIADDR      =$41
36
          .EQU    SCR_CHAR        =$44
37
          .EQU    SCR_MODE        =$4E
38
         ;
39
         ;--------------------------------------
40
         ;
41
          .DSEG
42
                  .ORG    $0100
43
          BUFFER:
44
                  .ORG    $0300
45
          BUF4FAT:
46
                  .ORG    $0500
47
D:000500    CAL_FAT:.BYTE   1       ;тип обнаруженной FAT
48
D:000501    MANYFAT:.BYTE   1       ;количество FAT-таблиц
49
D:000502    BYTSSEC:.BYTE   1       ;количество секторов в кластере
50
D:000503    ROOTCLS:.BYTE   4       ;сектор начала root директории
51
D:000507    SEC_FAT:.BYTE   4       ;количество секторов одной FAT
52
D:00050b    RSVDSEC:.BYTE   2       ;размер резервной области
53
D:00050d    STARTRZ:.BYTE   4       ;начало диска/раздела
54
D:000511    FRSTDAT:.BYTE   4       ;адрес первого сектора данных от BPB
55
D:000515    SEC_DSC:.BYTE   4       ;количество секторов на диске/разделе
56
D:000519    CLS_DSC:.BYTE   4       ;количество кластеров на диске/разделе
57
D:00051d    FATSTR0:.BYTE   4       ;начало первой FAT таблицы
58
D:000521    FATSTR1:.BYTE   4       ;начало второй FAT таблицы
59
D:000525    TEK_DIR:.BYTE   4       ;кластер текущей директории
60
D:000529    KCLSDIR:.BYTE   1       ;кол-во кластеров директории
61
D:00052a    NUMSECK:.BYTE   1       ;счетчик секторов в кластере
62
D:00052b    TFILCLS:.BYTE   4       ;текущий кластер
63
D:00052f    MPHWOST:.BYTE   1       ;кол-во секторов в последнем кластере
64
D:000530    KOL_CLS:.BYTE   4       ;кол-во кластеров файла минус 1
65
D:000534    ZTFILCLS:.BYTE  4
66
D:000538    ZMPHWOST:.BYTE  1
67
D:000539    ZKOL_CLS:.BYTE  4
68
D:00053d    SDERROR:.BYTE   1
69
          LASTSECFLAG:
70
D:00053e            .BYTE   1
71
D:00053f    F_ADDR0:.BYTE   1
72
D:000540    F_ADDR1:.BYTE   1
73
D:000541    F_ADDR2:.BYTE   1
74
D:000542    ERRFLG1:.BYTE   1
75
D:000543    ERRFLG2:.BYTE   1
76
         ;
77
         ;--------------------------------------
78
         ;
79
          .CSEG
80
                  .ORG    0
81
C:000000 940c 1525         JMP     START
82
C:000002 940c 1525         JMP     START   ;EXT_INT0       ; IRQ0 Handler
83
C:000004 940c 1525         JMP     START   ;EXT_INT1       ; IRQ1 Handler
84
C:000006 940c 1525         JMP     START   ;EXT_INT2       ; IRQ2 Handler
85
C:000008 940c 1525         JMP     START   ;EXT_INT3       ; IRQ3 Handler
86
C:00000a 940c 1525         JMP     START   ;EXT_INT4       ; IRQ4 Handler
87
C:00000c 940c 1525         JMP     START   ;EXT_INT5       ; IRQ5 Handler
88
C:00000e 940c 1525         JMP     START   ;EXT_INT6       ; IRQ6 Handler
89
C:000010 940c 1525         JMP     START   ;EXT_INT7       ; IRQ7 Handler
90
C:000012 940c 1525         JMP     START   ;TIM2_COMP      ; Timer2 Compare Handler
91
C:000014 940c 1525         JMP     START   ;TIM2_OVF       ; Timer2 Overflow Handler
92
C:000016 940c 1525         JMP     START   ;TIM1_CAPT      ; Timer1 Capture Handler
93
C:000018 940c 1525         JMP     START   ;TIM1_COMPA     ; Timer1 CompareA Handler
94
C:00001a 940c 1525         JMP     START   ;TIM1_COMPB     ; Timer1 CompareB Handler
95
C:00001c 940c 1525         JMP     START   ;TIM1_OVF       ; Timer1 Overflow Handler
96
C:00001e 940c 1525         JMP     START   ;TIM0_COMP      ; Timer0 Compare Handler
97
C:000020 940c 1525         JMP     START   ;TIM0_OVF       ; Timer0 Overflow Handler
98
C:000022 940c 1525         JMP     START   ;SPI_STC        ; SPI Transfer Complete Handler
99
C:000024 940c 1525         JMP     START   ;USART0_RXC     ; USART0 RX Complete Handler
100
C:000026 940c 1525         JMP     START   ;USART0_DRE     ; USART0,UDR Empty Handler
101
C:000028 940c 1525         JMP     START   ;USART0_TXC     ; USART0 TX Complete Handler
102
C:00002a 940c 1525         JMP     START   ;ADC            ; ADC Conversion Complete Handler
103
C:00002c 940c 1525         JMP     START   ;EE_RDY         ; EEPROM Ready Handler
104
C:00002e 940c 1525         JMP     START   ;ANA_COMP       ; Analog Comparator Handler
105
C:000030 940c 1525         JMP     START   ;TIM1_COMPC     ; Timer1 CompareC Handler
106
C:000032 940c 1525         JMP     START   ;TIM3_CAPT      ; Timer3 Capture Handler
107
C:000034 940c 1525         JMP     START   ;TIM3_COMPA     ; Timer3 CompareA Handler
108
C:000036 940c 1525         JMP     START   ;TIM3_COMPB     ; Timer3 CompareB Handler
109
C:000038 940c 1525         JMP     START   ;TIM3_COMPC     ; Timer3 CompareC Handler
110
C:00003a 940c 1525         JMP     START   ;TIM3_OVF       ; Timer3 Overflow Handler
111
C:00003c 940c 1525         JMP     START   ;USART1_RXC     ; USART1 RX Complete Handler
112
C:00003e 940c 1525         JMP     START   ;USART1_DRE     ; USART1,UDR Empty Handler
113
C:000040 940c 1525         JMP     START   ;USART1_TXC     ; USART1 TX Complete Handler
114
C:000042 940c 1525         JMP     START   ;TWI_INT        ; Two-wire Serial Interface Interrupt Handler
115
C:000044 940c 1525         JMP     START   ;SPM_RDY        ; SPM Ready Handler
116
         ;
117
         ;--------------------------------------
118
         ;
119
          MSG_CFGFPGA:
120
                  .DB     $0D,$0A,$0A,$0A,"Load FPGA configuration... ",0
121
C:000046 0D0A0A0A4C6F6164204650474120636F6E66696775726174696F6E2E2E2E2000
122
          MSG_OK:
123
                  .DB     "Ok!",$0A
124
C:000056 4F6B210A
125
          MSG_NEWLINE:
126
                  .DB     $0D,$0A,0,0
127
C:000058 0D0A0000
128
         ;
129
          MSG_TITLE:
130
                  .DB     "  ZX Evolution Flasher ",0
131
C:00005A 20205A582045766F6C7574696F6E20466C61736865722000
132
          MSG_ID_FLASH:
133
                  .DB     "ID flash memory chip: ",0,0
134
C:000066 494420666C617368206D656D6F727920636869703A200000
135
          MSG_OPENFILE:
136
                  .DB     "Open file from SD-card...",0
137
C:000072 4F70656E2066696C652066726F6D2053442D636172642E2E2E00
138
          MSG_SDERROR:
139
                  .DB     "SD error: ",0,0
140
C:00007F 5344206572726F723A200000
141
          MSG_CARD:
142
                  .DB     "Card",0,0
143
C:000085 436172640000
144
          MSG_READERROR:
145
                  .DB     "Read error",0,0
146
C:000088 52656164206572726F720000
147
          MSG_FAT:
148
                  .DB     "FAT",0
149
C:00008E 46415400
150
          MSG_FILE:
151
                  .DB     "File",0,0
152
C:000090 46696C650000
153
          MSG_NOTFOUND:
154
                  .DB     " not found",0,0
155
C:000093 206E6F7420666F756E640000
156
          MSG_EMPTY:
157
                  .DB     " empty",0,0
158
C:000099 20656D7074790000
159
          MSG_TOOBIG:
160
                  .DB     " too big",0,0
161
C:00009D 20746F6F206269670000
162
          MSG_F_ERASE:
163
                  .DB     "Erase...",0,0
164
C:0000A2 45726173652E2E2E0000
165
          MSG_F_WRITE:
166
                  .DB     "Write...",0,0
167
C:0000A7 57726974652E2E2E0000
168
          MSG_F_CHECK:
169
                  .DB     "Check...",0,0
170
C:0000AC 436865636B2E2E2E0000
171
          MSG_F_COMPLETE:
172
                  .DB     "Successfully complete.",0,0
173
C:0000B1 5375636365737366756C6C7920636F6D706C6574652E0000
174
          MSG_F_ERROR:
175
                  .DB     "ERROR!",0,0
176
C:0000BD 4552524F52210000
177
          MSG_HALT:
178
                  .DB     "HALT!",0
179
C:0000C1 48414C542100
180
         ;
181
          CMD00:  .DB     $40,$00,$00,$00,$00,$95
182
C:0000C4 400000000095
183
          CMD08:  .DB     $48,$00,$00,$01,$AA,$87
184
C:0000C7 48000001AA87
185
          CMD16:  .DB     $50,$00,$00,$02,$00,$FF
186
C:0000CA 5000000200FF
187
          CMD55:  .DB     $77,$00,$00,$00,$00,$FF ;app_cmd
188
C:0000CD 7700000000FF
189
          CMD58:  .DB     $7A,$00,$00,$00,$00,$FF ;read_ocr
190
C:0000D0 7A00000000FF
191
          CMD59:  .DB     $7B,$00,$00,$00,$00,$FF ;crc_on_off
192
C:0000D3 7B00000000FF
193
          FILENAME:
194
                  .DB     "ZXEVO   ROM",0
195
C:0000D6 5A5845564F202020524F4D00
196
         ;
197
          PACKED_FPGA:
198
          .LIST
199
          .INCLUDE "_NVRAM.ASM"
200
         ;
201
         ;--------------------------------------
202
         ;
203
          .EQU    RTC_ADDRESS             =$A0    ; Address of PCF8583 RTC chip.
204
          .EQU    RTC_COMMON_MODE_REG     =$FE    ; RTC's register for common modes.
205
         ;.EQU    MODE_VGA                =$01    ; VGA mode (0 - not set/1 - set).
206
 
207
          .EQU    TW_START                =$08
208
          .EQU    TW_REP_START            =$10
209
          .EQU    TW_MT_SLA_ACK           =$18
210
          .EQU    TW_MT_DATA_ACK          =$28
211
          .EQU    TW_MR_SLA_ACK           =$40
212
 
213
          .MACRO  TW_SEND_STOP
214
                  LDI     TEMP,(1<<TWINT)|(1<<TWEN)|(1<<TWSTO)
215
                  STS     TWCR,TEMP
216
          .ENDMACRO
217
         ;
218
         ;--------------------------------------
219
         ;out:   DATA == mode (bit.0 - CLR == TV mode, SET == VGA mode)
220
          NVRAM_READ_MODE:
221
         ;init i2c
222
         ;SCL frequency = CPU clk/ ( 16 + 2* (TWBR) * 4^(TWPS) )
223
         ;11052000 / (16 + 2*48 ) = 98678,5Hz (100000Hz recommended for PCF8583)
224
C:0014d6 92f0 0071         STS     TWSR,NULL
225
C:0014d8 e310              LDI     TEMP,48
226
C:0014d9 9310 0070         STS     TWBR,TEMP
227
 
228
         ;reset RTC
229
         ;write 0 to control/status register [0] on PCF8583
230
 
231
C:0014db d027              RCALL   TW_SEND_START
232
C:0014dc 7108              ANDI    DATA,TW_START|TW_REP_START
233
C:0014dd f051              BREQ    RTC_ERROR1
234
 
235
C:0014de ea00              LDI     DATA,RTC_ADDRESS
236
C:0014df d02e              RCALL   TW_SEND_ADDR
237
C:0014e0 3108              CPI     DATA,TW_MT_SLA_ACK
238
C:0014e1 f431              BRNE    RTC_ERROR1
239
 
240
C:0014e2 e000              LDI     DATA,0
241
C:0014e3 d02a              RCALL   TW_SEND_DATA
242
C:0014e4 3208              CPI     DATA,TW_MT_DATA_ACK
243
C:0014e5 f411              BRNE    RTC_ERROR1
244
 
245
C:0014e6 e000              LDI     DATA,0
246
C:0014e7 d026              RCALL   TW_SEND_DATA
247
          RTC_ERROR1:
248
C:0014e8   +          TW_SEND_STOP
249
C:0014e8 e914      LDI     TEMP,(1<<TWINT)|(1<<TWEN)|(1<<TWSTO)
250
C:0014e9 9310 0074 STS     TWCR,TEMP
251
 
252
         ;restore mode register from NVRAM
253
 
254
C:0014eb d017              RCALL   TW_SEND_START
255
C:0014ec 7108              ANDI    DATA,TW_START|TW_REP_START
256
C:0014ed f081              BREQ    RTC_ERROR2
257
 
258
C:0014ee ea00              LDI     DATA,RTC_ADDRESS
259
C:0014ef d01e              RCALL   TW_SEND_ADDR
260
C:0014f0 3108              CPI     DATA,TW_MT_SLA_ACK
261
C:0014f1 f461              BRNE    RTC_ERROR2
262
 
263
C:0014f2 ef0e              LDI     DATA,RTC_COMMON_MODE_REG
264
C:0014f3 d01a              RCALL   TW_SEND_DATA
265
C:0014f4 3208              CPI     DATA,TW_MT_DATA_ACK
266
C:0014f5 f441              BRNE    RTC_ERROR2
267
 
268
C:0014f6 d00c              RCALL   TW_SEND_START
269
C:0014f7 3100              CPI     DATA,TW_REP_START
270
 
271
C:0014f8 ea01              LDI     DATA,RTC_ADDRESS|$01
272
C:0014f9 d014              RCALL   TW_SEND_ADDR
273
C:0014fa 3400              CPI     DATA,TW_MR_SLA_ACK
274
C:0014fb f411              BRNE    RTC_ERROR2
275
 
276
C:0014fc d01e              RCALL   TW_READ_DATA
277
C:0014fd c001              RJMP    RTC_OK2
278
          RTC_ERROR2:
279
C:0014fe e000              LDI     DATA,0
280
          RTC_OK2:
281
C:0014ff   +          TW_SEND_STOP
282
C:0014ff e914      LDI     TEMP,(1<<TWINT)|(1<<TWEN)|(1<<TWSTO)
283
C:001500 9310 0074 STS     TWCR,TEMP
284
C:001502 9508              RET
285
         ;
286
         ;--------------------------------------
287
         ;out:   DATA == i2c status
288
          TW_SEND_START:
289
         ;start transmit
290
C:001503 ea04              LDI     DATA,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
291
C:001504 9300 0074         STS     TWCR,DATA
292
         ;wait for flag
293
          TW_SS_WAIT:
294
C:001506 9100 0074         LDS     DATA,TWCR
295
C:001508 ff07              SBRS    DATA,TWINT
296
C:001509 cffc              RJMP    TW_SS_WAIT
297
         ;return status
298
C:00150a 9100 0071         LDS     DATA,TWSR
299
C:00150c 7f08              ANDI    DATA,$F8
300
C:00150d 9508              RET
301
         ;
302
         ;--------------------------------------
303
         ;in:    DATA == data/address
304
         ;out:   DATA == i2c status
305
          TW_SEND_ADDR:
306
          TW_SEND_DATA:
307
         ;set data/address
308
C:00150e 9300 0073         STS     TWDR,DATA
309
         ;enable transmit
310
C:001510 e804              LDI     DATA,(1<<TWINT)|(1<<TWEN)
311
C:001511 9300 0074         STS     TWCR,DATA
312
         ;wait for end transmit
313
          TW_SD_WAIT:
314
C:001513 9100 0074         LDS     DATA,TWCR
315
C:001515 ff07              SBRS    DATA,TWINT
316
C:001516 cffc              RJMP    TW_SD_WAIT
317
         ;return status
318
C:001517 9100 0071         LDS     DATA,TWSR
319
C:001519 7f08              ANDI    DATA,$F8
320
C:00151a 9508              RET
321
         ;
322
         ;--------------------------------------
323
         ;out:   DATA == data
324
          TW_READ_DATA:
325
         ;enable transmit
326
C:00151b e804              LDI     DATA,(1<<TWINT)|(1<<TWEN)
327
C:00151c 9300 0074         STS     TWCR,DATA
328
         ;wait for flag set
329
          TW_RD_WAIT:
330
C:00151e 9100 0074         LDS     DATA,TWCR
331
C:001520 ff07              SBRS    DATA,TWINT
332
C:001521 cffc              RJMP    TW_RD_WAIT
333
         ;get data
334
C:001522 9100 0073         LDS     DATA,TWDR
335
         ;NOT return status
336
         ;        LDS     DATA,TWSR
337
         ;        ANDI    DATA,$F8
338
C:001524 9508              RET
339
         ;
340
         ;--------------------------------------
341
         ;
342
          ;
343
         ;
344
         ;--------------------------------------
345
         ;
346
C:001525 94f8      START:  CLI
347
C:001526 24ff              CLR     NULL
348
C:001527 e011              LDI     TEMP,$01
349
C:001528 2ee1              MOV     ONE,TEMP
350
C:001529 ef1f              LDI     TEMP,$FF
351
C:00152a 2ed1              MOV     FF,TEMP
352
         ;WatchDog OFF
353
C:00152b e11f              LDI     TEMP,0B00011111
354
C:00152c bd11              OUT     WDTCR,TEMP
355
C:00152d bcf1              OUT     WDTCR,NULL
356
 
357
C:00152e bef4              OUT     MCUCSR,NULL
358
         ;
359
C:00152f ef1f              LDI     TEMP,LOW(RAMEND)
360
C:001530 bf1d              OUT     SPL,TEMP
361
C:001531 e110              LDI     TEMP,HIGH(RAMEND)
362
C:001532 bf1e              OUT     SPH,TEMP
363
         ;
364
C:001533 beeb              OUT     RAMPZ,ONE
365
         ;
366
C:001534 ef1f              LDI     TEMP,      0B11111111
367
C:001535   +          OUTPORT PORTG,TEMP
368
C:001535 9310 0065 STS     PORTG+$20*(PORTG<$40),TEMP
369
C:001537 e010              LDI     TEMP,      0B00000000
370
C:001538   +          OUTPORT DDRG,TEMP
371
C:001538 9310 0064 STS     DDRG+$20*(DDRG<$40),TEMP
372
 
373
C:00153a e018              LDI     TEMP,      0B00001000
374
C:00153b   +          OUTPORT PORTF,TEMP
375
C:00153b 9310 0062 STS     PORTF+$20*(PORTF<$40),TEMP
376
C:00153d   +          OUTPORT DDRF,TEMP
377
C:00153d 9310 0061 STS     DDRF+$20*(DDRF<$40),TEMP
378
 
379
C:00153f ef13              LDI     TEMP,      0B11110011
380
C:001540 b913              OUT     PORTE,TEMP
381
C:001541 e010              LDI     TEMP,      0B00000000
382
C:001542 b912              OUT     DDRE,TEMP
383
 
384
C:001543 ef1f              LDI     TEMP,      0B11111111
385
C:001544 bb12              OUT     PORTD,TEMP
386
C:001545 e010              LDI     TEMP,      0B00000000
387
C:001546 bb11              OUT     DDRD,TEMP
388
 
389
C:001547 ed1f              LDI     TEMP,      0B11011111
390
C:001548 bb15              OUT     PORTC,TEMP
391
C:001549 e010              LDI     TEMP,      0B00000000
392
C:00154a bb14              OUT     DDRC,TEMP
393
 
394
C:00154b ef19              LDI     TEMP,      0B11111001
395
C:00154c bb18              OUT     PORTB,TEMP
396
C:00154d e817              LDI     TEMP,      0B10000111
397
C:00154e bb17              OUT     DDRB,TEMP
398
 
399
C:00154f ef1f              LDI     TEMP,      0B11111111
400
C:001550 bb1b              OUT     PORTA,TEMP
401
C:001551 e010              LDI     TEMP,      0B00000000
402
C:001552 bb1a              OUT     DDRA,TEMP
403
         ;UART1 Set baud rate
404
C:001553   +          OUTPORT UBRR1H,NULL
405
C:001553 92f0 0098 STS     UBRR1H+$20*(UBRR1H<$40),NULL
406
C:001555 e015              LDI     TEMP,5     ;115200 baud @ 11059.2 kHz, Normal speed
407
C:001556   +          OUTPORT UBRR1L,TEMP
408
C:001556 9310 0099 STS     UBRR1L+$20*(UBRR1L<$40),TEMP
409
         ;UART1 Normal Speed
410
C:001558   +          OUTPORT UCSR1A,NULL
411
C:001558 92f0 009b STS     UCSR1A+$20*(UCSR1A<$40),NULL
412
         ;UART1 data8bit, 2stopbits
413
C:00155a e01e              LDI     TEMP,(1<<UCSZ1)|(1<<UCSZ0)|(1<<USBS)
414
C:00155b   +          OUTPORT UCSR1C,TEMP
415
C:00155b 9310 009d STS     UCSR1C+$20*(UCSR1C<$40),TEMP
416
         ;UART1 Разрешаем передачу
417
C:00155d e018              LDI     TEMP,(1<<TXEN)
418
C:00155e   +          OUTPORT UCSR1B,TEMP
419
C:00155e 9310 009a STS     UCSR1B+$20*(UCSR1B<$40),TEMP
420
         ;SPI init
421
C:001560 e011              LDI     TEMP,(1<<SPI2X)
422
C:001561 b91e              OUT     SPSR,TEMP
423
C:001562 e710              LDI     TEMP,(1<<SPE)|(1<<DORD)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)
424
C:001563 b91d              OUT     SPCR,TEMP
425
         ;ждём включения ATX, а потом ещё чуть-чуть.
426
C:001564 9b00      UP11:   SBIS    PINF,0 ;PINC,5 ; а если powergood нет вообще ?
427
C:001565 cffe              RJMP    UP11
428
C:001566 e005              LDI     DATA,5
429
C:001567 d631              RCALL   DELAY
430
 
431
C:001568   +          LDIZ    MSG_CFGFPGA*2
432
C:001568 e8ec      LDI     ZL,LOW(MSG_CFGFPGA*2)
433
C:001569 e0f0      LDI     ZH,HIGH(MSG_CFGFPGA*2)
434
C:00156a d5e3              RCALL   UART_PRINTSTRZ
435
         ;загрузка FPGA
436
C:00156b   +          INPORT  TEMP,DDRF
437
C:00156b 9110 0061 LDS     TEMP,DDRF+$20*(DDRF<$40)
438
C:00156d 6011              SBR     TEMP,(1<<nCONFIG)
439
C:00156e   +          OUTPORT DDRF,TEMP
440
C:00156e 9310 0061 STS     DDRF+$20*(DDRF<$40),TEMP
441
 
442
C:001570 e913              LDI     TEMP,147 ;40 us @ 11.0592 MHz
443
C:001571 951a      LDFPGA1:DEC     TEMP    ;1
444
C:001572 f7f1              BRNE    LDFPGA1 ;2
445
 
446
C:001573   +          INPORT  TEMP,DDRF
447
C:001573 9110 0061 LDS     TEMP,DDRF+$20*(DDRF<$40)
448
C:001575 7f1e              CBR     TEMP,(1<<nCONFIG)
449
C:001576   +          OUTPORT DDRF,TEMP
450
C:001576 9310 0061 STS     DDRF+$20*(DDRF<$40),TEMP
451
 
452
C:001578 9b01      LDFPGA2:SBIS    PINF,nSTATUS
453
C:001579 cffe              RJMP    LDFPGA2
454
 
455
C:00157a   +          LDIZ    PACKED_FPGA*2
456
C:00157a ebe8      LDI     ZL,LOW(PACKED_FPGA*2)
457
C:00157b e0f1      LDI     ZH,HIGH(PACKED_FPGA*2)
458
C:00157c   +          LDIY    BUFFER
459
C:00157c e0c0      LDI     YL,LOW(BUFFER)
460
C:00157d e0d1      LDI     YH,HIGH(BUFFER)
461
         ;(не трогаем стек! всё ОЗУ под буфер)
462
C:00157e e810              LDI     TEMP,$80
463
C:00157f 9005      MS:     LPM     R0,Z+
464
C:001580 9209              ST      Y+,R0
465
         ;-begin-PUT_BYTE_1---
466
C:001581 b80f              OUT     SPDR,R0
467
C:001582 9b77      PUTB1:  SBIS    SPSR,SPIF
468
C:001583 cffe              RJMP    PUTB1
469
         ;-end---PUT_BYTE_1---
470
C:001584 50d1              SUBI    YH,HIGH(BUFFER) ;
471
C:001585 70df              ANDI    YH,DBMASK_HI    ;Y warp
472
C:001586   +          ADDI    YH,HIGH(BUFFER) ;
473
C:001586 5fdf      SUBI    YH,(-HIGH(BUFFER)&$FF)
474
C:001587 e052      M0:     LDI     R21,$02
475
C:001588 ef4f              LDI     R20,$FF
476
          M1:
477
C:001589 0f11      M1X:    ADD     TEMP,TEMP
478
C:00158a f411              BRNE    M2
479
C:00158b 9115              LPM     TEMP,Z+
480
C:00158c 1f11              ROL     TEMP
481
C:00158d 1f44      M2:     ROL     R20
482
C:00158e f7d0              BRCC    M1X
483
C:00158f 955a              DEC     R21
484
C:001590 f449              BRNE    X2
485
C:001591 e002              LDI     DATA,2
486
C:001592 9545              ASR     R20
487
C:001593 f080              BRCS    N1
488
C:001594 9503              INC     DATA
489
C:001595 9543              INC     R20
490
C:001596 f051              BREQ    N2
491
C:001597 e053              LDI     R21,$03
492
C:001598 e34f              LDI     R20,$3F
493
C:001599 cfef              RJMP    M1
494
 
495
C:00159a 955a      X2:     DEC     R21
496
C:00159b f4b1              BRNE    X3
497
C:00159c 9546              LSR     R20
498
C:00159d f308              BRCS    MS
499
C:00159e 9553              INC     R21
500
C:00159f cfe9              RJMP    M1
501
 
502
C:0015a0 0f04      X6:     ADD     DATA,R20
503
C:0015a1 e054      N2:     LDI     R21,$04
504
C:0015a2 ef4f              LDI     R20,$FF
505
C:0015a3 cfe5              RJMP    M1
506
 
507
C:0015a4 9543      N1:     INC     R20
508
C:0015a5 f4d1              BRNE    M4
509
C:0015a6 9553              INC     R21
510
C:0015a7 9547      N5:     ROR     R20
511
C:0015a8 f158              BRCS    DEMLZEND
512
C:0015a9 1f55              ROL     R21
513
C:0015aa 0f11              ADD     TEMP,TEMP
514
C:0015ab f411              BRNE    N6
515
C:0015ac 9115              LPM     TEMP,Z+
516
C:0015ad 1f11              ROL     TEMP
517
C:0015ae f7c0      N6:     BRCC    N5
518
C:0015af 0f05              ADD     DATA,R21
519
C:0015b0 e056              LDI     R21,6
520
C:0015b1 cfd7              RJMP    M1
521
C:0015b2 955a      X3:     DEC     R21
522
C:0015b3 f411              BRNE    X4
523
C:0015b4 e001              LDI     DATA,1
524
C:0015b5 c00b              RJMP    M3
525
C:0015b6 955a      X4:     DEC     R21
526
C:0015b7 f429              BRNE    X5
527
C:0015b8 9543              INC     R20
528
C:0015b9 f431              BRNE    M4
529
C:0015ba e055              LDI     R21,$05
530
C:0015bb e14f              LDI     R20,$1F
531
C:0015bc cfcc              RJMP    M1
532
C:0015bd 955a      X5:     DEC     R21
533
C:0015be f709              BRNE    X6
534
C:0015bf 2f54              MOV     R21,R20
535
C:0015c0 9145      M4:     LPM     R20,Z+
536
C:0015c1 955a      M3:     DEC     R21
537
C:0015c2 2fa4              MOV     XL,R20
538
C:0015c3 2fb5              MOV     XH,R21
539
C:0015c4 0fac              ADD     XL,YL
540
C:0015c5 1fbd              ADC     XH,YH
541
          LDIRLOOP:
542
C:0015c6 50b1              SUBI    XH,HIGH(BUFFER) ;
543
C:0015c7 70bf              ANDI    XH,DBMASK_HI    ;X warp
544
C:0015c8   +          ADDI    XH,HIGH(BUFFER) ;
545
C:0015c8 5fbf      SUBI    XH,(-HIGH(BUFFER)&$FF)
546
C:0015c9 900d              LD      R0,X+
547
C:0015ca 9209              ST      Y+,R0
548
         ;-begin-PUT_BYTE_2---
549
C:0015cb b80f              OUT     SPDR,R0
550
C:0015cc 9b77      PUTB2:  SBIS    SPSR,SPIF
551
C:0015cd cffe              RJMP    PUTB2
552
         ;-end---PUT_BYTE_2---
553
C:0015ce 50d1              SUBI    YH,HIGH(BUFFER) ;
554
C:0015cf 70df              ANDI    YH,DBMASK_HI    ;Y warp
555
C:0015d0   +          ADDI    YH,HIGH(BUFFER) ;
556
C:0015d0 5fdf      SUBI    YH,(-HIGH(BUFFER)&$FF)
557
C:0015d1 950a              DEC     DATA
558
C:0015d2 f799              BRNE    LDIRLOOP
559
 
560
C:0015d3 cfb3              RJMP    M0
561
         ;теперь можно юзать стек
562
          DEMLZEND:
563
C:0015d4 9b02              SBIS    PINF,CONF_DONE
564
C:0015d5 cffe              RJMP    DEMLZEND
565
         ;SPI reinit
566
C:0015d6 e510              LDI     TEMP,(1<<SPE)|(0<<DORD)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)
567
C:0015d7 b91d              OUT     SPCR,TEMP
568
 
569
C:0015d8 9a16              SBI     DDRE,6
570
C:0015d9   +          LED_OFF
571
C:0015d9 9ac7      SBI     PORTB,7
572
C:0015da   +          LDIZ    MSG_OK*2
573
C:0015da eaec      LDI     ZL,LOW(MSG_OK*2)
574
C:0015db e0f0      LDI     ZH,HIGH(MSG_OK*2)
575
C:0015dc d571              RCALL   UART_PRINTSTRZ
576
         ; - - - - - - - - - - - - - - - - - - -
577
C:0015dd def8              RCALL   NVRAM_READ_MODE
578
C:0015de e41e              LDI     TEMP,SCR_MODE
579
C:0015df d560              RCALL   FPGA_REG
580
         ; - - - - - - - - - - - - - - - - - - -
581
C:0015e0 e0a0              LDI     XL,0
582
C:0015e1 e0b0              LDI     XH,0
583
C:0015e2 d571              RCALL   SET_CURSOR
584
C:0015e3   +          LDIZ    MSG_TITLE*2
585
C:0015e3 ebe4      LDI     ZL,LOW(MSG_TITLE*2)
586
C:0015e4 e0f0      LDI     ZH,HIGH(MSG_TITLE*2)
587
C:0015e5 d57a              RCALL   PRINTSTRZ
588
 
589
C:0015e6   +          LDIZ    LARGEBOOTSTART*2-4
590
C:0015e6 efec      LDI     ZL,LOW(LARGEBOOTSTART*2-4)
591
C:0015e7 edff      LDI     ZH,HIGH(LARGEBOOTSTART*2-4)
592
         ;        OUT     RAMPZ,ONE
593
C:0015e8 91a7              ELPM    XL,Z+
594
C:0015e9 91b6              ELPM    XH,Z
595
C:0015ea 2f0a              MOV     DATA,XL
596
C:0015eb 710f              ANDI    DATA,$1F
597
C:0015ec f0d9              BREQ    PRVERS9
598
C:0015ed 2f1b              MOV     TEMP,XH
599
C:0015ee 0faa              LSL     XL
600
C:0015ef 1f11              ROL     TEMP
601
C:0015f0 0faa              LSL     XL
602
C:0015f1 1f11              ROL     TEMP
603
C:0015f2 0faa              LSL     XL
604
C:0015f3 1f11              ROL     TEMP
605
C:0015f4 701f              ANDI    TEMP,$0F
606
C:0015f5 f091              BREQ    PRVERS9
607
C:0015f6 301d              CPI     TEMP,13
608
C:0015f7 f480              BRCC    PRVERS9
609
C:0015f8 2f2b              MOV     COUNT,XH
610
C:0015f9 9526              LSR     COUNT
611
C:0015fa 732f              ANDI    COUNT,$3F
612
C:0015fb 3029              CPI     COUNT,9
613
C:0015fc f058              BRCS    PRVERS9
614
C:0015fd 930f              PUSH    DATA
615
C:0015fe e208              LDI     DATA,$28 ;"("
616
C:0015ff d57b              RCALL   PUTCHAR
617
C:001600 2f02              MOV     DATA,COUNT
618
C:001601 d564              RCALL   DECBYTE
619
C:001602 2f01              MOV     DATA,TEMP
620
C:001603 d562              RCALL   DECBYTE
621
C:001604 910f              POP     DATA
622
C:001605 d560              RCALL   DECBYTE
623
C:001606 e209              LDI     DATA,$29 ;")"
624
C:001607 d573              RCALL   PUTCHAR
625
          PRVERS9:
626
         ; - - - - - - - - - - - - - - - - - - -
627
         ;информация о Flash-ROM чипе
628
C:001608 d543              RCALL   UART_NEWLINE
629
C:001609 e0a0              LDI     XL,0
630
C:00160a e0b2              LDI     XH,2
631
C:00160b d548              RCALL   SET_CURSOR
632
C:00160c   +          LDIZ    MSG_ID_FLASH*2
633
C:00160c ecec      LDI     ZL,LOW(MSG_ID_FLASH*2)
634
C:00160d e0f0      LDI     ZH,HIGH(MSG_ID_FLASH*2)
635
C:00160e d551              RCALL   PRINTSTRZ
636
 
637
C:00160f d4b3              RCALL   F_ID
638
C:001610 2f0e              MOV     DATA,ZL
639
C:001611 d560              RCALL   HEXBYTE
640
C:001612 e200              LDI     DATA,$20
641
C:001613 d567              RCALL   PUTCHAR
642
C:001614 2f0f              MOV     DATA,ZH
643
C:001615 d55c              RCALL   HEXBYTE
644
         ; - - - - - - - - - - - - - - - - - - -
645
C:001616 d535              RCALL   UART_NEWLINE
646
C:001617 e0a0              LDI     XL,0
647
C:001618 e0b3              LDI     XH,3
648
C:001619 d53a              RCALL   SET_CURSOR
649
C:00161a   +          LDIZ    MSG_OPENFILE*2
650
C:00161a eee4      LDI     ZL,LOW(MSG_OPENFILE*2)
651
C:00161b e0f0      LDI     ZH,HIGH(MSG_OPENFILE*2)
652
C:00161c d543              RCALL   PRINTSTRZ
653
         ;
654
         ;инициализация SD карточки
655
C:00161d e51f              LDI     TEMP,SD_CS1
656
C:00161e ef0f              SER     DATA
657
C:00161f d520              RCALL   FPGA_REG
658
C:001620 e210              LDI     TEMP,32
659
C:001621 d2ad              RCALL   SD_RD_DUMMY
660
 
661
C:001622 e517              LDI     TEMP,SD_CS0
662
C:001623 ef0f              SER     DATA
663
C:001624 d51b              RCALL   FPGA_REG
664
C:001625 ef8f              SER     R24
665
C:001626   +  SDINIT1:LDIZ    CMD00*2
666
C:001626 e8e8      LDI     ZL,LOW(CMD00*2)
667
C:001627 e0f1      LDI     ZH,HIGH(CMD00*2)
668
C:001628 d2ab              RCALL   SD_WR_PGM_6
669
C:001629 958a              DEC     R24
670
C:00162a f411              BRNE    SDINIT2
671
C:00162b e001              LDI     DATA,1  ;нет SD
672
C:00162c c44a              RJMP    SD_ERROR
673
C:00162d 3001      SDINIT2:CPI     DATA,$01
674
C:00162e f7b9              BRNE    SDINIT1
675
 
676
C:00162f   +          LDIZ    CMD08*2
677
C:00162f e8ee      LDI     ZL,LOW(CMD08*2)
678
C:001630 e0f1      LDI     ZH,HIGH(CMD08*2)
679
C:001631 d2a2              RCALL   SD_WR_PGM_6
680
C:001632 e080              LDI     R24,$00
681
C:001633 ff02              SBRS    DATA,2
682
C:001634 e480              LDI     R24,$40
683
C:001635 e014              LDI     TEMP,4
684
C:001636 d298              RCALL   SD_RD_DUMMY
685
 
686
C:001637   +  SDINIT3:LDIZ    CMD55*2
687
C:001637 e9ea      LDI     ZL,LOW(CMD55*2)
688
C:001638 e0f1      LDI     ZH,HIGH(CMD55*2)
689
C:001639 d29a              RCALL   SD_WR_PGM_6
690
C:00163a e012              LDI     TEMP,2
691
C:00163b d293              RCALL   SD_RD_DUMMY
692
C:00163c e609              LDI     DATA,ACMD_41
693
C:00163d d290              RCALL   SD_EXCHANGE
694
C:00163e 2f08              MOV     DATA,R24
695
C:00163f d28e              RCALL   SD_EXCHANGE
696
 
697
C:001640   +          LDIZ    CMD55*2+2
698
C:001640 e9ec      LDI     ZL,LOW(CMD55*2+2)
699
C:001641 e0f1      LDI     ZH,HIGH(CMD55*2+2)
700
C:001642 e014              LDI     TEMP,4
701
C:001643 d293              RCALL   SD_WR_PGX
702
C:001644 2300              TST     DATA
703
C:001645 f789              BRNE    SDINIT3
704
 
705
C:001646   +  SDINIT4:LDIZ    CMD59*2
706
C:001646 eae6      LDI     ZL,LOW(CMD59*2)
707
C:001647 e0f1      LDI     ZH,HIGH(CMD59*2)
708
C:001648 d28b              RCALL   SD_WR_PGM_6
709
C:001649 2300              TST     DATA
710
C:00164a f7d9              BRNE    SDINIT4
711
 
712
C:00164b   +  SDINIT5:LDIZ    CMD16*2
713
C:00164b e9e4      LDI     ZL,LOW(CMD16*2)
714
C:00164c e0f1      LDI     ZH,HIGH(CMD16*2)
715
C:00164d d286              RCALL   SD_WR_PGM_6
716
C:00164e 2300              TST     DATA
717
C:00164f f7d9              BRNE    SDINIT5
718
         ;
719
         ; - - - - - - - - - - - - - - - - - - -
720
         ;поиск FAT, инициализация переменных
721
C:001650   +  WC_FAT: LDIX    0
722
C:001650 e0a0      LDI     XL,LOW(0)
723
C:001651 e0b0      LDI     XH,HIGH(0)
724
C:001652   +          LDIY    0
725
C:001652 e0c0      LDI     YL,LOW(0)
726
C:001653 e0d0      LDI     YH,HIGH(0)
727
C:001654 d2c2              RCALL   LOADLST
728
C:001655   +          LDIZ    BUF4FAT+$01BE
729
C:001655 ebee      LDI     ZL,LOW(BUF4FAT+$01BE)
730
C:001656 e0f4      LDI     ZH,HIGH(BUF4FAT+$01BE)
731
C:001657 8100              LD      DATA,Z
732
C:001658 2300              TST     DATA
733
C:001659 f4b9              BRNE    RDFAT05
734
C:00165a ece2              LDI     ZL,$C2
735
C:00165b 8100              LD      DATA,Z
736
C:00165c e010              LDI     TEMP,0
737
C:00165d 3001              CPI     DATA,$01
738
C:00165e f051              BREQ    RDFAT06
739
C:00165f e012              LDI     TEMP,2
740
C:001660 300b              CPI     DATA,$0B
741
C:001661 f039              BREQ    RDFAT06
742
C:001662 300c              CPI     DATA,$0C
743
C:001663 f029              BREQ    RDFAT06
744
C:001664 e011              LDI     TEMP,1
745
C:001665 3006              CPI     DATA,$06
746
C:001666 f011              BREQ    RDFAT06
747
C:001667 300e              CPI     DATA,$0E
748
C:001668 f441              BRNE    RDFAT05
749
C:001669 9310 0500 RDFAT06:STS     CAL_FAT,TEMP
750
C:00166b ece6              LDI     ZL,$C6
751
C:00166c 91a1              LD      XL,Z+
752
C:00166d 91b1              LD      XH,Z+
753
C:00166e 91c1              LD      YL,Z+
754
C:00166f 81d0              LD      YH,Z
755
C:001670 c02f              RJMP    RDFAT00
756
C:001671   +  RDFAT05:LDIZ    BUF4FAT
757
C:001671 e0e0      LDI     ZL,LOW(BUF4FAT)
758
C:001672 e0f3      LDI     ZH,HIGH(BUF4FAT)
759
C:001673 8535              LDD     BITS,Z+$0D
760
C:001674 e000              LDI     DATA,0
761
C:001675 e010              LDI     TEMP,0
762
C:001676 e028              LDI     COUNT,8
763
C:001677 9537      RDF051: ROR     BITS
764
C:001678 1d0f              ADC     DATA,NULL
765
C:001679 952a              DEC     COUNT
766
C:00167a f7e1              BRNE    RDF051
767
C:00167b 950a              DEC     DATA
768
C:00167c f409              BRNE    RDF052
769
C:00167d 9513              INC     TEMP
770
C:00167e 8506      RDF052: LDD     DATA,Z+$0E
771
C:00167f 8407              LDD     R0,Z+$0F
772
C:001680 2900              OR      DATA,R0
773
C:001681 f009              BREQ    RDF053
774
C:001682 9513              INC     TEMP
775
C:001683 8903      RDF053: LDD     DATA,Z+$13
776
C:001684 8804              LDD     R0,Z+$14
777
C:001685 2900              OR      DATA,R0
778
C:001686 f409              BRNE    RDF054
779
C:001687 9513              INC     TEMP
780
C:001688 a100      RDF054: LDD     DATA,Z+$20
781
C:001689 a001              LDD     R0,Z+$21
782
C:00168a 2900              OR      DATA,R0
783
C:00168b a002              LDD     R0,Z+$22
784
C:00168c 2900              OR      DATA,R0
785
C:00168d a003              LDD     R0,Z+$23
786
C:00168e 2900              OR      DATA,R0
787
C:00168f f409              BRNE    RDF055
788
C:001690 9513              INC     TEMP
789
C:001691 8905      RDF055: LDD     DATA,Z+$15
790
C:001692 7f00              ANDI    DATA,$F0
791
C:001693 3f00              CPI     DATA,$F0
792
C:001694 f409              BRNE    RDF056
793
C:001695 9513              INC     TEMP
794
C:001696 3014      RDF056: CPI     TEMP,4
795
C:001697 f011              BREQ    RDF057
796
C:001698 e003              LDI     DATA,3  ;не найдена FAT
797
C:001699 c3dd              RJMP    SD_ERROR
798
C:00169a 92d0 0500 RDF057: STS     CAL_FAT,FF
799
C:00169c   +          LDIY    0
800
C:00169c e0c0      LDI     YL,LOW(0)
801
C:00169d e0d0      LDI     YH,HIGH(0)
802
C:00169e   +          LDIX    0
803
C:00169e e0a0      LDI     XL,LOW(0)
804
C:00169f e0b0      LDI     XH,HIGH(0)
805
C:0016a0   +  RDFAT00:STSX    STARTRZ+0
806
C:0016a0 93a0 050d STS     STARTRZ+0,XL
807
C:0016a2 93b0 050e STS     STARTRZ+0+1,XH
808
C:0016a4   +          STSY    STARTRZ+2
809
C:0016a4 93c0 050f STS     STARTRZ+2,YL
810
C:0016a6 93d0 0510 STS     STARTRZ+2+1,YH
811
C:0016a8 d26e              RCALL   LOADLST
812
C:0016a9   +          LDIY    0
813
C:0016a9 e0c0      LDI     YL,LOW(0)
814
C:0016aa e0d0      LDI     YH,HIGH(0)
815
C:0016ab 89a6              LDD     XL,Z+22
816
C:0016ac 89b7              LDD     XH,Z+23         ;bpb_fatsz16
817
C:0016ad 2f0b              MOV     DATA,XH
818
C:0016ae 2b0a              OR      DATA,XL
819
C:0016af f421              BRNE    RDFAT01         ;если не fat12/16 (bpb_fatsz16=0)
820
C:0016b0 a1a4              LDD     XL,Z+36         ;то берем bpb_fatsz32 из смещения +36
821
C:0016b1 a1b5              LDD     XH,Z+37
822
C:0016b2 a1c6              LDD     YL,Z+38
823
C:0016b3 a1d7              LDD     YH,Z+39
824
C:0016b4   +  RDFAT01:STSX    SEC_FAT+0
825
C:0016b4 93a0 0507 STS     SEC_FAT+0,XL
826
C:0016b6 93b0 0508 STS     SEC_FAT+0+1,XH
827
C:0016b8   +          STSY    SEC_FAT+2       ;число секторов на fat-таблицу
828
C:0016b8 93c0 0509 STS     SEC_FAT+2,YL
829
C:0016ba 93d0 050a STS     SEC_FAT+2+1,YH
830
C:0016bc   +          LDIY    0
831
C:0016bc e0c0      LDI     YL,LOW(0)
832
C:0016bd e0d0      LDI     YH,HIGH(0)
833
C:0016be 89a3              LDD     XL,Z+19
834
C:0016bf 89b4              LDD     XH,Z+20         ;bpb_totsec16
835
C:0016c0 2f0b              MOV     DATA,XH
836
C:0016c1 2b0a              OR      DATA,XL
837
C:0016c2 f421              BRNE    RDFAT02         ;если не fat12/16 (bpb_totsec16=0)
838
C:0016c3 a1a0              LDD     XL,Z+32         ;то берем из bpb_totsec32 смещения +32
839
C:0016c4 a1b1              LDD     XH,Z+33
840
C:0016c5 a1c2              LDD     YL,Z+34
841
C:0016c6 a1d3              LDD     YH,Z+35
842
C:0016c7   +  RDFAT02:STSX    SEC_DSC+0
843
C:0016c7 93a0 0515 STS     SEC_DSC+0,XL
844
C:0016c9 93b0 0516 STS     SEC_DSC+0+1,XH
845
C:0016cb   +          STSY    SEC_DSC+2       ;к-во секторов на диске/разделе
846
C:0016cb 93c0 0517 STS     SEC_DSC+2,YL
847
C:0016cd 93d0 0518 STS     SEC_DSC+2+1,YH
848
         ;вычисляем rootdirsectors
849
C:0016cf 89a1              LDD     XL,Z+17
850
C:0016d0 89b2              LDD     XH,Z+18         ;bpb_rootentcnt
851
C:0016d1   +          LDIY    0
852
C:0016d1 e0c0      LDI     YL,LOW(0)
853
C:0016d2 e0d0      LDI     YH,HIGH(0)
854
C:0016d3 2f0b              MOV     DATA,XH
855
C:0016d4 2b0a              OR      DATA,XL
856
C:0016d5 f019              BREQ    RDFAT03
857
C:0016d6 e100              LDI     DATA,$10
858
C:0016d7 d315              RCALL   BCDE_A
859
C:0016d8 01ed              MOVW    YL,XL           ;это реализована формула
860
                                         ;rootdirsectors = ( (bpb_rootentcnt*32)+(bpb_bytspersec-1) )/bpb_bytspersec
861
                                         ;в Y rootdirsectors
862
                                         ;если fat32, то Y=0 всегда
863
C:0016d9 93df      RDFAT03:PUSH    YH
864
C:0016da 93cf              PUSH    YL
865
C:0016db 8900              LDD     DATA,Z+16       ;bpb_numfats
866
C:0016dc 9300 0501         STS     MANYFAT,DATA
867
C:0016de   +          LDSX    SEC_FAT+0
868
C:0016de 91a0 0507 LDS     XL,SEC_FAT+0
869
C:0016e0 91b0 0508 LDS     XH,SEC_FAT+0+1
870
C:0016e2   +          LDSY    SEC_FAT+2
871
C:0016e2 91c0 0509 LDS     YL,SEC_FAT+2
872
C:0016e4 91d0 050a LDS     YH,SEC_FAT+2+1
873
C:0016e6 950a              DEC     DATA
874
C:0016e7 0faa      RDF031: LSL     XL
875
C:0016e8 1fbb              ROL     XH
876
C:0016e9 1fcc              ROL     YL
877
C:0016ea 1fdd              ROL     YH
878
C:0016eb 950a              DEC     DATA
879
C:0016ec f7d1              BRNE    RDF031
880
C:0016ed 918f              POP     R24
881
C:0016ee 919f              POP     R25
882
                                         ;полный размер fat-области в секторах
883
C:0016ef d316              RCALL   HLDEPBC         ;прибавили rootdirsectors
884
C:0016f0 8586              LDD     R24,Z+14
885
C:0016f1 8597              LDD     R25,Z+15        ;bpb_rsvdseccnt
886
C:0016f2 9380 050b         STS     RSVDSEC+0,R24
887
C:0016f4 9390 050c         STS     RSVDSEC+1,R25
888
C:0016f6 d30f              RCALL   HLDEPBC         ;прибавили bpb_resvdseccnt
889
C:0016f7   +          STSX    FRSTDAT+0
890
C:0016f7 93a0 0511 STS     FRSTDAT+0,XL
891
C:0016f9 93b0 0512 STS     FRSTDAT+0+1,XH
892
C:0016fb   +          STSY    FRSTDAT+2       ;положили номер первого сектора данных
893
C:0016fb 93c0 0513 STS     FRSTDAT+2,YL
894
C:0016fd 93d0 0514 STS     FRSTDAT+2+1,YH
895
C:0016ff   +          LDIZ    SEC_DSC
896
C:0016ff e1e5      LDI     ZL,LOW(SEC_DSC)
897
C:001700 e0f5      LDI     ZH,HIGH(SEC_DSC)
898
C:001701 d2ee              RCALL   BCDEHLM         ;вычли из полного к-ва секторов раздела
899
C:001702   +          LDIZ    BUF4FAT
900
C:001702 e0e0      LDI     ZL,LOW(BUF4FAT)
901
C:001703 e0f3      LDI     ZH,HIGH(BUF4FAT)
902
C:001704 8505              LDD     DATA,Z+13
903
C:001705 9300 0502         STS     BYTSSEC,DATA
904
C:001707 d2e5              RCALL   BCDE_A          ;разделили на к-во секторов в кластере
905
C:001708   +          STSX    CLS_DSC+0
906
C:001708 93a0 0519 STS     CLS_DSC+0,XL
907
C:00170a 93b0 051a STS     CLS_DSC+0+1,XH
908
C:00170c   +          STSY    CLS_DSC+2       ;положили кол-во кластеров на разделе
909
C:00170c 93c0 051b STS     CLS_DSC+2,YL
910
C:00170e 93d0 051c STS     CLS_DSC+2+1,YH
911
 
912
C:001710 9100 0500         LDS     DATA,CAL_FAT
913
C:001712 3f0f              CPI     DATA,$FF
914
C:001713 f519              BRNE    RDFAT04
915
C:001714   +          LDSX    CLS_DSC+0
916
C:001714 91a0 0519 LDS     XL,CLS_DSC+0
917
C:001716 91b0 051a LDS     XH,CLS_DSC+0+1
918
C:001718   +          LDSY    CLS_DSC+2
919
C:001718 91c0 051b LDS     YL,CLS_DSC+2
920
C:00171a 91d0 051c LDS     YH,CLS_DSC+2+1
921
C:00171c   +          PUSHY
922
C:00171c 93cf      PUSH    YL
923
C:00171d 93df      PUSH    YH
924
C:00171e   +          PUSHX
925
C:00171e 93af      PUSH    XL
926
C:00171f 93bf      PUSH    XH
927
C:001720 0faa              LSL     XL
928
C:001721 1fbb              ROL     XH
929
C:001722 1fcc              ROL     YL
930
C:001723 1fdd              ROL     YH
931
C:001724 d2e6              RCALL   RASCHET
932
C:001725 e001              LDI     DATA,1
933
C:001726   +          POPX
934
C:001726 91bf      POP     XH
935
C:001727 91af      POP     XL
936
C:001728   +          POPY
937
C:001728 91df      POP     YH
938
C:001729 91cf      POP     YL
939
C:00172a f061              BREQ    RDFAT04
940
C:00172b 0faa              LSL     XL
941
C:00172c 1fbb              ROL     XH
942
C:00172d 1fcc              ROL     YL
943
C:00172e 1fdd              ROL     YH
944
C:00172f 0faa              LSL     XL
945
C:001730 1fbb              ROL     XH
946
C:001731 1fcc              ROL     YL
947
C:001732 1fdd              ROL     YH
948
C:001733 d2d7              RCALL   RASCHET
949
C:001734 e002              LDI     DATA,2
950
C:001735 f009              BREQ    RDFAT04
951
C:001736 2700              CLR     DATA
952
C:001737 9300 0500 RDFAT04:STS     CAL_FAT,DATA
953
         ;для fat12/16 вычисляем адрес первого сектора директории
954
         ;для fat32 берем по смещемию +44
955
         ;на выходе YX == сектор rootdir
956
C:001739   +          LDIX    0
957
C:001739 e0a0      LDI     XL,LOW(0)
958
C:00173a e0b0      LDI     XH,HIGH(0)
959
C:00173b   +          LDIY    0
960
C:00173b e0c0      LDI     YL,LOW(0)
961
C:00173c e0d0      LDI     YH,HIGH(0)
962
C:00173d 2300              TST     DATA
963
C:00173e f031              BREQ    FSRROO2
964
C:00173f 950a              DEC     DATA
965
C:001740 f021              BREQ    FSRROO2
966
C:001741 a5a4              LDD     XL,Z+44
967
C:001742 a5b5              LDD     XH,Z+45
968
C:001743 a5c6              LDD     YL,Z+46
969
C:001744 a5d7              LDD     YH,Z+47
970
C:001745   +  FSRROO2:STSX    ROOTCLS+0
971
C:001745 93a0 0503 STS     ROOTCLS+0,XL
972
C:001747 93b0 0504 STS     ROOTCLS+0+1,XH
973
C:001749   +          STSY    ROOTCLS+2       ;сектор root директории
974
C:001749 93c0 0505 STS     ROOTCLS+2,YL
975
C:00174b 93d0 0506 STS     ROOTCLS+2+1,YH
976
C:00174d   +          STSX    TEK_DIR+0
977
C:00174d 93a0 0525 STS     TEK_DIR+0,XL
978
C:00174f 93b0 0526 STS     TEK_DIR+0+1,XH
979
C:001751   +          STSY    TEK_DIR+2
980
C:001751 93c0 0527 STS     TEK_DIR+2,YL
981
C:001753 93d0 0528 STS     TEK_DIR+2+1,YH
982
 
983
C:001755   +  FSRR121:PUSHX
984
C:001755 93af      PUSH    XL
985
C:001756 93bf      PUSH    XH
986
C:001757   +          PUSHY
987
C:001757 93cf      PUSH    YL
988
C:001758 93df      PUSH    YH
989
C:001759   +          LDSX    RSVDSEC
990
C:001759 91a0 050b LDS     XL,RSVDSEC
991
C:00175b 91b0 050c LDS     XH,RSVDSEC+1
992
C:00175d   +          LDIY    0
993
C:00175d e0c0      LDI     YL,LOW(0)
994
C:00175e e0d0      LDI     YH,HIGH(0)
995
C:00175f   +          LDIZ    STARTRZ
996
C:00175f e0ed      LDI     ZL,LOW(STARTRZ)
997
C:001760 e0f5      LDI     ZH,HIGH(STARTRZ)
998
C:001761 d29b              RCALL   BCDEHLP
999
C:001762   +          STSX    FATSTR0+0
1000
C:001762 93a0 051d STS     FATSTR0+0,XL
1001
C:001764 93b0 051e STS     FATSTR0+0+1,XH
1002
C:001766   +          STSY    FATSTR0+2
1003
C:001766 93c0 051f STS     FATSTR0+2,YL
1004
C:001768 93d0 0520 STS     FATSTR0+2+1,YH
1005
C:00176a   +          LDIZ    SEC_FAT
1006
C:00176a e0e7      LDI     ZL,LOW(SEC_FAT)
1007
C:00176b e0f5      LDI     ZH,HIGH(SEC_FAT)
1008
C:00176c d290              RCALL   BCDEHLP
1009
C:00176d   +          STSX    FATSTR1+0
1010
C:00176d 93a0 0521 STS     FATSTR1+0,XL
1011
C:00176f 93b0 0522 STS     FATSTR1+0+1,XH
1012
C:001771   +          STSY    FATSTR1+2
1013
C:001771 93c0 0523 STS     FATSTR1+2,YL
1014
C:001773 93d0 0524 STS     FATSTR1+2+1,YH
1015
C:001775   +          POPY
1016
C:001775 91df      POP     YH
1017
C:001776 91cf      POP     YL
1018
C:001777   +          POPX
1019
C:001777 91bf      POP     XH
1020
C:001778 91af      POP     XL
1021
 
1022
C:001779 e011              LDI     TEMP,1
1023
C:00177a 2e0a              MOV     R0,XL
1024
C:00177b 2a0b              OR      R0,XH
1025
C:00177c 2a0c              OR      R0,YL
1026
C:00177d 2a0d              OR      R0,YH
1027
C:00177e f039              BREQ    LASTCLS
1028
C:00177f 931f      NEXTCLS:PUSH    TEMP
1029
C:001780 d1e4              RCALL   RDFATZP
1030
C:001781 d1d1              RCALL   LST_CLS
1031
C:001782 911f              POP     TEMP
1032
C:001783 f410              BRCC    LASTCLS
1033
C:001784 9513              INC     TEMP
1034
C:001785 cff9              RJMP    NEXTCLS
1035
C:001786 9310 0529 LASTCLS:STS     KCLSDIR,TEMP
1036
C:001788   +          LDIY    0
1037
C:001788 e0c0      LDI     YL,LOW(0)
1038
C:001789 e0d0      LDI     YH,HIGH(0)
1039
C:00178a d192              RCALL   RDDIRSC
1040
         ;
1041
         ; - - - - - - - - - - - - - - - - - - -
1042
         ;поиск файла в директории
1043
C:00178b   +          LDIY    0               ;номер описателя файла
1044
C:00178b e0c0      LDI     YL,LOW(0)
1045
C:00178c e0d0      LDI     YH,HIGH(0)
1046
C:00178d c006              RJMP    FNDMP32
1047
 
1048
C:00178e 9621      FNDMP31:ADIW    YL,1            ;номер++               ─────────┐
1049
C:00178f 96b0              ADIW    ZL,$20          ;следующий описатель             │
1050
C:001790 30f5              CPI     ZH,HIGH(BUF4FAT+512);                            │
1051
                                         ;вылезли за сектор?              │
1052
C:001791 f411              BRNE    FNDMP32         ;нет ещё                         │
1053
C:001792 d18a              RCALL   RDDIRSC         ;считываем следующий             │
1054
C:001793 f4b9              BRNE    FNDMP37         ;кончились сектора в директории ═│═╗
1055
C:001794 8503      FNDMP32:LDD     DATA,Z+$0B      ;атрибуты                        │ ║
1056
C:001795 fd03              SBRC    DATA,3          ;длиное имя/имя диска?           │ ║
1057
C:001796 cff7              RJMP    FNDMP31         ;да ────────────────────────────┤ ║
1058
C:001797 fd04              SBRC    DATA,4          ;директория?                     │ ║
1059
C:001798 cff5              RJMP    FNDMP31         ;да ────────────────────────────┤ ║
1060
C:001799 8100              LD      DATA,Z          ;первый символ                   │ ║
1061
C:00179a 3e05              CPI     DATA,$E5        ;удалённый файл?                 │ ║
1062
C:00179b f391              BREQ    FNDMP31         ;да ────────────────────────────┘ ║
1063
C:00179c 2300              TST     DATA            ;пустой описатель? (конец списка)  ╚═ в этой директории
1064
C:00179d f069              BREQ    FNDMP37         ;да ═════════════════════════════════ нет нашёго файла
1065
C:00179e 93ef              PUSH    ZL
1066
C:00179f 01df              MOVW    XL,ZL
1067
C:0017a0   +          LDIZ    FILENAME*2
1068
C:0017a0 eaec      LDI     ZL,LOW(FILENAME*2)
1069
C:0017a1 e0f1      LDI     ZH,HIGH(FILENAME*2)
1070
C:0017a2 9105      DALSHE: LPM     DATA,Z+
1071
C:0017a3 2300              TST     DATA
1072
C:0017a4 f041              BREQ    NASHEL
1073
C:0017a5 911d              LD      TEMP,X+
1074
C:0017a6 1701              CP      DATA,TEMP
1075
C:0017a7 f3d1              BREQ    DALSHE
1076
         ;не совпало
1077
C:0017a8 2ffb              MOV     ZH,XH
1078
C:0017a9 91ef              POP     ZL
1079
C:0017aa cfe3              RJMP    FNDMP31
1080
         ;нет такого файла
1081
          FNDMP37:
1082
C:0017ab e004              LDI     DATA,4  ;нет файла
1083
C:0017ac c2ca              RJMP    SD_ERROR
1084
         ;найден описатель
1085
C:0017ad 2ffb      NASHEL: MOV     ZH,XH
1086
C:0017ae 91ef              POP     ZL
1087
         ;
1088
         ; - - - - - - - - - - - - - - - - - - -
1089
         ;инициализация переменных
1090
         ;для последующего чтения файла
1091
         ;Z указывает на описатель файла
1092
C:0017af 8da2              LDD     XL,Z+$1A
1093
C:0017b0 8db3              LDD     XH,Z+$1B
1094
C:0017b1 89c4              LDD     YL,Z+$14
1095
C:0017b2 89d5              LDD     YH,Z+$15        ;считали номер первого кластера файла
1096
C:0017b3   +          STSX    TFILCLS+0
1097
C:0017b3 93a0 052b STS     TFILCLS+0,XL
1098
C:0017b5 93b0 052c STS     TFILCLS+0+1,XH
1099
C:0017b7   +          STSY    TFILCLS+2
1100
C:0017b7 93c0 052d STS     TFILCLS+2,YL
1101
C:0017b9 93d0 052e STS     TFILCLS+2+1,YH
1102
C:0017bb   +          STSX    ZTFILCLS+0
1103
C:0017bb 93a0 0534 STS     ZTFILCLS+0,XL
1104
C:0017bd 93b0 0535 STS     ZTFILCLS+0+1,XH
1105
C:0017bf   +          STSY    ZTFILCLS+2
1106
C:0017bf 93c0 0536 STS     ZTFILCLS+2,YL
1107
C:0017c1 93d0 0537 STS     ZTFILCLS+2+1,YH
1108
C:0017c3 8da4              LDD     XL,Z+$1C
1109
C:0017c4 8db5              LDD     XH,Z+$1D
1110
C:0017c5 8dc6              LDD     YL,Z+$1E
1111
C:0017c6 8dd7              LDD     YH,Z+$1F        ;считали длину файла
1112
 
1113
C:0017c7 2f0a              MOV     DATA,XL
1114
C:0017c8 2b0b              OR      DATA,XH
1115
C:0017c9 2b0c              OR      DATA,YL
1116
C:0017ca 2b0d              OR      DATA,YH
1117
C:0017cb f411              BRNE    F01
1118
C:0017cc e005              LDI     DATA,5  ;пустой файл
1119
C:0017cd c2a9              RJMP    SD_ERROR
1120
          F01:
1121
C:0017ce e008              LDI     DATA,$08
1122
C:0017cf 15ae              CP      XL,ONE
1123
C:0017d0 05bf              CPC     XH,NULL
1124
C:0017d1 07c0              CPC     YL,DATA
1125
C:0017d2 05df              CPC     YH,NULL
1126
C:0017d3 f010              BRCS    F02
1127
C:0017d4 e005              LDI     DATA,5  ;большой файл
1128
C:0017d5 c2a1              RJMP    SD_ERROR
1129
          F02:
1130
C:0017d6 ef8f              LDI     R24,LOW(511)
1131
C:0017d7 e091              LDI     R25,HIGH(511)
1132
C:0017d8 d22d              RCALL   HLDEPBC
1133
C:0017d9 d20a              RCALL   BCDE200         ;получили кол-во секторов
1134
C:0017da 9711              SBIW    XL,1
1135
C:0017db 09cf              SBC     YL,NULL
1136
C:0017dc 09df              SBC     YH,NULL
1137
C:0017dd 9100 0502         LDS     DATA,BYTSSEC
1138
C:0017df 950a              DEC     DATA
1139
C:0017e0 230a              AND     DATA,XL
1140
C:0017e1 9503              INC     DATA
1141
C:0017e2 9300 052f         STS     MPHWOST,DATA    ;кол-во секторов в последнем кластере
1142
C:0017e4 9300 0538         STS     ZMPHWOST,DATA
1143
C:0017e6 9100 0502         LDS     DATA,BYTSSEC
1144
C:0017e8 d204              RCALL   BCDE_A
1145
C:0017e9   +          STSX    KOL_CLS+0
1146
C:0017e9 93a0 0530 STS     KOL_CLS+0,XL
1147
C:0017eb 93b0 0531 STS     KOL_CLS+0+1,XH
1148
C:0017ed   +          STSY    KOL_CLS+2
1149
C:0017ed 93c0 0532 STS     KOL_CLS+2,YL
1150
C:0017ef 93d0 0533 STS     KOL_CLS+2+1,YH
1151
C:0017f1   +          STSX    ZKOL_CLS+0
1152
C:0017f1 93a0 0539 STS     ZKOL_CLS+0,XL
1153
C:0017f3 93b0 053a STS     ZKOL_CLS+0+1,XH
1154
C:0017f5   +          STSY    ZKOL_CLS+2
1155
C:0017f5 93c0 053b STS     ZKOL_CLS+2,YL
1156
C:0017f7 93d0 053c STS     ZKOL_CLS+2+1,YH
1157
C:0017f9 92f0 052a         STS     NUMSECK,NULL
1158
         ; - - - - - - - - - - - - - - - - - - -
1159
         ;всё нормально, начинаем
1160
         ;стирание
1161
C:0017fb d350              RCALL   UART_NEWLINE
1162
C:0017fc e0a0              LDI     XL,0
1163
C:0017fd e0b4              LDI     XH,4
1164
C:0017fe d355              RCALL   SET_CURSOR
1165
C:0017ff   +          LDIZ    MSG_F_ERASE*2
1166
C:0017ff e4e4      LDI     ZL,LOW(MSG_F_ERASE*2)
1167
C:001800 e0f1      LDI     ZH,HIGH(MSG_F_ERASE*2)
1168
C:001801 d35e              RCALL   PRINTSTRZ
1169
C:001802 d2ef              RCALL   F_ERASE
1170
         ;запись
1171
C:001803 d348              RCALL   UART_NEWLINE
1172
C:001804 e0a0              LDI     XL,0
1173
C:001805 e0b5              LDI     XH,5
1174
C:001806 d34d              RCALL   SET_CURSOR
1175
C:001807   +          LDIZ    MSG_F_WRITE*2
1176
C:001807 e4ee      LDI     ZL,LOW(MSG_F_WRITE*2)
1177
C:001808 e0f1      LDI     ZH,HIGH(MSG_F_WRITE*2)
1178
C:001809 d356              RCALL   PRINTSTRZ
1179
C:00180a e0a0              LDI     XL,0
1180
C:00180b e1b0              LDI     XH,16
1181
C:00180c d347              RCALL   SET_CURSOR
1182
C:00180d e001              LDI     DATA,$01 ;"░"
1183
C:00180e e414              LDI     TEMP,SCR_CHAR
1184
C:00180f d330              RCALL   FPGA_REG
1185
C:001810 ef1f              LDI     TEMP,$FF
1186
C:001811   +  FCHXY1: SPICS_CLR
1187
C:001811 98c0      CBI     PORTB,0
1188
C:001812   +          SPICS_SET
1189
C:001812 9ac0      SBI     PORTB,0
1190
C:001813 951a              DEC     TEMP
1191
C:001814 f7e1              BRNE    FCHXY1
1192
C:001815 e0a0              LDI     XL,0
1193
C:001816 e1b0              LDI     XH,16
1194
C:001817 d33c              RCALL   SET_CURSOR
1195
 
1196
C:001818 92f0 053f         STS     F_ADDR0,NULL
1197
C:00181a 92f0 0540         STS     F_ADDR1,NULL
1198
C:00181c 92f0 0541         STS     F_ADDR2,NULL
1199
 
1200
C:00181e d1f6      F13:    RCALL   NEXTSEC
1201
C:00181f 9300 053e         STS     LASTSECFLAG,DATA
1202
 
1203
C:001821   +          LDIZ    BUFFER
1204
C:001821 e0e0      LDI     ZL,LOW(BUFFER)
1205
C:001822 e0f1      LDI     ZH,HIGH(BUFFER)
1206
C:001823 91a0 053f         LDS     XL,F_ADDR0
1207
C:001825 91b0 0540         LDS     XH,F_ADDR1
1208
C:001827 91c0 0541         LDS     YL,F_ADDR2
1209
 
1210
C:001829 d2a8      F11:    RCALL   F_WRITE
1211
C:00182a 9611              ADIW    XL,1
1212
C:00182b 1dcf              ADC     YL,NULL
1213
C:00182c 9631              ADIW    ZL,1
1214
C:00182d 30f3              CPI     ZH,HIGH(BUFFER+512)
1215
C:00182e f7d1              BRNE    F11
1216
 
1217
C:00182f   +          LED_OFF
1218
C:00182f 9ac7      SBI     PORTB,7
1219
C:001830 fdb1              SBRC    XH,1
1220
C:001831   +          LED_ON  ;мигать при программировании
1221
C:001831 98c7      CBI     PORTB,7
1222
 
1223
C:001832 93a0 053f         STS     F_ADDR0,XL
1224
C:001834 93b0 0540         STS     F_ADDR1,XH
1225
C:001836 93c0 0541         STS     F_ADDR2,YL
1226
 
1227
C:001838 30a0              CPI     XL,$00
1228
C:001839 f431              BRNE    F12
1229
C:00183a 2f0b              MOV     DATA,XH
1230
C:00183b 7007              ANDI    DATA,$07
1231
C:00183c f419              BRNE    F12
1232
C:00183d e002              LDI     DATA,$02 ;"▒"
1233
C:00183e e414              LDI     TEMP,SCR_CHAR
1234
C:00183f d300              RCALL   FPGA_REG
1235
          F12:
1236
C:001840 9100 053e         LDS     DATA,LASTSECFLAG
1237
C:001842 2300              TST     DATA
1238
C:001843 f6d1              BRNE    F13
1239
         ;проверка
1240
C:001844 d2bb              RCALL   F_RST
1241
C:001845 ef14              LDI     TEMP,FLASH_CTRL
1242
C:001846 e003              LDI     DATA,0B00000011
1243
C:001847 d2f8              RCALL   FPGA_REG
1244
C:001848 d303              RCALL   UART_NEWLINE
1245
C:001849 e0a0              LDI     XL,0
1246
C:00184a e0b6              LDI     XH,6
1247
C:00184b d308              RCALL   SET_CURSOR
1248
C:00184c   +          LDIZ    MSG_F_CHECK*2
1249
C:00184c e5e8      LDI     ZL,LOW(MSG_F_CHECK*2)
1250
C:00184d e0f1      LDI     ZH,HIGH(MSG_F_CHECK*2)
1251
C:00184e d311              RCALL   PRINTSTRZ
1252
C:00184f e0a0              LDI     XL,0
1253
C:001850 e1b0              LDI     XH,16
1254
C:001851 d302              RCALL   SET_CURSOR
1255
 
1256
C:001852   +          LDSX    ZTFILCLS+0
1257
C:001852 91a0 0534 LDS     XL,ZTFILCLS+0
1258
C:001854 91b0 0535 LDS     XH,ZTFILCLS+0+1
1259
C:001856   +          LDSY    ZTFILCLS+2
1260
C:001856 91c0 0536 LDS     YL,ZTFILCLS+2
1261
C:001858 91d0 0537 LDS     YH,ZTFILCLS+2+1
1262
C:00185a   +          STSX    TFILCLS+0
1263
C:00185a 93a0 052b STS     TFILCLS+0,XL
1264
C:00185c 93b0 052c STS     TFILCLS+0+1,XH
1265
C:00185e   +          STSY    TFILCLS+2
1266
C:00185e 93c0 052d STS     TFILCLS+2,YL
1267
C:001860 93d0 052e STS     TFILCLS+2+1,YH
1268
C:001862 9100 0538         LDS     DATA,ZMPHWOST
1269
C:001864 9300 052f         STS     MPHWOST,DATA
1270
C:001866   +          LDSX    ZKOL_CLS+0
1271
C:001866 91a0 0539 LDS     XL,ZKOL_CLS+0
1272
C:001868 91b0 053a LDS     XH,ZKOL_CLS+0+1
1273
C:00186a   +          LDSY    ZKOL_CLS+2
1274
C:00186a 91c0 053b LDS     YL,ZKOL_CLS+2
1275
C:00186c 91d0 053c LDS     YH,ZKOL_CLS+2+1
1276
C:00186e   +          STSX    KOL_CLS+0
1277
C:00186e 93a0 0530 STS     KOL_CLS+0,XL
1278
C:001870 93b0 0531 STS     KOL_CLS+0+1,XH
1279
C:001872   +          STSY    KOL_CLS+2
1280
C:001872 93c0 0532 STS     KOL_CLS+2,YL
1281
C:001874 93d0 0533 STS     KOL_CLS+2+1,YH
1282
C:001876 92f0 052a         STS     NUMSECK,NULL
1283
C:001878 92f0 0542         STS     ERRFLG1,NULL
1284
C:00187a 92f0 0543         STS     ERRFLG2,NULL
1285
         ;
1286
C:00187c 92f0 053f         STS     F_ADDR0,NULL
1287
C:00187e 92f0 0540         STS     F_ADDR1,NULL
1288
C:001880 92f0 0541         STS     F_ADDR2,NULL
1289
 
1290
C:001882 d192      F25:    RCALL   NEXTSEC
1291
C:001883 9300 053e         STS     LASTSECFLAG,DATA
1292
C:001885   +          LDIZ    BUFFER
1293
C:001885 e0e0      LDI     ZL,LOW(BUFFER)
1294
C:001886 e0f1      LDI     ZH,HIGH(BUFFER)
1295
C:001887 91a0 053f         LDS     XL,F_ADDR0
1296
C:001889 91b0 0540         LDS     XH,F_ADDR1
1297
C:00188b 91c0 0541         LDS     YL,F_ADDR2
1298
 
1299
C:00188d d2a6      F21:    RCALL   F_IN
1300
C:00188e 9111              LD      TEMP,Z+
1301
C:00188f 1701              CP      DATA,TEMP
1302
C:001890 f011              BREQ    F26
1303
C:001891 92e0 0542         STS     ERRFLG1,ONE
1304
C:001893 9611      F26:    ADIW    XL,1
1305
C:001894 1dcf              ADC     YL,NULL
1306
C:001895 30f3              CPI     ZH,HIGH(BUFFER+512)
1307
C:001896 f7b1              BRNE    F21
1308
 
1309
C:001897   +          LED_OFF
1310
C:001897 9ac7      SBI     PORTB,7
1311
C:001898 fdb3              SBRC    XH,3
1312
C:001899   +          LED_ON  ;мигать при проверке
1313
C:001899 98c7      CBI     PORTB,7
1314
 
1315
C:00189a 93a0 053f         STS     F_ADDR0,XL
1316
C:00189c 93b0 0540         STS     F_ADDR1,XH
1317
C:00189e 93c0 0541         STS     F_ADDR2,YL
1318
 
1319
C:0018a0 30a0              CPI     XL,$00
1320
C:0018a1 f481              BRNE    F22
1321
C:0018a2 2f0b              MOV     DATA,XH
1322
C:0018a3 7007              ANDI    DATA,$07
1323
C:0018a4 f469              BRNE    F22
1324
C:0018a5 9110 0542         LDS     TEMP,ERRFLG1
1325
C:0018a7 2311              TST     TEMP
1326
C:0018a8 f031              BREQ    F23
1327
C:0018a9 92e0 0543         STS     ERRFLG2,ONE
1328
C:0018ab 92f0 0542         STS     ERRFLG1,NULL
1329
C:0018ad e508              LDI     DATA,$58 ;"X"
1330
C:0018ae c001              RJMP    F24
1331
C:0018af e003      F23:    LDI     DATA,$03 ;"█"
1332
C:0018b0 e414      F24:    LDI     TEMP,SCR_CHAR
1333
C:0018b1 d28e              RCALL   FPGA_REG
1334
          F22:
1335
C:0018b2 9100 053e         LDS     DATA,LASTSECFLAG
1336
C:0018b4 2300              TST     DATA
1337
C:0018b5 f661              BRNE    F25
1338
         ;стоп
1339
C:0018b6   +          LED_OFF
1340
C:0018b6 9ac7      SBI     PORTB,7
1341
C:0018b7 d294              RCALL   UART_NEWLINE
1342
C:0018b8 e0a0              LDI     XL,0
1343
C:0018b9 e0b7              LDI     XH,7
1344
C:0018ba d299              RCALL   SET_CURSOR
1345
C:0018bb   +          LDIZ    MSG_F_ERROR*2
1346
C:0018bb e7ea      LDI     ZL,LOW(MSG_F_ERROR*2)
1347
C:0018bc e0f1      LDI     ZH,HIGH(MSG_F_ERROR*2)
1348
C:0018bd 9110 0543         LDS     TEMP,ERRFLG2
1349
C:0018bf 2311              TST     TEMP
1350
C:0018c0 f411              BRNE    F91
1351
C:0018c1   +          LDIZ    MSG_F_COMPLETE*2
1352
C:0018c1 e6e2      LDI     ZL,LOW(MSG_F_COMPLETE*2)
1353
C:0018c2 e0f1      LDI     ZH,HIGH(MSG_F_COMPLETE*2)
1354
C:0018c3 d29c      F91:    RCALL   PRINTSTRZ
1355
C:0018c4 d287              RCALL   UART_NEWLINE
1356
C:0018c5 e0a0              LDI     XL,0
1357
C:0018c6 e0b9              LDI     XH,9
1358
C:0018c7 d28c              RCALL   SET_CURSOR
1359
C:0018c8   +          LDIZ    MSG_HALT*2
1360
C:0018c8 e8e2      LDI     ZL,LOW(MSG_HALT*2)
1361
C:0018c9 e0f1      LDI     ZH,HIGH(MSG_HALT*2)
1362
C:0018ca d295              RCALL   PRINTSTRZ
1363
C:0018cb 9816              CBI     DDRE,6
1364
C:0018cc cfff      STOP1:  RJMP    STOP1
1365
 
1366
         ;
1367
         ;--------------------------------------
1368
         ;out:   DATA
1369
          SD_RECEIVE:
1370
C:0018cd ef0f              SER     DATA
1371
         ; - - - - - - - - - - - - - - - - - - -
1372
         ;in:    DATA
1373
         ;out:   DATA
1374
          SD_EXCHANGE:
1375
C:0018ce c276              RJMP    FPGA_SAME_REG
1376
         ;
1377
         ;--------------------------------------
1378
         ;in;    TEMP - n
1379
          SD_RD_DUMMY:
1380
C:0018cf ef0f              SER     DATA
1381
C:0018d0 dffd              RCALL   SD_EXCHANGE
1382
C:0018d1 951a              DEC     TEMP
1383
C:0018d2 f7e1              BRNE    SD_RD_DUMMY
1384
C:0018d3 9508              RET
1385
         ;
1386
         ;--------------------------------------
1387
         ;in:    Z
1388
          SD_WR_PGM_6:
1389
C:0018d4 e012              LDI     TEMP,2
1390
C:0018d5 dff9              RCALL   SD_RD_DUMMY
1391
C:0018d6 e016              LDI     TEMP,6
1392
          SD_WR_PGX:
1393
C:0018d7 9105      SDWRP61:LPM     DATA,Z+
1394
C:0018d8 dff5              RCALL   SD_EXCHANGE
1395
C:0018d9 951a              DEC     TEMP
1396
C:0018da f7e1              BRNE    SDWRP61
1397
         ; - - - - - - - - - - - - - - - - - - -
1398
         ;out:   DATA
1399
          SD_WAIT_NOTFF:
1400
C:0018db e210              LDI     TEMP,32
1401
C:0018dc ef0f      SDWNFF2:SER     DATA
1402
C:0018dd dff0              RCALL   SD_EXCHANGE
1403
C:0018de 3f0f              CPI     DATA,$FF
1404
C:0018df f411              BRNE    SDWNFF1
1405
C:0018e0 951a              DEC     TEMP
1406
C:0018e1 f7d1              BRNE    SDWNFF2
1407
C:0018e2 9508      SDWNFF1:RET
1408
         ;
1409
         ;--------------------------------------
1410
         ;in:    Z - куда
1411
         ;       Y,X - №сектора
1412
          SD_READ_SECTOR:
1413
C:0018e3   +          PUSHZ
1414
C:0018e3 93ef      PUSH    ZL
1415
C:0018e4 93ff      PUSH    ZH
1416
C:0018e5   +          LDIZ    CMD58*2
1417
C:0018e5 eae0      LDI     ZL,LOW(CMD58*2)
1418
C:0018e6 e0f1      LDI     ZH,HIGH(CMD58*2)
1419
C:0018e7 dfec              RCALL   SD_WR_PGM_6
1420
C:0018e8 dfe4              RCALL   SD_RECEIVE
1421
C:0018e9 fd06              SBRC    DATA,6
1422
C:0018ea c007              RJMP    SDRDSE1
1423
C:0018eb 0faa              LSL     XL
1424
C:0018ec 1fbb              ROL     XH
1425
C:0018ed 1fcc              ROL     YL
1426
C:0018ee 2fdc              MOV     YH,YL
1427
C:0018ef 2fcb              MOV     YL,XH
1428
C:0018f0 2fba              MOV     XH,XL
1429
C:0018f1 27aa              CLR     XL
1430
          SDRDSE1:
1431
C:0018f2 e015              LDI     TEMP,3+2
1432
C:0018f3 dfdb              RCALL   SD_RD_DUMMY
1433
 
1434
C:0018f4 e501              LDI     DATA,CMD_17
1435
C:0018f5 dfd8              RCALL   SD_EXCHANGE
1436
C:0018f6 2f0d              MOV     DATA,YH
1437
C:0018f7 dfd6              RCALL   SD_EXCHANGE
1438
C:0018f8 2f0c              MOV     DATA,YL
1439
C:0018f9 dfd4              RCALL   SD_EXCHANGE
1440
C:0018fa 2f0b              MOV     DATA,XH
1441
C:0018fb dfd2              RCALL   SD_EXCHANGE
1442
C:0018fc 2f0a              MOV     DATA,XL
1443
C:0018fd dfd0              RCALL   SD_EXCHANGE
1444
C:0018fe ef0f              SER     DATA
1445
C:0018ff dfce              RCALL   SD_EXCHANGE
1446
 
1447
C:001900 ef8f              SER     R24
1448
C:001901 dfd9      SDRDSE2:RCALL   SD_WAIT_NOTFF
1449
C:001902 958a              DEC     R24
1450
C:001903 f069              BREQ    SDRDSE8
1451
C:001904 3f0e              CPI     DATA,$FE
1452
C:001905 f7d9              BRNE    SDRDSE2
1453
 
1454
C:001906   +          POPZ
1455
C:001906 91ff      POP     ZH
1456
C:001907 91ef      POP     ZL
1457
C:001908 e080              LDI     R24,$00
1458
C:001909 e092              LDI     R25,$02
1459
C:00190a dfc2      SDRDSE3:RCALL   SD_RECEIVE
1460
C:00190b 9301              ST      Z+,DATA
1461
C:00190c 9701              SBIW    R24,1
1462
C:00190d f7e1              BRNE    SDRDSE3
1463
 
1464
C:00190e e012              LDI     TEMP,2
1465
C:00190f dfbf              RCALL   SD_RD_DUMMY
1466
         ;SDRDSE4:RCALL   SD_WAIT_NOTFF
1467
         ;        CPI     DATA,$FF
1468
         ;        BRNE    SDRDSE4
1469
C:001910 9508              RET
1470
 
1471
          SDRDSE8:
1472
C:001911 e002             LDI     DATA,2  ;ошибка при чтении сектора
1473
C:001912 c164              RJMP    SD_ERROR
1474
         ;
1475
         ;--------------------------------------
1476
         ;чтение сектора данных
1477
          LOAD_DATA:
1478
C:001913   +          LDIZ    BUFFER
1479
C:001913 e0e0      LDI     ZL,LOW(BUFFER)
1480
C:001914 e0f1      LDI     ZH,HIGH(BUFFER)
1481
C:001915 dfcd              RCALL   SD_READ_SECTOR  ;читать один сектор
1482
C:001916 9508              RET
1483
         ;
1484
         ;--------------------------------------
1485
         ;чтение сектора служ.инф. (FAT/DIR/...)
1486
C:001917   +  LOADLST:LDIZ    BUF4FAT
1487
C:001917 e0e0      LDI     ZL,LOW(BUF4FAT)
1488
C:001918 e0f3      LDI     ZH,HIGH(BUF4FAT)
1489
C:001919 dfc9              RCALL   SD_READ_SECTOR  ;читать один сектор
1490
C:00191a   +          LDIZ    BUF4FAT
1491
C:00191a e0e0      LDI     ZL,LOW(BUF4FAT)
1492
C:00191b e0f3      LDI     ZH,HIGH(BUF4FAT)
1493
C:00191c 9508              RET
1494
         ;
1495
         ;--------------------------------------
1496
         ;чтение сектора dir по номеру описателя (Y)
1497
         ;на выходе: DATA=#ff (sreg.Z=0) выход за пределы dir
1498
C:00191d   +  RDDIRSC:PUSHY
1499
C:00191d 93cf      PUSH    YL
1500
C:00191e 93df      PUSH    YH
1501
C:00191f 01de              MOVW    XL,YL
1502
C:001920   +          LDIY    0
1503
C:001920 e0c0      LDI     YL,LOW(0)
1504
C:001921 e0d0      LDI     YH,HIGH(0)
1505
C:001922 e100              LDI     DATA,$10
1506
C:001923 d0c9              RCALL   BCDE_A
1507
C:001924 93af              PUSH    XL
1508
C:001925 9100 0502         LDS     DATA,BYTSSEC
1509
C:001927 930f              PUSH    DATA
1510
C:001928 d0c4              RCALL   BCDE_A
1511
C:001929 9100 0529         LDS     DATA,KCLSDIR
1512
C:00192b 950a              DEC     DATA
1513
C:00192c 170a              CP      DATA,XL
1514
C:00192d f438              BRCC    RDDIRS3
1515
C:00192e 91cf              POP     YL
1516
C:00192f 91cf              POP     YL
1517
C:001930   +          POPY
1518
C:001930 91df      POP     YH
1519
C:001931 91cf      POP     YL
1520
C:001932 ef0f              SER     DATA
1521
C:001933 2300              TST     DATA
1522
C:001934 9508              RET
1523
C:001935   +  RDDIRS3:LDSY    TEK_DIR+2
1524
C:001935 91c0 0527 LDS     YL,TEK_DIR+2
1525
C:001937 91d0 0528 LDS     YH,TEK_DIR+2+1
1526
C:001939 2f0a              MOV     DATA,XL
1527
C:00193a 2300              TST     DATA
1528
C:00193b   +          LDSX    TEK_DIR+0
1529
C:00193b 91a0 0525 LDS     XL,TEK_DIR+0
1530
C:00193d 91b0 0526 LDS     XH,TEK_DIR+0+1
1531
C:00193f f029              BREQ    RDDIRS1
1532
C:001940 930f      RDDIRS2:PUSH    DATA
1533
C:001941 d023              RCALL   RDFATZP
1534
C:001942 910f              POP     DATA
1535
C:001943 950a              DEC     DATA
1536
C:001944 f7d9              BRNE    RDDIRS2
1537
C:001945 d07c      RDDIRS1:RCALL   REALSEC
1538
C:001946 900f              POP     R0
1539
C:001947 940a              DEC     R0
1540
C:001948 910f              POP     DATA
1541
C:001949 2100              AND     DATA,R0
1542
C:00194a 0fa0              ADD     XL,DATA
1543
C:00194b 1dbf              ADC     XH,NULL
1544
C:00194c 1dcf              ADC     YL,NULL
1545
C:00194d 1ddf              ADC     YH,NULL
1546
C:00194e dfc8              RCALL   LOADLST
1547
C:00194f   +          POPY
1548
C:00194f 91df      POP     YH
1549
C:001950 91cf      POP     YL
1550
C:001951 2700              CLR     DATA
1551
C:001952 9508              RET
1552
         ;
1553
         ;--------------------------------------
1554
         ;out:   sreg.C == CLR - EOCmark
1555
         ;(chng: TEMP)
1556
C:001953 e01f      LST_CLS:LDI     TEMP,$0F
1557
C:001954 9100 0500         LDS     DATA,CAL_FAT
1558
C:001956 2300              TST     DATA
1559
C:001957 f419              BRNE    LST_CL1
1560
C:001958 3fa7              CPI     XL,$F7
1561
C:001959 07b1              CPC     XH,TEMP
1562
C:00195a 9508              RET
1563
C:00195b 950a      LST_CL1:DEC     DATA
1564
C:00195c f419              BRNE    LST_CL2
1565
C:00195d 3fa7              CPI     XL,$F7
1566
C:00195e 05bd              CPC     XH,FF
1567
C:00195f 9508              RET
1568
C:001960 3fa7      LST_CL2:CPI     XL,$F7
1569
C:001961 05bd              CPC     XH,FF
1570
C:001962 05cd              CPC     YL,FF
1571
C:001963 07d1              CPC     YH,TEMP
1572
C:001964 9508              RET
1573
         ;
1574
         ;--------------------------------------
1575
         ;
1576
C:001965 9100 0500 RDFATZP:LDS     DATA,CAL_FAT
1577
C:001967 2300              TST     DATA
1578
C:001968 f131              BREQ    RDFATS0         ;FAT12
1579
C:001969 950a              DEC     DATA
1580
C:00196a f071              BREQ    RDFATS1         ;FAT16
1581
         ;FAT32
1582
C:00196b 0faa              LSL     XL
1583
C:00196c 1fbb              ROL     XH
1584
C:00196d 1fcc              ROL     YL
1585
C:00196e 1fdd              ROL     YH
1586
C:00196f 2f0a              MOV     DATA,XL
1587
C:001970 2fab              MOV     XL,XH
1588
C:001971 2fbc              MOV     XH,YL
1589
C:001972 2fcd              MOV     YL,YH
1590
C:001973 27dd              CLR     YH
1591
C:001974 d009              RCALL   RDFATS2
1592
C:001975 9631              ADIW    ZL,1
1593
C:001976 91c1              LD      YL,Z+
1594
C:001977 81d0              LD      YH,Z
1595
C:001978 9508              RET
1596
         ;FAT16
1597
C:001979   +  RDFATS1:LDIY    0
1598
C:001979 e0c0      LDI     YL,LOW(0)
1599
C:00197a e0d0      LDI     YH,HIGH(0)
1600
C:00197b 2f0a              MOV     DATA,XL
1601
C:00197c 2fab              MOV     XL,XH
1602
C:00197d 27bb              CLR     XH
1603
C:00197e 930f      RDFATS2:PUSH    DATA
1604
C:00197f   +          PUSHY
1605
C:00197f 93cf      PUSH    YL
1606
C:001980 93df      PUSH    YH
1607
C:001981   +          LDIZ    FATSTR0
1608
C:001981 e1ed      LDI     ZL,LOW(FATSTR0)
1609
C:001982 e0f5      LDI     ZH,HIGH(FATSTR0)
1610
C:001983 d079              RCALL   BCDEHLP
1611
C:001984 df92              RCALL   LOADLST
1612
C:001985   +          POPY
1613
C:001985 91df      POP     YH
1614
C:001986 91cf      POP     YL
1615
C:001987 910f              POP     DATA
1616
C:001988 0fe0              ADD     ZL,DATA
1617
C:001989 1dff              ADC     ZH,NULL
1618
C:00198a 0fe0              ADD     ZL,DATA
1619
C:00198b 1dff              ADC     ZH,NULL
1620
C:00198c 91a1              LD      XL,Z+
1621
C:00198d 81b0              LD      XH,Z
1622
C:00198e 9508              RET
1623
         ;FAT12
1624
C:00198f 01fd      RDFATS0:MOVW    ZL,XL
1625
C:001990 0fee              LSL     ZL
1626
C:001991 1fff              ROL     ZH
1627
C:001992 0fea              ADD     ZL,XL
1628
C:001993 1ffb              ADC     ZH,XH
1629
C:001994 95f6              LSR     ZH
1630
C:001995 95e7              ROR     ZL
1631
C:001996 2f0a              MOV     DATA,XL
1632
C:001997 2faf              MOV     XL,ZH
1633
C:001998 27bb              CLR     XH
1634
C:001999 27cc              CLR     YL
1635
C:00199a 27dd              CLR     YH
1636
C:00199b 95a6              LSR     XL
1637
C:00199c 930f              PUSH    DATA
1638
C:00199d   +          PUSHZ
1639
C:00199d 93ef      PUSH    ZL
1640
C:00199e 93ff      PUSH    ZH
1641
C:00199f   +          LDIZ    FATSTR0
1642
C:00199f e1ed      LDI     ZL,LOW(FATSTR0)
1643
C:0019a0 e0f5      LDI     ZH,HIGH(FATSTR0)
1644
C:0019a1 d05b              RCALL   BCDEHLP
1645
C:0019a2 df74              RCALL   LOADLST
1646
C:0019a3   +          POPY
1647
C:0019a3 91df      POP     YH
1648
C:0019a4 91cf      POP     YL
1649
C:0019a5 70d1              ANDI    YH,$01
1650
C:0019a6 0fec              ADD     ZL,YL
1651
C:0019a7 1ffd              ADC     ZH,YH
1652
C:0019a8 91c1              LD      YL,Z+
1653
C:0019a9 30f5              CPI     ZH,HIGH(BUF4FAT+512)
1654
C:0019aa f431              BRNE    RDFATS4
1655
C:0019ab 93cf              PUSH    YL
1656
C:0019ac   +          LDIY    0
1657
C:0019ac e0c0      LDI     YL,LOW(0)
1658
C:0019ad e0d0      LDI     YH,HIGH(0)
1659
C:0019ae 9611              ADIW    XL,1
1660
C:0019af df67              RCALL   LOADLST
1661
C:0019b0 91cf              POP     YL
1662
C:0019b1 910f      RDFATS4:POP     DATA
1663
C:0019b2 81b0              LD      XH,Z
1664
C:0019b3 2fac              MOV     XL,YL
1665
C:0019b4   +          LDIY    0
1666
C:0019b4 e0c0      LDI     YL,LOW(0)
1667
C:0019b5 e0d0      LDI     YH,HIGH(0)
1668
C:0019b6 9506              LSR     DATA
1669
C:0019b7 f440              BRCC    RDFATS3
1670
C:0019b8 95b6              LSR     XH
1671
C:0019b9 95a7              ROR     XL
1672
C:0019ba 95b6              LSR     XH
1673
C:0019bb 95a7              ROR     XL
1674
C:0019bc 95b6              LSR     XH
1675
C:0019bd 95a7              ROR     XL
1676
C:0019be 95b6              LSR     XH
1677
C:0019bf 95a7              ROR     XL
1678
C:0019c0 70bf      RDFATS3:ANDI    XH,$0F
1679
C:0019c1 9508              RET
1680
         ;
1681
         ;--------------------------------------
1682
         ;вычисление реального сектора
1683
         ;на входе YX==номер FAT
1684
         ;на выходе YX==адрес сектора
1685
C:0019c2 2f0d      REALSEC:MOV     DATA,YH
1686
C:0019c3 2b0c              OR      DATA,YL
1687
C:0019c4 2b0b              OR      DATA,XH
1688
C:0019c5 2b0a              OR      DATA,XL
1689
C:0019c6 f459              BRNE    REALSE1
1690
C:0019c7   +          LDIZ    FATSTR1
1691
C:0019c7 e2e1      LDI     ZL,LOW(FATSTR1)
1692
C:0019c8 e0f5      LDI     ZH,HIGH(FATSTR1)
1693
C:0019c9   +          LDSX    SEC_FAT+0
1694
C:0019c9 91a0 0507 LDS     XL,SEC_FAT+0
1695
C:0019cb 91b0 0508 LDS     XH,SEC_FAT+0+1
1696
C:0019cd   +          LDSY    SEC_FAT+2
1697
C:0019cd 91c0 0509 LDS     YL,SEC_FAT+2
1698
C:0019cf 91d0 050a LDS     YH,SEC_FAT+2+1
1699
C:0019d1 c02b              RJMP    BCDEHLP
1700
C:0019d2 9712      REALSE1:SBIW    XL,2            ;номер кластера-2
1701
C:0019d3 09cf              SBC     YL,NULL
1702
C:0019d4 09df              SBC     YH,NULL
1703
C:0019d5 9100 0502         LDS     DATA,BYTSSEC
1704
C:0019d7 c004              RJMP    REALSE2
1705
C:0019d8 0faa      REALSE3:LSL     XL
1706
C:0019d9 1fbb              ROL     XH
1707
C:0019da 1fcc              ROL     YL
1708
C:0019db 1fdd              ROL     YH
1709
C:0019dc 9506      REALSE2:LSR     DATA
1710
C:0019dd f7d0              BRCC    REALSE3
1711
                                         ;умножили на размер кластера
1712
C:0019de   +          LDIZ    STARTRZ
1713
C:0019de e0ed      LDI     ZL,LOW(STARTRZ)
1714
C:0019df e0f5      LDI     ZH,HIGH(STARTRZ)
1715
C:0019e0 d01c              RCALL   BCDEHLP         ;прибавили смещение от начала диска
1716
C:0019e1   +          LDIZ    FRSTDAT
1717
C:0019e1 e1e1      LDI     ZL,LOW(FRSTDAT)
1718
C:0019e2 e0f5      LDI     ZH,HIGH(FRSTDAT)
1719
C:0019e3 c019              RJMP    BCDEHLP         ;прибавили смещение от начала раздела
1720
         ;
1721
         ;--------------------------------------
1722
         ;YX>>9 (деление на 512)
1723
C:0019e4 2fab      BCDE200:MOV     XL,XH
1724
C:0019e5 2fbc              MOV     XH,YL
1725
C:0019e6 2fcd              MOV     YL,YH
1726
C:0019e7 e0d0              LDI     YH,0
1727
C:0019e8 e001              LDI     DATA,1
1728
         ; - - - - - - - - - - - - - - - - - - -
1729
         ;YXDATA>>до"переноса"
1730
         ;если в DATA вкл.только один бит, то получается
1731
         ;YX=YX/DATA
1732
C:0019e9 95d6      BCDE_A1:LSR     YH
1733
C:0019ea 95c7              ROR     YL
1734
C:0019eb 95b7              ROR     XH
1735
C:0019ec 95a7              ROR     XL
1736
C:0019ed 9507      BCDE_A: ROR     DATA
1737
C:0019ee f7d0              BRCC    BCDE_A1
1738
C:0019ef 9508              RET
1739
         ;
1740
         ;--------------------------------------
1741
         ;YX=[Z]-YX
1742
C:0019f0 9101      BCDEHLM:LD      DATA,Z+
1743
C:0019f1 1b0a              SUB     DATA,XL
1744
C:0019f2 2fa0              MOV     XL,DATA
1745
C:0019f3 9101              LD      DATA,Z+
1746
C:0019f4 0b0b              SBC     DATA,XH
1747
C:0019f5 2fb0              MOV     XH,DATA
1748
C:0019f6 9101              LD      DATA,Z+
1749
C:0019f7 0b0c              SBC     DATA,YL
1750
C:0019f8 2fc0              MOV     YL,DATA
1751
C:0019f9 8100              LD      DATA,Z
1752
C:0019fa 0b0d              SBC     DATA,YH
1753
C:0019fb 2fd0              MOV     YH,DATA
1754
C:0019fc 9508              RET
1755
         ;
1756
         ;--------------------------------------
1757
         ;YX=YX+[Z]
1758
C:0019fd 9101      BCDEHLP:LD      DATA,Z+
1759
C:0019fe 0fa0              ADD     XL,DATA
1760
C:0019ff 9101              LD      DATA,Z+
1761
C:001a00 1fb0              ADC     XH,DATA
1762
C:001a01 9101              LD      DATA,Z+
1763
C:001a02 1fc0              ADC     YL,DATA
1764
C:001a03 8100              LD      DATA,Z
1765
C:001a04 1fd0              ADC     YH,DATA
1766
C:001a05 9508              RET
1767
         ;
1768
         ;--------------------------------------
1769
         ;YX=YX+R25R24
1770
C:001a06 0fa8      HLDEPBC:ADD     XL,R24
1771
C:001a07 1fb9              ADC     XH,R25
1772
C:001a08 1dcf              ADC     YL,NULL
1773
C:001a09 1ddf              ADC     YH,NULL
1774
C:001a0a 9508              RET
1775
         ;
1776
         ;--------------------------------------
1777
         ;
1778
C:001a0b dfd8      RASCHET:RCALL   BCDE200
1779
C:001a0c   +          LDIZ    SEC_FAT
1780
C:001a0c e0e7      LDI     ZL,LOW(SEC_FAT)
1781
C:001a0d e0f5      LDI     ZH,HIGH(SEC_FAT)
1782
C:001a0e dfe1              RCALL   BCDEHLM
1783
C:001a0f 2f0a              MOV     DATA,XL
1784
C:001a10 7f00              ANDI    DATA,$F0
1785
C:001a11 2b0b              OR      DATA,XH
1786
C:001a12 2b0c              OR      DATA,YL
1787
C:001a13 2b0d              OR      DATA,YH
1788
C:001a14 9508              RET
1789
         ;
1790
         ;--------------------------------------
1791
         ;чтение очередного сектора файла в BUFFER
1792
         ;out:   DATA == 0 - считан последний сектор файла
1793
          NEXTSEC:
1794
C:001a15 e517              LDI     TEMP,SD_CS0
1795
C:001a16 ef0f              SER     DATA
1796
C:001a17 d128              RCALL   FPGA_REG
1797
 
1798
C:001a18   +          LDIZ    KOL_CLS
1799
C:001a18 e3e0      LDI     ZL,LOW(KOL_CLS)
1800
C:001a19 e0f5      LDI     ZH,HIGH(KOL_CLS)
1801
C:001a1a 9101              LD      DATA,Z+
1802
C:001a1b 9111              LD      TEMP,Z+
1803
C:001a1c 2b01              OR      DATA,TEMP
1804
C:001a1d 9111              LD      TEMP,Z+
1805
C:001a1e 2b01              OR      DATA,TEMP
1806
C:001a1f 9111              LD      TEMP,Z+
1807
C:001a20 2b01              OR      DATA,TEMP
1808
C:001a21 f1e1              BREQ    LSTCLSF
1809
C:001a22   +          LDSX    TFILCLS+0
1810
C:001a22 91a0 052b LDS     XL,TFILCLS+0
1811
C:001a24 91b0 052c LDS     XH,TFILCLS+0+1
1812
C:001a26   +          LDSY    TFILCLS+2
1813
C:001a26 91c0 052d LDS     YL,TFILCLS+2
1814
C:001a28 91d0 052e LDS     YH,TFILCLS+2+1
1815
C:001a2a df97              RCALL   REALSEC
1816
C:001a2b 9100 052a         LDS     DATA,NUMSECK
1817
C:001a2d 0fa0              ADD     XL,DATA
1818
C:001a2e 1dbf              ADC     XH,NULL
1819
C:001a2f 1dcf              ADC     YL,NULL
1820
C:001a30 1ddf              ADC     YH,NULL
1821
C:001a31 dee1              RCALL   LOAD_DATA
1822
C:001a32   +          LDSX    TFILCLS+0
1823
C:001a32 91a0 052b LDS     XL,TFILCLS+0
1824
C:001a34 91b0 052c LDS     XH,TFILCLS+0+1
1825
C:001a36   +          LDSY    TFILCLS+2
1826
C:001a36 91c0 052d LDS     YL,TFILCLS+2
1827
C:001a38 91d0 052e LDS     YH,TFILCLS+2+1
1828
C:001a3a 9100 052a         LDS     DATA,NUMSECK
1829
C:001a3c 9503              INC     DATA
1830
C:001a3d 9300 052a         STS     NUMSECK,DATA
1831
C:001a3f 9110 0502         LDS     TEMP,BYTSSEC
1832
C:001a41 1710              CP      TEMP,DATA
1833
C:001a42 f4c9              BRNE    NEXT_OK
1834
 
1835
C:001a43 92f0 052a         STS     NUMSECK,NULL
1836
C:001a45 df1f              RCALL   RDFATZP
1837
C:001a46   +          STSX    TFILCLS+0
1838
C:001a46 93a0 052b STS     TFILCLS+0,XL
1839
C:001a48 93b0 052c STS     TFILCLS+0+1,XH
1840
C:001a4a   +          STSY    TFILCLS+2
1841
C:001a4a 93c0 052d STS     TFILCLS+2,YL
1842
C:001a4c 93d0 052e STS     TFILCLS+2+1,YH
1843
C:001a4e   +          LDIZ    KOL_CLS
1844
C:001a4e e3e0      LDI     ZL,LOW(KOL_CLS)
1845
C:001a4f e0f5      LDI     ZH,HIGH(KOL_CLS)
1846
C:001a50 8100              LD      DATA,Z
1847
C:001a51 5001              SUBI    DATA,1
1848
C:001a52 9301              ST      Z+,DATA
1849
C:001a53 8100              LD      DATA,Z
1850
C:001a54 090f              SBC     DATA,NULL
1851
C:001a55 9301              ST      Z+,DATA
1852
C:001a56 8100              LD      DATA,Z
1853
C:001a57 090f              SBC     DATA,NULL
1854
C:001a58 9301              ST      Z+,DATA
1855
C:001a59 8100              LD      DATA,Z
1856
C:001a5a 090f              SBC     DATA,NULL
1857
C:001a5b 9301              ST      Z+,DATA
1858
C:001a5c ef0f      NEXT_OK:SER     DATA
1859
C:001a5d 9508              RET
1860
 
1861
C:001a5e   +  LSTCLSF:LDSX    TFILCLS+0
1862
C:001a5e 91a0 052b LDS     XL,TFILCLS+0
1863
C:001a60 91b0 052c LDS     XH,TFILCLS+0+1
1864
C:001a62   +          LDSY    TFILCLS+2
1865
C:001a62 91c0 052d LDS     YL,TFILCLS+2
1866
C:001a64 91d0 052e LDS     YH,TFILCLS+2+1
1867
C:001a66 df5b              RCALL   REALSEC
1868
C:001a67 9100 052a         LDS     DATA,NUMSECK
1869
C:001a69 0fa0              ADD     XL,DATA
1870
C:001a6a 1dbf              ADC     XH,NULL
1871
C:001a6b 1dcf              ADC     YL,NULL
1872
C:001a6c 1ddf              ADC     YH,NULL
1873
C:001a6d dea5              RCALL   LOAD_DATA
1874
C:001a6e 9100 052a         LDS     DATA,NUMSECK
1875
C:001a70 9503              INC     DATA
1876
C:001a71 9300 052a         STS     NUMSECK,DATA
1877
C:001a73 9110 052f         LDS     TEMP,MPHWOST
1878
C:001a75 1b01              SUB     DATA,TEMP
1879
C:001a76 9508              RET
1880
         ;
1881
         ;--------------------------------------
1882
         ;ошибки
1883
          SD_ERROR:
1884
C:001a77 9300 053d         STS     SDERROR,DATA
1885
C:001a79 ef1f              LDI     TEMP,LOW(RAMEND)
1886
C:001a7a bf1d              OUT     SPL,TEMP
1887
C:001a7b e110              LDI     TEMP,HIGH(RAMEND)
1888
C:001a7c bf1e              OUT     SPH,TEMP
1889
 
1890
C:001a7d d0ce              RCALL   UART_NEWLINE
1891
C:001a7e e0a0              LDI     XL,0
1892
C:001a7f e0b4              LDI     XH,4
1893
C:001a80 d0d3              RCALL   SET_CURSOR
1894
C:001a81   +          LDIZ    MSG_SDERROR*2
1895
C:001a81 efee      LDI     ZL,LOW(MSG_SDERROR*2)
1896
C:001a82 e0f0      LDI     ZH,HIGH(MSG_SDERROR*2)
1897
C:001a83 d0dc              RCALL   PRINTSTRZ
1898
C:001a84 9100 053d         LDS     DATA,SDERROR
1899
C:001a86 3001              CPI     DATA,1
1900
C:001a87 f421              BRNE    SD_ERR2
1901
C:001a88   +          LDIZ    MSG_CARD*2
1902
C:001a88 e0ea      LDI     ZL,LOW(MSG_CARD*2)
1903
C:001a89 e0f1      LDI     ZH,HIGH(MSG_CARD*2)
1904
C:001a8a d0d5              RCALL   PRINTSTRZ
1905
C:001a8b c011              RJMP    SD_NOTFOUND
1906
          SD_ERR2:
1907
C:001a8c 3002              CPI     DATA,2
1908
C:001a8d f421              BRNE    SD_ERR3
1909
C:001a8e   +          LDIZ    MSG_READERROR*2
1910
C:001a8e e1e0      LDI     ZL,LOW(MSG_READERROR*2)
1911
C:001a8f e0f1      LDI     ZH,HIGH(MSG_READERROR*2)
1912
C:001a90 d0cf              RCALL   PRINTSTRZ
1913
C:001a91 c01e              RJMP    SD_ERR9
1914
          SD_ERR3:
1915
C:001a92 3003              CPI     DATA,3
1916
C:001a93 f421              BRNE    SD_ERR4
1917
C:001a94   +          LDIZ    MSG_FAT*2
1918
C:001a94 e1ec      LDI     ZL,LOW(MSG_FAT*2)
1919
C:001a95 e0f1      LDI     ZH,HIGH(MSG_FAT*2)
1920
C:001a96 d0c9              RCALL   PRINTSTRZ
1921
C:001a97 c005              RJMP    SD_NOTFOUND
1922
          SD_ERR4:
1923
C:001a98 3004              CPI     DATA,4
1924
C:001a99 f439              BRNE    SD_ERR5
1925
C:001a9a   +          LDIZ    MSG_FILE*2
1926
C:001a9a e2e0      LDI     ZL,LOW(MSG_FILE*2)
1927
C:001a9b e0f1      LDI     ZH,HIGH(MSG_FILE*2)
1928
C:001a9c d0c3              RCALL   PRINTSTRZ
1929
          SD_NOTFOUND:
1930
C:001a9d   +          LDIZ    MSG_NOTFOUND*2
1931
C:001a9d e2e6      LDI     ZL,LOW(MSG_NOTFOUND*2)
1932
C:001a9e e0f1      LDI     ZH,HIGH(MSG_NOTFOUND*2)
1933
C:001a9f d0c0              RCALL   PRINTSTRZ
1934
C:001aa0 c00f              RJMP    SD_ERR9
1935
          SD_ERR5:
1936
C:001aa1 3005              CPI     DATA,5
1937
C:001aa2 f439              BRNE    SD_ERR6
1938
C:001aa3   +          LDIZ    MSG_FILE*2
1939
C:001aa3 e2e0      LDI     ZL,LOW(MSG_FILE*2)
1940
C:001aa4 e0f1      LDI     ZH,HIGH(MSG_FILE*2)
1941
C:001aa5 d0ba              RCALL   PRINTSTRZ
1942
C:001aa6   +          LDIZ    MSG_EMPTY*2
1943
C:001aa6 e3e2      LDI     ZL,LOW(MSG_EMPTY*2)
1944
C:001aa7 e0f1      LDI     ZH,HIGH(MSG_EMPTY*2)
1945
C:001aa8 d0b7              RCALL   PRINTSTRZ
1946
C:001aa9 c006              RJMP    SD_ERR9
1947
          SD_ERR6:
1948
C:001aaa   +          LDIZ    MSG_FILE*2
1949
C:001aaa e2e0      LDI     ZL,LOW(MSG_FILE*2)
1950
C:001aab e0f1      LDI     ZH,HIGH(MSG_FILE*2)
1951
C:001aac d0b3              RCALL   PRINTSTRZ
1952
C:001aad   +          LDIZ    MSG_TOOBIG*2
1953
C:001aad e3ea      LDI     ZL,LOW(MSG_TOOBIG*2)
1954
C:001aae e0f1      LDI     ZH,HIGH(MSG_TOOBIG*2)
1955
C:001aaf d0b0              RCALL   PRINTSTRZ
1956
          SD_ERR9:
1957
         ;
1958
C:001ab0 91e0 053d         LDS     ZL,SDERROR
1959
C:001ab2   +  SD_ERR1:LED_ON
1960
C:001ab2 98c7      CBI     PORTB,7
1961
C:001ab3 e005              LDI     DATA,5
1962
C:001ab4 d0d5              RCALL   BEEP
1963
C:001ab5   +          LED_OFF
1964
C:001ab5 9ac7      SBI     PORTB,7
1965
C:001ab6 e005              LDI     DATA,5
1966
C:001ab7 d0e1              RCALL   DELAY
1967
C:001ab8 95ea              DEC     ZL
1968
C:001ab9 f7c1              BRNE    SD_ERR1
1969
         ;
1970
C:001aba d091              RCALL   UART_NEWLINE
1971
C:001abb e0a0              LDI     XL,0
1972
C:001abc e0b6              LDI     XH,6
1973
C:001abd d096              RCALL   SET_CURSOR
1974
C:001abe   +          LDIZ    MSG_HALT*2
1975
C:001abe e8e2      LDI     ZL,LOW(MSG_HALT*2)
1976
C:001abf e0f1      LDI     ZH,HIGH(MSG_HALT*2)
1977
C:001ac0 d09f              RCALL   PRINTSTRZ
1978
C:001ac1 9816              CBI     DDRE,6
1979
C:001ac2 cfff      STOP2:  RJMP    STOP2
1980
         ;
1981
         ;======================================
1982
         ;чтение ID Flash-ROM чипа
1983
         ;out:   ZL,ZH
1984
C:001ac3 d03c      F_ID:   RCALL   F_RST
1985
C:001ac4 e900              LDI     DATA,$90
1986
C:001ac5 d040              RCALL   F_CMD
1987
C:001ac6 ef14              LDI     TEMP,FLASH_CTRL
1988
C:001ac7 e003              LDI     DATA,0B00000011
1989
C:001ac8 d077              RCALL   FPGA_REG
1990
C:001ac9 e0a0              LDI     XL,$00
1991
C:001aca e0b0              LDI     XH,$00
1992
C:001acb e0c0              LDI     YL,$00
1993
C:001acc d067              RCALL   F_IN
1994
C:001acd 2fe0              MOV     ZL,DATA
1995
C:001ace e0a1              LDI     XL,$01
1996
C:001acf d064              RCALL   F_IN
1997
C:001ad0 2ff0              MOV     ZH,DATA
1998
C:001ad1 c02e              RJMP    F_RST
1999
         ;
2000
         ;--------------------------------------
2001
         ;запись одного байта во Flash-ROM
2002
         ;in:    RAM[Z] == data
2003
         ;       XL,XH,YL == address
2004
C:001ad2 ea00      F_WRITE:LDI     DATA,$A0
2005
C:001ad3 d032              RCALL   F_CMD
2006
C:001ad4 ef14              LDI     TEMP,FLASH_CTRL
2007
C:001ad5 e001              LDI     DATA,0B00000001
2008
C:001ad6 d069              RCALL   FPGA_REG
2009
C:001ad7 ef10              LDI     TEMP,FLASH_LOADDR
2010
C:001ad8 2f0a              MOV     DATA,XL
2011
C:001ad9 d066              RCALL   FPGA_REG
2012
C:001ada ef11              LDI     TEMP,FLASH_MIDADDR
2013
C:001adb 2f0b              MOV     DATA,XH
2014
C:001adc d063              RCALL   FPGA_REG
2015
C:001add ef12              LDI     TEMP,FLASH_HIADDR
2016
C:001ade 2f0c              MOV     DATA,YL
2017
C:001adf d060              RCALL   FPGA_REG
2018
C:001ae0 ef13              LDI     TEMP,FLASH_DATA
2019
C:001ae1 8100              LD      DATA,Z
2020
C:001ae2 d05d              RCALL   FPGA_REG
2021
C:001ae3 ef14              LDI     TEMP,FLASH_CTRL
2022
C:001ae4 e005              LDI     DATA,0B00000101
2023
C:001ae5 d05a              RCALL   FPGA_REG
2024
C:001ae6 e001              LDI     DATA,0B00000001
2025
C:001ae7 d05d              RCALL   FPGA_SAME_REG
2026
C:001ae8 e003              LDI     DATA,0B00000011
2027
C:001ae9 d05b              RCALL   FPGA_SAME_REG
2028
C:001aea ef13              LDI     TEMP,FLASH_DATA
2029
C:001aeb d054              RCALL   FPGA_REG
2030
C:001aec d058      F_WRIT1:RCALL   FPGA_SAME_REG
2031
C:001aed 8110              LD      TEMP,Z
2032
C:001aee 2701              EOR     DATA,TEMP
2033
C:001aef fd07              SBRC    DATA,7
2034
C:001af0 cffb              RJMP    F_WRIT1
2035
C:001af1 9508              RET
2036
         ;
2037
         ;--------------------------------------
2038
         ;стирание Flash-ROM
2039
C:001af2 e800      F_ERASE:LDI     DATA,$80
2040
C:001af3 d012              RCALL   F_CMD
2041
C:001af4 e100              LDI     DATA,$10
2042
C:001af5 d010              RCALL   F_CMD
2043
C:001af6 ef14              LDI     TEMP,FLASH_CTRL
2044
C:001af7 e003              LDI     DATA,0B00000011
2045
C:001af8 d047              RCALL   FPGA_REG
2046
C:001af9 ef13              LDI     TEMP,FLASH_DATA
2047
C:001afa d045              RCALL   FPGA_REG
2048
C:001afb   +  F_ERAS1:LED_OFF
2049
C:001afb 9ac7      SBI     PORTB,7
2050
C:001afc d048              RCALL   FPGA_SAME_REG
2051
C:001afd   +          LED_ON
2052
C:001afd 98c7      CBI     PORTB,7
2053
C:001afe ff07              SBRS    DATA,7
2054
C:001aff cffb              RJMP    F_ERAS1
2055
         ;
2056
         ; - - - - - - - - - - - - - - - - - - -
2057
         ;сброс Flash-ROM чипа
2058
C:001b00 ef00      F_RST:  LDI     DATA,$F0
2059
C:001b01 d004              RCALL   F_CMD
2060
C:001b02 e113              LDI     TEMP,19 ;~5 us @ 11.0592 MHz
2061
C:001b03 951a      F_RST1: DEC     TEMP    ;1
2062
C:001b04 f7f1              BRNE    F_RST1  ;2
2063
C:001b05 9508              RET
2064
         ;
2065
         ;--------------------------------------
2066
         ;комманда в Flash-ROM чип
2067
         ;in:    DATA == instructions
2068
C:001b06 930f      F_CMD:  PUSH    DATA
2069
C:001b07 ef14              LDI     TEMP,FLASH_CTRL
2070
C:001b08 e001              LDI     DATA,0B00000001
2071
C:001b09 d036              RCALL   FPGA_REG
2072
C:001b0a ef10              LDI     TEMP,FLASH_LOADDR
2073
C:001b0b e505              LDI     DATA,$55
2074
C:001b0c d033              RCALL   FPGA_REG
2075
C:001b0d ef11              LDI     TEMP,FLASH_MIDADDR
2076
C:001b0e e505              LDI     DATA,$55
2077
C:001b0f d030              RCALL   FPGA_REG
2078
C:001b10 ef13              LDI     TEMP,FLASH_DATA
2079
C:001b11 ea0a              LDI     DATA,$AA
2080
C:001b12 d02d              RCALL   FPGA_REG
2081
C:001b13 ef14              LDI     TEMP,FLASH_CTRL
2082
C:001b14 e005              LDI     DATA,0B00000101
2083
C:001b15 d02a              RCALL   FPGA_REG
2084
C:001b16 e001              LDI     DATA,0B00000001
2085
C:001b17 d02d              RCALL   FPGA_SAME_REG
2086
C:001b18 ef10              LDI     TEMP,FLASH_LOADDR
2087
C:001b19 ea0a              LDI     DATA,$AA
2088
C:001b1a d025              RCALL   FPGA_REG
2089
C:001b1b ef11              LDI     TEMP,FLASH_MIDADDR
2090
C:001b1c e20a              LDI     DATA,$2A
2091
C:001b1d d022              RCALL   FPGA_REG
2092
C:001b1e ef13              LDI     TEMP,FLASH_DATA
2093
C:001b1f e505              LDI     DATA,$55
2094
C:001b20 d01f              RCALL   FPGA_REG
2095
C:001b21 ef14              LDI     TEMP,FLASH_CTRL
2096
C:001b22 e005              LDI     DATA,0B00000101
2097
C:001b23 d01c              RCALL   FPGA_REG
2098
C:001b24 e001              LDI     DATA,0B00000001
2099
C:001b25 d01f              RCALL   FPGA_SAME_REG
2100
C:001b26 ef10              LDI     TEMP,FLASH_LOADDR
2101
C:001b27 e505              LDI     DATA,$55
2102
C:001b28 d017              RCALL   FPGA_REG
2103
C:001b29 ef11              LDI     TEMP,FLASH_MIDADDR
2104
C:001b2a e505              LDI     DATA,$55
2105
C:001b2b d014              RCALL   FPGA_REG
2106
C:001b2c ef13              LDI     TEMP,FLASH_DATA
2107
C:001b2d 910f              POP     DATA
2108
C:001b2e d011              RCALL   FPGA_REG
2109
C:001b2f ef14              LDI     TEMP,FLASH_CTRL
2110
C:001b30 e005              LDI     DATA,0B00000101
2111
C:001b31 d00e              RCALL   FPGA_REG
2112
C:001b32 e001              LDI     DATA,0B00000001
2113
C:001b33 c011              RJMP    FPGA_SAME_REG
2114
         ;
2115
         ;--------------------------------------
2116
         ;чтение одного байта Flash-ROM
2117
         ;in:    XL,XH,YL == address
2118
         ;out:   DATA == data
2119
C:001b34 ef10      F_IN:   LDI     TEMP,FLASH_LOADDR
2120
C:001b35 2f0a              MOV     DATA,XL
2121
C:001b36 d009              RCALL   FPGA_REG
2122
C:001b37 ef11              LDI     TEMP,FLASH_MIDADDR
2123
C:001b38 2f0b              MOV     DATA,XH
2124
C:001b39 d006              RCALL   FPGA_REG
2125
C:001b3a ef12              LDI     TEMP,FLASH_HIADDR
2126
C:001b3b 2f0c              MOV     DATA,YL
2127
C:001b3c d003              RCALL   FPGA_REG
2128
C:001b3d ef13              LDI     TEMP,FLASH_DATA
2129
C:001b3e ef0f              LDI     DATA,$FF
2130
C:001b3f c000              RJMP    FPGA_REG
2131
         ;
2132
         ;--------------------------------------
2133
         ;обмен с регистрами в FPGA
2134
         ;in:    TEMP == номер регистра
2135
         ;       DATA == данные
2136
         ;out:   DATA == данные
2137
          FPGA_REG:
2138
C:001b40 930f              PUSH    DATA
2139
C:001b41   +          SPICS_SET
2140
C:001b41 9ac0      SBI     PORTB,0
2141
C:001b42 b91f              OUT     SPDR,TEMP
2142
C:001b43 d003              RCALL   RD_WHEN_RDY
2143
C:001b44 910f              POP     DATA
2144
         ;обмен без установки регистра
2145
         ;in:    DATA == данные
2146
         ;out:   DATA == данные
2147
          FPGA_SAME_REG:
2148
C:001b45   +          SPICS_CLR
2149
C:001b45 98c0      CBI     PORTB,0
2150
C:001b46 b90f              OUT     SPDR,DATA
2151
         ;ожидание окончания обмена с FPGA по SPI
2152
         ;и чтение пришедших данных
2153
         ;out:   DATA == данные
2154
          RD_WHEN_RDY:
2155
C:001b47 9b77              SBIS    SPSR,SPIF
2156
C:001b48 cffe              RJMP    RD_WHEN_RDY
2157
C:001b49 b10f              IN      DATA,SPDR
2158
C:001b4a   +          SPICS_SET
2159
C:001b4a 9ac0      SBI     PORTB,0
2160
C:001b4b 9508              RET
2161
         ;
2162
         ;--------------------------------------
2163
         ;
2164
          UART_NEWLINE:
2165
C:001b4c   +          LDIZ    MSG_NEWLINE*2
2166
C:001b4c ebe0      LDI     ZL,LOW(MSG_NEWLINE*2)
2167
C:001b4d e0f0      LDI     ZH,HIGH(MSG_NEWLINE*2)
2168
         ;
2169
         ; - - - - - - - - - - - - - - - - - - -
2170
         ;вывод строки на UART
2171
         ;in:    Z == указательна строку (в младших 64K)
2172
          UART_PRINTSTRZ:
2173
C:001b4e 9105      UPSTRZ1:LPM     DATA,Z+
2174
C:001b4f 2300              TST     DATA
2175
C:001b50 f011              BREQ    UPSTRZ2
2176
C:001b51 d02f              RCALL   UART_PUTCHAR
2177
C:001b52 cffb              RJMP    UPSTRZ1
2178
C:001b53 9508      UPSTRZ2:RET
2179
         ;
2180
         ;--------------------------------------
2181
         ;установка позиции печати на экране
2182
         ;in:    XL == x (0..31)
2183
         ;       XH == y (0..23)
2184
          SET_CURSOR:
2185
C:001b54 e210              LDI     TEMP,32
2186
C:001b55 9fb1              MUL     XH,TEMP
2187
C:001b56 27bb              CLR     XH
2188
C:001b57 0da0              ADD     XL,R0
2189
C:001b58 1db1              ADC     XH,R1
2190
C:001b59 9711              SBIW    XL,1
2191
C:001b5a e410              LDI     TEMP,SCR_LOADDR
2192
C:001b5b 2f0a              MOV     DATA,XL
2193
C:001b5c dfe3              RCALL   FPGA_REG
2194
C:001b5d e411              LDI     TEMP,SCR_HIADDR
2195
C:001b5e 2f0b              MOV     DATA,XH
2196
C:001b5f cfe0              RJMP    FPGA_REG
2197
         ;
2198
         ;--------------------------------------
2199
         ;вывод строки на экран и на UART
2200
         ;in:    Z == указательна строку (в младших 64K)
2201
          PRINTSTRZ:
2202
C:001b60 9105      PRSTRZ1:LPM     DATA,Z+
2203
C:001b61 2300              TST     DATA
2204
C:001b62 f011              BREQ    PRSTRZ2
2205
C:001b63 d017              RCALL   PUTCHAR
2206
C:001b64 cffb              RJMP    PRSTRZ1
2207
C:001b65 9508      PRSTRZ2:RET
2208
         ;
2209
         ;--------------------------------------
2210
         ;out byte in dec
2211
         ;in:    DATA == byte (0..99)
2212
C:001b66 5d00      DECBYTE:SUBI    DATA,208
2213
C:001b67 ff07              SBRS    DATA,7
2214
C:001b68 5300              SUBI    DATA,48
2215
C:001b69 5e08              SUBI    DATA,232
2216
C:001b6a ff06              SBRS    DATA,6
2217
C:001b6b 5108              SUBI    DATA,24
2218
C:001b6c 5f04              SUBI    DATA,244
2219
C:001b6d ff05              SBRS    DATA,5
2220
C:001b6e 500c              SUBI    DATA,12
2221
C:001b6f 5f0a              SUBI    DATA,250
2222
C:001b70 ff04              SBRS    DATA,4
2223
C:001b71 5006              SUBI    DATA,6
2224
         ;
2225
         ; - - - - - - - - - - - - - - - - - - -
2226
         ;out byte in hex
2227
         ;in:    DATA == byte
2228
C:001b72 930f      HEXBYTE:PUSH    DATA
2229
C:001b73 9502              SWAP    DATA
2230
C:001b74 d001              RCALL   HEXHALF
2231
C:001b75 910f              POP     DATA
2232
C:001b76 700f      HEXHALF:ANDI    DATA,$0F
2233
C:001b77 300a              CPI     DATA,$0A
2234
C:001b78 f008              BRCS    HEXBYT1
2235
C:001b79   +          ADDI    DATA,$07
2236
C:001b79 5f09      SUBI    DATA,(-$07&$FF)
2237
C:001b7a   +  HEXBYT1:ADDI    DATA,$30
2238
C:001b7a 5d00      SUBI    DATA,(-$30&$FF)
2239
         ;
2240
         ; - - - - - - - - - - - - - - - - - - -
2241
         ;вывод символа на экран и на UART
2242
         ;in:    DATA == char
2243
C:001b7b 930f      PUTCHAR:PUSH    DATA
2244
C:001b7c 931f              PUSH    TEMP
2245
C:001b7d e414              LDI     TEMP,SCR_CHAR
2246
C:001b7e dfc1              RCALL   FPGA_REG
2247
C:001b7f 911f              POP     TEMP
2248
C:001b80 910f              POP     DATA
2249
          UART_PUTCHAR:
2250
C:001b81 931f              PUSH    TEMP
2251
C:001b82   +  UPCHR1: INPORT  TEMP,UCSR1A
2252
C:001b82 9110 009b LDS     TEMP,UCSR1A+$20*(UCSR1A<$40)
2253
C:001b84 ff15              SBRS    TEMP,UDRE
2254
C:001b85 cffc              RJMP    UPCHR1
2255
C:001b86   +          OUTPORT UDR1,DATA
2256
C:001b86 9300 009c STS     UDR1+$20*(UDR1<$40),DATA
2257
C:001b88 911f              POP     TEMP
2258
C:001b89 9508              RET
2259
         ;
2260
         ;--------------------------------------
2261
         ;in:    DATA == продолжительность *0.1 сек
2262
          BEEP:
2263
C:001b8a e614      BEE2:   LDI     TEMP,100;100 периодов 1кГц
2264
C:001b8b 981e      BEE1:   CBI     PORTE,6
2265
C:001b8c d007              RCALL   BEEPDLY
2266
C:001b8d 9a1e              SBI     PORTE,6
2267
C:001b8e d005              RCALL   BEEPDLY
2268
C:001b8f 951a              DEC     TEMP
2269
C:001b90 f7d1              BRNE    BEE1
2270
C:001b91 950a              DEC     DATA
2271
C:001b92 f7b9              BRNE    BEE2
2272
C:001b93 9508              RET
2273
 
2274
C:001b94 e684      BEEPDLY:LDI     R24,$64
2275
C:001b95 e095              LDI     R25,$05
2276
C:001b96 9701      BEEPDL1:SBIW    R24,1
2277
C:001b97 f7f1              BRNE    BEEPDL1
2278
C:001b98 9508              RET
2279
         ;
2280
         ;--------------------------------------
2281
         ;in:    DATA == продолжительность *0.1 сек
2282
C:001b99 e14e      DELAY:  LDI     R20,$1E ;\
2283
C:001b9a ef5e              LDI     R21,$FE ;/ 0,1 ᥪ @ 11.0592MHz
2284
C:001b9b 95c8      DELAY1: LPM             ;3
2285
C:001b9c 95c8              LPM             ;3
2286
C:001b9d 95c8              LPM             ;3
2287
C:001b9e 95c8              LPM             ;3
2288
C:001b9f 5041              SUBI    R20,1   ;1
2289
C:001ba0 4050              SBCI    R21,0   ;1
2290
C:001ba1 4000              SBCI    DATA,0  ;1
2291
C:001ba2 f7c1              BRNE    DELAY1  ;2(1)
2292
C:001ba3 9508              RET
2293
         ;
2294
         ;--------------------------------------
2295
         ;
2296
 
2297
 
2298
Segment usage:
2299
   Code      :      7076 words (14152 bytes)
2300
   Data      :        68 bytes
2301
   EEPROM    :         0 bytes
2302
 
2303
Assembly completed with no errors.