|
nedoPC.orgCommunity for electronics hobbyists, established in 2002 |
|
|
Page 1 of 1
|
[ 15 posts ] |
|
Author |
Message |
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23282 Location: Silicon Valley
|
Так получилось, что после очень недолгого периода возюканья с паскалем, году эдак в 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 - освобождение блока памяти * ;*************************************************************
| | | | |
Если кому интересно, могу и сам текст библиотеки сюда прилепить Как оказалось подпрограммы управления движением курсора и вывода чисел в шестнадцатеричном и десятичном виде потом благополучно перекочевали в ShaOS будучи адаптированы под 8080, а затем и в RW1P2 (NedoPC SDK). Период ассемблера у меня закончился после 1995 - полностью передав всю власть над моим рассудком сям с плюсами и без (за которые я засел в начале 1994 года да так больше никогда и не слезал ; )
Last edited by Shaos on 25 Jun 2011 15:10, edited 2 times in total.
|
30 Nov 2005 00:42 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23282 Location: Silicon Valley
|
Сегодня закончил адаптацию своего древнего ассемблера 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
| | | | |
|
04 Dec 2005 22:24 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23282 Location: Silicon Valley
|
А сегодня я адаптировал RASM (RoboAssembler v2.0 for 8080/8085/8086/8088) к 16-битному досовскому компилятору Pacific C и соответственно успешно пересобрал - тестим чего получилось: RoboAssembler v2.0 (c) 1997,2002,2005 Alexander ShabarshinСборка для 8086 с ключом -ti8086.tab (имя подключаемой таблицы кодов). Результат компиляции BIN надо переименовать в COM и оно будет работать (при условии что ORG был #100 : )
|
05 Dec 2005 21:15 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23282 Location: Silicon Valley
|
Обновил до версии 2.1, добавив новые команды в таблицу и возможность компиляции CALL_FAR segment offset и JMP_FAR segment offset: RoboAssembler v2.1 (c) 1997,2002,2005 Alexander ShabarshinИсходники на чистейшем Си, собираемые как 32-битными, так и 16-битными компиляторами лежат тут: С июня 2018 года https://gitlab.com/nedopc/sdk/-/tree/master/rasmОбщий вес исходников - всего полторы тыщи сишных строк!
|
06 Dec 2005 20:29 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23282 Location: Silicon Valley
|
RoboAssembler v2.2 (c) 1997,2002,2005 Alexander ShabarshinПоложил новую исправленную версию, которая делает правильные NEAR-варианты JMP и CALL для 8086 (у RASM они называются JMP_NEAR и CALL_NEAR). В архив с бинарником для ДОСа включен еще один пример, который показывает как работать с текстовым экраном и клавиатурой (через небольшую библиотеку подпрограмм).
|
08 Dec 2005 20:39 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23282 Location: Silicon Valley
|
RoboAssembler v2.3 (c) 1997,2002,2005,2007 Alexander A. Shabarshinотныне обитает на SourceForge.net в составе проекта NedoPC SDK: http://sourceforge.net/project/showfiles.php?group_id=181535А с июня 2018 года - на GitLab: https://gitlab.com/nedopc/sdk/-/tree/master/rasm
|
25 Apr 2007 19:14 |
|
|
Craz
Fanat
Joined: 11 Mar 2007 03:57 Posts: 64 Location: 217.9.147.66
|
Меня интересует! Можешь выложить?
|
26 Jun 2008 13:48 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23282 Location: Silicon Valley
|
Выкладываю (не прошло и трёх лет) - версия от 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 при переписывании на си что-то сломалось - он метки назад не разруливает - в ближайшее время исправлю...
|
30 May 2011 18:08 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Так к пеньсии ты и Виндовс свой напишешь...!
|
31 May 2011 11:16 |
|
|
zyxel
Junior
Joined: 03 May 2017 10:09 Posts: 1
|
Тема с 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 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23282 Location: Silicon Valley
|
обнаружил неодобренное майское сообщение
|
18 Oct 2017 21:44 |
|
|
shoorick
Doomed
Joined: 05 Nov 2007 05:08 Posts: 487 Location: Украина
|
fasm
|
19 Oct 2017 02:26 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23282 Location: Silicon Valley
|
nasm
|
24 Oct 2017 05:30 |
|
|
VGrad
Maniac
Joined: 18 Nov 2013 15:15 Posts: 208 Location: все оттуда ;)
|
Есть подтверждённые слухи о скором допиливании masm64 !
|
24 Oct 2017 10:32 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23282 Location: Silicon Valley
|
Исправил багу в RASM, из-за которой в некоторых случаях съедались метки, после которых шли пустые строки либо строки с комментариями: RoboAssembler v2.6.2 (c) 1997-2024 Alexander A. Shabarshin <me@shaos.net>Досовские сборки версии 2.6.2 приаттачиваю прямо сюда: В архиве также есть тесты для 8080 и 8086 ассемблеров, причём TEST86.A собирается во вполне работоспособную программку TEST86.COM TEST86.A: | | | | Code: // TEST FOR RASM V2.0 (04.12.2005)
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
| | | | |
P.S. Совсем забыл про существование второго теста для 8086, который я подготовил ещё в 2005 году и распространял с версией 2.2: Перезалил архив - забирайте... TEST86A TEST86A.A: SCR.A: | | | | Code: \ SCREEN SUBPROGRAMS FOR RASM 8086 \ ================================ \ current videomode scr_video DB 0 \ current videopage scr_page DB 0 \ saved videomode scr_sv DB 0 \ saved videopage scr_sp DB 0 \ number of chars in line scr_width DB 0 \ attributes of character scr_attr DB 15 \ for FILL and FRAME scr_r DB 0 scr_c DB 0 scr_rl DB 0 scr_cl DB 0 \ temporary variables scr_1 DB 0 scr_2 DB 0 scr_3 DB 0 \ VMODE - set video mode \ AL - videomode \ Use: AH VMODE: MOV_AH, 0 INT #10 RET \ VPAGE - set video page \ AL - videopage \ Use: AH VPAGE: MOV_AH, 5 INT #10 RET \ VIDEO - check videomode \ Return: \ AL - video mode \ AH - number of symbols in line \ BH - video page VIDEO: MOV_AH, 15 INT #10 MOV_MB,AH scr_width MOV_MB,AL scr_video MOV_MB,BH scr_page RET \ SETVID - set videmode and page \ AL - videomode \ AH - videopage SETVID: PUSH_BX PUSH_AX PUSH_AX CALL_NEAR VIDEO MOV_AL,MB scr_video MOV_MB,AL scr_sv MOV_AL,MB scr_page MOV_MB,AL scr_sp POP_AX CALL_NEAR VMODE POP_AX MOV_AL,AH CALL_NEAR VPAGE CALL_NEAR VIDEO POP_BX RET \ RETVID - return old video back \ scr_video - videomode \ scr_page - videopage RETVID: MOV_AL,MB scr_sv CALL_NEAR VMODE MOV_AL,MB scr_sp CALL_NEAR VPAGE RET \ CUR - set cursor \ AH - col \ AL - row CUR: PUSH_BX PUSH_DX MOV_BH,MB scr_page MOV_DH,AL MOV_DL,AH MOV_AH, 2 INT #10 POP_DX POP_BX RET \ PUTC - write character \ AL - character PUTC: PUSH_AX MOV_AH, 1 CALL_NEAR PUTCN POP_AX RET \ PUTCN - write character N times \ AL - character \ AH - number of times PUTCN: PUSH_BX PUSH_CX MOV_CH, 0 MOV_CL,AH MOV_BH,MB scr_page MOV_BL,MB scr_attr MOV_AH, 9 INT #10 POP_CX POP_BX RET \ UP - cursor up UP: PUSH_AX MOV_AH, #FF MOV_AL, #00 CALL_NEAR MOVE POP_AX RET \ DOWN - cursor down DOWN: PUSH_AX MOV_AH, #01 MOV_AL, #00 CALL_NEAR MOVE POP_AX RET \ LEFT - cursor left LEFT: PUSH_AX MOV_AH, #00 MOV_AL, #FF CALL_NEAR MOVE POP_AX RET \ RIGHT - cursor right RIGHT: PUSH_AX MOV_AH, #00 MOV_AL, #01 CALL_NEAR MOVE POP_AX RET \ MOVE - move cursor \ AH - up <0 down >0 \ AL - left <0 right >0 MOVE: PUSH_BX PUSH_DX PUSH_AX MOV_BH,MB scr_page MOV_AH, 3 INT #10 POP_AX ADD_AH,DH ADD_AL,DL MOV_DX,AX MOV_BH,MB scr_page MOV_AH, 2 INT #10 POP_DX POP_BX RET \ WRITE - write string \ SI - address of string \ Return: \ scr_leng - length of string WRITE: PUSH_AX WRITER: MOV_AL,[SI] INC_SI CMP_AL, 0 JE WRITEE CALL_NEAR PUTC CALL_NEAR RIGHT JMP WRITER WRITEE: POP_AX RET \ FILL - fill rectangle \ scr_attr - attributes \ scr_c - column \ scr_r - row \ scr_cl - length by columns \ scr_rl - length by rows FILL: MOV_AL,MB scr_r MOV_MB,AL scr_1 MOV_AL,MB scr_rl MOV_MB,AL scr_2 FILL0: MOV_AH,MB scr_c MOV_AL,MB scr_1 CALL_NEAR CUR MOV_AH,MB scr_cl MOV_AL, 32 CALL_NEAR PUTCN INC_MB scr_1 DEC_MB scr_2 JNZ FILL0 RET \ FRAME - draw frame \ scr_c - column \ scr_r - row \ scr_cl - length by columns \ scr_rl - length by rows FRAME: PUSH_AX MOV_AH,MB scr_cl DEC_AH ADD_AH,MB scr_c MOV_MB,AH scr_3 MOV_AH,MB scr_c MOV_AL,MB scr_r CALL_NEAR CUR MOV_AL, #C9 CALL_NEAR PUTC CALL_NEAR RIGHT DEC_MB scr_cl DEC_MB scr_cl DEC_MB scr_rl DEC_MB scr_rl MOV_AH,MB scr_cl MOV_AL, #CD CALL_NEAR PUTCN MOV_AH,MB scr_3 MOV_AL,MB scr_r CALL_NEAR CUR MOV_AL, #BB CALL_NEAR PUTC FRAME1: INC_MB scr_r MOV_AH,MB scr_c MOV_AL,MB scr_r CALL_NEAR CUR MOV_AL, #BA CALL_NEAR PUTC MOV_AH,MB scr_3 MOV_AL,MB scr_r CALL_NEAR CUR MOV_AL, #BA CALL_NEAR PUTC DEC_MB scr_rl JNZ FRAME1 MOV_AH,MB scr_r ADD_AH,MB scr_rl INC_AH MOV_MB,AH scr_2 MOV_AH,MB scr_c MOV_AL,MB scr_2 CALL_NEAR CUR MOV_AL, #C8 CALL_NEAR PUTC CALL_NEAR RIGHT MOV_AH,MB scr_cl MOV_AL, #CD CALL_NEAR PUTCN MOV_AH,MB scr_3 MOV_AL,MB scr_2 CALL_NEAR CUR MOV_AL, #BC CALL_NEAR PUTC POP_AX RET
| | | | |
KAY.A:
|
06 Jul 2024 18:53 |
|
|
|
Page 1 of 1
|
[ 15 posts ] |
|
Who is online |
Users browsing this forum: No registered users and 0 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
|
|