User Tag List

Показано с 1 по 10 из 399

Тема: Контроллер псевдо КМД+дисковод для УКНЦ (на SD карте)

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #10

    Регистрация
    10.04.2019
    Адрес
    г. Фокино, Брянская обл.
    Сообщений
    401
    Спасибо Благодарностей отдано 
    52
    Спасибо Благодарностей получено 
    104
    Поблагодарили
    65 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Titus Посмотреть сообщение
    Вот работа с FDD из моего эмулятора УКНЦ
    Смотрю на эту роскошь и радуюсь, не то что у меня.
    Вот генерация трека:

    Скрытый текст


    .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.

    - - - Добавлено - - -

    Цитата Сообщение от Titus Посмотреть сообщение
    Терминатор псевдо-пробела
    А что вот это значит?
    Последний раз редактировалось ZPilot; 16.04.2020 в 00:37.

    Этот пользователь поблагодарил ZPilot за это полезное сообщение:

    Alex_K(17.04.2020)

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 713
    Последнее: 13.05.2025, 11:42
  2. Ответов: 327
    Последнее: 03.12.2019, 22:49
  3. Куплю КМД для УКНЦ
    от Feral в разделе Барахолка (архив)
    Ответов: 32
    Последнее: 07.06.2012, 13:31
  4. Продам МС5310 блок дисководов к УКНЦ+КМД УКНЦ
    от Mad Killer/PG в разделе Барахолка (архив)
    Ответов: 7
    Последнее: 19.03.2012, 11:27
  5. Контроллер КМД-УКНЦ, АУКЦИОН
    от tntpro в разделе Барахолка (архив)
    Ответов: 9
    Последнее: 23.06.2011, 16:32

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •