11. ПРИМЕРЫ ПРОГРАММ НА АССЕМБЛЕРЕ ДЛЯ ОС IS-DOS
1. Драйвер печати EPROF.LPR
Модуль компиляции драйвера EPROF.BAT
>
as eprof.as
link eprof.obj /а25000 /out eprof.lpr
>
Модуль программы драйвера EPROF.ASfM-для старых версий AS.COM)
; eprof.lpr ( Драйвер печати )
; 02.02.94 23:56
; Набран в IS-EDITe
; Адрес загрузки: 50000/#с350
ORG 50000
; Вектор символьного устройства вывода
MEM00 EQU $-1 ;
DEFW LC3CE ;
МЕМ01 EQU $-1 ;
DEFW LC37D ;
МЕМ02 EQU $-1 ;
DEFW LC3BF ;
МЕМОЗ EQU $-1 ;
DEFW LC3BF ;
DEFB #03 ;
DEFW #0000 ;
DEFW #0000 ;
DEFB #01 ;
DEFW #0000 ;
У
LC360 PUSH ВС
PUSH DE
PUSH HL
LD ВС,#0006
ADD HL,ВС
MEM04 EQU $
CALL LC372
POP HL
POP DE
POP ВС
DI
RET NC
POP HL
JR LC3B8
LC372 EI
PUSH AF
LD C,#08 ;Была ли нажата клавиша ?
RST #10
POP AF
LD E,(HL)
INC HL
LD D,(HL)
EX DE,HL
JP (HL)
LC37D PUSH AF
LD C,#12 ; Возврат вектора символьного устройства
RST #10
EXX
POP AF
CP #0D
JR NZ,LC396 ;Переход, если не конец строки (код 13)
BIT О,(HL)
JR Z.LC3C0
МЕМ05 EQU $
CALL LC396
RET С
MEM05 EQU $
CALL LC3BF ;Ret
LD A,#OA ;После кода 13 вывести код перевода строки
JR LC396
LC396 LD Е, А
LD A,#0F
OUT (#3F),A
DI
LC39C CALL #1F54 Проверка на "BREAK"
JR NC.MEM07 ;Если нажата
IN A,(#5F)
RLA
JR C.LC39C ;0жидание сигнала готовности принтера
LD А, Е
OUT (#3F),А ;Вывести символ в порт данных
LD А,#0 Е
OUT (#5F),А ;Выставить строб
LC3AD CALL #1F54
JR NC,MEM08
IN A,(#5F)
RLA
JR NC,LC3AD ;0жидание готовности принтера
LC3B7 XOR A
LC3B8 LD E,#0F
LD С,#5F
OUT (C),E ;Вывести строб
EI
LC3BF RET
LC3C0 LD A,#96
JR LC360
MEM07 CALL LC3C0
JR LC39C
МЕМ08 CALL LC3C0
JR LC3AD
LC3CE INC A
RET Z
LD A,#88
OUT (#7F),A
JR LC3B7
;Область адресов настройки
DEFW #FFFF ;Маркер начала области
DEFW MEMOO,MEM01,MEM02,MEM03
DEFW MEM04,MEM05,MEM06,MEM07
DEFW MEM08
2. Программа изменения размера кэша
Модуль компиляции программы CACHE.ВАТ
»
as cache.as
link cache.obj /a24000
• _ _ _ _ _
»
Модуль программы CACHE.AS(М-для старых версий AS.COM)
; МОДУЛЬ CACHE.AS, набран в IS-EDITe
; cache.com - программа, позволяющая изменять
;размер кэш диска в IS'DOS.
; Текст программы cache.as также служит примером
;работы с командной строкой.
; Компонуется программа из cache.obj и таблицы
;системных рестартов rst.gtb.
; Возмжен запуск компоновки по нажатию ENTER,
;выбрав курсором cache.obj. В этом случае в файле
;extent.txt должна быть строка:
; as :as /old/sym S:ASrst /auto
; предполагается, что as.com находится в каталоге,
определенном для поиска по умолчанию, a rst.gtb в
;каталоге S:AS
; Она разбирается с командной строкой, снимает
;ключи и , встретив ключ с, считывает значение чис-
;ла после него в регистр А и вызывает системный
;рестарт creat для изменения размера кэш памяти
; системы.
; Программа достаточно "умная", поэтому не поз-
волит задать размер кэш диска меньше 6 блоков.
;Программа также служит примером работы с командной
; строкой
; Формат запуска, например:
cache /с 10
;После запуска можно посмотреть размер доступной
;пользователю памяти с помощью show.com, которая
;выдает адрес начала кэш памяти. Это и есть вершина
;для размещения программ пользователя.
; Системная переменная utop ограничивает макси-
мальный размер задания кэш памяти. Если он превы-
шает допустимый, то ключ будет считаться недопус-
тимым и произойдет выход с ошибкой 23.
ORG 23904
CALL KLINI
RET С
XOR A
LD A,#F4
RET
; keyan.as
KLINI
LD C,$opcat
RST 16
RET С
RET NZ
EXX
CALL KEYAN
RET С
JR KLINI
KEYAN LD A,"/"
CP (HL)
JR NZ,NAME
WKO INC HL
LD B,(HL)
PUSH ВС
INC HL
PUSH HL
LD B,0
WK1 LD A," "
CP (HL)
JR Z.WK2
LD A,"/"
CP (HL)
JR Z, WK2
LD A,13
CP (HL)
JR Z,WK2
INC HL
INC В
JR WK1
WK2 POP DE ;-pointer to begining of number ASCII buffer.
PUSH HL ;pointer of the new element -1.
INC В
DEC В
JR Z,WK3 ;no numeric symbols.
EX DE,HL ;HL-begi ni ng of ASCII buffer.
LD А,В ;number of elements in buffer.
LD В,10 ;base of the number by ignor.
LD C,$a_d
RST 16
JR C,ERR
EXX
EX DE,HL
WK3 POP HL
POP AF
PUSH HL
LD HL,KLANL
RES 5,A
LD C,$analy
RST 16
LD A,23
POP HL
RET С
LD A,"/"
CP (HL)
JR Z.WKO ;key "/" followed without the " " before it.
XOR A
RET Z
ERR
POP HL
POP HL
RET
************************
KLANL
DEFB "С"
DEFW CACHE
DEFB 255
DEFW EMPTY
************************
CACHE
LD A, E
CP 6
JR NC.CCl
LD A, 6
CC1
LD C,Screat
RST 16
RET С
XOR A
RET
EMPTY
SCF
RET
* **********************
ФАЙЛ, СОДЕРЖАЩИЙ СПИСОК СИСТЕМНЫХ РЕСТАРТОВ
; МОДУЛЬ RST.AS, набран в IS-EDITe
; Если метка или имя процедуры начинается с символа '$', она
; считается глобальной и видна во всех вызывающих программах.
; (имеет смысл, когда программа компонуется из разных модулей .0BJ)
; Локальные метки видны в каждом .0BJ свои, даже если в 2-х
; отдельных они будут одинаковы.
$creat EQU 0 ; Управление устройствами
$clear EQU 1
$flush EQU 2
Sttyin EQU 7
$kwait EQU 8
$ktest EQU 9
$ttyou EQU 10
$prcpl EQU 11
$prapd EQU 12
$b i nit EQU 15
$g_cnf EQU 16
$g_tyd EQU 18
$stchn EQU 22
$delch EQU 23
$newch EQU 25
$swtyp EQU 27
$ldnew EQU 29
$l_im2 EQU 30
$erdrv EQU 31
•
» - __
$open EQU 32 ; Файловая служба
$openl EQU 33
$mkdir EQU 34
$crfi1 EQU 35
Serfi1 EQU 36
$fopen EQU 37
$opnum EQU 38
$gname EQU 39
$putf EQU 40
$rpart EQU 41
$wpart EQU 42
$rifle EQU 43
$wifle EQU 44
$fadd EQU 47
$fcut EQU 48
$eadd EQU 49
$ecut EQU 50
$g_cat EQU 51
$find EQU 52
$bkfcb EQU 53
$p_sta EQU 54
$g_sta EQU 55
$di str EQU 56
$retrn EQU 57
$paste EQU 58
$crf_ EQU 59
$erf__EQU 60
$rvblk EQU 61
$wvblk EQU 62
$free EQU 63
• ^ ^
»
$oparm EQU 64 ; Работа с командной строкой
$fmrst EQU 65
$comst EQU 66
$opcat EQU 67
$exeba EQU 68
$g_com EQU 69
$traris EQU 70
$g_way EQU 71
$run EQU 72
$p_com EQU 73
$dvtrn EQU 74
$newco EQU 75
$newca EQU 76
$rcdel EQU 77
$c-p_ir EQU 78
$convr EQU 79
$fncor EQU 80
$fndev EQU 81
$opres EQU 82
$exere EQU 83
$swrun EQU 84
• _
1
;$empt0 EQU 96 ; Оконная служба
$wt EQU 97
$box EQU 98
$awt EQU 99
$awtc EQU 100
$lwt EQU 101
$adrwt EQU 102
Slenwt EQU 103
$prstr EQU 104
Siniwt EQU 105
Spane1 EQU 106
$wtpos EQU 107
$str EQU 108
$lnstr EQU 109
$smbgt EQU 110
$beep EQU 111
$scrol . EQU 112
Stylin EQU 113
$g_scr EQU 114
$cls EQU 115
;$emptl EQU 116
;$empt2 EQU 117
$y__EQU 118
$n__EQU 119
$crAon EQU 120
$crAof EQU 121
;$empt3 EQU 122
;$empt3 EQU 123
$d_a EQU 124
$a_d EQU 125
Sanaly EQU 126
$edstr EQU 127
• _____________ _ _
»
$shel0 EQU 128 ; Оболочка (SHELL)
$shel1 EQU 129
$shel2 EQU 130
$pnvi e EQU 131
$shout EQU 132
$pAcsr EQU 133
$g_csr EQU 134
$g_mpa EQU 135
$ed_di EQU 136
$mmenu EQU 137
$g_cur EQU 138
$mwai t EQU 139
$g_dev EQU 140
;$emO EQU 141
$shsub EQU 142
$cpfi1 EQU 143
$shpan EQU 144
$menu EQU 145
$funct EQU 146