GophHub - zajo/appler/src/DEBUG.ASM


Raw File

;  _____________________________________________
; |                                             |
; |  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  <GetLineBuf,0,0,0,0,0,0,2,4,0,?,?,0,1,1,GetLineUser,?,?,?,?>
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,'<Enter> to load labels',0
LabMes_L        db      1,0Ah,'Labels loaded',0
LabErrMes_L     db      'Error loading labels',0
LS_EnterMes2    db      1,0Ah,'<Enter> 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,'<Enter> to load macro',0
RecMes_L        db      1,0Ah,'Macro loaded',0
RecErrMes_L     db      'Error loading macro',0
SR_EnterMes2    db      1,0Ah,'<Enter> 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      '<reg> =<value>',1,7,' -change register',0
                db      ' ',0
                db      'D <addr>',1,7,' -disassemble',0
                db      'DA <addr>',1,7,' -dump A',0
                db      'DB <addr>',1,7,' -dump B',0
                db      'ASM [<addr>]',1,7,' -assembler mode',0
                db      'EA [<addr>]',1,7,' -edit dump A',0
                db      'EB [<addr>]',1,7,' -edit dump B',0
                db      ' ',0
                db      '[ <beg>,<end>]',1,7,' -set {margins}',0
                db      'FIND [<byte>,..][''st'',..]["st",..]',0
                db      1,7,'  -find string in {margins}',0
                db      'COPY <addr>',1,7,' -copy {margins}',0
                db      'COMP <addr>',1,7,' -compare {margins}',0
                db      'PDUMP [<FileName>]',0
                db      1,7,'  -Print Memory Dump',0
                db      'PASM [<FileName>]',0
                db      1,7,'  -Print Disassembled Dump',0
                db      ' ',0
                db      'BREAK<1..6>=<addr>',1,7,' -set breakpoint',0
                db      'GO [<start>][,<stop>]',1,7,' -execute',0
                db      ' ',0
                db      '. <Identifier>=<addr>',0
                db      1,7,'  -define label',0
                db      'LIST',1,7,' -defined labels list',0
                db      'DL <identifier>',1,7,' -delete label',0
                db      'LAB <ON>|<OFF>',1,7,' -labels activity',0
                db      'LL <FileName>',1,7,' -load labels',0
                db      'SL <FileName>',1,7,' -save labels',0
                db      ' ',0

                db      'RECORD [f]',1,7,' macro',0
                db      'STOP',1,7,' -stop recording',0
                db      'PLAY [<FileName>]',1,7,' -play macro',0
                db      'LM <FileName>',1,7,' -load macro',0
                db      'SM <FileName>',1,7,' -save macro',0
                db      ' ',0

                db      '? <expression>[,h][,d][,b]',0
                db      1,7,'  -evaluate expression',0
                db      'SWAP <TimerTicks>',1,7,' -scr swapping',0
                db      'SOUND <ON>|<OFF>',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 <addr>',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 <addr>',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

Generated by GNU Enscript 1.6.6, and GophHub 1.3.