include stdlib.a includelib stdlib.lib cseg segment byte public 'CODE' assume cs:cseg, ds:dseg, es:dseg, ss:sseg ; Note CR and LF are already defined in STDLIB.A tab equ 09h MainPgm proc far ; Properly set up the segment registers: mov ax, seg dseg mov es, ax ;Leave DS pointing at PSP ;--------------------------------------------------------------- ; ; First, parse the command line to get the filename: mov si, 81h ;Pointer to command line lea di, FileName ;Pointer to FileName buffer SkipDelimiters: lodsb ;Get next character call TestDelimiter je SkipDelimiters ; Assume that what follows is an actual filename dec si ;Point at 1st char of name GetFName: lodsb cmp al, 0dh je GotName call TestDelimiter je GotName stosb ;Save character in file name jmp GetFName ; We're at the end of the filename, so zero-terminate it as ; required by DOS. GotName: mov byte ptr es:[di], 0 mov ax, es ;Point DS at DSEG mov ds, ax ; Now process the file mov ah, 3dh mov al, 0 ;Open file for reading lea dx, Filename ;File to open int 21h jnc GoodOpen print byte 'Cannot open file, aborting program...',cr,0 jmp PgmExit GoodOpen: mov FileHandle, ax ;Save file handle mov Position, 0 ;Initialize file position ReadFileLp: mov al, byte ptr Position and al, 0Fh ;Compute (Position MOD 16) jnz NotNewLn ;Every 16 bytes start a line putcr mov ax, Position ;Print offset into file xchg al, ah puth xchg al, ah puth print byte ': ',0 NotNewLn: inc Position ;Increment character count mov bx, FileHandle mov cx, 1 ;Read one byte lea dx, buffer ;Place to store that byte mov ah, 3Fh ;Read operation int 21h jc BadRead cmp ax, 1 ;Reached EOF? jnz AtEOF mov al, Buffer ;Get the character read and puth ; print it in hex mov al, ' ' ;Print a space between values putc jmp ReadFileLp BadRead: print byte cr, lf byte 'Error reading data from file, aborting.' byte cr,lf,0 AtEOF: mov bx, FileHandle ;Close the file mov ah, 3Eh int 21h ;--------------------------------------------------------------- PgmExit: ExitPgm MainPgm endp TestDelimiter proc near cmp al, ' ' je xit cmp al, ',' je xit cmp al, Tab je xit cmp al, ';' je xit cmp al, '=' xit: ret TestDelimiter endp cseg ends dseg segment byte public 'data' PSP word ? Filename byte 64 dup (0) ;Filename to dump FileHandle word ? Buffer byte ? Position word 0 dseg ends sseg segment byte stack 'stack' stk word 0ffh dup (?) sseg ends zzzzzzseg segment para public 'zzzzzz' LastBytes byte 16 dup (?) zzzzzzseg ends end MainPgm
include stdlib.a includelib stdlib.lib cseg segment byte public 'CODE' assume cs:cseg, ds:dseg, es:dseg, ss:sseg MainPgm proc far ; Properly set up the segment registers: mov ax, seg dseg mov ds, ax mov es, ax ;---------------------------------------------------------------- ; ; Convert UCCONVRT.ASM to uppercase ; ; Open input file: mov ah, 3dh mov al, 0 ;Open file for reading lea dx, Filename ;File to open int 21h jnc GoodOpen print byte 'Cannot open file, aborting program...',cr,lf,0 jmp PgmExit GoodOpen: mov FileHandle1, ax ;Save input file handle ; Open output file: mov ah, 3Ch ;Create file call mov cx, 0 ;Normal file attributes lea dx, OutFileName ;File to open int 21h jnc GoodOpen2 print byte 'Cannot open output file, aborting program...' byte cr,lf,0 mov ah, 3eh ;Close input file mov bx, FileHandle1 int 21h jmp PgmExit ;Ignore any error. GoodOpen2: mov FileHandle2, ax ;Save output file handle ReadFileLp: mov bx, FileHandle1 mov cx, 1 ;Read one byte lea dx, buffer ;Place to store that byte mov ah, 3Fh ;Read operation int 21h jc BadRead cmp ax, 1 ;Reached EOF? jz ReadOK jmp AtEOF ReadOK: mov al, Buffer ;Get the character read and cmp al, 'a' ; convert it to upper case jb NotLower cmp al, 'z' ja NotLower and al, 5fh ;Set Bit #5 to zero. NotLower: mov Buffer, al ; Now write the data to the output file mov bx, FileHandle2 mov cx, 1 ;Read one byte lea dx, buffer ;Place to store that byte mov ah, 40h ;Write operation int 21h jc BadWrite cmp ax, 1 ;Make sure disk isn't full jz ReadFileLp BadWrite: print byte cr, lf byte 'Error writing data to file, aborting operation' byte cr,lf,0 jmp short AtEOF BadRead: print byte cr, lf byte 'Error reading data from file, aborting ' byte 'operation',cr,lf,0 AtEOF: mov bx, FileHandle1 ;Close the file mov ah, 3Eh int 21h mov bx, FileHandle2 mov ah, 3eh int 21h ;---------------------------------------------------------------- PgmExit: ExitPgm MainPgm endp cseg ends dseg segment byte public 'data' Filename byte 'ucconvrt.asm',0 ;Filename to convert OutFileName byte 'output.txt',0 ;Output filename FileHandle1 word ? FileHandle2 word ? Buffer byte ? Position word 0 dseg ends sseg segment byte stack 'stack' stk word 0ffh dup (?) sseg ends zzzzzzseg segment para public 'zzzzzz' LastBytes byte 16 dup (?) zzzzzzseg ends end MainPgm