PDA

Просмотр полной версии : Атари ассемблер



atariki
12.02.2016, 13:44
Кто нибудь хоть что-то знает или умеет программировать на ассемблере для Атари ?

vfiuchcikicshuusrch
12.02.2016, 15:31
тоже хотел как-то изучить асм под атари. :) но только под 2600.

сам умеешь что-нибудь ?

dosikus
12.02.2016, 15:31
http://www.wudsn.com/index.php/ide

http://www.wudsn.com/index.php/ide/tutorials

ALKO
12.02.2016, 15:49
тоже хотел как-то изучить асм под атари. но только под 2600.

Нынче повелась такая тенденция на разработки разных СДК под доисторические приставки.
А существует ли что-то более высокоуровневое, нежели асм под атарю 2600 ?

- - - Добавлено - - -

Видал краем глаза batari (васик)

gurfunkel
12.02.2016, 16:08
тоже хотел как-то изучить асм под атари. :) но только под 2600.
На Хабрахабре была статья по типу "Как написать игру для Atari 2600", но что-то сходу не нашёл.

atariki
12.02.2016, 16:49
http://www.wudsn.com/index.php/ide

http://www.wudsn.com/index.php/ide/tutorials

всё это я поставил, но понимания нет, английский не знаю так тыкаю непонятно что, повторяю...

Lethargeek
12.02.2016, 16:52
вот еще какой-то онлайн-букварь со встроенным ассемблером 6502
https://skilldrick.github.io/easy6502/ (тоже инглиш, но вдруг поможет)

ezswift
02.03.2016, 15:47
Здравствуйте.

Прежде всего... Вопрос.
Насколько Вы знаете машину?

Понимаете, выучить Ассемблер очень легко! А пользоваться им для программирования (о-о-очень трудно).

Дело в том, что, не зная до тонкостей машины (процессор, ПЗУ, ОЗУ, OS, DOS и пр. И как эта вся "нелюдь" работает?) Вы не будете знать, где Вы находитесь и куда идти.

Если Вы не знаете, для чего ячейка 88, Вы не будете знать как её применять.

Если Вы даже знаете для чего какая-то ячейка, но не знаете как она обрабатывается операционной системой "по умолчанию", Вы всё равно не будете знать как с ней работать.

Начать надо с удивления тому, что комп не умеет НИЧЕГО, кроме как перегонять биты из одного места в другое !!!
Вычисления и "побочные действия" (например прорисовка экрана) получаются при алгоритмизации этого процесса, то есть при применении ВНЕШНИХ, по отношению к процессору правил!!!

Если вопросы будут - отвечу.

atariki
02.03.2016, 17:43
ну я вообще ничего не знаю, а вот это поможет для начала ?
ATARI 800. Операционная система. Руководство пользователя (https://cloud.mail.ru/public/2z9g/df4UaM4VD)
Mapping The Atari (rus) (https://cloud.mail.ru/public/9tLw/zjCF6Tp6Z)

ezswift
05.03.2016, 16:26
Всё, что содержит информацию МОЖЕТ!
Либо помочь, Либо помешать.

Давайте пытаться программиривать.

Ну, начнём, помолясь...

Я в ассемблере программировал только на MAC/65, поэтому и инструкции ассемблера будут для MAC/65.

Чтобы всё было интересно сразу раскрою тайну.

Программировать будем статусную строку для состояния консоли.
Консольные клавиши в Атари - это START,SELECT,OPTION.

Общая идея такова:
1. Сначала добавим статусную строку и увидем её на экране.
Она должна заполняться не меняя нашей работы с Атари.
...
Вот и начнём.

Есть такая фишка в Атари, которая называется Дисплей Лист.
Это - место в памяти, в котором лежат инструкции по отображению данных, которые исполняет ANTIC
(Alphanumeric Television Interface Controller - Знако-Цифровой Контроллер телевизионного интерфейса).

Стандартный DLIST таков:

> dlist

BC20: 3 раза по 8-BLANK
BC23: MODE 2 + LMS(BC40)
BC26: MODE 2 (23 раза)
BC3D: JVB BC20

Утомлю командами ANTIC для DLIST.

Они аддитивны, то есть их можно и нужно (с участием моска!) складывать.
Кроме этого, нужно вспомнить, что обычная текстовая строка Атари состоит из 8 заполненных растровых линий TV!
(ЗАПОМНИТЕ! 8 ЛИНИЙ РАСТРА!)

; Display List Commands
;
; ПРОБЕЛЫ - (незаполненые растровые линии телевизора/ЛУЧ ВЫКЛЮЧЕН - например, черная область выше голубого экрана!)

BL1=$00
BL2=$10
BL3=$20
BL4=$30
BL5=$40
BL6=$50
BL7=$60
BL8=$70
;
; СТРОКИ - неважно текстовые, или графические, но, выводящие на экран данные из экранной памяти.
GR* - это режимы Бейсика
AN* - это режимы ANTIC, недоступные для Бейсика.

GR0=$02
AN3=$03
AN4=$04
AN5=$05
GR1=$06
GR2=$07
GR3=$08
GR4=$09
GR5=$0A
GR6=$0B
ANC=$0C
GR7=$0D
ANE=$0E
GR8=$0F
;
; ПЕРЕХОДЫ - так как, даже если мы ничего не делаем на Атари, всё равно надо прорисовывать экран, а также и по многим другим причинам,
неоюходимы переходы с конца прорисовки на начало - по циклу, или всякие другие.

JTO=$01 - Jump To(далее Адрес!) - переход на конкретный адрес экранной памяти.
JVB=$41 - Jump by Vertical Blank(далее Адрес!) - Переход по дефолту на начало экранной памяти, если прорисован весь экран, для

постоянной прорисовки экрана.
;
; ДЕЙСТВИЯ
HSC=$10 - Включение оборудования горизонтального скроллирования
VSC=$20 - Включение оборудования вертикального скроллирования
LMS=$40 - Load Memory Scan - Включение прорисовки экранной памяти.
LIN=$80 - Display List Interrupt - Включение прерывания со следующей строки сканирования.

Далее...

Мы желаем! обычную текстовую строку над голубеньким экраном, но так, чтобы Атари её не замечал. Есть - и есть...
Вот это и есть - наша глобальная задача.

Посмотрим стандартный DLIST (выше.)
Там сверху непрорисованных 24 линии сканирования, то есть 3 раза по BL8.
(8+8+8)=(8+7+8(здесь появится НАША текстовая строка, а не пробельные строчки сканирования)+1)

Вот такой NEWDL мы и начнём...

А что ждём-то? Это же данные, а не ассемблирование! Их так и так надо вносить. Пора кодить.

Обиняки:
Будем кодить в выделенном месте для программирования пользовательских программ на ассемблере! Это $0600.
Потом, уже задумаемся, куда всё поместить.


Запускаем MAC/65
Увидели на экране

Edit

Пишем ручками:
NUM 1000,10 - нумерация от 1000 с шагом 10

Получаем:
1000

Дописываем:
1000 CODES *=$0600 <нажать Return>
1010

Звёздочка - это состояние PC - Program Counter, то есть ГДЕ мы находимся при ИСПОЛНЕНИИ программ.

Здесь призадумаемся.
Нам нужна инициализация многих подпрограмм, значит - ДО исполнения, а именно в этом месте нужно перейти к ней.
В этом случае ассемблер будет знать Что,Где,Когда!

Итак,
1000 CODES *=$0600
1010 JMP INIT - прыгаем на INIT.

Получаем:

1000 CODES *=$0600 ; Адрес начала кодов
1010 JMP INIT ; Адрес инициализации.
1020

Что мы знаем?
Задали метку CODES, Это пользовательская 6 страница!
Начинаем с $0600
(Переходим на INIT, - пока не задали!)

Вот здесь мы упёрлись в структуризацию программы!

Начало тупое - START

Инициализация данных всех подпрограм - INIT
Объявление всех системных адресов - EQUATES
Объявление всех системных векторов - VECTORS
Объявление всех наших констант - CONSTANTS
(Эти данные сугубо необходимы для того, чтобы ассемблер хоть что-то понял.)
Далее идут исполняемые Коды - CODES

А здесь прервёмся.
Я уже тексты утомился писать.

Сохранись в Ассемблере Бра!

SAVE #DL.m65

Я буду писать помаленьку...

atariki
05.03.2016, 19:42
Благодарен. Очень интересно. С Mac65 v1.01 немного знаком.

ezswift
06.03.2016, 10:33
Двигаемся потихоньку...

"Кривые руки - причина боли моска!"

В прошлом уроке сразу ошибка.
надо:
SAVE #D: DL.M65

Пардон, но всё же назову CODES -> START так привычнее.

1000 START *=$0600

В редакторе эта строчка перепишет прежнюю.

Кстати, Эта команда - инструкция для MAC/65, а не для процессора.
Первая инструкция для процессора, которая будет помещена на 6 страницу
- 1010__JMP INIT.
Специально выделил 2 пробела перед JMP!
Если один пробел -> это будет воспринято как МЕТКА!

1000 START *=$0600
1010 JMP INIT
1020 ;
1030 NEWDL .BYTE BL8,BL7
1040 .BYTE GR0+LMS
1050 .WORD DLDATA

Вот здесь включаем моск!
MAC/65 при компиляции сразу выдаст ошибку фазирования, так как DLDATA ещё не определена нигде!

Увы, надо исправлять!

Вот табличка DLDATA:

1000 START *=$0600
1010 JMP INIT
1020 ;
1030 DLDATA
1040 L0 .SBYTE "Consol: /START/ /SELECT/ /OPTION/" - Start+Select+Option
1050 L1 .SBYTE "Consol: /Start/ /SELECT/ /OPTION/" - Select+Option
1060 L2 .SBYTE "Consol: /START/ /Select/ /OPTION/" - Start+Option
1070 L3 .SBYTE "Consol: /Start/ /Select/ /OPTION/" - Option
1080 L4 .SBYTE "Consol: /START/ /SELECT/ /Option/" - Start+Select
1090 L5 .SBYTE "Consol: /Start/ /SELECT/ /Option/" - Select
1100 L6 .SBYTE "Consol: /START/ /Select/ /Option/" - Start
1110 L7 .SBYTE "Consol: /Start/ /Select/ /Option/" - Не нажаты
1120 NEWDL ; Наш новый DLIST (8+7+8+1)=24 линии
1130 .BYTE BL8,BL7
1130 .BYTE GR0+LMS
1140 OUTTXT ; Метка нужна, чтобы загружать сюда изменяемые адреса.
1140 .WORD DLDATA ; Указываем команде LMS Адрес загрузки текста статуса.
1150 .BYTE BL1
1160 .BYTE JTO ; Скачок на старый OLDDL, как ни в чём ни бывало ...
1170 .WORD OLDDL+3 ; Тройку добавляем, так как область (24 пустых линии) над голубым экраном мы уже обработали.

...

!!! Надо не забыть определить возникающие вечно переменные !!! , вроде OLDDL.


Вспомним про консоль.

Это регистр Атари с адресом
CONSOL 53279 ($D01F)

!!! Надо не забыть, перед чтением из него, его очистить, а то там может чёрти-что оказаться, из-за дребезга контактов, например !!!

Вот таблица его состояний:

CONSOLE KEYS____________PEEK(53279)_____BIT VALUES

START + SELECT + OPTION______0___________00000000
SELECT + OPTION______________1___________00000001
START + OPTION_______________2___________00000010
OPTION_______________________3___________00000011
START + SELECT_______________4___________00000100
SELECT_______________________5___________00000101
START________________________6___________00000110
None_________________________7___________00000111

atariki
06.03.2016, 11:07
загнал в мас65 v1.01

1000 START *=$0600
1010 JMP INIT
1020 ;
1030 DLDATA
1040 L0 .SBYTE "Consol: /START/ /SELECT/ /OPTION/"
1050 L1 .SBYTE "Consol: /Start/ /SELECT/ /OPTION/"
1060 L2 .SBYTE "Consol: /START/ /Select/ /OPTION/"
1070 L3 .SBYTE "Consol: /Start/ /Select/ /OPTION/"
1080 L4 .SBYTE "Consol: /START/ /SELECT/ /Option/"
1090 L5 .SBYTE "Consol: /Start/ /SELECT/ /Option/"
1100 L6 .SBYTE "Consol: /START/ /Select/ /Option/"
1110 L7 .SBYTE "Consol: /Start/ /Select/ /Option/"
1120 NEWDL ;
1130 .BYTE BL8,BL7
1130 .BYTE GR0+LMS
1140 OUTTXT
1140 .WORD DLDATA
1150 .BYTE BL1
1160 .BYTE JTO
1170 .WORD OLDDL+3

ввёл команду asm и получил следующее

5629356294

goodboy
06.03.2016, 12:12
ввёл команду asm и получил следующее
так и должно быть.
тебе дали текст основной программы,
а про мелкие модули (init) ещё не-рассказали

ezswift
06.03.2016, 17:22
Не,
на самом деле ATARIKI маленько отбезобразничал. Я ранее писал, что Если один пробел после начальной цифирки -> это будет воспринято как МЕТКА!
То есть Ассемблер ждёт какого-то невиданного... чего? Невиданной программы JMP!
Ответ - для Ассемблера ПРОСТ! У него невиданный только Макрос.

А теперь к делу.
Поблагодарю GOODBOY, надо!

Поблагодарю ATARIKI - он Аудитория!

Пояснение.
Я с Вами ОДНОВРЕМЕННО программирую!
И я - не программист.
ПОЖАЛЕЙТЕ!

И потом,
Если мы только ввели и сохранили данные, а не программу, разве мы написали программу?
НАДО включать моск!

На этом этапе компилировать НЕЧЕГО!
Обработчика данных НЕТ!
Просто пишем и сохраняем.

ezswift
08.03.2016, 09:32
Вот рабочая программа

1000 ; CONSOL STATUS ROUTINE
1010 ;
1020 ; ATARI EQUATES
1030 SDMCTL = $022F
1040 SDLSTL = $0230
1050 SDLSTH = $0231
1060 CONSOL = $D01F
1070 SETVBV = $E45C
1080 XITVBV = $E45F
1090 ;
1100 ; PROGRAM CONSTANTS
1110 BL1 = $00
1120 BL7 = $60
1130 BL8 = $70
1140 GR0 = $02
1150 LMS = $40
1160 JTO = $01
1170 JVB = $41
1180 ;
1190 ; Z-PAGE CELLS
1200 Z_OLDL = $C0
1210 ;
1220 .OPT LIST,OBJ
1230 ;
1240 START *= $2000
1250 JMP INIT
1260 ;
1270 DLDATA
1280 .SBYTE " Consol: /Start/ /Select/ /Option/ "
1290 ;
1300 NEW_DL
1310 .BYTE BL8,BL7
1320 .BYTE GR0+LMS
1330 .WORD DLDATA
1340 .BYTE BL1
1350 .BYTE JTO
1360 TO_OLD .WORD $00
1370 INIT
1380 LDA #$00
1390 STA SDMCTL
1400 ;
1410 LDA SDLSTL
1420 STA Z_OLDL
1430 CLC
1440 ADC #3
1450 STA TO_OLD
1460 ;
1470 LDA SDLSTH
1480 STA Z_OLDL+1
1490 STA TO_OLD+1
1500 ;
1510 LDA # <NEW_DL
1520 STA SDLSTL
1530 LDY #30
1540 STA (Z_OLDL),Y
1550 ;
1560 LDA # >NEW_DL
1570 STA SDLSTH
1580 LDY #31
1590 STA (Z_OLDL),Y
1600 ;
1610 LDA #$22
1620 STA SDMCTL
1630 ;
1640 RTS

atariki
08.03.2016, 11:25
вот что в mac65 v1.01

56332

ну и естественно, толком ничего не понятно.

ezswift
08.03.2016, 12:09
Ассемблер определяет инструкции по отступам.
Сайт отступы уничтожает.
Уж, поверьте, мой текст был другим...



1000 ; CONSOL STATUS ROUTINE
1010 ;
1020 ; ATARI EQUATES
1030 SDMCTL = $022F
1040 SDLSTL = $0230
1050 SDLSTH = $0231
1060 CONSOL = $D01F
1070 SETVBV = $E45C
1080 XITVBV = $E45F
1090 ;
1100 ; PROGRAM CONSTANTS
1110 BL1 = $00
1120 BL7 = $60
1130 BL8 = $70
1140 GR0 = $02
1150 LMS = $40
1160 JTO = $01
1170 JVB = $41
1180 ;
1190 ; Z-PAGE CELLS
1200 Z_OLDL = $C0
1210 ;
1220 .OPT LIST,OBJ
1230 ;
1240 START *= $2000
1250 JMP INIT
1260 ;
1270 DLDATA
1280 .SBYTE " Consol: /Start/ /Select/ /Option/ "
1290 ;
1300 NEW_DL
1310 .BYTE BL8,BL7
1320 .BYTE GR0+LMS
1330 .WORD DLDATA
1340 .BYTE BL1
1350 .BYTE JTO
1360 TO_OLD .WORD $00
1370 INIT
1380 LDA #$00
1390 STA SDMCTL
1400 ;
1410 LDA SDLSTL
1420 STA Z_OLDL
1430 CLC
1440 ADC #3
1450 STA TO_OLD
1460 ;
1470 LDA SDLSTH
1480 STA Z_OLDL+1
1490 STA TO_OLD+1
1500 ;
1510 LDA # <NEW_DL
1520 STA SDLSTL
1530 LDY #30
1540 STA (Z_OLDL),Y
1550 ;
1560 LDA # >NEW_DL
1570 STA SDLSTH
1580 LDY #31
1590 STA (Z_OLDL),Y
1600 ;
1610 LDA #$22
1620 STA SDMCTL
1630 ;
1640 RTS


Пора разобрать, что наваяли.

Программа делает следующее:

1. Выключает ANTIC
2. Забирает адрес старого DL из регистра SDLSTL/SDLSTH
3. сохраняет его в двух местах
а) на нулевую страницу, в произвольно заданную ячейку (из второй половины страницы, первая занята...)
б) в нашем NEW_DL в ячейку TO_OLD, пропуская 3 инструкции старого DL (BL8,BL8,BL8 = 24 линии сканирования), для чего увеличиваем адрес старого DL на 3. Это экранное место обрабатывается новым DL.

Идея такова:
Сначала обрабатывается новый DL, затем по команде JTO он продолжается на старом DL+3, а затем, полностью обработав старый DL по команде JVB циклически снова переходит на наш новый DL.

4. Определяем наш новый DL в регистр SDLSTL/SDLSTH, чтобы он заработал при включении ANTIC
5. Заносим адрес нового DL в область старого DL с командой JVB
6. Включаем ANTIC и ... Вуаля!

Об адресации процессора.

Адреса на нулевой странице являются однобайтовыми, остальные - двухбайтовые!

MAC/65 работает с адресами следующим образом:

