Благодарен. Очень интересно. С Mac65 v1.01 немного знаком.
Благодарен. Очень интересно. С Mac65 v1.01 немного знаком.
ATARI 65XE|130XE|XEGS|4-XC12|(2-TURBO2000)|SIO2SD
Двигаемся потихоньку...
"Кривые руки - причина боли моска!"
В прошлом уроке сразу ошибка.
надо:
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
MAC и PC - это всего лишь периферия для Атари...
130XE|XC12|CA2001|XF551|IDEPlus2.0|SIO2SD|SIO2IDE| RAM576XE+Covoх|SIO2PC|MAXFLASH8|MAXFLASH1|The Ultimate Cartridge|
загнал в мас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 и получил следующее
ATARI 65XE|130XE|XEGS|4-XC12|(2-TURBO2000)|SIO2SD
Не,
на самом деле ATARIKI маленько отбезобразничал. Я ранее писал, что Если один пробел после начальной цифирки -> это будет воспринято как МЕТКА!
То есть Ассемблер ждёт какого-то невиданного... чего? Невиданной программы JMP!
Ответ - для Ассемблера ПРОСТ! У него невиданный только Макрос.
А теперь к делу.
Поблагодарю GOODBOY, надо!
Поблагодарю ATARIKI - он Аудитория!
Пояснение.
Я с Вами ОДНОВРЕМЕННО программирую!
И я - не программист.
ПОЖАЛЕЙТЕ!
И потом,
Если мы только ввели и сохранили данные, а не программу, разве мы написали программу?
НАДО включать моск!
На этом этапе компилировать НЕЧЕГО!
Обработчика данных НЕТ!
Просто пишем и сохраняем.
MAC и PC - это всего лишь периферия для Атари...
130XE|XC12|CA2001|XF551|IDEPlus2.0|SIO2SD|SIO2IDE| RAM576XE+Covoх|SIO2PC|MAXFLASH8|MAXFLASH1|The Ultimate Cartridge|
Вот рабочая программа
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
MAC и PC - это всего лишь периферия для Атари...
130XE|XC12|CA2001|XF551|IDEPlus2.0|SIO2SD|SIO2IDE| RAM576XE+Covoх|SIO2PC|MAXFLASH8|MAXFLASH1|The Ultimate Cartridge|
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Ассемблер определяет инструкции по отступам.
Сайт отступы уничтожает.
Уж, поверьте, мой текст был другим...
Пора разобрать, что наваяли.Код: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">' - ! " # % & ( ) * , / ? @ [ ] ^ + < = ></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>
MAC и PC - это всего лишь периферия для Атари...
130XE|XC12|CA2001|XF551|IDEPlus2.0|SIO2SD|SIO2IDE| RAM576XE+Covoх|SIO2PC|MAXFLASH8|MAXFLASH1|The Ultimate Cartridge|
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)