nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 06:50



Reply to topic  [ 1 post ] 
[ASM] Менеджер фоновой печати для DOS 
Author Message
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Моя курсовая работа 1994 года, слегка подправленная в 1995-м - менеджер фоновой печати (в DOSBox и из под DN не работает):

Code:
;======================== P R I N T ==========================
codesg  segment para 'code'
        assume  cs:codesg,ds:codesg,es:codesg,ss:codesg

        org     100h
begin:  jmp     init
;-------------------------------------------------------------
len     equ     2048   ; Длина буфера
max     equ     10     ; Количество попыток при ошибке
head    db      'ЙННННННННННННННННННННННННННННННННННН╩',13,10
        db      '╨          -= P R I N T =-          ╨',13,10
        db      '╨      ПЕЧАТЬ В ФОНОВОМ РЕЖИМЕ      ╨',13,10
        db      '╨            версия  1.1            ╨',13,10
        db      '╨ Екатеринбург  УГТУ-УПИ РТФ  к.АИТ ╨',13,10
        db      '╨           Шабаршин  А.А.          ╨',13,10
        db      '╨   18 июня 1994  ,   2 июня 1995   ╨',13,10
        db      '╨     Активизируется по  PrtScr     ╨',13,10
        db      '╨   При повторном запуске стирает   ╨',13,10
        db      '╨           себя из памяти          ╨',13,10
        db      'ИННННННННННННННННННННННННННННННННННН╪',13,10,10,'$'
string  db      'PRINT уже находится в памяти и будет уничтожен !',13,10,7,'$'
file    db      32 dup(0)    ; Распечатываемый файл
queue   db      640 dup(0)   ; Очередь
zeros   db      32 dup(0)    ; Нулевая строка
buff    db      len dup('b') ; Буфер
re      db      0       ; Переменная повторения
poz     dw      0       ; Указатель на текущий символ в буфере
new_f   db      1       ; Признак нового печатаемого файла
err     db      0       ; Код ошибки
handle  dw      ?       ; Файловый номер печатаемого файла
port    dw      0378h   ; Адрес порта (LPT1)
job     db      0       ; Признак работы
q_free  db      1       ; Признак пустоты очереди
fpoz1   dw      0       ; Позиция указателя в файле
fpoz2   dw      0
fsiz1   dw      0       ; Длина файла
fsiz2   dw      0
first   db      1       ; Флаг первого запуска
bend    dw      0       ; Конец буфера
save28  dd      0       ; Старый вектор обработчика 28h
num     db      0       ; Количество файлов в очереди
;----------- КОПИРОВАНИЕ СТРОКИ В ДРУГУЮ -----------------
mov_str macro   str1,str2,nnnn ; str1=str2
        mov     ax,ds
        mov     es,ax
        lea     si,str2
        lea     di,str1
        mov     cx,nnnn
        rep movsb
        endm
;----------- КОПИРОВАНИЕ СТРОКИ В ДРУГУЮ 2----------------
mov_stb macro   str1,str2,nnnn ; str1=str2
        mov     ax,ds
        mov     es,ax
        lea     si,str2
        mov     di,str1
        mov     cx,nnnn
        rep movsb
        endm
;-------------------------------------------------------
eni_:   jmp     eni
;------------ ПРЕРЫВАЮЩАЯ ПРОГРАММА ПЕЧАТИ -------------
inter   proc    near
        pushf
        cmp     cs:q_free,1
        je      eni_
        cmp     cs:job,1
        je      eni_
        mov     cs:job,1
        push    ax
        push    bx
        push    cx
        push    dx
        push    si
        push    di
        push    ds
        push    es
        mov     dx,cs
        mov     ds,dx
beg:    cmp     new_f,1 ;---- ЧТЕНИЕ ОЧЕРЕДИ -----------
        je      beg1
        jmp     f_old
beg1:   cmp     num,0
        jne     pozic
        mov_str file,zeros,32
        mov     q_free,1
        mov     new_f,0
        jmp     endii
