; --------------------------------------------------------------------------- ; --------------------------------------------------------------------------- ; --- Menu Driven Mega Cart Menu (v1.5) --- ; --------------------------------------------------------------------------- ; --- --- ; --- This is an attempt to make a 4k ROM that can be used as menu for --- ; --- the 'Menu Driven Mega Cart' designed by: Edwin Blink --- ; --- --- ; --- The aim was not only to create a menu that can fit in a 4k bank, --- ; --- but also allow the selection of as many titles as possible. --- ; --- This version has the possibility to select up to 230 titles of up --- ; --- to 13 characters. The Titles are stored as byte arrays inside --- ; --- the ROM, Making the menu easily adaptable. --- ; --- --- ; --- For testing purposes you can run it on 'Stella 4.1' and up. --- ; --- --- ; --- Sadly, the menu is not pretty nor perfect... if you swap pages to --- ; --- the beginning or the end then it will just select the first or --- ; --- last title. This is not a terrible error but it is not a perfect --- ; --- user interface. At this point I'm too lazy to fix this, but there --- ; --- is nothing that keeps someone else from fixing it! --- ; --- --- ; --------------------------------------------------------------------------- ; --------------------------------------------------------------------------- ; ; Disclaimer: ; --------------- ; Use and adapt at will, but if used and released as sourcecode then ; please give credit somewhere inside the code. ; ; I can not guarantee that this code will not damage your PC, Atari, ; brain or anything else that it comes in contact with. But it's ; very unlikely that this will happen. ; ; --------------------------------------------------------------------------- ; --------------------------------------------------------------------------- ; ; Very short summery of what happens: ; --------------------------------------- ; +--------------------------------------------------------------------+ ; | Each character consists of 4 pixels (3 pixels + 1 pixel of space). | ; | So 1 sprite(1 byte) can contain 2 characters. | ; +--------------------------------------------------------------------+ ; ; - Check controls and change some bytes that control the menu titles ; according the user input ; ; - Build sprite data; ; - Left and right character are being read from the string ; - Left and right graphics are being looked up for the characters ; from 2 different tables(for speed) ; - Lower and higher 4 bits are being combined with a simple 'OR' ; - Sprite data is being stored in memory ; - Repeat this for 6 sprites and 5 lines ; ; - Draw 5 lines of 6 sprites using the data from memory ; ; - Repeat the previous 2 steps for a total of 8 titles ; ; --------------------------------------------------------------------------- ; --------------------------------------------------------------------------- ; ; Thanks: ; ----------- ; - Stephen Anthony of Stella, he was so kind to offer implementing ; the MDMC bank-switching so testing with Stella could be done. ; ; - Edwin Blink for his work on the 'Menu Driven Mega Cart'. ; ; - Alex_79 for helping to imprve the code. ; ; - Not to go the mellow way or anything, but thank you scene. I'm ; one of those silent users who hardly ever posts. But I assure ; you, we do read and appreciate the things other people post. ; ; --------------------------------------------------------------------------- ; --------------------------------------------------------------------------- ; ; Change log: ; ------------- ; V2.2 ) by DrWho198 ; ; - Some games crashed because the registers were no reset, now the ; registers are reset after a bankswitch. ; ; V2.1 ) by Alex_79: ; ; - Slighty changed input detection so that GameSelect routine is ; called only when the firebutton is released. ; ; - Added PAL option in settings. ; ; - Number of menu lines is automatically set depending on number ; of titles and TV format. ; ; V2.0 ) by DrWho198 ; ; - Started again from scratch, this menu has not much in common with ; previous versions. Please read the details in the source. ; processor 6502 include "vcs.h" include "macro.h" SEG.U vars ORG $80 var1 ds 1 ; Memory locations for sprite data chara = $80 charb = $85 charc = $8a chard = $8f chare = $94 charf = $99 charg = $9e chars = $a2 textPtr = $c0 ; This is a pointer that points to the location of the next text that needs to be drawn savesp = $c1 ; Used for backuping the stack pointer TitleStrLoc = $c2 ; This is a 16bit value that contains a pointer to the byte string of the title of the top most title on screen TitleStrLocBak = TitleStrLoc +2 ; This is a 16bit value that contains a backup of TitleStrLoc LineCounter = TitleStrLoc +4 ; Variable to be used in a loop while drawing titles SelectedTitle = LineCounter +1 ; Actual title that is selected (if you see title 10 to 17 and Title 13 is selected then this is 13) SelectedLine = LineCounter +2 ; Nr of the line selected on screen (if you see title 10 to 17 and Title 13 is selected then this is 3) TopTitle = LineCounter +3 ; The Nr of the first title on the screen (if you see title 10 to 17 then this is 10) FrameCounter = LineCounter +4 ; This increases every frame and wraps back to 0 after 255 JoyDelay = LineCounter +5 ; This var is used to eliminate double presses when holding a direction for too long TempVar = LineCounter +6 ; Just a temporary var, no specific need TempVar2 = LineCounter +7 ; Just a temporary var, no specific need INPT4_old = LineCounter +8 ;TitleGFX = $B0 ; The start of the sprite data generated during runtime ; --------------------------------------------------------------------------- ; These settings control the looks(colors) of the menu (Change This) ; --------------------------------------------------------------------------- ColorTitle = $A4 TFX0 = 8 TFX1 = 6 TFX2 = 4 TFX3 = 2 TFX4 = 0 ; Another example ;TFX0 = 0 ;TFX1 = 2 ;TFX2 = 4 ;TFX3 = 6 ;TFX4 = 8 ColorHighlight = $46 HFX0 = 4 HFX1 = 8 HFX2 = 6 HFX3 = 2 HFX4 = 0 ; Another example ;HFX0 = 0 ;HFX1 = 2 ;HFX2 = 4 ;HFX3 = 6 ;HFX4 = 8 ColorBG = $00 ColorPF = $00 ColorHeader = $06 IF PAL IF NrTitles > 14 NrLines = 14 ELSE NrLines = NrTitles ENDIF ELSE IF NrTitles > 12 NrLines = 12 ELSE NrLines = NrTitles ENDIF ENDIF ; if you have less than 12 titles then this should be set ; to the number of titles Playfield1 = %11111111 Playfield2 = %00000000 ; Some other examples ;Playfield1 = %10110111 ;Playfield2 = %00000000 ;Playfield1 = %00111111 ;Playfield2 = %00000000 ;Playfield1 = %11111111 ;Playfield2 = %11000000 ; --------------------------------------------------------------------------- ; These settings control the behaviour of the menu (Change This) ; --------------------------------------------------------------------------- FirstTitleBank = 1 ; Indicates the real BankNr of the first bank in the menu. ; When setting this to 4, the menu will load the 5th bank ; when selecting the first title. ; By default this would be 1 if bank 0 contains a menu, ; or 2 if bank 0 would contain a safety net and 1 the menu. NrTitles = 15 ; The actual number of menu items, currently a range of 8 to 230, ; But since bank 128 to 255 are mirrors of 0-127, this number of ; Entries/Titles will not be needed. PAL = 0 ; 1 = PAL 0 = NTSC ; --------------------------------------------------------------------------- ; --------------------------------------------------------------------------- ; --- Some Macro's that are used in the code --- ; --------------------------------------------------------------------------- ; --------------------------------------------------------------------------- ; SLEEP is a standard cycle wasting macro, but not optimized for size! ; --------------------------------------------------------------------------- MAC SLEEP IF {1} = 1 ECHO "ERROR: SLEEP 1 not allowed !" END ENDIF IF {1} & 1 nop $00 ; 3 REPEAT ({1}-3)/2 nop REPEND ; 2 ELSE REPEAT ({1})/2 nop ; 2 REPEND ENDIF ENDM ; Code that plots out 1 scanline of text ; --------------------------------------------------------------------------- MAC TEXTDISP lda charg+{1} ;3 sta ENAM0 ;3 lsr ;2 sta ENAM1 ;3 lsr ;2 sta ENABL ;3 lda charf+{1} ;3 sta GRP0 ;3 lda chare+{1} ;3 sta.w GRP1 ;4 ldx #ColorTitle+{2} ;2 nop ;2 nop ;2 stx COLUP0 ;3 stx COLUP1 ;3 lda chard+{1} ;3 sta GRP0 ;3 lda charc+{1} ;3 ldy charb+{1} ;3 stx COLUPF ;3 ldx chara+{1} ;3 sta GRP1 ;3 sty GRP0 ;3 stx GRP1 ;3 sta GRP0 ;3 lda #ColorPF ;2 sta COLUPF ;3 ENDM ; similar to TEXTDISP but for a seleected line ; --------------------------------------------------------------------------- MAC TEXTDISPSEL lda charg+{1} ;3 sta ENAM0 ;3 lsr ;2 sta ENAM1 ;3 lsr ;2 sta ENABL ;3 lda charf+{1} ;3 sta GRP0 ;3 lda chare+{1} ;3 sta.w GRP1 ;4 ldx #ColorHighlight+{2} ;2 stx.w COLUPF ;4 stx COLUP0 ;3 stx COLUP1 ;3 lda chard+{1} ;3 sta GRP0 ;3 lda charc+{1} ;3 ldy charb+{1} ;3 stx COLUPF ;3 ldx chara+{1} ;3 sta GRP1 ;3 sty GRP0 ;3 stx GRP1 ;3 sta GRP0 ;3 nop $00 ;3 nop ;2 ENDM ; similar to TEXTDISP with some small changes for the header image ; --------------------------------------------------------------------------- MAC HDRDISP lda $80+{1}*7 ;3 sta ENAM0 ;3 lsr ;2 sta ENAM1 ;3 lsr ;2 sta ENABL ;3 lda $81+{1}*7 ;3 sta GRP0 ;3 lda $82+{1}*7 ;3 sta.w GRP1 ;4 ldx #ColorHeader+{2} ;2 nop ;2 nop ;2 stx COLUP0 ;3 stx COLUP1 ;3 lda $83+{1}*7 ;3 sta GRP0 ;3 lda $84+{1}*7 ;3 ldy $85+{1}*7 ;3 stx COLUPF ;3 ldx $86+{1}*7 ;3 sta GRP1 ;3 sty GRP0 ;3 stx GRP1 ;3 sta GRP0 ;3 lda #ColorPF ;2 sta COLUPF ;3 ENDM ; experimental macro to convert ascii to title data ; --------------------------------------------------------------------------- MAC PutChar ASCIIBT SET {1} INV SET 1 IF [ASCIIBT>=48]&&[ASCIIBT<=57] ; Numbers .byte (ASCIIBT-48)*5+Ch0 INV SET 0 ENDIF IF [ASCIIBT>=65]&&[ASCIIBT<=90] ; A-Z .byte (ASCIIBT-65)*5+ChA INV SET 0 ENDIF IF [ASCIIBT>=97]&&[ASCIIBT<=122] ; a-z .byte (ASCIIBT-97)*5+ChA INV SET 0 ENDIF IF [ASCIIBT==46] ; Dot .byte CDt INV SET 0 ENDIF IF [ASCIIBT==45] ; Minus .byte CMn INV SET 0 ENDIF IF [ASCIIBT==39]||[ASCIIBT==96] ; Single Quote .byte CSQ INV SET 0 ENDIF IF [ASCIIBT==40]||[ASCIIBT==91] ; Opening Parenthesis .byte COP INV SET 0 ENDIF IF [ASCIIBT==41]||[ASCIIBT==93] ; Closing Parenthesis .byte CCP INV SET 0 ENDIF IF [ASCIIBT==42] ; Asterisk .byte CAs INV SET 0 ENDIF IF [INV==1] ; Space or unknown .byte Spc ENDIF ENDM MAC Put4Char BYTESTRA SET {1} CHAR4 SET BYTESTRA&$FF BYTESTRA SET BYTESTRA-(BYTESTRA&$FF) BYTESTRA SET BYTESTRA/256 CHAR3 SET BYTESTRA&$FF BYTESTRA SET BYTESTRA-(BYTESTRA&$FF) BYTESTRA SET BYTESTRA/256 CHAR2 SET BYTESTRA&$FF BYTESTRA SET BYTESTRA-(BYTESTRA&$FF) BYTESTRA SET BYTESTRA/256 CHAR1 SET BYTESTRA&$FF PutChar CHAR1 PutChar CHAR2 PutChar CHAR3 PutChar CHAR4 ENDM MAC PutTitle Put4Char {1} Put4Char {2} Put4Char {3} PutChar {4}&$FF ENDM ;---------------------------------------------------------------------------- IF PAL VBLANK_TMR = 44 OVSCAN_TMR = 33 DISPLAY_TMR = 19 ELSE VBLANK_TMR = 44 OVSCAN_TMR = 35 DISPLAY_TMR = 15 ENDIF ; --------------------------------------------------------------------------- ; --------------------------------------------------------------------------- ; --- --- ; --- The actual Code starts here --- ; --- --- ; --------------------------------------------------------------------------- ; --------------------------------------------------------------------------- SEG code ORG $F000 Reset ; --------------------------------------------------------------------------- ; Clear RAM and all TIA registers ; --------------------------------------------------------------------------- Start sei cld ldx #$FF txs lda #0 clear sta 0,x dex bne clear ; --------------------------------------------------------------------------- ; Once-only initialisation... ; --------------------------------------------------------------------------- LDA #%00000001 STA CTRLPF ; reflect playfield ; Setting the memory possition of the first title LDA #TitleStrings STA TitleStrLocBak+$1 ;--------------------------------------------------------------------------- ; Initialize variables / registers ;--------------------------------------------------------------------------- lda #$48 sta COLUP0 lda #$99 sta COLUP1 lda #Playfield1 sta PF1 lda #Playfield2 sta PF0 lda #0 ; PF2 is the middle of the screen, this is where sta PF2 ; the titles are drawn so it should be clear. lda #%00000101 sta WSYNC sta CTRLPF sta GRP0 sta GRP1 lda #$03 ; set both players to 3 copies sta NUSIZ0 sta NUSIZ1 lda #$01 ; set vertical delay on for both players sta VDELP0 sta $2d ; nop... I'm not sure anymore but i think it was to waste 3 cycles sta RESM0 sta RESM1 sta VDELP1 sta RESBL sta RESP0 sta RESP1 lda #%11110000 sta HMP1 lda #%11100000 sta HMP0 lda #%10000000 sta HMBL lda #%10110000 sta HMM0 lda #%01010000 sta HMM1 lda #$80 sta INPT4_old sta WSYNC sta HMOVE ;-------------------------------------------------------------------------- ; GameLoop ;-------------------------------------------------------------------------- GameLoop jsr VSync ; start vertical retrace jsr VBlank ; spare time during screen blank jsr VisibleArea ; draw one screen jsr overscan ; do overscan jmp GameLoop ;back to top ;-------------------------------------------------------------------------- ; VSync ;-------------------------------------------------------------------------- VSync lda #2 ;bit 1 needs to be 1 to start retrace sta WSYNC sta VSYNC ;start retrace sta WSYNC ;wait a few lines sta WSYNC lda #VBLANK_TMR ;prepare timer to exit blank period (44) sta TIM64T ;turn it on sta WSYNC ;wait one more sta VSYNC ;done with retrace, write 0 to bit 1 rts ; VSync ;-------------------------------------------------------------------------- ; VBlank ;-------------------------------------------------------------------------- ; Game Logic ;-------------------------------------------------------------------------- VBlank jsr UserInput rts ; VBlank ;-------------------------------------------------------------------------- ; Overscan ;-------------------------------------------------------------------------- ; More Game Logic ;-------------------------------------------------------------------------- overscan sta WSYNC ;lda #$00 lda #ColorBG sta COLUBK lda #OVSCAN_TMR ; Use the timer to make sure overscan takes (34) sta TIM64T ; 30 scan lines. 29 scan lines * 76 = 2204 / 64 = 34.4 jsr CheckFireButton endOS lda INTIM ; We finished, but wait for timer bne endOS ; by looping till zero sta WSYNC ; End last scanline lda #$82 sta VBLANK lda #$02 sta VBLANK rts ; overscan ;-------------------------------------------------------------------------- ; Draw visible are of a frame ;-------------------------------------------------------------------------- ; ;-------------------------------------------------------------------------- VisibleArea vbLoop lda INTIM ;check timer for end of VBLANK period bne vbLoop ;loop until it reaches 0 sta WSYNC lda #$80 sta VBLANK ;end screen blank lda #DISPLAY_TMR ; lda #15 ; JTZ: NTSC ; lda #19 ; JTZ: PAL sta T1024T ; Set playfield color lda #ColorPF sta COLUPF lda #0 sta textPtr tsx ; Make a backup of the stack pointer stx savesp ; jmp DrawHeader ; Draw the header image DoneHeader ; This label is to be able to jump out of the Header loop ;SLEEP 46 jmp DrawTitles ; Draw all the lines quitTextLoop ; put this here so we can jump out of the main text loop ; using a 2-cycle relative branch. lda #0 ; now hide everything sta GRP0 ; sta GRP1 ; ;sta GRP0 ; I don't know why I cleared GPR twice... I think it was an error ;sta GRP1 ; Remove if no problems arrise sta ENAM0 ; sta ENAM1 ; sta ENABL ; ; restore stack pointer ldx savesp txs DEBUG0 .waitBottom lda INTIM ; JTZ bne .waitBottom IF !PAL ldx #4 ; 11 ; JTZ: fine tuning to 262 scan lines, only for NTSC ScanLoop sta WSYNC dex bne ScanLoop ENDIF sta COLUPF rts ; Picture ;------------------------------------------------------------------ ; --------------------------------------------------------------------------- ; --------------------------------------------------------------------------- ; --- --- ; --- Subroutines --- ; --- --- ; --------------------------------------------------------------------------- ; --------------------------------------------------------------------------- ; -------------------------------- SUBROUTINE ------------------------------- ; Draw Title ; --------------------------------------------------------------------------- DrawTitles lda #$00 sta LineCounter mainTextLoop ; set up the stack for building screen data ldx #chars ;2 txs ;2 ; load the first text character ; note: x and y are reversed! ldy textPtr ;3 ; Char Pos in string lda (TitleStrLocBak),y ; tax iny ;2 ; build screen data for first character lda CharSprRight,x ;4 pha ;3 lda CharSprRight+1,x ;4 pha ;3 lda CharSprRight+2,x ;4 pha ;3 lda CharSprRight+3,x ;4 pha ;3 lda CharSprRight+4,x ;4 pha ;3 ; loop through the remaining 6 character pairs textLineLoop ; load the next two text characters ;ldx text,y ;4 lda (TitleStrLocBak),y ; tax iny ;lda text1,y ;4 lda (TitleStrLocBak),y ; iny ;2 sty textPtr ;3 tay ;2 ; build screen data for next two characters lda CharSprLeft,x ;4 ora CharSprRight,y ;4 pha ;3 lda CharSprLeft+1,x ;4 ora CharSprRight+1,y ;4 pha ;3 lda CharSprLeft+2,x ;4 ora CharSprRight+2,y ;4 pha ;3 lda CharSprLeft+3,x ;4 ora CharSprRight+3,y ;4 pha ;3 lda CharSprLeft+4,x ;4 ora CharSprRight+4,y ;4 pha ;3 ; next character pair ldy textPtr ;3 tsx ;2 bmi textLineLoop ;2 sta WSYNC sleep 45 ; now render it asap lda LineCounter ;3 cmp SelectedLine ;3 bne JumpNotSel ;2/3 JMP Selected ;3 JumpNotSel: JMP NotSelected ;3 Selected: nop $00 ;3 TEXTDISPSEL 0, HFX0 TEXTDISPSEL 1, HFX1 TEXTDISPSEL 2, HFX2 TEXTDISPSEL 3, HFX3 TEXTDISPSEL 4, HFX4 JMP continue ;3 NotSelected: nop ;2 TEXTDISP 0, TFX0 TEXTDISP 1, TFX1 TEXTDISP 2, TFX2 TEXTDISP 3, TFX3 TEXTDISP 4, TFX4 nop $00 ;3 continue: lda #ColorBG ;2 sta COLUP0 ;3 sta COLUP1 ;3 inc LineCounter sta.w ENABL ;4 .w = use up one extra cycle left over! lda #ColorPF sta COLUPF ;3 lda LineCounter cmp #NrLines beq NoMoreText jmp mainTextLoop ;3 NoMoreText jmp quitTextLoop ; --------------------------------------------------------------------------- ; --------------------------------------------------------------------------- ; Draw the header of the menu ; --------------------------------------------------------------------------- DrawHeader: ; set up the stack for building screen data ldx #$80+(7*8)-1 ;2 txs ;2 ; copy the sprite data for the header ldx #(7*8) CpyHdrData: lda HeaderData-1,x pha dex bne CpyHdrData sleep 38 ; now render it asap HDRDISP 0,2 ; Args: LineNr, Color brightness HDRDISP 1,6 HDRDISP 2,8 HDRDISP 3,6 HDRDISP 4,6 HDRDISP 5,4 HDRDISP 6,2 HDRDISP 7,0 lda #0 ;2 sta COLUP0 ;3 sta COLUP1 ;3 sta.w ENABL ;4 .w = use up one extra cycle left over! sta WSYNC lda #255 sta PF2 lda #ColorHeader+2 sta COLUPF sta WSYNC lda #ColorPF sta COLUPF lda #0 sta PF2 JMP DoneHeader ; --------------------------------------------------------------------------- ; --------------------------------------------------------------------------- ; Checking the controls during vblank ; --------------------------------------------------------------------------- ; After a control was acted upon, JoyDelay variable is counted down to ; avoid unwanted controls UserInput LDA JoyDelay BEQ CheckControls DEC JoyDelay RTS CheckControls ; ---------------------------- ; Checking the P1 Up direction ; ---------------------------- LDA #%00010000 ; This is a mask to check the P1 up direction BIT SWCHA ; BNE SkipMoveUP ; If not pressed skip LDA #0 ; CMP SelectedTitle ; Check if the selected title is the first one BEQ SkipMoveUP ; If so, skip moving Up LDA #8 ; Set the Joystick delay to 8 STA JoyDelay ; This will cause the ignoring of user input for 8 frames DEC SelectedTitle ; Select the previous title LDA #0 ; CMP SelectedLine ; Check if the selected line was the top line BEQ MovePageUP ; If so, go to Page Up DEC SelectedLine ; If not, select the line above JMP SkipMoveUP ; MovePageUP ; 16bit decrement of the Title pointer, subtracting 12 fom it (12 chars) SEC ; LDA TitleStrLocBak ; SBC #13 ; STA TitleStrLocBak ; BCS MUNoOverflow ; DEC TitleStrLocBak+$1 ; MUNoOverflow DEC TopTitle ; Decrease the topline SkipMoveUP ; ------------------------------ ; Checking the P1 Down direction ; ------------------------------ LDA #%00100000 ; This is a mask to check the P1 Down direction BIT SWCHA ; BNE SkipMoveDown ; If not pressed skip LDA #NrTitles -1 ; CMP SelectedTitle ; Check if the selected title is the last one BEQ SkipMoveDown ; If so, skip moving down LDA #8 ; Set the Joystick delay to 8 STA JoyDelay ; This will cause the ignoring of user input for 8 frames INC SelectedTitle ; Select the next title LDA #NrLines -1 ; CMP SelectedLine ; Check if the selected line was the bottom line BEQ MovePageDown ; If so, go to Page Down INC SelectedLine ; If not, select the line below JMP SkipMoveDown ; MovePageDown ; 16bit increment of the Title pointer, adding 12 to it (12 chars) CLC ; LDA TitleStrLocBak ; ADC #13 ; STA TitleStrLocBak ; BCC MDNoOverflow ; INC TitleStrLocBak+$1 ; MDNoOverflow INC TopTitle ; Decrease the topline SkipMoveDown ; ------------------------------- ; Checking the P1 Right direction ; ------------------------------- LDA #%10000000 ; This is a mask to check the P1 Right direction BIT SWCHA ; BNE SkipMoveRight ; If not pressed skip LDA #8 ; Set the Joystick delay to 8 STA JoyDelay ; This will cause the ignoring of user input for 8 frames ; Check if moving right could make the menu jump past the end of the list LDA #NrTitles-NrLines*2 ; CMP TopTitle ; If the top title is less then 2 pages from the end of the list, then move to the end of the list MAC IF NrTitles > ((NrLines*2)-1) BCC MoveEnd ELSE JMP MoveEnd ENDIF ENDM ; Do a 8 bit addition: Raise the selected title by 8 CLC LDA SelectedTitle ADC #NrLines STA SelectedTitle ; Do a 16 bit addition: Raise the top title string location by 96 (8*12) ;CLC ; unneeded since it should never cross the boundary in the previous addition LDA TitleStrLocBak ADC #NrLines*13 STA TitleStrLocBak BCC MRNoOverflow ; If I don't cross the byte boundary then I don't need to add 1 to the most significant byte INC TitleStrLocBak+$1 ; I passed the upper byte boundary, raise the most significant byte by 1 MRNoOverflow CLC LDA TopTitle ; ADC #NrLines ; Lower the top line title by 8 STA TopTitle ; JMP SkipMoveRight MoveEnd ; Move to the end of the list LDA #NrLines-1 STA SelectedLine LDA #(NrTitles-1) STA SelectedTitle LDA #(NrTitles-NrLines) STA TopTitle LDA #LastTitlePage STA TitleStrLocBak+$1 SkipMoveRight ; ------------------------------ ; Checking the P1 Left direction ; ------------------------------ LDA #%01000000 ; This is a mask to check the P1 Left direction BIT SWCHA ; BNE SkipMoveLeft ; If not pressed skip LDA #8 ; Set the Joystick delay to 8 STA JoyDelay ; This will cause the ignoring of user input for 8 frames LDA #NrLines-1 ; CMP TopTitle ; If the top title is 7 or less then move home BCS MoveTop ; Do a 8 bit subtraction: Lower the selected title by 8 SEC LDA SelectedTitle SBC #NrLines STA SelectedTitle ; Do a 16 bit subtraction: Lower the top title string location by 96 (8*12) ;SEC ; unneeded since it should never cross the boundary in the previous subtraction LDA TitleStrLocBak SBC #NrLines*13 STA TitleStrLocBak BCS MLNoOverflow ; If I don't cross the byte boundary then I don't need to lend from the most significant byte DEC TitleStrLocBak+$1 ; I passed the 0, lower the most significant byte MLNoOverflow SEC LDA TopTitle ; SBC #NrLines ; Lower the top line title by 8 STA TopTitle ; JMP SkipMoveLeft MoveTop ; Move to the top of the list LDA #$00 STA SelectedTitle STA SelectedLine STA TopTitle LDA #TitleStrings STA TitleStrLocBak+$1 SkipMoveLeft rts ; --------------------------------------------------------------------------- ; --------------------------------------------------------------------------- ; Checking the Firebutton during overscan ; --------------------------------------------------------------------------- CheckFireButton ; Check For button Press LDA INPT4 tay eor INPT4_old sty INPT4_old bpl SkipButtonPress tya bpl SkipButtonPress JMP GameSelect ; Load the selected Bank/Game SkipButtonPress rts ; --------------------------------------------------------------------------- ; --------------------------------------------------------------------------- ; --------------------------------------------------------------------------- ; --- --- ; --- Lookup tables and GFX data --- ; --- --- ; --------------------------------------------------------------------------- ; --------------------------------------------------------------------------- ; --------------------------------------------------------------------------- ; Table of bank titles written in ASCII (13 chars each) ; --------------------------------------------------------------------------- TitleStrings ; For now the allowed characters are: 0-9 A-Z a-z . - ' ( ) * ; ; The first 10 lines use the new macro, sadly it only allows for strings ; of 4 characters to be send. So titles are split in the middle ; ; The other sample titles use the old format, but they can be replaced ; with macro lines ; PutTitle "FROG", "GER ", " ", " " PutTitle "INVA", "DERS", " ", " " PutTitle "Keys", "tone", " Kap", "." PutTitle "PAC-", "MAN ", " ", " " PutTitle "PEEK", "-A-B", "OO ", " " PutTitle "PELE", "'S S", "OCCE", "R" PutTitle "POOY", "AN ", " ", " " PutTitle "Q.BE", "RT ", " ", " " PutTitle "SPAC", "E IN", "VADE", "R" PutTitle "STAR", " WAR", "S ", " " PutTitle "BREA", "KOUT", " ", " " PutTitle "V.PI", "NBAL", "L ", " " PutTitle "MOUS", "E TR", "AP ", " " PutTitle "WIZZ", "ARD'", "O'WO", "R" PutTitle "CRAC", "KPOT", "S ", " " ; PutTitle " -*(", "Firs", "t)*-", " " ; PutTitle "....", "....", "....", "1" ; PutTitle "Titl", "e 00", "0000", "2" ; PutTitle "Titl", "e 00", "0000", "3" ; PutTitle "Titl", "e 00", "0000", "4" ; PutTitle "Titl", "e 00", "0000", "5" ; PutTitle "Titl", "e 00", "0000", "6" ; PutTitle "Titl", "e 00", "0000", "7" ; PutTitle "Titl", "e 00", "0000", "8" ; PutTitle "Titl", "e 00", "0000", "9" ; ; .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch1 ,Ch0 ; .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch1 ,Ch1 ; .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch1 ,Ch2 ; .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch1 ,Ch3 ; .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch1 ,Ch4 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch1 ,Ch5 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch1 ,Ch6 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch1 ,Ch7 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch1 ,Ch8 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch1 ,Ch9 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch2 ,Ch0 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch2 ,Ch1 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch2 ,Ch2 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch2 ,Ch3 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch2 ,Ch4 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch2 ,Ch5 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch2 ,Ch6 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch2 ,Ch7 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch2 ,Ch8 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch2 ,Ch9 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch3 ,Ch0 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch3 ,Ch1 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch3 ,Ch2 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch3 ,Ch3 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch3 ,Ch4 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch3 ,Ch5 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch3 ,Ch6 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch3 ,Ch7 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch3 ,Ch8 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch3 ,Ch9 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0, Ch0, Ch4, Ch0 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch4 ,Ch1 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch4 ,Ch2 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch4 ,Ch3 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch4 ,Ch4 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch4 ,Ch5 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch4 ,Ch6 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch4 ,Ch7 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch4 ,Ch8 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch4 ,Ch9 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0, Ch0, Ch5, Ch0 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch5 ,Ch1 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch5 ,Ch2 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch5 ,Ch3 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch5 ,Ch4 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch5 ,Ch5 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch5 ,Ch6 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch5 ,Ch7 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch5 ,Ch8 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch5 ,Ch9 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch6 ,Ch0 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch6 ,Ch1 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch6 ,Ch2 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch6 ,Ch3 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch6 ,Ch4 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch6 ,Ch5 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch6 ,Ch6 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch6 ,Ch7 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch6 ,Ch8 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch6 ,Ch9 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch7 ,Ch0 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch7 ,Ch1 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch7 ,Ch2 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch7 ,Ch3 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch7 ,Ch4 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch7 ,Ch5 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch7 ,Ch6 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch7 ,Ch7 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch7 ,Ch8 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch7 ,Ch9 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch8 ,Ch0 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch8 ,Ch1 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch8 ,Ch2 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch8 ,Ch3 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch8 ,Ch4 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch8 ,Ch5 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch8 ,Ch6 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch8 ,Ch7 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch8 ,Ch8 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch8 ,Ch9 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0, Ch0, Ch9, Ch0 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch9 ,Ch1 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch9 ,Ch2 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch9 ,Ch3 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch9 ,Ch4 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch9 ,Ch5 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch9 ,Ch6 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch9 ,Ch7 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch9 ,Ch8 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch0 ,Ch9 ,Ch9 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0, Ch1, Ch0, Ch0 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch1 ,Ch0 ,Ch1 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch1 ,Ch0 ,Ch2 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch1 ,Ch0 ,Ch3 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch1 ,Ch0 ,Ch4 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch1 ,Ch0 ,Ch5 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch1 ,Ch0 ,Ch6 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch1 ,Ch0 ,Ch7 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch1 ,Ch0 ,Ch8 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch1 ,Ch0 ,Ch9 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch1 ,Ch1 ,Ch0 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch1 ,Ch1 ,Ch1 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch1 ,Ch1 ,Ch2 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch1 ,Ch1 ,Ch3 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch1 ,Ch1 ,Ch4 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch1 ,Ch1 ,Ch5 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch1 ,Ch1 ,Ch6 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch1 ,Ch1 ,Ch7 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch1 ,Ch1 ,Ch8 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch1 ,Ch1 ,Ch9 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch1 ,Ch2 ,Ch0 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch1 ,Ch2 ,Ch1 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch1 ,Ch2 ,Ch2 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch1 ,Ch2 ,Ch3 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch1 ,Ch2 ,Ch4 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch1 ,Ch2 ,Ch5 .byte ChT, ChI, ChT, ChL, ChE, Spc, Ch0, Ch0, Ch0, Ch0 ,Ch1 ,Ch2 ,Ch6 .byte ChO, ChN, ChE, Spc, ChM, ChO, ChR, ChE, Spc, ChL ,ChI ,ChN ,ChE LastTitlePage EQU TitleStrings+((NrTitles-NrLines)*13) CharRightPage EQU >CharSprRight CharLeftPage EQU >CharSprLeft BankList ; .byte 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ; .byte 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 .byte 128, 129, 130, 131, 132, 133, 134, 135, 136, 137 .byte 138, 139, 140, 141, 142, 15, 16, 17, 18, 19 .byte 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 .byte 30, 31, 32, 33, 34, 35, 36, 37, 38, 39 .byte 40, 41, 42, 43, 44, 45, 46, 47, 48, 49 .byte 50, 51, 52, 53, 54, 55, 56, 57, 58, 59 .byte 60, 61, 62, 63, 64, 65, 66, 67, 68, 69 .byte 70, 71, 72, 73, 74, 75, 76, 77, 78, 79 .byte 80, 81, 82, 83, 84, 85, 86, 87, 88, 89 .byte 90, 91, 92, 93, 94, 95, 96, 97, 98, 99 .byte 100,101,102,103,104,105,106,107,108,109 .byte 110,111,112,113,114,115,116,117,118,119 .byte 120,121,122,123,124,125,126,127 HeaderData .byte #%0000, #%10001011, #%10001000, #%10001100, #%10001000, #%00000000, #%00000000 .byte #%0000, #%11011000, #%01001101, #%10010000, #%11011000, #%00000000, #%00000000 .byte #%0100, #%11011010, #%00101101, #%10100000, #%11011001, #%10111001, #%00100100 .byte #%1110, #%10101010, #%00101010, #%10100000, #%10101010, #%00100101, #%00101110 .byte #%0100, #%10101010, #%00101010, #%10100000, #%10101011, #%10100101, #%00100100 .byte #%0000, #%10001010, #%01001000, #%10010000, #%10001010, #%00100101, #%00100000 .byte #%0000, #%10001011, #%10001000, #%10001100, #%10001001, #%10100100, #%11000000 .byte #%0000, #%00000000, #%00000000, #%00000000, #%00000000, #%00000000, #%00000000 ; ; Note: All sprites are stored upside down ; ORG $FE00 CharSprRight .byte #%00000000 Spc ; Space .byte #%00000000 .byte #%00000000 .byte #%00000000 .byte #%00000000 .byte #%00000000 CDt ; Dot .byte #%00000100 .byte #%00000000 .byte #%00000000 .byte #%00000000 .byte #%00000000 CMn ; Minus .byte #%00000000 .byte #%00000000 .byte #%00001110 .byte #%00000000 .byte #%00000000 CSQ ; Single Quote .byte #%00000000 .byte #%00000000 .byte #%00000000 .byte #%00000100 .byte #%00000100 Ch0 .byte #%00000100 .byte #%00001010 .byte #%00001010 .byte #%00001010 .byte #%00000100 Ch1 .byte #%00001110 .byte #%00000100 .byte #%00000100 .byte #%00001100 .byte #%00000100 Ch2 .byte #%00001110 .byte #%00001000 .byte #%00000100 .byte #%00000010 .byte #%00001100 Ch3 .byte #%00001100 .byte #%00000010 .byte #%00001100 .byte #%00000010 .byte #%00001100 Ch4 .byte #%00000100 .byte #%00001110 .byte #%00001100 .byte #%00001000 .byte #%00001000 Ch5 .byte #%00001100 .byte #%00000010 .byte #%00001100 .byte #%00001000 .byte #%00001110 Ch6 .byte #%00000100 .byte #%00001010 .byte #%00001100 .byte #%00001000 .byte #%00000110 Ch7 .byte #%00001000 .byte #%00001000 .byte #%00000100 .byte #%00000010 .byte #%00001110 Ch8 .byte #%00000100 .byte #%00001010 .byte #%00000100 .byte #%00001010 .byte #%00000100 Ch9 .byte #%00001100 .byte #%00000010 .byte #%00000110 .byte #%00001010 .byte #%00000100 ChA .byte #%00001010 .byte #%00001110 .byte #%00001010 .byte #%00001010 .byte #%00000100 ChB .byte #%00001100 .byte #%00001010 .byte #%00001100 .byte #%00001010 .byte #%00001100 ChC .byte #%00000110 .byte #%00001000 .byte #%00001000 .byte #%00001000 .byte #%00000110 ChD .byte #%00001100 .byte #%00001010 .byte #%00001010 .byte #%00001010 .byte #%00001100 ChE .byte #%00001110 .byte #%00001000 .byte #%00001100 .byte #%00001000 .byte #%00001110 ChF .byte #%00001000 .byte #%00001000 .byte #%00001100 .byte #%00001000 .byte #%00001110 ChG .byte #%00000110 .byte #%00001010 .byte #%00001010 .byte #%00001000 .byte #%00000110 ChH .byte #%00001010 .byte #%00001010 .byte #%00001110 .byte #%00001010 .byte #%00001010 ChI .byte #%00001110 .byte #%00000100 .byte #%00000100 .byte #%00000100 .byte #%00001110 ChJ .byte #%00001100 .byte #%00000010 .byte #%00000010 .byte #%00000010 .byte #%00000110 ChK .byte #%00001010 .byte #%00001010 .byte #%00001100 .byte #%00001010 .byte #%00001010 ChL .byte #%00001110 .byte #%00001000 .byte #%00001000 .byte #%00001000 .byte #%00001000 ChM .byte #%00001010 .byte #%00001010 .byte #%00001010 .byte #%00001110 .byte #%00001010 ChN .byte #%00001010 .byte #%00001010 .byte #%00001010 .byte #%00001010 .byte #%00001100 ChO .byte #%00000100 .byte #%00001010 .byte #%00001010 .byte #%00001010 .byte #%00000100 ChP .byte #%00001000 .byte #%00001100 .byte #%00001010 .byte #%00001010 .byte #%00001100 ChQ .byte #%00000110 .byte #%00001010 .byte #%00001010 .byte #%00001010 .byte #%00000100 ChR .byte #%00001010 .byte #%00001100 .byte #%00001010 .byte #%00001010 .byte #%00001100 ChS .byte #%00001100 .byte #%00000010 .byte #%00000100 .byte #%00001000 .byte #%00000110 ChT .byte #%00000100 .byte #%00000100 .byte #%00000100 .byte #%00000100 .byte #%00001110 ChU .byte #%00000110 .byte #%00001010 .byte #%00001010 .byte #%00001010 .byte #%00001010 ChV .byte #%00000100 .byte #%00001110 .byte #%00001010 .byte #%00001010 .byte #%00001010 ChW .byte #%00001010 .byte #%00001110 .byte #%00001010 .byte #%00001010 .byte #%00001010 ChX .byte #%00001010 .byte #%00001010 .byte #%00000100 .byte #%00001010 .byte #%00001010 ChY .byte #%00001100 .byte #%00000010 .byte #%00000110 .byte #%00001010 .byte #%00001010 ChZ .byte #%00001110 .byte #%00001000 .byte #%00000100 .byte #%00000010 .byte #%00001110 COP ; Opening Parenthesis .byte #%00000010 .byte #%00000100 .byte #%00000100 .byte #%00000100 .byte #%00000010 CCP ; Closing Parenthesis .byte #%00001000 .byte #%00000100 .byte #%00000100 .byte #%00000100 .byte #%00001000 CAs .byte #%00001010 ; Asterisk .byte #%00000100 .byte #%00001110 .byte #%00000100 .byte #%00001010 ; -------------------------------- SUBROUTINE ------------------------------- ; Do MDMC BankSwitch ; --------------------------------------------------------------------------- GameSelect: LDX #17 CopyToMem LDA MDMCBankSwitch-1,X STA $E0-1,X DEX BNE CopyToMem CLC LDX SelectedTitle LDA BankList,X ADC #FirstTitleBank STA $E1 JMP.w $E0 MDMCBankSwitch: LDA $0800 LDX #$FF TXS LDA #$00 TAX TAY JMP ($1FFC) ; --------------------------------------------------------------------------- ORG $FF00 CharSprLeft .byte #%00000000 .byte #%00000000 .byte #%00000000 .byte #%00000000 .byte #%00000000 .byte #%00000000 .byte #%01000000 .byte #%00000000 .byte #%00000000 .byte #%00000000 .byte #%00000000 .byte #%00000000 .byte #%00000000 .byte #%11100000 .byte #%00000000 .byte #%00000000 .byte #%00000000 .byte #%00000000 .byte #%00000000 .byte #%01000000 .byte #%01000000 .byte #%01000000 .byte #%10100000 .byte #%10100000 .byte #%10100000 .byte #%01000000 .byte #%11100000 .byte #%01000000 .byte #%01000000 .byte #%11000000 .byte #%01000000 .byte #%11100000 .byte #%10000000 .byte #%01000000 .byte #%00100000 .byte #%11000000 .byte #%11000000 .byte #%00100000 .byte #%11000000 .byte #%00100000 .byte #%11000000 .byte #%01000000 .byte #%11100000 .byte #%11000000 .byte #%10000000 .byte #%10000000 .byte #%11000000 .byte #%00100000 .byte #%11000000 .byte #%10000000 .byte #%11100000 .byte #%01000000 .byte #%10100000 .byte #%11000000 .byte #%10000000 .byte #%01100000 .byte #%10000000 .byte #%10000000 .byte #%01000000 .byte #%00100000 .byte #%11100000 .byte #%01000000 .byte #%10100000 .byte #%01000000 .byte #%10100000 .byte #%01000000 .byte #%11000000 .byte #%00100000 .byte #%01100000 .byte #%10100000 .byte #%01000000 .byte #%10100000 .byte #%11100000 .byte #%10100000 .byte #%10100000 .byte #%01000000 .byte #%11000000 .byte #%10100000 .byte #%11000000 .byte #%10100000 .byte #%11000000 .byte #%01100000 .byte #%10000000 .byte #%10000000 .byte #%10000000 .byte #%01100000 .byte #%11000000 .byte #%10100000 .byte #%10100000 .byte #%10100000 .byte #%11000000 .byte #%11100000 .byte #%10000000 .byte #%11000000 .byte #%10000000 .byte #%11100000 .byte #%10000000 .byte #%10000000 .byte #%11000000 .byte #%10000000 .byte #%11100000 .byte #%01100000 .byte #%10100000 .byte #%10100000 .byte #%10000000 .byte #%01100000 .byte #%10100000 .byte #%10100000 .byte #%11100000 .byte #%10100000 .byte #%10100000 .byte #%11100000 .byte #%01000000 .byte #%01000000 .byte #%01000000 .byte #%11100000 .byte #%11000000 .byte #%00100000 .byte #%00100000 .byte #%00100000 .byte #%01100000 .byte #%10100000 .byte #%10100000 .byte #%11000000 .byte #%10100000 .byte #%10100000 .byte #%11100000 .byte #%10000000 .byte #%10000000 .byte #%10000000 .byte #%10000000 .byte #%10100000 .byte #%10100000 .byte #%10100000 .byte #%11100000 .byte #%10100000 .byte #%10100000 .byte #%10100000 .byte #%10100000 .byte #%10100000 .byte #%11000000 .byte #%01000000 .byte #%10100000 .byte #%10100000 .byte #%10100000 .byte #%01000000 .byte #%10000000 .byte #%11000000 .byte #%10100000 .byte #%10100000 .byte #%11000000 .byte #%01100000 .byte #%10100000 .byte #%10100000 .byte #%10100000 .byte #%01000000 .byte #%10100000 .byte #%11000000 .byte #%10100000 .byte #%10100000 .byte #%11000000 .byte #%11000000 .byte #%00100000 .byte #%01000000 .byte #%10000000 .byte #%01100000 .byte #%01000000 .byte #%01000000 .byte #%01000000 .byte #%01000000 .byte #%11100000 .byte #%01100000 .byte #%10100000 .byte #%10100000 .byte #%10100000 .byte #%10100000 .byte #%01000000 .byte #%11100000 .byte #%10100000 .byte #%10100000 .byte #%10100000 .byte #%10100000 .byte #%11100000 .byte #%10100000 .byte #%10100000 .byte #%10100000 .byte #%10100000 .byte #%10100000 .byte #%01000000 .byte #%10100000 .byte #%10100000 .byte #%11000000 .byte #%00100000 .byte #%01100000 .byte #%10100000 .byte #%10100000 .byte #%11100000 .byte #%10000000 .byte #%01000000 .byte #%00100000 .byte #%11100000 .byte #%00100000 .byte #%01000000 .byte #%01000000 .byte #%01000000 .byte #%00100000 .byte #%10000000 .byte #%01000000 .byte #%01000000 .byte #%01000000 .byte #%10000000 .byte #%10100000 .byte #%01000000 .byte #%11100000 .byte #%01000000 .byte #%10100000 ORG $FFF5 BankswitchStr .byte "MDMC" ; 'Menu Driven Mega Cart' Banks-witch recognition for Stella ORG $FFF9 ; 'Needed only in case of a reset button HEX 4C ; ----------------------------------------------------------------------------- ORG $FFFA InterruptVectors .word Reset ; NMI .word Reset ; RESET .word Reset ; IRQ END