Если встречается значок Решётка #, - это Непосредственная адресация -> работает непосредственно с числом, которое под решёткой.
(Если это #$03 - работает с тройкой.
Если это # <OURADR - работает с LSB нашего OURADR.
Если это # >OURADR, работает с MSB нашего OURADR.)

Если решётки нет, значит МАС/65 работает с СОДЕРЖИМЫМ по адресу!
LDA OURADR - загрузка содержимого по адресу OURADR. Здесь не может быть ни < ни > так как комп восьмибитовый, а значит процессор может переварить только 1 байт и благодаря Little Endian нотации - это будет Младший(первый встречающийся).
То есть LDA OURADR - загрузка в Аккумулятор СОДЕРЖИМОГО LSB нашего OURADR.

А вот прикольная адресация. Очень часто применяется, но имеет свои ограничения.
Indirect Indexing Addressing -
ПРАВИЛЬНЫЙ ПЕРЕВОД: Косвенная Индексирующая Адресация!

Проще объяснить как она работает.
Заметка:
1. Адрес, указываемый в таких инструкциях может находиться ТОЛЬКО на нулевой странице !!!
2. Будучи Адресом, содержимое адреса на нулевой странице занимает 2 байта.
3. Индексация происходит над адресом содержащимся в адресе на нулевой странице.

Встретив, что нибудь вроде

LDA (Z_ADR),Y

Скобки здесь определяют приоритет.
Поэтому сначала эта тварь вычисляет адрес.
Заметим, что Z_ADR не под решёткой!
Значит, СНАЧАЛА берём содержимое Z_ADR (Оно - суть два байта адреса).
Индексируем (прибавляем содержимое регистра) Y-ком и получаем НОВЫЙ адрес.
С которым инструкция и работает. В нашем случае загружает в Аккумулятор байт.

Ну, остаётся добавить, что загрузка в SDMCTL нуля, выключает DMA (Direct Memory Access - прямой доступ к экранной памяти)
А загрузка в него #$22 - включает режим прямго доступа.

Да, ещё...
Прежде чем складывать в Ассемблере, ОБЯЗАТЕЛЬНО дайте инструкцию CLC, так как флаг С-Carry очень часто используется для переходов на подпрограммы и даже если Вы ничего не складывали и ничего не вычитали, он может иметь ДРУГОЕ состояние. Надо обнулить!

Жду любых Почему!

- - - Добавлено - - -

Ну и в догон,
Если пользуетесь Notepad++ для Атарьского программирования, то вот UDL (User Defined Language), для OSS MAC/65 чтобы импортировать в него.



<NotepadPlus>
<UserLang name="OSS MAC/65" ext="asm" udlVersion="2.1">
<Settings>
<Global caseIgnored="no" allowFoldOfComments="no" foldCompact="no" forcePureLC="0" decimalSeparator="0" />
<Prefix Keywords1="no" Keywords2="no" Keywords3="no" Keywords4="no" Keywords5="no" Keywords6="no" Keywords7="no" Keywords8="no" />
</Settings>
<KeywordLists>
<Keywords name="Comments">00; 01 02 03 04</Keywords>
<Keywords name="Numbers, prefix1"></Keywords>
<Keywords name="Numbers, prefix2">#$ # $</Keywords>
<Keywords name="Numbers, extras1">A B C D E F</Keywords>
<Keywords name="Numbers, extras2"></Keywords>
<Keywords name="Numbers, suffix1"></Keywords>
<Keywords name="Numbers, suffix2"></Keywords>
<Keywords name="Numbers, range"></Keywords>
<Keywords name="Operators1">&apos; - ! &quot; # % &amp; ( ) * , / ? @ [ ] ^ + &lt; = &gt;</Keywords>
<Keywords name="Operators2"></Keywords>
<Keywords name="Folders in code1, open"></Keywords>
<Keywords name="Folders in code1, middle"></Keywords>
<Keywords name="Folders in code1, close"></Keywords>
<Keywords name="Folders in code2, open"></Keywords>
<Keywords name="Folders in code2, middle"></Keywords>
<Keywords name="Folders in code2, close"></Keywords>
<Keywords name="Folders in comment, open"></Keywords>
<Keywords name="Folders in comment, middle"></Keywords>
<Keywords name="Folders in comment, close"></Keywords>
<Keywords name="Keywords1">*= = .= .BYTE .CBYTE .DBYTE .DS .ELSE .END .ENDIF .ERROR .FLOAT .IF .INCLUDE .LOCAL .OPT .PAGE .SBYTE .SET .TAB .TITLE .WORD .ENDM .MACRO</Keywords>
<Keywords name="Keywords2">ADC AND ASL BCC BCS BEQ BIT BMI BNE BPL BRK BVC BVS CLC CLD CLI CLV CMP CPX CPY DEC DEX DEY EOR INC INX INY JMP JSR LDA LDX LDY LSR NOP ORA PHA PHP PLA PLP ROL ROR RTI RTS SBC SEC SED SEI STA STX STY TAX TAY TSX TXA TXS TYA</Keywords>
<Keywords name="Keywords3">.OR .AND .NOT .DEF .REF</Keywords>
<Keywords name="Keywords4">A X Y</Keywords>
<Keywords name="Keywords5"></Keywords>
<Keywords name="Keywords6"></Keywords>
<Keywords name="Keywords7"></Keywords>
<Keywords name="Keywords8"></Keywords>
<Keywords name="Delimiters">00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23</Keywords>
</KeywordLists>
<Styles>
<WordsStyle name="DEFAULT" fgColor="000000" bgColor="FFFFFF" fontName="ProggyCleanTTSZ" fontStyle="0" fontSize="11" nesting="0" />
<WordsStyle name="COMMENTS" fgColor="008040" bgColor="FFFFFF" fontName="Comic Sans MS" fontStyle="0" fontSize="9" nesting="0" />
<WordsStyle name="LINE COMMENTS" fgColor="008000" bgColor="EAFFD5" fontName="Comic Sans MS" fontStyle="2" fontSize="8" nesting="0" />
<WordsStyle name="NUMBERS" fgColor="FF8000" bgColor="FFFFFF" fontName="ProggyCleanTTSZ" fontStyle="1" fontSize="11" nesting="0" />
<WordsStyle name="KEYWORDS1" fgColor="800000" bgColor="FFFFFF" fontName="ProggyCleanTTSZ" fontStyle="1" fontSize="11" nesting="0" />
<WordsStyle name="KEYWORDS2" fgColor="0000FF" bgColor="FFFFFF" fontName="ProggyCleanTTSZ" fontStyle="1" fontSize="11" nesting="0" />
<WordsStyle name="KEYWORDS3" fgColor="008080" bgColor="FFFFFF" fontName="ProggyCleanTTSZ" fontStyle="1" fontSize="11" nesting="0" />
<WordsStyle name="KEYWORDS4" fgColor="FF0000" bgColor="FFFFFF" fontName="" fontStyle="1" nesting="0" />
<WordsStyle name="KEYWORDS5" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
<WordsStyle name="KEYWORDS6" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
<WordsStyle name="KEYWORDS7" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
<WordsStyle name="KEYWORDS8" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
<WordsStyle name="OPERATORS" fgColor="0080FF" bgColor="FFFFFF" fontName="ProggyCleanTTSZ" fontStyle="1" fontSize="11" nesting="0" />
<WordsStyle name="FOLDER IN CODE1" fgColor="FFFFFF" bgColor="000000" fontName="Inconsolata" fontStyle="0" nesting="0" />
<WordsStyle name="FOLDER IN CODE2" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
<WordsStyle name="FOLDER IN COMMENT" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
<WordsStyle name="DELIMITERS1" fgColor="FFFFFF" bgColor="000000" fontName="" fontStyle="0" nesting="0" />
<WordsStyle name="DELIMITERS2" fgColor="FFFFFF" bgColor="000000" fontName="" fontStyle="0" nesting="0" />
<WordsStyle name="DELIMITERS3" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
<WordsStyle name="DELIMITERS4" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
<WordsStyle name="DELIMITERS5" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
<WordsStyle name="DELIMITERS6" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
<WordsStyle name="DELIMITERS7" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
<WordsStyle name="DELIMITERS8" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
</Styles>
</UserLang>
</NotepadPlus>

atariki
08.03.2016, 12:15
всё получилось, спасибо.
56333
ASM -> DDT -> G2000

dosikus
08.03.2016, 12:28
Ну и в догон,
Если пользуетесь Notepad++ для Атарьского программирования,

Не знаю, не знаю. Чем извращения лучше комфортной работы....


http://s010.radikal.ru/i314/1603/81/8cbf85e56538.jpg

ezswift
08.03.2016, 12:32
Добавлю, RTS меня долго мучило!
Но в конец я его добавил.

Смысл в том, что это - переход на ВЫЗЫВАЮЩУЮ программу, то есть возврат в DOS.

atariki
08.03.2016, 12:39
на железном ATARI верх и низ экрана смещены в сторону, вобщем отображается некорректно, в эмуляторе после загрузки уходит в self test
56334

- - - Добавлено - - -

да, rts в конце убрал скомпилил и на "железе" всё стало норм.

dosikus
08.03.2016, 13:54
всё это я поставил, но понимания нет, английский не знаю так тыкаю непонятно что, повторяю...

Что? Нужен мануал? Там и так все в картинках .
Ну если есть желание могу здесь перевести этап установки и настройки... Если лень не будет...

atariki
08.03.2016, 14:06
Что? Нужен мануал? Там и так все в картинках .
Ну если есть желание могу здесь перевести этап установки и настройки... Если лень не будет...
я немного не правильно выразился.. нет понимания ассемблера, с ecliipse я разобрался без проблем и пользуюсь.

dosikus
08.03.2016, 14:44
с ecliipse я разобрался без проблем и пользуюсь.


С клипсиной вообще или с WUDSN сборкой ?
В атаривском асме, а точней в самой архитектуре атари я и сам плаваю.
Книг накачал, примеров полно - но что то не легло и временно забросил. :)

atariki
08.03.2016, 15:45
с WUDSN сборкой, с клипсиной не особо заморачивался. Я с детства мечтаю научиться ассемблеру на атари, да как-то трудно мне даётся.

- - - Добавлено - - -



1020 ; ATARI EQUATES
1030 SDMCTL = $022F
1040 SDLSTL = $0230
1050 SDLSTH = $0231
1060 CONSOL = $D01F
1070 SETVBV = $E45C
1080 XITVBV = $E45F

можно мне "разжевать" что вот это такое, что оно значит и для чего это ? Я так понимаю это адреса в памяти которые так называются ?

goodboy
08.03.2016, 15:52
https://en.wikipedia.org/wiki/ANTIC
у процессора в-атари нет команд ввода/вывода в-порты для командования устройствами.
поэтому девайсы ввода/вывода сами забирают нужные данные/команды из фиксированных ячеек в-памяти

atariki
08.03.2016, 16:44
как я понимаю можно вместо этого SDMCTL = $022F записать DMACTL = 54272, будет то же самое и правильно ?

goodboy
08.03.2016, 17:11
нет.
как я понял из статьи значение в (DMACTL) может намеренно измениться, а потом оно снова возмётся из (SDMCTL)

dosikus
08.03.2016, 19:43
goodboy, Если я правильно помню SDMCTL это теневые Shadow регистры и копируется из них в регистры ANTIC c синхронизацией (к чему не помню :) )
Не соврал ? :D

И еще адрес этих теневых вроде как так же изменяется .
Блин надо все вспоминать- читал же...

Зы. Надо же - еще и помню: :D


Operating System Shadow registers are copied from RAM to the hardware registers during the vertical blank.

goodboy
08.03.2016, 21:17
я честно говоря в атарях не-разбираюсь.
(xe продал поскольку почти не-было софта, ST лежит на антресолях).

The operating system also maintains copies of these color registers in RAM memory. These are called shadow color registers. They are maintained because the hardware locations are "write only" locations. Since they can't be read, we need RAM locations where they can be read. At the beginning of each refresh cycle, these five shadowed registers are copied into the hardware locations.

dosikus
08.03.2016, 22:22
я честно говоря в атарях не-разбираюсь.


Гы. И я так же.


atariki, счас разберусь с очередным завалом. Обновлю инстрУмент и вас догоню. :D
Насколько помниться denpopov хорошо в асме атари разбирается...

ezswift
09.03.2016, 18:03
То, что программа выполняется чисто, я проверил в мониторе.
Вот старый DLIST

> dlist
9C20: 3x 8 BLANK
9C23: LMS 9C40 MODE 2
9C26: 23x MODE 2
9C3D: JVB 9C20

Вот новый DLIST
> dlist
202B: 8 BLANK
202C: 7 BLANK
202D: LMS 2003 MODE 2
2030: 1 BLANK
2031: JMP 9C23
9C23: LMS 9C40 MODE 2
9C26: 23x MODE 2
9C3D: JVB 202B

Как видно, всё как мы и хотели.

- - - Добавлено - - -

2Atariki.
Отвечая на Ваш вопрос, скажу следующее.

Да, в Атари существуют поименованные ячейки памяти.
Каждая такая ячейка имеет уникальное имя и связанную с ней функцию.

Из таких мы в программке использовали только две.

SDMCTL - Shadowed Direct Memory Control Теневой регистр управления Прямым Доступом к памяти.
Если в него внести число #$00 - прямой доступ к памяти выключается.
Если внести число #$22 - прямой доступ к памяти включается.

SDLSTL/SDLSTH - Shadowed Display LiST Это системный указатель на начало Дисплейного Листа.

По поводу Ассемблирования скажу честно. Пока не напишешь тыщу тонн кода - не научишься.

Раньше программировали в Машинных Кодах.
Вот наша программа в машинных кодах:
> m 2000 (Смотрю в мониторе начиная с адреса загрузки программы, то есть $2000)

2000: 4C 34 20 00 00 23 6F 6E 73 6F 6C 1A 00 0F 33 74 L4 ..#onsol...3t
2010: 61 72 74 0F 00 0F 33 65 6C 65 63 74 0F 00 0F 2F art...3elect.../
2020: 70 74 69 6F 6E 0F 00 00 00 00 00 70 60 42 03 20 ption......p.B.
2030: 00 01 23 9C A9 00 8D 2F 02 AD 30 02 85 C0 18 69 ..#..../..0....i
2040: 03 8D 32 20 AD 31 02 85 C1 8D 33 20 A9 2B 8D 30 ..2 .1....3 .+.0
2050: 02 A0 1E 91 C0 A9 20 8D 31 02 A0 1F 91 C0 A9 22 ...... .1......"
2060: 8D 2F 02 60 00 00 00 00 00 00 00 00 00 00 00 00 ./..............

Ничего утешительного, не правда ли?

Тем не менее, идея ассемблирования очень проста - заменить цифры Машинного Кода запоминающимися знако-сочетаниями.

Проделаем эту процедуру.

$4C $34 $20 - Это и есть наша первая команда JMP INIT

Здесь $4C - JMP, а адрес $2034 (в памяти лежит наоборот, то есть младший байт первый.) это вычесленный ассемблером адрес INIT.
Проверим так ли это?
По этому адресу лежат байты $A9 $00, а это и есть LDA #$00, как в нашей программе.

Да, кстати, впервые вижу книжку по Атари на Русском. Здорово.

denpopov
09.03.2016, 18:05
на железном ATARI верх и низ экрана смещены в сторону, вобщем отображается некорректно, в эмуляторе после загрузки уходит в self test
56334

- - - Добавлено - - -

да, rts в конце убрал скомпилил и на "железе" всё стало норм.


естественно, rts - выход в Бейсик или в никуда. Какой-то левый DLIST у тебя

сначала три по 112 - пустые или blank линии,
потом это байт из $40+режим ANTICтаблица (http://gury.atari8.info/card_graphics_modes.php)
вслед за байтом идет слово - адрес, где в памяти хранятся данные.

следующие байты - это режимы ANTIC, например 23 байта 2 - текстовый режим

последние $41 и слово - адрес начала инструкции DLIST

Адреса инструкций помещаются в ячейки $230(мл. байт адреса) и в $231(ст. байт)

Читай memory mapping или кинь мне в личку, если надо, я залью, сидеть на форуме некогда.

В общем, непонятно с кодом и лево сделано.

проще сделать .XEX в atasm так:



.bank
*=$2000
;
тут весь код
lda #dliadr&255
sta $230

lda #dliadr/256
sta $231

jmp * ;зациклили на время
dliadr
.byte $70,$70,$70
.byte $42;режим стандартный GR.0
.word $3000 ; данные берутся с адреса $3000
.byte 2,2,2;всего 23
.byte $41;инструкция ожидания и перехода к началу
.word dliadr
.bank
*= $02E0
.word $2000

$2E0 - адрес автостарта программы. Как сделать в MADS - я не знаю

ezswift
09.03.2016, 22:39
denpopov, привет!

Ну Вы же знаете, что команды Ассемблера к Бейсику не могут иметь НИКАКОГО отношения.
RTS - Это выход в вызывающую подпрограммуу, а именно, на тот адрес, который следует за вызовом, то есть в случае загрузки программы DOS-ом, мы остаёмся в Цикле исполнения DOS-а!!!

Я так понимаю, что Вы все Балуетесь со XEX-ами, но файлы XEX - Это просто переименованые файлы COM. АБСОЛЮТНО ничего более.
То есть, если у Вас не загружен сам ВЫЗЫВАЮЩИЙ программу ДОС, а вызывает её ЭМУЛЯТОР, к чему же Вы можете вернуться?

У меня прекрасно и в эмуле и в HW всё работает до сих пор.

denpopov
09.03.2016, 23:06
У меня прекрасно и в эмуле и в HW всё работает до сих пор
Вы просто счастливчик) я до сих пор не могу подключить рабочую Атари 130ХЕ к ТВ.



Ну Вы же знаете, что команды Ассемблера к Бейсику не могут иметь НИКАКОГО отношения.
RTS - Это выход в вызывающую подпрограммуу, а именно, на тот адрес, который следует за вызовом, то есть в случае загрузки программы DOS-ом, мы остаёмся в Цикле исполнения DOS-а!!!

что Вы говорите?
при вызове USR из Бейсика на стеке помещаются: номер параметров и параметры, т.е A=USR(1536,8,7) на стеке даст 2,8,7.
поэтому обычно ассемблерная часть выглядит как
PLA
..
немножко кода
..
RTS

Вызов ассемблерных процедур из Бейсика реализуем, например можно перевести опкоды в символы ATASCII и вызвать как мы делали A=USR(ADR("строка"))

g0blinish писал (http://scepticalinq.blogspot.ru/2015/10/blog-post_26.html) подобный пример.

Заодно выполнять RTS на непонятной среде - это моветон.

ezswift
09.03.2016, 23:14
Я всё думал, что же Вы спрашиваете.

Пришёл к выводу, что Вас интересует не программирование, которое Вы знаете, а сама работа с MAC/65.
Ну там команд-то, конечно много... как в Ворде.

Я использую пару из них.

Я работаю в эмуле Atari800WinPlus 4.1
Помаленьку пользуюсь его преимуществами, которых (Don't kill me ZEman!!!) нет у Altirra.
(Я печатаю свои программы, когда мне нужно подумать над кодом.)

Загрузка кодов в ТЕКСТОВОМ ФОРМАТЕ.
ENTER #H6:CONSOL.LST - Загрузка файла листинга в текстовом формате с устройства, которое само перекодирует ASCII в ATASCII.
и для сохранения ТЕКСТА: LIST #H6:CONSOL.LST
(Реально есть устройство H1:, которое НЕ ПЕРЕКОДИРУЕТ. С него *.com можно загрузить. и его Зеркальное устройство, которое ПЕРЕКОДИРУЕТ различия в кодировках - H6:.)
Надо задать настройки, например C:\ATARI\HDD -> H1:
И всё.

Загружать данные с жесткого диска могут всего несколько ДОСов.
AtariDOS 3, или 4 (не помню), Sparta (Все версии, с которыми я встречался.) и по моему OSS DOSXL или ДОС XE (тоже не помню). Больше ничего!

Естесственно забыл MyDOS!
Он ТОЖЕ МОЖЕТ работать с жестким диском. Лучше многих!

Я работаю со SPARTA3.3A, потому-что к нему есть Shell33а- та программка, которая ДЕРЖИТ в ОЗУ 2 директории, которые я сам задаю.
В этом случае я обращаюсь и к системным утилитам и к программам, которые мне нужны без определения путей доступа.

Для быстрой загрузки и быстрого программирования я использую команды:
SAVE D1:CONSOL.M65
LOAD D1:CONSOL.M65

Эти команды работают не с текстом, а с токенами.
ВСЁ!

atariki
09.03.2016, 23:19
а видео запилить по этому поводу можно ?

ezswift
09.03.2016, 23:45
2Denpopov
Да никакой я не счастливчик.

Когда у меня моя родная Атарька сдохла, из-ха недостатка времени и кривых рук, я не стал с ней возиться и у B&C купил материнку.
Они при правильном моём обращении не засунули меня в стоплист, что любят делать, и прислали мне счастье.

Я не очень понимаю, почему у Вас страдает вывод на экран.
Мне пришлось купить монитор, SONY PVM, чтобы как-то беспроблеммно с Атарькой работать.
Я сигнал по S-Video вывожу.
Всё чисто.

Поверьте, работу со стеком в Бейсике я знаю.
Знаю также интерфейсы к многим Си-языкам.

В любом случае возврат из подпрограммы ведётся куда-то!
Ну, в случае с xex, он ведётся в... Да-а-а!!! в ЭМУЛЯТОР!
Доса и Бейсика-то НЕТУ! Ну, не загружены они!

- - - Добавлено - - -

2Atariki

Да, можно, но я ваще никогда его не делал.

У меня есть SnagIt, который, вроде позволяет.

Моя Атарьская PC-шка очень слабенькая она вообще полуживёт.

Давайте думать об этом, как о проекте.

ezswift
10.03.2016, 22:50
Atariki, Здравствуйте.

Значит, до сих пор мы решили только одну задачу.

Применили наш кастомный Дисплей лист к читанию консоли.
1. Мы показали, что он работает.
2. Мы показали, что он НЕ ТРОГАЕТ РАБОТУ АТАРИ, так как там можно и вызывать программы (Которые своего дисплей-листа не имеют и работать с ДОСом и т.д.)

Мы показали, что программировать ВЕСЕЛО! Работает-же!
Надо далее.

Задача - считать содержимое регистра Консоли отличается от задачи - вывести ТО, ЧТО хотим, на нашу статусную строку.

Когда не можешь запрыгнуть на следующую лестничную площадку, надо идти по ступенькам.

Не будем трогать то, что уже работает.
Начнём новую программку, которая будет работать и чтобы это можно было бы проверить!
Как в первой.

Вот мы имеем Разные статусные строки в количестве 8. (Они ВСЕ могут быть правильно выведены нашей предыдущей программой!)

Заглавные буквы будут означать ИНВЕРТИРОВАНИЕ символов (высветление).

Статусные строки:

L7 .SBYTE " Consol: /Start/ /Select/ /Option/ "
L6 .SBYTE " Consol: /START/ /Select/ /Option/ "
L5 .SBYTE " Consol: /Start/ /SELECT/ /Option/ "
L4 .SBYTE " Consol: /START/ /SELECT/ /Option/ "
L3 .SBYTE " Consol: /Start/ /Select/ /OPTION/ "
L2 .SBYTE " Consol: /START/ /Select/ /OPTION/ "
L1 .SBYTE " Consol: /Start/ /SELECT/ /OPTION/ "
L0 .SBYTE " Consol: /START/ /SELECT/ /OPTION/ "

Других выборов из этого списка у нас нет.
Я забыл раньше сказать, что в Атари (Это её особенность!) .SBYTE - это команда прорисовать экранный байт. Экран=Screen.


О работе Ассемблера.

MAC/65 Двухпроходный!
В первый проход он запоминает ВСЕ!!! (По Адресам!) метки, поэтому наши метки L* ему ВСЕ известны.

Правило Little Endian указывает, что там берётся младший байт двухбайтового слова.
...

Это было исследование.
А вот теперь перейдём к Ассемблированию.

Так как мы знаем, что Ассемблер УЖЕ (в первый проход прочёл все метки, мы уже можем обращаться с ними как с ДАННЫМИ.)

Давайте сделаем таблицу сдвига по нашей таблице Статусных строк.

TXTTAB
.WORD L7,L6,L5,L4
.WORD L3,L2,L1,L0

Что мы видим?
.WORD - означает двухбайтовое СЛОВО в порядке LSB/MSB

Значит мы создали АССЕМБЛЕРОМ - он же вычисляет это в первом проходе!!! Таблицу адресов.

А взять из таблички адреса и подставить их в место где происходит LMS - сканирование (и, конечно, прорисовка) экранной памяти,
это - не наша забота. Этим ANTIC занимается.
Мы - меняем Адреса!

Ну, и давайте...

Сначала теория.
Если я делаю ASL - значит я умножаю маленькое число на два.
Спросите для чего?
Ответ один .
Адреса хранятся в ДВУХ ячейках и мы просто должны перескакивать на 2 байта.

Маленькое число - это то, которое между 0 и 127.

ПРОШУ ВАС ПРОВЕРЬТЕ!
На виндосном калькуляторе.

Над любым МАЛЕНЬКИМ числом сделайте ASL и нажмите равно.
Вы получите это число, умноженное на два.

А у нас цифра - всего 7!
Поэтому без обиняков и смело!

Вот тут мы и начнём программировать!
...
Я жутко устал...
Спокоси Носи!

ezswift
12.03.2016, 08:41
Вот готовая программа.
Консоль работает!

Самое странное, с чем столкнулся - это с тем, что некоторые версии MAC/65 не поддерживают символа подчёркивания.
Ничего страшного. Можно заменить в тексте какой нибудь буковкой.



1000 ; CONSOL STATUS ROUTINE
1010 ;
1020 ; ATARI EQUATES
1030 SDMCTL = $022F
1040 SDLSTL = $0230
1050 SDLSTH = $0231
1060 CONSOL = $D01F
1070 SETVBV = $E45C
1080 SYSVBV = $E45F
1090 ;
1100 ; PROGRAM CONSTANTS
1110 BL1 = $00
1120 BL7 = $60
1130 BL8 = $70
1140 GR0 = $02
1150 LMS = $40
1160 JTO = $01
1170 JVB = $41
1180 ;
1190 ; Z-PAGE CELLS
1200 Z_OLDL = $C0
1210 ;
1220 .OPT LIST,OBJ
1230 ;
1240 START *= $2000
1250 JMP INIT
1260 ;
1270 DLDATA
1280 L0 .SBYTE " Consol: /START/ /SELECT/ /OPTION/ "
1290 L1 .SBYTE " Consol: /Start/ /SELECT/ /OPTION/ "
1300 L2 .SBYTE " Consol: /START/ /Select/ /OPTION/ "
1310 L3 .SBYTE " Consol: /Start/ /Select/ /OPTION/ "
1320 L4 .SBYTE " Consol: /START/ /SELECT/ /Option/ "
1330 L5 .SBYTE " Consol: /Start/ /SELECT/ /Option/ "
1340 L6 .SBYTE " Consol: /START/ /Select/ /Option/ "
1350 L7 .SBYTE " Consol: /Start/ /Select/ /Option/ "
1360 ;
1370 NEW_DL
1380 .BYTE BL8,BL7
1390 .BYTE GR0+LMS
1400 LMSADR
1410 .WORD 0
1420 .BYTE JTO
1430 TO_OLD
1440 .WORD 0
1450 ;
1460 VBI
1470 LDA CONSOL
1480 ASL A
1490 TAY
1500 LDA TABRET,Y
1510 STA LMSADR
1520 INY
1530 LDA TABRET,Y
1540 STA LMSADR+1
1550 ;
1560 JMP EXIT
1570 ;
1580 INIT
1590 LDA #$06
1600 LDX # >VBI
1610 LDY # <VBI
1620 JSR SETVBV
1630 ;
1640 LDA CONSOL
1650 STA OLDCON
1660 ;
1670 LDA #$00
1680 STA SDMCTL
1690 ;
1700 LDA SDLSTL
1710 STA Z_OLDL
1720 CLC
1730 ADC #3
1740 STA TO_OLD
1750 ;
1760 LDA SDLSTH
1770 STA Z_OLDL+1
1780 STA TO_OLD+1
1790 ;
1800 LDA # <NEW_DL
1810 STA SDLSTL
1820 LDY #30
1830 STA (Z_OLDL),Y
1840 ;
1850 LDA # >NEW_DL
1860 STA SDLSTH
1870 LDY #31
1880 STA (Z_OLDL),Y
1890 ;
1900 LDA #$22
1910 STA SDMCTL
1920 ;
1930 RTS
1940 ;
1950 EXIT
1960 LDA CONSOL
1970 STA OLDCON
1980 JMP SYSVBV
1990 ;
2000 OLDCON
2010 .BYTE 0
2020 TABRET
2030 .WORD L0,L1,L2,L3
2040 .WORD L4,L5,L6,L7


В тексте можно применить инверсию текста для нажатых клавиш.
Но вместо инверсных букв появятся кракозябры. Не стал.

- - - Добавлено - - -

Да, кстати, тут где-то вопрос о применении HW-ячеек, типа DMACTL вставал.
Тех, которые каждый раз переписываются на этапе обработки подпрограммы SYSVBV во время обратного хода луча...
Лучше их не трогать вообще.
Их адреса не сдуру переписываются из Теневых Регистров.

Представим загрузку картриджа, который тоже HW-периферия.
При включении он перехватывает у программы стандартной загрузки управление и производит свою настройку программой инициализации.
Разумеется, переменные, связанные с настройкой картриджа, он помещает в ОЗУ. Сам-то он ПЗУ!!!
Как раз стандартизированная система переменных для любого оборудования и есть Теневые Регистры на второй странице памяти. (Первая занята аппаратным стеком.)
Разумеется, нормальная загрузка Атари подразумевает ТО ЖЕ САМОЕ, так как ATARI OS (Атарьская прошивка) тоже расположена в ПЗУ.

denpopov
12.03.2016, 08:48
ezswift, без комментариев мало понятно, что Вы делаете.
и один момент: а почему при обработке вектора прерывания VBLANK не сохраняются регистры A/Y ?

ezswift
12.03.2016, 08:52
Не знаю как проще, но чтобы перехватить картриджу управление он ОБЯЗАН представить данные о своих настройках, в ОЗУ,
В СПЕЦИАЛЬНО ОТВЕДЁННЫХ МЕСТАХ, чтобы затем к ним могли обратиться системные программы Атари СТАНДАРТНЫМ ОБРАЗОМ.
А системные программы как раз и производят из этих МЕСТ настройку реального оборудования,
путём постоянного переписывания данных из теневых регистров в HW-регистры.

denpopov
12.03.2016, 09:15
а регистры? насколько я знаю A,X,Y сохраняются при DLI.

ezswift
12.03.2016, 11:32
2denpopov.
Вот исправленный текст программки


1000 ; CONSOL STATUS ROUTINE
1010 ;
1020 ; ATARI EQUATES
1030 SDMCTL = $022F
1040 SDLSTL = $0230
1050 SDLSTH = $0231
1060 CONSOL = $D01F
1070 SETVBV = $E45C
1080 SYSVBV = $E45F
1090 ;
1100 ; PROGRAM CONSTANTS
1110 BL1 = $00
1120 BL7 = $60
1130 BL8 = $70
1140 GR0 = $02
1150 LMS = $40
1160 JTO = $01
1170 JVB = $41
1180 ;
1190 ; Z-PAGE CELLS
1200 Z_OLDL = $C0
1210 ;
1220 .OPT LIST,OBJ
1230 ;
1240 START *= $2000
1250 JMP INIT
1260 ;
1270 DLDATA
1280 L0 .SBYTE " Consol: /START/ /SELECT/ /OPTION/ "
1290 L1 .SBYTE " Consol: /Start/ /SELECT/ /OPTION/ "
1300 L2 .SBYTE " Consol: /START/ /Select/ /OPTION/ "
1310 L3 .SBYTE " Consol: /Start/ /Select/ /OPTION/ "
1320 L4 .SBYTE " Consol: /START/ /SELECT/ /Option/ "
1330 L5 .SBYTE " Consol: /Start/ /SELECT/ /Option/ "
1340 L6 .SBYTE " Consol: /START/ /Select/ /Option/ "
1350 L7 .SBYTE " Consol: /Start/ /Select/ /Option/ "
1360 ;
1370 TABRET
1380 .WORD L0,L1,L2,L3
1390 .WORD L4,L5,L6,L7
1400 ;
1410 NEW_DL
1420 .BYTE BL8,BL7
1430 .BYTE GR0+LMS
1440 LMSADR
1450 .WORD 0
1460 .BYTE JTO
1470 TO_OLD
1480 .WORD 0
1490 ;
1500 VBI
1510 LDA CONSOL
1520 ASL A
1530 TAY
1540 LDA TABRET,Y
1550 STA LMSADR
1560 INY
1570 LDA TABRET,Y
1580 STA LMSADR+1
1590 JMP SYSVBV
1600 ;
1610 INIT
1620 LDA #$06
1630 LDX # >VBI
1640 LDY # <VBI
1650 JSR SETVBV
1660 ;
1670 LDA #$00
1680 STA SDMCTL
1690 ;
1700 LDA SDLSTL
1710 STA Z_OLDL
1720 CLC
1730 ADC #3
1740 STA TO_OLD
1750 LDA SDLSTH
1760 STA Z_OLDL+1
1770 STA TO_OLD+1
1780 ;
1790 LDA # <NEW_DL
1800 STA SDLSTL
1810 LDY #30
1820 STA (Z_OLDL),Y
1830 LDA # >NEW_DL
1840 STA SDLSTH
1850 LDY #31
1860 STA (Z_OLDL),Y
1870 ;
1880 LDA #$22
1890 STA SDMCTL
1900 RTS


Ну, реально-то регистры на стеке сохраняются только для правильного вызова машкодов из программ Бейсика и для правильного возврата в Бейсик.

А моя программулька целиком написана на Ассемблере.

Попробую описать, что она делает:

В строчках 1000-1210 я обозначаю адреса ячеек, константы программы и адреса переменных, с которыми программе предстоит работать.

В строчке 1220 я говорю ассемблеру, что мне нужен листинг для печати и занесение в память машкодов.

В строчке 1240 я задаю Адрес START, с которого машкоды должны заноситься.

Строка 1250 сразу же занесёт три байта машкодов, начиная с этого Адреса - команду JMP и два байта адреса INIT.

Строки 1280-1350 тоже будут заноситься в последующие адреса в виде SBYTE - (представлены во внутреннем экранном представлении Атари)

Строки 1370-1390 представляют собой адреса по соответствующим меткам, то есть адреса начала наших экранных строчек.

Далее строки 1410-1480 тоже будут заноситься в последующие адреса - это команды и данные нового дисплей листа. Старый дисплей лист остаётся до поры нетронутым.

Строки 1500-1590 представляют собой коды программы VBI. Они заносятся последовательно в машкодах в память, но обращения к ним не будет, пока не выполнена подпрограммка инициализации VBI.


Делает VBI следующее:

1510 - Загружает значение CONSOL в Аккумулятор (значение от нуля до семи).

1520 - умножает значение Аккумулятора на 2 (значение 0-14 с шагом 2)

1530 - Загружает в регистр Y значение из Аккумулятора (Это будет ИНДЕКС)

1540 - Загружает в Аккумулятор значение из таблицы Адресов наших текстовых строчек - TABRET, со смещением от начала таблицы равным ИНДЕКСУ из регистра Y. Так как шаг смещения 2, то все они будут - LSB (младшие байты двухбайтовых адресов)

1550 - полученный LSB загружается в LSB в нашем Дисплей листе, там где команда считывания на экран строк - LMS.
(При прорисовки экрана именно эта строчка появится в нашей статусной строке!)

1560 - Увеличиваем наше смещение в регистре Y на 1, чтобы уже указывал на MSB адресов. Порядок байт в памяти Little Endian.

1570 - Загружает в Аккумулятор значение из таблицы Адресов наших текстовых строчек - TABRET, со смещением от начала таблицы равным ИНДЕКСУ из регистра Y, уже увеличенным на 1. Все они будут теперь - MSB (старшие байты двухбайтовых адресов)

1580 - полученный MSB загружается в MSB в нашем Дисплей листе, там где команда считывания на экран строк - LMS.
С этого момента Команда LMS дисплейного листа полностью инициализирована.

1590 - Переход по вектору системной подпрограммы выхода из Immediate VBI.
(Важно знать, что эта подпрограмма в конце имеет RTS, а поэтому чисто произведёт выход из VBI)

1610 - 1900 программа инициализации всех настроек нашей программы.
1620 - 1650 подпрограммка инициализации Системного Установщика Immediate VBI.

Для Immediate VBI:
в Аккумуляторе должна быть 6
в регистре X - MSB адреса начала подпрограммы (Метка VBI)
в регистре Y - LSB адреса начала подпрограммы
После этого должен быть вызов JMP SYSVBV (Системный установщик)

Вуаля! VBI работает!

1670 - 1890 Инициализация нашего дисплейного листа
МЫ ОБ ЭТОМ УЖЕ ПИСАЛИ!!!

1900 - выход в вызывающую подпрограмму!!! У нас в ДОС!

Задаю вопрос.
Чем занят комп, когда он включён, а на нём никто не работает и все устройства простаивают?

ОТВЕТ:
Он отрабатывает REPL!!! Read Eval Print Loop.
В ДОСе REPL свой, в Бейсике свой в Лиспе свой.
По сути, REPL - это закольцованная программа состоящая из:
1. Ввода
2. Вычисления
3. Вывода (Печать на экран или другое оконечное устройство),
а потом снова ожидание ввода ...

Вот в этот цикл REPL и возвращает нас RTS!

atariki
12.03.2016, 12:53
что - то я не могу всё это переварить (((

denpopov
12.03.2016, 13:47
что - то я не могу всё это переварить (((
да все просто, но замороченно.
программа инициализирует прерывание VBlank(прерывание перед каждым кадром), сам вектор опрашивает значение ячейки CONSOL( адрес $D01F) и выводит строку на экран, что нажато из клавиш - Start/Select/Option.
Параллельно формируется DisplayList, который состоит из двух частей:
одна адресована для строки состояния и переход на "остаток" Display List.

читай Atari Mapping, которую я тебе перезалил и сопоставь с русской версией, которую ты выложил.Качество скана паршивое, конечно, но разобраться можно.

один вопрос: что ты хочешь? просто так изучить бесполезно имхо.
А вот написать игрушку - это другое.

atariki
12.03.2016, 14:40
не просто так конечно же ))) да хотелось бы игру написать интересную, задумки есть.

denpopov
12.03.2016, 15:04
да хотелось бы игру написать интересную, задумки есть

ну опиши примерно, чтонить подумаем:)

по сути программирование, если не системное - это графика и форматы хранения данных и Display List, в аркадах еще и спрайты PMG и мизер прерываний. Ну и шрифты для 5ти текстовых режимов(:

atariki
12.03.2016, 15:12
ну что то типа бегающего сантехника, который чинит поломанные трубы и ему мешают там всякие нехорошие персонажи ну и в конце надо замесить босса и выйти победителем. игра типа комнаты, можно добавить интересностей типа нашёл ключ, открыл сейф, собрал узел - унёс установил. всякие там преграды типа: вот тут идёт пар, нужно уйти туда-то закрыть вентиль и потом отремонтировать. Игра начнётся глубоко внизу и перс будет подниматься выше и выше, когда он всё починит на верху стоит завод и он заработает. Смесь Scooter, Monty и Spy vs Spy. Можно ещё добавить дикого электрика, который будет кидать фазу "как бы случайно" на трубы и перса будет бить током вычитая немного жизни.

denpopov
12.03.2016, 15:30
а в 4 цвета графику втиснешь?

atariki
12.03.2016, 15:58
многие игры в 4х цветах, а почему в 4 цвета ? из за разрешения ?

ezswift
12.03.2016, 16:11
Я начинал с того, что записывал правила, не придуманные мной, а прошитые в Атари.

Правило 1. обязательно на какой-то ножке микросхемы, но не на сигнальных! сидит Земля!

Правило 2. контакты устройств выводятся через защитные цепи на ножки микросхемы.
- Если управляющий замыкатель разомкнут, значит на ножке микросхемы обязательно будет ~+5V.
- Если управляющий замыкатель замкнут, значит на ножке микросхемы обязательно будет ~0V.
Как говорят автомобилисты, "из-за замыкания искра ушла в землю".

Правило 3. Чтобы установить VBI прерывание по "обратному ходу луча", нужно
строго выполнить следующие действия:

в A засунуть тип прерывания Немедленное или отложенное, то есть 6 или 7
в X засунуть старший, а в Y- младший байт адреса, обработчика VBI, написанного нами
И запустить программу применяющую эти данные для установки прерывания SYSVBV/XITVBV(для отложенного) чтобы беспроблемно установить наше VBI.

Таких правил тыща и чтобы понять значение каждой требуется немалое время, работоспособность и терпение.

Для игры Вам может понадобиться джойстик, так я могу предоставить очень красивую ассемблерную программу, расшифровки его данных в VBLANK и предоставляющую данные смещений по осям X и Y для перемещающихся объектов.

Все правила для всех портов Атари одинаковые, поэтому Вы можете ТОЧНО сказать, что на любом сигнальном бите порта Джойстика всегда будет единица, если он в нейтральном положении...

denpopov
12.03.2016, 16:12
см. перечень графических режимов
http://gury.atari8.info/card_graphics_modes.php

9 и 11 имеют 16 цветов, но скорее всего это 16 оттенков одного цвета. Если использовать режим APAC 256, то будет много цветов и тормоза.

Ну и ничего, смотри, что выходит из 4х цветов:
Robbo (http://a8.fandal.cz/detail.php?files_id=2205)
Electrician (http://a8.fandal.cz/detail.php?files_id=1826)(моя любимая игруля)

atariki
12.03.2016, 16:22
надо просто цветовую палитру подобрать в 4х цветах и будет норм.

ezswift
12.03.2016, 16:24
Ну и как всегда, я посоветовал бы писать игры на PL65.

Он обладает неоспоримыми преимуществами.
1. Его библиотеки написаны в тексте, а значит могут изменяться любым программистом по СВОЕМУ усмотрению!
2. В нём есть встроенный ПОЛНОЦЕННЫЙ однопроходный, увы, ассемблер.
(Однопроходный, значит, что уже к режиму Ассемблирования, он должен знать ВСЕ данные, необходимые в режиме Исполнения.)
3. В нём есть Встроенный редактор кодирования
4. В нём есть Указатели!
И ко всему прочему, это - ОДНА программа, не выходя из которой можно всё и написать.
Работать с ним - высочайшее удовольствие!!!

denpopov
12.03.2016, 16:46
надо просто цветовую палитру подобрать в 4х цветах и будет норм

можно спрайты отдельно заюзать - еще 5 цветов.

ezswift
12.03.2016, 16:51
Я бы хотел, но не умею, написать "Логистическую стратегию". Они бывают в разном жанре, но общий принцып - доставь то, что нужно к нужному моменту.
Или накачай здоровья или накачай умений(тупо, разведай больше...) или накачай защиты или набери силушки.
Я без устали играю в парочку-троечку (и более) таких -
Earn 2 Die
Learn 2 fly
Crash of Castles (Там ещё много вычислений по Ньютоновской физике)
Всякие ARENA (Взял дубинушку - веселее стало!)
Последняя любовь - Swards and Souls!
Там клёвый пошаговый геймплей.
Если позаботился о счёте в Банке и он не пуст - он растёт.
С каждым уровнем больше.
То есть если я уже не могу ничего, то попробую после того как выпью кофе.
Может новую Дубинушку куплю...

atariki
12.03.2016, 17:25
можно спрайты отдельно заюзать - еще 5 цветов.

вообще великолепно тогда.

ezswift
23.03.2016, 22:50
Диалог!

Видать ассемблер умер.
Ну это - не моя беда..

denpopov
25.03.2016, 12:48
А интересно, есть ли внятное описание работы с устройствами с помощью ассемблера?

т.е. E: - экран, D:дисковод.

atariki
26.03.2016, 19:10
давайте начнём/продолжим с чего нибудь попроще ?

ZEman
26.03.2016, 22:50
http://atariage.com/forums/topic/247971-basic-tenliners-contest-2016/
примеры различных простейших (и не очень простейших :)) игр для атари.
есть куски кода и много интересного.

denpopov
27.03.2016, 22:57
давайте начнём/продолжим с чего нибудь попроще ?

а с чего? минимум - это графика и спрайты(PMG). Затем - опрос клавиатуры и джойстика. Ну и звук как последний.

atariki
29.03.2016, 08:45
ну да, хотя бы с этого.

ezswift
29.03.2016, 22:36
Давайте напишем Трояна для Атари.

То есть программу, которая исполняля бы НАШ код, а Атари и не знала бы об этом.

Что мы имеем в виду под "не знала"?
То, что Атари свой родной код всё равно исполняла бы, а потом незаметно для себя и наш.

Наш Троян безобидный. Пусть он меняет цвет экрана с их голубого на наш красный.

Начнём:
Опишем ячейки памяти Атари, существенные для нас.

; 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 = *

Вот рабочий код:



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


Теперь, сколько бы Вы не нажимали Ресет, MEMLO будет $191A

А это означает, что TROJAN работает.

denpopov
30.03.2016, 06:34
у меня брат с этой ерунды умер.

ezswift
01.04.2016, 21:47
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(...)

Вот!

Atari1974
30.12.2016, 23:23
Решил перейти в эту тему про ассемблер. Пока у меня после восстановления моей железки продолжаются муки выбора стартовой литературы. Вот тут 2 очень интересные книги http://seriouscomputerist.altervista.org/pages/resource/resource.language.htm
Под шапкой Osborne / McGraw-Hill: 6502 Assembly Language
Далее еще одна книженция.
И всякие сводные таблицы по процу 6502
http://seriouscomputerist.altervista.org/pages/resource/resource.language.htm
Еще хвалят такую книжку:
http://seriouscomputerist.altervista.org/pages/resource/resource.atari.htm
Atari: De Re Atari
Ну и еще та 130Xe про которую упоминал в своей теме про неизвестные знаки :)

Atari1974
06.01.2017, 18:57
Остановился на одной книге как основной. Это Programming the 6502 Rodnay Zaks четвертое издание 83го года. Материал изложен нормально, как я привык видеть в более современных изданиях. И главное она толстая :) Что то многие старые книги какие то ущербные по ассемблеру. В помощь ей еще один фолиант Osborne / McGraw-Hill: 6502 Assembly Language Programming
Ну и Atari Roots иногда поглядываю.
Изучаю неспеша пока азы.

dosikus
06.01.2017, 23:39
Остановился на одной книге как основной. Это Programming the 6502 Rodnay Zaks четвертое издание 83го года. Материал изложен нормально, как я привык видеть в более современных изданиях. И главное она толстая :) Что то многие старые книги какие то ущербные по ассемблеру. В помощь ей еще один фолиант Osborne / McGraw-Hill: 6502 Assembly Language Programming
Ну и Atari Roots иногда поглядываю.
Изучаю неспеша пока азы.
Ссылки бы на книжки подкинул, я о 6502, атари корни уже есть.
Да и не забудь что атари это не только процессор...

Atari1974
07.01.2017, 13:53
dosikus Вот залил книгу, по остальным ссылки давал.
https://1drv.ms/b/s!AhgJMQCCz_T5r0M-27RiZVYN82YX
Я естественно не забыл про другие компоненты но до них еще не дошел. Как только разберу главы по процу и закреплю азы так буду рыть дальше.

- - - Добавлено - - -

В книге De Re уклон на разбор Antic но бесит что там много бэсик кода хотя разбор идет именно на уровне ассемблера.

dosikus
07.01.2017, 18:56
Atari1974, вот , вот, ты начинаешь понимать где суть а где ненужная шелуха.

ram_scan
16.01.2017, 17:25
Понимаете, выучить Ассемблер очень легко! А пользоваться им для программирования (о-о-очень трудно).


Гораздо труднее выучить современный язык программирования со всеми его "мегафичами", а потом иметь голову как дом советов чтобы представлять во что написанный код откомпилируется.

Если ты знаешь ассемблер, понимаешь как работает машина и имеешь в руках компилятор с мощной системой макросов, то на ассемблере писать одно удовольствие (собственно си в свое время вырос из такого ассемблера, он своими конструкциями языковыми идеально укладывается в архитектуру PDP).

По состоянию на сегодня мне проще даже под windows писать на ассемблере, чем разбираться с гигабайтами говна что идет в составе SDK и потом как-то работает (а чаще не работает) и я не понимаю как от слова вообще без отладчика. И код получается в 100 раз компактнее. Причем по состоянию на сегодня даже под подобные системы проще писать программы на ассемблере и потом если надо их переписывать под другую архитектуру наново, чем писать на том-же си, и потом ловить годами на них глюки, потому-что оно компилируется, но из-за нюансов компиляторов, многозначностью стандартов и проглядов программиста работает неверно. Просто исходный текст программы на ассемблере раз в 20 короче сишного. И его быстрее переписать заново (все едино разбираться), чем в 20 раз больше разбираться а потом неуловимых блох там топтать.

А сложно писать на ассемблере только всякие тест-ромы, когда у тебя нету оперативной памяти и стека вообще, и которые предполагаются выполнять на неисправной машине. И где даже вызов процедуры (а тем более двухуровневый) превращается знатное в извращение, и все что у тебя есть в принципе - набор регистров процессора. Зато извращение изящное. Но такие извращения без ассемблера написать в принципе невозможно.

PS: кто-то в соседней теме диггера с писи портировал на куда-то. Написанную на си. Чтоб оно хотя бы компилировалось угробил месяц работы. Если бы она была написана на ассемблере за это время такую программу проще было написать заново. Заколдобистых мест в такой программе - по пальцам посчитать, и это звук и графика. Остальное макросами шляпать можно. В исходниках исправлений было больше чем в ней самого бинарного кода содержится. А сколько глюков потом полезет еще....

Hacker VBI
16.01.2017, 19:11
нихера.
неделя ушла на перевод старого кода в современный стандарт. и это просто рутинная работа руками.
а остальное время - это уже исследования, упрощения и непосредственно - сам порт.

"мне проще под windows писать на ассемблере" - это хорошо. а какие программы пишешь? покажи плиз

Oleg N. Cher
16.01.2017, 20:07
Гораздо труднее выучить современный язык программирования со всеми его "мегафичами", а потом иметь голову как дом советов чтобы представлять во что написанный код откомпилируется.Чем писать на асме, да? Насчёт сложности современных языков - подпишусь. А вот реализация в одиночку на асме того, что заговнокодено в тоннах SDK, без преувеличения, займёт не одну сотню лет. Попробуйте, например, написать на асме TCP/IP-стек.

Желание контролировать сложность и иметь системы, открытые на всех уровнях и достаточно обозримые, чтобы разобраться в них глубоко за короткое время (например, чтобы исправить баг или добавить фичу) породило интерес к простым ЯВУ. Например, Оберон - самый юзабельный из простых и самый простой из юзабельных. Легко транслируется в Си, но он настолько прост, что только за последние 5 лет я вижу появление десятка новых компиляторов. Есть разные диалекты Оберона, но здесь углубляться в это не буду. Чтобы не быть голословным, приведу несколько ссылок на новодельные компилеры.

https://deadsoftware.ru/forum/viewtopic.php?f=52&t=835http://comdivbyzero.blogspot.com/2016/10/vostok.htmlhttps://sourceforge.net/projects/ofrontplushttps://github.com/congdm/AyaCompilerhttps://github.com/aixp/O7https://github.com/vladfolts/oberonjshttps://sites.google.com/site/oberon07compiler/versiihttp://oberon.vishap.amhttp://freeoberon.su

Вот ещё мотиватор:

http://comdivbyzero.blogspot.com/2014/05/blog-post.html

P.S. Извините, что не по теме.

Shiny
19.01.2017, 07:27
Тема свалилась в оффтоп, по сути дела особой связи между ассемблером и Атари я не вижу.
Я с друзьями изучал компьютер по переводу Mapping The Atari, вышло примерно так:

- Графические режимы и форматы пикселей
- Спрайты или PMG
- Display List
- система прерываний (Display list, VBLANK,таймеры)

6502 прост, есть мало нюансов, связанных с кодом, например для меня было сложным операции 16бит.

Какой язык программирования выбрать? наиболее популярен cc65, но он громоздкий для настройки и необходимо изучение массы нюансов для Атари.


Для затравки предлагаю без ассемблирования угадать, каков результат работы программы?

LDY #0
M1:
TYA
STA(88),Y
INY
BNE M1

dosikus
19.01.2017, 10:36
Печать набора ATASCII символов на экране .
в SAVMSC 0x58 (88) адрес начала экранной памяти .

А чем все же асм не устраивает? WUDSN с MADS вполне комфортно. К тому же на pouet.net куча примеров.

Я вот забыл где видел описание и таблицу Shadow registers.

Shiny
19.01.2017, 11:09
Печать набора ATASCII символов на экране .

почти верно: для любого графического режима отобразятся не ATASCII. К тому же кодировка ATASCII отличается от так называемого internal (http://gury.atari8.info/card_atascii.php)



А чем все же асм не устраивает? WUDSN с MADS вполне комфортно. К тому же на pouet.net куча примеров.

Мне кажется, если с кодом не получается, или трудно написать логику, то проще взять язык. Или дизассембировать полученный код.



Я вот забыл где видел описание и таблицу Shadow registers.

в Mapping The Atari указывается Shadow/Hardware, список не помню.

nzeemin
19.01.2017, 20:17
Почитал тему. Как-то в основном крутится вокруг освоения ассемблера 6502, но он же очень простой.
В прошлом году я дизассемблировал игрушку Bruce Lee взятую с Atari 8-bit -- вот что получилось: https://github.com/nzeemin/uknc-brucelee/blob/master/original/BruceLee.lst
Раскручивал в основном пользуясь эмулятором Altirra -- он имеет много режимов отладки, хорошо собирает трассу, обращения к памяти.
И в этой работе я в итоге понял, что главное чего мне не хватает -- это знания аппаратуры Atari, того как работают устройства, какие есть режимы, как они выбираются итп. -- без этого даже полностью раскрученный исходник непонятен совершенно.
Соответственно, чтобы эффективно писать для Atari -- нужно изучить и держать в голове все его возможности, выраженные через способы использования его компонентов.

Shiny
19.01.2017, 20:48
что главное чего мне не хватает -- это знания аппаратуры Atari, того как работают устройства, какие есть режимы, как они выбираются итп

Да пока что и несложно:


0646: A9 78 LDA #$78
0648: 8D 07 D4 STA PMBASE [$D407]

Здесь задается адрес спрайтов, т.е. $7800, отсюда видны манипуляции с памятью.

попиарюсь немножко: спрайты или PMG (http://hype.retroscene.org/blog/597.html)



0632: A9 EA LDA #$EA ;
0634: 8D 02 D4 STA DLISTL ;
0637: A9 0E LDA #$0E ;
0639: 8D 03 D4 STA DLISTH ; $0EEA -> DLIST -- game mode display list


выходит, адрес DList=$0EEA. Иными словами говоря, это набор инструкций, как отображать экран.
вот только есть ошибка:
0EEC: .byte $40 ; 5 blank lines
Вернее будет LMS - указатель адреса для видеопамяти, по идее получается $2020.

Вообще, исследовать игрушки дело трудное.

ezswift
20.01.2017, 20:38
Здравствуйте, коллеги.

Я всё время программировал на Ассемблере на MAC/65, но он слишком для меня старорежимый, что-ли...

Ненавижу нумерацию строк и никак не могу запомнить команду ASM (кто там и за кем должен следовать...)

Когда я с вопросом о совершенном нативном ассемблере обратился к друзьям в AtariAge, мне ответил старина Конрад Кокожкевич Draco030 и написал, что ничего лучшего для Атари нет, кроме как MAE ассемблер Джона Харриса.

Я попробовал и оказалось, что это то, о чём я мечтал тыщу лет!

Преимущества:
- Продуманный интерфейс. (Я и впрямь видел такие славные программы!)
- Отсутствие нумерации строк
- Возможность работы как с Заглавными, так и со строчными буквами.
- Возможность программирования не только 6502, но и 65816 и пр.
- 3 режима текста: 40/64/80 колонок!
- С обиняками! совместим с MAC/65

Бяки тоже есть! Он лучше всего работает со 130XE.

Здесь спрашивали об ассемблерном доступе к устройствам...
...

Я покопался в текстах и на MAE могу предложить код вывода строки на экран (S:) с помощью CIO (Central Input/Output)

Как работает CIO?
Прежде всего, этот модуль всегда загружен во включённой Атари!
Затем, именно он СТАНДАРТНО обеспечивает АВТОМАТИЧЕСКУЮ работу с устройствами.
И наконец, он по Атарьски жутко мобилен. Я имею ввиду то, что Вы и сами можете его полностью переписать! (Так работает Любой СпартаДОС)

Для того, чтобы заставить работать CIO нужно совсем немного.
Нужно:
1. Дать Ассемблеру знать о стандартных регистрах CIO.
2. Дать знать о стандартных коммандах.
3. Дать знтать о стандартных режимах этих комманд.
4. Внести инфо о передаваемых данных.
5. Передать управление CIO.

ВСЁ!

Фактически, - заполнить несколько таблиц и вызвать CIO.
Далее Атари работает сама!

Важная особенность MAE - Желание Автора выполнить выравнивание по длине комманд Ассемблера к оп-кодам процессора
Чтобы текст программы стал читаем. СПАСИБО ему!

Поясню: и те и другие предпочтительно имеют длину 3 знака!

Таким образом,
.ORG преобразуется к .or (Origin)
OUT(нет в MAC/65) преобразуется к .ou (Output to disk)
.BYTE преобразуется в .by (BYTE)
.DS преобразуется в .ds - Define Space
и так далее.

К сожалению, MAE-Руководство написано, хоть и исчерпывающе подробно, но бессистемно и читать его - сущее мучение.

ПРИМЕЧАНИЕ:
Совсем не обязательно заполнять ВСЕ комманды и ВСЕ режимы CIO!
Атари будет пользоваться теми, которые мы указали как СУЩЕСТВЕННЫЕ!

Итак, вот программа вывода текста на Экран:


; Drac030 Rules Demo!
.ou dr.com

; CIO Equates
IOCB .or $0340
ICHID .ds 1 ; Handler
ICDNO .ds 1 ; Number
ICCOM .ds 1 ; Command
ICSTA .ds 1 ; Status
ICBAL .ds 1 ; Lo BufAdr
ICBAH .ds 1 ; Hi BufAdr
ICPTL .ds 1 ; Lo PutAdr
ICPTH .ds 1 ; Hi PutAdr
ICBLL .ds 1 ; Lo BufLen
ICBLH .ds 1 ; Hi BufLen
ICAX1 .ds 1 ; Aux 1
ICAX2 .ds 1 ; Aux 2

; Atari Equates
CIOV = $e456
RUNAD = $02e0

; Atari Constants
CLS = $7D
EOL = $9b

; CIO Commands
GETREC = 5
PUTREC = 9

; Setup CIO
.or $2000

start ldx #0 ;IOCB 0
lda #PUTREC ;want output
sta ICCOM,x ;issue cmd
lda #<msg ;low byte of msg
sta ICBAL,x ; into icbal
lda #>msg ;high byte
sta ICBAH,x ; into icbah
lda #0 ;length of msg
sta ICBLH,x ; high byte
lda #$ff ;255 char length
sta ICBLL,x ; low byte

; Call CIO to print string
jsr CIOV ;call cio
rts ;exit to dos

; Our message
msg .by CLS,"Drac030 Rules!!!",EOL

; Setup run address
.or RUNAD
.wo start
.en

Shiny
20.01.2017, 20:47
MAC/65 в старое время только спас наличием переводного руководства. Найти бы тот документ.

dosikus
21.01.2017, 14:08
Когда я с вопросом о совершенном нативном ассемблере обратился к друзьям в AtariAge, мне ответил старина Конрад Кокожкевич Draco030 и написал, что ничего лучшего для Атари нет, кроме как MAE ассемблер Джона Харриса.

Дык снова же на реале. Я то писал о писанине на ББ и смотрение на реале. А здесь похоже конкурентов для WUDSN и MADS нет.

Shiny
21.01.2017, 14:31
А здесь похоже конкурентов для WUDSN и MADS нет.

На реале таких IDE нет. На пейси только кросс-средства.

Atari1974
21.01.2017, 19:10
ezswift
MAE Ссылку на этот ассемблер можно?

ezswift
21.01.2017, 21:01
2Atari1974

http://mixinc.net/atari/mae.htm - Это Инструкция одновременно для 02 и 816, что чудовищно!

Не умею загружать на форум вложения...
Даю ссылку на atr с тремя 40/64/80 режимами Е:

http://atariage.com/forums/index.php?app=core&module=attach&section=attach&attach_id=487399

- - - Добавлено - - -

Способ взаимодействия Атари с устройствами.

Я наверное неоднократно предпринимал попытки рассказать о том, что Атарьские инженеры - вообще говоря, гениальны! Чего стоит один Стив Возняк, который работал на Атари.

Не вдаваясь в холивары по поводу Атари, Эпл, и Амига, попробую рассказать о взаимодействии ВНЕШНИХ устройств с Атари.

Во первых, они - ВНЕШНИЕ, а значит, придётся иметь дело с Вводом/Выводом.
Во вторых, они - РАЗНЫЕ, а значит, обладают разными опциями, которые должен задать Именно Программист.

Гениальные Атарьские Инженегры ПРЕДУСМОТРЕЛИ эти особенности и спроектировали УНИВЕРСАЛЬНУЮ систему Централизованного Ввода/Вывода.
(Как им это удалось?..)

Идея была простой.
При I/O машинка должна знать/обрабатывать следующие вещи:

1. Как компу распознавать обращение к именно этому устройству? (по именам!)
2. Это устройство ввода, или это устройство вывода?
Затем, соответственно генерировать номер ошибки... (Если не срослось...)
3. Если устройств много, нужен порядковый номер.
4. Если устройство НЕ СТАНДАРТНОЕ, то нужны дополнительные опции его работы.

Ну, а задав эти вещи, можно запускать универсальную программу.

Итак, универсальная... А почему? Потому, что применяется и для своих Атарьских внутренних и внешних устройств! Ничего идеологического не нужно менять!

Это я к тому, что при включении Атари, хотите Вы или нет, ИСПОЛЬЗУЮТСЯ
1. Редактор
2. Возможность вывода на графику
3. Кассетник, Принтер, и пр.

По цифрам каналов ввода/вывода это 0, 6, 7.
(Ясно, что если чего-то нет, то не используется и можно их программировать... [Но при загрузке инициализируется всегда!]) Пардон, если нет картриджа, так как он главнее!

Кроме этого, AtariOS и Бейсик сами произвольно используют что-то из Ввода/Вывода!!! для внутренних нужд! (Это относится к опциям, а не к вводу/выводу, но они запросто могут переписать Ваши коды,если не убережётесь.)

Итак, Атари CIO. Централизованный Ввод/Вывод!

С точки зрения пользователя, работает так:
Если правильно задать инициализацию и передать управление правильному Вектору (Это такая фигня, которая содержит переходы на обработчики(handlers), то есть JMP <адрес>.), тогда всё произойдёт само собой и Вы в шоколаде.

Если нет, то Ваш обработчик ошибок (А Вы его написали?) выдаст ошибку ввода/вывода, которая легко распознаётся по номеру и всегда больше 127.
Это пгтому, что до 127 - это ошибки Бейсика, а после - ошибки устройств.

Как написать Инициализацию?

В Атари максимально может быть одновременно работающих устройств 8!
Программист решает, будет ли он работать с текстом или нет, будет ли он выводить графику, будет ли он работать только с дисководом...

В зависимости от этого, определяется количество и нумерация свободных устройств.

Откуда берёт данные программа Централизованная ввода/вывода?

Из Базы Данных
Как и любая База Данных, она строго структурированна и определена.

Блоков в ней 8 - по числу устройств, Записей в каждом блоке 16 (с избытком)

Начинается она в Атари с адреса $0340!

Называется IOCB (Input Output Control Block)

Поля в Базе всегда строго определены, для универсальности.
Ёрзать с устройствами можно, пользуясь ДОПОЛНИТЕЛЬНЫМИ полями, или, модификаторами.

Вот структура этой Базы данных:

; CIO Equates
IOCB .or $0340
ICHID .ds 1 ; Handler ID
ICDNO .ds 1 ; Number
ICCOM .ds 1 ; Command
ICSTA .ds 1 ; Status
ICBAL .ds 1 ; Lo BufAdr
ICBAH .ds 1 ; Hi BufAdr
ICPTL .ds 1 ; Lo PutAdr
ICPTH .ds 1 ; Hi PutAdr
ICBLL .ds 1 ; Lo BufLen
ICBLH .ds 1 ; Hi BufLen
ICAX1 .ds 1 ; Aux 1
ICAX2 .ds 1 ; Aux 2
ICAX3 .ds 1 ; Aux 3
ICAX4 .ds 1 ; Aux 4
ICAX5 .ds 1 ; Aux 5
ICAX6 .ds 1 ; Aux 6

Поясню, .or в MAE Assembler = Origin
.ds в MAE Assembler = Define Space, Size

Далее, для прикола...
Атарьские Гении поняли, что если длина блока Базы данных будет ровно 16 байт, то тогда программисту не нужно будет ничего считать!

То есть: Предполагая адресацию к полям, такую как
CMD ADDR,X

мы, для нулевого устройства имеем

LDX #$00

Для Первого
LDX #$10

Для Второго
LDX #$20
...


На сегодня - всё.
Удачи!

Shiny
21.01.2017, 21:15
Чего стоит один Стив Возняк, который работал на Атари

на Apple.

ezswift
21.01.2017, 23:02
Дружищще!

Когда не было Эпл, и Возняк (Крутой инженер) и Джобс (Крутой мэнагер) работали на Атари.

Совместный проект был Sweet 16.

Он не был реализован, но коды для Атари в формате MAC/65 есть у Карстена Строттмана на xWiki

https://atariwiki.org/wiki/Wiki.jsp?page=Sweet16Mac65

Никто ими не пользовался и Слава Богу!
...
Аппаратура не позволяла...
А когда инженегры понимают, что аппаратура позволяет, а что нет - это есть Гууд!

Atari1974
21.01.2017, 23:24
ezswift
Не умею загружать на форум вложения...
Даю ссылку на atr с тремя 40/64/80 режимами Е: К сожалению я новичек и не понимаю в этом. У меня 130xe

ezswift
22.01.2017, 00:13
Ой!

atr - это образ атарьского диска.
он, при соответствующем оборудовании, может быть подгружен в нормальную атарьку.

У меня есть SIO2PC, что позволяет грузить атры в HW.
Также у меня есть SIO2SD и SIO2IDE, что тоже позволяет Атари увидеть SecureDigital или Жесткий диск.

Важно другое.
Если есть Atari800 Эмулятор, (их тыща!)
то и на ПиСишке можно программировать или играть.

Главное, что эмулятор видит atr как Диск и читает/пишет его...
Сам я использую Atari800WinPlus 4.1 для программирования.

Он позволяет налету перекодировать Win-ATASCII то есть, программирую на Win, а затем это гладко читается в Атари.

Atari1974
22.01.2017, 00:35
ezswiftЕсть у меня SIO2PC. Была же ссылка. Где она ?

nzeemin
22.01.2017, 00:48
Когда не было Эпл, и Возняк (Крутой инженер) и Джобс (Крутой мэнагер) работали на Атари.
Несколько оффтоп конечно, но вот вам иллюстрация какой Джобс "крутой менеджер".
Речь как раз идёт о том коротком периоде когда в компании Atari работал Стив Джобс. Он вызвался решить задачу по минимизации числа микросхем для новой игры Breakout, и сделал это -- с помощью Возняка. За успешное решение такой задачи была назначена премия. Задача была решена не просто успешно, а "гениально", и всего за четыре дня, вместо нескольких месяцев -- типичного срока для подобной проблемы.

https://img-fotki.yandex.ru/get/65759/7448436.8/0_9e972_11f936b6_orig.png

Вот так. Технарь получил $350, напарник/посредник -- $5350, вроде как за "общую" работу.

(цитата из книги "Atari Inc. Bussiness is Fun".)

Shiny
22.01.2017, 06:56
Когда не было Эпл, и Возняк (Крутой инженер) и Джобс (Крутой мэнагер) работали на Атари

https://ru.wikipedia.org/wiki/Возняк,_Стив

creator
22.01.2017, 10:36
Несколько оффтоп конечно, но вот вам иллюстрация какой Джобс "крутой менеджер".

Вот так. Технарь получил $350, напарник/посредник -- $5350, вроде как за "общую" работу.
Так всё правильно, крутость менеджера в этом и выражается. К честности/справедливости/совести/человечности и прочим подобным лингвистическим конструкциям это не имеет никакого отношения. ;)

ezswift
22.01.2017, 18:22
2Atari1974
Честно говоря, я об инструкции по MAC/65 на русском и не слышал ни разу.

В этой теме я атр с MAE приаттачил.
На самом деле это - тот-же MAC/65, только в сто раз удобнее. Делал его Джон Харрис, а он работал на OSS в том числе и над MAC/65.

ezswift
25.01.2017, 17:30
Стандартная работа с вводом-выводом Атари.

Изначально, система Ввода/Вывода (I/O) Атари, которая называется CIO, конструировалась гениальными Атарьскими инженерами с целью максимального абстрагирования от устройств.
Поэтому, все стандартные устройства I/O, с точки зрения Атари выглядят (а, значит и программируются...) ОДИНАКОВО!

Это - огромное облегчение программисту! Раз научился,.. и - вперёд!

Первый уровень абстракции - Система Векторов.
Вектор - это Адрес, содержащий Адрес Обработчика!
Находясь внутри нашей программы мы даём команду JSR ADDR и Обработчик, обязательно заканчивающийся командой RTS, исполнив обработку устройства, вернёт исполнение на команду, следующую за вызовом.
Абстракция здесь в том, что изменяя содержимое самих векторов, мы можем программно вызывать не страндартные, а, написанные нами обработчики, притом, что адрес перехода на вектор останется в нашей программе тем же!

Второй уровень абстракции - Терминал.
Терминал, для тех, кто знаком с языком Си - это три состовляющих:
- Стандартный ввод - stdin
- Стандартный вывод - stdout
- Стандартный вывод ошибок - stderr
В Атари, идеологически реализована такая же система!!!

Терминалом можно назвать устройство "E:" (Берёт с "K:", кладёт в "S:") хотя с оговоркой, что обработка ошибок лежит на совести программиста!
Для нас, в данном контексте, существенно, что:
- ошибки OS, в количестве 127 - это ошибки BASIC или AtariOS(Атарьский BIOS)
- выше 127 - ошибки Внешних устройств!
Любое устройство, взаимодействующее с Атари через CIO, возвращает код ошибки, который автоматически копируется обработчиком CIO в регистр процессора Y !!!

Так как любое число типа БАЙТ, превышающее 127 в Атари устанавливает процессорный флаг N(Negative) в единицу, то, скопировав регистр Y в Аккумулятор и проверив этот флаг в ассемблере, мы сразу можем определить прошла операция или нет.
Простейшая обработка ошибки заключается в "ЧИСТОM" закрытии процедуры, без вывода причины.

Третий уровень абстракции - Структура IOCB (Блока настроек ввода-вывода.)
(IOCB - Input/Output Control Block.)

Таких структур, максимально ...
(Конструктив, ничего не поделаешь...),
в Атари может быть 8 (от 0 до 7)! Каждый размером в 16 байт.

Этот блок должен содержать:
1. ID - номер обработчика данного устройства в списке устройств, таких как "C:", "D:","E:" и пр.
2. Номер актуального устройства (в смысле "D1:-D8:")
3. Токен команды ввода-вывода
4. Здесь ВЫВОДИТСЯ номер успешности операции или номер ошибки I/O. (Копируется в Y!)
5. Адрес Буфера для данных
6. Адрес PUTCHAR - обработчика вывода данных на экран, без единицы (минус 1)
7. Длина буфера для данных
и ещё 6 байт для опций и модификаторов Ввода-Вывода.

Ещё раз повторю!
С целью унификации доступа ко всем внешним устройствам, Атари определила структуру доступа, которая должна быть целиком, или частично, в зависимости от задачи, заполнена.
Эта структура поэлементно поименована и длина её полей однозначно определена.
В частности, любые адреса и длина буфера - это значения типа WORD, остальные - типа BYTE.

Так как каждое поле структуры поименовано, достаточно добавить правильное СМЕЩЕНИЕ, к нулевой структуре, чтобы получить доступ к ТАКОМУ-ЖЕ полю, нужному нам.

Неплохо добавить, что ,так как длина любой IOCB структуры равна 16, а в 16-ричном исчеслении $10, то поиск начала структуры не состовляет труда, например отступ структур:
- для нулевой = $00
- для первой = $10
- для второй = $20
...
- для максимальной - седьмой = $70
НРАВИЦА?

Ну, ладно...

Прежде, чем пытаться что-то спрограммировать Вы должны понять, что после загрузки, некоторые IOCB в Атари ЗАВЕДОМО используются!!!

Нулевой IOCB
- для работы с терминалом "E:"
(Именно с ТЕРМИНАЛОМ!
Атари так и проектировалась!!!
Другой известный терминал - ATARI XEP80, Малоизвестные терминалы - ATR8000 [80-cols], INDUS GT[80-cols], LDW Super2000 [80-cols], CA2001/CA2002 [80-cols]).
Шестой IOCB
- для работы с графикой и цветными текстовыми режимами.
Седьмой IOCB
- для работы с Принтерами и Кассетником.
Другие
- разные, для разных ДОСов используются для обращения к Batch файлам и для перенаправления ввода-вывода. УЧИТЕ МАТЧАСТЬ ДОСов!

На сегодня, пожалуй всё.
Надеюсь, что был полезен...
ez

rl76
25.01.2017, 22:03
которая называется CIO,
А Вы не напутали, может быть правильно SIO?
Оппа... Точно CIO Ж)

ezswift
16.02.2017, 13:09
Привет всем!

Наконец-то я удосужился запилить на ютьюбе видео по ассемблированию ввода-вывода на Атарьке. :)
Вот ссылочка - https://youtu.be/fttWfXte4NY

Со временем, продолжу...
ez

ezswift
18.02.2017, 11:32
Сегодня залил видео о макросах в МАЕ-Ассемблере
Вот ссылочка - https://youtu.be/20DMY9m1NMM

Shiny
18.02.2017, 11:55
Макросы у MADS отличаются немного. Хотелось бы узнать о них, потому что не нашел описания, я в них путаюсь иногда.

ezswift
19.02.2017, 20:23
Здравствуйте, Шинни!

Рад, что Вы не устали ещё от ассемблера. :)

Дело в том, что идея макропрограммирования - сама собой, принципиально, маленько ущербна.

Все макросы АБСОЛЮТНО зависят от ПРОГРАММИСТА, который рожал их парсинг!

Макросы на Лиспе - это не то, что макросы на Си, а макросы на ассемблере наличиствуют в количестве штук, равном макроассемблерам.

Просто, нет ОБЩЕГО понимания того, что есть макрос.
Принципиально, дело в том, что MADS - кроссассемблер.
Это важно, так как он работает в нативном режиме на машине в миллион раз более мощной, чем Атари.

Но, ведь, существует разница и в родных Макроассемблерах Атари!
Например Макроассемблер Ассемблера MAC/65 намного более мощный, чем Макроассемблер МАЕ.
Однако, есть большие затруднения в том, чтобы программисту ассемблера понять, по какому пути ему идти!!!
Должен признать, я принципиально, не знаю ни одного программиста на MAC/65, который работал бы с макросами.
Их просто понять никто не может. А дебаггировать тем более.

Да, это - по сути, и не важно.
Джон Харрис выбрал путь прямой подстановки!!!

Разумеется, прямая подстановка не используется в кроссассемблерах, так как парсинг кода позволяет получать описания ошибок даже ещё при макроассемблировании (в PC), что в МАЕ недоступно.

Вот Вам пример ЭЛЕГАНТНОГО макрокода в MAC/65.
В нём НИЧЕГО не вычисляется во время исполнения кода!!! Всё вычисления заданы в макросе, а значит, проводятся при первом проходе ассемблера.

Код просто проходит по изменяемым адресам в Программном Счётчике и в результате получаем ВОЛШЕБСТВО!

2470 ;-----------------------------
2480 ; MACRO #2 "NEWPAGE"
2490 ; Этот макрос устанавливает программныё счётчик
2500 ; на следующую чётную страниуц.
2510 ; EXAMPLE:
2520 ; (Пусть PC сейчас установлен на $4322)
2530 ; NEWPAGE
2540 ; (По выполнении станет $4400)
2550 ;
2560 ;Follow: *=$4322
2570 .MACRO NEWPAGE
2580 *= *&$FF00 ; *=$4300
2590 *= */$0100 ; *=$0043
2600 *= *&$FF ; *=$43
2610 *= *+1 ; *=$44
2620 *= **$0100 ; *=$4400
2630 .ENDM
2640 ;Follow: *=$4400
2650 ;

Напомню:
&FF00 - в разрядах, где FF - всё остаётся, где 00 - стирается.
/0100 - получаем точное число страниц с недостатком. В МЛАДШЕМ байте.
&$FF - всё, что было - остаётся, но в старшем байте ничего.
*+1 - Число страниц увеличивается на 1.
**$0100 - и при умножении на 256, становится старшим байтом!!!

Как бы это лучше объяснить...
Просто, САМ Ассемблер всё считает, а Результат ВОЛШЕБНО появляется в виде числа в коде.

Также можно определить 1кб-отступ для нового шрифта(он обязан начинаться на границе 1кб), отступы для PM-графики и так далее...

Этот макрос ОЧЕНЬ нужен!

Уже двое суток не могу перевести его в МАЕ...
Базарная документация и нет примеров.
(В доках Харрис хотел описать ВСЁ СРАЗУ для 6502 и 65816.
Так как 65816 сложнее, 6502 затерялся! А так, всё понятно... Кто ищет - тот найдёт.)

Проблема здесь не в том, что я не понимаю Атари.
Проблема в том, что я не понимаю Харриса (Его Дзена описания Макросов.)
Так, на то он - Босс!
ez

Shiny
20.02.2017, 09:52
Напомню:
&FF00 - в разрядах, где FF - всё остаётся, где 00 - стирается.
/0100 - получаем точное число страниц с недостатком. В МЛАДШЕМ байте.
&$FF - всё, что было - остаётся, но в старшем байте ничего.
*+1 - Число страниц увеличивается на 1.
**$0100 - и при умножении на 256, становится старшим байтом!!!

хм. я видел выравнивание при использовании z80:

(adres+$FF)/256

к тому же директива align 256 выравнивает код по "правильному" адресу.

Макросы мне не нравились, потому что есть масса ассемблеров и каждый использует макросы по-своему или не использует вообще.

в журнале Analog я встретил интересное применение:


*=$2000
AUDF1=$D200
AUDC1=$D201
AUDCTL=$D208
SKCTL=$D20F

.MACRO SOUND ; voice,pitch,dist,vol;,dur
lda #%2
sta AUDF1+2*%1
lda #[[%3 * 16] | %4] ;lda #[[%3 shl 4] or %4]
sta AUDC1+2*%1
.ENDM

lda #0
sta AUDCTL
lda #3
sta SKCTL

SOUND 0,121,10,8

jmp *


это по-нашему xD

ezswift
21.02.2017, 12:09
Ещё одно видео залил с программкой вывода директории :)
https://youtu.be/65dlc4G_CNY
ez

atariki
25.02.2017, 05:11
перечитываю ветку, мало по мальски проясняется, давайте продолжать ?

atariki
27.02.2017, 06:36
В общем страсти по АСМ у меня кипят, время 5:30 Мск идти на работу, а я по видеоурокам перегоняю из mac65 в mae )))
нашёл hello world под mac65


05 .OPT OBJ
10 *= $0600
0100 ; CIO
0110 ICHID = $0340 ;IOCB 0 S:
0120 ICCOM = $0342 ;IOCB Command
0130 ICBAL = $0344 ;Xfer Buffer Adr
0140 ICBAH = $0345
0150 ICPTL = $0346 ;PutByte Adr
0160 ICPTH = $0347
0170 ICBLL = $0348 ;Buffer Len
0180 ICBLH = $0349
0190 CIOV = $E456 ; CIO Vector
0500 ; Setup CIO Call
0510 LDX #0 ;IOCB 0
0520 LDA #9 ;Put Cmd Val
0530 STA ICCOM,X ;Set it as the cmd
0540 LDA #HELLO&255 ;Str low byte
0550 STA ICBAL,X
0560 LDA #HELLO/256 ;Str high byte
0570 STA ICBAH,X
0580 LDA #0 ;Str Len low byte
0590 STA ICBLL,X
0600 LDA #$FF ;Str Len high byte
0610 STA ICBLH,X
0620 ; Call CIO
0630 JSR CIOV
0640 RTS
1000 HELLO .BYTE "Hello World!",$9B

переделал его в mae


; hello world !
.ou hello.com
.or $0600
; CIO

ICHID = $0340 ;IOCB 0 S:
ICCOM = $0342 ;IOCB Command
ICBAL = $0344 ;Xfer Buffer Adr
ICBAH = $0345
ICPTL = $0346 ;PutByte Adr
ICPTH = $0347
ICBLL = $0348 ;Buffer Len
ICBLH = $0349
CIOV = $E456 ; CIO Vector

; Setup CIO Call

LDX #0 ;IOCB 0
LDA #9 ;Put Cmd Val
STA ICCOM,X ;Set it as the cmd
LDA #HELLO&255 ;Str low byte
STA ICBAL,X
LDA #HELLO/256 ;Str high byte
STA ICBAH,X
LDA #0 ;Str Len low byte
STA ICBLL,X
LDA #$FF ;Str Len high byte
STA ICBLH,X
; Call CIO
JSR CIOV
RTS
HELLO .BYTE "Hello World!",$9B

.or $0600
.en

как я понял:
строчка в начале .ou filename.com, обязательна для компиляции файла в исполняемый.
так же как и в конце
.or $0600
.en
обязательны к запуску.

Заработало. Но что там в программе я так до конца не понимаю.
Куча кода вместо:
10 PRINT "HELLO WORLD !!!"

Shiny
27.02.2017, 11:57
Куча кода вместо:
10 PRINT "HELLO WORLD !!!

для atasm есть директива SBYTE, которая преобразует текст в Internal коды, так что печать реализуется проще, но не столько сложнее.

atariki
01.03.2017, 08:29
label :20 как заменить чтобы работало ? в мае этот ярлык не прокатывает.

ezswift
01.03.2017, 15:25
Привет всем Атаристам-Восьмибитникам!

Метки в МАЕ Ассемблере начинаются с буквы, или символов @, _, или ?.
? - означает, что метка локальная, то есть видна только в данном блоке.
Они не должны содержать пробелоа и в тексте метки могут содержать цифры и знак точки.
Длина метки может быть до 15 символов.

Обычно я заканчиваю файл следующей конструкцией:



; ====================
; Setup Run Address
.or RUNAD
.wo start
;
.en


Директива .SBYTE в МАЕ Ассемблере заменена на трёхсимвольную .sb .

Залил ещё видео: https://youtu.be/gUt6qpD1xi0
ez

Shiny
01.03.2017, 17:22
Обычно я заканчиваю файл следующей конструкцией:

Кстати, а прокатит подобная инструкция?



*=$2E0
.word start


?

ezswift
01.03.2017, 17:50
Это, наверное шутка,
так как по разным причинам Харрис решил не пользоваться Программным Счётчиком базарно.

То-есть, *= ДОЛЖНА быть заменена на .or .
А вот .word start - прокатит, так как Харрис писал MAC/65 и любил его, как и мы все...

Он НЕ НАСТАИВАЛ на трёхбуквенных сокращениях! Просто не любил долбить клавиатуру.
Я - тоже.

Могу выложить мои библиотеки, зря, что-ли писал?
...
Я для Вас, тех, которые хотят узнать,ЧТО ТАКОЕ КОМПЬЮТЕР, пишу!

Потому, что это - НОВАЯ ЖИЗНЬ, а вовсе не гаджет в кофемолке.
ez

Shiny
01.03.2017, 17:53
Это философия, но не ответ(:



Могу выложить мои библиотеки, зря, что-ли писал?

не зря, конечно. Те, кто начинает с нуля, оценят наверняка.

ezswift
01.03.2017, 18:40
; syseq.mae

; GP Equates

; Atari Equates
SAVMSC = $58
SDLSTL = $230
SKCTL = $d20f ; Silence=3
MEMTOP = $02e5
MEMLO = $02e7

; Atari Vectors
RUNAD = $02e0
CIOV = $e456

; Atari Varyables
ROWCRS = $54 ; Byte
COLCRS = $55 ; Word


; Atari Tokens
EOL = $9b
EOF = $88
CLR = $7d
CUP = $1c ; To prev line
CDN = $1d ; To next line

; IOCB Structure

iocb .or $0340
;
ICHID .ds 1
ICDNO .ds 1
ICCOM .ds 1 ; * Cmd
ICSTA .ds 1
BFADR .ds 2 ; * BufAdr
PTADR .ds 2 ; Hnd (adr-1) PutChar
BFLEN .ds 2 ; * BufLen
ICAX1 .ds 1 ; * Mod
ICAX2 .ds 1 ; * Opt
ICAX3 .ds 1
ICAX4 .ds 1
ICAX5 .ds 1
ICAX6 .ds 1

; IOCB Offsets
iocb0 = $00
iocb1 = $10
iocb2 = $20
iocb3 = $30
iocb4 = $40
iocb5 = $50
iocb6 = $60
iocb7 = $70

; CIO Commands
COPEN = $03
GTREC = $05 ;Get TEXT Record
GTBYT = $07 ;GeT Byte
PTREC = $09 ;PuT TEXT Record
PTBYT = $0b ;PuT Byte
CCLSE = $0c
CSTAT = $0d

; Command Mode
OREAD = $04
OPDIR = $06
OWRIT = $08
OPAPP = $09
OPUPD = $0c

; Command Options
OSHOR = $00
OLONG = $80

; >>> EOF <<<


- - - Добавлено - - -



; macro.mae

; GP Macros

; Move_Immediate_Byte
; form: mib <byt> <loc>
!!!mib .md
lda #:1
sta :2
.me

; Move_Immediate_Word
; form: miw <wrd> <loc>
!!!miw .md
lda #>:1
sta 1+:2
lda #<:1
sta :2
.me

; Move_Absolute_Byte
; form: mab <loc1> <Loc2>
!!!mab .md
lda :1
sta :2
.me

; Move_Absolute_Word
; form: maw <loc1> <loc2>
!!!maw .md
lda 1+:1
sta 1+:2
lda :1
sta :2
.me

; CIO Macros

; Set IOCB Offset
; form: ofs <ch>
!!!ofs .md
ldx #iocb:1
.me

; Set Buffer Adress
; form: bfa <lbl>
!!!bfa .md
lda #>:1
sta 1+BFADR,x
lda #<:1
sta BFADR,x
.me

; Filespec As String
; form: fas <"str",EOL>
!!!fas .md
jmp ?L
?F .by :1
?L lda #>?F
sta 1+BFADR,x
lda #<?F
sta BFADR,x
.me

; Set BuFfer Length
; form: bfl <len>
!!!bfl .md
lda #>:1
sta 1+BFLEN,x
lda #<:1
sta BFLEN,x
.me

; CHecK Status
; form: chk <iferr-adr>
!!!chk .md
tya
bmi :1
.me

; TERM Macros

; Set X,Y Coords
; form: pos <x> <y>
!!!pos .md
lda #<:1
sta COLCRS
lda #>:1
sta COLCRS+1
lda #:2
sta ROWCRS
.me

; >>> EOF <<<


- - - Добавлено - - -



; iolib.mae

; Subroutines

; call jsr ...
; For all subs:
; buffer & buflen
; must be defined in main code!!!
;
; X = IOCB Offset
; A = Mode (ICAX1)
; Y = Option (ICAX2)
; On exit:
; Y = status

close
lda #CCLSE
jmp exec
open
; bufer and buflen
; to be defined in Main!
sta ICAX1,x
tya
sta ICAX2,x
lda #COPEN
jmp exec
input
; bufer and buflen
; to be defined in Main!
lda #GTREC
jmp exec
print
; bufer and buflen
; to be defined in Main!
lda #PTREC
jmp exec
getby
; bufer and buflen
; to be defined in Main!
lda #GTBYT
jmp exec
putby
; bufer and buflen
; to be defined in Main!
lda #PTBYT
jmp exec
putch
; X = IOCB offset
; A holds <char>
tay
lda PTADR+1,x
pha
lda PTADR,x
pha
tya
rts
exec
; A holds Command Byte
sta ICCOM,x
jmp CIOV

; >>> EOF <<<

atariki
02.03.2017, 19:41
;
;
.ou $2000
;
colbk = $d01a
colpf2= $d018

main .proc ; если вписать .proc main - работать не будет.
loop clc
adc #1
:20 nop
sta colpf2
jmp loop
.endp

результат будет вот такой:
http://savepic.ru/13083188m.png (http://savepic.ru/13083188.htm)
а должен быть другой, полосы должны быть широкие и ровные.
Что я только не ставил перед 20 не работает так как надо))
Или может программа написана не правильно ? Я её взял с канала Piter Dell на youtube.

Shiny
02.03.2017, 20:08
STA WSYNC после записи значения забыл?

Кажется, JAC! использовал не счетчик, а LDA VCOUNT

atariki
02.03.2017, 21:08
Вот оригинал:

http://savepic.ru/13071939.png

а вот моё:


;
;
.or $2000
;
colpf2= $d018
colbk = $d01a
;
main .proc ; если вписать .proc main - работать не будет.
lda #38
loop clc
adc #1
:20 nop
sta colpf2
jmp loop
.endp

Shiny
02.03.2017, 21:29
http://1.bp.blogspot.com/-KI3LWHSvzuI/Vi8LO1DYTNI/AAAAAAAACHw/9fK8whzWS4I/s1600/atari0001.png

без PLA/RTS


*=$600

pla
RTCLOK = $0012
;wait_frame
wf
lda RTCLOK+2
waits
cmp RTCLOK+2
beq waits

; ldx #02
lp0
ldy #$00
lp1 lda $d40B;vcount
lsr a
lsr a

clc
adc RTCLOK+2

sta $d01a
sta $d01a-2
sta $d40a;wsync
iny
bne lp1
lda 764
; cmp #$ff
; beq wf
bmi wf
rts


- - - Добавлено - - -


.proc main - работать не будет.
еще бы, с .endp

xD

atariki
02.03.2017, 22:09
в общем ясно-понятно, что мне ничего не понятно))

- - - Добавлено - - -

Может конфу в скайпе замутим, пообщаемся ?

Shiny
03.03.2017, 09:45
Может конфу в скайпе замутим, пообщаемся ?

лучше в почту пиши: hruhru.hru@yandex.ru


насчет линии - можно как вариант использовать гр.режим 8, тогда каждая линия будет своего цвета, либо попробовать 559=0 и записывать значения в аппаратный для 712(не помню номера).

у JAC!'a интересный вариант,надо считать тайминги, не понятно, как этот пример работает.

- - - Добавлено - - -

по поводу эффекта: описано здесь (http://krap.pl/mirrorz/atari/homepage.ntlworld.com/kryten_droid/Atari/800XL/atari_hw/antic.htm)
и примерчик из демки, порт эффекта на ZX.

ezswift
08.03.2017, 17:17
Я снова опубликовал видео:
https://youtu.be/2CaNTPcTLss
Это - программа создания файла настроек для описания прямого доступа к терминалу

atariki
08.03.2017, 18:36
Жень, скинь пожалуйста русский шрифт который у тебя на видео, если не затруднит, благодарю за уроки !

ezswift
08.03.2017, 22:14
Нужно, ли?!!

Я говорю, что у меня наклейки русского шрифта для Атари НА КЛАВЕ!
Это - машинописный шрифт!

И как сделать - то?
Как опубликовать - не знаю совсем!

Имею Русско-НАПИСАННУЮ! программу (Самую лучшую! IMHO) для создания шрифтов,
Адаптированные программы для текстовок и эл.таблиц,
...
Что-то ещё...

Я, просто не знаю, как это всё публиковать, когда все интернецкие медиа постоянно исчезают!
Щас Дропбокс грозится отключить расшаренную область...

У меня здоровенный архив фоток с 90-х пропал на minus.com.
Семизначник с Аськи сдох, так как он требовал
перерегистрацию с 2000-ных, а я не пользовался с 90-х ...

Дай способ КУДА закинуть атры и я буду соответствовать...

Не жалко!
И привет, украинским братьям!!!

ez
:)

atariki
09.03.2017, 07:41
при отправке сообщения, заходи в расширенный режим, там есть управление вложениями и прямо туда заливай, там не сложно, можно архивом залить и прямо в текст вставить

ezswift
09.03.2017, 20:53
Здра!!!
Новое кино залил.
Полезное.
А это файлик с русскоязычными прогами.

60026

- - - Добавлено - - -

Да, и ещё, когда запустишь CALC нажми циферку от 0 до 3
- Эти руссификаторы даже о промпте не удосужились позаботиться.

Это фашизм многих игр.
Я, ваще, знал лично Максима Никифорова.
Приятный Мэн!

atariki
09.03.2017, 23:26
Вот у меня ещё на кассете было очень давно
60035

- - - Добавлено - - -

из "кина" только пять частей ))

ezswift
10.03.2017, 11:10
По поводу шрифтов я хотел бы тоже кино запилить.
Это темка интересная.

Я пользуюсь Envision for PC.
Эта штука умеет экспортировать шрифт в MAE формат.
Потом можно подключать файл в код.

Можно также сделать загружаемым сам файл шрифта, привязав его к правильному заголовку, типа $FFFF,fontstart,fontend.
А вот как это задать в runtime я просто ума не приложу...

Бейсиковская прога интересная, спасибо!
ez

Shiny
10.03.2017, 11:46
А вот как это задать в runtime я просто ума не приложу...
Что сделать? Денис Попов делал старый хак русификации, который наш прежний кооператив "Формат" делал

ezswift
10.03.2017, 17:42
Я с кооперативом "Фрактал" знаком...

Я же, про ту-же историю...
Как в рантайме получить адрес в указателе.

Это всё о том, что MAC/65 может средствами макроассемблера получить адрес, (писал где-то...) а МАЕ не может.
(или может, но я об это убился.)

На самом деле, у меня проблем с руссификацией нету.
когда-то прочёл статью в Байтике и вуаляшка!

Другое дело, что шрифтового пространства всё равно не хватает!

То есть, я в Омниворе заменяю строки в досе как мне надо, а остаются буковки, которые жизнь портят.
Например, буковка 'p (past meridiem) или буковка 'a (aint meridiem) в Спартадосе здорово досаждают.

Да и это - не беда.
Просто, я и с ассемблером не знаком, особенно-то, и со средой тоже, так как коды закрытые и пр.

Мучаюсь, преодолеваю...
Покуда успешно.
ez

Shiny
10.03.2017, 18:37
Как в рантайме получить адрес в указателе.

а никак. Вспомните простой формат .com(он же .xex в эмуляторах):
$FFFF - стандартный заголовок
начало адреса1-конец адреса1
...
начало адреса2-конец адреса2

сюда же можно втиснуть старт файла:
org $7E0
.word start

В общем, кросс-ассемблеры поддерживают эту байду, если нативные не поддержат, то киньте ассемблеры на мороз.

ezswift
11.03.2017, 16:52
Пардон, Шинни,

MAE автоматически добавляет заголовок к бинарному файлу, просто эта настройка управляется файлом CONFIG...
Ман прочитал...

Добавил видео https://youtu.be/DTjgtXWO0rY
Буду дальше ваять для шрифтов, потом для джойстика, но с Вашей помощью.

Просто мне пока не понятно, что должен делать ПОЛНОЦЕННЫЙ драйвер Джойстика.
ez

ezswift
16.03.2017, 15:26
Новое видео по русификации Атари.
https://youtu.be/09_DvlqEtXg
Шрифт защищён от ресета.

Если нужно такое для среды Бейсика, только скажите.

atariki
16.03.2017, 22:00
у меня есть вот такая программа которая подгружает с диска любой фонт, в том числе и русский))


10 GR.0:POKE 710,1:POKE 709,15:POKE 756,128
20 POKE 65,0:POKE 731,1
30 REM ---------
40 OPEN #1,4,0,"D2:RU2.FNT"
50 BGET #1,32768,1024:CLOSE #1

но она на турбобейсике, как на обычный переделать, я не знаю..
хотел русифицировать кое-что.

- - - Добавлено - - -

можно её на ассемблере исполнить ?

Shiny
16.03.2017, 22:37
OMG
а для начала
poke 106,127
gr.0

?

atariki
17.03.2017, 20:04
OMG
а для начала
poke 106,127
gr.0

?

что это ?

Shiny
17.03.2017, 20:43
что это ?
106-RAMTOP вроде.

не грузить же русский шрифт куда угодно.

Насчет файловых операций зри здесь:
http://atariage.com/forums/topic/217229-help-ciov-newbie-how-can-i-open-bget-close-file-in-assembler/


сам не проверял, потому что извечная проблема собрать файло на рабочем диске.

ezswift
18.03.2017, 14:16
Для начала, прилагаю программу руссификации бейсика.
Конечно, только для ЭТОГО доса.
Называется RUSBAS и работает ТОЛЬКО при подключённом бейсике, так как сама выходит из доса в бейсик.

Действия:
1. При подключённом бейсике загрузиться и увидеть READY.
2. Набрать DOS и увидеть D1:
3. Набрать RUSBAS и снова увидеть READY
Можно работать.

Рус - POKE 756,28
Eng - POKE 756,224

ez

- - - Добавлено - - -

Вот та самая программка на Ассемблере. :)
Называется EZFONT (EZ - это я)
Подгружает фонт по запросу и защищается от Бейсика.
Пока в системе бейсик, ничего с ней не произойдёт.

RUS - POKE 756,28
ENG - POKE 756,224


; ezfont program
; For use with BASIC ! ONLY!
; ezfont.com
; Evgeny Zolotarev (c) 2017
.ou ezfont.com
; Atari Equates
RUNAD = $02e0
CHBAS = $02f4
MEMLO = $02e7
WARMST = $08
CARTA = $A000

; CIO equates
; -----------------------------
ICHID = $0340
ICDNO = $0341
ICCOM = $0342
ICSTA = $0343
BFADR = $0344
PTADR = $0346
BFLEN = $0348
ICAX1 = $034a
ICAX2 = $034b
CIOV = $e456
; CIO Commands
COPEN = $03
GTREC = $05 ;Get TEXT Record
GTBYT = $07 ;GeT Byte
PTREC = $09 ;PuT TEXT Record
PTBYT = $0b ;PuT Byte
CCLSE = $0c
CSTAT = $0d
; Constants
; -----------------------------
EOL = $9b
CLR = $7d
IOCB0 = $00
IOCB1 = $10
IOCB2 = $20
OREAD = $04
;
prot = $0700
; GP Macros
; -----------------------------

; Move_Immediate_Byte
; form: mib <byt> <loc>
!!!mib .md
lda #:1
sta :2
.me
; Move_Immediate_Word
; form: miw <wrd> <loc>
!!!miw .md
lda #>:1
sta 1+:2
lda #<:1
sta :2
.me

; ====================
; Main PROG
.or $2000
jmp start

; --------------------
; Runtime DATA
cr .by EOL
buflen = 40
fname .ds buflen
kname .by "K:",EOL
prompt .by CLR,"ENTER D:FONTNAME.FNT TO LOAD...",EOL
csadr = $1c00
cslen = $0400
; ====================
; Runtime CODE
start
; Printing prompt to screen
ldx #IOCB0
miw prompt BFADR,x
miw buflen BFLEN,x
mib PTREC ICCOM,x
jsr CIOV
; Filename Input to buffer
ldx #IOCB0
miw fname BFADR,x
miw buflen BFLEN,x
mib GTREC ICCOM,x
jsr CIOV
; Close 1
ldx #IOCB1
mib CCLSE ICCOM,x
jsr CIOV
; Open 1 4 0 fname
ldx #IOCB1
mib COPEN ICCOM,x
mib OREAD ICAX1,x
mib $00 ICAX2,x
miw fname BFADR,x
jsr CIOV
tya ; If error
bmi finish
; Bget 1 <adr> <len>
ldx #IOCB1
miw csadr BFADR,x
miw cslen BFLEN,x
mib GTBYT ICCOM,x
jsr CIOV
tya ; If error
bmi finish
; Close 1
finish ldx #IOCB1
mib CCLSE ICCOM,x
jsr CIOV
; Protect at $2000
clc
lda MEMLO
adc #<prot
sta MEMLO
lda 1+MEMLO
adc #>prot
sta 1+MEMLO
lda #$00
sta WARMST
jmp CARTA

; ====================
; Setup Run Address
.or RUNAD
.wo start
;
.en
; >>> End Of File <<< ;

atariki
20.03.2017, 18:24
Евгений, можешь разъяснить команды ассемблера, что с чем там едят, я не понимаю ничего..

- - - Добавлено - - -

вот это например, как этим пользоваться
https://www.atarimax.com/jindroush.atari.org/aopc.html

Shiny
20.03.2017, 19:24
вот это например, как этим пользоваться
в справочнике опкоды 6502 плюс типы адресации

Непосредственная - сложение с числом
Immediate ADC #$44 $69 2 2

Нулевая страница - сложение с содержимым ячейки нулевой страницы(0-255)
Zero Page ADC $44 $65 2 3

Абсолютная индексная на нулевой странице - адрес складывается из регистра Х и нулевой страницы - это и есть операнд
Zero Page,X ADC $44,X $75 2 4

Абсолютная (прямая) - операнд указан в адресе
Absolute ADC $4400 $6D 3 4

Абсолютная индексная - Операнд получен из адреса плюс регистр X/Y
Absolute,X ADC $4400,X $7D 3 4+
Absolute,Y ADC $4400,Y $79 3 4+

Индексно-косвенная на нулевой странице
Indirect,X ADC ($44,X) $61 2 6
Indirect,Y ADC ($44),Y $71 2 5+

