URL
https://opencores.org/ocsvn/ffr16/ffr16/trunk
Subversion Repositories ffr16
[/] [ffr16/] [trunk/] [sources/] [fpu/] [050803KN/] [compile/] [FAT16RD.LOG] - Rev 2
Go to most recent revision | Compare with Previous | Blame | View Log
KCPSM Assembler log file for program 'fat16rd.psm'.
Generated by KCPSM version 1.10
Ken Chapman (Xilinx Ltd) 2002.
Addr Code
00 ; FAT16 READER V.050303 - Armando Astarloa - 16 BIT VER.
00 ; APERT - UPV/EHU 2003 - DISTRIBUTED UNDER GPL LICENCE
00 ;
00 ; s0 -> TMP0 s1 -> TMP1 s2 -> TMP2 s3 -> TMP3 s4 -> TMP4 / SECTORS_PER_CLUSTER_READED s5 -> TMP5/SECTOR_WORDS_READED (256 TO 0)
00 ; s6 -> TMP s7 -> SECTORS_PER_CLUSTER s8 -> CLUSTER_BEGIN_LBA0 (FAT) s9 -> CLUSTER_BEGIN_LBA1 sA -> CLUSTER_BEGIN_LBA2
00 ; sB -> CLUSTER_BEGIN_LBA3 sC -> ROOT_DIRECTORY_FIRST_CLUSTER0 (SUPPOSED LESS THAN 256 - USUALLY 2)
00 ; sD -> data[7:0] WB MASTER sE -> data[15:8] WB MASTER sF -> acummulator
00 CONSTANT DATA_WB_OUT_7_0_MASTER, 00
00 CONSTANT DATA_WB_OUT_15_8_MASTER, 01
00 CONSTANT CONTROL_WB_OUT_MASTER, 02
00 ; D7 = D6 = D5 = D4 = D3 = D2 = A0_MASTER D1 = W_WE_MASTER D0 = STB_O_MASTER
00 ; STROBE_O_MASTER = 1 & W_WE=0 & WB_A0 = 0
00 CONSTANT READ_SLAVE, 01
00 ; STROBE_O_MASTER = 1 & W_WE=1 & WB_A0 = 0
00 CONSTANT WRITE_LBA_15_0, 03
00 ; STROBE_CF_READER = 1 & W_WE=1 & WB_A0 = 1
00 CONSTANT WRITE_LBA_27_16, 07
00 ;--
00 ;-- SLAVE INTERFACE
00 ;--
00 CONSTANT DATA_WB_OUT_7_0_SLAVE, 03
00 CONSTANT DATA_WB_OUT_15_8_SLAVE, 04
00 CONSTANT CONTROL_WB_OUT_SLAVE, 05
00 ; D7 = D6 = D5 D4 = D3 =
00 ; D2 = TAG1_ERROR
00 ; D1 = TAG0_WORD_AVAILABLE
00 ; D0 = ACK_O_SLAVE
00 CONSTANT ACK_O_SLAVE, 01
00 CONSTANT TAG0_WORD_AVAILABLE, 02
00 CONSTANT ERROR, 04
00 ;--
00 ;-- BUS CONTROL SIGNALS
00 ;--
00 CONSTANT CONTROL_OUT_MASTER, 06
00 ; D7 = D6 = D5 = D4 = D3 = D2 = D1 =
00 ; D0 = WB_BUS_MASTER_WRITE_ENABLE
00 CONSTANT WB_BUS_MASTER_WRITE_ENABLE, 01
00 CONSTANT CONTROL_OUT_SLAVE, 07
00 ; D7 = D6 = D5 = D4 = D3 = D2 = D1 =
00 ; D0 = WB_BUS_SLAVE_WRITE_ENABLE
00 CONSTANT WB_BUS_SLAVE_WRITE_ENABLE, 01
00 ;--
00 ;-- EXTERNAL REGISTERS FOR MORE DATA ALLOCATION (OTHER OPTION IS THE USE OF
00 ;-- ANOTHER BLOCK RAM IF IT IS AVALIABLE
00 ;--
00 CONSTANT TMP_OUT_0, 08
00 CONSTANT TMP_OUT_1, 09
00 CONSTANT TMP_OUT_2, 0A
00 CONSTANT TMP_OUT_3, 0B
00 CONSTANT TMP_OUT_4, 0C
00 CONSTANT TMP_OUT_5, 0D
00 CONSTANT TMP_OUT_6, 0E
00 CONSTANT TMP_OUT_7, 0F
00 ;--
00 ;-- INPUT PORTS
00 ;--
00 ;--
00 ;-- WISHBONE INTERFACE PORTS - INPUTS
00 ;--
00 CONSTANT CONTROL_WB_IN_MASTER, 00
00 ; D7 = D6 = D5 = D4 = D3 = D2 =
00 ; D1 = ERROR_INPUT
00 ; D0 = ACK_I_MASTER
00 ;
00 CONSTANT ACK_I_MASTER, 01
00 CONSTANT ERROR_INPUT, 02
00 CONSTANT CONTROL_WB_IN_SLAVE, 01
00 ; D7 = D6 = D5 = D4 = D3 = D2 =
00 ; D1 = -
00 ; D0 = STB_I_SLAVE
00 ;
00 CONSTANT STB_I_SLAVE, 01
00 ;CONSTANT TAG0_FORCE_RESET,02
00 ;--
00 ;-- WISHBONE INTERFACE PORTS - INPUTS
00 ;--
00 CONSTANT DATA_WB_IN_7_0_MASTER, 02
00 CONSTANT DATA_WB_IN_15_8_MASTER, 03
00 ;--
00 ;-- EXTERNAL REGISTERS FOR MORE DATA ALLOCATION (OTHER OPTION IS THE USE OF
00 ;-- ANOTHER BLOCK RAM IF IT IS AVALIABLE
00 ;--
00 CONSTANT TMP_IN_0, 04
00 CONSTANT TMP_IN_1, 05
00 CONSTANT TMP_IN_2, 06
00 CONSTANT TMP_IN_3, 07
00 CONSTANT TMP_IN_4, 08
00 CONSTANT TMP_IN_5, 09
00 CONSTANT TMP_IN_6, 0A
00 CONSTANT TMP_IN_7, 0B
00 ;--
00 ;-- REGISTERS INITIALIZATION
00 ;--
00 inicialization:
00 ;
00 ; WISHBONE INTERFACES INIZIALIZATION
00 ;
00 0F00 LOAD sF, 00
01 EF00 OUTPUT sF, DATA_WB_OUT_7_0_MASTER[00]
02 EF01 OUTPUT sF, DATA_WB_OUT_15_8_MASTER[01]
03 EF03 OUTPUT sF, DATA_WB_OUT_7_0_SLAVE[03]
04 EF04 OUTPUT sF, DATA_WB_OUT_15_8_SLAVE[04]
05 EF02 OUTPUT sF, CONTROL_WB_OUT_MASTER[02]
06 EF05 OUTPUT sF, CONTROL_WB_OUT_SLAVE[05]
07 ;
07 ; WAIT FOR 410NS*3 (RESET DELAY)
07
07 main:
07 ; PROCESS MASTER BOOT RECORD
07 8348 CALL process_master_boot_record[48]
08 ; PROCESS ROOT DIRECTORY
08 838B CALL process_root_directory[8B]
09 start:
09 83AE CALL cluster_2_lba[AE]
0A ;CALL write_lba_to_slave
0A ; sector_per_cluster -> sector_per_cluster_readed
0A C470 LOAD s4, s7
0B ; 256 -> (s6) SECTOR_WORDS_READED
0B 8345 CALL read_sector[45]
0C idle:
0C A601 INPUT s6, CONTROL_WB_IN_SLAVE[01]
0D ; CHECK STB INPUT
0D ; CONTROL_WB_IN_SLAVE-> TMP (s6)
0D ; IF STB=1 GO TO THE NEXT STATE
0D ; IF STB=0 GO TO THE IDLE STATE
0D 1601 AND s6, STB_I_SLAVE[01]
0E 910C JUMP Z, idle[0C]
0F transfer_word_to_master:
0F 83E8 CALL read_word_from_slave[E8]
10 83C4 CALL write_a_word_to_master[C4]
11 ; (SECTOR WORDS READED)-1
11 6501 SUB s5, 01
12 check_sectors_words_readed:
12 ; IF sector_words_readed = 0 THEN READ_NEW_SECTOR
12 ; IF sector_words_readed > 0 THEN TRANSFER_WORD_TO_MASTER
12 C551 AND s5, s5
13 933E CALL Z, check_sector_per_cluster_readed[3E]
14 810C JUMP idle[0C]
15 track_new_cluster:
15 ; save the number of dummy reads that must be done when the fat sector will be readed
15 ; an are stored into s5 register
15 ; in s0 bits 6-0 of the cluster number (offset in the sector -> 256 words-fat16 entries)
15 ; as is each read operation a word is readed no multiplication is needed
15 ; RESTORE CLUSTER NUMBER
15 A008 INPUT s0, TMP_IN_4[08]
16 A109 INPUT s1, TMP_IN_5[09]
17 A20A INPUT s2, TMP_IN_6[0A]
18 A30B INPUT s3, TMP_IN_7[0B]
19 ;
19 ; compose LBA address of the sector of the fat that must be readed
19 ;
19 ; SHIFT RIGHT 15-8 TO 7-0
19 ;
19 0F07 LOAD sF, 07
1A do_shift:
1A D30E SR0 s3
1B ; uses the carry for the MSB and stores LSB into the carry
1B D208 SRA s2
1C D108 SRA s1
1D D008 SRA s0
1E 6F01 SUB sF, 01
1F 951A JUMP NZ, do_shift[1A]
20 8335 CALL add_load_fat_begin_lba[35]
21 ; adds fat_begin_lba to the sector relative to the fat obteined from the cluster
21 ; now there is the lba of the FAT sector that must be readed in s0,s1,s2,s3
21 83D3 CALL write_lba_to_slave[D3]
22 ; -- DUMMY READ OF THE WORDS OF THE SECTOR TILL THE ONE OF THE CLUSTER INTEGER
22 AF08 INPUT sF, TMP_IN_4[08]
23 1F7F AND sF, 7F
24 83E3 CALL do_dummy_reads_from_slave[E3]
25 ;
25 ; (sD) data[7:0] WB MASTER -> (s0) TEMPORAL REGISTER
25 ; (sE) data[7:0] WB MASTER -> (s1) TEMPORAL REGISTER
25 ; READ 2 BYTES
25 83E8 CALL read_word_from_slave[E8]
26 C0D0 LOAD s0, sD
27 C1E0 LOAD s1, sE
28 ; (sD) data[7:0] WB MASTER -> (s2) TEMPORAL REGISTER
28 ; (sE) data[7:0] WB MASTER -> (s3) TEMPORAL REGISTER
28 ; READ 2 BYTES
28 ;
28 ; CHECK IF ITS THE LAST ONE
28 ; CB3-CL2-CB1-CB0 IN FAT LITTLE ENDIAN ORDER CB0-CB1 CB2-CB3
28 CFE0 LOAD sF, sE
29 6FFF SUB sF, FF
2A 952F JUMP NZ, continue_file_processing[2F]
2B CFD0 LOAD sF, sD
2C 6FFF SUB sF, FF
2D 952F JUMP NZ, continue_file_processing[2F]
2E file_end:
2E ; infinite loop (file readed and tranferred)
2E 812E JUMP file_end[2E]
2F continue_file_processing:
2F ; in s0,s1 is the cluster name
2F ; --
2F ; (SECTOR WORDS READED)= 256
2F ; sector_per_cluster -> sector_per_cluster_readed
2F 0200 LOAD s2, 00
30 0300 LOAD s3, 00
31 C470 LOAD s4, s7
32 83AE CALL cluster_2_lba[AE]
33 8345 CALL read_sector[45]
34 8080 RETURN
35 add_load_fat_begin_lba:
35 AF04 INPUT sF, TMP_IN_0[04]
36 C0F4 ADD s0, sF
37 AF05 INPUT sF, TMP_IN_1[05]
38 C1F5 ADDCY s1, sF
39 AF06 INPUT sF, TMP_IN_2[06]
3A C2F5 ADDCY s2, sF
3B AF07 INPUT sF, TMP_IN_3[07]
3C C3F5 ADDCY s3, sF
3D 8080 RETURN
3E check_sector_per_cluster_readed:
3E ; IF sector_per_cluster_readed = 0 THEN TRACK_NEW_CLUSTER
3E ; IF sector_per_cluster_readed > 0 THEN CHECK SECTOR WORDS READED
3E ; (sector_per_cluster_readed)-1
3E ; (SECTOR WORDS READED)= 256
3E 6401 SUB s4, 01
3F C441 AND s4, s4
40 9115 JUMP Z, track_new_cluster[15]
41 read_new_sector:
41 ; (SECTOR WORDS READED)= 256
41 ; increment LBA
41 ; sector_per_cluster -> sector_per_cluster_readed-1
41 4001 ADD s0, 01
42 5100 ADDCY s1, 00
43 5200 ADDCY s2, 00
44 5300 ADDCY s3, 00
45 read_sector:
45 0500 LOAD s5, 00
46 83D3 CALL write_lba_to_slave[D3]
47 8080 RETURN
48 ;
48 ; --
48 ; -- PROCESS MASTER BOOT RECORD (READ LBA BEGIN OF THE FIRST PARTITION)
48 ; --
48 process_master_boot_record:
48 ;
48 ; LOAD LBA FOR MBR READ
48 ;
48 0000 LOAD s0, 00
49 0100 LOAD s1, 00
4A 0200 LOAD s2, 00
4B 0300 LOAD s3, 00
4C 83D3 CALL write_lba_to_slave[D3]
4D ; information of the lba begin for the first partition
4D ; has an offset of 454 bytes -> 227(0xE3) words
4D 0FE3 LOAD sF, E3
4E 83E3 CALL do_dummy_reads_from_slave[E3]
4F ;
4F ; --
4F ; -- MBR READ - Partition_LBA_Begin EXTRACTION
4F ; --
4F ;
4F ; (sD) data[7:0] WB MASTER -> (s0) lba
4F ; (sE) data[15:8] WB MASTER -> (s1) lba
4F ; (sD) data[7:0] WB MASTER -> (s2) lba
4F ; (sE) data[15:8] WB MASTER -> (s3) lba
4F 8384 CALL store_all_temporal_registers[84]
50 C800 LOAD s8, s0
51 C910 LOAD s9, s1
52 CA20 LOAD sA, s2
53 CB30 LOAD sB, s3
54 ;
54 ; NOW IS THE LBA_BEGIN ON THE TMP REGISTERS
54 ; --------------------
54 ; READ FIRST SECTOR (FAT32 VOLUMEN ID) OF THE PARTITION
54 ; ---------------------
54 83D3 CALL write_lba_to_slave[D3]
55 ;
55 ; READ -> SECTORS_PER_CLUSTER (OFFSET 0x0D)
55 ;
55 ; offset 0x0D (13) => READ 13 bytes -> 6(0x06) words and drop LSB in the next
55 0F06 LOAD sF, 06
56 83E3 CALL do_dummy_reads_from_slave[E3]
57 ;
57 ; (sE) data[7:0] WB MASTER -> (s7) SECTORS PER CLUSTER
57 83E8 CALL read_word_from_slave[E8]
58 C7E0 LOAD s7, sE
59 ;
59 ; READ -> Number_of_Reserved_Sectors (2 bytes) (OFFSET 0x0E)
59 ;
59 ; offset 0x0E (14) => READ 2 bytes -> 1(0x01) words
59 ; (sD) data[15:8] WB MASTER -> (s6) TEMPORAL REGISTER
59 83E8 CALL read_word_from_slave[E8]
5A C6D0 LOAD s6, sD
5B ; (sE) data[7:0] WB MASTER -> (s4) TEMPORAL REGISTER
5B ;
5B C4E0 LOAD s4, sE
5C ;
5C ;fat_begin_lba = Partition_LBA_Begin + Number_of_Reserved_Sectors
5C ;
5C C864 ADD s8, s6
5D C945 ADDCY s9, s4
5E 5A00 ADDCY sA, 00
5F 5B00 ADDCY sB, 00
60 ; store fat_begin_lba in external registers
60 E808 OUTPUT s8, TMP_OUT_0[08]
61 E909 OUTPUT s9, TMP_OUT_1[09]
62 EA0A OUTPUT sA, TMP_OUT_2[0A]
63 EB0B OUTPUT sB, TMP_OUT_3[0B]
64 ;
64 ;cluster_begin_lba = Partition_LBA_Begin + Number_of_Reserved_Sectors +
64 ; (Number_of_FATs * Sectors_Per_FAT)+ RootDirSectors;
64 ;cluster_begin_lba = fat_begin_lba + (Number_of_FATs * Sectors_Per_FAT)+ RootDirSectors;
64 ; READ -> Number_of_Fats (OFFSET 0x10) (always 2)
64 ;
64 ; offset 0x10 (16) => READ 2 bytes -> 1(0x01) words
64 ;
64 ; (sD) data[7:0] WB MASTER -> (s6) TEMPORAL REGISTER
64 83E8 CALL read_word_from_slave[E8]
65 C6D0 LOAD s6, sD
66 ;
66 ; FOR FAT16 => NUMBER OF SECTORS OCCUPIED BY THE ROOT DIRECTORY (BYTES_PER_SEC=512)
66 ;
66 ; READ -> RootEntCnt (OFFSET 0x11) (FAT16 PROCESSING)
66 ; RootDirSectors=((BPB_RootEntCnt*32)+(BPB_BytesPerSec-1))/BPB_BytesPerSec
66 ; offset 0x11 (17) => READ 1 bytes
66 ;
66 ; (sE) data[7:0] WB MASTER -> (s0) TEMPORAL REGISTER
66 C0E0 LOAD s0, sE
67 ; (sD) data[15:0] WB MASTER -> (sD) TEMPORAL REGISTER - offset 0x12 (18) => READ 1 bytes
67 83E8 CALL read_word_from_slave[E8]
68 C1D0 LOAD s1, sD
69 ; MULTIPLY BY 32 (100000) 5 SHIFTS TO THE LEFT
69 0F05 LOAD sF, 05
6A ; LSB '0'
6A mult_32:
6A D006 SL0 s0
6B ; CARRY -> LSB , MSB -> CARRY
6B D100 SLA s1
6C 6F01 SUB sF, 01
6D 956A JUMP NZ, mult_32[6A]
6E ;BPB_RootEntCnt*32+(BPB_BytesPerSec-1) 511 (0x1FF)
6E ;ADD s0,FF (if rounds up => not necessary??)
6E ;ADDCY s1,01
6E ;/BPB_BytesPerSec (512) (1000000000)9 SHIFTS TO THE RIGHT
6E 0F09 LOAD sF, 09
6F div_512:
6F ; uses the carry for the MSB and stores LSB into the carry
6F D10E SR0 s1
70 D008 SRA s0
71 6F01 SUB sF, 01
72 956F JUMP NZ, div_512[6F]
73 ; ROUNDs UP
73 ;ADD s0,01
73 ;ADDCY s1,00
73 ;fat_begin_lba + RootDirSectors
73 C804 ADD s8, s0
74 C915 ADDCY s9, s1
75 CA25 ADDCY sA, s2
76 CB35 ADDCY sB, s3
77 ; READ -> Sectors_per_fat (OFFSET 0x24)
77 ;
77 ; offset 0x16 (22) => READ 2 bytes -> 01(0x01) words
77 ;
77 0F01 LOAD sF, 01
78 83E3 CALL do_dummy_reads_from_slave[E3]
79 8384 CALL store_all_temporal_registers[84]
7A ; (Number_of_FATs * Sectors_Per_FAT)
7A ; Number_of_FATs = 2 (10) . Do a shift to the left of the Sectors_Per_Fat
7A ; *** FAT16 = Sectors_per_fat(BPB_FATSz16)
7A ; LSB '0'
7A D006 SL0 s0
7B ; CARRY -> LSB , MSB -> CARRY
7B D100 SLA s1
7C ;SLA s2 for fat16 only 2 bytes
7C ;SLA s3
7C ; fat_begin_lba + RootDirSectors + (Number_of_FATs * Sectors_Per_FAT)
7C C804 ADD s8, s0
7D C915 ADDCY s9, s1
7E 5A00 ADDCY sA, 00
7F 5B00 ADDCY sB, 00
80 ; cluster_begin_lba is stored in s8, s9, sA, SB
80 ;
80 ; FOR FAT16 ROOT DIRECTORY POSITION IS FIXED
80 ; root_first_lba = fat_begin_lba(in external regs) + (Number_of_FATs * Sectors_Per_FAT) (s0,s1,s2,s3)
80 ;
80 0200 LOAD s2, 00
81 0300 LOAD s3, 00
82 8335 CALL add_load_fat_begin_lba[35]
83 ; s0,s1,s2,s3 have Root directory begin lba
83 8080 RETURN
84 store_all_temporal_registers:
84 ; READ 2 BYTES
84 83E8 CALL read_word_from_slave[E8]
85 ; (sD) data[7:0] WB MASTER -> (s0) TEMPORAL REGISTER
85 ; (sE) data[7:0] WB MASTER -> (s1) TEMPORAL REGISTER
85 C0D0 LOAD s0, sD
86 C1E0 LOAD s1, sE
87 ; (sD) data[7:0] WB MASTER -> (s2) TEMPORAL REGISTER
87 ; (sE) data[7:0] WB MASTER -> (s3) TEMPORAL REGISTER
87 ; READ 2 BYTES
87 83E8 CALL read_word_from_slave[E8]
88 C2D0 LOAD s2, sD
89 C3E0 LOAD s3, sE
8A 8080 RETURN
8B process_root_directory:
8B ; INPUT :
8B ; s0,s1,s2,s3 root directory lba (FAT16- FIXED)
8B ; CALL cluster_2_lba
8B ; now s0,s1,s2,s3 contains the lba for the root directory
8B ; the first 32 byte record on the sector must be the root directory information
8B ; check if EOF (first byte of the 32 bytes is 0)
8B 83D3 CALL write_lba_to_slave[D3]
8C check_for_a_file:
8C 83E8 CALL read_word_from_slave[E8]
8D ; (sD) data[7:0] WB MASTER -> (s6) TEMPORAL REGISTER
8D C6D0 LOAD s6, sD
8E CF60 LOAD sF, s6
8F CFF1 AND sF, sF
90 ; if sF=0 the is not directory => error
90 91F2 JUMP Z, put_error_code[F2]
91 ;
91 ; check that is not a deleted entry
91 ;
91 ; (sD) data[7:0] WB MASTER -> (s6) TEMPORAL REGISTER
91 0FE5 LOAD sF, E5
92 CF61 AND sF, s6
93 ; if s6=E5 is a deteled entry => check for new one (offset => sF)
93 919D JUMP Z, check_next_directory_entry[9D]
94 check_attribute:
94 ; ATTRIBUTE -> OFFSET Bh
94 ; check that is not a directory or LONG NAME
94 ; 00arshdv - DV for long name - D for directory
94 ; (sD) data[7:0] WB MASTER -> (s6) TEMPORAL REGISTER
94 0F04 LOAD sF, 04
95 83E3 CALL do_dummy_reads_from_slave[E3]
96 83E8 CALL read_word_from_slave[E8]
97 C6E0 LOAD s6, sE
98 0F03 LOAD sF, 03
99 CF61 AND sF, s6
9A 959F JUMP NZ, check_next_directory_entry_attribute[9F]
9B ; if s6=0 that is not a file => error
9B ;JUMP Z,check_next_directory_entry
9B ; check that is not a directory
9B ; check that is a file (short filename entry)
9B ; in other case error
9B ;
9B ;
9B ; READ CLUSTER INFORMATION FOR THE FILE
9B ;
9B 83A2 CALL read_dir_cluster_hi_cluster_low[A2]
9C 8080 RETURN
9D check_next_directory_entry:
9D ; go fwd 11 words
9D 0F05 LOAD sF, 05
9E 83E3 CALL do_dummy_reads_from_slave[E3]
9F check_next_directory_entry_attribute:
9F ; go fwd 5 words
9F 0F0A LOAD sF, 0A
A0 83E3 CALL do_dummy_reads_from_slave[E3]
A1 818C JUMP check_for_a_file[8C]
A2 read_dir_cluster_hi_cluster_low:
A2 ; INPUT :
A2 ; before arrive here first two bytes of the directory
A2 ; structure must be readed
A2 ; OUTPUT :
A2 ; s0,s1 : CLUS_LOW
A2 ; s2,s3 : CLUS_HI
A2 ;
A2 ; READ -> cluster_HI (OFFSET 0x14)
A2 ;
A2 ; offset 0x14 (20) => READ 18 bytes -> 9(0x09) words
A2 ;
A2 0F04 LOAD sF, 04
A3 83E3 CALL do_dummy_reads_from_slave[E3]
A4 ; (sD) data[7:0] WB MASTER -> s2
A4 ; (sE) data[7:0] WB MASTER -> s3
A4 ; READ 2 BYTES
A4 83E8 CALL read_word_from_slave[E8]
A5 C2D0 LOAD s2, sD
A6 C3E0 LOAD s3, sE
A7 EE0F OUTPUT sE, TMP_OUT_7[0F]
A8 ;
A8 ; READ -> cluster_low(OFFSET 0x1A)
A8 ;
A8 ; offset 0x1A (26) => READ 4 bytes -> 2(0x02) words
A8 ;
A8 0F02 LOAD sF, 02
A9 83E3 CALL do_dummy_reads_from_slave[E3]
AA ; (sD) data[7:0] WB MASTER -> s0
AA ; (sE) data[7:0] WB MASTER -> s1
AA ; READ 2 BYTES
AA 83E8 CALL read_word_from_slave[E8]
AB C0D0 LOAD s0, sD
AC C1E0 LOAD s1, sE
AD ; s0,s1 clus_low s3,s4 - clus_high
AD 8080 RETURN
AE ; -- MBR READ OPERATION - LBA BEGIN DETERMINATION
AE ; '00' -> LBA_7_0,LBA_15_8,LBA_23_16,LD_LBA_27_24
AE cluster_2_lba:
AE ; --
AE ; -- LBA ADDRESS DETERMINATION
AE ; --
AE ; lba_addr = cluster_begin_lba + (cluster_number - 2) * sectors_per_cluster;
AE ;
AE ; INPUT :
AE ; s0 : CLUSTER_NUMBER0, s1 : CLUSTER_NUMBER1, s2: CLUSTER_NUMBER2, s3 : CLUSTER_NUMBER3
AE ; OUTPUT :
AE ; s0 : LBA_ADDR_7_0 TMP1, s1 : LBA_ADDR_15_8, s2 : LBA_ADDR_24_16, s3 : LBA_ADDR_27_24
AE ;
AE ; cluster_number - 2
AE ;
AE E00C OUTPUT s0, TMP_OUT_4[0C]
AF E10D OUTPUT s1, TMP_OUT_5[0D]
B0 E20E OUTPUT s2, TMP_OUT_6[0E]
B1 E30F OUTPUT s3, TMP_OUT_7[0F]
B2 6002 SUB s0, 02
B3 7100 SUBCY s1, 00
B4 7200 SUBCY s2, 00
B5 7300 SUBCY s3, 00
B6 ;
B6 ; (cluster_number - 2) * sectors_per_cluster(s7);
B6 ;
B6 ; to perform the multiplication as sector_per_cluster is 2 multiple must be known
B6 ; who many times must be shifted
B6 ; (use sD as temporal register)
B6 0F08 LOAD sF, 08
B7 CD70 LOAD sD, s7
B8 multiply:
B8 DD0E SR0 sD
B9 ; loop until detection of the 1 (2 multiple) - Add timeout!!!
B9 99BF JUMP C, add_cluster_begin_lba[BF]
BA ; LSB '0'
BA D006 SL0 s0
BB ; CARRY -> LSB , MSB -> CARRY
BB D100 SLA s1
BC D200 SLA s2
BD D300 SLA s3
BE 81B8 JUMP multiply[B8]
BF add_cluster_begin_lba:
BF ; lba_addr (TMP0,TMP1,TMP2,TMP3)= cluster_begin_lba + (cluster_number - 2) * sectors_per_cluster;
BF C084 ADD s0, s8
C0 C195 ADDCY s1, s9
C1 C2A5 ADDCY s2, sA
C2 C3B5 ADDCY s3, sB
C3 8080 RETURN
C4 ; --
C4 ; -- WRITE A WORD INTO THE WB SLAVE INTERFACE (TO THE MASTER)
C4 ; --
C4 ; INPUTS :
C4 ; TMP0 : LSB TO DATA_WB_OUT_7_0_SLAVE
C4 ; TMP1 : MSB TO DATA_WB_OUT_15_8_SLAVE
C4 ;
C4 write_a_word_to_master:
C4 ; TMP0 => DATA_WB_OUT_7_0_SLAVE
C4 ED03 OUTPUT sD, DATA_WB_OUT_7_0_SLAVE[03]
C5 ; 00 => DATA_WB_OUT_15_8_SLAVE
C5 ;LOAD sF,00 -- 8 BIT VERSION
C5 ;OUTPUT sF,DATA_WB_OUT_15_8_SLAVE -- 8 BIT VERSION
C5 EE04 OUTPUT sE, DATA_WB_OUT_15_8_SLAVE[04]
C6 83CB CALL write_a_byte_to_master[CB]
C7 ;
C7 ; CHECK STB INPUT | CONTROL_WB_IN_SLAVE-> TMP (s6)
C7 ;
C7 wait_strobe:
C7 A601 INPUT s6, CONTROL_WB_IN_SLAVE[01]
C8 ;
C8 ;
C8 1601 AND s6, STB_I_SLAVE[01]
C9 91C7 JUMP Z, wait_strobe[C7]
CA ; TMP1 => DATA_WB_OUT_7_0_SLAVE
CA ; OUTPUT sE,DATA_WB_OUT_7_0_SLAVE
CA ; 00 =>DATA_WB_OUT_15_8_SLAVE
CA ;LOAD sF,00 -- 8 BIT VERSION
CA ;OUTPUT sF,DATA_WB_OUT_15_8_SLAVE -- 8 BIT VERSION
CA ;CALL write_a_byte_to_master -- 8 BIT VERSION
CA 8080 RETURN
CB write_a_byte_to_master:
CB ;
CB ; WB SLAVE WRITE ENABLE ACTIVE
CB ;
CB 0F01 LOAD sF, WB_BUS_SLAVE_WRITE_ENABLE[01]
CC EF07 OUTPUT sF, CONTROL_OUT_SLAVE[07]
CD ;
CD ; ACK TO THE MASTER UNTIL STB FINISH
CD ;
CD ack_to_the_master:
CD 0F01 LOAD sF, ACK_O_SLAVE[01]
CE EF05 OUTPUT sF, CONTROL_WB_OUT_SLAVE[05]
CF ;
CF ;
CF 0F00 LOAD sF, 00
D0 EF07 OUTPUT sF, CONTROL_OUT_SLAVE[07]
D1 EF05 OUTPUT sF, CONTROL_WB_OUT_SLAVE[05]
D2 8080 RETURN
D3 ; --
D3 ; -- WRITE A LBA INTO THE WB MASTER INTERFACE (TO THE SLAVE)
D3 ; --
D3 ; INPUTS :
D3 ; TMP0 : LBA_ADDR_7_0, TMP1 : LBA_ADDR_15_8, TMP2 : LBA_ADDR_24_16, TMP3 : LBA_ADDR_27_24
D3 ;
D3 ;
D3 write_lba_to_slave:
D3 ;
D3 ; WB MASTER WRITE ENABLE ACTIVE
D3 ;
D3 0F01 LOAD sF, WB_BUS_MASTER_WRITE_ENABLE[01]
D4 EF06 OUTPUT sF, CONTROL_OUT_MASTER[06]
D5
D5 ;write_lba_15_0_to_slave:
D5 ;
D5 ; TMP0 : LBA_ADDR_7_0 (s0) => DATA_WB_OUT_7_0_MASTER
D5 ; TMP1 : LBA_ADDR_15_8 (s1) => DATA_WB_OUT_15_8_MASTER
D5 ;
D5 E000 OUTPUT s0, DATA_WB_OUT_7_0_MASTER[00]
D6 E101 OUTPUT s1, DATA_WB_OUT_15_8_MASTER[01]
D7 ;
D7 ; --
D7 ; -- WRITE LBA 15-0 TO THE SLAVE
D7 ; --
D7 ;
D7 ; WB_CONTROL_OUT_MASTER
D7 ; W_WE_MASTER = 1
D7 ; STB_O_MASTER = 1
D7 ; A0 = 0
D7 ;
D7 0F03 LOAD sF, WRITE_LBA_15_0[03]
D8 EF02 OUTPUT sF, CONTROL_WB_OUT_MASTER[02]
D9 ;
D9 ; WAIT FOR THE ACK
D9 ;
D9 83EA CALL wait_for_the_ack[EA]
DA ;write_lba_27_16_to_slave:
DA ;
DA ; TMP2 : LBA_ADDR_23_16 (s2) => DATA_WB_OUT_7_0_MASTER
DA ; TMP3 : LBA_ADDR_27_24 (s3) => DATA_WB_OUT_15_8_MASTER
DA ;
DA E200 OUTPUT s2, DATA_WB_OUT_7_0_MASTER[00]
DB E301 OUTPUT s3, DATA_WB_OUT_15_8_MASTER[01]
DC
DC ; --
DC ; -- WRITE LBA 27-16 TO THE SLAVE
DC ; --
DC ; WB_CONTROL_OUT_MASTER
DC ; W_WE_MASTER = 1
DC ; STB_O_MASTER = 1
DC ; A0 = 0
DC ;
DC 0F07 LOAD sF, WRITE_LBA_27_16[07]
DD EF02 OUTPUT sF, CONTROL_WB_OUT_MASTER[02]
DE ;
DE ; WAIT FOR THE ACK
DE ;
DE 83EA CALL wait_for_the_ack[EA]
DF ; --
DF ; -- FINISH WRITE OPERATION ON THE MASTER WB INTERFACE
DF ; --
DF ;
DF ; WB_CONTROL_OUT_MASTER
DF ; W_WE_MASTER = 0
DF ; STB_O_MASTER = 0
DF ; A0 = 0
DF ;
DF 0F00 LOAD sF, 00
E0 EF02 OUTPUT sF, CONTROL_WB_OUT_MASTER[02]
E1 EF06 OUTPUT sF, CONTROL_OUT_MASTER[06]
E2 8080 RETURN
E3 ; --
E3 ; -- PERFORM DUMMY READS FROM THE WB SLAVE
E3 ; --
E3 ; -- IN sF ARE THE NUMBER OF WORDS THAT MUST BE READED
E3 ; --
E3 do_dummy_reads_from_slave:
E3 C6F0 LOAD s6, sF
E4 dummy_reads_from_slave:
E4 83E8 CALL read_word_from_slave[E8]
E5 6601 SUB s6, 01
E6 95E4 JUMP NZ, dummy_reads_from_slave[E4]
E7 8080 RETURN
E8
E8 ; --
E8 ; -- PERFORM A WORD READING FROM THE WB SLAVE
E8 ; --
E8 read_word_from_slave:
E8 ; WB_CONTROL_OUT_MASTER
E8 ; W_WE_MASTER = 0
E8 ; STB_O_MASTER = 1
E8 ; A0 = 0
E8 ; wait state
E8 0F01 LOAD sF, READ_SLAVE[01]
E9 EF02 OUTPUT sF, CONTROL_WB_OUT_MASTER[02]
EA ;
EA ; WAIT FOR THE ACK
EA ;
EA ; CALL wait_for_the_ack
EA ;JUMP Z,data_available_on_wb_master
EA wait_for_the_ack:
EA ;
EA ; CONTROL_WB_IN_MASTER -> TMP (s6)
EA ;
EA AF00 INPUT sF, CONTROL_WB_IN_MASTER[00]
EB ;
EB 1F01 AND sF, ACK_I_MASTER[01]
EC 91EA JUMP Z, wait_for_the_ack[EA]
ED data_available_on_wb_master:
ED ; This part is not necessary in write operations
ED ; DATA_WB_IN_7_0_MASTER -> (sD) data[7:0] WB MASTER
ED ; DATA_WB_IN_15_8_MASTER -> (sE) data[15:8] WB MASTER
ED AD02 INPUT sD, DATA_WB_IN_7_0_MASTER[02]
EE AE03 INPUT sE, DATA_WB_IN_15_8_MASTER[03]
EF ; DISABLE RD/WR OPERATION REQUEST
EF 0F00 LOAD sF, 00
F0 EF02 OUTPUT sF, CONTROL_WB_OUT_MASTER[02]
F1 8080 RETURN
F2 put_error_code:
F2 0F04 LOAD sF, ERROR[04]
F3 EF05 OUTPUT sF, CONTROL_WB_OUT_SLAVE[05]
F4 81F2 JUMP put_error_code[F2]
F5 interrupt:
F5 80F0 RETURNI ENABLE
Go to most recent revision | Compare with Previous | Blame | View Log