;Experimental Sprite expansion routine ;------------------------------------- ;Expands sprites into a memory area then blats them to the screen. ORG &8000 DUMP &8000 stepval: EQU 8 DI IN A,(&FA) LD (lmpr.store+1),A IN A,(&FC) LD (vmpr.store+1),A LD (sp.store+1),SP LD SP,&0000 LD A,3+32 OUT (&FA),A LD IY,0 LD IX,data.table LD BC,7680 main.loop: PUSH IY LD HL,sprite LD D,32 LD E,103 CALL generate POP DE LD (IX),L LD (IX+1),H LD (IX+2),E SET 7,D LD (IX+3),D IN A,(&FA) AND 31 LD (IX+4),A INC IX INC IX INC IX INC IX INC IX PUSH IY POP HL BIT 6,H JR Z,not.overf RES 6,H IN A,(&FA) INC A OUT (&FA),A not.overf: PUSH HL POP IY PUSH BC POP HL LD BC,stepval SBC HL,BC PUSH HL POP BC LD A,B CP 1 JR NC,main.loop LD (IX),&FF LD (IX+1),&FF LD (IX+2),&FF LD (IX+3),&FF LD (IX+4),&FF XOR A OUT (&FE),A LD A,30+32 OUT (&FA),A LD HL,put.sprite LD DE,&6000 LD BC,put.spr.len LDIR LD HL,0 LD DE,1 LD (HL),L LD BC,&5FFF LDIR LD A,24+32 OUT (&FA),A LD HL,put.sprite LD DE,&6000 LD BC,put.spr.len LDIR LD HL,0 LD DE,1 LD (HL),L LD BC,&5FFF LDIR LD A,30+96 OUT (&FC),A LD IX,data.table expander: LD C,(IX) INC IX LD B,(IX) INC IX LD A,C CP 255 JR Z,exit.exp LD L,(IX) INC IX LD H,(IX) INC IX LD E,(IX) INC IX CALL &6000 LD BC,&01F8 waitl: IN A,(C) CP 64-16 JR NZ,waitl IN A,(&FC) AND 31 OR 32 LD E,A IN A,(&FA) AND 31 OR 96 OUT (&FC),A LD A,E OUT (&FA),A JR expander exit.exp: loopr: LD A,&7F IN A,(&FE) RRA RRA JR C,loopr sp.store: LD SP,&0000 lmpr.store: LD A,&00 OUT (&FA),A vmpr.store: LD A,&00 OUT (&FC),A EI RET ;Entered with HL=sprite address, A=sprite page, ; C=width, B=height put.sprite: ORG &6000 IN A,(&FB) LD (sp.str+1),SP LD SP,&8000 EX AF,AF' LD A,E OUT (&FB),A LD A,128 SUB C LD E,A LD A,B SRL A LD D,A LD A,96 SUB D LD D,A SRL D RR E loop2: PUSH BC PUSH DE loop3: LDI LD A,C OR A JR NZ,loop3 POP DE POP BC PUSH HL LD HL,128 ADD HL,DE EX DE,HL POP HL DJNZ loop2 EX AF,AF' sp.str: LD SP,&0000 OUT (&FB),A RET put.spr.len: EQU $-&6000 ORG put.sprite+put.spr.len ;Sprite scaler ;------------- ;(c) 28-12-93 Simon Cooke ;Generates sprites using 8 bit step, 8 bit fraction to skip ;pixels... ;Call with: ; CALL generate ;Enter with: ;BC = skip value (eg 0024 = 24/256) ;IY = destination address ;HL = sprite address (origin sprite) ; D = height of sprite ; E = width of sprite (bytes) ;Exits with: ; L = expanded width (bytes) ; H = expanded depth ;IY = expanded sprite data end + 1 generate: LD (mloop+1),HL ;initialise self-modifying LD A,E ;code LD (width2+1),A ADD A,A LD (width+1),A LD A,D LD (height+1),A LD HL,0 ;point to top left corner LD (sizes),HL ;of sprite, current expanded LD (curr.y),HL ;sprite size counters = 0 LD (curr.x),HL mloop: LD HL,&0000 ;base address to look up ;sprite LD A,(curr.x+1) SRL A ;add current x value LD E,A LD D,0 ADD HL,DE LD A,(curr.x+1) ;look at odd or even pixel? RRA LD A,(HL) JR C,odd.pixel AND &F0 RRCA RRCA RRCA RRCA JR got.pixel odd.pixel: AND &0F got.pixel: LD E,A LD A,(sizes) ;current x-coord in expanded RRA LD A,(IY) JR C,odd.pix2 AND &0F RRC E RRC E RRC E RRC E OR E LD (IY),A JR putted odd.pix2: AND &F0 OR E LD (IY),A INC IY putted: LD A,(sizes) ;increase expanded width by 1 INC A LD (sizes),A LD HL,(curr.x) ADD HL,BC LD (curr.x),HL JR C,next.line LD A,H width: CP &00 ;is sprite pos > sprite width JR C,mloop ;if NOT, loop next.line: LD A,(sizes) LD (maxw),A XOR A LD (sizes),A LD A,(sizes+1) ;increase depth of expanded INC A ;sprite by 1 LD (sizes+1),A LD A,(sizes) ;has the last byte of the RRA ;line been dumped? JR NC,zeroed LD A,(IY) AND &F0 LD (IY),A INC IY zeroed: LD A,(curr.y+1) LD E,A LD HL,(curr.y) ADD HL,BC LD (curr.y),HL LD A,H height: CP &00 JR NC,end.expand LD HL,0 LD (curr.x),HL LD A,(curr.y+1) SUB E LD HL,(mloop+1) width2: LD DE,&0000 ml2: OR A JR Z,exitl2 ml3: ADD HL,DE DEC A JR NZ,ml3 exitl2: LD (mloop+1),HL JP mloop end.expand: LD A,(sizes+1) LD H,A LD A,(maxw) SRL A LD L,A RET sizes: DEFW 0 maxw: DEFB 0 curr.x: DEFW 0 curr.y: DEFW 0 sprite: MDAT "entro.dat" data.table: DEFW 4500