Розробка програми призначеної для перегляду текстових файлів різного розміру

Міністерство освіти та науки України

Кіровоградський Державний Технічний університет

Кафедра програмного забезпечення











Курсова робота

з дисципліни “Програмування на мові ASM-86” на тему:



Розробка програми, призначеної для перегляду текстових файлів різного розміру


Зміст



1 Вступ

2 Призначення та область застосування програми

3 Огляд існуючих програм

4 Опис і обґрунтування проектних рішень системи

5 Інструкція користувача

Основні висновки

Список літератури

Текст програми


1. Вступ



Інформація – цінна річ, тому для її збереження в сучасному суспільстві використовують все частіше персональний комп‘ютер. При перегляді текстових файлів виникає потреба в зручних в користуванні та розумінні програм переглядачів текстових файлів. Переді мною була поставлена задача розробити таку програму з мінімальним набором елементарних функцій для роботи з текстом. 


2. Призначення та область застосування програми



Дана програма призначена для перегляду текстових файлів різного розміру. Програма може бути використана будь яким користувачем ЕОМ для перегляду потрібної інформації.



3. Огляд існуючих програм



Зараз існує безліч програм для перегляду текстових файлів. Аналогом даної є такі програми як wiev, wpwiev та інші.



4. Опис і обґрунтування проектних рішень системи



Дана програма написана на мові асемблера з використанням переривань для роботи з файлами та текстом. Вона працює на будь якій машині де є DOS або WINDOWS. При написанні програми для реалізації прокрутки екрану вверх та вниз використовується читання тексту порціями. В програмі реалізовані такі можливості як прокрутка вверх та вниз по рядкові та сторінку цілком, коротка допомога , пошук слова та інші потрібні речі. Так як програма використовує пряме читання файлів на диску то при використанні WINDOWS NT треба бути уважним при перегляді файлів і мати дозвіл но перегляд.



5. Інструкція користувача



Для запуску програми потрібно набрати в командному рядку ім‘я запускного файлу та замість параметра ім‘я файлу для перегляду. Але якщо програма запущена без параметра то вона запросить ввести ім‘я. Після чого появиться екран з відкритим файлом. В низу екрану постійно видно підказку. Для виклику допомоги досить нотиснути клавішу ? або F1 або Alt-H. Щоб вийти з програми потрібно натиснути Alt- Q.




Основні висновки



При постійній роботі з комп‘ютером досить часто потрібно переглянути файл. Тому дана програма є незамінною в роботі. Вона є простою в користуванні та розумінні. Працює майже на всіх машинах без особливої потреби в ресурсах.




Список літератури



1. Финогенов К.Г. Самоучитель по системным функциям MS-DOS.- М.: Радио и связь, Энтроп, 1995. - 382с.

2. Джордейн Р. Справочник программиста персональных компьютеров типа IBM PC, XT, и AT: Пер. с англ. - Финансы и статистика, 1992.- 544 с.

3. Касаткин А.И. Профессиональное программирование на языке Си. Управление ресурсами: Справочное пособие.- Минск: Выш.шк., 1992. - 432 с.

4. Касаткин А.И. Профессиональное программирование на языке Си. Системное программирование. - Минск: Выш.шк., 1993. - 301 с.

5. Электронный справочник! Драйвер Help фирмы Flambeaux Software версия 1.2. Адаптировал С.М.Абель.

6. The Norton Guides, Copyright © 1987 by Peter Norton Computing - Assembly language, Прерывания.




Текст програми



Bios Segment At 40h

Db	16 Dup (?)

Flag Dw ?

Db	56 Dup (?)

Cols Dw ?

Db	23 Dup (?)

A6845 Dw ?

Bios	Ends

Cseg Segment Para Public 'CODE'

Assume	CS:Cseg,DS:Cseg,ES:Nothing

Org	100h

List Proc Near

Jmp	Start

; Необходимые данные и рабачие области

Special Db 1eh ;Байты

Normal Db 02h ;

Foregrd Db 07h ;

Blink Equ 0Fh ;атрибутов

CR	Equ	0Dh

LF	Equ	0Ah

EOF	Equ	1Ah

Eor Equ 1

Nodata Equ 2

Crt_Col Dw 0

Crt_Buf Dw 0

Crt_Prt Dw 0

Index Dw 0

Reclen Dw 0

Row Db 2

Col Db 1

Attr Db 02h

Blknum Db 0

Scroll Dw 0

First Dw 0

Current Dw 0

Last Dw 0

Recaddr Dw 0

Handle Dw 0

Psize Dw 16

Blksize Dw 0

Switch1 Db	0

Switch2 Db	0

Numlf Db 1

Numcr Db 0

char_msk db 0ffh

min_disp db 0

TextMax Db 32

TextLen Db	0

TextBuf Db 32 Dup (0)

Prompt Db 'Command:'

Spaces Db 32 Dup (32)

Db 'Keys: PgUp PgDn Arrows ESC=exit ?=Help '

Pr_Len	Equ	This Byte - Prompt

TextMsg Db '*** Текст не найден ***'

EofMsg Db ' *** Конец файла ***'

EofLen	Equ	This Byte - EofMsg

Work Db 'LIST '

Keyin Db 64

Keyout Db 0

Filenm Db 76 Dup (0)

Askfile Db 13,10,'Введите имя файла: $'

Openmsg Db ' Open failed, return code='

Opencod Dw '00'

Db '$'

Code2 Db 'File not found $'

Code3 Db 'Path not found $'

Code4 Db 'Too many files $'

Code5 Db 'Access denied $'

Org	offset Work+256

Workx	Equ	$-Work

What1 Db 13,32,27,81 ;Cr,Sp,Esc,Q

Db	68,85,63,72	;D,U,?,H

Db	47,82,76,84	;/,R,L,T

Db	80,65,78,88	;P,A,N,X

Db	66		;B

Num1 Equ $-What1

What2	Db	77,75,73,81	;->,<-,PgUp,PgDn

Db	71,72,61,80	;HOME,^,F3,v

Db	59,68,79,119	;F1,F10,END,^HOME

Db	115,132,118	;^<-,^PgUp,^PgDn

db 46,31

Num2 Db $-What2

Where1	Dw	Offset NxtPage,Offset NxtPage,Offset Close, Offset Close

Dw	Offset NxtPage,Offset Back, Offset Got_H, Offset Got_H

Dw	Offset Got_S, Offset Right, Offset Left, Offset Top

Dw	Offset Up1, Offset Got_Rs, Offset Down1, Offset Close

Dw	Offset Bottom

Where2	Dw	Offset Right, Offset Left, Offset Back, Offset NxtPage

Dw	Offset Top, Offset Up1, Offset Got_Rs,Offset Down1

Dw	Offset Got_H, Offset Close, Offset Bottom,Offset Home

Dw	Offset Scroll0,Offset Top, Offset Bottom

dw offset ctrl, offset strip

HelpMsg Db CR,9,'Просмотрщик файлов V 1.0 '

Db	CR,LF

Db CR,LF,9,'Commands and keys:'

Db	CR,LF

Db CR,LF,9,'_-- or Space ',9,9,'continue to next page'

Db CR,LF,9,'ESC, Q, X or F10',9,' terminate'

Db CR,LF,9,'HOME, T or Ctl PgUp',9,' restart from Top of file'

Db CR,LF,9,'END, B or Ctl PgDn',9,' skip to Bottom of file'

Db CR,LF,9,'Ctl Home ',9,9,' restart from top of block'

Db CR,LF,9,'PgDn or D ',9,9,' scroll Down one page'

Db CR,LF,9,'PgUp or U ',9,9,' scroll Up one page'

Db CR,LF,9,'H, ? or F1 ',9,9,' list Help for keys'

Db CR,LF,9,'_- or L ',9,9,'scroll Left 20 columns'

Db CR,LF,9,'-_ or R ',9,9,'scroll Right 20 columns'

Db CR,LF,9,'Ctl _- ',9,9,'reset scroll to column 1'

Db CR,LF,9,'_ or P ',9,9,'Previous, up one line'

Db CR,LF,9,'_ or N ',9,9,'Next, down one line'

Db CR,LF,9,'/text ',9,9,' find text'

Db CR,LF,9,'A or F3 ',9,9,' find text Again'

