SAS Emulator. ВихКод. FASM
Тема "SAS Emulator (эмулятор «ПК-01 Львов»)" на форумі kolibrios.org
http://board.kolibrios.org/viewtopic.php?t=3253
SOURCE_EMUL.7z
http://board.kolibrios.org/download/file.php?id=7740
Середовище програмування MADL |
Привет, Гость! Войдите или зарегистрируйтесь.
Вы здесь » Середовище програмування MADL » КР-580 » SAS Emulator. ВихКод. FASM
SAS Emulator. ВихКод. FASM
Тема "SAS Emulator (эмулятор «ПК-01 Львов»)" на форумі kolibrios.org
http://board.kolibrios.org/viewtopic.php?t=3253
SOURCE_EMUL.7z
http://board.kolibrios.org/download/file.php?id=7740
Main.asm
use32 ; включить 32-битный режим ассемблера
org 0x0 ; адресация с нуля
db 'MENUET01' ; 8-байтный идентификатор MenuetOS
dd 0x01 ; версия заголовка (всегда 1)
dd START ; адрес первой команды
dd I_END ; размер программы
dd 1700000;1693100;1700000;1677721;2097152;0x200000;0x1000000 ; количество памяти
dd 1700000;1693100;1677721;2097152;0x200000;0x1000000 ; адрес вершины стэка
dd 0x0 ; адрес буфера для параметров
dd 0x0 ; зарезервировано
include 'uLVComp.asm'
include 'uKeyBoard.asm'
include 'uMem.asm'
include 'uDrawScreen.asm'
include 'ui8080.asm'
include 'MACROS.INC'
include 'Main2.asm'
include 'scancodeLV.asm'
;---------------------------------------------------------------------
EmulEngineTimer0: ; основной движок без таймера
mov eax,[opcodes_to_run]
mov [i8080_do_opcodes_nb_cycles],eax
call i8080_do_opcodes
call draw_screen
ret
EmulEngineTimer1:
; для KOS 2 место;
; Extr_KlbrInWin.bat Нормально! 2 место
;QEMU - завал полный
Call EmulEngineTimer0
call Timer1
ret
EmulEngineTimer2:
; для KOS 2 грузит проц не годится;
; Extr_KlbrInWin.bat немного грузит проце 3 место
; QEMU - нормально
Call Timer2
mov eax,[Timer2_result]
Cmp eax, [PlatoonTimer2T]
jb EmulEngineTimer2_ret
call PlatoonTimer2 ; взвод таймера
Call EmulEngineTimer0
EmulEngineTimer2_ret:
ret
EmulEngineTimer3:
; ; для KOS 1 место;
;Extr_KlbrInWin.bat 1 место
;QEMU - завал полный
Call EmulEngineTimer0
call Timer3
ret
START:
Call INITmain ; инициализация всего
;mov [rgPC],$0000c000 ; rgPC:=$C000;
CycleProgram: ; метка цикла программы:
call CycleProcesEvents ; ЦИКЛ ОБРАБОТКИ СОБЫТИЙ
cmp [fPause],0
jnz CycleProgram_m1; ПАУЗА
;_case_TimerNumber_of:
mov eax,[TimerNumber]
Call dword [eax*4+TimerAdrs]
CycleProgram_m2:
;mov dword [@FLagExit],1 ; в случает когда нужен будет выход
cmp byte [@FLagExit],0
jz CycleProgram ;
mov EAX, -1 ; иначе конец программы
jmp CycleProgram
; ПАУЗА
CycleProgram_m1:
; перерисовка экрана
inc dword [CountPause]
cmp [CountPause],50;25
Jnz p_m1
call draw_screen
mov [CountPause],0
p_m1:
; цвет меняем
add [ColorPause],1234567
and [ColorPause],$FFFFFF
mov ebx,[WindowSizeX]
shr ebx,1
shl ebx,16
mov eax,[WindowSizeY]
shr eax,1
add ebx,eax ;15*65536+10
mov ecx, [ColorPause]
mov edx, textPause
mov esi, 8
mov eax, 4
mcall
call Timer3
jmp CycleProgram_m2;
textPause db 'Pause...',0
I_END: ; метка конца программы
ColorPause dd 0
CountPause dd 0
;!!!!!!!! Чтобы место не занимал
VideoDirtyM rb 16385
ImageData rd (256*3 * 256 * 2) ; сюда рисовать перед выводом на экран
kbd_baseM rb 9; // массивы опроса клавиатуры
kbd_extM rb 5;//=(1,2,3,4,5);
;;{ДЛЯ i8080_do_opcodes }
tmp3 rd 1
tmp2 rd 1
tmp1 rd 1
opcode rd 1
clock rd 1
i8080_do_opcodes_nb_cycles rd 1
m28m_Result rd 1
m29m_Result rd 1
m30m_Result rd 1
m36m_a rd 1
m37m_a rd 1
m38m_Result rd 1
m39m_Result rd 1
m40m_a rd 1
m41m_a rd 1
m42m_a rd 1
m43m_a rd 1
m44m_a rd 1
m46m_Result rd 1
m53m_Result rd 1
m54m_Result rd 1
m55m_Result rd 1
m57m_Result rd 1
m58m_Result rd 1
m59m_Result rd 1
m60m_Result rd 1
m61m_a rd 1
m62m_a rd 1
m63m_a rd 1
m64m_a rd 1
m67m_a rd 1
mD7m_a rd 1
m70m_a rd 1
m73m_a rd 1
m71m_a rd 1
m79m_Result rd 1
m84m_a rd 1
m85m_a rd 1
m86m_a rd 1
m87m_a rd 1
m88m_a rd 1
m89m_a rd 1
m90m_a rd 1
m91m_a rd 1
m92m_a rd 1
mA1m_Result rd 1
mA5m_a rd 1
mA6m_a rd 1
mB4m_a1 rd 1
mB4m_a2 rd 1
mB6m_a rd 1
mB7m_a rd 1
mB8m_Result rd 1
mB9m_Result rd 1
adrs rd 256 ;= Таблица Case of opcode
TableGraphicsMode rd 3 ;
TableDrawScreenPR rd 3
TableKeyDop rd 256
TableKeyOsnEngl rd 256
TableKeyOsnRus rd 256
TableMy_col2 rd 4
TableSupCol2 rd 5
WindowSizeX rd 1 ; размеры окна
WindowSizeY rd 1 ; размеры окнаMain2.asm
titleE: db 'Games in SAS emulator 1.0 beta',0
@FLagExit: rd 1; // флаг выхода из программы (заглушка для выхода)
macro INT0x40 { int 0x40 }
CycleProcesEvents: ; ЦИКЛ ОБРАБОТКИ СОБЫТИЙ
Mov eax, 11 ;Функция 11 - проверить, есть ли событие, без ожидания. =======
INT0x40
cmp eax,0
je CycleProcesEvents_ret
; mcall 10 ; функция 10 - ждать события
cmp eax,1 ; перерисовать окно ?
je DrawWindow ; перерисовать окно
cmp eax,2 ; нажата клавиша ?
je key ; если да - на key
cmp eax,3 ; нажата кнопка ?
je button ; если да - на button
CycleProcesEvents_ret: ret
;--- ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА ----------------------------------
DrawWindow:
mov EAX, 12
mov EBX, 1
INT0x40;
mov EAX, 0
mov EBX, (10*65536+10) ;(10*65536+(257*3)+10) ; горизонтально
add EBX,[WindowSizeX]
mov ECX, (10*65536+27);(10*65536+(257*2)+27) ; вертикально
add ECX,[WindowSizeY]
mov EDX, 0x34000000;$33AABBCC
mov edi, titleE
INT0x40;
mov EAX, 12
mov EBX, 2
INT0x40;
jmp CycleProcesEvents ; выходим из процедуры
;---------------------------------------------------------------------
key: ; нажата клавиша на клавиатуре
call KeyProcess2
jmp CycleProcesEvents
;---------------------------------------------------------------------
button:
mov EAX, 17 ; mcall 17 ; 17 - получить идентификатор нажатой кнопки
INT0x40;
;GetEAX
cmp ah, 1 ; если НЕ нажата кнопка с номером 1,
jne CycleProcesEvents ; вернуться
.exit:
Mov EAX, -1 ; mcall -1 ; иначе конец программы
INT0x40;
;---------------------------------------------------------------------
TimerAdrs rd 3
init_table_in_TimerAdrs:
call init_WindowSize
mov[TimerAdrs+(4*0)],EmulEngineTimer0
mov[TimerAdrs+(4*1)],EmulEngineTimer1
mov[TimerAdrs+(4*2)],EmulEngineTimer2
mov[TimerAdrs+(4*3)],EmulEngineTimer3
ret
init_WindowSize: ; установка окну соответ граф режима
mov eax,[GraphicsMode]; dd 2 ; графический режим 0- 256х256 ; 1 -512х512 2- 768х512
Cmp eax,0
jnz init_WindowSize_m1
mov[WindowSizeX],256
mov[WindowSizeY],256
ret
init_WindowSize_m1:
Cmp eax,1
jnz init_WindowSize_m2
mov[WindowSizeX],512
mov[WindowSizeY],512
ret
init_WindowSize_m2:
Cmp eax,2
jnz init_WindowSize_ret
mov[WindowSizeX],768
mov[WindowSizeY],512
init_WindowSize_ret: ret
INITmain: ; инициализация всего
mov dword [@FLagExit],0
call fillcharVideoDirty;
;call uVIDEOinit
call init_table_in_case_opcode
call KeyBoardInit
call init_table_in_TimerAdrs
call PlatoonTimer2
call TableGraphicsModeINIT
call TableKeyDopINIT
ret
;---------------------------------------------------------------------
Timer1:
mov eax, 23 ; - номер функции
mov ebx, [TimerDelay];ebx = таймаут (в сотых долях секунды)
INT0x40;
ret
;---------------------------------------------------------------------
Timer2_result rd 1
Timer2:
mov eax,26
mov ebx,9
int 0x40
mov [Timer2_result],eax ;= число сотых долей секунды, прошедших с момента
ret
PlatoonTimer2T rd 1
PlatoonTimer2: ; взвод таймера (для блока комманд)
Call Timer2;
mov eax,[Timer2_result]
add eax,[TimerDelay]
mov [PlatoonTimer2T],eax
ret
;---------------------------------------------------------------------
Timer3:
mov eax, 26 ; Функция 26, подфункция 9 - получить значение счётчика времени.
mov ebx, 9 ;
mcall ;int 40 Возвращаемое значение: * eax = число сотых долей секунды, прошедших с момента запуска системы
mov ebx, eax
shr ebx,1
inc ebx
shl ebx,1 ; ebx = время в сотых долях секунды
sub ebx,eax ; eax = 5 - номер функции
mov eax,5 ; Функция 5 - пауза
mcall;int 40
retscancodeLV.asm
; запускасть ScanCodeKey
;Результат обработки в
ScanCodeKey1 rd 1 ; "Чистый" код
ScanCodeKey2 rd 1 ; обработаный код (-128 если больше 128)
ScanCodeKeyUD rd 1 ; если 0 - отжата, если 1 -нажата
ScanCodeKeyExt rd 1 ; 0- обычный код; 1 - доп ext (224); 2 - доп2 ext2 (225)
ScanCodeKeyUnitedCode rd 1 ; "единый" код
ScanCodeKey_int40_2dop:
mov eax,2
mcall
shr eax,8 ; scancode
and eax,0xff
ret
ScanCodeKey_int40_2dop2:
Mov eax, 11 ;Функция 11 - проверить, есть ли событие, без ожидания. =======
INT 0x40
cmp eax,2
jne ScanCodeKey_int40_2dop2_ret
call ScanCodeKey_int40_2dop
ScanCodeKey_int40_2dop2_ret:ret
ScanCodeKey: ; START ScanCode
call ScanCodeKey_int40_2dop
cmp eax,224 ; если доп код....
jne ScanCode_cmp_225; если не равно нулю
mov [ScanCodeKeyExt],1
mov [ScanCodeKey1],0
; call ScanCodeKey_int40_2dop; .... опросить клаву еще раз
;call ScanCodeKey_int40_2dop2
JMP ScanCode_m2;ScanCode_m2
ScanCode_cmp_225:
cmp eax,225 ; если доп2 код....
jne ScanCode_m1; если не равно нулю
mov [ScanCodeKeyExt],2
mov [ScanCodeKey1],0
;call ScanCodeKey_int40_2dop; .... опросить клаву еще раз
;call ScanCodeKey_int40_2dop2
jmp ScanCode_m2
ScanCode_m1:
;mov [ScanCodeKeyExt],0
; САМА кодировка
ScanCode_m2:
;mov [ScanCodeKeyExt],0
mov[ScanCodeKey1], eax ; "Чистый" код
; Клавиша нажата DOWN
mov[ScanCodeKeyUD],1 ; если 0 - отжата, если 1 -нажата
cmp eax,128
jb no_up
; Клавиша отжата секция UP
mov[ScanCodeKeyUD],0 ; если 0 - отжата, если 1 -нажата
no_up:
mov ebx,eax
and ebx,0x7f
mov [ScanCodeKey2],ebx ; обработаный код (-128 если больше 128)
; "единый" код
mov eax,[ScanCodeKeyExt]
shl eax,8
add eax,ebx
mov[ScanCodeKeyUnitedCode],eax
ScanCodeKey_ret: retuDrawScreen.asm
;// Модуль вывода на экран
macro INT0x40 { int 0x40 }
;==============================
TableMy_col2INIT:
mov eax,[LVColBlack]
mov[TableMy_col2+(4*0)],eax
mov eax,[LVColLime]
mov[TableMy_col2+(4*1)],eax
mov eax,[LVColBlue]
mov[TableMy_col2+(4*2)],eax
mov eax,[LVColRed]
mov[TableMy_col2+(4*3)],eax
ret
;=================================
TableSupCol2INIT:
mov[TableSupCol2+(4*0)],SupCol2_ret
mov[TableSupCol2+(4*1)],SupCol2_m1
mov[TableSupCol2+(4*2)],SupCol2_m2
mov[TableSupCol2+(4*3)],SupCol2_m3
mov[TableSupCol2+(4*4)],SupCol2_m4
ret
;===============================
TableGraphicsModeINIT:
call TableMy_col2INIT
call TableSupCol2INIT
mov[TableGraphicsMode+(4*0)],PutPixel256_256
mov[TableGraphicsMode+(4*1)],PutPixel512_512
mov[TableGraphicsMode+(4*2)],PutPixel768_512
mov[TableDrawScreenPR+(4*0)],draw_screen256_256
mov[TableDrawScreenPR+(4*1)],draw_screen512_512
mov[TableDrawScreenPR+(4*2)],draw_screen768_512
ret
; ставит точку в массиве ImageData
; вывод пикселя на экран (в ImageData )
PutPixel_x: rd 1
PutPixel_y rd 1
PutPixel_color rd 1
;===========================================
PutPixel256_256:
mov eax, [PutPixel_x]
mov ebx ,[PutPixel_y]
mov ecx ,[PutPixel_color]
imul ebx, 256 * 4
mov [ImageData+eax*4+ebx], ecx
ret
;===========================================
PutPixel512_512:
mov eax, [PutPixel_x]
mov ebx ,[PutPixel_y]
mov ecx ,[PutPixel_color]
imul eax,2
imul ebx, 512 * 4
imul ebx,2 ;
mov [ImageData+eax*4+ebx], ecx; основная
add eax,1
mov [ImageData+eax*4+ebx], ecx; x+1
;============
add ebx,512*4
mov [ImageData+eax*4+ebx], ecx;
sub eax,1
mov [ImageData+eax*4+ebx], ecx;
ret
;===========================================
PutPixel768_512:
mov eax, [PutPixel_x]
mov ebx ,[PutPixel_y]
mov ecx ,[PutPixel_color]
imul eax,3
imul ebx, 768 * 4
imul ebx,2 ;
mov [ImageData+eax*4+ebx], ecx; основная
add eax,1
mov [ImageData+eax*4+ebx], ecx; x+1
add eax,1
mov [ImageData+eax*4+ebx], ecx; x+2
;============
add ebx,768*4
mov [ImageData+eax*4+ebx], ecx;
sub eax,1
mov [ImageData+eax*4+ebx], ecx;
sub eax,1
mov [ImageData+eax*4+ebx], ecx;
ret
;===========================================
; рисует массив ImageData на экран; вызывать с какой-нибудь периодичностью
draw_screen256_256:;DrawImageData:
mov eax, 65
mov ebx, ImageData
mov ecx, 256 * 65536 + 256
mov edx, 0;CanvasX * 65536 + CanvasY
mov esi, 32
xor ebp, ebp
int 0x40
ret
;=======================
draw_screen512_512:;DrawImageData:
mov eax, 65
mov ebx, ImageData
mov ecx, 512 * 65536 + 512
mov edx, 0;CanvasX * 65536 + CanvasY
mov esi, 32
xor ebp, ebp
int 0x40
ret
;=======================
draw_screen768_512:;DrawImageData:
mov eax, 65
mov ebx, ImageData
mov ecx, 768 * 65536 + 512
mov edx, 0;CanvasX * 65536 + CanvasY
mov esi, 32
xor ebp, ebp
int 0x40
ret
;=======================
PutPixel: ; процедура выбора режима экрана
mov eax,[GraphicsMode]
Call dword [eax*4+TableGraphicsMode]
ret
ret
;=======================
col_index_port rd 1
col_index_color rd 1
col_index_result rd 1
col_index:
;917: port:=col_index_port; color:=col_index_color;
mov eax,[col_index_port]
mov ecx,[col_index_color]
;918: Result_:=LVColBlack;
mov edx,[LVColBlack]
;919: if ((port and $40)<>0) then Result_:= (Result_ xor LVColBlue);
test al,$40
jz col_index_m1
xor edx,[LVColBlue]
;920: if ((port and $20)<>0) then Result_:= (Result_ xor LVColLime);
col_index_m1: test al,$20
jz col_index_m2
xor edx,[LVColLime]
;921: if ((port and $10)<>0) then Result_:= (Result_ xor LVColRed);
col_index_m2: test al,$10
jz col_index_m3
xor edx,[LVColRed]
;923: if color = LVColBlack then
col_index_m3: cmp ecx,[LVColBlack]
jnz col_index_m4
;925: if ((port and $08)=0) then
test al,$08
jnz col_index_m5
;926: begin Result_:= (Result_ xor LVColRed); end;
xor edx,[LVColRed]
;927: if ((port and $04)=0) then
col_index_m5: test al,$04
jnz col_index_ret
;928: begin Result_:= (Result_ xor LVColBlue); end;
xor edx,[LVColBlue]
jmp col_index_ret
;930: if color = LVColLime then begin Result_:= (Result_ xor LVColLime); end else
col_index_m4: cmp ecx,[LVColLime]
jnz col_index_m7
xor edx,[LVColLime]
jmp col_index_ret
;931: if color = LVColRed then begin Result_:= (Result_ xor LVColRed);
col_index_m7: cmp ecx,[LVColRed]
jnz col_index_m8
xor edx,[LVColRed]
;uMainDA.pas.932: if ((port and $02)=0) then
test al,$02
jnz col_index_ret
;uMainDA.pas.933: begin Result_:= (Result_ xor LVColLime); end; end else
xor edx,[LVColLime]
jmp col_index_ret
;934: if color = LVColBlue then begin Result_:= (Result_ xor LVColBlue);
col_index_m8: cmp ecx,[LVColBlue]
jnz col_index_ret
xor edx,[LVColBlue]
;935: if ((port and $01)=0) then
test al,$01
jnz col_index_ret
;936: begin Result_:= (Result_ xor LVColRed); end; end;
xor edx,[LVColRed]
;938: col_index_result:=result_;
col_index_ret: mov [col_index_result],edx
;;//uMainDA.pas.940: end;
ret
;======================================================
SupCol2_c1 rd 1
SupCol2_b rd 1
SupCol2_x rd 1
SupCol2_Result rd 1
SupCol2:
;//1026: begin
push ebx
push esi
; mov ebx,eax
;//1028: c1:=SupCol2_c1; b:=SupCol2_b; x:=SupCol2_x; pix:=0;
mov ecx,[SupCol2_c1]
mov edx,[SupCol2_b]
mov esi,[SupCol2_x]
xor eax,eax
;//1029: case x of (esi)
jmp dword [esi*4+TableSupCol2]
;//1031: if (b and 128)=128 then pix:=pix+1;
SupCol2_m1: mov esi,edx
and esi,$00000080
cmp esi,$00000080
jnz SupCol2_m5
inc eax
;//1032: if (b and 8)=8 then pix:=pix+2;
SupCol2_m5: and edx,$08
cmp edx,$08
jnz SupCol2_ret2
add eax,$02
jmp SupCol2_ret2
;//1035: if (b and 64)=64 then pix:=pix+1;
SupCol2_m2: mov esi,edx
and esi,$40
cmp esi,$40
jnz SupCol2_m6
inc eax
;//1036: if (b and 4)=4 then pix:=pix+2;
SupCol2_m6: and edx,$04
cmp edx,$04
jnz SupCol2_ret2
add eax,$02
jmp SupCol2_ret2
;//1039: if (b and 32)=32 then pix:=pix+1;
SupCol2_m3: mov esi,edx
and esi,$20
cmp esi,$20
jnz SupCol2_m7
inc eax
;//1040: if (b and 2)=2 then pix:=pix+2;
SupCol2_m7: and edx,$02
cmp edx,$02
jnz SupCol2_ret2
add eax,$02
jmp SupCol2_ret2
;//1043: if (b and 16)=16 then pix:=pix+1;
SupCol2_m4: mov esi,edx
and esi,$10
cmp esi,$10
jnz SupCol2_m8
inc eax
;//1044: if (b and 1)=1 then pix:=pix+2;
SupCol2_m8: and edx,$01
cmp edx,$01
jnz SupCol2_ret2
add eax,$02
;//1047: col_index_port:=c1;
SupCol2_ret2:
mov [col_index_port],ecx
;//1048: My_Col_inp:=pix;My_Col2;
;//1049: col_index_color:=My_col_result;
mov eax,[eax*4+TableMy_col2]; ; call My_col2
mov [col_index_color],eax
;//1050: col_index;SupCol2_Result:=col_index_result;
call col_index
mov eax,[col_index_result]
mov [SupCol2_Result],eax
;//1052: end;
SupCol2_ret: pop esi
pop ebx
ret
;================
draw_screen2_i:rd 1 ; // Передача параметров на экран
draw_screen2:; //Рисуем с video на экран (Форму)
; push ebx
; push esi
; push edi
; mov ebx,eax
;//1139: vertX:= (draw_screen2_i mod 64)*4; gorY:=(draw_screen2_i div 64)*1;
mov eax,[draw_screen2_i]
and eax,$3f
mov esi,eax
shl esi,$02
mov eax,[draw_screen2_i]
shr eax,$06
mov edi,eax
;//1140: Rports_a:=$C1;Rports;
;//1141: SupCol2_c1:=Rports_result;Rvideo_a:=draw_screen2_i;Rvideo;
xor edx,edx
mov dl,[portsM+$c1]
mov [SupCol2_c1],edx
;//1142: SupCol2_b:=Rvideo_result; SupCol2_x:=1;SupCol2;
mov edx,[draw_screen2_i]
xor ebx,ebx
mov bl,[videoM+edx]
mov [SupCol2_b],ebx
mov [SupCol2_x],$00000001
mov eax,ebx
call SupCol2
;//1143: PutPixel_x:=vertX;PutPixel_y:=gorY;PutPixel_color:= SupCol2_Result;PutPixel;{PutPixe2;}
mov [PutPixel_x],esi
mov [PutPixel_y],edi
mov eax,[SupCol2_Result]
mov [PutPixel_color],eax
mov eax,ebx
call PutPixel
;///1145: SupCol2_x:=2;SupCol2;
mov [SupCol2_x],$00000002
mov eax,ebx
call SupCol2
;//1146: PutPixel_x:=vertX+1;PutPixel_y:=gorY;PutPixel_color:= SupCol2_Result;PutPixel;
lea eax,[esi+$01]
mov [PutPixel_x],eax
mov [PutPixel_y],edi
mov eax,[SupCol2_Result]
mov [PutPixel_color],eax
mov eax,ebx
call PutPixel
;//1148: SupCol2_x:=3;SupCol2;
mov [SupCol2_x],$00000003
mov eax,ebx
call SupCol2
;//1149: PutPixel_x:=vertX+2;PutPixel_y:=gorY;PutPixel_color:= SupCol2_Result;PutPixel;
lea eax,[esi+$02]
mov [PutPixel_x],eax
mov [PutPixel_y],edi
mov eax,[SupCol2_Result]
mov [PutPixel_color],eax
mov eax,ebx
call PutPixel
;//1151: SupCol2_x:=4;SupCol2;
mov [SupCol2_x],$00000004
mov eax,ebx
call SupCol2
;//1152: PutPixel_x:=vertX+3;PutPixel_y:=gorY;PutPixel_color:= SupCol2_Result;PutPixel;
add esi,$03
mov [PutPixel_x],esi
mov [PutPixel_y],edi
mov eax,[SupCol2_Result]
mov [PutPixel_color],eax
mov eax,ebx
call PutPixel
;//uMainDA.pas.1153: end;
; pop edi
; pop esi
; pop ebx
ret
;============================
draw_screen01_i rd 1
draw_screen01: ;{draw_screen:}
push ebx
;//1227: draw_screen2_i:=draw_screen01_i; draw_screen2; // передача параметров для вывода на экран
mov eax,[draw_screen01_i]
mov [draw_screen2_i],eax
call draw_screen2
;//1228: Rvideo_a:=draw_screen01_i;Rvideo;
mov edx,[draw_screen01_i]
xor ebx,ebx
mov bl,[videoM+edx]
;//1229: WVideoDirty_a:=draw_screen01_i; WVideoDirty_b:=Rvideo_Result;WVideoDirty;
mov eax,[draw_screen01_i]
mov [eax+VideoDirtyM],bl ; call WVideoDirty
pop ebx
ret
;==============
draw_screen:
;//1261: begin;///1263: for i:=0 to $3fff do begin
xor ebx,ebx
;//1265: Rvideo_a:=i;Rvideo;
draw_screen_m2:
;//1266: RVideoDirty_a:=i;RVideoDirty;
xor ecx,ecx
mov cl,[VideoDirtyM+ebx]
xor eax,eax
mov al,[videoM+ebx]
;//1267: if Rvideo_Result<>RVideoDirty_Result then //сравниваем значения , а есть ли изменения
cmp eax,ecx;[RVideoDirty_result]
jz draw_screen_m1
;//1269: draw_screen01_i:=i; draw_screen01;
mov [draw_screen01_i],ebx
call draw_screen01
;//1271: end;
draw_screen_m1: inc ebx
;//1263: for i:=0 to $3fff do begin
cmp ebx,$00004000
jnz draw_screen_m2
;//1272: draw_screen1; // реальный вывод на экран
mov eax,[GraphicsMode]
Call dword [eax*4+TableDrawScreenPR]
ret
;=======================================ui8080.asm Part1
;// модуль процессора (движка)
m01m:;begin{ tmp2:=tmp2+1} asm
inc dword [tmp2]
ret
;end; end;
m04m:; Begin {rgA:=(tmp2 and $FF);} asm
mov eax,[tmp2]
and eax,$000000ff
mov edx, rgA
mov [edx],eax
ret
;end;end;
m06m:; Begin {rgA:=tmp2;} asm
mov eax, rgA
mov edx,[tmp2]
mov [eax],edx
ret
;end; end;
m07m:;Begin {Rflags_a:=tmp2;Rflags; rgF:=(Rflags_result or (rgF and fC));} asm
; mov eax,[tmp2]
; mov [Rflags_a],eax
; call Rflags
mov edx,[tmp2]
xor ebx,ebx
mov bl,[flagsM+edx]
;mov [Rflags_result],ebx
mov eax, rgF
mov eax,[eax]
mov edx, fC
and eax,[edx]
or eax,ebx ;[Rflags_result]
mov edx, rgF
mov [edx],eax
ret
;end;end;
m08m:;Begin //Rflags_a:=(tmp2 and $FF);Rflags; rgF:=Rflags_result;
;asm
mov eax,[tmp2]
and eax,$000000ff
; mov [Rflags_a],eax
; call Rflags
xor edx,edx
mov dl,[flagsM+eax]
mov eax, rgF
; mov edx,[Rflags_result]
mov [eax],edx
ret
;end; end;
m09m:;begin //Rflags_a:=(tmp2);Rflags; rgF:=Rflags_result;
;asm
mov eax,[tmp2]
xor edx,edx
mov dl,[flagsM+eax]
mov eax, rgF
mov [eax],edx
ret
;end; end;
m10m:;begin //Rflags_a:=(0);Rflags; rgF:=Rflags_result;
;//!!!!!!!!!!!!!! Не проверена
;asm
xor edx,edx
mov dl,[flagsM]
mov [rgF],edx
ret
;end;end;
m11m:;begin //Rflags_a:=(rgA);Rflags; rgF:=(Rflags_result or (rgF and fA));
;asm
mov eax,[rgA]
xor ebx,ebx
mov bl,[flagsM+eax]
mov eax,[rgF]
and eax,[fA]
or eax,ebx
mov [rgF],eax
ret
;end; end;
m12m:;begin //rgF:=(rgF or fA);
;asm
mov eax, fA
mov eax,[eax]
mov edx, rgF
or [edx],eax
ret
;end;end;
m13m:;
;begin //rgF:=(rgF or fC);
;asm
mov eax, fC
mov eax,[eax]
mov edx, rgF
or [edx],eax
ret
;end;end;
жmD8m:;begin // rgPC:=(rgPC and $FFFF)
;asm
; mov eax, [rgPC]
; and eax,$0000ffff
; ret
;end;end;
m14m:;begin //rgPC:=rgPC+1; mD8m;
;asm
inc dword [rgPC]
;call mD8m
ret
;end;end;
m15m:;begin //rgPC:=rgPC+2; mD8m;
;asm
add dword [rgPC],$02
; call mD8m
ret
;end; end;
m02m:;begin //rgPC:=rgPC+3; mD8m;
;asm
add dword [rgPC],$03
;call mD8m
ret
;end; end;
m16m:;begin {clock:=clock+4;}
;asm
add dword [clock],$04
;call mD8m
ret
;end;end;
m17m:;begin {clock:=clock+7;}
;asm
add dword [clock],7
;call mD8m
ret
;end;end;
m18m:;begin {clock:=clock+5;}
;asm
add dword [clock],5
;call mD8m
ret
;end;end;
m19m:;begin {clock:=clock+10;}
;asm
add dword [clock],10
;call mD8m
ret
;end;end;
m20m:;begin {clock:=clock+11;}
;asm
add dword [clock],11
;call mD8m
ret
;end;end;
m21m:;begin {clock:=clock+13;}
;asm
add dword [clock],13
;call mD8m
ret
;end;end;
m22m:;begin {clock:=clock+16;}
;asm
add dword [clock],16
;call mD8m
ret
;end;end;
m23m:;begin {clock:=clock+17;}
;asm
add dword [clock],17
;call mD8m
ret
;end;end;
m24m:;label m24m_m1; begin {if ((rgF and fC)<>0) then m01m else tmp2:=tmp2+0;}
;asm
mov eax,[rgF]
and eax,[fC]
jz m24m_m1
call m01m
m24m_m1: ret
;//m24m_m1: add dword ptr [tmp2],$00
;// ret
;end;end;
m25m:;begin //m18m; m14m;end;
; asm
call m18m
call m14m
ret
;end; end;
m27m:;begin //m16m; m14m; end;
; asm
call m16m
call m14m
ret
;end; end;
m26m:;begin //m11m; m27m;end;
;asm
call m11m
call m27m
ret
;;end; end;
m28m:; begin //do_read_addr:=(rgPC+2);do_read; m28m_Result:=do_read_Result;
;asm
mov eax,[rgPC]
add eax,$02
mov [do_read_addr],eax
call do_read
mov eax, [do_read_result]
mov edx, m28m_Result
mov [edx],eax
ret
;end;end;
m29m:; begin //do_read_addr:=(rgPC+1);do_read; m29m_Result:=do_read_Result;
;asm
mov eax,[rgPC]
inc eax
mov [do_read_addr],eax
call do_read
mov eax,[do_read_result]
mov [m29m_Result],eax
ret
;end;end;
m30m:; begin //do_read2_a_lo:=rgL; do_read2_a_hi:=rgH; do_read2; m30m_Result:=do_read2_result;
;asm
mov eax,[rgL]
mov [do_read2_a_lo],eax
mov eax,[rgH]
mov [do_read2_a_hi],eax
call do_read2
mov eax,[do_read2_result]
mov [m30m_Result],eax
ret
;end;end;
m03m:;begin //m19m; m02m; end;
;asm
call m19m
call m02m
ret
;end; end;
m31m:;begin// m17m; m14m; end;
;asm
call m17m
call m14m
ret
;end; end;
m32m:;label m32m_ret;begin //if (tmp2>$FF) then m13m;
;asm
cmp [tmp2],$000000ff
jbe m32m_ret
call m13m
m32m_ret: ret
;end; end;
m33m:;begin //m17m; m15m; end;
;asm
call m17m
call m15m
ret
;end; end;
m34m:;begin //m19m; m14m; end;
;asm
call m19m
call m14m
ret
;end; end;
m05m:;Begin //m32m; m04m; m27m; end;
;asm
call m32m
call m04m
call m27m
ret
;end; end;
m35m:;Begin //m06m; m27m; end;
; asm
call m06m
call m27m
ret
;end; end;
m36m:; label m36m_ret; Begin //if (((tmp2 xor rgA xor m36m_a) and $10)<>0) then begin m12m;
;asm
mov eax,[tmp2]
xor eax,[rgA]
xor eax,[m36m_a]
test al,$10
jz m36m_ret
call m12m
m36m_ret: ret
;end; end;
m37m:; label m37m_m1, m37m_m2; begin
;//if ((rgF and fC)<>0) then tmp3:=1 else tmp3:=0;
;// tmp2:=(rgA-m37m_a-tmp3) and $FF;
;asm
mov eax,[rgF]
and eax,[fC]
jz m37m_m1
mov [tmp3],$00000001
jmp m37m_m2
m37m_m1: xor eax,eax
mov [tmp3],eax
m37m_m2: mov eax,[rgA]
sub eax,[m37m_a]
sub eax,[tmp3]
and eax,$000000ff
mov [tmp2],eax
ret
;end;end;
m38m:; begin //m30m;m38m_Result:=m30m_Result; m31m;
;asm
call m30m
mov eax,[m30m_Result]
mov [m38m_Result],eax
call m31m
ret
;end;end;
m39m:; begin //m29m;m39m_Result:=m29m_Result; m33m;
;asm
call m29m
mov eax,[m29m_Result]
mov [m39m_Result],eax
call m33m
ret
;end; end;
m40m:; label m40m_m1; begin
;//tmp2:=(rgA-m40m_a) and $FF; m09m; if (rgA<m40m_a) then begin m13m; end; m36m_a:=m40m_a;m36m; m35m; end;
;asm
mov eax,[rgA]
sub eax,[m40m_a]
and eax,$000000ff
mov [tmp2],eax
call m09m
mov eax,[rgA]
cmp eax,[m40m_a]
jnb m40m_m1
call m13m
m40m_m1: mov eax,[m40m_a]
mov [m36m_a],eax
call m36m
call m35m
ret
;end;end;
m41m:; label m41m_m1; begin //m37m_a:=m41m_a;m37m; m09m; if (rgA<(m41m_a+tmp3)) then begin m13m; end;
;//m36m_a:=m41m_a;m36m; m35m;end;
;asm
mov eax,[m41m_a]
mov [m37m_a],eax
call m37m
call m09m
mov eax,[m41m_a]
add eax,[tmp3]
cmp eax,[rgA]
jbe m41m_m1
call m13m
m41m_m1: mov eax,[m41m_a]
mov [m36m_a],eax
call m36m
call m35m
ret
;end;end;
m42m:; label m42m_ret; begin //if (((tmp2 xor m42m_a) and $10)<>0) then begin m12m; end; end;
;asm
mov eax,[tmp2]
xor eax,[m42m_a]
test al,$10
jz m42m_ret
call m12m
m42m_ret: ret
;end;end;
m43m:; begin// m07m; m42m_a:=m43m_a;m42m; e
;asm
call m07m
mov eax,[m43m_a]
mov [m42m_a],eax
call m42m
ret
;end;end;
m44m:; begin //do_write2_a_lo:=rgL;do_write2_a_hi:=rgH;do_write2_bt:=m44m_a; do_write2; end;
;asm
mov eax,[rgL]
mov [do_write2_a_lo],eax
mov eax,[rgH]
mov [do_write2_a_hi],eax
mov eax,[m44m_a]
mov [do_write2_bt],eax
call do_write2
ret
;end;end;
m46m:; begin //m28m;m29m;m46m_Result:=m29m_Result+(m28m_Result shl 8);
;asm
call m28m
call m29m
mov eax,[m28m_Result]
shl eax,$08
add eax,[m29m_Result]
mov [m46m_Result],eax
ret
;end;end;
m45m:; begin //m46m;rgPC:=m46m_Result; end;
;asm
call m46m
mov eax,[m46m_Result]
mov [rgPC],eax
ret
;end;end;
m47m:; begin //m29m;tmp1:=m29m_Result; end;
;asm
call m29m
mov eax,[m29m_Result]
mov [tmp1],eax
ret
;end;end;
m48m:; begin// m46m; tmp1:=m46m_Result; end;
;asm
call m46m
mov eax,[m46m_Result]
mov [tmp1],eax
ret
;end;end;
m49m:; begin //do_read_addr:=(rgSP);do_read; rgPC:=do_read_Result;end;
;asm
mov eax,[rgSP]
mov [do_read_addr],eax
call do_read
mov eax,[do_read_result]
mov [rgPC],eax
ret
;end;end;
m50m:; begin //rgSP:=(rgSP-2) and $FFFF;end;
;asm
mov eax,[rgSP]
sub eax,$02
and eax,$0000ffff
mov [rgSP],eax
ret
;end;end;
m51m:; begin //rgPC:=tmp1; m23m; end;
;asm
mov eax,[tmp1]
mov [rgPC],eax
call m23m
ret
;end;end;
m52m:; begin //m48m; m50m; m02m; end;
;asm
call m48m
call m50m
call m02m
ret
;end; end;
m53m:; label m53m_m1; Begin //if ((rgF and fS_)<>0) then
;//m53m_Result:=1 else m53m_Result:=0 end;
;asm
mov eax,[rgF]
and eax,[fS_]
jz m53m_m1
mov [m53m_Result],$00000001
ret
m53m_m1: xor eax,eax
mov [m53m_Result],eax
ret
;end;end;
m54m:; label m54m_m1; Begin //if ((rgF and fS_)=0) then m54m_Result:=1 else m54m_Result:=0; end;
;asm
mov eax,[rgF]
and eax,[fS_]
jnz m54m_m1
mov [m54m_Result],$00000001
ret
m54m_m1: xor eax,eax
mov [m54m_Result],eax
ret
;end;end;
m55m:; begin //m55m_Result:=(rgPC shr 8) and $FF; end;
;asm
mov eax,[rgPC]
shr eax,$08
and eax,$000000ff
mov [m55m_Result],eax
ret
;end;end;
m56m:; begin //do_write_addr:=rgSP; do_write_bt:=(rgPC and $FF);do_write; end;
;asm
mov eax,[rgSP]
mov [do_write_addr],eax
mov eax,[rgPC]
and eax,$000000ff
mov [do_write_bt],eax
call do_write
ret
;end;end;
m57m:; label m57m_m1;Begin //if ((rgF and fC)<>0) then m57m_Result:=1 else m57m_Result:=0; end;
;asm
mov eax,[rgF]
and eax,[fC]
jz m57m_m1
mov [m57m_Result],$00000001
ret
m57m_m1: xor eax,eax
mov [m57m_Result],eax
ret
;end;end;
m58m:; label m58m_m1; Begin //if ((rgF and fP)=0) then m58m_Result:=1 else m58m_Result:=0; end;
;asm
mov eax,[rgF]
and eax,[fP]
jnz m58m_m1
mov [m58m_Result],$00000001
ret
m58m_m1: xor eax,eax
mov [m58m_Result],eax
ret
; end; end;
m59m:; label m59m_m1;begin //if ((rgF and fC)=0) then m59m_Result:=1 else m59m_Result:=0; end;
; asm
mov eax,[rgF]
and eax,[fC]
jnz m59m_m1
mov [m59m_Result],$00000001
ret
m59m_m1: xor eax,eax
mov [m59m_Result],eax
ret
; end; end;
m60m:; label m60m_m1;Begin //if ((rgF and fZ)=0) then m60m_Result:=1 else m60m_Result:=0; end;
;asm
mov eax,[rgF]
and eax,[fZ]
jnz m60m_m1
mov [m60m_Result],$00000001
ret
m60m_m1: xor eax,eax
mov [m60m_Result],eax
ret
; end; end;
m61m:; begin //rgA:=rgA and m61m_a; end;
;asm
mov eax,[m61m_a]
and [rgA],eax
ret
; end; end;
m62m:; label m62m_m1; begin //if (rgA<m62m_a) then begin m13m; end; m36m_a:=m62m_a;m36m; m27m; end;
;asm
mov eax,[rgA]
cmp eax,[m62m_a]
jnb m62m_m1
call m13m
m62m_m1: mov eax,[m62m_a]
mov [m36m_a],eax
call m36m
call m27m
ret
; end; end;
m63m:; begin //tmp2:=(rgA-m63m_a) and $FF; m09m; m62m_a:=m63m_a; m62m;end;
;asm
mov eax,[rgA]
sub eax,[m63m_a]
and eax,$000000ff
mov [tmp2],eax
call m09m
mov eax,[m63m_a]
mov [m62m_a],eax
call m62m
ret
;end;end;
m64m:; begin //rgA:=(rgA or m64m_a);end;
;asm
mov eax,[m64m_a]
or [rgA],eax
ret
;end; end;
m65m:; begin //rgF:=rgF or fC; end;
;asm
mov eax,[fC]
or [rgF],eax
ret
;end; end;
m66m:; begin //rgSP:=(rgSP+2) and $FFFF;end;
;asm
mov eax,[rgSP]
add eax,$02
and eax,$0000ffff
mov [rgSP],eax
ret
;end;end;
m67m:; begin //rgA:=(rgA xor m67m_a);end;
;asm
mov eax,[m67m_a]
xor [rgA],eax
ret
;end;end;
m68m:; begin //m52m; m56m; do_write_addr:=(rgSP+1); m55m; do_write_bt:=m55m_Result;do_write; m51m; end;
;asm
call m52m
call m56m
mov eax,[rgSP]
inc eax
mov [do_write_addr],eax
call m55m
mov eax,[m55m_Result]
mov [do_write_bt],eax
call do_write
call m51m
ret
;end;end;
m69m:; begin //rgF:=(rgF and (not fC)); end;
;asm
mov eax,[fC]
not eax
and [rgF],eax
ret
;end;end;
mD7m:; begin //m08m; m36m_a:=mD7m_a;m36m; end;
;asm
call m08m
mov eax,[mD7m_a]
mov [m36m_a],eax
call m36m
ret
;end;end;
m70m:; begin //tmp2:=rgA+m70m_a; mD7m_a:=m70m_a;mD7m; m05m; end;
;asm
mov eax,[rgA]
add eax,[m70m_a]
mov [tmp2],eax
mov eax,[m70m_a]
mov [mD7m_a],eax
call mD7m
call m05m
ret
;end;end;
m73m:; begin // tmp2:=rgA+m73m_a; m24m; mD7m_a:=m73m_a; mD7m;end;
; asm
mov eax,[rgA]
add eax,[m73m_a]
mov [tmp2],eax
call m24m
mov eax,[m73m_a]
mov [mD7m_a],eax
call mD7m
ret
; end;end;
m71m:; begin //m73m_a:=m71m_a; m73m; m05m; end;
;asm
mov eax,[m71m_a]
mov [m73m_a],eax
call m73m
call m05m
ret
;end;end;
m74m:; begin //m30m;tmp1:=m30m_Result; end;
;asm
call m30m
mov eax,[m30m_Result]
mov [tmp1],eax
ret
;end;end;
m75m:; begin //tmp2:=(rgA-tmp1) and $FF; end;
;asm
mov eax,[rgA]
sub eax,[tmp1]
and eax,$000000ff
mov [tmp2],eax
ret
;end;end;
m76m:; label m76m_m1; begin //if (rgA<tmp1) then begin m65m; end; end;
;asm
mov eax,[rgA]
cmp eax,[tmp1]
jnb m76m_m1
call m65m
m76m_m1: ret
;end;end;
m77m:; begin //m45m; m19m; end;
;asm
call m45m
call m19m
ret
; end; end;
m78m:;//begin m20m; m02m; end;
;asm
call m20m
call m02m
ret
;end; end;
m79m:; label m79m_m1; Begin //if ((rgF and fP)<>0) then m79m_Result:=1 else m79m_Result:=0; end;
;asm
mov eax,[rgF]
and eax,[fP]
jz m79m_m1
mov [m79m_Result],$00000001
ret
m79m_m1: xor eax,eax
mov [m79m_Result],eax
ret
;end;end;
m80m:; begin //do_read_addr:=(rgSP+1);do_read;rgPC:=rgPC+ do_read_Result shl 8; end;
;asm
mov eax,[rgSP]
inc eax
mov [do_read_addr],eax
call do_read
mov eax,[do_read_result]
shl eax,$08
add [rgPC],eax
ret
;end;end;
m82m:; begin //m49m; m80m; m66m; m20m; end;
;asm
call m49m
call m80m
call m66m
call m20m
ret
;end; end;
m84m:; begin //rgB:=m84m_a; m25m; end;
;asm
mov [rgB],eax
call m25m
ret
;end;end;
m85m:; begin //tmp2:=(m85m_a and $FF); end;
;asm
and eax,$000000ff
mov [tmp2],eax
ret
;end;end;
m86m:; begin //rgC:=m86m_a; m25m; end;
;asm
mov [rgC],eax
call m25m
ret
;end;end;
m87m:; begin //rgD:=m87m_a; m25m; end;
;asm
mov [rgD],eax
call m25m
ret
;end;end;
m88m:; begin //rgE:=m88m_a; m25m; end;
;asm
mov [rgE],eax
call m25m
ret
;end;end;
m89m:; begin //rgH:=m89m_a; m25m; end;
;asm
mov [rgH],eax
call m25m
ret
;end;end;
m90m:; begin //rgL:=m90m_a; m25m; end;
;asm
mov [rgL],eax
call m25m
ret
;end;end;
m91m:; begin //m44m_a:=m91m_a; m44m; m31m; end;
;asm
mov eax,[m91m_a]
mov [m44m_a],eax
call m44m
call m31m
ret
;end;end;
m92m:; begin //rgA:=m92m_a; m25m; end;
;asm
mov [rgA],eax
call m25m
ret
;end;end;
m99m:; Begin //m06m; m25m; end;
;asm
call m06m
call m25m
ret
;end; end;
mA1m:; label mA1m_m1; Begin //if ((rgF and fZ)<>0) then mA1m_Result:=1 else mA1m_Result:=0 end;
;asm
mov eax,[rgF]
and eax,[fZ]
jz mA1m_m1
mov [mA1m_Result],$00000001
ret
mA1m_m1: xor edx,edx
mov [mA1m_Result],edx
ret
;end;end;
mA2m:; Begin //m32m; m04m; end;
; asm
call m32m
call m04m
ret
;end; end;
mA3m:; Begin //mA2m; m31m; end;
;asm
call mA2m
call m31m
ret
;end; end;
mA4m:; Begin //m11m; m31m; end;
;asm
call m11m
call m31m
ret
;end; end;
mA5m:; begin //m61m_a:=mA5m_a; m61m; m26m; end;
;asm
mov [m61m_a],eax
call m61m
call m26m
ret
;end;end;
mA6m:; begin //m67m_a:=mA6m_a; m67m; m26m; end;
;asm
mov eax,[mA6m_a]
mov [m67m_a],eax
call m67m
call m26m
ret
;end; end;
mA7m:; Begin //m50m; m14m; m56m; do_write_addr:=(rgSP+1); m55m; do_write_bt:=m55m_Result;do_write; end;
;asm
call m50m
call m14m
call m56m
mov eax,[rgSP]
inc eax
mov [do_write_addr],eax
call m55m
mov eax,[m55m_Result]
mov [do_write_bt],eax
call do_write
ret
;end;end;
mA8m:; Begin //do_write_addr:=(rgSP+1); m55m; do_write_bt:=m55m_Result;do_write; end;
;asm
mov eax,[rgSP]
inc eax
mov [do_write_addr],eax
call m55m
mov eax,[m55m_Result]
mov [do_write_bt],eax
call do_write
ret
;end;end;
mA9m:; Begin //m56m; mA8m; end;
;asm
call m56m
call mA8m
ret
;;end; end;
mB1m:; Begin //mA9m; m51m; end;
;asm
call mA9m
call m51m
ret
;end; end;
mB2m:; Begin //m20m; m14m; end;
;asm
call m20m
call m14m
ret
;end; end;
mB3m:; Begin //m11m; m33m; end;
;asm
call m11m
call m33m
ret
;end; end;
mB4m:; Begin
;//do_write_addr:=(rgSP);
;//do_write_bt:=mB4m_a1;do_write;
;// do_write_addr:=(rgSP+1); do_write_bt:=mB4m_a2;do_write; end;
;asm
mov eax,[rgSP]
mov [do_write_addr],eax
mov eax,[mB4m_a1]
mov [do_write_bt],eax
call do_write
mov eax,[rgSP]
inc eax
mov [do_write_addr],eax
mov eax,[mB4m_a2]
mov [do_write_bt],eax
call do_write
ret
;end;end;
mB5m:; Begin //m43m_a:=rgB; m43m; rgB:=tmp2; m25m;end;
;asm
mov eax,[rgB]
mov [m43m_a],eax
call m43m
mov eax,[tmp2]
mov [rgB],eax
call m25m
ret
;end;end;
mB6m:; Begin //do_write_addr:=mB6m_a; do_write_bt:=rgH;do_write; end;
;asm
mov eax,[mB6m_a]
mov [do_write_addr],eax
mov eax,[rgH]
mov [do_write_bt],eax
call do_write
ret
;end;end;
mB7m:; Begin
;//do_write_addr:=mB7m_a; do_write_bt:=rgL;do_write; end;
;asm
mov eax,[mB7m_a]
mov [do_write_addr],eax
mov eax,[rgL]
mov [do_write_bt],eax
call do_write
ret
;end;end;
mB8m:; begin //do_read_addr:=(rgSP);do_read; mB8m_Result:=do_read_Result; end;
;asm
mov eax,[rgSP]
mov [do_read_addr],eax
call do_read
mov eax,[do_read_result]
mov [mB8m_Result],eax
ret
;end;end;
mB9m:; begin //do_read_addr:=(rgSP+1);do_read;mB9m_Result:=do_read_Result; end;
;asm
mov eax,[rgSP]
inc eax
mov [do_read_addr],eax
call do_read
mov eax,[do_read_result]
mov [mB9m_Result],eax
ret
;end;end;
mC1m:; begin //m43m_a:=rgH; m43m; rgH:=tmp2; m25m; end;
;asm
mov eax,[rgH]
mov [m43m_a],eax
call m43m
mov eax,[tmp2]
mov [rgH],eax
call m25m
ret
;end;end;
mC2m:; begin //m19m; m15m; end;
;asm
call m19m
call m15m
ret
; end; end;
mC3m:; begin //m43m_a:=rgC; m43m; rgC:=tmp2; m25m; end;
;asm
mov eax,[rgC]
mov [m43m_a],eax
call m43m
mov eax,[tmp2]
mov [rgC],eax
call m25m
ret
;end;end;
mC4m:; begin //m43m_a:=rgD; m43m; rgD:=tmp2; m25m; end;
;asm
mov eax,[rgD]
mov [m43m_a],eax
call m43m
mov eax,[tmp2]
mov [rgD],eax
call m25m
ret
;end;end;
mC5m:; begin //m43m_a:=rgE; m43m; rgE:=tmp2; m25m; end;
;asm
mov eax,[rgE]
mov [m43m_a],eax
call m43m
mov eax,[tmp2]
mov [rgE],eax
call m25m
ret
;end;end;
mC6m:; begin //m22m; m02m; end;
; asm
call m22m
call m02m
ret
; end; end;
mC7m:; begin //m43m_a:=rgL; m43m; rgL:=tmp2; m25m; end;
;asm
mov eax,[rgL]
mov [m43m_a],eax
call m43m
mov eax,[tmp2]
mov [rgL],eax
call m25m
ret
;end;end;
mC8m:; begin //m43m_a:=tmp1; m43m; m44m_a:=tmp2; m44m; m34m; end;
;asm
mov eax,[tmp1]
mov [m43m_a],eax
call m43m
mov eax,[tmp2]
mov [m44m_a],eax
call m44m
call m34m
ret
;end;end;
mC9m:; begin //m43m_a:=rgA; m43m; m99m;
;asm
mov eax,[rgA]
mov [m43m_a],eax
call m43m
call m99m
ret
;end;end;
mD1m:; begin //m36m_a:=tmp1; m36m; m06m; m31m; end;
;asm
mov eax,[tmp1]
mov [m36m_a],eax
call m36m
call m06m
call m31m
ret
;end;end;
mD2m:; begin //m74m; m75m; m09m; end;
; asm
call m74m
call m75m
call m09m
ret
; end; end;
mD3m:; begin //m66m; m34m; end;
; asm
call m66m
call m34m
ret
; end; end;
mD4m:; begin //m04m; m33m; end;
; asm
call m04m
call m33m
ret
; end; end;
mD5m:; begin //m06m; m33m; end;
;asm
call m06m
call m33m
ret
; end; end;
mD6m:; begin //m47m; m75m; m09m; m76m; m36m_a:=tmp1; m36m;end;
;asm
call m47m
call m75m
call m09m
call m76m
mov eax,[tmp1]
mov [m36m_a],eax
call m36m
ret
;end;end;
;//Procedure mD7m; - в верху
;//Procedure mD8m; - в верху
mD9m:; begin //m85m; mB5m; end;
;asm
call m85m
call mB5m
ret
; end; end;
mE1m:; begin //m85m; mC1m; end;
;asm
call m85m
call mC1m
ret
; end; end;
mE2m:; begin //m85m; mC7m; end;
;asm
call m85m
call mC7m
ret
; end; end;
mE3m:; begin //m85m; mC8m; end;
;asm
call m85m
call mC8m
ret
; end; end;
mE4m:; begin //m85m; mC9m; end;
;asm
call m85m
call mC9m
ret
; end; end;
;====================
;====================
;====================
;====================
;====================
C00: ;Begin asm
call m27m
ret
; end; end;
C01: ;begin //m28m;rgB:=m28m_Result; m29m;rgC:=m29m_Result; m03m; end;
;asm
call m28m
mov eax,[m28m_Result]
mov [rgB],eax
call m29m
mov eax,[m29m_Result]
mov [rgC],eax
call m03m
ret
;end;end;
C02:; begin //do_write2_a_lo:=rgC;do_write2_a_hi:=rgB;do_write2_bt:=rgA; do_write2; m31m; end;
;asm
mov eax,[rgC]
mov [do_write2_a_lo],eax
mov eax,[rgB]
mov [do_write2_a_hi],eax
mov eax,[rgA]
mov [do_write2_bt],eax
mov eax,ebx
call do_write2
call m31m
ret
;end;end;
C03: ; begin //rgC:=rgC+1; if (rgC>$FF) then begin rgC:=0; rgB:=rgB+1;
;// if (rgB>$FF) then begin rgB:=0; end; end; m25m; end;
;asm
inc dword [rgC]
cmp [rgC],$000000ff
jbe c03_m1
xor eax,eax
mov [rgC],eax
inc dword [rgB]
cmp [rgB],$000000ff
jbe c03_m1
xor eax,eax
mov [rgB],eax
c03_m1: call m25m
ret
;end;end;
C04: ;begin //m85m_a:=(rgB+1); mD9m; end;
;asm
mov eax,[rgB]
inc eax
mov [m85m_a],eax
call mD9m
ret
;end;end;
C05: ;begin //m85m_a:=(rgB-1); mD9m; end;
;asm
mov eax,[rgB]
dec eax
mov [m85m_a],eax
call m85m
call mB5m
ret
;end;end;
C06: ;/begin //m39m; rgB:=m39m_Result; end;
;asm
call m39m
mov eax,[m39m_Result]
mov [rgB],eax
ret
;end;end;
C07:; begin //rgA:=rgA SHL 1; if (rgA>$FF) then begin rgA:=rgA or 1; m65m; rgA:= rgA and $FF; end
;// else begin m69m; end; m27m; end;
;'asm
shl [rgA],1
cmp [rgA],$000000ff
jbe c07_m1
or dword [rgA],$01
call m65m
and [rgA],$000000ff
jmp c07_m2
c07_m1: call m69m
c07_m2: call m27m
ret
;end;end;
C08:;Begin asm
call m27m
ret
; end; end;
C09: ;begin //rgL:=rgL+rgC; rgH:=rgH+rgB; if (rgL>$FF) then
;// begin inc(rgH); rgL:=(rgL and $FF); end;
;// if (rgH>$FF) then begin rgH:=(rgH and $FF); m13m;
;// end else begin m69m; end; m34m; end;
;asm
;//uMainDA.pas.2295: $09: begin rgL:=rgL+rgC; rgH:=rgH+rgB; if (rgL>$FF) then
mov eax,[rgC]
add [rgL],eax
mov eax,[rgB]
add [rgH],eax
cmp [rgL],$000000ff
jbe c09_m1
;//uMainDA.pas.2296: begin inc(rgH); rgL:=(rgL and $FF); end;
inc dword [rgH]
and [rgL],$000000ff
;//uMainDA.pas.2297: if (rgH>$FF) then begin rgH:=(rgH and $FF); m13m;
c09_m1: cmp [rgH],$000000ff
jbe c09_m2
and [rgH],$000000ff
call m13m
jmp c09_m3
;//uMainDA.pas.2298: end else begin m69m; end; m34m; end;
c09_m2: call m69m
c09_m3: call m34m
ret
;end;end;
C0A: ;begin //do_read2_a_lo:=rgC; do_read2_a_hi:=rgB; do_read2; rgA:=do_read2_result; m31m;
;asm
mov eax,[rgC]
mov [do_read2_a_lo],eax
mov eax,[rgB]
mov [do_read2_a_hi],eax
mov eax,ebx
call do_read2
mov eax,[do_read2_result]
mov [rgA],eax
call m31m
ret
;end;end;
C0B:; begin //rgC:=rgC-1; if (rgC>=$FFFFFF00) then begin rgC:=(rgC and $FF); rgB:=rgB-1;
; //if (rgB>=$FFFFFF00) then begin rgB:=(rgB and $FF); end; end; m25m; end;
;asm
dec dword [rgC]
cmp [rgC],$ffffff00
jb C0B_m1
and [rgC],$000000ff
dec dword [rgB]
cmp [rgB],$ffffff00
jb C0B_m1
and [rgB],$000000ff
C0B_m1: call m25m
ret
;end;end;
C0C: ;begin //m85m_a:=(rgC+1); m85m; mC3m; end;
;asm
mov eax,[rgC]
inc eax
mov [m85m_a],eax
call m85m
call mC3m
ret
;end;end;
C0D: ;begin //m85m_a:=(rgC-1); m85m; mC3m; end;
;asm
mov eax,[rgC]
dec eax
mov [m85m_a],eax
call m85m
call mC3m
ret
;end;end;
C0E: ;begin //m39m; rgC:=m39m_Result; end;
;asm
call m39m
mov eax,[m39m_Result]
mov [rgC],eax
ret
;end;end;
C0F: ;begin //tmp1:=(rgA and 1); rgA:=(rgA shr 1); if (tmp1<>0) then
;// begin rgA:=(rgA or $80); m13m; end else
;// begin rgF:=(rgF and ( not fC)); end; m27m; end;
;asm
mov eax,[rgA]
and eax,$01
mov [tmp1],eax
shr [rgA],1
cmp dword [tmp1],$00
jz C0F_m1
or [rgA],$00000080
call m13m
jmp C0F_m2
C0F_m1: mov eax,[fC]
not eax
and [rgF],eax
C0F_m2: call m27m
ret
;end;end;
C10: ;Begin asm
call m27m
ret
; end; end;
C11: ;begin //m28m;rgD:=m28m_Result; m29m;rgE:=m29m_Result; m03m; end;
;asm
call m28m
mov eax,[m28m_Result]
mov [rgD],eax
call m29m
mov eax,[m29m_Result]
mov [rgE],eax
call m03m
ret
;end;end;
C12: ;begin //do_write2_a_lo:=rgE;do_write2_a_hi:=rgD;do_write2_bt:=rgA; do_write2; m31m; end;
;asm
mov eax,[rgE]
mov [do_write2_a_lo],eax
mov eax,[rgD]
mov [do_write2_a_hi],eax
mov eax,[rgA]
mov [do_write2_bt],eax
mov eax,ebx
call do_write2
call m31m
ret
;end;end;
C13: ;begin //rgE:=rgE+1; if (rgE>$FF) then begin rgE:=0; rgD:=rgD+1;
;// if (rgD>$FF) then begin rgD:=0; end; end; m25m; end;
;asm
inc dword [rgE]
cmp [rgE],$000000ff
jbe C13_m2
xor eax,eax
mov [rgE],eax
inc dword [rgD]
cmp [rgD],$000000ff
jbe C13_m2
xor eax,eax
mov [rgD],eax
C13_m2: call m25m
ret
;end;end;
C14: ;begin //m85m_a:=(rgD+1); m85m; mC4m; end;
;asm
mov eax,[rgD]
inc eax
mov [m85m_a],eax
call m85m
call mC4m
ret
;end;end;
C15: ;begin //m85m_a:=(rgD-1); m85m; mC4m; end;
;asm
mov eax,[rgD]
dec eax
mov [m85m_a],eax
call m85m
call mC4m
ret
;end;end;
C16: ;begin //m39m; rgD:=m39m_Result; end;
;asm
call m39m
mov eax,[m39m_Result]
mov [rgD],eax
ret
;end;end;
C17: ;begin //rgA:=(rgA shl 1); m57m; if m57m_Result<>0 then begin rgA:=(rgA or 1); end;
;//if (rgA>$FF) then begin m13m; rgA:=(rgA and $FF); end else begin m69m; end; m27m; end;
;asm
shl [rgA],1
call m57m
cmp dword [m57m_Result],$00
jz C17_m1
or dword [rgA],$01
C17_m1: cmp [rgA],$000000ff
jbe C17_m2
call m13m
and [rgA],$000000ff
jmp C17_m3
C17_m2: call m69m
C17_m3: call m27m
ret
;end;end;
C18:;//m27m;
;Begin asm
call m27m
ret
;end; end;
C19: ;begin //rgL:=(rgL + rgE); rgH:=(rgH + rgD); if (rgL>$FF) then
;// begin inc(rgH); rgL:=(rgL and $FF); end;
;// if (rgH>$FF) then begin rgH:=(rgH and $FF); m13m;
;// end else begin rgF:=(rgF and not (fC)); end; m34m; end;
;asm
mov eax,[rgE]
add [rgL],eax
mov eax,[rgD]
add [rgH],eax
cmp [rgL],$000000ff
jbe C19_m1
inc dword [rgH]
and [rgL],$000000ff
C19_m1: cmp [rgH],$000000ff
jbe C19_m2
and [rgH],$000000ff
call m13m
jmp C19_m3
C19_m2: mov eax,[fC]
not eax
and [rgF],eax
C19_m3: call m34m
ret
;end;end;
C1A: ;begin //do_read2_a_lo:=rgE; do_read2_a_hi:=rgD; do_read2; rgA:=do_read2_result; m31m;
;asm
mov eax,[rgE]
mov [do_read2_a_lo],eax
mov eax,[rgD]
mov [do_read2_a_hi],eax
mov eax,ebx
call do_read2
mov eax,[do_read2_result]
mov [rgA],eax
call m31m
ret
;end; end;
C1B: ;begin //rgE:=rgE-1; if (rgE>=$FFFFFF00) then begin rgE:=(rgE and $FF); rgD:=rgD-1;
;// if (rgD>=$FFFFFF00) then begin rgD:=(rgD and $FF); end; end; m25m; end;
;asm
dec dword [rgE]
cmp [rgE],$ffffff00
jb C1B_m1
and [rgE],$000000ff
dec dword [rgD]
cmp [rgD],$ffffff00
jb C1B_m1
and [rgD],$000000ff
C1B_m1: call m25m
ret
;end; end;
C1C: ;begin //m85m_a:=(rgE+1); m85m; mC5m; end;
;asm
mov eax,[rgE]
inc eax
mov [m85m_a],eax
call m85m
call mC5m
ret
;end; end;
C1D: ;begin //m85m_a:=(rgE-1); m85m; mC5m; end;
;asm
mov eax,[rgE]
dec eax
mov [m85m_a],eax
call m85m
call mC5m
ret
;end; end;
C1E: ;begin //m39m; rgE:=m39m_Result; end;
;asm
call m39m
mov eax,[m39m_Result]
mov [rgE],eax
ret
;end; end;
C1F: ;begin //tmp1:=(rgA and 1); rgA:=(rgA SHR 1); m57m; //if m57m_Result<>0 then begin rgA:=(rgA or $80); end;
;//if (tmp1<>0) then begin m13m; end// else begin rgF:=(rgF and not(fC)); end;// m27m; end;
;asm
mov eax,[rgA]
and eax,$01
mov [tmp1],eax
shr [rgA],1
call m57m
cmp dword [m57m_Result],$00
jz C1F_m1
or [rgA],$00000080
C1F_m1: cmp dword [tmp1],$00
jz C1F_m2
call m13m
jmp C1F_m3
C1F_m2: mov eax,[fC]
not eax
and [rgF],eax
C1F_m3: call m27m
ret
;end;end;
C20:;//m27m;
;Begin asm
call m27m
ret
; end; end;
C21: ;begin //m28m;rgH:=m28m_Result; m29m;rgL:=m29m_Result; m03m; end;
;asm
call m28m
mov eax,[m28m_Result]
mov [rgH],eax
call m29m
mov eax,[m29m_Result]
mov [rgL],eax
call m03m
ret
;end;end;
C22: ;begin //m48m; mB7m_a:=(tmp1); mB7m; mB6m_a:=(tmp1+1); mB6m; mC6m; end;
;asm
call m48m
mov eax,[tmp1]
mov [mB7m_a],eax
call mB7m
mov eax,[tmp1]
inc eax
mov [mB6m_a],eax
call mB6m
call mC6m
ret
;end;end;
C23: ;begin //rgL:=rgL+1; if (rgL>$FF) then begin rgL:=0; rgH:=rgH+1;
;//if (rgH>$FF) then begin rgH:=0; end; end;
;//m25m; end;
;asm
inc dword [rgL]
cmp [rgL],$000000ff
jbe C23_m1
xor eax,eax
mov [rgL],eax
inc dword [rgH]
cmp [rgH],$000000ff
jbe C23_m1
xor eax,eax
mov [rgH],eax
C23_m1: call m25m
ret
;end;end;
C24: ;begin //m85m_a:=(rgH+1); mE1m; end;
;asm
mov eax,[rgH]
inc eax
mov [m85m_a],eax
call mE1m
ret
;end;end;
C25: ;begin //m85m_a:=(rgH-1); mE1m; end;
;asm
mov eax,[rgH]
dec eax
mov [m85m_a],eax
call mE1m
ret
;end;end;
C26: ;begin //m39m; rgH:=m39m_Result; end;
;asm
call m39m
mov eax,[m39m_Result]
mov [rgH],eax
ret
;end;end;
C27: ;begin //tmp1:=0; if (((rgF and fC)<>0) or (rgA>$99)) then
;// begin tmp1:=(tmp1 or $60); end;
;// if (((rgF and fA)<>0) or ((rgA and $0F)>$09)) then begin tmp1:=(tmp1 or $06); end;
;// tmp2:=rgA+tmp1; m08m; m36m_a:=tmp1; m36m; mA2m; m27m; end;
;asm
xor eax,eax
mov [tmp1],eax
mov eax,[rgF]
and eax,[fC]
jnz C27_m1
cmp [rgA],$00000099
jbe C27_m2
C27_m1: or dword [tmp1],$60
C27_m2: mov eax,[rgF]
and eax,[fA]
jnz C27_m3
mov eax,[rgA]
and eax,$0f
cmp eax,$09
jbe C27_m3
or dword [tmp1],$06
C27_m3: mov eax,[rgA]
add eax,[tmp1]
mov [tmp2],eax
call m08m
mov eax,[tmp1]
mov [m36m_a],eax
call m36m
call mA2m
call m27m
ret
;end;end;
C28:;//m27m;
;Begin asm
call m27m
ret
; end; end;
C29: ;begin //rgL:=rgL + rgL; rgH:=rgH + rgH; if (rgL>$FF) then
;//begin inc(rgH); rgL:=(rgL and $FF); end;
;//if (rgH>$FF) then begin rgH:=(rgH and $FF); m13m; end else begin m69m; end;
;//m34m; end;
;asm
mov eax,[rgL]
add [rgL],eax
mov eax,[rgH]
add [rgH],eax
cmp [rgL],$000000ff
jbe C29_m1
inc dword [rgH]
and [rgL],$000000ff
C29_m1: cmp [rgH],$000000ff
jbe C29_m2
and [rgH],$000000ff
call m13m
jmp C29_m3
C29_m2: call m69m
C29_m3: call m34m
ret
;end;end;
C2A: ;begin //m48m; do_read_addr:=(tmp1);do_read;rgL:=do_read_Result;
;//do_read_addr:=(tmp1+1);do_read;rgH:=do_read_Result; mC6m; end;
;asm
call m48m
mov eax,[tmp1]
mov [do_read_addr],eax
mov eax,ebx
call do_read
mov eax,[do_read_result]
mov [rgL],eax
mov eax,[tmp1]
inc eax
mov [do_read_addr],eax
mov eax,ebx
call do_read
mov eax,[do_read_result]
mov [rgH],eax
call mC6m
ret
;end;end;
C2B: ;begin //rgL:=rgL-1; if (rgL>=$FFFFFF00) then begin rgL:=(rgL and $FF) ; rgH:=rgH-1;
;// if (rgH>=$FFFFFF00) then begin rgH:=(rgH and $FF); end; end; m25m; end;
;asm
dec dword [rgL]
cmp [rgL],$ffffff00
jb C2B_m1
and [rgL],$000000ff
dec dword [rgH]
cmp [rgH],$ffffff00
jb C2B_m1
and [rgH],$000000ff
C2B_m1: call m25m
ret
;end;end;
C2C: ;begin //m85m_a:=(rgL+1); mE2m; end;
;asm
mov eax,[rgL]
inc eax
mov [m85m_a],eax
call mE2m
ret
;end;end;
C2D: ;begin //m85m_a:=(rgL-1); mE2m; end;
;asm
mov eax,[rgL]
dec eax
mov [m85m_a],eax
call mE2m
ret
;end;end;
C2E: ;begin //m39m; rgL:=m39m_Result; end;
;asm
call m39m
mov eax,[m39m_Result]
mov [rgL],eax
ret
;end;end;
C2F: ;begin //rgA:=(rgA xor $FF); m27m; end;
;asm
xor [rgA],$000000ff
call m27m
ret
;end;end;
C30:;m27m;
;Begin asm
call m27m
ret
;;end; end;
C31: ;begin //m28m;m29m;rgSP:=(m28m_Result shl 8)+m29m_Result; m03m; end;
;asm
call m28m
call m29m
mov eax,[m28m_Result]
shl eax,$08
add eax,[m29m_Result]
mov [rgSP],eax
call m03m
ret
;end;end;
C32: ;begin //m29m;do_write2_a_lo:=m29m_Result;m28m;do_write2_a_hi:=m28m_Result;do_write2_bt:=rgA; do_write2; m21m; m02m; end;
;asm
call m29m
mov eax,[m29m_Result]
mov [do_write2_a_lo],eax
call m28m
mov eax,[m28m_Result]
mov [do_write2_a_hi],eax
mov eax,[rgA]
mov [do_write2_bt],eax
mov eax,ebx
call do_write2
call m21m
call m02m
ret
;end;end;
C33: ;begin //if (rgSP=$FFFF) then begin rgSP:=0; end else begin inc(rgSP); end; m25m; end;
;asm
cmp [rgSP],$0000ffff
jnz C33_m1
xor eax,eax
mov [rgSP],eax
jmp C33_m2
C33_m1: inc dword [rgSP]
C33_m2: call m25m
ret
;end;end;
C34: ;begin //m74m; m85m_a:=(tmp1+1); mE3m; end;
;asm
call m74m
mov eax,[tmp1]
inc eax
mov [m85m_a],eax
call mE3m
ret
;end;end;
C35: ;begin //m74m; m85m_a:=(tmp1-1); mE3m; end;
;asm
call m74m
mov eax,[tmp1]
dec eax
mov [m85m_a],eax
call m85m
call mC8m
ret
;end;end;
C36: ;begin //m29m;m44m_a:=m29m_Result; m44m; mC2m; end;
;asm
call m29m
mov eax,[m29m_Result]
mov [m44m_a],eax
call m44m
call mC2m
ret
;end;end;
C37: ;//begin m13m; m27m; end;
;Begin asm
call m13m
call m27m
ret
;end; end;
C38:;///m27m;
;Begin asm
call m27m
ret
;end; end;
C39: ;begin //rgL:=(rgL + (rgSP and $FF)); rgH:=(rgH + ((rgSP shr 8) and $FF));
;// if (rgL>$FF) then begin inc(rgH); rgL:=(rgL and $FF); end;
;// if (rgH>$FF) then begin rgH:=(rgH and $FF); m13m; end else begin m69m; end;
;//m34m; end;
;asm
mov eax,[rgSP]
and eax,$000000ff
add [rgL],eax
mov eax,[rgSP]
shr eax,$08
and eax,$000000ff
add [rgH],eax
cmp [rgL],$000000ff
jbe C39_m1
inc dword [rgH]
and [rgL],$000000ff
C39_m1: cmp [rgH],$000000ff
jbe C39_m2
and [rgH],$000000ff
call m13m
jmp C39_m3
C39_m2: call m69m
C39_m3: call m34m
ret
;end;end;
C3A: ;begin //m29m;do_read2_a_lo:=m29m_Result; m28m;do_read2_a_hi:=m28m_Result; do_read2; rgA:=do_read2_result;
;// m21m; m02m; end;
;asm
call m29m
mov eax,[m29m_Result]
mov [do_read2_a_lo],eax
call m28m
mov eax,[m28m_Result]
mov [do_read2_a_hi],eax
mov eax,ebx
call do_read2
mov eax,[do_read2_result]
mov [rgA],eax
call m21m
call m02m
ret
;end;end;
C3B: ;begin //if (rgSP<>0) then begin rgSP:=rgSP-1; end else begin rgSP:=$FFFF; end;
;// m25m; end;
;asm
cmp dword [rgSP],$00
jz C3B_m1
dec dword [rgSP]
jmp C3B_m2
C3B_m1: mov [rgSP],$0000ffff
C3B_m2: call m25m
ret
;end;end;
C3C: ;begin //m85m_a:=(rgA+1); mE4m; end;
;asm
mov eax,[rgA]
inc eax
mov [m85m_a],eax
call mE4m
ret
;end;end;
C3D: ;begin //m85m_a:=(rgA-1); mE4m; end;
;asm
mov eax,[rgA]
dec eax
mov [m85m_a],eax
call mE4m
ret
;end;end;
C3E: ;begin //m39m; rgA:=m39m_Result; end;
;asm
call m39m
mov eax,[m39m_Result]
mov [rgA],eax
ret
;end;end;
C3F: ;begin //rgF:=rgF xor fC; m27m; end;
;asm
mov eax,[fC]
xor [rgF],eax
call m27m
ret
;end;end;
C40:;//m25m;
;Begin asm
call m25m
ret
;end; end;
;{B}
C41: ;begin //m84m_a:=rgC; m84m; end;
;asm
mov eax,[rgC]
mov [m84m_a],eax
call m84m
ret
;end;end;
C42: ;begin //m84m_a:=rgD;m84m; end;
;asm
mov eax,[rgD]
mov [m84m_a],eax
call m84m
ret
;end;end;
C43: ;begin //m84m_a:=rgE; m84m; end;
;asm
mov eax,[rgE]
mov [m84m_a],eax
call m84m
ret
;end;end;
C44: ;begin //m84m_a:=rgH; m84m; end;
;asm
mov eax,[rgH]
mov [m84m_a],eax
call m84m
ret
;end;end;
C45: ;begin //m84m_a:=rgL; m84m; end;
;asm
mov eax,[rgL]
mov [m84m_a],eax
call m84m
ret
;end;end;
C46: ;begin //m38m; rgB:=m38m_Result; end;
;asm
call m38m
mov eax,[m38m_Result]
mov [rgB],eax
ret
;end;end;
ui8080.asm Part2
C47: ;begin //m84m_a:=rgA;m84m; end;
;asm
mov eax,[rgA]
mov [m84m_a],eax
call m84m
ret
;end;end;
;{C}
C48: ;begin //m86m_a:=(rgB); m86m; end;
;asm
mov eax,[rgB]
mov [m86m_a],eax
call m86m
ret
;end;end;
C49: ;//m25m;
;Begin asm
call m25m
ret
;end; end;
C4A: ;begin //m86m_a:=(rgD); m86m; end;
;asm
mov eax,[rgD]
mov [m86m_a],eax
call m86m
ret
;end;end;
C4B: ;begin //m86m_a:=(rgE); m86m; end;
;asm
mov eax,[rgE]
mov [m86m_a],eax
call m86m
ret
;end;end;
C4C: ;begin //m86m_a:=(rgH); m86m; end;
;asm
mov eax,[rgH]
mov [m86m_a],eax
call m86m
ret
;end;end;
C4D: ;begin //m86m_a:=(rgL); m86m; end;
;asm
mov eax,[rgL]
mov [m86m_a],eax
call m86m
ret
;end;end;
C4E: ;begin// m38m;rgC:=m38m_Result; end;
;asm
call m38m
mov eax,[m38m_Result]
mov [rgC],eax
ret
;end;end;
C4F: ;begin //m86m_a:=(rgA); m86m; end;
;asm
mov eax,[rgA]
mov [m86m_a],eax
call m86m
ret
;end;end;
;{d}
C50: ;begin //m87m_a:=(rgB); m87m; end;
;asm
mov eax,[rgB]
mov [m87m_a],eax
call m87m
ret
;end;end;
C51: ;begin //m87m_a:=(rgC); m87m; end;
;asm
mov eax,[rgC]
mov [m87m_a],eax
call m87m
ret
;end;end;
C52: ;//m25m;
;Begin asm
call m25m
ret
; end; end;
C53: ;begin //m87m_a:=(rgE); m87m; end;
;asm
mov eax,[rgE]
mov [m87m_a],eax
call m87m
ret
;end;end;
C54: ;begin //m87m_a:=(rgH); m87m; end;
;asm
mov eax,[rgH]
mov [m87m_a],eax
call m87m
ret
;end;end;
C55: ;begin //m87m_a:=(rgL); m87m; end;
;asm
mov eax,[rgL]
mov [m87m_a],eax
call m87m
ret
;end;end;
C56: ;begin //m38m;rgD:=m38m_Result; end;
;asm
call m38m
mov eax,[m38m_Result]
mov [rgD],eax
ret
;end;end;
C57: ;begin //m87m_a:=(rgA);m87m; end;
;asm
mov eax,[rgA]
mov [m87m_a],eax
call m87m
ret
;end;end;
;{E}
C58: ;begin //m88m_a:=(rgB); m88m; end;
;asm
mov eax,[rgB]
mov [m88m_a],eax
call m88m
ret
;end;end;
C59: ;begin //m88m_a:=(rgC); m88m; end;
;asm
mov eax,[rgC]
mov [m88m_a],eax
call m88m
ret
;end;end;
C5A: ;begin //m88m_a:=(rgD); m88m; end;
;asm
mov eax,[rgD]
mov [m88m_a],eax
call m88m
ret
;end;end;
C5B: ;//m25m;
;Begin asm
call m25m
ret
;end; end;
C5C: ;begin //m88m_a:=(rgH);m88m; end;
;asm
mov eax,[rgH]
mov [m88m_a],eax
call m88m
ret
;end;end;
C5D: ;begin //m88m_a:=(rgL); m88m; end;
;asm
mov eax,[rgL]
mov [m88m_a],eax
call m88m
ret
;end;end;
C5E: ;begin //m38m;rgE:=m38m_Result; end;
;asm
call m38m
mov eax,[m38m_Result]
mov [rgE],eax
ret
;end;end;
C5F: ;begin //m88m_a:=(rgA);m88m; end;
;asm
mov eax,[rgA]
mov [m88m_a],eax
call m88m
ret
;end;end;
;{H}
C60: ;begin //m89m_a:=(rgB); m89m; end;
;asm
mov eax,[rgB]
mov [m89m_a],eax
call m89m
ret
;end;end;
C61: ;begin //m89m_a:=(rgC); m89m; end;
;asm
mov eax,[rgC]
mov [m89m_a],eax
call m89m
ret
;end;end;
C62: ;begin //m89m_a:=(rgD); m89m; end;
;asm
mov eax,[rgD]
mov [m89m_a],eax
call m89m
ret
;end;end;
C63: ;begin //m89m_a:=(rgE); m89m; end;
;asm
mov eax,[rgE]
mov [m89m_a],eax
call m89m
ret
;end;end;
C64:;//m25m;
;Begin asm
call m25m
ret
; end; end;
C65: ;begin //m89m_a:=(rgL); m89m; end;
;asm
mov eax,[rgL]
mov [m89m_a],eax
call m89m
ret
;end;end;
C66: ;begin //m38m; rgH:=m38m_Result; end;
;asm
call m38m
mov eax,[m38m_Result]
mov [rgH],eax
ret
;end;end;
C67: ;begin //m89m_a:=(rgA); m89m; end;
;asm
mov eax,[rgA]
mov [m89m_a],eax
call m89m
ret
;end;end;
;{L}
C68: ;begin //m90m_a:=(rgB); m90m; end;
;asm
mov eax,[rgB]
mov [m90m_a],eax
call m90m
ret
;end;end;
C69: ;begin //m90m_a:=(rgC); m90m; end;
;asm
mov eax,[rgC]
mov [m90m_a],eax
call m90m
ret
;end;end;
C6A: ;begin //m90m_a:=(rgD); m90m; end;
;asm
mov eax,[rgD]
mov [m90m_a],eax
call m90m
ret
;end;end;
C6B: ;begin //m90m_a:=(rgE); m90m; end;
;asm
mov eax,[rgE]
mov [m90m_a],eax
call m90m
ret
;end;end;
C6C: ;begin //m90m_a:=(rgH); m90m; end;
;asm
mov eax,[rgH]
mov [m90m_a],eax
call m90m
ret
;end;end;
C6D:;//m25m;
;Begin asm
call m25m
ret
; end; end;
C6E: ;begin //m38m; rgL:=m38m_Result;end;
;asm
call m38m
mov eax,[m38m_Result]
mov [rgL],eax
ret
;end;end;
C6F: ;begin //m90m_a:=(rgA); m90m; end;
;asm
mov eax,[rgA]
mov [m90m_a],eax
call m90m
ret
;end;end;
;{M}
C70: ;begin //m91m_a:=(rgB); m91m; end;
;asm
mov eax,[rgB]
mov [m91m_a],eax
call m91m
ret
;end;end;
C71: ;begin //m91m_a:=(rgC); m91m; end;
;asm
mov eax,[rgC]
mov [m91m_a],eax
call m91m
ret
;end;end;
C72: ;begin //m91m_a:=(rgD); m91m; end;
;asm
mov eax,[rgD]
mov [m91m_a],eax
call m91m
ret
;end;end;
C73: ;begin //m91m_a:=(rgE); m91m; end;
;asm
mov eax,[rgE]
mov [m91m_a],eax
call m91m
ret
;end;end;
C74: ;begin //m91m_a:=(rgH); m91m; end;
;asm
mov eax,[rgH]
mov [m91m_a],eax
call m91m
ret
;end;end;
C75: ;begin //m91m_a:=(rgL); m91m; end;
;asm
mov eax,[rgL]
mov [m91m_a],eax
call m91m
ret
;end;end;
C76: ;//m27m;
;Begin asm
call m27m
ret
; end; end;
C77: ;begin //m91m_a:=(rgA); m91m; end;
;asm
mov eax,[rgA]
mov [m91m_a],eax
call m91m
ret
;end;end;
C78: ;begin //m92m_a:=(rgB); m92m; end;
;asm
mov eax,[rgB]
mov [m92m_a],eax
call m92m
ret
;end;end;
C79: ;begin //m92m_a:=(rgC); m92m; end;
;asm
mov eax,[rgC]
mov [m92m_a],eax
call m92m
ret
;end;end;
C7A: ;begin //m92m_a:=(rgD); m92m; end;
;asm
mov eax,[rgD]
mov [m92m_a],eax
call m92m
ret
;end;end;
C7B: ;begin //m92m_a:=(rgE); m92m; end;
;asm
mov eax,[rgE]
mov [m92m_a],eax
call m92m
ret
;end;end;
C7C: ;begin //m92m_a:=(rgH); m92m; end;
;asm
mov eax,[rgH]
mov [m92m_a],eax
call m92m
ret
;end;end;
C7D: ;begin //m92m_a:=(rgL); m92m; end;
;asm
mov eax,[rgL]
mov [m92m_a],eax
call m92m
ret
;end;end;
C7E: ;begin //m38m;rgA:=m38m_Result; end;
;asm
call m38m
mov eax,[m38m_Result]
mov [rgA],eax
ret
;end;end;
C7F: ;//m25m;
;Begin asm
call m25m
ret
; end; end;
C80: ;begin// tmp2:=rgA+rgB; m08m; m36m_a:=rgB; m36m; m32m; rgA:=(tmp2 and $FF); m27m; end;
;asm
mov eax,[rgA]
add eax,[rgB]
mov [tmp2],eax
call m08m
mov eax,[rgB]
mov [m36m_a],eax
call m36m
call m32m
mov eax,[tmp2]
and eax,$000000ff
mov [rgA],eax
call m27m
ret
;end;end;
C81: ;begin //m70m_a:=rgC; m70m; end;
;asm
mov eax,[rgC]
mov [m70m_a],eax
call m70m
ret
;end;end;
C82:;$82:begin //m70m_a:=rgD; m70m; end;
;asm
mov eax,[rgD]
mov [m70m_a],eax
call m70m
ret
;end;end;
C83: ;begin //m70m_a:=rgE; m70m; end;
;asm
mov eax,[rgE]
mov [m70m_a],eax
call m70m
ret
;end;end;
C84: ;begin //m70m_a:=rgH; m70m; end;
;asm
mov eax,[rgH]
mov [m70m_a],eax
call m70m
ret
;end;end;
C85: ;begin //m70m_a:=rgL; m70m; end;
;asm
mov eax,[rgL]
mov [m70m_a],eax
call m70m
ret
;end;end;
C86: ;begin //m74m; tmp2:=rgA+tmp1; m08m; m36m_a:=tmp1; m36m; mA3m; end;
;asm
call m74m
mov eax,[rgA]
add eax,[tmp1]
mov [tmp2],eax
call m08m
mov eax,[tmp1]
mov [m36m_a],eax
call m36m
call mA3m
ret
;end; end;
C87: ;begin //m70m_a:=rgA; m70m; end;
;asm
mov eax,[rgA]
mov [m70m_a],eax
call m70m
ret
;end; end;
C88: ;begin //m71m_a:=rgB; m71m; end;
;asm
mov eax,[rgB]
mov [m71m_a],eax
call m71m
ret
;end; end;
C89: ;begin //m71m_a:=rgC; m71m; end;
;asm
mov eax,[rgC]
mov [m71m_a],eax
call m71m
ret
;end; end;
C8A: ;begin //m71m_a:=rgD; m71m; end;
;asm
mov eax,[rgD]
mov [m71m_a],eax
call m71m
ret
;end; end;
C8B: ;begin //m71m_a:=rgE; m71m; end;
;asm
mov eax,[rgE]
mov [m71m_a],eax
call m71m
ret
;end; end;
C8C: ;begin //m73m_a:=rgH; m73m; if (tmp2>$FF) then
;//begin m65m; end; m04m; m27m; end;
;asm
mov eax,[rgH]
mov [m73m_a],eax
call m73m
cmp [tmp2],$000000ff
jbe C8C_m1
call m65m
C8C_m1: call m04m
call m27m
ret
;end; end;
C8D: ;begin //m71m_a:=rgL; m71m; end;
;asm
mov eax,[rgL]
mov [m71m_a],eax
call m71m
ret
;end; end;
C8E: ;begin //m74m; m73m_a:=tmp1; m73m; mA3m; end;
;asm
call m74m
mov eax,[tmp1]
mov [m73m_a],eax
call m73m
call mA3m
ret
;end; end;
C8F: ;begin //m71m_a:=rgA; m71m; end;
;asm
mov eax,[rgA]
mov [m71m_a],eax
call m71m
ret
;end; end;
C90: ;begin //m40m_a:=rgB;m40m; end;
;asm
mov eax,[rgB]
mov [m40m_a],eax
call m40m
ret
;end; end;
C91: ;begin //m40m_a:=rgC; m40m; end;
;asm
mov eax,[rgC]
mov [m40m_a],eax
call m40m
ret
;end; end;
C92: ;begin //m40m_a:=rgD;m40m; end;
;asm
mov eax,[rgD]
mov [m40m_a],eax
call m40m
ret
;end;end;
C93: ;begin //m40m_a:=rgE; m40m; end;
;asm
mov eax,[rgE]
mov [m40m_a],eax
call m40m
ret
;end;end;
C94: ;begin //m40m_a:=rgH; m40m; end;
;asm
mov eax,[rgH]
mov [m40m_a],eax
call m40m
ret
;end; end;
C95: ;begin //m85m_a:=(rgA-rgL); m85m; m09m; if (rgA<rgL) then begin m65m; end; m36m_a:=rgL; m36m; m35m; end;
;asm
mov eax,[rgA]
sub eax,[rgL]
mov [m85m_a],eax
call m85m
call m09m
mov eax,[rgA]
cmp eax,[rgL]
jnb C95_m1
call m65m
C95_m1: mov eax,[rgL]
mov [m36m_a],eax
call m36m
call m35m
ret
;end; end;
C96: ;begin //mD2m; if (rgA<tmp1) then begin m13m; end; mD1m; end;
;asm
call mD2m
mov eax,[rgA]
cmp eax,[tmp1]
jnb C96_m1
call m13m
C96_m1: call mD1m
ret
;end; end;
C97: ;begin //m10m; rgA:=0; m27m; end;
;asm
call m10m
xor eax,eax
mov [rgA],eax
call m27m
ret
;end; end;
C98: ;begin //m41m_a:=rgB;m41m;end;
;asm
mov eax,[rgB]
mov [m41m_a],eax
call m41m
ret
;end; end;
C99: ;begin //m41m_a:=rgC; m41m; end;
;asm
mov eax,[rgC]
mov [m41m_a],eax
call m41m
ret
;end; end;
C9A: ;begin //m41m_a:=rgD;m41m; end;
;asm
mov eax,[rgD]
mov [m41m_a],eax
call m41m
ret
;end; end;
C9B: ;begin //m41m_a:=rgE; m41m; end;
;asm
mov eax,[rgE]
mov [m41m_a],eax
call m41m
ret
;end; end;
C9C: ;begin //m41m_a:=rgH; m41m; end;
;asm
mov eax,[rgH]
mov [m41m_a],eax
call m41m
ret
;end; end;
C9D: ;begin //m41m_a:=rgL; m41m; end;
;asm
mov eax,[rgL]
mov [m41m_a],eax
call m41m
ret
;end; end;
C9E: ;begin //m74m; m57m; if m57m_Result<>0 then tmp3:=1 else tmp3:=0;
;// m85m_a:=(rgA-tmp1-tmp3); m85m; m09m; if (rgA<tmp1+tmp3) then begin m13m; end;
;// mD1m; end;
;asm
call m74m
call m57m
cmp dword [m57m_Result],$00
jz C9E_m1
mov [tmp3],$00000001
jmp C9E_m2
C9E_m1: xor eax,eax
C9E_m2: mov [tmp3],eax
mov eax,[rgA]
sub eax,[tmp1]
sub eax,[tmp3]
mov [m85m_a],eax
call m85m
call m09m
mov eax,[tmp1]
add eax,[tmp3]
cmp eax,[rgA]
jbe C9E_m3
call m13m
C9E_m3: call mD1m
ret
;end; end;
C9F: ;begin //m57m; if m57m_Result<>0 then tmp2:=$FF else tmp2:=0; m09m;
;//if (tmp2<>0) then begin rgF:=rgF or (fA or fC); end; m35m; end;
;asm
call m57m
cmp dword [m57m_Result],$00
jz C9F_m1
mov [tmp2],$000000ff
jmp C9F_m2
xor eax,eax
C9F_m1: mov [tmp2],eax
C9F_m2: call m09m
cmp dword [tmp2],$00
jz C9F_m3
mov eax,[fA]
or eax,[fC]
or [rgF],eax
C9F_m3: call m35m
ret
;end; end;
CA0: ;begin //mA5m_a:=(rgB); mA5m; end;
;asm
mov eax,[rgB]
mov [mA5m_a],eax
call mA5m
ret
;end; end;
CA1: ;begin //mA5m_a:=(rgC); mA5m; end;
;asm
mov eax,[rgC]
mov [mA5m_a],eax
call mA5m
ret
;end; end;
CA2: ;begin //mA5m_a:=(rgD); mA5m; end;
;asm
mov eax,[rgD]
mov [mA5m_a],eax
call mA5m
ret
;end; end;
CA3: ;begin //mA5m_a:=(rgE); mA5m; end;
;asm
mov eax,[rgE]
mov [mA5m_a],eax
call mA5m
ret
;end; end;
CA4: ;begin //mA5m_a:=(rgH); mA5m; end;
;asm
mov eax,[rgH]
mov [mA5m_a],eax
call mA5m
ret
;end; end;
CA5: ;begin //mA5m_a:=(rgL); mA5m; end;
;asm
mov eax,[rgL]
mov [mA5m_a],eax
call mA5m
ret
;end; end;
CA6: ;begin //m74m; m61m_a:=tmp1; m61m; mA4m; end;
;asm
call m74m
mov eax,[tmp1]
mov [m61m_a],eax
call m61m
call mA4m
ret
;end; end;
CA7: ;begin // mA5m_a:=(rgA); mA5m; end;
;asm
mov eax,[rgA]
mov [mA5m_a],eax
call mA5m
ret
;end; end;
CA8: ;begin //mA6m_a:=(rgB); mA6m; end;
;asm
mov eax,[rgB]
mov [mA6m_a],eax
call mA6m
ret
;end; end;
CA9: ;begin//mA6m_a:=(rgC); mA6m; end;
;asm
mov eax,[rgC]
mov [mA6m_a],eax
call mA6m
ret
;end; end;
CAA: ;begin //mA6m_a:=(rgD); mA6m; end;
;asm
mov eax,[rgD]
mov [mA6m_a],eax
call mA6m
ret
;end; end;
CAB: ;begin //mA6m_a:=(rgE); mA6m; end;
;asm
mov eax,[rgE]
mov [mA6m_a],eax
call mA6m
ret
;end; end;
CAC: ;begin //mA6m_a:=(rgH); mA6m; end;
;asm
mov eax,[rgH]
mov [mA6m_a],eax
call mA6m
ret
;end; end;
CAD: ;'begin //mA6m_a:=(rgL); mA6m; end;
;asm
mov eax,[rgL]
mov [mA6m_a],eax
call mA6m
ret
;end; end;
CAE: ;begin //m74m; m67m_a:=tmp1; m67m; m11m; m17m; m14m; end;
;asm
call m74m
mov eax,[tmp1]
mov [m67m_a],eax
call m67m
call m11m
call m17m
call m14m
ret
;end; end;
CAF: ;begin //rgA:=0; m26m; end;
;asm
xor eax,eax
mov [rgA],eax
call m26m
ret
;end; end;
CB0: ;begin //m64m_a:=rgB; m64m; m26m; end;
;asm
mov eax,[rgB]
mov [m64m_a],eax
call m64m
call m26m
ret
;end; end;
CB1: ;begin //m64m_a:=rgC; m64m; m26m; end;
;asm
mov eax,[rgC]
mov [m64m_a],eax
call m64m
call m26m
ret
;end; end;
CB2: ;begin //m64m_a:=rgD; m64m; m26m; end;
;asm
mov eax,[rgD]
mov [m64m_a],eax
call m64m
call m26m
ret
;end; end;
CB3: ;begin //m64m_a:=rgE; m64m; m26m; end;
;asm
mov eax,[rgE]
mov [m64m_a],eax
call m64m
call m26m
ret
;end; end;
CB4: ;begin //m64m_a:=rgH; m64m; m26m; end;
;asm
mov eax,[rgH]
mov [m64m_a],eax
call m64m
call m26m
ret
;end; end;
CB5: ;begin //m64m_a:=rgL; m64m; m26m; end;
;asm
mov eax,[rgL]
mov [m64m_a],eax
call m64m
call m26m
ret
;end; end;
CB6: ;begin //m74m; m64m_a:=tmp1; m64m; mA4m; end;
;asm
call m74m
mov eax,[tmp1]
mov [m64m_a],eax
call m64m
call mA4m
ret
;end; end;
CB7: ;begin //m64m_a:=rgA; m64m; m26m; end;
;asm
mov eax,[rgA]
mov [m64m_a],eax
call m64m
call m26m
ret
;end; end;
CB8: ;begin //m63m_a:=rgB;m63m; end;
;asm
mov eax,[rgB]
mov [m63m_a],eax
call m63m
ret
;end; end;
CB9: ;begin //m63m_a:=rgC;m63m; end;
;asm
mov eax,[rgC]
mov [m63m_a],eax
call m63m
ret
;end; end;
CBA: ;begin //m63m_a:=rgD;m63m; end;
;asm
mov eax,[rgD]
mov [m63m_a],eax
call m63m
ret
;end; end;
CBB:;begin //m63m_a:=rgE; m63m; end;
;asm
mov eax,[rgE]
mov [m63m_a],eax
call m63m
ret
;end; end;
CBC:;begin //m63m_a:=rgH; m63m; end;
;asm
mov eax,[rgH]
mov [m63m_a],eax
call m63m
ret
;end; end;
CBD:;begin //m63m_a:=rgL;m63m; end;
;asm
mov eax,[rgL]
mov [m63m_a],eax
call m63m
ret
;end; end;
CBE: ;begin //mD2m; if (rgA<tmp1) then begin m13m; end; m36m_a:=tmp1; m36m; m31m; end;
;asm
call mD2m
mov eax,[rgA]
cmp eax,[tmp1]
jnb CBE_m1
call m13m
CBE_m1: mov eax,[tmp1]
mov [m36m_a],eax
call m36m
call m31m
ret
;end; end;
CBF: ;//begin m10m; m27m; end;
;Begin asm
call m10m
call m27m
ret
; end; end;
CC0: ;begin //mA1m; if mA1m_Result<>0 then begin m25m; end else begin m82m; end; end;
;asm
call mA1m
cmp dword [mA1m_Result],$00
jz CC0_m1
call m25m
jmp CC0_ret
CC0_m1: call m82m
CC0_ret:
ret
;end; end;
CC1: ;begin //mB8m; rgC:=mB8m_Result; mB9m; rgB:=mB9m_Result; mD3m; end;
;asm
call mB8m
mov eax,[mB8m_Result]
mov [rgC],eax
call mB9m
mov eax,[mB9m_Result]
mov [rgB],eax
call mD3m
ret
;end; end;
CC2: ;begin //mA1m; if mA1m_Result<>0 then begin m03m; end
;// else begin m28m;m29m;rgPC:=m29m_Result+((m28m_Result shl 8)); m19m; end; end;
;asm
call mA1m
cmp dword [mA1m_Result],$00
jz CC2_m1
call m03m
jmp CC2_m2
CC2_m1: call m28m
call m29m
mov eax,[m28m_Result]
shl eax,$08
add eax,[m29m_Result]
mov [rgPC],eax
call m19m
CC2_m2:
ret
;end; end;
CC3: ;begin //m28m;m29m;rgPC:=m29m_Result+((m28m_Result shl 8)); m19m; end;
;asm
call m28m
call m29m
mov eax,[m28m_Result]
shl eax,$08
add eax,[m29m_Result]
mov [rgPC],eax
call m19m
ret
;end; end;
CC4: ;begin //mA1m; if mA1m_Result<>0 then begin m78m; end else
;// begin m28m;m29m;tmp1:=m29m_Result+((m28m_Result shl 8)); m50m; m02m; mB1m; end; end;
;asm
call mA1m
cmp dword [mA1m_Result],$00
jz CC4_m1
call m78m
jmp CC4_m2
CC4_m1: call m28m
call m29m
mov eax,[m28m_Result]
shl eax,$08
add eax,[m29m_Result]
mov [tmp1],eax
call m50m
call m02m
call mB1m
CC4_m2:
ret
;end; end;
CC5: ;begin //m50m; mB4m_a1:=rgC; mB4m_a2:=rgB; mB4m; mB2m; end;
;asm
call m50m
mov eax,[rgC]
mov [mB4m_a1],eax
mov eax,[rgB]
mov [mB4m_a2],eax
call mB4m
call mB2m
ret
;end; end;
CC6: ;begin //m47m; tmp2:=rgA+tmp1; m08m; m36m_a:=tmp1; m36m;
;//if (tmp2>$FF) then begin m65m; end; mD4m; end;
;asm
call m47m
mov eax,[rgA]
add eax,[tmp1]
mov [tmp2],eax
call m08m
mov eax,[tmp1]
mov [m36m_a],eax
call m36m
cmp [tmp2],$000000ff
jbe CC6_m1
call m65m
CC6_m1: call mD4m
ret
;end; end;
CC7: ;begin //mA7m; rgPC:=0*8; m20m; end;
;asm
call mA7m
xor eax,eax
mov [rgPC],eax
call m20m
ret
;end; end;
CC8: ;begin //m60m; if m60m_Result<>0 then begin m25m; end else begin m82m; end; end;
;asm
call m60m
cmp dword [m60m_Result],$00
jz CC8_m1
call m25m
jmp CC8_m2
CC8_m1: call m82m
CC8_m2:
ret
;end; end;
CC9: ;//begin m82m; end;
;Begin asm
call m82m
ret
; end; end;
CCA: ;begin //m60m; if m60m_Result<>0 then begin m03m; end else begin m77m; end; end;
;asm
call m60m
cmp dword [m60m_Result],$00
jz CCA_m1
call m03m
jmp CCA_m2
CCA_m1: call m77m
CCA_m2:
ret
;end; end;
CCB: ;// m77m;
;Begin asm
call m77m
ret
; end; end;
CCC: ;begin //m60m; if m60m_Result<>0 then begin m78m; end else m68m; end;
;asm
call m60m
cmp dword [m60m_Result],$00
jz CCC_m1
call m78m
jmp CCC_m2
CCC_m1: call m68m
CCC_m2:
ret
;end; end;
CCD: ;//m68m;
;Begin asm
call m68m
ret
; end; end;
CCE: ;begin //m47m; m73m_a:=tmp1; m73m; if (tmp2>$FF) then begin m65m; end; mD4m; end;
;asm
call m47m
mov eax,[tmp1]
mov [m73m_a],eax
call m73m
cmp [tmp2],$000000ff
jbe CCE_m1
call m65m
CCE_m1: call mD4m
ret
;end; end;
CCF: ;begin //mA7m; rgPC:=1*8; m20m; end;
;asm
call mA7m
mov [rgPC],$00000008
call m20m
ret
;end; end;
CD0: ;begin //m57m; if m57m_Result<>0 then begin m25m; end else begin m82m; end end;
;asm
call m57m
cmp dword [m57m_Result],$00
jz CD0_m1
call m25m
jmp CD0_m2
CD0_m1: call m82m
CD0_m2:
ret
;end; end;
CD1: ;begin //mB8m; rgE:=mB8m_Result; mB9m; rgD:=mB9m_Result; mD3m; end;
;asm
call mB8m
mov eax,[mB8m_Result]
mov [rgE],eax
call mB9m
mov eax,[mB9m_Result]
mov [rgD],eax
call mD3m
ret
;end; end;
CD2: ;begin //m57m; if m57m_Result<>0 then begin m03m; end else begin m77m; end; end;
;asm
call m57m
cmp dword [m57m_Result],$00
jz CD2_m1
call m03m
jmp CD2_m2
CD2_m1: call m77m
CD2_m2:
ret
;end; end;
CD3: ;begin //m29m; do_output_port:=m29m_Result;do_output_bt:=rgA;do_output; mC2m; end;
;asm
;call CycleProcesEvents ; ЦИКЛ ОБРАБОТКИ СОБЫТИЙ
call m29m
mov eax,[m29m_Result]
mov [do_output_port],eax
mov eax,[rgA]
mov [do_output_bt],eax
mov eax,ebx
call do_output
call mC2m
ret
;end; end;
CD4: ;begin //m57m; if m57m_Result<>0 then begin m78m; end else begin m68m; end; end;
;asm
call m57m
cmp dword [m57m_Result],$00
jz CD4_m1
call m78m
jmp CD4_m2
CD4_m1: call m68m
CD4_m2:
ret
;end; end;
CD5: ;begin //m50m; mB4m_a1:=rgE;mB4m_a2:=rgD; mB4m;mB2m; end;
;asm
call m50m
mov eax,[rgE]
mov [mB4m_a1],eax
mov eax,[rgD]
mov [mB4m_a2],eax
call mB4m
call mB2m
ret
;end; end;
CD6: ;//begin mD6m;mD5m; end;
;Begin asm
call mD6m
call mD5m
ret
; end; end;
CD7: ;begin //mA7m; rgPC:=2*8; m20m; end;
;asm
call mA7m
mov [rgPC],$00000010
call m20m
ret
;end; end;
CD8:; begin //m59m; if m59m_Result<>0 then begin m25m; end else begin m82m; end; end;
;asm
call m59m
cmp dword [m59m_Result],$00
jz CD8_m1
call m25m
jmp CD8_m2
CD8_m1: call m82m
CD8_m2:
ret
;end; end;
CD9:; //begin begin m82m; end; end;
;Begin asm
call m82m
ret
; end; end;
CDA: ;begin //m59m; if m59m_Result<>0 then begin m03m; end else begin m77m; end; end;
;asm
call m59m
cmp dword [m59m_Result],$00
jz CDA_m1
call m03m
jmp CDA_m2
CDA_m1: call m77m
CDA_m2:
ret
;end; end;
CDB: ;begin m29m; do_input_port:=m29m_Result; do_input;rgA:=do_input_Result; mC2m; end;
;//asm
;call CycleProcesEvents ; ЦИКЛ ОБРАБОТКИ СОБЫТИЙ
call m29m
mov eax,[m29m_Result]
mov [do_input_port],eax
mov eax,ebx
call do_input
mov eax,[do_input_Result]
mov [rgA],eax
call mC2m
ret
;//end; end;
CDC:; begin //m59m; if m59m_Result<>0 then begin m78m; end else begin m68m; end; end;
;asm
call m59m
cmp dword [m59m_Result],$00
jz CDC_m1
call m78m
jmp CDC_m2
CDC_m1: call m68m
CDC_m2:
ret
;end; end;
CDD:; //m68m;
;Begin asm
call m68m
ret
; end; end;
CDE: ;begin //m47m; m57m; if m57m_Result<>0 then tmp3:=1 else tmp3:=0;
;// m85m_a:=(rgA-tmp1-tmp3); m85m; m09m; if (rgA<tmp1+tmp3) then begin
;// m65m; end; m36m_a:=tmp1; m36m; mD5m; end;
;asm
call m47m
call m57m
cmp dword [m57m_Result],$00
jz CDE_m1
mov [tmp3],$00000001
jmp CDE_m2
CDE_m1: xor eax,eax
mov [tmp3],eax
CDE_m2: mov eax,[rgA]
sub eax,[tmp1]
sub eax,[tmp3]
mov [m85m_a],eax
call m85m
call m09m
mov eax,[tmp1]
add eax,[tmp3]
cmp eax,[rgA]
jbe CDE_m3
call m65m
CDE_m3: mov eax,[tmp1]
mov [m36m_a],eax
call m36m
call mD5m
ret
;end; end;
CDF: ;begin //mA7m; rgPC:=3*8; m20m; end;
;asm
call mA7m
mov [rgPC],$00000018
call m20m
ret
;end; end;
CE0: ;begin //m79m; if m79m_Result<>0 then begin m25m; end else begin m82m; end ; end;
;asm
call m79m
cmp dword [m79m_Result],$00
jz CE0_m1
call m25m
jmp CE0_m2
CE0_m1: call m82m
CE0_m2:
ret
;end; end;
CE1: ;begin //mB8m; rgL:=mB8m_Result; mB9m; rgH:=mB9m_Result; mD3m; end;
;asm
call mB8m
mov eax,[mB8m_Result]
mov [rgL],eax
call mB9m
mov eax,[mB9m_Result]
mov [rgH],eax
call mD3m
ret
;end; end;
CE2: ;begin //m79m; if m79m_Result<>0 then begin m03m; end else begin m77m; end; end;
;asm
call m79m
cmp dword [m79m_Result],$00
jz CE2_m1
call m03m
jmp CE2_m2
CE2_m1: call m77m
CE2_m2:
ret
;end; end;
CE3: ;begin //mB8m; tmp1:=mB8m_Result; mB7m_a:=(rgSP); mB7m; rgL:=tmp1;
;//mB9m; tmp1:=mB9m_Result; mB6m_a:=(rgSP+1); mB6m; rgH:=tmp1; clock:=clock+18; m14m; end;
;asm
call mB8m
mov eax,[mB8m_Result]
mov [tmp1],eax
mov eax,[rgSP]
mov [mB7m_a],eax
call mB7m
mov eax,[tmp1]
mov [rgL],eax
call mB9m
mov eax,[mB9m_Result]
mov [tmp1],eax
mov eax,[rgSP]
inc eax
mov [mB6m_a],eax
call mB6m
mov eax,[tmp1]
mov [rgH],eax
add dword [clock],$12
call m14m
ret
;end; end;
CE4: ;begin //m79m; if m79m_Result<>0 then begin m78m; end else begin m68m; end; end;
;asm
call m79m
cmp dword [m79m_Result],$00
jz CE4_m1
call m78m
jmp CE4_m2
CE4_m1: call m68m
CE4_m2:
ret
;end; end;
CE5: ;begin// m50m; mB4m_a1:=rgL; mB4m_a2:=rgH; mB4m; mB2m; end;
;asm
call m50m
mov eax,[rgL]
mov [mB4m_a1],eax
mov eax,[rgH]
mov [mB4m_a2],eax
call mB4m
call mB2m
ret
;end; end;
CE6: ;begin //m29m; m61m_a:=m29m_Result; m61m; mB3m; end;
;asm
call m29m
mov eax,[m29m_Result]
mov [m61m_a],eax
call m61m
call mB3m
ret
;end; end;
CE7: ;begin //mA7m; rgPC:=4*8; m20m; end;
;asm
call mA7m
mov [rgPC],$00000020
call m20m
ret
;end; end;
CE8: ;begin //m58m; if m58m_Result<>0 then begin m25m; end else begin m82m; end; end;
;asm
call m58m
cmp dword [m58m_Result],$00
jz CE8_m1
call m25m
jmp CE8_m2
CE8_m1: call m82m
CE8_m2:
ret
;end; end;
CE9: ;begin //rgPC:=(rgH shl 8)+rgL; m18m; end;
;asm
mov eax,[rgH]
shl eax,$08
add eax,[rgL]
mov [rgPC],eax
call m18m
ret
;end; end;
CEA: ;begin ///m58m; if m58m_Result<>0 then begin m03m; end else begin m77m; end; end;
;asm
call m58m
cmp dword [m58m_Result],$00
jz CEA_m1
call m03m
jmp CEA_m2
CEA_m1: call m77m
CEA_m2:
ret
;end; end;
CEB: ;begin //tmp1:=rgD; rgD:=rgH; rgH:=tmp1; tmp1:=rgE; rgE:=rgL; rgL:=tmp1; m16m; m14m; end;
;asm
mov eax,[rgD]
mov [tmp1],eax
mov eax,[rgH]
mov [rgD],eax
mov eax,[tmp1]
mov [rgH],eax
mov eax,[rgE]
mov [tmp1],eax
mov eax,[rgL]
mov [rgE],eax
mov eax,[tmp1]
mov [rgL],eax
call m16m
call m14m
ret
;end; end;
CEC: ;begin //m58m; if m58m_Result<>0 then begin m78m; end else begin m68m; end; end;
;asm
call m58m
cmp dword [m58m_Result],$00
jz CEC_m1
call m78m
jmp CEC_m2
CEC_m1: call m68m
CEC_m2:
ret
;end; end;
CED:; //m68m;
;Begin asm
call m68m
ret
; end; end;
CEE: ;begin //m29m;rgA:= rgA xor m29m_Result; mB3m; end;
;asm
call m29m
mov eax,[m29m_Result]
xor [rgA],eax
call mB3m
ret
;end; end;
CEF: ;begin //mA7m; rgPC:=5*8; m20m; end;
;asm
call mA7m
mov [rgPC],$00000028
call m20m
ret
;end; end;
CF0: ;begin //m53m; if m53m_Result<>0 then begin m25m; end else begin m82m; end; end;
;asm
call m53m
cmp dword [m53m_Result],$00
jz CF0_m1
call m25m
jmp CF0_m2
CF0_m1: call m82m
CF0_m2:
ret
;end; end;
CF1: ;begin //mB8m; rgF:=mB8m_Result; mB9m;rgA:=mB9m_Result; mD3m; end;
;asm
call mB8m
mov eax,[mB8m_Result]
mov [rgF],eax
call mB9m
mov eax,[mB9m_Result]
mov [rgA],eax
call mD3m
ret
;end; end;
CF2: ;begin //m53m;if m53m_Result<>0 then begin m03m; end else begin m77m; end; end;
;asm
call m53m
cmp dword [m53m_Result],$00
jz CF2_m1
call m03m
jmp CF2_m2
CF2_m1: call m77m
CF2_m2:
ret
;end;end;
CF3:;// m27m;
;Begin asm
call m27m
ret
; end; end;
CF4: ;begin //m53m; if m53m_Result<>0 then begin m78m; end else begin m68m; end; end;
;asm
call m53m
cmp dword [m53m_Result],$00
jz CF4_m1
call m78m
jmp CF4_m2
CF4_m1: call m68m
CF4_m2:
ret
;end;end;
CF5: ;begin //m50m; mB4m_a1:=rgF; mB4m_a2:=rgA; mB4m; mB2m; end;
;asm
call m50m
mov eax,[rgF]
mov [mB4m_a1],eax
mov eax,[rgA]
mov [mB4m_a2],eax
call mB4m
call mB2m
ret
;end;end;
CF6: ;begin //m29m;m64m_a:=m29m_Result; m64m; mB3m; end;
;asm
call m29m
mov eax,[m29m_Result]
mov [m64m_a],eax
call m64m
call mB3m
ret
;end;end;
CF7: ;begin //mA7m; rgPC:=6*8; m20m; end;
;asm
call mA7m
mov [rgPC],$00000030
call m20m
ret
;end;end;
CF8: ;begin //m54m; if m54m_Result<>0 then begin m25m; end else begin m82m; end; end;
;asm
call m54m
cmp dword [m54m_Result],$00
jz CF8_m1
call m25m
jmp CF8_m2
CF8_m1: call m82m
CF8_m2:
ret
;end;end;
CF9: ;begin //rgSP:=(rgH shl 8)+rgL; m25m; end;
;asm
mov eax,[rgH]
shl eax,$08
add eax,[rgL]
mov [rgSP],eax
call m25m
ret
;end;end;
CFA: ;begin //m54m;if m54m_Result<>0 then begin m03m; end else begin m77m; end; end;
;asm
call m54m
cmp dword [m54m_Result],$00
jz CFA_m1
call m03m
jmp CFA_m2
CFA_m1: call m77m
CFA_m2:
ret
;end;end;
CFB: ;// m27m;
;Begin asm
call m27m
ret
; end; end;
CFC: ;begin //m54m; if m54m_Result<>0 then begin m78m; end else begin m68m; end; end;
;asm
call m54m
cmp dword [m54m_Result],$00
jz CFC_m1
call m78m
jmp CFC_m2
CFC_m1: call m68m
CFC_m2:
ret
;end;end;
CFD: ;//m68m;
;Begin asm
call m68m
ret
; end; end;
CFE: ;//begin mD6m;m33m; end;
;Begin asm
call mD6m
call m33m
ret
; end; end;
CFF:; begin //mA7m; rgPC:=7*8; m20m; end
; asm
call mA7m
mov [rgPC],$00000038
call m20m
ret
; end; end;
; end;
; {$R+}
;end;
;==================================================
init_table_in_case_opcode:
mov[adrs+(4*0)],C00
mov[adrs+(4*1)],C01
mov[adrs+(4*2)],C02
mov[adrs+(4*3)],C03
mov[adrs+(4*4)],C04
mov[adrs+(4*5)],C05
mov[adrs+(4*6)],C06
mov[adrs+(4*7)],C07
mov[adrs+(4*8)],C08
mov[adrs+(4*9)],C09
mov[adrs+(4*10)],C0A
mov[adrs+(4*11)],C0B
mov[adrs+(4*12)],C0C
mov[adrs+(4*13)],C0D
mov[adrs+(4*14)],C0E
mov[adrs+(4*15)],C0F
mov[adrs+(4*16)],C10
mov[adrs+(4*17)],C11
mov[adrs+(4*18)],C12
mov[adrs+(4*19)],C13
mov[adrs+(4*20)],C14
mov[adrs+(4*21)],C15
mov[adrs+(4*22)],C16
mov[adrs+(4*23)],C17
mov[adrs+(4*24)],C18
mov[adrs+(4*25)],C19
mov[adrs+(4*26)],C1A
mov[adrs+(4*27)],C1B
mov[adrs+(4*28)],C1C
mov[adrs+(4*29)],C1D
mov[adrs+(4*30)],C1E
mov[adrs+(4*31)],C1F
mov[adrs+(4*32)],C20
mov[adrs+(4*33)],C21
mov[adrs+(4*34)],C22
mov[adrs+(4*35)],C23
mov[adrs+(4*36)],C24
mov[adrs+(4*37)],C25
mov[adrs+(4*38)],C26
mov[adrs+(4*39)],C27
mov[adrs+(4*40)],C28
mov[adrs+(4*41)],C29
mov[adrs+(4*42)],C2A
mov[adrs+(4*43)],C2B
mov[adrs+(4*44)],C2C
mov[adrs+(4*45)],C2D
mov[adrs+(4*46)],C2E
mov[adrs+(4*47)],C2F
mov[adrs+(4*48)],C30
mov[adrs+(4*49)],C31
mov[adrs+(4*50)],C32
mov[adrs+(4*51)],C33
mov[adrs+(4*52)],C34
mov[adrs+(4*53)],C35
mov[adrs+(4*54)],C36
mov[adrs+(4*55)],C37
mov[adrs+(4*56)],C38
mov[adrs+(4*57)],C39
mov[adrs+(4*58)],C3A
mov[adrs+(4*59)],C3B
mov[adrs+(4*60)],C3C
mov[adrs+(4*61)],C3D
mov[adrs+(4*62)],C3E
mov[adrs+(4*63)],C3F
mov[adrs+(4*64)],C40
mov[adrs+(4*65)],C41
mov[adrs+(4*66)],C42
mov[adrs+(4*67)],C43
mov[adrs+(4*68)],C44
mov[adrs+(4*69)],C45
mov[adrs+(4*70)],C46
mov[adrs+(4*71)],C47
mov[adrs+(4*72)],C48
mov[adrs+(4*73)],C49
mov[adrs+(4*74)],C4A
mov[adrs+(4*75)],C4B
mov[adrs+(4*76)],C4C
mov[adrs+(4*77)],C4D
mov[adrs+(4*78)],C4E
mov[adrs+(4*79)],C4F
mov[adrs+(4*80)],C50
mov[adrs+(4*81)],C51
mov[adrs+(4*82)],C52
mov[adrs+(4*83)],C53
mov[adrs+(4*84)],C54
mov[adrs+(4*85)],C55
mov[adrs+(4*86)],C56
mov[adrs+(4*87)],C57
mov[adrs+(4*88)],C58
mov[adrs+(4*89)],C59
mov[adrs+(4*90)],C5A
mov[adrs+(4*91)],C5B
mov[adrs+(4*92)],C5C
mov[adrs+(4*93)],C5D
mov[adrs+(4*94)],C5E
mov[adrs+(4*95)],C5F
mov[adrs+(4*96)],C60
mov[adrs+(4*97)],C61
mov[adrs+(4*98)],C62
mov[adrs+(4*99)],C63
mov[adrs+(4*100)],C64
mov[adrs+(4*101)],C65
mov[adrs+(4*102)],C66
mov[adrs+(4*103)],C67
mov[adrs+(4*104)],C68
mov[adrs+(4*105)],C69
mov[adrs+(4*106)],C6A
mov[adrs+(4*107)],C6B
mov[adrs+(4*108)],C6C
mov[adrs+(4*109)],C6D
mov[adrs+(4*110)],C6E
mov[adrs+(4*111)],C6F
mov[adrs+(4*112)],C70
mov[adrs+(4*113)],C71
mov[adrs+(4*114)],C72
mov[adrs+(4*115)],C73
mov[adrs+(4*116)],C74
mov[adrs+(4*117)],C75
mov[adrs+(4*118)],C76
mov[adrs+(4*119)],C77
mov[adrs+(4*120)],C78
mov[adrs+(4*121)],C79
mov[adrs+(4*122)],C7A
mov[adrs+(4*123)],C7B
mov[adrs+(4*124)],C7C
mov[adrs+(4*125)],C7D
mov[adrs+(4*126)],C7E
mov[adrs+(4*127)],C7F
mov[adrs+(4*128)],C80
mov[adrs+(4*129)],C81
mov[adrs+(4*130)],C82
mov[adrs+(4*131)],C83
mov[adrs+(4*132)],C84
mov[adrs+(4*133)],C85
mov[adrs+(4*134)],C86
mov[adrs+(4*135)],C87
mov[adrs+(4*136)],C88
mov[adrs+(4*137)],C89
mov[adrs+(4*138)],C8A
mov[adrs+(4*139)],C8B
mov[adrs+(4*140)],C8C
mov[adrs+(4*141)],C8D
mov[adrs+(4*142)],C8E
mov[adrs+(4*143)],C8F
mov[adrs+(4*144)],C90
mov[adrs+(4*145)],C91
mov[adrs+(4*146)],C92
mov[adrs+(4*147)],C93
mov[adrs+(4*148)],C94
mov[adrs+(4*149)],C95
mov[adrs+(4*150)],C96
mov[adrs+(4*151)],C97
mov[adrs+(4*152)],C98
mov[adrs+(4*153)],C99
mov[adrs+(4*154)],C9A
mov[adrs+(4*155)],C9B
mov[adrs+(4*156)],C9C
mov[adrs+(4*157)],C9D
mov[adrs+(4*158)],C9E
mov[adrs+(4*159)],C9F
mov[adrs+(4*160)],CA0
mov[adrs+(4*161)],CA1
mov[adrs+(4*162)],CA2
mov[adrs+(4*163)],CA3
mov[adrs+(4*164)],CA4
mov[adrs+(4*165)],CA5
mov[adrs+(4*166)],CA6
mov[adrs+(4*167)],CA7
mov[adrs+(4*168)],CA8
mov[adrs+(4*169)],CA9
mov[adrs+(4*170)],CAA
mov[adrs+(4*171)],CAB
mov[adrs+(4*172)],CAC
mov[adrs+(4*173)],CAD
mov[adrs+(4*174)],CAE
mov[adrs+(4*175)],CAF
mov[adrs+(4*176)],CB0
mov[adrs+(4*177)],CB1
mov[adrs+(4*178)],CB2
mov[adrs+(4*179)],CB3
mov[adrs+(4*180)],CB4
mov[adrs+(4*181)],CB5
mov[adrs+(4*182)],CB6
mov[adrs+(4*183)],CB7
mov[adrs+(4*184)],CB8
mov[adrs+(4*185)],CB9
mov[adrs+(4*186)],CBA
mov[adrs+(4*187)],CBB
mov[adrs+(4*188)],CBC
mov[adrs+(4*189)],CBD
mov[adrs+(4*190)],CBE
mov[adrs+(4*191)],CBF
mov[adrs+(4*192)],CC0
mov[adrs+(4*193)],CC1
mov[adrs+(4*194)],CC2
mov[adrs+(4*195)],CC3
mov[adrs+(4*196)],CC4
mov[adrs+(4*197)],CC5
mov[adrs+(4*198)],CC6
mov[adrs+(4*199)],CC7
mov[adrs+(4*200)],CC8
mov[adrs+(4*201)],CC9
mov[adrs+(4*202)],CCA
mov[adrs+(4*203)],CCB
mov[adrs+(4*204)],CCC
mov[adrs+(4*205)],CCD
mov[adrs+(4*206)],CCE
mov[adrs+(4*207)],CCF
mov[adrs+(4*208)],CD0
mov[adrs+(4*209)],CD1
mov[adrs+(4*210)],CD2
mov[adrs+(4*211)],CD3
mov[adrs+(4*212)],CD4
mov[adrs+(4*213)],CD5
mov[adrs+(4*214)],CD6
mov[adrs+(4*215)],CD7
mov[adrs+(4*216)],CD8
mov[adrs+(4*217)],CD9
mov[adrs+(4*218)],CDA
mov[adrs+(4*219)],CDB
mov[adrs+(4*220)],CDC
mov[adrs+(4*221)],CDD
mov[adrs+(4*222)],CDE
mov[adrs+(4*223)],CDF
mov[adrs+(4*224)],CE0
mov[adrs+(4*225)],CE1
mov[adrs+(4*226)],CE2
mov[adrs+(4*227)],CE3
mov[adrs+(4*228)],CE4
mov[adrs+(4*229)],CE5
mov[adrs+(4*230)],CE6
mov[adrs+(4*231)],CE7
mov[adrs+(4*232)],CE8
mov[adrs+(4*233)],CE9
mov[adrs+(4*234)],CEA
mov[adrs+(4*235)],CEB
mov[adrs+(4*236)],CEC
mov[adrs+(4*237)],CED
mov[adrs+(4*238)],CEE
mov[adrs+(4*239)],CEF
mov[adrs+(4*240)],CF0
mov[adrs+(4*241)],CF1
mov[adrs+(4*242)],CF2
mov[adrs+(4*243)],CF3
mov[adrs+(4*244)],CF4
mov[adrs+(4*245)],CF5
mov[adrs+(4*246)],CF6
mov[adrs+(4*247)],CF7
mov[adrs+(4*248)],CF8
mov[adrs+(4*249)],CF9
mov[adrs+(4*250)],CFA
mov[adrs+(4*251)],CFB
mov[adrs+(4*252)],CFC
mov[adrs+(4*253)],CFD
mov[adrs+(4*254)],CFE
mov[adrs+(4*255)],CFF
ret
;/конец = Таблица Case of
;======================================================
; //выполнение комманд процессора
;//{ДЛЯ i8080_do_opcodes }
i8080_do_opcodes:
;//1209: begin
;push ebx
;mov ebx,eax
;//1211: clock:=0; tmp1:=0; tmp2:=0; tmp3:=0; //бнулим :-)
xor eax,eax
mov [clock],eax
mov [tmp1],eax
mov [tmp2],eax
mov [tmp3],eax
;//1212: while (clock < i8080_do_opcodes_nb_cycles) do begin
mov eax,[clock]
cmp eax,[i8080_do_opcodes_nb_cycles]
jnb i8080_do_opcodes_nb_cycles_ret
;//1213: do_read_addr:=(rgPC);do_read;opcode:=do_read_Result;
i8080_do_opcodes_nb_cycles_m1:
and [rgPC],$0000ffff
mov eax,[rgPC]
mov [do_read_addr],eax
call do_read
mov eax,[do_read_result]
mov [opcode],eax
;///1214: i8080_do_opcodes_case_opcode_of; end;
;mov eax,ebx
call i8080_do_opcodes_case_opcode_of
;//1212: while (clock < i8080_do_opcodes_nb_cycles) do begin
mov eax,[clock]
cmp eax,[i8080_do_opcodes_nb_cycles]
jb i8080_do_opcodes_nb_cycles_m1
;//1216: end;
i8080_do_opcodes_nb_cycles_ret: ; pop ebx
ret
;================================
i8080_do_opcodes_case_opcode_of:
;call CycleProcesEvents ; ЦИКЛ ОБРАБОТКИ СОБЫТИЙ
mov eax,[opcode]
Call dword [eax*4+adrs]
ret
uKeyBoard.asm
TableKeyDopINIT:
;TableKeyDop rw 256
mov[TableKeyDop+(4*77)],$0000ff30; ;//{ВВЕРХ}
mov[TableKeyDop+(4*72)],$0000ff31; ;//{ВВЕРХ}
mov[TableKeyDop+(4*75)],$0000ff32; ;//ВЛЕВО;
mov[TableKeyDop+(4*80)],$0000ff33; ;//ВНИЗ;
mov[TableKeyDop+(4*56)],$62FF ; // (ALT) = СУ
mov[TableKeyDop+(4*29)],$35FF ; // (R-CTRL) = // ЛАТ
mov[TableKeyDop+(4*82)],$03FF ; // Insert = ГТ
mov[TableKeyDop+(4*73)],$14FF ; // PageUp = ПС
mov[TableKeyDop+(4*79)],$34FF ; // (END) = _
mov[TableKeyDop+(4*71)],$FF20 ; // Home = Home
mov[TableKeyDop+(4*81)],$FF10 ; // (PageDown) = (П/Д)
; РУС и енгл
mov[TableKeyOsnEngl+(4*42)],$33FF ; L-Shift // ВР
mov[TableKeyOsnEngl+(4*54)],$70FF ; R-Shift // НР
mov[TableKeyOsnRus+(4*42)],$33FF ; L-Shift // ВР
mov[TableKeyOsnRus+(4*54)],$70FF ; R-Shift // НР
mov[TableKeyOsnEngl+(4*56)], $62FF ; // (ALT) = СУ
mov[TableKeyOsnRus+(4*56)], $62FF ; // (ALT) = СУ
mov[TableKeyOsnEngl+(4*29)],$61FF ; // (L-CTRL) = РУС
mov[TableKeyOsnRus+(4*29)], $61FF ; // (L-CTRL) = РУС
mov[TableKeyOsnEngl+(4*1)],$40FF ; // esc - СТР
mov[TableKeyOsnRus+(4*1)], $40FF ; // esc - СТР
mov[TableKeyOsnEngl+(4*59)],$FF12 ; // (F1) = (F1 чмл)
mov[TableKeyOsnRus+(4*59)], $FF12 ; // (F1) = (F1 чмл)
mov[TableKeyOsnEngl+(4*60)],$FF13 ; // (F2) = (F2 змл)
mov[TableKeyOsnRus+(4*60)], $FF13 ; // (F2) = (F2 змл)
mov[TableKeyOsnEngl+(4*61)],$FF23 ; // F3
mov[TableKeyOsnRus+(4*61)], $FF23 ; // F3
mov[TableKeyOsnEngl+(4*62)],$FF22 ; // F4
mov[TableKeyOsnRus+(4*62)], $FF22 ; // F4
mov[TableKeyOsnEngl+(4*63)],$FF21 ; // F5
mov[TableKeyOsnRus+(4*63)], $FF21 ; // F5
mov[TableKeyOsnEngl+(4*64 )],$41FF ; // (F6) - (G)
mov[TableKeyOsnRus+(4*64)], $41FF ; // (F6) - (G)
mov[TableKeyOsnEngl+(4*65)],$42FF ; // (F7) - (B)
mov[TableKeyOsnRus+(4*65)], $42FF ; // (F7) - (B)
mov[TableKeyOsnEngl+(4*66)],$FF03 ; // (F8) = ("R")
mov[TableKeyOsnRus+(4*66)], $FF03 ; // (F8) = ("R")
mov[TableKeyOsnEngl+(4*67)],$FF11 ; // (F9) = (F0)
mov[TableKeyOsnRus+(4*67)], $FF11 ; // (F9) = (F0)
mov[TableKeyOsnEngl+(4*68)],$FF02 ; // (F10) = (Звук)
mov[TableKeyOsnRus+(4*68)], $FF02 ; // (F10) = (Звук)
mov[TableKeyOsnEngl+(4*87)],$FF01 ; // (F11) = (CD)
mov[TableKeyOsnRus+(4*87)], $FF01 ; // (F11) = (CD)
mov[TableKeyOsnEngl+(4*88)],$FF00 ; // (F12) = (ПЧ)
mov[TableKeyOsnRus+(4*88)], $FF00 ; // (F12) = (ПЧ)
; // Основная клавиатура соответствие при английской раскладке
mov[TableKeyOsnEngl+(4*7)],$00FF ; // 6
mov[TableKeyOsnEngl+(4*8)],$01FF ; // 7
mov[TableKeyOsnEngl+(4*9)],$02FF ; // 8
mov[TableKeyOsnEngl+(4*15)],$04FF ; // ТАБ
mov[TableKeyOsnEngl+(4*12)],$05FF ; // (-_) = (-=)
mov[TableKeyOsnEngl+(4*11)],$06FF ; // 0
mov[TableKeyOsnEngl+(4*10)],$07FF ; // 9
; {1}
mov[TableKeyOsnEngl+(4*34)],$10FF ; // G
mov[TableKeyOsnEngl+(4*26)],$11FF ; // [
mov[TableKeyOsnEngl+(4*27)],$12FF ; // ]
mov[TableKeyOsnEngl+(4*28)],$13FF ; // ENTER
mov[TableKeyOsnEngl+(4*39)],$15FF ; // (:;ж) = (:*)
mov[TableKeyOsnEngl+(4*35)],$16FF ; // H
mov[TableKeyOsnEngl+(4*44)],$17FF ; // Z
; {2}
mov[TableKeyOsnEngl+(4*19)],$20FF ; // R
mov[TableKeyOsnEngl+(4*24)],$21FF ; // O
mov[TableKeyOsnEngl+(4*38)],$22FF ; // L
mov[TableKeyOsnEngl+(4*14)],$23FF ; // ЗБ
mov[TableKeyOsnEngl+(4*52)],$24FF ; // (.>ю) = (.>)
mov[TableKeyOsnEngl+(4*43)],$25FF ; // (\/|) = (\)
mov[TableKeyOsnEngl+(4*47)],$26FF ; // V
mov[TableKeyOsnEngl+(4*32)],$27FF ; // D
; {3}
mov[TableKeyOsnEngl+(4*57)],$30FF ; // Пробел
mov[TableKeyOsnEngl+(4*48)],$31FF ; // B
; {4}
mov[TableKeyOsnEngl+(4*6)],$43FF ; // 5
mov[TableKeyOsnEngl+(4*5)],$44FF ; // 4
mov[TableKeyOsnEngl+(4*4)],$45FF ; // 3
mov[TableKeyOsnEngl+(4*3)],$46FF ; // 2
mov[TableKeyOsnEngl+(4*2)],$47FF ; // 1
; {5}
;// 50 и 51 -пусто по таблице
mov[TableKeyOsnEngl+(4*36)],$52FF ; // J
mov[TableKeyOsnEngl+(4*49)],$53FF ; // N
mov[TableKeyOsnEngl+(4*18)],$54FF ; // E
mov[TableKeyOsnEngl+(4*37)],$55FF ; // K
mov[TableKeyOsnEngl+(4*22)],$56FF ; // U
mov[TableKeyOsnEngl+(4*46)],$57FF ; // C
; {6}
mov[TableKeyOsnEngl+(4*41)],$60FF ; // (`~)=(;+)
mov[TableKeyOsnEngl+(4*25)],$63FF ; // P
mov[TableKeyOsnEngl+(4*30)],$64FF ; // A
mov[TableKeyOsnEngl+(4*17)],$65FF ; // W
mov[TableKeyOsnEngl+(4*21)],$66FF ; // Y
mov[TableKeyOsnEngl+(4*33)],$67FF ; // F
; {7}
mov[TableKeyOsnEngl+(4*16)],$71FF ; // Q
mov[TableKeyOsnEngl+(4*13)],$72FF ; // (+=) = (^)
mov[TableKeyOsnEngl+(4*45)],$73FF ; // X
mov[TableKeyOsnEngl+(4*20)],$74FF ; // T
mov[TableKeyOsnEngl+(4*23)],$75FF ; // I
mov[TableKeyOsnEngl+(4*50)],$76FF ; // M
mov[TableKeyOsnEngl+(4*31)],$77FF ; // S
mov[TableKeyOsnEngl+(4*40)],$32FF ; // ("'ЄєЭэ)= (@)
mov[TableKeyOsnEngl+(4*51)],$37FF ; // (,<) = (,)
mov[TableKeyOsnEngl+(4*53)],$36FF ; // (/?)= (/)
; - Конец основной англ.
; // Основная клавиатура соответствие при РУССКАЯ РАСКЛАДКИ
mov[TableKeyOsnRus+(4*7)], $00FF ; // 6
mov[TableKeyOsnRus+(4*8)], $01FF ; // 7
mov[TableKeyOsnRus+(4*9)], $02FF ; // 8
mov[TableKeyOsnRus+(4*15)], $04FF ; // ТАБ
mov[TableKeyOsnRus+(4*12)], $05FF ; // (-_) = (-=)
mov[TableKeyOsnRus+(4*11)], $06FF ; // 0
mov[TableKeyOsnRus+(4*10)], $07FF ; // 9
; {1}
mov[TableKeyOsnRus+(4*22)], $10FF ; // Г
mov[TableKeyOsnRus+(4*23)], $11FF ; // Ш
mov[TableKeyOsnRus+(4*24)], $12FF ; // Щ
mov[TableKeyOsnRus+(4*28)], $13FF ; // ENTER
mov[TableKeyOsnRus+(4*27)], $15FF ; // (:;ж) = (Ж)
mov[TableKeyOsnRus+(4*26)], $16FF ; // Х
mov[TableKeyOsnRus+(4*25)], $17FF ; // З
; {2}
mov[TableKeyOsnRus+(4*35)], $20FF ; // Р
mov[TableKeyOsnRus+(4*36)], $21FF ; // О
mov[TableKeyOsnRus+(4*37)], $22FF ; // Л
mov[TableKeyOsnRus+(4*14)], $23FF ; // ЗБ
mov[TableKeyOsnRus+(4*43)], $24FF ; // (\|) =
mov[TableKeyOsnRus+(4*40)], $25FF ; // Э
mov[TableKeyOsnRus+(4*39)], $26FF ; // Ж
mov[TableKeyOsnRus+(4*38)], $27FF ; // Д
; {3}
mov[TableKeyOsnRus+(4*57)], $30FF ; // Пробел
mov[TableKeyOsnRus+(4*51)], $31FF ; // Б
mov[TableKeyOsnRus+(4*52)], $32FF ; // Ю
;
mov[TableKeyOsnRus+(4*53)], $36FF ; // / (+=) = (,)
mov[TableKeyOsnRus+(4*13)], $37FF ; // (,<) = (+=)
; {4}
mov[TableKeyOsnRus+(4*6)], $43FF ; // 5
mov[TableKeyOsnRus+(4*5)], $44FF ; // 4
mov[TableKeyOsnRus+(4*4)], $45FF ; // 3
mov[TableKeyOsnRus+(4*3)], $46FF ; // 2
mov[TableKeyOsnRus+(4*2)], $47FF ; // 1
; {5}
;// 50 и 51 -пусто по таблице
mov[TableKeyOsnRus+(4*16)], $52FF ; // Й
mov[TableKeyOsnRus+(4*21)], $53FF ; // Н
mov[TableKeyOsnRus+(4*20)], $54FF ; // Е
mov[TableKeyOsnRus+(4*19)], $55FF ; // К
mov[TableKeyOsnRus+(4*18)], $56FF ; // У
mov[TableKeyOsnRus+(4*17)], $57FF ; // Ц
; {6}
mov[TableKeyOsnRus+(4*41)], $60FF ; // (`~)=(;+)
mov[TableKeyOsnRus+(4*34)], $63FF ; // П
mov[TableKeyOsnRus+(4*33)], $64FF ; // А
mov[TableKeyOsnRus+(4*32)], $65FF ; // В
mov[TableKeyOsnRus+(4*31)], $66FF ; // Ы
mov[TableKeyOsnRus+(4*30)], $67FF ; // Ф
; {7}
mov[TableKeyOsnRus+(4*44)], $71FF ; // Я
mov[TableKeyOsnRus+(4*45)], $72FF ; // Ч
mov[TableKeyOsnRus+(4*50)], $73FF ; // Ь
mov[TableKeyOsnRus+(4*49)], $74FF ; // Т
mov[TableKeyOsnRus+(4*48)], $75FF ; // И
mov[TableKeyOsnRus+(4*47)], $76FF ; // M
mov[TableKeyOsnRus+(4*46)], $77FF ; // С
ret
;Procedure readmask2; label readmask2_m1,readmask2_m2,readmask2_m3,readmask2_m4,readmask2_ret; // маска клавы
readmask_keynum rd 1
readmask_Result rd 1
readmask2:
mov [readmask_Result], 0
mov eax,[readmask_keynum]
cmp [ScanCodeKeyExt],1
jne readmask2_OSN;
; дополнительная
mov eax,[eax*4+TableKeyDop]
jmp readmask2_retd
;Основная
readmask2_OSN:
cmp [ScanCodeKeyExt],0
jne readmask2_retd;
;//KYB_MODE ( BE1DH (48669)) 7 бит =0, значит АНГЛ Раскадка
;If (b and 128)=0 then result:=Key_engl[keynum] else
;result:=Key_Rus[keynum];
xor ebx,ebx
mov bl, byte [memoryM+48669];
test bl, 128
jnz readmask2_rus
readmask2_engl:
mov eax,[eax*4+TableKeyOsnEngl]; англ.
jmp readmask2_retd
readmask2_rus:
mov eax,[eax*4+TableKeyOsnRus] ; рус
readmask2_retd:
mov [readmask_Result], eax
ret
;
;procedure kbdA; label kbd_m1,kbd_m2,kbd_m3,kbd_ret;// по маске вкл выкл клавишу
;begin
; asm
;// uKeyBoard.pas.111: kbd_bcol:=(kbd_mask SHR 12) and $0F; kbd_brow:=(kbd_mask SHR 8) and $0F;
kbd_mask rd 1
kbd_press rd 1
kbd_brow rd 1
kbd_erow rd 1
kbd_bcol rd 1
kbd_ecol rd 1
kbdA:
mov eax,[kbd_mask]
shr eax,$0c
and eax,$0f
mov [kbd_bcol],eax
mov eax,[kbd_mask]
shr eax,$08
and eax,$0f
mov [kbd_brow],eax
;//uKeyBoard.pas.112: kbd_ecol:=(kbd_mask SHR 4) and $0F; kbd_erow:=(kbd_mask SHR 0) and $0F;
mov eax,[kbd_mask]
shr eax,$04
and eax,$0f
mov [kbd_ecol],eax
mov eax,[kbd_mask]
shr eax,$00
and eax,$0f
mov [kbd_erow],eax
;//uKeyBoard.pas.113: if ((kbd_brow<8) and (kbd_bcol<8)) then
cmp dword [kbd_brow], dword $08
jnb kbd_m1
cmp dword [kbd_bcol],$08
jnb kbd_m1
;//uKeyBoard.pas.115: if kbd_press=1 then begin Rkbd_base_a:=kbd_bcol;Rkbd_base;
cmp dword [kbd_press],$01
jnz kbd_m2
mov eax, Rkbd_base_a
mov edx,[kbd_bcol]
mov [eax],edx
call Rkbd_base
;//uKeyBoard.pas.116: Wkbd_base_a:=kbd_bcol;Wkbd_base_b:=(Rkbd_base_result or (1 SHL kbd_brow));Wkbd_base; end
mov eax, Wkbd_base_a
mov edx,[kbd_bcol]
mov [eax],edx
mov ecx,[kbd_brow]
mov eax,$00000001
shl eax,cl
mov edx, Rkbd_base_result
or eax,[edx]
mov edx, Wkbd_base_b
mov [edx],eax
call Wkbd_base
jmp kbd_m1
;//uKeyBoard.pas.117: else begin Rkbd_base_a:=kbd_bcol;Rkbd_base;
kbd_m2: mov eax, Rkbd_base_a
mov edx,[kbd_bcol]
mov [eax],edx
call Rkbd_base
;//uKeyBoard.pas.118: Wkbd_base_a:=kbd_bcol;Wkbd_base_b:=(Rkbd_base_result and (not(1 SHL kbd_brow))); Wkbd_base; end;
mov eax, Wkbd_base_a
mov edx,[kbd_bcol]
mov [eax],edx
mov ecx,[kbd_brow]
mov eax,$00000001
shl eax,cl
not eax
mov edx, Rkbd_base_result
and eax,[edx]
mov edx, Wkbd_base_b
mov [edx],eax
call Wkbd_base
;//uKeyBoard.pas.120: if ((kbd_erow<8) and (kbd_ecol<4)) then
kbd_m1: cmp dword [kbd_erow],$08
jnb kbd_ret
cmp dword [kbd_ecol],$04
jnb kbd_ret
;//uKeyBoard.pas.121: begin Rkbd_ext_a:=kbd_ecol;Rkbd_ext;
mov eax, Rkbd_ext_a
mov edx,[kbd_ecol]
mov [eax],edx
call Rkbd_ext
;//uKeyBoard.pas.122: if (kbd_press=1) then begin Wkbd_ext_a:=kbd_ecol;Wkbd_ext_b:= (Rkbd_ext_result or (1 SHL kbd_erow));Wkbd_ext;
cmp dword [kbd_press],$01
jnz kbd_m3
mov eax, Wkbd_ext_a
mov edx,[kbd_ecol]
mov [eax],edx
mov ecx,[kbd_erow]
mov eax,$00000001
shl eax,cl
mov edx, Rkbd_ext_result
or eax,[edx]
mov edx, Wkbd_ext_b
mov [edx],eax
call Wkbd_ext
jmp kbd_ret
;//uKeyBoard.pas.123: end else begin Rkbd_ext_a:=kbd_ecol;Rkbd_ext; Wkbd_ext_a:=kbd_ecol;Wkbd_ext_b:=(Rkbd_ext_result and (not(1 SHL kbd_erow)));Wkbd_ext; end;
kbd_m3: mov eax, Rkbd_ext_a
mov edx,[kbd_ecol]
mov [eax],edx
call Rkbd_ext
mov eax, Wkbd_ext_a
mov edx,[kbd_ecol]
mov [eax],edx
mov ecx,[kbd_erow]
mov eax,$00000001
shl eax,cl
not eax
mov edx, Rkbd_ext_result
and eax,[edx]
mov edx, Wkbd_ext_b
mov [edx],eax
call Wkbd_ext
;//uKeyBoard.pas.126: end;
kbd_ret: ret
;end;end;
;======================================
KeyBoardInit:
mov eax,66
mov ebx,1
mov ecx,1 ; * 0 = обычный (ASCII-символы) * 1 = сканкоды
int 0x40
ret
;======================================
fPause dd 0 ; 0 - пауза отключена
PausePR:
xor [fPause],$ffffffff
ret
KeyProcess2:
call ScanCodeKey
;cmp [fPause],0
; jnz KeyProcess2_m1;
mov eax,[ScanCodeKey2]
mov [readmask_keynum],eax
call readmask2
cmp [readmask_Result],0
jz KeyProcess2_m1 ; если нет клавиши в таблице
mov eax,[readmask_Result]
mov [kbd_mask],eax
mov eax, [ScanCodeKeyUD]; если 0 - отжата, если 1 -нажата
mov [kbd_press],eax
call kbdA
mov [ScanCodeKeyExt],0
ret
KeyProcess2_m1:
; пауза
mov eax,[ScanCodeKey1]
cmp eax,211
jnz KeyProcess2_ret
call PausePR
mov [ScanCodeKeyExt],0
;mov [ScanCodeKey2],0
KeyProcess2_ret: ret
uLVComp.asm
Sign_begin_data: db 'BEGIN DATA' ; метка начала данных, для генерации КОС-файла memoryM db \ .................. portsM db \ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 flagsM db \ 70,2,2,6,2,6,6,2,2,6,6,2,6,2,2,6,2,6,6,\ 2,6,2,2,6,6,2,2,6,2,6,6,2,2,6,6,2,6,2,2,\ 6,6,2,2,6,2,6,6,2,6,2,2,6,2,6,6,2,2,6,6,\ 2,6,2,2,6,2,6,6,2,6,2,2,6,6,2,2,6,2,6,6,\ 2,6,2,2,6,2,6,6,2,2,6,6,2,6,2,2,6,6,2,2,\ 6,2,6,6,2,2,6,6,2,6,2,2,6,2,6,6,2,6,2,2,\ 6,6,2,2,6,2,6,6,2,130,134,134,130,134,130,130,134,134,130,130,\ 134,130,134,134,130,134,130,130,134,130,134,134,130,130,134,134,130,134,130,130,\ 134,134,130,130,134,130,134,134,130,130,134,134,130,134,130,130,134,130,134,134,\ 130,134,130,130,134,134,130,130,134,130,134,134,130,134,130,130,134,130,134,134,\ 130,130,134,134,130,134,130,130,134,130,134,134,130,134,130,130,134,134,130,130,\ 134,130,134,134,130,130,134,134,130,134,130,130,134,134,130,130,134,130,134,134,\ 130,134,130,130,134,130,134,134,130,130,134,134,130,134,130,130,134 rgA dd 0 rgB dd 0 rgC dd 0 rgD dd 0 rgE dd 0 rgH dd 0 rgL dd 0 rgF dd 0 rgSP dd 0 rgPC dd $0000c000 fS_ dd 128 fZ dd 64 f5 dd 32 fA dd 16 f3 dd 8 fP dd 4 f1 dd 2 fC dd 1 ;=============================== opcodes_to_run: dd 43500 ; 68500 - винде 43500- в кос(49,42) в КВ - (59,03) GraphicsMode dd 2 ; графический режим 0- 256х256 ; 1 -512х512 2- 768х512 TimerNumber: dd 3 ; номер движка таймера TimerDelay: dd 2 ; задержка ;=============================== LVColBlack dd 0 LVColLime dd $00FF00; LVColBlue dd $0000FF; LVColRed dd $FF0000; ;===============================
uMem.asm
;// Модуль доступа к памяти портам и т.д. и процедуры обрабатывающие их
;=======================================
do_write_addr rd 1
do_write_bt rd 1
do_write:
;//319: begin
;//321: if do_write_addr> $FFFF then do_write_addr:=$FFFF;
cmp [do_write_addr],$0000ffff
jbe do_write_m1
mov [do_write_addr],$0000ffff
;//322: if (do_write_addr>=$C000) then
do_write_m1:cmp [do_write_addr],$0000c000
jnb do_write_ret
;//324: Rports_a:=$C2;Rports; if ((Rports_result and 2)<>0) then begin Wmemory_A:=do_write_addr; Wmemory_B:=do_write_bt; Wmemory; end else
mov edx,$c2
xor ebx,ebx
mov bl,[portsM+edx]
test bl,$02
jz do_write_m2
mov eax,[do_write_addr]
mov edx,[do_write_bt]
mov [eax+memoryM],dl
jmp do_write_ret
;//325: if (do_write_addr<$4000) then begin exit; end else
do_write_m2: cmp [do_write_addr],$00004000
jb do_write_ret
;//326: if (do_write_addr<$8000) then begin Wvideo_a:=(do_write_addr-$4000);Wvideo_b:=do_write_bt; Wvideo; end else
cmp [do_write_addr],$00008000
jnb do_write_m3
mov eax,[do_write_addr]
sub eax,$00004000
mov edx,[do_write_bt]
mov [eax+videoM],dl
jmp do_write_ret
;//327: begin Wmemory_A:=do_write_addr; Wmemory_B:=do_write_bt; Wmemory; end;
do_write_m3: mov eax,[do_write_addr]
mov edx,[do_write_bt]
mov [eax+memoryM],dl
;//329: end;
do_write_ret:
ret
;=======================================
do_write2_a_lo rd 1
do_write2_a_hi rd 1
do_write2_bt rd 1
do_write2:
;pusha
;popa
;//375: begin {$R-} do_write_addr:=do_write2_a_lo+(do_write2_a_hi SHL 8);
mov edx,[do_write2_a_hi]
shl edx,$08
add edx,[do_write2_a_lo]
mov [do_write_addr],edx
;//376: do_write_bt:=do_write2_bt;do_write; {$R+}end;
mov edx,[do_write2_bt]
mov [do_write_bt],edx
call do_write
;//376: do_write_bt:=do_write2_bt;do_write; {$R+}end;
ret
;=======================================
do_read_addr rd 1
do_read_result:rd 1
do_read:
; //;237: begin
;//uMainDA.pas.239: if do_read_addr> $FFFF then do_read_addr:=$FFFF;
and [do_read_addr],$0000ffff
;//;240: RPorts_a:=$C2;RPorts; if ((RPorts_result and 2)<>0) then
do_read_m1:
mov edx,dword $c2
xor ebx,ebx
mov bl,[portsM+edx]
test ebx, dword $02
jz do_read_m2
;//;241: begin Rmemory_A:=do_read_addr; Rmemory; do_read_result:= Rmemory_result; end
mov edx,[do_read_addr]
xor ebx,ebx
mov bl,[memoryM+edx]
mov [do_read_result],ebx
do_read_ret:
ret
;//uMainDA.pas.242: else if (do_read_addr>$7FFF) then begin Rmemory_A:=do_read_addr; //Rmemory; do_read_result := Rmemory_result; end
do_read_m2: cmp [do_read_addr],$00007fff
jbe do_read_m3
mov edx,[do_read_addr]
xor ebx,ebx
mov bl,[memoryM+edx]
mov [do_read_result],ebx
jmp do_read_ret
;//uMainDA.pas.243: else if (do_read_addr<$4000) then begin do_read_result := 0; end else
do_read_m3: cmp [do_read_addr],$00004000
jnb do_read_m4
xor eax,eax
mov [do_read_result],eax
jmp do_read_ret
;//uMainDA.pas.244: begin Rvideo_a:=(do_read_addr-$4000); Rvideo; do_read_result := //Rvideo_result; end;
do_read_m4: mov eax,[do_read_addr]
sub eax,$00004000
xor ebx,ebx
mov bl,[videoM+eax]
mov [do_read_result],ebx
ret
;===============================================
do_read2_a_lo rd 1
do_read2_a_hi rd 1
do_read2_result rd 1
do_read2:
;//;301: begin {$R-} do_read_addr:=(do_read2_a_lo+(do_read2_a_hi SHL 8));do_read; do_read2_result:=do_read_result; {$R+}end;
mov edx,[do_read2_a_hi]
shl edx,$08
add edx,[do_read2_a_lo]
mov [do_read_addr],edx
call do_read
mov eax,[do_read_result]
mov [do_read2_result],eax
;//;301: begin {$R-} do_read_addr:=(do_read2_a_lo+(do_read2_a_hi SHL 8));do_read; do_read2_result:=do_read_result; {$R+}end;
ret
;===============================================
do_input_port rd 1
do_input_Result rd 1
do_input_C2:; // работа со значениями портов in
;//;396: Begin Rports_a:=$C2;Rports; do_input_Result:=Rports_result; end;
xor ebx,ebx
mov bl,[portsM+$000000c2]
mov [do_input_Result],ebx
;//;396: Begin Rports_a:=$C2;Rports; do_input_Result:=Rports_result; end;
ret
;=======================================
do_input_D1:; // работа со значениями портов in
;//410: Begin
push ebx
push esi
push edi
push ebp
mov edi,eax
;//411: Rports_a:=$D0;Rports; do_input_D0:=not Rports_result; r:=0;
;// mov [Rports_a],byte $000000d0
mov eax,edi
Push ebx
xor edx,edx
mov dl,[portsM+$000000d0]
pop ebx
mov esi,edx
not esi
xor ebp,ebp
;//412: For i:=0 to 7 do begin
xor ebx,ebx
;//413: if ((do_input_D0 and (1 SHL i))<>0) then
do_input_D1_m2: mov ecx,ebx
mov eax,$00000001
shl eax,cl
test eax,esi
jz do_input_D1_m1
;//414: begin rkbd_base_a:=i;rkbd_base; r:=(r or Rkbd_base_result); end;
mov [Rkbd_base_a],ebx
mov eax,edi
call Rkbd_base
or ebp,[Rkbd_base_result]
;//uMainDA.pas.415: end;
do_input_D1_m1: inc ebx
;//412: For i:=0 to 7 do begin
cmp ebx,$08
jnz do_input_D1_m2
;//416: do_input_Result:= ((not r) and $FF);
not ebp
and ebp,$000000ff
mov [do_input_Result],ebp
;//417: end;
pop ebp
pop edi
pop esi
pop ebx
ret
;=======================================
do_input_D2:
;//513: Begin
push ebx
push esi
push edi
push ebp
mov edi,eax
;//514: begin Rports_a:=$D2;Rports; do_input_D2_:= not Rports_result; r:=0;
mov eax,edi
xor ebx,ebx
mov bl,[portsM+$000000d2]
mov esi,ebx
not esi
xor ebp,ebp
;//515: for i:=0 to 3 do begin if ((do_input_D2_ and (1 SHL i))<>0) then
xor ebx,ebx
do_input_D2_m2: mov ecx,ebx
mov eax,$00000001
shl eax,cl
test eax,esi
jz do_input_D2_m1
;//516: begin Rkbd_ext_a:=i;Rkbd_ext; r:=(r or Rkbd_ext_result);end;
mov [Rkbd_ext_a],ebx
mov eax,edi
call Rkbd_ext
or ebp,[Rkbd_ext_result]
;//517: end;
do_input_D2_m1: inc ebx
;//515: for i:=0 to 3 do begin if ((do_input_D2_ and (1 SHL i))<>0) then
cmp ebx,$04
jnz do_input_D2_m2
;//518: do_input_Result:= not ((r SHL 4) or (do_input_D2_ and $0F)) and $FF;
shl ebp,$04
and esi,$0f
or ebp,esi
not ebp
and ebp,$000000ff
mov [do_input_Result],ebp
;//520: end;
pop ebp
pop edi
pop esi
pop ebx
ret
;====================================
do_input:; // работа со значениями портов in
;//563: do_input_port:=$C0+(do_input_port and $13);
mov edx,[do_input_port]
and edx,$13
add edx,$000000c0
mov [do_input_port],edx
;//564: case do_input_port of
sub edx,$000000c2
jz do_input_mc2
sub edx,$0f
jz do_input_md1
dec edx
jz do_input_md2
jmp do_input_melse
;//565: $C2:do_input_C2;
do_input_mc2: call do_input_C2
ret
;//566: $D1:do_input_D1;
do_input_md1: call do_input_D1
ret
;//567: $D2:do_input_D2
do_input_md2: call do_input_D2
ret
;//568: else begin do_input_Result:= $FF; end;
do_input_melse: mov [do_input_Result],$000000ff
;//571: end;
ret
;====================================
fillcharVideoDirty:
xor ebx,ebx
;uMain.pas.87: Rvideo_a:=c; Rvideo; WVideoDirty_a:=c;WVideoDirty_b:=(Rvideo_result xor ;l1);WVideoDirty;{$R+} end; end;
fillcharVideoDirty_m1:
xor ecx,ecx
mov cl,[videoM+ebx]
mov eax,ecx
xor eax,$01
mov [ebx+VideoDirtyM],al
inc ebx
;uMain.pas.86: var c:Cardinal; begin {$R-} For c:=0 to 16384 do begin
cmp ebx,$00004001
jnz fillcharVideoDirty_m1
;uMain.pas.87: Rvideo_a:=c; Rvideo; ;WVideoDirty_a:=c;WVideoDirty_b:=(Rvideo_result ;;1);WVideoDirty;{$R+} end; end;
ret
;====================================
do_output_port rd 1
do_output_bt rd 1
do_output:
;//599: begin
push ebx
mov ebx,eax
;//601: do_output_port:=$C0+(do_output_port and $13);
mov eax,[do_output_port]
and eax,$13
add eax,$000000c0
mov [do_output_port],eax
;//602: case do_output_port of
mov eax,[do_output_port]
sub eax,$000000c1
jnz do_output_m1
;//pas.604: fillcharVideoDirty;
mov eax,ebx
call fillcharVideoDirty
;//608: Wports_a:=do_output_port;Wports_b:=do_output_bt; Wports;
do_output_m1:
mov eax,[do_output_port]
mov edx,[do_output_bt]
mov [eax+portsM],dl
;//610: end ;
pop ebx
;pusha
;popa
ret
;==================================
Wkbd_base_a rd 1
Wkbd_base_b rd 1
Wkbd_base:
mov eax,[Wkbd_base_a]
mov edx,[Wkbd_base_b]
mov [eax+kbd_baseM],dl
ret
;=======================================
Rkbd_base_a rd 1
Rkbd_base_result rd 1
Rkbd_base:
Push ebx
mov edx,[Rkbd_base_a]
xor ebx,ebx
mov bl,[kbd_baseM+edx]
mov [Rkbd_base_result],ebx
pop ebx
ret
;===========================
Rkbd_ext_a rd 1
Rkbd_ext_result rd 1
Rkbd_ext:
Push ebx
mov edx,[Rkbd_ext_a]
xor ebx,ebx
mov bl,[kbd_extM+edx]
mov [Rkbd_ext_result],ebx
pop ebx
ret
;===========================
Wkbd_ext_a rd 1
Wkbd_ext_b rd 1
Wkbd_ext:
mov eax,[Wkbd_ext_a]
mov edx,[Wkbd_ext_b]
mov [eax+kbd_extM],dl
ret
;=======================================CONFIG.INC
__CPU_type fix p5
MACROS.INC
@^ fix macro comment {
^@ fix }
; -------------------------
macro library [lname,fname]
{
forward
dd __#lname#_library_table__,__#lname#_library_name__
common
dd 0
forward
align 4
__#lname#_library_name__ db fname,0
}
macro import lname,[name,sname]
{
common
align 4
__#lname#_library_table__:
forward
if used name
name dd __#name#_import_name__
end if
common
dd 0
forward
if used name
align 4
__#name#_import_name__ db sname,0
end if
}
macro export [name,sname]
{
forward
dd __#name#_export_name__,name
common
dd 0
forward
align 4
__#name#_export_name__ db sname,0
}
; -------------------------
macro m2m dest,src {
push src
pop dest
}
macro iglobal {
IGlobals equ IGlobals,
macro __IGlobalBlock { }
macro uglobal {
UGlobals equ UGlobals,
macro __UGlobalBlock { }
endg fix } ; Use endg for ending iglobal and uglobal blocks.
macro IncludeIGlobals{
macro IGlobals dummy,[n] \{ __IGlobalBlock
purge __IGlobalBlock \}
match I, IGlobals \{ I \} }
macro IncludeUGlobals{
macro UGlobals dummy,[n] \{
\common
\local begin, size
begin = $
virtual at $
\forward
__UGlobalBlock
purge __UGlobalBlock
\common
size = $ - begin
end virtual
rb size
\}
match U, UGlobals \{ U \} }
uglobal
endg
iglobal
endg
; new application structure
macro meos_app_start
{
use32
org 0x0
db 'MENUET01'
dd 0x01
dd __start
dd __end
dd __memory
dd __stack
if used __params & ~defined __params
dd __params
else
dd 0x0
end if
dd 0x0
}
MEOS_APP_START fix meos_app_start
macro code
{
__start:
}
CODE fix code
macro data
{
__data:
IncludeIGlobals
}
DATA fix data
macro udata
{
if used __params & ~defined __params
__params:
db 0
__end:
rb 255
else
__end:
end if
__udata:
IncludeUGlobals
}
UDATA fix udata
macro meos_app_end
{
align 32
rb 2048
__stack:
__memory:
}
MEOS_APP_END fix meos_app_end
; macro for defining multiline text data
struc mstr [sstring]
{
forward
local ssize
virtual at 0
db sstring
ssize = $
end virtual
dd ssize
db sstring
common
dd -1
}
; macro for defining multiline text data
struc mls [sstring]
{
forward
local ssize
virtual at 0
db sstring ; mod
ssize = $
end virtual
db ssize
db sstring
common
db -1 ; mod
}
; strings
macro sz name,[data] { ; from MFAR [mike.dld]
common
if used name
name db data
.size = $-name
end if
}
macro szZ name,[data] { ; same as sz, but with 0 at the end of line (ASCIIZ string) [dunkaist]
common
if used name
name db data,0
.size = $-name-1
end if
}
sz0 fix szZ
macro lsz name,[lng,data] { ; from MFAR [mike.dld]
common
if used name
label name
forward
if lang eq lng
db data
end if
common
.size = $-name
end if
}
macro szc name,elsz,[data] { ; from MFAR [mike.dld]
common
local s,m
m = 0
if used name
label name
forward
virtual at 0
db data
s = $
end virtual
d#elsz s
if m < s
m = s
end if
db data
common
.size = $-name
.maxl = m
end if
}
macro lszc name,elsz,[lng,data] { ; from MFAR [mike.dld]
common
local s,m,c
m = 0
c = 0
if used name
label name
forward
if lang eq lng
virtual at 0
db data
s = $
end virtual
d#elsz s
if m < s
m = s
end if
db data
c = c+1
end if
common
.size = $-name
.maxl = m
.count = c
end if
}
; easy system call macro
macro mpack dest, hsrc, lsrc
{
if (hsrc eqtype 0) & (lsrc eqtype 0)
mov dest, (hsrc) shl 16 + lsrc
else
if (hsrc eqtype 0) & (~lsrc eqtype 0)
mov dest, (hsrc) shl 16
add dest, lsrc
else
mov dest, hsrc
shl dest, 16
add dest, lsrc
end if
end if
}
macro __mov reg,a,b { ; mike.dld
if (~a eq)&(~b eq)
mpack reg,a,b
else if (~a eq)&(b eq)
mov reg,a
end if
}
include 'config.inc'
;__CPU_type equ p5
SYSENTER_VAR equ 0
macro mcall a,b,c,d,e,f { ; mike.dld
__mov eax,a
__mov ebx,b
__mov ecx,c
__mov edx,d
__mov esi,e
__mov edi,f
int 0x40
}
; -------------------------
macro header a,[b] {
common
use32
org 0
db 'MENUET',a
forward
if b eq
dd 0
else
dd b
end if }
macro section name { align 16
label name }
macro func name {
if ~used name
display 'FUNC NOT USED: ',`name,13,10
else
align 4
name:
;diff16 `name,0,name
;pushad
;pushfd
;dps `name
;newline
;mcall 5,1
;popfd
;popad
}
macro endf { end if }
macro diff16 title,l1,l2
{
local s,d
s = l2-l1
display title,': 0x'
repeat 8
d = '0' + s shr ((8-%) shl 2) and $0F
if d > '9'
d = d + 'A'-'9'-1
end if
display d
end repeat
display 13,10
}
macro diff10 title,l1,l2
{
local s,d,z,m
s = l2-l1
z = 0
m = 1000000000
display title,': '
repeat 10
d = '0' + s / m
s = s - (s/m)*m
m = m / 10
if d <> '0'
z = 1
end if
if z <> 0
display d
end if
end repeat
display 13,10
}
; optimize the code for size
__regs fix <eax,ebx,ecx,edx,esi,edi,ebp,esp>
macro add arg1,arg2
{
if (arg2 eqtype 0)
if (arg2) = 1
inc arg1
else
add arg1,arg2
end if
else
add arg1,arg2
end if
}
macro sub arg1,arg2
{
if (arg2 eqtype 0)
if (arg2) = 1
dec arg1
else
sub arg1,arg2
end if
else
sub arg1,arg2
end if
}
macro mov arg1,arg2
{
if (arg1 in __regs) & ((arg2 eqtype 0) | (arg2 eqtype '0'))
if (arg2) = 0
xor arg1,arg1
else if (arg2) = 1
xor arg1,arg1
inc arg1
else if (arg2) = -1
or arg1,-1
else if (arg2) > -128 & (arg2) < 128
push arg2
pop arg1
else
mov arg1,arg2
end if
else
mov arg1,arg2
end if
}
macro RGB [a] {
common
match (r=,g=,b),a \{
\dd ((r) shl 16) or ((g) shl 8) or (b)
\}
}
struc POINT _t,_dx,_dy {
.x _t _dx
.y _t _dy
}
; structure definition helper
include 'struct.inc'
struct RECT
left dd ?
top dd ?
right dd ?
bottom dd ?
ends
struct BOX
left dd ?
top dd ?
width dd ?
height dd ?
ends
; structures used in MeOS
struct process_information
cpu_usage dd ? ; +0
window_stack_position dw ? ; +4
window_stack_value dw ? ; +6
dw ? ; +8
process_name rb 12 ; +10
memory_start dd ? ; +22
used_memory dd ? ; +26
PID dd ? ; +30
box BOX ; +34
slot_state dw ? ; +50
dw ? ; +52
client_box BOX ; +54
wnd_state db ? ; +70
rb (1024-71)
ends
struct system_colors
frame dd ?
grab dd ?
grab_button dd ?
grab_button_text dd ?
grab_text dd ?
work dd ?
work_button dd ?
work_button_text dd ?
work_text dd ?
work_graph dd ?
ends
struct FILEDATE
Second db ?
Minute db ?
Hour db ?
db ?
Day db ?
Month db ?
Year dw ?
ends
struct FILEINFO
Attributes dd ?
IsUnicode db ?
db 3 dup(?)
DateCreate FILEDATE
DateAccess FILEDATE
DateModify FILEDATE
Size dq ?
ends
; constants
; events
EV_IDLE = 0
EV_TIMER = 0
EV_REDRAW = 1
EV_KEY = 2
EV_BUTTON = 3
EV_EXIT = 4
EV_BACKGROUND = 5
EV_MOUSE = 6
EV_IPC = 7
EV_STACK = 8
; event mask bits for function 40
EVM_REDRAW = 1b
EVM_KEY = 10b
EVM_BUTTON = 100b
EVM_EXIT = 1000b
EVM_BACKGROUND = 10000b
EVM_MOUSE = 100000b
EVM_IPC = 1000000b
EVM_STACK = 10000000b
STRUCT.INC
; Macroinstructions for defining data structures
macro struct name
{ fields@struct equ name
match child parent, name \{ fields@struct equ child,fields@\#parent \}
sub@struct equ
struc db [val] \{ \common fields@struct equ fields@struct,.,db,<val> \}
struc dw [val] \{ \common fields@struct equ fields@struct,.,dw,<val> \}
struc du [val] \{ \common fields@struct equ fields@struct,.,du,<val> \}
struc dd [val] \{ \common fields@struct equ fields@struct,.,dd,<val> \}
struc dp [val] \{ \common fields@struct equ fields@struct,.,dp,<val> \}
struc dq [val] \{ \common fields@struct equ fields@struct,.,dq,<val> \}
struc dt [val] \{ \common fields@struct equ fields@struct,.,dt,<val> \}
struc rb count \{ fields@struct equ fields@struct,.,db,count dup (?) \}
struc rw count \{ fields@struct equ fields@struct,.,dw,count dup (?) \}
struc rd count \{ fields@struct equ fields@struct,.,dd,count dup (?) \}
struc rp count \{ fields@struct equ fields@struct,.,dp,count dup (?) \}
struc rq count \{ fields@struct equ fields@struct,.,dq,count dup (?) \}
struc rt count \{ fields@struct equ fields@struct,.,dt,count dup (?) \}
macro db [val] \{ \common \local anonymous
fields@struct equ fields@struct,anonymous,db,<val> \}
macro dw [val] \{ \common \local anonymous
fields@struct equ fields@struct,anonymous,dw,<val> \}
macro du [val] \{ \common \local anonymous
fields@struct equ fields@struct,anonymous,du,<val> \}
macro dd [val] \{ \common \local anonymous
fields@struct equ fields@struct,anonymous,dd,<val> \}
macro dp [val] \{ \common \local anonymous
fields@struct equ fields@struct,anonymous,dp,<val> \}
macro dq [val] \{ \common \local anonymous
fields@struct equ fields@struct,anonymous,dq,<val> \}
macro dt [val] \{ \common \local anonymous
fields@struct equ fields@struct,anonymous,dt,<val> \}
macro rb count \{ \local anonymous
fields@struct equ fields@struct,anonymous,db,count dup (?) \}
macro rw count \{ \local anonymous
fields@struct equ fields@struct,anonymous,dw,count dup (?) \}
macro rd count \{ \local anonymous
fields@struct equ fields@struct,anonymous,dd,count dup (?) \}
macro rp count \{ \local anonymous
fields@struct equ fields@struct,anonymous,dp,count dup (?) \}
macro rq count \{ \local anonymous
fields@struct equ fields@struct,anonymous,dq,count dup (?) \}
macro rt count \{ \local anonymous
fields@struct equ fields@struct,anonymous,dt,count dup (?) \}
macro union \{ fields@struct equ fields@struct,,union,<
sub@struct equ union \}
macro struct \{ fields@struct equ fields@struct,,substruct,<
sub@struct equ substruct \}
virtual at 0 }
macro ends
{ match , sub@struct \{ restruc db,dw,du,dd,dp,dq,dt
restruc rb,rw,rd,rp,rq,rt
purge db,dw,du,dd,dp,dq,dt
purge rb,rw,rd,rp,rq,rt
purge union,struct
match name=,fields,fields@struct \\{ fields@struct equ
make@struct name,fields
fields@\\#name equ fields \\}
end virtual \}
match any, sub@struct \{ fields@struct equ fields@struct> \}
restore sub@struct }
macro make@struct name,[field,type,def]
{ common
if $
display 'Error: definition of ',`name,' contains illegal instructions.',0Dh,0Ah
err
end if
local define
define equ name
forward
local sub
match , field \{ make@substruct type,name,sub def
define equ define,.,sub, \}
match any, field \{ define equ define,.#field,type,<def> \}
common
match fields, define \{ define@struct fields \} }
macro define@struct name,[field,type,def]
{ common
local list
list equ
forward
if ~ field eq .
name#field type def
sizeof.#name#field = $ - name#field
else
rb sizeof.#type
end if
local value
match any, list \{ list equ list, \}
list equ list <value>
common
sizeof.#name = $
restruc name
match values, list \{
struc name value \\{
match any, fields@struct \\\{ fields@struct equ fields@struct,.,name,<values> \\\}
match , fields@struct \\\{ label .
forward
match , value \\\\{ field type def \\\\}
match any, value \\\\{ field type value
if ~ field eq .
rb sizeof.#name#field - ($-field)
end if \\\\}
common \\\} \\} \} }
macro enable@substruct
{ macro make@substruct substruct,parent,name,[field,type,def]
\{ \common
\local define
define equ parent,name
\forward
\local sub
match , field \\{ match any, type \\\{ enable@substruct
make@substruct type,name,sub def
purge make@substruct
define equ define,.,sub, \\\} \\}
match any, field \\{ define equ define,.\#field,type,<def> \\}
\common
match fields, define \\{ define@\#substruct fields \\} \} }
enable@substruct
macro define@union parent,name,[field,type,def]
{ common
virtual at 0
forward
if ~ field eq .
virtual at 0
parent#field type def
sizeof.#parent#field = $ - parent#field
end virtual
if sizeof.#parent#field > $
rb sizeof.#parent#field - $
end if
else if sizeof.#type > $
rb sizeof.#type - $
end if
common
sizeof.#name = $
end virtual
struc name [value] \{ \common
label .\#name
last@union equ
forward
match any, last@union \\{ virtual at .\#name
field type def
end virtual \\}
match , last@union \\{ match , value \\\{ field type def \\\}
match any, value \\\{ field type value \\\} \\}
last@union equ field
common rb sizeof.#name - ($ - .\#name) \} }
macro define@substruct parent,name,[field,type,def]
{ common
virtual at 0
forward
if ~ field eq .
parent#field type def
sizeof.#parent#field = $ - parent#field
else
rb sizeof.#type
end if
local value
common
sizeof.#name = $
end virtual
struc name value \{
label .\#name
forward
match , value \\{ field type def \\}
match any, value \\{ field type value
if ~ field eq .
rb sizeof.#parent#field - ($-field)
end if \\}
common \} }
Emul.prt
; FASM Editor include "Main.asm" if 2 * 2 = 5 [options] countAsm=1 countInc=0 [asm] asm1="Main.asm" [inc] end if
DELPHI\001\
Emul.dpr
program Emul;
uses
Forms,
Windows,
uMain in 'uMain.pas' {MainForm};
{$R *.res}
begin
SetThreadLocale(1049);
Application.Initialize;
Application.Title := 'ПК ЛЬВОВ';
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.
SOURCE_DELPHI\001\
uMain.pas part1
unit uMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Menus,MMSystem,ShellAPI, ImgList, ComCtrls,
ToolWin;
type
TserviceThread = Class (TThread)
public
procedure Execute; override;
End;
TMainForm = class(TForm)
TimerMain: TTimer;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
FullScreen1: TMenuItem;
N6: TMenuItem;
N17: TMenuItem;
OpenDialogLvt: TOpenDialog;
ResetCPU1: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
N9: TMenuItem;
N10: TMenuItem;
N11: TMenuItem;
N12: TMenuItem;
N13: TMenuItem;
N14: TMenuItem;
N15: TMenuItem;
Russian1: TMenuItem;
English1: TMenuItem;
ToolBar1: TToolBar;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
ToolButton3: TToolButton;
ImageList1: TImageList;
ToolButton4: TToolButton;
ToolButton5: TToolButton;
ToolButton6: TToolButton;
ToolButton7: TToolButton;
ToolButton8: TToolButton;
ToolButton9: TToolButton;
ToolButton10: TToolButton;
ToolButton11: TToolButton;
ToolButton12: TToolButton;
ToolButton13: TToolButton;
procedure TimerMainTimer(Sender: TObject);
procedure do_write(addr : word; bt : byte);
procedure i8080_init;
procedure i8080_reset(addr: word);
procedure invalid_opcode (opcode: byte);
procedure putSound(bt : byte);
function do_read(addr : integer): word;
procedure do_write2(a_lo : word; a_hi : word; bt : byte);
function do_read2(a_lo : word; a_hi : word): word;
function compute_color_index(port : byte; color : tcolor): tcolor;
procedure WriteVRAM(b:Byte;x,y: integer);
procedure init_memory();
function do_input(port : byte): byte;
function signal_inv_opc: boolean;
procedure do_output(port : byte; bt : byte);
procedure kbd(mask : word; press : boolean);
procedure reset1;
procedure load_bios;
function get_var(var1: word): word;
procedure set_var(var1, val: word);
procedure warm_start();
procedure do_pause();
procedure playTone();
procedure enableSound();
procedure i8080_do_opcodes(nb_cycles : integer);
procedure draw_screen();
procedure FirstPusk;
function readmask (keynum: word): word;
procedure N4Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure FullScreen1Click(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure N17Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure NewLoadFile(filenameDnD: string;start : boolean);
procedure ResetComp;
procedure ResetCPU1Click(Sender: TObject);
function GrayTV(RGBColor : TColor) : TColor;
procedure N7Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure N11Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure PlayBuffer(Buffer: array of byte);
procedure N13Click(Sender: TObject);
procedure VRAMTest(c1,b:Byte);
procedure CalculateColor;
procedure Russian1Click(Sender: TObject);
procedure English1Click(Sender: TObject);
private
{ Private declarations }
public
procedure WMDropFiles(var Msg: TMessage); message wm_DropFiles;
{ Public declarations }
end;
var
MainForm: TMainForm;
ServiceThread: TServiceThread;
r_A : INTEGER; // регистрики
r_B : INTEGER;
r_C : INTEGER;
r_D : INTEGER;
r_E : INTEGER;
r_H : INTEGER;
r_L : INTEGER;
r_F : INTEGER;
r_PC : integer; // адрес в памяти
r_SP : integer;
clock : integer;
flags: array [0..256] of word;
f_S : byte; // флаги
f_Z : byte;
f_5 : byte;
f_A : byte;
f_3 : byte;
f_P : byte;
f_1 : byte;
f_C : byte;
opcode : byte; // код текущей операции !!!
halt_inv :byte;
halt_opc :byte;
halt_hlt :byte;
halt_bpx :byte;
halt_bpr :byte;
halt_bpw :byte;
halt_bpi :byte;
halt_bpo :byte;
FPusk: boolean; // первый запуск
gamecanvas: tbitmap; // сюда все рисуем перед выводом на форму
memory: array [0..65535] of byte; // массив основной памяти $FFFF
video : array [0..16384] of byte; // видео память
VideoDirty : array [0..16384] of word; //буфер для быстрой прорисовки
ports : array [0..256] of byte; // порты
bios : array [0..65535] of byte; // массив для загрузки биоса, можно сразу грузить но вдруг пригодися
Myfile: array [0..90000] of byte; //файл может быть большим DUMP SAV который
SuperColor: array[0..255, 0..255,1..4] of Tcolor; // еще один вариант по цвету
pause : boolean; //пауза в эмуляторе
FPS : integer; // frames per second :-)
speaker: array [0..2000] of word; //массивы для звуков
speaked : word;
soundData: array [0..2000] of BYTE;
soundEnabled : boolean;
{ header : TWaveFormatEx;
waveOut : hWaveOut;
outHdr : TWaveHdr;
pBuf : tHandle;
pBuffer : pointer;}
myfilelength: word; // длина скачаного файла
//_filePos : integer;
r_Halted: boolean;
kbd_base : array [0..8] of byte; // массивы опроса клавиатуры
kbd_ext : array [0..4] of byte;
BasicStack : word; // переменные для бейсик программ
BasicHotEntry : word;
BasicProgBegin : word;
BasicProgEnd : word;
opcodes_to_run : integer;
curSnd : word;
restClock : word;
const MyColor:array[0..3] of Tcolor=(clBlack,clLime,clBlue,clRed);
implementation
{$R *.dfm}
procedure TMainForm.WMDropFiles(var Msg: TMessage); // порцедура отвечает за принятие перетаскиваемого файла
var
FileName: array[0..256] of char;
begin
DragQueryFile(THandle(Msg.WParam), 0, FileName, SizeOf(Filename));
MainForm.Caption:=FileName;
NewLoadFile(FileName,true);
DragFinish(THandle(Msg.WParam));
end;
procedure TMainForm.do_write(addr : word; bt : byte); // если нужно будем записывать :-)
begin
addr:=(addr and $FFFF);
if (addr>=$C000) then
begin
exit;
end;
if ((ports[$C2] and 2)<>0) then
begin
memory[addr]:=bt;
end
else
if (addr<$4000) then
begin
exit;
end
else
if (addr<$8000) then
begin
video[addr-$4000]:=bt;
// memory[addr]:=bt; // запишем еще и в память но не всегда
end
else
begin
memory[addr]:=bt;
end;
end;
procedure TMainForm.i8080_init;
var
j,i : word;
begin
i:=0;
while (i<256) do
begin
flags[i]:=f_1 or f_P;
j:=0;
while (j<8) do
begin
if ((i and (1 SHL j))<>0) then
begin
flags[i]:=(flags[i] xor f_P);
end;
inc(j);
end;
if ((i and $80)<>0) then
begin
flags[i]:=(flags[i] or f_S);
end;
if (i=0) then
begin
flags[i]:=(flags[i] or f_Z);
end;
inc(i);
end;
end;
procedure TMainForm.i8080_reset(addr: word);
begin
r_A:=0;
r_F:=0;
r_B:=0;
r_C:=0;
r_D:=0;
r_E:=0;
r_H:=0;
r_L:=0;
r_SP:=0;
r_Halted:=false;
clock:=0;
r_PC:=addr;
end;
procedure TMainForm.invalid_opcode (opcode: byte); // а такое может возникнуть !!!???
begin
ShowMessage('Нет такого кода у данного процессора '+inttostr(opcode)+' в '+inttostr(r_PC));
inc(r_PC);
r_PC:=r_PC and $ffff;
end;
procedure TMainForm.N11Click(Sender: TObject);
begin
n11.Checked:=not n11.Checked;
if n11.Checked then ToolButton3.ImageIndex:=8 else ToolButton3.ImageIndex:=7;
pause:=n11.Checked;
end;
procedure TMainForm.N13Click(Sender: TObject);
begin
N13.Checked:= not N13.Checked;
end;
procedure TMainForm.N17Click(Sender: TObject);
begin
ShowMessage('Альфа 0.5');
end;
function TMainForm.do_read(addr : integer): word; // считаем значение из пямяти
begin
addr:=(addr and $FFFF);
if ((ports[$C2] and 2)<>0) then
begin
result := memory[addr];
end
else
if (addr>$7FFF) then
begin
result := memory[addr];
end
else if (addr<$4000) then
begin
result := 0;
end
else begin
result := video[addr-$4000];
end;
end;
procedure TMainForm.do_write2(a_lo : word; a_hi : word; bt : byte); // адреса
begin
do_write(a_lo+(a_hi SHL 8),bt);
end;
function TMainForm.do_read2(a_lo : word; a_hi : word): word;
begin
result := do_read(a_lo+(a_hi SHL 8));
end;
procedure TMainForm.init_memory(); // подготовим все к запуску
var
j , i : integer;
begin
i:=$0000;
while (i<$10000) do
begin
memory[i]:=0;
inc(i);
end;
i:=$0000;
while (i<$4000) do begin
video[i]:=0;
inc(i);
end;
i:=$0000;
while (i<$100) do begin
ports[i]:=0;
inc(i);
end;
i:=0;
while (i<8) do begin
kbd_base[i]:=0;
inc(i);
end;
i:=0;
while (i<4) do begin
kbd_ext[i]:=0;
inc(i);
end;
i:=0;
while (i<256) do begin
flags[i]:=(f_1 or f_P);
j:=0;
while (j<8) do begin
if ((i and (1 shl j))<>0) then
begin
flags[i]:= (flags[i] xor f_P);
end;
inc(j);
end;
if ((i and $80)<>0) then
begin
flags[i]:= (flags[i] or f_S);
end;
if (i=0) then
begin
flags[i]:=(flags[i] or f_Z);
end;
inc(i);
end;
end;
function TMainForm.do_input(port : byte): byte; // работа со значениями портов in
var
i,r : integer;
nD2 ,nD0 : byte;
begin
nD2:=0;
nD0:=0;
port:=$C0+(port and $13);
case port of
$C2: begin result := ports[$C2]; end;
$D1: begin
nD0:=not ports[$D0];
r:=0;
i:=0;
while (i<8) do
begin
if ((nD0 and (1 SHL i))<>0) then
begin
r:=(r or kbd_base[i]);
end;
inc(i);
end;
result := ((not r) and $FF);
end;
$D2: begin
nD2:= not ports[$D2];
r:=0;
i:=0;
while (i<4) do
begin
if ((nD2 and (1 SHL i))<>0) then
begin
r:=(r or kbd_ext[i]);
end;
inc(i);
end;
result := not ((r SHL 4) or (nD2 and $0F)) and $FF;
end
else
begin
result := $FF;
end;
end;
end;
procedure TMainForm.do_output(port : byte; bt : byte); // out
begin
port:=$C0+(port and $13);
case port of
$c1: begin // изменение порта цвета
fillchar(VideoDirty,sizeof(VideoDirty),257); // чистим массив
end;
$c2: begin
putSound(bt); // вот тут получаем звук
end;
end;
ports[port]:=bt;
end ;
function TMainForm.signal_inv_opc: boolean;
begin
result :=false;
end;
procedure TMainForm.kbd(mask : word; press : boolean); // по маске вкл выкл клавишу
var
brow : byte;
erow : byte;
bcol : byte;
ecol : byte;
begin
bcol:=(mask SHR 12) and $0F;
brow:=(mask SHR 8) and $0F;
ecol:=(mask SHR 4) and $0F;
erow:=(mask SHR 0) and $0F;
if ((brow<8) and (bcol<8)) then
begin
if (press) then
begin
kbd_base[bcol]:=(kbd_base[bcol] or (1 SHL brow));
end else begin
kbd_base[bcol]:= (kbd_base[bcol] and (not(1 SHL brow)));
end;
end;
if ((erow<8) and (ecol<4)) then
begin
if (press) then
begin
kbd_ext[ecol]:= (kbd_ext[ecol]or (1 SHL erow));
end else begin
kbd_ext[ecol]:= (kbd_ext[ecol] and (not(1 SHL erow)));
end;
end;
end;
procedure TMainForm.reset1; // полный ресет :)
var
i : word;
begin
i:=0;
while (i<256) do begin
ports[i]:=$FF;
inc(i);
end;
i8080_init;
end;
procedure TMainForm.load_bios; // загрузка биоса из файла
var
i: word;
b: byte;
f: file of byte;
begin
i:=0;
AssignFile(F,ExtractFilePath(Application.ExeName)+'\bios.dat');
Reset(F); // проверять заголовок не будем :)
while not eof(f) do
begin
read(F,b);
bios[i]:=b; // загрузим в массив , а вдруг пригодится
inc(i);
end;
closeFile(F);
i:=0;
while (i<$4000) do begin
memory[$C000+i]:=bios[22+i];
inc(i);
end;
end;
procedure TMainForm.N2Click(Sender: TObject);
begin
OpenDialogLvt.InitialDir:=ExtractFilePath(Application.ExeName);
if OpenDialogLvt.Execute then NewLoadFile(OpenDialogLvt.FileName,true);
end;
procedure TMainForm.N4Click(Sender: TObject);
begin
gamecanvas.Free;
close;
end;
procedure TMainForm.N7Click(Sender: TObject); // влючим ЧБ телевизор
begin
N7.Checked:= not N7.Checked;
if N7.Checked then
ToolButton7.ImageIndex:=13 else
ToolButton7.ImageIndex:=12;
fillchar(VideoDirty,sizeof(VideoDirty),257);
draw_screen;
end;
function TMainForm.get_var(var1: word): word; // чтение и запись нужных значений из пямяти
begin
result:= memory[var1] + memory[var1+1]*256;
end;
procedure TMainForm.set_var(var1, val: word);
begin
memory[var1]:= (val and $FF);
memory[var1+1]:= (round(val/256) and $FF);
end;
procedure TMainForm.warm_start(); // горячий запуск
begin
ports[$C2]:=$FF;
r_SP:=BasicStack;
set_var(BasicStack,BasicHotEntry);
r_PC:=BasicHotEntry;
end;
procedure TMainForm.NewLoadFile(filenameDnD: string; start : boolean); //процедура загрузки всех видов файлов
var
f:file of byte;
b:Byte;
s: string;
posBas, Xend ,Xbeg ,Xrun : word;
i: integer;
begin
s:='';
AssignFile(f,filenameDnD); // распознаем что за файл
Reset(f);
for I:= 0 to 8 do
begin
read(f,b);
s:=s+chr(b);
//Myfile[j]:=strtoint(s);
// Size(f);
//seek(f,100);
end;
if s='LVOV/2.0/' then // стандартный LVT файл
begin
read(f,b);
if b=$D0 then // это бинарник
begin
seek(F,0); // вернемся к началу файла
i:=0;
while not eof(f) do
begin
read(F,b);
Myfile[i]:=b;
inc(i);
end;
myfilelength:=i;
closeFile(F); //закрываем файл
Xbeg:=Myfile[16]+Myfile[17]*256;
Xend:=Myfile[18]+Myfile[19]*256;
Xrun:=Myfile[20]+Myfile[21]*256;
if (start) then
begin
warm_start();
r_PC:=Xrun;
end;
i:=0;
while (i<=Xend-Xbeg) do
begin
do_write(Xbeg+i,Myfile[i+22]);
inc(i);
end;
end
else
begin //это бeйсик (надеюсь больше ничего нет :-) )
seek(F,0); // вернемся к началу файла
i:=0;
while not eof(f) do
begin
read(F,b);
Myfile[i]:=b;
inc(i);
end;
myfilelength:=i-1;
warm_start();
posBas:=get_var(BasicProgBegin);
i:=0;
while (i<myfilelength-16) do
begin
do_write(posBas+i,Myfile[i+16]);
inc(i);
end;
set_var(BasicProgEnd,posBas+myfilelength-16);
// направим RUN
MainForm.SetFocus;
//i8080_do_opcodes(opcodes_to_run);
//KeyboardForm.SendKeys('RUN');
end;
end;
if s='LVOV/DUMP' then // стандартный SAV файл дампа эмулятор Калашникова
begin
seek(F,0); // вернемся к началу файла
i:=0;
while not eof(f) do
begin
read(F,b);
Myfile[i]:=b;
inc(i);
end;
i:=0;
closeFile(F);
while (i<$10000) do
begin
memory[i]:=Myfile[17+i];
inc(i);
end;
i:=0;
while (i<$4000) do
begin
video[i]:=Myfile[17+$10000+i];
inc(i);
end;
i:=0;
while (i<$100) do
begin
ports[i]:=Myfile[17+$10000+$4000+i];
inc(i);
end;
r_B:=Myfile[17+$10000+$4000+$100];
r_H:=Myfile[17+$10000+$4000+$100+4];
r_C:=Myfile[17+$10000+$4000+$100+1];
r_L:=Myfile[17+$10000+$4000+$100+5];
r_D:=Myfile[17+$10000+$4000+$100+2];
r_A:=Myfile[17+$10000+$4000+$100+6];
r_E:=Myfile[17+$10000+$4000+$100+3];
r_F:=Myfile[17+$10000+$4000+$100+7];
r_SP:=Myfile[17+$10000+$4000+$100+9]*256+Myfile[17+$10000+$4000+$100+8];
r_PC:=Myfile[17+$10000+$4000+$100+11]*256+Myfile[17+$10000+$4000+$100+10];
fillchar(VideoDirty,sizeof(VideoDirty),257); // чистим массив
draw_screen;
end;
end;
procedure TMainForm.do_pause();
begin
pause := not pause;
end;
procedure TMainForm.i8080_do_opcodes(nb_cycles : integer); //выполнение комманд процессора
var
tmp : integer;
tmp3 : integer;
tmp2 : integer;
tmp1 : integer;
opcode : integer;
begin
clock:=0; tmp1:=0; tmp2:=0; tmp3:=0; tmp:=0; //бнулим :-)
while (clock < nb_cycles) do
begin
tmp:=r_PC;
opcode:=do_read(r_PC);
if (r_PC=56724) then //программа хочет прочитать еще файл
begin
//Myfile:=addfile[fileCounter];
//inc(fileCounter);
///_filePos:=0;
pause:=true;
N2Click(Self);
if OpenDialogLvt.Execute then NewLoadFile(OpenDialogLvt.FileName,true);
pause:=false;
end ;
{ else
begin
if (r_PC=58576) then
begin
opcode:=$C9;
end;
if (r_PC=58558) then
begin
if (_filePos<10) then
begin
r_A:=208;
inc(_filePos);
end
else
if (_filePos<16) then
begin
r_A:=do_read(48780+_filePos-10);
inc(_filePos);
end
else
if (_filePos<myfilelength) then
begin
r_A:=Myfile[_filePos];
inc(_filePos);
end
else
begin
r_A:=$FF;
end;
opcode:=$C9;
end;
if (r_PC=56778) then
begin
if (_filePos<Myfilelength-1) then
begin
r_L:=Myfile[_filePos];
inc(_filePos);
r_H:=Myfile[_filePos];
inc(_filePos);
end
else
begin
r_L:=$FF;
r_H:=$FF;
end;
opcode:=$C9;
end;
{if (gamover_point=r_PC) then
begin
makeRequest();
end; }
{ end; }
case opcode of // анализируем текущий код 00 .. FF, меняем значение clock в зависимоти от "длинны" команды ...
// прыгаем по памяти, меняем значения регистров и портов ПРОЦ РАБОТАЕТ !!!!
$00:
begin
clock:=clock+4;
r_PC:=r_PC+1;
end;
$F3:
begin
clock:=clock+4;
r_PC:=r_PC+1;
end;
$FB:
begin
clock:=clock+4;
r_PC:=r_PC+1;
end;
$01:
begin
r_B:=do_read(r_PC+2);
r_C:=do_read(r_PC+1);
clock:=clock+10;
r_PC:=r_PC+3;
end;
$02:
begin
do_write2(r_C,r_B,r_A);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$03:
begin
r_C:=r_C+1;
if (r_C>$FF) then
begin
r_C:=0;
r_B:=r_B+1;
if (r_B>$FF) then
begin
r_B:=0;
end;
end;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$04:
begin
tmp2:=((r_B+1) and $FF);
r_F:=(flags[tmp2] or (r_F and f_C));
if (((tmp2 xor r_B) and $10)<>0) then
begin
r_F:=r_F or f_A;
end;
r_B:=tmp2;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$05:
begin
tmp2:=((r_B-1) and $FF);
r_F:=(flags[tmp2] or (r_F and f_C));
if (((tmp2 xor r_B) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_B:=tmp2;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$06:
begin
r_B:=do_read(r_PC+1);
clock:=clock+7;
r_PC:=r_PC+2;
end;
$07:
begin
r_A:=r_A SHL 1;
if (r_A>$FF) then
begin
r_A:=r_A or 1;
r_F:=r_F or f_C;
r_A:= r_A and $FF;
end
else
begin
r_F:=(r_F and (not f_C));
end;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$08: begin if (signal_inv_opc()) then
begin
end
else
begin
clock:=clock+4;
r_PC:=r_PC+1;
end; end;
$10: begin if (signal_inv_opc()) then
begin
end
else
begin
clock:=clock+4;
r_PC:=r_PC+1;
end; end;
$18: begin if (signal_inv_opc()) then
begin
end
else
begin
clock:=clock+4;
r_PC:=r_PC+1;
end; end;
$20: begin if (signal_inv_opc()) then
begin
end
else
begin
clock:=clock+4;
r_PC:=r_PC+1;
end; end;
$28: begin if (signal_inv_opc()) then
begin
end
else
begin
clock:=clock+4;
r_PC:=r_PC+1;
end; end;
$30: begin if (signal_inv_opc()) then
begin
end
else
begin
clock:=clock+4;
r_PC:=r_PC+1;
end; end;
$38:
begin
if (signal_inv_opc()) then
begin
end
else
begin
clock:=clock+4;
r_PC:=r_PC+1;
end;
end;
$09:
begin
r_L:=r_L+r_C;
r_H:=r_H+r_B;
if (r_L>$FF) then
begin
inc(r_H);
r_L:=(r_L and $FF);
end;
if (r_H>$FF) then
begin
r_H:=(r_H and $FF);
r_F:=(r_F or f_C);
end
else
begin
r_F:=(r_F and (not f_C));
end;
clock:=clock+10;
r_PC:=r_PC+1;
end;
$0A:
begin
r_A:=do_read2(r_C,r_B);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$0B:
begin
r_C:=r_C-1;
if (r_C<0) then
begin
r_C:=$FF;
r_B:=r_B-1;
if (r_B<0) then
begin
r_B:=$FF;
end;
end;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$0C:
begin
tmp2:=((r_C+1) and $FF);
r_F:=(flags[tmp2] or (r_F and f_C));
if (((tmp2 xor r_C) and $10)<>0) then
begin
r_F:=r_F or f_A;
end;
r_C:=tmp2;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$0D:
begin
tmp2:=((r_C-1) and $FF);
r_F:=flags[tmp2] or (r_F and f_C);
if (((tmp2 xor r_C) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_C:=tmp2;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$0E:
begin
r_C:=do_read(r_PC+1);
clock:=clock+7;
r_PC:=r_PC+2;
end;
$0F:
begin
tmp1:=(r_A and 1);
r_A:=(r_A shr 1);
if (tmp1<>0) then
begin
r_A:=(r_A or $80);
r_F:=(r_F or f_C);
end
else
begin
r_F:=(r_F and ( not f_C));
end;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$11:
begin
r_D:=do_read(r_PC+2);
r_E:=do_read(r_PC+1);
clock:=clock+10;
r_PC:=r_PC+3;
end;
$12:
begin
do_write2(r_E,r_D,r_A);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$13:
begin
r_E:=r_E+1;
if (r_E>$FF) then
begin
r_E:=0;
r_D:=r_D+1;
if (r_D>$FF) then
begin
r_D:=0;
end;
end;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$14:
begin
tmp2:=((r_D+1)and $FF);
r_F:=(flags[tmp2] or (r_F and f_C));
if (((tmp2 xor r_D) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_D:=tmp2;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$15:
begin
tmp2:=((r_D-1)and $FF);
r_F:=(flags[tmp2] or (r_F and f_C));
if (((tmp2 xor r_D) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_D:=tmp2;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$16:
begin
r_D:=do_read(r_PC+1);
clock:=clock+7;
r_PC:=r_PC+2;
end;
$17:
begin
r_A:=(r_A shl 1);
if ((r_F and f_C)<>0) then
begin
r_A:=(r_A or 1);
end;
if (r_A>$FF) then
begin
r_F:=(r_F or f_C);
r_A:=(r_A and $FF);
end else begin
r_F:=(r_F and (not f_C));
end;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$19:
begin
r_L:=(r_L + r_E);
r_H:=(r_H + r_D);
if (r_L>$FF) then
begin
inc(r_H);
r_L:=(r_L and $FF);
end;
if (r_H>$FF) then
begin
r_H:=(r_H and $FF);
r_F:=(r_F or f_C);
end
else
begin
r_F:=(r_F and not (f_C));
end;
clock:=clock+10;
r_PC:=r_PC+1;
end;
$1A:
begin
r_A:=do_read2(r_E,r_D);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$1B:
begin
r_E:=r_E-1;
if (r_E<0) then
begin
r_E:=$FF;
r_D:=r_D-1;
if (r_D<0) then
begin
r_D:=$FF;
end;
end;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$1C:
begin
tmp2:=((r_E+1)and $FF);
r_F:=(flags[tmp2] or (r_F and f_C));
if (((tmp2 xor r_E) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_E:=tmp2;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$1D:
begin
tmp2:=((r_E-1) and $FF);
r_F:=(flags[tmp2] or (r_F and f_C));
if (((tmp2 xor r_E) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_E:=tmp2;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$1E:
begin
r_E:=do_read(r_PC+1);
clock:=clock+7;
r_PC:=r_PC+2;
end;
$1F:
begin
tmp1:=(r_A and 1);
r_A:=(r_A SHR 1);
if ((r_F and f_C)<>0) then
begin
r_A:=(r_A or $80);
end;
if (tmp1<>0) then
begin
r_F:=(r_F or f_C);
end
else
begin
r_F:=(r_F and not(f_C));
end;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$21:
begin
r_H:=do_read(r_PC+2);
r_L:=do_read(r_PC+1);
clock:=clock+10;
r_PC:=r_PC+3;
end;
$22:
begin
tmp1:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
do_write(tmp1,r_L);
do_write(tmp1+1,r_H);
clock:=clock+16;
r_PC:=r_PC+3;
end;
$23:
begin
r_L:=r_L+1;
if (r_L>$FF) then
begin
r_L:=0;
r_H:=r_H+1;
if (r_H>$FF) then
begin
r_H:=0;
end;
end;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$24:
begin
tmp2:=((r_H+1) and $FF);
r_F:=(flags[tmp2] or (r_F and f_C));
if (((tmp2 xor r_H) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_H:=tmp2;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$25:
begin
tmp2:=((r_H-1) and $FF);
r_F:=(flags[tmp2] or (r_F and f_C));
if (((tmp2 xor r_H) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_H:=tmp2;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$26:
begin
r_H:=do_read(r_PC+1);
clock:=clock+7;
r_PC:=r_PC+2;
end;
$27:
begin
tmp1:=0;
if (((r_F and f_C)<>0) or (r_A>$99)) then
begin
tmp1:=(tmp1 or $60);
end;
if (((r_F and f_A)<>0) or ((r_A and $0F)>$09)) then
begin
tmp1:=(tmp1 or $06);
end;
tmp2:=r_A+tmp1;
r_F:=flags[tmp2 and $FF];
if (((tmp2 xor r_A xor tmp1) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
if (tmp2>$FF) then
begin
r_F:=(r_F or f_C);
end;
r_A:=tmp2 and $FF;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$29:
begin
r_L:=r_L + r_L;
r_H:=r_H + r_H;
if (r_L>$FF) then
begin
inc(r_H);
r_L:=(r_L and $FF);
end;
if (r_H>$FF) then
begin
r_H:=(r_H and $FF);
r_F:=(r_F or f_C);
end else begin
r_F:=(r_F and (not f_C));
end;
clock:=clock+10;
r_PC:=r_PC+1;
end;
$2A:
begin
tmp1:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
r_L:=do_read(tmp1);
r_H:=do_read(tmp1+1);
clock:=clock+16;
r_PC:=r_PC+3;
end;
$2B:
begin
r_L:=r_L-1;
if (r_L <0) then
begin
r_L:=$FF;
r_H:=r_H-1;
if (r_H<0) then
begin
r_H:=$FF;
end;
end;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$2C:
begin
tmp2:=((r_L+1) and $FF);
r_F:=(flags[tmp2] or (r_F and f_C));
if (((tmp2 xor r_L) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_L:=tmp2;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$2D:
begin
tmp2:=((r_L-1) and $FF);
r_F:=(flags[tmp2] or (r_F and f_C));
if (((tmp2 xor r_L) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_L:=tmp2;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$2E:
begin
r_L:=do_read(r_PC+1);
clock:=clock+7;
r_PC:=r_PC+2;
end;
$2F:
begin
r_A:=(r_A xor $FF);
clock:=clock+4;
r_PC:=r_PC+1;
end;
$31:
begin
r_SP:=(do_read(r_PC+2) shl 8)+do_read(r_PC+1);
clock:=clock+10;
r_PC:=r_PC+3;
end;
$32:
begin
do_write2(do_read(r_PC+1),do_read(r_PC+2),r_A);
clock:=clock+13;
r_PC:=r_PC+3;
end;
$33:
begin
if (r_SP=$FFFF) then
begin
r_SP:=0;
end
else
begin
inc(r_SP);
end;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$34:
begin
tmp1:=do_read2(r_L,r_H);
tmp2:=((tmp1+1) and $FF);
r_F:=(flags[tmp2] or (r_F and f_C));
if (((tmp2 xor tmp1) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
do_write2(r_L,r_H,tmp2);
clock:=clock+10;
r_PC:=r_PC+1;
end;
$35:
begin
tmp1:=do_read2(r_L,r_H);
tmp2:=((tmp1-1) and $FF);
r_F:=flags[tmp2] or (r_F and f_C);
if (((tmp2 xor tmp1) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
do_write2(r_L,r_H,tmp2);
clock:=clock+10;
r_PC:=r_PC+1;
end;
$36:
begin
do_write2(r_L,r_H,do_read(r_PC+1));
clock:=clock+10;
r_PC:=r_PC+2;
end;
$37:
begin
r_F:=(r_F or f_C);
clock:=clock+4;
r_PC:=r_PC+1;
end;
$39:
begin
r_L:=(r_L + (r_SP and $FF));
r_H:=(r_H + ((r_SP shr 8) and $FF));
if (r_L>$FF) then
begin
inc(r_H);
r_L:=(r_L and $FF);
end;
if (r_H>$FF) then
begin
r_H:=(r_H and $FF);
r_F:=(r_F or f_C);
end else begin
r_F:=(r_F and (not f_C));
end;
clock:=clock+10;
r_PC:=r_PC+1;
end;
$3A:
begin
r_A:=do_read2(do_read(r_PC+1),do_read(r_PC+2));
clock:=clock+13;
r_PC:=r_PC+3;
end;
$3B:
begin
if (r_SP<>0) then
begin
r_SP:=r_SP-1;
end
else
begin
r_SP:=$FFFF;
end;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$3C:
begin
tmp2:=((r_A+1) and $FF);
r_F:=(flags[tmp2] or (r_F and f_C));
if (((tmp2 xor r_A) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_A:=tmp2;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$3D:
begin
tmp2:=((r_A-1) and $FF);
r_F:=(flags[tmp2] or (r_F and f_C));
if (((tmp2 xor r_A) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_A:=tmp2;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$3E:
begin
r_A:=do_read(r_PC+1);
clock:=clock+7;
r_PC:=r_PC+2;
end;
$3F:
begin
r_F:=r_F xor f_C;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$40: begin clock:=clock+5; r_PC:=r_PC+1; end;
$49: begin clock:=clock+5; r_PC:=r_PC+1; end;
$52: begin clock:=clock+5; r_PC:=r_PC+1; end;
$5B: begin clock:=clock+5; r_PC:=r_PC+1; end;
$64: begin clock:=clock+5; r_PC:=r_PC+1; end;
$6D: begin clock:=clock+5; r_PC:=r_PC+1; end;
$7F:
begin
clock:=clock+5; r_PC:=r_PC+1;
end;
$41:
begin
r_B:=r_C;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$42:
begin
r_B:=r_D;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$43:
begin
r_B:=r_E;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$44:
begin
r_B:=r_H;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$45:
begin
r_B:=r_L;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$46:
begin
r_B:=do_read2(r_L,r_H);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$47:
begin
r_B:=r_A;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$48:
begin
r_C:=r_B;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$4A:
begin
r_C:=r_D;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$4B:
begin
r_C:=r_E;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$4C:
begin
r_C:=r_H;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$4D:
begin
r_C:=r_L;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$4E:
begin
r_C:=do_read2(r_L,r_H);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$4F:
begin
r_C:=r_A;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$50:
begin
r_D:=r_B;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$51:
begin
r_D:=r_C;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$53:
begin
r_D:=r_E;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$54:
begin
r_D:=r_H;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$55:
begin
r_D:=r_L;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$56:
begin
r_D:=do_read2(r_L,r_H);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$57:
begin
r_D:=r_A;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$58:
begin
r_E:=r_B;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$59:
begin
r_E:=r_C;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$5A:
begin
r_E:=r_D;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$5C:
begin
r_E:=r_H;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$5D:
begin
r_E:=r_L;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$5E:
begin
r_E:=do_read2(r_L,r_H);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$5F:
begin
r_E:=r_A;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$60:
begin
r_H:=r_B;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$61:
begin
r_H:=r_C;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$62:
begin
r_H:=r_D;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$63:
begin
r_H:=r_E;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$65:
begin
r_H:=r_L;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$66:
begin
r_H:=do_read2(r_L,r_H);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$67:
begin
r_H:=r_A;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$68:
begin
r_L:=r_B;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$69:
begin
r_L:=r_C;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$6A:
begin
r_L:=r_D;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$6B:
begin
r_L:=r_E;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$6C:
begin
r_L:=r_H;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$6E:
begin
r_L:=do_read2(r_L,r_H);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$6F:
begin
r_L:=r_A;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$70:
begin
do_write2(r_L,r_H,r_B);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$71:
begin
do_write2(r_L,r_H,r_C);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$72:
begin
do_write2(r_L,r_H,r_D);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$73:
begin
do_write2(r_L,r_H,r_E);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$74:
begin
do_write2(r_L,r_H,r_H);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$75:
begin
do_write2(r_L,r_H,r_L);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$76:
begin
// cpu_halt_state:=true;
// cpu_halt_reason:=halt_hlt;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$77:
begin
do_write2(r_L,r_H,r_A);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$78:
begin
r_A:=r_B;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$79:
begin
r_A:=r_C;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$7A:
begin
r_A:=r_D;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$7B:
begin
r_A:=r_E;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$7C:
begin
r_A:=r_H;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$7D:
begin
r_A:=r_L;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$7E:
begin
r_A:=do_read2(r_L,r_H);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$80:
begin
tmp2:=r_A+r_B;
r_F:=flags[tmp2 and $FF];
if (((tmp2 xor r_A xor r_B) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
if (tmp2>$FF) then
begin
r_F:=(r_F or f_C);
end;
r_A:=(tmp2 and $FF);
clock:=clock+4;
r_PC:=r_PC+1;
end;
$81:
begin
tmp2:=r_A+r_C;
r_F:=flags[tmp2 and $FF];
if (((tmp2 xor r_A xor r_C) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
if (tmp2>$FF) then
begin
r_F:=(r_F or f_C);
end;
r_A:=tmp2 and $FF;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$82:
begin
tmp2:=r_A+r_D;
r_F:=flags[tmp2 and $FF];
if (((tmp2 xor r_A xor r_D) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
if (tmp2>$FF) then
begin
r_F:=(r_F or f_C);
end;
r_A:=tmp2 and $FF;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$83:
begin
tmp2:=r_A+r_E;
r_F:=flags[tmp2 and $FF];
if (((tmp2 xor r_A xor r_E) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
if (tmp2>$FF) then
begin
r_F:=(r_F or f_C);
end;
r_A:=tmp2 and $FF;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$84:
begin
tmp2:=r_A+r_H;
r_F:=flags[tmp2 and $FF];
if (((tmp2 xor r_A xor r_H) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
if (tmp2>$FF) then
begin
r_F:=(r_F or f_C);
end;
r_A:=tmp2 and $FF;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$85:
begin
tmp2:=r_A+r_L;
r_F:=flags[tmp2 and $FF];
if (((tmp2 xor r_A xor r_L) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
if (tmp2>$FF) then
begin
r_F:=(r_F or f_C);
end;
r_A:=tmp2 and $FF;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$86:
begin
tmp1:=do_read2(r_L,r_H);
tmp2:=r_A+tmp1;
r_F:=flags[tmp2 and $FF];
if (((tmp2 xor r_A xor tmp1) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
if (tmp2>$FF) then
begin
r_F:=(r_F or f_C);
end;
r_A:=tmp2 and $FF;
clock:=clock+7;
r_PC:=r_PC+1;
end;
$87:
begin
tmp2:=r_A+r_A;
r_F:=flags[tmp2 and $FF];
if (((tmp2 xor r_A xor r_A) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
if (tmp2>$FF) then
begin
r_F:=(r_F or f_C);
end;
r_A:=tmp2 and $FF;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$88:
begin
tmp2:=r_A+r_B;
if ((r_F and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
r_F:=flags[tmp2 and $FF];
if (((tmp2 xor r_A xor r_B) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
if (tmp2>$FF) then
begin
r_F:=(r_F or f_C);
end;
r_A:=tmp2 and $FF;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$89:
begin
tmp2:=r_A+r_C;
if ((r_F and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
r_F:=flags[tmp2 and $FF];
if (((tmp2 xor r_A xor r_C) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
if (tmp2>$FF) then
begin
r_F:=(r_F or f_C);
end;
r_A:=tmp2 and $FF;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$8A:
begin
tmp2:=r_A+r_D;
if ((r_F and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
r_F:=flags[tmp2 and $FF];
if (((tmp2 xor r_A xor r_D) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
if (tmp2>$FF) then
begin
r_F:=(r_F or f_C);
end;
r_A:=tmp2 and $FF;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$8B:
begin
tmp2:=r_A+r_E;
if ((r_F and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
r_F:=flags[tmp2 and $FF];
if (((tmp2 xor r_A xor r_E) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
if (tmp2>$FF) then
begin
r_F:=(r_F or f_C);
end;
r_A:=tmp2 and $FF;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$8C:
begin
tmp2:=r_A+r_H;
if ((r_F and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
r_F:=flags[tmp2 and $FF];
if (((tmp2 xor r_A xor r_H) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
if (tmp2>$FF) then
begin
r_F:=r_F or f_C;
end;
r_A:=tmp2 and $FF;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$8D:
begin
tmp2:=r_A+r_L;
if ((r_F and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
r_F:=flags[tmp2 and $FF];
if (((tmp2 xor r_A xor r_L) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
if (tmp2>$FF) then
begin
r_F:=(r_F or f_C);
end;
r_A:=tmp2 and $FF;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$8E:
begin
tmp1:=do_read2(r_L,r_H);
tmp2:=r_A+tmp1;
if ((r_F and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
r_F:=flags[tmp2 and $FF];
if (((tmp2 xor r_A xor tmp1) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
if (tmp2>$FF) then
begin
r_F:=(r_F or f_C);
end;
r_A:=tmp2 and $FF;
clock:=clock+7;
r_PC:=r_PC+1;
end;
$8F:
begin
tmp2:=r_A+r_A;
if ((r_F and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
r_F:=flags[tmp2 and $FF];
if (((tmp2 xor r_A xor r_A) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
if (tmp2>$FF) then
begin
r_F:=(r_F or f_C);
end;
r_A:=tmp2 and $FF;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$90:
begin
tmp2:=(r_A-r_B) and $FF;
r_F:=flags[tmp2];
if (r_A<r_B) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor r_B) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_A:=tmp2;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$91:
begin
tmp2:=(r_A-r_C) and $FF;
r_F:=flags[tmp2];
if (r_A<r_C) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor r_C) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_A:=tmp2;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$92:
begin
tmp2:=(r_A-r_D) and $FF;
r_F:=flags[tmp2];
if (r_A<r_D) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor r_D) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_A:=tmp2;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$93:
begin
tmp2:=(r_A-r_E) and $FF;
r_F:=flags[tmp2];
if (r_A<r_E) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor r_E) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_A:=tmp2;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$94:
begin
tmp2:=(r_A-r_H) and $FF;
r_F:=flags[tmp2];
if (r_A<r_H) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor r_H) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_A:=tmp2;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$95:
begin
tmp2:=(r_A-r_L) and $FF;
r_F:=flags[tmp2];
if (r_A<r_L) then
begin
r_F:=r_F or f_C;
end;
if (((tmp2 xor r_A xor r_L) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_A:=tmp2;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$96:
begin
tmp1:=do_read2(r_L,r_H);
tmp2:=(r_A-tmp1) and $FF;
r_F:=flags[tmp2];
if (r_A<tmp1) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor tmp1) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_A:=tmp2;
clock:=clock+7;
r_PC:=r_PC+1;
end;
$97:
begin
r_F:=flags[0];
r_A:=0;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$98:
begin
if ((r_F and f_C)<>0) then tmp3:=1 else tmp3:=0;
tmp2:=(r_A-r_B-tmp3) and $FF;
r_F:=flags[tmp2];
if (r_A<r_B+tmp3) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor r_B) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_A:=tmp2;
clock:=clock+4;
r_PC:=r_PC+1;
end;
SOURCE_DELPHI\001\
uMain.pas part2
$99:
begin
if ((r_F and f_C)<>0) then tmp3:=1 else tmp3:=0;
tmp2:=(r_A-r_C-tmp3) and $FF;
r_F:=flags[tmp2];
if (r_A<(r_C+tmp3)) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor r_C) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_A:=tmp2;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$9A:
begin
if ((r_F and f_C)<>0) then tmp3:=1 else tmp3:=0;
tmp2:=(r_A-r_D-tmp3) and $FF;
r_F:=flags[tmp2];
if (r_A<r_D+tmp3) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor r_D) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_A:=tmp2;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$9B:
begin
if ((r_F and f_C)<>0) then tmp3:=1 else tmp3:=0;
tmp2:=(r_A-r_E-tmp3) and $FF;
r_F:=flags[tmp2];
if (r_A<r_E+tmp3) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor r_E) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_A:=tmp2;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$9C:
begin
if ((r_F and f_C)<>0) then tmp3:=1 else tmp3:=0;
tmp2:=(r_A-r_H-tmp3) and $FF;
r_F:=flags[tmp2];
if (r_A<r_H+tmp3) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor r_H) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_A:=tmp2;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$9D:
begin
if ((r_F and f_C)<>0) then tmp3:=1 else tmp3:=0;
tmp2:=(r_A-r_L-tmp3) and $FF;
r_F:=flags[tmp2];
if (r_A<r_L+tmp3) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor r_L) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_A:=tmp2;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$9E:
begin
tmp1:=do_read2(r_L,r_H);
if ((r_F and f_C)<>0) then tmp3:=1 else tmp3:=0;
tmp2:=(r_A-tmp1-tmp3) and $FF;
r_F:=flags[tmp2];
if (r_A<tmp1+tmp3) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor tmp1) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_A:=tmp2;
clock:=clock+7;
r_PC:=r_PC+1;
end;
$9F:
begin
if ((r_F and f_C)<>0) then tmp2:=$FF else tmp2:=0;
r_F:=flags[tmp2];
if (tmp2<>0) then
begin
r_F:=r_F or (f_A or f_C);
end;
r_A:=tmp2;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$A0:
begin
r_A:=r_A and r_B;
r_F:=flags[r_A] or (r_F and f_A);
clock:=clock+4;
r_PC:=r_PC+1;
end;
$A1:
begin
r_A:=r_A and r_C;
r_F:=flags[r_A] or (r_F and f_A);
clock:=clock+4;
r_PC:=r_PC+1;
end;
$A2:
begin
r_A:=r_A and r_D;
r_F:=flags[r_A] or (r_F and f_A);
clock:=clock+4;
r_PC:=r_PC+1;
end;
$A3:
begin
r_A:=r_A and r_E;
r_F:=flags[r_A] or (r_F and f_A);
clock:=clock+4;
r_PC:=r_PC+1;
end;
$A4:
begin
r_A:=r_A and r_H;
r_F:=flags[r_A] or (r_F and f_A);
clock:=clock+4;
r_PC:=r_PC+1;
end;
$A5:
begin
r_A:=r_A and r_L;
r_F:=flags[r_A] or (r_F and f_A);
clock:=clock+4;
r_PC:=r_PC+1;
end;
$A6:
begin
tmp1:=do_read2(r_L,r_H);
r_A:=r_A and tmp1;
r_F:=flags[r_A] or (r_F and f_A);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$A7:
begin
r_A:=r_A and r_A;
r_F:=flags[r_A] or (r_F and f_A);
clock:=clock+4;
r_PC:=r_PC+1;
end;
$A8:
begin
r_A:=r_A xor r_B;
r_F:=flags[r_A] or (r_F and f_A);
clock:=clock+4;
r_PC:=r_PC+1;
end;
$A9:
begin
r_A:=r_A xor r_C;
r_F:=flags[r_A] or (r_F and f_A);
clock:=clock+4;
r_PC:=r_PC+1;
end;
$AA:
begin
r_A:=r_A xor r_D;
r_F:=flags[r_A] or (r_F and f_A);
clock:=clock+4;
r_PC:=r_PC+1;
end;
$AB:
begin
r_A:=r_A xor r_E;
r_F:=flags[r_A] or (r_F and f_A);
clock:=clock+4;
r_PC:=r_PC+1;
end;
$AC:
begin
r_A:=r_A xor r_H;
r_F:=flags[r_A] or (r_F and f_A);
clock:=clock+4;
r_PC:=r_PC+1;
end;
$AD:
begin
r_A:=r_A xor r_L;
r_F:=flags[r_A] or (r_F and f_A);
clock:=clock+4;
r_PC:=r_PC+1;
end;
$AE:
begin
tmp1:=do_read2(r_L,r_H);
r_A:=r_A xor tmp1;
r_F:=flags[r_A] or (r_F and f_A);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$AF:
begin
r_A:=0;
r_F:=flags[r_A] or (r_F and f_A);
clock:=clock+4;
r_PC:=r_PC+1;
end;
$B0:
begin
r_A:=r_A or r_B;
r_F:=flags[r_A] or (r_F and f_A);
clock:=clock+4;
r_PC:=r_PC+1;
end;
$B1:
begin
r_A:=r_A or r_C;
r_F:=flags[r_A] or (r_F and f_A);
clock:=clock+4;
r_PC:=r_PC+1;
end;
$B2:
begin
r_A:=r_A or r_D;
r_F:=flags[r_A] or (r_F and f_A);
clock:=clock+4;
r_PC:=r_PC+1;
end;
$B3:
begin
r_A:=r_A or r_E;
r_F:=flags[r_A] or (r_F and f_A);
clock:=clock+4;
r_PC:=r_PC+1;
end;
$B4:
begin
r_A:=r_A or r_H;
r_F:=flags[r_A] or (r_F and f_A);
clock:=clock+4;
r_PC:=r_PC+1;
end;
$B5:
begin
r_A:=r_A or r_L;
r_F:=flags[r_A] or (r_F and f_A);
clock:=clock+4;
r_PC:=r_PC+1;
end;
$B6:
begin
tmp1:=do_read2(r_L,r_H);
r_A:=r_A or tmp1;
r_F:=flags[r_A] or (r_F and f_A);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$B7:
begin
r_A:=r_A or r_A;
r_F:=flags[r_A] or (r_F and f_A);
clock:=clock+4;
r_PC:=r_PC+1;
end;
$B8:
begin
tmp2:=(r_A-r_B) and $FF;
r_F:=flags[tmp2];
if (r_A<r_B) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor r_B) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$B9:
begin
tmp2:=(r_A-r_C) and $FF;
r_F:=flags[tmp2];
if (r_A<r_C) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor r_C) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$BA:
begin
tmp2:=(r_A-r_D) and $FF;
r_F:=flags[tmp2];
if (r_A<r_D) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor r_D) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$BB:
begin
tmp2:=(r_A-r_E) and $FF;
r_F:=flags[tmp2];
if (r_A<r_E) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor r_E) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$BC:
begin
tmp2:=(r_A-r_H) and $FF;
r_F:=flags[tmp2];
if (r_A<r_H) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor r_H) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$BD:
begin
tmp2:=(r_A-r_L) and $FF;
r_F:=flags[tmp2];
if (r_A<r_L) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor r_L) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$BE:
begin
tmp1:=do_read2(r_L,r_H);
tmp2:=(r_A-tmp1) and $FF;
r_F:=flags[tmp2];
if (r_A<tmp1) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor tmp1) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
clock:=clock+7;
r_PC:=r_PC+1;
end;
$BF:
begin
r_F:=flags[0];
clock:=clock+4;
r_PC:=r_PC+1;
end;
$C0:
begin
if ((r_F and f_Z)<>0) then
begin
clock:=clock+5;
r_PC:=r_PC+1;
end
else
begin
r_PC:=do_read(r_SP);
r_PC:=r_PC+(do_read(r_SP+1) shl 8);
r_SP:=(r_SP+2) and $FFFF;
clock:=clock+11;
end;
end;
$C1:
begin
r_C:=do_read(r_SP);
r_B:=do_read(r_SP+1);
r_SP:=(r_SP+2) and $FFFF;
clock:=clock+10;
r_PC:=r_PC+1;
end;
$C2:
begin
if ((r_F and f_Z)<>0) then
begin
clock:=clock+10;
r_PC:=r_PC+3;
end
else
begin
r_PC:=do_read(r_PC+1)+((do_read(r_PC+2) shl 8));
clock:=clock+10;
end;
end;
$C3:
begin
r_PC:=do_read(r_PC+1)+((do_read(r_PC+2) shl 8));
clock:=clock+10;
end;
$C4:
begin
if ((r_F and f_Z)<>0) then
begin
clock:=clock+11;
r_PC:=r_PC+3;
end
else
begin
tmp1:=do_read(r_PC+1)+((do_read(r_PC+2) shl 8));
r_SP:=(r_SP-2) and $FFFF;
r_PC:=r_PC+3;
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=tmp1;
clock:=clock+17;
end;
end;
$C5:
begin
r_SP:=(r_SP-2) and $FFFF;
do_write(r_SP,r_C);
do_write(r_SP+1,r_B);
clock:=clock+11;
r_PC:=r_PC+1;
end;
$C6:
begin
tmp1:=do_read(r_PC+1);
tmp2:=r_A+tmp1;
r_F:=flags[tmp2 and $FF];
if (((tmp2 xor r_A xor tmp1) and $10)<>0) then
begin
r_F:=r_F or f_A;
end;
if (tmp2>$FF) then
begin
r_F:=r_F or f_C;
end;
r_A:=tmp2 and $FF;
clock:=clock+7;
r_PC:=r_PC+2;
end;
$C7:
begin
r_SP:=(r_SP-2) and $FFFF;
inc(r_PC);
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=0*8;
clock:=clock+11;
end;
$C8:
begin
if ((r_F and f_Z)=0) then
begin
clock:=clock+5;
r_PC:=r_PC+1;
end
else
begin
r_PC:=do_read(r_SP);
r_PC:=r_PC+(do_read(r_SP+1) shl 8);
r_SP:=(r_SP+2) and $FFFF;
clock:=clock+11;
end;
end;
$C9:
begin
r_PC:=do_read(r_SP);
r_PC:=r_PC+(do_read(r_SP+1) shl 8);
r_SP:=(r_SP+2) and $FFFF;
clock:=clock+11;
end;
$CA:
begin
if ((r_F and f_Z)=0) then
begin
clock:=clock+10;
r_PC:=r_PC+3;
end
else
begin
r_PC:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
clock:=clock+10;
end;
end;
$CB:
begin
if (signal_inv_opc()) then
begin
end
else
begin
r_PC:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
clock:=clock+10;
end;
end;
$CC:
begin
if ((r_F and f_Z)=0) then
begin
clock:=clock+11;
r_PC:=r_PC+3;
end
else
begin
tmp1:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
r_SP:=(r_SP-2) and $FFFF;
r_PC:=r_PC+3;
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=tmp1;
clock:=clock+17;
end
end;
$CD:
begin
tmp1:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
r_SP:=(r_SP-2) and $FFFF;
r_PC:=r_PC+3;
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=tmp1;
clock:=clock+17;
end;
$CE:
begin
tmp1:=do_read(r_PC+1);
tmp2:=r_A+tmp1;
if ((r_F and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
r_F:=flags[tmp2 and $FF];
if (((tmp2 xor r_A xor tmp1) and $10)<>0) then
begin
r_F:=r_F or f_A;
end;
if (tmp2>$FF) then
begin
r_F:=r_F or f_C;
end;
r_A:=tmp2 and $FF;
clock:=clock+7;
r_PC:=r_PC+2;
end;
$CF:
begin
r_SP:=(r_SP-2) and $FFFF;
inc(r_PC);
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=1*8;
clock:=clock+11;
end;
$D0:
begin
if ((r_F and f_C)<>0) then
begin
clock:=clock+5;
r_PC:=r_PC+1;
end
else
begin
r_PC:=do_read(r_SP);
r_PC:=r_PC+(do_read(r_SP+1) shl 8);
r_SP:=(r_SP+2) and $FFFF;
clock:=clock+11;
end
end;
$D1:
begin
r_E:=do_read(r_SP);
r_D:=do_read(r_SP+1);
r_SP:=(r_SP+2) and $FFFF;
clock:=clock+10;
r_PC:=r_PC+1;
end;
$D2:
begin
if ((r_F and f_C)<>0) then
begin
clock:=clock+10;
r_PC:=r_PC+3;
end
else
begin
r_PC:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
clock:=clock+10;
end;
end;
$D3:
begin
do_output(do_read(r_PC+1),r_A);
clock:=clock+10;
r_PC:=r_PC+2;
end;
$D4:
begin
if ((r_F and f_C)<>0) then
begin
clock:=clock+11;
r_PC:=r_PC+3;
end
else
begin
tmp1:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
r_SP:=(r_SP-2) and $FFFF;
r_PC:=r_PC+3;
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=tmp1;
clock:=clock+17;
end;
end;
$D5:
begin
r_SP:=(r_SP-2) and $FFFF;
do_write(r_SP,r_E);
do_write(r_SP+1,r_D);
clock:=clock+11;
r_PC:=r_PC+1;
end;
$D6:
begin
tmp1:=do_read(r_PC+1);
tmp2:=(r_A-tmp1) and $FF;
r_F:=flags[tmp2];
if (r_A<tmp1) then
begin
r_F:=r_F or f_C;
end;
if (((tmp2 xor r_A xor tmp1) and $10)<>0) then
begin
r_F:=r_F or f_A;
end;
r_A:=tmp2;
clock:=clock+7;
r_PC:=r_PC+2;
end;
$D7:
begin
r_SP:=(r_SP-2) and $FFFF;
inc(r_PC);
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=2*8;
clock:=clock+11;
end;
$D8:
begin
if ((r_F and f_C)=0) then
begin
clock:=clock+5;
r_PC:=r_PC+1;
end
else
begin
r_PC:=do_read(r_SP);
r_PC:=r_PC+do_read(r_SP+1) shl 8;
r_SP:=(r_SP+2) and $FFFF;
clock:=clock+11;
end;
end;
$D9:
begin
if (signal_inv_opc()) then
begin
end
else
begin
r_PC:=do_read(r_SP);
r_PC:=r_PC+do_read(r_SP+1) shl 8;
r_SP:=(r_SP+2) and $FFFF;
clock:=clock+11;
end;
end;
$DA:
begin
if ((r_F and f_C)=0) then
begin
clock:=clock+10;
r_PC:=r_PC+3;
end
else
begin
r_PC:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
clock:=clock+10;
end;
end;
$DB:
begin
r_A:=do_input(do_read(r_PC+1));
clock:=clock+10;
r_PC:=r_PC+2;
end;
$DC:
begin
if ((r_F and f_C)=0) then
begin
clock:=clock+11;
r_PC:=r_PC+3;
end
else
begin
tmp1:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
r_SP:=(r_SP-2) and $FFFF;
r_PC:=r_PC+3;
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=tmp1;
clock:=clock+17;
end;
end;
$DD: begin
if (signal_inv_opc()) then
begin
end
else
begin
tmp1:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
r_SP:=(r_SP-2) and $FFFF;
r_PC:=r_PC+3;
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=tmp1;
clock:=clock+17;
end;
end;
$ED: begin
if (signal_inv_opc()) then
begin
end
else
begin
tmp1:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
r_SP:=(r_SP-2) and $FFFF;
r_PC:=r_PC+3;
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=tmp1;
clock:=clock+17;
end;
end;
$FD:
begin
if (signal_inv_opc()) then
begin
end
else
begin
tmp1:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
r_SP:=(r_SP-2) and $FFFF;
r_PC:=r_PC+3;
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=tmp1;
clock:=clock+17;
end;
end;
$DE:
begin
tmp1:=do_read(r_PC+1);
if ((r_F and f_C)<>0) then tmp3:=1 else tmp3:=0;
tmp2:=(r_A-tmp1-tmp3) and $FF;
r_F:=flags[tmp2];
if (r_A<tmp1+tmp3) then
begin
r_F:=r_F or f_C;
end;
if (((tmp2 xor r_A xor tmp1) and $10)<>0) then
begin
r_F:=r_F or f_A;
end;
r_A:=tmp2;
clock:=clock+7;
r_PC:=r_PC+2;
end;
$DF:
begin
r_SP:=(r_SP-2) and $FFFF;
inc(r_PC);
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=3*8;
clock:=clock+11;
end;
$E0:
begin
if ((r_F and f_P)<>0) then
begin
clock:=clock+5;
r_PC:=r_PC+1;
end
else
begin
r_PC:=do_read(r_SP);
r_PC:=r_PC+do_read(r_SP+1) shl 8;
r_SP:=(r_SP+2) and $FFFF;
clock:=clock+11;
end ;
end;
$E1:
begin
r_L:=do_read(r_SP);
r_H:=do_read(r_SP+1);
r_SP:=(r_SP+2) and $FFFF;
clock:=clock+10;
r_PC:=r_PC+1;
end;
$E2:
begin
if ((r_F and f_P)<>0) then
begin
clock:=clock+10;
r_PC:=r_PC+3;
end
else
begin
r_PC:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
clock:=clock+10;
end;
end;
$E3:
begin
tmp1:=do_read(r_SP);
do_write(r_SP,r_L);
r_L:=tmp1;
tmp1:=do_read(r_SP+1);
do_write(r_SP+1,r_H);
r_H:=tmp1;
clock:=clock+18;
r_PC:=r_PC+1;
end;
$E4:
begin
if ((r_F and f_P)<>0) then
begin
clock:=clock+11;
r_PC:=r_PC+3;
end
else
begin
tmp1:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
r_SP:=(r_SP-2) and $FFFF;
r_PC:=r_PC+3;
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=tmp1;
clock:=clock+17;
end;
end;
$E5:
begin
r_SP:=(r_SP-2) and $FFFF;
do_write(r_SP,r_L);
do_write(r_SP+1,r_H);
clock:=clock+11;
r_PC:=r_PC+1;
end;
$E6:
begin
r_A:=r_A and do_read(r_PC+1);
r_F:=flags[r_A] or (r_F and f_A);
clock:=clock+7;
r_PC:=r_PC+2;
end;
$E7:
begin
r_SP:=(r_SP-2) and $FFFF;
inc(r_PC);
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=4*8;
clock:=clock+11;
end;
$E8:
begin
if ((r_F and f_P)=0) then
begin
clock:=clock+5;
r_PC:=r_PC+1;
end
else
begin
r_PC:=do_read(r_SP);
r_PC:=r_PC+do_read(r_SP+1) shl 8;
r_SP:=(r_SP+2) and $FFFF;
clock:=clock+11;
end;
end;
$E9:
begin
r_PC:=(r_H shl 8)+r_L;
clock:=clock+5;
end;
$EA:
begin
if ((r_F and f_P)=0) then
begin
clock:=clock+10;
r_PC:=r_PC+3;
end
else
begin
r_PC:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
clock:=clock+10;
end;
end;
$EB:
begin
tmp1:=r_D;
r_D:=r_H;
r_H:=tmp1;
tmp1:=r_E;
r_E:=r_L;
r_L:=tmp1;
clock:=clock+4;
r_PC:=r_PC+1;
end;
$EC:
begin
if ((r_F and f_P)=0) then
begin
clock:=clock+11;
r_PC:=r_PC+3;
end
else
begin
tmp1:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
r_SP:=(r_SP-2) and $FFFF;
r_PC:=r_PC+3;
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=tmp1;
clock:=clock+17;
end;
end;
$EE:
begin
r_A:= r_A xor do_read(r_PC+1);
r_F:=flags[r_A] or (r_F and f_A);
clock:=clock+7;
r_PC:=r_PC+2;
end;
$EF:
begin
r_SP:=(r_SP-2) and $FFFF;
inc(r_PC);
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=5*8;
clock:=clock+11;
end;
$F0:
begin
if ((r_F and f_S)<>0) then
begin
clock:=clock+5;
r_PC:=r_PC+1;
end
else
begin
r_PC:=do_read(r_SP);
r_PC:=r_PC+(do_read(r_SP+1) shl 8);
r_SP:=(r_SP+2) and $FFFF;
clock:=clock+11;
end;
end;
$F1:
begin
r_F:=do_read(r_SP);
r_A:=do_read(r_SP+1);
r_SP:=(r_SP+2) and $FFFF;
clock:=clock+10;
r_PC:=r_PC+1;
end;
$F2:
begin
if ((r_F and f_S)<>0) then
begin
clock:=clock+10;
r_PC:=r_PC+3;
end
else
begin
r_PC:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
clock:=clock+10;
end;
end;
$F4:
begin
if ((r_F and f_S)<>0) then
begin
clock:=clock+11;
r_PC:=r_PC+3;
end
else
begin
tmp1:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
r_SP:=(r_SP-2) and $FFFF;
r_PC:=r_PC+3;
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=tmp1;
clock:=clock+17;
end;
end;
$F5:
begin
r_SP:=(r_SP-2) and $FFFF;
do_write(r_SP,r_F);
do_write(r_SP+1,r_A);
clock:=clock+11;
r_PC:=r_PC+1;
end;
$F6:
begin
r_A:=r_A or do_read(r_PC+1);
r_F:=flags[r_A] or (r_F and f_A);
clock:=clock+7;
r_PC:=r_PC+2;
end;
$F7:
begin
r_SP:=(r_SP-2) and $FFFF;
inc(r_PC);
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=6*8;
clock:=clock+11;
end;
$F8:
begin
if ((r_F and f_S)=0) then
begin
clock:=clock+5;
r_PC:=r_PC+1;
end
else
begin
r_PC:=do_read(r_SP);
r_PC:=r_PC+(do_read(r_SP+1) shl 8);
r_SP:=(r_SP+2) and $FFFF;
clock:=clock+11;
end;
end;
$F9:
begin
r_SP:=(r_H shl 8)+r_L;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$FA:
begin
if ((r_F and f_S)=0) then
begin
clock:=clock+10;
r_PC:=r_PC+3;
end
else
begin
r_PC:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
clock:=clock+10;
end;
end;
$FC:
begin
if ((r_F and f_S)=0) then
begin
clock:=clock+11;
r_PC:=r_PC+3;
end
else
begin
tmp1:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
r_SP:=(r_SP-2) and $FFFF;
r_PC:=r_PC+3;
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=tmp1;
clock:=clock+17;
end;
end;
$FE:
begin
tmp1:=do_read(r_PC+1);
tmp2:=(r_A-tmp1) and $FF;
r_F:=flags[tmp2];
if (r_A<tmp1) then
begin
r_F:=r_F or f_C;
end;
if (((tmp2 xor r_A xor tmp1) and $10)<>0) then
begin
r_F:=r_F or f_A;
end;
clock:=clock+7;
r_PC:=r_PC+2;
end;
$FF:
begin
r_SP:=(r_SP-2) and $FFFF;
inc(r_PC);
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=7*8;
clock:=clock+11;
end
else
begin
// cpu_halt_state:=true;
// cpu_halt_reason:=halt_inv;
end;
end;
end;
end;
procedure TMainForm.draw_screen; //Рисуем с video на экран (Форму)
var
i,vertX,gorY : word;
begin
i:=0;
vertX:=0;
gorY:=0;
while (i<$4000) do
begin
if video[i]<>VideoDirty[i] then //сравниваем значения , а есть ли изменения
begin
//WriteVRAM(video[i],vertX,gorY); //старый способ каждый раз расчет шел
if not N7.Checked then // черно белое ТВ
begin
gamecanvas.Canvas.Pixels[vertX,gorY]:= SuperColor[ports[$C1],video[i],1];
gamecanvas.Canvas.Pixels[vertX+1,gorY]:=SuperColor[ports[$C1],video[i],2];
gamecanvas.Canvas.Pixels[vertX+2,gorY]:=SuperColor[ports[$C1],video[i],3];
gamecanvas.Canvas.Pixels[vertX+3,gorY]:=SuperColor[ports[$C1],video[i],4];
end
else
begin
gamecanvas.Canvas.Pixels[vertX,gorY]:= GrayTV(SuperColor[ports[$C1],video[i],1]);
gamecanvas.Canvas.Pixels[vertX+1,gorY]:=GrayTV(SuperColor[ports[$C1],video[i],2]);
gamecanvas.Canvas.Pixels[vertX+2,gorY]:=GrayTV(SuperColor[ports[$C1],video[i],3]);
gamecanvas.Canvas.Pixels[vertX+3,gorY]:=GrayTV(SuperColor[ports[$C1],video[i],4]);
end;
end;
vertX:=vertX+4;
if vertX>=256 then begin vertX:=0; gorY:=gorY+1; end;
inc(i);
end;
{$R-}
for I := 0 to $4000 do VideoDirty[i]:= video[i]; // быстрое копирование массивов
{$R+}
if FullScreen1.Checked then // на весь экран или нет
MainForm.Canvas.StretchDraw(rect(0,ToolBar1.Height,MainForm.Width-16,MainForm.Height-58), gamecanvas)
else
MainForm.Canvas.Draw(0,ToolBar1.Height,gamecanvas);
end;
procedure TMainForm.VRAMTest(c1,b:Byte);
Var
pix1,pix2,pix3,pix4:byte;
begin
pix1:=0; pix2:=0; pix3:=0; pix4:=0;
if (b and 128)=128 then pix1:=pix1+1;
if (b and 8)=8 then pix1:=pix1+2;
if (b and 64)=64 then pix2:=pix2+1;
if (b and 4)=4 then pix2:=pix2+2;
if (b and 32)=32 then pix3:=pix3+1;
if (b and 2)=2 then pix3:=pix3+2;
if (b and 16)=16 then pix4:=pix4+1;
if (b and 1)=1 then pix4:=pix4+2;
SuperColor[c1,b,1]:=compute_color_index(c1,Mycolor[pix1]);
SuperColor[c1,b,2]:=compute_color_index(c1,Mycolor[pix2]);
SuperColor[c1,b,3]:=compute_color_index(c1,Mycolor[pix3]);
SuperColor[c1,b,4]:=compute_color_index(c1,Mycolor[pix4]);
end;
procedure TMainForm.CalculateColor;
var
I,j: Integer;
begin
for I := 0 to 255 do
for j := 0 to 255 do
begin
VRAMTest(i, j);
end;
end;
function TMainForm.compute_color_index(port : byte; color : tcolor): tcolor; // колор в зависимоти от порта С
begin
Result:=ClBLACK;
if ((port and $40)<>0) then Result:= (Result xor ClBLUE);
if ((port and $20)<>0) then Result:= (Result xor clLime);
if ((port and $10)<>0) then Result:= (Result xor ClRED);
case color of
clBLACK:
begin
if ((port and $08)=0) then
begin
Result:= (Result xor CLRED);
end;
if ((port and $04)=0) then
begin
Result:= (Result xor ClBLUE);
end;
end;
clLime: begin
Result:= (Result xor clLime);
end;
clred: begin
Result:= (Result xor ClRED);
if ((port and $02)=0) then
begin
//Result:= (Result xor ClGREEN);
Result:= (Result xor clLime);
end;
end;
clBLUE: begin
Result:= (Result xor ClBLUE);
if ((port and $01)=0) then
begin
Result:= (Result xor ClRED);
end;
end;
end;
// result:= ((Result and $07) shl 13) or ((Result and $38) shl 5) or ((Result and $C0) shr 3);
end;
procedure TMainForm.WriteVRAM(b:Byte;x,y: integer); // рисуем на gamecanvas значения цвета , не забываем про порт С1
Var
pix1,pix2,pix3,pix4:byte;
begin
pix1:=0; pix2:=0; pix3:=0; pix4:=0; //вычисляем цвет в зависимисти от установки бит
if (b and 128)=128 then pix1:=pix1+1;
if (b and 8)=8 then pix1:=pix1+2;
if (b and 64)=64 then pix2:=pix2+1;
if (b and 4)=4 then pix2:=pix2+2;
if (b and 32)=32 then pix3:=pix3+1;
if (b and 2)=2 then pix3:=pix3+2;
if (b and 16)=16 then pix4:=pix4+1;
if (b and 1)=1 then pix4:=pix4+2;
if N7.Checked then // черно белое ТВ
begin
gamecanvas.Canvas.Pixels[x,y] := GrayTV(compute_color_index(ports[$C1],Mycolor[pix1]));
gamecanvas.Canvas.Pixels[x+1,y]:=GrayTV(compute_color_index(ports[$C1],Mycolor[pix2]));
gamecanvas.Canvas.Pixels[x+2,y]:=GrayTV(compute_color_index(ports[$C1],Mycolor[pix3]));
gamecanvas.Canvas.Pixels[x+3,y]:=GrayTV(compute_color_index(ports[$C1],Mycolor[pix4]));
end
else
begin
gamecanvas.Canvas.Pixels[x,y]:= compute_color_index(ports[$C1],Mycolor[pix1]);
gamecanvas.Canvas.Pixels[x+1,y]:=compute_color_index(ports[$C1],Mycolor[pix2]);
gamecanvas.Canvas.Pixels[x+2,y]:=compute_color_index(ports[$C1],Mycolor[pix3]);
gamecanvas.Canvas.Pixels[x+3,y]:=compute_color_index(ports[$C1],Mycolor[pix4]);
end;
end;
procedure TMainForm.FirstPusk; //первый запуск
begin
// создадим канву для рисования
gamecanvas:=tbitmap.Create;
gamecanvas.Width:=256;
gamecanvas.Height:=256;
ResetComp; // первоночальный сброс всего
TimerMain.Enabled:=true; // запускаем основной таймер
end;
function TMainForm.readmask (keynum: word): word; // маска клавы
begin
result:= $72FF;
case keynum of
8: begin result:= $23FF end; // BCK
13: begin result:= $13FF end; // ENTER
16: begin result:= $70FF end; // SHIFT
32: begin result:= $30FF end; // SPC
37: begin result:= $FF32 end; // <-
38: begin result:= $FF31 end; // UP
39: begin result:= $FF30 end; // ->
40: begin result:= $FF33 end; // DOWN
48: begin result:= $06FF end; // 0
49: begin result:= $47FF end; // 1
50: begin result:= $46FF end; // 2
51: begin result:= $45FF end; // 3
52: begin result:= $44FF end; // 4
53: begin result:= $43FF end; // 5
54: begin result:= $00FF end; // 6
55: begin result:= $01FF end; // 7
56: begin result:= $02FF end; // 8
57: begin result:= $07FF end; // 9
65: begin result:= $64FF end; // A
66: begin result:= $31FF end; // B
67: begin result:= $57FF end; // C
68: begin result:= $27FF end; // D
69: begin result:= $54FF end; // E
70: begin result:= $67FF end; // F
71: begin result:= $10FF end; // G
72: begin result:= $16FF end; // H
73: begin result:= $75FF end; // I
74: begin result:= $52FF end; // J
75: begin result:= $55FF end; // K
76: begin result:= $22FF end; // L
77: begin result:= $76FF end; // M
78: begin result:= $53FF end; // N
79: begin result:= $21FF end; // O
80: begin result:= $63FF end; // P
81: begin result:= $71FF end; // Q
82: begin result:= $20FF end; // R
83: begin result:= $77FF end; // S
84: begin result:= $74FF end; // T
85: begin result:= $56FF end; // U
86: begin result:= $26FF end; // V
87: begin result:= $65FF end; // W
88: begin result:= $73FF end; // X
89: begin result:= $66FF end; // Y
90: begin result:= $17FF end; // Z
107: begin result:= $05FF end; // =/+ -> =/-
109: begin result:= $05FF end; // -/_ -> =/-
114: begin result:= $FF23 end; // F3
115: begin result:= $FF22 end; // F4
116: begin result:= $FF21 end; // F5
36: begin result:= $FF20 end; // Home
219: begin result:= $11FF end; // [
221: begin result:= $12FF end; // ]
190: begin result:= $24FF end; // .
188: begin result:= $37FF end; // ,
192: begin result:= $72FF end; //
end;
end;
procedure TMainForm.FormActivate(Sender: TObject);
begin
if FPusk then // а это первый ли запуск
begin
FPusk:=false;
FirstPusk;
end;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
DragAcceptFiles(MainForm.Handle, true); // сделаем драг анд дроб :)
CalculateColor;
FPusk:=true; // запомним первый запуск
English1Click(Sender);
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
DragAcceptFiles(Handle, False);
ServiceThread.Free;
end;
procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word; //опрос клавы
Shift: TShiftState);
begin
kbd(readmask(key),true); // нажали
i8080_do_opcodes(opcodes_to_run);
end;
procedure TMainForm.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
kbd(readmask(key),false); // отпустии
end;
procedure TMainForm.FullScreen1Click(Sender: TObject);
begin
FullScreen1.Checked:= not FullScreen1.Checked;
if not FullScreen1.Checked then
MainForm.Canvas.FillRect(rect(0,0,MainForm.Width,MainForm.Height));
end;
procedure TMainForm.TimerMainTimer(Sender: TObject); // основной таймер
var
j,a: word;
i: integer;
s: string;
begin
if (pause) then // если пауза курим бамбук :)
begin
exit;
end;
i8080_do_opcodes(opcodes_to_run);
draw_screen;
if clock<100000 then
begin
playTone;
end;
speaked:= 0;
end;
procedure TMainForm.ResetComp;
begin
r_B := 0; // обнулим регистры
r_C := 0;
r_D := 0;
r_E := 0;
r_H := 0;
r_L := 0;
r_A := 0;
r_F := 0;
r_PC := 0;
r_SP := 0;
clock := 0; // обнулим часики
halt_inv := 1;
halt_opc := 2;
halt_hlt := 3;
halt_bpx := 4;
halt_bpr := 5;
halt_bpw := 6;
halt_bpi := 7;
halt_bpo := 8;
pause := false;
FPS := 50;
speaked := 0;
f_S := (1 SHL 7);
f_Z :=( 1 SHL 6);
f_5 := (1 SHL 5);
f_A := (1 SHL 4);
f_3 := (1 SHL 3);
f_P := (1 SHL 2);
f_1 := (1 SHL 1);
f_C := (1 SHL 0);
BasicStack := $AFC1;
BasicHotEntry := $02FD;
BasicProgBegin := $0243;
BasicProgEnd := $0245;
fillchar(VideoDirty,sizeof(VideoDirty),257);
soundEnabled := false;
// opcodes_to_run := round ((1411200*4)/FPS);
opcodes_to_run := round ((1411200*2)/FPS);
curSnd := 0;
restClock := 0;
init_memory();
reset1();
load_bios();
i8080_do_opcodes(0);
end;
procedure TMainForm.ResetCPU1Click(Sender: TObject);
begin
ResetComp;
end;
function TMainForm.GrayTV(RGBColor : TColor) : TColor; // эффект черно белого телевизора
var
Gray : byte;
begin
Gray := Round((0.30 * GetRValue(RGBColor)) +
(0.59 * GetGValue(RGBColor)) +
(0.11 * GetBValue(RGBColor )));
Result := RGB(Gray, Gray, Gray); // грубо очень грубо :-)
end;
procedure TMainForm.English1Click(Sender: TObject);
begin
English1.Checked:=true;
Russian1.Checked:=false;
MainForm.Caption:='PK-01 Lvov emulator';
//DebuggerForm.TabSheet1.Caption:='Assembler';
//DebuggerForm.TabSheet2.Caption:='Find-replace in memory';
N1.Caption:='File';
N2.Caption:='Open';
ResetCPU1.Caption:='Reset CPU';
N11.Caption:='Pause';
N4.Caption:='Exit';
N5.Caption:='Setup';
N7.Caption:='Balck-and-white TV';
N10.Caption:='Keyboard';
N13.Caption:='Sound';
N15.Caption:='Language';
N17.Caption:='About';
end;
procedure TMainForm.Russian1Click(Sender: TObject);
begin
Russian1.Checked:=true;
English1.Checked:=false;
MainForm.Caption:='ПК-01 Львов эмулятор';
//DebuggerForm.TabSheet1.Caption:='Ассемблер';
//DebuggerForm.TabSheet2.Caption:='Поиск-замена в памяти';
N1.Caption:='Файл';
N2.Caption:='Открыть';
ResetCPU1.Caption:='Reset CPU';
N11.Caption:='Пауза';
N4.Caption:='Выход';
N5.Caption:='Настройки';
N7.Caption:='ЧБ телевизор';
N10.Caption:='Клавиатура';
N13.Caption:='Звук';
N15.Caption:='Язык программы';
N17.Caption:='О программе';
end;
// ###################################################ГРЕБАННЫЙ ЗВУК :-) ##############################################################
procedure TMainForm.putSound(bt : byte);
begin
if (((bt xor ports[$C2]) and 1)<>0) then
begin
speaker[speaked]:=clock;
speaked:=speaked+1;
end;
end;
procedure TMainForm.playTone();
var
tickPos,speakerPos,i: integer;
Buffer: array of byte;
begin
for I := 0 to 2000 do soundData[i]:=0;
tickPos:=0-restClock;
speakerPos:=0;
i:=0;
while (i<2000) do // 2000 длина массива soundData
begin
if (speakerPos<speaked) and (tickPos>=speaker[speakerPos]) then
begin
curSnd:=255-curSnd;
inc(speakerPos);
end;
tickPos:=tickPos+32;
soundData[i]:=curSnd;
inc(i);
end;
restClock:=(clock+restClock) mod 32;
if N13.Checked then
begin
//ServiceThread:= TserviceThread.Create(false);
// PlayBuffer(soundData); // вот тут будем петь :-)
end;
end;
procedure TMainForm.enableSound;
begin
soundEnabled:= true;
end;
procedure TMainForm.PlayBuffer(Buffer: array of byte); //процедура проигрывает буфер
{var Err: integer;
hEvent: Thandle; }
begin
{ with header do
begin
wFormatTag := WAVE_FORMAT_PCM; // формат РСМ
nChannels := 1; // моно
nSamplesPerSec := 44100; // частота дискретитатции 44.1 Кгц
wBitsPerSample := 8; // выборка 8 бит
nBlockAlign := nChannels * (wBitsPerSample div 8);
nAvgBytesPerSec := nSamplesPerSec * nBlockAlign;
cbSize := 0;
end;
// if Opened = true then stopPlay;
hEvent:=CreateEvent(nil,false,false,nil);
if WaveOutOpen(addr(waveOut), 0, @header, hEvent, 0, CALLBACK_WINDOW) <> MMSYSERR_NOERROR then
begin
CloseHandle(hEvent);
Exit;
end;
pBuf := GlobalAlloc(GMEM_MOVEABLE and GMEM_SHARE, length(Buffer));
pBuffer := GlobalLock(pBuf);
with outHdr do
begin
lpData := PBuffer;
dwBufferLength := length(Buffer);
dwUser := 0;
dwFlags := 0;
dwLoops := 0
end;
err:= WaveOutPrepareHeader(waveOut, @outHdr, sizeof(outHdr));
if Err <> 0 then Exit;
copyMemory(pBuffer, @Buffer, length(Buffer));
err:= WaveOutWrite(waveOut, @outHdr, sizeof(outHdr));
if Err <> 0 then Exit;
waveOutReset(waveOut);
waveOutUnprepareHeader(waveOut,@outHdr,sizeof(wavehdr));
waveOutClose(waveOut); }
end;
procedure Tservicethread.Execute;
var
Err: integer;
header : TWaveFormatEx;
waveOut : hWaveOut;
outHdr : TWaveHdr;
pBuf : tHandle;
pBuffer : pointer;
hEvent: Thandle;
begin
with header do
begin
wFormatTag := WAVE_FORMAT_PCM; // формат РСМ
nChannels := 1; // моно
nSamplesPerSec := 44100; // частота дискретитатции 44.1 Кгц
wBitsPerSample := 8; // выборка 8 бит
nBlockAlign := nChannels * (wBitsPerSample div 8);
nAvgBytesPerSec := nSamplesPerSec * nBlockAlign;
cbSize := 0;
end;
// if Opened = true then stopPlay;
hEvent:=CreateEvent(nil,false,false,nil);
if WaveOutOpen(addr(waveOut), 0, @header, hEvent, 0, CALLBACK_WINDOW) <> MMSYSERR_NOERROR then
begin
CloseHandle(hEvent);
Exit;
end;
pBuf := GlobalAlloc(GMEM_MOVEABLE and GMEM_SHARE, length(soundData));
pBuffer := GlobalLock(pBuf);
with outHdr do
begin
lpData := PBuffer;
dwBufferLength := length(soundData);
dwUser := 0;
dwFlags := 0;
dwLoops := 0
end;
WaveOutPrepareHeader(waveOut, @outHdr, sizeof(outHdr));
//copyMemory(pBuffer, @soundData, length(soundData));
// while not terminated do
// begin
WaveOutWrite(waveOut, @outHdr, sizeof(outHdr));
WaitForSingleObject(hEvent,INFINITE);
// end;
waveOutReset(waveOut);
waveOutUnprepareHeader(waveOut,@outHdr,sizeof(wavehdr));
waveOutClose(waveOut);
end;
end.
SOURCE_DELPHI\002\
EmulForKOS.dpr
program EmulForKOS;
uses
Forms,
Windows,
uMain in 'uMain.pas' {MainForm};
{$R *.res}
begin
SetThreadLocale(1049);
Application.Initialize;
Application.Title := 'ой кэбнб';
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.
SOURCE_DELPHI\002\
uMain.pas part1
unit uMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Menus,MMSystem,ShellAPI, ImgList, ComCtrls,
ToolWin;
type
TMainForm = class(TForm)
TimerMain: TTimer; MainMenu1: TMainMenu;
N1: TMenuItem; N2: TMenuItem;
N3: TMenuItem; N4: TMenuItem;
OpenDialogLvt: TOpenDialog;
ResetCPU1: TMenuItem;
N11: TMenuItem;
procedure TimerMainTimer(Sender: TObject);
procedure do_write(addr : word; bt : byte);
procedure i8080_init;
procedure i8080_reset(addr: word);
function do_read(addr : integer): word;
procedure do_write2(a_lo : word; a_hi : word; bt : byte);
function do_read2(a_lo : word; a_hi : word): word;
function compute_color_index(port : byte; color : tcolor): tcolor;
procedure WriteVRAM(b:Byte;x,y: integer);
procedure init_memory();
function do_input(port : byte): byte;
procedure do_output(port : byte; bt : byte);
procedure kbd(mask : word; press : boolean);
procedure reset1;
procedure load_bios;
function get_var(var1: word): word;
procedure set_var(var1, val: word);
procedure warm_start();
procedure do_pause();
procedure i8080_do_opcodes(nb_cycles : integer);
procedure draw_screen();
procedure FirstPusk;
function readmask (keynum: word): word;
procedure N4Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FormActivate(Sender: TObject);
procedure NewLoadFile(filenameDnD: string;start : boolean);
procedure ResetComp;
procedure ResetCPU1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure VRAMTest(c1,b:Byte);
procedure CalculateColor;
procedure Russian1Click(Sender: TObject);
procedure English1Click(Sender: TObject);
procedure Wmemory;
procedure Rmemory;
procedure Wflags;
procedure Rflags;
private
{ Private declarations }
public
procedure WMDropFiles(var Msg: TMessage); message wm_DropFiles;
{ Public declarations }
end;
var
MainForm: TMainForm;
var { регистрики} rgA,rgB,rgC,rgD,rgE,rgH,rgL,rgF,rgPC,rgSP :Cardinal;
var { флаги} fS, fZ, f5, fA, f3,fP,f1,fC : Cardinal;
memoryM: array [0..65535] of byte; // массив основной памяти $FFFF
flagsM: array [0..256] of word;
opcode : byte; // код текущей операции !!!
halt_inv :byte;
halt_opc :byte;
halt_hlt :byte;
halt_bpx :byte;
halt_bpr :byte;
halt_bpw :byte;
halt_bpi :byte;
halt_bpo :byte;
FPusk: boolean; // первый запуск
gamecanvas: tbitmap; // сюда все рисуем перед выводом на форму
video : array [0..16384] of byte; // видео память
VideoDirty : array [0..16384] of word; //буфер для быстрой прорисовки
ports : array [0..256] of byte; // порты
bios : array [0..65535] of byte; // массив для загрузки биоса, можно сразу грузить но вдруг пригодися
Myfile: array [0..90000] of byte; //файл может быть большим DUMP SAV который
SuperColor: array[0..255, 0..255,1..4] of Tcolor; // еще один вариант по цвету
pause : boolean; //пауза в эмуляторе
FPS : integer; // frames per second :-)
speaker: array [0..2000] of word; //массивы для звуков
speaked : word;
soundData: array [0..2000] of BYTE;
soundEnabled : boolean;
{ header : TWaveFormatEx;
waveOut : hWaveOut;
outHdr : TWaveHdr;
pBuf : tHandle;
pBuffer : pointer;}
myfilelength: word; // длина скачаного файла
//_filePos : integer;
r_Halted: boolean;
kbd_base : array [0..8] of byte; // массивы опроса клавиатуры
kbd_ext : array [0..4] of byte;
BasicStack : word; // переменные для бейсик программ
BasicHotEntry : word;
BasicProgBegin : word;
BasicProgEnd : word;
opcodes_to_run : integer;
curSnd : word;
restClock : word;
const MyColor:array[0..3] of Tcolor=(clBlack,clLime,clBlue,clRed);
implementation
var Wmemory_a,Wmemory_b:Cardinal; procedure TMainForm.Wmemory; begin memoryM[Wmemory_a]:=Wmemory_b; end;
var Rmemory_a,Rmemory_result:Cardinal; procedure TMainForm.Rmemory; begin Rmemory_result:=memoryM[Rmemory_a];end;
var Wflags_a,Wflags_b:Cardinal; procedure TMainForm.Wflags; begin flagsM[Wflags_a]:=Wflags_b; end;
var Rflags_a,Rflags_result:Cardinal; procedure TMainForm.Rflags; begin Rflags_result:=flagsM[Rflags_a];end;
{$R *.dfm}
procedure TMainForm.WMDropFiles(var Msg: TMessage); // порцедура отвечает за принятие перетаскиваемого файла
var
FileName: array[0..256] of char;
begin
DragQueryFile(THandle(Msg.WParam), 0, FileName, SizeOf(Filename));
MainForm.Caption:=FileName;
NewLoadFile(FileName,true);
DragFinish(THandle(Msg.WParam));
end;
procedure TMainForm.do_write(addr : word; bt : byte); // если нужно будем записывать :-)
begin
addr:=(addr and $FFFF);
if (addr>=$C000) then
begin
exit;
end;
if ((ports[$C2] and 2)<>0) then
begin
Wmemory_A:=addr; Wmemory_B:=bt; Wmemory;
end
else
if (addr<$4000) then
begin
exit;
end
else
if (addr<$8000) then
begin
video[addr-$4000]:=bt;
// memory[addr]:=bt; // запишем еще и в память но не всегда
end
else
begin
Wmemory_A:=addr; Wmemory_B:=bt; Wmemory;
end;
end;
procedure TMainForm.i8080_init;
var
j,i : word;
begin
i:=0;
while (i<256) do
begin
//flags[i]:=f1 or fP;
Wflags_a:=i;Wflags_b:=(f1 or fP);Wflags;
j:=0;
while (j<8) do
begin
if ((i and (1 SHL j))<>0) then
begin
// flags[i]:=(flags[i] xor fP);
Rflags_a:=i;Rflags;
Wflags_a:=i;Wflags_b:=(Rflags_Result xor fP);Wflags;
end;
inc(j);
end;
if ((i and $80)<>0) then
begin
// flags[i]:=(flags[i] or fS);
Rflags_a:=i;Rflags;
Wflags_a:=i;Wflags_b:=(Rflags_Result or fS);Wflags;
end;
if (i=0) then
begin
// flags[i]:=(flags[i] or fZ);
Rflags_a:=i;Rflags;
Wflags_a:=i;Wflags_b:=(Rflags_Result or fZ);Wflags;
end;
inc(i);
end;
end;
procedure TMainForm.i8080_reset(addr: word);
begin
// r_A:=0; r_F:=0; r_B:=0; r_C:=0; r_D:=0; r_E:=0; r_H:=0; r_L:=0;
// r_SP:=0; r_Halted:=false; clock:=0; r_PC:=addr;
end;
function TMainForm.do_read(addr : integer): word; // считаем значение из пямяти
begin
addr:=(addr and $FFFF);
if ((ports[$C2] and 2)<>0) then
begin
Rmemory_A:=addr; Rmemory; result := Rmemory_result;
end
else
if (addr>$7FFF) then
begin
Rmemory_A:=addr; Rmemory; result := Rmemory_result;
end
else if (addr<$4000) then
begin
result := 0;
end
else begin
result := video[addr-$4000];
end;
end;
procedure TMainForm.do_write2(a_lo : word; a_hi : word; bt : byte); // адреса
begin
do_write(a_lo+(a_hi SHL 8),bt);
end;
function TMainForm.do_read2(a_lo : word; a_hi : word): word;
begin
result := do_read(a_lo+(a_hi SHL 8));
end;
procedure TMainForm.init_memory(); // подготовим все к запуску
var
j , i : integer;
begin
i:=$0000;
while (i<$10000) do
begin
Wmemory_A:=i; Wmemory_B:=0; Wmemory;
inc(i);
end;
i:=$0000;
while (i<$4000) do begin
video[i]:=0;
inc(i);
end;
i:=$0000;
while (i<$100) do begin
ports[i]:=0;
inc(i);
end;
i:=0;
while (i<8) do begin
kbd_base[i]:=0;
inc(i);
end;
i:=0;
while (i<4) do begin
kbd_ext[i]:=0;
inc(i);
end;
i:=0;
while (i<256) do begin
// flags[i]:=(f1 or fP);
Wflags_a:=i;Wflags_b:=(f1 or fP);Wflags;
j:=0;
while (j<8) do begin
if ((i and (1 shl j))<>0) then
begin
// flags[i]:= (flags[i] xor fP);
Rflags_a:=i;Rflags;
Wflags_a:=i;Wflags_b:=(Rflags_result xor fP);Wflags;
end;
inc(j);
end;
if ((i and $80)<>0) then
begin
// flags[i]:= (flags[i] or fS);
Rflags_a:=i;Rflags;
Wflags_a:=i;Wflags_b:=(Rflags_result or fS);Wflags;
end;
if (i=0) then
begin
// flags[i]:=(flags[i] or fZ);
Rflags_a:=i;Rflags;
Wflags_a:=i;Wflags_b:=(Rflags_result xor fZ);Wflags;
end;
inc(i);
end;
end;
function TMainForm.do_input(port : byte): byte; // работа со значениями портов in
var
i,r : integer;
nD2 ,nD0 : byte;
begin
nD2:=0;
nD0:=0;
port:=$C0+(port and $13);
case port of
$C2: begin result := ports[$C2]; end;
$D1: begin
nD0:=not ports[$D0];
r:=0;
i:=0;
while (i<8) do
begin
if ((nD0 and (1 SHL i))<>0) then
begin
r:=(r or kbd_base[i]);
end;
inc(i);
end;
result := ((not r) and $FF);
end;
$D2: begin
nD2:= not ports[$D2];
r:=0;
i:=0;
while (i<4) do
begin
if ((nD2 and (1 SHL i))<>0) then
begin
r:=(r or kbd_ext[i]);
end;
inc(i);
end;
result := not ((r SHL 4) or (nD2 and $0F)) and $FF;
end
else
begin
result := $FF;
end;
end;
end;
procedure TMainForm.do_output(port : byte; bt : byte); // out
begin
port:=$C0+(port and $13);
case port of
$c1: begin // изменение порта цвета
fillchar(VideoDirty,sizeof(VideoDirty),257); // чистим массив
end;
end;
ports[port]:=bt;
end ;
procedure TMainForm.kbd(mask : word; press : boolean); // по маске вкл выкл клавишу
var
brow : byte;
erow : byte;
bcol : byte;
ecol : byte;
begin
bcol:=(mask SHR 12) and $0F;
brow:=(mask SHR 8) and $0F;
ecol:=(mask SHR 4) and $0F;
erow:=(mask SHR 0) and $0F;
if ((brow<8) and (bcol<8)) then
begin
if (press) then
begin
kbd_base[bcol]:=(kbd_base[bcol] or (1 SHL brow));
end else begin
kbd_base[bcol]:= (kbd_base[bcol] and (not(1 SHL brow)));
end;
end;
if ((erow<8) and (ecol<4)) then
begin
if (press) then
begin
kbd_ext[ecol]:= (kbd_ext[ecol]or (1 SHL erow));
end else begin
kbd_ext[ecol]:= (kbd_ext[ecol] and (not(1 SHL erow)));
end;
end;
end;
procedure TMainForm.reset1; // полный ресет :)
var
i : word;
begin
i:=0;
while (i<256) do begin
ports[i]:=$FF;
inc(i);
end;
i8080_init;
end;
procedure TMainForm.load_bios; // загрузка биоса из файла
var
i: word;
b: byte;
f: file of byte;
begin
i:=0;
AssignFile(F,ExtractFilePath(Application.ExeName)+'\bios.dat');
Reset(F); // проверять заголовок не будем :)
while not eof(f) do
begin
read(F,b);
bios[i]:=b; // загрузим в массив , а вдруг пригодится
inc(i);
end;
closeFile(F);
i:=0;
while (i<$4000) do begin
//memory[$C000+i]:=bios[22+i];
Wmemory_A:=$C000+i; Wmemory_B:=bios[22+i]; Wmemory;
inc(i);
end;
end;
procedure TMainForm.N2Click(Sender: TObject);
begin
OpenDialogLvt.InitialDir:=ExtractFilePath(Application.ExeName);
if OpenDialogLvt.Execute then NewLoadFile(OpenDialogLvt.FileName,true);
end;
procedure TMainForm.N4Click(Sender: TObject);
begin
gamecanvas.Free;
close;
end;
function TMainForm.get_var(var1: word): word; // чтение и запись нужных значений из пямяти
begin
// result:= memory[var1] + memory[var1+1]*256;
end;
procedure TMainForm.set_var(var1, val: word);
begin
// memory[var1]:= (val and $FF);
// memory[var1+1]:= (round(val/256) and $FF);
end;
procedure TMainForm.warm_start(); // горячий запуск
begin
ports[$C2]:=$FF;
rgSP:=BasicStack;
set_var(BasicStack,BasicHotEntry);
rgPC:=BasicHotEntry;
end;
procedure TMainForm.NewLoadFile(filenameDnD: string; start : boolean); //процедура загрузки всех видов файлов
var
f:file of byte;
b:Byte;
s: string;
posBas, Xend ,Xbeg ,Xrun : word;
i: integer;
begin
s:='';
AssignFile(f,filenameDnD); // распознаем что за файл
Reset(f);
for I:= 0 to 8 do
begin
read(f,b);
s:=s+chr(b);
//Myfile[j]:=strtoint(s);
// Size(f);
//seek(f,100);
end;
if s='LVOV/2.0/' then // стандартный LVT файл
begin
read(f,b);
if b=$D0 then // это бинарник
begin
seek(F,0); // вернемся к началу файла
i:=0;
while not eof(f) do
begin
read(F,b);
Myfile[i]:=b;
inc(i);
end;
myfilelength:=i;
closeFile(F); //закрываем файл
Xbeg:=Myfile[16]+Myfile[17]*256;
Xend:=Myfile[18]+Myfile[19]*256;
Xrun:=Myfile[20]+Myfile[21]*256;
if (start) then
begin
warm_start();
rgPC:=Xrun;
end;
i:=0;
while (i<=Xend-Xbeg) do
begin
do_write(Xbeg+i,Myfile[i+22]);
inc(i);
end;
end
else
begin //это бeйсик (надеюсь больше ничего нет :-) )
seek(F,0); // вернемся к началу файла
i:=0;
while not eof(f) do
begin
read(F,b);
Myfile[i]:=b;
inc(i);
end;
myfilelength:=i-1;
warm_start();
posBas:=get_var(BasicProgBegin);
i:=0;
while (i<myfilelength-16) do
begin
do_write(posBas+i,Myfile[i+16]);
inc(i);
end;
set_var(BasicProgEnd,posBas+myfilelength-16);
// направим RUN
MainForm.SetFocus;
//i8080_do_opcodes(opcodes_to_run);
//KeyboardForm.SendKeys('RUN');
end;
end;
if s='LVOV/DUMP' then // стандартный SAV файл дампа эмулятор Калашникова
begin
seek(F,0); // вернемся к началу файла
i:=0;
while not eof(f) do
begin
read(F,b);
Myfile[i]:=b;
inc(i);
end;
i:=0;
closeFile(F);
while (i<$10000) do
begin
// memory[i]:=Myfile[17+i];
Wmemory_A:=i; Wmemory_B:=Myfile[17+i]; Wmemory;
inc(i);
end;
i:=0;
while (i<$4000) do
begin
video[i]:=Myfile[17+$10000+i];
inc(i);
end;
i:=0;
while (i<$100) do
begin
ports[i]:=Myfile[17+$10000+$4000+i];
inc(i);
end;
rgB:=Myfile[17+$10000+$4000+$100];
rgH:=Myfile[17+$10000+$4000+$100+4];
rgC:=Myfile[17+$10000+$4000+$100+1];
rgL:=Myfile[17+$10000+$4000+$100+5];
rgD:=Myfile[17+$10000+$4000+$100+2];
rgA:=Myfile[17+$10000+$4000+$100+6];
rgE:=Myfile[17+$10000+$4000+$100+3];
rgF:=Myfile[17+$10000+$4000+$100+7];
rgSP:=Myfile[17+$10000+$4000+$100+9]*256+Myfile[17+$10000+$4000+$100+8];
rgPC:=Myfile[17+$10000+$4000+$100+11]*256+Myfile[17+$10000+$4000+$100+10];
fillchar(VideoDirty,sizeof(VideoDirty),257); // чистим массив
draw_screen;
end;
end;
procedure TMainForm.do_pause();
begin
pause := not pause;
end;
procedure TMainForm.i8080_do_opcodes(nb_cycles : integer); //выполнение комманд процессора
var tmp3, tmp2, tmp1, opcode : integer;
var { регистрики} r_A,r_B,r_C,r_D,r_E,r_H,r_L,r_F,r_PC,r_SP : integer;
clock:Cardinal;
{ флаги} f_S, f_Z, f_5, f_A, f_3,f_P,f_1,f_C : Integer;
procedure rF1;
Begin
//r_F:=(flags[tmp2] or (r_F and f_C));
Rflags_a:=tmp2;Rflags;
r_F:=(Rflags_result or (r_F and f_C));
end;
procedure rF2;
Begin
//r_F:=flags[tmp2 and $FF];
Rflags_a:=(tmp2 and $FF);Rflags;
r_F:=Rflags_result;
end;
procedure rF3; begin
//rF3;//r_F:=flags[tmp2];
Rflags_a:=(tmp2);Rflags;
r_F:=Rflags_result;
end;
procedure rF4; begin
//rF4;// r_F:=flags[0];
Rflags_a:=(0);Rflags;
r_F:=Rflags_result;
end;
procedure rF5; begin
//rF5; r_F:=flags[r_A] or (r_F and f_A);
Rflags_a:=(r_A);Rflags;
r_F:=(Rflags_result or (r_F and f_A));
end;
procedure clp4;begin clock:=clock+4; end;
begin
r_A:=integer(rgA);r_b:=integer(rgB);r_c:=integer(rgC);r_d:=integer(rgD);
r_e:=integer(rgE);r_H:=integer(rgH);r_L:=integer(rgL);r_F:=integer(rgF);
r_PC:=integer(rgPC);r_SP:=integer(rgSP);
f_S:=integer(fS);f_Z:=integer(fZ);f_5:=integer(f5);f_A:=integer(fA);
f_3:=integer(f3);f_P:=integer(fP);f_1:=integer(f1);f_C:=integer(fC);
clock:=0; tmp1:=0; tmp2:=0; tmp3:=0; //бнулим :-)
while (clock < nb_cycles) do
begin
opcode:=do_read(r_PC);
case opcode of // анализируем текущий код 00 .. FF, меняем значение clock в зависимоти от "длинны" команды ...
// прыгаем по памяти, меняем значения регистров и портов ПРОЦ РАБОТАЕТ !!!!
$00:
begin
clp4;
r_PC:=r_PC+1;
end;
$F3:
begin
clp4;
r_PC:=r_PC+1;
end;
$FB:
begin
clp4;
r_PC:=r_PC+1;
end;
$01:
begin
r_B:=do_read(r_PC+2);
r_C:=do_read(r_PC+1);
clock:=clock+10;
r_PC:=r_PC+3;
end;
$02:
begin
do_write2(r_C,r_B,r_A);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$03:
begin
r_C:=r_C+1;
if (r_C>$FF) then
begin
r_C:=0;
r_B:=r_B+1;
if (r_B>$FF) then
begin
r_B:=0;
end;
end;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$04:
begin
tmp2:=((r_B+1) and $FF);
RF1;
if (((tmp2 xor r_B) and $10)<>0) then
begin
r_F:=r_F or f_A;
end;
r_B:=tmp2;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$05:
begin
tmp2:=((r_B-1) and $FF);
RF1;
if (((tmp2 xor r_B) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_B:=tmp2;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$06:
begin
r_B:=do_read(r_PC+1);
clock:=clock+7;
r_PC:=r_PC+2;
end;
$07:
begin
r_A:=r_A SHL 1;
if (r_A>$FF) then
begin
r_A:=r_A or 1;
r_F:=r_F or f_C;
r_A:= r_A and $FF;
end
else
begin
r_F:=(r_F and (not f_C));
end;
clp4;
r_PC:=r_PC+1;
end;
$08: begin
begin
clp4;
r_PC:=r_PC+1;
end; end;
$10: begin
begin
clp4;
r_PC:=r_PC+1;
end; end;
$18: begin
begin
clp4;
r_PC:=r_PC+1;
end; end;
$20: begin
begin
clp4;
r_PC:=r_PC+1;
end; end;
$28: begin
begin
clp4;
r_PC:=r_PC+1;
end; end;
$30: begin
begin
clp4;
r_PC:=r_PC+1;
end; end;
$38:
begin
begin
clp4;
r_PC:=r_PC+1;
end;
end;
$09:
begin
r_L:=r_L+r_C;
r_H:=r_H+r_B;
if (r_L>$FF) then
begin
inc(r_H);
r_L:=(r_L and $FF);
end;
if (r_H>$FF) then
begin
r_H:=(r_H and $FF);
r_F:=(r_F or f_C);
end
else
begin
r_F:=(r_F and (not f_C));
end;
clock:=clock+10;
r_PC:=r_PC+1;
end;
$0A:
begin
r_A:=do_read2(r_C,r_B);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$0B:
begin
r_C:=r_C-1;
if (r_C<0) then
begin
r_C:=$FF;
r_B:=r_B-1;
if (r_B<0) then
begin
r_B:=$FF;
end;
end;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$0C:
begin
tmp2:=((r_C+1) and $FF);
RF1;
if (((tmp2 xor r_C) and $10)<>0) then
begin
r_F:=r_F or f_A;
end;
r_C:=tmp2;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$0D:
begin
tmp2:=((r_C-1) and $FF);
RF1;
if (((tmp2 xor r_C) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_C:=tmp2;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$0E:
begin
r_C:=do_read(r_PC+1);
clock:=clock+7;
r_PC:=r_PC+2;
end;
$0F:
begin
tmp1:=(r_A and 1);
r_A:=(r_A shr 1);
if (tmp1<>0) then
begin
r_A:=(r_A or $80);
r_F:=(r_F or f_C);
end
else
begin
r_F:=(r_F and ( not f_C));
end;
clp4;
r_PC:=r_PC+1;
end;
$11:
begin
r_D:=do_read(r_PC+2);
r_E:=do_read(r_PC+1);
clock:=clock+10;
r_PC:=r_PC+3;
end;
$12:
begin
do_write2(r_E,r_D,r_A);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$13:
begin
r_E:=r_E+1;
if (r_E>$FF) then
begin
r_E:=0;
r_D:=r_D+1;
if (r_D>$FF) then
begin
r_D:=0;
end;
end;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$14:
begin
tmp2:=((r_D+1)and $FF);
RF1;
if (((tmp2 xor r_D) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_D:=tmp2;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$15:
begin
tmp2:=((r_D-1)and $FF);
RF1;
if (((tmp2 xor r_D) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_D:=tmp2;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$16:
begin
r_D:=do_read(r_PC+1);
clock:=clock+7;
r_PC:=r_PC+2;
end;
$17:
begin
r_A:=(r_A shl 1);
if ((r_F and f_C)<>0) then
begin
r_A:=(r_A or 1);
end;
if (r_A>$FF) then
begin
r_F:=(r_F or f_C);
r_A:=(r_A and $FF);
end else begin
r_F:=(r_F and (not f_C));
end;
clp4;
r_PC:=r_PC+1;
end;
$19:
begin
r_L:=(r_L + r_E);
r_H:=(r_H + r_D);
if (r_L>$FF) then
begin
inc(r_H);
r_L:=(r_L and $FF);
end;
if (r_H>$FF) then
begin
r_H:=(r_H and $FF);
r_F:=(r_F or f_C);
end
else
begin
r_F:=(r_F and not (f_C));
end;
clock:=clock+10;
r_PC:=r_PC+1;
end;
$1A:
begin
r_A:=do_read2(r_E,r_D);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$1B:
begin
r_E:=r_E-1;
if (r_E<0) then
begin
r_E:=$FF;
r_D:=r_D-1;
if (r_D<0) then
begin
r_D:=$FF;
end;
end;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$1C:
begin
tmp2:=((r_E+1)and $FF);
RF1;
if (((tmp2 xor r_E) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_E:=tmp2;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$1D:
begin
tmp2:=((r_E-1) and $FF);
RF1;
if (((tmp2 xor r_E) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_E:=tmp2;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$1E:
begin
r_E:=do_read(r_PC+1);
clock:=clock+7;
r_PC:=r_PC+2;
end;
$1F:
begin
tmp1:=(r_A and 1);
r_A:=(r_A SHR 1);
if ((r_F and f_C)<>0) then
begin
r_A:=(r_A or $80);
end;
if (tmp1<>0) then
begin
r_F:=(r_F or f_C);
end
else
begin
r_F:=(r_F and not(f_C));
end;
clp4;
r_PC:=r_PC+1;
end;
$21:
begin
r_H:=do_read(r_PC+2);
r_L:=do_read(r_PC+1);
clock:=clock+10;
r_PC:=r_PC+3;
end;
$22:
begin
tmp1:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
do_write(tmp1,r_L);
do_write(tmp1+1,r_H);
clock:=clock+16;
r_PC:=r_PC+3;
end;
$23:
begin
r_L:=r_L+1;
if (r_L>$FF) then
begin
r_L:=0;
r_H:=r_H+1;
if (r_H>$FF) then
begin
r_H:=0;
end;
end;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$24:
begin
tmp2:=((r_H+1) and $FF);
RF1;
if (((tmp2 xor r_H) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_H:=tmp2;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$25:
begin
tmp2:=((r_H-1) and $FF);
RF1;
if (((tmp2 xor r_H) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_H:=tmp2;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$26:
begin
r_H:=do_read(r_PC+1);
clock:=clock+7;
r_PC:=r_PC+2;
end;
$27:
begin
tmp1:=0;
if (((r_F and f_C)<>0) or (r_A>$99)) then
begin
tmp1:=(tmp1 or $60);
end;
if (((r_F and f_A)<>0) or ((r_A and $0F)>$09)) then
begin
tmp1:=(tmp1 or $06);
end;
tmp2:=r_A+tmp1;
RF2;
if (((tmp2 xor r_A xor tmp1) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
if (tmp2>$FF) then
begin
r_F:=(r_F or f_C);
end;
r_A:=tmp2 and $FF;
clp4;
r_PC:=r_PC+1;
end;
$29:
begin
r_L:=r_L + r_L;
r_H:=r_H + r_H;
if (r_L>$FF) then
begin
inc(r_H);
r_L:=(r_L and $FF);
end;
if (r_H>$FF) then
begin
r_H:=(r_H and $FF);
r_F:=(r_F or f_C);
end else begin
r_F:=(r_F and (not f_C));
end;
clock:=clock+10;
r_PC:=r_PC+1;
end;
$2A:
begin
tmp1:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
r_L:=do_read(tmp1);
r_H:=do_read(tmp1+1);
clock:=clock+16;
r_PC:=r_PC+3;
end;
$2B:
begin
r_L:=r_L-1;
if (r_L <0) then
begin
r_L:=$FF;
r_H:=r_H-1;
if (r_H<0) then
begin
r_H:=$FF;
end;
end;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$2C:
begin
tmp2:=((r_L+1) and $FF);
RF1;
if (((tmp2 xor r_L) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_L:=tmp2;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$2D:
begin
tmp2:=((r_L-1) and $FF);
RF1;
if (((tmp2 xor r_L) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_L:=tmp2;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$2E:
begin
r_L:=do_read(r_PC+1);
clock:=clock+7;
r_PC:=r_PC+2;
end;
$2F:
begin
r_A:=(r_A xor $FF);
clp4;
r_PC:=r_PC+1;
end;
$31:
begin
r_SP:=(do_read(r_PC+2) shl 8)+do_read(r_PC+1);
clock:=clock+10;
r_PC:=r_PC+3;
end;
$32:
begin
do_write2(do_read(r_PC+1),do_read(r_PC+2),r_A);
clock:=clock+13;
r_PC:=r_PC+3;
end;
$33:
begin
if (r_SP=$FFFF) then
begin
r_SP:=0;
end
else
begin
inc(r_SP);
end;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$34:
begin
tmp1:=do_read2(r_L,r_H);
tmp2:=((tmp1+1) and $FF);
RF1;
if (((tmp2 xor tmp1) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
do_write2(r_L,r_H,tmp2);
clock:=clock+10;
r_PC:=r_PC+1;
end;
$35:
begin
tmp1:=do_read2(r_L,r_H);
tmp2:=((tmp1-1) and $FF);
RF1;
if (((tmp2 xor tmp1) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
do_write2(r_L,r_H,tmp2);
clock:=clock+10;
r_PC:=r_PC+1;
end;
$36:
begin
do_write2(r_L,r_H,do_read(r_PC+1));
clock:=clock+10;
r_PC:=r_PC+2;
end;
$37:
begin
r_F:=(r_F or f_C);
clp4;
r_PC:=r_PC+1;
end;
$39:
begin
r_L:=(r_L + (r_SP and $FF));
r_H:=(r_H + ((r_SP shr 8) and $FF));
if (r_L>$FF) then
begin
inc(r_H);
r_L:=(r_L and $FF);
end;
if (r_H>$FF) then
begin
r_H:=(r_H and $FF);
r_F:=(r_F or f_C);
end else begin
r_F:=(r_F and (not f_C));
end;
clock:=clock+10;
r_PC:=r_PC+1;
end;
$3A:
begin
r_A:=do_read2(do_read(r_PC+1),do_read(r_PC+2));
clock:=clock+13;
r_PC:=r_PC+3;
end;
$3B:
begin
if (r_SP<>0) then
begin
r_SP:=r_SP-1;
end
else
begin
r_SP:=$FFFF;
end;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$3C:
begin
tmp2:=((r_A+1) and $FF);
RF1;
if (((tmp2 xor r_A) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_A:=tmp2;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$3D:
begin
tmp2:=((r_A-1) and $FF);
RF1;
if (((tmp2 xor r_A) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_A:=tmp2;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$3E:
begin
r_A:=do_read(r_PC+1);
clock:=clock+7;
r_PC:=r_PC+2;
end;
$3F:
begin
r_F:=r_F xor f_C;
clp4;
r_PC:=r_PC+1;
end;
$40: begin clock:=clock+5; r_PC:=r_PC+1; end;
$49: begin clock:=clock+5; r_PC:=r_PC+1; end;
$52: begin clock:=clock+5; r_PC:=r_PC+1; end;
$5B: begin clock:=clock+5; r_PC:=r_PC+1; end;
$64: begin clock:=clock+5; r_PC:=r_PC+1; end;
$6D: begin clock:=clock+5; r_PC:=r_PC+1; end;
$7F:
begin
clock:=clock+5; r_PC:=r_PC+1;
end;
$41:
begin
r_B:=r_C;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$42:
begin
r_B:=r_D;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$43:
begin
r_B:=r_E;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$44:
begin
r_B:=r_H;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$45:
begin
r_B:=r_L;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$46:
begin
r_B:=do_read2(r_L,r_H);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$47:
begin
r_B:=r_A;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$48:
begin
r_C:=r_B;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$4A:
begin
r_C:=r_D;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$4B:
begin
r_C:=r_E;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$4C:
begin
r_C:=r_H;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$4D:
begin
r_C:=r_L;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$4E:
begin
r_C:=do_read2(r_L,r_H);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$4F:
begin
r_C:=r_A;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$50:
begin
r_D:=r_B;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$51:
begin
r_D:=r_C;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$53:
begin
r_D:=r_E;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$54:
begin
r_D:=r_H;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$55:
begin
r_D:=r_L;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$56:
begin
r_D:=do_read2(r_L,r_H);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$57:
begin
r_D:=r_A;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$58:
begin
r_E:=r_B;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$59:
begin
r_E:=r_C;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$5A:
begin
r_E:=r_D;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$5C:
begin
r_E:=r_H;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$5D:
begin
r_E:=r_L;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$5E:
begin
r_E:=do_read2(r_L,r_H);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$5F:
begin
r_E:=r_A;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$60:
begin
r_H:=r_B;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$61:
begin
r_H:=r_C;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$62:
begin
r_H:=r_D;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$63:
begin
r_H:=r_E;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$65:
begin
r_H:=r_L;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$66:
begin
r_H:=do_read2(r_L,r_H);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$67:
begin
r_H:=r_A;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$68:
begin
r_L:=r_B;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$69:
begin
r_L:=r_C;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$6A:
begin
r_L:=r_D;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$6B:
begin
r_L:=r_E;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$6C:
begin
r_L:=r_H;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$6E:
begin
r_L:=do_read2(r_L,r_H);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$6F:
begin
r_L:=r_A;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$70:
begin
do_write2(r_L,r_H,r_B);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$71:
begin
do_write2(r_L,r_H,r_C);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$72:
begin
do_write2(r_L,r_H,r_D);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$73:
begin
do_write2(r_L,r_H,r_E);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$74:
begin
do_write2(r_L,r_H,r_H);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$75:
begin
do_write2(r_L,r_H,r_L);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$76:
begin
// cpu_halt_state:=true;
// cpu_halt_reason:=halt_hlt;
clp4;
r_PC:=r_PC+1;
end;
$77:
begin
do_write2(r_L,r_H,r_A);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$78:
begin
r_A:=r_B;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$79:
begin
r_A:=r_C;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$7A:
begin
r_A:=r_D;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$7B:
begin
r_A:=r_E;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$7C:
begin
r_A:=r_H;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$7D:
begin
r_A:=r_L;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$7E:
begin
r_A:=do_read2(r_L,r_H);
clock:=clock+7;
r_PC:=r_PC+1;
end;
$80:
begin
tmp2:=r_A+r_B;
RF2;
if (((tmp2 xor r_A xor r_B) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
if (tmp2>$FF) then
begin
r_F:=(r_F or f_C);
end;
r_A:=(tmp2 and $FF);
clp4;
r_PC:=r_PC+1;
end;
$81:
begin
tmp2:=r_A+r_C;
RF2;
if (((tmp2 xor r_A xor r_C) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
if (tmp2>$FF) then
begin
r_F:=(r_F or f_C);
end;
r_A:=tmp2 and $FF;
clp4;
r_PC:=r_PC+1;
end;
$82:
begin
tmp2:=r_A+r_D;
RF2;
if (((tmp2 xor r_A xor r_D) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
if (tmp2>$FF) then
begin
r_F:=(r_F or f_C);
end;
r_A:=tmp2 and $FF;
clp4;
r_PC:=r_PC+1;
end;
$83:
begin
tmp2:=r_A+r_E;
RF2;
if (((tmp2 xor r_A xor r_E) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
if (tmp2>$FF) then
begin
r_F:=(r_F or f_C);
end;
r_A:=tmp2 and $FF;
clp4;
r_PC:=r_PC+1;
end;
$84:
begin
tmp2:=r_A+r_H;
RF2;
if (((tmp2 xor r_A xor r_H) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
if (tmp2>$FF) then
begin
r_F:=(r_F or f_C);
end;
r_A:=tmp2 and $FF;
clp4;
r_PC:=r_PC+1;
end;
$85:
begin
tmp2:=r_A+r_L;
RF2;
if (((tmp2 xor r_A xor r_L) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
if (tmp2>$FF) then
begin
r_F:=(r_F or f_C);
end;
r_A:=tmp2 and $FF;
clp4;
r_PC:=r_PC+1;
end;
$86:
begin
tmp1:=do_read2(r_L,r_H);
tmp2:=r_A+tmp1;
RF2;
if (((tmp2 xor r_A xor tmp1) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
if (tmp2>$FF) then
begin
r_F:=(r_F or f_C);
end;
r_A:=tmp2 and $FF;
clock:=clock+7;
r_PC:=r_PC+1;
end;
$87:
begin
tmp2:=r_A+r_A;
RF2;
if (((tmp2 xor r_A xor r_A) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
if (tmp2>$FF) then
begin
r_F:=(r_F or f_C);
end;
r_A:=tmp2 and $FF;
clp4;
r_PC:=r_PC+1;
end;
$88:
begin
tmp2:=r_A+r_B;
if ((r_F and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
RF2;
if (((tmp2 xor r_A xor r_B) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
if (tmp2>$FF) then
begin
r_F:=(r_F or f_C);
end;
r_A:=tmp2 and $FF;
clp4;
r_PC:=r_PC+1;
end;
$89:
begin
tmp2:=r_A+r_C;
if ((r_F and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
RF2;
if (((tmp2 xor r_A xor r_C) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
if (tmp2>$FF) then
begin
r_F:=(r_F or f_C);
end;
r_A:=tmp2 and $FF;
clp4;
r_PC:=r_PC+1;
end;
$8A:
begin
tmp2:=r_A+r_D;
if ((r_F and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
RF2;
if (((tmp2 xor r_A xor r_D) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
if (tmp2>$FF) then
begin
r_F:=(r_F or f_C);
end;
r_A:=tmp2 and $FF;
clp4;
r_PC:=r_PC+1;
end;
$8B:
begin
tmp2:=r_A+r_E;
if ((r_F and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
RF2;
if (((tmp2 xor r_A xor r_E) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
if (tmp2>$FF) then
begin
r_F:=(r_F or f_C);
end;
r_A:=tmp2 and $FF;
clp4;
r_PC:=r_PC+1;
end;
$8C:
begin
tmp2:=r_A+r_H;
if ((r_F and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
RF2;
if (((tmp2 xor r_A xor r_H) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
if (tmp2>$FF) then
begin
r_F:=r_F or f_C;
end;
r_A:=tmp2 and $FF;
clp4;
r_PC:=r_PC+1;
end;
$8D:
begin
tmp2:=r_A+r_L;
if ((r_F and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
RF2;
if (((tmp2 xor r_A xor r_L) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
if (tmp2>$FF) then
begin
r_F:=(r_F or f_C);
end;
r_A:=tmp2 and $FF;
clp4;
r_PC:=r_PC+1;
end;
$8E:
begin
tmp1:=do_read2(r_L,r_H);
tmp2:=r_A+tmp1;
if ((r_F and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
RF2;
if (((tmp2 xor r_A xor tmp1) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
if (tmp2>$FF) then
begin
r_F:=(r_F or f_C);
end;
r_A:=tmp2 and $FF;
clock:=clock+7;
r_PC:=r_PC+1;
end;
$8F:
begin
tmp2:=r_A+r_A;
if ((r_F and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
RF2;
if (((tmp2 xor r_A xor r_A) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
if (tmp2>$FF) then
begin
r_F:=(r_F or f_C);
end;
r_A:=tmp2 and $FF;
clp4;
r_PC:=r_PC+1;
end;
SOURCE_DELPHI\002\
uMain.pas part2
$90:
begin
tmp2:=(r_A-r_B) and $FF;
RF3;
if (r_A<r_B) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor r_B) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_A:=tmp2;
clp4;
r_PC:=r_PC+1;
end;
$91:
begin
tmp2:=(r_A-r_C) and $FF;
RF3;
if (r_A<r_C) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor r_C) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_A:=tmp2;
clp4;
r_PC:=r_PC+1;
end;
$92:
begin
tmp2:=(r_A-r_D) and $FF;
RF3;
if (r_A<r_D) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor r_D) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_A:=tmp2;
clp4;
r_PC:=r_PC+1;
end;
$93:
begin
tmp2:=(r_A-r_E) and $FF;
RF3;
if (r_A<r_E) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor r_E) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_A:=tmp2;
clp4;
r_PC:=r_PC+1;
end;
$94:
begin
tmp2:=(r_A-r_H) and $FF;
RF3;
if (r_A<r_H) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor r_H) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_A:=tmp2;
clp4;
r_PC:=r_PC+1;
end;
$95:
begin
tmp2:=(r_A-r_L) and $FF;
RF3;
if (r_A<r_L) then
begin
r_F:=r_F or f_C;
end;
if (((tmp2 xor r_A xor r_L) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_A:=tmp2;
clp4;
r_PC:=r_PC+1;
end;
$96:
begin
tmp1:=do_read2(r_L,r_H);
tmp2:=(r_A-tmp1) and $FF;
RF3;
if (r_A<tmp1) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor tmp1) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_A:=tmp2;
clock:=clock+7;
r_PC:=r_PC+1;
end;
$97:
begin
rF4;
r_A:=0;
clp4;
r_PC:=r_PC+1;
end;
$98:
begin
if ((r_F and f_C)<>0) then tmp3:=1 else tmp3:=0;
tmp2:=(r_A-r_B-tmp3) and $FF;
RF3;
if (r_A<r_B+tmp3) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor r_B) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_A:=tmp2;
clp4;
r_PC:=r_PC+1;
end;
$99:
begin
if ((r_F and f_C)<>0) then tmp3:=1 else tmp3:=0;
tmp2:=(r_A-r_C-tmp3) and $FF;
RF3;
if (r_A<(r_C+tmp3)) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor r_C) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_A:=tmp2;
clp4;
r_PC:=r_PC+1;
end;
$9A:
begin
if ((r_F and f_C)<>0) then tmp3:=1 else tmp3:=0;
tmp2:=(r_A-r_D-tmp3) and $FF;
RF3;
if (r_A<r_D+tmp3) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor r_D) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_A:=tmp2;
clp4;
r_PC:=r_PC+1;
end;
$9B:
begin
if ((r_F and f_C)<>0) then tmp3:=1 else tmp3:=0;
tmp2:=(r_A-r_E-tmp3) and $FF;
RF3;
if (r_A<r_E+tmp3) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor r_E) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_A:=tmp2;
clp4;
r_PC:=r_PC+1;
end;
$9C:
begin
if ((r_F and f_C)<>0) then tmp3:=1 else tmp3:=0;
tmp2:=(r_A-r_H-tmp3) and $FF;
RF3;
if (r_A<r_H+tmp3) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor r_H) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_A:=tmp2;
clp4;
r_PC:=r_PC+1;
end;
$9D:
begin
if ((r_F and f_C)<>0) then tmp3:=1 else tmp3:=0;
tmp2:=(r_A-r_L-tmp3) and $FF;
RF3;
if (r_A<r_L+tmp3) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor r_L) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_A:=tmp2;
clp4;
r_PC:=r_PC+1;
end;
$9E:
begin
tmp1:=do_read2(r_L,r_H);
if ((r_F and f_C)<>0) then tmp3:=1 else tmp3:=0;
tmp2:=(r_A-tmp1-tmp3) and $FF;
RF3;
if (r_A<tmp1+tmp3) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor tmp1) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
r_A:=tmp2;
clock:=clock+7;
r_PC:=r_PC+1;
end;
$9F:
begin
if ((r_F and f_C)<>0) then tmp2:=$FF else tmp2:=0;
RF3;
if (tmp2<>0) then
begin
r_F:=r_F or (f_A or f_C);
end;
r_A:=tmp2;
clp4;
r_PC:=r_PC+1;
end;
$A0:
begin
r_A:=r_A and r_B;
rF5;
clp4;
r_PC:=r_PC+1;
end;
$A1:
begin
r_A:=r_A and r_C;
rF5;
clp4;
r_PC:=r_PC+1;
end;
$A2:
begin
r_A:=r_A and r_D;
rF5;
clp4;
r_PC:=r_PC+1;
end;
$A3:
begin
r_A:=r_A and r_E;
rF5;
clp4;
r_PC:=r_PC+1;
end;
$A4:
begin
r_A:=r_A and r_H;
rf5;
clp4;
r_PC:=r_PC+1;
end;
$A5:
begin
r_A:=r_A and r_L;
RF5;
clp4;
r_PC:=r_PC+1;
end;
$A6:
begin
tmp1:=do_read2(r_L,r_H);
r_A:=r_A and tmp1;
RF5;
clock:=clock+7;
r_PC:=r_PC+1;
end;
$A7:
begin
r_A:=r_A and r_A;
RF5;
clp4;
r_PC:=r_PC+1;
end;
$A8:
begin
r_A:=r_A xor r_B;
RF5;
clp4;
r_PC:=r_PC+1;
end;
$A9:
begin
r_A:=r_A xor r_C;
RF5;
clp4;
r_PC:=r_PC+1;
end;
$AA:
begin
r_A:=r_A xor r_D;
RF5;
clp4;
r_PC:=r_PC+1;
end;
$AB:
begin
r_A:=r_A xor r_E;
RF5;
clp4;
r_PC:=r_PC+1;
end;
$AC:
begin
r_A:=r_A xor r_H;
RF5;
clp4;
r_PC:=r_PC+1;
end;
$AD:
begin
r_A:=r_A xor r_L;
RF5;
clp4;
r_PC:=r_PC+1;
end;
$AE:
begin
tmp1:=do_read2(r_L,r_H);
r_A:=r_A xor tmp1;
RF5;
clock:=clock+7;
r_PC:=r_PC+1;
end;
$AF:
begin
r_A:=0;
RF5;
clp4;
r_PC:=r_PC+1;
end;
$B0:
begin
r_A:=r_A or r_B;
RF5;
clp4;
r_PC:=r_PC+1;
end;
$B1:
begin
r_A:=r_A or r_C;
RF5;
clp4;
r_PC:=r_PC+1;
end;
$B2:
begin
r_A:=r_A or r_D;
RF5;
clp4;
r_PC:=r_PC+1;
end;
$B3:
begin
r_A:=r_A or r_E;
RF5;
clp4;
r_PC:=r_PC+1;
end;
$B4:
begin
r_A:=r_A or r_H;
RF5;
clp4;
r_PC:=r_PC+1;
end;
$B5:
begin
r_A:=r_A or r_L;
RF5;
clp4;
r_PC:=r_PC+1;
end;
$B6:
begin
tmp1:=do_read2(r_L,r_H);
r_A:=r_A or tmp1;
RF5;
clock:=clock+7;
r_PC:=r_PC+1;
end;
$B7:
begin
r_A:=r_A or r_A;
RF5;
clp4;
r_PC:=r_PC+1;
end;
$B8:
begin
tmp2:=(r_A-r_B) and $FF;
RF3;
if (r_A<r_B) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor r_B) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
clp4;
r_PC:=r_PC+1;
end;
$B9:
begin
tmp2:=(r_A-r_C) and $FF;
RF3;
if (r_A<r_C) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor r_C) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
clp4;
r_PC:=r_PC+1;
end;
$BA:
begin
tmp2:=(r_A-r_D) and $FF;
RF3;
if (r_A<r_D) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor r_D) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
clp4;
r_PC:=r_PC+1;
end;
$BB:
begin
tmp2:=(r_A-r_E) and $FF;
RF3;
if (r_A<r_E) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor r_E) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
clp4;
r_PC:=r_PC+1;
end;
$BC:
begin
tmp2:=(r_A-r_H) and $FF;
RF3;
if (r_A<r_H) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor r_H) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
clp4;
r_PC:=r_PC+1;
end;
$BD:
begin
tmp2:=(r_A-r_L) and $FF;
RF3;
if (r_A<r_L) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor r_L) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
clp4;
r_PC:=r_PC+1;
end;
$BE:
begin
tmp1:=do_read2(r_L,r_H);
tmp2:=(r_A-tmp1) and $FF;
RF3;
if (r_A<tmp1) then
begin
r_F:=(r_F or f_C);
end;
if (((tmp2 xor r_A xor tmp1) and $10)<>0) then
begin
r_F:=(r_F or f_A);
end;
clock:=clock+7;
r_PC:=r_PC+1;
end;
$BF:
begin
rf4;
clp4;
r_PC:=r_PC+1;
end;
$C0:
begin
if ((r_F and f_Z)<>0) then
begin
clock:=clock+5;
r_PC:=r_PC+1;
end
else
begin
r_PC:=do_read(r_SP);
r_PC:=r_PC+(do_read(r_SP+1) shl 8);
r_SP:=(r_SP+2) and $FFFF;
clock:=clock+11;
end;
end;
$C1:
begin
r_C:=do_read(r_SP);
r_B:=do_read(r_SP+1);
r_SP:=(r_SP+2) and $FFFF;
clock:=clock+10;
r_PC:=r_PC+1;
end;
$C2:
begin
if ((r_F and f_Z)<>0) then
begin
clock:=clock+10;
r_PC:=r_PC+3;
end
else
begin
r_PC:=do_read(r_PC+1)+((do_read(r_PC+2) shl 8));
clock:=clock+10;
end;
end;
$C3:
begin
r_PC:=do_read(r_PC+1)+((do_read(r_PC+2) shl 8));
clock:=clock+10;
end;
$C4:
begin
if ((r_F and f_Z)<>0) then
begin
clock:=clock+11;
r_PC:=r_PC+3;
end
else
begin
tmp1:=do_read(r_PC+1)+((do_read(r_PC+2) shl 8));
r_SP:=(r_SP-2) and $FFFF;
r_PC:=r_PC+3;
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=tmp1;
clock:=clock+17;
end;
end;
$C5:
begin
r_SP:=(r_SP-2) and $FFFF;
do_write(r_SP,r_C);
do_write(r_SP+1,r_B);
clock:=clock+11;
r_PC:=r_PC+1;
end;
$C6:
begin
tmp1:=do_read(r_PC+1);
tmp2:=r_A+tmp1;
RF2;
if (((tmp2 xor r_A xor tmp1) and $10)<>0) then
begin
r_F:=r_F or f_A;
end;
if (tmp2>$FF) then
begin
r_F:=r_F or f_C;
end;
r_A:=tmp2 and $FF;
clock:=clock+7;
r_PC:=r_PC+2;
end;
$C7:
begin
r_SP:=(r_SP-2) and $FFFF;
inc(r_PC);
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=0*8;
clock:=clock+11;
end;
$C8:
begin
if ((r_F and f_Z)=0) then
begin
clock:=clock+5;
r_PC:=r_PC+1;
end
else
begin
r_PC:=do_read(r_SP);
r_PC:=r_PC+(do_read(r_SP+1) shl 8);
r_SP:=(r_SP+2) and $FFFF;
clock:=clock+11;
end;
end;
$C9:
begin
r_PC:=do_read(r_SP);
r_PC:=r_PC+(do_read(r_SP+1) shl 8);
r_SP:=(r_SP+2) and $FFFF;
clock:=clock+11;
end;
$CA:
begin
if ((r_F and f_Z)=0) then
begin
clock:=clock+10;
r_PC:=r_PC+3;
end
else
begin
r_PC:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
clock:=clock+10;
end;
end;
$CB:
begin
begin
r_PC:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
clock:=clock+10;
end;
end;
$CC:
begin
if ((r_F and f_Z)=0) then
begin
clock:=clock+11;
r_PC:=r_PC+3;
end
else
begin
tmp1:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
r_SP:=(r_SP-2) and $FFFF;
r_PC:=r_PC+3;
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=tmp1;
clock:=clock+17;
end
end;
$CD:
begin
tmp1:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
r_SP:=(r_SP-2) and $FFFF;
r_PC:=r_PC+3;
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=tmp1;
clock:=clock+17;
end;
$CE:
begin
tmp1:=do_read(r_PC+1);
tmp2:=r_A+tmp1;
if ((r_F and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
RF2;
if (((tmp2 xor r_A xor tmp1) and $10)<>0) then
begin
r_F:=r_F or f_A;
end;
if (tmp2>$FF) then
begin
r_F:=r_F or f_C;
end;
r_A:=tmp2 and $FF;
clock:=clock+7;
r_PC:=r_PC+2;
end;
$CF:
begin
r_SP:=(r_SP-2) and $FFFF;
inc(r_PC);
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=1*8;
clock:=clock+11;
end;
$D0:
begin
if ((r_F and f_C)<>0) then
begin
clock:=clock+5;
r_PC:=r_PC+1;
end
else
begin
r_PC:=do_read(r_SP);
r_PC:=r_PC+(do_read(r_SP+1) shl 8);
r_SP:=(r_SP+2) and $FFFF;
clock:=clock+11;
end
end;
$D1:
begin
r_E:=do_read(r_SP);
r_D:=do_read(r_SP+1);
r_SP:=(r_SP+2) and $FFFF;
clock:=clock+10;
r_PC:=r_PC+1;
end;
$D2:
begin
if ((r_F and f_C)<>0) then
begin
clock:=clock+10;
r_PC:=r_PC+3;
end
else
begin
r_PC:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
clock:=clock+10;
end;
end;
$D3:
begin
do_output(do_read(r_PC+1),r_A);
clock:=clock+10;
r_PC:=r_PC+2;
end;
$D4:
begin
if ((r_F and f_C)<>0) then
begin
clock:=clock+11;
r_PC:=r_PC+3;
end
else
begin
tmp1:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
r_SP:=(r_SP-2) and $FFFF;
r_PC:=r_PC+3;
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=tmp1;
clock:=clock+17;
end;
end;
$D5:
begin
r_SP:=(r_SP-2) and $FFFF;
do_write(r_SP,r_E);
do_write(r_SP+1,r_D);
clock:=clock+11;
r_PC:=r_PC+1;
end;
$D6:
begin
tmp1:=do_read(r_PC+1);
tmp2:=(r_A-tmp1) and $FF;
RF3;
if (r_A<tmp1) then
begin
r_F:=r_F or f_C;
end;
if (((tmp2 xor r_A xor tmp1) and $10)<>0) then
begin
r_F:=r_F or f_A;
end;
r_A:=tmp2;
clock:=clock+7;
r_PC:=r_PC+2;
end;
$D7:
begin
r_SP:=(r_SP-2) and $FFFF;
inc(r_PC);
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=2*8;
clock:=clock+11;
end;
$D8:
begin
if ((r_F and f_C)=0) then
begin
clock:=clock+5;
r_PC:=r_PC+1;
end
else
begin
r_PC:=do_read(r_SP);
r_PC:=r_PC+do_read(r_SP+1) shl 8;
r_SP:=(r_SP+2) and $FFFF;
clock:=clock+11;
end;
end;
$D9:
begin
begin
r_PC:=do_read(r_SP);
r_PC:=r_PC+do_read(r_SP+1) shl 8;
r_SP:=(r_SP+2) and $FFFF;
clock:=clock+11;
end;
end;
$DA:
begin
if ((r_F and f_C)=0) then
begin
clock:=clock+10;
r_PC:=r_PC+3;
end
else
begin
r_PC:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
clock:=clock+10;
end;
end;
$DB:
begin
r_A:=do_input(do_read(r_PC+1));
clock:=clock+10;
r_PC:=r_PC+2;
end;
$DC:
begin
if ((r_F and f_C)=0) then
begin
clock:=clock+11;
r_PC:=r_PC+3;
end
else
begin
tmp1:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
r_SP:=(r_SP-2) and $FFFF;
r_PC:=r_PC+3;
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=tmp1;
clock:=clock+17;
end;
end;
$DD: begin
begin
tmp1:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
r_SP:=(r_SP-2) and $FFFF;
r_PC:=r_PC+3;
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=tmp1;
clock:=clock+17;
end;
end;
$ED: begin
begin
tmp1:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
r_SP:=(r_SP-2) and $FFFF;
r_PC:=r_PC+3;
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=tmp1;
clock:=clock+17;
end;
end;
$FD:
begin
begin
tmp1:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
r_SP:=(r_SP-2) and $FFFF;
r_PC:=r_PC+3;
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=tmp1;
clock:=clock+17;
end;
end;
$DE:
begin
tmp1:=do_read(r_PC+1);
if ((r_F and f_C)<>0) then tmp3:=1 else tmp3:=0;
tmp2:=(r_A-tmp1-tmp3) and $FF;
RF3;
if (r_A<tmp1+tmp3) then
begin
r_F:=r_F or f_C;
end;
if (((tmp2 xor r_A xor tmp1) and $10)<>0) then
begin
r_F:=r_F or f_A;
end;
r_A:=tmp2;
clock:=clock+7;
r_PC:=r_PC+2;
end;
$DF:
begin
r_SP:=(r_SP-2) and $FFFF;
inc(r_PC);
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=3*8;
clock:=clock+11;
end;
$E0:
begin
if ((r_F and f_P)<>0) then
begin
clock:=clock+5;
r_PC:=r_PC+1;
end
else
begin
r_PC:=do_read(r_SP);
r_PC:=r_PC+do_read(r_SP+1) shl 8;
r_SP:=(r_SP+2) and $FFFF;
clock:=clock+11;
end ;
end;
$E1:
begin
r_L:=do_read(r_SP);
r_H:=do_read(r_SP+1);
r_SP:=(r_SP+2) and $FFFF;
clock:=clock+10;
r_PC:=r_PC+1;
end;
$E2:
begin
if ((r_F and f_P)<>0) then
begin
clock:=clock+10;
r_PC:=r_PC+3;
end
else
begin
r_PC:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
clock:=clock+10;
end;
end;
$E3:
begin
tmp1:=do_read(r_SP);
do_write(r_SP,r_L);
r_L:=tmp1;
tmp1:=do_read(r_SP+1);
do_write(r_SP+1,r_H);
r_H:=tmp1;
clock:=clock+18;
r_PC:=r_PC+1;
end;
$E4:
begin
if ((r_F and f_P)<>0) then
begin
clock:=clock+11;
r_PC:=r_PC+3;
end
else
begin
tmp1:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
r_SP:=(r_SP-2) and $FFFF;
r_PC:=r_PC+3;
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=tmp1;
clock:=clock+17;
end;
end;
$E5:
begin
r_SP:=(r_SP-2) and $FFFF;
do_write(r_SP,r_L);
do_write(r_SP+1,r_H);
clock:=clock+11;
r_PC:=r_PC+1;
end;
$E6:
begin
r_A:=r_A and do_read(r_PC+1);
RF5;
clock:=clock+7;
r_PC:=r_PC+2;
end;
$E7:
begin
r_SP:=(r_SP-2) and $FFFF;
inc(r_PC);
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=4*8;
clock:=clock+11;
end;
$E8:
begin
if ((r_F and f_P)=0) then
begin
clock:=clock+5;
r_PC:=r_PC+1;
end
else
begin
r_PC:=do_read(r_SP);
r_PC:=r_PC+do_read(r_SP+1) shl 8;
r_SP:=(r_SP+2) and $FFFF;
clock:=clock+11;
end;
end;
$E9:
begin
r_PC:=(r_H shl 8)+r_L;
clock:=clock+5;
end;
$EA:
begin
if ((r_F and f_P)=0) then
begin
clock:=clock+10;
r_PC:=r_PC+3;
end
else
begin
r_PC:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
clock:=clock+10;
end;
end;
$EB:
begin
tmp1:=r_D;
r_D:=r_H;
r_H:=tmp1;
tmp1:=r_E;
r_E:=r_L;
r_L:=tmp1;
clp4;
r_PC:=r_PC+1;
end;
$EC:
begin
if ((r_F and f_P)=0) then
begin
clock:=clock+11;
r_PC:=r_PC+3;
end
else
begin
tmp1:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
r_SP:=(r_SP-2) and $FFFF;
r_PC:=r_PC+3;
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=tmp1;
clock:=clock+17;
end;
end;
$EE:
begin
r_A:= r_A xor do_read(r_PC+1);
RF5;
clock:=clock+7;
r_PC:=r_PC+2;
end;
$EF:
begin
r_SP:=(r_SP-2) and $FFFF;
inc(r_PC);
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=5*8;
clock:=clock+11;
end;
$F0:
begin
if ((r_F and f_S)<>0) then
begin
clock:=clock+5;
r_PC:=r_PC+1;
end
else
begin
r_PC:=do_read(r_SP);
r_PC:=r_PC+(do_read(r_SP+1) shl 8);
r_SP:=(r_SP+2) and $FFFF;
clock:=clock+11;
end;
end;
$F1:
begin
r_F:=do_read(r_SP);
r_A:=do_read(r_SP+1);
r_SP:=(r_SP+2) and $FFFF;
clock:=clock+10;
r_PC:=r_PC+1;
end;
$F2:
begin
if ((r_F and f_S)<>0) then
begin
clock:=clock+10;
r_PC:=r_PC+3;
end
else
begin
r_PC:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
clock:=clock+10;
end;
end;
$F4:
begin
if ((r_F and f_S)<>0) then
begin
clock:=clock+11;
r_PC:=r_PC+3;
end
else
begin
tmp1:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
r_SP:=(r_SP-2) and $FFFF;
r_PC:=r_PC+3;
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=tmp1;
clock:=clock+17;
end;
end;
$F5:
begin
r_SP:=(r_SP-2) and $FFFF;
do_write(r_SP,r_F);
do_write(r_SP+1,r_A);
clock:=clock+11;
r_PC:=r_PC+1;
end;
$F6:
begin
r_A:=r_A or do_read(r_PC+1);
RF5;
clock:=clock+7;
r_PC:=r_PC+2;
end;
$F7:
begin
r_SP:=(r_SP-2) and $FFFF;
inc(r_PC);
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=6*8;
clock:=clock+11;
end;
$F8:
begin
if ((r_F and f_S)=0) then
begin
clock:=clock+5;
r_PC:=r_PC+1;
end
else
begin
r_PC:=do_read(r_SP);
r_PC:=r_PC+(do_read(r_SP+1) shl 8);
r_SP:=(r_SP+2) and $FFFF;
clock:=clock+11;
end;
end;
$F9:
begin
r_SP:=(r_H shl 8)+r_L;
clock:=clock+5;
r_PC:=r_PC+1;
end;
$FA:
begin
if ((r_F and f_S)=0) then
begin
clock:=clock+10;
r_PC:=r_PC+3;
end
else
begin
r_PC:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
clock:=clock+10;
end;
end;
$FC:
begin
if ((r_F and f_S)=0) then
begin
clock:=clock+11;
r_PC:=r_PC+3;
end
else
begin
tmp1:=do_read(r_PC+1)+(do_read(r_PC+2) shl 8);
r_SP:=(r_SP-2) and $FFFF;
r_PC:=r_PC+3;
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=tmp1;
clock:=clock+17;
end;
end;
$FE:
begin
tmp1:=do_read(r_PC+1);
tmp2:=(r_A-tmp1) and $FF;
RF3;
if (r_A<tmp1) then
begin
r_F:=r_F or f_C;
end;
if (((tmp2 xor r_A xor tmp1) and $10)<>0) then
begin
r_F:=r_F or f_A;
end;
clock:=clock+7;
r_PC:=r_PC+2;
end;
$FF:
begin
r_SP:=(r_SP-2) and $FFFF;
inc(r_PC);
do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=7*8;
clock:=clock+11;
end
else
begin
// cpu_halt_state:=true;
// cpu_halt_reason:=halt_inv;
end;
end;
end;
rgA:=Cardinal(r_A);rgB:=Cardinal(r_b);rgC:=Cardinal(r_c);rgD:=Cardinal(r_d);
rgE:=Cardinal(r_e);rgH:=Cardinal(r_H);rgL:=Cardinal(r_L);rgF:=Cardinal(r_F);
rgPC:=Cardinal(r_PC);rgSP:=Cardinal(r_SP);
fS:=Cardinal(f_S);fZ:=Cardinal(f_Z);f5:=Cardinal(f_5);fA:=Cardinal(f_A);
f3:=Cardinal(f_3);fP:=Cardinal(f_P);f1:=Cardinal(f_1);fC:=Cardinal(f_C);
end;
procedure TMainForm.draw_screen; //Рисуем с video на экран (Форму)
var
i,vertX,gorY : word;
begin
i:=0;
vertX:=0;
gorY:=0;
while (i<$4000) do
begin
if video[i]<>VideoDirty[i] then //сравниваем значения , а есть ли изменения
begin
//WriteVRAM(video[i],vertX,gorY); //старый способ каждый раз расчет шел
//if not N7.Checked then // черно белое ТВ
begin
gamecanvas.Canvas.Pixels[vertX,gorY]:= SuperColor[ports[$C1],video[i],1];
gamecanvas.Canvas.Pixels[vertX+1,gorY]:=SuperColor[ports[$C1],video[i],2];
gamecanvas.Canvas.Pixels[vertX+2,gorY]:=SuperColor[ports[$C1],video[i],3];
gamecanvas.Canvas.Pixels[vertX+3,gorY]:=SuperColor[ports[$C1],video[i],4];
end;
end;
vertX:=vertX+4;
if vertX>=256 then begin vertX:=0; gorY:=gorY+1; end;
inc(i);
end;
{$R-}
for I := 0 to $4000 do VideoDirty[i]:= video[i]; // быстрое копирование массивов
{$R+}
//if FullScreen1.Checked then // на весь экран или нет
MainForm.Canvas.StretchDraw(rect(0,0,MainForm.Width-0,MainForm.Height-30), gamecanvas)
//else
//MainForm.Canvas.Draw(0,0,gamecanvas);
end;
procedure TMainForm.VRAMTest(c1,b:Byte);
Var
pix1,pix2,pix3,pix4:byte;
begin
pix1:=0; pix2:=0; pix3:=0; pix4:=0;
if (b and 128)=128 then pix1:=pix1+1;
if (b and 8)=8 then pix1:=pix1+2;
if (b and 64)=64 then pix2:=pix2+1;
if (b and 4)=4 then pix2:=pix2+2;
if (b and 32)=32 then pix3:=pix3+1;
if (b and 2)=2 then pix3:=pix3+2;
if (b and 16)=16 then pix4:=pix4+1;
if (b and 1)=1 then pix4:=pix4+2;
SuperColor[c1,b,1]:=compute_color_index(c1,Mycolor[pix1]);
SuperColor[c1,b,2]:=compute_color_index(c1,Mycolor[pix2]);
SuperColor[c1,b,3]:=compute_color_index(c1,Mycolor[pix3]);
SuperColor[c1,b,4]:=compute_color_index(c1,Mycolor[pix4]);
end;
procedure TMainForm.CalculateColor;
var
I,j: Integer;
begin
for I := 0 to 255 do
for j := 0 to 255 do
begin
VRAMTest(i, j);
end;
end;
function TMainForm.compute_color_index(port : byte; color : tcolor): tcolor; // колор в зависимоти от порта С
begin
Result:=ClBLACK;
if ((port and $40)<>0) then Result:= (Result xor ClBLUE);
if ((port and $20)<>0) then Result:= (Result xor clLime);
if ((port and $10)<>0) then Result:= (Result xor ClRED);
case color of
clBLACK:
begin
if ((port and $08)=0) then
begin
Result:= (Result xor CLRED);
end;
if ((port and $04)=0) then
begin
Result:= (Result xor ClBLUE);
end;
end;
clLime: begin
Result:= (Result xor clLime);
end;
clred: begin
Result:= (Result xor ClRED);
if ((port and $02)=0) then
begin
//Result:= (Result xor ClGREEN);
Result:= (Result xor clLime);
end;
end;
clBLUE: begin
Result:= (Result xor ClBLUE);
if ((port and $01)=0) then
begin
Result:= (Result xor ClRED);
end;
end;
end;
// result:= ((Result and $07) shl 13) or ((Result and $38) shl 5) or ((Result and $C0) shr 3);
end;
procedure TMainForm.WriteVRAM(b:Byte;x,y: integer); // рисуем на gamecanvas значения цвета , не забываем про порт С1
Var
pix1,pix2,pix3,pix4:byte;
begin
pix1:=0; pix2:=0; pix3:=0; pix4:=0; //вычисляем цвет в зависимисти от установки бит
if (b and 128)=128 then pix1:=pix1+1;
if (b and 8)=8 then pix1:=pix1+2;
if (b and 64)=64 then pix2:=pix2+1;
if (b and 4)=4 then pix2:=pix2+2;
if (b and 32)=32 then pix3:=pix3+1;
if (b and 2)=2 then pix3:=pix3+2;
if (b and 16)=16 then pix4:=pix4+1;
if (b and 1)=1 then pix4:=pix4+2;
begin
gamecanvas.Canvas.Pixels[x,y]:= compute_color_index(ports[$C1],Mycolor[pix1]);
gamecanvas.Canvas.Pixels[x+1,y]:=compute_color_index(ports[$C1],Mycolor[pix2]);
gamecanvas.Canvas.Pixels[x+2,y]:=compute_color_index(ports[$C1],Mycolor[pix3]);
gamecanvas.Canvas.Pixels[x+3,y]:=compute_color_index(ports[$C1],Mycolor[pix4]);
end;
end;
procedure TMainForm.FirstPusk; //первый запуск
begin
// создадим канву для рисования
gamecanvas:=tbitmap.Create;
gamecanvas.Width:=256;
gamecanvas.Height:=256;
ResetComp; // первоночальный сброс всего
TimerMain.Enabled:=true; // запускаем основной таймер
end;
function TMainForm.readmask (keynum: word): word; // маска клавы
begin
result:= $72FF;
case keynum of
8: begin result:= $23FF end; // BCK
13: begin result:= $13FF end; // ENTER
16: begin result:= $70FF end; // SHIFT
32: begin result:= $30FF end; // SPC
37: begin result:= $FF32 end; // <-
38: begin result:= $FF31 end; // UP
39: begin result:= $FF30 end; // ->
40: begin result:= $FF33 end; // DOWN
48: begin result:= $06FF end; // 0
49: begin result:= $47FF end; // 1
50: begin result:= $46FF end; // 2
51: begin result:= $45FF end; // 3
52: begin result:= $44FF end; // 4
53: begin result:= $43FF end; // 5
54: begin result:= $00FF end; // 6
55: begin result:= $01FF end; // 7
56: begin result:= $02FF end; // 8
57: begin result:= $07FF end; // 9
65: begin result:= $64FF end; // A
66: begin result:= $31FF end; // B
67: begin result:= $57FF end; // C
68: begin result:= $27FF end; // D
69: begin result:= $54FF end; // E
70: begin result:= $67FF end; // F
71: begin result:= $10FF end; // G
72: begin result:= $16FF end; // H
73: begin result:= $75FF end; // I
74: begin result:= $52FF end; // J
75: begin result:= $55FF end; // K
76: begin result:= $22FF end; // L
77: begin result:= $76FF end; // M
78: begin result:= $53FF end; // N
79: begin result:= $21FF end; // O
80: begin result:= $63FF end; // P
81: begin result:= $71FF end; // Q
82: begin result:= $20FF end; // R
83: begin result:= $77FF end; // S
84: begin result:= $74FF end; // T
85: begin result:= $56FF end; // U
86: begin result:= $26FF end; // V
87: begin result:= $65FF end; // W
88: begin result:= $73FF end; // X
89: begin result:= $66FF end; // Y
90: begin result:= $17FF end; // Z
107: begin result:= $05FF end; // =/+ -> =/-
109: begin result:= $05FF end; // -/_ -> =/-
114: begin result:= $FF23 end; // F3
115: begin result:= $FF22 end; // F4
116: begin result:= $FF21 end; // F5
36: begin result:= $FF20 end; // Home
219: begin result:= $11FF end; // [
221: begin result:= $12FF end; // ]
190: begin result:= $24FF end; // .
188: begin result:= $37FF end; // ,
192: begin result:= $72FF end; //
end;
end;
procedure TMainForm.FormActivate(Sender: TObject);
begin
if FPusk then // а это первый ли запуск
begin
FPusk:=false;
FirstPusk;
end;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
DragAcceptFiles(MainForm.Handle, true); // сделаем драг анд дроб :)
CalculateColor;
FPusk:=true; // запомним первый запуск
English1Click(Sender);
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
DragAcceptFiles(Handle, False);
end;
procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word; //опрос клавы
Shift: TShiftState);
begin
kbd(readmask(key),true); // нажали
i8080_do_opcodes(opcodes_to_run);
end;
procedure TMainForm.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
kbd(readmask(key),false); // отпустии
end;
procedure TMainForm.TimerMainTimer(Sender: TObject); // основной таймер
var
j,a: word;
i: integer;
s: string;
begin
if (pause) then // если пауза курим бамбук :)
begin
exit;
end;
i8080_do_opcodes(opcodes_to_run);
draw_screen;
end;
procedure TMainForm.ResetComp;
begin
rgB := 0; rgC := 0; rgD := 0; rgE := 0; rgH := 0; rgL := 0; rgA := 0; rgF := 0;
rgPC := 0; rgSP := 0;
// clock := 0; // обнулим часики
halt_inv := 1;
halt_opc := 2;
halt_hlt := 3;
halt_bpx := 4;
halt_bpr := 5;
halt_bpw := 6;
halt_bpi := 7;
halt_bpo := 8;
pause := false;
FPS := 50;
speaked := 0;
fS := (1 SHL 7);
fZ :=( 1 SHL 6);
f5 := (1 SHL 5);
fA := (1 SHL 4);
f3 := (1 SHL 3);
fP := (1 SHL 2);
f1 := (1 SHL 1);
fC := (1 SHL 0);
BasicStack := $AFC1;
BasicHotEntry := $02FD;
BasicProgBegin := $0243;
BasicProgEnd := $0245;
fillchar(VideoDirty,sizeof(VideoDirty),257);
soundEnabled := false;
// opcodes_to_run := round ((1411200*4)/FPS);
opcodes_to_run := round ((1411200*2)/FPS);
curSnd := 0;
restClock := 0;
init_memory();
reset1();
load_bios();
i8080_do_opcodes(0);
end;
procedure TMainForm.ResetCPU1Click(Sender: TObject);
begin
ResetComp;
end;
procedure TMainForm.English1Click(Sender: TObject);
begin
MainForm.Caption:='PK-01 Lvov emulator';
//DebuggerForm.TabSheet1.Caption:='Assembler';
//DebuggerForm.TabSheet2.Caption:='Find-replace in memory';
N1.Caption:='File';
N2.Caption:='Open';
ResetCPU1.Caption:='Reset CPU';
N11.Caption:='Pause';
N4.Caption:='Exit';
end;
procedure TMainForm.Russian1Click(Sender: TObject);
begin
MainForm.Caption:='ПК-01 Львов эмулятор';
//DebuggerForm.TabSheet1.Caption:='Ассемблер';
//DebuggerForm.TabSheet2.Caption:='Поиск-замена в памяти';
N1.Caption:='Файл';
N2.Caption:='Открыть';
ResetCPU1.Caption:='Reset CPU';
N11.Caption:='Пауза';
N4.Caption:='Выход';
end;
// ###################################################ГРЕБАННЫЙ ЗВУК :-) ##############################################################
end.
SOURCE_DELPHI\003\
EmulForKOS.dpr
program EmulForKOS;
uses
Forms,
Windows,
uMain in 'uMain.pas' {MainForm};
{$R *.res}
begin
SetThreadLocale(1049);
Application.Initialize;
Application.Title := 'ой кэбнб';
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.
SOURCE_DELPHI\003\
uMain.pas
unit uMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Menus,MMSystem,ShellAPI, ImgList, ComCtrls,
ToolWin;
type
TMainForm = class(TForm)
TimerMain: TTimer; MainMenu1: TMainMenu;
N1: TMenuItem; N2: TMenuItem; N3: TMenuItem; N4: TMenuItem;
OpenDialogLvt: TOpenDialog;
ResetCPU1: TMenuItem;
N11: TMenuItem;
procedure fillcharVideoDirty;
procedure draw_screen1;
procedure draw_screen2;
Procedure SupCol2;
Procedure My_col2;
procedure col_index;
procedure TimerMainTimer(Sender: TObject);
procedure do_write(addr: Cardinal; bt: Cardinal);
procedure i8080_init;
function do_read(addr: Cardinal): Cardinal;
procedure do_write2(a_lo: Cardinal; a_hi: Cardinal; bt: Cardinal);
function do_read2(a_lo : Cardinal; a_hi : Cardinal): Cardinal;
procedure init_memory;
function do_input(port : Cardinal): Cardinal;
procedure do_output(port : Cardinal; bt : Cardinal);
procedure kbd(mask : word; press : boolean);
procedure reset1;
procedure load_bios;
procedure do_pause();
procedure i8080_do_opcodes(nb_cycles : Cardinal); //выполнение комманд процессора
procedure draw_screen();
procedure FirstPusk;
function readmask (keynum: word): word;
procedure N4Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FormActivate(Sender: TObject);
procedure NewLoadFile(filenameDnD: string;start : boolean);
procedure ResetComp;
procedure ResetCPU1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Wmemory; procedure Rmemory;
procedure Wflags; procedure Rflags;
procedure Wvideo; procedure Rvideo;
procedure WVideoDirty; procedure RVideoDirty;
procedure Wports; procedure Rports;
procedure Wkbd_base; procedure Rkbd_base;
procedure Wkbd_ext; procedure Rkbd_ext;
private
{ Private declarations }
public
procedure WMDropFiles(var Msg: TMessage); message wm_DropFiles;
{ Public declarations }
end;
var
MainForm: TMainForm;
var { регистрики} rgA,rgB,rgC,rgD,rgE,rgH,rgL,rgF,rgPC,rgSP :Cardinal;
var { флаги} fS, fZ, f5, fA, f3,fP,f1,fC : Cardinal;
memoryM: array [0..65535] of byte; // массив основной памяти $FFFF
videoM : array [0..16384] of byte; // видео память
VideoDirtyM : array [0..16384] of word; //буфер для быстрой прорисовки
flagsM: array [0..256] of word;
portsM: array [0..256] of byte; // порты
kbd_baseM : array [0..8] of byte; // массивы опроса клавиатуры
kbd_extM : array [0..4] of byte;
FPusk: boolean; // первый запуск
gamecanvas: tbitmap; // сюда все рисуем перед выводом на форму
bios : array [0..65535] of byte; // массив для загрузки биоса, можно сразу грузить но вдруг пригодися
Myfile: array [0..90000] of byte; //файл может быть большим DUMP SAV который
pause : boolean; //пауза в эмуляторе
// opcodes_to_run:Cardinal = round ((1411200*2)/50{FPS});
// FPS:Cardinal=50; opcodes_to_run:Cardinal = 68500;
FPS:Cardinal=1000; opcodes_to_run:Cardinal = 68500;
myfilelength: Cardinal; // длина скачаного файла
BasicStack,BasicHotEntry,BasicProgBegin,BasicProgEnd : Cardinal;
var LVColBlack:Cardinal=0; LVColLime:Cardinal=$00FF00; LVColBlue:Cardinal=$FF0000; LVColRed:Cardinal=$0000FF;
implementation
{$R *.dfm}
var Wmemory_a,Wmemory_b:Cardinal; procedure TMainForm.Wmemory; begin memoryM[Wmemory_a]:=Wmemory_b; end;
var Rmemory_a,Rmemory_result:Cardinal; procedure TMainForm.Rmemory; begin Rmemory_result:=memoryM[Rmemory_a];end;
var Wflags_a,Wflags_b:Cardinal; procedure TMainForm.Wflags; begin flagsM[Wflags_a]:=Wflags_b; end;
var Rflags_a,Rflags_result:Cardinal; procedure TMainForm.Rflags; begin Rflags_result:=flagsM[Rflags_a];end;
var Wvideo_a,Wvideo_b:Cardinal; procedure TMainForm.Wvideo; begin videoM[Wvideo_a]:=Wvideo_b; end;
var Rvideo_a,Rvideo_result:Cardinal; procedure TMainForm.Rvideo; begin Rvideo_result:=videoM[Rvideo_a];end;
var WVideoDirty_a,WVideoDirty_b:Cardinal; procedure TMainForm.WVideoDirty; begin VideoDirtyM[WVideoDirty_a]:=WVideoDirty_b; end;
var RVideoDirty_a,RVideoDirty_result:Cardinal; procedure TMainForm.RVideoDirty; begin RVideoDirty_result:=VideoDirtyM[RVideoDirty_a];end;
var Wports_a,Wports_b:Cardinal; procedure TMainForm.Wports; begin portsM[Wports_a]:=Wports_b; end;
var Rports_a,Rports_result:Cardinal; procedure TMainForm.Rports; begin Rports_result:=portsM[Rports_a];end;
var Wkbd_base_a,Wkbd_base_b:Cardinal; procedure TMainForm.Wkbd_base; begin kbd_baseM[Wkbd_base_a]:=Wkbd_base_b; end;
var Rkbd_base_a,Rkbd_base_result:Cardinal; procedure TMainForm.Rkbd_base; begin Rkbd_base_result:=kbd_baseM[Rkbd_base_a];end;
var Wkbd_ext_a,Wkbd_ext_b:Cardinal; procedure TMainForm.Wkbd_ext; begin kbd_extM[Wkbd_ext_a]:=Wkbd_ext_b; end;
var Rkbd_ext_a,Rkbd_ext_result:Cardinal; procedure TMainForm.Rkbd_ext; begin Rkbd_ext_result:=kbd_extM[Rkbd_ext_a];end;
procedure TMainForm.fillcharVideoDirty;
var c:Cardinal; begin {$R-} For c:=0 to 16384 do begin
Rvideo_a:=c; Rvideo; WVideoDirty_a:=c;WVideoDirty_b:=(Rvideo_result xor 1);WVideoDirty;{$R+} end; end;
procedure TMainForm.WMDropFiles(var Msg: TMessage); // порцедура отвечает за принятие перетаскиваемого файла
var FileName: array[0..256] of char;
begin DragQueryFile(THandle(Msg.WParam), 0, FileName, SizeOf(Filename));
MainForm.Caption:=FileName;NewLoadFile(FileName,true);DragFinish(THandle(Msg.WParam));end;
procedure TMainForm.do_write(addr : Cardinal; bt : Cardinal); // если нужно будем записывать :-)
begin
{$R-}
if addr> $FFFF then addr:=$FFFF;
if (addr>=$C000) then
begin exit; end;
Rports_a:=$C2;Rports; if ((Rports_result and 2)<>0) then begin Wmemory_A:=addr; Wmemory_B:=bt; Wmemory; end else
if (addr<$4000) then begin exit; end else
if (addr<$8000) then begin Wvideo_a:=(addr-$4000);Wvideo_b:=bt; Wvideo; end else
begin Wmemory_A:=addr; Wmemory_B:=bt; Wmemory; end;
{$R+}
end;
procedure TMainForm.i8080_init;
var j,i : Cardinal;
begin
{$R-}
for i:=0 to 255 do
begin
{flags[i]:=f1 or fP;} Wflags_a:=i;Wflags_b:=(f1 or fP);Wflags;
for j:=0 to 7 do
begin
if ((i and (1 SHL j))<>0) then
begin
{ flags[i]:=(flags[i] xor fP);}
Rflags_a:=i;Rflags;
Wflags_a:=i;Wflags_b:=(Rflags_Result xor fP);Wflags;
end;
end;
if ((i and $80)<>0) then
begin
{ flags[i]:=(flags[i] or fS);}
Rflags_a:=i;Rflags;
Wflags_a:=i;Wflags_b:=(Rflags_Result or fS);Wflags;
end;
if (i=0) then
begin
{ flags[i]:=(flags[i] or fZ);}
Rflags_a:=i;Rflags;
Wflags_a:=i;Wflags_b:=(Rflags_Result or fZ);Wflags;
end;
end;
{$R+}
end;
function TMainForm.do_read(addr : Cardinal): Cardinal; // считаем значение из пямяти
begin
{$R-}
if addr> $FFFF then addr:=$FFFF;
RPorts_a:=$C2;RPorts; if ((RPorts_result and 2)<>0) then
begin Rmemory_A:=addr; Rmemory; result := Rmemory_result; end
else if (addr>$7FFF) then begin Rmemory_A:=addr; Rmemory; result := Rmemory_result; end
else if (addr<$4000) then begin result := 0; end else
begin Rvideo_a:=(addr-$4000); Rvideo; result := Rvideo_result; end;
{$R+}
end;
procedure TMainForm.do_write2(a_lo: Cardinal; a_hi: Cardinal; bt: Cardinal);
begin {$R-} do_write(a_lo+(a_hi SHL 8),bt); {$R+}end;
function TMainForm.do_read2(a_lo : Cardinal; a_hi : Cardinal): Cardinal;
begin {$R-} result := do_read(a_lo+(a_hi SHL 8)); {$R+}end;
procedure TMainForm.init_memory; // подготовим все к запуску
var i : Cardinal;
begin
{$R-}
//For i:=0 to $FFFF do begin Wmemory_A:=i; Wmemory_B:=0; Wmemory; end;
//For i:=0 to $3FFF do begin Wvideo_a:=i; Wvideo_b:=0;Wvideo; end;
//For i:=0 to $FF do begin Wports_a:=i; Wports_b:=0; Wports; end;
//For i:=0 to 7 do begin Wkbd_base_a:=i;Wkbd_base_b:=0;Wkbd_base; end;
//For i:=0 to 3 do begin Wkbd_ext_a:=i;Wkbd_ext_b:=0;Wkbd_ext; end;
i8080_init;
TimerMain.Interval:=(1000 div FPS);
{$R+}
end;
function TMainForm.do_input(port : Cardinal): Cardinal; // работа со значениями портов in
var i,r : Cardinal; nD2 ,nD0 : Cardinal;
begin
{$R-}
port:=$C0+(port and $13);
case port of
$C2: begin Rports_a:=$C2;Rports; result := Rports_result; end;
$D1: begin Rports_a:=$D0;Rports; nD0:=not Rports_result; r:=0;
For i:=0 to 7 do
begin
if ((nD0 and (1 SHL i))<>0) then begin rkbd_base_a:=i;rkbd_base; r:=(r or Rkbd_base_result); end;
end;
result := ((not r) and $FF);
end;
$D2: begin Rports_a:=$D2;Rports; nD2:= not Rports_result; r:=0;
for i:=0 to 3 do begin if ((nD2 and (1 SHL i))<>0) then begin Rkbd_ext_a:=i;Rkbd_ext; r:=(r or Rkbd_ext_result);end;
end;
result := not ((r SHL 4) or (nD2 and $0F)) and $FF;
end
else begin result := $FF; end;
end;
{$R+}
end;
procedure TMainForm.do_output(port : Cardinal; bt : Cardinal); // out
begin
{$R-}
port:=$C0+(port and $13);
case port of
$c1: begin // изменение порта цвета
fillcharVideoDirty;
end;
end;
Wports_a:=port;Wports_b:=bt; Wports;
{$R+}
end ;
procedure TMainForm.kbd(mask : word; press : boolean); // по маске вкл выкл клавишу
var brow : byte; erow : byte; bcol : byte; ecol : byte;
begin
{$R-}
bcol:=(mask SHR 12) and $0F; brow:=(mask SHR 8) and $0F;
ecol:=(mask SHR 4) and $0F; erow:=(mask SHR 0) and $0F;
if ((brow<8) and (bcol<8)) then
begin
if (press) then begin Rkbd_base_a:=bcol;Rkbd_base;
Wkbd_base_a:=bcol;Wkbd_base_b:=(Rkbd_base_result or (1 SHL brow));Wkbd_base; end
else begin Rkbd_base_a:=bcol;Rkbd_base;
Wkbd_base_a:=bcol;Wkbd_base_b:=(Rkbd_base_result and (not(1 SHL brow))); Wkbd_base; end;
end;
if ((erow<8) and (ecol<4)) then begin Rkbd_ext_a:=ecol;Rkbd_ext;
if (press) then begin Wkbd_ext_a:=ecol;Wkbd_ext_b:= (Rkbd_ext_result or (1 SHL erow));Wkbd_ext;
end else begin Rkbd_ext_a:=ecol;Rkbd_ext; Wkbd_ext_a:=ecol;Wkbd_ext_b:=(Rkbd_ext_result and (not(1 SHL erow)));Wkbd_ext; end;
end;
{$R+}
end;
procedure TMainForm.reset1; // полный ресет :)
var i : word; begin {$R-} for i:=0 to 255 do begin
Wports_a:=i;Wports_b:=$FF; Wports; end; {$R+} end;
procedure TMainForm.load_bios; // загрузка биоса из файла
var i: Cardinal;b: Byte;f: file of byte;
begin
{$R-}
i:=0; AssignFile(F,ExtractFilePath(Application.ExeName)+'\bios.dat');
Reset(F); while not eof(f) do begin read(F,b); bios[i]:=b; inc(i); end;
closeFile(F); i:=0;
for i:=0 to $3FFF do begin Wmemory_a:=($C000+i);Wmemory_b:=bios[22+i];Wmemory; end;
{$R+}
end;
procedure TMainForm.N2Click(Sender: TObject);
begin
OpenDialogLvt.InitialDir:=ExtractFilePath(Application.ExeName);
if OpenDialogLvt.Execute then NewLoadFile(OpenDialogLvt.FileName,true);
end;
procedure TMainForm.N4Click(Sender: TObject);
begin gamecanvas.Free;close;end;
procedure TMainForm.NewLoadFile(filenameDnD: string; start : boolean); //процедура загрузки всех видов файлов
var f:file of byte; b:Byte; s: string; posBas, Xend ,Xbeg ,Xrun : word; i: integer;
begin
{$R-}
s:='';
AssignFile(f,filenameDnD); // распознаем что за файл
Reset(f);
for I:= 0 to 8 do begin read(f,b); s:=s+chr(b); end;
if s='LVOV/2.0/' then // стандартный LVT файл
begin read(f,b);
if b=$D0 then { это бинарник} begin
seek(F,0); // вернемся к началу файла
i:=0;
while not eof(f) do
begin read(F,b); Myfile[i]:=b; inc(i); end;
myfilelength:=i;
closeFile(F); //закрываем файл
Xbeg:=Myfile[16]+Myfile[17]*256; Xend:=Myfile[18]+Myfile[19]*256;
Xrun:=Myfile[20]+Myfile[21]*256;
if (start) then begin {warm_start();} rgPC:=Xrun; end;
i:=0;
while (i<=Xend-Xbeg) do begin do_write(Xbeg+i,Myfile[i+22]); inc(i); end;
end
else
begin //это бeйсик (надеюсь больше ничего нет :-) )
seek(F,0); // вернемся к началу файла
i:=0;
while not eof(f) do
begin read(F,b); Myfile[i]:=b; inc(i); end;
myfilelength:=i-1; {warm_start();}
// posBas:=get_var(BasicProgBegin);
i:=0; while (i<myfilelength-16) do
begin do_write(posBas+i,Myfile[i+16]); inc(i); end;
// направим RUN
MainForm.SetFocus;
i8080_do_opcodes(opcodes_to_run);
end;
end;
if s='LVOV/DUMP' then // стандартный SAV файл дампа эмулятор Калашникова
begin
seek(F,0); // вернемся к началу файла
i:=0; while not eof(f) do begin read(F,b); Myfile[i]:=b; inc(i);end;
i:=0; closeFile(F);
while (i<$10000) do
begin{ memory[i]:=Myfile[17+i];} Wmemory_A:=i; Wmemory_B:=Myfile[17+i]; Wmemory;inc(i);end;
i:=0; while (i<$4000) do begin
Wvideo_a:=i;Wvideo_b:=Myfile[17+$10000+i];Wvideo; inc(i); end;
i:=0; while (i<$100) do begin
Wports_a:=i;Wports_b:=Myfile[17+$10000+$4000+i]; Wports;
inc(i);
end;
rgB:=Myfile[17+$10000+$4000+$100]; rgH:=Myfile[17+$10000+$4000+$100+4];
rgC:=Myfile[17+$10000+$4000+$100+1]; rgL:=Myfile[17+$10000+$4000+$100+5];
rgD:=Myfile[17+$10000+$4000+$100+2]; rgA:=Myfile[17+$10000+$4000+$100+6];
rgE:=Myfile[17+$10000+$4000+$100+3]; rgF:=Myfile[17+$10000+$4000+$100+7];
rgSP:=Myfile[17+$10000+$4000+$100+9]*256+Myfile[17+$10000+$4000+$100+8];
rgPC:=Myfile[17+$10000+$4000+$100+11]*256+Myfile[17+$10000+$4000+$100+10];
fillcharVideoDirty; draw_screen;
end;
{$R-}
end;
procedure TMainForm.do_pause();
begin
pause := not pause;
end;
procedure TMainForm.i8080_do_opcodes(nb_cycles : Cardinal); //выполнение комманд процессора
var tmp3, tmp2, tmp1, opcode : integer;
var { регистрики} r_A,r_B,r_C,r_D,r_E,r_H,r_L,r_F,r_PC,r_SP : integer;
clock:Cardinal;
{ флаги} f_S, f_Z, f_5, f_A, f_3,f_P,f_1,f_C : Integer;
procedure rA1; Begin r_A:=tmp2 and $FF; end;
procedure rA2; Begin r_A:=tmp2; end;
procedure rF1;Begin Rflags_a:=tmp2;Rflags; r_F:=(Rflags_result or (r_F and f_C)); end;
procedure rF2;Begin Rflags_a:=(tmp2 and $FF);Rflags; r_F:=Rflags_result; end;
procedure rF3;begin Rflags_a:=(tmp2);Rflags; r_F:=Rflags_result; end;
procedure rF4;begin Rflags_a:=(0);Rflags; r_F:=Rflags_result; end;
procedure rF5; begin Rflags_a:=(r_A);Rflags; r_F:=(Rflags_result or (r_F and f_A)); end;
procedure rF6; begin r_F:=r_F or f_A; end;
procedure rF7; begin r_F:=(r_F or f_C); end;
procedure rF8; begin r_F:=(r_F or f_A); end;
procedure rt2p1; begin tmp2:=tmp2+1 end;
procedure clp4;begin clock:=clock+4; end;
procedure clp7;begin clock:=clock+7; end;
procedure clp5;begin clock:=clock+5; end;
procedure clp10;begin clock:=clock+10; end;
procedure clp11;begin clock:=clock+11; end;
procedure clp13;begin clock:=clock+13; end;
procedure clp16;begin clock:=clock+16; end;
procedure clp17;begin clock:=clock+17; end;
procedure r_PCp1;begin r_PC:=r_PC+1; end;
procedure r_PCp2;begin r_PC:=r_PC+2; end;
procedure r_PCp3;begin r_PC:=r_PC+3; end;
procedure if1; begin if ((r_F and f_C)<>0) then rt2p1 else tmp2:=tmp2+0;end;
procedure clp5_r_PCp1; begin clp5; r_PCp1;end;
procedure rF5_clp4_r_PCp1; begin rF5; clp4; r_PCp1;end;
procedure clp4_r_PCp1; begin clp4; r_PCp1; end;
Function d_rdPCp2:Cardinal; begin Result:=do_read(r_PC+2) end;
Function d_rdPCp1:Cardinal; begin Result:=do_read(r_PC+1) end;
procedure clp10_r_PCp3; begin clp10; r_PCp3; end;
procedure clp7_r_PCp1; begin clp7; r_PCp1; end;
procedure if2; begin if (tmp2>$FF) then begin rF7; end; end;
procedure clp7_r_PCp2; begin clp7; r_PCp2; end;
procedure clp10_r_PCp1; begin clp10; r_PCp1; end;
procedure if2_rA1_clp4_r_PCp1; Begin if2; rA1; clp4_r_PCp1; end;
procedure rA2_clp4_r_PCp1; Begin rA2; clp4_r_PCp1; end;
begin
{$R-}
r_A:=integer(rgA);r_b:=integer(rgB);r_c:=integer(rgC);r_d:=integer(rgD);
r_e:=integer(rgE);r_H:=integer(rgH);r_L:=integer(rgL);r_F:=integer(rgF);
r_PC:=integer(rgPC);r_SP:=integer(rgSP);
f_S:=integer(fS);f_Z:=integer(fZ);f_5:=integer(f5);f_A:=integer(fA);
f_3:=integer(f3);f_P:=integer(fP);f_1:=integer(f1);f_C:=integer(fC);
clock:=0; tmp1:=0; tmp2:=0; tmp3:=0; //бнулим :-)
while (clock < nb_cycles) do
begin
opcode:=do_read(r_PC);
case opcode of // анализируем текущий код 00 .. FF, меняем значение clock в зависимоти от "длинны" команды ...
// прыгаем по памяти, меняем значения регистров и портов ПРОЦ РАБОТАЕТ !!!!
$00: begin clp4_r_PCp1; end;
$F3: begin clp4_r_PCp1; end;
$FB: begin clp4_r_PCp1; end;
$01: begin r_B:=d_rdPCp2; r_C:=d_rdPCp1; clp10_r_PCp3; end;
$02: begin do_write2(r_C,r_B,r_A); clp7_r_PCp1; end;
$03: begin r_C:=r_C+1; if (r_C>$FF) then begin r_C:=0; r_B:=r_B+1;
if (r_B>$FF) then begin r_B:=0; end; end; clp5_r_PCp1; end;
$04: begin tmp2:=((r_B+1) and $FF); RF1;
if (((tmp2 xor r_B) and $10)<>0) then begin rF6; end;
r_B:=tmp2; clp5_r_PCp1; end;
$05: begin tmp2:=((r_B-1) and $FF); RF1;
if (((tmp2 xor r_B) and $10)<>0) then begin rF8; end;
r_B:=tmp2; clp5_r_PCp1; end;
$06: begin r_B:=d_rdPCp1; clp7_r_PCp2; end;
$07: begin r_A:=r_A SHL 1; if (r_A>$FF) then begin r_A:=r_A or 1; r_F:=r_F or f_C; r_A:= r_A and $FF; end
else begin r_F:=(r_F and (not f_C)); end; clp4_r_PCp1; end;
$08: begin begin clp4_r_PCp1; end; end;
$10: begin begin clp4_r_PCp1; end; end;
$18: begin begin clp4_r_PCp1; end; end;
$20: begin begin clp4_r_PCp1; end; end;
$28: begin begin clp4_r_PCp1; end; end;
$30: begin begin clp4_r_PCp1; end; end;
$38: begin begin clp4_r_PCp1; end; end;
$09: begin r_L:=r_L+r_C; r_H:=r_H+r_B; if (r_L>$FF) then
begin inc(r_H); r_L:=(r_L and $FF); end;
if (r_H>$FF) then begin r_H:=(r_H and $FF); rF7;
end else begin r_F:=(r_F and (not f_C)); end; clp10_r_PCp1; end;
$0A: begin r_A:=do_read2(r_C,r_B); clp7_r_PCp1; end;
$0B: begin r_C:=r_C-1; if (r_C<0) then begin r_C:=$FF; r_B:=r_B-1;
if (r_B<0) then begin r_B:=$FF; end; end; clp5_r_PCp1; end;
$0C: begin tmp2:=((r_C+1) and $FF); RF1; if (((tmp2 xor r_C) and $10)<>0) then
begin rF6; end; r_C:=tmp2; clp5_r_PCp1; end;
$0D: begin tmp2:=((r_C-1) and $FF); RF1; if (((tmp2 xor r_C) and $10)<>0) then
begin rF8; end; r_C:=tmp2; clp5_r_PCp1; end;
$0E: begin r_C:=d_rdPCp1; clp7_r_PCp2; end;
$0F: begin tmp1:=(r_A and 1); r_A:=(r_A shr 1); if (tmp1<>0) then
begin r_A:=(r_A or $80); rF7; end else
begin r_F:=(r_F and ( not f_C)); end; clp4_r_PCp1; end;
$11: begin r_D:=d_rdPCp2; r_E:=d_rdPCp1; clp10_r_PCp3; end;
$12: begin do_write2(r_E,r_D,r_A); clp7_r_PCp1; end;
$13: begin r_E:=r_E+1; if (r_E>$FF) then begin r_E:=0; r_D:=r_D+1;
if (r_D>$FF) then begin r_D:=0; end; end; clp5_r_PCp1; end;
$14: begin tmp2:=((r_D+1)and $FF); RF1; if (((tmp2 xor r_D) and $10)<>0) then
begin rF8; end; r_D:=tmp2; clp5_r_PCp1; end;
$15: begin tmp2:=((r_D-1)and $FF); RF1; if (((tmp2 xor r_D) and $10)<>0) then
begin rF8; end; r_D:=tmp2; clp5_r_PCp1; end;
$16: begin r_D:=d_rdPCp1; clp7_r_PCp2; end;
$17: begin r_A:=(r_A shl 1); if ((r_F and f_C)<>0) then
begin r_A:=(r_A or 1); end; if (r_A>$FF) then begin rF7;
r_A:=(r_A and $FF); end else begin r_F:=(r_F and (not f_C)); end;
clp4_r_PCp1; end;
$19: begin r_L:=(r_L + r_E); r_H:=(r_H + r_D); if (r_L>$FF) then
begin inc(r_H); r_L:=(r_L and $FF); end;
if (r_H>$FF) then begin r_H:=(r_H and $FF); rF7;
end else begin r_F:=(r_F and not (f_C)); end;
clp10_r_PCp1; end;
$1A: begin r_A:=do_read2(r_E,r_D); clp7_r_PCp1; end;
$1B: begin r_E:=r_E-1; if (r_E<0) then begin r_E:=$FF; r_D:=r_D-1;
if (r_D<0) then begin r_D:=$FF; end; end; clp5_r_PCp1; end;
$1C: begin tmp2:=((r_E+1)and $FF); RF1; if (((tmp2 xor r_E) and $10)<>0) then
begin rF8; end; r_E:=tmp2; clp5_r_PCp1; end;
$1D: begin tmp2:=((r_E-1) and $FF); RF1; if (((tmp2 xor r_E) and $10)<>0) then
begin rF8; end; r_E:=tmp2; clp5_r_PCp1; end;
$1E: begin r_E:=d_rdPCp1; clp7_r_PCp2; end;
$1F: begin tmp1:=(r_A and 1); r_A:=(r_A SHR 1); if ((r_F and f_C)<>0) then
begin r_A:=(r_A or $80); end; if (tmp1<>0) then begin rF7; end
else begin r_F:=(r_F and not(f_C)); end; clp4_r_PCp1; end;
$21: begin r_H:=d_rdPCp2; r_L:=d_rdPCp1; clp10_r_PCp3; end;
$22: begin tmp1:=d_rdPCp1+(d_rdPCp2 shl 8); do_write(tmp1,r_L);
do_write(tmp1+1,r_H); clp16; r_PCp3; end;
$23: begin r_L:=r_L+1; if (r_L>$FF) then begin r_L:=0; r_H:=r_H+1;
if (r_H>$FF) then begin r_H:=0; end; end; clp5_r_PCp1; end;
$24: begin tmp2:=((r_H+1) and $FF); RF1; if (((tmp2 xor r_H) and $10)<>0) then
begin rF8; end; r_H:=tmp2; clp5_r_PCp1; end;
$25: begin tmp2:=((r_H-1) and $FF); RF1; if (((tmp2 xor r_H) and $10)<>0) then
begin rF8; end; r_H:=tmp2; clp5_r_PCp1; end;
$26: begin r_H:=d_rdPCp1; clp7_r_PCp2; end;
$27: begin tmp1:=0; if (((r_F and f_C)<>0) or (r_A>$99)) then
begin tmp1:=(tmp1 or $60); end;
if (((r_F and f_A)<>0) or ((r_A and $0F)>$09)) then begin tmp1:=(tmp1 or $06); end;
tmp2:=r_A+tmp1; RF2; if (((tmp2 xor r_A xor tmp1) and $10)<>0) then
begin rF8; end; if2;
rA1; clp4_r_PCp1; end;
$29: begin r_L:=r_L + r_L; r_H:=r_H + r_H; if (r_L>$FF) then begin
inc(r_H); r_L:=(r_L and $FF); end; if (r_H>$FF) then begin
r_H:=(r_H and $FF); rF7; end else begin
r_F:=(r_F and (not f_C)); end; clp10_r_PCp1; end;
$2A: begin tmp1:=d_rdPCp1+(d_rdPCp2 shl 8);
r_L:=do_read(tmp1); r_H:=do_read(tmp1+1); clp16; r_PCp3; end;
$2B: begin r_L:=r_L-1; if (r_L <0) then begin r_L:=$FF; r_H:=r_H-1;
if (r_H<0) then begin r_H:=$FF; end; end; clp5; r_PCp1; end;
$2C: begin tmp2:=((r_L+1) and $FF); RF1; if (((tmp2 xor r_L) and $10)<>0) then
begin rF8; end; r_L:=tmp2; clp5_r_PCp1; end;
$2D: begin tmp2:=((r_L-1) and $FF); RF1; if (((tmp2 xor r_L) and $10)<>0) then
begin rF8; end; r_L:=tmp2; clp5_r_PCp1; end;
$2E: begin r_L:=d_rdPCp1; clp7_r_PCp2; end;
$2F: begin r_A:=(r_A xor $FF); clp4_r_PCp1; end;
$31: begin r_SP:=(d_rdPCp2 shl 8)+d_rdPCp1; clp10_r_PCp3; end;
$32: begin do_write2(d_rdPCp1,d_rdPCp2,r_A); clp13; r_PCp3; end;
$33: begin if (r_SP=$FFFF) then begin r_SP:=0; end else
begin inc(r_SP); end; clp5_r_PCp1; end;
$34: begin tmp1:=do_read2(r_L,r_H); tmp2:=((tmp1+1) and $FF);RF1;
if (((tmp2 xor tmp1) and $10)<>0) then begin rF8; end;
do_write2(r_L,r_H,tmp2); clp10_r_PCp1; end;
$35: begin tmp1:=do_read2(r_L,r_H); tmp2:=((tmp1-1) and $FF); RF1;
if (((tmp2 xor tmp1) and $10)<>0) then begin rF8; end;
do_write2(r_L,r_H,tmp2); clp10_r_PCp1; end;
$36: begin do_write2(r_L,r_H,d_rdPCp1); clp10; r_PCp2; end;
$37: begin rF7; clp4_r_PCp1; end;
$39: begin r_L:=(r_L + (r_SP and $FF)); r_H:=(r_H + ((r_SP shr 8) and $FF));
if (r_L>$FF) then begin inc(r_H); r_L:=(r_L and $FF); end;
if (r_H>$FF) then begin r_H:=(r_H and $FF); rF7;
end else begin r_F:=(r_F and (not f_C)); end; clp10_r_PCp1; end;
$3A: begin r_A:=do_read2(d_rdPCp1,d_rdPCp2); clp13; r_PCp3; end;
$3B: begin if (r_SP<>0) then begin r_SP:=r_SP-1; end else begin r_SP:=$FFFF; end;
clp5_r_PCp1; end;
$3C: begin tmp2:=((r_A+1) and $FF); RF1; if (((tmp2 xor r_A) and $10)<>0) then
begin rF8; end; rA2; clp5_r_PCp1; end;
$3D: begin tmp2:=((r_A-1) and $FF); RF1; if (((tmp2 xor r_A) and $10)<>0) then
begin rF8; end; rA2; clp5_r_PCp1; end;
$3E: begin r_A:=d_rdPCp1; clp7_r_PCp2; end;
$3F: begin r_F:=r_F xor f_C; clp4_r_PCp1; end;
$40: begin clp5_r_PCp1; end;
$49: begin clp5_r_PCp1; end;
$52: begin clp5_r_PCp1; end;
$5B: begin clp5_r_PCp1; end;
$64: begin clp5_r_PCp1; end;
$6D: begin clp5_r_PCp1; end;
$7F: begin clp5_r_PCp1; end;
$41: begin r_B:=r_C; clp5_r_PCp1; end;
$42: begin r_B:=r_D; clp5_r_PCp1; end;
$43: begin r_B:=r_E; clp5_r_PCp1; end;
$44: begin r_B:=r_H; clp5_r_PCp1; end;
$45: begin r_B:=r_L; clp5_r_PCp1; end;
$46: begin r_B:=do_read2(r_L,r_H); clp7_r_PCp1; end;
$47: begin r_B:=r_A; clp5_r_PCp1; end;
$48: begin r_C:=r_B; clp5_r_PCp1; end;
$4A: begin r_C:=r_D; clp5_r_PCp1; end;
$4B: begin r_C:=r_E; clp5_r_PCp1; end;
$4C: begin r_C:=r_H; clp5_r_PCp1; end;
$4D: begin r_C:=r_L; clp5_r_PCp1; end;
$4E: begin r_C:=do_read2(r_L,r_H); clp7_r_PCp1; end;
$4F: begin r_C:=r_A; clp5_r_PCp1; end;
$50: begin r_D:=r_B; clp5_r_PCp1; end;
$51: begin r_D:=r_C; clp5_r_PCp1; end;
$53: begin r_D:=r_E; clp5_r_PCp1; end;
$54: begin r_D:=r_H; clp5_r_PCp1; end;
$55: begin r_D:=r_L; clp5_r_PCp1; end;
$56: begin r_D:=do_read2(r_L,r_H); clp7_r_PCp1; end;
$57: begin r_D:=r_A; clp5_r_PCp1; end;
$58: begin r_E:=r_B; clp5_r_PCp1; end;
$59: begin r_E:=r_C; clp5_r_PCp1; end;
$5A: begin r_E:=r_D; clp5_r_PCp1; end;
$5C: begin r_E:=r_H; clp5_r_PCp1; end;
$5D: begin r_E:=r_L; clp5_r_PCp1; end;
$5E: begin r_E:=do_read2(r_L,r_H); clp7_r_PCp1; end;
$5F: begin r_E:=r_A; clp5_r_PCp1; end;
$60: begin r_H:=r_B; clp5_r_PCp1; end;
$61: begin r_H:=r_C; clp5_r_PCp1; end;
$62: begin r_H:=r_D; clp5_r_PCp1; end;
$63: begin r_H:=r_E; clp5_r_PCp1; end;
$65: begin r_H:=r_L; clp5_r_PCp1; end;
$66: begin r_H:=do_read2(r_L,r_H); clp7_r_PCp1; end;
$67: begin r_H:=r_A; clp5_r_PCp1; end;
$68: begin r_L:=r_B; clp5_r_PCp1; end;
$69: begin r_L:=r_C; clp5_r_PCp1; end;
$6A: begin r_L:=r_D; clp5_r_PCp1; end;
$6B: begin r_L:=r_E; clp5_r_PCp1; end;
$6C: begin r_L:=r_H; clp5_r_PCp1; end;
$6E: begin r_L:=do_read2(r_L,r_H); clp7_r_PCp1; end;
$6F: begin r_L:=r_A; clp5_r_PCp1; end;
$70: begin do_write2(r_L,r_H,r_B); clp7_r_PCp1; end;
$71: begin do_write2(r_L,r_H,r_C); clp7_r_PCp1; end;
$72: begin do_write2(r_L,r_H,r_D); clp7_r_PCp1; end;
$73: begin do_write2(r_L,r_H,r_E); clp7_r_PCp1; end;
$74: begin do_write2(r_L,r_H,r_H); clp7_r_PCp1; end;
$75: begin do_write2(r_L,r_H,r_L); clp7_r_PCp1; end;
$76: begin clp4_r_PCp1; end;
$77: begin do_write2(r_L,r_H,r_A); clp7_r_PCp1; end;
$78: begin r_A:=r_B; clp5_r_PCp1; end;
$79: begin r_A:=r_C; clp5_r_PCp1; end;
$7A: begin r_A:=r_D; clp5_r_PCp1; end;
$7B: begin r_A:=r_E; clp5_r_PCp1; end;
$7C: begin r_A:=r_H; clp5_r_PCp1; end;
$7D: begin r_A:=r_L; clp5_r_PCp1; end;
$7E: begin r_A:=do_read2(r_L,r_H); clp7_r_PCp1; end;
$80: begin tmp2:=r_A+r_B; RF2; if (((tmp2 xor r_A xor r_B) and $10)<>0) then
begin rF8; end; if2; r_A:=(tmp2 and $FF); clp4_r_PCp1; end;
$81: begin tmp2:=r_A+r_C; RF2;
if (((tmp2 xor r_A xor r_C) and $10)<>0) then begin rF8; end;
if2_rA1_clp4_r_PCp1; end;
$82: begin tmp2:=r_A+r_D; RF2; if (((tmp2 xor r_A xor r_D) and $10)<>0) then
begin rF8; end; if2_rA1_clp4_r_PCp1; end;
$83: begin tmp2:=r_A+r_E; RF2; if (((tmp2 xor r_A xor r_E) and $10)<>0) then
begin rF8; end; if2_rA1_clp4_r_PCp1; end;
$84: begin tmp2:=r_A+r_H; RF2; if (((tmp2 xor r_A xor r_H) and $10)<>0) then
begin rF8; end; if2_rA1_clp4_r_PCp1; end;
$85: begin tmp2:=r_A+r_L; RF2; if (((tmp2 xor r_A xor r_L) and $10)<>0) then
begin rF8; end; if2_rA1_clp4_r_PCp1; end;
$86: begin tmp1:=do_read2(r_L,r_H); tmp2:=r_A+tmp1; RF2;
if (((tmp2 xor r_A xor tmp1) and $10)<>0) then begin rF8; end;
if2; rA1; clp7_r_PCp1; end;
$87: begin tmp2:=r_A+r_A; RF2;
if (((tmp2 xor r_A xor r_A) and $10)<>0) then begin rF8; end;
if2_rA1_clp4_r_PCp1; end;
$88: begin tmp2:=r_A+r_B; if1;
RF2; if (((tmp2 xor r_A xor r_B) and $10)<>0) then begin rF8; end;
if2_rA1_clp4_r_PCp1; end;
$89: begin tmp2:=r_A+r_C; if1;
RF2; if (((tmp2 xor r_A xor r_C) and $10)<>0) then begin rF8; end;
if2_rA1_clp4_r_PCp1; end;
$8A: begin tmp2:=r_A+r_D; if1;
RF2; if (((tmp2 xor r_A xor r_D) and $10)<>0) then begin rF8; end;
if2_rA1_clp4_r_PCp1; end;
$8B: begin tmp2:=r_A+r_E; if1;
RF2; if (((tmp2 xor r_A xor r_E) and $10)<>0) then begin rF8; end;
if2_rA1_clp4_r_PCp1; end;
$8C: begin tmp2:=r_A+r_H; if1;
RF2; if (((tmp2 xor r_A xor r_H) and $10)<>0) then begin rF8; end;
if (tmp2>$FF) then begin r_F:=r_F or f_C; end; rA1; clp4_r_PCp1; end;
$8D: begin tmp2:=r_A+r_L; if1;
RF2; if (((tmp2 xor r_A xor r_L) and $10)<>0) then begin rF8; end;
if2_rA1_clp4_r_PCp1; end;
$8E: begin tmp1:=do_read2(r_L,r_H); tmp2:=r_A+tmp1; if1;
RF2; if (((tmp2 xor r_A xor tmp1) and $10)<>0) then begin rF8; end;
if2; rA1; clp7_r_PCp1; end;
$8F: begin tmp2:=r_A+r_A; if1;
RF2; if (((tmp2 xor r_A xor r_A) and $10)<>0) then
begin rF8; end; if2_rA1_clp4_r_PCp1; end;
$90: begin tmp2:=(r_A-r_B) and $FF; RF3; if (r_A<r_B) then begin rF7; end;
if (((tmp2 xor r_A xor r_B) and $10)<>0) then begin rF8; end; rA2_clp4_r_PCp1; end;
$91: begin tmp2:=(r_A-r_C) and $FF; RF3; if (r_A<r_C) then begin rF7; end;
if (((tmp2 xor r_A xor r_C) and $10)<>0) then begin rF8; end; rA2_clp4_r_PCp1; end;
$92: begin tmp2:=(r_A-r_D) and $FF; RF3;
if (r_A<r_D) then begin rF7; end; if (((tmp2 xor r_A xor r_D) and $10)<>0) then
begin rF8; end; rA2_clp4_r_PCp1; end;
$93: begin tmp2:=(r_A-r_E) and $FF; RF3; if (r_A<r_E) then begin rF7; end;
if (((tmp2 xor r_A xor r_E) and $10)<>0) then begin rF8; end;
rA2_clp4_r_PCp1; end;
$94: begin tmp2:=(r_A-r_H) and $FF; RF3; if (r_A<r_H) then
begin rF7; end; if (((tmp2 xor r_A xor r_H) and $10)<>0) then
begin rF8; end; rA2_clp4_r_PCp1; end;
$95: begin tmp2:=(r_A-r_L) and $FF; RF3; if (r_A<r_L) then
begin r_F:=r_F or f_C; end; if (((tmp2 xor r_A xor r_L) and $10)<>0) then
begin rF8; end; rA2_clp4_r_PCp1; end;
$96: begin tmp1:=do_read2(r_L,r_H); tmp2:=(r_A-tmp1) and $FF; RF3;
if (r_A<tmp1) then begin rF7; end;
if (((tmp2 xor r_A xor tmp1) and $10)<>0) then begin rF8; end;
rA2; clp7_r_PCp1; end;
$97: begin rF4; r_A:=0; clp4_r_PCp1; end;
$98: begin if ((r_F and f_C)<>0) then tmp3:=1 else tmp3:=0; tmp2:=(r_A-r_B-tmp3) and $FF;
RF3; if (r_A<r_B+tmp3) then begin rF7; end;
if (((tmp2 xor r_A xor r_B) and $10)<>0) then begin rF8; end; rA2_clp4_r_PCp1; end;
$99: begin if ((r_F and f_C)<>0) then tmp3:=1 else tmp3:=0; tmp2:=(r_A-r_C-tmp3) and $FF;
RF3; if (r_A<(r_C+tmp3)) then begin rF7; end; if (((tmp2 xor r_A xor r_C) and $10)<>0) then
begin rF8; end; rA2_clp4_r_PCp1; end;
$9A: begin if ((r_F and f_C)<>0) then tmp3:=1 else tmp3:=0; tmp2:=(r_A-r_D-tmp3) and $FF;
RF3; if (r_A<r_D+tmp3) then begin rF7; end; if (((tmp2 xor r_A xor r_D) and $10)<>0) then
begin rF8; end; rA2_clp4_r_PCp1; end;
$9B: begin if ((r_F and f_C)<>0) then tmp3:=1 else tmp3:=0; tmp2:=(r_A-r_E-tmp3) and $FF;
RF3; if (r_A<r_E+tmp3) then begin rF7; end;
if (((tmp2 xor r_A xor r_E) and $10)<>0) then begin rF8; end; rA2_clp4_r_PCp1; end;
$9C: begin if ((r_F and f_C)<>0) then tmp3:=1 else tmp3:=0; tmp2:=(r_A-r_H-tmp3) and $FF;
RF3; if (r_A<r_H+tmp3) then begin rF7; end; if (((tmp2 xor r_A xor r_H) and $10)<>0) then
begin rF8; end; rA2_clp4_r_PCp1; end;
$9D: begin if ((r_F and f_C)<>0) then tmp3:=1 else tmp3:=0; tmp2:=(r_A-r_L-tmp3) and $FF;
RF3; if (r_A<r_L+tmp3) then begin rF7; end; if (((tmp2 xor r_A xor r_L) and $10)<>0) then
begin rF8; end; rA2_clp4_r_PCp1; end;
$9E: begin tmp1:=do_read2(r_L,r_H); if ((r_F and f_C)<>0) then tmp3:=1 else tmp3:=0;
tmp2:=(r_A-tmp1-tmp3) and $FF; RF3; if (r_A<tmp1+tmp3) then begin rF7; end;
if (((tmp2 xor r_A xor tmp1) and $10)<>0) then begin rF8; end; rA2; clp7_r_PCp1; end;
$9F: begin if ((r_F and f_C)<>0) then tmp2:=$FF else tmp2:=0; RF3; if (tmp2<>0) then
begin r_F:=r_F or (f_A or f_C); end; rA2_clp4_r_PCp1; end;
$A0: begin r_A:=r_A and r_B;rF5_clp4_r_PCp1; end;
$A1: begin r_A:=r_A and r_C; rF5_clp4_r_PCp1; end;
$A2: begin r_A:=r_A and r_D; rF5_clp4_r_PCp1; end;
$A3: begin r_A:=r_A and r_E; rF5_clp4_r_PCp1; end;
$A4: begin r_A:=r_A and r_H; rF5_clp4_r_PCp1; end;
$A5: begin r_A:=r_A and r_L; rF5_clp4_r_PCp1; end;
$A6: begin tmp1:=do_read2(r_L,r_H); r_A:=r_A and tmp1; RF5; clp7_r_PCp1; end;
$A7: begin r_A:=r_A and r_A; rF5_clp4_r_PCp1; end;
$A8: begin r_A:=r_A xor r_B; rF5_clp4_r_PCp1; end;
$A9: begin r_A:=r_A xor r_C; rF5_clp4_r_PCp1; end;
$AA: begin r_A:=r_A xor r_D; rF5_clp4_r_PCp1; end;
$AB: begin r_A:=r_A xor r_E; rF5_clp4_r_PCp1; end;
$AC: begin r_A:=r_A xor r_H; rF5_clp4_r_PCp1; end;
$AD: begin r_A:=r_A xor r_L; rF5_clp4_r_PCp1; end;
$AE: begin tmp1:=do_read2(r_L,r_H); r_A:=r_A xor tmp1; RF5; clp7;
r_PCp1; end; $AF: begin r_A:=0; rF5_clp4_r_PCp1; end;
$B0: begin r_A:=r_A or r_B; rF5_clp4_r_PCp1; end;
$B1: begin r_A:=r_A or r_C; rF5_clp4_r_PCp1; end;
$B2: begin r_A:=r_A or r_D; rF5_clp4_r_PCp1; end;
$B3: begin r_A:=r_A or r_E; rF5_clp4_r_PCp1; end;
$B4: begin r_A:=r_A or r_H; rF5_clp4_r_PCp1; end;
$B5: begin r_A:=r_A or r_L; rF5_clp4_r_PCp1; end;
$B6: begin tmp1:=do_read2(r_L,r_H); r_A:=r_A or tmp1; RF5; clp7_r_PCp1; end;
$B7: begin r_A:=r_A or r_A; rF5_clp4_r_PCp1; end;
$B8: begin tmp2:=(r_A-r_B) and $FF; RF3; if (r_A<r_B) then begin rF7; end;
if (((tmp2 xor r_A xor r_B) and $10)<>0) then begin rF8; end; clp4_r_PCp1; end;
$B9: begin tmp2:=(r_A-r_C) and $FF; RF3; if (r_A<r_C) then begin rF7; end;
if (((tmp2 xor r_A xor r_C) and $10)<>0) then begin rF8; end; clp4_r_PCp1; end;
$BA: begin tmp2:=(r_A-r_D) and $FF; RF3; if (r_A<r_D) then begin rF7; end;
if (((tmp2 xor r_A xor r_D) and $10)<>0) then begin rF8; end; clp4_r_PCp1; end;
$BB: begin tmp2:=(r_A-r_E) and $FF; RF3; if (r_A<r_E) then begin rF7; end;
if (((tmp2 xor r_A xor r_E) and $10)<>0) then begin rF8; end;
clp4_r_PCp1; end;
$BC: begin tmp2:=(r_A-r_H) and $FF; RF3; if (r_A<r_H) then begin rF7; end;
if (((tmp2 xor r_A xor r_H) and $10)<>0) then begin rF8; end; clp4_r_PCp1; end;
$BD: begin tmp2:=(r_A-r_L) and $FF; RF3; if (r_A<r_L) then begin rF7; end;
if (((tmp2 xor r_A xor r_L) and $10)<>0) then begin rF8; end; clp4_r_PCp1; end;
$BE: begin tmp1:=do_read2(r_L,r_H); tmp2:=(r_A-tmp1) and $FF; RF3;
if (r_A<tmp1) then begin rF7; end; if (((tmp2 xor r_A xor tmp1) and $10)<>0) then
begin rF8; end; clp7_r_PCp1; end; $BF: begin rf4; clp4_r_PCp1; end;
$C0: begin if ((r_F and f_Z)<>0) then begin clp5_r_PCp1; end else
begin r_PC:=do_read(r_SP); r_PC:=r_PC+(do_read(r_SP+1) shl 8);
r_SP:=(r_SP+2) and $FFFF; clp11; end; end;
$C1: begin r_C:=do_read(r_SP); r_B:=do_read(r_SP+1); r_SP:=(r_SP+2) and $FFFF;
clp10_r_PCp1; end;
$C2: begin if ((r_F and f_Z)<>0) then begin clp10_r_PCp3; end
else begin r_PC:=d_rdPCp1+((d_rdPCp2 shl 8)); clp10; end; end;
$C3: begin r_PC:=d_rdPCp1+((d_rdPCp2 shl 8)); clp10; end;
$C4: begin if ((r_F and f_Z)<>0) then begin clp11; r_PCp3; end else
begin tmp1:=d_rdPCp1+((d_rdPCp2 shl 8)); r_SP:=(r_SP-2) and $FFFF;
r_PCp3; do_write(r_SP,r_PC and $FF); do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=tmp1; clp17; end; end;
$C5: begin r_SP:=(r_SP-2) and $FFFF; do_write(r_SP,r_C); do_write(r_SP+1,r_B);
clp11; r_PCp1; end;
$C6: begin tmp1:=d_rdPCp1; tmp2:=r_A+tmp1; RF2;
if (((tmp2 xor r_A xor tmp1) and $10)<>0) then begin rF6; end;
if (tmp2>$FF) then begin r_F:=r_F or f_C; end; rA1; clp7_r_PCp2; end;
$C7: begin r_SP:=(r_SP-2) and $FFFF; inc(r_PC); do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF); r_PC:=0*8; clp11; end;
$C8: begin if ((r_F and f_Z)=0) then begin clp5_r_PCp1; end else
begin r_PC:=do_read(r_SP); r_PC:=r_PC+(do_read(r_SP+1) shl 8);
r_SP:=(r_SP+2) and $FFFF; clp11; end; end;
$C9: begin r_PC:=do_read(r_SP); r_PC:=r_PC+(do_read(r_SP+1) shl 8);
r_SP:=(r_SP+2) and $FFFF; clp11; end;
$CA: begin if ((r_F and f_Z)=0) then begin clp10_r_PCp3; end
else begin r_PC:=d_rdPCp1+(d_rdPCp2 shl 8); clp10; end; end;
$CB: begin begin r_PC:=d_rdPCp1+(d_rdPCp2 shl 8); clp10; end; end;
$CC: begin if ((r_F and f_Z)=0) then begin clp11; r_PCp3; end else
begin tmp1:=d_rdPCp1+(d_rdPCp2 shl 8); r_SP:=(r_SP-2) and $FFFF;
r_PCp3; do_write(r_SP,r_PC and $FF); do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=tmp1; clp17; end end;
$CD: begin tmp1:=d_rdPCp1+(d_rdPCp2 shl 8);
r_SP:=(r_SP-2) and $FFFF; r_PCp3; do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF); r_PC:=tmp1; clp17; end;
$CE: begin tmp1:=d_rdPCp1; tmp2:=r_A+tmp1; if1; RF2;
if (((tmp2 xor r_A xor tmp1) and $10)<>0) then begin rF6; end;
if (tmp2>$FF) then begin r_F:=r_F or f_C; end; rA1; clp7_r_PCp2; end;
$CF: begin r_SP:=(r_SP-2) and $FFFF; inc(r_PC); do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF); r_PC:=1*8; clp11; end;
$D0: begin if ((r_F and f_C)<>0) then begin clp5_r_PCp1; end else
begin r_PC:=do_read(r_SP); r_PC:=r_PC+(do_read(r_SP+1) shl 8);
r_SP:=(r_SP+2) and $FFFF; clp11; end end;
$D1: begin r_E:=do_read(r_SP); r_D:=do_read(r_SP+1); r_SP:=(r_SP+2) and $FFFF;
clp10_r_PCp1; end;
$D2: begin if ((r_F and f_C)<>0) then begin clp10_r_PCp3; end
else begin r_PC:=d_rdPCp1+(d_rdPCp2 shl 8); clp10; end; end;
$D3: begin do_output(d_rdPCp1,r_A); clp10; r_PCp2; end;
$D4: begin if ((r_F and f_C)<>0) then begin clp11; r_PCp3; end else
begin tmp1:=d_rdPCp1+(d_rdPCp2 shl 8); r_SP:=(r_SP-2) and $FFFF;
r_PCp3; do_write(r_SP,r_PC and $FF); do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=tmp1; clp17; end; end;
$D5: begin r_SP:=(r_SP-2) and $FFFF; do_write(r_SP,r_E); do_write(r_SP+1,r_D);
clp11; r_PCp1; end;
$D6: begin tmp1:=d_rdPCp1; tmp2:=(r_A-tmp1) and $FF; RF3;
if (r_A<tmp1) then begin r_F:=r_F or f_C; end;
if (((tmp2 xor r_A xor tmp1) and $10)<>0) then begin rF6; end; rA2; clp7_r_PCp2; end;
$D7: begin r_SP:=(r_SP-2) and $FFFF; inc(r_PC); do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF); r_PC:=2*8; clp11; end;
$D8: begin if ((r_F and f_C)=0) then begin clp5_r_PCp1; end else
begin r_PC:=do_read(r_SP); r_PC:=r_PC+do_read(r_SP+1) shl 8; r_SP:=(r_SP+2) and $FFFF;
clp11; end; end;
$D9: begin begin r_PC:=do_read(r_SP); r_PC:=r_PC+do_read(r_SP+1) shl 8;
r_SP:=(r_SP+2) and $FFFF; clp11; end; end;
$DA: begin if ((r_F and f_C)=0) then begin clp10_r_PCp3; end else begin
r_PC:=d_rdPCp1+(d_rdPCp2 shl 8); clp10; end; end;
$DB: begin r_A:=do_input(d_rdPCp1); clp10; r_PCp2; end;
$DC: begin if ((r_F and f_C)=0) then begin clp11; r_PCp3; end else
begin tmp1:=d_rdPCp1+(d_rdPCp2 shl 8); r_SP:=(r_SP-2) and $FFFF; r_PCp3;
do_write(r_SP,r_PC and $FF); do_write(r_SP+1,(r_PC shr 8) and $FF); r_PC:=tmp1; clp17;
end; end;
$DD: begin begin tmp1:=d_rdPCp1+(d_rdPCp2 shl 8);
r_SP:=(r_SP-2) and $FFFF; r_PCp3; do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF); r_PC:=tmp1; clp17; end; end;
$ED: begin begin tmp1:=d_rdPCp1+(d_rdPCp2 shl 8);
r_SP:=(r_SP-2) and $FFFF; r_PCp3; do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF); r_PC:=tmp1; clp17; end; end;
$FD: begin begin tmp1:=d_rdPCp1+(d_rdPCp2 shl 8);
r_SP:=(r_SP-2) and $FFFF; r_PCp3; do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF); r_PC:=tmp1; clp17; end; end;
$DE: begin tmp1:=d_rdPCp1; if ((r_F and f_C)<>0) then tmp3:=1 else tmp3:=0;
tmp2:=(r_A-tmp1-tmp3) and $FF; RF3; if (r_A<tmp1+tmp3) then begin
r_F:=r_F or f_C; end; if (((tmp2 xor r_A xor tmp1) and $10)<>0) then
begin rF6; end; rA2; clp7_r_PCp2; end;
$DF: begin r_SP:=(r_SP-2) and $FFFF; inc(r_PC); do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF); r_PC:=3*8; clp11; end;
$E0: begin if ((r_F and f_P)<>0) then begin clp5_r_PCp1; end else
begin r_PC:=do_read(r_SP); r_PC:=r_PC+do_read(r_SP+1) shl 8;
r_SP:=(r_SP+2) and $FFFF; clp11; end ; end;
$E1: begin r_L:=do_read(r_SP); r_H:=do_read(r_SP+1); r_SP:=(r_SP+2) and $FFFF;
clp10_r_PCp1; end;
$E2: begin if ((r_F and f_P)<>0) then begin clp10_r_PCp3; end else
begin r_PC:=d_rdPCp1+(d_rdPCp2 shl 8); clp10; end; end;
$E3: begin tmp1:=do_read(r_SP); do_write(r_SP,r_L); r_L:=tmp1;
tmp1:=do_read(r_SP+1); do_write(r_SP+1,r_H); r_H:=tmp1; clock:=clock+18; r_PCp1; end;
$E4: begin if ((r_F and f_P)<>0) then begin clp11; r_PCp3; end else
begin tmp1:=d_rdPCp1+(d_rdPCp2 shl 8); r_SP:=(r_SP-2) and $FFFF;
r_PCp3; do_write(r_SP,r_PC and $FF); do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=tmp1; clp17; end; end;
$E5: begin r_SP:=(r_SP-2) and $FFFF; do_write(r_SP,r_L); do_write(r_SP+1,r_H);
clp11; r_PCp1; end;
$E6: begin r_A:=r_A and d_rdPCp1; RF5; clp7_r_PCp2; end;
$E7: begin r_SP:=(r_SP-2) and $FFFF; inc(r_PC); do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF); r_PC:=4*8; clp11; end;
$E8: begin if ((r_F and f_P)=0) then begin clp5_r_PCp1; end else
begin r_PC:=do_read(r_SP); r_PC:=r_PC+do_read(r_SP+1) shl 8; r_SP:=(r_SP+2) and $FFFF;
clp11; end; end;
$E9: begin r_PC:=(r_H shl 8)+r_L; clp5; end;
$EA: begin if ((r_F and f_P)=0) then begin clp10_r_PCp3; end else
begin r_PC:=d_rdPCp1+(d_rdPCp2 shl 8); clp10; end; end;
$EB: begin tmp1:=r_D; r_D:=r_H; r_H:=tmp1; tmp1:=r_E; r_E:=r_L; r_L:=tmp1; clp4;
r_PCp1; end;
$EC: begin if ((r_F and f_P)=0) then begin clp11; r_PCp3; end else
begin tmp1:=d_rdPCp1+(d_rdPCp2 shl 8); r_SP:=(r_SP-2) and $FFFF;
r_PCp3; do_write(r_SP,r_PC and $FF); do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=tmp1; clp17; end; end;
$EE: begin r_A:= r_A xor d_rdPCp1; RF5; clp7_r_PCp2; end;
$EF: begin r_SP:=(r_SP-2) and $FFFF; inc(r_PC); do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF); r_PC:=5*8; clp11; end;
$F0: begin if ((r_F and f_S)<>0) then begin clp5_r_PCp1; end else
begin r_PC:=do_read(r_SP); r_PC:=r_PC+(do_read(r_SP+1) shl 8);
r_SP:=(r_SP+2) and $FFFF; clp11; end; end;
$F1: begin r_F:=do_read(r_SP); r_A:=do_read(r_SP+1); r_SP:=(r_SP+2) and $FFFF;
clp10_r_PCp1; end;
$F2: begin if ((r_F and f_S)<>0) then begin clp10_r_PCp3; end else
begin r_PC:=d_rdPCp1+(d_rdPCp2 shl 8); clp10; end; end;
$F4: begin if ((r_F and f_S)<>0) then begin clp11; r_PCp3; end else
begin tmp1:=d_rdPCp1+(d_rdPCp2 shl 8); r_SP:=(r_SP-2) and $FFFF;
r_PCp3; do_write(r_SP,r_PC and $FF); do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=tmp1; clp17; end; end;
$F5: begin r_SP:=(r_SP-2) and $FFFF; do_write(r_SP,r_F); do_write(r_SP+1,r_A);
clp11; r_PCp1; end;
$F6: begin r_A:=r_A or d_rdPCp1; RF5; clp7_r_PCp2; end;
$F7: begin r_SP:=(r_SP-2) and $FFFF; inc(r_PC); do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF); r_PC:=6*8; clp11; end;
$F8: begin if ((r_F and f_S)=0) then begin clp5_r_PCp1; end else
begin r_PC:=do_read(r_SP); r_PC:=r_PC+(do_read(r_SP+1) shl 8);
r_SP:=(r_SP+2) and $FFFF; clp11; end; end;
$F9: begin r_SP:=(r_H shl 8)+r_L; clp5_r_PCp1; end;
$FA: begin if ((r_F and f_S)=0) then begin clp10_r_PCp3; end else
begin r_PC:=d_rdPCp1+(d_rdPCp2 shl 8); clp10; end; end;
$FC: begin if ((r_F and f_S)=0) then begin clp11; r_PCp3; end else
begin tmp1:=d_rdPCp1+(d_rdPCp2 shl 8); r_SP:=(r_SP-2) and $FFFF;
r_PCp3; do_write(r_SP,r_PC and $FF); do_write(r_SP+1,(r_PC shr 8) and $FF);
r_PC:=tmp1; clp17; end; end;
$FE: begin tmp1:=d_rdPCp1; tmp2:=(r_A-tmp1) and $FF; RF3;
if (r_A<tmp1) then begin r_F:=r_F or f_C; end;
if (((tmp2 xor r_A xor tmp1) and $10)<>0) then begin rF6; end; clp7;
r_PCp2; end;
$FF: begin r_SP:=(r_SP-2) and $FFFF; inc(r_PC); do_write(r_SP,r_PC and $FF);
do_write(r_SP+1,(r_PC shr 8) and $FF); r_PC:=7*8; clp11; end end;
end;
rgA:=Cardinal(r_A);rgB:=Cardinal(r_b);rgC:=Cardinal(r_c);rgD:=Cardinal(r_d);
rgE:=Cardinal(r_e);rgH:=Cardinal(r_H);rgL:=Cardinal(r_L);rgF:=Cardinal(r_F);
rgPC:=Cardinal(r_PC);rgSP:=Cardinal(r_SP);
fS:=Cardinal(f_S);fZ:=Cardinal(f_Z);f5:=Cardinal(f_5);fA:=Cardinal(f_A);
f3:=Cardinal(f_3);fP:=Cardinal(f_P);f1:=Cardinal(f_1);fC:=Cardinal(f_C);
{$R+}
end;
procedure TMainForm.draw_screen1;
Begin
{$R-}
//if FullScreen1.Checked then // на весь экран или нет
MainForm.Canvas.StretchDraw(rect(0,0,MainForm.Width-0,MainForm.Height-30), gamecanvas)
//else
//MainForm.Canvas.Draw(0,0,gamecanvas);
{$R+}
end;
//function col_index(port : Cardinal; color : Cardinal): Cardinal; // колор в зависимоти от порта С
var col_index_port,col_index_color,col_index_result:cardinal;
procedure TMainForm.col_index;
Var port,color,result_:Cardinal;
begin
{$R-}
port:=col_index_port; color:=col_index_color;
Result_:=LVColBlack;
if ((port and $40)<>0) then Result_:= (Result_ xor LVColBlue);
if ((port and $20)<>0) then Result_:= (Result_ xor LVColLime);
if ((port and $10)<>0) then Result_:= (Result_ xor LVColRed);
// case color of
if color = LVColBlack then
begin
if ((port and $08)=0) then
begin Result_:= (Result_ xor LVColRed); end;
if ((port and $04)=0) then
begin Result_:= (Result_ xor LVColBlue); end;
end else
if color = LVColLime then begin Result_:= (Result_ xor LVColLime); end else
if color = LVColRed then begin Result_:= (Result_ xor LVColRed);
if ((port and $02)=0) then
begin Result_:= (Result_ xor LVColLime); end; end else
if color = LVColBlue then begin Result_:= (Result_ xor LVColBlue);
if ((port and $01)=0) then
begin Result_:= (Result_ xor LVColRed); end; end;
col_index_result:=result_;
{$R+}
end;
var My_col_inp,My_col_result:Cardinal;
Procedure TMainForm.My_col2;
var inp,result:Cardinal;
begin
{$R-}
inp:=My_col_inp;
if inp=0 then My_col_result:=LVColBlack else
if inp=1 then My_col_result:=LVColLime else
if inp=2 then My_col_result:=LVColBlue else
if inp=3 then My_col_result:=LVColRed else
{$R+}
end;
var SupCol2_c1,SupCol2_b,SupCol2_x:Cardinal;
var SupCol2_Result:Cardinal;
Procedure TMainForm.SupCol2;
Var c1,b,x,_Result:Cardinal;
pix:Cardinal;
begin
{$R-}
c1:=SupCol2_c1; b:=SupCol2_b; x:=SupCol2_x; pix:=0;
case x of
1: begin
if (b and 128)=128 then pix:=pix+1;
if (b and 8)=8 then pix:=pix+2;
end;
2: begin
if (b and 64)=64 then pix:=pix+1;
if (b and 4)=4 then pix:=pix+2;
end;
3: begin
if (b and 32)=32 then pix:=pix+1;
if (b and 2)=2 then pix:=pix+2;
end;
4: begin
if (b and 16)=16 then pix:=pix+1;
if (b and 1)=1 then pix:=pix+2;
end;
end;
col_index_port:=c1;
My_Col_inp:=pix;My_Col2;
col_index_color:=My_col_result;
col_index;SupCol2_Result:=col_index_result;
{$R+}
end;
var draw_screen2_i:Cardinal;
procedure TMainForm.draw_screen2; //Рисуем с video на экран (Форму)
var vertX,gorY : Cardinal;
begin
vertX:= (draw_screen2_i mod 64)*4; gorY:=(draw_screen2_i div 64)*1;
Rports_a:=$C1;Rports;
SupCol2_c1:=Rports_result;Rvideo_a:=draw_screen2_i;Rvideo;
SupCol2_b:=Rvideo_result;
SupCol2_x:=1;SupCol2;
gamecanvas.Canvas.Pixels[vertX,gorY]:= SupCol2_Result;
SupCol2_x:=2;SupCol2;
gamecanvas.Canvas.Pixels[vertX+1,gorY]:=SupCol2_Result;
SupCol2_x:=3;SupCol2;
gamecanvas.Canvas.Pixels[vertX+2,gorY]:=SupCol2_Result;
SupCol2_x:=4;SupCol2;
gamecanvas.Canvas.Pixels[vertX+3,gorY]:=SupCol2_Result;
end;
procedure TMainForm.draw_screen; //Рисуем с video на экран (Форму)
var i:Cardinal;
begin
{$R-}
for i:=0 to $3fff do begin
Rvideo_a:=i;Rvideo;
RVideoDirty_a:=i;RVideoDirty;
if Rvideo_Result<>RVideoDirty_Result then //сравниваем значения , а есть ли изменения
begin
draw_screen2_i:=i; draw_screen2;
Rvideo_a:=i;Rvideo;
WVideoDirty_a:=i; WVideoDirty_b:=Rvideo_Result;WVideoDirty;
end;
end;
draw_screen1;
{$R+}
end;
procedure TMainForm.FirstPusk; //первый запуск
begin
// создадим канву для рисования
gamecanvas:=tbitmap.Create;
gamecanvas.Width:=256;
gamecanvas.Height:=256;
ResetComp; // первоночальный сброс всего
TimerMain.Enabled:=true; // запускаем основной таймер
end;
function TMainForm.readmask (keynum: word): word; // маска клавы
begin
result:= $72FF;
case keynum of
8: begin result:= $23FF end; // BCK
13: begin result:= $13FF end; // ENTER
16: begin result:= $70FF end; // SHIFT
32: begin result:= $30FF end; // SPC
37: begin result:= $FF32 end; // <-
38: begin result:= $FF31 end; // UP
39: begin result:= $FF30 end; // ->
40: begin result:= $FF33 end; // DOWN
48: begin result:= $06FF end; // 0
49: begin result:= $47FF end; // 1
50: begin result:= $46FF end; // 2
51: begin result:= $45FF end; // 3
52: begin result:= $44FF end; // 4
53: begin result:= $43FF end; // 5
54: begin result:= $00FF end; // 6
55: begin result:= $01FF end; // 7
56: begin result:= $02FF end; // 8
57: begin result:= $07FF end; // 9
65: begin result:= $64FF end; // A
66: begin result:= $31FF end; // B
67: begin result:= $57FF end; // C
68: begin result:= $27FF end; // D
69: begin result:= $54FF end; // E
70: begin result:= $67FF end; // F
71: begin result:= $10FF end; // G
72: begin result:= $16FF end; // H
73: begin result:= $75FF end; // I
74: begin result:= $52FF end; // J
75: begin result:= $55FF end; // K
76: begin result:= $22FF end; // L
77: begin result:= $76FF end; // M
78: begin result:= $53FF end; // N
79: begin result:= $21FF end; // O
80: begin result:= $63FF end; // P
81: begin result:= $71FF end; // Q
82: begin result:= $20FF end; // R
83: begin result:= $77FF end; // S
84: begin result:= $74FF end; // T
85: begin result:= $56FF end; // U
86: begin result:= $26FF end; // V
87: begin result:= $65FF end; // W
88: begin result:= $73FF end; // X
89: begin result:= $66FF end; // Y
90: begin result:= $17FF end; // Z
107: begin result:= $05FF end; // =/+ -> =/-
109: begin result:= $05FF end; // -/_ -> =/-
114: begin result:= $FF23 end; // F3
115: begin result:= $FF22 end; // F4
116: begin result:= $FF21 end; // F5
36: begin result:= $FF20 end; // Home
219: begin result:= $11FF end; // [
221: begin result:= $12FF end; // ]
190: begin result:= $24FF end; // .
188: begin result:= $37FF end; // ,
192: begin result:= $72FF end; //
end;
end;
procedure TMainForm.FormActivate(Sender: TObject);
begin
if FPusk then // а это первый ли запуск
begin
FPusk:=false;
FirstPusk;
end;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
DragAcceptFiles(MainForm.Handle, true); // сделаем драг анд дроб :)
FPusk:=true; // запомним первый запуск
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
DragAcceptFiles(Handle, False);
end;
procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word; //опрос клавы
Shift: TShiftState);
begin
kbd(readmask(key),true); // нажали
// i8080_do_opcodes(opcodes_to_run);
end;
procedure TMainForm.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
kbd(readmask(key),false); // отпустии
end;
procedure TMainForm.TimerMainTimer(Sender: TObject); // основной таймер
var j,a: word;i: integer;s: string;
begin
//if (pause) then begin exit; end; // если пауза курим бамбук :)
i8080_do_opcodes(opcodes_to_run);
draw_screen;
end;
procedure TMainForm.ResetComp;
begin
rgB := 0; rgC := 0; rgD := 0; rgE := 0; rgH := 0; rgL := 0; rgA := 0; rgF := 0;
rgPC := 0; rgSP := 0;
pause := false;
fS := (1 SHL 7);
fZ :=( 1 SHL 6);
f5 := (1 SHL 5);
fA := (1 SHL 4);
f3 := (1 SHL 3);
fP := (1 SHL 2);
f1 := (1 SHL 1);
fC := (1 SHL 0);
BasicStack := $AFC1;
BasicHotEntry := $02FD;
BasicProgBegin := $0243;
BasicProgEnd := $0245;
fillcharVideoDirty;
// restClock := 0;
init_memory();
reset1();
load_bios();
i8080_do_opcodes(0);
end;
procedure TMainForm.ResetCPU1Click(Sender: TObject);
begin
ResetComp;
end;
end.
SOURCE_DELPHI\004\
EmulForKOS.dpr
program EmulForKOS;
uses
Forms,
Windows,
uMain in 'uMain.pas' {MainForm},
uLVComp in 'uLVComp.pas';
{$R *.res}
begin
SetThreadLocale(1049);
Application.Initialize;
Application.Title := 'ПК ЛЬВОВ';
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.
SOURCE_DELPHI\004\
uLVComp.pas
unit uLVComp; interface var memoryM: array [0..65535] of byte=(..................); videoM: array [0..16383] of byte=(..................); portsM: array [0..255] of byte=(..................); flagsM: array [0..255] of byte=(..................); rgA:Cardinal=254; rgB:Cardinal=254; rgC:Cardinal=64; rgD:Cardinal=1; rgE:Cardinal=63; rgH:Cardinal=0; rgL:Cardinal=0; rgF:Cardinal=130; rgSP:Cardinal=44991; rgPC:Cardinal=56999; fS:Cardinal=128; fZ:Cardinal=64; f5:Cardinal=32; fA:Cardinal=16; f3:Cardinal=8; fP:Cardinal=4; f1:Cardinal=2; fC:Cardinal=1; implementation end.
SOURCE_DELPHI\004\
uMain.pas
unit uMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Menus,MMSystem,ShellAPI, ImgList, ComCtrls,
ToolWin,uLVcomp;
type
TMainForm = class(TForm)
TimerMain: TTimer; MainMenu1: TMainMenu;
N1: TMenuItem; N2: TMenuItem; N3: TMenuItem; N4: TMenuItem;
OpenDialogLvt: TOpenDialog;
ResetCPU1: TMenuItem;
N11: TMenuItem;
procedure fillcharVideoDirty;
procedure draw_screen1;
procedure draw_screen2;
Procedure SupCol2;
Procedure My_col2;
procedure col_index;
procedure TimerMainTimer(Sender: TObject);
procedure do_write(addr: Cardinal; bt: Cardinal);
procedure i8080_init;
function do_read(addr: Cardinal): Cardinal;
procedure do_write2(a_lo: Cardinal; a_hi: Cardinal; bt: Cardinal);
function do_read2(a_lo : Cardinal; a_hi : Cardinal): Cardinal;
function do_input(port : Cardinal): Cardinal;
procedure do_output(port : Cardinal; bt : Cardinal);
procedure kbd(mask : word; press : boolean);
procedure reset1;
procedure load_bios;
procedure do_pause();
procedure i8080_do_opcodes(nb_cycles : Cardinal); //выполнение комманд процессора
procedure draw_screen();
procedure FirstPusk;
function readmask (keynum: word): word;
procedure N4Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FormActivate(Sender: TObject);
procedure NewLoadFile(filenameDnD: string;start : boolean);
procedure ResetComp;
procedure ResetCPU1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Wmemory; procedure Rmemory;
procedure Wflags; procedure Rflags;
procedure Wvideo; procedure Rvideo;
procedure WVideoDirty; procedure RVideoDirty;
procedure Wports; procedure Rports;
procedure Wkbd_base; procedure Rkbd_base;
procedure Wkbd_ext; procedure Rkbd_ext;
private
{ Private declarations }
public
procedure WMDropFiles(var Msg: TMessage); message wm_DropFiles;
{ Public declarations }
end;
var
MainForm: TMainForm;
VideoDirtyM : array [0..16384] of word; //буфер для быстрой прорисовки
kbd_baseM : array [0..8] of byte; // массивы опроса клавиатуры
kbd_extM : array [0..4] of byte;//=(1,2,3,4,5);
FPusk: boolean; // первый запуск
gamecanvas: tbitmap; // сюда все рисуем перед выводом на форму
bios : array [0..65535] of byte; // массив для загрузки биоса, можно сразу грузить но вдруг пригодися
Myfile: array [0..90000] of byte; //файл может быть большим DUMP SAV который
pause : boolean; //пауза в эмуляторе
// opcodes_to_run:Cardinal = round ((1411200*2)/50{FPS});
// FPS:Cardinal=50; opcodes_to_run:Cardinal = 68500;
FPS:Cardinal=1000; opcodes_to_run:Cardinal = 68500;
myfilelength: Cardinal; // длина скачаного файла
BasicStack,BasicHotEntry,BasicProgBegin,BasicProgEnd : Cardinal;
var LVColBlack:Cardinal=0; LVColLime:Cardinal=$00FF00; LVColBlue:Cardinal=$FF0000; LVColRed:Cardinal=$0000FF;
implementation
{$R *.dfm}
var Wmemory_a,Wmemory_b:Cardinal; procedure TMainForm.Wmemory; begin memoryM[Wmemory_a]:=Wmemory_b; end;
var Rmemory_a,Rmemory_result:Cardinal; procedure TMainForm.Rmemory; begin Rmemory_result:=memoryM[Rmemory_a];end;
var Wflags_a,Wflags_b:Cardinal; procedure TMainForm.Wflags; begin flagsM[Wflags_a]:=Wflags_b; end;
var Rflags_a,Rflags_result:Cardinal; procedure TMainForm.Rflags; begin Rflags_result:=flagsM[Rflags_a];end;
var Wvideo_a,Wvideo_b:Cardinal; procedure TMainForm.Wvideo; begin videoM[Wvideo_a]:=Wvideo_b; end;
var Rvideo_a,Rvideo_result:Cardinal; procedure TMainForm.Rvideo; begin Rvideo_result:=videoM[Rvideo_a];end;
var WVideoDirty_a,WVideoDirty_b:Cardinal; procedure TMainForm.WVideoDirty; begin VideoDirtyM[WVideoDirty_a]:=WVideoDirty_b; end;
var RVideoDirty_a,RVideoDirty_result:Cardinal; procedure TMainForm.RVideoDirty; begin RVideoDirty_result:=VideoDirtyM[RVideoDirty_a];end;
var Wports_a,Wports_b:Cardinal; procedure TMainForm.Wports; begin portsM[Wports_a]:=Wports_b; end;
var Rports_a,Rports_result:Cardinal; procedure TMainForm.Rports; begin Rports_result:=portsM[Rports_a];end;
var Wkbd_base_a,Wkbd_base_b:Cardinal; procedure TMainForm.Wkbd_base; begin kbd_baseM[Wkbd_base_a]:=Wkbd_base_b; end;
var Rkbd_base_a,Rkbd_base_result:Cardinal; procedure TMainForm.Rkbd_base; begin Rkbd_base_result:=kbd_baseM[Rkbd_base_a];end;
var Wkbd_ext_a,Wkbd_ext_b:Cardinal; procedure TMainForm.Wkbd_ext; begin kbd_extM[Wkbd_ext_a]:=Wkbd_ext_b; end;
var Rkbd_ext_a,Rkbd_ext_result:Cardinal; procedure TMainForm.Rkbd_ext; begin Rkbd_ext_result:=kbd_extM[Rkbd_ext_a];end;
procedure TMainForm.fillcharVideoDirty;
var c:Cardinal; begin {$R-} For c:=0 to 16384 do begin
Rvideo_a:=c; Rvideo; WVideoDirty_a:=c;WVideoDirty_b:=(Rvideo_result xor 1);WVideoDirty;{$R+} end; end;
procedure TMainForm.WMDropFiles(var Msg: TMessage); // порцедура отвечает за принятие перетаскиваемого файла
var FileName: array[0..256] of char;
begin DragQueryFile(THandle(Msg.WParam), 0, FileName, SizeOf(Filename));
MainForm.Caption:=FileName;NewLoadFile(FileName,true);DragFinish(THandle(Msg.WParam));end;
procedure TMainForm.do_write(addr : Cardinal; bt : Cardinal); // если нужно будем записывать :-)
begin
{$R-}
if addr> $FFFF then addr:=$FFFF;
if (addr>=$C000) then
begin exit; end;
Rports_a:=$C2;Rports; if ((Rports_result and 2)<>0) then begin Wmemory_A:=addr; Wmemory_B:=bt; Wmemory; end else
if (addr<$4000) then begin exit; end else
if (addr<$8000) then begin Wvideo_a:=(addr-$4000);Wvideo_b:=bt; Wvideo; end else
begin Wmemory_A:=addr; Wmemory_B:=bt; Wmemory; end;
{$R+}
end;
procedure TMainForm.i8080_init;
var j,i : Cardinal;
begin
{$R-}
for i:=0 to 255 do
begin
{flags[i]:=f1 or fP;} Wflags_a:=i;Wflags_b:=(f1 or fP);Wflags;
for j:=0 to 7 do
begin
if ((i and (1 SHL j))<>0) then
begin
{ flags[i]:=(flags[i] xor fP);}
Rflags_a:=i;Rflags;
Wflags_a:=i;Wflags_b:=(Rflags_Result xor fP);Wflags;
end;
end;
if ((i and $80)<>0) then
begin
{ flags[i]:=(flags[i] or fS);}
Rflags_a:=i;Rflags;
Wflags_a:=i;Wflags_b:=(Rflags_Result or fS);Wflags;
end;
if (i=0) then
begin
{ flags[i]:=(flags[i] or fZ);}
Rflags_a:=i;Rflags;
Wflags_a:=i;Wflags_b:=(Rflags_Result or fZ);Wflags;
end;
end;
{$R+}
end;
function TMainForm.do_read(addr : Cardinal): Cardinal; // считаем значение из пямяти
begin
{$R-}
if addr> $FFFF then addr:=$FFFF;
RPorts_a:=$C2;RPorts; if ((RPorts_result and 2)<>0) then
begin Rmemory_A:=addr; Rmemory; result := Rmemory_result; end
else if (addr>$7FFF) then begin Rmemory_A:=addr; Rmemory; result := Rmemory_result; end
else if (addr<$4000) then begin result := 0; end else
begin Rvideo_a:=(addr-$4000); Rvideo; result := Rvideo_result; end;
{$R+}
end;
procedure TMainForm.do_write2(a_lo: Cardinal; a_hi: Cardinal; bt: Cardinal);
begin {$R-} do_write(a_lo+(a_hi SHL 8),bt); {$R+}end;
function TMainForm.do_read2(a_lo : Cardinal; a_hi : Cardinal): Cardinal;
begin {$R-} result := do_read(a_lo+(a_hi SHL 8)); {$R+}end;
function TMainForm.do_input(port : Cardinal): Cardinal; // работа со значениями портов in
var i,r : Cardinal; nD2 ,nD0 : Cardinal;
begin
{$R-}
port:=$C0+(port and $13);
case port of
$C2: begin Rports_a:=$C2;Rports; result := Rports_result; end;
$D1: begin Rports_a:=$D0;Rports; nD0:=not Rports_result; r:=0;
For i:=0 to 7 do
begin
if ((nD0 and (1 SHL i))<>0) then begin rkbd_base_a:=i;rkbd_base; r:=(r or Rkbd_base_result); end;
end;
result := ((not r) and $FF);
end;
$D2: begin Rports_a:=$D2;Rports; nD2:= not Rports_result; r:=0;
for i:=0 to 3 do begin if ((nD2 and (1 SHL i))<>0) then begin Rkbd_ext_a:=i;Rkbd_ext; r:=(r or Rkbd_ext_result);end;
end;
result := not ((r SHL 4) or (nD2 and $0F)) and $FF;
end
else begin result := $FF; end;
end;
{$R+}
end;
procedure TMainForm.do_output(port : Cardinal; bt : Cardinal); // out
begin
{$R-}
port:=$C0+(port and $13);
case port of
$c1: begin // изменение порта цвета
fillcharVideoDirty;
end;
end;
Wports_a:=port;Wports_b:=bt; Wports;
{$R+}
end ;
procedure TMainForm.kbd(mask : word; press : boolean); // по маске вкл выкл клавишу
var brow : byte; erow : byte; bcol : byte; ecol : byte;
begin
{$R-}
bcol:=(mask SHR 12) and $0F; brow:=(mask SHR 8) and $0F;
ecol:=(mask SHR 4) and $0F; erow:=(mask SHR 0) and $0F;
if ((brow<8) and (bcol<8)) then
begin
if (press) then begin Rkbd_base_a:=bcol;Rkbd_base;
Wkbd_base_a:=bcol;Wkbd_base_b:=(Rkbd_base_result or (1 SHL brow));Wkbd_base; end
else begin Rkbd_base_a:=bcol;Rkbd_base;
Wkbd_base_a:=bcol;Wkbd_base_b:=(Rkbd_base_result and (not(1 SHL brow))); Wkbd_base; end;
end;
if ((erow<8) and (ecol<4)) then begin Rkbd_ext_a:=ecol;Rkbd_ext;
if (press) then begin Wkbd_ext_a:=ecol;Wkbd_ext_b:= (Rkbd_ext_result or (1 SHL erow));Wkbd_ext;
end else begin Rkbd_ext_a:=ecol;Rkbd_ext; Wkbd_ext_a:=ecol;Wkbd_ext_b:=(Rkbd_ext_result and (not(1 SHL erow)));Wkbd_ext; end;
end;
{$R+}
end;
procedure TMainForm.reset1; // полный ресет :)
var i : word; begin {$R-} for i:=0 to 255 do begin
Wports_a:=i;Wports_b:=$FF; Wports; end; {$R+} end;
procedure TMainForm.load_bios; // загрузка биоса из файла
var i: Cardinal;b: Byte;f: file of byte;
begin
{$R-}
i:=0; AssignFile(F,ExtractFilePath(Application.ExeName)+'\bios.dat');
Reset(F); while not eof(f) do begin read(F,b); bios[i]:=b; inc(i); end;
closeFile(F); i:=0;
for i:=0 to $3FFF do begin Wmemory_a:=($C000+i);Wmemory_b:=bios[22+i];Wmemory; end;
{$R+}
end;
procedure TMainForm.N2Click(Sender: TObject);
begin
OpenDialogLvt.InitialDir:=ExtractFilePath(Application.ExeName);
if OpenDialogLvt.Execute then NewLoadFile(OpenDialogLvt.FileName,true);
end;
procedure TMainForm.N4Click(Sender: TObject);
begin gamecanvas.Free;close;end;
procedure TMainForm.NewLoadFile(filenameDnD: string; start : boolean); //процедура загрузки всех видов файлов
var f:file of byte; b:Byte; s: string; posBas, Xend ,Xbeg ,Xrun : word; i: integer;
begin
{$R-}
s:='';
AssignFile(f,filenameDnD); // распознаем что за файл
Reset(f);
for I:= 0 to 8 do begin read(f,b); s:=s+chr(b); end;
if s='LVOV/2.0/' then // стандартный LVT файл
begin read(f,b);
if b=$D0 then { это бинарник} begin
seek(F,0); // вернемся к началу файла
i:=0;
while not eof(f) do
begin read(F,b); Myfile[i]:=b; inc(i); end;
myfilelength:=i;
closeFile(F); //закрываем файл
Xbeg:=Myfile[16]+Myfile[17]*256; Xend:=Myfile[18]+Myfile[19]*256;
Xrun:=Myfile[20]+Myfile[21]*256;
if (start) then begin {warm_start();} rgPC:=Xrun; end;
i:=0;
while (i<=Xend-Xbeg) do begin do_write(Xbeg+i,Myfile[i+22]); inc(i); end;
end
else
begin //это бeйсик (надеюсь больше ничего нет :-) )
seek(F,0); // вернемся к началу файла
i:=0;
while not eof(f) do
begin read(F,b); Myfile[i]:=b; inc(i); end;
myfilelength:=i-1; {warm_start();}
// posBas:=get_var(BasicProgBegin);
i:=0; while (i<myfilelength-16) do
begin do_write(posBas+i,Myfile[i+16]); inc(i); end;
// направим RUN
MainForm.SetFocus;
i8080_do_opcodes(opcodes_to_run);
end;
end;
if s='LVOV/DUMP' then // стандартный SAV файл дампа эмулятор Калашникова
begin
seek(F,0); // вернемся к началу файла
i:=0; while not eof(f) do begin read(F,b); Myfile[i]:=b; inc(i);end;
i:=0; closeFile(F);
while (i<$10000) do
begin{ memory[i]:=Myfile[17+i];} Wmemory_A:=i; Wmemory_B:=Myfile[17+i]; Wmemory;inc(i);end;
i:=0; while (i<$4000) do begin
Wvideo_a:=i;Wvideo_b:=Myfile[17+$10000+i];Wvideo; inc(i); end;
i:=0; while (i<$100) do begin
Wports_a:=i;Wports_b:=Myfile[17+$10000+$4000+i]; Wports;
inc(i);
end;
rgB:=Myfile[17+$10000+$4000+$100]; rgH:=Myfile[17+$10000+$4000+$100+4];
rgC:=Myfile[17+$10000+$4000+$100+1]; rgL:=Myfile[17+$10000+$4000+$100+5];
rgD:=Myfile[17+$10000+$4000+$100+2]; rgA:=Myfile[17+$10000+$4000+$100+6];
rgE:=Myfile[17+$10000+$4000+$100+3]; rgF:=Myfile[17+$10000+$4000+$100+7];
rgSP:=Myfile[17+$10000+$4000+$100+9]*256+Myfile[17+$10000+$4000+$100+8];
rgPC:=Myfile[17+$10000+$4000+$100+11]*256+Myfile[17+$10000+$4000+$100+10];
fillcharVideoDirty; draw_screen;
end;
{$R-}
end;
procedure TMainForm.do_pause();
begin
pause := not pause;
end;
procedure TMainForm.i8080_do_opcodes(nb_cycles : Cardinal); //выполнение комманд процессора
var tmp3, tmp2, tmp1, opcode : integer;
var { регистрики} r_A,r_B,r_C,r_D,r_E,r_H,r_L,r_F,r_PC,r_SP : integer;
clock:Cardinal;
{ флаги} f_S, f_Z, f_5, f_A, f_3,f_P,f_1,f_C : Integer;
procedure m01m;begin tmp2:=tmp2+1 end;
procedure m02m;begin r_PC:=r_PC+3; end;
procedure m04m;Begin r_A:=(tmp2 and $FF); end;
procedure m06m;Begin r_A:=tmp2; end;
procedure m07m;Begin Rflags_a:=tmp2;Rflags; r_F:=(Rflags_result or (r_F and f_C)); end;
procedure m08m;Begin Rflags_a:=(tmp2 and $FF);Rflags; r_F:=Rflags_result; end;
procedure m09m;begin Rflags_a:=(tmp2);Rflags; r_F:=Rflags_result; end;
procedure m10m;begin Rflags_a:=(0);Rflags; r_F:=Rflags_result; end;
procedure m11m;begin Rflags_a:=(r_A);Rflags; r_F:=(Rflags_result or (r_F and f_A)); end;
procedure m12m;begin r_F:=(r_F or f_A); end;
procedure m13m;begin r_F:=(r_F or f_C); end;
procedure m14m;begin r_PC:=r_PC+1; end;
procedure m15m;begin r_PC:=r_PC+2; end;
procedure m16m;begin clock:=clock+4; end;
procedure m17m;begin clock:=clock+7; end;
procedure m18m;begin clock:=clock+5; end;
procedure m19m;begin clock:=clock+10; end;
procedure m20m;begin clock:=clock+11; end;
procedure m21m;begin clock:=clock+13; end;
procedure m22m;begin clock:=clock+16; end;
procedure m23m;begin clock:=clock+17; end;
procedure m24m;begin if ((r_F and f_C)<>0) then m01m else tmp2:=tmp2+0;end;
procedure m25m;begin m18m; m14m;end;
procedure m26m;begin m11m; m16m; m14m;end;
procedure m27m;begin m16m; m14m; end;
Function m28m:Cardinal; begin Result:=do_read(r_PC+2) end;
Function m29m:Cardinal; begin Result:=do_read(r_PC+1); end;
Function m30m:Cardinal; begin Result:=do_read2(r_L,r_H); end;
procedure m03m;begin m19m; m02m; end;
procedure m31m;begin m17m; m14m; end;
procedure m32m;begin if (tmp2>$FF) then begin m13m; end; end;
procedure m33m;begin m17m; m15m; end;
procedure m34m;begin m19m; m14m; end;
procedure m05m;Begin m32m; m04m; m27m; end;
procedure m35m;Begin m06m; m27m; end;
procedure m36m(a:Integer);Begin if (((tmp2 xor r_A xor a) and $10)<>0) then begin m12m; end; end;
procedure m37m(a:Integer); begin if ((r_F and f_C)<>0) then tmp3:=1 else tmp3:=0; tmp2:=(r_A-a-tmp3) and $FF;end;
Function m38m:Cardinal; begin Result:=m30m; m31m; end;
Function m39m:Cardinal; begin Result:=m29m; m33m; end;
procedure m40m(a:Integer); begin tmp2:=(r_A-a) and $FF; m09m; if (r_A<a) then begin m13m; end; m36m(a); m35m; end;
procedure m41m(a:Integer); begin m37m(a); m09m; if (r_A<(a+tmp3)) then begin m13m; end;
m36m(a); m35m; end;
procedure m42m(a:Integer); begin if (((tmp2 xor a) and $10)<>0) then begin m12m; end; end;
procedure m43m(a:Integer); begin m07m; m42m(a); end;
procedure m44m(a:Integer); begin do_write2(r_L,r_H,a); end;
Function m46m:Cardinal; begin m46m:=m29m+(m28m shl 8); end;
procedure m45m; begin r_PC:=m46m; end;
procedure m47m; begin tmp1:=m29m; end;
procedure m48m; begin tmp1:=m46m; end;
procedure m49m; begin r_PC:=do_read(r_SP);end;
procedure m50m; begin r_SP:=(r_SP-2) and $FFFF;end;
procedure m51m; begin r_PC:=tmp1; m23m; end;
procedure m52m; begin m48m; m50m; m02m; end;
Function m53m:Boolean;Begin if ((r_F and f_S)<>0) then Result:=True else Result:=False; end;
Function m54m:Boolean;Begin if ((r_F and f_S)=0) then Result:=True else Result:=False; end;
Function m55m:Cardinal; begin m55m:=(r_PC shr 8) and $FF; end;
procedure m56m; begin do_write(r_SP,r_PC and $FF); end;
Function m57m:Boolean;Begin if ((r_F and f_C)<>0) then Result:=True else Result:=False; end;
Function m58m:Boolean;Begin if ((r_F and f_P)=0) then Result:=True else Result:=False; end;
Function m59m:Boolean;Begin if ((r_F and f_C)=0) then Result:=True else Result:=False; end;
Function m60m:Boolean;Begin if ((r_F and f_Z)=0) then Result:=True else Result:=False; end;
procedure m61m(a:Integer); begin r_A:=r_A and a; end;
procedure m62m(a:Integer); begin if (r_A<a) then begin m13m; end; m36m(a); m27m; end;
procedure m63m(a:Integer); begin tmp2:=(r_A-a) and $FF; m09m; m62m(a);end;
procedure m64m(a:Integer); begin r_A:=(r_A or a);end;
procedure m65m; begin r_F:=r_F or f_C; end;
procedure m66m; begin r_SP:=(r_SP+2) and $FFFF;end;
procedure m67m(a:Integer); begin r_A:=(r_A xor a);end;
procedure m68m; begin m52m; m56m; do_write(r_SP+1,m55m); m51m; end;
procedure m69m; begin r_F:=(r_F and (not f_C)); end;
procedure m70m(a:Integer); begin tmp2:=r_A+a; m08m; m36m(a); m05m; end;
procedure m73m(a:Integer); begin tmp2:=r_A+a; m24m; m08m; m36m(a);end;
procedure m71m(a:Integer); begin m73m(a); m05m; end;
procedure m74m; begin tmp1:=m30m; end;
procedure m75m; begin tmp2:=(r_A-tmp1) and $FF; end;
procedure m76m; begin if (r_A<tmp1) then begin m65m; end; end;
procedure m77m; begin m45m; m19m; end;
procedure m78m; begin m20m; m02m; end;
Function m79m:Boolean;Begin if ((r_F and f_P)<>0) then Result:=True else Result:=False; end;
procedure m80m; begin r_PC:=r_PC+do_read(r_SP+1) shl 8; end;
//procedure m80m; begin r_PC:=r_PC+do_read(r_SP+1) shl 8; end;
procedure m82m; begin m49m; m80m; m66m; m20m; end;
//procedure m82m; begin m49m; m80m; m66m; m20m; end;
procedure m84m(a:Integer); begin r_B:=a; m25m; end;
procedure m85m(a:Integer); begin tmp2:=(a and $FF); end;
begin
{$R-}
r_A:=integer(rgA);r_b:=integer(rgB);r_c:=integer(rgC);r_d:=integer(rgD);
r_e:=integer(rgE);r_H:=integer(rgH);r_L:=integer(rgL);r_F:=integer(rgF);
r_PC:=integer(rgPC);r_SP:=integer(rgSP);
f_S:=integer(fS);f_Z:=integer(fZ);f_5:=integer(f5);f_A:=integer(fA);
f_3:=integer(f3);f_P:=integer(fP);f_1:=integer(f1);f_C:=integer(fC);
clock:=0; tmp1:=0; tmp2:=0; tmp3:=0; //бнулим :-)
while (clock < nb_cycles) do
begin
opcode:=do_read(r_PC);
case opcode of // анализируем текущий код 00 .. FF, меняем значение clock в зависимоти от "длинны" команды ...
// прыгаем по памяти, меняем значения регистров и портов ПРОЦ РАБОТАЕТ !!!!
$00: begin m27m; end;
$F3: begin m27m; end;
$FB: begin m27m; end;
$01: begin r_B:=m28m; r_C:=m29m; m03m; end;
$02: begin do_write2(r_C,r_B,r_A); m31m; end;
$03: begin r_C:=r_C+1; if (r_C>$FF) then begin r_C:=0; r_B:=r_B+1;
if (r_B>$FF) then begin r_B:=0; end; end; m25m; end;
$04: begin m85m(r_B+1); m43m(r_B); r_B:=tmp2; m25m; end;
$05: begin m85m(r_B-1); m43m(r_B); r_B:=tmp2; m25m; end;
$06: begin r_B:=m39m; end;
$07: begin r_A:=r_A SHL 1; if (r_A>$FF) then begin r_A:=r_A or 1; m65m; r_A:= r_A and $FF; end
else begin m69m; end; m27m; end;
$08:m27m; $10: m27m; $18:m27m; $20:m27m; $28:m27m; $30:m27m;$38:m27m;
$09: begin r_L:=r_L+r_C; r_H:=r_H+r_B; if (r_L>$FF) then
begin inc(r_H); r_L:=(r_L and $FF); end;
if (r_H>$FF) then begin r_H:=(r_H and $FF); m13m;
end else begin m69m; end; m34m; end;
$0A: begin r_A:=do_read2(r_C,r_B); m31m; end;
$0B: begin r_C:=r_C-1; if (r_C<0) then begin r_C:=$FF; r_B:=r_B-1;
if (r_B<0) then begin r_B:=$FF; end; end; m25m; end;
$0C: begin m85m(r_C+1); m43m(r_C); r_C:=tmp2; m25m; end;
$0D: begin m85m(r_C-1); m43m(r_C); r_C:=tmp2; m25m; end;
$0E: begin r_C:=m39m; end;
$0F: begin tmp1:=(r_A and 1); r_A:=(r_A shr 1); if (tmp1<>0) then
begin r_A:=(r_A or $80); m13m; end else
begin r_F:=(r_F and ( not f_C)); end; m27m; end;
$11: begin r_D:=m28m; r_E:=m29m; m03m; end;
$12: begin do_write2(r_E,r_D,r_A); m31m; end;
$13: begin r_E:=r_E+1; if (r_E>$FF) then begin r_E:=0; r_D:=r_D+1;
if (r_D>$FF) then begin r_D:=0; end; end; m25m; end;
$14: begin m85m(r_D+1); m43m(r_D); r_D:=tmp2; m25m; end;
$15: begin m85m(r_D-1); m43m(r_D); r_D:=tmp2; m25m; end;
$16: begin r_D:=m39m; end;
$17: begin r_A:=(r_A shl 1); if m57m then
begin r_A:=(r_A or 1); end; if (r_A>$FF) then begin m13m;
r_A:=(r_A and $FF); end else begin m69m; end; m27m; end;
$19: begin r_L:=(r_L + r_E); r_H:=(r_H + r_D); if (r_L>$FF) then
begin inc(r_H); r_L:=(r_L and $FF); end;
if (r_H>$FF) then begin r_H:=(r_H and $FF); m13m;
end else begin r_F:=(r_F and not (f_C)); end; m34m; end;
$1A: begin r_A:=do_read2(r_E,r_D); m31m; end;
$1B: begin r_E:=r_E-1; if (r_E<0) then begin r_E:=$FF; r_D:=r_D-1;
if (r_D<0) then begin r_D:=$FF; end; end; m25m; end;
$1C: begin m85m(r_E+1); m43m(r_E); r_E:=tmp2; m25m; end;
$1D: begin m85m(r_E-1); m43m(r_E); r_E:=tmp2; m25m; end;
$1E: begin r_E:=m39m; end;
$1F: begin tmp1:=(r_A and 1); r_A:=(r_A SHR 1); if m57m then
begin r_A:=(r_A or $80); end; if (tmp1<>0) then begin m13m; end
else begin r_F:=(r_F and not(f_C)); end; m27m; end;
$21: begin r_H:=m28m; r_L:=m29m; m03m; end;
$22: begin m48m; do_write(tmp1,r_L); do_write(tmp1+1,r_H); m22m; m02m; end;
$23: begin r_L:=r_L+1; if (r_L>$FF) then begin r_L:=0; r_H:=r_H+1;
if (r_H>$FF) then begin r_H:=0; end; end; m25m; end;
$24: begin m85m(r_H+1); m43m(r_H); r_H:=tmp2; m25m; end;
$25: begin m85m(r_H-1); m43m(r_H); r_H:=tmp2; m25m; end;
$26: begin r_H:=m39m; end;
$27: begin tmp1:=0; if (((r_F and f_C)<>0) or (r_A>$99)) then
begin tmp1:=(tmp1 or $60); end;
if (((r_F and f_A)<>0) or ((r_A and $0F)>$09)) then begin tmp1:=(tmp1 or $06); end;
tmp2:=r_A+tmp1; m08m; m36m(tmp1); m32m; m04m; m27m; end;
$29: begin r_L:=r_L + r_L; r_H:=r_H + r_H; if (r_L>$FF) then begin
inc(r_H); r_L:=(r_L and $FF); end; if (r_H>$FF) then begin
r_H:=(r_H and $FF); m13m; end else begin m69m; end; m34m; end;
$2A: begin m48m; r_L:=do_read(tmp1); r_H:=do_read(tmp1+1); m22m; m02m; end;
$2B: begin r_L:=r_L-1; if (r_L <0) then begin r_L:=$FF; r_H:=r_H-1;
if (r_H<0) then begin r_H:=$FF; end; end; m18m; m14m; end;
$2C: begin m85m(r_L+1); m43m(r_L); r_L:=tmp2; m25m; end;
$2D: begin m85m(r_L-1); m43m(r_L); r_L:=tmp2; m25m; end;
$2E: begin r_L:=m39m; end;
$2F: begin r_A:=(r_A xor $FF); m27m; end;
$31: begin r_SP:=(m28m shl 8)+m29m; m03m; end;
$32: begin do_write2(m29m,m28m,r_A); m21m; m02m; end;
$33: begin if (r_SP=$FFFF) then begin r_SP:=0; end else begin inc(r_SP); end; m25m; end;
$34: begin m74m; m85m(tmp1+1); m43m(tmp1); m44m(tmp2); m34m; end;
$35: begin m74m; m85m(tmp1-1); m43m(tmp1); m44m(tmp2); m34m; end;
$36: begin m44m(m29m); m19m; m15m; end;
$37: begin m13m; m27m; end;
$39: begin r_L:=(r_L + (r_SP and $FF)); r_H:=(r_H + ((r_SP shr 8) and $FF));
if (r_L>$FF) then begin inc(r_H); r_L:=(r_L and $FF); end;
if (r_H>$FF) then begin r_H:=(r_H and $FF); m13m; end else begin m69m; end; m34m; end;
$3A: begin r_A:=do_read2(m29m,m28m); m21m; m02m; end;
$3B: begin if (r_SP<>0) then begin r_SP:=r_SP-1; end else begin r_SP:=$FFFF; end;
m25m; end;
$3C: begin m85m(r_A+1); m43m(r_A); m06m; m25m; end;
$3D: begin m85m(r_A-1); m43m(r_A); m06m; m25m; end;
$3E: begin r_A:=m39m; end;
$3F: begin r_F:=r_F xor f_C; m27m; end;
$40:m25m;$52:m25m; $5B:m25m; $64:m25m; $6D:m25m; $7F:m25m;
//procedure m84m(a:Integer); begin r_B:=a; m25m; end;
$41: m84m(r_C); $42: m84m(r_D); $43: m84m(r_E); $44: m84m(r_H); $45: m84m(r_L);
$46: r_B:=m38m; $47: m84m(r_A);
$48: begin r_C:=r_B; m25m; end;
$49:m25m;
$4A: begin r_C:=r_D; m25m; end;
$4B: begin r_C:=r_E; m25m; end;
$4C: begin r_C:=r_H; m25m; end;
$4D: begin r_C:=r_L; m25m; end;
$4E: begin r_C:=m38m; end;
$4F: begin r_C:=r_A; m25m; end;
$50: begin r_D:=r_B; m25m; end;
$51: begin r_D:=r_C; m25m; end;
$53: begin r_D:=r_E; m25m; end;
$54: begin r_D:=r_H; m25m; end;
$55: begin r_D:=r_L; m25m; end;
$56: begin r_D:=m38m; end;
$57: begin r_D:=r_A; m25m; end;
$58: begin r_E:=r_B; m25m; end;
$59: begin r_E:=r_C; m25m; end;
$5A: begin r_E:=r_D; m25m; end;
$5C: begin r_E:=r_H; m25m; end;
$5D: begin r_E:=r_L; m25m; end;
$5E: begin r_E:=m38m; end;
$5F: begin r_E:=r_A; m25m; end;
$60: begin r_H:=r_B; m25m; end;
$61: begin r_H:=r_C; m25m; end;
$62: begin r_H:=r_D; m25m; end;
$63: begin r_H:=r_E; m25m; end;
$65: begin r_H:=r_L; m25m; end;
$66: begin r_H:=m38m; end;
$67: begin r_H:=r_A; m25m; end;
$68: begin r_L:=r_B; m25m; end;
$69: begin r_L:=r_C; m25m; end;
$6A: begin r_L:=r_D; m25m; end;
$6B: begin r_L:=r_E; m25m; end;
$6C: begin r_L:=r_H; m25m; end;
$6E: begin r_L:=m38m; end;
$6F: begin r_L:=r_A; m25m; end;
$70: begin m44m(r_B); m31m; end;
$71: begin m44m(r_C); m31m; end;
$72: begin m44m(r_D); m31m; end;
$73: begin m44m(r_E); m31m; end;
$74: begin m44m(r_H); m31m; end;
$75: begin m44m(r_L); m31m; end;
$76: begin m27m; end;
$77: begin m44m(r_A); m31m; end;
$78: begin r_A:=r_B; m25m; end;
$79: begin r_A:=r_C; m25m; end;
$7A: begin r_A:=r_D; m25m; end;
$7B: begin r_A:=r_E; m25m; end;
$7C: begin r_A:=r_H; m25m; end;
$7D: begin r_A:=r_L; m25m; end;
$7E: begin r_A:=m38m; end;
$80: begin tmp2:=r_A+r_B; m08m; m36m(r_B); m32m; r_A:=(tmp2 and $FF); m27m; end;
$81:m70m(r_C);$82:m70m(r_D);$83:m70m(r_E);$84:m70m(r_H);$85:m70m(r_L);
$86: begin m74m; tmp2:=r_A+tmp1; m08m; m36m(tmp1); m32m; m04m; m31m; end;
$87: m70m(r_A);
$88:m71m(r_B); $89:m71m(r_C); $8A:m71m(r_D);$8B:m71m(r_E);
$8C: begin m73m(r_H); if (tmp2>$FF) then begin m65m; end; m04m; m27m; end;
$8D:m71m(r_L);
$8E: begin m74m; m73m(tmp1); m32m; m04m; m31m; end;
$8F:m71m(r_A); $90:m40m(r_B); $91:m40m(r_C);$92:m40m(r_D); $93:m40m(r_E); $94:m40m(r_H);
$95: begin m85m(r_A-r_L); m09m; if (r_A<r_L) then begin m65m; end; m36m(r_L); m35m; end;
$96: begin m74m; m75m; m09m; if (r_A<tmp1) then begin m13m; end; m36m(tmp1); m06m; m31m; end;
$97: begin m10m; r_A:=0; m27m; end;
$98: m41m(r_B);$99: m41m(r_C);$9A: m41m(r_D);$9B: m41m(r_E);$9C: m41m(r_H);$9D: m41m(r_L);
$9E: begin m74m; if m57m then tmp3:=1 else tmp3:=0;
m85m(r_A-tmp1-tmp3); m09m; if (r_A<tmp1+tmp3) then begin m13m; end;
m36m(tmp1); m06m; m31m; end;
$9F: begin if m57m then tmp2:=$FF else tmp2:=0; m09m; if (tmp2<>0) then
begin r_F:=r_F or (f_A or f_C); end; m35m; end;
$A0: begin m61m(r_B); m26m; end;
$A1: begin m61m(r_C); m26m; end;
$A2: begin m61m(r_D); m26m; end;
$A3: begin m61m(r_E); m26m; end;
$A4: begin m61m(r_H); m26m; end;
$A5: begin m61m(r_L); m26m; end;
$A6: begin m74m; m61m(tmp1); m11m; m31m; end;
$A7: begin m61m(r_A); m26m; end;
$A8: begin m67m(r_B); m26m; end;
$A9: begin m67m(r_C); m26m; end;
$AA: begin m67m(r_D); m26m; end;
$AB: begin m67m(r_E); m26m; end;
$AC: begin m67m(r_H); m26m; end;
$AD: begin m67m(r_L); m26m; end;
$AE: begin m74m; m67m(tmp1); m11m; m17m; m14m; end; $AF: begin r_A:=0; m26m; end;
$B0: begin m64m(r_B); m26m; end;
$B1: begin m64m(r_C); m26m; end;
$B2: begin m64m(r_D); m26m; end;
$B3: begin m64m(r_E); m26m; end;
$B4: begin m64m(r_H); m26m; end;
$B5: begin m64m(r_L); m26m; end;
$B6: begin m74m; m64m(tmp1); m11m; m31m; end;
$B7: begin m64m(r_A); m26m; end;
$B8:m63m(r_b); $B9:m63m(r_c); $BA:m63m(r_d); $BB:m63m(r_e); $BC:m63m(r_h);$BD:m63m(r_l);
$BE: begin m74m; m75m; m09m; if (r_A<tmp1) then begin m13m; end; m36m(tmp1); m31m; end;
$BF: begin m10m; m27m; end;
$C0: begin if ((r_F and f_Z)<>0) then begin m25m; end else begin m82m; end; end;
$C1: begin r_C:=do_read(r_SP); r_B:=do_read(r_SP+1); m66m; m34m; end;
$C2: begin if ((r_F and f_Z)<>0) then begin m03m; end
else begin r_PC:=m29m+((m28m shl 8)); m19m; end; end;
$C3: begin r_PC:=m29m+((m28m shl 8)); m19m; end;
$C4: begin if ((r_F and f_Z)<>0) then begin m78m; end else
begin tmp1:=m29m+((m28m shl 8)); m50m; m02m; m56m; do_write(r_SP+1,m55m); m51m; end; end;
$C5: begin m50m; do_write(r_SP,r_C); do_write(r_SP+1,r_B); m20m; m14m; end;
$C6: begin m47m; tmp2:=r_A+tmp1; m08m; m36m(tmp1);
if (tmp2>$FF) then begin m65m; end; m04m; m33m; end;
$C7: begin m50m; m14m; m56m; do_write(r_SP+1,m55m); r_PC:=0*8; m20m; end;
$C8: begin if m60m then begin m25m; end else begin m82m; end; end;
$C9: begin m82m; end;
$CA: begin if m60m then begin m03m; end else begin m77m; end; end;
$CB: m77m;
$CC: begin if m60m then begin m78m; end else m68m; end;
$CD: m68m;
$CE: begin m47m; m73m(tmp1); if (tmp2>$FF) then begin m65m; end; m04m; m33m; end;
$CF: begin m50m; m14m; m56m; do_write(r_SP+1,m55m); r_PC:=1*8; m20m; end;
$D0: begin if m57m then begin m25m; end else begin m82m; end end;
$D1: begin r_E:=do_read(r_SP); r_D:=do_read(r_SP+1); m66m; m34m; end;
$D2: begin if m57m then begin m03m; end else begin m77m; end; end;
$D3: begin do_output(m29m,r_A); m19m; m15m; end;
$D4: begin if m57m then begin m78m; end else begin m68m; end; end;
$D5: begin m50m; do_write(r_SP,r_E); do_write(r_SP+1,r_D); m20m; m14m; end;
$D6: begin m47m; m75m; m09m; m76m; m36m(tmp1); m06m; m33m; end;
$D7: begin m50m; m14m; m56m; do_write(r_SP+1,m55m); r_PC:=2*8; m20m; end;
$D8: begin if m59m then begin m25m; end else begin m82m; end; end;
$D9: begin begin m82m; end; end;
$DA: begin if m59m then begin m03m; end else begin m77m; end; end;
$DB: begin r_A:=do_input(m29m); m19m; m15m; end;
$DC: begin if m59m then begin m78m; end else begin m68m; end; end;
$DD: m68m;$ED: m68m;$FD: m68m;
$DE: begin m47m; if m57m then tmp3:=1 else tmp3:=0;
m85m(r_A-tmp1-tmp3); m09m; if (r_A<tmp1+tmp3) then begin
m65m; end; m36m(tmp1); m06m; m33m; end;
$DF: begin m50m; m14m; m56m; do_write(r_SP+1,m55m); r_PC:=3*8; m20m; end;
$E0: begin if m79m then begin m25m; end else begin m82m; end ; end;
$E1: begin r_L:=do_read(r_SP); r_H:=do_read(r_SP+1); m66m; m34m; end;
$E2: begin if m79m then begin m03m; end else begin m77m; end; end;
$E3: begin tmp1:=do_read(r_SP); do_write(r_SP,r_L); r_L:=tmp1;
tmp1:=do_read(r_SP+1); do_write(r_SP+1,r_H); r_H:=tmp1; clock:=clock+18; m14m; end;
$E4: begin if m79m then begin m78m; end else begin m68m; end; end;
$E5: begin m50m; do_write(r_SP,r_L); do_write(r_SP+1,r_H); m20m; m14m; end;
$E6: begin m61m(m29m); m11m; m33m; end;
$E7: begin m50m; m14m; m56m; do_write(r_SP+1,m55m); r_PC:=4*8; m20m; end;
$E8: begin if m58m then begin m25m; end else begin m82m; end; end;
$E9: begin r_PC:=(r_H shl 8)+r_L; m18m; end;
$EA: begin if m58m then begin m03m; end else begin m77m; end; end;
$EB: begin tmp1:=r_D; r_D:=r_H; r_H:=tmp1; tmp1:=r_E; r_E:=r_L; r_L:=tmp1; m16m; m14m; end;
$EC: begin if m58m then begin m78m; end else begin m68m; end; end;
$EE: begin r_A:= r_A xor m29m; m11m; m33m; end;
$EF: begin m50m; m14m; m56m; do_write(r_SP+1,m55m); r_PC:=5*8; m20m; end;
$F0: begin if m53m then begin m25m; end else begin m82m; end; end;
$F1: begin r_F:=do_read(r_SP); r_A:=do_read(r_SP+1); m66m; m34m; end;
$F2: begin if m53m then begin m03m; end else begin m77m; end; end;
$F4: begin if m53m then begin m78m; end else begin m68m; end; end;
$F5: begin m50m; do_write(r_SP,r_F); do_write(r_SP+1,r_A); m20m; m14m; end;
$F6: begin m64m(m29m); m11m; m33m; end;
$F7: begin m50m; m14m; m56m; do_write(r_SP+1,m55m); r_PC:=6*8; m20m; end;
$F8: begin if m54m then begin m25m; end else begin m82m; end; end;
$F9: begin r_SP:=(r_H shl 8)+r_L; m25m; end;
$FA: begin if m54m then begin m03m; end else begin m77m; end; end;
$FC: begin if m54m then begin m78m; end else begin m68m; end; end;
$FE: begin m47m; m75m; m09m; m76m; m36m(tmp1); m17m; m15m; end;
$FF: begin m50m; m14m; m56m; do_write(r_SP+1,m55m); r_PC:=7*8; m20m; end
end;
end;
rgA:=Cardinal(r_A);rgB:=Cardinal(r_b);rgC:=Cardinal(r_c);rgD:=Cardinal(r_d);
rgE:=Cardinal(r_e);rgH:=Cardinal(r_H);rgL:=Cardinal(r_L);rgF:=Cardinal(r_F);
rgPC:=Cardinal(r_PC);rgSP:=Cardinal(r_SP);
fS:=Cardinal(f_S);fZ:=Cardinal(f_Z);f5:=Cardinal(f_5);fA:=Cardinal(f_A);
f3:=Cardinal(f_3);fP:=Cardinal(f_P);f1:=Cardinal(f_1);fC:=Cardinal(f_C);
{$R+}
end;
procedure TMainForm.draw_screen1;
Begin
{$R-}
//if FullScreen1.Checked then // на весь экран или нет
MainForm.Canvas.StretchDraw(rect(0,0,MainForm.Width-0,MainForm.Height-30), gamecanvas)
//else
//MainForm.Canvas.Draw(0,0,gamecanvas);
{$R+}
end;
//function col_index(port : Cardinal; color : Cardinal): Cardinal; // колор в зависимоти от порта С
var col_index_port,col_index_color,col_index_result:cardinal;
procedure TMainForm.col_index;
Var port,color,result_:Cardinal;
begin
{$R-}
port:=col_index_port; color:=col_index_color;
Result_:=LVColBlack;
if ((port and $40)<>0) then Result_:= (Result_ xor LVColBlue);
if ((port and $20)<>0) then Result_:= (Result_ xor LVColLime);
if ((port and $10)<>0) then Result_:= (Result_ xor LVColRed);
// case color of
if color = LVColBlack then
begin
if ((port and $08)=0) then
begin Result_:= (Result_ xor LVColRed); end;
if ((port and $04)=0) then
begin Result_:= (Result_ xor LVColBlue); end;
end else
if color = LVColLime then begin Result_:= (Result_ xor LVColLime); end else
if color = LVColRed then begin Result_:= (Result_ xor LVColRed);
if ((port and $02)=0) then
begin Result_:= (Result_ xor LVColLime); end; end else
if color = LVColBlue then begin Result_:= (Result_ xor LVColBlue);
if ((port and $01)=0) then
begin Result_:= (Result_ xor LVColRed); end; end;
col_index_result:=result_;
{$R+}
end;
var My_col_inp,My_col_result:Cardinal;
Procedure TMainForm.My_col2;
var inp,result:Cardinal;
begin
{$R-}
inp:=My_col_inp;
if inp=0 then My_col_result:=LVColBlack else
if inp=1 then My_col_result:=LVColLime else
if inp=2 then My_col_result:=LVColBlue else
if inp=3 then My_col_result:=LVColRed else
{$R+}
end;
var SupCol2_c1,SupCol2_b,SupCol2_x:Cardinal;
var SupCol2_Result:Cardinal;
Procedure TMainForm.SupCol2;
Var c1,b,x,_Result:Cardinal;
pix:Cardinal;
begin
{$R-}
c1:=SupCol2_c1; b:=SupCol2_b; x:=SupCol2_x; pix:=0;
case x of
1: begin
if (b and 128)=128 then pix:=pix+1;
if (b and 8)=8 then pix:=pix+2;
end;
2: begin
if (b and 64)=64 then pix:=pix+1;
if (b and 4)=4 then pix:=pix+2;
end;
3: begin
if (b and 32)=32 then pix:=pix+1;
if (b and 2)=2 then pix:=pix+2;
end;
4: begin
if (b and 16)=16 then pix:=pix+1;
if (b and 1)=1 then pix:=pix+2;
end;
end;
col_index_port:=c1;
My_Col_inp:=pix;My_Col2;
col_index_color:=My_col_result;
col_index;SupCol2_Result:=col_index_result;
{$R+}
end;
var draw_screen2_i:Cardinal;
procedure TMainForm.draw_screen2; //Рисуем с video на экран (Форму)
var vertX,gorY : Cardinal;
begin
vertX:= (draw_screen2_i mod 64)*4; gorY:=(draw_screen2_i div 64)*1;
Rports_a:=$C1;Rports;
SupCol2_c1:=Rports_result;Rvideo_a:=draw_screen2_i;Rvideo;
SupCol2_b:=Rvideo_result;
SupCol2_x:=1;SupCol2;
gamecanvas.Canvas.Pixels[vertX,gorY]:= SupCol2_Result;
SupCol2_x:=2;SupCol2;
gamecanvas.Canvas.Pixels[vertX+1,gorY]:=SupCol2_Result;
SupCol2_x:=3;SupCol2;
gamecanvas.Canvas.Pixels[vertX+2,gorY]:=SupCol2_Result;
SupCol2_x:=4;SupCol2;
gamecanvas.Canvas.Pixels[vertX+3,gorY]:=SupCol2_Result;
end;
procedure TMainForm.draw_screen; //Рисуем с video на экран (Форму)
var i:Cardinal;
begin
{$R-}
for i:=0 to $3fff do begin
Rvideo_a:=i;Rvideo;
RVideoDirty_a:=i;RVideoDirty;
if Rvideo_Result<>RVideoDirty_Result then //сравниваем значения , а есть ли изменения
begin
draw_screen2_i:=i; draw_screen2;
Rvideo_a:=i;Rvideo;
WVideoDirty_a:=i; WVideoDirty_b:=Rvideo_Result;WVideoDirty;
end;
end;
draw_screen1;
{$R+}
end;
procedure TMainForm.FirstPusk; //первый запуск
begin
// создадим канву для рисования
gamecanvas:=tbitmap.Create;
gamecanvas.Width:=256;
gamecanvas.Height:=256;
ResetComp; // первоночальный сброс всего
TimerMain.Enabled:=true; // запускаем основной таймер
end;
function TMainForm.readmask (keynum: word): word; // маска клавы
begin
result:= $72FF;
case keynum of
8: begin result:= $23FF end; // BCK
13: begin result:= $13FF end; // ENTER
16: begin result:= $70FF end; // SHIFT
32: begin result:= $30FF end; // SPC
37: begin result:= $FF32 end; // <-
38: begin result:= $FF31 end; // UP
39: begin result:= $FF30 end; // ->
40: begin result:= $FF33 end; // DOWN
48: begin result:= $06FF end; // 0
49: begin result:= $47FF end; // 1
50: begin result:= $46FF end; // 2
51: begin result:= $45FF end; // 3
52: begin result:= $44FF end; // 4
53: begin result:= $43FF end; // 5
54: begin result:= $00FF end; // 6
55: begin result:= $01FF end; // 7
56: begin result:= $02FF end; // 8
57: begin result:= $07FF end; // 9
65: begin result:= $64FF end; // A
66: begin result:= $31FF end; // B
67: begin result:= $57FF end; // C
68: begin result:= $27FF end; // D
69: begin result:= $54FF end; // E
70: begin result:= $67FF end; // F
71: begin result:= $10FF end; // G
72: begin result:= $16FF end; // H
73: begin result:= $75FF end; // I
74: begin result:= $52FF end; // J
75: begin result:= $55FF end; // K
76: begin result:= $22FF end; // L
77: begin result:= $76FF end; // M
78: begin result:= $53FF end; // N
79: begin result:= $21FF end; // O
80: begin result:= $63FF end; // P
81: begin result:= $71FF end; // Q
82: begin result:= $20FF end; // R
83: begin result:= $77FF end; // S
84: begin result:= $74FF end; // T
85: begin result:= $56FF end; // U
86: begin result:= $26FF end; // V
87: begin result:= $65FF end; // W
88: begin result:= $73FF end; // X
89: begin result:= $66FF end; // Y
90: begin result:= $17FF end; // Z
107: begin result:= $05FF end; // =/+ -> =/-
109: begin result:= $05FF end; // -/_ -> =/-
114: begin result:= $FF23 end; // F3
115: begin result:= $FF22 end; // F4
116: begin result:= $FF21 end; // F5
36: begin result:= $FF20 end; // Home
219: begin result:= $11FF end; // [
221: begin result:= $12FF end; // ]
190: begin result:= $24FF end; // .
188: begin result:= $37FF end; // ,
192: begin result:= $72FF end; //
end;
end;
procedure TMainForm.FormActivate(Sender: TObject);
begin
if FPusk then // а это первый ли запуск
begin
FPusk:=false;
FirstPusk;
end;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
DragAcceptFiles(MainForm.Handle, true); // сделаем драг анд дроб :)
FPusk:=true; // запомним первый запуск
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
DragAcceptFiles(Handle, False);
end;
procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word; //опрос клавы
Shift: TShiftState);
begin
kbd(readmask(key),true); // нажали
// i8080_do_opcodes(opcodes_to_run);
end;
procedure TMainForm.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
kbd(readmask(key),false); // отпустии
end;
procedure TMainForm.TimerMainTimer(Sender: TObject); // основной таймер
var j,a: word;i: integer;s: string;
begin
//if (pause) then begin exit; end; // если пауза курим бамбук :)
i8080_do_opcodes(opcodes_to_run);
draw_screen;
end;
procedure TMainForm.ResetComp;
begin
// rgB := 0; rgC := 0; rgD := 0; rgE := 0; rgH := 0; rgL := 0; rgA := 0; rgF := 0;
// rgPC := 0; rgSP := 0;
// pause := false;
// fS := (1 SHL 7); fZ :=( 1 SHL 6); f5 := (1 SHL 5); fA := (1 SHL 4); f3 := (1 SHL 3);
// fP := (1 SHL 2); f1 := (1 SHL 1); fC := (1 SHL 0);
BasicStack := $AFC1; BasicHotEntry := $02FD; BasicProgBegin := $0243; BasicProgEnd := $0245;
fillcharVideoDirty;
//i8080_init;
// reset1();
// load_bios();
//rgPC:=$C000;
// i8080_do_opcodes(0);
TimerMain.Interval:=(1000 div FPS);
end;
procedure TMainForm.ResetCPU1Click(Sender: TObject);
begin
ResetComp;
end;
end.
Вы здесь » Середовище програмування MADL » КР-580 » SAS Emulator. ВихКод. FASM