;Infinity Cracktro menu -- Practical Joke :@) ;-------------------------------------------- ;(c) 1993 Simon Cooke ;Displays on screen.... ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ÄÂÄ¿ ³ÚÄÄÄÂÄ¿ ³ÄÂÄÄÂÄ\ /³ ;³ ³ ³\³ÃÄ ³ ³\³ ³ ³ ³ ³ ;³ÄÁÄÙ ³³ ÄÁÄÙ ³ÄÁÄ ³ ³ ³ ;³ OOO OOO ³ ;³ O OOoo O ³ ;³ O ooOO O ³ ;³ OOO OOO ³ ;ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ;³ BARREL/COKE CAN SCROLL ³ ;³ ³ ;³ ^ ^ ^ ³ ;³ ³ ;ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ;³SCROLLY MESSAGE...SCROLL³ ;ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ;Bog-standard scrolly message at bottom of screen (8 lines high) ;Infinite BOBs routine to show moving Infinity (Oreboros) symbol at top ;of screen... ;Barrel/Coke can scroller -- Looks like things shrink at the top & bottom, ;as if it were printed on a revolving barrel or can of pop. ORG &8000 DUMP &8000 maximum: EQU 112 ;highest possible y value... maxycursor: EQU 112 DI ;store basic for later IN A,(&FA) LD (low.page+1),A IN A,(&FC) LD (scr.page+1),A LD (sp.store+1),SP LD SP,&C000 ;set up stack LD BC,&10F8 ;clear the screen blank.loop: DEFB &ED,&71 DJNZ blank.loop CALL 61727 ;initialise 128k Spectrum Music ;(Thundercats by Dave Whittaker - LD A,3+32 ;excellent!) OUT (&FA),A ;page in barrel area LD HL,3584 ;clear barrel area LD DE,3585 LD (HL),0 LD BC,6144-3584 LDIR LD HL,8192 LD DE,8193 LD BC,6144 LD (HL),%00000111 ;set up barrel attributes LDIR CALL clear.scrs ;clear the screens CALL put.infinity ;put the INFINITY logo up loop: LD A,1 ;wait for scan line 170 IN A,(&F8) CP 170 JR NZ,loop LD A,14+96 ;put screen in mode 4 OUT (&FC),A LD HL,scr.pal+15 ;set up scrolly palettte LD BC,&10F8 OTDR CALL put.scroll ;put barrel scrolly on screen LD HL,top.pal+15 ;set up top of screen palette LD BC,&10F8 OTDR LD A,14+32 ;page in screen area OUT (&FA),A CALL scrolly ;do the small scrolly CALL put.bob ;put the infinite bobs on screen LD HL,mid.pal+9 LD BC,&0AF8 OTDR ;set up palette for infy bobs y_cursor: LD A,0 ;check Y position on barrel scroll INC A ;data CP maxycursor JR C,nothigh ;is it at end of barrel? XOR A ;if so, loop to start of scroll area nothigh: LD (y_cursor+1),A ;store Y pos XOR A ;check for ANY key being pressed, and IN A,(&FE) ;if so, return to BASIC CPL AND 31 OR A JP NZ,ret.to.basic XOR A IN A,(&F9) CPL AND 240 OR A JP NZ,ret.to.basic CALL 61899 ;play thundercats music & convert it CALL play.chip ;to work with SAM sound chip tester: LD A,1 ;wait for yscan 116 IN A,(&F8) CP 116 JR NZ,tester LD A,3+32 ;display barrel scroll in Mode 2 on screen OUT (&FC),A LD HL,colourset ;point to palette line table... colorloop: LD A,(HL) ;if A=255 then end of table INC HL CP 255 JP Z,loop LD E,A ;E=scan line to wait for wait.loop: LD BC,504 ;read yscan and wait until it equals E IN A,(C) CP E JR NZ,wait.loop LD A,(HL) ;get colour to set CLUT0 (background) to INC HL LD BC,248 OUT (C),A LD A,(HL) ;get colour to set CLUT7 (barrel text) to LD B,&07 OUT (C),A INC HL JR colorloop ;loop for another line's data colourset: ;line & colour data. DEFB 117,2,0 DEFB 118,32,0 DEFB 119,34,0 DEFB 120,0,7 DEFB 122,1,15 DEFB 125,1,112 DEFB 126,16,112 DEFB 129,16,120 DEFB 131,17,120 DEFB 134,17,119 DEFB 136,17+8,119 DEFB 140,17+8,127 DEFB 142,17+8,119 DEFB 145,17,119 DEFB 148,17,120 DEFB 150,16,120 DEFB 153,16,112 DEFB 155,1,112 DEFB 157,1,15 DEFB 159,0,15 DEFB 160,0,7 DEFB 161,34,0 DEFB 162,32,0 DEFB 163,2,0 DEFB 164,0,127 DEFB 255 ;Barrel scroll offset data. line.dat: DEFB 0,3,6,8,10,11,12,14,15,17,18,19,20,21,21,22 DEFB 22,23,23,24,24,25,25,26,26,27,27,28,28,29,30 DEFB 31,32,34,35,37,38,40,42,45,48 DEFB 255 ;Put the barrel scroller onscreen. ;--------------------------------- put.scroll: IN A,(&FA) ;get lmpr for later PUSH AF LD A,35 OUT (&FA),A ;page in barrel area LD IX,line.dat ;point to barrel scroll line offset table LD DE,3840 ;DE = screen address to put barrel at. main.loop: LD A,(IX) ;get line offset CP 255 ;if A=255 then end of barrel JR Z,exit.put ; so exit LD C,A ;add line offset to current scroll data LD A,(y_cursor+1);offset ADD A,C CP maximum ;check if it's looped over the end JR C,okay SUB maximum ;if so, take it back to the start okay: LD L,A ;take the line, multiply it by 32 to get LD H,0 ;the address of the barrel scroll data to ADD HL,HL ;put on the screen. ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL LDI ;copy it, using unlooped LDI's, to screen. LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI INC IX ;point to next position in table JP main.loop ;loop exit.put: POP AF ;restore LMPR and exit OUT (&FA),A RET ;Music conversion routines for AY-3-8192 to SAA1099 ;-------------------------------------------------- outdout: PUSH AF PUSH DE PUSH BC PUSH HL LD A,(HL) LD HL,(register) LD (HL),A POP HL DEC HL POP BC POP DE POP AF RET setrega: PUSH AF PUSH DE PUSH BC PUSH HL AND &0F LD L,A LD H,0 LD DE,reg ADD HL,DE LD (register),HL POP HL POP BC POP DE POP AF RET outrega: PUSH AF PUSH DE PUSH BC PUSH HL LD HL,(register) LD (HL),A POP HL POP BC POP DE POP AF RET setregd: PUSH AF PUSH DE PUSH BC PUSH HL AND &0F LD L,A LD H,0 LD DE,reg ADD HL,DE LD (register),HL POP HL POP BC POP DE POP AF RET outrege: PUSH AF PUSH DE PUSH BC PUSH HL LD HL,(register) LD (HL),E POP HL POP BC POP DE POP AF RET ;************* PLAY DATA THROUGH SAM SOUND CHIP **************** play.chip: LD BC,511 LD A,28 OUT (C),A LD A,B DEC B OUT (C),A LD HL,reg LD C,255 LD E,(HL) INC HL LD D,(HL) LD A,(reg+7) AND 8 LD A,(reg+8) LD B,A JR Z,p1 LD A,D OR E LD A,B JR NZ,p1 XOR A p1: LD (data+1),A INC HL PUSH HL EX DE,HL LD DE,freq.table ADD HL,HL ADD HL,DE LD A,10 LD B,1 OUT (C),A LD A,(HL) LD B,0 OUT (C),A INC HL LD A,(HL) LD (data),A POP HL LD E,(HL) INC HL LD D,(HL) LD A,(reg+7) AND 16 LD A,(reg+9) LD B,A JR Z,p2 LD A,E OR D LD A,B JR NZ,p2 XOR A p2: LD (data+2),A INC HL PUSH HL EX DE,HL LD DE,freq.table ADD HL,HL ADD HL,DE LD A,11 LD B,1 OUT (C),A LD A,(HL) LD B,0 OUT (C),A INC HL LD B,1 LD A,17 OUT (C),A LD A,(HL) ADD A,A ADD A,A ADD A,A ADD A,A LD B,A LD A,(data) OR B LD B,0 OUT (C),A POP HL LD E,(HL) INC HL LD D,(HL) LD A,(reg+7) AND 32 LD A,(reg+10) LD B,A JR Z,p3 LD A,E OR D LD A,B JR NZ,p3 XOR A p3: LD (data+3),A INC HL PUSH HL EX DE,HL LD DE,freq.table ADD HL,HL ADD HL,DE LD A,13 LD B,1 OUT (C),A LD A,(HL) LD B,0 OUT (C),A INC HL LD A,(HL) ADD A,A ADD A,A ADD A,A ADD A,A LD (data),A POP HL LD B,1 LD A,22 OUT (C),A LD A,(HL) AND 31 SUB 7 JP NC,p4 XOR A JP p5 p4: SUB 10 JP NC,p6 LD A,17 JP p5 p6: LD A,34 p5: LD B,0 OUT (C),A INC HL LD B,1 LD DE,0 LD A,(HL) BIT 0,A JP NZ,p7 SET 2,D p7: BIT 3,A JP NZ,p8 SET 2,E p8: BIT 1,A JP NZ,p9 SET 3,D p9: BIT 4,A JP NZ,p10 SET 3,E p10: BIT 2,A JP NZ,p11 SET 5,D p11: BIT 5,A JP NZ,p12 SET 5,E p12: LD A,20 OUT (C),A LD B,0 OUT (C),D INC A LD B,1 OUT (C),A LD B,0 OUT (C),E LD A,(data+1) AND 240 LD D,A JP NZ,p13 LD A,24 LD B,1 OUT (C),A LD B,0 OUT (C),B p13: LD A,(data+3) AND 240 LD E,A JP NZ,p14 LD A,25 LD B,1 OUT (C),A LD B,0 OUT (C),B p14: LD A,E OR D CALL NZ,set.envelope LD B,1 LD A,2 OUT (C),A LD A,(data+1) LD B,A SUB 16 JR C,p15 LD B,15 p15: LD A,B LD B,0 OUT (C),A LD B,1 LD A,3 OUT (C),A LD A,(data+2) AND 15 LD B,A ADD A,A ADD A,A ADD A,A ADD A,A OR B LD B,0 OUT (C),A LD B,1 LD A,5 OUT (C),A LD A,(data+3) LD B,A SUB 16 JR C,p16 LD B,15 p16: LD A,B ADD A,A ADD A,A ADD A,A ADD A,A LD B,0 OUT (C),A LD B,1 LD A,18 OUT (C),A LD A,(data) LD B,0 OUT (C),A RET set.envelope: LD A,(reg+13) AND 15 PUSH HL PUSH DE LD HL,data+4 LD D,0 LD E,A ADD HL,DE LD A,(HL) POP HL LD D,A LD A,H AND A JP Z,p17 LD A,24 LD B,1 OUT (C),A LD B,0 OUT (C),D p17: LD A,L AND A JP Z,p18 LD A,25 LD B,1 OUT (C),A LD B,0 OUT (C),D p18: LD HL,(reg+11) LD DE,freq.table ADD HL,HL ADD HL,DE LD A,(HL) LD D,A LD A,9 LD B,1 OUT (C),A LD B,0 OUT (C),D LD A,12 LD B,1 OUT (C),A LD B,0 OUT (C),D INC HL LD A,(HL) LD A,(data) OR D LD (data),A LD A,D ADD A,A ADD A,A ADD A,A ADD A,A LD D,A LD B,1 LD A,16 OUT (C),A LD B,0 OUT (C),D POP HL RET register: DEFW 0 ;Envelope register conversion data data: DEFB 0,0,0,0 DEFB 132,132,132,132,140,140,140,140 DEFB 134,132,138,130,142,130,138,140 ;AY-3-8192 register buffer reg: reg0: DEFB 0 reg1: DEFB 0 reg2: DEFB 0 reg3: DEFB 0 reg4: DEFB 0 reg5: DEFB 0 reg6: DEFB 0 reg7: DEFB 0 reg8: DEFB 0 reg9: DEFB 0 rega: DEFB 0 regb: DEFB 0 regc: DEFB 0 regd: DEFB 0 DEFW 0 ;to pad out the registers so that ;there's 16 of them ;Frequency conversion table freq.table: MDAT "frequency" ;Exit to basic routine ret.to.basic: DI XOR A ;clear sound chip LD BC,&01FF LD D,28 OUT (C),D DEC B OUT (C),A low.page: LD A,0 ;restore LMPR for BASIC OUT (&FA),A sp.store: LD SP,&0000 ;restore STACK for BASIC scr.page: LD A,0 OUT (&FC),A ;restore VMPR for BASIC RET ;Exit to BASIC ;Scrolly message for 6x6 characters... ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ scrolly: LD HL,&5801 ;scroll the area... 6 lines deep, 128 bytes LD DE,&5800 ;per line... LDI ;unlooped LDI's for speed... LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI scroll.count: LD A,1 ;finished putting current character on DEC A ;the end of the scroller? JR NZ,scroll.text scroll.mess: LD HL,message ;if so, get a new character from the LD A,(HL) ;text data INC HL CP 255 ;if it's 255, then it's a terminator, JR NZ,not.wrap LD HL,message ;terminator received, return to start LD A,(HL) INC HL not.wrap: LD (scroll.mess+1),HL ;store new position LD L,A ;multiply character by 32 to get offset LD H,0 ;in font data ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL LD DE,scr.font-1024 ;offset in font minus ASCII SPACE * 32 ADD HL,DE LD (scroll.text+1),HL ;store character address LD A,4 ;store number of slices of char to put ;on screen... scroll.text: LD HL,&0000 ;font address of slice to put on next LD (scroll.count+1),A LD DE,&587F ;address of first byte of slice -- LD BC,4 ;where to put it :) INC HL ;unlooped for speed... LD (scroll.text+1),HL DEC HL LD A,(HL) LD (DE),A ;optimisation considerations? ADD HL,BC ;---------------------------- PUSH HL LD HL,128 ;consider: ADD HL,DE ;hardcoding the address where slices are put EX DE,HL ;altering arrangement of font data so that it POP HL ;is stored as vertical instead of horizontal LD A,(HL) ;slices... LD (DE),A ADD HL,BC PUSH HL LD HL,128 ADD HL,DE EX DE,HL POP HL LD A,(HL) LD (DE),A ADD HL,BC PUSH HL LD HL,128 ADD HL,DE EX DE,HL POP HL LD A,(HL) LD (DE),A ADD HL,BC PUSH HL LD HL,128 ADD HL,DE EX DE,HL POP HL LD A,(HL) LD (DE),A ADD HL,BC PUSH HL LD HL,128 ADD HL,DE EX DE,HL POP HL LD A,(HL) LD (DE),A ADD HL,BC PUSH HL LD HL,128 ADD HL,DE EX DE,HL POP HL LD A,(HL) LD (DE),A ADD HL,BC PUSH HL LD HL,128 ADD HL,DE EX DE,HL POP HL LD A,(HL) LD (DE),A RET ;Pseudo English/Foreign type scroller.. ;Written to look like it was done by a polish cracking group to scare ;one of my friends :) message: DEFM "Welcome to the first ever InFiNiTy cracktr" DEFM "o... On the keys for you is the amazing " DEFM "hacker Mesomorph, and we brought you the" DEFM " best music package on the SAM Coupe... " DEFM " " DEFM "Thanks to Cookie for the original program" DEFM "ming of " DEFM "this menu - he hadn't finished it but we " DEFM "liked it so we have finished it and used i" DEFM "t!!! " DEFM "Even though we like and respect ESI, they " DEFM "should not be selling a package like this " DEFM "for money - look at BZYK's Soundtracker on" DEFM " the Spectrum - it's for free, so we don't" DEFM " think that this program which is a copy o" DEFM "f it should be sold at any money. " DEFM "Greetings go to: The Octopus, The Untouch" DEFM "ables, The Butterfly, Solar Flare, ESI, " DEFM "Vision of TMG, BZYK, Agent X, Chris the " DEFM "Hacker, Kronus, Roger Jowett, Talisman, " DEFM "Codigo, Lord Insanity and the rest of the " DEFM "Lords (Hej Rob!), Cookie, Chris White (coo" DEFM "l crack of Batz N Balls), Bruce Gordon, " DEFM "Alan Miles (wherever you are), my girlfrie" DEFM "nd Maria, and the rest of Infinity: " DEFM "Ragnarok, Meta, Diazonium, Miess and " DEFM "The Master... This hack is @ 1993 " DEFM " INFINITY - you don't get any better hacke" DEFM "rs than us guys on the SAM Coupe..." DEFM " Notice: Daniel Cannon is crap at " DEFM "protection. At least Parallax had us gues" DEFM "sing, but Waterworks, Dyzonium (bad spell" DEFM "ing FRED) and E-Tracker were a pile of cra" DEFM "p in comparison. Nobody is safe - we will " DEFM "hack your stuff, because we are the best " DEFM "and you cannot beat us if you are as crap " DEFM "as Daniel Cannon. This Disc Is Dos " DEFM "Copyable - Like The Original (HOHO!) " DEFM " " DEFM " USE BETTER PROTECTION PEOPLE - BUT IT " DEFM "DOESN'T MATTER BECAUSE WE ARE BETTER THAN " DEFM "YOU ALL!!!!!! >>> " DEFM "wrap the text " DEFM " " DEFB 255 scr.font: MDAT "scroll.fnt" ;Palette for scrolly scr.pal: DEFB 0,16,32,48,64,80,96,64,68,76,70,78,100,108 DEFB 102,127 ;Palette for INFINITY logo top.pal: DEFB 0,7,15,112,120,119,127,127,0,8,7,15,112,120 DEFB 127 ;Screen list for infinite bobs data scr.list: DEFB 4+96,6+96,8+96,10+96,14+96 ORG 49152 DUMP 49152 ;Mask table -- must be page aligned. ;Usage: ;LD DE,sprite data ;LD HL,screen address ;LD B,andtable DIV 256 ;LD C,sprite data byte ;LD A,(BC) ;this gets the mask byte ;AND (HL) ;mask off screen data ;LD C,A ;LD A,(DE) ;OR C ;combine with sprite data ;LD (DE),A ;store it on screen... ;This table effectively makes colour 0 transparent... andtable: DEFB &FF,&F0,&F0,&F0,&F0,&F0,&F0 DEFB &F0,&F0,&F0,&F0,&F0,&F0,&F0 DEFB &F0,&F0,&0F DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,&0F DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,&0F DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,&0F DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,&0F DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,&0F DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,&0F DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,&0F DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,&0F DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,&0F DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,&0F DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,&0F DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,&0F DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,&0F DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,&0F DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;Table of positions for infinite bobs routine sine.table: MDAT "sine.tab" ;Infinity letters (I,N,F,T and Y) for top of screen infinity: MDAT "infty.dat" ;Palette for middle of screen (barrel area) mid.pal: DEFB 0,1,16,17,21,81,85,87,117,119 ;Clear a mode 4 screen clear: LD HL,0 LD DE,1 LD (HL),L LD BC,24576 LDIR RET ;Put a large letter on the screen. Doesn't need to be fast. put.blok: LD B,28 put.ll: PUSH BC PUSH DE LD BC,15 LDIR POP DE POP BC PUSH HL LD HL,128 ADD HL,DE EX DE,HL POP HL DJNZ put.ll RET ;Puts the INFINITY logo at the top of each of the screens used by the ;infinite bobs routine put.infinity: LD A,14+32 OUT (&FA),A CALL put.infiniti LD A,10+32 OUT (&FA),A CALL put.infiniti LD A,8+32 OUT (&FA),A CALL put.infiniti LD A,6+32 OUT (&FA),A CALL put.infiniti LD A,4+32 OUT (&FA),A CALL put.infiniti RET ;Does the actual logo printing... I N F I N I T Y put.infiniti: LD HL,infinity LD DE,&0004 PUSH DE CALL put.blok POP DE LD HL,15 ADD HL,DE EX DE,HL LD HL,infinity+420 PUSH DE CALL put.blok POP DE LD HL,15 ADD HL,DE EX DE,HL LD HL,infinity+840 PUSH DE CALL put.blok POP DE LD HL,15 ADD HL,DE EX DE,HL LD HL,infinity PUSH DE CALL put.blok POP DE LD HL,15 ADD HL,DE EX DE,HL LD HL,infinity+420 PUSH DE CALL put.blok POP DE LD HL,15 ADD HL,DE EX DE,HL LD HL,infinity PUSH DE CALL put.blok POP DE LD HL,15 ADD HL,DE EX DE,HL LD HL,infinity+1260 PUSH DE CALL put.blok POP DE LD HL,15 ADD HL,DE EX DE,HL LD HL,infinity+1680 PUSH DE CALL put.blok POP DE LD HL,15 ADD HL,DE EX DE,HL RET ;Clears each of the screens used by the infinite bobs routine clear.scrs: LD A,14+32 OUT (&FA),A CALL clear LD A,10+32 OUT (&FA),A CALL clear LD A,8+32 OUT (&FA),A CALL clear LD A,6+32 OUT (&FA),A CALL clear LD A,4+32 OUT (&FA),A CALL clear RET ;Put a bob on the current infinite bob screen put.bob: LD A,0 ;get screen to put it on in A INC A AND 3 ;make sure that it doesn't overflow nothigh2: LD (put.bob+1),A ;store it in routine again LD L,A LD H,0 LD DE,scr.list ADD HL,DE LD A,(HL) ;find actual screen from data page OUT (&FC),A AND 63 ;mask the MODE data OUT (&FA),A ;page the screen into LMPR put.bobb: LD HL,sine.table ; LD E,(HL) ;get X,Y position from sine table INC HL LD A,(HL) ;modify Y position (add 8) ADD A,8 LD D,A INC HL LD A,H CP &C3 ;check for end of table JR NZ,ok LD H,&C1 ;if reached end, reposition at start ok: LD (put.bobb+1),HL ;store position in sine table EX DE,HL ;hl = address LD BC,andtable ;point BC to screen mask table SRL H ;convert Y,X in HL to screen address RR L JR C,put.bob2 ;if carry, then ODD nybble aligned graphic LD DE,infybob ;point to even aligned graphic data CALL put.line ;put the lines of it on screen CALL put.line CALL put.line CALL put.line CALL put.line CALL put.line CALL put.line CALL put.line CALL put.line CALL put.line CALL put.line CALL put.line CALL put.line CALL put.line CALL put.line CALL put.line RET ;exit bob print routine put.bob2: LD DE,infybob2 ;point to odd aligned graphic data CALL put.lin2 CALL put.lin2 ;put the lines of it on screen CALL put.lin2 CALL put.lin2 CALL put.lin2 CALL put.lin2 CALL put.lin2 CALL put.lin2 CALL put.lin2 CALL put.lin2 CALL put.lin2 CALL put.lin2 CALL put.lin2 CALL put.lin2 CALL put.lin2 CALL put.lin2 RET ;exit bob print routine ;ODD aligned print routine ;prints an entire line of a BOB put.lin2: LD A,(DE) ;get graphics data LD C,A ;put it in C LD A,(BC) ;get mask byte AND (HL) ;mask the screen OR C ;combine it with graphics data LD (HL),A ;store it on the screen INC L ;move to next screen address INC DE ;move to next graphics data address LD A,(DE) LD C,A LD A,(BC) AND (HL) OR C LD (HL),A INC L INC DE LD A,(DE) LD C,A LD A,(BC) AND (HL) OR C LD (HL),A INC L INC DE LD A,(DE) LD C,A LD A,(BC) AND (HL) OR C LD (HL),A INC L INC DE LD A,(DE) LD C,A LD A,(BC) AND (HL) OR C LD (HL),A INC L INC DE LD A,(DE) LD C,A LD A,(BC) AND (HL) OR C LD (HL),A INC L INC DE LD A,(DE) LD C,A LD A,(BC) AND (HL) OR C LD (HL),A INC L INC DE LD A,(DE) LD C,A LD A,(BC) AND (HL) OR C LD (HL),A INC L INC DE LD A,(DE) LD C,A LD A,(BC) AND (HL) OR C LD (HL),A INC DE PUSH DE LD DE,120 ;add 120 -- offset to start of next line... ADD HL,DE POP DE RET ;EVEN aligned print routine put.line: LD A,(DE) ;get gfx data LD C,A ;stash it in c LD A,(BC) ;get mask byte AND (HL) ;mask screen OR C ;combine with GFX LD (HL),A ;store it on screen INC L ;increment screen position INC DE ;increment gfx data position LD A,(DE) LD C,A LD A,(BC) AND (HL) OR C LD (HL),A INC L INC DE LD A,(DE) LD C,A LD A,(BC) AND (HL) OR C LD (HL),A INC L INC DE LD A,(DE) LD C,A LD A,(BC) AND (HL) OR C LD (HL),A INC L INC DE LD A,(DE) LD C,A LD A,(BC) AND (HL) OR C LD (HL),A INC L INC DE LD A,(DE) LD C,A LD A,(BC) AND (HL) OR C LD (HL),A INC L INC DE LD A,(DE) LD C,A LD A,(BC) AND (HL) OR C LD (HL),A INC L INC DE LD A,(DE) LD C,A LD A,(BC) AND (HL) OR C LD (HL),A INC DE PUSH DE ;move to next line of screen LD DE,121 ;offset by 121 ADD HL,DE POP DE RET ;BOB graphic data -- one is EVEN aligned, the other ODD aligned infybob: MDAT "bob.dat" infybob2: EQU infybob+128 ORG 61700 ;merge in the 128k Speccy AY-3-8192 soundtrack DUMP 61700 MDAT "thcats.msc" ORG 61995 ;modify the soundtrack to work with converter DUMP 61995 ;routine CALL setrega CALL outdout ORG 62009 DUMP 62009 CALL setregd CALL outrege ORG 62024 DUMP 62024 CALL setregd CALL outrega ORG 62039 DUMP 62039 CALL setregd CALL outrege ORG 0 DUMP 3,0 MDAT "infyscr" ;include the INFINITY barrel scroll data