Войти
ФлеймФорумЖелезо

Блеск и нищета 8/16-битных консолей и ПК (57 стр)

Страницы: 154 55 56 57 58 59 Следующая »
#840
13:03, 25 янв. 2020

=A=L=X=
> Unreal 1

Там MOD-формат, инструменты, основанные на семплах. В 16килобайт, тем более с голосом, такое ни за что не засунешь. У меня семплов вообще нет. Музыка и эффекты (сверчки+прибой) генерируются субтрактивным синтезатором 3 генератора + LFO + 2 четырехполюсных фильтра + 3 ADSR, ну и эффекты (если Delay и Chorus обходятся воспроизведением из буфера задержки, то вот более-менее сносная реверберация, чтоб без металлического призвука, требует гораздо больше).

Ну и даже синтез человеческого голоса - даже если только 16 4-полюсных фильтров - это уже фактически эквивалентно примерно 32-м вышеприведенным циклам. А там же помимо фильтрации и другие вещи есть, интерполяция огибающих и проч.


#841
13:28, 25 янв. 2020

Dmitry_Milk
> Буду смотреть путь попасть в расширенный режим из миниатюрного файла без
> DOS-экстендеров (когда депрессия пройдет).

Рекомендую всё-таки сперва проверить более весомые эмуляторы типа VMWare - повторюсь что плеер у них бесплатный, поэтому любой сможет скачать его и установить как и DosBox.
И с защищённым режимом это имеет еще больше смысла, ведь вряд ли в нём DosBox ускорится с вещественными числами - с чего бы? А во вторых - не факт что они в нём вообще делали поддержку SSE, ведь во времена DOS такого вообще не было - так зачем им вообще такое поддерживать?
А вот VMWare как раз будет, т.к. она в первую очередь эмулирует процессор и железо, а не среду выполнения. И точно умеет в виртуальное исполнение инструкций без весомых проблем с производительностью на непривелигированных инструкциях.

#842
(Правка: 15:13) 15:12, 25 янв. 2020

gamedevfor
> Если можно перехватить запись в видеопамять ZX

Как это и зачем?

> можно было бы потестить эту многозадачность на играх.

В играх такое особо не нужно - там проще просто перехватить прерывание, вызвать шаг звукового драйвера, но игровой шаг делать уже вне прерывания. Ибо прерывать игровой шаг посередине кроме как обновление звукового драйвера не нужно было.
Бывают, конечно, и сложные случаи - например если взять исходные коды игр Дениса Грачёва, который наш ас по теме игр на спектруме с мультиколором - а это очень жёсткие, высчитанные до такта тайминги вплоть до того что код отрисовки врагов занимает всегда одно и то же число тактов независимо от того сколько их видно на экране и в каких позициях, то там можно усмотреть какие то сложные схемы.
Игры и исходные коды можно скачать тут: http://www.retrosouls.net/?page_id=848
Например в исходниках игры GLUF (это из недавнего) можно встретить такое:

interrupt:
; preserve all registers
        push    af
        push    bc
        push    de
        push    hl
        ex      af, af'
        exx
        push    af
        push    bc
        push    de
        push    hl
        push    ix
        push    iy

topProc:  call topBorder1


tower1:  ld de,000000;10
tower2: ld bc,000000;10

  ;do multicolor

  IFDEF  PENTAGON
  include "include\multicolorPentagon.asm"
  ELSE
  include "include\multicolorSpectrum.asm"
  ENDIF
                 
botomProc:  call botomBorder1
  call musicSound
; restore all registers
        pop     iy
        pop     ix
        pop     hl
        pop     de
        pop     bc
        pop     af
        exx
        ex      af, af'
        pop     hl
        pop     de
        pop     bc
        pop     af
;        jp      $38
  ei
  ret

Т.е. в прерывании он еще производит какие то замутки нужные для реализации мультиколора.
Причём, что сразу же бросается в глаза - вызов call topBorder1 помечен меткой, но она в процедуре нигде не участвует.
Это сразу же навевает на мысль которую легко подтвердить поиском в коде - это место модифицируется из разных участков игры так что call в разные моменты осуществляется на разные процедуры:

restartLevel:
  ld hl,topBorder1 ;draw buffer2
  ld (topProc+1),hl
...
То же самое, очевидно уже, происходит и с загрузками констант в регистры BC и DE чуть ниже. В общем мысль программерская так и хлещет...

#843
17:56, 25 янв. 2020

=A=L=X=
> А вот VMWare как раз будет, т.к. она в первую очередь эмулирует процессор и
> железо, а не среду выполнения.
В смысле "эмулирует процессор"?
Не знаю, как в досбоксе, но VMWare, как и VirtualBox, эмулирует как раз среду выполнения - трапает привелегированные инструкции и симулирует их через собственные usermode-ресурсы, плюс держит вторичную таблицу адресации. Программный код при этом выполняется непосредственно железным процессором без перетрансляции.
Тот же VirtualBox, кстати, бесплатен для некоммерческого пользователя и при этом достаточно функционален, чтобы запускать DOS-приложения из-под гостевой Windows XP из-под хоста Windows 8.1 x64.
Изображение

#844
18:01, 25 янв. 2020

Delfigamer
> Не знаю, как в досбоксе, но VMWare, как и VirtualBox, эмулирует как раз среду
> выполнения - трапает привелегированные инструкции и симулирует их через
> собственные usermode-ресурсы, плюс держит вторичную таблицу адресации

оно работает без включённой виртуализации ?

#845
18:22, 25 янв. 2020

Dmitry_Milk
> Буду смотреть путь попасть в расширенный режим из миниатюрного файла без
> DOS-экстендеров (когда депрессия пройдет)

:) Там всё просто.  Берём FASM и компилим вот это чудо:

ORG        0x100

jmp        intFF

SFLAT:
mov        bx,ss
mov        cx,ds
xor        eax,eax
mov        ax,cs
mov        [cs:RM],ax
shl        eax,4
add        eax,PM+6
mov        [cs:PM],eax
add        eax,GDT-(PM+6)
mov        DWORD [cs:GDT+26],eax
lgdt        FWORD [cs:GDT+24]
in        al,92h
or        al,2
out        92h,al
cli
in        al,70h
or        al,80h
out        70h,al
mov        eax,cr0
or        al,1
mov        cr0,eax
db        0x66
db        0xEA
PM        dd ?
dw        8
mov        dx,16
mov        ss,dx
mov        ds,dx
mov        es,dx
mov        gs,dx
mov        fs,dx
and        al,0xFE
mov        cr0,eax
db        0xEA
dw        $+4
RM        dw ?
mov        ss,bx
mov        ds,cx
in        al,70h
and        al,0x7F
out        70h,al
sti
iret

GDT        dq ?
        dq 0x008F9A000000FFFF
        dq 0x008F92000000FFFF
        dw 24,?,?

intFF:
mov        ax,0x25FF
mov        dx,SFLAT
int        21h
mov        dx,intFF
int        27h

Получившийся COM'ок запускаем.  Резидент.  Прерывание int 0xFF - активация перехода в плоский анреальный режим.  4 GB памяти для данных как на ладони.    Далее берём С, С++  или Паскакаль и пишем остальную работу(не забыв вызвать int $FF).

На счёт трекерной музыки - есть библиотека Dumb FX, сам использовал.  Она играет XM, IT, MOD, S3M

#846
(Правка: 18:25) 18:24, 25 янв. 2020

А вот пример работы со звуковой картой ESS Solo 1969  под плоский анреальный режим.  DMA тут уже 32-битный и называется Bus Master.

Писал давно, поэтому на паскале.  Адрес памяти буфера захардкоден, ибо я один с правами на верхнюю память, оставив DOS ниже :)

{$I-,G+,X+}

uses CRT;

const RAM=$1000000;
      DMA=$1000;

var f:file;
    Name:string;
    Buffer:array[0..DMA-1] of byte;
    BufferAddress:longint;
    Pie,i:longint;
    BusDeviceFunction:word;
    IO,SB:word;
    c:char;
    Level:byte;

