Rev 1383 | Blame | Compare with Previous | Last modification | View Log | Download
пройдены тесты 186:
add
bitwise: лишнее 10 (AF) на 7-й (and ah,al) - The state of the AF flag is undefined. лишнее 80 (SF) на 14-й (or cx,word[4]) - не был сформирован знак в LOG16 (fixed), 10-й с конца (test ah,al): лишнее 10 (AF) - The state of the AF flag is undefined.
cmpneg
control
jmpmov
провалены тесты:
bcdconv: все флаги неверны, +2e неверный результат daa 5496 вм. 5490 (где-то неправильный AF?)
datatrnf c1: pop %cx (non-standard)
div: все флаги неверны, +0x10 0000 вм ffff:
mov dx,0ffffh
mov ax,0ffffh
mov cx,01h
mov word[bp],02h
div cx ;ffff ffff/0001
add bp,02h
mov word[12],ax
mov word[14],cx
mov word[16],dx <----
+0x14 8000 вм ffff:
mov dx,0ffffh
mov ax,0ffffh
mov word[18],0ffffh
mov word[bp],04h
div word[18] ;ffff ffff/ffff
add bp,02h
mov word[20],ax
mov word[22],dx
para512: на старте рисует поверх всего экрана кучу блоков размером 256*65536 - так и надо? пока костыль для rep stosb 65536=0
cgademo: небольшое затирание надписи
digger: запарывается немного меню [один спрайт движения влево уже не запарывается после фикса знака в LOG16)
mision: огонь триггерится, а не работает при нажатом
malar: запарывается немного меню, [игра не запускается при cs=0400, запускается при 1000)
sorryass сломалось
еще странный косяк по х86
если запусить rogue он то отлично работает
но не работает выход с эмулятора по 135
[19:38] alone_coder: да, это надо пофиксить. прерывание не захватывается
livin:
37d8 похоже на логику движения с замедлением
de31,32 - какие-то переменные движения
поставил нопы 37c2, 37e0 вместо inc - не помогло
добавить вариант declputm16_oldpg, где писать в обратном порядке, чтобы можно было включить старую страницу
в некоторых случаях ld b,tscrpgs можно заменить на inc b?
что эффективнее - быстрый sp с проверкой 18t при каждой записи r16 (чтобы включить страницу) или sp как обычный регистр (и лишний сегмент под код)?
в call/jmp/ret сделать такую же проверку быстрого выхода, как в jr
флаги чётности и переполнения отключать настройкой?
имеет смысл отключить оба в сдвигах
чётность оставить только в логике
переполнения оставить только в арифметике
не формировать сразу флаг чётности, а копировать последний результат в регистр. когда надо будет перейти по чётности (это редко надо), тогда и посчитаем чётность
тогда логические операции и сдвиги через rlca/rla/rrca/rra, чтобы не менять флаги вообще, кроме C
флаг AC (x86) = флаг H (Z80)
сдвиги также формируют флаг O: The OF flag is affected only on 1-bit shifts. For left shifts, the OF flag is set to 0 if the most significant bit of the result is the same as the CF flag (that is, the top two bits of the original operand were the same); otherwise, it is set to 1. For the SAR instruction, the OF flag is cleared for all 1-bit shifts. For the SHR instruction, the OF flag is set to the most-significant bit of the original operand. https://c9x.me/x86/html/file_module_x86_id_285.html The OF flag is defined only for the 1-bit rotates; it is undefined in all other cases (except that a zero-bit rotate does nothing, that is affects no flags). For left rotates, the OF flag is set to the exclusive OR of the CF bit (after the rotate) and the most-significant bit of the result. For right rotates, the OF flag is set to the exclusive OR of the two most-significant bits of the result. https://c9x.me/x86/html/file_module_x86_id_273.html
во всех командах вручную хранить данные для флага O? rra:ld of,a:rla (если два старших бита разные, то это переполнение). к сожалению, нельзя объединить с данными для флага P (чтобы потом проверять с учётом C), т.к. не все команды меняют одновременно P, O, C (логические сдвиги - только O, C).
тогда все сдвиги точно соответствуют сдвигам на Z80 (логические - через rrca/..., арифметические - через #cb xx)
нужно хранить в регистрах:
8 parity data (d'?)
8 overflow data (e'?)
лучше для единообразия хранить все регистры в памяти
parity,overflow в ix? ничего не даст?
fs,gs нужны только для 386?
лучше CS всегда включать в конкретное окно (4000) и хранить пересчитанный PC
SS всегда включать в другое конкретное окно (8000) (sp не пересчитан для единообразия, но после его изменения надо encodeSP)
третье окно (c000) под данные
как адресовать память по ?s:de = (?s*16 + de)/16384 и mod 16384:
?s*16 сразу хранить как 24 бита (для всех ?s)
int 10h
ah=10h Установить регистры палитры для EGA. Работает при наличии EGA-совместимой карты.(включая VGA-совместимые)
Выбирает цвета, используемые данным атрибутом экрана. умалчиваемые цвета те же, что используются с CGA (см. атрибуты экрана ).
Вход:
AL Подфункция
0 Установить один регистр палитры
BL = регистр (идентифицирует 4-битовый цвет; 0-15)
BH = значение регистра (6-битовый rgbRGB выдаваемый цвет)
Примечание:
Существует недокументированная особенность этой функции - возможны значения вышё 15, однако менять эти регистры крайне не реккомендуется. В частности в RBIL приведена следующая информация:
10h attribute mode control register (should let BIOS control this)
11h overscan color register
12h color plane enable register (bits 3-0 enable corresponding text attribute bit)
13h horizontal PEL panning register
14h color select register
1 Установить регистр рамки.
BH = значение регистра (6-битовый rgbRGB выдаваемый цвет)
Примечание:
На оригинальном IBM PC эта функция записывает данные в не правильный регистр
2 Установить все регистры палитры и регистр границы
ES:DX => 17 байт (регистры палитры (байты 0-15) и регистр границы (байты 16))
Примечание:
Некоторые Биосы не правильно работают, если BH не равен нулю
3 Выбрать яркость или мерцание
BL,бит7 = 0:яркость фона (16 возможных цветов фона)
BL,бит7 = 1: мерцание (8 цветов фона + мерцание переднего плана)
Примечание:
Некоторые Биосы не правильно работают, если BH не равен нулю
7 Чтение регистра палитры
BL = номер читаемого регистра палитры (0-15).
Выход:
BH = содержимое регистра палитры.
Примечание:
необходима VGA-совместимая видеокарточка
Существует недокументированная особенность этой функции - возможны значения вышё 15. подробнее в подфункции 0
8 Чтение регистра цвета рамки
необходима VGA-совместимая видеокарточка
Выход:
BH = содержимое регистра цвета рамки
9 Чтение всех регистров палитры
ES:DX - указатель на 17-байтовую таблицу.(регистры палитры(байт 0-15) и регистр бордюра (байт 16))
Выход:
По адресу ES:DX содержится таблица, заполненная значениями из регистров палитры
Примечание:
необходима VGA-совместимая видеокарточка
Рекомендуется заполнить таблицу каким-либо известным вам значением, т.к. функция никак не сообщает о неудачном выполнении.
10h Установка одного регистра таблицы цветов (регистра ЦАП)
необходима VGA-совместимая видеокарточка
BX = номер регистра таблицы цветов (0-255);
DH = интенсивность красного цвета (6 бит);
CH = интенсивность зеленого цвета (6 бит);
CL = интенсивность синего цвета (6 бит).
12h Установка нескольких регистров таблицы цветов (регистров ЦАП)
необходима VGA-совместимая видеокарточка
BX = номер первого регистра таблицы цветов (0-255);
CX = число устанавливаемых регистров (1-256);
ES:DX - адрес записываемых данных. должен содержать cx блоков по три байта, где старший байт - интенсивность красного цвета, средний - залёного, младший - синего.
13h Выбор подмножества цветов
необходима VGA-совместимая видеокарточка
BL = 0 выбор режима:
BH = 0 : 4 подмножества из 64 цветов;
BH = 1 : 16 подмножеств из 16 цветов;
BL = 1 выбор активного подмножества:
BH = номер подмножества (0-4 или 0-15, в зависимости от установок, сделанных с помощью BL=0).
Примечание:
Функция не поддерживается в видеорежимах с номером 13h или больше.
15h Чтение регистра таблицы цветов (регистра ЦАП)
BL = номер читаемого регистра (0-255).
Выход:
DH = интенсивность красного цвета (6 бит);
CH = интенсивность зеленого цвета (6 бит);
CL = интенсивность синего цвета (6 бит);
Примечание:
необходима VGA-совместимая видеокарточка
На некоторых старых боисах функция изменяет значение регистра AX
17h Чтение нескольких регистров таблицы цветов (регистров ЦАП)
BL = номер первого регистра таблицы цветов (0-255);цы цветов (0-255);
CX = число считываемых регистров (ES:DX - адрес таблицы цветов (CX блоков по 3 байта);
Выход:
Данные в таблице по адресу ES:DX.
Примечание
необходима VGA-совместимая видеокарточка
Таблица цветов содержит по три байта на один регистр таблицы цветов. В каждом байте значащимии являются только младшие 6 бит. Старший байт - интенсивность красного цвета, средний - залёного, младший - синего.
18h Установить PEL-маску
необходима VGA-совместимая видеокарточка
BL = Новое значение PEL
19h Читать PEL-маску
необходима VGA-совместимая видеокарточка
BL = Значение PEL BL = Значение PEL
1Ah Определение режима подмножества цветов
необходима VGA-совместимая видеокарточка
Выход:
BL = 0 - используются 4 цветовых подмножества по 64 цвета;
1 - используются 16 цветовых подмножеств по 16 цветов;
BH - номер подмножества, используемого в данный момент.
1Bh Установка палитры из градаций серого цвета
необходима VGA-совместимая видеокарточка
BX = номер первого регистра таблицы цветов (0-255);цы цветов (0-255);
CX = число модифицируемых регистров (1-256).
Примечание:
Регистр палитры:
биты 7 и 6 не используются
используемые биты:
5 - r
4 - g
3 - b
2 - R
2 - G
0 - B
По некоторым сведениям, эта функция разрушает содержимое регистров si, di, bp, sp, bx, ax. Так что при ее использовании следует соблюдать осторожность и в случае ошибок сохранять и затем восстанавливать упомянутые регистры
Документация на PhoenixBios (rev 6) не описывает эту функцию. возможно, она не поддерживается
https://ru.wikipedia.org/wiki/Program_Segment_Prefix
http://neurofox.ru/help/dosmz
https://www.old-games.ru/game/2304.html
dosbox debugger https://www.vogons.org/viewtopic.php?f=39&t=3944