;*************************************** ;PUT SPRite 8*8 Pixel in Bildspeicher setzen ; alten BS-Inhalt retten ; ; IN: a Nummer des Sprite ; bc x-Koordinate ; de y-Koordinate ; ; Stand: 10.04.89 ; ;------------------------------------------------- PUTSPR push af ld hl,SPRT0 inc a PUSP1 dec a jp z,PUSP2 inc hl inc hl jp PUSP1 PUSP2 push hl pop ix ;Zeiger auf akt.Sprite ld a,(ix+48) or (ix+49) ;Test,ob Sprite definiert scf ret z ;nicht definiert -> CY=1 di ld a,(hl) or a ;Test POIMA* call nz,RUECK ;R}ckschreiben alter Hintergrund call TPPOS ;neue Koordinate testen jp nc,PUSP3 ;ausserhalb push bc push de call MKPMA ld de,7 pop hl add hl,de ex de,hl ;de=de+7 pop bc add hl,bc ld b,h ld c,l ;bc=bc+7 call TPPOS ;rechte obere Ecke PUSP3 ld (ix),d ;(POIMA*)=0 jp nc,PUSPFE ;fertig ld (ix+1),e ;y+7 ld (ix+16),c ld (ix+17),b ;x+7 pop af push af push ix ld d,a ;Z{hler f}r h|here Priorit{t ;------------------------------------------- ;Test, ob Sprite mit h|herer Priorit{t vorhanden ;wenn ja, dann aktuelles Sprite nicht setzen ;------------------------------------------- inc d PUSP4 dec d jp z,PUSP5 dec ix dec ix ;Zeiger auf Daten n{chstes Sprite ld a,(ix) ;Test (POIMA*) and a jp z,PUSP4 ;Sprite ist nicht gesetzt ld a,(ix+1) sub e ;y-Koordinate jp nc,PUSP42 neg PUSP42 and 0F8h ;max 15 Pixel Abstand jp nz,PUSP4 ;nein ld l,(ix+16) ld h,(ix+17) ;x-Koordinate sbc hl,bc ;max 15 Pixel Abstand jp nc,PUSP41 ld a,h cpl ld h,a ld a,l cpl ld l,a inc hl ;Zweierkomplement hl PUSP41 ld a,l and 0F8h or h jp nz,PUSP4 ;nein pop hl ;getroffen -> Sprite nicht setzen pop af ei jp KOLLI ;--------------- PUSP5 pop ix pop af push ix or 0F8H cpl ld d,a ;d=7-a Z{hler niedrigere Priorit{t ;--------------------------------------------------- ;Test, ob Sprite mit niedrigerer Priorit{t vorhanden ;wenn ja, dann dieses Sprite l|schen ;--------------------------------------------------- xor a ld (HSWAP),a ;Hilfszelle Z{hlen niedere Sprites inc d PUSP6 dec d jp z,PUSP7 ;keine niederen Sprites mehr inc ix inc ix ;Zeiger auf n{chsten niederes Spite ld a,(ix) and a ;Test, ob Sprite gesetzt jp z,PUSP6 ;nein ld a,(ix+1) ;y-Koordinate sub e ;max 15 Pixel Abstand jp nc,PUSP62 neg PUSP62 and 0F8h jp nz,PUSP6 ;nein ld l,(ix+16) ld h,(ix+17) sbc hl,bc jp nc,PUSP61 ld a,h cpl ld h,a ld a,l cpl ld l,a inc hl ;Zweierkomplement hl PUSP61 ld a,l ;x-Koordinate and 0F8h ;max 15 Pixel Abstand or h jp nz,PUSP6 ;nein push ix ;getroffen pop hl ld a,(hl) ;POIMA* ld (hl),0 call RUECK ;Sprite wegnehmen call BKOLLI ;bedingte Kollissionsanzeige jp PUSP6 ;n{chstes Sprite ;-------------------------------------------------------- PUSP7 pop ix ;Zeiger akt. Sprite regenerieren ld a,(POIMA) ld (ix),a ;POIMA* aktual. ld de,(POIADR) ld (ix+32),e ld (ix+33),d ;POIADR* aktual. ld l,(ix+48) ld h,(ix+49) ;hl Zeiger auf Hintergrundpuffer ;--------------------------------------------------------- ;Hintergrund speichern ;--------------------------------------------------------- ld bc,398h ;b=3 3 Spalten c=98h PARAP PUSP8 push bc ld a,CURS out (COMNP),a out (c),e out (c),d ;----------- ld a,FIGS out (COMNP),a ld a,4 out (PARAP),a add a,a ;a=8 Anzahl out (PARAP),a xor a out (PARAP),a ;------------ ld bc,1099h ;b=16 Zahhler c=99h Portnr. PUSP9 in a,(FLAGR) ;Test vor READ and 4 jr z,PUSP9 ld a,RDATWO out (COMNP),a PUSP10 in a,(FLAGR) ;Test,ob gelesen and 1 jr z,PUSP10 ini jp nz,PUSP10 inc de pop bc djnz PUSP8 ;noch nicht alle Spalten ;------------- ld a,FIGS ;Schreibrichtung r}ckstellen out (COMNP),a ld a,2 out (PARAP),a xor a out (PARAP),a out (PARAP),a ;-------------------------------------------------------- ;Sprite entsprechend POIMA in VRAM schreiben ;IN: hl Zeiger auf Spritepuffer ;------------------------------------------------------- ld a,(POIMA) ld de,24 PUSP11 rrca jp c,PUSP12 add hl,de ;Zeiger auf n{chste Spritestellung jp PUSP11 PUSP12 ex de,hl ;de Quellpuffer ld bc,898h ;b Z{hler 8 Zeilen c Portadr. ld hl,(POIADR) ;---------------- PUSSY1 in a,(FLAGR) and 20h jp nz,PUSSY1 PUSSY2 in a,(FLAGR) and 20h jp z,PUSSY2 ;---------------- PUSP13 push bc ld a,CURS out (COMNP),a out (c),l out (c),h xor a ld bc,80 sbc hl,bc push hl ;Kursor n{chste Zeile kellern ld bc,398h ;b Z{hler 3 Spalten c Portadr. ld hl,(PALCOL) PUSP14 ld a,MASK out (COMNP),a ld a,(de) ;aktuelle Maske inc de out (PARAP),a out (PARAP),a ld a,WDATWO out (COMNP),a out (c),l out (c),h djnz PUSP14 ;noch nicht 3 Spalten pop hl pop bc djnz PUSP13 ;noch nicht alle 8 Zeilen xor a ;cY=0 ei ret ;fertig geschrieben PUSPFE pop af xor a ;CY=0 ei ret ;fertig ohne Schreiben ;============================================================= ;3 mal 8 Worte entsprechend POIMA in den Bildspeicher schreiben ;IN : hl POIADR de Zeiger auf Quellpuffer a POIMA ;------------------------------------------------------------- RUECK push bc push de and 0Fh dec a cpl ld b,a rrca rrca rrca rrca and b ld b,a cpl push af push bc ld bc,16 add hl,bc add hl,bc ;hl Zeiger auf POIADR* ld e,(hl) inc hl ld d,(hl) add hl,bc ;hl Zeiger auf Highbyte der Spriteadresse ld a,(hl) dec hl ld l,(hl) ld h,a ;hl Quelle de Zeiger in VRAM ld a,FIGS out (COMNP),a ld a,4 ;Richtung ^ out (PARAP),a xor a out (PARAP),a out (PARAP),a ;Anzahl -1 = 0 pop bc ld c,PARAP call RUECK2 ;Spalte 1 mit MASKE schreiben ld b,0FFh call RUECK2 ;Spalte 2 mit Maske FF schreiben pop af call RUECK1 ;Spalte 3 mit NMASKE schreiben pop de pop bc ret ;---------------------------------------------------------- ;1 mal 8 Worte senkrecht in den Bildspeicher schreiben ;IN: a Maske de POIADR hl Zeiger in Quellpuffer ;OUT: de POIADR+1 hl Zeiger in Quellpuffer ; RUECK1 ld b,a RUECK2 ld a,CURS out (COMNP),a out (c),e out (c),d ld a,MASK out (COMNP),a out (c),b out (c),b ld b,16 ld a,WDATWO out (COMNP),a ;hl Quellpuffer otir inc de ;POIADR +1 ret ;================================================================ ;Kollissionsanmeldung ;-------------------------------------------------------------- BKOLLI ld a,(HSWAP) and a ret nz ;Spriteinterrupt bereits angemeldet inc a ld (HSWAP),a KOLLI ld hl,SPRISW ld a,(hl) and 1 ;IR ON gewesen? ret z ;nein ld a,(hl) or 4 ;IR STOP gewesen? cp (hl) ret z ;ja ld (hl),a ;IR STOP xor 5 ret nz ld hl,IRVAN inc (hl) ;Anmeldung hochzaehlen ret ;================================================================ ;SPRiteRESet ;---------------------------------------------------------------- SPRRES ld hl,SPRT0 ld b,64 xor a SPRRE1 ld (hl),a inc hl djnz SPRRE1 ret ;---------------------------------------------------------------- ÿªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª