(C) SIV BLADER/EXCESS TEAM Music: 'CROON' /13.10.98 (:-<>)/KENOTRON ─────────────────────────────────────────────────── ╔══════════════════════╗ ║ ║ ║ "POORGUY" изнутри ║ ║ ║ ╚══════════════════════╝ PLOTTAB EQU #7C00 ;адрес киловой таблички ;для рисования точки PLT EQU #7C ;старшой байт таблички ORG #6000 CALL MKTABPL ;криэйтим табличку ;для вывода точки CALL MAKE_CLS ;расворачиваем ;"фастер" для ;быстрого CLS ;*Begin of IM2_HANDLER PREPARATION* LD HL,#7A00 LD DE,#7A01 LD BC,#100 LD A,#7B LD (HL),A LDIR DEC A LD I,A IM 2 LD HL,#C9FB LD (#7B7B),HL ;*End of IM2_HANDLER PREPARATION** ;*Begin of Tree Multu-Shifting ** ; эта часть кода делает буквально следующее: ; из одного массива точек, которые являются конца- ; ми отрезков, которые, в свою очередь, являются ; линиями и умело изображают деревце, мы делаем ; еще три массива, которые предствляют собой дере- ; вья с измененной координатой X. Т.е., когда мы вы- ; водим по очереди эти 4 дерева, имеем эффект дви- ; жущегося дерева на бэкграунде. LD DE,TREE3_COOR PUSH DE XOR A LD B,4 MAKE_TREES_L1 PUSH BC LD HL,M0_COOR LD BC,59 LDIR DEC DE LD (DE),A INC DE POP BC DJNZ MAKE_TREES_L1 OUT (#FE),A POP HL ;#7000 LD E,0 LD B,4 MAKE_TREES_L2 PUSH BC MAKE_TREES_C3 LD A,(HL) AND A ;0 JR Z,MAKE_TREES_C1 CP #FF JR Z,MAKE_TREES_C31 LD A,(HL) SUB E LD (HL),A INC HL MAKE_TREES_C31 INC HL JR MAKE_TREES_C3 MAKE_TREES_C1 LD A,E ADD A,40 LD E,A INC HL POP BC DJNZ MAKE_TREES_L2 ;*End of Tree Multu-Shifting ** ;чистим 1 экран LD A,#17 CALL ONOF CALL CLS CALL CLS_ATTR ;чистим 0 экран LD A,#15+#8 CALL ONOF CALL CLS CALL CLS_ATTR CALL CHUNK_VISUAL ;енто и есть ;сама интра EXIT ; в общем - выход по законам первой части ; марлезонского балета организаторов фантопа... :) DI LD A,#10 LD BC,#7FFD OUT (C),A LD A,#3F LD I,A IM 1 LD HL,#2758 EXX EI RET ;указатель на текущую сцену CURENT_SCENE DW SCENE_ARRAY1 ;файл с данными по сценам и ;экспланатион смотри внутрях файла... INCLUDE "SCENEDAT" CHUNK_VISUAL LD HL,(CURENT_SCENE) LD A,(HL) ;если содержимое адреса ;указываемого указателем AND A ;на текущую сцену = 0, то ;енто не описание сцены, ;а маркер конца => выход RET Z ;из процедуры. LD B,A ;иначе - это количество ;повторений сцены INC HL ;переходим к следующему ;элементу описания сцены, ;к кол-ву наборов отрезков ;в сцене C_V_L1 PUSH BC PUSH HL LD B,(HL) ;взяли количество наборов ;отрезков - стока раз ;будет крутится цикл INC HL ;переходим к следующему ;элементу описания сцены, ;к указателю на первый ;набор отрезков в сцене C_V_L2 PUSH BC LD E,(HL) ;в DE - укузатель на INC HL ;набор отрезков в LD D,(HL) ;сцене INC HL ;переходим к указателю ;на следующий набор ;отрезков в сцене PUSH HL ;сохраняем его для ;дальнейших подвигов :) PUSH DE ;LD IX,DE для юзания POP IX ;IX в параметрах ниже- ;следующей процедуры CALL DRAW_SCENE ;процедура по ука- ;зателю на набор от- ;резков в IX строит ;этот набор отрезков POP HL ;цикл прорисовки POP BC ;всех наборов в от- DJNZ C_V_L2 ;резков в сцене ;после того, как нарисованы все наборы отрезков в ;сцене, делаем буквально следующее: C_V_CH1 LD A,#17 ;флажок для пе- XOR %00001010 ;реключения ак- LD (C_V_CH1+1),A ;тивной и види- ;мой видеостраниц. CALL ONOF ;собственно делаем HALT ;отрисованную сцену CALL CLS ;видимой, и зачища- ;ем другую видеоб- ;ласть под next frame ;*****Begin of procedure********************** ;Вывод в правом нижнем углу экрана спрайта ;имитирующего загнутый уголок бымаги. ;****************************************** ;wywod ugolka :-) LD HL,CORNER_SPR LD DE,#D4A0+#20-3 LD B,20 WYWOD_UGOLKA_L1 PUSH BC PUSH DE LD BC,3 LDIR POP DE CALL INCD POP BC DJNZ WYWOD_UGOLKA_L1 ;*****End of procedure*********************** ;Вывод в правом нижнем углу экрана спрайта ;имитирующего загнутый уголок бымаги. ;****************************************** POP HL ;повторяем текущую сцену POP BC ;до полного истощения DJNZ C_V_L1 ;регистра B LD A,(HL) ADD A,A ;x2, переставляем указа- LD C,A ;тель текущей сцены LD B,0 ;на следующую сцену. ADD HL,BC INC HL LD (CURENT_SCENE),HL JP CHUNK_VISUAL ;MAIN LOOP DRAW_SCENE ; in IX-coors data x1, y1, x2, y2 etc... ; #00 - exit ; #FF - skip point ;несмотря на название, данная процедура отрисовыва- ;ет не всю сцену, а только один набор отрезков. ; ;На входе - IX: указатель на набор координат. ; ;Координаты хранятся в таком формате: ; x1, y1, x2, y2,...xN, yN, #FF,...xM, yM,#00 ;где #00 - маркер конца набора координат ; #FF - скип-маркер, cущность которого будет ; об'яснена. ; Так, как мы отрисовываем отрезки по следующему ;алгортму: t1-t2,t2-t3,t3-t4..., может возникнуть по- ;требность отрисовать после отрезока t(n-1),t(n) не ;отрезок t(n),t(n+1), а t(n+1),t(n+2) (т.е. разорвать по- ;лилинию), то при встрече скипмаркера мы перескаки- ;ваем одну пару (x,y) координат. ; Ну, а теперь о самой процедуре - в общем, она ри- ;сует отрезки (линии), которые и образуют рисунок ;на экране. "Живость" же изображения достигается за ;счет того, что одни и те же координаты каждый раз ;при перерисовке изображения изменяются на +/- 1 ;пиксел - изображение при этом приятно "потрясыва- ;ется." LD D,(IX+00) LD E,(IX+01) ;in DE-x1,y1 CALL RND ;в A - RND (0..255) CP 85 JR NC,D_S_C_11 DEC E JR DRAW_SCENE_C4 D_S_C_11 CP 165 ;NOP E JR C,DRAW_SCENE_C4 INC E DRAW_SCENE_C4 CALL RND CP 85 JR NC,D_S_C_12 DEC D JR DRAW_SCENE_C5 D_S_C_12 CP 165 ;NOP D JR C,DRAW_SCENE_C5 INC D DRAW_SCENE_C5 LD H,(IX+02) LD L,(IX+03) LD A,H ;check for #00 AND A RET Z INC A ;check for #FF JR NZ,DRAW_SCENE_C1 INC IX JR DRAW_SCENE_C2 DRAW_SCENE_C1 CALL RND CP 85 JR NC,D_S_C_112 DEC L JR DRAW_SCENE_C42 D_S_C_112 CP 165 ;NOP L JR C,DRAW_SCENE_C42 INC L DRAW_SCENE_C42 CALL RND CP 85 JR NC,D_S_C_122 DEC H JR DRAW_SCENE_C52 D_S_C_122 CP 165 ;NOP H JR C,DRAW_SCENE_C52 INC H DRAW_SCENE_C52 CALL LINE DRAW_SCENE_C2 INC IX INC IX JR DRAW_SCENE ;координаты точек в общем-то GIRL_FS_COOR *skipped* ────────────────────────────────────────── Пришлось убрать - уж больно много места. Полный листинг - в ПРИЛОЖЕНИИ ────────────────────────────────────────── *skipped* ;-----DRAW-LINE------------------------- ; HL - X1,Y1 (или Y1,X1 :) ; DE - X2,Y2 (или Y2,X2 :) LINE LD (CORDL),HL PUSH HL CALL PLOT POP HL LD BC,#101 LD A,D SUB H JP NC,LC1 LD B,#FF NEG LC1 LD D,A LD A,E SUB L JP NC,LC2 LD C,#FF NEG LC2 LD E,A LD A,D CP E JP NC,LC3 LD L,D LD (SIGN),BC XOR A LD B,A JP LC4 LC3 OR D RET Z LD L,E LD E,D LD (SIGN),BC LD C,0 LC4 LD H,E LD A,E RRA LCR ADD A,L JP C,LC5 CP H JP C,LC6 LC5 SUB H LD D,A EXX SIGN_OFFSET LD DE,0 JP LC7 LC6 LD D,A PUSH BC EXX POP DE CORDL_OFFSET LC7 LD HL,0 LD A,E ADD A,L LD E,A LD A,D INC A ADD A,H JP C,LC8 RET Z LC9 DEC A LD D,A LD (CORDL),DE CALL PLOT EXX LD A,D DEC E JP NZ,LCR RET LC8 JP Z,LC9 RET ;селф-модифаин кодэ, однако :) SIGN EQU SIGN_OFFSET+1 CORDL EQU CORDL_OFFSET+1 ;рисуем точку PLOT LD C,H LD H,PLT LD B,(HL) INC H LD A,(HL) INC H LD L,C OR (HL) LD C,A INC H LD A,(BC) OR (HL) LD (BC),A RET ;создание таблички для рисования точки MKTABPL LD HL,PLOTTAB ;MAKE PLOTTAB SCRPLT LD A,#C0 LD E,3 MK03 LD C,8 MK02 LD B,8 MK01 LD (HL),A INC L INC A DJNZ MK01 SUB 8 DEC C JP NZ,MK02 ADD A,8 DEC E JP NZ,MK03 LD L,0 INC H LD E,#20 CALL MK06 LD E,1 CALL MK06 LD A,#80 LD B,0 MK07 LD (HL),A INC HL RRCA DJNZ MK07 RET MK06 XOR A LD C,#20 MK05 LD B,8 MK04 LD (HL),A INC HL DJNZ MK04 ADD A,E DEC C JP NZ,MK05 RET ;специальный порт в спектруме для ;переключения страничек ; in рег. A - нумер сранички ONOF LD BC,#7FFD OUT (C),A RET ; char RND (void) ; A - out - psevdo_rnd value. RND LD BC,0 LD A,B ADD A,#77 LD B,A RLC C ADD A,C LD C,A LD (RND+1),BC RET ;чистим атрибуты... CLS_ATTR LD HL,#D800 LD DE,#D801 LD BC,#2FF LD (HL),#38 LDIR RET ;процедура создания "фастэра" для ;быстрой очистки экрана MAKE_CLS_ARRAY1 DI LD HL,0 LD (#8C0C),SP LD SP,#D800 MAKE_CLS LD HL,MAKE_CLS_ARRAY1 LD DE,#8000 LD BC,11 LDIR EX DE,HL LD E,L LD D,H INC E LD BC,#BFF LD (HL),#E5 LDIR EX DE,HL LD (HL),#31 LD HL,#C9FB LD (#8C0E),HL RET ;***ЗНАМЕНИТАЯ SUBROTINE **** ; ну ее все знают и пробовали INCD 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 ;файл-спрайт с правым-нижнем уголком экрана CORNER_SPR INSERT "corner_s.C" ;define CLS equ #8000 CLS EQU #8000 END ;адрес конца интры+1 L EQU END-#6000 ;длина интры в байтах FREE ;адрес свободной от интры области ;- Зачем ? ;- Не знаю ! ───────────────────────────────────────────────────   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 ;файл-спрайт с правым-нижнем уголком экрана CORNER_SPR INSERT "corner_s.C" ;define CLS equ #8000 CLS EQU #8000 END ;адрес конца интры+1 L EQU END-#6000 ;длина интры в байтах FREE ;адрес свободной от интры области ;- Зачем ? ;- Не знаю !