db CR,LF,9,"ALT S ",9,9," do/don't Strip parity bit"

db	 " (toggle)"

db CR,LF,9,"ALT C ",9,9," do/don't display Control "

db	 " chars"

db	 " (toggle)"

Db '$'

Start: Mov BX,PgmSize

Mov AH,4Ah ;Модифицируем память

Int 21h ;

Call GetParm

Openit: Call	Open

Jz	Init

Ret

Close: Mov BX,Handle

Mov AH,3Eh ;Закрываем файл

Int	21h

Mov AX,0600h ;Очищаем экран

Sub	BL,BL

Mov	BH,Foregrd

Sub CX,CX

Mov DX,184Fh

Int	10h

Ret ;Возвращаемся в DOS

; Выделяем память для буфера файла

Init: Mov BX,1000h

GetMem: Mov AH,48h

Int	21h

Jc GetMem

Mov RecAddr,AX

Mov AX,BX

Sub AX,32

Mul Psize

Mov Blksize,AX

Call InitCrt

Call Set1

Call Set25

Read1: Call ReadBlk ;Загружаем следующий блок

Mov	BL,Normal

Mov	Attr,BL

Jnz	Read2

Jmp	AtEnd

Read2: Dec Row

Cmp Numlf,0

Je GetNext

Inc Row

Mov Col,1

GetNext:

Mov AX,Index ;Есть запись в буфере?

Cmp	AX,Last

Jb	GotNext

Jmp	AtEnd

GotNext:

Call ListOne ;Выводим следующую запись

Mov	CX,Reclen

Add Col,CL

Mov	DH,Row

Cmp DH,25

Jne TestEor

Cmp NumLF,0

Jne KeyRead

TEstEor:Jmp Read2 ;Конец записей?

KeyRead: Mov AH,0 ;Ждем нажатия клавиши

Int	16h

Mov SI,Offset Spaces ;Очищаем строку 25

Call	Msg25

; Обработка нажатой клавиши

Cmp AL,27 ; ESC выход

Jne	Chk00

Jmp	Close

Chk00: Cmp AL,0 ;Управляющий символ?

Jne Chk_97 ; нет, буква

Xchg AL,AH ; да, считываем расширенный код

Mov	DI,Offset What2

Mov	BP,Offset Where2

Mov	CL,Num2

Jmp	Short Control

Chk_97: Cmp AL,97 ;Нижний регистр?

Jl	Upper

Sub AL,32 ;да, преобразуем в верхний

Upper: Mov DI,Offset What1

Mov BP,Offset Where1

Mov CL,Num1

Control:Mov SI,DI ;Ищем букву/код

Mov CH,0 ;в таблице

Push	DS

Pop	ES

Repnz	Scasb

Jne KeyRead

Dec DI

Sub DI,SI

Shl DI,1

Mov	BX,Word Ptr DS:[DI][BP]

Jmp BX ;Переходим на обработку нажатой

;клавиши

Right: Cmp Scroll,220 ;key right

Jb	Got77

Jmp KeyRead

Got77:	Add	Scroll,20

Jmp	BackUp

Scroll0:Mov Scroll,0 ;key ctrl-left

Jmp	BackUp

Left: Cmp Scroll,0 ;key left

Jne	Got75

Jmp KeyRead

Got75:	Sub	Scroll,20

Jmp	BackUp

Got_Rs: Call ReScan ;F3

Jmp	NxtPage

Got_H: Call Help ;key F1

Call	Back1

Jmp KeyRead

strip: xor char_msk,080h ; выводить/игнор русские символы

call Back1

jmp NxtPage

ctrl: xor min_disp,020h ; выводить/игнор символы 0-31

call Back1

jmp NxtPage

Got_S: Call Scan ;Поиск текста

Jmp	NxtPage

NxtPage: ;key (nextpage)

Mov	AX,Index

Cmp AX,Last ;end of file?

Jae	BWait

Mov	Current,AX

Mov DH,2

Mov	Row,DH

Call Clear

Jmp	TestEor

Up1: Cmp First,0 ; Уже в начале?

Jne Up12 ; нет, scroll up one line