pozic:  mov_str file,queue,32      ; Имя файла
        mov_str queue,queue+32,608 ; Сдвиг очереди
        mov_str queue+608,zeros,32
        dec     num
        mov     new_f,0
        mov     bend,len
        call    open
        cmp     err,1
        je      eeer
        mov     ah,42h   ; Позициирование указателя
        mov     bx,handle
        mov     al,2     ; Относительно конца файла
        mov     cx,0     ; старшая часть
        mov     dx,0     ; младшая часть
        int     21h
        mov     fsiz1,dx
        mov     fsiz2,ax
        mov     fpoz1,0
        mov     fpoz2,0
        mov     ah,42h   ; Позициирование указателя
        mov     bx,handle
        mov     al,0     ; Относительно начала файла
        mov     cx,0     ; старшая часть
        mov     dx,0     ; младшая часть
        int     21h
        jmp     rd1
f_old:  call    open    ; Открыть файл
        cmp     err,1   ; Если ошибки открытия  нет,
        jne     f_old1  ;   то читать из файла в буфер
eeer:   call    beep    ; Если была ошибка открытия,
        mov     new_f,1 ;   то переход к новому файлу
        jmp     endii   ; Ошибка
f_old1: mov     ax,bend ; Работа со старым файлом
        cmp     poz,ax
        jb      pri     ; Если poz<len, то печать строки из буфера
        mov     poz,0   ;---- Чтение в буфер из файла ---------
        mov     ax,fpoz2
        add     ax,bend
        mov     fpoz2,ax
        mov     ax,fpoz1
        adc     ax,0
        mov     fpoz1,ax
        cmp     ax,fsiz1
        jb      pozz
        mov     ax,fpoz2
        cmp     ax,fsiz2
        jb      pozz
        mov     new_f,1
        jmp     endi
pozz:   mov     ah,42h   ; Позициирование указателя
        mov     bx,handle
        mov     al,1     ; Относительно текущей позиции
        mov     cx,fpoz1 ; старшая часть
        mov     dx,fpoz2 ; младшая часть
        int     21h
rd1:    call    read     ; Чтение в буфер из файла
        cmp     bend,0
        je      erd2
        cmp     err,1
        jne     endi    ; При безошибочном чтении выход
        call    beep    ; Если произошла ошибка чтения,
erd2:   mov     new_f,1
        jmp     endi    ; Выйти из прерывания
pri:    call    print   ;---- Печать строки из буфера ---
endi:   mov     ah,3eh  ; Закрытие файла
        mov     bx,handle
        int     21h
endii:  pop     es
        pop     ds
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        mov     cs:job,0
eni:    popf
        ret
inter   endp
;------------ ПЕЧАТЬ СИМВОЛА ИЗ БУФЕРА ----------
print   proc    near
        mov     dx,port
        inc     dx
        mov     bx,poz
        in      al,dx  ; Проверка состояния порта принтера
        test    al,10000000b
        jz      ex_pr  ; Принтер занят
        test    al,00100000b
        jnz     ex_pr  ; Если принтер не готов то выйти
        mov     al,buff[bx]
        dec     dx
        out     dx,al
        inc     dx
        inc     dx
        mov     al,0Dh ; Установка строба
        out     dx,al
        mov     al,0Ch ; Отмена строба
        out     dx,al
        inc     bx
ex_pr:  mov     poz,bx
        ret
print   endp
;------------ ЗВУКОВОЙ СИГНАЛ ------------------
beep    proc    near
        in      al,61h
        and     al,11111110b
        mov     bx,500
bee:    or      al,00000010b
        out     61h,al
        mov     cx,1000
l0:     loop    l0
        and     al,11111101b
        out     61h,al
        mov     cx,1000
l1:     loop    l1
        dec     bx
        jnz     bee
        ret
beep    endp
;------------ ОТКРЫТИЕ ФАЙЛА -----------------------------
open    proc    near
        mov     err,0
        mov     re,max  ; Количество повторений при ошибке
op:     mov     ah,3Dh  ; Открытие файла
        mov     al,0
        lea     dx,file
        int     21h
        jc      err_o
        mov     handle,ax
        ret
