Ассемблер определяет инструкции по отступам.
Сайт отступы уничтожает.
Уж, поверьте, мой текст был другим...
Пора разобрать, что наваяли.Код: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>




Ответить с цитированием