Bwait: Jmp AtEnd ; да, пропускаем

Up12: Call Scroll_Up

Mov AX,Index

Mov Current,AX

Mov	AX,First

Mov	Index,AX

Call	UpOne

Mov	Row,2

Mov	Col,1

Call	ListOne

Mov	AX,Current

Mov	Index,AX

Call	UpOne

Jmp KeyRead

Home: Mov Index,0

Jmp	NxtPage

AtEnd: Mov SI,Offset EofMsg ;Выводим сообщение 'End-of-file'

Call	Msg25

Jmp KeyRead

Bottom: Mov AX,Last ;Позиция на последнюю запись

Mov	Index,AX

Jmp	BackUp

Top: Sub CX,CX ;В самое начало файла

Mov AL,0

Sub	DX,DX

Mov AH,42h

Mov	BX,Handle

Int	21h

Call	Clear

Mov	Row,2

Mov	Col,1

Mov	First,0

Mov	Blknum,0

Jmp	Read1

Back: Call Back1

BackUp: Call Back1

Jmp	Nxtpage

Down1: Mov AX,Index ;scroll down one line

Cmp AX,Last ;Конец файла?

Jb	Down2

Jmp	AtEnd

Down2:	Mov	Current,AX

Mov	AX,First

Mov	Index,AX

Call GetRec

Mov	AX,Index

Down3: Call Scroll_Dn

Mov	AX,Index

Mov	First,AX

Mov	AX,Current

Mov	Index,AX

Mov	Row,24

Mov	Col,1

Jmp	GetNext

; Scroll Up one page

Back1 Proc Near

Mov CX,23

Back0:	Call	UpOne

Loop	Back0

Mov	Col,1

Ret

Back1	Endp

; Scroll up one line

UpOne Proc Near

Push	CX

Mov	CX,2

Cmp Index,0 ;Уже на верху?

Je Up1d ; да, не изменяем

Up1a: Mov ES,Recaddr

Up1b: Mov DI,Index

Cmp ES:Byte Ptr[DI],LF

Je	Up1c

Dec	Index

Jnz Up1b

Up1e: Mov Index,0

Jmp	Up1d

Up1c: Dec Index

Jz	Up1d

Loop	Up1b

Inc Index

Up1d:	Pop	CX

Ret

UpOne	Endp

; Помещает записи в буфер экрана

Assume CS:Cseg,DS:Cseg,ES:Nothing

Show Proc Near

Push	AX

Push	BX

Push CX

Push DX

Push	DI

Push	ES

Push SI

Sub	AX,AX

Mov AL,DH

Sub	DH,DH

Mov DI,DX

Dec DI

Dec	AX

Cmp CX,0

Jng	Dsp9

Cmp CX,80

Jbe Dsp1

Mov	CX,80

Dsp1: Mul Crt_Col

Add DI,AX

Shl DI,1

Mov DX,Crt_Prt

Mov ES,Crt_Buf

Mov BH,Attr

Dsp2: Lodsb

dsp2a: Cmp AL,min_disp

Jae Dsp3

Jmp Dsp4

Dsp3: Mov BL,AL

Call	Displa

Dsp4:	Loop	Dsp2

Dsp9:	Pop	SI

Pop	ES

Pop	DI

Pop	DX

Pop	CX

Pop	BX

Pop	AX

Ret

Displa: In AL,DX

Test AL,1

Jnz Displa

Cli

Disphi: In AL,DX

Test AL,1

Jz Disphi

Mov AX,BX

Stosw

Sti

Ret

Show Endp

; Показывает следующую запись

ListOne Proc Near

Cmp	Row,2

Jne	List1

Mov	AX,Index

Mov First,AX

List1: Call GetRec

Mov CX,Reclen

Sub CL,Numlf

Sub CL,Numcr

Mov	Reclen,CX

Or CX,CX

Jz List9

Mov SI,Offset Work

Cmp Row,2

Jae	List2

Mov	Row,2

List2: Mov DH,Row

Mov DL,Col

Add	SI,Scroll

Sub	CX,Scroll

Call Show

List9: Inc Row

Mov BL,Normal

Mov	Attr,BL

Ret

ListOne Endp

; GetRec - извлекает следующую запись

