Rev 1383 | Blame | Compare with Previous | Last modification | View Log | Download
пройдены тесты 186:addbitwise: лишнее 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.cmpnegcontroljmpmovпровалены тесты:bcdconv: все флаги неверны, +2e неверный результат daa 5496 вм. 5490 (где-то неправильный AF?)datatrnf c1: pop %cx (non-standard)div: все флаги неверны, +0x10 0000 вм ffff:mov dx,0ffffhmov ax,0ffffhmov cx,01hmov word[bp],02hdiv cx ;ffff ffff/0001add bp,02hmov word[12],axmov word[14],cxmov word[16],dx <----+0x14 8000 вм ffff:mov dx,0ffffhmov ax,0ffffhmov word[18],0ffffhmov word[bp],04hdiv word[18] ;ffff ffff/ffffadd bp,02hmov word[20],axmov word[22],dxpara512: на старте рисует поверх всего экрана кучу блоков размером 256*65536 - так и надо? пока костыль для rep stosb 65536=0cgademo: небольшое затирание надписи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) и хранить пересчитанный PCSS всегда включать в другое конкретное окно (8000) (sp не пересчитан для единообразия, но после его изменения надо encodeSP)третье окно (c000) под данныекак адресовать память по ?s:de = (?s*16 + de)/16384 и mod 16384:?s*16 сразу хранить как 24 бита (для всех ?s)int 10hah=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 register12h color plane enable register (bits 3-0 enable corresponding text attribute bit)13h horizontal PEL panning register14h color select register1 Установить регистр рамки.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. подробнее в подфункции 08 Чтение регистра цвета рамкинеобходима 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-совместимая видеокарточкаНа некоторых старых боисах функция изменяет значение регистра AX17h Чтение нескольких регистров таблицы цветов (регистров ЦАП)BL = номер первого регистра таблицы цветов (0-255);цы цветов (0-255);CX = число считываемых регистров (ES:DX - адрес таблицы цветов (CX блоков по 3 байта);Выход:Данные в таблице по адресу ES:DX.Примечаниенеобходима VGA-совместимая видеокарточкаТаблица цветов содержит по три байта на один регистр таблицы цветов. В каждом байте значащимии являются только младшие 6 бит. Старший байт - интенсивность красного цвета, средний - залёного, младший - синего.18h Установить PEL-маскунеобходима VGA-совместимая видеокарточкаBL = Новое значение PEL19h Читать PEL-маскунеобходима VGA-совместимая видеокарточкаBL = Значение PEL BL = Значение PEL1Ah Определение режима подмножества цветовнеобходима VGA-совместимая видеокарточкаВыход:BL = 0 - используются 4 цветовых подмножества по 64 цвета;1 - используются 16 цветовых подмножеств по 16 цветов;BH - номер подмножества, используемого в данный момент.1Bh Установка палитры из градаций серого цветанеобходима VGA-совместимая видеокарточкаBX = номер первого регистра таблицы цветов (0-255);цы цветов (0-255);CX = число модифицируемых регистров (1-256).Примечание:Регистр палитры:биты 7 и 6 не используютсяиспользуемые биты:5 - r4 - g3 - b2 - R2 - G0 - BПо некоторым сведениям, эта функция разрушает содержимое регистров si, di, bp, sp, bx, ax. Так что при ее использовании следует соблюдать осторожность и в случае ошибок сохранять и затем восстанавливать упомянутые регистрыДокументация на PhoenixBios (rev 6) не описывает эту функцию. возможно, она не поддерживаетсяhttps://ru.wikipedia.org/wiki/Program_Segment_Prefixhttp://neurofox.ru/help/dosmzhttps://www.old-games.ru/game/2304.htmldosbox debugger https://www.vogons.org/viewtopic.php?f=39&t=3944