function TestSolo:boolean;
assembler;
asm
 mov    ax,$B102
 mov    cx,$1969
 mov    dx,$125D
 xor    si,si
 int    1Ah
 cmp    ah,0
 jnz    @No
 mov    BusDeviceFunction,bx
 mov    al,1
 jmp    @Exit
 @No:
 xor    al,al
 @Exit:
end;

function InBSolo(N:word):byte;
assembler;
asm
 mov    ax,$B108
 mov    bx,BusDeviceFunction
 mov    di,N
 int    1Ah
 mov    al,cl
end;

function InWSolo(N:word):word;
assembler;
asm
 mov    ax,$B109
 mov    bx,BusDeviceFunction
 mov    di,N
 int    1Ah
 mov    ax,cx
end;

procedure OutBSolo(N:word;B:byte);
assembler;
asm
 mov    ax,$B10B
 mov    bx,BusDeviceFunction
 mov    di,N
 mov    cl,B
 int    1Ah
end;

function Virtual:boolean;
assembler;
asm
 smsw   ax
 and    al,1
end;

procedure OffCursor;
assembler;
asm
 mov    ah,1
 mov    ch,20h
 int    10h
end;

procedure OutPortD(P:word;D:longint);
assembler;
asm
 mov    dx,[bp+8]
 db     $66
 mov    ax,[bp+4]
 db     $66
 out    dx,ax
end;

procedure Transfer(EDI,ESI,ECX:longint);
assembler;
asm
 db     $66
 mov    di,[bp+12]
 db     $66
 mov    si,[bp+8]
 db     $66
 mov    cx,[bp+4]
 xor    ax,ax
 mov    es,ax
 repe
 SEGES
 db     $67
 movsb
end;

procedure FileToRAM;
begin
 if Name='' then Halt;
 Assign(f,Name);
 Reset(f,1);
 if IOResult<>0 then Halt;
 Inline($CD/$FF);
 Seek(f,$2C);
 Pie:=(FileSize(f)-$2C) div DMA;
 BufferAddress:=SEG(Buffer);
 BufferAddress:=BufferAddress shl 4;
 BufferAddress:=BufferAddress+OFS(Buffer);
 TextColor(15);
 for i:=0 to Pie-1 do begin
  if Keypressed then begin
   ReadKey;
   Close(f);
   Halt;
  end;
  BlockRead(f,Buffer,DMA);
  Transfer(RAM+DMA*i,BufferAddress,DMA);
  GotoXY(1,4);
  Write(Trunc(100*(i+1)/Pie),'%');
 end;
 Close(f);
end;

BEGIN
 if Virtual then Halt;
 if not TestSolo then Halt;
 TextMode(CO80+Font8x8);
 c:=#$FF;
 Level:=0;
 TextColor(14);
 GotoXY(1,3);
 Write('3D Level:');
 GotoXY(10,3);
 Write('  ');
 GotoXY(10,3);
 Write(Level);
 GotoXY(1,1);
 TextColor(2);
 WriteLn('ESS Solo Player');
 TextColor(10);
 Write('16bit Stereo 44.1kHz:');
 TextColor(15);
 Read(Name);
 OffCursor;
 FileToRAM;
 IO:=InWSolo($10) and $FFF0;         {IO Base Address}
 SB:=InWSolo($14) and $FFF0;         {SB Base Address}
 OutBSolo($41,InBSolo($41) or $80);  {Disable Legacy}
 Port[SB+6]:=3;                      {Reset}
 Port[SB+4]:=$50;                    {Enable 3D Sound}
 Port[SB+5]:=Port[SB+5] or 8;
 PortW[SB+4]:=$0052;                 {3D Sound Level}
 PortW[SB+4]:=$6E70;                 {Sample Rate}
 PortW[SB+4]:=$0271;                 {Mode}
 PortW[SB+4]:=$1378;                 {Control 1}
 PortW[SB+4]:=$077A;                 {Control 2}
 PortW[SB+4]:=$FF7C;                 {Volume}
 PortW[IO+4]:=DMA;                   {DMA Count}
 Port[IO+6]:=$A;                     {ON}
 for i:=0 to Pie-1 do begin
  if Keypressed then c:=ReadKey;
  if c=#0 then c:=ReadKey;
  case c of
   #27:Break;
   #72:begin
    if Level<63 then Inc(Level);
    Port[SB+4]:=$52;
    Port[SB+5]:=Level;
    GotoXY(10,3);
    Write('  ');
    GotoXY(10,3);
    Write(Level);
    c:=#$FF;
   end;
   #80:begin
    if Level>0 then Dec(Level);
    Port[SB+4]:=$52;
    Port[SB+5]:=Level;
    GotoXY(10,3);
    Write('  ');
    GotoXY(10,3);
    Write(Level);
    c:=#$FF;
   end;
   #75:begin
    Level:=0;
    PortW[SB+4]:=$0052;
    GotoXY(10,3);
    Write('  ');
    GotoXY(10,3);
    Write(Level);
    c:=#$FF;
   end;
   #77:begin
    Level:=63;
    PortW[SB+4]:=$3F52;
    GotoXY(10,3);
    Write('  ');
    GotoXY(10,3);
    Write(Level);
    c:=#$FF;
   end;
  end;
  OutPortD(IO,RAM+DMA*i);            {DMA Address}
  repeat until PortW[IO+4]<>16;
  repeat until PortW[IO+4]=16;
 end;
 Port[IO+6]:=0;                      {OFF}
 OutBSolo($41,InBSolo($41) and $7F); {Enable Legacy}
