Смотрю на эту роскошь и радуюсь, не то что у меня.
Вот генерация трека:
Скрытый текст
.macro NEXTPOS
add r9, r6, r4, lsl #9 //sec*len_sect+(pos)//sec<<9+pos
add r9,#1
ldrh r3,=FLOPPY_RAWTRACKSIZE
cmp r9,r3
it hs
andhs r9,#0
strh r9,[r1]
.endm
//----------------------------------------
//uint8_t fast_datatrack(void *data,void *pos, void *isSync);
//----------------------------------------
.section .text.fast_datatrack
.global fast_datatrack
.type fast_datatrack, %function
fast_datatrack:
push {r3-r9,lr}
ldrh r8,=VAR_ADM
ldrh r5,=SEC_LEN
ldrh r6,[r1] //pos
udiv r4,r6,r5 //number sector
mls r6,r4,r5,r6 //position in sector
//Sync?
ldrb r7,[r2]
tst r7,#1
beq fast_datatrack_loop
bic r7,#1
strb r7,[r2]
//pos=<marker0
cmp r6,MARKER0_POS
itt ls
ldrbls r6,=MARKER0_POS
bls fast_datatrack_loop
//marker0<pos=<marker1
cmp r6,MARKER1_POS
it ls
ldrbls r6,=MARKER1_POS
bls fast_datatrack_loop
//pos>marker1 to next sector marker 1
add r4,#1
cmp r4,#10
it hs
andhs r4,#0
ldrb r6,=MARKER0_POS
fast_datatrack_loop:
//GAP0
cmp r6,#SYNC0_POS
itttt lo
ldrblo r0,=0x4E
//set index bit
ldrhlo r3,[r8,#RSN_RDM]
orrlo r3,#0x8000
strhlo r3,[r8,#RSN_RDM]
blo fast_datatrack_end
////reset index bit
ldrh r3,[r8,#RSN_RDM]
bic r3,#0x8000
strh r3,[r8,#RSN_RDM]
//SYNC0
cmp r6,#MARKER0_POS
it lo
ldrblo r0,=0x00
blo fast_datatrack_end
//MARKER0
cmp r6,#FE_POS
itttt lo
ldrblo r0,=0xA1
//reset CRC bit
ldrhlo r3,[r8,#RSN_RDM]
biclo r3,#0x4000
strhlo r3,[r8,#RSN_RDM]
blo fast_datatrack_end
//FE
cmp r6,#CYL_POS
it lo
ldrblo r0,=0xFE
blo fast_datatrack_end
//CYL
cmp r6,#SIDE_POS
it lo
ldrblo r0,[r0,SZ_TRACK] //track no
blo fast_datatrack_end
//SIDE
cmp r6,#SEC_POS
it lo
ldrblo r0,[r0] //Side no #0
blo fast_datatrack_end
//Sector
cmp r6,#SECSZ_POS
it lo
//andlo r5,#0
addlo r0,r4,#1 //Sector match in r4
blo fast_datatrack_end
//Sector size
cmp r6,#CRC0_POS
it lo
ldrblo r0,=2
//CRC header
cmp r6,#GAP1_POS
itttt lo
ldrblo r0,=12
//andlo r0,#0
//set CRC bit
ldrhlo r3,[r8,#RSN_RDM]
orrlo r3,#0x4000
strhlo r3,[r8,#RSN_RDM]
blo fast_datatrack_end
//GAP1
cmp r6,#SYNC1_POS
it lo
ldrblo r0,=0x4E
blo fast_datatrack_end
//SYNC1
cmp r6,#MARKER1_POS
it lo
ldrblo r0,=0x00
blo fast_datatrack_end
//MARKER1
cmp r6,#FB_POS
itttt lo
andlo r5,#0 //It's sey: load data
addlo r5,#0x02
strblo r5,[r2]
ldrblo r0,=0xA1
//reset CRC bit
ittt lo
ldrhlo r3,[r8,#RSN_RDM]
biclo r3,#0x4000
strhlo r3,[r8,#RSN_RDM]
blo fast_datatrack_end
//FB
cmp r6,#DATA_POS
it lo
ldrblo r0,=0xFB
blo fast_datatrack_end
//set CRC bit
ldrh r3,[r8,#RSN_RDM]
orr r3,#0x4000
strh r3,[r8,#RSN_RDM]
//DATA
cmp r6,#CRC1_POS
itttt lo
addlo r0,#SZ_TBUFF //set addr currenttrack
sublo r9,r6,#DATA_POS //pos_in_data=pos-data_pos
addlo r7, r9, r4, lsl #9 //sec*len_sect+(pos_in_data)
ldrblo r0,[r0,r7]
blo fast_datatrack_end
//CRC data
ldrh r7,=GAP2_POS
cmp r6,r7
it lo
ldrhlo r0,=18
//andlo r0,#0
/*//set CRC bit
ldrhlo r3,[r8,#RSN_RDM]
orrlo r3,#0x4000
strhlo r3,[r8,#RSN_RDM]*/
blo fast_datatrack_end
ldrb r0,=0x4E
fast_datatrack_end:
//set data ok bit
ldrh r3,[r8,#RSN_RDM]
orr r3,#0x80
strh r3,[r8,#RSN_RDM]
//NEXTPOS
ldr r5,=SEC_LEN
//add r9, r6, r4, lsl #9 //sec*len_sect+(pos)//sec<<9+pos
mla r9,r4,r5,r6 //sec*len_sec+pos_sec
add r9,#1
ldrh r3,=FLOPPY_RAWTRACKSIZE
cmp r9,r3
it hs
andhs r9,#0
strh r9,[r1]
pop {r3-r9,lr}
bx lr
[свернуть]
А вот это работа с регистрами статуса/команды и данных
Скрытый текст
//---------------------------------------
.macro ENDIRQSTATUS
ldrb r7,[r6,SET_OPERM]
orr r7,r8
strb r7,[r6,SET_OPERM]
ldr r7,=EXTI_ADM
EXTICLEARFLAG r7,r8,EXTI_LINE_6
pop {r5-r8,lr}
bx lr
.endm
//----------------------------------------------
// EXTI9_5_IRQHandler //RSN o177130
//----------------------------------------------
.section .text.EXTI9_5_IRQHandler
.global EXTI9_5_IRQHandler
.type EXTI9_5_IRQHandler, %function
EXTI9_5_IRQHandler:
push {r5-r8,lr}
ldr r5,=PORT_ADM
ldr r6,=VAR_ADM
ldrh r8,[r6,#RSN_RDM]
irq5_start:
READPORT_R5 r7,PRT_B @read from port B
tst r7,#(SYNC|DIN)
beq irq5_rsn_din
tst r7,#(SYNC|DOUT)
beq irq5_rsn_dout
tst r7,#(SYNC)
beq irq5_start
//--------------------------------------------
irq5_rsn_din:
RESETGPIO_R5 r7,PRT_B,#(VA87DIR)
SETPORT_R5 r7,PRT_C,MODER,moder_c_o
SETODRPORT_R5 r8,PRT_C
RESETGPIO_R5 r7,PRT_B,#(RPLY)
irq5_din_rsn_h_wait:
READPORT_R5 r7,PRT_B
tst r7,#(DIN)
beq irq5_din_rsn_h_wait
ldrb r8,=0
SETPORT_R5 r7,PRT_C,MODER,moder_c_i
SETGPIO_R5 r7,PRT_B,#(RPLY|VA87DIR)
ENDIRQSTATUS
//--------------------------------------------
irq5_rsn_dout:
RESETGPIO_R5 r7,PRT_B,#(RPLY)
SETPORT_R5 r7,PRT_C,MODER,moder_c_i
irq5_rsn_dout_h_wait:
READPORT_R5 r7,PRT_C
READPORT_R5 r8,PRT_B
tst r8,#(DOUT)
beq irq5_rsn_dout_h_wait
strh r7,[r6,#RSN_WRM]
tst r7,#0x100 //GOR?
ite eq
ldrbeq r8,=1 //cmd
ldrbne r8,=2 //synchro search
beq EXTI9_5_IRQHandler_end
ldrh r7,=0
strh r7,[r6,#RSN_RDM] //RSN_RD=0
strh r7,[r6,#RDN_RDM] //RDN_RD=0
EXTI9_5_IRQHandler_end:
SETGPIO_R5 r7,PRT_B,#(RPLY)
ENDIRQSTATUS
//--------------------------------------------
//--------------------------------------------
//--------------------------------------------
.macro ENDIRQDATA
ldrh r7,[r6,#RSN_RDM]
bic r7,#0x80 // 7 bit (TR)
strh r7,[r6]
//reset exti port
ldr r7,=EXTI_ADM
EXTICLEARFLAG r7,r8,EXTI_LINE_11
pop {r5-r8,lr}
bx lr
.endm
//----------------------------------------------
// EXTI15_10_IRQHandler // RDN o177132
//----------------------------------------------
.section .text.EXTI15_10_IRQHandler
.global EXTI15_10_IRQHandler
.type EXTI15_10_IRQHandler, %function
EXTI15_10_IRQHandler:
push {r5-r8,lr}
ldr r5,=PORT_ADM
ldr r6,=VAR_ADM
ldrh r8,[r6,#RDN_RDM] @load r8 DATA
irq10_start:
READPORT_R5 r7,PRT_B @read from port B
tst r7,#(SYNC|DIN)
beq irq10_rdn_din
tst r7,#(SYNC|DOUT)
beq irq10_rdn_dout
tst r7,#(SYNC)
beq irq10_start
irq10_rdn_din:
RESETGPIO_R5 r7,PRT_B,#(VA87DIR)
SETPORT_R5 r7,PRT_C,MODER,moder_c_o
SETODRPORT_R5 r8, PRT_C
RESETGPIO_R5 r7,PRT_B,#(RPLY)
irq10_din_rdn_h_wait:
READPORT_R5 r7,PRT_B
tst r7,#(DIN)
beq irq10_din_rdn_h_wait
SETPORT_R5 r7,PRT_C,MODER,moder_c_i
SETGPIO_R5 r7,PRT_B,#(RPLY|VA87DIR)
ENDIRQDATA
irq10_rdn_dout:
RESETGPIO_R5 r7,PRT_B,#(RPLY)
SETPORT_R5 r7,PRT_C,MODER,moder_c_i
irq10_rdn_dout_h_wait:
READPORT_R5 r7,PRT_C
READPORT_R5 r8,PRT_B
tst r8,#(DOUT)
beq irq10_rdn_dout_h_wait
strh r7,[r6,#RDN_WRM]
SETGPIO_R5 r7,PRT_B,#(RPLY)
ENDIRQDATA
[свернуть]
По сути - это весь мой эмулятор КГМД и флопов. Вернее даже не так, последний листинг, тот где описана работа с регистрами - это основа всего эмулятора, дальнейшее, можно делать как угодно. И этот кусок кода просто огромный гемморой, тк он должен выстрельнуть за время положенное на RPLY.
- - - Добавлено - - -
А что вот это значит?





Ответить с цитированием