283 lines
12 KiB
NASM
283 lines
12 KiB
NASM
kbd equ 16h ;keyboard irq
|
||
msdos equ 21h ;MSDOS irq
|
||
|
||
reset equ 0dh ;disk reset
|
||
dfopen equ 0fh ;open disk file
|
||
dfclose equ 10h ;close disk file
|
||
searchf equ 11h ;search first
|
||
searchn equ 12h ;search next
|
||
seqread equ 14h ;sequential disk read
|
||
seqwrite equ 15h ; " " write
|
||
setdta equ 1ah ;set disk transfer area address
|
||
createf equ 3ch ;create file with handle
|
||
openf equ 3dh ;open file with handle
|
||
closef equ 3eh ;close file with handle
|
||
readf equ 3fh ;read from file with handle
|
||
writef equ 40h ;write to file with handle
|
||
setfp equ 42h ;set file pointer
|
||
allocmem equ 48h ;allocate memory
|
||
freemem equ 49h ;free memory
|
||
changebs equ 4ah ;change block size
|
||
findfirst equ 4eh ;find first file
|
||
exit equ 4c00h ;msdos exit
|
||
|
||
[BITS 16] ;NASM stuff
|
||
[ORG 0x100]
|
||
|
||
s1:
|
||
mov ax,cs ;get code segment
|
||
mov ds,ax ;use it now
|
||
mov [comseg],ds ;save it there
|
||
|
||
mov si,0080h ;DOS command line page 0
|
||
lodsb ;load size of command line
|
||
cmp al,0 ;anything on command line ?
|
||
jbe usage ;noo, show usage
|
||
cbw ;extend AL to AX
|
||
xchg bx,ax ;swap size to bx for indexing
|
||
mov byte [bx+si],0 ;null terminate command line
|
||
call parse ;parse command line
|
||
jmp main ;go on with main
|
||
usage: mov bx,utext ;pointer usage text
|
||
jmp errout ;skip this
|
||
main:
|
||
mov si,inbuff ;check for valid HEX input
|
||
mov bx,errt1 ;proper text
|
||
ishex: lodsb ;get the char
|
||
cmp al,'0'
|
||
jb errout
|
||
and al,0dfh ;force UPPERCASE
|
||
cmp al,'F' ;>F ?
|
||
ja errout ;yeahh, dump this
|
||
loop ishex
|
||
call hexbin ;make hex bin
|
||
;start address now in EDX
|
||
mov ax,dx ;get low word (segment)
|
||
mov es,ax ;start segment
|
||
shr edx,16 ;shift in offset
|
||
mov di,dx ;start offset
|
||
dopage:
|
||
push es ;save registers
|
||
push di
|
||
push ds
|
||
push si
|
||
mov ax,es
|
||
mov ds,ax ;make ds=es
|
||
mov si,di ;and si=di
|
||
|
||
call showpage ;show it
|
||
|
||
pop si ;restore registers
|
||
pop ds
|
||
pop di
|
||
pop es
|
||
add di,512 ;adjust memory position
|
||
|
||
;xor ah,ah ;wait for ANY key
|
||
;int kbd
|
||
|
||
mov bx,text ;show message
|
||
call write
|
||
mov ah,0 ;wanna see next screen ?
|
||
int kbd ;chek out keyboard buffer
|
||
and al,0DFh ;force UPPER CASE
|
||
cmp al,"Q" ;wanna quit ?
|
||
je quit ;yeahh
|
||
jmp dopage
|
||
errout:
|
||
call write
|
||
quit:
|
||
mov ax,exit
|
||
int msdos
|
||
|
||
;***********************************************************
|
||
;* Convert ascii hex to 32 bit binary
|
||
;* Input = command line buffer, output EDX
|
||
;***********************************************************
|
||
hexbin:
|
||
mov si,inbuff ;pointer command line buffer
|
||
xor edx,edx ;clear binary output
|
||
aschexbin:
|
||
lodsb
|
||
cmp al,'0' ;< 0
|
||
jb notasc ;yes invalid character
|
||
cmp al,'9' ;<= 9
|
||
jbe astrip ;yes, strip high 4 bits
|
||
and al,05fh ;force upper case
|
||
cmp al,'A' ;< ascii A
|
||
jb notasc ;yes, invalid character
|
||
cmp al,'F' ;> ascii F
|
||
ja notasc ;yes, invalid character
|
||
add al,9 ;ok, add 9 for strip
|
||
astrip:
|
||
and al,0fh ;strip high 4 bits
|
||
mov cx,4 ;set shift count
|
||
shl edx,cl ;rotate EDX 4 bits
|
||
xor ah,ah ;zero out AH
|
||
cbw
|
||
add edx,eax ;add digit to value
|
||
jmp aschexbin ;continue
|
||
notasc: ret
|
||
|
||
;*********************************************************************
|
||
;* Format and show the stuff in a "sector"
|
||
;* Input SI
|
||
;*********************************************************************
|
||
showpage:
|
||
mov cx,32 ;32*16=512
|
||
arow: push cx
|
||
mov di,outline ;output buffer
|
||
mov cx,16 ;process 16 bytes
|
||
hexrow: push cx
|
||
lodsb ;load al with byte
|
||
mov dl,al ;get value
|
||
mov cx,2 ;2 nibbles
|
||
chexb: push cx ;save that
|
||
mov cl,4 ;4 bits
|
||
rol dl,cl ;rotate source left
|
||
mov al,dl ;move digit into AL
|
||
and al,15 ;clear high nibble
|
||
daa ;adjust AL if A through F
|
||
add al,240 ;bump the carry
|
||
adc al,40h ;convert HEX to ASCII
|
||
stosb ;copy to buffer
|
||
pop cx ;get digit counter
|
||
loop chexb ;next digit
|
||
mov al,32 ;copy a SPACE
|
||
stosb
|
||
pop cx ;restore loop counter
|
||
loop hexrow ;loop on
|
||
mov al,32 ;copy 2 spaces
|
||
stosb
|
||
stosb
|
||
sub si,16 ;adjust source back
|
||
mov cx,16 ;copy ASCII bytes
|
||
cccp: lodsb
|
||
cmp al,32 ;< SPACE ?
|
||
jb noa ;yeahh, skip it
|
||
stosb ;no, store in buffer
|
||
jmp next
|
||
noa: mov al,'.'
|
||
stosb
|
||
next loop cccp
|
||
mov al,13
|
||
stosb
|
||
mov al,10
|
||
stosb
|
||
mov al,0 ;null terminate line
|
||
stosb
|
||
mov bx,outline ;show the line
|
||
call write
|
||
pop cx
|
||
cmp cx,17
|
||
jne nopause
|
||
push ds
|
||
mov ax,cs
|
||
mov ds,ax
|
||
mov bx,text1
|
||
call write
|
||
pop ds
|
||
xor ah,ah
|
||
int kbd
|
||
nopause:
|
||
loop arow ;next 16 bytes
|
||
ret
|
||
|
||
;************************************************************************'
|
||
;* Convert bin WORD to HEX ascii. Input DX. Result in Numbuff *
|
||
;************************************************************************
|
||
binhex: pusha
|
||
mov di,numbuff ;destination buffer
|
||
mov dx,[count] ;binary number
|
||
mov cx,4 ;four nibbles
|
||
convhex:
|
||
push cx ;save counter
|
||
mov cl, 4 ;4 bits
|
||
rol dx, cl ;rotate source left
|
||
mov al, dl ;move digit into AL
|
||
and al, 15 ;clear high nibble
|
||
daa ;adjust AL if A through F
|
||
add al, 240 ;bump the carry
|
||
adc al, 40h ;convert HEX to ASCII
|
||
stosb ;copy to buffer
|
||
pop cx ;get digit counter
|
||
loop convhex ;next digit
|
||
mov al,32 ;copy a space
|
||
stosb
|
||
mov al,0 ;null terminate
|
||
stosb
|
||
popa
|
||
ret
|
||
|
||
;*************************************************************************
|
||
;* Writes out the NULL terminated text supplied in BX. *
|
||
;* OR writes out data,BX and size,CX if called at lwrite. *
|
||
;*************************************************************************
|
||
write: pusha
|
||
mov si,bx ;copy to SI
|
||
mov cx,0 ;clear count
|
||
wloop: lodsb ;load AL with SI
|
||
cmp al,0 ;end of line ?
|
||
je lwrite ;yeahh
|
||
inc cx ;no, incrase byte count
|
||
jmp wloop ;test next byte
|
||
lwrite: mov dx,bx ;text address in DX
|
||
mov bx,1 ;filehandle standard output = 1
|
||
mov ah,writef ;MS-DOS writefile with handle is 040
|
||
int msdos ;write buffer to standard output
|
||
popa
|
||
ret ;done
|
||
|
||
;*************************************************************************
|
||
;* My kind of command line parsing. It just checks if there<72>s
|
||
;* any blankspaces between the options. The parameters ends up
|
||
;* in the inbuff separated by 0:s, binary zeroes.
|
||
;*************************************************************************
|
||
parse:
|
||
mov di,inbuff ;our buffer
|
||
ifspc: cmp byte [si],32 ;leading space ?
|
||
jne nospc ;noo
|
||
inc si ;yeahh, dump that
|
||
jmp ifspc ;check next
|
||
nospc: mov cx,1 ;were here, so we got one arg
|
||
copy1: lodsb ;load byte SI to AL
|
||
cmp al,0 ;0 ?(end of line)
|
||
je done ;yeahh
|
||
cmp al,32 ;SPACE ?
|
||
je cop2 ;yeah
|
||
stosb ;noo, move AL to DI, incrase DI
|
||
jmp copy1 ;go on
|
||
cop2: mov byte [di],0 ;null terminate
|
||
add cx,1
|
||
inc di ;dump that byte(SPACE)
|
||
jmp copy1 ;back
|
||
done: mov byte [di],0 ;null terminate
|
||
ret ;return
|
||
|
||
|
||
;*************************** DATA STUFF **********************************
|
||
|
||
XMS_SEGMENT dw 0
|
||
XMS_OFFSET dw 0
|
||
|
||
inbuff times 64 dw 0 ;128 byte command line buffer
|
||
outline times 40 dw 0 ;buffer output line
|
||
numbuff times 7 dw 0 ;word ascii number buffer
|
||
comseg dw 0
|
||
count dw 0
|
||
bcount dw 0
|
||
acount dw 0
|
||
|
||
;outbuff times 512 db 0
|
||
|
||
|
||
utext db 'WWW',13,10
|
||
db 'Usage: Showmem [start address].',13,10
|
||
db 'Start address = Hexadecimal.',13,10,0
|
||
text: db 13,10,'Q = Quit. Any key = Next page.',13,10,0
|
||
text1: db 13,10,'Any Key = Next 256 Bytes.',13,10,0
|
||
errt1: db 'That address is not hexadecimal.',13,10,0
|
||
|
||
s2:
|
||
|
||
END |