END.
#847
18:32, 25 янв. 2020

innuendo
> оно работает без включённой виртуализации ?
https://www.virtualbox.org/manual/ch10.html#hwvirt

Enabling hardware virtualization is required in the following scenarios:
  • Certain rare guest operating systems like OS/2 make use of very esoteric processor instructions. For virtual machines that are configured to use such an operating system, hardware virtualization is enabled automatically.
  • Oracle VM VirtualBox's 64-bit guest and multiprocessing (SMP) support both require hardware virtualization to be enabled. This is not much of a limitation since the vast majority of 64-bit and multicore CPUs ship with hardware virtualization. The exceptions to this rule are some legacy Intel and AMD CPUs.
  • #848
    18:43, 25 янв. 2020

    Delfigamer
    я про WMWare - без оной не запускается, пришлось включать в биосе

    #849
    18:43, 25 янв. 2020

    Gradius
    > Получившийся COM'ок запускаем.  Резидент.  Прерывание int 0xFF - активация
    > перехода в плоский анреальный режим.  4 GB памяти для данных как на ладони.   
    > Далее берём С, С++  или Паскакаль и пишем остальную работу

    помню в 95-96 был такой форт в protected mode

    #850
    (Правка: 26 янв. 2020, 7:22) 21:11, 25 янв. 2020

    Delfigamer
    > В смысле "эмулирует процессор"?
    > Не знаю, как в досбоксе, но VMWare, как и VirtualBox, эмулирует как раз среду
    > выполнения - трапает привелегированные инструкции и симулирует их через

    А может немного через своё горло следовало переступить и прочитать несколько слов далее?

    =A=L=X=

    А вот VMWare как раз будет, т.к. она в первую очередь эмулирует процессор и
    железо, а не среду выполнения. И точно умеет в виртуальное исполнение
    инструкций без весомых проблем с производительностью на непривелигированных
    инструкциях.
    #851
    (Правка: 23:58) 23:46, 25 янв. 2020

    =A=L=X=
    А, то есть у нас разные понятия о том, что такое "процессор", "окружающая среда" и "виртуальное исполнение", и это норма, окей, понятно.
    Просто, в общем употреблении, под "эмуляцией процессора" и "виртуальным исполнением" подразумевают именно интерпретацию на виртуальной машине - чем, например, занимаются эмуляторы старых консосолек; а гипервизоры нередко ставятся в прямое противопоставление эмуляторам - они процессор как раз не виртуализируют, а используют напрямую, загружая код гостевой программы в память и делая jmp напрямую в него.
    И "без весомых проблем с производительностью на непривелигированных
    инструкциях" вовсе не является отрицанием эмуляции - современные jit-компиляторы вполне могут достигать оффлайн-компиляторных скоростей на определённых алгоритмах, причём плотный цикл из чистой математики - как раз из тех, которые ловятся и оптимизируются легче всего. В подтверждение могу даже откопать один из своих древних постов, где LuaJIT на несколько процентов обогнал gcc -Ofast на интеграции по кривой Безье, если вдруг не веришь на слово.

    #852
    7:25, 26 янв. 2020

    Delfigamer

    DosBox не обязан, к примеру, содержать в своей виртуальной машине исполняемый код ядра Dos - ему достаточно просто по встрече инструкции int 33h делать что от него требуется чтобы программа чувствовала себя как в родной _среде_. Поэтому я и говорю что он не эмулирует железо, а эмулирует среду выполнения в отличие от VMWare.
    Но главный пойнт был в том, что если VMWare использует аппаратную виртуализацию, то чем занимается DosBox - непонятно, т.к. уж очень низкая производительность FPU получилась по факту.

    #853
    8:45, 26 янв. 2020

    Gradius
    > :) Там всё просто. Берём FASM и компилим вот это чудо:

    Круто.
    А что точно происходит после активации перехода (int $FF) - где продолжится выполнение и как из него обратно вернуться (если это возможно)?

    #854
    (Правка: 13:59) 13:49, 26 янв. 2020

    =A=L=X=
    > А что точно происходит после активации перехода (int $FF) - где продолжится
    > выполнение и как из него обратно вернуться (если это возможно)?

    Это программное прерывание.  Вызываестя  в программе:

    int 0xFF

    До- и после- прерывания - основная программа. Там же iret стоит, можно было и сообразить :)

    Обработчик прерывания: разрешает адресную линию A20, переводит в защищённый режим, затем обратно в реальный. Лимит сегментных регистров остаётся равным 4 ГБ, что даёт возможность программам в реальном режиме хранить данные выше 1 МБ.  В 16-битных компиляторах для работы с 32-битными адресами прийдётся использовать префиксы перекрытия размера операнда 0x66, 0x67 (пример со звуковой картой ESS SOLO был ниже) или писать на внешнем ассемблере и стыковать к C/Pascal.  Забавно, но при этом можно уничтожить дескрипторную таблицу и код обработчика прерывания , так как в теневых регистрах лимит сохранился.  Проблема в том, что ДОС-экстендеры по возвращению в ДОС, устанавливают лимиты всех сегментов в 64 кБ, поэтому для надёжности в своих программах  надо постоянно дёргать int 0xFF, так как каждый делает как ему вздумается.

    Если не открыть адресную линию A20, то вместо 4 ГБ будет доступно в 2 раза меньше и будет повтор куска памяти каждый второй мегабайт.  Об этом мало кто пишет, все довольствуются только переводом в защищённый режим через регистр cr0, забывая, что это ещё не всё что требуется для полноценной работы с памятью.  Код мой, выстрадан и опробован на AMD и Intel.

    И конечно же это работает только в чистом DOS, без EMM386 и аналогов.  Такой изврат в своё время понадобился для хранения больших данных в памяти (видео, звук), при этом код был написан в стиле 16 бит и лежал в 64 кБ сегменте.

    А вообще, процессоры x86 - хрень полная. Могли бы проще сделать переключение в 32 бита, пускай даже без защиты - просто плоский режим как в M68k и ARM'ах.

    =A=L=X=
    > DosBox не обязан, к примеру, содержать в своей виртуальной машине исполняемый
    > код ядра Dos - ему достаточно просто по встрече инструкции int 33h делать что
    > от него требуется чтобы программа чувствовала себя как в родной _среде_

    С int 0x33 интересная вещь: мышь через него работает вDOS-программах, запущенных в Win98, а вот через  порт 0x60 мышь в 98-й винде под ДОС не работает, только опрос клавиатуры.  Возможно так было задумано ядром Винды.  В чистом DOS мышь также доступна через порт 0x60 как и клавиатура - пакеты идут от обоих устройств.

    Вот и подумалось, что при встрече int 0x33 винда подсовывает свою обработку мыши для ДОС программ.

    Страницы: 154 55 56 57 58 59 Следующая »
    ФлеймФорумЖелезо