http://www.emuverse.ru/wiki/MOS_Technology_6502/Система_команд#.D0.A0.D0.B5.D0.B6.D0.B8.D0.BC.D1.8 B_.D0.B0.D0.B4.D1.80.D0.B5.D1.81.D0.B0.D1.86.D0.B8 .D0.B8_.D0.B8_.D1.81.D1.82.D1.80.D0.B0.D0.BD.D0.B8 .D1.86.D1.8B

http://retrocomputer.ru/ICDOCS/6502/FILES/6502.rus.txt

ezswift
21.03.2017, 19:08
Ну, это очень трудно на словах разъяснить...

Смысл в том, что любая команда представляется в разном виде, в зависимости от материала, с которым работает.
Я к тому, что входящие данные и определяют формат команды.

Это - не панацея!
Сама команда может не воспринимать чуждые ей форматы!

Я это к тому, что программист должен воспринимать команды как их ассемблер воспринимает!
То есть, правильно парсить их!!!

Кроме этого он должен знать ПРАВИЛА.
Некоторые команды - не универсальны и не могут работать со всеми адресами.

Самые универсальные - LD?-ST? они работают со всеми регистрами и операндами.

Это - общая инфо.

Вряд ли, она что-то даёт.

В принципе, способы адресации объясняют ассемблеру, как с данными работать.

1. Непосредственная адресация - говорит, что дано ЧИСЛО!
Если однобайтовое - обработай, если двухбайтовое - обработай за два раза.

2. Абсолютная адресация - говорит, что задан адрес (2 байта), в котором ЧИСЛО (м/б двухбайтовое)!
Надо доступиться! до числа и затем обработать как ранее.

3. ...

4. Нулевая страница - исключение!
Если операнд на нулевой странице, он требует примитивизации обработки!
Бери его и ешь!
Следующего байта НЕ БУДЕТ! (Если речь идёт об адресации.)

Я к тому, что на нулевой странице может быть BYTE или WORD.

atariki
21.03.2017, 20:41
ну вот допустим захотел я джойстиком погонять точку по экрану в gr.0, как мне логически рассуждать в ассемблере для написания этой программы ?

Shiny
21.03.2017, 21:04
1. В какой ячейке хранятся данные джойстика?

2. как адресуется видеопамять?

ezswift
21.03.2017, 21:52
Физически данные джойстика закодированы как биты и не могут быть определены без вычислений.

Слава богу, Атарьцы запрограммировали это так, что вычисления минимальны.
Никакой надежды вычислить это как диагональное движение.
Только покоординатное!

Поймите, я говорю о том, как было спроектировано!!!
"Всё было украдено до нас!"

Я, пока от Вас не получу того, что Вы хотите от джойстика, не знаю КАК делать его программу.

Можно было бы сделать джойстик реальным устройством, но ответьте:
1. что такое открыть канал джойстика? (Смысл инициализации)
2. что такое считать байт с джойстика (Сам знаю.)
3. что такое считать состояние джойстика (Вероятно состояние кнопки)

В общем, я не понимаю, каким должен быть ДРАЙВЕР.

А хендлер ЕСТЬ!

- - - Добавлено - - -

Данные джойстика берутся из ячейки STICK1=$279
Данные кнопки берутся из ячейки STRIG1=$285

Само по себе это МАЛО!

Shiny
21.03.2017, 22:41
ezswift, Вы слишком усложняете.

Достаточно подняться до уровня "с 6502 на Ты", прежде чем копаться в устройствах.

ezswift
25.03.2017, 12:15
Ещё одно видео готово
https://youtu.be/9anFBhHWfdI

ezswift
05.04.2017, 15:52
Довёл программу для шрифтов в Бейсике до конца. Работает :)
https://youtu.be/2zEoFjGurU0

ezswift
06.04.2017, 19:04
Нашел ячейку, показывающую, что Бейсик подключен.
Надо бы сделать так, чтобы индикация была,
типа ... Отец, БЕЙСИК-то подключи!!!

Мне эта прога уже, изрядно надоела... но, может ещё одно видео по ней запостю...

ezswift
07.04.2017, 08:21
Ну, что же, подправил программку.
Вот окончательный текст:

; Russify the BASIC
;> I need Fully Qualified File Name
;> like D:FONTNAME.FNT
;> writen in UPPERCASE register
;> as a responce to prompt!
; Evgeni Zolotarev, 2017

; rubas.com
.ou rubas.com

; Included LIBS
.in syseq.mae
.in macro.mae

; Atari Equates
DOSINI = $0c
WARMST = $08
CARTA = $A000
CHBAS = $02f4
BASICF = $03f8

; Constants
red = $22
blu = $82
none = $07
select = $05
cslen = $400

; ====================
; Main PROG
.or $1900
jmp start

; --------------------
; Runtime DATA
csadr .ds 2
protadr .ds 2
oldcon .ds 1
rupage .ds 1
enpage .ds 1

; --------------------
; Runtime SUBS

; --------------------
; Set VBI as Immediate
setvbi
lda #$06
ldx #>vbi
ldy #<vbi
jsr SETVBV
rts
; --------------------
; No RESET Subr
dummy
tsr jsr dummy
maw protadr MEMLO
jsr setvbi
jsr setenv
rts
; --------------------
; Set Environment
setenv
lda COLOR4
cmp #red
bne setred
setblu
mib blu COLOR4
mab enpage CHBAS
jmp skip
setred
mib red COLOR4
mab rupage CHBAS
skip
rts

; -------------------
; Read CONSOL in VBI
vbi
lda CONSOL
tax ; X=CONSOL
ldy oldcon ; Y=oldcon
;
tya ; A=oldcon
cmp #none
bne exit
chkcon
txa
cmp #none
beq exit
txa
cmp #select
bne exit
jsr setenv
exit
stx oldcon
jmp SYSVBV


; ====================
; Init CODE
.or $2000
start
; Check if BASIC ON
lda BASICF
beq conti
jmp failed
;
conti
mib none oldcon
jsr setvbi
;
; PRINT prompt to screen
ofs 0
bfa prompt
bfl buflen
jsr print
;
; Filename INPUT to buffer
ofs 0
bfa fname
bfl buflen
jsr input
;
; Calculating DATA
miw $3ff op2
maw MEMLO op1
anw op1 op2 ; op1=MEMLO AND $3ff
maw op1 op2
miw $400 op1
sbw op1 op2 ; op1=spacer
maw MEMLO op2
adw op1 op2 ; op1=csadr
maw op1 csadr
miw $400 op2
adw op1 op2 ; op1=protadr
maw op1 protadr
;
; CLOSE 1
ofs 1
jsr close
;
; OPEN 1 OREAD 0 fname
ofs 1
bfa fname
lda #OREAD
ldy #$00
jsr open
chk iferr
;
; BGET 1 <adr> <len>
ofs 1
maw csadr BFADR,x
bfl cslen
jsr getby
chk iferr
;
; CLOSE 1
iferr
ofs 1
jsr close
;
mib $e0 enpage
lda 1+csadr
sta rupage
mib blu COLOR4
;
; Set TSR data
; Save DOSINI into tsr jumpadr field
maw DOSINI 1+tsr
; Set DOSINI as tsr addr
miw tsr DOSINI
; Fill MEMLO as protadr
maw protadr MEMLO
; Reinit BASIC
lda #$00
sta WARMST
jmp CARTA
;
rts ; Return to BASIC

failed
; PRINT msg to screen
ofs 0
bfa msg
bfl buflen
jsr print
rts
; --------------------
; Included SUBS
.in iolib.mae

; --------------------
; Init DATA
buflen = 40
fname .ds buflen
prompt .by CLR,"ENTER D:FONTNAME.FNT TO LOAD...",EOL
cr .by EOL
op1 .ds 2
op2 .ds 2
msg .by CLR,"ENABLE BASIC, PLEASE.",EOL

; ====================
; Setup Run Address
.or RUNAD
.wo start
;
.en
; >>> End Of File <<< ;

atariki
07.04.2017, 12:17
А можно например сделать так, чтобы READY было когда английский, а на его же месте стало ГОТОВ когда включен русский, без изменения цветов рамки.

Shiny
07.04.2017, 12:56
BASIC OS похачить?(:

ezswift
07.04.2017, 14:57
Приблизительно такие вещи делаются в WEDGE.
Это - программка, добавляющая команды к Бейсику.

Подменяются вектора своими и после мелкого украшательства возвращается управление Бейсику.
Разумеется, Атари, как гениальная машина, такое позволяет.
Но, лучше, написать с нуля свой интерпретатор Бейсика или "чего-надо" со встроенным русским языком.

Я - совсем не программист. Писать языки не буду.

Моя главная идея, написать управляемую стрелками, искейпом и ритён псевдографическую программку для управления любым ДОСом.
А коли на Русском, так ваще шоколад.
(СТРОЧНЫЕ буковки на Русском занимают область псевдографики. Увы! Невозможно и Русским баловаться и псевдографикой пользоваться!)

Мне нравится система бредкрамб и реально она реализована в IBM AIX в виде SMIT (Java). (НЕ smitty (Sic!)).
Там много клёвых моментов...

Если выучил сокращения, переходишь прямо к нужному пункту меню.
Если не выучил, ползаешь по меню.
Все пункты меню прописаны в текстовом файле и т.д.
(Редактируешь и добавляешь...)

Я работал с AIX и никогда не жалел.
Так сволота, уволившая меня с работы лишила меня и моего сервера!

СУДЬБА! С кем поведёшся от того и огребёшся.

ezswift
13.08.2017, 07:54
ну вот допустим захотел я джойстиком погонять точку по экрану в gr.0, как мне логически рассуждать в ассемблере для написания этой программы ?

Добрый денёк, atariki.

Ну, чтобы пиксель гонять по экрану, надо объединить графику 0 с графикой 8. :)
Это сделать можно, но там свои проблемы...
А вот, чтобы погонять знакоместо (курсор) по экрану в ДОСе, могу предоставить ассемблерную программку...

Рассуждаем следующим образом...

1) Что гоняет курсор по экрану?
- При нажатии на клаве стрелки, код клавиши идёт в системную программу преобразования кодов в буквы(ATASCII) и окончательно оседает в однобайтовом теневом буфере ввода CH.
Таким образом, зная коды стрелок и анализируя положение джойстика, мы можем руководствуясь джойстиком, по нашему желанию подменять коды в регистре CH. Тогда при следующем VBI, наши коды будут двигать системный курсор.

2) Когда подменять коды в CH?
- Так как машинка не должна знать, что мы подменяем коды, надо делать это в прерывании по Вертикальному Бланку (по кадрам экрана).

3) Где поместить программу VBI?
- Программка достаточно короткая (~40 байт), чтобы быть помещена где угодно!!! В частности, я помещал её в конце аппаратного стека и стек никогда её не затирал.

4) Какой режим VBI выбрать?
- Я выбрал Immediate, так как у этого режима около 60 свободных циклов, но можно и Deferred - без разницы.

5) Какой будет скорость курсора?
- Нормальная для меня скорость курсора это считывание данных джойстика каждый пятый кадр экрана. (Счётчик кадров должен меняться от 4 до 0). Большие значения счётчика замедляют движение.

А вот и сама программа.


; Джойстик-курсор
; jc.com
.ou jc.com

; ====================
; Ярлыки
SETVBV = $e45c ; Вектор установки VBI.
SYSVBV = $e45f ; Возврат на системный VBI.
STICK0 = $0278 ; Теневой регистр джойстика.
RUNAD = $02e0 ; Адрес запуска программы
CH = $02fc ; Теневой буфер текстовых кодов

; --------------------
; Константы
vbmode = 6 ; Режим VBI=Immediate
speed = $04 ; Скорость курсора.
cur.up = 142 ; Величины кодов стрелок...
cur.dn = 143
cur.lt = 134
cur.rt = 135

; ====================
; Главная программа
.or $0110 ; Конец стека
start jmp init ; Переход на подпрограмму инициализации
; прерывания по VBI

; --------------------
; Блок данных
keytab .by cur.up,cur.dn
.by cur.lt,cur.rt
counter .by 2

; --------------------
; Инициализация прерывания VBI
init
ldy #<vbi ; LSB исполняемой части VBI
ldx #>vbi ; MSB исполняемой части VBI
lda #vbmode ; Режим VBI
jsr SETVBV
;
rts ; Возврат в ДОС после инициализации VBI

; ====================
; Подпрограмма исполняемой части VBI
vbi
dec counter ; Уменьшаем счётчик пропуска считываний джойстика.
bne done ; Если не дошел до нуля,
; переходим на системный VBI.
lda #speed ; Если ноль,..
sta counter ; обновляем счётчик пропуска считываний джойстика.
;
lda STICK0 ; Затем, считываем джойстик
eor #$0f ; Проводим проверку на движение ручки.
; Число $0f равно 15, а это значение, если ручка НЕ ДВИГАЛАСЬ!
; eor (Исключающее ИЛИ) ИНВЕРТИРУЕТ данные в Аккумуляторе и
; в случае, если там было 15, станет 0.

; При анализе положения ручки будут исследоваться уже ИНВЕРТИРОВАННЫЕ данные!!!

beq done ; Если ноль, джойстик не двигался и мы
; переходим на системный VBI.
;
ldx #$ff ; Если двигался, устанавливаем в 255 (reset)
; селектор считывания таблицы кодов стрелок.
; По сути - это смещение в регистре X.
chkstk
inx ; Чтобы перейти к следующему значению в таблице,
; увеличиваем смещение.
; В случае, если мы реинициализировали селектор,
; вспоминаем, что в однобайтных вычислениях $ff+$01=$00,
; то есть смещение равно нулю и селектор показывает
; на первое значение в таблице.
lsr a ; Так как в аккумуляторе у нас ИНВЕРТИРОВАННОЕ значение
; данных джойстика, сдвинем логически биты вправо.
; При этом сдвинутый бит помещается во флаг статуса Carry.
bcc chkstk ; Если в Carry ноль, значит в этом направлении
; джойстик не двигался, проверяем следующее направление...
lda keytab,x ; Если движение было, берём соответствующее значение
; данных курсора из таблицы
sta CH ; и заносим их в теневой буфер CH
done
jmp SYSVBV ; переходим к системному VBI.

atariki
09.09.2017, 17:24
Не работает программа.
62177

Shiny
09.09.2017, 17:42
.or $0110 ; Конец стека

triple facepalm

- - - Добавлено - - -

Кстати, тебя пример запутает, наверное, глянь:
http://hype.retroscene.org/blog/597.html

atariki
09.09.2017, 19:26
MAE не хочет грузиться с диска на железе, только если вытащить файл mae40.com с образа и загрузив на железе он перестаёт видеть sio2sd, как так ?

- - - Добавлено - - -

Зато пишет на кассету через команду C: а через D: или D1: - Error -130

ezswift
12.09.2017, 03:03
Atariki
В стандартной поставке MAE загружается только в расширенную память!
То есть начиная с 130XE.

Так как у меня расширение 576XE, я сделал образы для него.
Грузится как на эмуляторе, так и на железе.

Существуют и описаны процедуры установки MAE в системную память.
Вот ссылка на мануал http://mixinc.net/atari/mae.htm

Шынни
Стек прирастает сверху вниз, пустой стэк имеет смещение $FF, поэтому, младшие адреса и есть конец стека. (Или вершина, если угодно...)

ez

Shiny
12.09.2017, 04:45
Стек прирастает сверху вниз, пустой стэк имеет смещение $FF, поэтому, младшие адреса и есть конец стека. (Или вершина, если угодно...)

А разместить код в свободной 6й странице религия не позволяет?

ezswift
12.09.2017, 14:11
Нет проблем.
.or $0600
и всего-то делов...

У меня в этом коде была с другим заморочка.

Я не учёл, что инициализация возможне не только из ассемблера, но и из бейсика.
Из-за этого промежутки между движениями курсора были ОГРОМАДНЫМИ. Я вообще думал, что прога нерабочая...
Однако, Джон Хэлидэй помог. Нашёл бяку.

Славься Ди, Славься Ди ... !!!

В общем, я же говорил, что я - не программист вовсе, хотя и люблю покумекать.

ZEN (Вот такие у меня инициалы... типа, Дзен)

Shiny
12.09.2017, 18:27
Не касается Атари, но трюки со стеком иногда - моветон. Я одну такую долго вылавливал, когда нашел - появилось желание грохнуть автора.

Нашел на интересном сайте (http://web.archive.org/web/20130212080945/http://mycorner.no-ip.org:80/6502/shorts/asl.html):


CMP #$80 ; copy the sign bit to the carry bit
ROR A ; effectively perform a true ASR


арифметический сдвиг вправо(или деление на 2 со знаком)

ezswift
14.09.2017, 15:29
Шынни, никогда не знал об этом сайте.
Буду посмотреть...

Что касается аппаратного стэка, моветон, почти всегда. Абсолютно согласен!

Сейчас, болтаю с FJC (Джоном Хэллидэем) о необходимости 64 колоночного вывода на экран.
Уже речь зашла о картридже.

Не знаю, что он ответит, но программировать безусловно лучше на 64 колонках.

zen

Shiny
14.09.2017, 16:08
Кстати, использование стека встретилось - распаковщик помещен не пойми куда. Как результат - SelfTest (:

В общем, с момента освоения усвоили, что 6я страница - нашевсе.

ezswift
14.09.2017, 18:53
Дык, как бы не так!

Проблема Атари в неорганизованности свободного пространства.
Нет протокола, который бы говорил, что данное пространство занято.
(В БЕЙСИКЕ ЕСТЬ!)

Совсем не все программки поместятся в 256 байт Шестой страницы.

Есть области с "относительной занятостью", вроде кассетного буфера.
Однако, у кого кассетник, будет с этим резко не согласен!

zen

Shiny
14.09.2017, 19:07
Совсем не все программки поместятся в 256 байт Шестой страницы.

хехе. Напомнило, как мы с другом писали программу, которая в Turbo Basic XL выполняла те же функции, что и MOVE, и места хватало. Взглянуть бы сейчас на тот быдлокод(:

Заодно, в 6ю страницу можно много чего напихать - хотя бы Display List.

Или еще одно решение, например:

http://www.pouet.net/prod.php?which=70199

ezswift
16.09.2017, 14:25
Любые Коды - Святые!!! :)
Базарный код - это просто проба пера.

Не все, же - заранее Вчёные...

zen

Shiny
16.09.2017, 15:23
Базарный код - это просто проба пера.

это какой?оО

atariki
03.12.2017, 13:44
Евгений, извините за наглость ))) Будут ещё уроки по ассемблеру ?

Shiny
03.12.2017, 14:20
Разве мало, что есть? пора кодить уже.

atariki
03.12.2017, 14:49
знаний мало.

Shiny
03.12.2017, 16:01
Знания чего? 6502 или железа?

вот простая задача: напиши бегущую строку, чтоб как на Спектруме.

atariki
03.12.2017, 21:15
немного стало понятно по данной карте памяти

https://i.imgur.com/MKV0MgY.png

по этой тоже немного, т.е общее представление есть..

https://i.imgur.com/m74MPsd.png

Нет понимания самого процесса программирования, все эти lda, ldy, bne sta и остальное, младший байт, старший байт, что с чем едят...

если в Бейсике мне надо включить магнитофон, я наберу poke 54018,52, отключить poke 54018,60

https://i.imgur.com/StLpbgT.png

В MAE инициализирую:

PACTL = $0302 ; В Бейсике это POKE 54018

а как присвоить значение 52 или 60 ?

а что дальше ? что делать с этими семью битами на картинке в столбце слева ? почему 54018,52

- - - Добавлено - - -

вот простая задача: напиши бегущую строку, чтоб как на Спектруме.

это просто непосильная для меня задача )))

Shiny
04.12.2017, 06:52
Немного советов от дядьки JAC!:
https://www.wudsn.com/index.php/productions-atari800/tutorials/tips
(разместить код с $2000 и отключить Бейсик)


это просто непосильная для меня задача )))

Это просто. графике отведен ANTIC, для него важен Display List (https://www.atariarchives.org/mapping/appendix8.php)

- - - Добавлено - - -


Нет понимания самого процесса программирования, все эти lda, ldy, bne sta и остальное, младший байт, старший байт, что с чем едят...

мда. не нашел на хайпъ топики про 6502, писал я две штуки.


poke 54018,60

lda #60; # непосредственная адресация, т.е. поместить в А значение 60
sta 54018; поместить значение А по адресу 54018.

Зачем младший байт и старший байт? для хранения информации. Память состоит из байт, которые принимают значения 0-255. Каждая ячейка памяти имеет свой адрес 0-65535.
ясно, что такие числа не втиснешь в рамки 0-255. Поэтому используются LSB-least significant byte, MSB-Most Significant Byte:
LSB=NNNN&255
MSB=NNNN/256

Например, нужно хранить в памяти адрес 40000:
40000=64+256*156
Здесь LSB=64,MSB=156

atariki
04.12.2017, 17:40
немного переварил, но не всё.

Shiny
04.12.2017, 18:04
Не надо стремиться всё переваривать. Есть справочник Mapping, где хранятся общие сведения. Например, для спрайтов (PMG) это ворох ячеек в памяти.

atariki
04.12.2017, 18:22
; my first prog

.in syseq.mae
.ou fp.xex
.or $0600

lda #1 ;color2,1
sta color2 ;poke 710
lda #14 ;color1,14
sta color1 ;poke 709

; e.t.c poke 710,1

Получается белый курсор на чёрном фоне экрана, только программа в эмуляторе "падает" через несколько секунд..

Shiny
04.12.2017, 20:59
Добавь rts

atariki
05.12.2017, 00:02
уходит в self test

Shiny
05.12.2017, 08:41
покажи .xex

atariki
05.12.2017, 17:32
; my first prog


.in syseq.mae
.ou fp.xex
.or $0600

lda #149 ;color4,149
sta color4 ;poke 712
lda #149 ;color2,149
sta color2 ;poke 710
lda #15 ;color1,14
sta color1 ;poke 709

63244

Shiny
05.12.2017, 18:04
последней инструкцией должна быть rts - да и нужна ли?
Atari800win запустил, Бейсик включен.

atariki
05.12.2017, 18:32
а зачем отключать Бейсик ?

Shiny
05.12.2017, 18:44
Бейсик использует часть памяти - хотя бы для этого, наверное.

dosikus
07.12.2017, 10:24
Нашел на интересном сайте (http://web.archive.org/web/20130212080945/http://mycorner.no-ip.org:80/6502/shorts/asl.html):


Если что еще одна копия того сайта http://retro.hansotten.nl/lee-davison-web-site/

Shiny
07.12.2017, 11:16
у дядьки генерация квадратов на мой взгляд сомнительная. Хотя.. кто знает? мне понадобилась таблица для знаковых и беззнаковых чисел.


org $2000
start
ldy #1
ldx #0
sty de
dey
sty de+1

sty hl
sty hl+1

sqtab equ $1000
sq_lp
lda hl+1
sta sqtab+256,y
sta sqtab+256,x

lda hl
sta sqtab,y
sta sqtab,x

clc
adc de
sta hl
lda hl+1
adc de+1
sta hl+1

lda de
clc
adc #2
sta de
bcc no_inc_de
inc de+1
no_inc_de
dex
iny
cpy #129
bne sq_lp
;http://www.cpcwiki.eu/index.php/Programming:Precalculated_square
;INITSQ LD DE, 1 ;1st odd number
; LD HL, 0 ;HL = 1st square number
; LD B, H ;counter = 256
; LD IX, SQTAB ;startaddress of the square table
;SQLOOP LD (IX), L ;Lowbyte to table
; INC IX
; LD (IX), H ;Highbyte to table
; INC IX
; ADD HL, DE ;add odd number
; INC DE ;next odd number
; INC DE
; DJNZ SQLOOP ;256 times
; RET
jmp *
hl
dta 0,0
de
dta 0,0

run start

dosikus
07.12.2017, 11:42
; my first prog


.in syseq.mae
.ou fp.xex
.or $0600

lda #149 ;color4,149
sta color4 ;poke 712
lda #149 ;color2,149
sta color2 ;poke 710
lda #15 ;color1,14
sta color1 ;poke 709





То же самое в WUDSN на MADS с отладкой в альттире ...


org $3000

color1=709
color2=710
color4=712

START

lda #149 ;color4,149
sta color4 ;poke 712
lda #149 ;color2,149
sta color2 ;poke 710
lda #15 ;color1,14
sta color1 ;poke 709


LOOP JMP LOOP

RUN START

dosikus
08.12.2017, 16:26
MADS у меня работает и с WDSN и с Notepad++.
Здесь сам MADS http://mads.atari8.info/
В дистрибутиве подробная справка, правда на инглише для версии 1.95 а свежая на польском. Но переводится вменяемо.
В комплекте есть куча примеров и либ, а так же в дистрибутиве есть мануал как прикрутить к Notepad++.

Shiny
08.12.2017, 16:44
примеры MADS хороши, меня макросы убивают

dosikus
08.12.2017, 16:59
Шынни, угу меня так же.
У JAC! в туторах есть наводки, попробую въехать...

ЗЫ. Я ошибаюсь или нет? Авторы MADS похоже фанаты паскаля, отсюда и закидоны с макросами...

Shiny
08.12.2017, 17:49
закидоны с макросами...

с одной стороны это удобнее.
mwa #$1000 $EB записывает слово $1000 по адресам $EB,EC

но я внятного описания не нашел, я вечно путаюсь(

Есть один выход - ассемблировать макросы и посмотреть на код.

dosikus
09.12.2017, 15:14
Это макро команды MACRO COMMANDS

The purpose of macro commands is to save time when writing programs and to shorten listings. Macro commands replace commonly used groups of instructions.


MVA, MVX, MVY

The macro commands MVA, MVX, MVY transfer bytes using the A, X, or Y registers, respectively. OPT R+ can potentially reduce the code size from these macros by removing redundant instructions.

lda src -> mva src dst
sta dst ->

ldy $10,x -> mvy $10,x $a0,x
sty $a0,x ->

ldx #$10 -> mvx #$10 dst
stx dst ->


MWA, MWX, MWY

The macro commands MWA, MWX, MWY transfer words using the A, X, or Y registers, respectively. OPT R+ can potentially reduce the code size from these macros by removing redundant instructions.

ldx <adr -> mwx #adr dst
stx dst ->
ldx >adr ->
stx dst+1 ->

mwa #0 $80 -> lda #0 mwy #$3040 $80 -> ldy <$3040
-> sta $80 -> sty $80
-> sta $81 -> ldy >$3040
-> sty $81

mwa ($80),y $a000,x -> lda ($80),y
-> sta $a000,x
-> iny
-> lda ($80),y
-> sta $a001,x

- - - Добавлено - - -


с одной стороны это удобнее.


Естественно, но я о другом - о форме записи макросов -


.macro SetColor val,reg
lda :val
sta :reg
.endm


И еще - в хелпе есть ошибки , так что читать , сверять английскую версию с польской и проверять по сырцам...

Shiny
09.12.2017, 15:31
Если быстро набирать текст, то удобно, да. По мне xasm удобнее - понимает MADS, капризен к синтаксису и немало хороших фич.
Когда я начал писать 16К на Silly Venture, пришлось пересесть на xasm.

dosikus
10.12.2017, 11:50
Насчет XASM vs MADS .
Кстати в поставке WUDSN есть и XASM и другие асмы .


DIFFERENCES AND SIMILARITIES BETWEEN MADS AND XASM

Similarities

the same syntax
the same exit codes
the same macro commands

Differences and new behaviors

small additions to ORG, e.g.. 'ORG [[expression]]adres[,adres2]'
XASM does not like whitespace, MADS tolerates and accepts it in logical/arithmetic expressions and static/variable definitions
MADS allows expressions to be grouped with (), [], XASM only within []
MADS provides static and variable definitions of local, global, and temporary scope, XASM only global
MADS does not accept ORG a:adres or ORG f:adres
MADS encodes real numbers using the directive .FL .FL real, XASM by pseudo-command DTA R DTA R(real)
MADS has expanded support in the pseudo-command INS
MADS does not accept the addressing form 'lda (203),0'
MADS allows writing programs for SpartaDOS X
MADS permits writing relocatable code in a custom format
when encoding the value of a character, i.e.
lda #' '
lda #" "
MADS distinguishes between single quotes (ATASCII coding) and double quotes (INTERNAL coding), whereas XASM treats both forms the same (ATASCII coding). Of course, the quote types are treated the same in DTA by MADS.

in indexed modes, a '+' or '-' sign increments or decrements the index register, e.g.
lda $2000,x+ -> lda $2000,x
inx
but if the '+' or '-' sign is used with a value, it change the value of the main operand instead (this only works with absolute indexed addressing):
lda $2000,x+2 -> lda $2002,x

Shiny
10.12.2017, 12:39
разные авторы, разные цели.

в xasm ins удобен с опцией пропуска N байт.

dosikus
10.12.2017, 14:34
MADS


INS 'filename'["filename"] [+-value][,+-ofset[,length]]

The INS pseudo-command allows inclusion of an external binary file. The included file does not have to be in the same directory as the main file being assembled. Search paths for the file can be configurated using the /i switch (see assembly switches).

Additionally, you can perform the following operations on the binary data:
* invert bytes
+-VALUE increase or decrease each byte by the value of the expression VALUE

+OFSET skip OFSET bytes at the beginning of the file (seek to OFSET)
-OFSET read OFSET bytes at the end of the file (seek to FileLength-OFSET)

LENGTH read LENGTH bytes from the file
If the LENGTH value is not specified, the default behavior is to read to the end.

XASM


INS - insert contents of file
Copies every byte of the specified file into the object file and updates the origin counter, as if these bytes were written using DTA. You may specify a range of the file to insert. The syntax is:

ins 'file'[,offset[,length]]
The first byte in a file has the offset of zero. If the offset is negative, it counts from the end of the file. Examples:

ins 'picture.raw'
ins 'file',-256 insert last 256 bytes of file
ins 'file',10,10 insert bytes 10..19 of file


А так же у MADS


ICL 'filename'["filename"]

The pseudo-command ICL includes an additional source file in the assembly process. The attached file does not have to be in the same directory as the main assembly file. Additional paths are added to the MADS search path using the /i switch (see assembly switches).

dosikus
10.12.2017, 20:57
Шынни, можешь хоть немного о работе с P/M здесь вывалить ?

Shiny
10.12.2017, 22:19
Шынни, можешь хоть немного о работе с P/M здесь вывалить ?

если я правильно понял, то вопрос о PMG.
мой топик на хайпъ (http://hype.retroscene.org/blog/597.html), там же пример.

dosikus
11.12.2017, 09:02
Угу, спасибо.

dosikus
11.12.2017, 21:50
Шынни, не против если завалю здесь вопросами?
Кстати , от чего такие реинкарнации твоих сущностей?

Shiny
12.12.2017, 07:03
Кстати , от чего такие реинкарнации твоих сущностей?
не распарсил вопроса.

dosikus
12.12.2017, 17:35
Шынни,

Расположение определяется значением из PMBASE($D407), умноженным на 256
Писано так, будто сей регистр можно читать , в то время как он WO .


Для каждого объекта пиксель может состоять из точки шириной в 2 точки и высотой в одну, или 2х2 пикселя.

Вообще ничего не понял. Тупею видно. Можно графически изобразить?

Shiny
12.12.2017, 18:39
Писано так, будто сей регистр можно читать , в то время как он WO
верно, вечная болезнь при написании опусов. Значение, записанное в PMBASE, умноженное на 256 и есть адрес.



Вообще ничего не понял. Тупею видно. Можно графически изобразить?
в текстовом режиме (GR.0 басика) и в режиме GR.8 разрешение 320х200.
для игрока один пиксель будет шириной 2пикселя, высотой в 1.

Для двойного разрешения высота 2х2.
http://i99.fastpic.ru/big/2017/1212/af/a68b7ed491837e4237262a7fd5d687af.png

на рисунке зеленый и красный.

dosikus
12.12.2017, 19:14
Благодарствую.
Твой сырец компильнулся и запустился в WUDSN с MADS без проблем.
Изучаю твой сырец попутно читая мапинг и дере-атари и PMG для Барсика.

Shiny
12.12.2017, 19:20
Читаю с дератарт и мапинг.

Тогда контрольный:
https://www.atariarchives.org/pmgraphics/


хотя ни к чему голову забивать сведениями.

dosikus
12.12.2017, 21:00
Вообщем понимаю так - с указателя в PMBase хранятся карты спрайтов "ракет" и "игроков".
С помощью DMA все это хозяйство загоняется в GTIA.
Меняя указатели в регистрах координат, контролируем перемещение.

Shiny
12.12.2017, 22:46
регистры - горизонтальное положение.
Если двигать вертикально - записывать данные в участок памяти.

Shiny
13.12.2017, 08:04
товарищи, гляньте, у кого есть реал:
http://www.pouet.net/prod.php?which=72770

видео отличается от того, как демо работает на Altirra.

dosikus
13.12.2017, 08:59
регистры - горизонтальное положение.
Если двигать вертикально - записывать данные в участок памяти.
Упс, да там же не указатели, описался.
То есть смещение от начала в карте "игрока" и есть вертикальное положение?
На счет реала -пока не могу.

Shiny
13.12.2017, 09:15
То есть смещение от начала в карте "игрока" и есть вертикальное положение?
Да.

dosikus
13.12.2017, 13:22
;draw sprite vertically
draw_sv
ldy cy
ldx #0
pmg
lda smiley,x
sta pmadr+512*2,y
iny
inx
cpx #$10
bne pmg

Копируем спрайт в карту спрайта.
1)Что происходит с предыдущим содержимым карты, что-то не нашел где оно чистится .
2) Спрайт 14 байт - копируем 16 , очепятка?



ЗЫ. То есть сдвиг всегда на 1"пиксель" и "каемка" из нулей у спрайта затирает предыдущее...
Изменил каемку на отличную от нуля и получил тянучки . :))

Shiny
13.12.2017, 16:26
Верно. Проще стереть данные в памяти, потом нарисовать, имея измененные данные о координатах. Я использовал простой трюк. - при смещении на 1 пиксель нулевые байты стирают.

dosikus
13.12.2017, 20:40
Ок. Завтра поиграюсь с "ракетами".
Прям душой отдыхаешь после рутины и кодинге на армы...

Shiny
13.12.2017, 20:54
отдохнешь, когда разберешься со столкновениями.
=)

dosikus
13.12.2017, 23:15
Шынни, вопрос - вскользь проштудировал POKEY.
Обнаружил входа обозначенные POT. Там что ADC и можно считывать аналог?

dosikus
14.12.2017, 13:03
Блин, что с форумом происходит? Второй день отваливается на несколько часов...

Shiny
14.12.2017, 13:09
с POKEY незнаком(

goodboy
15.12.2017, 20:18
Обнаружил входа обозначенные POT. Там что ADC и можно считывать аналог?
Название микросхемы составлено из начальных слогов английских слов POtentiometer и KEYboard, так как эта микросхема использовалась для опроса клавиатуры и аналоговых устройств управления

https://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Cx78.jpg/220px-Cx78.jpg

ezswift
27.04.2018, 02:06
Привет, atariki.

Вот код, который либо поможет, либо всё испортит.
Его ПРАВДА в том, что он работает!



; Resident COLORizer program
; Bump-Up the MEMLO pointer
.ou colorize.com
; Included LIBS
.in macro.mae

; --------------------------------
; equates
DOSINI = $0c ; standard DOS init
COLOR1 = $02c5 ; brightness
COLOR2 = $02c6 ; bgCOLOR
RUNAD = $02e0 ; Run address
MEMLO = $02e7 ; Word, - first free byte
LMARGIN = $52 ; Left Margin

;
; constants
brwhite = $0e
dkblue = $92
; Resident part:
.or $1900
start jmp init
;
newmlo .ds 2
dummy
;
trojan jsr dummy
maw newmlo MEMLO ; bumps up
;
mib dkblue COLOR2
mib brwhite COLOR1
rts
finish = *
;
; Executed ones:
; (then can be deleted)
init
miw finish newmlo ; fill newmlo with finish
maw newmlo MEMLO ; fill MEMLO as newmlo
;
maw DOSINI 1+trojan ; save DOSINI into trojan
miw trojan DOSINI ; set DOSINI as trojan
;
mib dkblue COLOR2
mib brwhite COLOR1
rts
;
.or RUNAD
.wo start
.en

Где-то ранее (ищите!) я писал о том, что если ВЕРНЫЙ!!! код, написанный Вами будет РАНЕЕ исполнения стандартного кода Атари, то результата ПРОСТО не будет.
Стандартный код ЗАМЕСТИТ ВСЁ, а в случае наличия конфликтов памяти выгонит Атарьку в висняк.

То есть, Совет Шинни - ЗАЦИКЛИТЬ, просто означает, что Вы исполняете только Ваш ВЕРНЫЙ!!! код и БОЛЬШЕ НИЧЕГО!

Вышеуказанная программа является на самом деле иллюстрацией к защите памяти от ОС.

Цвета там - не Главное!
Но, если заметить, что:
1. Новые цвета задаются инициализацией!
2. Новые цвета переустанавливаются при софтресете.

И добавить конструкционную целостность программы, (Где нужен выход из прерывания - предоставляем RTI, Где нужен Выход из подпрограммы - проедоставляем RTS и пр.)

Добавлю:
Наличие или отсутствие Бейсика - для ассемблирования -НЕ СУЩЕСТВЕННО!

Хватило бы памяти... Например, для самого Ассемблера! Или, для самой Программы!

И, ВАЩЕ, к вопросу о выходах из подпрограмм...

Наконец примите ОДНО решение! Если Вы его
не примите, будет чёрный экранчик
(у Атари бывает ещё и DMA вывод необновляемого состояния - зависание, при работающих системах вывода графики.)
zen

Shiny
10.02.2019, 12:34
Learn Multi platform 6502 Assembly Programming... For Monsters! (http://www.chibiakumas.com/6502/?fbclid=IwAR1h8hjYmGAStvQLUrc4MLZGuYNPS21DVApup4SR rAxbiQFhy8OYbPieGVU)

ezswift
17.05.2019, 17:03
Здравствуйте, дорогие Форумчане.

Мы знаем, что байтом можно адресовать 256 значений. А кто собственно, задумывался в чём эти значения?
Какова их сущность?!! Identity?!!

Я уже сотню лет не писал ничего об ассемблере (был занят Паскалем и совершенно не разочарован), но кажется есть ещё темка, которая Вам может пригодится...
Это - использование identity table (IDT) на русский сложно перевести, но смысл прост, - Из неё мы получаем байт, определяемый собственным индексом, то есть сущность этого байта. (Подумайте над этим, это занятно!)

Итак, создаём таблицу, длиной в страницу и выровненную по странице (то есть адрес: $xx00).


IDT
.by $00,$01,$02,$03, ... $0f
...
.by $f0,$f1,$f2,$f3, ... $ff; Identity Table

Так вот, дело в том, что такая таблица может помочь нам с созданием новых несуществующих опкодов ассемблера для 6502.
(Например тех, которые изначально запрограммированы для 65816.)
Но не только...

На её основе можно создавать макросы для повторяющихся действий или другие, необычные вещи... Создав её один раз можно ей пользоваться для ЛЮБЫХ целей!

Просто сама таблица является отображением ПОНЯТИЯ <байт> в понятие <число>;
По русски: сущность БАЙТА - ЭТО ЧИСЛО! (То есть мы ПРОНУМЕРОВАЛИ числа БАЙТА!)

Теперь - фантастика!

Вы знакомы с TAX,TXA,TAY,TYA...

А где же здесь TXY или TYX?! А, НЕТУ!

Я всегда говорил, что процессор не умеет считать, зато байты двигать умеет!!!

Короче, ВОТ недостающие опкоды ассемблера:
(Их можно сделать как макросы ...)

Calling OPCODE
ldx IDT,y -> TYX
ldy IDT,x -> TXY
and IDT,x -> ANX
and IDT,y -> ANY
ora IDT,x -> ORX
ora IDT,y -> ORY
eor IDT,x -> EOX
eor IDT,y -> EOY
adc IDT,x -> ACX
adc IDT,y -> ACY
sbc IDT,x -> SCX
sbc IDT,y -> SCY

Однако, это - не всё...
Вот пример кода:

ldx val
lda num
stx tmp
clc
adc tmp ; A=val+num

А у меня уже стотыщь переменных!..
Ассемблер не отрабатывает!!!

Тогда, делаем так:

ldx val
lda num
clc
adc IDT,X ; A=val+num

Во-о-от. Так-то, Друзья, В этом-то всё и дело!
zen