С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Исправил все RST1, разобрался с токенами. Начинаю ковыряться в процедурах работы с плавающей точкой.
Последний раз редактировалось demetrius2003; 19.04.2014 в 20:40.
Новая порция. Теперь только HTML и LST файлы. Откомментированы следующие операторы Бейсика: PSET, PRESET, POKE, PEEK, CLS, COLOR, SCREEN, LINE. Посмотрите, как красив COLOR! Вообще дизассемблирование этого ПЗУ приносит некоторое удовольствие. Уместить такое в 16 кБ кода! Это вам не дистрибутив винды в 4ГБ! Ну, и первые же комментарии дали свои плоды. Вот, к примеру, как нарисовать линию из машинного кода:
Так что не стесняемся, набираем дамп с адреса &h5000, даём команду x=usr(&h5000) и лицезреем линию.Код:org 5000h 5000 3E 02 mvi a,2 ;режим 2 5002 CD 6D 28 call 286dh ;call SETMODE2 5005 CD C6 17 call 17c6h ;call CLS 5008 21 8F FD lxi h, 0fd8fh ;адрес PSETC 500B 3E 07 mvi a,7 ;заносим в А 7 цвет 500D 77 mov m, a ;в переменную PSETC записываем 7 цвет 500E 23 inx h ;теперь HL=X1 500F 3E 0A mvi a,10 ;первая точка будет с координатами (10,10) 5011 77 mov m, a ;X1=10 5012 23 inx h ;теперь HL=Y1 5013 77 mov m, a ;Y1=10 5014 3E 14 mvi a,20 ;вторая точка будет с координатами (20,20) 5016 23 inx h ;теперь HL=X2 5017 77 mov m, a ;X2=20 5018 23 inx h ;теперь HL=Y2 5019 77 mov m, a ;Y2=20 501A CD 08 19 call 1908h ;call LINE_ASM 501D C3 1D 50 l: jmp l Labels: l 501D Memory dump: 5000: 3E 02 CD 6D 28 CD C6 17-21 8F FD 3E 07 77 23 3E >..m(...!..>.w#> 5010: 0A 77 23 77 3E 14 23 77-23 77 CD 08 19 C3 1D 50 .w#w>.#w#w.....P
Последний раз редактировалось demetrius2003; 19.04.2014 в 20:40.
Пока с данной работой затишье. И ещё на недельку это затишье продлится. Связано это с тем, что сел я на SAP R3 и пока не въеду в него, остальное не имеет смысла. А пока вот бонус - Однопроходовый кроссассемблер.
Им я компилю примерчики. Если кто посмотрит, отбетатестирует, буду благодарен.
Итак:
Все числа - шестнадцатеричные.
Если параметр не может быть переведён в шестнадцатеричное число, то он считается меткой.
Директивы:
DB <байт>
DW <слово>
DS <строка> (между DS и собственно строкой - 1 символ, и лучше чтобы это был пробел)
END бросаем всё и уходим отсюда
Пользоваться просто:
onepassa <имя.asm> <имя.bin> <ORG>
Все параметры обязательны! ORG - шестнадцатеричный!
Спецсимволы:
Пробел и табуляция - игнорируются
Точка с запятой - справа от неё идёт комментарий
Двоеточие - слева от неё идёт имя метки
Что-то наверняка забыл. Что-то как всегда глючит. Писалось в три захода в течении обеденных перерывов.
Работает. В архиве - сырок.
видимо из за отсутствующих параметровКод:artyr@Suxoy:~/asm/tmp1$ gcc onepassa.c onepassa.c: В функции «main»: onepassa.c:124:7: предупреждение: format «%s» expects argument of type «char *», but argument 3 has type «char **» [-Wformat] onepassa.c:132:4: предупреждение: format «%s» expects argument of type «char *», but argument 3 has type «char **» [-Wformat] onepassa.c:270:5: предупреждение: format «%s» expects argument of type «char *», but argument 2 has type «char **» [-Wformat] onepassa.c:298:5: предупреждение: format «%s» expects argument of type «char *», but argument 3 has type «char **» [-Wformat] onepassa.c:304:5: предупреждение: format «%s» expects argument of type «char *», but argument 3 has type «char **» [-Wformat] artyr@Suxoy:~/asm/tmp1$ ls a.out onepassa.c artyr@Suxoy:~/asm/tmp1$ ./a.out OnePassA v.01 Ошибка сегментирования
содержимое test.asm
Код:jmp start start: mov a,h end
Код:artyr@Suxoy:~/asm/tmp1$ ./a.out ? OnePassA v.01 Usage: onepassa <INFILENAME> <OUTFILENAME> <HEXORG> artyr@Suxoy:~/asm/tmp1$ ./a.out test.asm test.bin 100 OnePassA v.01 ORG=256 (&h100) Ошибка сегментирования artyr@Suxoy:~/asm/tmp1$
Последний раз редактировалось artyr_n; 09.04.2014 в 17:11.
Вектор 06Ц
ЮТ-88 в минимальной конфигурации
Вектор 06Ц 2014 сборка платы
ATARI 65XE+USB SIO2PC
Commodore 64 ремонт
Нет. Это не из-за отсутствующих параметров. Это из-за того, что Вы собираете под gcc. У меня прожка скомпилена Turbo C 2.0. Там всё ОК. Версия, которая собирается под MinGW (а, следовательно, соберётся и под gcc) есть, но на работе. Завтра выложу.
Вот версия, которая компилится и под Turbo C и под MinGW (gcc версии 4.2.1-sjlj (mingw32-2)). Собственно отличие в том, что gcc не переваривает конструкции типа:
В Turbo C всё хорошо, а вот gcc этот код компилит, но при выполнении всё крашится.Код:strcpy((char *)tLab[i].Lab, 0x00);
Также исправил некоторые моменты и мелкие ошибки типа getc вместо fgetc и т. д.
В архиве сырок и дла exe 16 и 32 бит.
Доброго дня!
Ещё немного работы. На сей раз разобрал и дополнил следующие операторы и функции: AUTO, RUN, GOTO, RETURN, DATA, REM, CONT, STOP, RESTORE, STRIG, STICK, END, CSRLIN, LLIST, LPRINT, POS. Комментирование некоторых из них пока поверхностное, т.к. многие уходят далеко в главные циклы интерпретарора. Там много неясностей и неизвестностей. К примеру, процедуры из ряда MAINLOOP и AUTOTR очень разнообразны, поэтому дополнять их буду по мере продвижения вперёд. Так же продолжаю ковырять плавающую точку и её форматы. Разобрал принцип работы операторов. Он вкратце таков:
- во входной точке в процедуру имеем следующее состояние регистров:
На примере команды AUTO:
A - первый байт первого параметра и ноль, если параметров нет
BC=PC - адрес обрабатываемой команды (расположение её в ПЗУ - AUTO)
DE - адрес обрабатываемой команды в таблице команд + 1 (_AUTO + 1)
HL - адрес буфера ввода-вывода + 2 (IOBUF+2)
SP - стек
Иногда возврат в главный цикл происходит просто по команде из разряда jmp MAINLOOP3, иногда адрес возврата явно ложится на стек, иногда возврат осуществляется штатно командой ret. Очень много "двойного" кода, когда трёхбайтовая команда одновременно является двух или однобайтовой, если сделать jmp на её начало+1 байт (или начало+2 байта соответственно), о чём уже упоминалось.
Самый лакомый кусок - научится работать с плавающей точкой из машинного кода. Как только разберу форматы чисел, так сразу приступлю к функциям типа SIN, COS. На этом пока всё. Общий объём работы оцениваю как примерно 40-45 процентов.
Последний раз редактировалось demetrius2003; 19.04.2014 в 20:40.
С большим интересом жду разбора плавающеточечных процедур.
Под конец рабочей недели как всегда кусочек нового. Разобрал и дополнил функции: (тут должен быть списочек, но бумаженция зашкерилась где-то на работе, посему будет попозже).
Кода откомментировано и разобрано/исправлено очень много. В основном это дебри интерпретатора. Но это надо пройти! Это вносит ясность. Не смотря на то, что свой минимум я отработал (плавающая точка сдалась, графика и ввод-вывод есть), я пойду до конца и откомменчу всё ПЗУ.
На десерт - сладкое. Пример работы с плавающей точкой из ассемблера.
Пояснения по коду. Обратите внимание, как неудобно написан код. Перед тем как вызвать процедуру FPUSH мы сохраняем на стек адрес, куда надо будет вернуться после того, как отработает FADD, а саму процедуру FADD вызываем не через CALL, а через JMP. Связано это вот с чем. Если просто сделать CALL FPUSH, а затем тут же CALL FADD, то второй CALL положит на стек в дополнение к числу с плавающей точкой адрес возврата (в нашем случае cnt1), а потом внутри FADD произойдёт снятие верхушки стека, которое интерпретатор посчитает числом с плавающей точкой, что конечно же неверно. Мало того что числа не сложатся, мы ещё и вернёмся вникуда по адресу, который суть оставшаяся часть числа с плавающей точкой. В этом интерпретаторе всё сделано именно таким образом. Это удобно для интерпретации, но неприемлемо для программиста на ассемблере. Поэтому с сегодняшнего для я буду вести Вордовский документ, в котором буду описывать примеры программирования на ассемблере и вообще писать заметки по архитектуре Суры. Для этого в дизассемблерный листинг я буду дополнительно вводить фиктивные метки с суффиксом _ASM. Для самого интерпретатора они не нужны, а вот нам - очень даже пригодятся. В большинстве случаев они будут расположены глубоко внутри процедур и функций, но вызывая их мы будем иметь более компактный и более понятный код. Ведь всё-таки процедуры ПЗУ заточены под Бейсик-интерпретатор. Но, не смотря на это, в ПЗУ очень много кусочков кода, используя которые мы сможем сильно упростить себе программирование! В результате должна получить брошюра, в которой будет всё, что нужно для полноценной писанины на ассемблере под ПК8000.Код:org 5000h 5000 21 22 50 lxi h, num1; грузим в HL адрес строки с первым числом 5003 CD C6 13 call 0x13c6; FIN - переводим строку в FACCUM 5006 21 16 50 lxi h, cnt1; запоминаем на стеке адрес, куда надо вернуться после сложения чисел 5009 E5 push h 500A CD F2 12 call 0x12f2; FPUSH - толкаем первое число на стек 500D 21 2A 50 lxi h, num2; грузим в HL адрес строки со вторым числом 5010 CD C6 13 call 0x13c6; FIN - переводим его в FACCUM 5013 C3 4C 14 jmp 0x144c; FADD - складываем FACCUM и BCDEONSTK, результат остаётся в FACCUM 5016 CD 70 14 cnt1: call 0x1470; FOUT - выводим FACCUM в строку (буфер строки расположен в FBUFFER) 5019 21 3D F9 lxi h, 0xf93d; FBUFFER 501C 3E 02 mvi a, 2; выводим строку с текущего положения 501E CD 50 00 call 0x0050; TRETLINE - печатаем содержимое FBUFFER 5021 C9 ret 5022 31 2E 32 33 num1 db "1.234E2" . . . 5026 34 45 32 5029 00 db 0x0 502A 33 2E 36 35 num2 db "3.654E1" . . . 502E 34 45 31 5031 00 db 0x0 Labels: cnt1 5016num1 5022num2 502A Memory dump: 5000: 21 22 50 CD C6 13 21 16-50 E5 CD F2 12 21 2A 50 !"P...!.P....!*P 5010: CD C6 13 C3 4C 14 CD 70-14 21 3D F9 3E 02 CD 50 ....L..p.!=.>..P 5020: 00 C9 31 2E 32 33 34 45-32 00 33 2E 36 35 34 45 ..1.234E2.3.654E 5030: 31 00 - 1...............
Последний раз редактировалось demetrius2003; 06.05.2014 в 09:11.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)