err_o:  dec     re
        jnz     op
        mov     err,1
        ret
open    endp
;------------ ЧТЕНИЕ ДИСКОВОЙ ЗАПИСИ ---------------------
read    proc    near
        mov     err,0
        mov     re,max  ; Количество повторений при ошибке
rea:    mov     ah,3Fh
        mov     bx,handle
        mov     cx,len
        lea     dx,buff
        int     21h
        mov     bend,ax
        jc      err_r   ; Ошибка чтения
        ret
err_r:  dec     re
        jnz     rea
        mov     err,1
        ret
read    endp
;-------- Данные для второй прерывающей программы ---
pg      db      0       ; Номер страницы видеопамяти
row     db      0       ; Номер строки
col     db      0       ; Номер позиции
k1      db      0       ; Массив раннее принятых кодов
k2      db      0
k3      db      0
key     db      0       ; Признак нажатия клавиши
char    db      0       ; Код нажатой клавиши
work    db      0       ; Признак работы программы установки
resid   db      0       ; Признак активизации резидента
s1      db      0       ; Вспомогательные переменные
s2      db      0
s3      db      0
s4      db      0
s5      db      0
atr     db      15      ; Атрибуты символов
leng    db      0       ; Длина выведенной строки
vect    dd      0       ; Запоминание старого обработчика
rrr     db      0       ; Переменные для работы FILL и FRAME
ccc     db      0
rrl     db      0
ccl     db      0
;-------- ПРЕРЫВАЮЩАЯ ПРОГРАММА КЛАВИАТУРЫ --------------
inter_s proc    far
        cli
        pushf
        push    ax
        push    ds
        mov     ax,cs
        mov     ds,ax
        in      al,60h  ; Чтение сканкода из порта клавиатуры
        cmp     work,1
        je      worki   ; На обслуживание ПП уст-ки очереди
        cmp     al,37h  ; Проверка на нажатие
        jne     sav     ; PrtScr [ E0 2A E0 37 ]
        cmp     k1,0E0h ;          k3 k2 k1 al
        jne     sav
        cmp     k2,2Ah
        jne     sav
        cmp     k3,0E0h
        je      rre
sav:    mov     ah,k2
        mov     k3,ah
        mov     ah,k1
        mov     k2,ah
        mov     k1,al
        jmp     eis
        ; Нажата клавиша PrtScr :
rre:    mov     resid,1 ; Установить флаг команды активизации
ei:     mov     al,20h ; Завершить прерывание
        out     20h,al
        pop     ds
        pop     ax
        popf
        sti
        iret
eis:    pop     ds
        pop     ax
        popf
        sti
        mov     job,0
        jmp     dword ptr cs:[vect] ; Запустить обработчик
worki:  nop     ; Обслуживание клавиатуры ПП очереди
        cmp     al,48h   ; Вверх
        jne     w1
        mov     key,2
        jmp     ei
w1:     cmp     al,50h   ; Вниз
        jne     w2
        mov     key,3
        jmp     ei
w2:     cmp     al,4Bh   ; Влево
        jne     w3
        mov     key,4
        jmp     ei
w3:     cmp     al,4Dh   ; Вправо
        jne     w4
        mov     key,5
        jmp     ei
w4:     cmp     al,1Ch   ; Ввод
        jne     ei
        mov     key,1
        jmp     ei
inter_s endp
;-------- МАКРОСЫ ДЛЯ РАБОТЫ С ЭКРАНОМ -----------------
cur     macro   r,c     ; Установка курсора
        mov     ah,2
        mov     bh,7
        mov     dh,r
        mov     dl,c
        int     10h
        endm
putc    macro   pp      ; Вывод символа
        putcn   pp,1
        endm
putcn   macro   pp,nn   ; Вывод символа несколько раз
        mov     ah,9
        mov     al,pp
        mov     bh,7
        mov     bl,atr
        mov     cl,nn
        mov     ch,0
        int     10h
        endm
color   macro   aa      ; Установка атрибутов символов
        mov     atr,aa
        endm
