nedoPC.org

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



Reply to topic  [ 14 posts ] 
[ASM] Ассемблер 8086 
Author Message
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Так получилось, что после очень недолгого периода возюканья с паскалем, году эдак в 1993 я пересел на ассемблер и по книжкам Питера Абеля и некоего Джордейна (Журдена) программировал ДОС на нижнем уровне с помощью MASM. За пару лет ассемблерного программирования я накопил собственную библиотеку макросов и подпрограмм, без которой не обходилась ни одна моя ассемблерная программа:

Code:
;*************************************************************
;*      INKEY char - ожидание нажатия клавиши                *
;*      KEYB  char - проверка на нажатие клавиши             *
;*      INPUT char - ожидание нажатия и вывод на экран       *
;*      KEYPRESSED - ожидание нажатия клавиши                *
;*      PUTP char  - вывод символа на принтер                *
;*      DISP char  - вывод символа на экран                  *
;*      STATE      - чтение состояние принтера в AH          *
;*      BUSY       - принтер занят ( JZ ZANYAT )             *
;*      CONFI - нет подтверждения от принтера (JZ NET_PODTV) *
;*      INIT       - инициализация принтера                  *
;*      PRINT char - печать символа                          *
;*      MOV_STR str1,str2,len - копирование строк            *
;*      MOV_STT str1_reg,str2_reg,len                        *
;*      BEEP       - звуковой сигнал                         *
;*      OPENR name,handle - открытие для чтения ( JC ERR )   *
;*      OPENW name,handle - открытие для записи ( JC ERR )   *
;*      READ handle,buffer,len,real_num - чтение ( JC ERR )  *
;*      WRIT handle,buffer,len,real_num - запись ( JC ERR )  *
;*      CLOSE handle - закpытие файла                        *
;*      CREATE file,attribut,handle - создание файла(JC ERR) *
;*      SET_PAG page - установка номера страницы для вывода  *
;*      IS_PAGE - считать номер страницы для вывода          *
;*      MODEC mode   - установка режима дисплея              *
;*      PAG page     - установка активной страницы           *
;*      IS_MODE mode,page,num - узнать текущий режим         *
;*      INIT_M       - адаптировать программы к дисплею      *
;*      CUR row,columns - позициирование курсора             *
;*      PUTC char  - вывод символа на экран в цвете          *
;*      PUTCN char,num - вывод символа несколько раз         *
;*      COLOR attrbut  - установка атрибутов символов        *
;*      FILL r0,c0,rlen,clen - закрашивание части экрана     *
;*      HEX byte - вывод байта в шестнадцатиричном виде      *
;*      NUM nnn - вывод десятичного числа (байт,слово и др.) *
;*      UP         - курсор вверх                            *
;*      DOWN       - курсор вниз                             *
;*      LEFT       - курсор влево                            *
;*      RIGHT      - курсор вправо                           *
;*      FRAME r0,c0,rlen,clen - рисование одиночной рамки    *
;*      WRITE str  - вывод строки в цвете                    *
;*      FIND name,attr - поиск файла по шаблону              *
;*      FINDR      - повторный поиск                         *
;*      CALL INI_DTA - установить свою DTA                   *
;*      CALL RET_DTA - восстановить старую DTA               *
;*      PIXEL x,y,color - установить графическую точку       *
;*      NEW size,segment,real - выделение блока памяти       *
;*      DELETE segment - освобождение блока памяти           *
;*************************************************************


Если кому интересно, могу и сам текст библиотеки сюда прилепить :dj:

Как оказалось подпрограммы управления движением курсора и вывода чисел в шестнадцатеричном и десятичном виде потом благополучно перекочевали в ShaOS будучи адаптированы под 8080, а затем и в RW1P2 (NedoPC SDK).

Период ассемблера у меня закончился после 1995 - полностью передав всю власть над моим рассудком сям с плюсами и без (за которые я засел в начале 1994 года да так больше никогда и не слезал ; )

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


Last edited by Shaos on 25 Jun 2011 15:10, edited 2 times in total.



30 Nov 2005 00:42
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Post 
Сегодня закончил адаптацию своего древнего ассемблера RASM к 8086 процессору. Программы им компилируемые выглядят необычно, но собираются в то что надо - вот к примеру программа заливания экрана EGA разноцветными горизонтальными полосками:

Code:
// TEST FOR RASM V2.0 (04.12.2005)
// ALEXANDER SHABARSHIN (SHAOS@MAIL.RU)

        ORG     #100
MAIN:
        MOV_AH, #00
        MOV_AL, #10
        INT #10

        MOV_AH, #0B
        MOV_BH, #00
        MOV_BL, #02
        INT #10

        MOV_BX, #00
        MOV_CX, #00
        MOV_DX, #00
A50:
        MOV_AH, #0C
        MOV_AL,BL
        INT #10
        INC_CX
        CMP_CX, 640
        JNZ     A50
        MOV_CX, 0
        INC_BL
        INC_DX
        CMP_DX, 350
        JNZ     A50
        RET

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


04 Dec 2005 22:24
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Post 
Shaos wrote:
Сегодня закончил адаптацию своего древнего ассемблера RASM к 8086 процессору. Программы им компилируемые выглядят необычно, но собираются в то что надо - вот к примеру программа заливания экрана EGA разноцветными горизонтальными полосками


А сегодня я адаптировал RASM (RoboAssembler v2.0 for 8080/8085/8086/8088) к 16-битному досовскому компилятору Pacific C и соответственно успешно пересобрал - тестим чего получилось:

http://shaos.ru/pub/rasm_dos.zip (18K)

RoboAssembler v2.0 (c) 1997,2002,2005 Alexander Shabarshin (shaos@mail.ru)

Сборка для 8086 с ключом -ti8086.tab (имя подключаемой таблицы кодов). Результат компиляции BIN надо переименовать в COM и оно будет работать (при условии что ORG был #100 : )

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


05 Dec 2005 21:15
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Post 
Shaos wrote:
А сегодня я адаптировал RASM (RoboAssembler v2.0 for 8080/8085/8086/8088) к 16-битному досовскому компилятору Pacific C и соответственно успешно пересобрал - тестим чего получилось:

http://shaos.ru/pub/rasm_dos.zip (18K)

RoboAssembler v2.0 (c) 1997,2002,2005 Alexander Shabarshin (shaos@mail.ru)

Сборка для 8086 с ключом -ti8086.tab (имя подключаемой таблицы кодов). Результат компиляции BIN надо переименовать в COM и оно будет работать (при условии что ORG был #100 : )


Обновил до версии 2.1, добавив новые команды в таблицу и возможность компиляции CALL_FAR segment offset и JMP_FAR segment offset:

http://shaos.ru/pub/rasm_dos.zip (18K)

RoboAssembler v2.1 (c) 1997,2002,2005 Alexander Shabarshin (shaos@mail.ru)

Исходники на чистейшем Си, собираемые как 32-битными, так и 16-битными компиляторами лежат тут:

http://shaos.ru/pub/rasm_src.zip (11K)

Общий вес исходников - всего полторы тыщи сишных строк!

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


06 Dec 2005 20:29
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Post 
Shaos wrote:
Shaos wrote:
А сегодня я адаптировал RASM (RoboAssembler v2.0 for 8080/8085/8086/8088) к 16-битному досовскому компилятору Pacific C и соответственно успешно пересобрал - тестим чего получилось:

http://shaos.ru/pub/rasm_dos.zip (18K)

RoboAssembler v2.0 (c) 1997,2002,2005 Alexander Shabarshin (shaos@mail.ru)

Сборка для 8086 с ключом -ti8086.tab (имя подключаемой таблицы кодов). Результат компиляции BIN надо переименовать в COM и оно будет работать (при условии что ORG был #100 : )


Обновил до версии 2.1, добавив новые команды в таблицу и возможность компиляции CALL_FAR segment offset и JMP_FAR segment offset:

http://shaos.ru/pub/rasm_dos.zip (18K)

RoboAssembler v2.1 (c) 1997,2002,2005 Alexander Shabarshin (shaos@mail.ru)

Исходники на чистейшем Си, собираемые как 32-битными, так и 16-битными компиляторами лежат тут:

http://shaos.ru/pub/rasm_src.zip (11K)

Общий вес исходников - всего полторы тыщи сишных строк!


RoboAssembler v2.2 (c) 1997,2002,2005 Alexander Shabarshin (shaos@mail.ru)

Положил новую исправленную версию, которая делает правильные NEAR-варианты JMP и CALL для 8086 (у RASM они называются JMP_NEAR и CALL_NEAR). В архив с бинарником для ДОСа включен еще один пример, который показывает как работать с текстовым экраном и клавиатурой (через небольшую библиотеку подпрограмм).

http://shaos.ru/pub/rasm_dos.zip (21K)

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


08 Dec 2005 20:39
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Post 
Shaos wrote:
Shaos wrote:
Shaos wrote:
А сегодня я адаптировал RASM (RoboAssembler v2.0 for 8080/8085/8086/8088) к 16-битному досовскому компилятору Pacific C и соответственно успешно пересобрал - тестим чего получилось:

http://shaos.ru/pub/rasm_dos.zip (18K)

RoboAssembler v2.0 (c) 1997,2002,2005 Alexander Shabarshin (shaos@mail.ru)

Сборка для 8086 с ключом -ti8086.tab (имя подключаемой таблицы кодов). Результат компиляции BIN надо переименовать в COM и оно будет работать (при условии что ORG был #100 : )


Обновил до версии 2.1, добавив новые команды в таблицу и возможность компиляции CALL_FAR segment offset и JMP_FAR segment offset:

http://shaos.ru/pub/rasm_dos.zip (18K)

RoboAssembler v2.1 (c) 1997,2002,2005 Alexander Shabarshin (shaos@mail.ru)

Исходники на чистейшем Си, собираемые как 32-битными, так и 16-битными компиляторами лежат тут:

http://shaos.ru/pub/rasm_src.zip (11K)

Общий вес исходников - всего полторы тыщи сишных строк!


RoboAssembler v2.2 (c) 1997,2002,2005 Alexander Shabarshin (shaos@mail.ru)

Положил новую исправленную версию, которая делает правильные NEAR-варианты JMP и CALL для 8086 (у RASM они называются JMP_NEAR и CALL_NEAR). В архив с бинарником для ДОСа включен еще один пример, который показывает как работать с текстовым экраном и клавиатурой (через небольшую библиотеку подпрограмм).

http://shaos.ru/pub/rasm_dos.zip (21K)


RoboAssembler v2.3 (c) 1997,2002,2005,2007 Alexander A. Shabarshin

отныне обитает на SourceForge.net в составе проекта NedoPC SDK:

http://sourceforge.net/project/showfiles.php?group_id=181535

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


25 Apr 2007 19:14
Profile WWW
Fanat

Joined: 11 Mar 2007 03:57
Posts: 64
Location: 217.9.147.66
Reply with quote
Post 
Quote:
Если кому интересно, могу и сам текст библиотеки сюда прилепить


Меня интересует! Можешь выложить?


26 Jun 2008 13:48
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Post 
Craz wrote:
Quote:
Если кому интересно, могу и сам текст библиотеки сюда прилепить


Меня интересует! Можешь выложить?


Выкладываю (не прошло и трёх лет) - версия от 11 февраля 1995 года:

Code:
;*************************************************************
;*      INKEY char - ожидание нажатия клавиши                *
;*      KEYB  char - проверка на нажатие клавиши             *
;*      INPUT char - ожидание нажатия и вывод на экран       *
;*      KEYPRESSED - ожидание нажатия клавиши                *
;*      PUTP char  - вывод символа на принтер                *
;*      DISP char  - вывод символа на экран                  *
;*      STATE      - чтение состояние принтера в AH          *
;*      BUSY       - принтер занят ( JZ ZANYAT )             *
;*      CONFI - нет подтверждения от принтера (JZ NET_PODTV) *
;*      INIT       - инициализация принтера                  *
;*      PRINT char - печать символа                          *
;*      MOV_STR str1,str2,len - копирование строк            *
;*      MOV_STT str1_reg,str2_reg,len                        *
;*      BEEP       - звуковой сигнал                         *
;*      OPENR name,handle - открытие для чтения ( JC ERR )   *
;*      OPENW name,handle - открытие для записи ( JC ERR )   *
;*      READ handle,buffer,len,real_num - чтение ( JC ERR )  *
;*      WRIT handle,buffer,len,real_num - запись ( JC ERR )  *
;*      CLOSE handle - закpытие файла                        *
;*      CREATE file,attribut,handle - создание файла(JC ERR) *
;*      SET_PAG page - установка номера страницы для вывода  *
;*      IS_PAGE - считать номер страницы для вывода          *
;*      MODEC mode   - установка режима дисплея              *
;*      PAG page     - установка активной страницы           *
;*      IS_MODE mode,page,num - узнать текущий режим         *
;*      INIT_M       - адаптировать программы к дисплею      *
;*      CUR row,columns - позициирование курсора             *
;*      PUTC char  - вывод символа на экран в цвете          *
;*      PUTCN char,num - вывод символа несколько раз         *
;*      COLOR attrbut  - установка атрибутов символов        *
;*      FILL r0,c0,rlen,clen - закрашивание части экрана     *
;*      HEX byte - вывод байта в шестнадцатиричном виде      *
;*      NUM nnn - вывод десятичного числа (байт,слово и др.) *
;*      UP         - курсор вверх                            *
;*      DOWN       - курсор вниз                             *
;*      LEFT       - курсор влево                            *
;*      RIGHT      - курсор вправо                           *
;*      FRAME r0,c0,rlen,clen - рисование одиночной рамки    *
;*      WRITE str  - вывод строки в цвете                    *
;*      FIND name,attr - поиск файла по шаблону              *
;*      FINDR      - повторный поиск                         *
;*      CALL INI_DTA - установить свою DTA                   *
;*      CALL RET_DTA - восстановить старую DTA               *
;*      PIXEL x,y,color - установить графическую точку       *
;*      NEW size,segment,real - выделение блока памяти       *
;*      DELETE segment - освобождение блока памяти           *
;*************************************************************
putp    macro   putc_
        mov     ah,0
        mov     al,putc_
        mov     dx,0
        int     17h
        endm
disp    macro   disp_
        mov     ah,02
        mov     dl,disp_
        int     21h
        endm
state   macro
        mov     ah,02
        mov     dx,0
        int     17h
        endm
busy    macro
        state
        test    ah,10000000b
        endm
confi   macro
        state
        test    ah,01000000b
        endm
init    macro
        mov     ah,1
        mov     dx,0
        int     17h
        endm
print   macro   print_
        mov     al,print_
        call    pri_
        endm    ; Ошибка через флаг С
;------------ ПЕЧАТЬ СИМВОЛА ------------------------------
pri_    proc
        push    ax
pri1:   mov     ah,2   ; Проверка состояния порта принтера
        mov     dx,0
        int     17h
        test    ah,00101001b
        jnz     ex_pr1 ; Если принтер не готов то выйти
        test    ah,10000000b
        jz      pri1   ; Принтер занят
        pop     ax
        mov     ah,0   ; Печать символа
        mov     dx,0
        int     17h
        test    ah,8
        jnz     ex_pr  ; Ошибка
        clc
        ret
ex_pr1: pop     ax
ex_pr:  stc
        ret
pri_    endp
;----------- КОПИРОВАНИЕ СТРОКИ В ДРУГУЮ -----------------
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_stt macro   str1,str2,nnnn ; str1=str2
        mov     ax,ds
        mov     es,ax
        mov     si,str2
        mov     di,str1
        mov     cx,nnnn
        rep movsb
        endm
;------------ ЗВУКОВОЙ СИГНАЛ ------------------
beep    macro
        local   bee
        local   l0
        local   l1
        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
        endm
;------------ ОТКРЫТИЕ ФАЙЛА ДЛЯ ЧТЕНИЯ ------------------
openr   macro   op_file_,op_hndl_
        mov     al,0
        lea     dx,op_file_
        mov     ah,3Dh
        int     21h
        mov     op_hndl_,ax
        endm    ; Ошибка через флаг С
;------------ ОТКРЫТИЕ ФАЙЛА ДЛЯ ЗАПИСИ ------------------
openw   macro   op_file_,op_hndl_
        mov     al,1
        lea     dx,op_file_
        mov     ah,3Dh
        int     21h
        mov     op_hndl_,ax
        endm    ; Ошибка через флаг С
;------------ СОЗДАНИЕ ФАЙЛА -----------------------------
create  macro   file_,attr_,hndl_
        mov     ah,3Ch
        mov     cx,attr_
        lea     dx,file_
        int     21h
        mov     hndl_,ax
        endm    ; Ошибка через флаг С
;------------ ЗАПИСЬ В ФАЙЛ ------------------------------
writ    macro   hndl_,buff_,len_,lenr_
        mov     ah,40h
        mov     bx,hndl_
        mov     cx,len_
        lea     dx,buff_
        int     21h
        mov     lenr_,ax
        endm    ; Ошибка через флаг С
;------------ ЧТЕНИЕ ДИСКОВОЙ ЗАПИСИ ---------------------
read    macro   hndl_,buff_,len_,buffr_
        mov     bx,hndl_
        mov     ah,3Fh
        mov     cx,len_
        lea     dx,buff_
        int     21h
        mov     buffr_,ax
        endm    ; Ошибка через флаг C
;----------------- ЗАКРЫТИЕ ФАЙЛА ------------------------
close   macro   hndl_c
        mov     ah,3eh
        mov     bx,hndl_c
        int     21h
        endm
;-------- Данные для второй прерывающей программы ---
pg      db      0       ; Номер страницы видеопамяти
key     db      0       ; Признак нажатия клавиши
char    db      0       ; Код нажатой клавиши
s1      db      0       ; Вспомогательные переменные
s2      db      0
s3      db      0
s4      db      0
s5      db      0
atr     db      15      ; Атрибуты символов
leng    db      0       ; Длина выведенной строки
rrr     db      0       ; Переменные для работы FILL и FRAME
ccc     db      0
rrl     db      0
ccl     db      0
;---------- МАКРОСЫ ДЛЯ РАБОТЫ С ЭКРАНОМ -----------------
modec   macro   mmm
        mov     al,mmm
        mov     ah,0
        int     10h
        endm
pag     macro   ppp
        mov     al,ppp
        mov     ah,5
        int     10h
        endm
is_mode macro   mmm,ppp,nnn
        mov     ah,0Fh
        int     10h
        mov     nnn,ah
        mov     mmm,al
        mov     ppp,bh
        endm
init_m  macro
        is_mode  bl,bl,bl
        set_pag bl
        endm
set_pag macro   ppp
        mov     ah,ppp
        call    spg_
        endm
is_page macro   ppp
        call    pg_
        mov     ppp,ah
        endm
cur     macro   r,c     ; Установка курсора
        is_page bh
        mov     ah,2
        mov     dh,r
        mov     dl,c
        int     10h
        endm
putc    macro   pp      ; Вывод символа
        putcn   pp,1
        endm
putcn   macro   pp,nn   ; Вывод символа несколько раз
        mov     al,pp
        is_page bh
        mov     ah,9
        mov     bl,atr
        mov     cl,nn
        mov     ch,0
        int     10h
        endm
color   macro   aa      ; Установка атрибутов символов
        mov     atr,aa
        endm
up      macro           ; Сдвиг курсора вверх
        mov     ah,255
        mov     al,0
        move_
        endm
down    macro           ; Сдвиг курсора вниз
        mov     ah,1
        mov     al,0
        move_
        endm
left    macro           ; Сдвиг курсора влево
        mov     ah,0
        mov     al,255
        move_
        endm
right   macro           ; Сдвиг курсора вправо
        mov     ah,0
        mov     al,1
        move_
        endm
frame   macro   r0,c0,ro,co ; Рисование рамки
        mov     cs:rrr,r0
        mov     cs:ccc,c0
        mov     cs:rrl,ro
        mov     cs:ccl,co
        call    frame_
        endm
write   macro   stt     ; Вывод строки на экран
        lea     dx,stt
        call    prs_
        endm
inkey   macro   char ; Ожидание нажатия клавиши
        mov     ah,7
        int     21h
        mov     char,al
        endm
keypressed macro ; Ожидание нажатия любой клавиши
           inkey al
           endm
keyb    macro   char,key ; Проверка на нажатие клавиши
        local   no_chr
        local   endk
        mov     ah,6
        mov     dl,0FFh
        int     21h
        jz      no_chr
        mov     char,al
        jmp     endk
no_chr: mov     char,0FFh
endk:   nop
        endm
input   macro   char,key ; Ожидание и вывод на экран
        mov     ah,1
        int     21h
        mov     char,al
        endm
fill    macro   rr,cc,rl,cl  ; Закрашивание части экрана
        local   f0,f00
        local   rrl,rrr
        jmp     f00
rrl     db      0
rrr     db      0
f00:    mov     al,rr
        mov     cs:rrr,al
        mov     al,rl
        mov     cs:rrl,al
f0:     cur     rrr,cc
        putcn   219,cl
        inc     cs:rrr
        dec     cs:rrl
        jnz     f0
        endm
move_   macro   ; Сдвиг курсора
        push    ax
        is_page bh
        mov     ah,3
        int     10h
        pop     ax
        add     ah,dh
        add     al,dl
        mov     dx,ax
        is_page bh
        mov     ah,2
        int     10h
        endm
frame_  proc        ; Рисование рамки
        push    ds
        mov     ax,cs
        mov     ds,ax
        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
        pop     ds
        ret
frame_  endp
prs_    proc        ; Вывод строки на экран
        mov     cs:leng,0
        mov     si,dx
prr:    mov     al,[si]
        inc     si
        inc     cs:leng
        cmp     al,0
        je      eee
        putc    al
        right
        jmp     prr
eee:    ret
prs_    endp
pg_     proc
        mov     ah,cs:pg
        ret
pg_     endp
spg_    proc
        mov     cs:pg,ah
        ret
spg_    endp
;============ МАКРОСЫ ДЛЯ РАБОТЫ С ФАЙЛАМИ ===============
;--------------- ПОИСК ФАЙЛА ПО ШАБЛОНУ ------------------
find    macro   fil,a_a
        mov     ah,4Eh  ; Функция поиска
        lea     dx,fil
        mov     cx,a_a  ; Атрибут
        int     21h
        endm
;------------ ПОВТОРНЫЙ ПОИСК ФАЙЛА ПО ШАБЛОНУ -----------
findr   macro
        mov     ah,4Fh  ; Функция повторного поиска
        int     21h
        endm
;------------ ПЕРЕМЕННЫЕ ДЛЯ РАБОТЫ С ФАЙЛАМИ ------------
disk    db      'C:\',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
        push    es
        mov     ah,2Fh  ; Выдача буфера DTA
        int     21h     ;   в ES:BX
        mov     cs:dta_o,bx ; Запоминание старого DTA
        mov     cs:dta_o2,es
        mov     dx,offset dta
        push    ds
        mov     ax,cs
        mov     ds,ax
        mov     ah,1Ah  ; Установка буфера DTA
        int     21h     ;   из DS:DX
        pop     ds
        pop     es
        ret
ini_dta endp
;------------ ВОЗВРАЩЕНИЕ СТАРОЙ DTA ---------------------
ret_dta proc
        push    ds
        mov     dx,cs:dta_o ; Восстановление старого DTA
        mov     ds,cs:dta_o2
        mov     ah,1Ah   ; Установка буфера DTA
        int     21h
        pop     ds
        ret
ret_dta endp
;------------ ОПРЕДЕЛЕНИЕ ТЕКУЩЕГО ДИСКА -----------------
disk_   proc
        mov     ah,19h
        int     21h
        mov     cs:driv,al
        add     al,65
        mov     byte ptr cs:disk,al
        ret
disk_   endp
;-------------- ГРАФИКА ----------------------------------
pixel   macro   xx,yy,cc
        is_page bh
        mov     ah,12
        mov     dx,yy
        mov     cx,xx
        mov     al,cc
        int     16
        endm
;------------- ВЫДЕЛЕНИЕ БЛОКА ПАМЯТИ --------------------
new     macro   siz_,seg_,reals_
        mov     bx,siz_
        mov     ah,48h
        int     21h
        mov     seg_,ax
        mov     reals_,bx
        endm
;------------- ОСВОБОЖДЕНИЕ БЛОКА ПАМЯТИ -----------------
delete  macro   seg_
        push    es
        mov     es,seg_
        mov     ah,49h
        int     21h
        pop     es
        endm
;------------ ВЫВОД БАЙТА В ШЕСТНАДЦАТИРИЧНОМ ВИДЕ ------
hex     macro   byte_
        mov     ah,byte_
        mov     al,ah
        and     ah,0F0h
        mov     cl,4
        shr     ah,cl
        and     al,0Fh
        push    ax
        call    hex0
        right
        pop     ax
        mov     ah,al
        call    hex0
        right
        endm
;------------ ПОДПРОГРАММА ВЫВОДА ПОЛУБАЙТА --------------
hex0    proc
        cmp     ah,0Ah
        jae     h_0
        add     ah,30h
        jmp     h_1
h_0:    add     ah,37h
h_1:    putc    ah
        ret
hex0    endp
;----------- ВЫВОД ДЕСЯТИЧНОГО ЧИСЛА ----------------------
www0    dw      0
www1    dw      0
nnnn    db      10 dup(0)
num     macro   nnn
        local   num_0
        local   num_1
        local   num_2
        local   num_e
        mov     cx,type nnn
        lea     bx,nnn
        cmp     cx,1
        jne     num_0
        call    num1
        jmp     num_e
num_0:  cmp     cx,2
        jne     num_1
        call    num2
        jmp     num_e
num_1:  cmp     cx,4
        jne     num_2
        call    num4
        jmp     num_e
num_2:  nop
num_e:  nop
        endm
;-------------- ВЫВОД БАЙТА -----------------------
num1    proc
        mov     al,[bx]
        mov     ah,0
        lea     bx,nnnn
        call    num_
        ret
num1    endp
;-------------- ВЫВОД СЛОВА -----------------
num2    proc
        mov     al,[bx]
        inc     bx
        mov     ah,[bx]
        test    ax,8000h
        jz      num2_0
        neg     ax
        push    ax
        putc    '-'
        right
        pop     ax
num2_0: lea     bx,nnnn
        call    num_
        ret
num2    endp
;-------------- ВЫВОД ЧИСЛА -----------------------
num_    proc
num1_0: mov     dh,10
        div     dh
        add     ah,30h
        mov     cs:[bx],ah
        mov     ah,0
        inc     bx
        cmp     al,0
        jne     num1_0
num1_1: dec     bx
        push    bx
        putc    cs:[bx]
        right
        pop     bx
        lea     cx,nnnn
        cmp     bx,cx
        jne     num1_1
        ret
num_    endp
;-------------- ВЫВОД ДВ.СЛОВА --------------
num4    proc

        ret
num4    endp


P.S. В rasm при переписывании на си что-то сломалось - он метки назад не разруливает - в ближайшее время исправлю...

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


30 May 2011 18:08
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Shaos wrote:
Craz wrote:
Quote:
Если кому интересно, могу и сам текст библиотеки сюда прилепить

Меня интересует! Можешь выложить?


Выкладываю (не прошло и трёх лет) - версия от 11 февраля 1995 года:


Так к пеньсии ты и Виндовс свой напишешь...! :lol:


31 May 2011 11:16
Profile
Junior

Joined: 03 May 2017 10:09
Posts: 1
Reply with quote
Тема с 8086\88 на данный момент не блещет ренессаном. В форумах идет только покупка\продажа тушек и потрошков. А что дальше? Машинки на руках есть, а нового софта - нет?
На синклерах кто-то засел и сделал порт Monty, пишут демосцены (не люблю демосцены, но не суть). Здесь же полная тишина.
Но в чем причина, я так и не понял. Про несовместимость клонов аргумент показался неубедительным.
Принц персии же везде идет. Если брать стандарт 8Мгц, 640кб памяти и видеорежим 320х200х256, DOS 6.22 разве не будет совместимости?
Может быть сама идеология мертва? Для чего тогда создавались новодельные интерфейсы IDE?
Чтобы запустить чекит и тестануть производительность?
На данный момент даже и сборки можно проводить на быстрых машинах. Кто-то может подтвердить или опровергнуть дохлость пациента?
Ну и несколько вопросов:
На чем, собственно, что-то писать под 8088? В DOS-Box или сразу на самой машине...
К слову, на самой машине у меня нормально не завелись ни TP 7.0 (нет создания EXE) ни TASM 5.1 (tlink - divide overflow)
Сталкивался с Бейсиком, Турбо Паскалем. Работа модуля Graph по скорости и размер получаемого кода как-то не вдохновили. Паскаль рисует линию, а размер игры Диггер. И все медленно получается.

С другой стороны, ASM тоже сложноват. Много писанины. Функций нет. Случайное число, вывод чисел (не символов) - ничего нет. Столкнулся тут с какой-то ерундой,что метка от перехода должна быть не дальше 127 байт по коду. Все это как-то отвлекает от мыслей. Но скорость, конечно, радует.
Какой выход? MASM c макросами? А есть тот, который под DOS и под 16 бит? Где брать к нему набор библиотек типа IO итд?


03 May 2017 10:57
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
обнаружил неодобренное майское сообщение :o

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


18 Oct 2017 21:44
Profile WWW
Doomed
User avatar

Joined: 05 Nov 2007 05:08
Posts: 487
Location: Украина
Reply with quote
fasm


19 Oct 2017 02:26
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
nasm ;)

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


24 Oct 2017 05:30
Profile WWW
Maniac

Joined: 18 Nov 2013 15:15
Posts: 209
Location: все оттуда ;)
Reply with quote
Есть подтверждённые слухи о скором допиливании masm64 !


24 Oct 2017 10:32
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 14 posts ] 

Who is online

Users browsing this forum: No registered users and 5 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.