; _____________________________________________ ; | | ; | Project: APPLER | ; | File: DEBUG.ASM | ; | Compiler: 16-bit TASM (2.5) | ; | | ; | Subject: Appler Debugger | ; | | ; | Author: Emil Dotchevski | ; |_____________________________________________| include GLOBALS.INC include INTERFAC.INC include CONIO.INC include FM.INC G_COMMAND_ENTRY = 00h G_NewA = 01h G_NewX = 02h G_NewY = 03h G_NewS = 04h G_NewP = 05h G_NewPC = 06h G_Registers = 07h G_MiniAsm = 08h G_EditB = 09h G_EditA = 0Ah G_Disasm = 0Bh G_DumpB = 0Ch G_DumpA = 0Dh G_Limits = 0Eh G_Find = 0Fh G_Copy = 10h G_Compare = 11h G_Breaks = 12h G_Go = 13h G_LoadLab = 14h G_SaveLab = 15h G_DefineLab = 16h G_LabList = 17h G_DelLab = 18h G_LabOnOff = 19h G_SwapOnOff = 1Ah G_Calculate = 1Bh G_ResetApple = 1Ch G_MoveHelp = 1Dh G_PrintDump = 1Eh G_PrintAssembler = 1Fh Debug segment public assume DS:Apple,ES:Emulate,CS:Debug,SS:Data GetLineBuf db 100 dup (0) GetLineParams GL_ParamStruc ScreenIOParams SIO_ParamStruc <1,Debug,0,0,offset Screen,seg Screen,1,0,1,1> GetKeyParams RK_ParamStruc <1,GK_Fkey,1,Alt_Key,0,T_WaitKey,ShowAll,offset FirstMsg> DebugOutInit proc far cli push ax ds es mov ax,Apple mov ds,ax mov ax,Emulate mov es,ax mov al,ds:[0C000h] mov es:[C000],al call AppleKeysOn call SetRegisters pop es ds ax ret DebugOutInit endp DebugInInit proc far cli push ax cx ds es mov ax,Apple mov ds,ax mov ax,Emulate mov es,ax xor al,al xchg al,es:C000 mov ds:[0C000h],al call GetRegisters assume ds:CONio mov ax,CONio mov ds,ax mov GL_ParamsOfs, offset GetLineParams mov GL_ParamsSeg, seg GetLineParams mov SIO_ParamsOfs, offset ScreenIOParams mov SIO_ParamsSeg, seg ScreenIOParams mov RK_ParamsOfs, offset GetKeyParams mov RK_ParamsSeg, seg GetKeyParams call DebugKeysOn call UnsetBreaks cmp cs:ViewFlag,0 jz DII_Ret mov ah,0Fh int 10h cmp al,3 jne DII_Ret mov al,C050 ScreenIOservice _SetScreen DII_Ret: pop es ds cx ax sti ret DebugInInit endp assume DS:Apple,ES:Emulate,CS:Debug GoWhere? dw G_COMMAND_ENTRY ShowAll? db 1 DebugMainRet: call DebugInit BigLoop: mov ch,cs:GetLineParams.GL_BegPrint mov cl,cs:GetLineParams.GL_Pos mov di,cs:GoWhere? shl di,1 mov cs:ShowAll?,1 mov cs:GoWhere?,G_COMMAND_ENTRY push ds es call cs:CmndAddress[di] pop es ds cmp cs:ShowAll?,0 jz BL_DontShowAll mov cs:SM_Dec?,1 call ShowAll mov cs:SM_Dec?,0 mov cs:GetLineParams.GL_Pos,cl mov cs:GetLineParams.GL_BegPrint,ch BL_DontShowAll: jmp BigLoop CommandEntry: mov cs:GetLineParams.GL_Color,0Bh mov cs:GetLineParams.GL_Error, offset UnknownCmd mov cs:GetLineParams.GL_BegScan,offset MainCommands mov cs:GetLineParams.GL_ENDScan,offset ENDScan1 mov cs:ActiveFlags,0000000000000001b mov cs:ShowAllNumber,0 mov cs:GetLineParams.GL_GS_SpcFl,1 cmp cs:MinHelpPtr,8 je CE_01 mov ax,8 mov bx,42 call SH_Choose CE_01: gotoxy 17,1 GetLineService _GETLINE jc CE_Ret0 GetLineService _GetCommand jc CommandEntry inc di mov cs:GoWhere?,di mov cs:ShowAll?,0 jmp CE_Ret CE_Ret0: GetLineService _GL_CLRBUFF CE_Ret: ret CmndAddress dw CommandEntry dw NewA, NewX, NewY, NewS, NewP, NewPC, Registers dw MiniAsm, EditB, EditA, Disasm, DumpB, DumpA dw Limits, Find, Copy, Compare, Breaks, Go dw LoadLab, SaveLab dw DefineLab, LabList, DelLab, LabOnOff, SwapOnOff dw Calculate, ResetApple, MoveHelp dw PrintDump,PrintAssembler,SoundOnOff dw RecordStart,RecordStop,RecordPlay dw LoadRec, SaveRec ; ******************************************************************* ; ** ** ; ** ** ; ** COMMANDS ROUTINES ** ; ** ** ; ** ** ; ******************************************************************* ; -- Registers change commands --------- NewA: mov di,0 jmp RegModify NewX: mov di,1 jmp RegModify NewY: mov di,2 jmp RegModify NewS: mov di,3 jmp RegModify NewP: mov di,4 jmp RegModify NewPC: mov di,5 jmp RegModify REG_StoreCX dw 0 REG_Current dw 0 REG_CurrentSVD dw 0 REG_CH db 3 REG_Subrt dw REG_Flags, REG_A, REG_X, REG_Y, REG_P, REG_S, REG_PC Registers: mov cs:ScreenIOparams.CursorColor,40h mov cs:ShowAllNumber,4 mov ax,77 mov bx,77 call SH_Choose mov ax,cs:REG_CurrentSVD mov cs:REG_Current,ax mov ch,cs:REG_CH mov cs:ActiveFlags,0000000000000100b REG_Loop: mov bx,cs:REG_Current shl bx,1 call cs:REG_Subrt[bx] or al,al jz REG_Loop mov cs:REG_CH,ch mov ax,cs:REG_Current mov cs:REG_CurrentSVD,ax GetLineService _GL_ClrBuff ret REG_A: lea bx,cs:Regs.A clc jmp RegsEdit REG_X: lea bx,cs:Regs.X clc jmp RegsEdit REG_Y: lea bx,cs:Regs.Y clc jmp RegsEdit REG_P: lea bx,cs:Regs.P clc jmp RegsEdit REG_S: lea bx,cs:Regs.S clc jmp RegsEdit REG_PC: lea bx,cs:Regs.PC stc jmp RegsEdit RF_Commands db 07h,08h,05h,06h,20h db 18h,0Ch RF_ComSubrt dw REG_Up, REG_Down, RF_Left,RF_Right,RF_Flip dw REG_Enter,REG_Esc RF_CL db 24h RF_BL db 10000000b REG_Flags: mov cl,cs:RF_CL mov bl,cs:RF_BL mov cs:ScreenIOparams.CursorLen,1 RF_Loop0: call ReadKey push cx mov di,offset RF_Commands mov cx,offset RF_ComSubrt - offset RF_Commands call CalcCommand pop cx jc RF_Loop0 shl di,1 call word ptr cs:RF_ComSubrt[di] jnc RF_Loop0 mov cs:RF_BL,bl mov cs:RF_CL,cl ret RF_Left: rol bl,1 dec cl cmp cl,24h jae RF_Lret mov cl,2Bh RF_Lret: clc ret RF_Right: ror bl,1 inc cl cmp cl,2Bh jbe RF_Rret mov cl,24h RF_Rret: clc ret RF_Flip: xor cs:Regs.P,bl ret RE_Commands db '0123456789abcdef' db 07h,08h,18h,0Ch RE_ComSubrt dw RE_Num,RE_Num,RE_Num,RE_Num,RE_Num,RE_Num,RE_Num,RE_Num dw RE_Num,RE_Num,RE_Num,RE_Num,RE_Num,RE_Num,RE_Num,RE_Num dw REG_Up, REG_Down,REG_Enter,REG_Esc RE_FirstTime? db 1 RegsEdit: mov cs:ScreenIOparams.CursorLen,4 mov dl,0 jnc RE_ok0 inc dl mov cs:ScreenIOparams.CursorLen,6 RE_ok0: mov cl,39 RE_Loop0: call ReadKey push cx mov di,offset RE_Commands mov cx,offset RE_ComSubrt - offset RE_Commands call CalcCommand pop cx jc RE_Loop0 shl di,1 call word ptr cs:RE_ComSubrt[di] jnc RE_Loop0 ret RE_Num: shr di,1 mov ax,di or dl,dl jnz RE_NumWord cmp cs:RE_FirstTime?,0 jz RE_NumByte_1 mov byte ptr cs:[bx],0 RE_NumByte_1: shl byte ptr cs:[bx],4 or byte ptr cs:[bx],al jmp RE_NumRet RE_NumWord: call StopAnimate cmp cs:RE_FirstTime?,0 jz RE_NumWord_1 mov word ptr cs:[bx],0 RE_NumWord_1: shl word ptr cs:[bx],4 or word ptr cs:[bx],ax RE_NumRet: clc mov cs:RE_FirstTime?,0 ret REG_Up: dec cs:REG_Current jns REG_UpRet mov cs:REG_Current,6 REG_UpRet: mov ax,cs:REG_Current mov ch,al add ch,3 xor al,al stc mov cs:RE_FirstTime?,1 ret REG_Enter: REG_Down: inc cs:REG_Current cmp cs:REG_Current,6 jbe REG_DownRet mov cs:REG_Current,0 REG_DownRet: mov ax,cs:REG_Current mov ch,al add ch,3 xor al,al stc mov cs:RE_FirstTime?,1 ret REG_Esc: mov cs:ScreenIOparams.CursorLen,1 mov al,0FFh stc mov cs:RE_FirstTime?,1 ret R_StoreCX dw ? RegModify: GetLineService _GL_GetSymb or al,al jz R_Error4 cmp al,'=' jne R_Error3 mov cs:R_StoreCX,cx call GetAddress cmp di,5 jne R_2 mov cs:Regs.PC,ax GetLineService _GL_ClrBuff ret R_2: cmp ah,0 jnz R_Error2 mov byte ptr cs:Regs.[di],al GetLineService _GL_ClrBuff ret R_Error2: mov cs:GetKeyParams.RK_ErrPtr,offset IllegalNum mov cx,cs:R_StoreCX inc cl ret R_Error4: inc cl R_Error3: mov cs:GetKeyParams.RK_ErrPtr,offset EqualMess ret ; -- Assembler ------------------------- BuffDisasm: test cs:Mini_Flag,1 jz BD_ret push cx si mov cs:CalcFlag,0 mov si,cs:AssembAdr GetLineService _GL_ClrBuff mov cs:ScreenIOparams.SP_BufFlag,1 gotoxy 1Ah,2 ; Unvisible call OneInstr mov cs:ScreenIOparams.SP_BufFlag,0 mov cs:GetLineParams.GL_Pos,0 mov cs:GetLineParams.GL_BegPrint,0 pop si cx BD_ret: ret MA_StoreCX dw ? MA_il db 3 dup (?) MA_ad dw 3 dup (?) MINI_Instr dw ? Mini_Flag db 0 MiniAsm: GetLineService _GL_GetSymb dec cl or al,al jz MINI111 call GetAddress mov cs:AssembAdr,ax MINI111: mov cs:GetLineParams.GL_MaxPrint,0Eh mov cs:GetLineParams.GL_Color,1Bh mov cs:GetLineParams.GL_Error,offset BadInstr mov cs:GetLineParams.GL_BegScan,offset AsmInstr mov cs:GetLineParams.GL_ENDScan,offset ENDScan2 call StopAnimate mov cs:FkeysBuffer[1*size FkeyStruc].FkeyFlag,0 call ShowPrevIns mov cs:ShowAllNumber,3 mov ax,52 mov bx,52 call SH_Choose mov byte ptr cs:Mini_Flag,1 mov cs:ActiveFlags,0000000000000010b MINI00: call BuffDisasm MINI0001: gotoxy 4,11h mov cs:ScreenIOParams.CursorLen,1 GetLineService _GetLine jnc MINI0002 jmp MINIret MINI0002: GetLineService _GetCommand jc MINI0001 mov cs:MINI_instr,di mov si,cs:AssembAdr xor di,di MINI000: mov al,[si] xor bx,bx mov bl,al mov al,cs:InstrLongTbl[bx] and al,00000011b mov cs:MA_il[di],al mov bx,di shl bx,1 mov cs:MA_ad[bx],si xor bx,bx mov bl,al add si,bx inc di cmp di,3 jb MINI000 call MA_Assemble dec cl mov cs:GetLineParams.GL_Pos,cl mov cs:GetLineParams.GL_BegPrint,ch jc MINI0001 xor di,di xor ax,ax sub bx,cs:AssembAdr MINI_loop0: add al,cs:MA_il[di] inc di cmp bl,al je MINI_ok1 ja MINI_loop0 xor ah,ah mov bh,ah sub ax,bx shl di,1 mov bx,cs:MA_ad[di] sub bx,ax MINI_loop1: mov byte ptr [bx],0EAh inc bx dec ax jnz MINI_Loop1 MINI_ok1: call DOWN call ShowProgram jmp MINI00 MINIret: call InitGetLine mov byte ptr cs:Mini_Flag,0 mov cs:FkeysBuffer[1*size FkeyStruc].FkeyFlag,1 GetLineService _GL_ClrBuff ret MA_Assemble: mov dh,byte ptr cs:MINI_Instr mov dl,12 mov al,dh mul dl mov bx,ax xor dl,dl mov cl,cs:GetLineParams.GL_Pos mov ch,cs:GetLineParams.GL_BegPrint mov cs:MA_StoreCX,cx GetLineService _GL_GetSymb or al,al jz MA_OkAdrs cmp al,'#' je MA_Direct cmp al,'(' jne MA_Error1 jmp MA_Indirect MA_Error1: dec cl jmp MA_Full MA_OkAdrs: mov dl,cs:AsmTab1[bx] cmp dl,0FFh je MA_Error0 mov bx,cs:AssembAdr mov [bx],dl inc bx jmp MA_ret MA_Error0: inc cl MA_Error: mov cs:GetKeyParams.RK_ErrPtr,offset BadInstr stc ret MA_ret: GetLineService _GL_ClrBuff clc ret MA_Direct: mov dl,cs:AsmTab1[bx+1] cmp dl,0FFh je MA_Error0 GetLineService _GL_GetSymb mov cs:MA_StoreCX,cx dec cl or al,al jz MA_DirectE mov cs:MA_StoreCX,cx call GetAddress cmp ah,0 jz MA_ok1122 MA_DirectE: mov cx,cs:MA_StoreCX inc cl jmp MA_Error MA_ok1122: mov bx,cs:AssembAdr mov [bx],dl inc bx mov [bx],al inc bx jmp MA_Ret MA_Full: mov cx,cs:MA_StoreCX GetLineService _GL_GetSymb or al,al jz MA_Error0 dec cl call GetAddress dec cl cmp dh,35 jb MA_ESD1 cmp dh,44 jnb MA_ESD1 jmp MA_Branches MA_ESD1: push ax GetLineService _GL_GetSymb cmp al,',' jne MA_RealyFul GetLineService _GL_GetSymb or al,20h cmp al,'x' je MA_FullX cmp al,'y' pop ax jne MA_QWERTY jmp MA_FullY MA_QWERTY: jmp MA_Error MA_RealyFul: pop ax cmp ah,0 jz MA_TryZP MA_NoZP: mov dl,cs:AsmTab1[bx+5] cmp dl,0FFh jne MA_FullOK1 mov cx,cs:MA_StoreCX jmp MA_Error0 MA_FullOK1: mov bx,cs:AssembAdr mov [bx],dl inc bx mov [bx],ax inc bx inc bx jmp MA_ret MA_TryZP: mov dl,cs:AsmTab1[bx+2] cmp dl,0FFh je MA_NoZP mov bx,cs:AssembAdr mov [bx],dl inc bx mov [bx],al inc bx jmp MA_ret MA_FullX: pop ax cmp ah,0 jz MA_TryZP1 MA_NoZP1: mov dl,cs:AsmTab1[bx+6] cmp dl,0FFh jne MA_FullOK2 mov cx,cs:MA_StoreCX jmp MA_Error0 MA_FullOK2: mov bx,cs:AssembAdr mov [bx],dl inc bx mov [bx],ax inc bx inc bx jmp MA_ret MA_TryZP1: mov dl,cs:AsmTab1[bx+3] cmp dl,0FFh je MA_NoZP1 mov bx,cs:AssembAdr mov [bx],dl inc bx mov [bx],al inc bx jmp MA_ret MA_FullY: cmp ah,0 jz MA_TryZP2 MA_NoZP2: mov dl,cs:AsmTab1[bx+7] cmp dl,0FFh jne MA_FullOK3 mov cx,cs:MA_StoreCX jmp MA_Error0 MA_FullOK3: mov bx,cs:AssembAdr mov [bx],dl inc bx mov [bx],ax inc bx inc bx jmp MA_ret MA_TryZP2: mov dl,cs:AsmTab1[bx+4] cmp dl,0FFh je MA_NoZP2 mov bx,cs:AssembAdr mov [bx],dl inc bx mov [bx],al inc bx jmp MA_ret MA_Indirect: mov cs:MA_StoreCX,cx GetLineService _GL_GetSymb mov cx,cs:MA_StoreCX or al,al jnz MA_IndOK33 jmp MA_Error MA_IndOK33: cmp dh,44 jne MA_NoIndJmp jmp MA_IndJMP MA_NoIndJmp: mov cs:MA_StoreCX,cx call GetAddress dec cl push ax GetLineService _GL_GetSymb or al,al jnz MA_IndOK2 pop ax jmp MA_Error MA_IndOK2: cmp al,')' je MA_IndY cmp al,',' je MA_IndX pop ax mov cx,cs:MA_StoreCX jmp MA_Error MA_IndY: GetLineService _GL_GetSymb or al,al jz MA_65C02_ind cmp al,',' je MA_IndY1 pop ax jmp MA_Error MA_IndY1: GetLineService _GL_GetSymb or al,20h cmp al,'y' je MA_IndY2 pop ax jmp MA_Error MA_IndY2: pop ax cmp ah,0 jz MA_IndY21 MA_65C02_indER: mov cx,cs:MA_StoreCX inc cl jmp MA_Error MA_IndY21: mov dl,cs:AsmTab1[bx+9] MA_65C02_indOK: cmp dl,0FFh jne MA_IndY3 mov cx,cs:MA_StoreCX jmp MA_Error0 MA_IndY3: mov bx,cs:AssembAdr mov [bx],dl inc bx mov [bx],al inc bx jmp MA_ret MA_65C02_ind: pop ax cmp ah,0 jnz MA_65C02_indER mov dl,cs:AsmTab1[bx+10] jmp MA_65C02_indOK MA_IndX: GetLineService _GL_GetSymb or al,20h cmp al,'x' je MA_IndX2 pop ax jmp MA_Error MA_IndX2: pop ax cmp ah,0 jz MA_IndX21 mov cx,cs:MA_StoreCX inc cl jmp MA_Error MA_IndX21: mov dl,cs:AsmTab1[bx+8] cmp dl,0FFh jne MA_IndX3 mov cx,cs:MA_StoreCX jmp MA_Error0 MA_IndX3: mov bx,cs:AssembAdr mov [bx],dl inc bx mov [bx],al inc bx jmp MA_ret MA_IndJMP: call GetAddress mov bx,cs:AssembAdr mov dl,6Ch push ax dec cl GetLineService _GL_GETSYMB cmp al,')' jz MA_IndJMP6C cmp al,',' jne MA_IndJMP_ER GetLineService _GL_GETSYMB or al,20h cmp al,'x' jne MA_IndJMP_ER mov dl,7Ch MA_IndJMP6C: pop ax mov [bx],dl inc bx mov [bx],ax inc bx inc bx jmp MA_ret MA_IndJMP_ER: dec cl MA_IndJMP_ER1: pop ax jmp MA_Error0 MA_Branches: push bx mov bx,cs:AssembAdr add bx,2 sub ax,bx rcl dh,1 ror dh,1 adc ah,0 jnz MA_err xor dh,al shl dh,1 jnc MA_noerr MA_err: pop bx mov cx,cs:MA_StoreCX inc cl inc cl jmp MA_Error MA_noerr: pop bx mov dl,cs:AsmTab1[bx+5] mov bx,cs:AssembAdr mov [bx],dl inc bx mov [bx],al inc bx jmp MA_ret BufferA db 64 dup (?) InitBufferA: push cx si di es mov si,cs mov es,si mov si,SDA_Address mov di,offset BufferA mov cx,64 cld rep movsb pop es di si cx ret BufferB db 64 dup (?) InitBufferB: push cx si di es mov si,cs mov es,si mov si,SDB_Address mov di,offset BufferB mov cx,64 cld rep movsb pop es di si cx ret ; -- Memory Edit B --------------------- MemoryEditStruc struc EB_TextOrHex db ? EB_TextCL2 db ? EB_TextCL1 db ? EB_TextCH db ? EB_FirstFl db ? EB_Address dw ? EB_MinUp db ? EB_MaxDown db ? EB_MinLeft1 db ? EB_MinLeft2 db ? EB_MaxRight1 db ? EB_MaxRight2 db ? EB_Center db ? EB_BytesInLine dw ? EB_MemAdr dw ? EB_InitBuffProc dw ? EB_TabFlag db ? MemoryEditStruc ends EB_Flag db 0 EB_Params MemoryEditStruc <0,8,61,20,0,0,20,23,8,61,54,77,29,16,offset SDB_Address,InitBufferB,1> EditB: mov cs:EB_ParamsAddr, offset EB_Params mov cs:ActiveFlags,0000000001000000b mov cs:ShowAllNumber,2 mov ax,68 mov bx,68 call SH_Choose mov cs:EB_Flag,1 call MemoryEditor mov cs:EB_Flag,0 ret ; -- Memory Edit A --------------------- EA_Params MemoryEditStruc <0,54,0,9,0,0,9,16,54,0,75,0FFh,0FFh,8,offset SDA_Address,InitBufferA,0> EditA: mov cs:EB_ParamsAddr, offset EA_Params mov cs:ActiveFlags,0000000000100000b mov cs:ShowAllNumber,1 mov ax,61 mov bx,61 call SH_Choose mov cs:EB_Flag,0 call MemoryEditor mov cs:EB_Flag,1 ret ; -- Disassembler ---------------------- Disasm: call GetAddress call StopAnimate mov cs:AssembAdr,ax call ShowPrevIns GetLineService _GL_ClrBuff ret ; -- Dump B ---------------------------- DumpB: call GetAddress mov cs:SDB_Address,ax call InitBufferB mov si,offset EB_Params call EB_Init GetLineService _GL_ClrBuff ret ; -- Dump A ---------------------------- DumpA: call GetAddress mov cs:SDA_Address,ax call InitBufferA mov si,offset EA_Params call EB_Init GetLineService _GL_ClrBuff ret ; -- Limits ---------------------------- LeftLimit dw 0 ; '[' command RightLimit dw 0BFFFh Limits: GetLineService _GL_GetSymb or al,al jnz LI_ok1 GetLineService _GL_ClrBuff mov al,'[' GetLineService _GL_Symbol mov al,' ' GetLineService _GL_Symbol mov al,byte ptr cs:LeftLimit[1] GetLineService _GL_Byte mov al,byte ptr cs:LeftLimit GetLineService _GL_Byte mov al,',' GetLineService _GL_Symbol mov al,byte ptr cs:RightLimit[1] GetLineService _GL_Byte mov al,byte ptr cs:RightLimit GetLineService _GL_Byte mov al,']' GetLineService _GL_Symbol mov cl,cs:GetLineParams.GL_Pos mov ch,cs:GetLineParams.GL_BegPrint ret LI_ok1: cmp al,']' je LI_End cmp al,',' je LI_Second dec cl call GetAddress mov cs:LeftLimit,ax LI_Second: GetLineService _GL_GetSymb or al,al jz LI_End cmp al,']' je LI_End dec cl call GetAddress mov cs:RightLimit,ax LI_End: mov ax,cs:LeftLimit cmp ax,cs:RightLimit ja LI_NoOk GetLineService _GL_ClrBuff ret LI_NoOk: mov cs:GetKeyParams.RK_ErrPtr,offset AdressError inc cl ret ; -- Find ------------------------------ FindBuffer db 256 dup (0) F_LastAdr dw 0 F_BufPtr db 0 TextFlag db 0 F_StoreCX dw 0 F_StoreCX1 dw 0 F_StoreCX2 dw 0 F_or db 0 F_si dw 0 F_Err1: mov cs:GetKeyParams.RK_ErrPtr,offset NoStringMes inc cl ret F_Err2: mov cs:GetKeyParams.RK_ErrPtr,offset ByteExpMes mov cx,cs:F_StoreCX2 mov cs:F_BufPtr,0 inc cl ret Find: mov dl,cs:GetLineParams.GL_GS_SpcFl ; 'F' command GetLineService _GL_GetSymb cmp cs:F_BufPtr,0 jnz F_FindNext or al,al jz F_Err1 F_FindNext: or al,al jnz F_New mov si,cs:F_LastAdr inc si mov cs:F_si,si jmp F_Go_0 F_New: dec cl xor ax,ax mov cs:TextFlag,al mov cs:F_BufPtr,al mov cs:F_or,al F_0: GetLineService _GL_GetSymb or al,al jnz F_0000 jmp f_Go F_0000: cmp al,27h ; ' jne F_str_0 mov byte ptr cs:F_or,0 jmp F_str F_Str_0: cmp al,'"' jne F_1 mov byte ptr cs:F_or,80h F_str: xor byte ptr cs:TextFlag,0FFh mov byte ptr cs:GetLineParams.GL_GS_SpcFl,0 jnz F_0 mov byte ptr cs:GetLineParams.GL_GS_SpcFl,1 GetLineService _GL_GetSymb cmp al,',' je F_0 dec cl jmp F_0 F_1: cmp byte ptr cs:TextFlag,0 jnz F_1_1 dec cl mov cs:F_StoreCX2,cx call GetAddress or ah,ah jz F_1_1_1 jmp F_Err2 F_1_1: or al,cs:F_or F_1_1_1: xor bx,bx mov bl,cs:F_BufPtr mov cs:FindBuffer[bx],al inc byte ptr cs:F_BufPtr jmp F_0 F_Go: mov si,cs:LeftLimit mov cs:F_si,si F_Go_0: push cs pop es jmp F_Go_000 F_Go_00: inc word ptr cs:F_si jz F_NotFound F_Go_000: mov si,cs:F_si cmp si,cs:RightLimit ja F_NotFound mov di,offset FindBuffer xor cx,cx mov cl,cs:F_BufPtr rep cmpsb jne F_Go_00 mov si,cs:F_si mov cs:SDB_Address,si call InitBufferB mov cs:F_LastAdr,si mov si,offset EB_Params call EB_Init mov cs:GetLineParams.GL_GS_SpcFl,dl GetLineService _GL_ClrBuff jmp F_ret F_NotFound: mov cs:GetKeyParams.RK_ErrPtr,offset NotFound mov cs:GetLineParams.GL_GS_SpcFl,dl mov cl,cs:GetLineParams.GL_Pos mov ch,cs:GetLineParams.GL_BegPrint inc cl F_ret: ret ; -- Copy ------------------------------ Copy: call GetAddress push ax GetLineService _GL_GetSymb or al,al jnz C_1 pop ax push ax cmp ax,cs:LeftLimit jb C_Forward stc jmp C_01 C_Forward: clc jmp C_01 C_1: call Upcase cmp al,'f' clc je C_01 cmp al,'b' jne C_Error stc C_01: pop ax push es push ds pop es pushf mov di,ax mov si,cs:LeftLimit mov cx,cs:RightLimit sub cx,si inc cx popf cld jnc C_DoCopy mov si,cs:RightLimit add di,cx dec di std C_DoCopy: rep movsb pop es cld GetLineService _GL_ClrBuff ret C_Error: pop ax GetLineService _GL_Left mov cs:GetKeyParams.RK_ErrPtr,offset BadParam ret ; -- Compare --------------------------- Compare: call GetAddress push es push ds pop es mov di,ax mov si,cs:LeftLimit mov cx,cs:RightLimit sub cx,si inc cx cld repe cmpsb pop es pushf GetLineService _GL_ClrBuff inc cl popf mov cs:GetKeyParams.RK_ErrPtr,offset Identifical je O_Ident mov cs:GetKeyParams.RK_ErrPtr,offset NotIdent dec di mov cs:SDB_Address,di call InitBufferB mov si,offset EB_Params call EB_Init O_Ident: ret ; -- Breaks ---------------------------- Breaks: GetLineService _GL_GetSymb ; 'B' command or al,al jnz B_ok1 B_Err: inc cl B_Err1: mov cs:GetKeyParams.RK_ErrPtr,offset BreakNumMES ret B_ok1: dec cl GetLineService _GL_GetSymb sub al,'0' cmp al,6 ja B_Err1 cmp al,1 jb B_Err1 mov bl,7 mul bl mov bx,ax GetLineService _GL_GetSymb or al,al jnz B_ok2 xor cs:Breakpoints.[bx].BP_ActiveFlag,1 GetLineService _GL_ClrBuff ret B_ok2: cmp al,'=' je B_ok3 mov cs:GetKeyParams.RK_ErrPtr,offset EqualMess ret B_ok3: call GetAddress mov cs:Breakpoints[bx].BP_ActiveFlag,1 mov cs:Breakpoints[bx].BP_Address,ax GetLineService _GL_ClrBuff ret ; -- Go -------------------------------- Go: mov bx,cs:AssembAdr ; 'G' command GetLineService _GL_GetSymb or al,al jz GO_1 cmp al,',' je Go_SecAdr dec cl call GetAddress mov bx,ax dec cl GetLineService _GL_GetSymb or al,al jz GO_1 cmp al,',' jne GO_1 Go_SecAdr: mov cs:Regs.PC,bx call GetAddress mov cs:Breakpoints.BP_ActiveFlag,1 mov cs:Breakpoints.BP_Address,ax call GoAppleII mov cs:Breakpoints.BP_ActiveFlag,0 GetLineService _GL_ClrBuff ret GO_1: mov cs:Regs.PC,bx mov cs:Breakpoints.BP_ActiveFlag,0 call GoAppleII0 GetLineService _GL_ClrBuff ret ; -- Load Labels ----------------------- LoadLab: GetLineService _GL_GetSymb ; 'LL' command dec cl or al,al jnz LL_E0 GetLineService _GL_ClrBuff mov bx,offset Com_LLabels GetLineService _GL_String mov al,' ' GetLineService _GL_Symbol mov bx,offset LAB_FileSpec GetLineService _GL_String GetLineService _GL_Home xor ch,ch mov cl,4 mov cs:GetKeyParams.RK_ErrPtr,offset LS_EnterMes1 ret LL_E0: mov byte ptr cs:LS_OpenFileF,3Dh mov byte ptr cs:LS_RWfileF,3Fh mov word ptr cs:LS_ErrPtr,offset LabErrMes_L mov word ptr cs:LS_OkPtr,offset LabMes_L mov word ptr cs:LS_FileSpec,offset LAB_FileSpec mov word ptr cs:LS_Ext,offset LAB_Ext mov word ptr cs:LS_Buffer,offset SymbMem mov word ptr cs:LS_BufferLen,MaxSymbMem * 2 + 4 jmp File_LS ; -- Save Labels ----------------------- LAB_FileSpec db 'UNTITLED.LAB', 67 dup (0) LAB_Ext db '.LAB',0 SL_ErrFuck: mov cs:GetKeyParams.RK_ErrPtr,offset SymNoSymbErr GetLineService _GL_End mov cl,cs:GetLineParams.GL_Pos mov ch,cs:GetLineParams.GL_BegPrint inc cl ret SaveLab: cmp cs:SymbPtr,0 ; 'SL' command jz SL_ErrFuck GetLineService _GL_GetSymb dec cl or al,al jnz SL_E0 GetLineService _GL_ClrBuff mov bx,offset Com_SLabels GetLineService _GL_String mov al,' ' GetLineService _GL_Symbol mov bx,offset LAB_FileSpec GetLineService _GL_String GetLineService _GL_Home xor ch,ch mov cl,4 mov cs:GetKeyParams.RK_ErrPtr,offset LS_EnterMes2 ret SL_E0: mov byte ptr cs:LS_OpenFileF,3Ch mov byte ptr cs:LS_RWfileF,40h mov word ptr cs:LS_ErrPtr,offset LabErrMes_S mov word ptr cs:LS_OkPtr,offset LabMes_S mov word ptr cs:LS_FileSpec,offset LAB_FileSpec mov word ptr cs:LS_Ext,offset LAB_Ext mov word ptr cs:LS_Buffer,offset SymbMem mov word ptr cs:LS_BufferLen,MaxSymbMem * 2 + 4 jmp File_LS ; -- Define Label ---------------------- MaxSymbMem = 1000h MaxValCount = MaxSymbMem / 2 even ; Don't touch! SymbMem db MaxSymbMem dup (0) SymbPtr dw 0 SymbVal dw MaxValCount dup (0) SymbValPtr dw 0 DefineLab: call SymbGetVal jc SD_NewSymb mov bx,cs:SGV_adr mov cx,cs:SGV_cx GetLineService _GL_GetSymb or al,al jz SD_EqMiss cmp al,'=' jne SD_EqMiss1 call GetAddress mov cs:SymbVal[bx],ax jmp SD_ret SD_NewSymb: GetLineService _GL_GetSymb or al,al jz SD_SymMiss push cx mov di,offset Delimiters mov cx,Delimiters_C call CalcCommand pop cx jnc SD_SymMiss1 dec cl mov bx,cs:SymbPtr SD_Loop0: GetLineService _GL_GetSymb cmp al,'=' je SD_Cont1 or al,al jz SD_EqMiss push cx mov di,offset Delimiters mov cx,Delimiters_C call CalcCommand pop cx jnc SD_EqMiss1 mov cs:SymbMem[bx],al inc bx cmp bx,MaxSymbMem jb SD_Loop0 mov cs:GetKeyParams.RK_ErrPtr,offset SymNoMemErr ret SD_EqMiss: inc cl SD_EqMiss1: mov cs:GetKeyParams.RK_ErrPtr,offset EqualMess ret SD_SymMiss: inc cl SD_SymMiss1: mov cs:GetKeyParams.RK_ErrPtr,offset SymMissErr ret SD_Cont1: call GetAddress mov word ptr cs:SymbMem[bx],0 inc bx mov cs:SymbPtr,bx mov si,cs:SymbValPtr shl si,1 mov cs:SymbVal[si],ax inc word ptr cs:SymbValPtr SD_ret: mov cs:GetKeyParams.RK_ErrPtr,0 call ShowPrevIns GetLineService _GL_ClrBuff ret ; -- Labels List ----------------------- LL_Commands db 7,8,3,4,0Ch,18h LL_Procs dw LL_Up,LL_Down,LL_PgUp,LL_PgDn,LL_Esc,LL_Enter LabList: cmp cs:SymbPtr,0 ; 'list' command jnz LL_NoError jmp LL_Error1 LL_NoError: mov ax,85 mov bx,85 call SH_Choose mov cs:SL_Flag,1 mov cs:ShowAllNumber,6 mov cs:ActiveFlags,0000000100000000b mov cs:SL_Ptr,0 LL_Loop: call ReadKey mov cx,offset LL_Procs- offset LL_Commands mov di,offset LL_Commands call CalcCommand jc LL_Loop shl di,1 call cs:LL_Procs[di] jnc LL_Loop LL_Ret: mov cs:SL_Flag,0 GetLineService _GL_ClrBuff ret LL_Up: cmp cs:SL_Ptr,0 jz LL_UpRet dec cs:SL_Ptr LL_UpRet: clc ret LL_Down: mov ax,cs:SL_Ptr add ax,10 cmp ax,cs:SymbValPtr jae LL_DownRet inc cs:SL_Ptr LL_DownRet: clc ret LL_PgUp: mov di,10 LL_PgUpLoop: call LL_Up dec di jnz LL_PgUpLoop clc ret LL_PgDn: mov di,10 LL_PgDnLoop: call LL_Down dec di jnz LL_PgDnLoop clc ret LL_Esc: LL_Enter: stc ret LL_Error1: mov cs:GetKeyParams.RK_ErrPtr,offset SymNoSymbErr inc cl ret ; -- Delete Label ---------------------- SD_Error1: mov cs:GetKeyParams.RK_ErrPtr,offset SymMissErr SD_Error2: inc cl ret DelLab: GetLineService _GL_GetSymb or al,al jz SD_Error1 cmp al,'.' je SDel_1 dec cl SDel_1: call SymbGetVal jc SD_Error2 mov si,offset SymbMem mov di,si add si,cs:SGV_nameEnd add di,cs:SGV_nameBeg inc si push ds mov ax,cs mov ds,ax mov es,ax mov cx,cs:SymbPtr sub cx,cs:SGV_nameEnd inc cx cld rep movsb mov si,offset SymbVal add si,cs:SGV_adr mov di,si add si,2 mov cx,cs:SymbValPtr shl cx,1 sub cx,cs:SGV_adr dec cx rep movsb pop ds dec word ptr cs:SymbValPtr mov cx,cs:SGV_nameEnd sub cx,cs:SGV_nameBeg inc cx sub cs:SymbPtr,cx mov bx,cs:SymbPtr mov word ptr cs:SymbMem[bx],0 call ShowPrevIns GetLineService _GL_ClrBuff SDel_ret: ret ; -- Labels ON/OFF --------------------- LabOnOff: call OnOff jc LOO_ret mov byte ptr cs:WordPrintFl,1 jnz LOO_ret0 mov byte ptr cs:WordPrintFl,0 LOO_ret0: call ShowPrevIns GetLineService _GL_ClrBuff LOO_ret: ret ; -- Swap ON/OFF ----------------------- SwapOnOff: call GetAddress mov cs:SwapTime,ax GetLineService _GL_ClrBuff ret ; -- Evaluate expression --------------- CalcCom db 'h$d@b%' CalcSub dw CalcHex,CalcHex,CalcHex,CalcDec,CalcDec,CalcBin,CalcBin CalcNum dw ? Calculate: call GetAddress mov cs:CalcNum,ax GetLineService _GL_GetSymb or al,al mov di,0 jz CalcOk1 push cx mov di,offset CalcCom mov cx,offset CalcSub - offset CalcCom call CalcCommand pop cx jc CalcError inc di shl di,1 CalcOk1: mov bx,cs:CalcNum GetLineService _GL_ClrBuff mov al,' ' GetLineService _GL_Symbol mov GetLineParams.GL_InsFlag,1 call word ptr cs:CalcSub[di] xor cx,cx cmp cs:GetKeyParams.RK_ErrPtr,cx jz CalcRet inc cl CalcRet: ret CalcError: mov cs:GetKeyParams.RK_ErrPtr,offset BadParam ret CalcHex: mov al,bh GetLineService _GL_Byte mov al,bl GetLineService _GL_Byte ret CalcBin: mov al,'%' GetLineService _GL_Symbol mov dx,1 or bx,bx clc jz CalcB1 mov dx,10h CalcB0: dec dx shl bx,1 jnc CalcB0 inc dx jmp CalcB1 CalcBinLoop: shl bx,1 CalcB1: mov al,'0' jnc CalcB2 mov al,'1' CalcB2: GetLineService _GL_Symbol dec dx jnz CalcBinLoop CalcB3: ret CalcDec: mov al,'@' GetLineService _GL_Symbol or bx,bx jz CalcD0000 CalcDdiv: xor dx,dx CalcD0: inc dx sub bx,10 jnc CalcD0 add bx,10 dec dx mov ax,bx mov bx,dx add ax,'0' GetLineService _GL_Symbol GetLineService _GL_Left cmp dx,0 jnz CalcDdiv ret CalcD0000: mov al,'0' GetLineService _GL_Symbol ret ; -- Cold RESET Apple ][ --------------- ResetApple: call ResetAppleII mov ax,ds:[0FFFCh] mov cs:Regs.PC,ax mov cs:AssembAdr,ax call StopAnimate call ShowPrevIns xor al,al mov cs:Regs.A,al mov cs:Regs.X,al mov cs:Regs.Y,al mov cs:Regs.S,al mov cs:Regs.P,20h GetLineService _GL_ClrBuff ret ; -- Move Help Window ------------------ MH_Keys db 7,8,5,6,1,2,3,4,19h,0Ch,18h MH_Subrt dw MH_Up,MH_Down,MH_Left,MH_Right dw MH_Home,MH_End,MH_PgUp,MH_PgDn,MH_Cntr dw MH_Esc,MH_Enter MH_CX dw ? MH_OldSH_CX dw ? MoveHelp: test cs:HelpFlag,1 jnz MH_ok jmp MH_HelpClosed MH_ok: push cs:ShowAllNumber mov cs:ShowAllNumber,5 mov cs:MH_CX,cx mov ax,cs:SH_CX mov cs:MH_OldSH_CX,ax mov dx,1 xchg cs:HelpPtr,dx call SH_Calculate mov cs:ActiveFlags,0000000010000000b xor ax,ax mov cs:FkeysBuffer[7*size FkeyStruc].FkeyFlag,al mov cs:FkeysBuffer[8*size FkeyStruc].FkeyFlag,al mov cs:FkeysBuffer[9*size FkeyStruc].FkeyFlag,al mov cs:ScreenIOparams.CursorFlag,0 MH_Loop0: mov cx,cs:MH_CX call ReadKey mov di,offset MH_Keys mov cx,offset MH_Subrt- offset MH_Keys call CalcCommand jc MH_Loop0 shl di,1 call cs:MH_Subrt[di] jnc MH_Loop0 mov cs:HelpPtr,dx call SH_Calculate mov al,1 mov cs:FkeysBuffer[7*size FkeyStruc].FkeyFlag,al mov cs:FkeysBuffer[8*size FkeyStruc].FkeyFlag,al mov cs:FkeysBuffer[9*size FkeyStruc].FkeyFlag,al mov cs:ScreenIOparams.CursorFlag,1 pop cs:ShowAllNumber GetLineService _GL_ClrBuff MH_HelpClosed: ret MH_Up: mov cx,cs:SH_CX ScreenIOservice _CALCXY cmp ch,1 je MH_UpRet sub cs:SH_CX,80*2 MH_UpRet: clc ret MH_Down: mov cx,cs:SH_CX ScreenIOservice _CALCXY cmp ch,12 je MH_DownRet add cs:SH_CX,80*2 MH_DownRet: clc ret MH_Left: mov cx,cs:SH_CX ScreenIOservice _CALCXY cmp cl,0 je MH_LeftRet sub cs:SH_CX,2 MH_LeftRet: clc ret MH_Right: mov cx,cs:SH_CX ScreenIOservice _CALCXY cmp cl,43 je MH_RightRet add cs:SH_CX,2 MH_RightRet: clc ret MH_Home: mov cs:SH_CX,0 clc ret MH_End: mov cs:SH_CX,6E0h clc ret MH_PgUp: mov cs:SH_CX,56h clc ret MH_PgDn: mov cs:SH_CX,736h clc ret MH_Cntr: mov cs:SH_CX,3EAh clc ret MH_Esc: ; mov ax,cs:MH_OldSH_CX ; mov cs:SH_CX,ax MH_Enter: stc ret ; -- Print Memory Dump ----------------- PD_PrnFileSpec db 'PRN',0 PD_FileSpec db 79 dup (0) PD_Title db ' Appler Debugger Print Out -- Apple ][ Memory Dump',0Dh,0Ah db '--------------------------------------------------------------------------',0Dh,0Ah PD_Line db 80 dup (0) PD_Handle dw ? PD_ddl db ? PD_Error_J: jmp PD_Error PrintDump: GetLineService _GL_GetSymb dec cl mov dx,offset PD_PrnFileSpec or al,al jz PD_1 xor bx,bx PD_Loop0: GetLineService _GL_GetSymb mov cs:PD_FileSpec[bx],al inc bx cmp bx,79 je PD_LoopOK or al,al jnz PD_Loop0 PD_LoopOK: mov dx,offset PD_FileSpec PD_1: mov GetKeyParams.RK_ErrPtr,offset PrintingMes call Prepare4DOS push ds push cs pop ds xor cx,cx mov ah,3Ch int 21h jc PD_Error_J mov cs:PD_Handle,ax mov dx,offset PD_Title mov cx,139 mov bx,ax mov ah,40h int 21h jc PD_Error_J pop ds push ds mov bx,cs:LeftLimit mov cx,cs:RightLimit sub cx,bx inc cx cld jmp PD_NewLine1 PD_NewLine: call PD_PrintLine jc PD_Error_J PD_NewLine1: call PD_ClearLine xor dl,dl mov dh,58 mov al,bh call PD_PrintByte mov al,bl call PD_PrintByte mov al,':' call PD_PrintSymbol mov al,' ' call PD_PrintSymbol mov cs:PD_ddl,8 jmp PD_NL PD_PrintLoop: mov al,bl and al,00001111b jz PD_NewLine PD_NL: mov al,ds:[bx] inc bx call PD_PrintByte xchg dl,dh xor ah,ah mov di,ax shl di,1 mov al,byte ptr ss:TextChars[di] cmp al,0DBh jne PD_2 mov al,20h PD_2: call PD_PrintSymbol xchg dl,dh PD_Space: mov al,' ' call PD_PrintSymbol dec cs:PD_ddl jz PD_Space loop PD_PrintLoop call PD_PrintLine jc PD_Error mov bx,cs:PD_Handle mov ah,3Eh int 21h jc PD_Error mov GetKeyParams.RK_ErrPtr,offset PrintOkMes GetLineService _GL_ClrBuff clc PD_Ret: pop ds call SOD4eraperP ret PD_Error: mov GetKeyParams.RK_ErrPtr,offset PrintErrMes mov ch,cs:GetLineParams.GL_BegPrint mov cl,cs:GetLineParams.GL_Pos inc cl stc jmp PD_Ret ; -- Print Assembler ------------------- PA_Title db ' Appler Debugger Print Out',0Dh,0Ah db ' 65C02 Disassebler',0Dh,0Ah db '---------------------------------',0Dh,0Ah PA_Title1 db 0Dh,0Ah,' Defined Labels List',0Dh,0Ah db '---------------------------------',0Dh,0Ah PA_Error_J: jmp PA_Error PrintAssembler: GetLineService _GL_GetSymb dec cl mov dx,offset PD_PrnFileSpec or al,al jz PA_1 xor bx,bx PA_Loop0: GetLineService _GL_GetSymb mov cs:PD_FileSpec[bx],al inc bx cmp bx,79 je PA_LoopOK or al,al jnz PA_Loop0 PA_LoopOK: mov dx,offset PD_FileSpec PA_1: mov GetKeyParams.RK_ErrPtr,offset PrintingMes call Prepare4DOS push ds push cs pop ds xor cx,cx mov ah,3Ch int 21h jc PA_Error_J mov cs:PD_Handle,ax mov dx,offset PA_Title mov cx,93 mov bx,ax mov ah,40h int 21h jc PA_Error_J pop ds push ds mov si,cs:LeftLimit PA_Loop1: call PD_ClearLine gotoxy 1Ah,2 ; Unvisible mov dx,si call OneInstr mov cx,29 call PD_GetScreen call PD_PrintLine jc PA_Error_J cmp dx,si ja PA_Exit cmp si,cs:RightLimit jbe PA_Loop1 PA_Exit: cmp cs:SymbPtr,0 jz PA_NoLabs push cs pop ds mov dx,offset PA_Title1 mov cx,65 mov bx,PD_Handle mov ah,40h int 21h jc PA_Error pop ds push ds xor bx,bx mov si,bx mov dx,28 PA_ShowLabLoop: call PD_ClearLine gotoxy 1Ah,2 call PrintSymbol gotoxy 1Ah,30 mov al,'=' ScreenIOservice _SYMBPRINT mov al,byte ptr cs:SymbVal[si+1] ScreenIOservice _BYTEPRINT mov al,byte ptr cs:SymbVal[si] ScreenIOservice _BYTEPRINT mov cx,33 call PD_GetScreen call PD_PrintLine add si,2 inc bx cmp bx,cs:SymbValPtr jb PA_ShowLabLoop PA_NoLabs: mov bx,cs:PD_Handle mov ah,3Eh int 21h jc PA_Error mov GetKeyParams.RK_ErrPtr,offset PrintAsmOkMes GetLineService _GL_ClrBuff clc PA_Ret: pop ds call SOD4eraperP ret PA_Error: mov GetKeyParams.RK_ErrPtr,offset PrintAsmErrMes mov ch,cs:GetLineParams.GL_BegPrint mov cl,cs:GetLineParams.GL_Pos inc cl stc jmp PD_Ret PD_GetScreen: push si ds es mov ax,seg Screen mov ds,ax mov si,offset Screen + 25*80*2 + 4 push cs pop es mov di,offset PD_Line cld PD_GS_MoveLoop: lodsw stosb loop PD_GS_MoveLoop pop es ds si ret PD_ClearLine: push ax cx di es push cs pop es mov di,offset PD_Line mov al,' ' mov cx,80 cld rep stosb mov cx,seg Screen mov es,cx mov di,offset Screen + 25*80*2 mov cx,70*2 rep stosb pop es di cx ax ret PL_cr db 0Dh,0Ah PD_PrintLine: push ax bx cx dx ds push cs pop ds mov bx,offset PD_Line + 79 mov cx,80 PD_PL_Loop: cmp byte ptr cs:[bx],' ' jne PD_PL_Cont dec bx dec cx jnz PD_PL_Loop PD_PL_Cont: mov bx,cs:PD_Handle mov dx,offset PD_Line mov ah,40h int 21h jc PD_PL_Err cmp ax,cx jne PD_PL_Err mov dx,offset PL_cr mov cx,2 mov ah,40h int 21h jc PD_PL_Err cmp ax,cx jne PD_PL_Err clc PD_PL_Ret: pop ds dx cx bx ax ret PD_PL_Err: stc jmp PD_PL_Ret PD_PrintByte: push ax bx dx xor bx,bx mov bl,dl mov dx,ax shr al,4 cmp al,0Ah cmc adc al,30h daa mov cs:PD_Line[bx],al mov al,dl and al,00001111b cmp al,0Ah cmc adc al,30h daa mov cs:PD_Line+1[bx],al mov dl,bl pop dx bx ax add dl,2 ret PD_PrintSymbol: push bx xor bx,bx mov bl,dl mov cs:PD_Line[bx],al inc dl pop bx ret ; -- Sound ON/OFF ---------------------- SoundOnOff: call OnOff jc SOO_ret mov ax,offset C030r mov bx,offset C030w jnz SOO_go mov ax,offset C020r mov bx,offset C020w SOO_go: push es mov cx,ss mov es,cx mov cx,16 mov di,offset C0xxRead + 2*30h cld rep stosw mov ax,bx mov cx,16 mov di,offset C0xxWrite + 2*30h rep stosw pop es call ShowPrevIns GetLineService _GL_ClrBuff SOO_ret: ret RecordLen equ 1000h db 0 RecordBuffer dw RecordLen dup (0) REC_Realtime db 0 ; -- Start Recording ------------------- RecordStart: GetLineService _GL_GetSymb call Upcase or al,al jz RS_ok cmp al,'f' je RS_ok mov cs:GetKeyParams.RK_ErrPtr,offset BadParam ret RS_ok: mov cs:REC_Realtime,al push es push cs pop es mov di,offset RecordBuffer - 1 mov cx,RecordLen - 2 call StartRecord pop es GetLineService _GL_ClrBuff ; call GoAppleII0 ret ; -- Stop Recording -------------------- RecordStop: call StopRecord mov cs:GetKeyParams.RK_ErrPtr,offset RecPlayedMes or cx,cx jz RS_1 cmp cx,RecordLen - 2 je RS_1 mov cs:GetKeyParams.RK_ErrPtr,offset RecordedMes RS_1: cmp cs:REC_Realtime,0 jz RS_xit push es push cs pop es mov di,offset RecordBuffer + 1 mov cx,RecordLen mov al,1 cld RS_Loop: stosb inc di loop RS_Loop pop es RS_xit: GetLineService _GL_ClrBuff ret ; -- Play Recording -------------------- RecordPlay: GetLineService _GL_GetSymb dec cl or al,al jz RP_Play call LoadRec RP_Play: push ds push cs pop ds mov si,offset RecordBuffer clc call SimKbdRq pop ds GetLineService _GL_ClrBuff ; call GoAppleII0 ret ; -- Load Record ----------------------- LoadRec: GetLineService _GL_GetSymb ; 'LR' command dec cl or al,al jnz LR_E0 GetLineService _GL_ClrBuff mov bx,offset Com_LRecord GetLineService _GL_String mov al,' ' GetLineService _GL_Symbol mov bx,offset REC_FileSpec GetLineService _GL_String GetLineService _GL_Home xor ch,ch mov cl,4 mov cs:GetKeyParams.RK_ErrPtr,offset LR_EnterMes1 ret LR_E0: mov byte ptr cs:LS_OpenFileF,3Dh mov byte ptr cs:LS_RWfileF,3Fh mov word ptr cs:LS_ErrPtr,offset RecErrMes_L mov word ptr cs:LS_OkPtr,offset RecMes_L mov word ptr cs:LS_FileSpec,offset REC_FileSpec mov word ptr cs:LS_Ext,offset REC_Ext mov word ptr cs:LS_Buffer,offset RecordBuffer mov word ptr cs:LS_BufferLen,RecordLen * 2 jmp File_LS ; -- Save Record ----------------------- REC_FileSpec db 'UNTITLED.REC', 67 dup (0) REC_Ext db '.REC',0 SaveRec: GetLineService _GL_GetSymb dec cl or al,al jnz SR_E0 GetLineService _GL_ClrBuff mov bx,offset Com_SRecord GetLineService _GL_String mov al,' ' GetLineService _GL_Symbol mov bx,offset REC_FileSpec GetLineService _GL_String GetLineService _GL_Home xor ch,ch mov cl,4 mov cs:GetKeyParams.RK_ErrPtr,offset SR_EnterMes2 ret SR_E0: mov byte ptr cs:LS_OpenFileF,3Ch mov byte ptr cs:LS_RWfileF,40h mov word ptr cs:LS_ErrPtr,offset RecErrMes_S mov word ptr cs:LS_OkPtr,offset RecMes_S mov word ptr cs:LS_FileSpec,offset REC_FileSpec mov word ptr cs:LS_Ext,offset REC_Ext mov word ptr cs:LS_Buffer,offset RecordBuffer mov word ptr cs:LS_BufferLen,RecordLen * 2 jmp File_LS ; ******************************************************************* ; ** ** ; ** ** ; ** COMMANDS SUBROUTINES ** ; ** ** ; ** ** ; ******************************************************************* ; -- Memory Editor --------------------- EB_ParamsAddr dw ? OldCurLen db ? EB_Commands db 07h,08h,05h,0Bh,06h,20h db 01h,02h,03h,04h,0Dh db 18h,0Ch EB_ComSubrt dw EB_Up,EB_Down,EB_Left,EB_Left,EB_Right,EB_Space dw EB_Home,EB_End,EB_PgUp,EB_PgDn,EB_Tab dw EB_Enter,EB_Esc EB_Init: push ax bx mov al,cs:[si].EB_MinUp mov cs:[si].EB_TextCH,al mov al,cs:[si].EB_MinLeft1 mov cs:[si].EB_TextCL2,al mov al,cs:[si].EB_MinLeft2 mov cs:[si].EB_TextCL1,al mov bx,cs:[si].EB_MemAdr mov ax,cs:[bx] mov cs:[si].EB_Address,ax pop bx ax ret EB_Lcx: mov cl,cs:[si].EB_TextCL1 mov cs:ScreenIOparams.CursorLen,1 cmp cs:[si].EB_TextOrHex,0 jnz EB_Lcx1 mov cl,cs:[si].EB_TextCL2 mov cs:ScreenIOparams.CursorLen,4 EB_Lcx1: mov ch,cs:[si].EB_TextCH ret MemoryEditor: mov si,cs:EB_ParamsAddr mov al,cs:ScreenIOparams.CursorLen mov cs:OldCurLen,al mov cs:ScreenIOparams.CursorColor,40h mov cs:[si].EB_FirstFl,1 mov bx,cs:[si].EB_MemAdr GetLineService _GL_GetSymb dec cl or al,al jz EB_Loop0 call GetAddress mov cs:[bx],ax call EB_Init EB_Loop0: call EB_Lcx mov ah,0Bh call ReadKey mov di,offset EB_Commands mov cx,offset EB_ComSubrt - offset EB_Commands call CalcCommand jc EB_CallDoIt shl di,1 call cs:EB_ComSubrt[di] mov cs:[si].EB_FirstFl,1 jnc EB_Loop0 EB_ret: mov al,cs:OldCurLen mov cs:ScreenIOparams.CursorLen,al GetLineService _GL_ClrBuff ret EB_CallDoIt: call EB_DoIt jmp EB_Loop0 EB_DoIt: push ax bx di cmp cs:[si].EB_TextOrHex,0 jnz EB_DoText or al,20h cmp al,'0' jb EB_DoItRet2 cmp al,'9' jbe E_Num cmp al,'a' jb EB_DoItRet2 cmp al,'f' ja EB_DoItRet2 sub al,27h E_Num: sub al,'0' mov di,cs:[si].EB_Address mov bh,[di] test cs:[si].EB_FirstFl,1 jz EB_NotNew xor bh,bh EB_NotNew: shl bh,4 or bh,al mov [di],bh EB_DoItRet: test cs:[si].EB_FirstFL,1 jnz EB_DoItRet1 call EB_Right EB_DoItRet1: xor cs:[si].EB_FirstFl,1 EB_DoItRet2: pop di bx ax ret EB_DoText: mov di,cs:[si].EB_Address or al,80h mov [di],al call EB_Right jmp EB_DoItRet2 EB_Space: cmp cs:[si].EB_TextOrHex,0 jz EB_Right call EB_DoIt clc ret EB_Right: push ax bx cx mov bx,cs:[si].EB_MemAdr mov cl,cs:[si].EB_TextCL2 mov al,cs:[si].EB_TextCL1 mov ch,cs:[si].EB_TextCH cmp cl,cs:[si].EB_Center jne EB_R0 inc cl inc al EB_R0: add cl,3 inc al cmp cl,cs:[si].EB_MaxRight1 ja EB_R1 inc cs:[si].EB_Address jmp EB_R3 EB_R1: mov cl,cs:[si].EB_MinLeft1 mov al,cs:[si].EB_MinLeft2 inc ch cmp ch,cs:[si].EB_MaxDown ja EB_R2 inc cs:[si].EB_Address jmp EB_R3 EB_R2: push ax mov ax,cs:[bx] add ax,cs:[si].EB_BytesInLine mov cs:[bx],ax call cs:[si].EB_InitBuffProc pop ax inc cs:[si].EB_Address mov ch,cs:[si].EB_MaxDown EB_R3: mov cs:[si].EB_TextCL2,cl mov cs:[si].EB_TextCL1,al mov cs:[si].EB_TextCH,ch pop cx bx ax clc ret EB_Left: push ax bx cx mov bx,cs:[si].EB_MemAdr mov cl,cs:[si].EB_TextCL2 mov al,cs:[si].EB_TextCL1 mov ch,cs:[si].EB_TextCH sub cl,3 dec al mov ah,cs:[si].EB_Center inc ah cmp cl,ah jne EB_L0 dec cl dec al EB_L0: cmp cl,cs:[si].EB_MinLeft1 jb EB_L1 dec cs:[si].EB_Address jmp EB_L3 EB_L1: mov cl,cs:[si].EB_MaxRight1 mov al,cs:[si].EB_MaxRight2 dec ch cmp ch,cs:[si].EB_MinUp jb EB_L2 dec cs:[si].EB_Address jmp EB_L3 EB_L2: push ax mov ax,cs:[bx] sub ax,cs:[si].EB_BytesInLine mov cs:[bx],ax call cs:[si].EB_InitBuffProc pop ax dec cs:[si].EB_Address mov ch,cs:[si].EB_MinUp EB_L3: mov cs:[si].EB_TextCL2,cl mov cs:[si].EB_TextCL1,al mov cs:[si].EB_TextCH,ch pop cx bx ax clc ret EB_Up: push ax bx cx mov bx,cs:[si].EB_MemAdr mov ax,cs:[si].EB_BytesInLine call EB_Lcx dec ch cmp ch,cs:[si].EB_MinUp jae EB_U1 mov ch,cs:[si].EB_MinUp sub cs:[bx],ax call cs:[si].EB_InitBuffProc EB_U1: sub cs:[si].EB_Address,ax EB_U2: mov cs:[si].EB_TextCH,ch pop cx bx ax clc ret EB_Down: push ax bx cx mov bx,cs:[si].EB_MemAdr mov ax,cs:[si].EB_BytesInLine call EB_Lcx inc ch cmp ch,cs:[si].EB_MaxDown jbe EB_D1 mov ch,cs:[si].EB_MaxDown add cs:[bx],ax call cs:[si].EB_InitBuffProc EB_D1: add cs:[si].EB_Address,ax EB_D2: mov cs:[si].EB_TextCH,ch pop cx bx ax clc ret EB_Tab: test cs:[si].EB_TabFlag,1 jz EB_TabRet xor cs:[si].EB_TextOrHex,0FFh mov cs:[si].EB_FirstFl,1 EB_TabRet: clc ret EB_PgUp: push bx mov bx,cs:[si].EB_MemAdr sub cs:[si].EB_Address, 4 * 16 sub word ptr cs:[bx], 4 * 16 call cs:[si].EB_InitBuffProc clc pop ax ret EB_PgDn: push bx mov bx,cs:[si].EB_MemAdr add cs:[si].EB_Address, 4 * 16 add word ptr cs:[bx], 4 * 16 call cs:[si].EB_InitBuffProc clc pop bx ret EB_Home: push ax mov al,cs:[si].EB_MinLeft1 EB_H0: cmp cs:[si].EB_TextCL2,al je EB_H1 call EB_Left jmp EB_H0 EB_H1: mov al,cs:[si].EB_MinUp EB_H2: cmp cs:[si].EB_TextCH,al je EB_H3 call EB_Up jmp EB_H2 EB_H3: pop ax clc ret EB_End: push ax mov al,cs:[si].EB_MaxRight1 EB_E0: cmp cs:[si].EB_TextCL2,al je EB_E1 call EB_Right jmp EB_E0 EB_E1: mov al,cs:[si].EB_MaxDown EB_E2: cmp cs:[si].EB_TextCH,al je EB_E3 call EB_Down jmp EB_E2 EB_E3: pop ax clc ret EB_Esc: EB_Enter: stc ret ; -- Save/Load labels ------------------ LS_Ext dw ? LS_FileSpec dw ? LS_StoreCX dw ? LS_OpenFileF db ? LS_RWfileF db ? LS_ErrPtr dw ? LS_OkPtr dw ? LS_Buffer dw ? LS_BufferLen dw ? File_LS: call Prepare4DOS push cx ds mov bx,cs:LS_FileSpec mov dx,79 LAB_LS_0: GetLineService _GL_GetSymb mov byte ptr cs:[bx],al inc bx dec dx jz LAB_LS_1 or al,al jnz LAB_LS_0 LAB_LS_1: push ds push cs pop ds mov si,cs:LS_Ext mov di,cs:LS_FileSpec call AddExt pop ds mov cs:LS_StoreCX,cx push cs pop ds mov dx,cs:LS_FileSpec xor cx,cx mov ah,cs:LS_OpenFileF xor al,al int 21h jc LAB_LS_Err1 mov bx,ax mov dx,cs:LS_Buffer mov cx,cs:LS_BufferLen mov ah,cs:LS_RWfileF int 21h jc LAB_LS_Err cmp ax,cx jne LAB_LS_Err mov ah,3Eh int 21h pop ds cx mov ax,cs:LS_OkPtr mov cs:GetKeyParams.RK_ErrPtr,ax call SOD4eraperP GetLineService _GL_ClrBuff clc ret LAB_LS_Err: mov ah,3Eh int 21h LAB_LS_Err1: pop ds cx mov ax,cs:LS_ErrPtr mov cs:GetKeyParams.RK_ErrPtr,ax mov cx,cs:LS_StoreCX call SOD4eraperP inc cl stc ret ; -- Hook INT 24h ---------------------- Prepare4DOS: saveall pushf mov cs:FkeysMainFlag,0 call ShowAll ScreenIOservice _SHOWSCREEN call far ptr SystemTINI popf restoreall ret ; -- Unhook INT 24h -------------------- SOD4eraperP: saveall ; Unchain Critical Errors proc pushf mov cs:FkeysMainFlag,1 mov ax,Emulate mov es,ax mov byte ptr [C000],0 call far ptr SystemINIT popf restoreall ret ; -- ON/OFF ---------------------------- OnOff: push ax GetLineService _GL_GetSymb call Upcase cmp al,'o' jne OO_Error GetLineService _GL_GetSymb call Upcase cmp al,'n' je OO_On cmp al,'f' jne OO_Error GetLineService _GL_GetSymb call Upcase cmp al,'f' je OO_Off OO_Error: mov cs:GetKeyParams.RK_ErrPtr,offset OnOffMes inc cl stc jmp OO_ret OO_On: mov ax,1 or ax,ax clc jmp OO_ret OO_Off: xor ax,ax clc OO_ret: pop ax ret ; ******************************************************************* ; ** ** ; ** ** ; ** S H O W A L L ** ; ** ** ; ** ** ; ******************************************************************* ShowAllNumber dw 0 ShowAllProcs dw SA_Command,SA_EditA,SA_EditB,SA_Program,SA_Regs,SA_Help,SA_Labels SA_Command dw ShowLabels,ShowProgram,ShowRegs,ShowStack,ShowBreaks,ShowDumpA dw ShowDumpB,ShowFuncKeys,ShowCommand,ShowMessage dw ShowLine,ShowHelp SA_EditA dw ShowLabels,ShowCommand,ShowLine,ShowProgram,ShowMessage,ShowRegs dw ShowStack,ShowBreaks,ShowDumpB,ShowHelp,ShowFuncKeys dw ShowDumpA SA_EditB dw ShowLabels,ShowCommand,ShowLine,ShowProgram,ShowMessage,ShowRegs dw ShowStack,ShowBreaks,ShowDumpA,ShowHelp,ShowFuncKeys dw ShowDumpB SA_Program dw ShowLabels,ShowRegs,ShowStack,ShowBreaks,ShowDumpA,ShowDumpB dw ShowCommand,ShowHelp,ShowFuncKeys dw ShowProgram,ShowLine,ShowMessage SA_Regs dw ShowLabels,ShowCommand,ShowLine,ShowProgram,ShowMessage dw ShowStack,ShowBreaks,ShowDumpA,ShowDumpB,ShowHelp,ShowFuncKeys dw ShowRegs SA_Help dw ShowProgram,ShowRegs,ShowStack,ShowBreaks,ShowDumpA dw ShowDumpB,ShowCommand,ShowMessage,ShowLine,ShowLabels dw ShowHelp,ShowFuncKeys SA_Labels dw ShowStack,ShowBreaks,ShowDumpA,ShowDumpB,ShowCommand,ShowProgram dw ShowMessage,ShowLine,ShowRegs,ShowHelp,ShowFuncKeys dw ShowLabels ActiveFlags dw 0 KbdShifts dw ? ShowAll proc far push bx dx es ds bp push word ptr cs:ScreenIOparams.CursorColor push word ptr cs:ScreenIOparams.CursorLen push word ptr cs:ScreenIOparams.CursorFlag mov bx,Keyboard mov es,bx assume es:Keyboard mov bx,es:k_Shifts mov cs:KbdShifts,bx mov cs:ScreenIOparams.CursorFlag,1 mov bx,Emulate mov es,bx mov bx,Apple mov ds,bx mov dx,12 mov bx,cs:ShowAllNumber shl bx,1 mov bx,cs:ShowAllProcs[bx] SA_Loop: call cs:[bx] add bx,2 dec dx jnz SA_Loop pop word ptr cs:ScreenIOparams.CursorFlag pop word ptr cs:ScreenIOparams.CursorLen pop word ptr cs:ScreenIOparams.CursorColor pop bp ds es dx bx ret ShowAll endp ; -- Draw box -------------------------- ; Entry: ; AH = Active Flag Bit ; CX = HTAB & VTAB ; BX = Offset of the strings ; DL = Length of the box line - 1 ; DH = Number of lines - 1 ; Destroy: ; AX,BX,CX,DX DB_CX dw ? DrawBox: push ax mov ax,cx add ax,80 * 2 mov cs:DB_CX,ax pop ax test cs:ActiveFlags,ax mov ah,7 jz DB_ok1 mov ah,0Eh DB_ok1: ScreenIOservice _STRINGPRINT mov bx,cs:ScreenIOparams.SP_bx dec dh mov al,dh mov dx,cs:DB_CX DB_Loop1: mov cx,dx add dx,80 * 2 ScreenIOservice _STRINGPRINT dec al jnz DB_Loop1 mov cx,dx mov bx,cs:ScreenIOparams.SP_bx ScreenIOservice _STRINGPRINT ret ; -------------------------------------------------------------------------- ; - SHOW LINE ShowLine: ScreenIOservice _SHOWLINE ret ; -------------------------------------------------------------------------- ; - SHOW MESSAGE SM_Dec? db 0 ShowMessage: push ax bx cx gotoxy 16,0 mov bx,offset SP_Str3 test cs:ActiveFlags,0000000000000010b mov ah,0Eh jnz SM_ok1 mov ah,7 SM_ok1: ScreenIOservice _STRINGPRINT mov bx,cs:GetKeyParams.RK_ErrPtr or bx,bx jz SM_Ret gotoxy 16,1 mov ah,0Ch ScreenIOservice _STRINGPRINT cmp cs:SM_Dec?,0 jz SM_Ret pop cx dec cl push cx SM_Ret: pop cx bx ax ret FirstMsg db 1,0Ah,'Appler Debugger, v1.0',0 UnknownCmd db 'Unknown command',0 IllegalNum db 'Bad address or number',0 NotHexMes db 'Hex digit expected',0 NotBinMes db 'Bin digit expected',0 NotDecMes db 'Dec digit expected',0 BigNumMes db 'Address or number is too big',0 NumbMissMes db 'Address or number expected',0 BadInstr db 'Bad instruction',0 BadParam db 'Bad or missing parameter',0 NoStringMes db 'Search string expected',0 ByteExpMes db 'Byte expected',0 NotFound db 'String not found',0 NotIdent db 'Different byte found',0 Identifical db 1,0Ah,'Bytes are identical',0 AdressError db 'End below begin',0 LS_EnterMes1 db 1,0Ah,' to load labels',0 LabMes_L db 1,0Ah,'Labels loaded',0 LabErrMes_L db 'Error loading labels',0 LS_EnterMes2 db 1,0Ah,' to save labels',0 LabMes_S db 1,0Ah,'Labels saved',0 LabErrMes_S db 'Error saving labels',0 EqualMess db '''='' expected',0 BreakNumMES db 'Breakpoint number expected',0 SymMissErr db 'Identifier expected',0 SymNoMemErr db 'No memory to define this label',0 SymNotFndErr db 'Label not defined',0 SymNoSymbErr db 'No labels defined',0 OnOffMes db 'ON or OFF expected',0 GA_PlusMes db 1,7,'Carry',0 GA_MinusMes db 1,7,'Borrow',0 GA_MulMes db 1,7,'Overflow',0 ZeroDivMes db 'Division by zero',0 GA_DivMes db 1,0Ah,'Remainder=' GA_DivRest db '0000',1,7,' (truncated)',0 ExecutingMes db 1,8Ah,'Executing',0 ToRTSmes db 1,8Ah,'Executing to RTS...',0 InvalidOpcode db 1,8Ch,'Unexpected Breakpoint',0 BreakpointMes db 1,0Ch,'Breakpoint ' BreakpointNum db '? reached',0 PrintingMes db 1,8Ah,'Printing',0 PrintOkMes db 1,0Ah,'Memory Dump Printed OK',0 PrintErrMes db 'Error printing Memory Dump',0 PrintAsmOkMes db 1,0Ah,'Program Printed OK',0 PrintAsmErrMes db 'Error printing Program',0 LR_EnterMes1 db 1,0Ah,' to load macro',0 RecMes_L db 1,0Ah,'Macro loaded',0 RecErrMes_L db 'Error loading macro',0 SR_EnterMes2 db 1,0Ah,' to save macro',0 RecMes_S db 1,0Ah,'Macro saved',0 RecErrMes_S db 'Error saving Macro',0 RecPlayedMes db 1,0Ah,'Macro played',0 RecordedMes db 1,0Ah,'Macro recorded',0 ; -------------------------------------------------------------------------- ; - SHOW COMMAND ShowCommand: push ax cx gotoxy 17,0 mov ax,0700h+'>' ScreenIOservice _SYMBPRINT SCM_Ret: pop cx ax ret ; -------------------------------------------------------------------------- ; - SHOW PROGRAM AssembAdr dw 0 ; This is the start address. AssembAdr1 dw 0 ShowPrev? db 0 PrevAdr dw ? SP_Str db 'ÚProgramÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿',0 db '³ ³',0 SP_Str3 db 'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ',0 SP_CursorXY dw 401h ShowProgram: push ax bx cx dx si es gotoxy 1,0 mov bx,offset SP_Str mov dx,0F22h mov ax,0000000000000010b call DrawBox test cs:ShowPrev?,1 jz SP_Dont gotoxy 3,2 mov si,cs:PrevAdr call OneInstr SP_Dont: mov si,cs:AssembAdr gotoxy 4,2 mov dx,12 mov cs:CalcFlag,1 AsmLoop0: call OneInstr mov cs:CalcFlag,0 add cx,80 * 2 dec dx jnz ASMLoop0 mov cs:AssembAdr1,si mov cx,cs:SP_CursorXY mov cs:ScreenIOparams.CursorColor,10h mov cs:ScreenIOparams.CursorLen,31 ScreenIOservice _SHOWCURSOR gotoxy 1,1 mov ax,0E00h+'P' cmp cs:FkeysMainFlag,0 jz SP_Ret ScreenIOservice _SYMBPRINT SP_Ret: pop es si dx cx bx ax ret assume es:Emulate ; -- Scroll Program Window DOWN -------- UP: push cx ax bx si ; Scrolls ASM window down. mov si,cs:AssembAdr call PrevInstAdr jnc UP_0 dec si UP_0: mov cs:AssembAdr,si call PrevInstAdr jnc UP_1 dec si UP_1: mov cs:PrevAdr,si call BuffDisasm clc mov cs:ShowPrev?,1 pop si bx ax cx ret ; -- Scroll Program Window UP ---------- DOWN: push si ax cx mov si,cs:AssembAdr mov cs:ShowPrev?,1 mov cs:PrevAdr,si gotoxy 7,2 call OneInstr mov cs:AssembAdr,si call BuffDisasm pop cx ax si ret ; -- Calc Previous Instruction Adr ----- ; Entry: ; SI = Start_Address ; Exit: ; SI = Previous Instruction Address ; CF = 1 if can't or 0 otherwise PIA_Counter = 25 PIA_BegAdr dw ? PIA_Adr dw ? PrevInstAdr: push ax bx ; I: SI -> Address. O: SI <- PrevInstAdr mov cs:PIA_BegAdr,si sub si,PIA_Counter PIA_Loop0: mov cs:PIA_adr,si PIA_Loop1: xor bx,bx mov bl,[si] mov al,cs:InstrLongTbl[bx] test al,00000100b jz PIA_Valid PIA_Next: mov si,cs:PIA_adr inc si cmp si,cs:PIA_BegAdr je PIA_Cannot jmp PIA_Loop0 PIA_Valid: xor ah,ah and al,00000011b add ax,si cmp ax,cs:PIA_BegAdr ja PIA_Next je PIA_End mov si,ax jmp PIA_Loop1 PIA_End: clc PIA_End1: pop bx ax ret PIA_Cannot: stc jmp PIA_End1 ; -- Show Previous Instruction --------- ShowPrevIns: push cx si mov si,cs:AssembAdr call PrevInstAdr jnc SPI_ok dec si SPI_ok: mov cs:ShowPrev?,1 mov cs:PrevAdr,si pop si cx ret ; -- Show One Instruction -------------- ; Entry: ; SI = Start_Address ; CH = VTAB ; Exit: ; SI = Next Instruction Address OI_ClrStr: db ' ',0 CalcFlag db 0 OI_StoreCX dw ? OneInstr: push ax bx cx dx mov cs:OI_StoreCX,cx mov bx,offset OI_ClrStr ScreenIOservice _STRINGPRINT xor ax,ax mov bx,ax mov al,[si] mov bl,al add bx,ax add bx,ax mov ah,0Bh mov cx,cs:OI_StoreCX add cx,0Fh * 2 mov al,cs:InstrTable[bx] ScreenIOservice _SYMBPRINT mov al,cs:InstrTable[bx+1] ScreenIOservice _SYMBPRINT mov al,cs:InstrTable[bx+2] ScreenIOservice _SYMBPRINT mov al,' ' ScreenIOservice _SYMBPRINT clc mov ah,07h call CheckBreak jc OI_ok1 mov ah,0Ch OI_ok1: xor dl,dl xchg dl,cs:ScreenIOparams.SP_BufFlag mov bx,si mov al,7 mov cx,cs:OI_StoreCX call WordPrintS mov ax,0700h+':' ScreenIOservice _SYMBPRINT mov cx,cs:OI_StoreCX add cx,8 * 2 mov ah,3 mov al,[si] ScreenIOservice _BYTEPRINT xor bx,bx mov bl,[si] mov ah,03h mov bl,cs:ParamTable[bx] shl bx,1 mov byte ptr cs:SC_ShowAdr?,1 call word ptr cs:AdrModes[bx] call ShowCalc inc si OI_RET: pop dx cx bx ax ret AdrModes dw NoOper,DirVal,ZP,ZPx,Full,FullX,FullY dw BadX,BadY,ZPy,JMP1,JMP6C,NoOper,BEQ,Indirect,JMP7C ; -- Addressing Modes Procs ------------ ; Entry: ; SI = Address of the first instruction byte ; Exit: ; BX = Address to show at the up-right ; CF = Show (0) or not (1) the contain of address in BX ; SC_ShowAdr? = Show (1-default) or not (0) the address in BX ; SI = Address of the last instruction byte NoOper: stc ret DirVal: call PDirVal inc si stc ret ZP: call PZPadr inc si xor bx,bx mov bl,[si] clc mov byte ptr cs:SC_ShowAdr?,0 ret ZPx: call PZPx inc si xor bx,bx mov bl,[si] add bl,cs:Regs.X clc ret Full: call PWordAdr inc si mov bx,[si] inc si clc mov byte ptr cs:SC_ShowAdr?,0 ret FullX: call PFullX inc si mov bx,[si] inc si xor ax,ax mov al,cs:Regs.X add bx,ax clc ret FullY: call PFullY inc si mov bx,[si] inc si xor ax,ax mov al,cs:Regs.Y add bx,ax clc ret BadX: call PBadX inc si mov bl,[si] add bl,cs:Regs.X xor bh,bh mov al,[bx] inc bl mov ah,[bx] mov bx,ax clc ret BadY: call PBadY inc si xor bx,bx mov bl,[si] mov al,[bx] inc bl mov ah,[bx] mov bx,ax xor ax,ax mov al,cs:Regs.Y add bx,ax clc ret ZPy: call PZPy inc si xor bx,bx mov bl,[si] add bl,cs:Regs.Y clc ret JMP1: call Pwordadr inc si inc si stc ret JMP6C: call PJ6C inc si mov bx,[si] inc si mov al,[bx] inc bl mov ah,[bx] mov bx,ax clc ret BEQ: call PBranch inc si stc ret Indirect: call Pindirect inc si mov bl,[si] xor bh,bh mov al,[bx] inc bl mov ah,[bx] mov bx,ax clc ret JMP7C: call PJ7C inc si mov bl,cs:Regs.X xor bh,bh add bx,[si] mov al,[bx] inc bl mov ah,[bx] mov bx,ax inc si clc ret ; -- Print Modes Procs ----------------- ; Entry: ; SI = Address of the first instruction byte PrintWORD: mov al,[si+1] ScreenIOservice _BYTEPRINT mov al,[si+2] ScreenIOservice _BYTEPRINT mov ah,0Bh mov cs:ScreenIOparams.SP_BufFlag,dl add cx,5 * 2 ret PrintBYTE: mov al,[si+1] ScreenIOservice _BYTEPRINT mov ah,0Bh mov cs:ScreenIOparams.SP_BufFlag,dl add cx,7 * 2 ret PBadX: call PrintBYTE mov al,'(' ScreenIOservice _SYMBPRINT mov al,5 mov bl,[si+1] call BytePrintS mov al,',' ScreenIOservice _SYMBPRINT mov al,'X' ScreenIOservice _SYMBPRINT mov al,')' ScreenIOservice _SYMBPRINT ret PBadY: call PrintBYTE mov al,'(' ScreenIOservice _SYMBPRINT mov al,5 mov bl,[si+1] call BytePrintS mov al,')' ScreenIOservice _SYMBPRINT mov al,',' ScreenIOservice _SYMBPRINT mov al,'Y' ScreenIOservice _SYMBPRINT ret PZPadr: call PrintBYTE mov al,9 mov bl,[si+1] jmp BYTEPRINTS PDirVal: call PrintBYTE mov al,'#' ScreenIOservice _SYMBPRINT mov al,[si+1] ScreenIOservice _BYTEPRINT ret PZPx: call PrintBYTE mov al,7 mov bl,[si+1] call BytePrintS mov al,',' ScreenIOservice _SYMBPRINT mov al,'X' ScreenIOservice _SYMBPRINT ret PZPy: call PrintBYTE mov al,7 mov bl,[si+1] call BytePrintS mov al,',' ScreenIOservice _SYMBPRINT mov al,'Y' ScreenIOservice _SYMBPRINT ret PWordAdr: call PrintWORD mov al,10 mov bx,[si+1] jmp WordPrintS PFullX: call PrintWORD mov al,8 mov bx,[si+1] call WordPrintS mov al,',' ScreenIOservice _SYMBPRINT mov al,'X' ScreenIOservice _SYMBPRINT ret PFullY: call PrintWORD mov al,8 mov bx,[si+1] call WordPrintS mov al,',' ScreenIOservice _SYMBPRINT mov al,'Y' ScreenIOservice _SYMBPRINT ret PJ6C: call PrintWORD mov al,'(' ScreenIOservice _SYMBPRINT mov al,8 mov bx,[si+1] call WordPrintS mov al,')' ScreenIOservice _SYMBPRINT ret PBranch: call PrintBYTE push bx si mov al,[si+1] cbw inc si inc si add ax,si mov bx,ax mov ax,0B0Ah call WordPrintS pop si bx ret Pindirect: call PrintBYTE mov al,'(' ScreenIOservice _SYMBPRINT mov al,5 mov bl,[si+1] call BytePrintS mov al,')' ScreenIOservice _SYMBPRINT ret PJ7C: call PrintWORD mov al,'(' ScreenIOservice _SYMBPRINT mov al,8 mov bx,[si+1] call WordPrintS mov al,',' ScreenIOservice _SYMBPRINT mov al,'X' ScreenIOservice _SYMBPRINT mov al,')' ScreenIOservice _SYMBPRINT ret ; -- Show address at up-rt corner ------ ; Entry: ; BX = Address to show at the up-right ; CF = Show (0) or not (1) the contain of address in BX ; SC_ShowAdr? = Show (1-default) or not (0) the address in BX SC_Clear db 1,7,' ',0 SC_ShowAdr? db ? SC_Length db ? ShowCalc: mov cs:ScreenIOparams.SP_BufFlag,0 push ax cx dx bx gotoxy 2,18h mov bx,offset SC_Clear jnc SC_1 cmp byte ptr cs:CalcFlag,0 jz SC_ret ScreenIOservice _STRINGPRINT jmp SC_ret SC_1: cmp byte ptr cs:CalcFlag,0 jz SC_ret ScreenIOservice _STRINGPRINT pop bx push bx gotoxy 2,18h mov ah,3 cmp byte ptr SC_ShowAdr?,0 jz SC_NoAdr mov al,bh ScreenIOservice _BYTEPRINT mov al,bl ScreenIOservice _BYTEPRINT mov al,':' ScreenIOservice _SYMBPRINT SC_NoAdr: gotoxy 2,1Dh mov al,[bx] ScreenIOservice _BYTEPRINT SC_ret: pop bx dx cx ax ret ; -------------------------------------------------------------------------- ; - SHOW REGS SR_Str db ' ÚRegistersÄ¿ ',0 db ' ³ ³ ',0 db ' ÀÄÄÄÄÄÄÄÄÄÄÙ ',0 SR_StrA db 1,7,'A = ',0 SR_StrX db 1,7,'X = ',0 SR_StrY db 1,7,'Y = ',0 SR_StrP db 1,7,'P = ',0 SR_StrS db 1,7,'S = ',0 SR_StrPC db 1,7,'PC= ',0 RegStruc struc A db ? X db ? Y db ? S db ? P db ? PC dw ? RegStruc ends Regs RegStruc <0,0,0,0,0,0> FlagSymbs db 'NVúBDIZC' ShowRegs: push ax bx cx dx gotoxy 1,21h mov bx,offset SR_Str mov dx,90Dh mov ax,0000000000000100b call DrawBox mov ah,0Bh gotoxy 4,24h mov bx,offset SR_StrA ScreenIOservice _STRINGPRINT mov al,cs:Regs.A ScreenIOservice _BYTEPRINT mov ah,0Bh gotoxy 5,24h mov bx,offset SR_StrX ScreenIOservice _STRINGPRINT mov al,cs:Regs.X ScreenIOservice _BYTEPRINT mov ah,0Bh gotoxy 6,24h mov bx,offset SR_StrY ScreenIOservice _STRINGPRINT mov al,cs:Regs.Y ScreenIOservice _BYTEPRINT mov ah,0Bh gotoxy 7,24h mov bx,offset SR_StrP ScreenIOservice _STRINGPRINT mov al,cs:Regs.P ScreenIOservice _BYTEPRINT mov ah,0Bh gotoxy 8,24h mov bx,offset SR_StrS ScreenIOservice _STRINGPRINT mov al,cs:Regs.S ScreenIOservice _BYTEPRINT gotoxy 9,24h mov bx,offset SR_StrPC ScreenIOservice _STRINGPRINT mov al,byte ptr cs:Regs.PC[1] ScreenIOservice _BYTEPRINT mov al,byte ptr cs:Regs.PC ScreenIOservice _BYTEPRINT mov ah,0Bh mov dl,cs:Regs.P xor bx,bx gotoxy 3,24h FlagsLoop0: mov ah,3 shl dl,1 jnc ClearFlag mov ah,0Bh ClearFlag: mov al,cs:FlagSymbs[bx] ScreenIOservice _SYMBPRINT inc bx cmp bx,8 jb FlagsLoop0 gotoxy 1,23h mov ax,0E00h+'R' cmp cs:FkeysMainFlag,0 jz SR_Ret ScreenIOservice _SYMBPRINT SR_Ret: pop dx cx bx ax ret ; -------------------------------------------------------------------------- ; - SHOW STACK SS_Str db ' ÚStackÄÄÄÄÄ¿ ',0 db ' ³ ³ ',0 db ' ÀÄÄÄÄÄÄÄÄÄÄÙ ',0 SS_1 db '+1: ',0 SS_3 db '+3: ',0 SS_5 db '+5: ',0 SS_7 db '+7: ',0 SS_StoreCX dw ? ShowStack: push ax bx cx dx si gotoxy 0Bh,21h mov bx,offset SS_Str mov dx,60Dh mov ax,0000000000001000b call DrawBox mov bx,101h add bl,cs:Regs.S mov si,offset SS_1 gotoxy 0Dh,24h mov cs:SS_StoreCX,cx mov dx,4 SS_Loop1: mov ah,7 xchg bx,si ScreenIOservice _STRINGPRINT add bx,5 xchg si,bx mov ah,3 inc bl mov al,ds:[bx] ScreenIOservice _BYTEPRINT dec bl mov al,ds:[bx] ScreenIOservice _BYTEPRINT add bl,2 add cs:SS_StoreCX,80 * 2 mov cx,cs:SS_StoreCX dec dx jnz SS_Loop1 pop si dx cx bx ax ret ; -------------------------------------------------------------------------- ; - SHOW BREAKS SB_Str db 'ÚBreakpointsÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿',0 db '³ ³',0 db 'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ',0 Breakpoint struc BP_Address dw ? BP_ByteStorage db ? BP_ActiveFlag db ? BP_FlashFlag db ? BP_PrintXY dw ? ends BreakPoints Breakpoint <0,?,0,0,?> Breakpoint <0,?,0,0,2*80*2+49*2> Breakpoint <0,?,0,0,3*80*2+49*2> Breakpoint <0,?,0,0,4*80*2+49*2> Breakpoint <0,?,0,0,2*80*2+64*2> Breakpoint <0,?,0,0,3*80*2+64*2> Breakpoint <0,?,0,0,4*80*2+64*2> ShowBreaks: push ax bx cx dx si gotoxy 1,2Fh mov bx,offset SB_Str mov dx,522h mov ax,0000000000010000b call DrawBox mov si,7 mov dx,600h SB_Loop: mov ah,7 test cs:Breakpoints[si].BP_ActiveFlag,1 jz SB_ok1 mov ah,0Ch test cs:Breakpoints[si].BP_FlashFlag,1 jz SB_ok1 mov ah,8Ch mov cs:Breakpoints[si].BP_FlashFlag,0 SB_ok1: mov cx,cs:Breakpoints[si].BP_PrintXY mov al,'B' ScreenIOservice _SYMBPRINT mov al,dl add al,'0'+1 ScreenIOservice _SYMBPRINT mov ax,700h+':' ScreenIOservice _SYMBPRINT add cx,2 mov bx,cs:Breakpoints[si].BP_Address mov ax,30Ah call WordPrintS inc dl add si,7 dec dh jnz SB_Loop pop si dx cx bx ax ret ; -------------------------------------------------------------------------- ; - SHOW DUMP A SDA_Str db 'ÚMemory Dump BÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿',0 db '³ ³',0 db 'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ',0 SDA_NumStr db '0123456789ABCDEF' SDA_Address dw 0 SDA_StoreCX dw ? ShowDumpA: push ax bx cx dx si gotoxy 7,2Fh mov bx,offset SDA_Str mov dx,0A22h mov ax,0000000000100000b call DrawBox mov bx,cs:SDA_Address and bx,000Fh gotoxy 8,38h mov dl,8 mov ah,7 SDA_NumbLoop: mov al,cs:SDA_NumStr[bx] ScreenIOservice _SYMBPRINT inc bx and bx,0Fh add cx,4 dec dl jnz SDA_NumbLoop gotoxy 9,31h mov SDA_StoreCX,cx mov bx,cs:SDA_Address xor si,si mov dh,8 SDA_Loop0: mov ah,7 mov al,bh ScreenIOservice _BYTEPRINT mov al,bl ScreenIOservice _BYTEPRINT mov al,':' ScreenIOservice _SYMBPRINT mov dl,8 SDA_Loop1: add cx,2 mov al,ds:[bx] cmp al,cs:BufferA[si] ; mov cs:BufferA[si],al mov ah,0Bh jne SDA_NotSame mov ah,3 SDA_NotSame: ScreenIOservice _BYTEPRINT inc bx inc si dec dl jnz SDA_Loop1 add cs:SDA_StoreCX,80 * 2 mov cx,cs:SDA_StoreCX dec dh jnz SDA_Loop0 cmp cs:EB_Flag,0 jz SDA_Ret cmp cs:FkeysMainFlag,0 jz SDA_Ret gotoxy 7,30h mov ax,0E00h+'M' ScreenIOservice _SYMBPRINT SDA_Ret: pop si dx cx bx ax ret ; -------------------------------------------------------------------------- ; - SHOW DUMP B SDB_Str db 'ÚMemory Dump AÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿',0 db '³ ³',0 db 'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ',0 SDB_NumStr db '0123456789ABCDEF' SDB_Address dw 0 SDB_Count1 db ? SDB_1: add cx,2 add di,2 jmp SDB_1_ret ShowDumpB: push ax bx cx dx si di gotoxy 12h,00h mov bx,offset SDB_Str mov dx,651h mov ax,0000000001000000b call DrawBox mov bx,cs:SDB_Address and bx,000Fh gotoxy 13h,3Dh mov di,cx gotoxy 13h,0Ah mov dx,10h mov si,8 mov ah,7 SDB_NumbLoop: mov al,cs:SDB_NumStr[bx] ScreenIOservice _SYMBPRINT add cx,4 xchg di,cx ScreenIOservice _SYMBPRINT xchg di,cx dec si jz SDB_1 SDB_1_ret: inc bx and bx,0Fh dec dx jnz SDB_NumbLoop gotoxy 14h,3Dh mov dx,cx gotoxy 14h,2 mov si,cs:SDB_Address xor di,di mov cs:SDB_Count1,4 SDB_Loop0: mov ah,7 mov bx,si mov al,bh ScreenIOservice _BYTEPRINT mov al,bl ScreenIOservice _BYTEPRINT mov al,':' ScreenIOservice _SYMBPRINT add cx,4 mov bx,1008h SDB_Loop1: mov al,ds:[si] cmp al,cs:BufferB[di] ; mov cs:BufferB[di],al mov ah,0Bh jne SDB_NotSame mov ah,3 SDB_NotSame: ScreenIOservice _BYTEPRINT xchg cx,dx xor ah,ah xchg di,ax shl di,1 mov bp,ss:TextChars[di] xchg di,ax mov ax,bp ScreenIOservice _SYMBPRINT xchg cx,dx add cx,2 dec bl jz SDB_2 SDB_2_ret: inc si inc di dec bh jnz SDB_Loop1 add cx,24*2 add dx,63*2 dec cs:SDB_Count1 jnz SDB_Loop0 cmp cs:EB_Flag,0 jnz SDB_Ret cmp cs:FkeysMainFlag,0 jz SDB_Ret gotoxy 12h,1 mov ax,0E00h+'M' ScreenIOservice _SYMBPRINT SDB_Ret: pop di si dx cx bx ax ret SDB_2: add cx,2 add dx,2 jmp SDB_2_ret ; -------------------------------------------------------------------------- ; - SHOW FUNCTION KEYS SFK_None db ' ',0 SFK_Cont db 'Apple ',0 SFK_Animat db 'Animat',0 SFK_Trace db 'Trace ',0 SFK_Step db 'Step ',0 SFK_GoTo db 'Run to',0 SFK_GoToRTS db 'To RTS',0 SFK_View db 'View ',0 SFK_HelpON db 'Help ',0 SFK_HelpOFF db 'CloseH',0 SFK_HelpUp db 'Help ',0 SFK_HelpDown db 'Help ',0 SFK_Stop db 'Stop ',0 SFK_Str db '1 2 3 4 5 ' db '6 7 8 9 10 ',0 FkeyStruc struc FkeyFlag db ? FkeyLabel dw ? FkeyProc dw ? FkeyStruc ends FkeysMainFlag db 1 FkeysBuffer FkeyStruc <1, SFK_Cont, GK_Cont > FkeyStruc <1, SFK_Animat, GK_Animat > FkeyStruc <1, SFK_Step, GK_Step > FkeyStruc <1, SFK_Trace, GK_Trace > FkeyStruc <1, SFK_GoTo, GK_GoTo > FkeyStruc <1, SFK_GoToRTS, GK_ToRTS > FkeyStruc <1, SFK_View, GK_View > FkeyStruc <0, SFK_HelpUp, GK_HelpUp > FkeyStruc <0, SFK_HelpDown, GK_HelpDown> FkeyStruc <1, SFK_HelpOn, GK_Help > ShowFuncKeys: push ax bx cx dx si di gotoxy 19h,0 mov bx,offset SFK_Str mov ah,7 ScreenIOservice _STRINGPRINT gotoxy 19h,1 xor si,si mov di,10 mov dx,484Fh cmp cs:FkeysMainFlag,0 jnz SFK_Loop mov dx,4848h SFK_Loop: mov bx,cs:FkeysBuffer[si].FkeyLabel mov ah,dh cmp cs:FkeysBuffer[si].FkeyFlag,0 jz SFK_ok1 mov ah,dl SFK_ok1: ScreenIOservice _STRINGPRINT add cx,4 add si,size FkeyStruc dec di jnz SFK_Loop pop di si dx cx bx ax ret ; -------------------------------------------------------------------------- ; - SHOW HELP SH_CX dw 376h HelpFlag db 0 HelpAddr dw ? HelpPtr dw ? MinHelpPtr dw ? MaxHelpPtr dw ? SH_Str db 'ÚHelpÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿',0 db '³ ³',0 db 'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ',0 Helps label byte db ' ',0 SH_MoveHelp db ' ',0,' ',0,' ',0 db 1,7,' Use <',1,0Fh,'',1,7,'> keys to move Help',0 db ' ',0 db 1,7,' Press <',1,0Fh,'Enter',1,7,'> when done ',0,0 SH_ComHelp0 db 'Supported Commands List:',0 db ' ',0 db 'REGS',1,7,' -edit registers',0 db ' =',1,7,' -change register',0 db ' ',0 db 'D ',1,7,' -disassemble',0 db 'DA ',1,7,' -dump A',0 db 'DB ',1,7,' -dump B',0 db 'ASM []',1,7,' -assembler mode',0 db 'EA []',1,7,' -edit dump A',0 db 'EB []',1,7,' -edit dump B',0 db ' ',0 db '[ ,]',1,7,' -set {margins}',0 db 'FIND [,..][''st'',..]["st",..]',0 db 1,7,' -find string in {margins}',0 db 'COPY ',1,7,' -copy {margins}',0 db 'COMP ',1,7,' -compare {margins}',0 db 'PDUMP []',0 db 1,7,' -Print Memory Dump',0 db 'PASM []',0 db 1,7,' -Print Disassembled Dump',0 db ' ',0 db 'BREAK<1..6>=',1,7,' -set breakpoint',0 db 'GO [][,]',1,7,' -execute',0 db ' ',0 db '. =',0 db 1,7,' -define label',0 db 'LIST',1,7,' -defined labels list',0 db 'DL ',1,7,' -delete label',0 db 'LAB |',1,7,' -labels activity',0 db 'LL ',1,7,' -load labels',0 db 'SL ',1,7,' -save labels',0 db ' ',0 db 'RECORD [f]',1,7,' macro',0 db 'STOP',1,7,' -stop recording',0 db 'PLAY []',1,7,' -play macro',0 db 'LM ',1,7,' -load macro',0 db 'SM ',1,7,' -save macro',0 db ' ',0 db '? [,h][,d][,b]',0 db 1,7,' -evaluate expression',0 db 'SWAP ',1,7,' -scr swapping',0 db 'SOUND |',0 db 'RESET',1,7,' -cold reset APPLE',0 db 'Assembler Mode',0 db ' ',0 db 1,7,'Enter 65C02 statements,<',1,0Fh,'Esc',1,7,'> Exit',0 db ' ',0 db 'Examples:',0 db 1,7,' LDA (77),Y ',0 db 1,7,' BIT C000',0 db 1,7,' BPL 17FF',0,0 db 'Memory Dump B Editor',0 db ' ',0 db 1,7,'Enter hex numbers, <',1,0Fh,'Esc',1,7,'> Exit',0 db ' ',0 db 1,7,'Use "',1,0Fh,'EB ',1,7,'" command to change',0 db 1,7,'dump address',0,0 db 'Memory Dump A Editor',0 db ' ',0 db 1,7,'Enter hex numbers or chars.',0 db 1,7,'Press <',1,0Fh,'Tab',1,7,'> to swap entry area.',0 db 1,7,'Use "',1,0Fh,'EA ',1,7,'" command to change',0 db 1,7,'dump address',0 db ' ',0 db 1,7,'Press <',1,0Fh,'Esc',1,7,'> to Exit',0,0 db 'Registers Editor',0 db ' ',0 db 1,7,'Select register with <',1,0Fh,'',1,7,'>, then',0 db 1,7,'enter hexadecimal value or press',0 db 1,7,'<',1,0Fh,'Space',1,7,'> to flip a flag.',0 db ' ',0 db 1,7,'Press <',1,0Fh,'Esc',1,7,'> to Exit.',0,0 db 'View Labels',0 db ' ',0 db 1,7,'Use <',1,0Fh,'',1,7,'>,<',1,0Fh,'PgUp',1,7,'>,<',1,0Fh,'PgDn',1,7,'> to move.',0 db ' ',0 db 1,7,'Press <',1,0Fh,'Esc',1,7,'> to Exit.',0,0 ShowHelp: test cs:HelpFlag,1 jz SH_Ret push ax bx cx dx mov cx,cs:SH_CX mov bx,offset SH_Str mov dx,0C26h mov ax,0000000010000000b call DrawBox SH_ok: mov bx,cs:HelpAddr mov dx,cs:SH_CX add dx,(80*2*2)+4 mov al,10 SH_Loop: mov cx,dx add dx,80*2 mov ah,0Fh ScreenIOservice _STRINGPRINT mov bx,cs:ScreenIOparams.SP_bx cmp byte ptr cs:[bx],0 jz SH_Ret0 dec al jnz SH_Loop SH_Ret0: mov cx,cs:SH_CX add cx,2 mov ax,0E00h+'H' cmp cs:FkeysMainFlag,0 jz SH_Ret1 ScreenIOservice _SYMBPRINT SH_Ret1: pop dx cx bx ax SH_Ret: ret SH_Calculate: push bx dx mov bx,offset Helps mov dx,cs:HelpPtr SH_Loop0: cmp byte ptr cs:[bx],0 jz SH_EOL inc bx jmp SH_Loop0 SH_EOL: inc bx dec dx jnz SH_Loop0 mov cs:HelpAddr,bx pop dx bx ret SH_Choose: mov cs:HelpPtr,ax mov cs:MinHelpPtr,ax mov cs:MaxHelpPtr,bx call SH_Calculate ret ; -------------------------------------------------------------------------- ; - SHOW LABS SL_Flag db 0 SL_Ptr dw 0 SL_CX dw ? SL_Str db 'ÚDefined Labels ListÄÄÄÄÄÄÄ¿',0 db '³ ³',0 db 'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ',0 ShowLabels: test cs:SL_Flag,1 jz SL_Ret push ax bx cx dx si di gotoxy 7,12 mov bx,offset SL_Str mov dx,0C1Dh mov ax,0000000100000000b call DrawBox mov di,10 mov bx,SL_Ptr mov si,bx shl si,1 mov dx,19 gotoxy 9,14 mov cs:SL_CX,cx SL_Loop: mov cx,cs:SL_CX call PrintSymbol mov cx,cs:SL_CX add cs:SL_CX,80*2 add cx,20 * 2 mov ah,3 mov al,byte ptr cs:SymbVal[si+1] ScreenIOservice _BYTEPRINT mov al,byte ptr cs:SymbVal[si] ScreenIOservice _BYTEPRINT add si,2 inc bx cmp bx,cs:SymbValPtr jae SL_Ret1 dec di jnz SL_Loop SL_Ret1: pop di si dx cx bx ax SL_Ret: ret ; -------------------------------------------------------------------------- ; ******************************************************************* ; ** ** ; ** ** ; ** P R I N T S E R V I C E S ** ; ** ** ; ** ** ; ******************************************************************* WordPrintS: push ax bx call WordPrint jnc WPS_ret mov al,bh ScreenIOservice _BYTEPRINT mov al,bl ScreenIOservice _BYTEPRINT WPS_ret: pop bx ax ret BYTEPRINTS: push ax bx xor bh,bh call WordPrint jnc BPS_ret mov al,bl ScreenIOservice _BYTEPRINT BPS_ret: pop bx ax ret WordPrintFl db 1 WP_al db ? WordPrint: push ax bx dx di es cx ; Print a word push cs pop es ; Input: test byte ptr cs:WordPrintFl,1 ; BX-word to print jz WP_1 ; AH-attr, CL-htab, CH-vtab mov di,offset SymbVal ; AL-length cld mov cx,cs:SymbValPtr cmp cx,0 jz WP_1 push ax mov ax,bx repne scasw pop ax jne WP_1 sub di,offset SymbVal + 2 mov bx,di shr bx,1 pop cx xor dx,dx mov dl,al mov cs:WP_al,al call PrintSymbol clc jmp WP_ret WP_1: stc pop cx WP_ret: pop es di dx bx ax ret ; ******************************************************************* ; ** ** ; ** ** ; ** G E T A D D R E S S ** ; ** ** ; ** ** ; ******************************************************************* GAdd_Oper db '+-*/|^&<>' GAdd_DoOper dw GA_Plus,GA_Minus,GA_Multiply,GA_Divide dw GA_Or,GA_Xor,GA_And,GA_Shl,GA_Shr GAdd_cx dw ? GetAddress: push bx dx di call GetAdr jc GAdd_Error GAdd_0: mov bx,ax GetLineService _GL_GetSymb push cx mov di,offset GAdd_Oper mov cx,offset GAdd_DoOper - offset GAdd_Oper call CalcCommand pop cx jnc GAdd_1 mov ax,bx pop di dx bx ret GAdd_Error: pop di dx bx ax ret GAdd_1: mov cs:GAdd_cx,cx call GetAdr jc GAdd_Error shl di,1 xchg ax,bx call word ptr cs:GAdd_DoOper[di] jc GAdd_0 mov cs:GetKeyParams.RK_ErrPtr,0 jmp GAdd_0 GA_Plus: add ax,bx mov cs:GetKeyParams.RK_ErrPtr,offset GA_PlusMes ret GA_Minus: sub ax,bx mov cs:GetKeyParams.RK_ErrPtr,offset GA_MinusMes ret GA_Multiply: mul bx mov cs:GetKeyParams.RK_ErrPtr,offset GA_MulMes ret GA_Divide: push dx xor dx,dx cmp bx,0 jz GA_ZeroDiv cmp ax,bx jb GA_DivRet GA_DivLoop: sub ax,bx jc GA_DivOk inc dx jmp GA_DivLoop GA_DivOk: add ax,bx or ax,ax clc jz GA_DivRet push dx mov dx,ax mov bx,3 GA_DivLoop00: mov al,dl shr dx,4 and al,0Fh cmp al,0Ah cmc adc al,30h daa mov cs:GA_DivRest[bx],al dec bx jns GA_DivLoop00 pop dx stc mov cs:GetKeyParams.RK_ErrPtr,offset GA_DivMes GA_DivRet: mov ax,dx pop dx ret GA_ZeroDiv: mov cs:GetKeyParams.RK_ErrPtr,offset ZeroDivMes pop dx di mov cx,cs:GAdd_cx inc cl jmp GAdd_Error GA_Or: or ax,bx clc ret GA_Xor: xor ax,bx clc ret GA_And: and ax,bx clc ret GA_Shl: push cx mov cl,bl shl ax,cl pop cx ret GA_Shr: push cx mov cl,bl shr ax,cl pop cx clc ret Delimiters_C = 19 Delimiters db '{[()]}/,=+-*/|^&<>',0 GAd_Sym db 'rxysp.%@' GAd_Sub dw GAd_A, GAd_X, GAd_Y, GAd_S, GAd_P dw GAd_Label, GAd_Bin, GAd_Dec, GAd_Hex GAd_Flag db ? GetAdr: push bx di cx GetLineService _GL_GetSymb mov di,offset GAd_Sym mov cx,offset GAd_Sub - offset GAd_Sym call CalcCommand pop cx jnc GAd_NotHex mov di,8 GAd_NotHex: shl di,1 call word ptr cs:GAd_Sub[di] jc GAd_Ret dec cl mov ax,bx mov cs:GetKeyParams.RK_ErrPtr,0 clc GAd_Ret: pop di bx ret GAd_A: xor bx,bx mov bl,cs:Regs.A GetLineService _GL_GetSymb GetLineService _GL_GetSymb ret GAd_X: xor bx,bx mov bl,cs:Regs.X GetLineService _GL_GetSymb GetLineService _GL_GetSymb ret GAd_Y: xor bx,bx mov bl,cs:Regs.Y GetLineService _GL_GetSymb GetLineService _GL_GetSymb ret GAd_S: xor bx,bx mov bl,cs:Regs.S GetLineService _GL_GetSymb GetLineService _GL_GetSymb ret GAd_P: GetLineService _GL_GetSymb GetLineService _GL_GetSymb call Upcase cmp al,'c' je Gad_PC xor bx,bx mov bl,cs:Regs.P ret GAd_PC: mov bx,cs:Regs.PC GetLineService _GL_GetSymb ret GAd_Label: GetLineService _GL_GetSymb call SymbGetVal jc GAd_Lerror mov cx,cs:SGV_cx mov bx,ax inc cl clc ret GAd_Lerror: inc cl stc ret GAd_Hex: mov byte ptr cs:GAd_Flag,0 xor bx,bx GetLoop0: GetLineService _GL_GetSymb push cx mov di,offset Delimiters mov cx,Delimiters_C call CalcCommand pop cx jnc GAd_Hret call Upcase cmp al,'0' jb GAd_Herror cmp al,'9' jbe Anumb cmp al,'a' jb GAd_Herror cmp al,'f' ja GAd_Herror sub al,27h Anumb: sub al,'0' OkNum: shl bx,1 jc GAd_Oj shl bx,1 jc GAd_Oj shl bx,1 jc GAd_Oj shl bx,1 jc GAd_Oj or bl,al mov byte ptr cs:GAd_Flag,1 jmp GetLoop0 GAd_Hret: test byte ptr cs:GAd_Flag,1 jz GAd_Nj clc ret GAd_Herror: mov cs:GetKeyParams.RK_ErrPtr,offset NotHexMes stc ret GAd_Oj: jmp GAd_Overflow GAd_Nj: jmp GAd_NumbMiss GAd_Bin: mov byte ptr cs:GAd_Flag,0 GetLineService _GL_GetSymb xor bx,bx GetLoop1: GetLineService _GL_GetSymb push cx mov di,offset Delimiters mov cx,Delimiters_C call CalcCommand pop cx jnc GAd_Bret sub al,'0' cmp al,1 ja GAd_Berror shl bx,1 jc GAd_Overflow or bl,al mov byte ptr cs:GAd_Flag,1 jmp GetLoop1 GAd_Bret: test byte ptr cs:GAd_Flag,1 jz GAd_NumbMiss clc ret GAd_Berror: mov cs:GetKeyParams.RK_ErrPtr,offset NotBinMes stc ret GAd_Dec: mov byte ptr cs:GAd_Flag,0 GetLineService _GL_GetSymb xor bx,bx GetLoop2: GetLineService _GL_GetSymb push cx mov di,offset Delimiters mov cx,Delimiters_C call CalcCommand pop cx jnc GAd_Dret sub al,'0' cmp al,9 ja GAd_Derror push ax mov ax,10 mul bx mov bx,ax pop ax jc GAd_Overflow mov ah,0 add bx,ax jc GAd_Overflow mov byte ptr cs:GAd_Flag,1 jmp GetLoop2 GAd_Dret: test byte ptr cs:GAd_Flag,1 jz GAd_NumbMiss clc ret GAd_Derror: mov cs:GetKeyParams.RK_ErrPtr,offset NotDecMes stc ret GAd_Overflow: mov cs:GetKeyParams.RK_ErrPtr,offset BigNumMes stc ret GAd_NumbMiss: mov cs:GetKeyParams.RK_ErrPtr,offset NumbMissMes or al,al jnz Gad_NumbMiss1 inc cl Gad_NumbMiss1: stc ret ; ******************************************************************* ; ** ** ; ** ** ; ** B R E A K P O I N T S E R V I C E S ** ; ** ** ; ** ** ; ******************************************************************* SetBreaks proc far push ax bx dx si ds mov ax,Apple mov ds,ax xor bx,bx mov dx,7 StB_Loop1: test cs:Breakpoints[bx].BP_ActiveFlag,1 jz StB_Next mov si,cs:Breakpoints[bx].BP_Address mov al,2 xchg al,[si] mov cs:Breakpoints[bx].BP_ByteStorage,al StB_Next: add bx,7 dec dx jnz StB_Loop1 pop ds si dx bx ax ret SetBreaks endp UnsetBreaks proc far push ax bx dx si ds mov ax,Apple mov ds,ax mov bx,6 * 7 mov dx,7 UsB_Loop1: test cs:Breakpoints[bx].BP_ActiveFlag,1 jz UsB_Next mov si,cs:Breakpoints[bx].BP_Address mov al,cs:Breakpoints[bx].BP_ByteStorage cmp byte ptr [si],2 jne UsB_Next mov [si],al UsB_Next: sub bx,7 dec dx jnz UsB_Loop1 pop ds si dx bx ax ret UnsetBreaks endp CheckBreaks: push si mov si,cs:Regs.PC stc call CheckBreak pop si ret F1_or_Invalid? db ? CheckBreak: push ax bx cx dx mov al,1 jc CB_0 xor ax,ax CB_0: xor bx,bx mov cx,bx mov dx,bx CB_Loop1: test cs:Breakpoints[bx].BP_ActiveFlag,1 jz CB_1 cmp si,cs:Breakpoints[bx].BP_Address jne CB_1 mov cl,1 or bx,bx jz CB_1 or al,al jz CB_1 mov cs:Breakpoints[bx].BP_FlashFlag,cl call ShowPrevIns call StopAnimate mov cs:GetKeyParams.RK_ErrPtr,offset BreakpointMes mov cs:BreakpointNum,dl add cs:BreakpointNum,30h CB_1: add bx,7 inc dx cmp dx,7 jne CB_Loop1 cmp cl,1 pop dx cx bx ax ret ; ******************************************************************* ; ** ** ; ** ** ; ** L A B E L S S E R V I C E S ** ; ** ** ; ** ** ; ******************************************************************* SGV_dx dw ? SGV_adr dw ? SGV_nameBeg dw ? SGV_nameEnd dw ? SGV_cx dw ? SymbGetVal: push bx dx si di cx ; Returns value of a symbol xor dx,dx mov cs:SGV_NameBeg,dx ; Input: SGV_Loop0: GetLineService _GL_GetSymb ; CH -> vtab, CL -> htab inc dx push cx ; Output: mov di,offset Delimiters ; AX -> value mov cx,Delimiters_C ; cf -> set if not found call CalcCommand pop cx jc SGV_Loop0 dec dx mov cs:SGV_dx,dx xor bx,bx xor si,si SGV_Loop1: pop cx push cx mov dx,cs:SGV_dx SGV_Loop2: GetLineService _GL_GetSymb SGV_Loop3: call Upcase mov ah,al mov al,cs:SymbMem[bx] call Upcase xchg al,ah cmp al,ah jne SGV_NoOk0 dec dx jnz SGV_NoOk1 inc bx cmp byte ptr cs:SymbMem[bx],0 jnz SGV_NoOk0 shl si,1 mov ax,cs:SymbVal[si] mov cs:GetKeyParams.RK_ErrPtr,0 mov cs:SGV_cx,cx mov cs:SGV_adr,si mov cs:SGV_nameEnd,bx clc jmp SGV_ret SGV_NoOk0: cmp byte ptr cs:SymbMem[bx],0 jz SGV_Cont1 inc bx jmp SGV_NoOk0 SGV_Cont1: inc bx cmp bx,cs:SymbPtr ja SGV_NotFnd mov cs:SGV_NameBeg,bx inc si jmp SGV_Loop1 SGV_NoOk1: inc bx cmp bx,cs:SymbPtr jbe SGV_Loop2 SGV_NotFnd: mov cs:GetKeyParams.RK_ErrPtr,offset SymNotFndErr stc SGV_ret: pop cx di si dx bx ret PrintSymbol: push ax bx dx di ; Print a symbol and ah,11110000b or ah,0Fh ; Input: xor di,di ; CH-vtab, CL-htab, *AH-attr test cs:ScreenIOparams.SP_BufFlag,1 ; BX-Symbol number jz PS_Ok001 ; DX-Max Length mov dx,0FFFFh mov al,'.' ScreenIOservice _SYMBPRINT PS_Ok001: cmp bx,0 jz PS_Go dec di PS_Loop1: inc di cmp byte ptr cs:SymbMem[di],0 jne PS_Loop1 dec bx jnz PS_Loop1 PS_Loop2: inc di PS_Go: mov al,cs:SymbMem[di] or al,al jz PS_ret ScreenIOservice _SYMBPRINT dec dx jnz PS_Loop2 PS_ret: pop di dx bx ax ret ; ******************************************************************* ; ** ** ; ** ** ; ** K E Y B O A R D S E R V I C E S ** ; ** ** ; ** ** ; ******************************************************************* Alt_Keys db 'prcmlh' Alt_Procs dw Alt_Program,Alt_Regs,Alt_Command,Alt_Memory,Alt_Labels dw Alt_Help Alt_Key proc far push cx si di ds mov di,offset Alt_Keys mov cx,offset Alt_Procs- offset Alt_Keys call CalcCommand jc Alt_Ret shl di,1 call cs:Alt_Procs[di] jc Alt_Ret mov al,0Ch Alt_Ret: pop ds di si cx ret Alt_Program proc near mov cs:GoWhere?,G_MiniAsm clc ret Alt_Program endp Alt_Regs proc near mov cs:GoWhere?,G_Registers clc ret Alt_Regs endp Alt_Command proc near mov cs:GoWhere?,G_COMMAND_ENTRY clc ret Alt_Command endp Alt_Memory proc near mov cs:GoWhere?,G_EditB mov al,cs:EB_Flag xor al,1 jnz Alt_Mret mov cs:GoWhere?,G_EditA Alt_Mret: clc ret Alt_Memory endp Alt_Labels proc near mov cs:GoWhere?,G_LabList clc ret Alt_Labels endp Alt_Help proc near mov cs:GoWhere?,G_MoveHelp clc ret Alt_Help endp Alt_Key endp GK_Fkey proc far push ax bx cx dx si di bp ds es push cs:ShowAllNumber push cs:ActiveFlags mov cs:ActiveFlags,0 mov cs:ShowAllNumber,5 mov bx,Emulate mov es,bx mov bx,Apple mov ds,bx xor bx,bx mov bl,size FkeyStruc mul bl mov bx,ax cmp cs:FkeysBuffer[bx].FkeyFlag,0 jz GK_NotActive mov dx,cs:AssembAdr call cs:FkeysBuffer[bx].FkeyProc GK_NotActive: pop cs:ActiveFlags pop cs:ShowAllNumber mov cs:GetKeyParams.RK_FkeyFlag,1 mov word ptr cs:GetKeyParams.RK_FkeyProc,offset GK_Fkey mov word ptr cs:GetKeyParams.RK_FkeyProc[2],seg GK_Fkey pop es ds bp di si dx cx bx ax ret GK_Fkey endp GK_Cont: mov cs:Breakpoints.BP_ActiveFlag,0 call GoAppleII0 ret OldC050 db ? GK_Animat: xor cs:GetKeyParams.RK_WaitKeyFlag,1 mov ax,100h cmp cs:GetKeyParams.RK_WaitKeyFlag,al mov bx,offset StopAnimate jz T_DoIt mov bx,offset StartAnimate T_DoIt: call bx ret StartAnimate: push ax xor al,al mov cs:FkeysBuffer[1*size FkeyStruc].FkeyLabel,offset SFK_Stop mov cs:FkeysBuffer[2*size FkeyStruc].FkeyFlag,al mov cs:FkeysBuffer[3*size FkeyStruc].FkeyFlag,al mov cs:FkeysBuffer[4*size FkeyStruc].FkeyFlag,al mov cs:FkeysBuffer[5*size FkeyStruc].FkeyFlag,al mov al,C050 mov cs:OldC050,al mov cs:GetKeyParams.RK_WaitKeyFlag,1 pop ax ret StopAnimate: push ax mov ah,1 mov cs:FkeysBuffer[1*size FkeyStruc].FkeyLabel,offset SFK_Animat mov cs:FkeysBuffer[2*size FkeyStruc].FkeyFlag,ah mov cs:FkeysBuffer[3*size FkeyStruc].FkeyFlag,ah mov cs:FkeysBuffer[4*size FkeyStruc].FkeyFlag,ah mov cs:FkeysBuffer[5*size FkeyStruc].FkeyFlag,ah mov al,cs:OldC050 mov es:C050,al mov cs:GetKeyParams.RK_WaitKeyFlag,0 pop ax ret T_WaitKey proc far push bp ds es ax mov ax,Apple mov ds,ax mov ax,Emulate mov es,ax mov al,es:C050 call StepAppleII call CheckBreaks jc T_ok01 cmp cs:ViewFlag,0 jz t_ok01 inc cs:ViewFlag mov es:C000,94h ; Press F7 to end view mode T_ok01: cmp al,es:C050 je T_ok00 mov al,es:C050 mov cs:OldC050,al ScreenIOservice _SETTEXTMODE T_ok00: test cs:ScreenIOparams.SS_ScreenFlag,1 jz T_ok10 cmp cs:GetKeyParams.RK_WaitKeyFlag,0 jz T_ok10 call ShowAll ScreenIOservice _SHOWCURSOR T_ok10: pop ax es ds bp ret T_WaitKey endp GK_Step: mov cs:Regs.PC,dx mov bx,dx mov al,[bx] xor bx,bx mov bl,al xor ax,ax mov al,cs:InstrLongTbl[bx] test al,10000000b jz GK_Trace and al,00000011b add ax,cs:Regs.PC mov cs:Breakpoints.BP_ActiveFlag,1 mov cs:Breakpoints.BP_Address,ax mov si,cs:Regs.PC call GoAppleII mov cs:Breakpoints.BP_ActiveFlag,0 mov cs:ShowPrev?,1 mov cs:PrevAdr,si ret GK_Trace: mov cs:Regs.PC,dx call StepAppleII call CheckBreaks ScreenIOservice _SETTEXTMODE ret GK_GoTo: mov cs:Breakpoints.BP_ActiveFlag,1 mov cs:Breakpoints.BP_Address,dx mov si,cs:Regs.PC call GoAppleII mov cs:Breakpoints.BP_ActiveFlag,0 call ShowPrevIns ret GK_ToRTS: mov ax,Emulate mov es,ax xor ax,ax mov cs:FkeysMainFlag,al xchg cs:ActiveFlags,ax mov cs:GetKeyParams.RK_ErrPtr, offset ToRTSmes call ShowAll ScreenIOService _SHOWSCREEN mov cs:ActiveFlags,ax call InitBufferA call InitBufferB mov al,cs:Regs.S GK_ToRTS_loop: call StepAppleII_ ScreenIOservice _SETTEXTMODE cmp C000,0 jnz GK_ToRTS_ret mov bx,cs:Regs.PC cmp byte ptr ds:[bx],60h jne GK_ToRTS_loop cmp cs:Regs.S,al jne GK_ToRTS_loop GK_ToRTS_ret: xor ax,ax mov C000,al mov cs:GetKeyParams.RK_ErrPtr,ax inc al mov cs:FkeysMainFlag,al call ShowPrevIns ret ViewFlag db 0 GK_View: mov cs:ViewFlag,1 mov al,C050 mov cs:OldC050,al ScreenIOservice _SetScreen mov cs:GetKeyParams.RK_FkeyFlag,0 mov cs:ScreenIOparams.SS_ScreenFlag,0 US_Loop1: call ReadKey cmp cs:ViewFlag,2 jne US_NotBreak mov cs:GetKeyParams.RK_ErrPtr,offset BreakpointMes US_NotBreak: cmp cs:ViewFlag,0 jz US_Ret cmp al,14h je US_Ret cmp al,0Ch je US_Ret cmp al,18h je US_Quit cmp al,0Fh je US_Stop call MySetScreen jmp US_Loop1 US_Ret: mov al,cs:OldC050 mov C050,al US_Quit: mov cs:ScreenIOparams.SS_ScreenFlag,1 mov cs:ViewFlag,0 ret US_Stop: call StopAnimate jmp US_Ret GK_Help: mov ax,100h xor cs:HelpFlag,ah jnz GK_HelpOn mov cs:FkeysBuffer[9*size FkeyStruc].FkeyLabel,offset SFK_HelpOn mov cs:FkeysBuffer[7*size FkeyStruc].FkeyFlag,al mov cs:FkeysBuffer[8*size FkeyStruc].FkeyFlag,al jmp GK_HelpRet GK_HelpOn: mov cs:FkeysBuffer[9*size FkeyStruc].FkeyLabel,offset SFK_HelpOff mov cs:FkeysBuffer[7*size FkeyStruc].FkeyFlag,ah mov cs:FkeysBuffer[8*size FkeyStruc].FkeyFlag,ah GK_HelpRet: ret GK_HelpUp: push ax mov ax,cs:MinHelpPtr cmp ax,cs:HelpPtr je GK_HelpUpRet dec cs:HelpPtr call SH_Calculate GK_HelpUpRet: pop ax ret GK_HelpDown: push ax mov ax,cs:MaxHelpPtr cmp ax,cs:HelpPtr je GK_HelpDownRet inc cs:HelpPtr call SH_Calculate GK_HelpDownRet: pop ax ret GK_None: ret ; ******************************************************************* ; ** ** ; ** ** ; ** C O M M A N D S S E R V I C E S ** ; ** ** ; ** ** ; ******************************************************************* Upcase: cmp al,'A' jb UPCSret cmp al,'Z' ja UPCSret or al,20h UPCSret: ret CalcCommand: push ax bx cx es ; Returns number of a command . push cs ; Input: pop es ; di -> offset Commands call Upcase ; al -> search command cld ; cx -> commands count mov bx,di repne scasb ; Output: stc ; di <- Number of the command jne CC_end ; cf <- 1 if not found sub di,bx dec di clc CC_end: pop es cx bx ax ret MainCommands db '***',0 db 'a',0 db 'x',0 db 'y',0 db 's',0 db 'p',0 db 'pc',0 db 'regs',0 db 'asm',0 db 'ea',0 db 'eb',0 db 'd',0 db 'da',0 db 'db',0 db '[',0 db 'find',0 db 'copy',0 db 'compare',0 db 'break',0 db 'go',0 Com_LLabels db 'll',0 Com_SLabels db 'sl',0 db '.',0 db 'list',0 db 'dl',0 db 'labels',0 ; ON / OFF db 'swap',0 ; ON / OFF db '?',0 db 'reset',0 db 'movhlp',0 db 'pdump',0 db 'pasm',0 db 'sound',0 db 'record',0 db 'stop',0 db 'play',0 Com_LRecord db 'lm',0 Com_SRecord db 'sm' ENDScan1 db 0 AsmInstr db '***',0 db 'lda',0 db 'ldx',0 db 'ldy',0 db 'sta',0 db 'stx',0 db 'sty',0 db 'tax',0 db 'tay',0 db 'tsx',0 db 'txa',0 db 'txs',0 db 'tya',0 db 'pha',0 db 'php',0 db 'pla',0 db 'plp',0 db 'adc',0 db 'sbc',0 db 'inc',0 db 'inx',0 db 'iny',0 db 'dec',0 db 'dex',0 db 'dey',0 db 'and',0 db 'ora',0 db 'eor',0 db 'asl',0 db 'lsr',0 db 'rol',0 db 'ror',0 db 'cmp',0 db 'cpx',0 db 'cpy',0 db 'bit',0 db 'bcc',0 db 'bcs',0 db 'beq',0 db 'bmi',0 db 'bne',0 db 'bpl',0 db 'bvc',0 db 'bvs',0 db 'bra',0 db 'jmp',0 db 'jsr',0 db 'rts',0 db 'rti',0 db 'brk',0 db 'nop',0 db 'clc',0 db 'cld',0 db 'cli',0 db 'clv',0 db 'sec',0 db 'sed',0 db 'sei',0 db 'tsb',0 db 'trb',0 db 'phy',0 db 'phx',0 db 'ply',0 db 'plx',0 db 'stz' ENDScan2 db 0 ; ******************************************************************* ; ** ** ; ** ** ; ** A P P L E R I N T E R F A C E ** ; ** ** ; ** ** ; ******************************************************************* MSS_keys db 'gth12fm ' MSS_subrt dw MSS_Graph, MSS_Text, MSS_HiGr, MSS_p1, MSS_p2 dw MSS_NoMix, MSS_Mix, MSS_Default MySetScreen: push ax cx di es mov di,offset MSS_keys mov cx,offset MSS_subrt - offset MSS_keys call CalcCommand jc MSS_ret mov ax,seg C050 mov es,ax shl di,1 mov al,C050 mov ah,al call cs:MSS_Subrt[di] cmp al,ah je MSS_ret ScreenIOservice _SetScreen mov C050,al MSS_ret: pop es di cx ax ret MSS_Graph: and al,11110110b ret MSS_Text: or al,00000001b ret MSS_HiGr: or al,00001000b and al,11111110b ret MSS_p1: and al,11111011b ret MSS_p2: or al,00000100b ret MSS_NoMix: and al,11111101b ret MSS_Mix: or al,00000010b ret MSS_Default: mov al,cs:OldC050 ret DebugInit: mov ax,Apple mov ds,ax call InitGetLine cmp byte ptr cs:F1_or_Invalid?,0 jz DI_NoInvalid mov cs:GetKeyParams.RK_ErrPtr, offset InvalidOpcode DI_NoInvalid: mov ax,cs:Regs.PC mov cs:AssembAdr,ax call ShowPrevIns call InitBufferA call InitBufferB ret InitGetLine: push cx mov cs:GetLineParams.GL_Color, 0Bh mov cs:GetLineParams.GL_OverCurColor,40h mov cs:GetLineParams.GL_InsCurColor, 20h mov cs:GetLineParams.GL_MaxPrint, 32 mov cs:GetLineParams.GL_MaxLength, 99 gotoxy 17,2 mov cs:GetLineParams.GL_CX,cx pop cx ret assume ds:Apple,es:TaskControl GetRegisters proc near push ax es mov ax,TaskControl mov es,ax mov al,es:r_A mov cs:Regs.A,al mov al,es:r_X mov cs:Regs.X,al mov al,es:r_Y mov cs:Regs.Y,al mov al,es:r_S mov cs:Regs.S,al mov al,es:r_P mov cs:Regs.P,al mov ax,es:r_PC mov cs:Regs.PC,ax pop es ax ret GetRegisters endp SetRegisters proc near push ax es mov ax,TaskControl mov es,ax mov al,cs:Regs.A mov es:r_A,al mov al,cs:Regs.X mov es:r_X,al mov al,cs:Regs.Y mov es:r_Y,al mov al,cs:Regs.S mov es:r_S,al mov al,cs:Regs.P mov es:r_P,al mov ax,cs:Regs.PC mov es:r_PC,ax pop es ax ret SetRegisters endp SwapTime dw 9 assume es:Emulate GoAppleII0: push ax xor ax,ax xchg ax,cs:SwapTime call GoAppleII mov cs:SwapTime,ax pop ax ret GoAppleII: push ax bx cx dx es call InitBufferA call InitBufferB mov cx,seg C050 mov es,cx xor ax,ax xchg cs:ActiveFlags,ax mov cs:GetKeyParams.RK_ErrPtr, offset ExecutingMes call ShowAll ScreenIOService _SHOWSCREEN mov cs:ActiveFlags,ax mov al,0C3h xchg al,es:synchro_push_ax mov cs:old_synchro,al push es mov ax,TaskControl mov es,ax assume es:TaskControl mov es:T_Iflags,00000001b SwitchToProcess PID_EMULATOR mov es:T_Iflags,00000010b pop es assume es:Emulate mov al,cs:old_synchro mov es:synchro_push_ax,al mov ax,cs:SwapTime call ScreenSwapReq call SetBreaks cli SwitchToProcess PID_EMULATOR mov cs:GetKeyParams.RK_ErrPtr,0 call CheckBreaks jnc GAII_NoInvalid cmp cs:F1_or_Invalid?,0 jz GAII_NoInvalid mov cs:GetKeyParams.RK_ErrPtr, offset InvalidOpcode GAII_NoInvalid: mov ax,cs:Regs.PC mov cs:AssembAdr,ax call BuffDisasm call ShowPrevIns mov al,1 mov cs:RE_FirstTime?,al mov cs:EA_Params.EB_FirstFl,al mov cs:EB_Params.EB_FirstFl,al pop es dx cx bx ax sti ret old_synchro db ? StepAppleII: call InitBufferA call InitBufferB StepAppleII_: push ax mov al,0C3h xchg al,es:synchro_push_ax mov cs:old_synchro,al push bx es mov ax,TaskControl mov es,ax assume es:TaskControl mov es:T_Iflags,00000001b mov bx,cs:Regs.PC SwitchToProcess PID_EMULATOR mov cs:ShowPrev?,1 mov cs:PrevAdr,bx mov ax,cs:Regs.PC mov cs:AssembAdr,ax call BuffDisasm pop es bx assume es:Emulate mov al,cs:old_synchro mov es:synchro_push_ax,al pop ax ret GL_UserCommands db 7,8,3,4 GL_UserSubrt dw UP,DOWN,GL_PgUp,GL_PgDn GetLineUser proc far push bx cx di bp ds mov di,Apple mov ds,di mov di,offset GL_UserCommands mov cx,offset GL_UserSubrt- offset GL_UserCommands call CalcCommand jc GLU_Ret shl di,1 call GL_UserSubrt[di] GLU_Ret: pop ds bp di cx bx ret GetLineUser endp GL_PgUp: push bx mov bx,09h GL_PU_loop: call UP dec bx jnz GL_PU_loop pop bx clc ret GL_PgDn: push bx mov bx,09h GL_PD_loop: call DOWN dec bx jnz GL_PD_loop pop bx clc ret ; ******************************************************************* ; ** ** ; ** ** ; ** T A B L E S ** ; ** ** ; ** ** ; ******************************************************************* ; 0 1 2 3 4 5 6 7 8 9 A B C D E F InstrTable db 'BRKORA??????TSBORAASL???PHPORAASL???TSBORAASL???' ;00 db 'BPLORAORA???TRBORAASL???CLCORAINC???TRBORAASL???' ;10 db 'JSRAND??????BITANDROL???PLPANDROL???BITANDROL???' ;20 db 'BMIANDAND???BITANDROL???SECANDDEC???BITANDROL???' ;30 db 'RTIEOR?????????EORLSR???PHAEORLSR???JMPEORLSR???' ;40 db 'BVCEOREOR??????EORLSR???CLIEORPHY??????EORLSR???' ;50 db 'RTSADC??????STZADCROR???PLAADCROR???JMPADCROR???' ;60 db 'BVSADCADC???STZADCROR???SEIADCPLY???JMPADCROR???' ;70 db 'BRASTA??????STYSTASTX???DEYBITTXA???STYSTASTX???' ;80 db 'BCCSTASTA???STYSTASTX???TYASTATXS???STZSTASTZ???' ;90 db 'LDYLDALDX???LDYLDALDX???TAYLDATAX???LDYLDALDX???' ;A0 db 'BCSLDALDA???LDYLDALDX???CLVLDATSX???LDYLDALDX???' ;B0 db 'CPYCMP??????CPYCMPDEC???INYCMPDEX???CPYCMPDEC???' ;C0 db 'BNECMPCMP??????CMPDEC???CLDCMPPHX??????CMPDEC???' ;D0 db 'CPXSBC??????CPXSBCINC???INXSBCNOP???CPXSBCINC???' ;E0 db 'BEQSBCSBC??????SBCINC???SEDSBCPLX??????SBCINC???' ;F0 ; 0 1 2 3 4 5 6 7 8 9 A B C D E F InstrLongTbl db 82h,2,5,5,2,2,2,5,1,2,1,5, 3 ,3,3,5 ;00 db 82h,2,2,5,2,2,2,5,1,3,1,5, 3 ,3,3,5 ;10 db 83h,2,5,5,2,2,2,5,1,2,1,5, 3 ,3,3,5 ;20 db 82h,2,2,5,2,2,2,5,1,3,1,5, 3 ,3,3,5 ;30 db 1,2,5,5,5,2,2,5,1,2,1,5,83h,3,3,5 ;40 db 82h,2,2,5,5,2,2,5,1,3,1,5, 5 ,3,3,5 ;50 db 1,2,5,5,2,2,2,5,1,2,1,5,83h,3,3,5 ;60 db 82h,2,2,5,2,2,2,5,1,3,1,5,83h,3,3,5 ;70 db 82h,2,5,5,2,2,2,5,1,2,1,5, 3 ,3,3,5 ;80 db 82h,2,2,5,2,2,2,5,1,3,1,5, 3 ,3,3,5 ;90 db 2,2,2,5,2,2,2,5,1,2,1,5, 3 ,3,3,5 ;A0 db 82h,2,2,5,2,2,2,5,1,3,1,5, 3 ,3,3,5 ;B0 db 2,2,5,5,2,2,2,5,1,2,1,5, 3 ,3,3,5 ;C0 db 82h,2,2,5,5,2,2,5,1,3,1,5, 5 ,3,3,5 ;D0 db 2,2,5,5,2,2,2,5,1,2,1,5, 3 ,3,3,5 ;E0 db 82h,2,2,5,5,2,2,5,1,3,1,5, 5 ,3,3,5 ;F0 ; ??? 0 ; # 1 ; ZP 2 ; ZP,X 3 ; Full 4 ; Full,X 5 ; Full,Y 6 ; (ZP,X) 7 ; (ZP),Y 8 ; ZP,Y 9 ; JMP A ; JMP () B ; NoOper C ; BEQ D ; (ZP) E ; (....,X) F ; 0 1 2 3 4 5 6 7 8 9 A B C D E F ParamTable db 1, 7, 0, 0, 2, 2, 2, 0,12, 1,12, 0, 4, 4, 4, 0 ; 00 db 13, 8,14, 0, 2, 3, 3, 0,12, 6,12, 0, 4, 5, 5, 0 ; 10 db 10, 7, 0, 0, 2, 2, 2, 0,12, 1,12, 0, 4, 4, 4, 0 ; 20 db 13, 8,14, 0, 3, 3, 3, 0,12, 6,12, 0, 5, 5, 5, 0 ; 30 db 12, 7, 0, 0, 0, 2, 2, 0,12, 1,12, 0,10, 4, 4, 0 ; 40 db 13, 8,14, 0, 0, 3, 3, 0,12, 6,12, 0, 0, 5, 5, 0 ; 50 db 12, 7, 0, 0, 2, 2, 2, 0,12, 1,12, 0,11, 4, 4, 0 ; 60 db 13, 8,14, 0, 3, 3, 3, 0,12, 6,12, 0,15, 5, 5, 0 ; 70 db 13, 7, 0, 0, 2, 2, 2, 0,12, 1,12, 0, 4, 4, 4, 0 ; 80 db 13, 8,14, 0, 3, 3, 9, 0,12, 6,12, 0, 4, 5, 5, 0 ; 90 db 1, 7, 1, 0, 2, 2, 2, 0,12, 1,12, 0, 4, 4, 4, 0 ; A0 db 13, 8,14, 0, 3, 3, 9, 0,12, 6,12, 0, 5, 5, 6, 0 ; B0 db 1, 7, 0, 0, 2, 2, 2, 0,12, 1,12, 0, 4, 4, 4, 0 ; C0 db 13, 8,14, 0, 0, 3, 3, 0,12, 6,12, 0, 0, 5, 5, 0 ; D0 db 1, 7, 0, 0, 2, 2, 2, 0,12, 1,12, 0, 4, 4, 4, 0 ; E0 db 13, 8,14, 0, 0, 3, 3, 0,12, 6,12, 0, 0, 5, 5, 0 ; F0 ; NoOp #$ $. $.X $.Y $.. $..X $..Y (X) ()Y () (....,X) AsmTab1 db 0FFh,0A9h,0A5h,0B5h,0FFh,0ADh,0BDh,0B9h,0A1h,0B1h,0B2h,0FFh ;LDA db 0FFh,0A2h,0A6h,0FFh,0B6h,0AEh,0FFh,0BEh,0FFh,0FFh,0FFh,0FFh ;LDX db 0FFh,0A0h,0A4h,0B4h,0FFh,0ACh,0BCh,0FFh,0FFh,0FFh,0FFh,0FFh ;LDY db 0FFh,0FFh,085h,095h,0FFh,08Dh,09Dh,099h,081h,091h,092h,0FFh ;STA db 0FFh,0FFh,086h,0FFh,096h,08Eh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;STX db 0FFh,0FFh,084h,094h,0FFh,08Ch,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;STY db 0AAh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;TAX db 0A8h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;TAY db 0BAh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;TSX db 08Ah,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;TXA db 09Ah,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;TXS db 098h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;TYA db 048h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;PHA db 008h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;PHP db 068h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;PLA db 028h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;PLP db 0FFh,069h,065h,075h,0FFh,06Dh,07Dh,079h,061h,071h,072h,0FFh ;ADC db 0FFh,0E9h,0E5h,0F5h,0FFh,0EDh,0FDh,0F9h,0E1h,0F1h,0F2h,0FFh ;SBC db 01Ah,0FFh,0E6h,0F6h,0FFh,0EEh,0FEh,0FFh,0FFh,0FFh,0FFh,0FFh ;INC db 0E8h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;INX db 0C8h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;INY db 03Ah,0FFh,0C6h,0D6h,0FFh,0CEh,0DEh,0FFh,0FFh,0FFh,0FFh,0FFh ;DEC db 0CAh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;DEX db 088h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;DEY db 0FFh,029h,025h,035h,0FFh,02Dh,03Dh,039h,021h,031h,032h,0FFh ;AND db 0FFh,009h,005h,015h,0FFh,00Dh,01Dh,019h,001h,011h,012h,0FFh ;ORA db 0FFh,049h,045h,055h,0FFh,04Dh,05Dh,059h,041h,051h,052h,0FFh ;EOR db 00Ah,0FFh,006h,016h,0FFh,00Eh,01Eh,0FFh,0FFh,0FFh,0FFh,0FFh ;ASL db 04Ah,0FFh,046h,056h,0FFh,04Eh,05Eh,0FFh,0FFh,0FFh,0FFh,0FFh ;LSR db 02Ah,0FFh,026h,036h,0FFh,02Eh,03Eh,0FFh,0FFh,0FFh,0FFh,0FFh ;ROL db 06Ah,0FFh,066h,076h,0FFh,06Eh,07Eh,0FFh,0FFh,0FFh,0FFh,0FFh ;ROR db 0FFh,0C9h,0C5h,0D5h,0FFh,0CDh,0DDh,0D9h,0C1h,0D1h,0D2h,0FFh ;CMP db 0FFh,0E0h,0E4h,0FFh,0FFh,0ECh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;CPX db 0FFh,0C0h,0C4h,0FFh,0FFh,0CCh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;CPY db 0FFh,089h,024h,034h,0FFh,02Ch,03Ch,0FFh,0FFh,0FFh,0FFh,0FFh ;BIT db 0FFh,0FFh,0FFh,0FFh,0FFh,090h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;BCC db 0FFh,0FFh,0FFh,0FFh,0FFh,0B0h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;BCS db 0FFh,0FFh,0FFh,0FFh,0FFh,0F0h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;BEQ db 0FFh,0FFh,0FFh,0FFh,0FFh,030h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;BMI db 0FFh,0FFh,0FFh,0FFh,0FFh,0D0h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;BNE db 0FFh,0FFh,0FFh,0FFh,0FFh,010h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;BPL db 0FFh,0FFh,0FFh,0FFh,0FFh,050h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;BVC db 0FFh,0FFh,0FFh,0FFh,0FFh,070h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;BVS db 0FFh,0FFh,0FFh,0FFh,0FFh,080h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;BRA db 0FFh,0FFh,0FFh,0FFh,0FFh,04Ch,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;JMP db 0FFh,0FFh,0FFh,0FFh,0FFh,020h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;JSR db 060h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;RTS db 040h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;RTI db 0FFh,000h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;BRK db 0EAh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;NOP db 018h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;CLC db 0D8h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;CLD db 058h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;CLI db 0B8h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;CLV db 038h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;SEC db 0F8h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;SED db 078h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;SEI db 0FFh,0FFh,004h,0FFh,0FFh,00Ch,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;TSB db 0FFh,0FFh,014h,0FFh,0FFh,01Ch,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;TRB db 05Ah,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;PHY db 0DAh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;PHX db 07Ah,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;PLY db 0FAh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;PLX db 0FFh,0FFh,064h,074h,0FFh,09Ch,09Eh,0FFh,0FFh,0FFh,0FFh,0FFh ;STZ Debug ends END