GetRec	Proc	Near

Push	ES

Push	CX

Push	SI

Push	DI

GetR: Test Switch1,Eor

Jz	GetR0

Mov AX,Last

Mov	Index,AX

Call ReadBlk

Jnz	GetR0

Jmp	GetRd

GetR0: Sub DI,DI

Mov Word Ptr NumLF,DI

And	Switch2,0FFh-Nodata

Mov ES,RecAddr

GetR2: Mov SI,Index

Mov AL,ES:[SI]

Cmp AL,Eof

Jne	GetR3

Mov	Reclen,DI

Or Switch1,Eor

Jmp	GetR

GetR3: And AL,char_msk

Cmp AL,09h

Jne	GetR4

Mov CX,DI

Add CX,8

And	CX,0FFF8h

Sub CX,DI

GetR3b: Mov Work[DI],' '

Inc	DI

Loop	GetR3b

Inc Index

Jmp GetR2

GetR4:

Mov Work[DI],AL

Inc DI

Inc Index

Cmp AL,Cr

Jne	GetR5

Inc NumCR

cmp ES:byte ptr[SI+1],LF

je GetR6

mov byte ptr work[di-1],LF

dec NumCR

Inc NumLF

Jmp GetR8

GetR5: Cmp AL,' '

Je	GetR7

Cmp AL,Lf

Jne	GetR6

Inc NumLF

Jmp	GetR8

GetR6: Or Switch2,Nodata

GetR7: Cmp DI,255

Je GetR8

Jmp	GetR2

GetR8:	Mov	Reclen,DI

Cmp Work,0Fh

Jne GetR9

Jmp	GetR0

GetR9: Test Switch2,Nodata

Jnz	GetRd

Jmp GetR0

GetRd:	Pop	DI

Pop	SI

Pop	CX

Pop	ES

Ret

GetRec Endp

; Читает блок из файла

ReadBlk Proc	Near

Mov Switch1,0

Mov BX,Handle

Mov CX,Blksize

Push	DS

Mov DS,RecAddr

Sub DX,DX

Mov	AH,3Fh

Int 21H

Pop	DS

Or AX,AX

Jz ReadB2

Mov Last,AX

Mov	Index,0

Mov	First,0

Mov	Current,0

Inc	Blknum

Mov DI,Last

Mov	ES,RecAddr

Mov	Byte Ptr ES:[DI],1Ah

ReadB2: Ret

Readblk Endp

; Ввод текста после '/'

ReScan	Proc

Push	DI

Push	SI

Push	DS

Pop	ES

Jmp	Scan1

Scan:	Push	DI

Push	SI

Push	DS

Pop	ES

Mov TextMax,32

Mov	DX,Offset TextMax

Mov AH,0Ah

Int	21h

Scan1:	Sub	CX,CX

Or CL,TextLen

Jz NoMatch

Mov AX,First

Mov	Index,AX

Call GetRec

Scan3: Call GetRec

Test Switch1,Eor

Jnz NoMatch

Mov AX,Index

Cmp AX,Last

Jae NoMatch

Mov	CX,RecLen

Sub CL,TextLen

Jle	Scan3

Mov AL,TextBuf

Mov DI,Offset Work

Repnz	Scasb

Jne Scan3

Cmp TextLen,1

Je	Match

Sub	CH,CH

Mov CL,TextLen

Dec	CL

Mov	SI,Offset TextBuf+1

Repe	Cmpsb

Jne	Scan3

Or CX,CX

Jnz Scan3

Match: Call Set25

Mov Attr,Blink

Call	UpOne

Jmp	Scaned

NoMatch:Mov AX,First

Mov Index,AX

Call Set25

Mov SI,Offset TextMsg

Add Special,128

Call	Msg25

Sub	Special,128

Mov	Switch1,0

Mov	Col,1

Scaned: Pop	SI

Pop	DI

Ret

ReScan	Endp

; Очищает экран

Clear Proc Near

Push	AX

Push	BX

Push	CX

Push	DX

Mov	AX,0600h

Mov	BH,Foregrd

Jmp	Scroller

Scroll_Dn:

Push	AX

Push	BX

Push	CX

Push	DX