fill    macro   r0,c0,ro,co ; Закрашивание части экрана
        mov     rrr,r0
        mov     ccc,c0
        mov     rrl,ro
        mov     ccl,co
        call    fill_
        endm
up      macro           ; Сдвиг курсора вверх
        mov     ah,255
        mov     al,0
        call    move
        endm
down    macro           ; Сдвиг курсора вниз
        mov     ah,1
        mov     al,0
        call    move
        endm
left    macro           ; Сдвиг курсора влево
        mov     ah,0
        mov     al,255
        call    move
        endm
right   macro           ; Сдвиг курсора вправо
        mov     ah,0
        mov     al,1
        call    move
        endm
frame   macro   r0,c0,ro,co ; Рисование рамки
        mov     rrr,r0
        mov     ccc,c0
        mov     rrl,ro
        mov     ccl,co
        call    frame_
        endm
write   macro   stt     ; Вывод строки на экран
        lea     dx,stt
        call    prs
        endm
inkey   macro           ; Ожидание нажатия клавиши
        call    key_
        endm
;-------- ПОДПРОГРАММЫ ДЛЯ РАБОТЫ С ЭКРАНОМ -------------
key_    proc    near   ; Ожидание нажатия клавиши
k00:    cmp     key,0
        je      k00
        mov     al,key
        mov     char,al
        mov     key,0
        ret
key_    endp
fill_   proc    near   ; Закрашивание части экрана
f0:     cur     rrr,ccc
        putcn   219,ccl
        inc     rrr
        dec     rrl
        jnz     f0
        ret
fill_   endp
move    proc    near    ; Сдвиг курсора
        push    ax
        mov     ah,3
        mov     bh,7
        int     10h
        pop     ax
        add     ah,dh
        add     al,dl
        mov     dx,ax
        mov     ah,2
        mov     bh,7
        int     10h
        ret
move    endp
frame_  proc    near    ; Рисование рамки
        mov     ah,ccl
        dec     ah
        add     ah,ccc
        mov     s3,ah
        cur     rrr,ccc
        putc    218
        right
        dec     ccl
        dec     ccl
        dec     rrl
        dec     rrl
        putcn   196,ccl
        cur     rrr,s3
        putc    191
f1:     inc     rrr
        cur     rrr,ccc
        putc    179
        cur     rrr,s3
        putc    179
        dec     rrl
        jnz     f1
        mov     ah,rrr
        add     ah,rrl
        inc     ah
        mov     s2,ah
        cur     s2,ccc
        putc    192
        right
        putcn   196,ccl
        cur     s2,s3
        putc    217
        ret
frame_  endp
prs     proc    near    ; Вывод строки на экран
        mov     leng,0
        mov     si,dx
prr:    mov     al,[si]
        inc     si
        inc     leng
        cmp     al,0
        je      eee
        putc    al
        right
        jmp     prr
eee:    ret
prs     endp
;============ МАКРОСЫ ДЛЯ РАБОТЫ С ФАЙЛАМИ ===============
;--------------- ПОИСК ФАЙЛА ПО ШАБЛОНУ ------------------
find    macro   a_a
        mov     ah,4Eh  ; Функция поиска
        lea     dx,fil
        mov     cx,a_a  ; Атрибут
        int     21h
        endm
;------------ ПОВТОРНЫЙ ПОИСК ФАЙЛА ПО ШАБЛОНУ -----------
findr   macro
        mov     ah,4Fh  ; Функция повторного поиска
        int     21h
        endm
