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