;MENU FOR ISH' 5 OF SCPDU ;~~~~~~~~~~~~~~~~~~~~~~~~ ;(c) 1992 Simon Cooke (yay!) music: EQU &C006 ORG &8000 DUMP 1,0 ;store everything for BASIC DI IN A,(&FC) LD (scr.page+1),A IN A,(&FA) LD (low.page+1),A LD (sp.store+1),SP LD SP,0 LD BC,&10F8 ;blank palette blank.pal: DEC B DEFB &ED,&71 INC B DJNZ blank.pal IN A,(&FC) ;page in screen low. AND 31 OR 32 OUT (&FA),A OR 64 OUT (&FC),A LD HL,menu1 ;set up for main menu CALL set.menu LD HL,scroll.area ;Initialise scrolling data buffer. LD DE,scroll.area+1 LD (HL),0 LD BC,535 LDIR LD HL,menupalette ;setup menu palette CALL movecolours LD HL,here ;put screen copying routine in screen LD DE,&6000 ;page (needed because of 64k address space) LD BC,copy.len LDIR CALL &6000 ;copy screen area. CALL fadein ;fade in screen CALL &C000 ;initialise music LD HL,message ;initialise scrolling message LD (scroll.pos+1),HL LD A,1 LD (scroll.count+1),A LD A,180 ;initialise scrolly position and initial LD (scroll.line+1),A LD A,1 ;motion direction LD (direct+1),A cur.menu: LD HL,menu1 ;set the menu (modified later) CALL set.menu cc.menu: LD A,0 LD (current.menu+1),A main.loop: LD A,&01 ;check for scan reaching end of screen IN A,(&F8) CP 191 JR NZ,main.loop CALL scrolly ;put the scrolly up CALL update.box ;update the menu box CALL update.box CALL keys ;check for a key press CALL music ;play the music JR main.loop ret.to.basic: LD BC,&01FF ;turn sound chip off LD A,28 OUT (C),A DEC B DEFB &ED,&71 CALL fadeout ;fade out screen LD HL,&0000 ;clear screen area LD DE,&0001 LD (HL),L LD BC,&5FFF LDIR low.page: LD A,0 ;return to BASIC OUT (&FA),A scr.page: LD A,0 OUT (&FC),A sp.store: LD SP,0 select: LD BC,&0000 ;return option no' to opt:> ;LET opt=USR 32768 RET ;Scrolly message (bounce up an' down your thang!) ;================================================ ;Bounces up and down in its little box also fades off at edges. scrolly: oldline: LD D,0 ;blank the scrolly from the screen using LD A,(scroll.line+1) ;uses the stack for SPEED! LD D,A DEC D olddirect: LD A,0 LD A,(direct+1) CP &FF JR NZ,blank.f LD A,D ADD A,9 LD D,A blank.f: LD H,D LD L,&FF SRL H RR L INC HL LD (sp.blank+1),SP LD SP,HL LD DE,&0000 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 PUSH DE sp.blank: LD SP,&0000 LD HL,scroll.area+1 ;scroll scrolling data area. LD DE,scroll.area LD B,67 scroll.scroll: PUSH BC LDI LDI LDI LDI LDI LDI LDI LDI POP BC DJNZ scroll.scroll scroll.count: LD A,1 ;check to see if complete character DEC A ;has been put in the area LD (scroll.count+1),A OR A JR NZ,scroll.new LD A,4 LD (scroll.count+1),A ;if so, get a new character & reset ;scrolly. scroll.pos: LD HL,message wrap.cont: LD A,(HL) INC HL LD (scroll.pos+1),HL CP 255 ;if 255, then end of text, so return to JR NZ,not.wrap ;start of text. wrap: LD HL,message JR wrap.cont not.wrap: LD L,A LD H,0 ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL LD DE,font-1024 ADD HL,DE LD (font.pos+1),HL scroll.new: LD HL,scroll.area+66 ;put the scrolling character in the LD DE,67 ;data area EXX font.pos: LD HL,font LD DE,&04 LD A,(HL) ADD HL,DE EXX LD (HL),A ADD HL,DE EXX LD A,(HL) ADD HL,DE EXX LD (HL),A ADD HL,DE EXX LD A,(HL) ADD HL,DE EXX LD (HL),A ADD HL,DE EXX LD A,(HL) ADD HL,DE EXX LD (HL),A ADD HL,DE EXX LD A,(HL) ADD HL,DE EXX LD (HL),A ADD HL,DE EXX LD A,(HL) ADD HL,DE EXX LD (HL),A ADD HL,DE EXX LD A,(HL) ADD HL,DE EXX LD (HL),A ADD HL,DE EXX LD A,(HL) ADD HL,DE EXX LD (HL),A ADD HL,DE LD HL,(font.pos+1) INC HL LD (font.pos+1),HL EXX LD HL,scroll.area ;work out where to put scrolly on screen. LD A,(scroll.line+1) LD D,A LD E,&7A SRL D RR E ;DE holds screen address CALL copy.blok ;copy the lines to the screen PUSH HL LD HL,128 ADD HL,DE EX DE,HL POP HL CALL copy.blok PUSH HL LD HL,128 ADD HL,DE EX DE,HL POP HL CALL copy.blok PUSH HL LD HL,128 ADD HL,DE EX DE,HL POP HL CALL copy.blok PUSH HL LD HL,128 ADD HL,DE EX DE,HL POP HL CALL copy.blok PUSH HL LD HL,128 ADD HL,DE EX DE,HL POP HL CALL copy.blok PUSH HL LD HL,128 ADD HL,DE EX DE,HL POP HL CALL copy.blok PUSH HL LD HL,128 ADD HL,DE EX DE,HL POP HL CALL copy.blok CALL fuzzyedge ;fade the edges with a stipple CALL fuzzyedge2 LD A,(direct+1) LD (olddirect+1),A LD A,(scroll.line+1) LD (oldline+1),A count.move: LD A,2 ;check if scrolly line has to be updated DEC A ;yet... (delayed so that it doesn't LD (count.move+1),A ;bounce too fast) OR A RET NZ LD A,2 LD (count.move+1),A LD A,(direct+1) ;check which direction to move in CP &FF JR Z,negative LD A,(scroll.line+1) ;move scrolly down INC A CP 185 JR NZ,set.line LD A,(direct+1) ;flip direction if reached lower limit NEG LD (direct+1),A LD A,184 LD (scroll.line+1),A RET negative: ;move scrolly upwards scroll.line: LD A,0 DEC A CP 177 ;check to see it reached upper limit JR NZ,set.line direct: LD A,0 ;flip direction if it has NEG LD (direct+1),A LD A,178 LD (scroll.line+1),A RET set.line: LD (scroll.line+1),A ;set the original scroll line RET copy.blok: ;unlooped scroll data copier. PUSH DE LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI 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 DE RET fuzzyedge: ;put the fuzzy edges on using a mask LD A,(scroll.line+1) LD L,&7A LD H,A SRL H RR L LD DE,128 LD B,2 fuzz.loop: PUSH HL LD (HL),0 INC L LD (HL),0 POP HL ADD HL,DE PUSH HL LD A,(HL) AND &F0 LD (HL),A INC L INC L LD A,(HL) AND &0F LD (HL),A POP HL ADD HL,DE PUSH HL LD A,(HL) AND &0F LD (HL),A INC L LD A,(HL) AND &0F LD (HL),A POP HL ADD HL,DE PUSH HL LD (HL),0 INC L LD A,(HL) AND &F0 LD (HL),A INC L LD A,(HL) AND &F0 LD (HL),A POP HL ADD HL,DE DJNZ fuzz.loop RET fuzzyedge2: ;fuzzy edge for right hand side LD A,(scroll.line+1) LD L,&FF LD H,A SRL H RR L LD DE,128 LD B,2 fuzz2.loop: PUSH HL LD (HL),0 DEC L LD (HL),0 POP HL ADD HL,DE PUSH HL LD A,(HL) AND &0F LD (HL),A DEC L DEC L LD A,(HL) AND &F0 LD (HL),A POP HL ADD HL,DE PUSH HL LD A,(HL) AND &F0 LD (HL),A DEC L LD A,(HL) AND &F0 LD (HL),A POP HL ADD HL,DE PUSH HL LD (HL),0 DEC L LD A,(HL) AND &0F LD (HL),A DEC L LD A,(HL) AND &0F LD (HL),A POP HL ADD HL,DE DJNZ fuzz2.loop RET scroll.area: DEFS 536 font: MDAT "scfont" menufont: MDAT "menufont" numberofmain: EQU 10 updatek: EQU "A"-"@" toiletk: EQU "F"-"@" menu1: ; ---------------------------------- DEFM " -=SCPDU ISSUE 5 MENU=- " DEFM " " DEFM " A) UPDATE " DEFM " B) SLIDESHOW " DEFM " C) THE MIDDLEBIT " DEFM " D) MOONLIGHT " DEFM " E) ENTRO 2 " DEFM " F) TOILET HUMOUR? " DEFM " G) P. E. T. P. W. " DEFM " H) ADVERTISEMENTS " DEFM " I) NEXT ISSUE... " DEFM " J) BOB'S BITZ " numberofupdate:EQU 10 exitupd: EQU "J"-"@" yoursayk: EQU "G"-"@" menu2: DEFM " -=UPDATE=- " DEFM " " DEFM " A) EDITORIAL " DEFM " B) GENERAL NEWS " DEFM " C) REVIEWS " DEFM " D) LETTERS " DEFM " E) WARHAMMER " DEFM " F) SAMCO'S DEMISE " DEFM " G) YOUR SAY " DEFM " H) MACHINE CODE TUTORIAL " DEFM " I) TECH SPOT " DEFM " J) RETURN TO MAIN MENU " numberofys: EQU 4 exitys: EQU "D"-"@" menu4: DEFM " -=YOUR SAY=- " DEFM " " DEFM " " DEFM " " DEFM " A) COUPE SOFTWARE " DEFM " B) WHY BUY SCPDU? " DEFM " C) BASIC OR WIMP? " DEFM " " DEFM " D) RETURN TO UPDATE MENU " DEFM " " DEFM " " DEFM " " numberoftoilet:EQU 6 exittoilet: EQU "F"-"@" menu3: DEFM " -=TOILET=- " DEFM " " DEFM " " DEFM " A) HOROSCOPES " DEFM " B) FRED'S LAST RIDE " DEFM " C) NEWS!!! " DEFM " D) VIZ LETTERS " DEFM " E) PENSTONE " DEFM " " DEFM " F) RETURN TO MAIN MENU " DEFM " " DEFM " " update.box: LD BC,1 ;counter for text window LD A,B ;loops while there is still text to put OR C ;on screen RET Z DEC BC ;(408 bytes) LD (update.box+1),BC LD A,B OR C RET Z text.data: LD HL,menu1 ;put text for menu in the menu box LD A,(HL) INC HL LD (text.data+1),HL CALL put.char RET put.char: ;this prints the actual character. x.pos: LD DE,&0000 ;D=y,E=x PUSH AF LD A,E ADD A,A ADD A,A ADD A,100 LD E,A LD A,D ADD A,A ADD A,A ADD A,A ADD A,21 LD D,A SRL D RR E POP AF LD L,A LD H,0 ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL PUSH DE LD DE,menufont-512 ADD HL,DE POP DE LD BC,127 LD A,(HL) LD (DE),A INC E INC HL LD A,(HL) LD (DE),A INC HL EX DE,HL ADD HL,BC EX DE,HL LD A,(HL) LD (DE),A INC E INC HL LD A,(HL) LD (DE),A INC HL EX DE,HL ADD HL,BC EX DE,HL LD A,(HL) LD (DE),A INC E INC HL LD A,(HL) LD (DE),A INC HL EX DE,HL ADD HL,BC EX DE,HL LD A,(HL) LD (DE),A INC E INC HL LD A,(HL) LD (DE),A INC HL EX DE,HL ADD HL,BC EX DE,HL LD A,(HL) LD (DE),A INC E INC HL LD A,(HL) LD (DE),A INC HL EX DE,HL ADD HL,BC EX DE,HL LD A,(HL) LD (DE),A INC E INC HL LD A,(HL) LD (DE),A INC HL EX DE,HL ADD HL,BC EX DE,HL LD A,(HL) LD (DE),A INC E INC HL LD A,(HL) LD (DE),A INC HL EX DE,HL ADD HL,BC EX DE,HL LD A,(HL) LD (DE),A INC E INC HL LD A,(HL) LD (DE),A LD A,(x.pos+1) INC A LD (x.pos+1),A CP 34 RET NZ XOR A LD (x.pos+1),A LD A,(x.pos+2) INC A LD (x.pos+2),A CP 12 RET NZ XOR A LD (x.pos+2),A RET keys: ;check for menu keys.. current.menu: LD A,0 LD L,A LD H,0 ADD HL,HL LD DE,menus.code ADD HL,DE LD E,(HL) INC HL LD D,(HL) EX DE,HL JP (HL) menus.code: DEFW mainmenu,update,toilet,yoursay update: LD A,numberofupdate CALL getletter OR A RET Z CP yoursayk JR Z,set.menu4 CP exitupd JR Z,set.menu1 ADD A,numberofmain LD (select+1),A JP ret.to.basic yoursay: LD A,numberofys CALL getletter OR A RET Z CP exitys JR Z,set.menu2 ADD A,numberofmain+numberofupdate+numberoftoilet LD (select+1),A JP ret.to.basic toilet: LD A,numberoftoilet CALL getletter OR A RET Z CP exittoilet JR Z,set.menu1 ADD A,numberofmain+numberofupdate LD (select+1),A JP ret.to.basic mainmenu: LD A,numberofmain CALL getletter OR A ;0= no key pressed... RET Z CP updatek JR Z,set.menu2 CP toiletk JR Z,set.menu3 LD (select+1),A JP ret.to.basic ;Some keys just select another menu, as below... ;----------------------------------------------- set.menu2: LD A,1 LD (current.menu+1),A LD HL,menu2 JR set.menu set.menu4: LD A,3 LD (current.menu+1),A LD HL,menu4 JR set.menu set.menu1: XOR A LD (current.menu+1),A LD HL,menu1 JR set.menu set.menu3: LD A,2 LD (current.menu+1),A LD HL,menu3 set.menu: LD (text.data+1),HL LD BC,408 LD (update.box+1),BC XOR A LD (x.pos+1),A LD (x.pos+2),A RET ;Get key press getletter: LD B,A letter.flag: LD D,0 XOR A IN A,(&FE) CPL AND 31 OR A JR Z,not.pressed LD D,1 LD A,(letter.flag+1) CP D JR Z,exit.key LD A,1 LD (letter.flag+1),A LD HL,letter.table EX AF,AF' XOR A EX AF,AF' read.port: PUSH BC LD B,(HL) INC HL LD C,&FE IN A,(C) LD C,(HL) INC HL CPL AND C EX AF,AF' INC A EX AF,AF' OR A JR NZ,key.found POP BC DJNZ read.port XOR A not.pressed: LD (letter.flag+1),A exit.key: XOR A RET key.found: POP BC EX AF,AF' PUSH AF EX AF,AF' POP AF RET letter.table: DEFB &FD,1 DEFB &7F,16 DEFB &FE,8 DEFB &FD,4 DEFB &FB,4 DEFB &FD,8 DEFB &FD,16 DEFB &BF,16 DEFB &DF,4 DEFB &BF,8 DEFB &BF,4 DEFB &BF,2 message: DEFM " " DEFM " " DEFM " LET ME WELCOME YOU TO THE DELIGHTS OF" DEFM " ISSUE 5 OF SCPDU IF THIS ISSUE WERE " DEFM "2000 YEARS OLD IT WOULD EASILY BE ONE " DEFM "OF THE SEVEN WONDERS OF THE WORLD BUT I " DEFM "SUPPOSE I'LL HAVE TO SETTLE WITH AN SCPDSA" DEFM " AWARD WINNER (DO THEY STILL EXIST?) " DEFM " CREDITS FOR THIS MENU GO TO: COOKIE " DEFM " FOR THE CODING AND FONT GFX " DEFM " " DEFM "MIKE AJ ETRACKER MODULE (AIN'T IT GO" DEFM "OD?) " DEFM " AND OF COURSE TIMOTHY C" DEFM "LAGUE FOR PRODUCING ONCE AGAIN A SUP" DEFM "ERB MENU SCREEN (HE APOLOGISES FOR THE DIS" DEFM "APPEARANCE DURING ISSUE 4 BUT HAVE YOU TRI" DEFM "ED DOING ARTWORK ON A COUPE USING VEEGAN " DEFM "MIND CONTROL (IE HE WAS ON HOLIDAY IN AM" DEFM "ERICA " DEFM "CREDITS FOR THIS ISH GO TO " DEFM "STEPHEN WILSON " DEFM " THANKS FOR THE MASSIVE ARTICLE " DEFM "- " DEFM "I MANAGED TO MERGE IT!!!! THANKS" DEFM " ALSO FOR THE FONT-SCREENS COULD " DEFM "I HAVE SOME MORE? ALSO I HAVE NOTH" DEFM "ING TO DO WITH WHAT COOKIE WROTE ABOUT YOU" DEFM " " DEFM "IN ENTRO 2 (TRY PRESSING SPACE WHEN IN ENT" DEFM "RO 2 AND THEN RESETTING AFTER YOU HAVE HAD" DEFM " ENOUGH!!!) " DEFM "IAN SLAVIN (AXE) THANKS FOR P." DEFM "E.T.P.W. (IT'S GREAT!!) THE NEW" DEFM "S FLASH PROGGY AND FOR THE REV" DEFM "IEWS AND BOB'S BITZ MENUS!! " DEFM "MIKE AJ THANKS FOR THE AMIGA IFF" DEFM " CONVERTOR THE MODE 5 PROGGY " DEFM " AND THE 256 COLOUR SCREEN " DEFM " " DEFM "TIME FOR SOME GREETZ.......A BIG SMACKING " DEFM "HELLO GOES TO COOKIE AND HIS FELLOW FRIEND" DEFM " NICAM PLUS THE REST OF THE ENTROPY GANG " DEFM "HELLO'S ALSO GO TO AXE (P.C.T.P.W - ISSUE " DEFM "6?) NIEL McLEAN COOKIE SAYS TAKE" DEFM " NOTE OF THE RE-STRUCTURING AND USE IT WIT" DEFM "H YOUR FORTHCOMING DEMOS (PEOPLE HAVE GOT " DEFM "512 K SAM'S YOU KNOW!!) TIM CLAGUE " DEFM "HOW DA HOLIDAY GO? COME BACK RARING TO GO " DEFM "I HOPE (I NEED GFX FOR ISSUE 6) " DEFM "MARTIN WILSON THANKS FOR THE ARTICLES" DEFM " (AGAIN!) I'VE GOT YOUR PRINTER INTERFACE" DEFM " RING ME OR ETC! SAM SMITH THANKS " DEFM "FOR THE WRITE UP THINGY (MORE OF THE SAME " DEFM "BUT ON A DIFFERENT TOPIC BUT POSSIBLY LONG" DEFM "ER?) " DEFM " PUBLIC WARNING >>>>>>>>>> " DEFM " " DEFM "PLEASE NOTE THAT IF THE MENU RUNS FOR MORE" DEFM " THAN APPROXIMATELY TEN MINUTES" DEFM " IT WILL HANG UP. THIS IS DUE TO A BUG " DEFM "IN OUR VERSION OF THE E-TRACKER COMPILER " DEFM " WE APOLOGISE FOR THIS INCONVENIENCE" DEFM " " DEFM " WRAPPING THE WORD WRAP........" DEFM ".........................................." DEFM ".........................................." DEFM ".........................................." DEFM " " DEFB 255 ORG &C000 DUMP 2,0 MDAT "music" ;Fader routine 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,10 fadeoutfly: IN A,(&F9) BIT 3,A JP NZ,fadeoutfly 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,10 fadeinfly: IN A,(&F9) BIT 3,A JP NZ,fadeinfly 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 menupalette: DEFB 0,8,7,15,112,120,119,127 DEFB 0,8,7,15,112,120,119,127 here: EQU $ ;Area which has to be put in screen page by LDIR at start of code ORG &6000 DUMP here copy.screen: LD (sp.st1+1),SP LD SP,&8000 IN A,(&FB) PUSH AF ADD A,2 OUT (&FB),A LD HL,&8000 LD DE,&0000 LD BC,&6000 LDIR POP AF OUT (&FB),A sp.st1: LD SP,&0000 RET copy.len: EQU $-copy.screen ORG 0 DUMP 3,0 MDAT "ISSUE5D"