;------------ ПЕРЕМЕННЫЕ ДЛЯ ПП УСТАНОВКИ ОЧЕРЕДИ----
mall    equ   10h   ; Маска атрибутов файлов и каталогов
activ   equ   79
passiv  equ   31
fon     equ   64
m_act   equ   31
m_pas   equ   47
str1    db    '-=PRINT=-',0
str2    db    'ПЕЧАТЬ В ФОНОВОМ РЕЖИМЕ',0
str3    db    'Шабаршин А.А.     июнь 1994, июнь 1995',0
str4    db    'очередь файлов для печати',0
n_file  dw    0     ; Номер выделенного файла на файловой панели
e_file  dw    0     ; Количество файлов
prog    db    13 dup(0) ; Имя активного файла
nam1    db    13 dup(0) ; Вспомогательное имя
direct  db    0     ; Признак директория
n1      dw    0     ; Вспомогательные переменные
n2      dw    0
n3      dw    0
menu1   db    ' Добавление в очередь ',0
menu2   db    ' Удаление  из очереди ',0
menu3   db    '        Возврат       ',0
menu    db    1    ; Номер выбранного пункта меню
fpan    db    0    ; Признак работы файловой панели
;------------ ПОДПРОГРАММА УСТАНОВКИ ОЧЕРЕДИ --------
ust     proc    near
        sti
        mov     cs:work,1
        mov     cs:job,1
        pushf
        push    ax
        push    bx
        push    cx
        push    dx
        push    si
        push    di
        push    ds
        push    es
        mov     dx,cs
        mov     ds,dx
        mov     ah,0Fh  ; Получить текущий видеорежим
        int     10h
        mov     pg,bh
        mov     ah,3    ; Чтение положения курсора
        int     10h
        mov     row,dh
        mov     col,dl
        cmp     al,3    ; Проверка на режим 3
        je      akt
        call    beep    ; В других режимах не запускается
        jmp     endis
akt:    mov     ax,0507h ; Установка страницы 7
        int     10h
        mov     ax,0600h ; Очистка экрана
        mov     bh,07
        mov     cx,0
        mov     dx,184Fh
        int     10h
        color   6
        fill    0,0,1,80
        color   111
        cur     0,1
        write   str1    ; '-=PRINT=-'
        color   98
        cur     0,13
        write   str2    ; 'ПЕЧАТЬ В ФОНОВОМ РЕЖИМЕ'
        color   96
        cur     0,39
        write   str3    ; 'Шабаршин А.А.'
        color   1
        cur     1,7
        write   str4    ; 'очередь файлов для печати'
        color   7
        fill    2,0,23,38
        color   112
        frame   2,3,23,34
        color   112
        cur     3,1
        putcn   '0',2   ; Вывод номеров
        cur     2,1
        putcn   '>',2
        color   127
        mov     s1,4    ; Строка
        mov     s4,0    ; Место в очереди
        mov     s2,48
        mov     s3,49
cicl:   cur     s1,1
        putc    s2
        right
        putc    s3
        inc     s3
        cmp     s3,58
        jne     dalee
        inc     s2
        mov     s3,48
dalee:  inc     s1
        inc     s4
        cmp     s4,20
        jne     cicl
        call    disk_  ; Определение текущего диска
redraw: color   7
        fill    4,4,20,32
        color   112
        cur     3,4
        write   file
        color   127
        mov     cl,num
        mov     ch,0
        mov     s1,4
        lea     ax,queue
        mov     n1,ax
        cmp     cx,0
        je      f_nn1
        cmp     cx,21
        jb      f_nn
        mov     num,0
        mov     cx,0
        jmp     f_nn1
f_nn:   push    cx
        cur     s1,4
        mov     dx,n1
        call    prs
        mov     ax,n1
        add     ax,32
        mov     n1,ax
        inc     s1
        pop     cx
        loop    f_nn
f_nn1:  color   31   ; Каталог
        frame   3,39,22,14
        call    ini_dta
f_panl: color   1
        fill    4,40,20,12
; Подсчет количества файлов
        mov     e_file,0FFFEh
        find    mall
rr0:    inc     e_file
        findr
        jnc     rr0
; Работа файловой панели
rabp:   mov     n_file,0000h
pan00:  mov     n1,0   ; Первый отображаемый файл
pan000: mov     ax,n1  ; С какого файла начинать
        mov     n3,ax
        find    mall
        cmp     n1,0
        je      pan11
pan12:  findr          ; Пропуск неотображающихся
        dec     n3     ;   файлов
        jnz     pan12
        mov     ax,n1
        mov     n3,ax
pan11:  color   activ
        mov     s1,20 ; Кол-во файлов в окне
        mov     s2,4  ; Номер строки
pan:    findr   ;-------Цикл для имен файлов---
        jnc     pan10
        jmp     pane
pan10:  mov     ax,n3
        cmp     ax,n_file
        jne     pan0
        color   activ ; Активный файл
        mov     direct,0
        test    byte ptr attr,10h
        jz      ne_dir
        mov     direct,1
ne_dir: mov_str prog,nam,13
        jmp     pan01
pan0:   color   passiv
pan01:  cur     s2,40
        test    byte ptr attr,10h
        jz      pan1
        mov     al,atr
        dec     al
        dec     al
        color   al
pan1:   mov_str nam1,nam,13
        mov     bx,0
pan13:  cmp     nam1[bx],0
        je      pan15
        inc     bx
        jmp     pan13
pan15:  cmp     bx,12
        je      pan16
pan14:  mov     nam1[bx],20h
        inc     bx
        cmp     bx,12
        jne     pan14
pan16:  mov     nam1[12],0
        write   nam1
        inc     s2
        inc     n3
        dec     s1
        jz      pane
        jmp     pan
pane:   cur     2,39
        color   0
        putcn   ' ',41
        color   9
        write   disk
        mov   ah,47h  ; Чтение текущего пути
        lea   si,curd ; Адрес строки
        mov   dl,0    ; Текущий накопитель
        int   21h
        write   curd
        putc    '\'
        right
        write   prog
        cmp     direct,1
        jne     inkey_
        putc    '\'
inkey_: cmp     fpan,1
        je      ink_
        jmp     menu_
ink_:   inkey
        ;-- Обработка клавиатуры ------------
        cmp     char,1  ; Ввод
        je      ent
        cmp     char,2  ; Вверх
        jne     pan2
        cmp     n_file,0
        je      pan00_
        mov     ax,n1
        cmp     ax,n_file
        je      pan_dn
        dec     n_file
        jmp     pan00_
pan_dn: dec     n1
        dec     n_file
        jmp     pan00_
pan2:   cmp     char,3  ; Вниз
        jne     pan00_
        dec     n3
        mov     ax,n3     ; ax-последний в окне
        mov     cx,e_file ; cx-последний вообще
        cmp     cx,n_file
        jbe     pan00_
        cmp     ax,n_file
        je      pan_up
        inc     n_file
        jmp     pan00_
pan_up: inc     n1
        inc     n_file
pan00_: jmp     pan000
ent:    mov_str f_nam,disk,4 ; Нажат ENTER
        lea     dx,f_nam
        inc     dx      ; Формирование полного имени
        inc     dx
        inc     dx
        lea     bx,curd
        mov     al,[bx]
        cmp     al,0
        jne     m_s
        jmp     zzz0
m_s:    mov_stb dx,curd,30
        mov     bx,0
zik:    inc     bx
        cmp     bx,32 ; bx>=32
        jae     perep
        cmp     f_nam[bx],0
        jne     zik
        mov     f_nam[bx],'\'
        inc     bx
        mov     f_nam[bx],0
zzz0:   lea     bx,f_nam
zik2:   inc     bx
        mov     al,[bx]
        cmp     al,0
        jne     zik2
        mov_stb bx,prog,13
        mov     bx,4
zik1:   inc     bx    ; Проверка длины имени (не больше 32)
        cmp     bx,32
        jae     perep ; bx>=32
        cmp     f_nam[bx],0
        jne     zik1
        ;-------Полное имя файла сформировано
        cmp     direct,1
        jne     vybor  ; Смена директория
        lea     dx,f_nam
        mov     ah,3Bh
        int     21h
        jmp     f_panl ; Переписать файловую панель
perep:  call    beep
        jmp     vozz
vybor:  mov     bl,num ; Выбор файла и добавление
        mov     al,32
        mul     bl     ; ax=num*32
        lea     bx,queue
        add     ax,bx
        mov     dx,ax
        cmp     num,20
        je      perep
        cmp     file[0],0
        jne     qfree
        mov     new_f,1
qfree:  mov     q_free,0
        inc     num
        mov_stb dx,f_nam,32
vozz:   call    ret_dta
        mov     fpan,0
        jmp     redraw
