The Microsoft MACRO Assembler 06-05-84 PAGE 1-1 MORROW 80188 Slave Debugger title MORROW 80188 Slave Debugger page 62, 132 .list ;**************************************************************************** ; ; MBUG ; ; MORROW 80188 debugger. ; ; This debugger is written for the MORROW 80188 slave board. The ; debugger will use the serial port attached to the I/O connector ; as the console port. The commands are single letter commands ; and behave as they are described below. Where possible, the ; syntax is kept as close to the 'debug' utility syntax under MSDOS. ; The commands currently supported are: ; ; d - dumps memory in hexadecimal and ascii. ; e - allows modification of memory one byte at a time. ; f - fill memory block with value. ; i - displays value at input port. ; m - move block of memory. ; o - output byte value to output port. ; j - start executing at address. ; ; The debugger is intended to be burned into ROM. For debugging ; purposes, the code was first written to run under MSDOS 2.0. ; The hardware drivers are then replaced with the ones for the ; slave card before burning into ROM. This version of code ; contains the hardware drivers for the Morrow slave card. ; ; The debugger is contained in 2 files. They are MBUG.ASM and ; MFUNCT.ASM. MBUG.ASM contains the main scanner and parser of ; commands and MFUNCT.ASM contains the code for the specific ; functions of the debugger. ; ; The debugger should be assembled and linked as follows for the ; MSDOS version: ; masm mbug; * this generates MBUG.OBJ ; link mbug; * this produces MBUG.EXE ; ; The file MBUG.EXE can then be run under MSDOS for testing. ; ; ; MODIFICATIONS: ; ; 5/7/84 written Raymond Yu ; 5/15/84 V1.0 completed RYU ; tested under MSDOS 2.0 ; 6/4/84 revised for ROM RYU ; renamed 'mbugrom.asm' ; 'mfunct.asm' remains ; ;****************************************************************************  The Microsoft MACRO Assembler 06-05-84 PAGE 1-2 MORROW 80188 Slave Debugger 0000 data segment para public 'data' ;********************************************************************** ; ; S100 80188 slave board constant and address definitions ; ;********************************************************************** ; 80188 internal control registers = FF00 cntrl_base equ 0ff00h ; base addr of 80188 control ports ; in I/O space, this is the default ; addr immediately after a reset = FFA0 umcs equ cntrl_base+0a0h ; addr of upper memory select reg = FFA2 lmcs equ cntrl_base+0a2h ; addr of lower memory select reg = FFA8 mpcs equ cntrl_base+0a8h ; addr of middle memory select reg = FFA6 mmcs equ cntrl_base+0a6h ; addr of middle memory select reg = FFA4 pacs equ cntrl_base+0a4h ; addr of peripheral select reg ; 80188 control register initialization values = FF38 UMCSVAL equ 0ff38h ; 4K byte block, 0 wait states, ; use external ready = 3FF8 LMCSVAL equ 03ff8h ; 256K byte block, 0 wait states, ; use external ready = A0BF MPCSVAL equ 0a0bfh ; 256K byte block in 64K byte incr, ; 7 PCS lines mapped into I/O space = 41F8 MMCSVAL equ 041f8h ; middle ram starts at 256K, ; 0 wait states, use external ready = 003F PACSVAL equ 0003fh ; PCS decoding starts at 0 in ; I/O space, 3 wait states, ; ignore external ready ;********** 8250 UART constant and address definitions **************** = 0000 uart_base equ 0 ; addr of uart in I/O space ; UART registers = 0000 uartdata equ uart_base+0 ; data register for uart .. DLAB=0 = 0000 uartdivisorlow equ uart_base+0 ; clk divisor, low byte .. DLAB=1 = 0001 uartdivisorhi equ uart_base+1 ; clk divisor, high byte .. DLAB=1 = 0001 uartinten equ uart_base+1 ; interrupt enable register .. DLAB=0 = 0002 uartintident equ uart_base+2 ; interrupt identification (read only) = 0003 uartlinecntrl equ uart_base+3 ; line control register = 0004 uartmdmcntrl equ uart_base+4 ; modem control register = 0005 uartlinestatus equ uart_base+5 ; line status register = 0006 uartmdmstatus equ uart_base+6 ; modem status register ; UART register bit definitions ; interrupt enable register = 0001 rcvinten equ 01h ; enable data received interrupt bit  The Microsoft MACRO Assembler 06-05-84 PAGE 1-3 MORROW 80188 Slave Debugger = 0002 xmitinten equ 02h ; enable transmitter buffer empty int = 0004 rcvlineinten equ 04h ; enable receiver line status int bit = 0010 mdmstatinten equ 010h ; enable modem status interrupt bit ; interrupt identification register (read only) = 0001 intpending equ 01h ; interrupt pending bit mask = 0006 intid equ 06h ; interrupt ID mask ( 2 bits ) ; line control register = 0040 setbreak equ 040h ; set break bit = 0080 dlab equ 080h ; divisor latch access enable bit ; modem control register = 0001 dtr equ 01h ; data terminal ready bit = 0002 rts equ 02h ; request to send bit = 0004 out1 equ 04h ; output bit 1 = 0008 out2 equ 08h ; output bit 2 = 0010 loopcntrl equ 010h ; loop control bit ; line status register = 0001 dataready equ 01h ; data ready status bit = 0002 overrunerr equ 02h ; overrun error status bit = 0004 parityerr equ 04h ; parity error status bit = 0008 framingerr equ 08h ; framing error status bit = 0010 breakint equ 010h ; break interrupt status bit = 0020 thre equ 020h ; transmitter holding register empty = 0040 tsre equ 040h ; transmitter shift register empty ; modem status register = 0001 dcts equ 01h ; delta clear to send status bit = 0002 ddsr equ 02h ; delta data set ready status bit = 0004 teri equ 04h ; trailing edge ring indicator status = 0008 drlsd equ 08h ; delta rcv line signal detect status = 0010 cts equ 010h ; clear to send status read bit = 0020 dsr equ 020h ; data set ready status read bit = 0040 ri equ 040h ; ring indicator status read bit = 0080 rlsd equ 080h ; rcv line signal detect status bit ; initialization values for divisor latch ; divisor values for baud rates using 1.8432Mhz 16X clock = 000C baud9600 equ 12 = 0018 baud4800 equ 24 = 0030 baud2400 equ 48 = 0060 baud1200 equ 96 = 0180 baud300 equ 384 ; initialization values for line control register and ; modem control register = 0007 LCRVAL equ 07h ; 8 data bits, 2 stop bits, no parity  The Microsoft MACRO Assembler 06-05-84 PAGE 1-4 MORROW 80188 Slave Debugger = 000F MCRVAL equ 0fh ; DTR, RTS, OUT1, OUT2 set ;****************************************************************** ; ; Debugger constant and string definitions ; ;****************************************************************** = 0009 PRSTRING equ 09h ; DOS print string function = 0024 ENDSTRING equ '$' ; string termination char = 000D CR equ 0dh ; carriage return char = 000A LF equ 0ah ; line feed char = 0008 BS equ 08h ; backspace char = 007F DELETE equ 07fh ; delete char = 0018 KILL equ 018h ; control-x is kill char = 0020 SPACE equ 020h ; space char = 0080 BUFLENGTH equ 128 ; size of command buffer = 0000 SRC_SEG equ 0 ; init source segment value = 0000 DEST_SEG equ 0 ; init dest segment value = 0080 DEF_COUNT equ 128 ; default count of bytes 0000 0D 0A SIGNON db CR,LF 0002 4D 4F 52 52 4F 57 db "MORROW DESIGNS 80188 DEBUGGER V1.0 5/7/84" 20 44 45 53 49 47 4E 53 20 38 30 31 38 38 20 44 45 42 55 47 47 45 52 20 56 31 2E 30 20 20 35 2F 37 2F 38 34 002C 0D 0A 0D 0A 24 db CR,LF,CR,LF,ENDSTRING 0031 0D 0A 24 NEWLINE db CR,LF,ENDSTRING 0034 4D 42 55 47 3E 24 PROMPT db "MBUG>",ENDSTRING 003A 43 4F 4D 4D 41 4E BAD_COMMAND db "COMMAND NOT FOUND",ENDSTRING 44 20 4E 4F 54 20 46 4F 55 4E 44 24 004C 75 73 61 67 65 3A SYNTAX_MES db "usage: ",ENDSTRING 20 24 0054 20 20 24 SPACE_2 db " ",ENDSTRING 0057 20 20 20 24 SPACE_3 db " ",ENDSTRING 005B 20 20 20 20 24 SPACE_4 db " ",ENDSTRING 0060 20 3D 20 24 DENTRY db " = ",ENDSTRING 0064 syntax label byte 0064 64 20 3C 61 64 64 S_DUMP db "d
"  The Microsoft MACRO Assembler 06-05-84 PAGE 1-5 MORROW 80188 Slave Debugger 72 65 73 73 3E 20 3C 61 64 64 72 65 73 73 20 6F 72 20 63 6F 75 6E 74 3E 0082 0D 0A 24 db CR,LF,ENDSTRING 0085 65 20 3C 61 64 64 S_ENTER db "e
",CR,LF,ENDSTRING 72 65 73 73 3E 0D 0A 24 0093 66 20 3C 61 64 64 S_FILL db "f
" 72 65 73 73 3E 20 3C 61 64 64 72 65 73 73 20 6F 72 20 63 6F 75 6E 74 3E 20 3C 76 61 6C 75 65 3E 00B9 0D 0A 24 db CR,LF,ENDSTRING 00BC 69 20 3C 70 6F 72 S_INPUT db "i ",CR,LF,ENDSTRING 74 3E 0D 0A 24 00C7 6D 20 3C 61 64 64 S_MOVE db "m
" 72 65 73 73 3E 20 3C 61 64 64 72 65 73 73 3E 20 3C 63 6F 75 6E 74 3E 00E4 0D 0A 24 db CR,LF,ENDSTRING 00E7 6F 20 3C 70 6F 72 S_OUTPUT db "o ",CR,LF,ENDSTRING 74 3E 20 3C 76 61 6C 75 65 3E 0D 0A 24 00FA 6A 20 3C 61 64 64 S_JUMP db "j
",CR,LF,ENDSTRING 72 65 73 73 3E 0D 0A 24 0108 00 db 0 ; mark end of syntax strings 0109 commands label byte ; command table for debugger 0109 44 db 'D' 010A 0130 R dw offset dump 010C 45 db 'E' 010D 0255 R dw offset enter 010F 46 db 'F' 0110 0300 R dw offset fill 0112 49 db 'I' 0113 03D9 R dw offset input 0115 4D db 'M' 0116 042D R dw offset move 0118 4F db 'O' 0119 04BD R dw offset output 011B 4A db 'J' 011C 04EF R dw offset jump 011E 51 db 'Q' 011F 052E R dw offset quit 0121 0000 dw 0 0123 segstore label word ; segment value temp storage ; these are used as default  The Microsoft MACRO Assembler 06-05-84 PAGE 1-6 MORROW 80188 Slave Debugger 0123 0000 dw SRC_SEG ; source segment value 0125 0000 dw DEST_SEG ; destination segment value 0127 0000 current_src dw 0 ; source address 0129 0000 current_dest dw 0 ; destination address 012B 0040 current_count dw 40h ; current count 012D 0000 current_port dw 0 ; current i/o port 012F 80 [ buffer db BUFLENGTH dup(?) ; command buffer ?? ] 01AF 00 data_buf db 0 ; count of bytes in data buf 01B0 08 [ db 8 dup(0) ; can fill memory with up to 00 ] ; 8 byte sequence 01B8 end_data_seg label byte ; mark end of data segment 01B8 data ends ;************************************************************** ; CODE STARTS HERE ;************************************************************** 0000 code segment para public 'code' assume cs:code, ds:data, es:data 0000 begin proc far ; initialize 80188 internal registers 0000 BA FFA0 mov dx,umcs ; init upper memory chip select 0003 B8 FF38 mov ax,UMCSVAL ; init value 0006 EF out dx,ax ; output to 80188 control port 0007 BA FFA2 mov dx,lmcs ; init lower memory chip select 000A B8 3FF8 mov ax,LMCSVAL ; init value 000D EF out dx,ax ; output to 80188 control port 000E BA FFA6 mov dx,mmcs ; init middle memory chip select 0011 B8 41F8 mov ax,MMCSVAL ; init value 0014 EF out dx,ax ; output to 80188 control port 0015 BA FFA8 mov dx,mpcs ; init middle memory chip select 0018 B8 A0BF mov ax,MPCSVAL ; init value 001B EF out dx,ax ; output to 80188 control port 001C BA FFA4 mov dx,pacs ; init peripheral chip select 001F B8 003F mov ax,PACSVAL ; init value 0022 EF out dx,ax ; output to 80188 control port ; copy initialized data out of ROM and into RAM  The Microsoft MACRO Assembler 06-05-84 PAGE 1-7 MORROW 80188 Slave Debugger 0023 B8 0040 mov ax,40h ; data starts after interrupt vectors 0026 8E C0 mov es,ax ; put segment addr into ds reg 0028 B8 ---- R mov ax,data ; get address of init data in ROM 002B 8E D8 mov ds,ax ; use as source address 002D B9 01B8 R mov cx,offset end_data_seg 0030 33 F6 xor si,si ; clear pointers 0032 8B FE mov di,si 0034 F3/ A4 rep movsb ; copy cx count bytes to RAM 0036 8C C0 mov ax,es ; put new data segment reg addr 0038 8E D8 mov ds,ax ; into ds reg 003A B8 01B8 R mov ax,offset end_data_seg 003D B1 04 mov cl,4 ; divide addr by 16 to get segment 003F D3 E8 shr ax,cl 0041 40 inc ax ; point at next paragraph after data 0042 05 0040 add ax,40h ; data seg starts at 400h 0045 8E D0 mov ss,ax ; use as stack pointer 0047 B8 0100 mov ax,100h ; give 256 bytes to the stack 004A 8B E0 mov sp,ax 004C B8 FFFF mov ax,0ffffh ; push reset address in case of 004F 50 push ax ; return from main loop 0050 33 C0 xor ax,ax ; offset of reset location 0052 50 push ax ; init the console uart 0053 BA 0003 mov dx,uartlinecntrl 0056 B0 87 mov al,LCRVAL+dlab ; set DLAB=1 to load divisor 0058 EE out dx,al 0059 BA 0000 mov dx,uartdivisorlow 005C B8 000C mov ax,baud9600 ; init port to 9600 baud 005F EE out dx,al ; output low byte of divisor 0060 BA 0001 mov dx,uartdivisorhi 0063 8A C4 mov al,ah ; get high byte of divisor 0065 EE out dx,al ; output high byte of divisor 0066 BA 0003 mov dx,uartlinecntrl 0069 B0 07 mov al,LCRVAL ; init line control register 006B EE out dx,al 006C BA 0004 mov dx,uartmdmcntrl 006F B0 0F mov al,MCRVAL ; init modem control register 0071 EE out dx,al ; end of initialization code 0072 BA 0000 R mov dx,offset SIGNON 0075 E8 062A R call prstr ; print sign on message 0078 main: ; this is the main loop of ; the debugger  The Microsoft MACRO Assembler 06-05-84 PAGE 1-8 MORROW 80188 Slave Debugger 0078 BA 0034 R mov dx,offset PROMPT ; print the debugger prompt 007B E8 062A R call prstr 007E B4 00 mov ah,0 ; convert data to upper case 0080 E8 0090 R call get_command ; get command line into buffer 0083 A0 012F R mov al,buffer ; get first char in buffer 0086 84 C0 test al,al ; if zero then no chars entered 0088 74 EE je main ; get the next command 008A E8 010F R call execute ; execute the command 008D 72 E9 jc main ; routine sets carry to cont ; terminate execution 008F CB ret 0090 begin endp far ;************************************************************** ; COMMAND ENTRY AND PARSE ROUTINES ;************************************************************** ; ; get_command ; ; Get a command line into command buffer. ; ; on entry: ; ah contains 0 if the data should be converted to upper case. ; if ah is not zero then the data is entered as is. ; on return: ; command line is stored at buffer. ; usage: ; call get_command ; 0090 get_command proc near ; get command in buffer 0090 50 push ax ; save ax ; clear the buffer 0091 BF 012F R mov di,offset buffer ; point to beginning of buffer 0094 B9 0080 mov cx,BUFLENGTH ; length of command buffer 0097 06 push es ; need to use es register 0098 8C D8 mov ax,ds ; get segment register 009A 8E C0 mov es,ax ; put in default seg reg 009C 33 C0 xor ax,ax ; fill buffer with zeroes 009E FC cld ; set dir flag to auto incr 009F F3/ AA rep stosb 00A1 07 pop es ; restore segment register 00A2 33 DB xor bx,bx ; clear buffer pointer 00A4 59 pop cx ; get param value into cx 00A5 gc_nextchar:  The Microsoft MACRO Assembler 06-05-84 PAGE 1-9 MORROW 80188 Slave Debugger 00A5 E8 0608 R call getc ; get the next input char 00A8 3C 08 cmp al,BS ; if backspace char 00AA 74 40 je gc_delete ; then process 00AC 3C 7F cmp al,DELETE ; if delete char 00AE 74 3C je gc_delete ; then process 00B0 3C 18 cmp al,KILL ; if kill char 00B2 74 22 je gc_kill ; delete entire buffer 00B4 3C 0D cmp al,CR ; if CR then done 00B6 74 50 je gc_done 00B8 3C 20 cmp al,SPACE ; reject other control chars 00BA 7C E9 jl gc_nextchar 00BC E8 0619 R call putc ; echo char to display 00BF 84 ED test ch,ch ; if param is 0 then convert 00C1 75 06 jne gc_1 ; do not convert to UC 00C3 3C 60 cmp al,60h ; if lower case char then 00C5 7C 02 jl gc_1 ; else do nothing 00C7 24 DF and al,0dfh ; convert to upper case 00C9 gc_1: 00C9 88 87 012F R mov buffer[bx],al ; store char away 00CD 43 inc bx ; point to next char in buffer 00CE 81 FB 0080 cmp bx,BUFLENGTH ; if too many chars 00D2 7F 3A jg gc_err ; error exit 00D4 EB CF jmp gc_nextchar 00D6 gc_kill: 00D6 B0 20 mov al,SPACE ; erase to beginning of line 00D8 E8 0619 R call putc 00DB B0 08 mov al,BS ; back up to orig position 00DD E8 0619 R call putc 00E0 85 DB test bx,bx ; only to beginning of line 00E2 74 AC jz get_command 00E4 4B dec bx 00E5 B0 08 mov al,BS ; back up one char 00E7 E8 0619 R call putc 00EA EB EA jmp gc_kill 00EC gc_delete: ; delete the previous char 00EC 85 DB test bx,bx ; if at beg of buffer 00EE 74 B5 jz gc_nextchar ; do nothing ... otherwise 00F0 B0 08 mov al,BS ; back space to prev char 00F2 E8 0619 R call putc 00F5 B0 20 mov al,SPACE ; erase char 00F7 E8 0619 R call putc 00FA B0 08 mov al,BS ; fix cursor 00FC E8 0619 R call putc 00FF 4B dec bx ; point at prev char position 0100 32 C0 xor al,al ; clear char in buffer 0102 88 87 012F R mov buffer[bx],al 0106 EB 9D jmp gc_nextchar ; get next char 0108 gc_done: 0108 BA 0031 R mov dx,offset NEWLINE ; print CR, LF 010B E8 062A R call prstr 010E gc_err:  The Microsoft MACRO Assembler 06-05-84 PAGE 1-10 MORROW 80188 Slave Debugger 010E C3 ret 010F get_command endp near ; ; execute ; ; Executes the command line contained in 'buffer'. ; ; on entry: ; the command line is assumed to be in buffer. ; the command table is at 'commands'. ; on exit: ; the carry flag is cleared if the debugger is to terminate. ; usage: ; call execute ; 010F execute proc near ; determine command 010F A0 012F R mov al,buffer ; get 1st char of command line 0112 BB 0109 R mov bx,offset commands ; point to command table 0115 exe_search: 0115 8A 27 mov ah,[bx] ; get command in table 0117 84 E4 test ah,ah ; if zero then reached end of 0119 74 0D je exe_bad ; table .. bad command 011B 3A C4 cmp al,ah ; if command is found .. 011D 74 05 je exe_command ; then execute it 011F 83 C3 03 add bx,3 ; else skip to next command 0122 EB F1 jmp exe_search 0124 exe_command: 0124 43 inc bx ; point to addr of routine 0125 FF 17 call word ptr [bx] ; near call to routine 0127 C3 ret 0128 exe_bad: ; bad command .. print error 0128 BA 003A R mov dx,offset BAD_COMMAND ; message 012B E8 062A R call prstr 012E F9 stc 012F C3 ret 0130 execute endp near ;************************************************************** ; DEBUGGER FUNCTIONS ;************************************************************** C include mfunct.asm C C ; The following routines execute the functions of the debugger. C C C ; C ; dump C ;  The Microsoft MACRO Assembler 06-05-84 PAGE 1-11 MORROW 80188 Slave Debugger C ; dumps contents of memory C ; C ; syntax: C ; d [
[
] ] C ; C ; the parameters are optional. The default value for the starting C ; address is the current address using the current source segment C ; register. The default value for the count is 64. If an address C ; is given, the count of bytes that will be dumped is the difference C ; between the 2 addresses. The maximum number of bytes that will C ; be dumped is 64K. C ; C 0130 C dump proc near ; dump the contents of memory 0130 BB 0130 R C mov bx,(offset buffer)+1 ; point at 1st char after C ; command 0133 8B 16 0123 R C mov dx,segstore ; get segment address 0137 8E C2 C mov es,dx ; put segment address into es 0139 B4 00 C mov ah,0 ; get source address 013B E8 0530 R C call get_param ; get first parameter 013E 73 03 C jnc dump_01 ; no errors detected 0140 E9 0247 R C jmp dump_err ; error in hex param 0143 C dump_01: 0143 84 E4 C test ah,ah ; if there are no more params 0145 75 52 C jne do_dump ; dump memory 0147 89 16 0127 R C mov current_src,dx ; save current source address 014B 8C C2 C mov dx,es ; save away source segment 014D 89 16 0123 R C mov segstore,dx 0151 8B 16 0127 R C mov dx,current_src ; restore dx value C 0155 B4 01 C mov ah,1 ; get dest param 0157 E8 0530 R C call get_param ; get address or count 015A 73 03 C jnc dump_02 ; no errors detected 015C E9 0247 R C jmp dump_err ; error in hex param 015F C dump_02: 015F 84 E4 C test ah,ah ; if there are more params 0161 74 09 C je dump_1 ; process them 0163 C7 06 012B R 0080 C mov current_count,DEF_COUNT ; dump 64 bytes as default 0169 EB 2E 90 C jmp do_dump C 016C C dump_1: 016C 50 C push ax ; use ax as a temp register 016D 8C C0 C mov ax,es ; save away dest segment 016F A3 0125 R C mov segstore+2,ax 0172 58 C pop ax ; restore ax value 0173 84 C0 C test al,al ; see if param is count 0175 74 07 C je dump_addr ; al = 0 .. dx has address 0177 89 16 012B R C mov current_count,dx ; param was count .. save away 017B EB 1C 90 C jmp do_dump 017E C dump_addr: 017E 39 16 0127 R C cmp current_src,dx ; param is an addr..get count 0182 77 0F C ja dump_2 ; there is no wrap 0184 89 16 0129 R C mov current_dest,dx ; save address away 0188 2B 16 0127 R C sub dx,current_src ; get count into dx 018C 89 16 012B R C mov current_count,dx ; save count 0190 EB 07 90 C jmp do_dump 0193 C dump_2:  The Microsoft MACRO Assembler 06-05-84 PAGE 1-12 MORROW 80188 Slave Debugger 0193 C7 06 012B R 0080 C mov current_count,DEF_COUNT ; dump only default number 0199 C do_dump: 0199 A1 0123 R C mov ax,segstore ; get source segment addr 019C 8E C0 C mov es,ax ; value into segment register 019E 8B 1E 0127 R C mov bx,current_src ; get current offset into bx 01A2 8B 0E 012B R C mov cx,current_count ; get count of bytes to dump 01A6 C dump_start: 01A6 8B 16 0127 R C mov dx,current_src ; es:dx has current addr 01AA E8 05C3 R C call pr_addr ; print current address 01AD BA 0054 R C mov dx,offset SPACE_2 ; skip 2 spaces 01B0 E8 062A R C call prstr 01B3 BA 0010 C mov dx,16 ; only print 16 chars per line 01B6 C dump_byte: 01B6 26: 8A 07 C mov al,es:[bx] ; get data byte into al 01B9 E8 05E0 R C call pr_2hex ; output al as 2 hex digits 01BC B0 20 C mov al,SPACE ; print space between bytes 01BE E8 0619 R C call putc 01C1 43 C inc bx ; point to next byte to print 01C2 49 C dec cx ; decrease count 01C3 74 35 C je dump_done ; done if count is zero 01C5 4A C dec dx ; see if time to start newline 01C6 75 EE C jne dump_byte ; if not then print next byte 01C8 C dump_ascii: ; print out line in ascii 01C8 B0 20 C mov al,SPACE ; print 1 space 01CA E8 0619 R C call putc 01CD 8B 1E 0127 R C mov bx,current_src ; get beginning line addr 01D1 51 C push cx ; save away current count 01D2 B9 0010 C mov cx,16 ; always display 16 chars here 01D5 C dump_char: 01D5 26: 8A 07 C mov al,es:[bx] ; get data byte into al 01D8 43 C inc bx ; point at next char 01D9 3C 20 C cmp al,SPACE ; see if char is printable 01DB 7C 04 C jl dump_dot ; print a dot instead if not 01DD 3C 7F C cmp al,7fh ; printable char? 01DF 7C 02 C jl dump_char1 ; if so .. print it 01E1 C dump_dot: 01E1 B0 2E C mov al,'.' ; print a dot instead of char 01E3 C dump_char1: 01E3 E8 0619 R C call putc ; print the char out 01E6 E2 ED C loop dump_char ; print 16 chars out 01E8 59 C pop cx ; restore current count C 01E9 C dump_newline: ; start a new line 01E9 BA 0031 R C mov dx,offset NEWLINE ; print CR,LF 01EC E8 062A R C call prstr 01EF 89 1E 0127 R C mov current_src,bx ; update source addr pointer 01F3 83 2E 012B R 10 C sub current_count,16 ; one line less to dump 01F8 EB AC C jmp dump_start C 01FA C dump_done: C ; print last line of ascii 01FA 8B 1E 0127 R C mov bx,current_src ; get addr of beg of line 01FE 8B 0E 012B R C mov cx,current_count ; get count of chars left 0202 81 E1 000F C and cx,0fh ; must be less than 16 chars 0206 74 11 C je dump_last ; if 16 left then dump all 0208 B0 10 C mov al,16 ; calculate how many spaces to 020A 2A C1 C sub al,cl ; fill to get to ascii section  The Microsoft MACRO Assembler 06-05-84 PAGE 1-13 MORROW 80188 Slave Debugger C 020C B1 03 C mov cl,3 020E F6 E1 C mul cl ; 3 positions per byte dumped C 0210 8B C8 C mov cx,ax ; print out enough spaces 0212 B0 20 C mov al,SPACE 0214 C dump_spfill: 0214 E8 0619 R C call putc 0217 E2 FB C loop dump_spfill 0219 C dump_last: 0219 8B 0E 012B R C mov cx,current_count ; restore count of chars left 021D B0 20 C mov al,SPACE ; print 1 space 021F E8 0619 R C call putc 0222 C dump_lchar: 0222 26: 8A 07 C mov al,es:[bx] ; get data byte into al 0225 43 C inc bx ; point at next char 0226 3C 20 C cmp al,SPACE ; see if char is printable 0228 7C 04 C jl dump_ldot ; print a dot instead if not 022A 3C 7F C cmp al,7fh ; printable char? 022C 7C 02 C jl dump_lchar1 ; if so .. print it 022E C dump_ldot: 022E B0 2E C mov al,'.' ; print a dot instead of char 0230 C dump_lchar1: 0230 E8 0619 R C call putc ; print the char out 0233 E2 ED C loop dump_lchar ; print remaining chars out C 0235 89 1E 0127 R C mov current_src,bx ; update source addr pointer 0239 C7 06 012B R 0080 C mov current_count,DEF_COUNT ; set default count C 023F BA 0031 R C mov dx,offset NEWLINE ; print CR,LF 0242 E8 062A R C call prstr 0245 C dump_ret: 0245 F9 C stc 0246 C3 C ret C 0247 C dump_err: 0247 BA 004C R C mov dx,offset SYNTAX_MES 024A E8 062A R C call prstr 024D BA 0064 R C mov dx,offset S_DUMP 0250 E8 062A R C call prstr 0253 EB F0 C jmp dump_ret C 0255 C dump endp near C C ; C ; enter C ; C ; allow user to enter byte values into memory. C ; C ; syntax: C ; e [
] C ; C ; the address operand is optional. If there is no address given, the C ; current source address is used as the place to start data entry. C ; C 0255 C enter proc near  The Microsoft MACRO Assembler 06-05-84 PAGE 1-14 MORROW 80188 Slave Debugger 0255 BB 0130 R C mov bx,(offset buffer)+1 ; point at 1st char after C ; command 0258 8B 16 0123 R C mov dx,segstore ; get current segment addr 025C 8E C2 C mov es,dx ; put into es register 025E B4 00 C mov ah,0 ; get address 0260 E8 0530 R C call get_param ; get first parameter 0263 73 03 C jnc e_1 ; if not error 0265 E9 02F2 R C jmp enter_err ; error in hex param 0268 C e_1: 0268 84 E4 C test ah,ah ; if there are no more params 026A 75 0A C jne do_enter ; allow data entry 026C 89 16 0127 R C mov current_src,dx ; save current source address 0270 8C C2 C mov dx,es ; save away source segment 0272 89 16 0123 R C mov segstore,dx 0276 C do_enter: 0276 A1 0123 R C mov ax,segstore ; get source segment addr 0279 8E C0 C mov es,ax ; value into segment register 027B 8B 2E 0127 R C mov bp,current_src ; get current offset into bx 027F C enter_start: 027F 8B D5 C mov dx,bp ; es:dx has current addr 0281 E8 05C3 R C call pr_addr ; print current address 0284 BA 0054 R C mov dx,offset SPACE_2 ; skip 2 spaces 0287 E8 062A R C call prstr 028A C enter_byte: 028A 26: 8A 46 00 C mov al,es:[bp] ; get data byte into al 028E E8 05E0 R C call pr_2hex ; output al as 2 hex digits 0291 BA 0060 R C mov dx,offset DENTRY ; data entry after dot 0294 E8 062A R C call prstr C 0297 B4 01 C mov ah,1 ; do not convert to UC 0299 E8 0090 R C call get_command ; get data into command buf 029C BB 012F R C mov bx,offset buffer ; point at beginning of buffer 029F 8A 07 C mov al,byte ptr [bx] ; get first char into al 02A1 3C 2E C cmp al,'.' ; stop char 02A3 74 4B C je enter_done ; finish with routine 02A5 3C 22 C cmp al,'"' ; this is a string 02A7 74 33 C je enter_string ; put in memory as such 02A9 80 3F 00 C cmp byte ptr [bx],0 ; check for end of line 02AC 75 07 C jne enter_conv ; not end of line 02AE 45 C inc bp ; point to next data byte 02AF 89 2E 0127 R C mov current_src,bp ; save current address 02B3 EB CA C jmp enter_start ; next entry line C 02B5 C enter_conv: ; convert buffer to UC 02B5 53 C push bx ; save bx register 02B6 C enter_conv1: 02B6 80 3F 00 C cmp byte ptr [bx],0 ; while not end of command 02B9 74 0B C je enter_conv3 02BB 80 3F 60 C cmp byte ptr [bx],60h ; if not lower case then 02BE 7C 03 C jl enter_conv2 ; next char 02C0 80 27 DF C and byte ptr [bx],0dfh ; else convert to UC 02C3 C enter_conv2: 02C3 43 C inc bx ; next char in buffer 02C4 EB F0 C jmp enter_conv1 C 02C6 C enter_conv3: 02C6 5B C pop bx ; restore bx register  The Microsoft MACRO Assembler 06-05-84 PAGE 1-15 MORROW 80188 Slave Debugger C 02C7 C enter_hex: ; data must be in hex format 02C7 E8 0571 R C call get_hex ; get a byte value from buf C ; bx points at buffer 02CA 72 B3 C jc enter_start ; error in data entry 02CC 26: 88 56 00 C mov es:[bp],dl ; dx contains 16 bit value 02D0 45 C inc bp ; point to next data byte 02D1 89 2E 0127 R C mov current_src,bp ; save current address 02D5 80 3F 00 C cmp byte ptr [bx],0 ; check for end of line 02D8 74 A5 C je enter_start ; next entry line 02DA EB EB C jmp enter_hex C 02DC C enter_string: ; data is ascii data 02DC 43 C inc bx ; point at next char in buf 02DD C enter_str1: 02DD 80 3F 00 C cmp byte ptr [bx],0 ; check for end of line 02E0 74 9D C je enter_start ; next entry line 02E2 8A 07 C mov al,byte ptr [bx] ; put hex char into memory 02E4 26: 88 46 00 C mov es:[bp],al 02E8 45 C inc bp ; next location in memory 02E9 89 2E 0127 R C mov current_src,bp ; save current address 02ED 43 C inc bx ; next char in buffer 02EE EB ED C jmp enter_str1 C 02F0 C enter_done: 02F0 F9 C stc 02F1 C3 C ret 02F2 C enter_err: 02F2 BA 004C R C mov dx,offset SYNTAX_MES 02F5 E8 062A R C call prstr 02F8 BA 0085 R C mov dx,offset S_ENTER 02FB E8 062A R C call prstr 02FE EB F0 C jmp enter_done C 0300 C enter endp near C C ; C ; fill C ; C ; fill memory with specified values. C ; C ; syntax: C ; f
[] C ; C ; All parameters must be present. If there is more than one value C ; given, the values are put into memory consecutively until the C ; ending address or the maximum count is reached. C ; C 0300 C fill proc near 0300 BB 0130 R C mov bx,(offset buffer)+1 ; point at 1st char after C ; command 0303 8B 16 0123 R C mov dx,segstore ; get segment address 0307 8E C2 C mov es,dx ; put segment address into es 0309 B4 00 C mov ah,0 ; get source address 030B E8 0530 R C call get_param ; get first parameter 030E 73 03 C jnc fill_01 ; no errors detected  The Microsoft MACRO Assembler 06-05-84 PAGE 1-16 MORROW 80188 Slave Debugger 0310 E9 03CB R C jmp fill_err ; error in hex param 0313 C fill_01: 0313 84 E4 C test ah,ah ; if there are more params 0315 74 03 C je fill_02 ; then process them 0317 E9 03CB R C jmp fill_err ; else error 031A C fill_02: 031A 89 16 0127 R C mov current_src,dx ; save current source address 031E 8C C2 C mov dx,es ; save away source segment 0320 89 16 0123 R C mov segstore,dx 0324 8B 16 0127 R C mov dx,current_src ; restore dx value C 0328 B4 01 C mov ah,1 ; get dest param 032A E8 0530 R C call get_param ; get address or count 032D 73 03 C jnc fill_03 ; no errors detected 032F E9 03CB R C jmp fill_err ; error in hex param 0332 C fill_03: 0332 84 E4 C test ah,ah ; if there are more params 0334 74 03 C je fill_1 ; process them 0336 E9 03CB R C jmp fill_err ; else error 0339 C fill_1: 0339 50 C push ax ; use ax as a temp register 033A 8C C0 C mov ax,es ; save away dest segment 033C A3 0125 R C mov segstore+2,ax 033F 58 C pop ax ; restore ax value 0340 84 C0 C test al,al ; see if param is count 0342 74 12 C je fill_addr ; al = 0 .. dx has address 0344 8B C2 C mov ax,dx ; get count as temporary 0346 03 06 0127 R C add ax,current_src ; test to see if wrap around 034A 71 03 C jno fill_10 ; no overflow .. continue 034C EB 7D 90 C jmp fill_err ; error in count .. too big 034F C fill_10: 034F 89 16 012B R C mov current_count,dx ; param was count .. save away 0353 EB 19 90 C jmp fill_value ; get memory fill values 0356 C fill_addr: 0356 39 16 0127 R C cmp current_src,dx ; param is an addr..get count 035A 77 0F C ja fill_2 ; there is no wrap 035C 89 16 0129 R C mov current_dest,dx ; save address away 0360 2B 16 0127 R C sub dx,current_src ; get count into dx 0364 89 16 012B R C mov current_count,dx ; save count 0368 EB 04 90 C jmp fill_value 036B C fill_2: 036B EB 5E 90 C jmp fill_err ; wrap on segment is an error 036E C fill_value: 036E C6 06 01AF R 00 C mov byte ptr data_buf,0 ; zero count of data bytes 0373 BD 01B0 R C mov bp,(offset data_buf)+1 ; address of data buffer 0376 80 3F 00 C cmp byte ptr [bx],0 ; check for end of line 0379 75 03 C jne fill_hex ; not end of line 037B EB 4E 90 C jmp fill_err ; error .. no fill values 037E C fill_hex: 037E E8 0571 R C call get_hex ; get a byte value from buf C ; bx points at buffer 0381 72 48 C jc fill_err ; error in data entry 0383 3E: 88 56 00 C mov ds:[bp],dl ; dx contains 16 bit value 0387 45 C inc bp ; point to next data byte 0388 FE 06 01AF R C inc data_buf ; count of data bytes 038C 80 3E 01AF R 09 C cmp byte ptr data_buf,9 ; too many bytes to fill 0391 74 38 C je fill_err  The Microsoft MACRO Assembler 06-05-84 PAGE 1-17 MORROW 80188 Slave Debugger 0393 80 3F 00 C cmp byte ptr [bx],0 ; check for end of line 0396 75 E6 C jne fill_hex ; get all data bytes on line 0398 C do_fill: ; fill memory with data bytes 0398 A1 0123 R C mov ax,segstore ; get segment address 039B 8E C0 C mov es,ax 039D 8B 1E 0127 R C mov bx,current_src ; get destination address 03A1 8B 0E 012B R C mov cx,current_count ; get count of bytes to fill 03A5 8A 16 01AF R C mov dl,data_buf ; get fill sequence count 03A9 BD 01B0 R C mov bp,(offset data_buf)+1 ; get data buf addr 03AC C do_fill_1: 03AC 3E: 8A 46 00 C mov al,ds:[bp] ; get data byte 03B0 26: 88 07 C mov es:[bx],al ; put data byte into memory 03B3 45 C inc bp ; point to next data byte 03B4 43 C inc bx ; next memory location 03B5 FE CA C dec dl ; decr count of fill seq count 03B7 75 07 C jne do_fill_2 ; if not zero then continue 03B9 8A 16 01AF R C mov dl,data_buf ; otherwise start again 03BD BD 01B0 R C mov bp,(offset data_buf)+1 ; at beg of data buffer 03C0 C do_fill_2: 03C0 E2 EA C loop do_fill_1 ; do until count is zero 03C2 C7 06 012B R 0080 C mov current_count,DEF_COUNT ; fix count to default 03C8 EB 0D 90 C jmp fill_done C 03CB C fill_err: 03CB BA 004C R C mov dx,offset SYNTAX_MES 03CE E8 062A R C call prstr 03D1 BA 0093 R C mov dx,offset S_FILL 03D4 E8 062A R C call prstr 03D7 C fill_done: 03D7 F9 C stc 03D8 C3 C ret C 03D9 C fill endp near C C ; C ; input C ; C ; get value from i/o port and then allow data entry. C ; C ; syntax: C ; i C ; C ; The port address is optional. If the port address is not given, C ; the last port address is used. C ; C 03D9 C input proc near 03D9 BB 0130 R C mov bx,(offset buffer)+1 ; point at 1st char after C ; command 03DC 80 3F 00 C cmp byte ptr [bx],0 ; see if address was entered 03DF 74 09 C je do_input ; if none use old port addr 03E1 E8 0571 R C call get_hex ; get 16 bit port address 03E4 72 39 C jc input_err ; bad port value 03E6 89 16 012D R C mov current_port,dx ; save current source address 03EA C do_input: 03EA A1 012D R C mov ax,current_port ; print port address 03ED E8 05D5 R C call pr_4hex ; print current address  The Microsoft MACRO Assembler 06-05-84 PAGE 1-18 MORROW 80188 Slave Debugger 03F0 BA 0054 R C mov dx,offset SPACE_2 ; skip 2 spaces 03F3 E8 062A R C call prstr 03F6 C input_byte: 03F6 8B 16 012D R C mov dx,current_port ; get port address 03FA EC C in al,dx ; get data byte into al 03FB E8 05E0 R C call pr_2hex ; output al as 2 hex digits 03FE BA 0060 R C mov dx,offset DENTRY ; data entry after = 0401 E8 062A R C call prstr 0404 B4 00 C mov ah,0 ; convert to UC 0406 E8 0090 R C call get_command ; get data into command buf 0409 BB 012F R C mov bx,offset buffer ; point at beginning of buffer 040C 80 3F 00 C cmp byte ptr [bx],0 ; see if anything entered C 040F 74 0C C je input_done ; done if nothing C 0411 E8 0571 R C call get_hex ; get a byte value from buf C ; bx points at buffer 0414 72 07 C jc input_done ; error in data entry 0416 8B C2 C mov ax,dx ; dx contains 16 bit value 0418 8B 16 012D R C mov dx,current_port ; get port address 041C EE C out dx,al ; output new value to port 041D C input_done: 041D F9 C stc 041E C3 C ret 041F C input_err: 041F BA 004C R C mov dx,offset SYNTAX_MES 0422 E8 062A R C call prstr 0425 BA 00BC R C mov dx,offset S_INPUT 0428 E8 062A R C call prstr 042B EB F0 C jmp input_done C 042D C input endp near C C ; C ; move C ; C ; syntax: C ; m C ; C ; All the parameters are required. The last parameter must a count. C ; C 042D C move proc near 042D BB 0130 R C mov bx,(offset buffer)+1 ; point at 1st char after C ; command 0430 8B 16 0123 R C mov dx,segstore ; get segment address 0434 8E C2 C mov es,dx ; put segment address into es 0436 B4 00 C mov ah,0 ; get source address 0438 E8 0530 R C call get_param ; get first parameter 043B 73 03 C jnc move_01 ; no errors detected 043D EB 70 90 C jmp move_err ; error in hex param 0440 C move_01: 0440 84 E4 C test ah,ah ; if there are more params 0442 74 03 C je move_02 ; then process them 0444 EB 69 90 C jmp move_err ; else error 0447 C move_02: 0447 89 16 0127 R C mov current_src,dx ; save current source address  The Microsoft MACRO Assembler 06-05-84 PAGE 1-19 MORROW 80188 Slave Debugger 044B 8C C2 C mov dx,es ; save away source segment 044D 89 16 0123 R C mov segstore,dx C 0451 B4 00 C mov ah,0 ; get dest address 0453 E8 0530 R C call get_param ; get address 0456 73 03 C jnc move_03 ; no errors detected 0458 EB 55 90 C jmp move_err ; error in hex param 045B C move_03: 045B 84 E4 C test ah,ah ; if there are more params 045D 74 03 C je move_1 ; process them 045F EB 4E 90 C jmp move_err ; else error 0462 C move_1: 0462 8C C0 C mov ax,es ; save away dest segment 0464 A3 0125 R C mov segstore+2,ax 0467 89 16 0129 R C mov current_dest,dx ; save address away C 046B B4 01 C mov ah,1 ; get count of bytes to move 046D E8 0530 R C call get_param ; get address or count 0470 73 03 C jnc move_2 ; no errors detected 0472 EB 3B 90 C jmp move_err ; error in hex param 0475 C move_2: 0475 84 E4 C test ah,ah ; if there are more params 0477 74 03 C je move_3 ; process them 0479 EB 34 90 C jmp move_err ; else error 047C C move_3: 047C 84 C0 C test al,al ; see if param is count 047E 75 03 C jne move_4 ; then process command 0480 EB 2D 90 C jmp move_err ; else error 0483 C move_4: 0483 89 16 012B R C mov current_count,dx ; save count of bytes 0487 85 D2 C test dx,dx ; if count is zero then error 0489 74 24 C je move_err 048B C do_move: 048B 8B 36 0127 R C mov si,current_src ; get current source addr 048F 8B 3E 0129 R C mov di,current_dest ; get destination addr 0493 8B 0E 012B R C mov cx,current_count ; get count of bytes to move 0497 A1 0125 R C mov ax,segstore+2 ; get dest segment 049A 8E C0 C mov es,ax ; put into es register 049C A1 0123 R C mov ax,segstore ; get source segment 049F 1E C push ds ; save current ds 04A0 8E D8 C mov ds,ax ; put in source segment 04A2 FC C cld ; clear dir flag, auto incr 04A3 F3/ A4 C rep movsb ; move block of data 04A5 1F C pop ds ; restore data segment reg 04A6 C7 06 012B R 0080 C mov current_count,DEF_COUNT ; fix count 04AC EB 0D 90 C jmp move_done C 04AF C move_err: 04AF BA 004C R C mov dx,offset SYNTAX_MES 04B2 E8 062A R C call prstr 04B5 BA 00C7 R C mov dx,offset S_MOVE 04B8 E8 062A R C call prstr 04BB C move_done: 04BB F9 C stc 04BC C3 C ret C 04BD C move endp near  The Microsoft MACRO Assembler 06-05-84 PAGE 1-20 MORROW 80188 Slave Debugger C C ; C ; output C ; C ; output byte value to port. C ; C ; syntax: C ; o C ; C ; The port address and value must be given. C ; C 04BD C output proc near 04BD BB 0130 R C mov bx,(offset buffer)+1 ; point at 1st char after C ; command 04C0 80 3F 00 C cmp byte ptr [bx],0 ; see if address was entered 04C3 74 1C C je output_err ; if none use old port addr 04C5 E8 0571 R C call get_hex ; get 16 bit port address 04C8 72 17 C jc output_err ; bad port value 04CA 8B FA C mov di,dx ; save current source address C 04CC 80 3F 00 C cmp byte ptr [bx],0 ; see if data byte was entered 04CF 74 10 C je output_err ; if none use old port addr 04D1 E8 0571 R C call get_hex ; get 8 bit data 04D4 72 0B C jc output_err ; bad hex value 04D6 8B C2 C mov ax,dx ; get value into ax C 04D8 8B D7 C mov dx,di ; restore from temp register 04DA 89 16 012D R C mov current_port,dx ; save away port address C 04DE EE C out dx,al ; output 8 bit value to port C 04DF C output_done: 04DF F9 C stc 04E0 C3 C ret C 04E1 C output_err: 04E1 BA 004C R C mov dx,offset SYNTAX_MES ; print syntax error message 04E4 E8 062A R C call prstr 04E7 BA 00E7 R C mov dx,offset S_OUTPUT 04EA E8 062A R C call prstr 04ED EB F0 C jmp output_done C 04EF C output endp near C C ; C ; jump C ; C ; Start execution at address. C ; C ; Syntax: C ; j
C ; C ; If the address parameter is not given, execution will start at C ; the current source address. C ; C  The Microsoft MACRO Assembler 06-05-84 PAGE 1-21 MORROW 80188 Slave Debugger 04EF C jump proc near 04EF BB 0130 R C mov bx,(offset buffer)+1 ; point at 1st char after C ; command 04F2 8B 16 0123 R C mov dx,segstore ; get current segment addr 04F6 8E C2 C mov es,dx ; put into es register 04F8 B4 00 C mov ah,0 ; get address 04FA E8 0530 R C call get_param ; get first parameter 04FD 73 03 C jnc j_1 ; if not error 04FF EB 16 90 C jmp jump_err ; error in hex param 0502 C j_1: 0502 84 E4 C test ah,ah ; if there are no more params 0504 75 0A C jne do_jump ; jump to address 0506 89 16 0127 R C mov current_src,dx ; save current source address 050A 8C C2 C mov dx,es ; save away source segment 050C 89 16 0123 R C mov segstore,dx 0510 C do_jump: C ; note that the code jumped to must use a far return C ; to get back into the debugger 0510 9A 0525 ---- R C call far ptr long_jump ; dummy routine to do jump C ; should return here if dest C ; code used a far return 0515 C jump_done: 0515 F9 C stc 0516 C3 C ret 0517 C jump_err: 0517 BA 004C R C mov dx,offset SYNTAX_MES ; print syntax error message 051A E8 062A R C call prstr 051D BA 00FA R C mov dx,offset S_JUMP 0520 E8 062A R C call prstr 0523 EB F0 C jmp jump_done C 0525 C jump endp near C C ; C ; long_jump C ; C ; dummy routine to do far jump to code. Only used by 'jump' proc. C ; C 0525 C long_jump proc far 0525 FF 36 0123 R C push word ptr segstore ; push segment addr 0529 FF 36 0127 R C push word ptr current_src ; push offset addr 052D CB C ret ; go to that address 052E C long_jump endp far C C C ; C ; quit C ; C ; This command is useful only under MSDOS and use primarily for C ; testing. The debugger is exited and control is returned to the C ; operating system. C ; C 052E C quit proc near 052E F8 C clc 052F C3 C ret  The Microsoft MACRO Assembler 06-05-84 PAGE 1-22 MORROW 80188 Slave Debugger 0530 C quit endp near C C C ; These routines are used by the functions above C C ; C ; get_param C ; C ; get the next parameter from the command buffer C ; C ; on entry: C ; bx points to the place to start parsing C ; ah = 0 for a source operand, ah = 1 for a dest operand C ; on return: C ; al contains 0 if the parameter was an addr C ; and contains 0ffh if the parameter was a count C ; note that a count value can only be returned C ; if the parameter was a destination parameter (ah = 1) C ; ah contains 0ffh if there are no more params on C ; the command line. Otherwise ah = 0. C ; bx points to position just past parameter parsed C ; dx contains the value of the parameter C ; es contains the segment value of the parameter C ; the carry flag will be set if there was an error in C ; the hex value, otherwise it is cleared C ; all other registers are unchanged C ; usage: C ; call get_param C ; C 0530 C get_param proc near ; get the next parameter 0530 80 3F 20 C cmp byte ptr [bx],SPACE ; scan past leading delimiters 0533 75 03 C jne gp_1 0535 43 C inc bx ; if space then next char 0536 EB F8 C jmp get_param 0538 C gp_1: 0538 80 3F 00 C cmp byte ptr [bx],0 ; check for end of command 053B 74 2E C je gp_noparam C 053D 80 3F 4C C cmp byte ptr [bx],'L' ; check for count 0540 74 18 C je gp_count ; if so then get count value C 0542 E8 0571 R C call get_hex ; get a hex value into dx 0545 72 28 C jc gp_err ; error if carry flag set 0547 80 3F 3A C cmp byte ptr [bx],':' ; if this value is a segment 054A 75 08 C jne gp_adone ; got an addr in dx 054C 8E C2 C mov es,dx ; save source seg reg 054E C gp_addr: 054E 43 C inc bx ; skip past ':' 054F E8 0571 R C call get_hex ; get the addr value into dx 0552 72 1B C jc gp_err ; error if carry flag set 0554 C gp_adone: 0554 B8 0000 C mov ax,0 ; value in dx is address 0557 EB 14 90 C jmp gp_ret C 055A C gp_count: ; get a count value into dx 055A 84 E4 C test ah,ah ; param must be dest  The Microsoft MACRO Assembler 06-05-84 PAGE 1-23 MORROW 80188 Slave Debugger 055C 74 11 C je gp_err ; error in command line 055E 43 C inc bx ; skip past 'L' 055F E8 0571 R C call get_hex ; get hex count value into dx 0562 72 0B C jc gp_err ; error if carry flag set 0564 B4 00 C mov ah,0 ; not end of command line 0566 B0 FF C mov al,0ffh ; mark as count value 0568 EB 03 90 C jmp gp_ret C 056B C gp_noparam: 056B B4 FF C mov ah,0ffh ; mark as end of line C 056D C gp_ret: 056D F8 C clc ; clear error flag 056E C3 C ret C 056F C gp_err: 056F F9 C stc ; mark as error 0570 C3 C ret C 0571 C get_param endp near C C C ; C ; get_hex C ; C ; gets a 16 bit hex value from the command buffer. C ; C ; on entry: C ; bx points to the current position in the command buffer C ; on return: C ; bx points past hex value C ; dx contains hex value C ; all other registers are unchanged C ; carry bit is set if there was an error in hex value C ; otherwise carry bit is cleared C ; usage: C ; call get_hex C ; C 0571 C get_hex proc near ; get hexidecimal value 0571 50 C push ax ; save value in ax 0572 51 C push cx ; save value in cx 0573 33 C0 C xor ax,ax ; zero ax 0575 33 D2 C xor dx,dx ; clear value in dx 0577 C gh_0: 0577 80 3F 20 C cmp byte ptr [bx],SPACE ; scan past leading delimiters 057A 75 03 C jne gh_1 057C 43 C inc bx ; if space then next char 057D EB F8 C jmp gh_0 057F C gh_1: 057F 80 3F 30 C cmp byte ptr [bx],'0' ; check that first char is hex 0582 7C 3B C jl gh_err ; if not then command error 0584 80 3F 46 C cmp byte ptr [bx],'F' 0587 7F 36 C jg gh_err 0589 80 3F 41 C cmp byte ptr [bx],'A' 058C 7D 0C C jge gh_char ; must be A-F 058E 80 3F 39 C cmp byte ptr [bx],'9'  The Microsoft MACRO Assembler 06-05-84 PAGE 1-24 MORROW 80188 Slave Debugger 0591 7F 2C C jg gh_err ; between 9 and A 0593 C gh_number: ; must be 0-9 0593 8A 07 C mov al,[bx] 0595 2C 30 C sub al,'0' ; adjust to binary value 0597 EB 05 90 C jmp gh_sum C 059A C gh_char: 059A 8A 07 C mov al,[bx] 059C 2C 37 C sub al,'A'-10 ; adjust to binary value 059E C gh_sum: 059E B1 04 C mov cl,4 05A0 D3 E2 C sal dx,cl ; multiply prev value by 16 05A2 03 D0 C add dx,ax ; add in new digit C C ; keep doing until non-hex char is reached C 05A4 43 C inc bx ; point at next char 05A5 80 3F 30 C cmp byte ptr [bx],'0' ; check that first char is hex 05A8 7C 11 C jl gh_done ; if not then command error 05AA 80 3F 46 C cmp byte ptr [bx],'F' 05AD 7F 0C C jg gh_done 05AF 80 3F 41 C cmp byte ptr [bx],'A' 05B2 7D E6 C jge gh_char ; must be A-F 05B4 80 3F 39 C cmp byte ptr [bx],'9' 05B7 7F 02 C jg gh_done ; between 9 and A 05B9 EB D8 C jmp gh_number ; char is between 0-9 C 05BB C gh_done: 05BB 59 C pop cx ; restore value in cx 05BC 58 C pop ax ; restore value in ax 05BD F8 C clc 05BE C3 C ret C 05BF C gh_err: 05BF 59 C pop cx ; restore register values 05C0 58 C pop ax 05C1 F9 C stc ; set error flag 05C2 C3 C ret C 05C3 C get_hex endp near C C ; C ; pr_addr C ; C ; print current address contained in es:dx. C ; C ; on entry: C ; es contains the segment value C ; dx contains the offset C ; on return: C ; no registers are affected C ; usage: C ; call pr_addr C ; C 05C3 C pr_addr proc near 05C3 50 C push ax ; save ax register  The Microsoft MACRO Assembler 06-05-84 PAGE 1-25 MORROW 80188 Slave Debugger 05C4 8C C0 C mov ax,es ; print segment value first 05C6 E8 05D5 R C call pr_4hex ; print out 4 digit hex value 05C9 B0 3A C mov al,':' ; print separating colon 05CB E8 0619 R C call putc 05CE 8B C2 C mov ax,dx ; print the offset 05D0 E8 05D5 R C call pr_4hex ; print value in ax 05D3 58 C pop ax ; restore value in ax 05D4 C3 C ret 05D5 C pr_addr endp near C C ; C ; pr_4hex C ; C ; print out address as 4 hex digits. C ; C ; on entry: C ; ax contains 16 bit value to print C ; on return: C ; no registers are changed C ; usage: C ; call pr_4hex C ; C 05D5 C pr_4hex proc near 05D5 50 C push ax ; save register 05D6 8A C4 C mov al,ah ; most signif digits first 05D8 E8 05E0 R C call pr_2hex ; print out 2 hex digits 05DB 58 C pop ax ; get orig value back 05DC E8 05E0 R C call pr_2hex 05DF C3 C ret 05E0 C pr_4hex endp near C C ; C ; pr_2hex C ; C ; prints 8 bit value out as 2 hex digits. C ; C ; on entry: C ; al contains 8 bit value to print C ; on return: C ; no registers are affected C ; usage: C ; call pr_2hex C ; C 05E0 C pr_2hex proc near 05E0 51 C push cx ; save away registers 05E1 50 C push ax 05E2 8A E0 C mov ah,al ; store al in ah 05E4 B1 04 C mov cl,4 ; shift value into low nibble 05E6 D2 E8 C shr al,cl C 05E8 E8 05F5 R C call pr_hex ; print out hex digit 05EB 8A C4 C mov al,ah ; get orig value back in al 05ED 24 0F C and al,0fh ; print second hex digit 05EF E8 05F5 R C call pr_hex ; print hex digit 05F2 58 C pop ax ; restore registers  The Microsoft MACRO Assembler 06-05-84 PAGE 1-26 MORROW 80188 Slave Debugger 05F3 59 C pop cx 05F4 C3 C ret 05F5 C pr_2hex endp near C C ; C ; pr_hex C ; C ; print out value in low nibble of al as a hex digit. C ; C ; on entry: C ; al contains value from 0-15 C ; on return: C ; no registers are changed C ; usage: C ; call pr_hex C ; C 05F5 C pr_hex proc near 05F5 50 C push ax 05F6 24 0F C and al,0fh ; get low nibble 05F8 3C 0A C cmp al,10 ; 0-9 or A-F ? 05FA 7C 05 C jl ph_isdigit ; 0-9 05FC 04 37 C add al,'A'-10 ; make the value ascii 05FE EB 03 90 C jmp ph_printit 0601 C ph_isdigit: 0601 04 30 C add al,'0' ; make value ascii 0603 C ph_printit: 0603 E8 0619 R C call putc ; print char 0606 58 C pop ax 0607 C3 C ret 0608 C pr_hex endp near C C C C E r r o r --- 1:Extra characters on line C E r r o r --- 1:Extra characters on line C E r r o r --- 1:Extra characters on line ;************************************************************** ; HARDWARE RELATED ROUTINES ;************************************************************** 0608 getc proc near ; get a char from console port ; return in al 0608 52 push dx ; save dx register 0609 BA 0005 mov dx,uartlinestatus 060C getc_wrdy: 060C EC in al,dx ; get uart status 060D 24 01 and al,dataready ; if no char received in uart 060F 74 FB je getc_wrdy ; wait ..  The Microsoft MACRO Assembler 06-05-84 PAGE 1-27 MORROW 80188 Slave Debugger 0611 BA 0000 mov dx,uartdata ; get data from uart 0614 EC in al,dx 0615 24 7F and al,07fh ; get rid of ms bit 0617 5A pop dx ; restore dx 0618 C3 ret 0619 getc endp near 0619 putc proc near ; write a char to console port ; char is in al reg 0619 52 push dx ; save dx register 061A 50 push ax ; save ax register also 061B BA 0005 mov dx,uartlinestatus 061E putc_wrdy: 061E EC in al,dx 061F 24 20 and al,thre ; test if xmit holding reg empty 0621 74 FB je putc_wrdy ; if not empty then again 0623 58 pop ax ; restore ax register and char 0624 BA 0000 mov dx,uartdata ; otherwise send data to port 0627 EE out dx,al ; write char to uart 0628 5A pop dx 0629 C3 ret 062A putc endp near 062A prstr proc near ; dx pts to string terminated ; by a '$' 062A 53 push bx ; save bx register 062B 50 push ax ; save ax register 062C 8B DA mov bx,dx ; get string addr 062E prstr1: 062E 8A 07 mov al,[bx] ; get next char in string 0630 3C 24 cmp al,'$' ; see if end of string 0632 74 06 je prstr_done ; done if so 0634 E8 0619 R call putc ; else send char to console 0637 43 inc bx ; point at next char 0638 EB F4 jmp prstr1 ; print next char 063A prstr_done: 063A 58 pop ax ; restore ax register 063B 5B pop bx ; restore bx register 063C C3 ret 063D prstr endp near 063D code ends end  The Microsoft MACRO Assembler 06-05-84 PAGE Symbols-1 MORROW 80188 Slave Debugger Segments and groups: N a m e Size align combine class CODE . . . . . . . . . . . . . . 063D PARA PUBLIC 'CODE' DATA . . . . . . . . . . . . . . 01B8 PARA PUBLIC 'DATA' Symbols: N a m e Type Value Attr BAD_COMMAND. . . . . . . . . . . L BYTE 003A DATA BAUD1200 . . . . . . . . . . . . Number 0060 BAUD2400 . . . . . . . . . . . . Number 0030 BAUD300. . . . . . . . . . . . . Number 0180 BAUD4800 . . . . . . . . . . . . Number 0018 BAUD9600 . . . . . . . . . . . . Number 000C BEGIN. . . . . . . . . . . . . . F PROC 0000 CODE Length =0090 BREAKINT . . . . . . . . . . . . Number 0010 BS . . . . . . . . . . . . . . . Number 0008 BUFFER . . . . . . . . . . . . . L BYTE 012F DATA Length =0080 BUFLENGTH. . . . . . . . . . . . Number 0080 CNTRL_BASE . . . . . . . . . . . Number FF00 COMMANDS . . . . . . . . . . . . L BYTE 0109 DATA CR . . . . . . . . . . . . . . . Number 000D CTS. . . . . . . . . . . . . . . Number 0010 CURRENT_COUNT. . . . . . . . . . L WORD 012B DATA CURRENT_DEST . . . . . . . . . . L WORD 0129 DATA CURRENT_PORT . . . . . . . . . . L WORD 012D DATA CURRENT_SRC. . . . . . . . . . . L WORD 0127 DATA DATAREADY. . . . . . . . . . . . Number 0001 DATA_BUF . . . . . . . . . . . . L BYTE 01AF DATA DCTS . . . . . . . . . . . . . . Number 0001 DDSR . . . . . . . . . . . . . . Number 0002 DEF_COUNT. . . . . . . . . . . . Number 0080 DELETE . . . . . . . . . . . . . Number 007F DENTRY . . . . . . . . . . . . . L BYTE 0060 DATA DEST_SEG . . . . . . . . . . . . Number 0000 DLAB . . . . . . . . . . . . . . Number 0080 DO_DUMP. . . . . . . . . . . . . L NEAR 0199 CODE DO_ENTER . . . . . . . . . . . . L NEAR 0276 CODE DO_FILL. . . . . . . . . . . . . L NEAR 0398 CODE DO_FILL_1. . . . . . . . . . . . L NEAR 03AC CODE DO_FILL_2. . . . . . . . . . . . L NEAR 03C0 CODE DO_INPUT . . . . . . . . . . . . L NEAR 03EA CODE DO_JUMP. . . . . . . . . . . . . L NEAR 0510 CODE DO_MOVE. . . . . . . . . . . . . L NEAR 048B CODE DRLSD. . . . . . . . . . . . . . Number 0008 DSR. . . . . . . . . . . . . . . Number 0020 DTR. . . . . . . . . . . . . . . Number 0001 DUMP . . . . . . . . . . . . . . N PROC 0130 CODE Length =0125 DUMP_01. . . . . . . . . . . . . L NEAR 0143 CODE DUMP_02. . . . . . . . . . . . . L NEAR 015F CODE DUMP_1 . . . . . . . . . . . . . L NEAR 016C CODE DUMP_2 . . . . . . . . . . . . . L NEAR 0193 CODE DUMP_ADDR. . . . . . . . . . . . L NEAR 017E CODE DUMP_ASCII . . . . . . . . . . . L NEAR 01C8 CODE  The Microsoft MACRO Assembler 06-05-84 PAGE Symbols-2 MORROW 80188 Slave Debugger DUMP_BYTE. . . . . . . . . . . . L NEAR 01B6 CODE DUMP_CHAR. . . . . . . . . . . . L NEAR 01D5 CODE DUMP_CHAR1 . . . . . . . . . . . L NEAR 01E3 CODE DUMP_DONE. . . . . . . . . . . . L NEAR 01FA CODE DUMP_DOT . . . . . . . . . . . . L NEAR 01E1 CODE DUMP_ERR . . . . . . . . . . . . L NEAR 0247 CODE DUMP_LAST. . . . . . . . . . . . L NEAR 0219 CODE DUMP_LCHAR . . . . . . . . . . . L NEAR 0222 CODE DUMP_LCHAR1. . . . . . . . . . . L NEAR 0230 CODE DUMP_LDOT. . . . . . . . . . . . L NEAR 022E CODE DUMP_NEWLINE . . . . . . . . . . L NEAR 01E9 CODE DUMP_RET . . . . . . . . . . . . L NEAR 0245 CODE DUMP_SPFILL. . . . . . . . . . . L NEAR 0214 CODE DUMP_START . . . . . . . . . . . L NEAR 01A6 CODE ENDSTRING. . . . . . . . . . . . Number 0024 END_DATA_SEG . . . . . . . . . . L BYTE 01B8 DATA ENTER. . . . . . . . . . . . . . N PROC 0255 CODE Length =00AB ENTER_BYTE . . . . . . . . . . . L NEAR 028A CODE ENTER_CONV . . . . . . . . . . . L NEAR 02B5 CODE ENTER_CONV1. . . . . . . . . . . L NEAR 02B6 CODE ENTER_CONV2. . . . . . . . . . . L NEAR 02C3 CODE ENTER_CONV3. . . . . . . . . . . L NEAR 02C6 CODE ENTER_DONE . . . . . . . . . . . L NEAR 02F0 CODE ENTER_ERR. . . . . . . . . . . . L NEAR 02F2 CODE ENTER_HEX. . . . . . . . . . . . L NEAR 02C7 CODE ENTER_START. . . . . . . . . . . L NEAR 027F CODE ENTER_STR1 . . . . . . . . . . . L NEAR 02DD CODE ENTER_STRING . . . . . . . . . . L NEAR 02DC CODE EXECUTE. . . . . . . . . . . . . N PROC 010F CODE Length =0021 EXE_BAD. . . . . . . . . . . . . L NEAR 0128 CODE EXE_COMMAND. . . . . . . . . . . L NEAR 0124 CODE EXE_SEARCH . . . . . . . . . . . L NEAR 0115 CODE E_1. . . . . . . . . . . . . . . L NEAR 0268 CODE FILL . . . . . . . . . . . . . . N PROC 0300 CODE Length =00D9 FILL_01. . . . . . . . . . . . . L NEAR 0313 CODE FILL_02. . . . . . . . . . . . . L NEAR 031A CODE FILL_03. . . . . . . . . . . . . L NEAR 0332 CODE FILL_1 . . . . . . . . . . . . . L NEAR 0339 CODE FILL_10. . . . . . . . . . . . . L NEAR 034F CODE FILL_2 . . . . . . . . . . . . . L NEAR 036B CODE FILL_ADDR. . . . . . . . . . . . L NEAR 0356 CODE FILL_DONE. . . . . . . . . . . . L NEAR 03D7 CODE FILL_ERR . . . . . . . . . . . . L NEAR 03CB CODE FILL_HEX . . . . . . . . . . . . L NEAR 037E CODE FILL_VALUE . . . . . . . . . . . L NEAR 036E CODE FRAMINGERR . . . . . . . . . . . Number 0008 GC_1 . . . . . . . . . . . . . . L NEAR 00C9 CODE GC_DELETE. . . . . . . . . . . . L NEAR 00EC CODE GC_DONE. . . . . . . . . . . . . L NEAR 0108 CODE GC_ERR . . . . . . . . . . . . . L NEAR 010E CODE GC_KILL. . . . . . . . . . . . . L NEAR 00D6 CODE GC_NEXTCHAR. . . . . . . . . . . L NEAR 00A5 CODE GETC . . . . . . . . . . . . . . N PROC 0608 CODE Length =0011 GETC_WRDY. . . . . . . . . . . . L NEAR 060C CODE GET_COMMAND. . . . . . . . . . . N PROC 0090 CODE Length =007F GET_HEX. . . . . . . . . . . . . N PROC 0571 CODE Length =0052 GET_PARAM. . . . . . . . . . . . N PROC 0530 CODE Length =0041  The Microsoft MACRO Assembler 06-05-84 PAGE Symbols-3 MORROW 80188 Slave Debugger GH_0 . . . . . . . . . . . . . . L NEAR 0577 CODE GH_1 . . . . . . . . . . . . . . L NEAR 057F CODE GH_CHAR. . . . . . . . . . . . . L NEAR 059A CODE GH_DONE. . . . . . . . . . . . . L NEAR 05BB CODE GH_ERR . . . . . . . . . . . . . L NEAR 05BF CODE GH_NUMBER. . . . . . . . . . . . L NEAR 0593 CODE GH_SUM . . . . . . . . . . . . . L NEAR 059E CODE GP_1 . . . . . . . . . . . . . . L NEAR 0538 CODE GP_ADDR. . . . . . . . . . . . . L NEAR 054E CODE GP_ADONE . . . . . . . . . . . . L NEAR 0554 CODE GP_COUNT . . . . . . . . . . . . L NEAR 055A CODE GP_ERR . . . . . . . . . . . . . L NEAR 056F CODE GP_NOPARAM . . . . . . . . . . . L NEAR 056B CODE GP_RET . . . . . . . . . . . . . L NEAR 056D CODE INPUT. . . . . . . . . . . . . . N PROC 03D9 CODE Length =0054 INPUT_BYTE . . . . . . . . . . . L NEAR 03F6 CODE INPUT_DONE . . . . . . . . . . . L NEAR 041D CODE INPUT_ERR. . . . . . . . . . . . L NEAR 041F CODE INTID. . . . . . . . . . . . . . Number 0006 INTPENDING . . . . . . . . . . . Number 0001 JUMP . . . . . . . . . . . . . . N PROC 04EF CODE Length =0036 JUMP_DONE. . . . . . . . . . . . L NEAR 0515 CODE JUMP_ERR . . . . . . . . . . . . L NEAR 0517 CODE J_1. . . . . . . . . . . . . . . L NEAR 0502 CODE KILL . . . . . . . . . . . . . . Number 0018 LCRVAL . . . . . . . . . . . . . Number 0007 LF . . . . . . . . . . . . . . . Number 000A LMCS . . . . . . . . . . . . . . Number FFA2 LMCSVAL. . . . . . . . . . . . . Number 3FF8 LONG_JUMP. . . . . . . . . . . . F PROC 0525 CODE Length =0009 LOOPCNTRL. . . . . . . . . . . . Number 0010 MAIN . . . . . . . . . . . . . . L NEAR 0078 CODE MCRVAL . . . . . . . . . . . . . Number 000F MDMSTATINTEN . . . . . . . . . . Number 0010 MMCS . . . . . . . . . . . . . . Number FFA6 MMCSVAL. . . . . . . . . . . . . Number 41F8 MOVE . . . . . . . . . . . . . . N PROC 042D CODE Length =0090 MOVE_01. . . . . . . . . . . . . L NEAR 0440 CODE MOVE_02. . . . . . . . . . . . . L NEAR 0447 CODE MOVE_03. . . . . . . . . . . . . L NEAR 045B CODE MOVE_1 . . . . . . . . . . . . . L NEAR 0462 CODE MOVE_2 . . . . . . . . . . . . . L NEAR 0475 CODE MOVE_3 . . . . . . . . . . . . . L NEAR 047C CODE MOVE_4 . . . . . . . . . . . . . L NEAR 0483 CODE MOVE_DONE. . . . . . . . . . . . L NEAR 04BB CODE MOVE_ERR . . . . . . . . . . . . L NEAR 04AF CODE MPCS . . . . . . . . . . . . . . Number FFA8 MPCSVAL. . . . . . . . . . . . . Number A0BF NEWLINE. . . . . . . . . . . . . L BYTE 0031 DATA OUT1 . . . . . . . . . . . . . . Number 0004 OUT2 . . . . . . . . . . . . . . Number 0008 OUTPUT . . . . . . . . . . . . . N PROC 04BD CODE Length =0032 OUTPUT_DONE. . . . . . . . . . . L NEAR 04DF CODE OUTPUT_ERR . . . . . . . . . . . L NEAR 04E1 CODE OVERRUNERR . . . . . . . . . . . Number 0002 PACS . . . . . . . . . . . . . . Number FFA4 PACSVAL. . . . . . . . . . . . . Number 003F  The Microsoft MACRO Assembler 06-05-84 PAGE Symbols-4 MORROW 80188 Slave Debugger PARITYERR. . . . . . . . . . . . Number 0004 PH_ISDIGIT . . . . . . . . . . . L NEAR 0601 CODE PH_PRINTIT . . . . . . . . . . . L NEAR 0603 CODE PROMPT . . . . . . . . . . . . . L BYTE 0034 DATA PRSTR. . . . . . . . . . . . . . N PROC 062A CODE Length =0013 PRSTR1 . . . . . . . . . . . . . L NEAR 062E CODE PRSTRING . . . . . . . . . . . . Number 0009 PRSTR_DONE . . . . . . . . . . . L NEAR 063A CODE PR_2HEX. . . . . . . . . . . . . N PROC 05E0 CODE Length =0015 PR_4HEX. . . . . . . . . . . . . N PROC 05D5 CODE Length =000B PR_ADDR. . . . . . . . . . . . . N PROC 05C3 CODE Length =0012 PR_HEX . . . . . . . . . . . . . N PROC 05F5 CODE Length =0013 PUTC . . . . . . . . . . . . . . N PROC 0619 CODE Length =0011 PUTC_WRDY. . . . . . . . . . . . L NEAR 061E CODE QUIT . . . . . . . . . . . . . . N PROC 052E CODE Length =0002 RCVINTEN . . . . . . . . . . . . Number 0001 RCVLINEINTEN . . . . . . . . . . Number 0004 RI . . . . . . . . . . . . . . . Number 0040 RLSD . . . . . . . . . . . . . . Number 0080 RTS. . . . . . . . . . . . . . . Number 0002 SEGSTORE . . . . . . . . . . . . L WORD 0123 DATA SETBREAK . . . . . . . . . . . . Number 0040 SIGNON . . . . . . . . . . . . . L BYTE 0000 DATA SPACE. . . . . . . . . . . . . . Number 0020 SPACE_2. . . . . . . . . . . . . L BYTE 0054 DATA SPACE_3. . . . . . . . . . . . . L BYTE 0057 DATA SPACE_4. . . . . . . . . . . . . L BYTE 005B DATA SRC_SEG. . . . . . . . . . . . . Number 0000 SYNTAX . . . . . . . . . . . . . L BYTE 0064 DATA SYNTAX_MES . . . . . . . . . . . L BYTE 004C DATA S_DUMP . . . . . . . . . . . . . L BYTE 0064 DATA S_ENTER. . . . . . . . . . . . . L BYTE 0085 DATA S_FILL . . . . . . . . . . . . . L BYTE 0093 DATA S_INPUT. . . . . . . . . . . . . L BYTE 00BC DATA S_JUMP . . . . . . . . . . . . . L BYTE 00FA DATA S_MOVE . . . . . . . . . . . . . L BYTE 00C7 DATA S_OUTPUT . . . . . . . . . . . . L BYTE 00E7 DATA TERI . . . . . . . . . . . . . . Number 0004 THRE . . . . . . . . . . . . . . Number 0020 TSRE . . . . . . . . . . . . . . Number 0040 UARTDATA . . . . . . . . . . . . Number 0000 UARTDIVISORHI. . . . . . . . . . Number 0001 UARTDIVISORLOW . . . . . . . . . Number 0000 UARTINTEN. . . . . . . . . . . . Number 0001 UARTINTIDENT . . . . . . . . . . Number 0002 UARTLINECNTRL. . . . . . . . . . Number 0003 UARTLINESTATUS . . . . . . . . . Number 0005 UARTMDMCNTRL . . . . . . . . . . Number 0004 UARTMDMSTATUS. . . . . . . . . . Number 0006 UART_BASE. . . . . . . . . . . . Number 0000 UMCS . . . . . . . . . . . . . . Number FFA0 UMCSVAL. . . . . . . . . . . . . Number FF38 XMITINTEN. . . . . . . . . . . . Number 0002 Warning Severe Errors Errors 3 0  The Microsoft MACRO Assembler 06-05-84 PAGE Symbols-5 MORROW 80188 Slave Debugger