Важная информация

User Tag List

Страница 4 из 7 ПерваяПервая 1234567 ПоследняяПоследняя
Показано с 31 по 40 из 70

Тема: ПК8000 - Уточнённое описание архитектуры и программ.

  1. #31
    R.I.P.
    Регистрация
    16.09.2009
    Адрес
    г. Харьков
    Сообщений
    1,466
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    4
    Поблагодарили
    4 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от DemonId7 Посмотреть сообщение
    Взял bios с эмулятора. В иде "отобразил" его на адресное пространство в 64 кб, как и на настоящей машине. Код, который при инициализации переносится из биоса в ОЗУ, переносил макросами самой иды. Макросы в аттаче, сразу как то забыл про них.
    Вложение 47089
    в иде стандартно есть idc\memcpy.idc
    оно спрашивает From, To, Size
    удобно

  2. #31
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #32
    Member Аватар для demetrius2003
    Регистрация
    29.09.2010
    Адрес
    Новокузнецк
    Сообщений
    156
    Спасибо Благодарностей отдано 
    3
    Спасибо Благодарностей получено 
    9
    Поблагодарили
    6 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Исправил все RST1, разобрался с токенами. Начинаю ковыряться в процедурах работы с плавающей точкой.
    Последний раз редактировалось demetrius2003; 19.04.2014 в 20:40.

  4. #33
    Member Аватар для demetrius2003
    Регистрация
    29.09.2010
    Адрес
    Новокузнецк
    Сообщений
    156
    Спасибо Благодарностей отдано 
    3
    Спасибо Благодарностей получено 
    9
    Поблагодарили
    6 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Новая порция. Теперь только HTML и LST файлы. Откомментированы следующие операторы Бейсика: PSET, PRESET, POKE, PEEK, CLS, COLOR, SCREEN, LINE. Посмотрите, как красив COLOR! Вообще дизассемблирование этого ПЗУ приносит некоторое удовольствие. Уместить такое в 16 кБ кода! Это вам не дистрибутив винды в 4ГБ! Ну, и первые же комментарии дали свои плоды. Вот, к примеру, как нарисовать линию из машинного кода:

    Код:
    	                 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
    Так что не стесняемся, набираем дамп с адреса &h5000, даём команду x=usr(&h5000) и лицезреем линию.
    Последний раз редактировалось demetrius2003; 19.04.2014 в 20:40.

  5. #34
    Member Аватар для demetrius2003
    Регистрация
    29.09.2010
    Адрес
    Новокузнецк
    Сообщений
    156
    Спасибо Благодарностей отдано 
    3
    Спасибо Благодарностей получено 
    9
    Поблагодарили
    6 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Пока с данной работой затишье. И ещё на недельку это затишье продлится. Связано это с тем, что сел я на SAP R3 и пока не въеду в него, остальное не имеет смысла. А пока вот бонус - Однопроходовый кроссассемблер.
    Им я компилю примерчики. Если кто посмотрит, отбетатестирует, буду благодарен.
    Итак:
    Все числа - шестнадцатеричные.
    Если параметр не может быть переведён в шестнадцатеричное число, то он считается меткой.
    Директивы:
    DB <байт>
    DW <слово>
    DS <строка> (между DS и собственно строкой - 1 символ, и лучше чтобы это был пробел)
    END бросаем всё и уходим отсюда
    Пользоваться просто:
    onepassa <имя.asm> <имя.bin> <ORG>
    Все параметры обязательны! ORG - шестнадцатеричный!
    Спецсимволы:
    Пробел и табуляция - игнорируются
    Точка с запятой - справа от неё идёт комментарий
    Двоеточие - слева от неё идёт имя метки
    Что-то наверняка забыл. Что-то как всегда глючит. Писалось в три захода в течении обеденных перерывов.
    Работает. В архиве - сырок.
    Вложения Вложения

  6. #35
    Activist Аватар для artyr_n
    Регистрация
    02.02.2014
    Адрес
    г. Одесса, Украина
    Сообщений
    337
    Спасибо Благодарностей отдано 
    7
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Код:
    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.

  7. #36
    Member Аватар для demetrius2003
    Регистрация
    29.09.2010
    Адрес
    Новокузнецк
    Сообщений
    156
    Спасибо Благодарностей отдано 
    3
    Спасибо Благодарностей получено 
    9
    Поблагодарили
    6 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Нет. Это не из-за отсутствующих параметров. Это из-за того, что Вы собираете под gcc. У меня прожка скомпилена Turbo C 2.0. Там всё ОК. Версия, которая собирается под MinGW (а, следовательно, соберётся и под gcc) есть, но на работе. Завтра выложу.

  8. #37
    Member Аватар для demetrius2003
    Регистрация
    29.09.2010
    Адрес
    Новокузнецк
    Сообщений
    156
    Спасибо Благодарностей отдано 
    3
    Спасибо Благодарностей получено 
    9
    Поблагодарили
    6 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вот версия, которая компилится и под Turbo C и под MinGW (gcc версии 4.2.1-sjlj (mingw32-2)). Собственно отличие в том, что gcc не переваривает конструкции типа:
    Код:
    strcpy((char *)tLab[i].Lab, 0x00);
    В Turbo C всё хорошо, а вот gcc этот код компилит, но при выполнении всё крашится.
    Также исправил некоторые моменты и мелкие ошибки типа getc вместо fgetc и т. д.
    В архиве сырок и дла exe 16 и 32 бит.
    Вложения Вложения

  9. #38
    Member Аватар для demetrius2003
    Регистрация
    29.09.2010
    Адрес
    Новокузнецк
    Сообщений
    156
    Спасибо Благодарностей отдано 
    3
    Спасибо Благодарностей получено 
    9
    Поблагодарили
    6 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Доброго дня!
    Ещё немного работы. На сей раз разобрал и дополнил следующие операторы и функции: 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.

  10. #39
    Guru
    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    7,842
    Спасибо Благодарностей отдано 
    654
    Спасибо Благодарностей получено 
    1,814
    Поблагодарили
    1,043 сообщений
    Mentioned
    22 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    С большим интересом жду разбора плавающеточечных процедур.

  11. #40
    Member Аватар для demetrius2003
    Регистрация
    29.09.2010
    Адрес
    Новокузнецк
    Сообщений
    156
    Спасибо Благодарностей отдано 
    3
    Спасибо Благодарностей получено 
    9
    Поблагодарили
    6 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Под конец рабочей недели как всегда кусочек нового. Разобрал и дополнил функции: (тут должен быть списочек, но бумаженция зашкерилась где-то на работе, посему будет попозже).
    Кода откомментировано и разобрано/исправлено очень много. В основном это дебри интерпретатора. Но это надо пройти! Это вносит ясность. Не смотря на то, что свой минимум я отработал (плавающая точка сдалась, графика и ввод-вывод есть), я пойду до конца и откомменчу всё ПЗУ.

    На десерт - сладкое. Пример работы с плавающей точкой из ассемблера.

    Код:
    	                 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...............
    Пояснения по коду. Обратите внимание, как неудобно написан код. Перед тем как вызвать процедуру FPUSH мы сохраняем на стек адрес, куда надо будет вернуться после того, как отработает FADD, а саму процедуру FADD вызываем не через CALL, а через JMP. Связано это вот с чем. Если просто сделать CALL FPUSH, а затем тут же CALL FADD, то второй CALL положит на стек в дополнение к числу с плавающей точкой адрес возврата (в нашем случае cnt1), а потом внутри FADD произойдёт снятие верхушки стека, которое интерпретатор посчитает числом с плавающей точкой, что конечно же неверно. Мало того что числа не сложатся, мы ещё и вернёмся вникуда по адресу, который суть оставшаяся часть числа с плавающей точкой. В этом интерпретаторе всё сделано именно таким образом. Это удобно для интерпретации, но неприемлемо для программиста на ассемблере. Поэтому с сегодняшнего для я буду вести Вордовский документ, в котором буду описывать примеры программирования на ассемблере и вообще писать заметки по архитектуре Суры. Для этого в дизассемблерный листинг я буду дополнительно вводить фиктивные метки с суффиксом _ASM. Для самого интерпретатора они не нужны, а вот нам - очень даже пригодятся. В большинстве случаев они будут расположены глубоко внутри процедур и функций, но вызывая их мы будем иметь более компактный и более понятный код. Ведь всё-таки процедуры ПЗУ заточены под Бейсик-интерпретатор. Но, не смотря на это, в ПЗУ очень много кусочков кода, используя которые мы сможем сильно упростить себе программирование! В результате должна получить брошюра, в которой будет всё, что нужно для полноценной писанины на ассемблере под ПК8000.
    Последний раз редактировалось demetrius2003; 06.05.2014 в 09:11.

Страница 4 из 7 ПерваяПервая 1234567 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 234
    Последнее: 26.02.2021, 11:05
  2. Ответов: 2252
    Последнее: 19.04.2019, 04:31
  3. Ответов: 3
    Последнее: 13.10.2011, 13:40
  4. Описание программ 30 кассет
    от scooter в разделе Пресса
    Ответов: 14
    Последнее: 05.06.2010, 22:37

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •