;FRED 18 MENU ;------------ ;(c) 1991 Simon Cooke (or 1992 , as that's when it'll appear in ; the PD) ;*************************************************************** ;EQUATE TABLE (Placed here for easy adjustment) ;------------ ;this is the top left address of the scrolly window. scroll.screen: EQU &46A0-512-&80 ;this is the bottom left address of the vu-bar window. vu.screen: EQU &5F86 ;parallax star equates now: layer 1- back layer, layer 2-middle ; layer, layer 3- front layer. ; (THESE ARE THE SPEEDS) - EXPERIMENT !!! layer1: EQU 2 layer2: EQU 4 layer3: EQU 6 ;[TRY layer 1:2, layer 2:4, layer 3:6] ;*************************************************************** ORG &8000 start: DI ;These set up the initial positions for the star routines LD C,20 loop3: PUSH BC CALL set.stars POP BC LD HL,zub.eye.twinkl LD B,170 loop: LD (HL),128 INC HL LD (HL),96 INC HL CALL make.rand2 LD (HL),A INC HL CALL make.rand2 LD (HL),A INC HL DJNZ loop DEC C JP NZ,loop3 ;This stores the basic paging and stack so that exits can be ;made to basic IN A,(&FA) LD (basic.page+1),A IN A,(&FC) LD (basic.scrn+1),A LD (basic.stack+1),SP LD SP,&0000 LD BC,511 ;sound chip on LD A,28 OUT (C),A LD A,1 DEC B OUT (C),A ;set palette to black LD BC,&10F8 XOR A pal.black: DEC B OUT (C),A INC B DJNZ pal.black LD A,46 ;set screen paging OUT (&FA),A LD A,110 OUT (&FC),A LD HL,scrolly LD (scroll.pos),HL XOR A LD (scroll.count),A clear.table: LD HL,vu.data LD DE,vu.data+1 LD BC,31 LD (HL),0 LDIR ;this little bit clears the screen (it'll appear 2 more times, ;too, but I won't document it...) LD HL,0 LD DE,1 LD (HL),L LD BC,&5FFF LDIR LD HL,credit.palette ;move the palette into CALL movecolours ;the fader routine ;*************************************************************** ;This routine prints the Credits on the screen proportionally, ;and properly centered (to within 2 pixels) credit.print: LD HL,credits LD (credit.pos),HL credit.l1: LD HL,(credit.pos) LD A,(HL) CP 128 JP Z,credit.end CP 129 JP Z,put.logo SLA A SLA A SLA A LD B,A LD A,192 SUB B SRL A LD D,A LD E,0 SRL D RR E LD (credit.line),DE XOR A LD (credit.lne),A INC HL LD (credit.pos),HL LD D,0 credit.loop: PUSH HL LD A,(HL) CP 13 JP Z,exit.l.w CP 255 JP Z,exit.l.w SUB 32 LD L,A LD H,0 PUSH DE LD DE,font.width ADD HL,DE POP DE LD A,(HL) ADD A,D LD D,A POP HL INC HL JP credit.loop exit.l.w: POP HL LD A,128 SUB D LD E,A LD A,(credit.lne) LD D,A ADD A,8 LD (credit.lne),A SRL D RR E LD HL,(credit.line) ADD HL,DE LD (c.screen.pos),HL print.line: LD HL,(credit.pos) LD A,(HL) INC HL LD (credit.pos),HL CP 13 JP Z,next.line CP 255 JP Z,wait.next.cred SUB 32 LD L,A LD H,0 ADD HL,HL LD DE,font.table ADD HL,DE LD E,(HL) INC HL LD D,(HL) LD HL,font ADD HL,DE LD (char.pos+1),HL LD L,A LD H,0 LD DE,font.width ADD HL,DE LD A,(HL) LD (char.width+1),A char.pos: LD DE,&0000 LD HL,(c.screen.pos) LD B,8 char.l.loop: PUSH HL char.width: LD C,0 width.loop: LD A,(DE) LD (HL),A INC L INC DE DEC C JR NZ,width.loop POP HL PUSH DE LD DE,128 ADD HL,DE POP DE DJNZ char.l.loop LD A,(char.width+1) LD E,A LD D,0 LD HL,(c.screen.pos) ADD HL,DE LD (c.screen.pos),HL JP print.line next.line: LD HL,(credit.pos) JP credit.loop wait.next.cred: LD B,15 ;text off pause fly.loop1: PUSH BC fly.wait2: IN A,(&F9) BIT 3,A JR NZ,fly.wait2 LD B,255 DJNZ $ POP BC LD A,&7F IN A,(&FE) RRA JP NC,credit.end DJNZ fly.loop1 LD HL,zub.eye.twinkl ;initialise star routine LD B,255 loop5: LD (HL),128 INC HL LD (HL),96 INC HL CALL make.rand2 LD (HL),A INC HL CALL make.rand2 LD (HL),A INC HL DJNZ loop5 CALL fadein flyoff2: LD BC,140 ;"show text" pause fly.loop2: PUSH BC fly.wait: IN A,(&F9) BIT 3,A JR NZ,fly.wait CALL eye.stars ;put stars on screen behind text POP BC LD A,&7F ;check for SPACE being pressed IN A,(&FE) RRA JP NC,credit.end DEC BC LD A,B OR C JR NZ,fly.loop2 flyoff: CALL fadeout LD HL,0 LD DE,1 LD (HL),L LD BC,&5FFF LDIR JP credit.l1 put.logo: INC HL LD (credit.pos),HL LD DE,&28B5 LD HL,noesis.logo LD B,29 WidthLoop2: LD C,21 PUSH DE Width3: LD A,(HL) INC HL LD (DE),A INC DE DEC C JR NZ,Width3 POP DE PUSH HL LD HL,128 ADD HL,DE EX DE,HL POP HL DJNZ WidthLoop2 JP wait.next.cred credit.end: ;*************************************************************** main.menu: CALL fadeout main.menu2: LD HL,menu.palette CALL movecolours LD HL,0 LD DE,1 LD (HL),L LD BC,&5FFF LDIR ;This bit prints up the 14 different options for the menu print.options: LD HL,&4B00 LD (xpos),HL LD DE,option.text print.loop: LD A,(DE) INC DE CP 255 JP Z,end.p.opt CP 13 JP Z,carriage.ret CP 14 JP Z,tab.char PUSH DE LD HL,(xpos) SLA L SLA L SLA L SRL H RR L CALL text POP DE LD A,(xpos) INC A AND &1F LD (xpos),A JP print.loop tab.char: LD A,16 LD (xpos),A JP print.loop carriage.ret: LD A,(ypos) ADD A,6 LD (ypos),A XOR A LD (xpos),A JP print.loop end.p.opt: LD DE,&422 LD HL,FREDlogo LD B,41 WidthLoop: LD C,58 PUSH DE Width2: LD A,(HL) INC HL LD (DE),A INC DE DEC C JR NZ,Width2 POP DE PUSH HL LD HL,128 ADD HL,DE EX DE,HL POP HL DJNZ WidthLoop CALL fadein ;the main loop for the menu main.loop: flyback: IN A,(&F9) BIT 3,A JR NZ,flyback LD A,7 ;this (surprisingly enough) puts the parallax stars onscreen CALL para.stars ;this scrolls a scrolly across the screen... LD (sp.rest+1),SP LD SP,scroll.screen+1 LD HL,scroll.screen LD BC,66+128 ;note the copious amounts of POP's... POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E ADD HL,BC EXX LD HL,64+128 ADD HL,SP LD SP,HL EXX POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E ADD HL,BC EXX LD HL,64+128 ADD HL,SP LD SP,HL EXX POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E ADD HL,BC EXX LD HL,64+128 ADD HL,SP LD SP,HL EXX POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E ADD HL,BC EXX LD HL,64+128 ADD HL,SP LD SP,HL EXX POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E ADD HL,BC EXX LD HL,64+128 ADD HL,SP LD SP,HL EXX POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E sp.rest: LD SP,&0000 scroll.text: LD HL,(scroll.pos) LD A,(HL) SUB 32 LD L,A LD H,0 ADD HL,HL ADD HL,HL ADD HL,HL EX DE,HL LD L,A LD H,0 ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,DE LD DE,small.font ADD HL,DE LD A,(scroll.count) LD E,A LD D,0 ADD HL,DE EX DE,HL LD HL,scroll.screen+63 LD A,(DE) AND &EE LD (HL),A LD BC,256 ADD HL,BC PUSH HL LD HL,4 ADD HL,DE EX DE,HL POP HL LD A,(DE) AND &33 LD (HL),A ADD HL,BC PUSH HL LD HL,4 ADD HL,DE EX DE,HL POP HL LD A,(DE) AND &DD LD (HL),A ADD HL,BC PUSH HL LD HL,4 ADD HL,DE EX DE,HL POP HL LD A,(DE) AND &22 LD (HL),A LD BC,256 ADD HL,BC PUSH HL LD HL,4 ADD HL,DE EX DE,HL POP HL LD A,(DE) AND &11 LD (HL),A ADD HL,BC PUSH HL LD HL,4 ADD HL,DE EX DE,HL POP HL LD A,(DE) AND &BB LD (HL),A ADD HL,BC PUSH HL LD HL,4 ADD HL,DE EX DE,HL POP HL LD A,(scroll.count) INC A LD (scroll.count),A CP 4 JP NZ,not.next.char XOR A LD (scroll.count),A LD HL,(scroll.pos) INC HL LD (scroll.pos),HL LD A,(HL) CP 255 JP NZ,not.next.char LD HL,scrolly LD (scroll.pos),HL not.next.char: CALL 49646 ;plays 128k music (with conversion) CALL put.vu ;this calls the "put up vu bars" ;routine ;this checks for keys, and decodes them... key.check: LD BC,49145 IN A,(C) RLA JP C,not.mess LD BC,65534 IN A,(C) RRA JP NC,message not.mess: LD D,255 akey: LD BC,65022 IN A,(C) BIT 0,A JP NZ,bkey LD D,0 bkey: LD BC,32766 IN A,(C) BIT 4,A JP NZ,ckey LD D,1 ckey: LD BC,65278 IN A,(C) BIT 3,A JP NZ,dkey LD D,2 dkey: LD BC,65022 IN A,(C) BIT 2,A JP NZ,ekey LD D,3 ekey: LD BC,64510 IN A,(C) BIT 2,A JP NZ,fkey LD D,4 fkey: LD BC,65022 IN A,(C) BIT 3,A JP NZ,gkey LD D,5 gkey: LD BC,65022 IN A,(C) BIT 4,A JP NZ,hkey LD D,6 hkey: LD BC,49150 IN A,(C) BIT 4,A JP NZ,ikey LD D,7 ikey: LD BC,57342 IN A,(C) BIT 2,A JP NZ,jkey LD D,8 jkey: LD BC,49150 IN A,(C) BIT 3,A JP NZ,kkey LD D,9 kkey: LD BC,49150 IN A,(C) BIT 2,A JP NZ,lkey LD D,10 lkey: LD BC,49150 IN A,(C) BIT 1,A JP NZ,mkey LD D,11 mkey: LD BC,32766 IN A,(C) BIT 2,A JP NZ,nkey LD D,12 nkey: LD BC,32766 IN A,(C) BIT 3,A JP NZ,nokey LD D,13 nokey: LD A,D LD (selected),A CP 255 JP NZ,ret.to.basic JP main.loop ;This prints up a "hidden" message for the enterprising in the ;audience... message: LD HL,scrolly LD (scroll.pos),HL CALL fadeout LD HL,0 LD DE,1 LD (HL),L LD BC,&5FFF LDIR ;This bit prints up the message (as for the menu options) print.opt2: LD HL,0 LD (xpos),HL LD DE,message.text print.loop2: LD A,(DE) INC DE CP 255 JP Z,end.p.opt2 CP 13 JP Z,carriage.re2 CP 14 JP Z,tab.char2 PUSH DE LD HL,(xpos) SLA L SLA L SLA L SRL H RR L CALL text POP DE LD A,(xpos) INC A AND &1F LD (xpos),A JP print.loop2 tab.char2: LD A,16 LD (xpos),A JP print.loop2 carriage.re2: LD A,(ypos) ADD A,6 LD (ypos),A XOR A LD (xpos),A JP print.loop2 end.p.opt2: CALL fadein mess.loop: IN A,(&F9) BIT 3,A JR NZ,mess.loop CALL 49646 LD A,&7F IN A,(&FE) RRA JP NC,main.menu JP mess.loop ;*************** RETURN TO BASIC ****************************** ret.to.basic: LD BC,&01FF LD D,0 LD A,28 sound.off.loop: OUT (C),A DEC B OUT (C),D INC B DEC A JR NZ,sound.off.loop CALL fadeout LD A,(basic.scrn+1) AND 31 OR 32 OUT (&FA),A LD HL,0 LD DE,1 LD BC,&5FFF LD (HL),L LDIR basic.page: LD A,&00 OUT (&FA),A basic.scrn: LD A,&00 OUT (&FC),A basic.stack: LD SP,&0000 LD HL,&55D8+15 LD BC,&10F8 OTDR EI LD A,(selected) LD C,A LD B,0 RET ;**************** SOUND CHIP ADDRESSING RELOC. ROUTINES ******** setregd: PUSH AF PUSH DE PUSH BC PUSH HL LD A,D AND &0F LD L,A LD H,0 LD DE,reg.table ADD HL,DE LD (register),HL POP 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.table 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 CALL play.chip POP HL POP BC POP DE POP AF RET outrege: PUSH AF PUSH DE PUSH BC PUSH HL LD HL,(register) LD (HL),E CALL play.chip POP HL POP BC POP DE POP AF RET outdout: PUSH AF PUSH DE PUSH BC PUSH HL LD A,(HL) LD HL,(register) LD (HL),A CALL play.chip POP HL DEC HL DEC BC POP BC POP DE POP AF RET ;************* PLAY DATA THROUGH SAM SOUND CHIP **************** play.chip: LD A,(reg8) LD E,0 LD BC,511 OUT (C),E DEC B OUT (C),A INC E LD A,(reg9) INC B OUT (C),E DEC B OUT (C),A INC E INC B LD A,(rega) OUT (C),E DEC B OUT (C),A INC B INC E OUT (C),E DEC B LD D,A RRCA RRCA RRCA RRCA OR D OUT (C),A INC B LD A,(reg8) AND 6 RLA HERE: INC E OUT (C),E DEC B OUT (C),A INC B LD A,(reg0) LD L,A LD A,(reg1) AND &0F LD H,A LD DE,freq.table ADD HL,HL ADD HL,DE LD E,(HL) INC HL LD A,(HL) AND 7 LD (oct0),A LD A,E LD E,8 OUT (C),E DEC B OUT (C),A LD (SG+1),A INC B LD A,(reg2) LD L,A LD A,(reg3) AND &0F LD H,A LD DE,freq.table ADD HL,HL ADD HL,DE LD E,(HL) INC HL LD A,(HL) AND 7 LD (oct1),A LD A,E LD E,9 OUT (C),E DEC B OUT (C),A INC B LD A,(reg4) LD L,A LD A,(reg5) AND &0F LD H,A LD DE,freq.table ADD HL,HL ADD HL,DE LD E,(HL) INC HL LD A,(HL) AND 7 LD (oct2),A LD A,E LD E,10 OUT (C),E DEC B OUT (C),A INC B LD E,11 OUT (C),E DEC B LD A,(SG+1) SUB 10 OUT (C),A INC B LD A,(oct0) LD E,A LD A,(oct1) RRCA RRCA RRCA RRCA OR E LD E,&10 OUT (C),E DEC B OUT (C),A INC B LD A,(oct2) INC E OUT (C),E DEC B LD D,A LD A,(oct0) RRCA RRCA RRCA RRCA OR D OUT (C),A adder: INC B LD E,21 LD A,(reg7) AND 1 RRCA RRCA RRCA RRCA OUT (C),E DEC B OUT (C),A INC B LD A,15 LD E,20 OUT (C),E DEC B OUT (C),A LD E,22 INC B OUT (C),E LD A,17 DEC B OUT (C),A RET freq.table: MDAT "frequency" ;******************* MAIN SYSTEM VARIABLES ********************* main.vars: colour.table: DEFB &EE,&FF,&99,&88,&77,&66 menu.palette: DEFB 0,15,112,119,2,10,37,45,114,122 DEFB 9,7,30,120,127,121 credit.palette:DEFB 0,15,34,127,2,10,37,45,114,122 DEFB 9,7,30,120,127,121 ;Credit text: codes - 13, move down a line ; 255, finish section ; 128, end of credits ;each block starts with a defb telling it how many lines there ;are, so that it can centralise them on-screen credits: DEFB 2 DEFM "Please read the" DEFB 13 DEFM "credits..." DEFB 255 DEFB 1 DEFM "Simon Cooke" DEFB 255 DEFB 1 DEFM "In Association With" DEFB 255 DEFB 129 DEFB 1 DEFM "Presents" DEFB 255 DEFB 3 DEFM "A FRED Disc Magazine" DEFB 13 DEFM " " DEFB 13 DEFM "Production" DEFB 255 DEFB 5 DEFM "THE FRED 18" DEFB 13 DEFM " " DEFB 13 DEFM "MAGICAL MEGA MENU" DEFB 13 DEFM " " DEFB 13 DEFM "DEMO" DEFB 255 DEFB 3 DEFM "Written And Conceived By" DEFB 13 DEFM " " DEFB 13 DEFM "Simon Cooke" DEFB 255 DEFB 3 DEFM "Technical Advice From" DEFB 13 DEFM " " DEFB 13 DEFM "Chris White" DEFB 255 DEFB 3 DEFM "Music Composed By" DEFB 13 DEFM " " DEFB 13 DEFM "Tim Follin" DEFB 255 DEFB 5 DEFM "Music Originally From" DEFB 13 DEFM " " DEFB 13 DEFM "Mastertronic's" DEFB 13 DEFM " " DEFB 13 DEFM "Solar Invasion" DEFB 255 DEFB 3 DEFM "Musical Enhancement By" DEFB 13 DEFM " " DEFB 13 DEFM "Stuart Leonardi" DEFB 255 DEFB 3 DEFM "Music Conversion By" DEFB 13 DEFM " " DEFB 13 DEFM "Simon Cooke" DEFB 255 DEFB 4 DEFM "FRED Disc Compiled By" DEFB 13 DEFM " " DEFB 13 DEFM "Colin MacDonald" DEFB 255 DEFB 3 DEFM "FRED 18 Menu" DEFB 13 DEFM " " DEFB 13 DEFM " 1992 Simon Cooke" DEFB 255 DEFB 3 DEFM "FRED 18" DEFB 13 DEFM " " DEFB 13 DEFM " 1992 Colin MacDonald" DEFB 255 DEFB 1 DEFM "Happy New Year!!!" DEFB 255 DEFB 4 DEFM "control the" DEFB 13 DEFM "edit" DEFB 13 DEFM " " DEFB 13 DEFM "(in the menu)" DEFB 255 DEFB 1 DEFM "Thanks To" DEFB 255 DEFB 1 DEFM "Chris White" DEFB 255 DEFB 1 DEFM "Stuart Leonardi" DEFB 255 DEFB 1 DEFM "Andy Moore" DEFB 255 DEFB 1 DEFM "Si Hindle" DEFB 255 DEFB 1 DEFM "Brian McConnell" DEFB 255 DEFB 1 DEFM "Mike AJ" DEFB 255 DEFB 1 DEFM "Hello To" DEFB 255 DEFB 1 DEFM "Catherine" DEFB 255 DEFB 1 DEFM "AXE" DEFB 255 DEFB 1 DEFM "Alan Miles" DEFB 255 DEFB 1 DEFM "Bruce Gordon" DEFB 255 DEFB 1 DEFM "Da Boyz Downstairs" DEFB 255 DEFB 1 DEFM "Isabelle" DEFB 255 DEFB 1 DEFM "Matt H" DEFB 255 DEFB 1 DEFM "Angstrom F" DEFB 255 DEFB 1 DEFM "Brian Stuart" DEFB 255 DEFB 3 DEFM "Frankie" DEFB 13,34 DEFM "Equinox" DEFB 34,13 DEFM "Coan" DEFB 255 DEFB 3 DEFM "Steve" DEFB 13,34 DEFM "Steve" DEFB 34,13 DEFM "McKune" DEFB 255 DEFB 3 DEFM "Frank" DEFB 13,34 DEFM "Arnie" DEFB 34,13 DEFM "Azzopardi" DEFB 255 DEFB 1 DEFM "Janet O'Donnell" DEFB 255 DEFB 1 DEFM "Paul Pryzybyla" DEFB 255 DEFB 3 DEFM "Andy Monk" DEFB 13 DEFM " " DEFB 13 DEFM "(For His Hello In A Scrolly)" DEFB 255 DEFB 1 DEFM "And..." DEFB 255 DEFB 3 DEFM "All At SAM Computers" DEFB 13 DEFM " " DEFB 13 DEFM "And SAM Technology" DEFB 255,128 ;text for FRED menu options option.text: DEFM "A-FRED" DEFB 14 DEFM "H-M/C LESSON 11" DEFB 13 DEFM "B-LETTERS" DEFB 14 DEFM "I-AXCELENT" DEFB 13 DEFM "C-SCREEN$" DEFB 14 DEFM "J-MEMORY GAME" DEFB 13 DEFM "D-YAHTZEE" DEFB 14 DEFM "K-CUTESY DEMOS" DEFB 13 DEFM "E-TURTLE +" DEFB 14 DEFM "L-MEGABLAST 2" DEFB 13 DEFM "F-DISC UTILITIES" DEFB 14 DEFM "M-ADVERTS" DEFB 13 DEFM "G-FRED MOVES" DEFB 14 DEFM "N-BITS 'N' BOBS" DEFB 255 ;Hidden message text: message.text: ;-------------------------------- DEFM "HELLO AND WELCOME TO THE SECRET" DEFB 13 DEFM "MESSAGE-IN-A-MENU FOR FRED 18!!" DEFB 13 DEFB 13,13 DEFM "WELL, HELLO OUT THERE! COOKIE" DEFB 13 DEFM "HERE... HELLO TO AXE (PAGING" DEFB 13 DEFM "ISN'T MUCH OF A PROBLEM - MAKE" DEFB 13 DEFM "SURE THAT YOU PUT EVERYTHING" DEFB 13 DEFM "BACK AS YOU FOUND IT (AND HAVE" DEFB 13 DEFM "INTERRUPTS DISABLED IF YOU ARE" DEFB 13 DEFM "PAGING THE LOWER MEMORY HALF)," DEFB 13 DEFM "AND YOU'LL BE OKAY..." DEFB 13,13,13 DEFM "WASN'T IT A SHAME ABOUT FREDDY" DEFB 13 DEFM "MERCURY... OH WELL, THE SHOW" DEFB 13 DEFM "MUST GO ON..." DEFB 13,13 DEFB 13 DEFM "HELLO TO ANYONE ELSE OUT THERE!" DEFB 13 DEFM "MORE STUFF FROM ME WHEN I'VE" DEFB 13 DEFM "FINISHED THE GAME I'M WORKING" DEFB 13 DEFM "ON ..." DEFB 13,13 DEFM "BYEEEEEEEE!!!!!!!!!!" DEFB 13,13 DEFM "(PRESS SPACE FOR THE MENU)" DEFB 13 DEFB 13 DEFM "e1991 M/C COOKIE PRODUCTIONS" DEFB 255 ;text printing routine (screen address has to be supplied) ;screen address- hl, character - a text: SUB 32 PUSH HL LD L,A LD H,0 ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL EX DE,HL LD L,A LD H,0 ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,DE LD DE,small.font ADD HL,DE EX DE,HL POP HL EXX LD HL,colour.table EXX LD B,6 text.l: EXX LD A,(HL) LD (colour.set+1),A INC HL EXX LD C,4 text.l2: LD A,(DE) colour.set: AND &00 LD (HL),A INC L INC DE DEC C JR NZ,text.l2 PUSH DE LD DE,124 ADD HL,DE POP DE DJNZ text.l RET put.vu: ;this makes a second copy of the VU data, so that it can decide ;whether or not to update it... LD HL,vu.data LD DE,vu.data2 LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI ;this takes all of the vu-bars and "decays" them - decreases ;them by 2 decay.vu: LD HL,vu.data+&16 LD B,&17 decay.loop: LD A,(HL) DEC A CP 255 JP C,next.vu.3 XOR A next.vu.3: LD (HL),A DEC HL DJNZ decay.loop ;the next 3 chunks take the current freq. values for the 3 music ;channels, and find out which bar corresponds to them. then it ;sets the height of the bar according to the volume on that ;channel. ;NB: ;it is mugtrapped for the peculiar freq. values that Dave W gave ;some of his notes... LD HL,vu.data LD DE,(reg2) SLL E RL D LD A,D AND &1F LD E,A LD D,0 ADD HL,DE LD A,(reg9) LD (HL),A LD HL,vu.data LD DE,(reg4) SLL E RL D LD A,D AND &1F LD E,A LD D,0 ADD HL,DE LD A,(rega) LD (HL),A LD HL,vu.data LD DE,(reg0) SLL E RL D LD A,D AND &1F LD E,A LD D,0 ADD HL,DE LD A,(reg8) LD (HL),A LD HL,vu.screen LD DE,vu.data+&16 EXX LD HL,vu.data2+&16 EXX LD B,&17 clear.vu.loop: LD A,(DE) EXX CP (HL) EXX JP Z,next.vu PUSH DE PUSH HL PUSH BC LD B,&0F clear.loop: OR A JP Z,blank.line DEC A LD (HL),&56 INC L INC L INC L INC L LD (HL),&65 LD DE,132 SBC HL,DE INC L LD (HL),&78 INC L INC L LD (HL),&87 INC L LD DE,132 SBC HL,DE INC L INC L LD (HL),&99 INC L INC L LD DE,132 SBC HL,DE DJNZ clear.loop ADD HL,DE POP BC POP HL POP DE JP next.vu blank.line: LD (HL),&00 INC L INC L INC L INC L LD (HL),&00 LD DE,132 SBC HL,DE INC L LD (HL),&00 INC L INC L LD (HL),&00 INC L LD DE,132 SBC HL,DE INC L INC L LD (HL),&00 INC L INC L LD DE,132 SBC HL,DE DEC B JP NZ,clear.loop ADD HL,DE POP BC POP HL POP DE next.vu: PUSH DE LD DE,5 ADD HL,DE POP DE DEC DE EXX DEC HL EXX DEC B JP NZ,clear.vu.loop RET ;colour fader routine fadeout: LD HL,fader.palette LD DE,temp.palette LD BC,16 LDIR LD B,8 fadeout1: LD C,16 LD HL,temp.palette fadeout2: LD A,(HL) CALL dropdown LD (HL),A INC HL DEC C JP NZ,fadeout2 EXX LD B,1 fadeoutfly: IN A,(&F9) BIT 3,A JP NZ,fadeoutfly DJNZ fadeoutfly LD HL,temp.palette+15 LD BC,&10F8 OTDR EXX DJNZ fadeout1 RET fadein: LD B,9 LD D,8 fadein1: LD C,16 LD HL,fader.palette EXX LD HL,temp.palette 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,1 fadeinfly: IN A,(&F9) BIT 3,A JP NZ,fadeinfly DJNZ fadeinfly LD HL,temp.palette+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,fader.palette LD BC,16 LDIR RET fader.palette: DEFS 16 temp.palette: DEFS 16 read1: LD A,(HL) RRA RRA AND &1E LD E,A LD D,0 LD A,(HL) INC HL PUSH HL LD HL,keyadd ADD HL,DE LD D,A PUSH BC LD A,(HL) IN A,(&FE) AND &1F LD B,A LD A,(HL) IN A,(&F9) AND &E0 OR B CPL LD E,A POP BC POP HL LD A,D AND &07 JP Z,read4 read3: RR E DEC A JP NZ,read3 read4: RR E RL C DJNZ read1 LD A,C RET keyadd: DEFW &F7,&FB,&FD,&FE,&EF,&DF,&BF,&7F DEFW &FF set.stars: LD B,45 LD HL,StarCoords LD DE,credits para.set.loop: LD A,R LD C,A LD A,(DE) ADD A,C INC DE LD (HL),A CALL new.height INC HL INC HL DJNZ para.set.loop RET para.stars: LD B,45 LD C,1 LD HL,StarCoords BlankLoop: LD E,(HL) INC HL LD D,(HL) INC HL SRL D RR E LD A,(DE) CP 4 JR NC,Reloop XOR A LD (DE),A Reloop: DJNZ BlankLoop BottomLayer: LD HL,StarCoords LD B,15 Loop1: LD A,(HL) SUB layer1 CALL C,new.height LD (HL),A LD E,(HL) INC HL LD D,(HL) INC HL SRL D RR E LD A,(DE) OR A JR NZ,Reloop2 LD A,C LD (DE),A Reloop2: DJNZ Loop1 INC C MiddleLayer1: LD B,15 Loop2: LD A,(HL) SUB layer2 CALL C,new.height LD (HL),A LD E,(HL) INC HL LD D,(HL) INC HL SRL D RR E LD A,(DE) OR A JR NZ,Reloop3 LD A,C LD (DE),A Reloop3: DJNZ Loop2 INC C MiddleLayer2: LD B,15 Loop3: LD A,(HL) SUB layer3 CALL C,new.height LD (HL),A LD E,(HL) INC HL LD D,(HL) INC HL SRL D RR E LD A,(DE) OR A JR NZ,Reloop4 LD A,C LD (DE),A Reloop4: DJNZ Loop3 MiddleLayer3: RET new.height: PUSH HL PUSH AF INC HL rand.loop: LD A,R ADD A,(HL) CP 192 JP C,not.offscreen SUB 192 not.offscreen: CP 136 JP C,okay.star CP 149 JP C,rand.loop okay.star: LD (HL),A POP AF POP HL RET ;stars for credits section eye.stars: LD HL,zub.eye.twinkl LD B,170 eye.star.l: PUSH BC PUSH HL LD E,(HL) INC HL LD D,(HL) SRL D RR E LD A,D CP &60 JP NC,off.screen.eye LD A,(DE) CP &0E JP NZ,check.hinyb XOR A LD (DE),A JP off.screen.eye check.hinyb: CP &E0 JP NZ,check.bothnyb XOR A LD (DE),A JP off.screen.eye check.bothnyb: CP &EE JP NZ,off.screen.eye XOR A LD (DE),A off.screen.eye: POP HL PUSH HL CALL update.star POP HL LD E,(HL) INC HL LD D,(HL) SRL D RR E JP C,odd.star.eye LD A,(DE) OR A JP NZ,end.star.eye LD A,&E0 LD (DE),A JP end.star.eye odd.star.eye: LD A,(DE) OR A JP NZ,end.star.eye LD A,&0E LD (DE),A end.star.eye: LD DE,3 ADD HL,DE POP BC DJNZ eye.star.l RET update.star: PUSH HL LD E,(HL) INC HL LD D,(HL) INC HL LD C,(HL) INC HL LD B,(HL) POP HL LD A,E BIT 7,C JP Z,add.to.x LD A,C AND 127 LD C,A LD A,E SUB C JP C,new.star.eye JP check.y add.to.x: ADD C JP C,new.star.eye check.y: LD E,A LD A,D BIT 7,B JP Z,add.to.y LD A,B AND 127 LD B,A LD A,D SUB B JP C,new.star.eye JP check.off.scr add.to.y: ADD B JP C,new.star.eye check.off.scr: CP 192 JP NC,new.star.eye LD D,A LD (HL),E INC HL LD (HL),D RET new.star.eye: LD DE,&6080 LD (HL),E INC HL LD (HL),D INC HL CALL make.rand2 LD (HL),A INC HL CALL make.rand2 LD (HL),A RET make.rand2: LD A,R ADD (HL) ADD A,L ADD A,H AND %10000111 CP 128 JP Z,addto OR A RET NZ addto: INC A RET ;*************************************************************** ;Sorry that these are in here Chris, but the fact is that I'm ;trying to be as economical with memory as possible, and I can't ;have such large spaces in the code... font.width: MDAT "prop.dat" font.table: MDAT "prop.tbl" ;This one can't be moved anyway.... ORG 49152 DUMP 49152 MDAT "solar6" ;************ SOLAR INVASION MUSIC ALTERATION SECTION ********** ORG 52500 DUMP 52500 LD E,C CALL setrega LD A,E CALL outrega RET ORG 55000 DUMP 55000 ;***********************MERGE BIT******************************* merge: font: MDAT "prop.fnt" small.font: MDAT "sm.fnt" scrolly: DEFM " " MDAT "SCROLL.TXT" DEFB 255 FREDlogo: MDAT "fred18.lgo" noesis.logo: MDAT "noesis.log" ;*************************************************************** end: EQU $ length: EQU end-start ;******************MISCELLANEOUS DATA*************************** ;NB: Not saved with object code... scroll.pos: DEFW scrolly scroll.count: DEFB 0 StarCoords: DEFS 90 register: DEFW 0 reg.table: reg0: DEFB 0 reg1: DEFB 0 reg2: DEFB 0 reg3: DEFB 0 reg4: DEFB 0 reg5: DEFB 0 reg6: DEFB 0 reg7: DEFB 7 reg8: DEFB 15 reg9: DEFB 15 rega: DEFB 15 regb: DEFB 0 regc: DEFB 0 regd: DEFB 0 DEFW 0 ;to pad out the registers so that ;there's 16 of them oct0: DEFB 0 oct1: DEFB 0 oct2: DEFB 0 vu.data2: DEFS 23 vu.data: DEFS 23 xpos: DEFB 0 ypos: DEFB 0 credit.line: DEFW 0 credit.lne: DEFB 0 credit.pos: DEFW 0 c.screen.pos: DEFW 0 selected: DEFB 0 SG: DEFB 0,0,0 zub.eye.twinkl:DEFS 704 ;***************************************************************