menu_:  color   2      ; МЕНЮ
        fill    3,54,5,26
        color   m_pas
        frame   3,55,5,24
men1:   color   2
        fill    4,56,3,22
        color   m_pas
        cmp     menu,1   ; Добавить файл в очередь
        jne     men2
        color   m_act
men2:   cur     4,56
        write   menu1
        color   m_pas
        cmp     menu,2   ; Удалить файл из очереди
        jne     men3
        color   m_act
men3:   cur     5,56
        write   menu2
        color   m_pas
        cmp     menu,3   ; Выход
        jne     men4
        color   m_act
men4:   cur     6,56
        write   menu3
        inkey
        cmp     char,2  ; Вверх
        jne     men5
        dec     menu
        cmp     menu,0
        jne     men40
        mov     menu,1
men40:  jmp     men1
men5:   cmp     char,3  ; Вниз
        jne     men6
        inc     menu
        cmp     menu,4
        jne     men50
        mov     menu,3
men50:  jmp     men1
men6:   cmp     char,1  ; Ввод
        jne     men50
        cmp     menu,3  ; Выбран выход
        jne     men60
        jmp     ex_me
men60:  cmp     menu,1  ; Выбрано добавление в очередь
        jne     men7
        mov     fpan,1
        jmp     f_panl
men7:   nop             ; Выбрано удаление из очереди
        mov     s2,0    ; Активный файл
        mov     s3,4    ; Строка активного файла
r_ud:   mov     s1,4
        color   7
        fill    4,4,20,32
        mov     cl,num
        mov     ch,0
        lea     ax,queue
        mov     n1,ax
        cmp     cx,0    ; Если очередь пуста , то ошибка
        jne     f_nn11
        call    beep
        mov     fpan,0
        call    ret_dta
        jmp     redraw
f_nn11: push    cx
        cur     s1,4
        color   127
        mov     al,s1
        cmp     al,s3
        jne     mo0
        color   15
mo0:    mov     dx,n1
        call    prs
        mov     ax,n1
        add     ax,32
        mov     n1,ax
        inc     s1
        pop     cx
        loop    f_nn11
        inkey
        cmp     char,1 ; Ввод
        jne     ud1    ; УДАЛЕНИЕ !
        mov     al,32
        mul     s2
        mov     dx,ax
        lea     bx,queue
        add     ax,bx
        mov     bx,ax  ; куда
        add     ax,32  ; откуда
        mov     cx,ds
        mov     es,cx
        mov     si,ax
        mov     di,bx
        mov     al,19
        sub     al,s2
        mov     bl,32
        mul     bl
        mov     cx,ax
        rep movsb
        lea     ax,queue
        add     ax,608
        mov     di,ax
        add     ax,32
        mov     si,ax
        mov     cx,32
        rep movsb
        dec     num
        call    ret_dta
        jmp     redraw
ud1:    cmp     char,2  ; Вверх
        jne     ud2
        cmp     s2,0
        je      ud0
        dec     s2
        dec     s3
        jmp     ud0
ud2:    cmp     char,3  ; Вниз
        jne     ud0
        inc     s2
        mov     al,s2
        cmp     al,num
        jne     ud3
        dec     s2
ud0:    jmp     r_ud
ud3:    inc     s3
        jmp     ud0
ex_me:  call    ret_dta ; Вернуть старый DTA
        mov     ah,5    ; Вернуть старую страницу
        mov     al,pg
        int     10h
        mov     ah,2    ; Установить старое положение курсора
        mov     bh,pg
        mov     dh,row
        mov     dl,col
        int     10h
endis:  pop     es
        pop     ds
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        popf
        mov     cs:job,0  ; Разрешить печать
        mov     cs:work,0 ; Отменить признак работы
        ret
ust     endp
;------------ ПЕРЕМЕННЫЕ ДЛЯ РАБОТЫ С ФАЙЛАМИ ------------
fil     db      '*.*',0
disk    db      'C:\',0
f_nam   db      45 dup(0) ; Полное имя выбранного файла
curd    db      64 dup(0) ; Текущий путь
driv    db      3       ; Номер дисковода
dta_o   dw      0       ; Старый буфер DTA
dta_o2  dw      0
dta     label   byte ;--------DTA-------------
        db      21 dup(0)
