А интересно, есть ли внятное описание работы с устройствами с помощью ассемблера?
т.е. E: - экран, D:дисковод.
А интересно, есть ли внятное описание работы с устройствами с помощью ассемблера?
т.е. E: - экран, D:дисковод.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
давайте начнём/продолжим с чего нибудь попроще ?
ATARI 65XE|130XE|XEGS|4-XC12|(2-TURBO2000)|SIO2SD
http://atariage.com/forums/topic/247...-contest-2016/
примеры различных простейших (и не очень простейших) игр для атари.
есть куски кода и много интересного.
ну да, хотя бы с этого.
ATARI 65XE|130XE|XEGS|4-XC12|(2-TURBO2000)|SIO2SD
Давайте напишем Трояна для Атари.
То есть программу, которая исполняля бы НАШ код, а Атари и не знала бы об этом.
Что мы имеем в виду под "не знала"?
То, что Атари свой родной код всё равно исполняла бы, а потом незаметно для себя и наш.
Наш Троян безобидный. Пусть он меняет цвет экрана с их голубого на наш красный.
Начнём:
Опишем ячейки памяти Атари, существенные для нас.
; Fully saved Trojan inserted to WARMSTART
;
; EQUATES
DOSINI = $0C
COLOR2 = $02C6
MEMLO = $02E7
;
; CONSTANTS
RED = $32
Далее зададим опции компилятора, чтобы он компилил в ПАМЯТЬ и выдавал нам полный листинг.
(Неполный листинг нужен, если мы будем использовать библиотеки компилятора. То-есть, будут печататься каждый раз сначала библиотеки, а потом только наша маленькая программка. Кому это надо?)
; ASM OPTIONS
.OPT OBJ,LIST ; Пусть пишет в память объектный код и по требованию выдаёт полный листинг программки.
Теперь напишем наш Троян.
(Сначала функционально, потом, чтоб работал.)
Функционально нам нужно изменить цвет.
LDA #RED
STA COLOR2
Но эта станза будет сразу же затёрта инициализацией горячего старта при нажатии Reset!
А вот это уже не троян!
Придётся либо искать всегда сохранную память в Атари, которая не инициализируется при горячем старте.
Или писать свой код.
Пойдём по лёгкому пути, тем более, что это не сложно.
Теория: Разница между JMP и JSR
JMP является ЕДИНСТВЕННОЙ инструкцией, среди инструкций 6502, использующей косвенную адресацию непосредственно!
То есть, для работы ей нужен только Аккумулятор и адрес памяти.
Так как комп ЗНАЕТ!, что адресация косвенная и адрес может быть задан ТОЛЬКО при инициализации,
то он ждёт второго прохода ассемблера и Фазовую ошибку не вызывает.
Для работы всех остальных инструкций ещё нужен стэк.
Например, JSR ТРЕБУЕТ, чтобы данные адреса были занесены в стэк.
Поэтому, если до момента вызова инструкции JSR, не было явного определения и инициализации адреса, в стэк НЕЧЕГО заносить!
Возникает фазовая ошибка.
Из всего этого мы должны понять, что если возникает фазовая ошибка, значит виноваты все команды перехода,
которые не могут найти адрес перехода, либо явно, как заданный Глобально - EQUATES, VARIABLES, либо как метки, которые должны быть описаны РАНЕЕ вызова команды. Ошибка будет, если они описаны ПОЗДНЕЕ!
Вот при этих гнусных условиях нам и придётся работать.
Нам нужна ВЕРА!
АССЕМБЛЕР МОЖЕТ ВСЁ!
Обшая идея такая.
Я хочу, чтобы начиная со старого (заведомо рабочего) адреса, до которого докатилась Атари, занести коды трояна, после чего,
Перенести указатель на прежний "заведомо рабочий адрес" на конец моих кодов! и тогда, программа инициализации по Ресет затронет ВСЁ, кроме моих кодов.
Ясно, что если я исполню свою идею РАНЬШЕ, чем произойдёт нормальная инициализация по горячему старту, то когда она произойдёт она всё ЗАТРЁТ!
Надо, чтобы сначало Атари сделала по-своему, а потом, уж ... !!!
Да, и ешё, важно держать свои ЗНАНИЯ "при себе"! То есть ДАННЫЕ по инициализации ТРОЯНА должны быть в нём сАмом!
Чтобы узнать адрес с которого я могу действовать, я вызываю комманду SpartaDOS X33A (Без БАТФАЙЛОВ!!!).
MEM
Memlo: $1900 Memhi: $BC1F
То-есть, я могу пользоваться памятью насиная с $1900
Я и начну.
START
*= $1900
JMP INIT
;
NEWMLO .WORD 0 ; Это неинициализированная ПОКА переменная, которая будет
; всегда сохранена, покуда мы сохраняем коды трояна.
DUMMY
TROJAN JSR DUMMY ; JSR'у нужен DUMMY, в качестве РАНЕЕ определённой метки!
До исполнения ВСЁ - просто заполненная память! Если вместо DUMMY подставить (ВО ВРЕМЯ ИСПОЛНЕНИЯ! Старый адрес DOSINI, то сначала программа выполнит полный цикл горячего старта.)
А куда нам надо поднять память?
Зададим в конце нашего кода метку:
LOMEM = *
Вот рабочий код:
Теперь, сколько бы Вы не нажимали Ресет, MEMLO будет $191AКод:1000 ; RESET THE MEMLO POINTER 1010 ; 1020 ; EQUATES 1030 DOSINI = $0C 1040 COLOR2 = $02C6 1050 MEMLO = $02E7 1060 ; 1070 ; CONSTANTS 1080 RED = $32 1090 ; 1100 ; CODES 1110 .OPT OBJ,LIST 1120 ; 1130 START 1140 *= $1900 1150 JMP INIT 1160 NEWMLO 1170 .WORD 0 1180 DUMMY 1190 TROJAN JSR DUMMY 1200 LDA NEWMLO 1210 STA MEMLO 1220 LDA NEWMLO+1 1230 STA MEMLO+1 1240 ; 1250 LDA #RED 1260 STA COLOR2 1270 ; 1280 RTS 1290 ; 1300 LOMEM = * 1310 ; 1320 INIT 1330 LDA # <LOMEM ; Set NEWMLO as LOMEM 1340 STA NEWMLO 1350 LDA # >LOMEM 1360 STA NEWMLO+1 1370 ; 1380 LDA DOSINI ; Save DOSINI into TROJAN 1390 STA TROJAN+1 1400 LDA DOSINI+1 1410 STA TROJAN+2 1420 ; 1430 LDA # <TROJAN ; Set DOSINI as TROJAN 1440 STA DOSINI 1450 LDA # >TROJAN 1460 STA DOSINI+1 1470 ; 1480 LDA NEWMLO ; Fill MEMLO as NEWMLO 1490 STA MEMLO 1500 LDA NEWMLO+1 1510 STA MEMLO+1 1520 ; 1530 LDA #RED 1540 STA COLOR2 1550 ; 1560 RTS
А это означает, что TROJAN работает.
MAC и PC - это всего лишь периферия для Атари...
130XE|XC12|CA2001|XF551|IDEPlus2.0|SIO2SD|SIO2IDE| RAM576XE+Covoх|SIO2PC|MAXFLASH8|MAXFLASH1|The Ultimate Cartridge|
у меня брат с этой ерунды умер.
2denpopov
Не уберегли, значит...
Код:Кажется кто-то упоминал, что нужна программа для обработки джойстика... Предлагаю программу Джеймса Коренталя для расшифровки положений джойстика. Я думаю, она малопонятная, но самая быстрая. Что мы думаем о джойстике? Прежде всего он замыкает контакты. Может и попарно! Все контакты джойстика нормально разомкнутые и при считывании аппаратного регистра джойстика в разрядах дают логическую ЕДИНИЦУ! При замыкании контакта, это приводит ЕДИНИЦУ к НУЛЮ! (Искра ушла в землю.) Максимум числа джойстиков для Атари - 4. В новых моделях - 2. Вот "Роза Ветров" положений джойстика: N NW NE W C E SW SE S Всего их 9, А значит 4Joy x 9Dir = 36 предложенных данных для разбора. Вот почему в Бейсике такой разбор по значениям неприемлем! Джойстик сильно абстрагирован от программ. В частности, это означает то, что джойстик ориентируется НЕ НА ДАННЫЕ ПРОГРАММЫ, а только на свои! То есть, когда мы тянем его вниз, то в лётном симуляторе самолётик-то летит вверх, и именно это означает, что обработка данных джойстика лежит не на джойстике, а на программе! Предлагаю битовую таблицу значений для различных положений джойстика: .DIRECTION BINARY HOR VER . E W S N .Center 1 1 1 1 .N 1 1 1 0 .NE 0 1 1 0 .E 0 1 1 1 .SE 0 1 0 1 .S 1 1 0 1 .SW 1 0 0 1 .W 1 0 1 1 .NW 1 0 1 0 То есть: 1. Коренталь обратил внимание, что Атарьские ГЕНИИ разделили младший Нибл на два полуНибла! Младший полуНибл отвечает за Y (VER), Старший полуНибл отвечает за X (HOR). Он знал, что любые данные, левее младшего полуНибла можно элиминировать с помощью инструкции AND #3. DEC BIN 3 11 Эта инструкция обращает в ноль ВСЁ, что левее младшего полуНибла в байте, оставляя полуНибл неприкосновенным! 2. Кроме этого Коренталь знал, что чтобы скинуть младший полуНибл, если нам нужно исследование ТОЛЬКО старшего полуНиббла (HOR), мы можем два раза сдвинуть значение Аккумулятора вправо, командой LSR A. Это всё стало доступным благодаря Атарьцам! Атарьские Гении разделили! выходные значения покоординатно и поконтактно следующим образом: 1. На всё определение данных отводится младший нибл байта. 2. младший полунибл отвечает за вертикаль! 3. старший полунибл отвечает за горизонталь! Остальная часть байта не имеет значения. Проблема дешифрации не столь очевидна. Наша задача привести данные джойстика к значениям Диффирента по X или по Y! Тогда, прибавляя дифферент по любой координате к текущему положению, мы получим новую координату! Программа Бейсика, иллюстрирующая применение Ассемблерной программы вызывается следующим образом: X=0,Y=1 FOR N=0 TO 3 : REM Это для 800-х для новых 0...1 DIR=X : REM For X DX=USR(RDJ,N,DIR) DIR=Y REM For Y DY=USR(RDJ,N,DIR) ... Some ACTIONS like ? SMTH ... etc. NEXT N : REM Возврат на начало цикла для считывания следующего джойстика... Вид СТЭКА в Бейсике определяется Аргументами вызова USR! Справа налево аргументы кладутся ПОСЛОВНО на стэк, Потом кладётся Число аргументов БАЙТ. Многие из этих данных нам не нужны, так как Бейсик использует ТОЛЬКО двухбайтовые данные! Соответственно, для представления однобайтовых данных нам не нужны старшие байты. Кроме этого нам не нужно число аргументов вызова, до тех пор, пока это не существенно для нашей программы! (Это когда вызов с переменным числом аргументов.) Видим сразу, - в отличии от Ассемблера Бейсик Явно избыточен! Вот наш Стэк: Number of Arguments - 1 байт - TOP OF STACK ------------------- MSB of JOYNUM LSB of JOYNUM ------------------- MSB of DIR LSB of DIR ------------------- ... LAST LSB of ... - BOTTOM of STACK ------------------- Смотрим то, что нам не нужно... 1. Число аргументов нафиг! 2. Номеров джойстика мало, значит MSB нафиг! 3. Номеров направлений ваще два - MSB нафиг! Итак, ПОМНИМ у нас есть пул джойстиков - STICK0...STICK3 (в Лучшем случае...) Вспоминаем, что обращение к Аккумулятору ведёт себя как Экскаватор. Всегда выбрасывает породу,.. и иногда загружает её в самосвал. ;Assembler Joystick Routine ; ; EQUATES STICK0 = $0278 ; ; VARIABLES ANSWLO = $D4 ; Произвольный регистр ANSWHI = $D5 ; ... на Нулевой странице. ; .OPT LIST,OBJ ; *= $0600 ; CODES PLA ; Нафиг число аргументов! PLA ; Нафиг старший байт числа джойстиков! PLA ; Берём младший байт числа джойстиков TAX ; Это и будет побайтным смещением в пуле джойстиков! PLA ; Нафиг старший байт направлений (всего два!) LDA STICK0,X ; Читаем пронумерованный в цикле Бейсика джойстик ; На этом этапе, вершина СТЭКа содержит младший (существенный) байт направления (0...1) ; который, командой PLP заносится в Регистр P-Процессорный статус NV BDIZC - регистр P PLP ; Берём флаг P - ЭТО ИНДИКАТОР! Его значения могут быть учтены и считаны, но ... ПОЗЖЕ, если это нужно ПРОГРАММЕ! На процессор регистр НЕ ВЛИЯЕТ! ; Так как в регистре P - наше значение (0...1) Всегда МЛАДШИЙ бит! это = флаг Carry, то определяем направление... BCS NOTX ; Если установлен то мы запрашиваем Игрек, пропуская X. RDX LSR A ; Если X, сдвигаем LSR A ; на 2 бита вправо... NOTX AND #3 ; здесь, скрываем все данные старших битов, кроме интересующих нас. SEC ; Готовим вычитание SBC #2 ; Математическая обработка ... BPL SAVEIT ; Если положительно LDA #2 ; Если отрицательно SAVEIT STA ANSWLO LDA #0 STA ANSWHI RTS .END Здесь мы приехали к расшифровке данных джойстика. .DIRECTION BINARY PROGRAM ANSWER HOR VER . E W S N X-Val Y-Val .Center 1 1 1 1 1 1 .N 1 1 1 0 1 0 .NE 0 1 1 0 2 0 .E 0 1 1 1 2 1 .SE 0 1 0 1 2 2 .S 1 1 0 1 1 2 .SW 1 0 0 1 0 2 .W 1 0 1 1 0 1 .NW 1 0 1 0 0 0 Караул! ДОКТОР МЫ ЕГО ТЕРЯЕМ! Ничего мы не потеряли!!! Смотрим на X-Val. Чтобы получить стандартные значения (-1 0 1), для смещений по координате X, достаточно в Бейсике сделать DX=USR(...)-1 а для данных Y-val достаточно в Бейсике сделать DY=1-USR(...) Вот!
Последний раз редактировалось ezswift; 05.04.2016 в 20:56.
MAC и PC - это всего лишь периферия для Атари...
130XE|XC12|CA2001|XF551|IDEPlus2.0|SIO2SD|SIO2IDE| RAM576XE+Covoх|SIO2PC|MAXFLASH8|MAXFLASH1|The Ultimate Cartridge|
Решил перейти в эту тему про ассемблер. Пока у меня после восстановления моей железки продолжаются муки выбора стартовой литературы. Вот тут 2 очень интересные книги http://seriouscomputerist.altervista...e.language.htm
Под шапкой Osborne / McGraw-Hill: 6502 Assembly Language
Далее еще одна книженция.
И всякие сводные таблицы по процу 6502
http://seriouscomputerist.altervista...e.language.htm
Еще хвалят такую книжку:
http://seriouscomputerist.altervista...urce.atari.htm
Atari: De Re Atari
Ну и еще та 130Xe про которую упоминал в своей теме про неизвестные знаки![]()
Остановился на одной книге как основной. Это Programming the 6502 Rodnay Zaks четвертое издание 83го года. Материал изложен нормально, как я привык видеть в более современных изданиях. И главное она толстаяЧто то многие старые книги какие то ущербные по ассемблеру. В помощь ей еще один фолиант Osborne / McGraw-Hill: 6502 Assembly Language Programming
Ну и Atari Roots иногда поглядываю.
Изучаю неспеша пока азы.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)