|
|
(не показано 5 промежуточных версии 3 участников) |
Строка 1: |
Строка 1: |
− | Процедура разработана Busy, встречается в построениях окружности и линии. Для построения точек необходимо подготовить вспомогательную таблицу, которая занимает 4*256=1024 байта:
| + | Господа, я не порчу, я делаю последнее китайское предупреждение. |
− | 0-255 байт: старшие значащие байты адреса экрана(координата Y)
| + | |
− | 256-511 байт: младшие значащие байты адреса экрана(координата Y)
| + | |
− | 512-767 байт: смещение по экрану(координата X)
| + | |
− | 768-1023 байт: битовые значения(координата X)
| + | |
− | | + | |
− | <code><pre>
| + | |
− | PIX_TAB EQU #7C00
| + | |
− | PIX_TAB_HI EQU PIX_TAB/256;#7C
| + | |
− | | + | |
− | ORG #6000
| + | |
− | ;формирование адресов
| + | |
− | INIT LD DE,#4000;адрес экранной области
| + | |
− | LD L,E
| + | |
− | LD BC,#8000
| + | |
− | ILP1 LD H,PIX_TAB_HI;high - аналог [ в Storm.
| + | |
− | LD(HL),D;старший байт
| + | |
− | INC H
| + | |
− | LD (HL),E;младший байт
| + | |
− | INC H
| + | |
− | LD (HL),C;смещение X
| + | |
− | INC H
| + | |
− | LD (HL),B;битовое значение
| + | |
− | CALL DOWN_DE;следующая линия экрана
| + | |
− | RRC B;циклический сдвиг битового значения - #80->#40->...->#4->#2->#1
| + | |
− | LD A,C; после того, когда в регистре B хранилось значение 1, сдвиг RRC установил флаг переноса C=1
| + | |
− | ADC A,0; поэтому вместо проверки выполняем сложение регистра C с учетом, получается C=C+1
| + | |
− | LD C,A
| + | |
− | INC L; переходим к следующей таблице
| + | |
− | JR NZ,ILP1;завершение цикла, 0-255
| + | |
− | ; при первоначальном выполнении в таблицу заносятся значения от #4000 до #5800
| + | |
− | ; поэтому процедура построения при значении Y>191 внесет изменения в атрибуты
| + | |
− | ; чтобы не выполнять проверку, заполним часть таблицы нулями
| + | |
− | LD HL,PIX_TAB+96
| + | |
− | ILP2 LD (HL),0
| + | |
− | INC L
| + | |
− | JR NZ,ILP2
| + | |
− | RET
| + | |
− | ;-------------------------------
| + | |
− | DOWN_DE INC D
| + | |
− | LD A,D
| + | |
− | AND 7
| + | |
− | RET NZ
| + | |
− | LD A,E
| + | |
− | ADD A,32
| + | |
− | LD E,A
| + | |
− | RET C
| + | |
− | LD A,D
| + | |
− | SUB 8
| + | |
− | LD D,A
| + | |
− | RET
| + | |
− | | + | |
− | </pre></code>
| + | |
− | ставим точку, входные данные DE=YX координаты
| + | |
− | <code><pre>
| + | |
− | PLOT PUSH HL
| + | |
− | PUSH BC;сохранить на стеке используемые регистры
| + | |
− | LD H,PIX_TAB_HI
| + | |
− | LD L,D
| + | |
− | LD B,(HL)
| + | |
− | INC H
| + | |
− | LD A,(HL)
| + | |
− | LD L,E
| + | |
− | INC H
| + | |
− | OR (HL)
| + | |
− | INC H
| + | |
− | LD C,A;BC=адрес экрана
| + | |
− | LD A,(BC); чтобы поставить точку нужно получить значение из экрана
| + | |
− | OR (HL); проводим операцию OR
| + | |
− | LD (BC),A; занести значение по адресу
| + | |
− | POP BC;восстановить сохраненные регистры
| + | |
− | POP HL
| + | |
− | RET
| + | |
− | </pre></code>
| + | |
− | | + | |
− | [[Категория:Программирование графики]]
| + | |
Господа, я не порчу, я делаю последнее китайское предупреждение.