attr    db      0
time    dw      0
date    dw      0
siz     dw      0
siz_h   dw      0
nam     db      13 dup(0)
;------------ ИНИЦИАЛИЗАЦИЯ НОВОЙ DTA --------------------
ini_dta proc    near
        mov     ah,2Fh  ; Выдача буфера DTA
        int     21h     ;   в ES:BX
        mov     dta_o,bx ; Запоминание старого DTA
        mov     dta_o2,es
        mov     dx,offset dta
        mov     ah,1Ah  ; Установка буфера DTA
        int     21h     ;   из DS:DX
        ret
ini_dta endp
;------------ ВОЗВРАЩЕНИЕ СТАРОЙ DTA ---------------------
ret_dta proc    near
        push    ds
        mov     dx,dta_o ; Восстановление старого DTA
        mov     ds,dta_o2
        mov     ah,1Ah   ; Установка буфера DTA
        int     21h
        pop     ds
        ret
ret_dta endp
;------------ ОПРЕДЕЛЕНИЕ ТЕКУЩЕГО ДИСКА -----------------
disk_   proc    near
        mov     ah,19h
        int     21h
        mov     driv,al
        add     al,65
        mov     byte ptr disk,al
        ret
disk_   endp
;============ НЕДОКУМЕНТИРОВАННОЕ INT 28h =====================
inter28 proc    far
        pushf
        call    inter
        cmp     cs:resid,1 ; Выход, если не было команды
        jne     pass28
        cmp     cs:work,1  ; Выход, если программа уже работает
        je      pass28
        cmp     cs:job,1   ; Выход, если идет печать
        je      pass28
        mov     cs:resid,0 ; Отменить команду
        call    ust        ; Активизировать программу
pass28: popf
        jmp     dword ptr cs:[save28]
inter28 endp
;================= ИНИЦИАЛИЗАЦИЯ ==================================
init    proc    near
        cli
        mov     dx,cs
        mov     ds,dx
        mov     ax,3528h ; Чтение вектора прерывания
        int     21h
        mov     word ptr cs:save28,bx ; Запомнить старый обработчик
        mov     word ptr cs:save28+2,es
        mov     ah,es:[bx]
        cmp     ah,9Ch
        jne     ini   ;====== Переход на инициализацию резидента
        inc     bx
        mov     ah,es:[bx]
        cmp     ah,0E8h
        jne     ini
        mov     ah,09 ;------ Вывод сообщения о том, что
        lea     dx,string ;   резидент уже существует.
        int     21h
        mov     es:job,1
        mov     es:work,1
        push    ds
        mov     dx,word ptr es:save28
        mov     ds,word ptr es:save28+2
        mov     ax,2528h
        int     21h
        mov     dx,word ptr es:vect
        mov     ds,word ptr es:vect+2
        mov     ax,2509h
        int     21h
        pop     ds
        cli     ; Освободить занимаемую память
        mov     ah,49h
        int     21h
        sti
        ret
        ;======= Инициализация резидента ================
ini:    mov     ah,09
        lea     dx,head
        int     21h
        mov     dx,offset inter28
        mov     ax,2528h  ; Замена вектора прерывания 28h
        int     21h
        mov     ax,3509h  ; Чтение вектора прерывания 09h
        int     21h
        mov     word ptr cs:vect,bx
        mov     word ptr cs:vect+2,es
        mov     dx,offset inter_s
        mov     ax,2509h  ; Замена вектора прерывания от
        int     21h       ; клавиатуры.
        sti
        mov     ah,1      ; Инициализация порта принтера
        mov     dx,cs:port
        int     17h
        mov     dx,offset init
        int     27h       ; Создание резидента
init    endp
codesg  ends
        end     begin

_________________
:dj: https://mastodon.social/@Shaos


07 Aug 2006 17:36
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 1 post ] 

Who is online

Users browsing this forum: No registered users and 14 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.