Speccy - наш выбор!

Speccy - наш выбор! (http://zx-pk.ru/index.php)
-   Эмуляторы отечественных компьютеров (http://zx-pk.ru/forumdisplay.php?f=61)
-   -   Эмулятор ДВК (http://zx-pk.ru/showthread.php?t=18351)

Alex_K 4th January 2014 22:54

Кстати, по поводу захвата шины и процессора 1801ВМ1. Читал, что при захвате шины он позволяет захватившему устройству читать регистры межпроцессорной связи и таймера. А вот как обстоит с внешними регистрами SEL2 и SEL1? Формирует ли процессор в этом случае сигналы SEL2 и SEL1, если захватившее устройство выставило адрес 177714 или 177716? Ведь обычно регистр 177716 отвечает только на сигнал SEL1 и даже не надо формировать RPLY.

Patron 4th January 2014 23:03

Quote:

Originally Posted by Alex_K (Post 658366)
Кстати, по поводу захвата шины и процессора 1801ВМ1. Читал, что при захвате шины он позволяет захватившему устройству читать регистры межпроцессорной связи и таймера. А вот как обстоит с внешними регистрами SEL2 и SEL1? Формирует ли процессор в этом случае сигналы SEL2 и SEL1, если захватившее устройство выставило адрес 177714 или 177716? Ведь обычно регистр 177716 отвечает только на сигнал SEL1 и даже не надо формировать RPLY.

Надо написать тестовую программу для КМД и дождаться, когда anonymous активирует свою ДВК-1 с КМД.

Alex_K 4th January 2014 23:06

Quote:

Originally Posted by Patron (Post 658367)
Надо написать тестовую программу для КМД и дождаться, когда anonymous активирует свою ДВК-1 с КМД.

Написать программу не проблема, а вот КМД надо с -255-й прошивкой, ибо программу придется переносить в СОЗУ, с "окном" из "окна" работать нельзя. А в КМД с 537РУ8 памяти много.

Patron 5th January 2014 00:57

Quote:

Originally Posted by Alex_K (Post 658368)
с "окном" из "окна" работать нельзя. А в КМД с 537РУ8 памяти много.

Если всю подготовку провести в памяти ДВК, то "внутренняя" часть теста не слишком длинная:
Code:

Test:
        Mov        R0, (R2)                ; Настроить окно на верхние адреса
        Mov        (R1), (R3)        ; Запись из SEL1 в копию регистра данных
Trap4:                                ;  или Trap4
        Mov        R5, SP                ; Восстановить стек.
        Return                        ; Завершение подпрограммы пользователя

Перед переходом в память КМД по команде JMP - надо настроить обработчик прерываний на метку Trap4 и подготовить R0, R1, R2 и R5.

R3 изначально указывает в КМД на то слово, которое будет записано в регистр данных после завершения программы пользователя.

ДВК-шная часть теста ждёт, когда КМД выполнит программу пользователя и выводит на экран содержимое регистра данных КМД.

Alex_K 5th January 2014 01:03

Моя программа вывода надписи из КМД и проверки некоторых регистров:
Code:

        .TITLE        TSKMD1
        .MCALL        .PRINT,.EXIT
START:        .PRINT        #VER
5$:        BIT        #100,@#177564
        BNE        5$
10$:        BIT    #40,@#172140
        BEQ    10$
        MOV    #35,@#172140
20$:    TSTB    @#172140
        BPL    20$
        MOV    #KMDPRG,@#172142
30$:    BIT    #40,@#172140
        BEQ    30$
        BIT        #100,FLG1
        BNE        31$
        .PRINT        #NEXEC
        .EXIT
31$:        BIT        #200,FLG
        BEQ        32$
        .PRINT        #A3PR
32$:        BIT        #1,FLG1
        BNE        40$
        .PRINT        #AD3NPR
        BR        41$
40$:        .PRINT        #AD3PR
        BIT        #2,FLG1
        BEQ        41$
        .PRINT        #AD3N7
41$:        BIT        #400,FLG
        BEQ        33$
        .PRINT        #A7PR
33$:        BIT        #4,FLG1
        BNE        42$
        .PRINT        #AD7NPR
        BR        43$
42$:        .PRINT        #AD7PR
        BIT        #10,FLG1
        BEQ        43$
        .PRINT        #AD7N7
43$:        .EXIT
FLG1:        .WORD        0
VER:        .ASCIZ        /TEST KMD WINDOW ver.1/
NEXEC:        .ASCIZ        <16>/pODPROGRAMMA W kmd NE ZAPU]ENA/<17>
AD3PR:        .ASCIZ        <16>/aDRES 177564(/<17>/WINDOW/<16>/=3) PRISUTSTWUET/<17>
AD3NPR:        .ASCIZ        <16>/aDRES 177564(/<17>/WINDOW/<16>/=3) NE PRISUTSTWUET/<17>
AD7PR:        .ASCIZ        <16>/aDRES 17777564(/<17>/WINDOW/<16>/=377) PRISUTSTWUET/<17>
AD7NPR:        .ASCIZ        <16>/aDRES 17777564(/<17>/WINDOW/<16>/=377) NE PRISUTSTWUET/<17>
AD3N7:        .ASCIZ        <16>/bIT 7(gp) W 177564 NE USTANOWLEN/<17>
AD7N7:        .ASCIZ        <16>/bIT 7(gp) W 17777564 NE USTANOWLEN/<17>
A3PR:        .ASCIZ        <16>/aDRES 160000(/<17>/WINDOW/<16>/=3) PRISUTSTWUET/<17>
A7PR:        .ASCIZ        <16>/aDRES 17760000(/<17>/WINDOW/<16>/=377) PRISUTSTWUET/<17>
        .EVEN
KMDPRG:        MOV        #20000,R0
        MOV        #KMDPR1+40000,R1
        MOV        #<KMDEND-KMDPR1>/2,R2
1$:        MOV        (R1)+,(R0)+
        SOB        R2,1$
        JMP        @#20000
KMDPR1:        MOV        @#177102,SAVRD
        MOV        74(R3),SAV4
        MOV        #<TR4-KMDPR1+20000>,74(R3)
        BIS        #100,FLG
        MOV        #<3*400+3>,@#177102
        TST        @#60000
        BCS        1$
        BIS        #200,FLG
1$:        TST        @#77564
        BCS        10$
        BIS        #1,FLG
        MOV        #2,R2
        MOV        #<HEL3-KMDPR1+20000>,R0
        CALL        PRWND
10$:        MOV        #<377*400+377>,@#177102
        TST        @#60000
        BCS        2$
        BIS        #400,FLG
2$:        TST        @#77564
        BCS        20$
        BIS        #4,FLG
        MOV        #10,R2
        MOV        #<HEL377-KMDPR1+20000>,R0
        CALL        PRWND
20$:        MOV        SAVRD,@#177102
        MOV        SAV4,74(R3)
        MOV        FLG,@#FLG1+40000
        RETURN
PRWND:        MOV        #10000,R1
1$:        TSTB        @#77564
        BMI        2$
        SOB        R1,1$
        BIS        R2,FLG
        RETURN
2$:        MOVB        (R0)+,@#77566
        BNE        PRWND
        RETURN
TR4:        BIS        #1,@SP
        RTI
SAV4:        .BLKW        1
SAVRD:        .BLKW        1
FLG:        .WORD        0
HEL3:        .ASCIZ        /Hello from KMD, WINDOW=3/<15><12>
HEL377:        .ASCIZ        /Hello from KMD, WINDOW=377/<15><12>
        .EVEN
KMDEND:
        .END        START


Titus 5th January 2014 03:11

Quote:

Originally Posted by Patron (Post 658358)
Активное устройство должно было "захватить" шину перед выставлением адреса. Пока активен сигнал захвата шины - все остальные активные устройства должны ждать.

При многопоточной эмуляции роль захвата шины играет межпоточная блокировка. При обращении к заблокированному ресурсу поток впадает в спячку до снятия блокировки тем потоком, который раньше успел захватить этот ресурс.

Не слишком ли это медленно, если устройства захватывают шину по 1000 раз в секунду?

Alex_K 5th January 2014 13:51

Quote:

Originally Posted by Titus (Post 658438)
Не слишком ли это медленно, если устройства захватывают шину по 1000 раз в секунду?

Да не очень-то. Ведь сам центральный процессор ее использует не все время, только во время операций чтения/записи. Так что устройство ПДП и попадает в эти свободные окна. Подтормозить можно центральный вычислитель, если устройство ПДП все время будет обращаться к несуществующему адресу (TRAP_4).

Titus 5th January 2014 14:16

Quote:

Originally Posted by Alex_K (Post 658487)
Да не очень-то. Ведь сам центральный процессор ее использует не все время, только во время операций чтения/записи. Так что устройство ПДП и попадает в эти свободные окна. Подтормозить можно центральный вычислитель, если устройство ПДП все время будет обращаться к несуществующему адресу (TRAP_4).

Я имею ввиду, не слишком ли медленное построение эмулятора, когда захват шины - это межпоточная блокировка.

Patron 5th January 2014 14:32

Quote:

Originally Posted by Titus (Post 658490)
Я имею ввиду, не слишком ли медленное построение эмулятора, когда захват шины - это межпоточная блокировка.

Поэтому блокировка ставится не на шину, а на устройство. Память допускает полностью параллельную работу, а изменить состояние любого конкретного устройства может только тот поток, который первым туда "залез".

Но строго говоря, даже если ставить блокировку на любое обращение к "общей" шине - многопоточная эмуляция будет медленнее однопоточной только на одноядерном процессоре.

Titus 5th January 2014 14:56

Quote:

Originally Posted by Patron (Post 658494)
Но строго говоря, даже если ставить блокировку на любое обращение к "общей" шине - многопоточная эмуляция будет медленнее однопоточной только на одноядерном процессоре.

Чего-то мне кажется, что это вообще достаточно медленная концепция.


All times are GMT +4. The time now is 02:58.

Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.