Mov	AX,0601h

Mov	BH,Foregrd

Jmp	Scroller

Scroll_Up:

Push	AX

Push	BX

Push	CX

Push	DX

Mov	AX,0701h

Mov	BH,Foregrd

Scroller:

Mov CX,0100h

Mov DX,174Fh

Int	10h

Pop	DX

Pop	CX

Pop	BX

Pop	AX

Ret

Clear	Endp

; Выводит строку 0

Set1 Proc Near

Mov AX,0600h

Sub	BL,BL

Mov	BH,Foregrd

Sub CX,CX

Mov DX,184Fh

Int	10h

Mov Word Ptr Work+5,0000h

Mov DH,1

Mov DL,DH

Mov	SI,Offset Work

Mov CX,80

Mov BL,Special

Mov	Attr,BL

Call Show

Ret

Set1	Endp

; Выводит строку 25

Set25 Proc Near

Push	DI

Push	SI

Mov DH,25

Mov DL,1

Mov CX,Pr_Len

Mov	BL,Special

Mov	Attr,BL

Mov	SI,Offset Prompt

Call Show

Mov AH,2

Mov DX,1808h

Mov BX,0

Int	10H

Pop	SI

Pop	DI

Ret

Set25	Endp

; Выводит сообщение в строке 25

Msg25 Proc Near ;SI - указатель на текст

Mov DH,25

Mov DL,10

Mov CX,EofLen

Mov BL,Special

Mov	Attr,BL

Call Show

Mov	BL,Normal

Mov	Attr,BL

Ret

Msg25	Endp

; Инициализация необходимых данных

InitCrt Proc Near

Push	ES

Mov AX,Bios

Mov	ES,AX

Mov CX,ES:Cols ;Количество столбцов

Mov	Crt_Col,CX

Mov DX,ES:A6845 ;Порт состояния

Add DX,6

Mov	Crt_Prt,DX

Mov Crt_Buf,0B800h ;Адрес видео буфера (color)

Mov	BX,ES:Flag

And	BX,30h

Cmp BX,30h

Jne CrtSet

Mov Crt_Buf,0B000h ;Адрес видео буфера (mono)

CrtSet: Pop	ES

Ret

InitCrt Endp

; HELP - Выводит управляющие клавиши

Help Proc Near

Call	Clear

Mov DX,0200h

Mov	AH,2

Sub	BH,BH

Mov	BL,Foregrd

Int	10h

Mov DX,Offset HelpMsg

Mov	AH,9

Int	21h

Mov AH,2

Mov DX,1808h

Sub	BX,BX

Int	10H

Ret

Help	Endp

; Извлекает имя файла с командной строки или из введенной

GetParm Proc Near

Xor AX,AX

Xor	CX,CX

Mov AL,Byte Ptr DS:[80h]

Or CX,AX

Jz GetFile

Mov DI,Offset Filenm

Mov SI,81h

Blanks: Lodsb

Cmp AL,' '

Je	Skipit

Stosb

Skipit: Loop	Blanks

Ret

GetFile:

Mov DX,Offset AskFile

Mov	AH,9

Int	21H

Mov AH,0AH

Mov	DX,Offset Keyin

Int	21h

Sub	BL,BL

Or BL,Keyout

Jz GetFile

Mov Filenm[BX],0

Ret

GetParm Endp

; Открывает файл

Open Proc Near

Mov OpenCod,0

Mov DX,Offset Filenm

Mov AL,0

Mov	AH,3DH

Int	21H

Mov Handle,AX

Jnc Opened

Mov	OpenCod,AX

Cmp AL,2

Jl Error

Cmp	AL,5

Ja	Error

Sub BX,BX

Mov	BL,AL

Mov	CL,4

Shl	BX,CL

Lea DX,Code2-32[BX]

Jmp	Error2

Error: Aam

Xchg	AL,AH

Or	OpenCod,AX

Mov	DX,Offset OpenMsg

Error2: Mov	AH,9

Int 21H

Opened: Cmp	OpenCod,0

Ret

Open	Endp

List	Endp

PgmSize Equ ($-Cseg+16)/16 ;Размер программы в параграфах

Cseg Ends

End	List