📄 mon88.lst
字号:
352 05EC 8E C0 MOV ES,AX ;
353 05EE 8D 1E 90 34 LEA BX,DISASM_CODE ; Pointer to code storage
354 05F2 8D 16 60 34 LEA DX,DISASM_INST ; Pointer to instr string
355 05F6 58 POP AX ; Address in AX
356 05F7 E8 71 05 CALL disasm_ ; Disassemble Opcode
357
358 05FA BE 90 34 MOV SI,offset DISASM_CODE
359 05FD E8 F6 0C CALL PUTS
360 0600 E8 E2 0C CALL STRLEN ; String in SI, Length in AL
361 0603 B4 0F MOV AH,15
362 0605 2A E0 SUB AH,AL
363 0607 E8 48 02 CALL WRNSPACE ; Write AH spaces
364 060A BE 60 34 MOV SI,offset DISASM_INST
365 060D E8 E6 0C CALL PUTS
366
367 0610 5B POP BX
368 0611 5A POP DX
369 0612 5E POP SI
370 0613 07 POP ES
371 0614 C3 RET
372
373 ;----------------------------------------------------------------------
374 ; Write Byte to Memory
375 ;----------------------------------------------------------------------
376 0615 E8 1D 0D WRMEMB: CALL GETHEX4 ; Get Address
377 0618 8B D8 MOV BX,AX ; Store Address
378 061A B0 20 E8 9A 0D WRSPACE
379
380 061F 26 8A 07 MOV AL,ES:[BX] ; Get current value and display it
381 0622 E8 53 0D CALL PUTHEX2
382 0625 B0 3D E8 8F 0D WREQUAL
383 062A E8 15 0D CALL GETHEX2 ; Get new value
384 062D 26 88 07 MOV ES:[BX],AL ; and write it
385
386 0630 E9 28 FE JMP CMD ; Next Command
387
388 ;----------------------------------------------------------------------
389 ; Write Word to Memory
390 ;----------------------------------------------------------------------
391 0633 E8 FF 0C WRMEMW: CALL GETHEX4 ; Get Address
392 0636 8B D8 MOV BX,AX
393 0638 B0 20 E8 7C 0D WRSPACE
394
395 063D 26 8B 07 MOV AX,ES:[BX] ; Get current value and display it
396 0640 E8 2A 0D CALL PUTHEX4
397 0643 B0 3D E8 71 0D WREQUAL
398 0648 E8 EA 0C CALL GETHEX4 ; Get new value
399 064B 26 89 07 MOV ES:[BX],AX ; and write it
400
401 064E E9 0A FE JMP CMD ; Next Command
402
403 ;----------------------------------------------------------------------
404 ; Change Register
405 ; Valid register names: AX,BX,CX,DX,SP,BP,SI,DI,DS,ES,SS,CS,IP,FL (flag)
406 ;----------------------------------------------------------------------
407 0651 E8 76 0D CHANGEREG: CALL RXCHAR ; Get Command First Register character
408 0654 E8 55 0D CALL TO_UPPER
409 0657 8A F0 MOV DH,AL
410 0659 E8 6E 0D CALL RXCHAR ; Get Second Register character, DX=register
411 065C E8 4D 0D CALL TO_UPPER
412 065F 8A D0 MOV DL,AL
413
414 0661 BB 94 06 MOV BX,OFFSET REGTAB
415 0664 8B 07 CMPREG: MOV AX,[BX]
416 0666 39 D0 CMP AX,DX ; Compare register string with user input
417 0668 75 18 JNE NEXTREG ; No, continue search
418
419 066A B0 3D E8 4A 0D WREQUAL
420 066F E8 C3 0C CALL GETHEX4 ; Get new value
421 0672 89 C1 MOV CX,AX ; CX=New reg value
422
423 0674 8D 3E B0 34 LEA DI,UAX ; Point to User Register Storage
424 0678 8A 5F 02 MOV BL,[BX+2] ; Get Offset
425 067B 32 FF XOR BH,BH
426 067D 89 09 MOV [DI+BX],CX
427 067F E9 05 02 JMP DISPREG ; Display All registers
428
429 0682 83 C3 04 NEXTREG: ADD BX,4
430 0685 81 FB CC 06 CMP BX,OFFSET ENDREG
431 0689 75 D9 JNE CMPREG ; Continue looking
432
433 068B BE 47 2E MOV SI,OFFSET ERRREG_MESS ; Display Unknown Register Name
434 068E E8 65 0C CALL PUTS
435
436 0691 E9 C7 FD JMP CMD ; Try Again
437
438 0694 58 41 00 00 REGTAB DW 'AX',0 ; register name, offset
439 0698 58 42 02 00 DW 'BX',2
440 069C 58 43 04 00 DW 'CX',4
441 06A0 58 44 06 00 DW 'DX',6
442 06A4 50 53 08 00 DW 'SP',8
443 06A8 50 42 0A 00 DW 'BP',10
444 06AC 49 53 0C 00 DW 'SI',12
445 06B0 49 44 0E 00 DW 'DI',14
446 06B4 53 44 10 00 DW 'DS',16
447 06B8 53 45 12 00 DW 'ES',18
448 06BC 53 53 14 00 DW 'SS',20
449 06C0 53 43 16 00 DW 'CS',22
450 06C4 50 49 18 00 DW 'IP',24
451 06C8 4C 46 1A 00 DW 'FL',26
452 06CC 3F 3F ENDREG DW '??'
453
454
455 ;----------------------------------------------------------------------
456 ; Change Base Segment pointer
457 ; Dump/Fill/Load operate on BASE_SEGMENT:[USER INPUT ADDRESS]
458 ; Note: CB command will not update the User Registers!
459 ;----------------------------------------------------------------------
460 06CE 8C C0 CHANGEBS: MOV AX,ES ; WORD BASE_SEGMENT
461 06D0 E8 9A 0C CALL PUTHEX4 ; Display current value
462 06D3 B0 20 E8 E1 0C WRSPACE
463 06D8 E8 5A 0C CALL GETHEX4
464 06DB 50 PUSH AX
465 06DC 07 POP ES
466 06DD E9 7B FD JMP CMD ; Next Command
467
468
469 ;----------------------------------------------------------------------
470 ; Trace Next
471 ;----------------------------------------------------------------------
472 06E0 A1 CA 34 TRACENEXT: MOV AX,[UFL] ; Get User flags
473 06E3 0D 00 01 OR AX,0100h ; set TF
474 06E6 A3 CA 34 MOV [UFL],AX
475 06E9 E9 3D 00 JMP TRACNENTRY
476
477 ;----------------------------------------------------------------------
478 ; Trace Program from Address
479 ;----------------------------------------------------------------------
480 06EC A1 CA 34 TRACEPROG: MOV AX,[UFL] ; Get User flags
481 06EF 0D 00 01 OR AX,0100h ; set TF
482 06F2 A3 CA 34 MOV [UFL],AX
483 06F5 E9 1C 00 JMP TRACENTRY ; get execute address, save user registers etc
484
485 ;----------------------------------------------------------------------
486 ; Execute program
487 ; 1) Enable all Breakpoints (replace opcode with INT3 CC)
488 ; 2) Restore User registers
489 ; 3) Jump to BASE_SEGMENT:USER_OFFSET
490 ;----------------------------------------------------------------------
491 06F8 BB 83 05 EXECPROG: MOV BX,OFFSET BPTAB ; Enable All breakpoints
492 06FB B9 08 00 MOV CX,8
493
494 06FE B8 08 00 NEXTENBP: MOV AX,8
495 0701 2A C1 SUB AL,CL
496 0703 F6 47 03 01 TEST BYTE [BX+3],1 ; Check enable/disable flag
497 0707 74 06 JZ NEXTEXBP
498 0709 8B 3F MOV DI,[BX] ; Get Breakpoint Address
499 070B 26 C6 05 CC MOV BYTE ES:[DI],0CCh ; Write INT3 instruction to address
500
501 070F 83 C3 04 NEXTEXBP: ADD BX,4 ; Next entry
502 0712 E2 EA LOOP NEXTENBP
503
504 0714 8C C0 TRACENTRY: MOV AX,ES ; Display Segment Address
505 0716 E8 54 0C CALL PUTHEX4
506 0719 B0 3A MOV AL,':'
507 071B E8 9B 0C CALL TXCHAR
508 071E E8 14 0C CALL GETHEX4 ; Get new IP
509 0721 A3 C8 34 MOV [UIP],AX ; Update User IP
510 0724 8C C0 MOV AX,ES
511 0726 A3 C6 34 MOV [UCS],AX
512
513 ; Single Step Registers
514 ; bit3 bit2 bit1 bit0
515 ; | | | \--- '1' =Enable Single Step
516 ; | | \-------- '1' =Select TXMON output for UARTx
517 ; \-----\------------- '00'=No Step
518 ; '01'=Step
519 ; '10'=select step_sw input
520 ; '11'=select not(step_sw) input
521 ; MOV DX,HWM_CONFIG
522 ; MOV AL,07h ; xxxx-0111 step=1
523 ; OUT DX,AL ; Enable Trace
524
525 0729 A1 B0 34 TRACNENTRY: MOV AX,[UAX] ; Restore User Registers
526 072C 8B 1E B2 34 MOV BX,[UBX]
527 0730 8B 0E B4 34 MOV CX,[UCX]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -