📄 extra.asm
字号:
mov a, r0 ajmp phexsp;skip the next instructionssskip: mov r0, #23ssskip2:acall space_h djnz r0, ssskip2 mov dptr,#sskip1 acall pstr_h mov a, sp add a, #249 mov r0, a ;set r0 to point to pc on stack mov a, @r0 mov lastpc, r6 ;keep r6/r7 safe in lastpc mov r6, a ;put user's pc into r6/r7 inc r0 mov a, @r0 mov (lastpc+1), r7 mov r7, a mov a, r2 push acc mov a, r3 push acc mov a, r4 push acc setb psw.1 ;tell it to use a compact format acall disasm ;run disasm to show 'em what was skipped pop acc mov r4, a pop acc mov r3, a pop acc mov r2, a mov a, sp add a, #249 mov r0, a ;set r0 to point to pc on stack mov a, r6 mov r6, lastpc ;restore r6/r7 mov lastpc, a ;update lastpc with next inst addr mov @r0, a ;also update user's pc!! inc r0 mov a, r7 mov r7, (lastpc+1) mov (lastpc+1), a mov @r0, a ajmp step1sschacc: mov a, sp add a, #251 mov r0, a ;r0 points to acc on stack mov dptr, #chaccs1 acall pstr_h lcall ghex jc chacc2 jb psw.5, chacc2 mov @r0, a acall newline_h ajmp step1chacc2: mov dptr, #abort acall pstr_h ajmp step1;stuff some of the disassembler tables, strings, etc since we have a;bit of space before the beginning of the editor command code ;opcode offset table (gives #bytes for the instruction ;and the number of the routine to print the operands)opot1: .db 0xAD, 0x06, 0x6F, 0x39, 0x39, 0x46, 0x49, 0x49 ;0 .db 0x63, 0x06, 0x6F, 0x39, 0x39, 0x46, 0x49, 0x49 ;1 .db 0x63, 0x06, 0xAD, 0x39, 0x16, 0x0E, 0x11, 0x11 ;2 .db 0x63, 0x06, 0xAD, 0x39, 0x16, 0x0E, 0x11, 0x11 ;3 .db 0x66, 0x06, 0x1A, 0x1F, 0x16, 0x0E, 0x11, 0x11 ;4 .db 0x66, 0x06, 0x1A, 0x1F, 0x16, 0x0E, 0x11, 0x11 ;5 .db 0x66, 0x06, 0x1A, 0x1F, 0x16, 0x0E, 0x11, 0x11 ;6 .db 0x66, 0x06, 0x22, 0x69, 0x16, 0x1F, 0x92, 0x92 ;7 .db 0x66, 0x06, 0x22, 0xA1, 0x4D, 0x83, 0x86, 0x86 ;8 .db 0x9B, 0x06, 0x96, 0x9D, 0x16, 0x0E, 0x11, 0x11 ;9 .db 0x26, 0x06, 0x22, 0x5D, 0x4D, 0xAD, 0x8E, 0x8E ;A .db 0x26, 0x06, 0x42, 0x3D, 0x2F, 0x2B, 0x37, 0x37 ;B .db 0x46, 0x06, 0x42, 0x3D, 0x39, 0x0E, 0x11, 0x11 ;C .db 0x46, 0x06, 0x42, 0x3D, 0x39, 0x57, 0x11, 0x11 ;D .db 0xA5, 0x06, 0x11, 0x11, 0x39, 0x0E, 0x11, 0x11 ;E .db 0xA9, 0x06, 0x89, 0x89, 0x39, 0x1A, 0x89, 0x89 ;Fmnot1: ;mnunonic offset table (gives offset into above table) .db 0x5A, 0x0E, 0x48, 0x73 ;nop, ajmp, ljmp, rr .db 0x2B, 0x2B, 0x2B, 0x2B ;inc, inc, inc, inc .db 0x30, 0x00, 0x43, 0x75 ;jbc, acall, lcall rrc .db 0x21, 0x21, 0x21, 0x21 ; .db 0x2E, 0x0E, 0x67, 0x6E ; etc... .db 0x06, 0x06, 0x06, 0x06 ; .db 0x38, 0x00, 0x6A, 0x70 ; .db 0x0A, 0x0A, 0x0A, 0x0A ; .db 0x33, 0x0E, 0x5D, 0x5D ; .db 0x5D, 0x5D, 0x5D, 0x5D ; .db 0x3B, 0x00, 0x12, 0x12 ; .db 0x12, 0x12, 0x12, 0x12 ; .db 0x41, 0x0E, 0x8F, 0x8F ; .db 0x8F, 0x8F, 0x8F, 0x8F ; .db 0x3E, 0x00, 0x5D, 0x35 ; .db 0x4C, 0x4C, 0x4C, 0x4C ; .db 0x7C, 0x0E, 0x12, 0x4F ; .db 0x24, 0x4C, 0x4C, 0x4C ; .db 0x4C, 0x00, 0x4C, 0x4F ; .db 0x80, 0x80, 0x80, 0x80 ; .db 0x5D, 0x0E, 0x4C, 0x2B ; .db 0x57, 0x92, 0x4C, 0x4C ; .db 0x12, 0x00, 0x1C, 0x1C ; .db 0x15, 0x15, 0x15, 0x15 ; .db 0x63, 0x0E, 0x19, 0x19 ; .db 0x84, 0x88, 0x88, 0x88 ; .db 0x60, 0x00, 0x78, 0x78 ; .db 0x1F, 0x27, 0x8B, 0x8B ; .db 0x53, 0x0E, 0x53, 0x53 ; .db 0x19, 0x4C, 0x4C, 0x4C ; .db 0x53, 0x00, 0x53, 0x53 ; .db 0x1C, 0x4C, 0x4C, 0x4C ;mnot2: .db 0x2B, 0x21, 0x06, 0x0A ;inc, dec, add, addc .db 0x5D, 0x12, 0x8F, 0x4C ;orl, anl, xlr, mov .db 0x4C, 0x80, 0x4C, 0x15 ;mov, subb, mov, cjne .db 0x88, 0x27, 0x4C, 0x4C ;xch, djnz, mov, mov;---------------------------------------------------------;; ;; External Memory Editor ;; ;;---------------------------------------------------------;;register usage:; R4, Flags:; bit0: 0=display CODE memory, 1=display DATA memory; bit1: 0=editing disabled, 1=editing enabled; bit2: 0=editing in hex, 1=editing in ascii; bit3: 0=normal, 1=in middle of hex entry (value in r5); R6/R7, current memory location;.org locat+0x800.db 0xA5,0xE5,0xE0,0xA5 ;signiture.db 254,vtedit_key,0,0 ;id (254=user installed command).db 0,0,0,0 ;prompt code vector.dB 0,0,0,0 ;reserved.db 0,0,0,0 ;reserved.db 0,0,0,0 ;reserved.db 0,0,0,0 ;user defined.db 255,255,255,255 ;length and checksum (255=unused).db "Memory Editor (VT100)",0.org locat+0x0840 ;executable code begins here mov r4, #0 acall redrawmain: mov a, r4 clr acc.3 mov r4, amain2: lcall cin_filter acall input_ck_2ndcmd1: cjne a, #27, cmd2 ;quit ajmp quitcmd2: cjne a, #11, cmd3 ;up ajmp cmd_upcmd3: cjne a, #10, cmd4 ;down ajmp cmd_downcmd4: cjne a, #8, cmd5 ;left ajmp cmd_leftcmd5: cjne a, #21, cmd6 ;right ajmp cmd_rightcmd6: cjne a, #12, cmd7 ;redraw acall redraw ajmp maincmd7: cjne a, #17, cmd8 ;quit ajmp quitcmd8: cjne a, #3, cmd9 ;code memory mov a, r4 anl a, #11111110b mov r4, a acall cursor_home mov dptr, #str_code acall pstr_hh acall redraw_data ajmp maincmd9: cjne a, #4, cmd10 ;data memory mov a, r4 orl a, #00000001b mov r4, a acall cursor_home mov dptr, #str_data acall pstr_hh acall redraw_data ajmp maincmd10: cjne a, #7, cmd11 ;goto memory loc ajmp cmd_gotocmd11: cjne a, #5, cmd12 ;toggle editing ajmp cmd_editcmd12: cjne a, #6, cmd13 ;fill memory ajmp cmd_fillcmd13: cjne a, #1, cmd14 ;edit in ascii mov a, r4 jnb acc.1, main setb acc.2 mov r4, a acall erase_commands acall print_commands acall redraw_cursor ajmp maincmd14: cjne a, #24, cmd15 ;edit in hex mov a, r4 jnb acc.1, main clr acc.2 mov r4, a acall erase_commands acall print_commands acall redraw_cursor ajmp maincmd15: cjne a, #25, cmd16 ;page up ajmp cmd_pgupcmd16: cjne a, #26, cmd17 ;page down ajmp cmd_pgdowncmd17:cmd_data: ;the input character wasn't any particular command, so ;maybe it's some input data being typed for edit mode mov b, a ;keep a copy of user data in b mov a, r4 jb acc.1, cmd_data2cmd_abort: ajmp main ;ignore if not in edit modecmd_data2: jnb acc.2, input_hexinput_ascii: mov a, b acall ascii_only cjne a, b, cmd_abort ;check that input is an ascii char mov dph, r7 mov dpl, r6 lcall smart_wr ;write the char to memory ajmp cmd_rightinput_hex: mov a, b lcall upper lcall asc2hex jc cmd_abort ;ignore if not hex mov r0, a ;keep hex value of input in r0 mov dph, r7 ;load dptr with address mov dpl, r6 mov a, r4 jb acc.3, input_hex_2ndinput_hex_1st: mov a, r0 mov r5, a mov a, r4 setb acc.3 ;remember that we're waiting for 2nd char mov r4, a acall redraw_cursor ajmp main2input_hex_2nd: mov a, r5 ;get data from memory swap a ;shift nibbles anl a, #11110000b ;just in case add a, r0 ;add in this input to lower part lcall smart_wr ;write back to memory mov a, r4 clr acc.3 mov r4, a ajmp cmd_rightinput_ck_2nd: ;the main input routine will always call here when a new ;byte is entered... so we can do something special if we ;were waiting for the second character and it is not a ;legal hex character push acc mov a, r4 jb acc.1, inck2d ;if editing is disabled, don't do anything clr acc.3inck2b: mov r4, ainck2c: pop acc retinck2d: jnb acc.3, inck2b ;if we get here, we were actually waiting for the 2nd char pop acc push acc lcall upper lcall asc2hex jnc inck2c ;proceed normally if it is valid ;if we get here, we did not get a hex legal char pop acc push acc cjne a, #esc_char, inck2e mov a, r4 clr acc.3 mov r4, a acall redraw_cursor pop acc pop acc ;don't return and do the quit cmd pop acc ;just quit this entry and wait for next cmd ajmp maininck2e: mov dph, r7 ;load dptr with address mov dpl, r6 mov a, r5 lcall smart_wr ;write to memory mov a, r4 clr acc.3 mov r4, a acall redraw_cursor sjmp inck2c; R4, Flags:; bit0: 0=display CODE memory, 1=display DATA memory; bit1: 0=editing disabled, 1=editing enabled; bit2: 0=editing in hex, 1=editing in ascii; bit3: 0=normal, 1=in middle of hex entry (value in r5)cmd_fill: mov a, r4 anl a, #00000010b jnz cmd_fill_ok ajmp main ;don't allow if not in editing modecmd_fill_ok: acall erase_commands mov a, r4 push acc mov dptr, #fill_prompt1 acall pcstr_hh lcall ghex16 jc cmd_fill_abort jb psw.5, cmd_fill_abort mov r0, dpl mov r1, dph mov dptr, #fill_prompt2 acall pstr_hh lcall ghex16 jc cmd_fill_abort jb psw.5, cmd_fill_abort mov r4, dpl mov r5, dph mov dptr, #fill_prompt3 acall pcstr_hh lcall ghex jc cmd_fill_abort jb psw.5, cmd_fill_abort mov r2, a mov a, r4 mov r6, a mov a, r5 mov r7, a pop acc mov r4, a mov dpl, r0 mov dph, r1 ;now r4 is restored to its normal value, dptr holds the ;first location to fill, and r6/r7 holds the last location to ;fill, and r2 has the fill value.cmd_fill_loop: mov a, r2 lcall smart_wr mov a, r6 cjne a, dpl, cmd_fill_next mov a, r7 cjne a, dph, cmd_fill_next ;when we get here, we're done! acall erase_commands acall print_commands acall redraw_data ajmp maincmd_fill_next: inc dptr sjmp cmd_fill_loopcmd_fill_abort: pop acc mov r4, a acall erase_commands acall print_commands acall redraw_cursor ajmp mainfill_prompt1: .db "Fill",31,131,"; First: ",0fill_prompt2: .db " Last: ",0fill_prompt3: .db " ",168,": ",0 cmd_edit: acall erase_commands mov a, r4 xrl a, #00000010b mov r4, a acall print_commands acall redraw_cursor ajmp maincmd_goto: acall erase_commands mov dptr, #goto_prompt acall pcstr_hh mov a, r4 push acc lcall ghex16 pop acc mov r4, a jc cmdgt_abort jb psw.5, cmdgt_abort mov r6, dpl mov r7, dph acall cursor_home mov a, #20 acall cursor_down acall print_commands acall redraw_data ajmp maincmdgt_abort: acall cursor_home mov a, #20 acall cursor_down acall print_commands acall redraw_cursor ajmp maingoto_prompt: .db 31,131,31,129,": ",0cmd_up: acall blank_it mov a, r6 clr c subb a, #16 mov r6, a mov a, r7 subb a, #0 mov r7, a mov a, r6 cpl a anl a, #11110000b jz cmd_up_scroll mov a, #1 acall cursor_up acall invert_it ajmp maincmd_up_scroll: acall redraw_data ajmp maincmd_pgup: dec r7 acall redraw_data ajmp maincmd_pgdown: inc r7 acall redraw_data ajmp maincmd_down: acall blank_it mov a, r6 add a, #16 mov r6, a mov a, r7 addc a, #0 mov r7, a mov a, r6 anl a, #11110000b jz cmd_down_scroll mov a, #1 acall cursor_down acall invert_it ajmp maincmd_down_scroll: acall redraw_data ajmp maincmd_left: acall blank_it mov a, #3 acall cursor_left mov a, r6 clr c subb a, #1 mov r6, a mov a, r7 subb a, #0 mov r7, a mov a, r6 orl a, #11110000b
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -