;Happy Birthday demo for FRED 24 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ;(c)1992 Simon Cooke and Entropy lmpr: EQU &FA hmpr: EQU &FB vmpr: EQU &FC line: EQU &F9 border: EQU &FE soundaddr: EQU &01FF clut: EQU &F8 dragup: EQU &01 ;when lines moving up screen, drag is 1 dragdown: EQU &00 ;when moving down, drag is zero (alternatively, ;decrease the gravity if drag is needed down...) gravity: EQU &02 ;Called by BASIC at &8000, but must sit at &0000 eventually, so ORG it here ORG 0 DUMP 1,0 DI LD SP,&8000 IM 1 LD A,28 ;clear EVERYTHING LD BC,soundaddr ;turn soundchip off OUT (C),A DEC B XOR A OUT (C),A OUT (line),A OUT (border),A LD BC,&0F*256+clut ;set palette to black pal.blank: OUT (C),A DJNZ pal.blank OUT (C),A LD A,&21 OUT (lmpr),A JP here ;jump down to low memory ORG &38 ;IM1 Interrupt routine DUMP 1,&38 handle.ints: PUSH AF PUSH BC PUSH DE PUSH HL IN A,(line) ;check for frame interrupt BIT 3,A frame.addr: JP Z,frame.int exit.ints: POP HL POP DE POP BC POP AF EI RET frame.int: ;Frame interrupt has occurred LD A,1 LD (frame.stat),A LD A,36 OUT (line),A JP exit.ints ORG &66 ;NMI handler DUMP 1,&66 EI RETN here: ;jumps from HI memory down to here LD A,3 OUT (hmpr),A CALL musicinit ;initialise music -- bouncy happy birthday ;tune XOR A OUT (lmpr),A ;page in zero page -- sys vars. LD HL,&8000 ;also is where MODE 1 RESET screens are LD DE,&8001 ;stuck (vmpr is set to 0 on reset, and LD BC,6911 ;as long as the RESET button is held, that LD (HL),L ;is the screen which is displayed) LDIR ;Clear screen LD HL,&9800 ;Fill attribute area of screen with random LD BC,768 ;attribute paper values, namely a ;scatter of grays -- just to keep things attrib.rand: ;ticking over for the first section. This LD A,R ;is until the REAL Reset screen is paged AND %00111000 ;in OR %01000000 LD E,A AND %00111000 JR NZ,not.blank OR %01001000 LD E,A not.blank: LD (HL),E INC HL DEC BC LD A,B OR C JR NZ,attrib.rand LD A,14 ;clear screen area OUT (lmpr),A LD HL,32768 LD DE,32769 LD (HL),L LD B,&60 LDIR LD HL,palette1 ;set up palette to be faded in/out CALL movecolours LD HL,palette1 ;move palette to CLUT CALL set.palette LD HL,drop.table ;initialise line drop table LD B,64 drop.set: LD (HL),0 INC HL DJNZ drop.set ;Bouncer routine -- logo bounces its way onto the screen, line by line, ;from the top of the screen. LD A,&6E OUT (vmpr),A next.drop: LD A,111 ;lowest line -- lines bounce on this LD (min.height+1),A LD A,0 ;number of lines to clear from screen LD (add.line+1),A ;first time round loop = 0 XOR A LD (dropper.count+1),A dropper.loop: LD A,1 ;wait for scan to reach line 115 IN A,(clut) CP 115 JR NZ,dropper.loop LD HL,drop.table LD (sp.drop+1),SP LD A,(add.line+1) LD B,A drop.clear: LD A,B OR A JR Z,sp.drop ;do lines need to be cleared from screen ;yet? LD A,(HL) ;get y position of line from table INC HL INC HL DEC B ;number of lines to clear decremented CP 255 ;is line dormant (ie in position)? JR Z,drop.clear ;if so, jump LD D,A ;calculate SP address using y coord LD E,231 SCF RR D RR E EX DE,HL LD SP,HL EX DE,HL LD DE,0 ;clear screen lines using stack -- fastest PUSH DE ;way... PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE INC SP;<-----------------Maybe not needed? - only stops an PUSH DE ;extra byte from being wiped... JR drop.clear ;loop around again to wipe more lines sp.drop: LD SP,&0000 ;restore stack pointer LD A,&FF ;counter of which line is being looked at. LD (current.one+1),A ;used to calculate the floor for each LD HL,drop.table ;line -- varies with height... LD A,(add.line+1) LD B,A ;loop round, checking if velocity has drop.update: ;to be calculated (if line isn't dormant) PUSH HL LD HL,current.one+1 ;increase line number... INC (HL) POP HL LD A,B OR A JR Z,drop.shower LD A,(HL) CP 255 ;if line is dormant, don't calculate vel. JR NZ,not.skip.drop INC HL ;skip line (dormant) INC HL DEC B JR drop.update not.skip.drop: LD E,A ;E holds height INC HL ;move to velocity byte LD A,(HL) ;A holds veloctity (2's comp) ADD A,gravity ;add gravity LD (HL),A ;restore velocity ADD A,E ;add velocity to position (motion) LD (rest.a+1),A ;store for later check to see if line is ;UNDERNEATH the floor min.height: ;bounce off floor LD A,111 current.one: LD D,0 ;line 0 = bottom line of logo, and floor SUB D ;decreases in Y (moves up), the higher the LD D,A ;line number... stops all the lines coming rest.a: ;to rest on the same line and not display- LD A,0 ;ing the logo. CP D JR C,okay ;check that the current line position is JR Z,okay ;not UNDER its floor -- if it's fine, ;store it as the new line Ycoord DEC HL ;point to line's Y coord LD A,(current.one+1) LD D,A LD A,(min.height+1) SUB D LD (HL),A ;if line has hit the floor (gone below it) INC HL ;set the Y coord to the floor. LD A,(HL) ;flip velocity so that it "bounces" NEG JR drag.coeff+1 okay: ;set Y coord (line _hasn't_ bounced) DEC HL LD (HL),A INC HL drag.coeff: LD A,(HL) ;drag effect comes here -- get velocity OR A ;if velocity isn't zero, don't drag JR Z,not.ddrop BIT 7,A ;check whether line is moving UP or DOWN JR NZ,not.dec.drop;to calculate proper drag.. drag1: SUB dragdown ;drag when moving down JR not.ddrop not.dec.drop: drag2: ADD A,dragup ;drag when moving up not.ddrop: LD (HL),A ;store new velocity INC HL ;move to next line DEC B JR drop.update ;calculate for the rest of the lines.. ;Now we put the lines onto the screen. drop.shower: LD A,(add.line+1) ;number of lines to put onscreen... LD B,A LD C,1 LD HL,drop.table ;point HL to Y coords and velocities LD A,32 ;initialise line pointer LD (curr.l+1),A showerd.loop: LD A,B ;have we finished putting lines up? OR A JP Z,dropper.exit LD A,(curr.l+1) ;decrement line (graphics data) pointer DEC A LD (curr.l+1),A LD A,(HL) ;if line is dormant, don't print it CP 255 JR NZ,not.inactive INC HL ;skip data for dormant line INC HL DEC B JR showerd.loop not.inactive: EX DE,HL LD HL,min.height+1 CP (HL) JR NZ,put.line ;if line is at the minimum height, then EX DE,HL ;it must be dormant... INC HL LD A,(HL) ;check velocity -- if line is at min h OR A ;yet still has velocity, it isn't dormant JR NZ,not.zero.vel;yet... EX DE,HL LD HL,min.height+1;decrement minimum line for checking DEC (HL) ;next time round the loop... EX DE,HL DEC HL ;if line is dormant, mark it as so.. LD A,(HL) LD (HL),&FF JR put.line2 not.zero.vel: ;line ain't dormant so carry on... DEC HL LD A,(HL) JR put.line2 put.line: EX DE,HL put.line2: LD C,0 ;put the lines on screen... LD D,A ;calculate position to put lines on in DE LD E,25 SCF RR D RR E PUSH HL PUSH BC PUSH DE curr.l: LD HL,0 ;point to current line's graphics data ADD HL,HL LD DE,line.table ADD HL,DE LD E,(HL) ;get address for data into DE INC HL LD D,(HL) EX DE,HL ;swap it into HL POP DE ;restore screen address to DE LD BC,103 ;Line length -- 103 bytes LDIR ;copy it to screen... could be quicker, a ;lot quicker in fact, but who cares? It ;works... POP BC POP HL INC HL ;move to next line's data INC HL DEC B JR showerd.loop dropper.exit: LD A,C ;If any lines have been put onto the OR A ;screen it will be Z JR Z,dropper.count AND 1 ;Variable drag? Not used, but provision is LD (drag1+1),A ;there.. (actually, is an archaic bit of LD (drag2+1),A ;routine that was used to give fractional ;drag) LD A,(add.line+1) ;if 0 lines have been put onscreen, CP 32 ;then all lines are dormant -- finished!!! JP Z,dropper.end dropper.count: LD A,0 ;counter -- delay for a new line to be OR A ;added to those dropping from the top of CALL Z,add.line ;the screen.... DEC A LD (dropper.count+1),A IN A,(hmpr) ;play music PUSH AF LD A,3 OUT (hmpr),A CALL musicplay POP AF OUT (hmpr),A JP dropper.loop dropper.end: EI LD B,200 ;show logo, play music and wait until LD A,3 ;"HAPPY BIRTHDAY" tune is finished... OUT (hmpr),A halter: XOR A ;set FRAME interrupt toggle... LD (frame.stat),A fr.h: HALT HALT ;if FRAME has occurred, will have been LD A,(frame.stat) ;toggled OR A JR Z,fr.h PUSH BC CALL musicplay ;play music while logo displays POP BC DJNZ halter CALL fadeout ;fade out logo and jump to main demo... JP main.demo add.line: LD A,0 ;line to add to those onscreen... CP 32 JR Z,exit.addl INC A LD (add.line+1),A ;increment it to add one.. DEC A ;point to address of line in drop.table LD L,A LD H,0 ADD HL,HL LD DE,drop.table ADD HL,DE LD (HL),0 ;initialise it -- top of screen, zero INC HL ;velocity... LD (HL),0 exit.addl: LD A,8 ;restore DELAY for counter... RET drop.table: DEFS 64 ;Intro palette ;~~~~~~~~~~~~~ palette1: DEFB 0,29,91,32,34,38,98,102,68,8,7,15,112,120 DEFB 119,127 ;Main demo palette ;~~~~~~~~~~~~~~~~~ palette2: DEFB 0,34,38,98,102,103,118,127,0,17,21,81,85 DEFB 87,117,127 entropy.logo: MDAT "entro.lgo" ;Table of values for line positions ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ line.table: DEFW entropy.logo DEFW entropy.logo+103 DEFW entropy.logo+206 DEFW entropy.logo+309 DEFW entropy.logo+412 DEFW entropy.logo+515 DEFW entropy.logo+618 DEFW entropy.logo+721 DEFW entropy.logo+824 DEFW entropy.logo+927 DEFW entropy.logo+1030 DEFW entropy.logo+1133 DEFW entropy.logo+1236 DEFW entropy.logo+1339 DEFW entropy.logo+1442 DEFW entropy.logo+1545 DEFW entropy.logo+1648 DEFW entropy.logo+1751 DEFW entropy.logo+1854 DEFW entropy.logo+1957 DEFW entropy.logo+2060 DEFW entropy.logo+2163 DEFW entropy.logo+2266 DEFW entropy.logo+2369 DEFW entropy.logo+2472 DEFW entropy.logo+2575 DEFW entropy.logo+2678 DEFW entropy.logo+2781 DEFW entropy.logo+2884 DEFW entropy.logo+2987 DEFW entropy.logo+3090 DEFW entropy.logo+3193 ;Palette initialisation routine ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ set.palette: LD BC,clut LD E,&10 pal.set: LD A,(HL) OUT (C),A INC HL INC B DEC E JR NZ,pal.set RET ;Palette fader routine - (c) 1991 Simon Cooke ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ fadeout: LD HL,palette LD DE,temppalette LD BC,16 LDIR LD B,8 fadeout1: LD C,16 LD HL,temppalette fadeout2: LD A,(HL) CALL dropdown LD (HL),A INC HL DEC C JP NZ,fadeout2 EXX LD B,6 fadeoutfly: HALT DJNZ fadeoutfly LD HL,temppalette+15 LD BC,&10F8 OTDR EXX DJNZ fadeout1 RET fadein: LD B,9 LD D,8 fadein1: LD C,16 LD HL,palette EXX LD HL,temppalette EXX fadein2: PUSH DE LD A,(HL) INC D DEC D JP Z,nofadein fadein3: PUSH DE CALL dropdown POP DE DEC D JP NZ,fadein3 nofadein: INC HL EXX LD (HL),A INC HL EXX POP DE DEC C JP NZ,fadein2 EXX LD B,6 fadeinfly: HALT DJNZ fadeinfly LD HL,temppalette+15 LD BC,&10F8 OTDR EXX DEC D DJNZ fadein1 RET dropdown: OR A RET Z XOR 8 BIT 3,A RET Z dropblue: LD D,A AND 17 JP NZ,nextdown1 LD A,D JP dropred nextdown1: AND 1 JP Z,drophighblue LD A,D AND 126 JP dropred drophighblue: LD A,D AND 111 OR 1 dropred: LD D,A AND 34 JP NZ,nextdown2 LD A,D JP dropgreen nextdown2: AND 2 JP Z,drophighred LD A,D AND 125 JP dropgreen drophighred: LD A,D AND 127-32 OR 2 dropgreen: LD D,A AND 68 JP NZ,nextdown3 LD A,D RET nextdown3: AND 4 JP Z,drophighgreen LD A,D AND 123 RET drophighgreen: LD A,D AND 63 OR 4 RET movecolours: LD DE,palette LD BC,16 LDIR RET palette: DEFS 16 temppalette: DEFS 16 frame.stat: DEFB 0 ;Reset screen (for part two of demo - part one has a greyscale) ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ reset: MDAT "reset" ;Font for part two ;~~~~~~~~~~~~~~~~~ font: MDAT "stfont" ;MAIN demo section... ;-------------------- ;REALLY poor. My heart wasn't in this demo. :( ;In fact the only great thing about it is the ENTROPY logo dropper (above), ;and the reset screen, which I thought looked DAMN cool for being restricted ;to 8x8 ATTRIBUTE colours (2 colours per 8x8 square) main.demo: DI LD A,36 OUT (line),A XOR A OUT (hmpr),A LD HL,reset ;copy reset screen to page zero... LD DE,&8000 LD BC,6912 LDIR LD HL,sm.data ;clear small scrolly data area LD DE,sm.data+1 LD BC,223 LD (HL),0 LDIR LD HL,small.mess ;initialise small scrolly text pointer LD (sm.pos+1),HL LD A,1 ;set counter to get new character to LD (sm.count+1),A;display... LD HL,large.mess ;initialise large scrolly text pointer LD (big.pos+1),HL LD A,1 ;set counter to get new character to LD (big.count+1),A ;display... LD A,15 OUT (hmpr),A LD HL,palette2 ;set up palette 2 to be faded in... CALL movecolours LD A,&2F OUT (vmpr),A ;Mode 2 screen... LD HL,&A600 ;attribute value for BIG scrl LD DE,big.attribute ;set up attributes for big scrolly on ;screen... LD C,144 ;112 lines of scroll - ignore big.loop: ;bottom line of font, and LD B,32 ;have each font line 16 lines LD A,(DE) ;high... INC DE big.loop2: LD (HL),A INC HL DJNZ big.loop2 DEC C JR NZ,big.loop LD HL,&A000 ;attribute value for wibbly area... LD DE,wib.attribute ;which doesn't wibble (couldn't be ;bothered) LD C,48 wib.loop: LD B,32 LD A,(DE) INC DE wib.loop2: LD (HL),A INC HL DJNZ wib.loop2 DEC C JR NZ,wib.loop CALL set.wibble ;put "wibbly" area onto the screen... EI CALL fadein ;fade in the picture mainloop: XOR A LD (frame.stat),A fly.l: ;wait for VBLANK HALT LD A,(frame.stat) OR A JR Z,fly.l LD A,15 OUT (hmpr),A CALL wibble ;put wibbling area onscreen (not implemented) CALL massive ;put ultra large attribute scrolly up. CALL small ;put small text scrolly over attribute one LD A,3 OUT (hmpr),A CALL musicplay ;play bouncy tune JP mainloop big.attribute: DEFB 1,2,3,4,5,6,7,6,5,4,3,2,1,2,3,4,5,6,7,6,5,4 DEFB 3,2,1,2,3,4,5,6,7,6,5,4,3,2,1,2,3,4,5,6,7,6 DEFB 5,4,3,2,1,2,3,4,5,6,7,6,5,4,3,2,1,2,3,4,5,6 DEFB 7,6,5,4,3,2,1,2,3,4,5,6,7,6,5,4,3,2,1,2,3,4 DEFB 3,2,1,2,3,4,5,6,7,6,5,4,3,2,1,2,3,4,5,6,7,6 DEFB 5,4,3,2,1,2,3,4,5,6,7,6,5,4,3,2,1,2,3,4,5,6 wib.attribute: DEFB 2,2,3,3,4,4,5,5,6,6,7,7,6,6,5,5,4,4,3,3,2,2 DEFB 1,1 DEFB 65+8,65,66+8,66,67,67+8,68,68,69,69+8,70,70 DEFB 71,71,70+8,70 DEFB 69,69,68,68,67+8,67,66,66 set.wibble: LD HL,wib.dat LD DE,&8000 LD BC,768 LDIR RET copy.scroll: LD DE,&8220 LD HL,sm.data LD BC,224 LDIR RET wibble: LD DE,&8300 LD HL,wibble.data+736 CALL copy.32 LD HL,wibble.data+704 CALL copy.32 LD HL,wibble.data+672 CALL copy.32 LD HL,wibble.data+640 CALL copy.32 LD HL,wibble.data+608 CALL copy.32 LD HL,wibble.data+544 CALL copy.32 LD HL,wibble.data+512 CALL copy.32 LD HL,wibble.data+480 CALL copy.32 LD HL,wibble.data+448 CALL copy.32 LD HL,wibble.data+416 CALL copy.32 LD HL,wibble.data+384 CALL copy.32 LD HL,wibble.data+352 CALL copy.32 LD HL,wibble.data+320 CALL copy.32 LD HL,wibble.data+288 CALL copy.32 LD HL,wibble.data+256 CALL copy.32 LD HL,wibble.data+224 CALL copy.32 LD HL,wibble.data+192 CALL copy.32 LD HL,wibble.data+160 CALL copy.32 LD HL,wibble.data+128 CALL copy.32 LD HL,wibble.data+96 CALL copy.32 LD HL,wibble.data+64 CALL copy.32 LD HL,wibble.data+32 CALL copy.32 LD HL,wibble.data CALL copy.32 RET copy.32: LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI RET small.mess: DEFM "WELCOME TO THE SECOND @NTROPY DEMO OF THIS" DEFM " ISSUE! (SHOCK, HORROR!) IN THIS SCROL" DEFM "L, YOU CAN LEARN ALL ABOUT WHAT'S BEEN GO" DEFM "ING ON WITH @NTROPY SINCE HOT BUTTER, AND " DEFM "ALSO ALL THE GREETZ YOU'LL EVER NEED... " DEFM " IN THE OTHER, NOT MUCH - JUST OUR BEST " DEFM "WISHES FOR FRED!!! ANYWAY, COOKIE'S ON THE" DEFM " KEYS AT THE MOMENT - BUT NICAM WILL BE " DEFM "ALONG A LITTLE LATER (ALTHOUGH HOPEFULLY I" DEFM "'LL WRITE A BIT MORE SCROLLY IN THIS DEMO " DEFM "(IN THE @NTRO, HE'S WRITTEN NEARLY ALL OF " DEFM "THE TEXT!!!)... SO THEN - WHAT ABOU" DEFM "T THIS DEMO THEN? VERY MUCH A COBBLED TOGE" DEFM "THER AFFAIR, AS I'VE NOT HAD MUCH TIME FOR" DEFM " CODING THIS WEEK (YES - I SAID WEEK) BECA" DEFM "USE I'VE HAD MY EXAMS. NOT BAD RESULTS - " DEFM "A 'B' IN MATHS, AND A 'C' IN PHYSICS AND " DEFM "CHEMISTRY - WHICH GIVES ME EXPECTED GRAD" DEFM "ES OF TRIPLE 'B' FOR CAMBRIDGE!!! (GOING O" DEFM "N PREVIOUS RESULTS, AND" DEFM " CONFESSIONS OF HOW LITTLE REVISION I D" DEFM "ID, ETC.) MAYBE I SHOULD HAVE DONE MORE " DEFM "REVISION (AS I SAID I WAS GOING TO IN " DEFM "HOT BUTTER) ... MAYBE 3 MONTHS IS TOO LONG" DEFM " A TIME TO KEEP A GOOD PROGRAMMER DOWN? WH" DEFM "O KNOWS, BUT WE'RE BACK FOR A WHILE... " DEFM " I SAY A WHILE BECAUSE WE'RE MOVING " DEFM "TO SCPDU, WHICH SOME PEOPLE MAY SEE AS " DEFM "A BAD MOVE, BUT I DON'T... JUSTIN " DEFM "AND HIS MAG (`1.50 PER ISH - SEE ADDRESS " DEFM "IN THE @NTRO) CAN PUT ASIDE THE EXTRA DISC" DEFM " WE'LL BE NEEDING TO RELEASE OUR MEGADEMO " DEFM "- STATUES OF ICE - WHICH WILL BE COMING IN" DEFM " SEPTEMBER... " DEFM " ON THE SUBJECT OF 'STATUES OF ICE'" DEFM ", WHEN IT ARRIVES, IT WILL BE THE FIRST " DEFM "-EVER- SAM MEGADEMO (UNLESS SOMEONE BEATS " DEFM "US TO IT!) AND WILL FEATURE LOADS OF " DEFM "FANCY BITS, INCLUDING: A FULLY PLAYABLE " DEFM "AND COMPLETE -=< ASTEROIDS GAME >=- INFINI" DEFM "TE ANIMATED BOBS, SAMPLES GALORE, DIGITIZE" DEFM "D PICCIES, E-TRACKER MUSIC, 3D STUFF, " DEFM "MASSIVE SCROLLIES, AND LOADS OF NICE " DEFM "SOFTWARE TRICKERY TO MAKE YOUR SAM " DEFM "STAND UP AND BEG FOR A REST!!! ALL ON ISS" DEFM "UE 6 OF S.C.P.D.U., AS A FREE EXTRA DISC.." DEFM ". ALSO COMES WITH ITS OWN COPIER PROGRAM " DEFM "(@-COPY) WHICH SUPPORTS TWO DRIVES AND THE" DEFM " MEG, SO THAT YOU CAN COPY IT FOR ALL YOUR" DEFM " CONTACTS TO SEE (HOPEFULLY IT SHOULD " DEFM "SPREAD LIKE WILDFIRE!!! " DEFM " " DEFM "ALSO - A QUICK BIT OF NEWS HERE - IF YOU " DEFM "SEND AN SAE TO THE ENTROPY ADDRESS (COMING" DEFM " UP SHORTLY) YOU CAN GET THE LATEST COPY O" DEFM "F THE @NTROPY NEWSLETTER! FILLED WITH STUF" DEFM "F ON ALL THE LATEST ENTROPY HAPPENINGS, AN" DEFM "D PRINTED WITH PROFESSIONAL QUALITY T" DEFM "YPESETTING, IT CAN BE YOURS FOR JUST SENDI" DEFM "NG AN SAE TO US. IT'S BIMONTHLY, AND THE " DEFM "CURRENT NEWSLETTER IS FOR JULY-AUGUST 1992" DEFM " - SO WHAT ARE YOU WAITING FOR? OH, " DEFM "SORRY - I FORGOT THE ADDRESS DIDN'T I!!!" DEFM " HERE IT IS THEN: ENTROPY (SAM), 18 BRAEMA" DEFM "R DRIVE, SALE, CHESHIRE, M33 4NJ, ENGLAND" DEFM " ... I'LL REPEAT IT AGAIN... " DEFM "ENTROPY (SAM), 18 BRAEMA" DEFM "R DRIVE, SALE, CHESHIRE, M33 4NJ, ENGLAND" DEFM " TO WRITE TO NICAM (FOR WHATEVER " DEFM "REASON), WRITE TO: ENTROPY (AMIGA), " DEFM "28 MANOR AVE., SALE, CHESHIRE, M33 5JQ" DEFM ", ENGLAND... TO PHONE, USE THESE " DEFM "NUMBERS - COOKIE: +44 (0)61 973 7979, NIC" DEFM "AM: +44 (0)61 969 2829 " DEFM " PHONE FOR COOKIE BETWEEN 17.00 AND" DEFM " 22.00 GMT AND HE WILL BE IN, NICAM CAN BE" DEFM " REACHED AT REALLY ANY TIME... " DEFM " NEWS JUST IN: COOKIE IS NOW WRITIN" DEFM "FOR YS!!! YEP - FROM ISSUE 83 ONWARDS, " DEFM "COOKIE WILL BE SPOUTING FORTH HIS SPIEL FR" DEFM "OM THE PAGES OF 'SPEC TEC' IN YOUR SINCLAI" DEFM "R - SO IF THERE'S ANYTHING YOU'VE EVER HAD" DEFM " A PROBLEM WITH - HARDWARE/SOFTWARE PROBLE" DEFM "MS, CODING PROBLEMS ETC., WRITE TO SPEC TE" DEFM "C, YS, FUTURE PUBLISHING, 30 MON" DEFM "MOUTH STREET, BATH, BA1 2BW... " DEFM " " DEFM "WELL, NICAM HERE!!! NO I'LL TELL YA ALL A " DEFM "STORY... I'VE ONLY EVER SPOKEN TO COLIN TW" DEFM "ICE - AND BOTH THOSE TIME WERE IN THE LAST" DEFM " TWO WEEKS! HOWEVER, I RECKON I'VE HEARD E" DEFM "NOUGH ABOUT HIM FROM COOKIE AND OTHERS TO " DEFM "WRITE HIS BIOGRAPHY! AH YES, WHEN HE GOT C" DEFM "OUGHT IN LONDON NEAR A CASH MACHINE... WHE" DEFM "N THE NOW LEGENDARY SAMCO STUNT WAS PULLED" DEFM " OFF (IF YA DON'T KNOW ABOUT THAT, WELCOME" DEFM " TO EARTH!!)... HAPPY DAYS. ACTUALLY, JUST" DEFM " THINKING, WHAT WAS I DONING TWO YEARS AGO" DEFM "? GETTING READY FOR ME HOLS, IF I REMEMBER" DEFM " CORRECTLY.. I WORKED AT LASER QUEST IN MA" DEFM "NCHESTER THEN, AND COOKIE HAD JUST GOT HIS" DEFM " SAM - I HAD A SPECCY THEN - COURSE, NO I'" DEFM "VE GOT A MIGGY, BUT THOSE WERE INNOCENT DA" DEFM "YS.. IT WAS ROUND ABOUT THN THAT I TOLD CO" DEFM "OKIE TO GET SOME OF THAT PUBLIC DOMAIN STU" DEFM "FF, AND, BEING AN OBEDIENT KIND OF GUY HE " DEFM "DID - ALTHOUGH HE WASN'T TOO KEEN ON THE I" DEFM "DEA.. I THINK I CAN SAFELY SAY I WAS RESPO" DEFM "NSIBLE FOR CCOKIE'S EMERGENCE ONTO AN UNSU" DEFM "SPECTING SAM WORLD!! ANYHOW, I CANT BE BOT" DEFM "HERED WRITING ANY MORE - I'VE JUST WRITTEN" DEFM " SPME TEXT FOR THE SCPDU SLIDESHOW (TOO MU" DEFM "CH, I THINK!!) AND I'VE YET TO WRITE THE M" DEFM "USIC THAT YOU ARE HEARING (WOW!!! FREAKY P" DEFM "ARADOX!!) SO, IF YA DON'T MIND, I'LL GET A" DEFM "LONG!! THIS IS NICAM SAYING TOODLE PIP!!!!" DEFM " " DEFM "GREETZ NOW: " DEFM "HI TO - JUSTIN ASH - DOCTOR H - MIKE AJ - " DEFM "THE MASTERS OF MAGIC - COLIN MACDONALD - " DEFM "ESI - LORD INSANITY - THE DVB - RAINMAN - " DEFM "MIKEY BOY - ANDY MONK (I'LL WRITE TO YOU " DEFM "SOON - HONEST!) - PAT SPENCER - HOWARD " DEFM "PRICE (THANKS FOR THE CHAIN LETTER!) - " DEFM "SAM BUCHANAN - ALL AT SAMCO - ALL AT SAM" DEFM "TECH - JON PILLAR (WHEN DOES MY FIRST " DEFM "BATCH OF MAIL ARRIVE, JON?) - LINDA BARKER" DEFM " (THANX FOR DA JOB!) - COLIN BROADBENT " DEFM "(WILL A FADER DO FOR PITSTOP?) - " DEFM "CHRIS WHITE (YOU'RE NOT DOWN HERE IN THE" DEFM " LIST FOR ANY PARTICULAR REASON, CHRIS! " DEFM "HONEST!) - CODIGO (ANY MORE STUFF FROM " DEFM "YOU SPANISH GUYS YET?) - PREDATOR (POWERH" DEFM "OUSE) [THANKS FOR THE PARTY INTRO!] - " DEFM "MARK, PAUL AND BRUCE (THE TECHY PEOPLE) - " DEFM "AND EVERYONE WHO I MANAGED TO FORGET AT " DEFM "ONE STAGE OR ANOTHER... LIKE DAN DOORE'" DEFM " (POINTER STUFF IS IN MY LIST OF THINGS " DEFM "TO DO - PROMISE!) ... AXE (HI IAN! LOVE PO" DEFM "TTER'S PLANET AND THE HULK DEMO ON SCPDU!)" DEFM " ... AND EVERYONE ELSE WHO KNOWS COOKIE AN" DEFM "D NICAM... " DEFB 255 large.mess: DEFM "HAPPY BIRTHDAY FRED FROM - COOKIE - NICAM " DEFM "- JUSTIN A - DOCTOR H - MIKE A.J. - MIKEY " DEFM "BOY - RAINMAN - " DEFM "IN OTH" DEFM "ER WORDS, HAPPY BIRTHDAY AND BEST WISHES F" DEFM "ROM ENTROPY - SORRY TO CALVIN FOR THE EVEN" DEFM " *HARDER* TO READ SCROLLY!!! 2 YEA" DEFM "RS OLD!!! YIPPEEE! GOOD LUCK TO FRE" DEFM "D FOR THE FUTURE, BUT NOW IT IS TIME " DEFM "FOR ENTROPY TO SAY GOODBYE TO IT, AS " DEFM "WE'RE MOVING TO SCPDU... BUT NEVER FEAR, A" DEFM "S WE -MAY- STILL CONTRIBUTE TO FRED EVERY " DEFM "NOW AND THEN... CIAO PEOPLE! " DEFB 255 big.char: DEFS 7 ;Put incredibly big ATTRIBUTE scroll onscreen massive: LD HL,&AB81 LD DE,&AB80 EXX LD B,56 liner.loop: ;scroll one line's data 56 times... (by 1 character) EXX LDI LDI LDI LDI LDI LDI LDI 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 HL INC DE EXX DJNZ liner.loop EXX LD HL,big.char ;big.char -- font buffer area... SLA (HL) ;shift it all to the left INC HL SLA (HL) INC HL SLA (HL) INC HL SLA (HL) INC HL SLA (HL) INC HL SLA (HL) INC HL SLA (HL) big.count: LD A,0 ;counter for bit pos. DEC A LD (big.count+1),A OR A JR NZ,big.bit big.pos: LD HL,&0000 LD A,(HL) INC HL LD (big.pos+1),HL CP 255 JR NZ,not.wrap.big LD HL,large.mess LD (big.pos+1),HL JR big.pos+3 not.wrap.big: LD L,A ;calculate FONT address from TEXT data LD A,8 LD (big.count+1),A LD H,0 ADD HL,HL ADD HL,HL ADD HL,HL LD DE,font-256 ;ascii SPACE * 8... ADD HL,DE LD DE,big.char ;copy font into buffer LD A,(HL) LD (DE),A INC HL INC DE LD A,(HL) LD (DE),A INC HL INC DE LD A,(HL) LD (DE),A INC HL INC DE LD A,(HL) LD (DE),A INC HL INC DE LD A,(HL) LD (DE),A INC HL INC DE LD A,(HL) LD (DE),A INC HL INC DE LD A,(HL) LD (DE),A big.bit: LD HL,&AB9F ;put BIG scroll onscreen, messing with LD DE,&20 ;attribute data... EXX LD HL,big.char LD B,7 big.bit.l: BIT 7,(HL) JR NZ,filled.big INC HL ;background set to BLACK -- scrolly isn't EXX ;there... LD A,(HL) AND %00000111 LD (HL),A ADD HL,DE LD A,(HL) AND %00000111 LD (HL),A ADD HL,DE LD A,(HL) AND %00000111 LD (HL),A ADD HL,DE LD A,(HL) AND %00000111 LD (HL),A ADD HL,DE LD A,(HL) AND %00000111 LD (HL),A ADD HL,DE LD A,(HL) AND %00000111 LD (HL),A ADD HL,DE LD A,(HL) AND %00000111 LD (HL),A ADD HL,DE LD A,(HL) AND %00000111 LD (HL),A ADD HL,DE EXX DJNZ big.bit.l EXX RET filled.big: INC HL ;set background to LIT (RED) EXX LD A,(HL) OR %00001000 LD (HL),A ADD HL,DE LD A,(HL) OR %00001000 LD (HL),A ADD HL,DE LD A,(HL) OR %00001000 LD (HL),A ADD HL,DE LD A,(HL) OR %00001000 LD (HL),A ADD HL,DE LD A,(HL) OR %00001000 LD (HL),A ADD HL,DE LD A,(HL) OR %00001000 LD (HL),A ADD HL,DE LD A,(HL) OR %00001000 LD (HL),A ADD HL,DE LD A,(HL) OR %00001000 LD (HL),A ADD HL,DE EXX DJNZ big.bit.l EXX RET sm.char: DEFS 7 small: LD A,(current.line+1) ;SMALL scrolly... large line of chars LD HL,current.dir+1 ;drifts up and down the screen... BIT 7,(HL) JR Z,bln.block ADD A,6 ;blank bottom line if moving ;up bln.block: LD L,A LD H,0 ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL LD DE,32768 ADD HL,DE LD (HL),0 INC HL LD (HL),0 INC HL LD (HL),0 INC HL LD (HL),0 INC HL LD (HL),0 INC HL LD (HL),0 INC HL LD (HL),0 INC HL LD (HL),0 INC HL LD (HL),0 INC HL LD (HL),0 INC HL LD (HL),0 INC HL LD (HL),0 INC HL LD (HL),0 INC HL LD (HL),0 INC HL LD (HL),0 INC HL LD (HL),0 INC HL LD (HL),0 INC HL LD (HL),0 INC HL LD (HL),0 INC HL LD (HL),0 INC HL LD (HL),0 INC HL LD (HL),0 INC HL LD (HL),0 INC HL LD (HL),0 INC HL LD (HL),0 INC HL LD (HL),0 INC HL LD (HL),0 INC HL LD (HL),0 INC HL LD (HL),0 INC HL LD (HL),0 INC HL LD (HL),0 INC HL LD (HL),0 LD A,(current.line+1) LD HL,current.dir+1 ADD A,(HL) LD (current.line+1),A CP 48 ;hit top? if so, flip direction JR Z,current.dir CP 184 ;hit bottom? if so, flip direction JR NZ,sm.count current.dir: LD A,1 NEG LD (current.dir+1),A sm.count: LD A,0 ;counter for bit pos. DEC A LD (sm.count+1),A OR A JR NZ,sm.bit sm.pos: LD HL,&0000 LD A,(HL) INC HL LD (sm.pos+1),HL CP 255 JR NZ,not.wrap.sm LD HL,small.mess LD (sm.pos+1),HL JR sm.pos+3 not.wrap.sm: LD L,A ;calculate FONT address from TEXT data LD A,8 LD (sm.count+1),A LD H,0 ADD HL,HL ADD HL,HL ADD HL,HL LD DE,font-256 ADD HL,DE LD DE,sm.char ;copy into a character buffer LD A,(HL) LD (DE),A INC HL INC DE LD A,(HL) LD (DE),A INC HL INC DE LD A,(HL) LD (DE),A INC HL INC DE LD A,(HL) LD (DE),A INC HL INC DE LD A,(HL) LD (DE),A INC HL INC DE LD A,(HL) LD (DE),A INC HL INC DE LD A,(HL) LD (DE),A ;no bottom line here either! sm.bit: LD HL,sm.char ;scroll the line in its data area.. LD DE,sm.data+31 CALL scroll.sml LD HL,sm.char+1 LD DE,sm.data+63 CALL scroll.sml LD HL,sm.char+2 LD DE,sm.data+95 CALL scroll.sml LD HL,sm.char+3 LD DE,sm.data+127 CALL scroll.sml LD HL,sm.char+4 LD DE,sm.data+159 CALL scroll.sml LD HL,sm.char+5 LD DE,sm.data+191 CALL scroll.sml LD HL,sm.char+6 LD DE,sm.data+223 CALL scroll.sml current.line: LD HL,136 ;put the data onto the screen... ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL LD DE,32768 ADD HL,DE EX DE,HL LD HL,sm.data LD B,7 sm.looper: PUSH BC LDI LDI ;unlooped 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 POP BC DJNZ sm.looper RET scroll.sml: ;scroll a single line's data into position... EX AF,AF' RL (HL) EX DE,HL RL (HL) EX AF,AF' DEC HL EX AF,AF' RL (HL) EX AF,AF' DEC HL EX AF,AF' RL (HL) EX AF,AF' DEC HL EX AF,AF' RL (HL) EX AF,AF' DEC HL EX AF,AF' RL (HL) EX AF,AF' DEC HL EX AF,AF' RL (HL) EX AF,AF' DEC HL EX AF,AF' RL (HL) EX AF,AF' DEC HL EX AF,AF' RL (HL) EX AF,AF' DEC HL EX AF,AF' RL (HL) EX AF,AF' DEC HL EX AF,AF' RL (HL) EX AF,AF' DEC HL EX AF,AF' RL (HL) EX AF,AF' DEC HL EX AF,AF' RL (HL) EX AF,AF' DEC HL EX AF,AF' RL (HL) EX AF,AF' DEC HL EX AF,AF' RL (HL) EX AF,AF' DEC HL EX AF,AF' RL (HL) EX AF,AF' DEC HL EX AF,AF' RL (HL) EX AF,AF' DEC HL EX AF,AF' RL (HL) EX AF,AF' DEC HL EX AF,AF' RL (HL) EX AF,AF' DEC HL EX AF,AF' RL (HL) EX AF,AF' DEC HL EX AF,AF' RL (HL) EX AF,AF' DEC HL EX AF,AF' RL (HL) EX AF,AF' DEC HL EX AF,AF' RL (HL) EX AF,AF' DEC HL EX AF,AF' RL (HL) EX AF,AF' DEC HL EX AF,AF' RL (HL) EX AF,AF' DEC HL EX AF,AF' RL (HL) EX AF,AF' DEC HL EX AF,AF' RL (HL) EX AF,AF' DEC HL EX AF,AF' RL (HL) EX AF,AF' DEC HL EX AF,AF' RL (HL) EX AF,AF' DEC HL EX AF,AF' RL (HL) EX AF,AF' DEC HL EX AF,AF' RL (HL) EX AF,AF' DEC HL EX AF,AF' RL (HL) EX AF,AF' DEC HL EX AF,AF' RL (HL) EX AF,AF' RET sm.data: DEFS 224 wibble.data: EQU &8000 wib.dat: MDAT "wib.dat" ;Merge in Etracker tune ;~~~~~~~~~~~~~~~~~~~~~~ ORG &8000 DUMP 3,0 musicinit: MDAT "tune" musicplay: EQU musicinit+6