Важная информация

User Tag List

Страница 9 из 98 ПерваяПервая ... 5678910111213 ... ПоследняяПоследняя
Показано с 81 по 90 из 980

Тема: Emu80 v.4

  1. #81
    Banned
    Регистрация
    05.10.2016
    Адрес
    г. Санкт-Петербург
    Сообщений
    1,080
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    5
    Поблагодарили
    5 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от b2m
    Выполняя в одном цикле эмуляции ровно столько тактов процессора, сколько выполнилось бы реальным процессором за время, которое прошло с предыдущего цикла. Сколько раз в секунду запускать цикл эмуляции, в таком случае, неважно
    Извиняюсь, но я такой тупой, что ничего не понял... Какой цикл эмуляции? Что за цикл?

    Эмуляция делается так. Эмулятор считывает байт - код команды. Затем табличным методом уходит на подпрограмму её эмуляции. В этой п/п-мме (их 256, а для префиксных Z80 делается 2-рой переход) соответственно меняются регистры и эмулируемое ОЗУ ЭВМ. В конце этой маленькой процедуры эмуляции стоит макрокоманда NEXTK?? после исполнения которой выполняется команда JMP перехода по адресу из ячейки где лежит адрес главной петли прогона (т.к переходы разные при STEP,RUN и TURBO). И всё повторяется уже для следующей команды. Какие тут циклы и какие такты Z80 команд? Понятно, что можно заставить каждую процедуру эмуляции конкретной команды увеличивать какой-то счётчик на число тактов реальной команды. Что это даст, кроме знания сколько тактов исполнилось.

    Т.к время эмуляции команды намного меньше, чем время паузы добавляемое после каждой команды, то после каждой команды я загружаю в BL число её тактов. А на входе главной петли стоит тормозилка, которая прогоняет столько циклов декремента до 0 константы тормозилки, сколько тактов было в предыдущей команде. Константа тормозилки от 1 до 65536. В версиях выпущенных до 1998 было ограничение тормозилки до 4000. После ограничение снял, т.к для ПЕНТИУМ уже не хватало диапазона торможения.

    Привожу исходник петли эмуляции и примеры эмуляции 3-х команд в эмуляторе ОРИОНА. Как видите регистровые команды эмулируются 4-мя командами 80x86. Команды КР580 для ОЗУ - ~10-ю командами, а сложные команды Z80 - до 30 команд 80x86-го. Главная петля такая простая только при тормозилке 0, когда выжимается 150 МГЦ процессора Z80. Реальная петля сложнее, там считаются команды, чтобы эмулировать INT 50 ГЦ, оценивается флаг DI и делается пауза на время пропорциональное числу тактов предудущей команды.

    Как мне использовать Вашу идеологию торможения или идеологию Pyk?

    Код:
    ; ──────────────────────────────────────────────
    
    ; петля прогона при TORMOZ =0
    
    TGO_BAN: GET_ES SI			; сюда вылет после команд меняющ.банку
    TGO_NOB:				; сюда вылет после команд не мен.банку
    	MOV	BL,ES:[SI]
    	MOV	BP,SI
    	INC	SI
    	XOR	BH,BH
    	SHL	BX,1			; умножить на 2
    	JMP	[BX+word ptr VECT_580]
    
    ; ──────────────────────────────────────────────
    
    @47:	MOV	BX,DI		; LD B,A
    	MOV	BH,AL
    	MOV	DI,BX
    	NEXTK4P			; Пауза для 4-тактовых команд
    
    ; ──────────────────────────────────────────────
    
    @70:	MOV	BX,DI             ; LD (HL),B
    	MOV	BYTE_TO,BH
    	MOV	BX,DX
    	if_wr_hi		  ; BP= адрес начала кода команды
    @70_2:  MOV	BX,DI
    	XCHG    SI,DX
    	GET_ES  SI
    	MOV	ES:[SI],BH
    	XCHG    SI,DX
    	CMP     DX,scr_low
    	JC      @70_1
    	CMP     DX,scr_ovr
    	JNC     @70_1
    	MOV	BX,DX
    	JMP	SCREEN		; запись 1-го байта в экран (BYTE_TO, в BX=адрес)
    
    @70_1:  NXTK_B7			; Пауза для 7-тактовых команд
    
    ; ──────────────────────────────────────────────
    
    @FD_36: MOV	BP,AX                   ; LD (IY+disp),nn
    	MOV	BX,ES:[SI]              ; диспласемент 'disp'
    	INC	SI
    	INC	SI
    	MOV	AL,BH                   ; nn
    	MOV	ES,AX
    	XOR     BH,BH
    	OR	BL,BL
    	JS      @FD36_2
    	ADD     BX,_REG_IY
    @FD36_0: MOV	  AX,ES
    	GET_ES  BX
    	MOV	ES:[BX],AL
    	MOV	BYTE_TO,AL
    	MOV	AX,BP
    	if_noscr @DD70_3
    	JMP	SCREEN		; запись одного байта в экран байт в BYTE_TO, адрес в BX
    
    @FD36_2: NEG	BL
    	MOV	AX,_REG_IY
    	SUB     AX,BX
    	MOV	BX,AX
    	JMP	@FD36_0
    
    @DD70_0: GET_ES BX
    	MOV	BP,AX
    	MOV	AX,DI
    	MOV	ES:[BX],AH
    	MOV	BYTE_TO,AH
    	MOV	AX,BP
    	if_noscr @DD70_3
    	JMP	SCREEN
    
    @DD70_2: NEG	BL
    	MOV	BP,_REG_IX
    	SUB     BP,BX
    	MOV	BX,BP
    	JMP	@DD70_0
    
    @DD70_3: NXTK_B
    
    ; ──────────────────────────────────────────────
    
    NXTK_B4	MACRO
    	MOV	BL,4			; загрузка BL числом для балансировки
    	JMP     [word ptr ADR_LOB]
    	ENDM
    
    ADR_LOB label	WORD	; адрес перехода для команд меняющих тек.банку
    	DW	0
    ADR_LON label	WORD	; адрес перехода для команд не меняющих банку
    	DW	0
    
    ; ──────────────────────────────────────────────
    
    if_noscr MACRO	ADDR
    	 CMP     BX,scr_low
    	 JC      ADDR
    	 CMP     BX,scr_ovr
    	 JNC     ADDR
    	 ENDM
    
    ; ──────────────────────────────────────────────
    
    if_wr_hi MACRO
    	 CMP     BH,0F4H
    	 jmpnc   WRIT_HI
    	 ENDM
    
    ; ──────────────────────────────────────────────
    
    ; на входе BP должен содержать адрес начала кода команды
    
    WRIT_HI:			; Запись одного байта по адресу выше F400
    	TEST   _PFB,00100000B
    	JNZ     WR_MEM		; если FULL RAM
    WR_HI_2:
    	MOV	ES,bank0      	; на входе: BX- адрес, BYTE_TO - байт
    	AND     BL,3
    	CMP     BX,0F800H
    	jmpnc   WR_REG		; BP= адрес начала кода команды
    	CMP     BX,0F500H
    	JNC     H_F500		; если выше F4FF
    	CMP     BX,0F403H
    	JNZ     F400_1
    	MOV	BL,BYTE_TO	; write F403
    	MOV	L_F403,BL
    	JMP	short NO_REGS
    
    ; ──────────────────────────────────────────────
    
    comment \
    
      РАСПРЕДЕЛЕНИЕ РЕГИСТРОВ
    
    	DS - seg _TEXT				AL - A
    	ES - seg ORION_MEM                 	SI - PC
    	SS - seg STACK                  	CX - BC
    	SI - PC                         	DX - DE
        _REG_S - SP 	; ячейка ОЗУ    	BX - HL
    	AL - A                          	BP - рабочий
    	AH - флаги КР580
    	DI - BC
    	CX - DE
    	DX - HL
    
    	BP - рабочий (при прогоне копия SI, текущий адрес PC)
    	BX - рабочий
    	SP - стек 8086
    \
    
    ; ──────────────────────────────────────────────
    
    VECT_580 LABEL   BYTE
    
    	DW      @00,@01,@02,@03,@04,@05,@06,@07
    	DW      @08,@09,@0A,@0B,@0C,@0D,@0E,@0F
    	DW      @10,@11,@12,@13,@14,@15,@16,@17
    	DW      @18,@19,@1A,@1B,@1C,@1D,@1E,@1F
    	DW      @20,@21,@22,@23,@24,@25,@26,@27
    	DW      @28,@29,@2A,@2B,@2C,@2D,@2E,@2F
    	DW      @30,@31,@32,@33,@34,@35,@36,@37
    	DW      @38,@39,@3A,@3B,@3C,@3D,@3E,@3F
    	DW      @40,@41,@42,@43,@44,@45,@46,@47
    	DW      @48,@49,@4A,@4B,@4C,@4D,@4E,@4F
    	DW      @50,@51,@52,@53,@54,@55,@56,@57
    	DW      @58,@59,@5A,@5B,@5C,@5D,@5E,@5F
    	DW      @60,@61,@62,@63,@64,@65,@66,@67
    	DW      @68,@69,@6A,@6B,@6C,@6D,@6E,@6F
    	DW      @70,@71,@72,@73,@74,@75,@76,@77
    	DW      @78,@79,@7A,@7B,@7C,@7D,@7E,@7F
    	DW      @80,@81,@82,@83,@84,@85,@86,@87
    	DW      @88,@89,@8A,@8B,@8C,@8D,@8E,@8F
    	DW      @90,@91,@92,@93,@94,@95,@96,@97
    	DW      @98,@99,@9A,@9B,@9C,@9D,@9E,@9F
    	DW      @A0,@A1,@A2,@A3,@A4,@A5,@A6,@A7
    	DW      @A8,@A9,@AA,@AB,@AC,@AD,@AE,@AF
    	DW      @B0,@B1,@B2,@B3,@B4,@B5,@B6,@B7
    	DW      @B8,@B9,@BA,@BB,@BC,@BD,@BE,@BF
    	DW      @C0,@C1,@C2,@C3,@C4,@C5,@C6,@C7
    	DW      @C8,@C9,@CA,@CB,@CC,@CD,@CE,@CF
    	DW      @D0,@D1,@D2,@D3,@D4,@D5,@D6,@D7
    	DW      @D8,@D9,@DA,@DB,@DC,@DD,@DE,@DF
    	DW      @E0,@E1,@E2,@E3,@E4,@E5,@E6,@E7
    	DW      @E8,@E9,@EA,@EB,@EC,@ED,@EE,@EF
    	DW      @F0,@F1,@F2,@F3,@F4,@F5,@F6,@F7
    	DW      @F8,@F9,@FA,@FB,@FC,@FD,@FE,@FF
    
    VECT_CB LABEL   BYTE
    
    	DW      @CB_00,@CB_01,@CB_02,@CB_03,@CB_04,@CB_05,@CB_06,@CB_07
    	DW      @CB_08,@CB_09,@CB_0A,@CB_0B,@CB_0C,@CB_0D,@CB_0E,@CB_0F
    	DW      @CB_10,@CB_11,@CB_12,@CB_13,@CB_14,@CB_15,@CB_16,@CB_17
    	DW      @CB_18,@CB_19,@CB_1A,@CB_1B,@CB_1C,@CB_1D,@CB_1E,@CB_1F
    	DW      @CB_20,@CB_21,@CB_22,@CB_23,@CB_24,@CB_25,@CB_26,@CB_27
    	DW      @CB_28,@CB_29,@CB_2A,@CB_2B,@CB_2C,@CB_2D,@CB_2E,@CB_2F
    	DW      @CB_30,@CB_31,@CB_32,@CB_33,@CB_34,@CB_35,@CB_36,@CB_37
    	DW      @CB_38,@CB_39,@CB_3A,@CB_3B,@CB_3C,@CB_3D,@CB_3E,@CB_3F
    	DW      @CB_40,@CB_41,@CB_42,@CB_43,@CB_44,@CB_45,@CB_46,@CB_47
    	DW      @CB_48,@CB_49,@CB_4A,@CB_4B,@CB_4C,@CB_4D,@CB_4E,@CB_4F
    	DW      @CB_50,@CB_51,@CB_52,@CB_53,@CB_54,@CB_55,@CB_56,@CB_57
    	DW      @CB_58,@CB_59,@CB_5A,@CB_5B,@CB_5C,@CB_5D,@CB_5E,@CB_5F
    	DW      @CB_60,@CB_61,@CB_62,@CB_63,@CB_64,@CB_65,@CB_66,@CB_67
    	DW      @CB_68,@CB_69,@CB_6A,@CB_6B,@CB_6C,@CB_6D,@CB_6E,@CB_6F
    	DW      @CB_70,@CB_71,@CB_72,@CB_73,@CB_74,@CB_75,@CB_76,@CB_77
    	DW      @CB_78,@CB_79,@CB_7A,@CB_7B,@CB_7C,@CB_7D,@CB_7E,@CB_7F
    	DW      @CB_80,@CB_81,@CB_82,@CB_83,@CB_84,@CB_85,@CB_86,@CB_87
    	DW      @CB_88,@CB_89,@CB_8A,@CB_8B,@CB_8C,@CB_8D,@CB_8E,@CB_8F
    	DW      @CB_90,@CB_91,@CB_92,@CB_93,@CB_94,@CB_95,@CB_96,@CB_97
    	DW      @CB_98,@CB_99,@CB_9A,@CB_9B,@CB_9C,@CB_9D,@CB_9E,@CB_9F
    	DW      @CB_A0,@CB_A1,@CB_A2,@CB_A3,@CB_A4,@CB_A5,@CB_A6,@CB_A7
    	DW      @CB_A8,@CB_A9,@CB_AA,@CB_AB,@CB_AC,@CB_AD,@CB_AE,@CB_AF
    	DW      @CB_B0,@CB_B1,@CB_B2,@CB_B3,@CB_B4,@CB_B5,@CB_B6,@CB_B7
    	DW      @CB_B8,@CB_B9,@CB_BA,@CB_BB,@CB_BC,@CB_BD,@CB_BE,@CB_BF
    	DW      @CB_C0,@CB_C1,@CB_C2,@CB_C3,@CB_C4,@CB_C5,@CB_C6,@CB_C7
    	DW      @CB_C8,@CB_C9,@CB_CA,@CB_CB,@CB_CC,@CB_CD,@CB_CE,@CB_CF
    	DW      @CB_D0,@CB_D1,@CB_D2,@CB_D3,@CB_D4,@CB_D5,@CB_D6,@CB_D7
    	DW      @CB_D8,@CB_D9,@CB_DA,@CB_DB,@CB_DC,@CB_DD,@CB_DE,@CB_DF
    	DW      @CB_E0,@CB_E1,@CB_E2,@CB_E3,@CB_E4,@CB_E5,@CB_E6,@CB_E7
    	DW      @CB_E8,@CB_E9,@CB_EA,@CB_EB,@CB_EC,@CB_ED,@CB_EE,@CB_EF
    	DW      @CB_F0,@CB_F1,@CB_F2,@CB_F3,@CB_F4,@CB_F5,@CB_F6,@CB_F7
    	DW      @CB_F8,@CB_F9,@CB_FA,@CB_FB,@CB_FC,@CB_FD,@CB_FE,@CB_FF
    
    if	Z80
    
    VECT_DD LABEL   BYTE
    
    	DW      @DD_00,@DD_01,@DD_02,@DD_03,@DD_04,@DD_05,@DD_06,@DD_07
    	DW      @DD_08,@DD_09,@DD_0A,@DD_0B,@DD_0C,@DD_0D,@DD_0E,@DD_0F
    	DW      @DD_10,@DD_11,@DD_12,@DD_13,@DD_14,@DD_15,@DD_16,@DD_17
    	DW      @DD_18,@DD_19,@DD_1A,@DD_1B,@DD_1C,@DD_1D,@DD_1E,@DD_1F
    	DW      @DD_20,@DD_21,@DD_22,@DD_23,@DD_24,@DD_25,@DD_26,@DD_27
    	DW      @DD_28,@DD_29,@DD_2A,@DD_2B,@DD_2C,@DD_2D,@DD_2E,@DD_2F
    	DW      @DD_30,@DD_31,@DD_32,@DD_33,@DD_34,@DD_35,@DD_36,@DD_37
    	DW      @DD_38,@DD_39,@DD_3A,@DD_3B,@DD_3C,@DD_3D,@DD_3E,@DD_3F
    	DW      @DD_40,@DD_41,@DD_42,@DD_43,@DD_44,@DD_45,@DD_46,@DD_47
    	DW      @DD_48,@DD_49,@DD_4A,@DD_4B,@DD_4C,@DD_4D,@DD_4E,@DD_4F
    	DW      @DD_50,@DD_51,@DD_52,@DD_53,@DD_54,@DD_55,@DD_56,@DD_57
    	DW      @DD_58,@DD_59,@DD_5A,@DD_5B,@DD_5C,@DD_5D,@DD_5E,@DD_5F
    	DW      @DD_60,@DD_61,@DD_62,@DD_63,@DD_64,@DD_65,@DD_66,@DD_67
    	DW      @DD_68,@DD_69,@DD_6A,@DD_6B,@DD_6C,@DD_6D,@DD_6E,@DD_6F
    	DW      @DD_70,@DD_71,@DD_72,@DD_73,@DD_74,@DD_75,@DD_76,@DD_77
    	DW      @DD_78,@DD_79,@DD_7A,@DD_7B,@DD_7C,@DD_7D,@DD_7E,@DD_7F
    	DW      @DD_80,@DD_81,@DD_82,@DD_83,@DD_84,@DD_85,@DD_86,@DD_87
    	DW      @DD_88,@DD_89,@DD_8A,@DD_8B,@DD_8C,@DD_8D,@DD_8E,@DD_8F
    	DW      @DD_90,@DD_91,@DD_92,@DD_93,@DD_94,@DD_95,@DD_96,@DD_97
    	DW      @DD_98,@DD_99,@DD_9A,@DD_9B,@DD_9C,@DD_9D,@DD_9E,@DD_9F
    	DW      @DD_A0,@DD_A1,@DD_A2,@DD_A3,@DD_A4,@DD_A5,@DD_A6,@DD_A7
    	DW      @DD_A8,@DD_A9,@DD_AA,@DD_AB,@DD_AC,@DD_AD,@DD_AE,@DD_AF
    	DW      @DD_B0,@DD_B1,@DD_B2,@DD_B3,@DD_B4,@DD_B5,@DD_B6,@DD_B7
    	DW      @DD_B8,@DD_B9,@DD_BA,@DD_BB,@DD_BC,@DD_BD,@DD_BE,@DD_BF
    	DW      @DD_C0,@DD_C1,@DD_C2,@DD_C3,@DD_C4,@DD_C5,@DD_C6,@DD_C7
    	DW      @DD_C8,@DD_C9,@DD_CA,@DD_CB,@DD_CC,@DD_CD,@DD_CE,@DD_CF
    	DW      @DD_D0,@DD_D1,@DD_D2,@DD_D3,@DD_D4,@DD_D5,@DD_D6,@DD_D7
    	DW      @DD_D8,@DD_D9,@DD_DA,@DD_DB,@DD_DC,@DD_DD,@DD_DE,@DD_DF
    	DW      @DD_E0,@DD_E1,@DD_E2,@DD_E3,@DD_E4,@DD_E5,@DD_E6,@DD_E7
    	DW      @DD_E8,@DD_E9,@DD_EA,@DD_EB,@DD_EC,@DD_ED,@DD_EE,@DD_EF
    	DW      @DD_F0,@DD_F1,@DD_F2,@DD_F3,@DD_F4,@DD_F5,@DD_F6,@DD_F7
    	DW      @DD_F8,@DD_F9,@DD_FA,@DD_FB,@DD_FC,@DD_FD,@DD_FE,@DD_FF
    
    VECT_FD LABEL   BYTE
    
    	DW      @FD_00,@FD_01,@FD_02,@FD_03,@FD_04,@FD_05,@FD_06,@FD_07
    	DW      @FD_08,@FD_09,@FD_0A,@FD_0B,@FD_0C,@FD_0D,@FD_0E,@FD_0F
    	DW      @FD_10,@FD_11,@FD_12,@FD_13,@FD_14,@FD_15,@FD_16,@FD_17
    	DW      @FD_18,@FD_19,@FD_1A,@FD_1B,@FD_1C,@FD_1D,@FD_1E,@FD_1F
    	DW      @FD_20,@FD_21,@FD_22,@FD_23,@FD_24,@FD_25,@FD_26,@FD_27
    	DW      @FD_28,@FD_29,@FD_2A,@FD_2B,@FD_2C,@FD_2D,@FD_2E,@FD_2F
    	DW      @FD_30,@FD_31,@FD_32,@FD_33,@FD_34,@FD_35,@FD_36,@FD_37
    	DW      @FD_38,@FD_39,@FD_3A,@FD_3B,@FD_3C,@FD_3D,@FD_3E,@FD_3F
    	DW      @FD_40,@FD_41,@FD_42,@FD_43,@FD_44,@FD_45,@FD_46,@FD_47
    	DW      @FD_48,@FD_49,@FD_4A,@FD_4B,@FD_4C,@FD_4D,@FD_4E,@FD_4F
    	DW      @FD_50,@FD_51,@FD_52,@FD_53,@FD_54,@FD_55,@FD_56,@FD_57
    	DW      @FD_58,@FD_59,@FD_5A,@FD_5B,@FD_5C,@FD_5D,@FD_5E,@FD_5F
    	DW      @FD_60,@FD_61,@FD_62,@FD_63,@FD_64,@FD_65,@FD_66,@FD_67
    	DW      @FD_68,@FD_69,@FD_6A,@FD_6B,@FD_6C,@FD_6D,@FD_6E,@FD_6F
    	DW      @FD_70,@FD_71,@FD_72,@FD_73,@FD_74,@FD_75,@FD_76,@FD_77
    	DW      @FD_78,@FD_79,@FD_7A,@FD_7B,@FD_7C,@FD_7D,@FD_7E,@FD_7F
    	DW      @FD_80,@FD_81,@FD_82,@FD_83,@FD_84,@FD_85,@FD_86,@FD_87
    	DW      @FD_88,@FD_89,@FD_8A,@FD_8B,@FD_8C,@FD_8D,@FD_8E,@FD_8F
    	DW      @FD_90,@FD_91,@FD_92,@FD_93,@FD_94,@FD_95,@FD_96,@FD_97
    	DW      @FD_98,@FD_99,@FD_9A,@FD_9B,@FD_9C,@FD_9D,@FD_9E,@FD_9F
    	DW      @FD_A0,@FD_A1,@FD_A2,@FD_A3,@FD_A4,@FD_A5,@FD_A6,@FD_A7
    	DW      @FD_A8,@FD_A9,@FD_AA,@FD_AB,@FD_AC,@FD_AD,@FD_AE,@FD_AF
    	DW      @FD_B0,@FD_B1,@FD_B2,@FD_B3,@FD_B4,@FD_B5,@FD_B6,@FD_B7
    	DW      @FD_B8,@FD_B9,@FD_BA,@FD_BB,@FD_BC,@FD_BD,@FD_BE,@FD_BF
    	DW      @FD_C0,@FD_C1,@FD_C2,@FD_C3,@FD_C4,@FD_C5,@FD_C6,@FD_C7
    	DW      @FD_C8,@FD_C9,@FD_CA,@FD_CB,@FD_CC,@FD_CD,@FD_CE,@FD_CF
    	DW      @FD_D0,@FD_D1,@FD_D2,@FD_D3,@FD_D4,@FD_D5,@FD_D6,@FD_D7
    	DW      @FD_D8,@FD_D9,@FD_DA,@FD_DB,@FD_DC,@FD_DD,@FD_DE,@FD_DF
    	DW      @FD_E0,@FD_E1,@FD_E2,@FD_E3,@FD_E4,@FD_E5,@FD_E6,@FD_E7
    	DW      @FD_E8,@FD_E9,@FD_EA,@FD_EB,@FD_EC,@FD_ED,@FD_EE,@FD_EF
    	DW      @FD_F0,@FD_F1,@FD_F2,@FD_F3,@FD_F4,@FD_F5,@FD_F6,@FD_F7
    	DW      @FD_F8,@FD_F9,@FD_FA,@FD_FB,@FD_FC,@FD_FD,@FD_FE,@FD_FF
    
    VECT_ED LABEL   BYTE
    
    	DW      @ED_00,@ED_01,@ED_02,@ED_03,@ED_04,@ED_05,@ED_06,@ED_07
    	DW      @ED_08,@ED_09,@ED_0A,@ED_0B,@ED_0C,@ED_0D,@ED_0E,@ED_0F
    	DW      @ED_10,@ED_11,@ED_12,@ED_13,@ED_14,@ED_15,@ED_16,@ED_17
    	DW      @ED_18,@ED_19,@ED_1A,@ED_1B,@ED_1C,@ED_1D,@ED_1E,@ED_1F
    	DW      @ED_20,@ED_21,@ED_22,@ED_23,@ED_24,@ED_25,@ED_26,@ED_27
    	DW      @ED_28,@ED_29,@ED_2A,@ED_2B,@ED_2C,@ED_2D,@ED_2E,@ED_2F
    	DW      @ED_30,@ED_31,@ED_32,@ED_33,@ED_34,@ED_35,@ED_36,@ED_37
    	DW      @ED_38,@ED_39,@ED_3A,@ED_3B,@ED_3C,@ED_3D,@ED_3E,@ED_3F
    	DW      @ED_40,@ED_41,@ED_42,@ED_43,@ED_44,@ED_45,@ED_46,@ED_47
    	DW      @ED_48,@ED_49,@ED_4A,@ED_4B,@ED_4C,@ED_4D,@ED_4E,@ED_4F
    	DW      @ED_50,@ED_51,@ED_52,@ED_53,@ED_54,@ED_55,@ED_56,@ED_57
    	DW      @ED_58,@ED_59,@ED_5A,@ED_5B,@ED_5C,@ED_5D,@ED_5E,@ED_5F
    	DW      @ED_60,@ED_61,@ED_62,@ED_63,@ED_64,@ED_65,@ED_66,@ED_67
    	DW      @ED_68,@ED_69,@ED_6A,@ED_6B,@ED_6C,@ED_6D,@ED_6E,@ED_6F
    	DW      @ED_70,@ED_71,@ED_72,@ED_73,@ED_74,@ED_75,@ED_76,@ED_77
    	DW      @ED_78,@ED_79,@ED_7A,@ED_7B,@ED_7C,@ED_7D,@ED_7E,@ED_7F
    	DW      @ED_80,@ED_81,@ED_82,@ED_83,@ED_84,@ED_85,@ED_86,@ED_87
    	DW      @ED_88,@ED_89,@ED_8A,@ED_8B,@ED_8C,@ED_8D,@ED_8E,@ED_8F
    	DW      @ED_90,@ED_91,@ED_92,@ED_93,@ED_94,@ED_95,@ED_96,@ED_97
    	DW      @ED_98,@ED_99,@ED_9A,@ED_9B,@ED_9C,@ED_9D,@ED_9E,@ED_9F
    	DW      @ED_A0,@ED_A1,@ED_A2,@ED_A3,@ED_A4,@ED_A5,@ED_A6,@ED_A7
    	DW      @ED_A8,@ED_A9,@ED_AA,@ED_AB,@ED_AC,@ED_AD,@ED_AE,@ED_AF
    	DW      @ED_B0,@ED_B1,@ED_B2,@ED_B3,@ED_B4,@ED_B5,@ED_B6,@ED_B7
    	DW      @ED_B8,@ED_B9,@ED_BA,@ED_BB,@ED_BC,@ED_BD,@ED_BE,@ED_BF
    	DW      @ED_C0,@ED_C1,@ED_C2,@ED_C3,@ED_C4,@ED_C5,@ED_C6,@ED_C7
    	DW      @ED_C8,@ED_C9,@ED_CA,@ED_CB,@ED_CC,@ED_CD,@ED_CE,@ED_CF
    	DW      @ED_D0,@ED_D1,@ED_D2,@ED_D3,@ED_D4,@ED_D5,@ED_D6,@ED_D7
    	DW      @ED_D8,@ED_D9,@ED_DA,@ED_DB,@ED_DC,@ED_DD,@ED_DE,@ED_DF
    	DW      @ED_E0,@ED_E1,@ED_E2,@ED_E3,@ED_E4,@ED_E5,@ED_E6,@ED_E7
    	DW      @ED_E8,@ED_E9,@ED_EA,@ED_EB,@ED_EC,@ED_ED,@ED_EE,@ED_EF
    	DW      @ED_F0,@ED_F1,@ED_F2,@ED_F3,@ED_F4,@ED_F5,@ED_F6,@ED_F7
    	DW      @ED_F8,@ED_F9,@ED_FA,@ED_FB,@ED_FC,@ED_FD,@ED_FE,@ED_FF
    
    endif
    .
    Последний раз редактировалось barsik; 04.04.2017 в 16:04.

  2. #82
    Guru Аватар для ZEman
    Регистрация
    28.10.2005
    Адрес
    Омск
    Сообщений
    2,052
    Спасибо Благодарностей отдано 
    113
    Спасибо Благодарностей получено 
    34
    Поблагодарили
    23 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Pyk Посмотреть сообщение
    Хорошо, продублирую на сочетание Alt + что-нибудь.
    Я не пользовался punto switcher'ом, он как раз клавишу Pause использует по умолчанию?
    да, оказалось что punto switcher использует клавишу "pause/break" для своих нужд.
    отключил эту функцию в программе, пауза стала работать как надо.
    но если можно продублируйте её на какое-нибудь сочетание клавиш.

  3. #83
    Veteran
    Регистрация
    07.10.2006
    Сообщений
    1,640
    Спасибо Благодарностей отдано 
    241
    Спасибо Благодарностей получено 
    249
    Поблагодарили
    155 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ZEman Посмотреть сообщение
    да, оказалось что punto switcher использует клавишу "pause/break" для своих нужд.
    отключил эту функцию в программе, пауза стала работать как надо.
    но если можно продублируйте её на какое-нибудь сочетание клавиш.
    Вместо отключения её можно переназначить в punto switcher на другую клавишу, например, на Scroll Lock.

  4. #84
    Guru
    Регистрация
    24.01.2008
    Адрес
    Уфа
    Сообщений
    3,847
    Спасибо Благодарностей отдано 
    84
    Спасибо Благодарностей получено 
    229
    Поблагодарили
    167 сообщений
    Mentioned
    9 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от barsik Посмотреть сообщение
    Понятно, что можно заставить каждую процедуру эмуляции конкретной команды увеличивать какой-то счётчик на число тактов реальной команды. Что это даст, кроме знания сколько тактов исполнилось.
    Без этого вообще невозможно сделать точную эмуляцию. И кстати, условные команды CALL и RET выполняются за разное количество тактов, в зависимости от условия, тоже надо учитывать.

    Цитата Сообщение от barsik Посмотреть сообщение
    Какой цикл эмуляции? Что за цикл?
    Например, мы запускаем эмуляцию 50 раз в секунду по таймеру (или сигналу КСИ). Эмуляция команд процессора происходит в цикле. В нём же мы учитываем, сколько тактов выполнил наш процессор. Как только это число перевалило за 40000, завершаем цикл и ждём следующего срабатывания таймера. Таким образом в секунду мы эмулируем 50*40000=2000000 тактов процессора, что соответствует тактовой частоте 2МГц. В том-же цикле эмуляции нужно эмулировать и другие устройства: экран, звук, в/в магнитофона, последовательный интерфейс и т.д. и т.п.
    Последний раз редактировалось b2m; 04.04.2017 в 14:42.

  5. #85
    Banned
    Регистрация
    05.10.2016
    Адрес
    г. Санкт-Петербург
    Сообщений
    1,080
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    5
    Поблагодарили
    5 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от b2m
    Как только это число перевалило за 40000, завершаем цикл и ждём следующего срабатывания таймера
    На мой взгляд это неудачная концепция. Пригодная лишь для точной эмуляции по скорости и ито НЕ на коротких периодах. На быстрой машине собственно такая эмуляция длится, допустим, 1 процент времени за цикл, а остальное время прогона нет. Как же тогда правильно будет играть музыка, где всё на задержках. И где взять таймер с периодом частоты в 50-100 герц? Я слышал, что в IBM PC есть таймер позволяющий измерять отсчеты с кратностью 1/18 секунды, а не 1/100 секунды.

    По-моему, правильнее прогонять всё время, но тормозить после каждой команды, как я и делаю, хотя подгон времён и сделан небрежно. Обычно я сам пользуюсь эмулятором, где подгонка времён прогона команд отсутствует или минимальна, отчего погрешность времён +-100% и более (зато в режиме ТУРБО - 100 МГЦ Z80). Никакой разницы в работе программ при подгоне времён и без него - нет (точнее, я не заметил). Есть встроенный тест, который исполняет сотни миллионов команд NOP, а затем по таймеру вычисляет реальный такт. Этого вполне хватает. Можно прогнать тест с заведомо известным временем прогона и настроить и по нему. Но т.к команды плохо сбалансированы, то время прогона зависит от конкретного набора команд. Поэтому если настроить константу тормозилки по одному тесту, то на другом тесте возможны существенные расхождения с реальностью +-10%.

    Но для программ это без разницы. Нет программ ни для ОРИОНА, ни для СПЕЦИАЛИСТА, ни для РК86, где это бы играло роль. Чем переделывать концепцию, мне проще написать тест команд по скорости (это программа Z80, который в моём эмуляторе имеет доступ к времени в 0040:006C) и сделать покомандную подгонку менее дискретной (т.е грузить в счётчик паузы не число тактов, а число тактов умноженное на 10), что даст возможность точнее сбалансировать команды.

    КСИ у меня в эмуляторе нет, т.к такты я не считаю. А прерывание 50 ГЦ формирую подсчётом не тактов, а числа команд - делалось на медленной ЭВМ, где запаса по скорости вообще не было, а INC короче чем ADD (на число тактов). Поэтому если тормозилка маленькая, такт CPU высокий, то эмулируются прерывания не 50 ГЦ, а например 100 ГЦ. В программах разницы не заметил.
    Последний раз редактировалось barsik; 04.04.2017 в 22:46.

  6. #86
    Guru
    Регистрация
    24.01.2008
    Адрес
    Уфа
    Сообщений
    3,847
    Спасибо Благодарностей отдано 
    84
    Спасибо Благодарностей получено 
    229
    Поблагодарили
    167 сообщений
    Mentioned
    9 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от barsik Посмотреть сообщение
    По-моему, правильнее прогонять всё время, но тормозить после каждой команды
    На мой взгляд это неудачная концепция. Особенно для винды, которая совсем не реалтайм. А музыка - она буферизируется, естесственно. Если пополнять буфер 50 раз в секунду, то буфер нужен всего лишь на 1/25 секунды. Есть, конечно, и недостаток - музыка отстаёт на 20 миллисекунд. Иногда заметно, например когда должны быть короткий звук и вспышка на экране. Но чаще всего такое мизерное отставание особой роли не играет. К тому-же, можно видео на один кадр позже выводить (правда придётся очередь из кадров городить).

    Кстати, я сталкивался с проблемой заметного отставания музыки, когда пытался переделать эмулятор на SDL. Причём размер буфера особой роли не играл. Pyk, а как ты эту проблему решил?

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

    Цитата Сообщение от barsik Посмотреть сообщение
    Я слышал, что в IBM PC есть таймер позволяющий измерять отсчеты с кратностью 1/18 секунды
    Мне почему-то кажется, что времена ДОСа закончились уж лет 20 как.

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

    Цитата Сообщение от barsik Посмотреть сообщение
    Нет программ ни для ОРИОНА, ни для СПЕЦИАЛИСТА, ни для РК86, где это бы играло роль.
    Зато есть демки для Вектора, где точность выполнения играет охренительную роль.

  7. #87
    Banned
    Регистрация
    22.05.2011
    Адрес
    г. Дзержинск, Украина
    Сообщений
    6,841
    Спасибо Благодарностей отдано 
    483
    Спасибо Благодарностей получено 
    657
    Поблагодарили
    511 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Pyk, если у вас заявлена высокая точность по времянкам
    то вы должны знать когда именно проц выдает hlda

    смотрел по мануалу
    проц детектит hold только во время t2, tw каждого машинного цикла
    а подтверждение... (с разной задержкой в зависимости от комады сходу не вспомню)

    короче
    где мне взять список всех команд проца
    разбитых на машинные циклы и их растактовку?

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

    а еще меня интересует на каком такте ei, di появляется изменение на inte
    Последний раз редактировалось NEO SPECTRUMAN; 04.04.2017 в 16:47.

  8. #88
    Veteran Аватар для Pyk
    Регистрация
    05.04.2013
    Адрес
    с. Починки, Нижегородская обл.
    Сообщений
    1,178
    Спасибо Благодарностей отдано 
    263
    Спасибо Благодарностей получено 
    456
    Поблагодарили
    182 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    barsik, в общем-то b2m вроде бы уже все объяснил, и мне нечего добавить. У меня все сделано практически так же, да и в большинстве современных эмуляторов разных авторов и разных платформ, я думаю, тоже.


    Цитата Сообщение от b2m Посмотреть сообщение
    Кстати, я сталкивался с проблемой заметного отставания музыки, когда пытался переделать эмулятор на SDL. Причём размер буфера особой роли не играл. Pyk, а как ты эту проблему решил?
    В 3-й версии такая проблема вообще возникнуть не могла, так как я синхронизировал эмулятор как раз со звуком. В текущей же используется SDL2, синхронизируется с performance timer'ом (хотя скорее всего хватило бы и обычного), и со звуком проблем не было. Да и вообще, непонятно, из-за чего может появиться отставание, может быть, как раз накапливались не перенесенные на следующий цикл какие-нибудь отброшенные остатки от деления? Не зная особенностей твоей реализации, сложно сказать...


    Цитата Сообщение от NEO SPECTRUMAN Посмотреть сообщение
    Pyk, если у вас заявлена высокая точность по времянкам
    то вы должны знать когда именно проц выдает hlda
    Нет, я начал изучать этот вопрос, но так и не добил пока точные времянки, поэтому воздержусь от ответа, чтобы не наврать.
    Зато этого добился uart, надеюсь, он подскажет.

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

  9. #89
    Activist
    Регистрация
    14.05.2013
    Адрес
    г. Москва
    Сообщений
    254
    Спасибо Благодарностей отдано 
    1
    Спасибо Благодарностей получено 
    6
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    У меня просто циклы записи и чтения различаются. Когда процессор выдаёт HLDA вроде бы нормально описано в его доке, важнее как ВТ57 и ВГ75 на это реагируют.

  10. #90
    Banned
    Регистрация
    22.05.2011
    Адрес
    г. Дзержинск, Украина
    Сообщений
    6,841
    Спасибо Благодарностей отдано 
    483
    Спасибо Благодарностей получено 
    657
    Поблагодарили
    511 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от uart Посмотреть сообщение
    Когда процессор выдаёт HLDA вроде бы нормально описано в его доке,
    как описано
    но когда и сколько раз этот т2(когда детектится hold) появляется за время каждой команды...

    щас поищу таблицу

Страница 9 из 98 ПерваяПервая ... 5678910111213 ... ПоследняяПоследняя

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

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

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

Похожие темы

  1. Emu80, старые версии
    от Pyk в разделе Эмуляторы отечественных компьютеров
    Ответов: 68
    Последнее: 11.03.2017, 00:33

Ваши права

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