Deja Vu
#04
31 марта 1998 |
|
CODING - Вращение спрайтов.
SoundTrack: MR.Z OF LASER SOFT '98 (C)BD __________________________________________ ;----------------------------------------; ; TURN SPRITES ; ; (c) SerzhSoft, Shadrinsk, 31 july 1997 ; ;----------------------------------------; ORG #8000 JP EXAMPLE ;----------------------------------------; ;используется в изменяемых командах _NULL EQU 0 ;----------------------------------------; ALFA dw 0 ;угол наклона спрайта ; COSALFA db 0 ;абсолютное значение db 0 ;знак: 0=[+], #ff=[-] ; SINALFA db 0 ;абсолютное значение db 0 ;знак: 0=[+], #ff=[-] ;----------------------------------------; ATTR_P EQU 23693 ;атрибуты экрана ;----------------------------------------; ;биты: 0 - over 0/1, 2 - inverse 0/1 ; 4 - ink & paper 9 (прозрачные атр.) P_FLAG EQU 23697 ;----------------------------------------; ;демонстрационный пример EXAMPLE di ; XOR A LD (P_FLAG),A ; ld hl,0 ;угол накл. спрайта ld a,128 ;масштаб: 0.5:1 call INISYST ;иниц-я системы координат ; ld e,0 ;X спрайта ld d,0 ;Y спрайта ld ix,MYSPR2 ;ADR_SPR ld c,(ix+0) ;ширина, байты ld b,(ix+1) ;высота, пиксели inc ix inc ix call CORNSPR ;вывод спрайта по лев. верх. углу ; ld e,200 ;X спрайта ld d,0 ;Y спрайта ld ix,MYSPR1 ;ADR_SPR ld c,(ix+0) ;ширина, байты ld b,(ix+1) ;высота, пиксели inc ix inc ix call CORNSPR ;вывод спрайта по лев. верх. углу ; ld hl,45 ;наклон 45 град. ld a,255 ;масштаб: 1:1 call INISYST ;сист. координат ; ld e,100 ;X ld d,100 ;Y ld ix,MYSPR2 ;ADR_SPR ld c,(ix+0) ;XR_IN_BYTES ld b,(ix+1) ;YR_IN_PIXELS inc ix inc ix call CENTSPR ;PUT_CENTRE_TURN_ SPRITE ; LD A,#04 ;[set 2,a] LD (P_FLAG),A ;inverse 1 ; ld hl,90 ;наклон 45 град. ld a,255 ;масштаб: 1:1 call INISYST ;сист. координат ; ld e,210 ;X ld d,100 ;Y ld ix,MYSPR1 ;ADR_SPR ld c,(ix+0) ;XR_IN_BYTES ld b,(ix+1) ;YR_IN_PIXELS inc ix inc ix call CENTSPR ;PUT_CENTRE_TURN_ SPRITE ; CALL WAITKEY ei ret ;----------------------------------------; ;инициализация системы координат для ; последующих выводов спрайтов ; HL=0..359 - угол наклона в градусах ; A=0..255 - масштаб 0:1 ... 1:1 INISYST push af ld (ALFA),hl call SIN_HL pop bc push bc ld c,a sbc a,a ld d,a call MULT_BC ld l,a ld h,d ld (SINALFA),hl ld hl,(ALFA) call COS_HL pop bc ld c,a sbc a,a ld d,a call MULT_BC ld l,a ld h,d ld (COSALFA),hl ld ix,DTATAB ld de,#0000 ld a,d LPIS1 push af ld a,(COSALFA) pop bc push bc ld c,a call MULT_BC ld h,a sub e ld e,h ld c,a ld a,(COSALFA+1) rra jr nc,GOIS1 ld a,c neg ld c,a GOIS1 ld (ix+0),c inc ix ld a,(SINALFA) pop bc push bc ld c,a call MULT_BC ld h,a sub d ld d,h ld c,a ld a,(SINALFA+1) rra jr nc,GOIS2 ld a,c neg ld c,a GOIS2 ld (ix+0),c inc ix pop af inc a jr nz,LPIS1 ret ;----------------------------------------; ;вывод повернутого спрайта по центру ; прерывания - запрещать! (из-за стека) ; E=x, D=y - координаты центра ; C=xr - ширина спрайта в знакоместах ; B=yr - высота спрайта в пикселях ; IX - адрес данных спрайта CENTSPR push bc srl b sla c sla c push bc ld a,(SINALFA) ld c,a call MULT_BC ld h,a ld a,(SINALFA+1) rra ld a,h jr c,GOCS1 neg GOCS1 add a,e ld e,a ;X0-YR/2*SIN(A) pop bc push bc ld a,(COSALFA) ld b,a call MULT_BC ld h,a ld a,(COSALFA+1) rra ld a,h jr c,GOCS2 neg GOCS2 add a,e ld e,a ;X0-YR/2*SIN(A)- -XR/2*COS(A) pop bc push bc ld a,(COSALFA) ld c,a call MULT_BC ld h,a ld a,(COSALFA+1) rra ld a,h jr c,GOCS3 neg GOCS3 add a,d ld d,a ;Y0-YR/2*COS(A) pop bc ld a,(SINALFA) ld b,a call MULT_BC ld h,a ld a,(SINALFA+1) rra ld a,h jr nc,GOCS4 neg GOCS4 add a,d ld d,a ;Y0-YR/2*COS(A)+ +XR/2*SIN(A) pop bc ;--------------------------------------; ;вывод повернутого спрайта по углу ; прерывания - запрещать! (из-за стека) ; E=x, D=y - координаты лев. верх. угла ; C=xr - ширина спрайта в знакоместах ; B=yr - высота спрайта в пикселях ; IX - адрес данных спрайта CORNSPR ld hl,DTATAB LPCRS0 push bc push de push hl ld (CORNSP1),sp ld sp,DTATAB ld a,c LPCRS1 ld b,(ix+0) LPCRS2 ex af,af' pop hl ld a,e SIGN_XX add a,l ld e,a ld a,d SIGN_XY sub h cp #C0 jr nc,NO_PUT ld d,a ; LD C,#07 ld a,d rra scf rra rra and #5F ld h,a xor e and C xor e rrca rrca rrca ld l,a ld a,d xor h and C xor h ld h,a LD A,E AND C LD C,B LD B,A LD A,#80 JR Z,IF_TRN LP_TRN RRCA DJNZ LP_TRN IF_TRN LD B,C LD C,A LD A,(P_FLAG) rlc b jr c,NO_RES xor #04 NO_RES BIT 2,A LD A,#A9 ;[xor c] - inv. 1 JR NZ,IF_TRN1 LD A,#00 ;[nop] - inverse 0 IF_TRN1 LD (INV_TRN),A LD A,(HL) OR C INV_TRN XOR C LD (HL),A LD A,(P_FLAG) BIT 4,A JR NZ,NO_PUT LD A,H RRA RRA RRA AND #03 OR #58 LD H,A LD A,(ATTR_P) LD (HL),A ; NO_PUT ex af,af' add a,#20 jp nc,LPCRS2 inc ix dec a jp nz,LPCRS1 EXCRS1 ld sp,0 CORNSP1 equ $-2 pop hl pop de ld a,d SIGN_YY add a,(hl) ld d,a inc hl ld a,e SIGN_YX add a,(hl) ld e,a inc hl pop bc DEC B JP NZ,LPCRS0 ret ;----------------------------------------; ;быстрое умножение B на C ;AL=B*C MULT_BC ld l,b xor a rr l jr nc,$+3: add a,c: rra: rr l jr nc,$+3: add a,c: rra: rr l jr nc,$+3: add a,c: rra: rr l jr nc,$+3: add a,c: rra: rr l jr nc,$+3: add a,c: rra: rr l jr nc,$+3: add a,c: rra: rr l jr nc,$+3: add a,c: rra: rr l jr nc,$+3: add a,c: rra: rr l ret ;----------------------------------------; ;вычисление синуса HL ;A=sin(HL)*255, CF=sign (NC=[+], C=[-]) SIN_HL dec h jr z,GOSIN2 inc h jr nz,SIN360 ld h,SINTAB/256 ld a,l cp 180 jr nc,GOSIN1 ld a,(hl) and a ret GOSIN1 sub 180 ld l,a ld a,(hl) scf ret GOSIN2 ld a,l cp 104 jr nc,GOSIN3 ld l,a ld a,104 sub l ld l,a ld h,SINTAB/256 ld a,(hl) scf ret GOSIN3 inc h SIN360 ld bc,360 and a LPSIN1 sbc hl,bc jr nc,LPSIN1 add hl,bc jp SIN_HL ;----------------------------------------; ;вычисление косинуса HL ;A=cos(HL)*255, CF=sign (NC=[+], C=[-]) COS_HL dec h jr z,GOCOS3 inc h jr nz,COS360 ld h,SINTAB/256 ld a,l cp 180 jr nc,GOCOS2 sub 90 jr c,GOCOS1 ld l,a ld a,(hl) scf ret GOCOS1 add a,180 ld l,a ld a,(hl) and a ret GOCOS2 sub 90 ld l,a ld a,(hl) scf ret GOCOS3 ld a,l cp 14 jr nc,GOCOS4 add a,166 ld l,a ld h,SINTAB/256 ld a,(hl) scf ret GOCOS4 cp 104 jr nc,GOCOS5 sub 14 ld l,a ld h,SINTAB/256 ld a,(hl) and a ret GOCOS5 inc h COS360 ld bc,360 and a LPCOS1 sbc hl,bc jr nc,LPCOS1 add hl,bc jp COS_HL ;----------------------------------------; ;ждет нажатия на любую клавишу WAITKEY XOR A IN A,(#FE) CPL AND #1F JR Z,WAITKEY RET ;----------------------------------------; ;выравнивание на сегмент (граница 256) ds $/256*256+256-$ SINTAB insert "sincos.d" ;----------------------------------------; MYSPR1 insert "spr1.spr" ;спрайт 1 MYSPR2 insert "spr2.spr" ;спрайт 2 ;----------------------------------------; DTATAB ds 512 ;DELTA_LINES ;можно использовать все тот же BUFFER ;----------------------------------------; ========================================== ;----------------------------------------; ; CIRCLE AND TEXTURED FILL ; ; (c) SerzhSoft, Shadrinsk, 31 july 1997 ; ;----------------------------------------; ORG #8000 JP EXAMPLE ;----------------------------------------; ;используется в изменяемых командах _NULL EQU 0 ;----------------------------------------; ;адрес текстуры для вывода TXRADR DW TEXTURE ;----------------------------------------; ATTR_P EQU 23693 ;атрибуты экрана ;----------------------------------------; ;биты: 0 - over 0/1, 2 - inverse 0/1 ; 4 - ink&paper 9 (прозрачные атр.) P_FLAG EQU 23697 ;----------------------------------------; ;демонстрационный пример EXAMPLE XOR A LD (P_FLAG),A ; ld hl,-100 ld de,-100 ld a,255 CALL CIRCLE ; LD E,10 LD D,10 XOR A CALL TXRFILL ; ld hl,200 ld de,100 ld a,50 CALL CIRCLE ; LD E,200 LD D,100 LD A,1 CALL TXRFILL ; ld hl,115 ld de,150 ld a,20 CALL CIRCLE ; LD E,115 LD D,150 LD A,2 CALL TXRFILL ; LD A,#04 ;[set 2,a] LD (P_FLAG),A ;inverse 1 ; LD E,10 LD D,170 LD A,2 CALL TXRFILL ; CALL WAITKEY RET ;----------------------------------------; ;ждет нажатия на любую клавишу WAITKEY XOR A IN A,(#FE) CPL AND #1F JR Z,WAITKEY RET ;----------------------------------------; ;Algorythm designed by SerzhSoft (c)1996 ;рисование окружности ; HL=x, DE=y (-32768..+23767) ; A=радиус (0..255) ;при 0 - точка CIRCLE ld (X_CIRC),hl ld (Y_CIRC),de ld e,a ld c,#00 ld b,c ld d,c srl a LPCIR1 ex af,af' LPCIR2 call PUT8PX inc c ex af,af' sub c jr nc,LPCIR1 dec e add a,e ex af,af' ld a,e cp c jr nc,LPCIR2 ret ; PUT8PX call PUT4PX ; PUT4PX ld a,c ld c,e ld e,a ld hl,_NULL X_CIRC equ $-2 push hl add hl,bc call PUT2PX pop hl sbc hl,bc ; PUT2PX inc h dec h ret nz ld a,l ld (X_NEW),a ld hl,_NULL Y_CIRC equ $-2 push hl add hl,de call PUT1PX pop hl sbc hl,de ; PUT1PX inc h dec h ret nz ld a,l cp #C0 ret nc push de ld d,a ld e,_NULL X_NEW equ $-1 push bc call PLOT pop bc pop de ret ;----------------------------------------; ;текстурная заливка ; E=x, D=y, A=номер текстуры (0..255) TXRFILL RRCA RRCA RRCA LD H,A AND #E0 LD L,A XOR H ADD A,TEXTURE/256 LD H,A LD (TXRADR),HL ; ;заливка, но не по номеру текстуры, а ;по адресу, установленному в TXRADR TXRFIL2 LD A,D CP #C0 RET NC LD A,(P_FLAG) BIT 2,A LD A,#A9 ;[xor c] - inv. 0 JR Z,IF_TXF0 LD A,#A1 ;[and c] - inv. 1 IF_TXF0 LD (INV_TXF),A LD HL,BUFFER LD A,#FF PUSH AF PUSH DE LP_TXF1 POP DE INC D JP Z,GO_TXF0 DEC D CALL POINTHL JR NZ,LP_TXF1 EX AF,AF' LP_TXF2 LD A,E LD (HL),A OR A JR Z,GO_TXF1 DEC E CALL POINTHL JR Z,LP_TXF2 LP_TXF3 INC E JR Z,GO_TXF8 GO_TXF1 PUSH HL CALL POINT JR NZ,GO_TXF7 LD A,(HL) OR C CALL TO_PLOT POP HL LD A,D OR A JR Z,GO_TXF4 DEC D CALL POINTHL JR Z,GO_TXF2 EX AF,AF' LD A,B JR GO_TXF3 GO_TXF2 EX AF,AF' INC A DEC A JR NZ,GO_TXF3 LD A,C PUSH DE GO_TXF3 EX AF,AF' INC D GO_TXF4 LD A,D CP #BF JR NC,LP_TXF3 INC D CALL POINTHL JR Z,GO_TXF5 EX AF,AF' AND A JR GO_TXF6 GO_TXF5 EX AF,AF' JR C,GO_TXF6 SCF PUSH DE GO_TXF6 EX AF,AF' DEC D JR LP_TXF3 GO_TXF7 POP HL GO_TXF8 LD A,E SUB (HL) INC HL LD (HL),D INC HL LD (HL),A INC HL JR LP_TXF1 ; LP_TXF4 ADD HL,DE DEC HL LD A,(HL) DEC HL LD D,(HL) DEC HL LD E,(HL) PUSH HL PUSH AF CALL POINT POP AF LD B,A LD A,E RRA RRA RRA RRA LD A,D RLA LD DE,(TXRADR) XOR E AND #1F XOR E LD E,A LP_TXF5 LD A,(DE) AND C INV_TXF XOR C XOR (HL) LD (HL),A RRC C JR NC,GO_TXF9 INC L LD A,E XOR #01 LD E,A GO_TXF9 DJNZ LP_TXF5 POP HL GO_TXF0 LD DE,BUFFER AND A SBC HL,DE JR NZ,LP_TXF4 RET ;----------------------------------------; ;выч. адреса и проверка состояния точки POINT LD B,#07 LD A,D RRA SCF RRA RRA AND #5F LD H,A XOR E AND B XOR E RRCA RRCA RRCA LD L,A LD A,D XOR H AND B XOR H LD H,A LD A,E AND B LD B,A LD A,#80 JR Z,GO_PNT LP_PNT RRCA DJNZ LP_PNT GO_PNT LD C,A AND (HL) RET ; POINTHL PUSH HL CALL POINT POP HL RET ;----------------------------------------; ;установка точки PLOT CALL POINT LD A,(P_FLAG) PUSH HL LD HL,#A9A9 ;over 1, inv. 1 BIT 0,A JR NZ,IF_PLT1 LD L,#B1 ;[or c] - over 0 IF_PLT1 BIT 2,A JR NZ,IF_PLT2 LD H,#00 ;[nop] - inverse 1 IF_PLT2 LD (OVR_PLT),HL POP HL LD A,(HL) OVR_PLT OR C INV_PLT XOR C ; TO_PLOT ;вход для пр-ры заливки и др. LD (HL),A LD A,(P_FLAG) BIT 4,A RET NZ LD A,H RRA RRA RRA AND #03 OR #58 LD H,A LD A,(ATTR_P) LD (HL),A RET ;----------------------------------------; ;выравнивание на сегмент (граница 256) DS $/256*256+256-$ ;----------------------------------------; ;различные текстуры 2*2 знакоместа TEXTURE DB %11111111,%11110000 DB %11111111,%11111000 DB %11000000,%00110100 DB %11011111,%11111010 DB %11011111,%11110100 DB %11011010,%11111010 DB %11011101,%11110100 DB %11011010,%11111010 DB %11011111,%11110100 DB %11011111,%11111010 DB %11111111,%11110100 DB %11111111,%11111010 DB %01010101,%01010100 DB %00101010,%10101010 DB %00010101,%01010100 DB %00000000,%00000000 ; DB %11111111,%11110000 DB %11111111,%11111000 DB %11000000,%00110100 DB %11011111,%11111010 DB %11011111,%11110100 DB %11011000,%11111010 DB %11011010,%11110100 DB %11011000,%11111010 DB %11011111,%11110100 DB %11011111,%11111010 DB %11111111,%11110100 DB %11111111,%11111010 DB %01010101,%01010100 DB %00101010,%10101010 DB %00010101,%01010100 DB %00000000,%00000000 ; DB %11111111,%11110000 DB %11111111,%11111000 DB %11000000,%00110100 DB %11011111,%11111010 DB %11011111,%11110100 DB %11011111,%11111010 DB %11011111,%11110100 DB %11011111,%11111010 DB %11011111,%11110100 DB %11011111,%11111010 DB %11111111,%11110100 DB %11111111,%11111010 DB %01010101,%01010100 DB %00101010,%10101010 DB %00010101,%01010100 DB %00000000,%00000000 ;----------------------------------------; ;буфер для запоминания координат линий ; при заливке (требует большого объема) BUFFER EQU $ EX DE,HL ; Например, для основ- ного знака X AND A ; дополни- тельным бу- дет I, а их SBC HL,BC ; разность соответст- венно: EX DE,HL ;10-1=9,т.е. IX LD C,A ;код основ- ного знака LD A,(HL) ;код допол- нительного знака EX (SP),HL ;HL=печатае- мое число SBC HL,DE ;если оно < дополнитель- ного JR C,GO_PRW3 ; значения, то не печа- таем RST #10 ;печать до- полнитель- ного знака LD A,C ;основной знак RST #10 ;печать JR GO_PRW4 ;результат - двухбукв. сочетание GO_PRW3 ADD HL,DE ;восстанови- ли (+) у числа GO_PRW4 EX (SP),HL ;число -> на стек HL_PRW LD HL,_NULL ;адрес сле- дующего знака в таблице DB #DD ;работаем с половинкой регистра IX DEC L ;DEC XL - уменьшаем счетчик знаков JR NZ,LP_PRW1 ;крутим цикл пока есть еще знаки POP HL ;сняли не- нужный уже ноль со стека RET ;выход из процедуры ;----------------------------------------; RIM_TBL ;Таблица значимости букв в написа- нии римских чисел DW 1000 DB "M" ;M=1000 ;CM=900 DW 500 DB "D" ;D=500 ;CD=400 DW 100 DB "C" ;C=100 ;XC=90 DW 50 DB "L" ;L=50 ;XL=40 DW 10 DB "X" ;X=10 ;IX=9 DW 5 DB "V" ;V=5 ;IV=4 DW 1 DB "I" ;I=1 ;-nop- ;----------------------------------------; ; end of PDES LIB 2.0 ; ; ;----------------------------------------;
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября