LIST MACRO INPCTL EQU $01 ; Input port control ; 08=TIA, 04=ext ROM, 02=int RAM, 01=lock INPT0 EQU $08 ; Left controller left column INPT1 EQU $09 ; Left controller middle column INPT2 EQU $0A ; Right controller left column INPT3 EQU $0B ; Right controller middle column INPT4 EQU $0C ; Left controller right column INPT5 EQU $0D ; Right controller right column AUDC0 EQU $15 ; Sound type channel 1 AUDC1 EQU $16 ; Sound type channel 2 AUDF0 EQU $17 ; Sound pitch channel 1 AUDF1 EQU $18 ; Sound pitch channel 2 AUDV0 EQU $19 ; Sound volume channel 1 AUDV1 EQU $1A ; Sound volume channel 2 BCKGRD EQU $20 ; Background color WSYNC EQU $24 ; Wait for sync MSTAT EQU $28 ; Maria status DPPH EQU $2C ; DLL high DPPL EQU $30 ; DLL low CHRBAS EQU $34 ; Character base address OFFSET EQU $38 ; Unused CTRL EQU $3C ; Maria control P4C1 EQU $31 P4C2 EQU $32 P4C3 EQU $33 SWCHA EQU $0280 ; Joysticks/keypads CTLSWA EQU $0281 ; Port A data direction register ; 80=R1, 40=L1, 20=D1, 10=U1, 08=R2, 04=L2, 02=D2, 01=U2 SWCHB EQU $0282 ; Console switches CTLSWB EQU $0283 ; Port B data direction register ; 80=R DIF, 40=L DIF, 20=N/A, 10=LF, 08=PAUSE B/W, 04=RF, 02=SELECT, 01=RESET ORG $80 S28BUF DS 32 TEMP RMB 2 TEMPLO EQU TEMP TEMPHI EQU TEMP+1 BANKLO RMB 1 BANKHI RMB 1 PTRLO RMB 1 PTRHI RMB 1 PAGE RMB 1 NPAGES RMB 1 ADDRLO RMB 1 ADDRHI RMB 1 CHKSUM RMB 1 CHKHI RMB 1 BANKLO2 RMB 1 BANKHI2 RMB 1 PAGE2 RMB 1 RAMSIZE RMB 1 STRTLO RMB 1 ; dump start address STRTHI RMB 1 ENDLO RMB 1 ; dump end address + 1 ENDHI RMB 1 NMIVEC EQU $F4 ORG $E800 ; this point should be less than $F000! ORG $F004 NMIRTS PLA RTI START LDX #0 ; configure port B for input STX CTLSWB LDA SWCHB AND #$08 ; check for pause key BEQ LD5A5 ; JMP $2306 LD5A5 LDA #NMIRTS STA NMIVEC+1 LDA #$02 ; MARIA, int ROM, int RAM, no lock STA INPCTL LDX #0 ; Clear I/O direction registers STX OFFSET STX CTLSWA STX CTLSWB STX OFFSET LDX #$F7 ; Initialize stack pointer below AZ select TXS STX SWCHB ; Initialize joystick mode? LDA #%11101011 ; Turn off DMA STA CTRL LDX #0 ; Black STX BCKGRD ; Put it in background RELO LDA RELADDR,X ; Copy $E800-$EDFF to $2200-$27FF STA RELCODE,X LDA RELADDR+$100,X STA RELCODE+$100,X LDA RELADDR+$200,X STA RELCODE+$200,X LDA RELADDR+$300,X STA RELCODE+$300,X LDA RELADDR+$400,X STA RELCODE+$400,X LDA RELADDR+$500,X STA RELCODE+$500,X ; LDA RELADDR+$600,X ; STA RELCODE+$600,X ; LDA RELADDR+$700,X ; STA RELCODE+$700,X LDA REL2ADR,X ; Copy $E000-$E7FF to $1800-$1FFF STA REL2COD,X LDA REL2ADR+$100,X STA REL2COD+$100,X LDA REL2ADR+$200,X STA REL2COD+$200,X LDA REL2ADR+$300,X STA REL2COD+$300,X LDA REL2ADR+$400,X STA REL2COD+$400,X LDA REL2ADR+$500,X STA REL2COD+$500,X LDA REL2ADR+$600,X STA REL2COD+$600,X LDA REL2ADR+$700,X STA REL2COD+$700,X INX BNE RELO JMP RELCODE ; Jump into the relocated code ; this point should be less than $F400! RELADDR ORG $E800 RORG $2200 ; can't start at $2000 because of page 0 shadow ; Configure joystick port for OUT232 RELCODE LDA #$40 ; configure bit 6 for output STA CTLSWA ; Swap in cartridge ROM LDA #$07 ; MARIA, ext ROM, int RAM, lock ; LDA #$06 ; MARIA, ext ROM, int RAM, no lock STA INPCTL LDA #mTITLE JSR PRTMSG JSR BNKZERO ; set up bank zero ;*** TEST FOR NO CARTRIDGE *** LDA $FFFC AND $FFFD CMP #$FF BNE YESCART LDA #mNOCART JMP HALTMSG ; branch if no cartridge ;*** TEST FOR 7800 CARTRIDGE *** YESCART JSR TST7800 BEQ TESTTV JMP DUMP78 ;*** TEST FOR TIGERVISION *** $E03F WRT 0,1,2,3 TESTTV JSR BANK4K ; set pointers to 4K bank ; LDA #$00 ; STA BANKHI ; LDA #$3F ; STA BANKLO ; ; LDA #3 ; JSR TSTWSEL ; BEQ TST2K ; ;DUMPTV LDA #$F8 ; STA ENDHI ; LDA #mCARTTV ; LDY #4 ; BNE BANKRDt ;*** TEST FOR A 2K CARTRIDGE *** TST2K JSR TEST2K ; is it a 2K cart? BNE TEST4K ;*** DUMP A 2K CARTRIDGE *** DMP2K LDA #m2KCART JMP DMP4Ka ;-----------------------------------------------------------------------; ; TEST FOR BANK SELECTS ;-----------------------------------------------------------------------; ;*** TEST FOR 4K OR PB 8K OR ACTIVISION AZ *** $FFF8/$FFF9 same TEST4K JSR BANK4K ; set pointers back to 4K bank JSR BNKZERO LDA #$FF ; set bank pointers for $FFF8/$FFF9 STA BANKHI STA BANKHI2 LDX #$F8 STX BANKLO INX STX BANKLO2 JSR TSTSEL BEQ TESTPB ; branch if no bank select on $FFF8/$FFF9 ;*** TEST FOR 32K *** $FFF8/$FFFB ($FFF4-$FFFB) LDX #$FB STX BANKLO2 JSR TSTSEL BNE DMP32K ;*** TEST FOR RAM PLUS *** $FFF8/$FFFA ($FFF8/$FFF9/$FFFA) DEC BANKLO2 JSR TSTSEL BNE RAMPLUS ;*** TEST FOR 16K *** $FFF8/$FFF6 and $FFF8/$FFF7 ($FFF6-$FFF9) LDX #$F6 STX BANKLO2 JSR TSTSEL BNE DMP16K INC BANKLO2 JSR TSTSEL BNE DMP16K ;*** DUMP AN 8K CARTRIDGE *** $FFF8/$FFF9 DMP8K JSR SCRAM LDX #$F8 LDY #2 LDA #mCART8K ;*** SET UP FOR READ-ADDRESS BANK SELECT CARTRIDGE DUMP *** ; X = bank low address ; Y = number of banks ; A = identification message BANKRD STX BANKLO BANKRDt STY NPAGES JSR PRTMSG JMP BANKRDa ;*** DUMP A 32K CARTRIDGE DMP32K JSR SCRAM LDX #$F4 LDY #8 LDA #mCART32 BNE BANKRD ;*** DUMP A 16K CARTRIDGE DMP16K JSR SCRAM LDX #$F6 LDY #4 LDA #mCART16 BNE BANKRD ;*** DUMP AN ACTIVISION 8K AZ ($01FE/$11FE) CARTRIDGE *** DUMPAZ LDX #$FE LDY #2 LDA #mCARTAZ BNE BANKRD ;*** DUMP A CBS RAM PLUS CARTRIDGE *** RAMPLUS LDA #$F2 ; skip RAM area STA STRTHI LDX #$F8 LDY #3 LDA #mCARTRP BNE BANKRD ;*** TEST FOR PARKER BROS 8K *** $FFE0/$FFE1 ($FFE0-$FFF7) TESTPB LDX #$E0 STX BANKLO INX STX BANKLO2 JSR TSTSEL BEQ TESTAZ ;*** DUMP A PARKER BROS 8K CARTRIDGE *** DUMPPB LDA #$F4 STA ENDHI LDX #$F0 LDY #8 LDA #mCARTPB BNE BANKRD ;*** TEST FOR ACTIVISION AZ HERE *** $E1FE/$F1FE ($01FE/$11FE) TESTAZ LDA #$FE STA BANKLO STA BANKLO2 LDA #$E1 STA BANKHI LDA #$F1 STA BANKHI2 JSR TSTSEL BNE DUMPAZ ;*** DUMP A 4K CARTRIDGE *** DMP4K LDA #m4KCART DMP4Ka JSR PRTMSG JSR BNKZERO ; ensure bank zero ;*** DUMP A CARTRIDGE WITH READ-ADDRESS BANK SELECT *** BANKRDa LDA #mSTART JSR PRTMSG BANKRDb JSR DMPBNK ; dump the (only) bank INC PAGE LDA BANKHI CMP #$E1 ; (AZ-stuff here) BEQ BANKRDd INC BANKLO BANKRDc DEC NPAGES BNE BANKRDb DMPEND JSR S28END ; print the end of the file ; JSR S19END LDA #mEND HALTMSG JSR PRTMSG JMP * ; loop forever BANKRDd LDA #$F1 ; (AZ-stuff here) STA BANKHI BNE BANKRDc ;-----------------------------------------------------------------------; ; Print a message with the message code in A-reg ;-----------------------------------------------------------------------; PRTMSG ASLA TAY LDA MSGTBL,Y STA TEMPLO LDA MSGTBL+1,Y STA TEMPHI LDY #0 PRTMSGa LDA (TEMP),Y BEQ PRTMSGb JSR OUT232 INY BCC PRTMSGa ; branch always PRTMSGb RTS MSGTBL FDB MSG0,MSG1,MSG2,MSG3,MSG4,MSG5,MSG6,MSG7 FDB MSG8,MSG9,MSGA,MSGB,MSGC,MSGD,MSGE,MSGF FDB MSG10,MSG11,MSG12,MSG13,MSG14,MSG15,MSG16,MSG17 mTITLE EQU 0 MSG0 FCB 13,10,'7800 Cartridge Dumper v0.2',13,10,0 mEND EQU 1 MSG1 FCB '---END OF DUMP---',13,10,7,13,10,0 mSTART EQU 2 MSG2 FCB '---START OF DUMP---',13,10,0 mNOCART EQU 3 MSG3 FCB '*** NO CARTRIDGE INSTALLED ***',13,10,7,13,10,0 m4KCART EQU 4 MSG4 FCB '>>> 4K CARTRIDGE <<<',13,10,0 m2KCART EQU 5 MSG5 FCB '>>> 2K CARTRIDGE <<<',13,10,0 mCART8K EQU 6 MSG6 FCB '>>> 8K CARTRIDGE <<<',13,10,0 mCART32 EQU 7 MSG7 FCB '>>> 32K CARTRIDGE <<<',13,10,0 mCART16 EQU 8 MSG8 FCB '>>> 16K CARTRIDGE <<<',13,10,0 mCARTAZ EQU 9 MSG9 FCB '>>> ACTIVISION AZ ($01FE/$11FE) 8K CARTRIDGE <<<',13,10,0 mCARTRP EQU 10 MSGA FCB '>>> CBS RAM PLUS CARTRIDGE <<<',13,10,0 mCARTPB EQU 11 MSGB FCB '>>> PARKER BROS 8K CARTRIDGE <<<',13,10,0 mCARTTV EQU 12 MSGC FCB '>>> TIGERVISION 8K CARTRIDGE <<<',13,10,0 mSCRAM EQU 13 MSGD FCB '*** SUPER CHIP RAM DETECTED ***',13,10,0 MSGE FCB 'MSGE',0 MSGF FCB 'MSGF',0 ;-----------------------------------------------------------------------; ; Cartridge bank and pointer routines ;-----------------------------------------------------------------------; STRTPTR LDA STRTHI STA PTRHI LDA STRTLO STA PTRLO RTS RDPTR LDX #0 ; X=0 to allow indirect with no offset LDA (BANKLO,X) ; trip the bank select NOP NOP ; wait for the slow ones NOP LDA (PTRLO,X) ; read the byte RTS INCPTR SEC LDA #0 ADC PTRLO STA PTRLO BCC INCPTRa LDA #0 ADC PTRHI STA PTRHI INCPTRa RTS INCTMP SEC LDA #0 ADC TEMPLO STA TEMPLO BCC INCTMPa LDA #0 ADC TEMPHI STA TEMPHI INCTMPa RTS TSTPTR LDA PTRLO CMP ENDLO BNE TSTPTRa LDA PTRHI CMP ENDHI TSTPTRa RTS ;-----------------------------------------------------------------------; ; Test for Super Chip RAM and adjust STRTHI if necessary ;-----------------------------------------------------------------------; SCRAM LDX #0 SCRAMa STX $F000 CPX $F080 BNE SCRAMb INX BNE SCRAMa INC STRTHI LDA #mSCRAM JSR PRTMSG SCRAMb RTS ;-----------------------------------------------------------------------; ; Initialize pointers to bank zero ;-----------------------------------------------------------------------; BNKZERO LDX #0 ; Init bank number to zero STX PAGE STX BANKHI ; No bank select STX BANKLO INX STX NPAGES RTS ;-----------------------------------------------------------------------; ; Test if cartridge is 2K ; BEQ if 2K cart ;-----------------------------------------------------------------------; TEST2K JSR BANK2K ; set pointers for 2K bank JSR STRTPTR LDA $FFE1 ; force Parker Bros cart to different banks LDA $FFEA LDA $FFF3 ; LDA $FF?? ; force Mattel banked cart to different banks LDA #0 ; force Tigervision cart to different banks STA $E03F STA TEMP ; point temp to $F800 LDA #$F8 STA TEMP+1 TEST2Ka JSR RDPTR ; get next byte from $F000 half CMP (TEMP,X) ; compare with $F800 half BNE TEST2Kb ; branch if different (not a 2K cart) JSR INCTMP ; increment TEMP pointer JSR INCPTR ; increment PTRLO/PTRHI JSR TSTPTR BNE TEST2Ka TEST2Kb RTS ;-----------------------------------------------------------------------; ; Initialize bank pointers for 2K or 4K address space ;-----------------------------------------------------------------------; BANK2K LDX #$F8 BNE BANK4Ka BANK4K LDX #0 BANK4Ka LDA #0 ; Init end address to $0000 or $F800 STX ENDHI STA ENDLO LDX #$F0 ; Init source pointer address to $F000 STX STRTHI STA STRTLO RTS ;-----------------------------------------------------------------------; ; Test a bank select address ; BNE if bank select detected ;-----------------------------------------------------------------------; TSTSEL JSR STRTPTR LDA #$F2 ; skip possible cart RAM STA PTRHI TSTSELa JSR RDPTR CMP (BANKLO2,X) ; trip the second bank select CMP (PTRLO,X) ; compare the byte BNE TSTSELb JSR INCPTR JSR TSTPTR BNE TSTSELa TSTSELb RTS ;-----------------------------------------------------------------------; ; Test for a write-address bank select ; BNE if bank select detected ;-----------------------------------------------------------------------; TSTWSEL STA PAGE2 JSR STRTPTR LDA #$F2 ; skip possible cart RAM STA PTRHI TSTWSLa LDX #0 LDA PAGE STA (BANKLO,X) NOP NOP NOP LDA (PTRLO,X) STA TEMP LDA PAGE2 STA (BANKLO,X) NOP NOP NOP LDA (PTRLO,X) CMP TEMP BNE TSTWSLb JSR INCPTR JSR TSTPTR BNE TSTWSLa TSTWSLb RTS ;-----------------------------------------------------------------------; ; Test for a 7800 cartridge ; BNE if a 7800 cart ;-----------------------------------------------------------------------; TEST78n LDA #0 RTS TST7800 LDA $FFF8 ; $FFF8 must be 1111xxx1 AND #$F1 CMP #$F1 BNE TEST78n LDA $FFF9 ; $FFF9 must be xxxx0x11 AND #$0B CMP #$03 BNE TEST78n LDA $FFF9 ; $FFF9 must be >= $40 AND #$F0 CMP #$40 BCC TEST78n SBC #1 CMP $FFFD BCS TEST78n LDA #$E0 ; STRTHI/LO = $E000 STA STRTHI LDA #0 STA STRTLO STA ENDLO ; ENDHI/LO = $F000 LDA #$F0 STA ENDHI ; Fall through to MTYBNK to test if $E000/$FFFF bank empty ; JSR MTYBNK ; BEQ TEST78b ; exit if $E000-$EFFF empty (2600 cart) ; LDA #0 ; STRTHI/LO = $F000 ; STA ENDHI ; TEMPHI/LO = $5000 ; STA TEMPLO ; ENDHI/LO = $0000 ; LDA #$F0 ; STA STARTHI ; LDA #$D0 ; STA TEMPHI ; JSR STRTPTR ;TEST78a JSR RDPTR ; CMP (TEMPLO,X) ; BNE TEST78b ; JSR INCTMP ; JSR INCPTR ; JSR TSTPTR ; BNE TEST78a ;TEST78b RTS ;-----------------------------------------------------------------------; ; Test if a bank is empty ; NOTE: THIS REQUIRES PULL-UP RESISTORS ADDED TO THE 7800 ; BEQ if the bank is empty ;-----------------------------------------------------------------------; MTYBNK JSR STRTPTR ; JSR RDPTR ; STA TEMP MTYBNKa JSR RDPTR ; CMP TEMP CMP #$FF BNE MTYBNKb JSR INCPTR JSR TSTPTR BNE MTYBNKa MTYBNKb RTS ;-----------------------------------------------------------------------; ; Checksum a bank ;-----------------------------------------------------------------------; SUMBNK LDA #0 ; clear out checksum STA CHKSUM STA CHKHI JSR STRTPTR ; initialize ptr to start of bank SUMBNKa JSR RDPTR ; get the next byte CLC ADC CHKSUM ; add it to the checksum STA CHKSUM BCC SUMBNKb LDA #0 ; propagate carry if necessary ADC CHKHI STA CHKHI SUMBNKb JSR INCPTR ; point to next byte JSR TSTPTR ; test for end of bank BNE SUMBNKa ; loop until bank done RTS ;-----------------------------------------------------------------------; ; Dump a bank ;-----------------------------------------------------------------------; DMPBNK LDA STRTLO ; Init bank offset to (STRTHI/LO AND $0FFF) STA ADDRLO LDA STRTHI AND #$0F STA ADDRHI DMPBNK2 JSR STRTPTR ; initialize ptr to start of bank DMPBNKa JSR READ32 ; read a line of data JSR OUTS28 ; print it out ; JSR OUTS19 JSR TSTPTR ; check for end of data BNE DMPBNKa ; and loop if not RTS ;-----------------------------------------------------------------------; ; Copy 32 bytes from the bank into S28BUF ;-----------------------------------------------------------------------; READ32 LDY #0 READ32a LDA BANKLO ; test for TigerVision CMP #$3F BNE READ32b LDX #0 ; X=0 to allow indirect with no offset LDA PAGE STA (BANKLO,X) ; trip the bank select NOP NOP ; wait for the slow ones NOP LDA (PTRLO,X) ; read the byte JMP READ32c READ32b JSR RDPTR READ32c STA S28BUF,Y ; store it in the buffer JSR INCPTR INY ; point to next byte CPY #$20 ; loop until 32 bytes copied BNE READ32a RTS ;-----------------------------------------------------------------------; ; Output S28BUF as an S19 record ;-----------------------------------------------------------------------; OUTS19 LDA #'S' JSR OUT232 LDA #'1' JSR OUT232 LDA #0 STA CHKSUM LDA #$23 JSR OUT2HEX JSR OUT4HEX JMP OUTS29a ;-----------------------------------------------------------------------; ; Output S28BUF as an S28 record ;-----------------------------------------------------------------------; OUTS28 LDA #'S' JSR OUT232 LDA #'2' JSR OUT232 LDA #0 STA CHKSUM LDA #$24 ; 32 data bytes + 3 address + 1 checksum JSR OUT2HEX JSR OUT6HEX OUTS29a LDY #0 OUTS28a LDA S28BUF,Y JSR OUT2HEX INY CPY #$20 BNE OUTS28a OUTS28b LDA #0 CLC SBC CHKSUM JSR OUT2HEX JSR CRLF LDA #$20 ADC ADDRLO STA ADDRLO BCC OUTS28c LDA #0 ADC ADDRHI STA ADDRHI OUTS28c RTS ;-----------------------------------------------------------------------; ; Output an S9 record ;-----------------------------------------------------------------------; S19END LDA #'S' JSR OUT232 LDA #'9' JSR OUT232 LDA #0 STA CHKSUM LDA #3 JSR OUT2HEX JMP S19ENDa ;-----------------------------------------------------------------------; ; Output an S8 record ;-----------------------------------------------------------------------; S28END LDA #'S' JSR OUT232 LDA #'8' JSR OUT232 LDA #0 STA CHKSUM LDA #4 JSR OUT2HEX LDA #0 JSR OUT2HEX S19ENDa LDA #0 JSR OUT2HEX LDA #0 JSR OUT2HEX SEC BCS OUTS28b ;-----------------------------------------------------------------------; ; Output a 6 byte address (bank + address) ;-----------------------------------------------------------------------; OUT6HEX LDA PAGE JSR OUT2HEX ;-----------------------------------------------------------------------; ; Output a 4 byte address ;-----------------------------------------------------------------------; OUT4HEX LDA ADDRHI JSR OUT2HEX LDA ADDRLO ;-----------------------------------------------------------------------; ; Print A-reg as a hex byte ;-----------------------------------------------------------------------; OUT2HEX PHA CLC ADC CHKSUM STA CHKSUM PLA PHA LSRA LSRA LSRA LSRA JSR OUT1HEX PLA ;-----------------------------------------------------------------------; ; Output A-reg as a hex nibble ;-----------------------------------------------------------------------; OUT1HEX AND #$0F CLC ADC #'0' CMP #'9'+1 BCC OUT232 ADC #'A'-'0'-10-1 BNE OUT232 ;-----------------------------------------------------------------------; ; Print a CR LF sequence ;-----------------------------------------------------------------------; CRLF LDA #$0D JSR OUT232 LDA #$0A JSR OUT232 LDA #0 ; send a couple of nulls just in case JSR OUT232 ;-----------------------------------------------------------------------; ; Output a character as RS-232 through the joystick port ; ; note: 6.5 lines = approx one 2400 baud bit ; 13 lines = approx one 1200 baud bit ;-----------------------------------------------------------------------; ; These constants add up to two bit times ;BIT1 EQU 13 ; 1200 baud ;BIT2 EQU 13 BIT1 EQU 7 ; 2400 baud BIT2 EQU 6 OUT232 STA $6B PHA TYA PHA TXA PHA OUT232a LDA #0 ; output low for start bit STA SWCHA LDX #4 ; init count for 4 bit pairs LDY #BIT1 ; wait 1 bit JSR WSYNCY ; send the start bit OUT232b ROR $6B ; rotate out next bit RORA RORA STA SWCHA LDY #BIT2 ; wait 1 bit JSR WSYNCY ; send the next bit ROR $6B ; rotate out next bit RORA RORA STA SWCHA LDY #BIT1 ; wait 1 bit JSR WSYNCY ; output next bit DEX ; decrement counter BNE OUT232b ; loop until 8 bits sent ; STA WSYNC ; adjust timing a little bit LDA #$FF ; output high for stop bit STA SWCHA LDY #BIT1 ; wait 1 bit JSR WSYNCY ; send the stop bit PLA TAX PLA TAY PLA CLC ; return with carry clear RTS ;-----------------------------------------------------------------------; ; wait for number of scan lines specified in Y register ;-----------------------------------------------------------------------; WSYNCY STY WSYNC ; wait a line DEY ; decrement line counter BNE WSYNCY ; loop until done RTS ;-----------------------------------------------------------------------; ; Wait for vsync ;-----------------------------------------------------------------------; WSYNC1 BIT MSTAT BMI WSYNC1 WSYNC2 BIT MSTAT BPL WSYNC2 RTS ; this point should be less than $EE00! REL2ADR ORG $E000 RORG $1800 ; this RAM won't work with 2600 cart inserted! REL2COD ;-----------------------------------------------------------------------; ; Test for 7800 RAM ; ENTRY: A-reg = high byte of start address ; EXIT: BNE if RAM was found ;-----------------------------------------------------------------------; TSTR78 STA STRTHI LDX #0 STX STRTLO LDY #$FF JSR STRTPTR TSTR78a TXA STA (PTRLO,X) CMP (PTRLO,X) BNE TSTR78b TYA STA (PTRLO,X) CMP (PTRLO,X) BNE TSTR78b INC PTRLO BNE TSTR78a INC PTRHI LDA PTRHI CMP ENDHI BNE TSTR78a TSTR78b TXA CMP PTRLO BNE TSTR78c LDA PTRHI CMP STRTHI TSTR78c RTS ;-----------------------------------------------------------------------; ; Test for 7800 bank select ;-----------------------------------------------------------------------; TST78SL STX PAGE LDA #$FF STA PAGE2 JSR STRTPTR JSR TSTWSLa CLC ; clear carry for ROL instruction RTS ;-----------------------------------------------------------------------; ; Compare two areas of memory ; BEQ if memory blocks are identical ;-----------------------------------------------------------------------; CMPMEM JSR STRTPTR STA TEMPLO LDX #0 ; X=0 to allow indirect with no offset CMPMEMa LDA (PTRLO,X) ; read the byte CMP (TEMPLO,X) BNE CMPMEMb JSR INCTMP JSR INCPTR JSR TSTPTR BNE CMPMEMa CMPMEMb RTS ;-----------------------------------------------------------------------; ; Dump a 7800 cartridge ;-----------------------------------------------------------------------; DUMP78 LDA #mCART78 JSR PRTMSG ;*** TEST FOR BANK SELECT IN $8000-$BFFF REGION *** B7800 LDA #$BF ; set bank select address to $BFFF STA BANKHI LDA #$FF STA BANKLO LDA #$80 ; ADDRHI/LO = $8000 STA ADDRHI ; STRTHI/LO = $8000 STA STRTHI ; ENDHI/LO = $C000 LDA #$C0 STA ENDHI LDX #0 STX PAGE STX ENDLO STX STRTLO LDA #1 ; default to one page (no bank select) STA NPAGES ; LDX #0 ; compare bank $00 against last bank JSR TST78SL BEQ B7800a ; branch if no bank select ROL NPAGES ; at least two pages are known LDX #1 ; compare bank $01 against last bank JSR TST78SL BEQ B7800a ; branch if no bank select ROL NPAGES ; at least four pages are known LDX #3 ; compare bank $03 against last bank JSR TST78SL BEQ B7800a ; branch if no bank select ROL NPAGES ; 8 pages are known B7800a LDA #0 STA PAGE ; reset to page 0 STA BANKHI ; disable bank select LDA NPAGES CMP #1 BEQ RAM40 LDA #'(' JSR OUT232 LDA NPAGES CLC ADC #'0' JSR OUT232 LDA #mNPAGES JSR PRTMSG ;-----------------------------------------------------------------------; ; DUMP $4000-$7FFF REGION ;-----------------------------------------------------------------------; ;*** Determine the size of installed RAM if any *** RAM40 LDA #$80 STA ENDHI LDA #$40 JSR TSTR78 BNE RAM78 ;*** No RAM at $4000-$5FFF, check $6000-$7FFF *** RAM60 LDA #$60 JSR TSTR78 BEQ POKEY ;*** RAM was found *** ; Determine RAM size RAM78 LDA PTRHI ; get end of RAM SEC SBC STRTHI ; adjust for start of RAM RORA ; convert pages to K-bytes RORA AND #$3F ; mask off high bits STA RAMSIZE ; save number of K-bytes CMP #16 ; was it 16K bytes? BNE RAM78b ; branch if not LDX #0 STX $4000 ; write a zero to $4000 CPX $6000 ; and see if it shows up at $6000 BNE RAM78b ; branch if not DEX STX $4000 ; write a $FF to $4000 CPX $6000 ; and see if it shows up at $6000 BNE RAM78b ; branch if not LDA #8 ; RAM is actually 8K bytes STA RAMSIZE ; Print RAM size and addresses RAM78b LDA #'(' JSR OUT232 LDA RAMSIZE ; get number of K-bytes CMP #10 BCC RAM78c ; branch if < 10 LDA #'1' ; print tens digit JSR OUT232 LDA RAMSIZE ; subtract 10 from number of K-bytes SEC ; to get ones digit SBC #10 RAM78c JSR OUT1HEX ; print ones digit LDA #mRAM1 ; 'K RAM FOUND AT ADDRESS $' JSR PRTMSG LDA STRTHI JSR OUT2HEX LDA #mRAM2 ; '00-$' JSR PRTMSG LDA PTRLO BNE RAM78d DEC PTRHI RAM78d DEC PTRLO LDA PTRHI JSR OUT2HEX LDA PTRLO JSR OUT2HEX LDA #mRAM3 ; ')',13,10 JSR PRTMSG JMP D78P2 ;*** NO RAM IN $4000-$7FFF, CHECK IF POKEY CHIP OR EMPTY *** POKEY LDX #$FF CPX $400A BNE ROM40 CPX $400B BNE ROM40 CPX $400C BNE ROM40 INX CPX $4009 BNE ROM40 LDX #$F7 CPX $400E BNE ROM40 LDA #mPOKEY JSR PRTMSG JMP D78P2 ROM40 LDA #$40 STA ADDRHI STA STRTHI LDA #$80 STA ENDHI JSR MTYBNK BEQ D78P2 JSR DMPBNK2 ;-----------------------------------------------------------------------; ; DUMP $8000-$BFFF REGION ;-----------------------------------------------------------------------; D78P2 LDA #$BF ; set bank select address to $BFFF STA BANKHI LDA #$FF STA BANKLO STA $BFFF ; trip the bank select to maximum ;*** TEST IF $8000-$BFFF IS EMPTY *** LDA #$80 STA ADDRHI STA STRTHI LDA #$C0 STA ENDHI JSR MTYBNK BEQ D78P3 ;!!! force 8 banks for now !!! ; LDA NPAGES ; CMP #1 ; BEQ D78P2a ; LDA #8 ; STA NPAGES ;*** DUMP $8000-$BFFF REGION *** D78P2a LDA #$80 STA ADDRHI LDA PAGE STA $BFFF JSR DMPBNK2 ; dump the next bank INC PAGE ; point to the next page LDA NPAGES CMP PAGE ; test if all pages done BNE D78P2a ; branch if not ;-----------------------------------------------------------------------; ; DUMP $C000-$FFFF REGION ;-----------------------------------------------------------------------; ;*** TEST IF $C000-$DFFF IS EMPTY *** D78P3 LDA #0 STA PAGE ; clear the page number STA BANKHI ; disable bank select LDA #$C0 STA ADDRHI STA STRTHI LDA #$E0 STA ENDHI STA TEMPHI JSR MTYBNK BEQ D78P4 ;*** TEST IF $C000-$DFFF = $E000-$FFFF *** JSR CMPMEM BEQ D78P4 ; branch if $C000-$DFFF = $E000-$FFFF JSR DMPBNK2 ;*** TEST IF $E000-$EFFF = $F000-$FFFF *** D78P4 ; LDA #$E0 ; start dumping at $E000 ; STA STRTHI ; LDA #$F0 ; STA TEMPHI ; STA ENDHI ; JSR CMPMEM ; PHP ; LDA #$F0 ; PLP ; BEQ D78P5 ;*** DUMP $E000-$FFFF OR $F000-$FFFF *** LDA #$E0 D78P5 STA STRTHI STA ADDRHI LDA #0 ; end dumping at $0000 STA ENDHI JSR DMPBNK2 JMP DMPEND mCART78 EQU 16 MSG10 FCB '*** 7800 CARTRIDGE DETECTED ***',13,10,0 mEMPTY EQU 17 MSG11 FCB 'EMPTY',0 mRAM1 EQU 18 MSG12 FCB 'K RAM FOUND AT ADDRESS $',0 mRAM2 EQU 19 MSG13 FCB '00-$',0 mRAM3 EQU 20 MSG14 FCB ')',13,10,0 mFRAM EQU 21 MSG15 FCB '*** RAM DETECTED AT $C000 ***',13,10,0 mNPAGES EQU 22 MSG16 FCB ' ROM PAGES FOUND AT $8000-$BFFF)',13,10,0 mPOKEY EQU 23 MSG17 FCB '(POKEY SOUND CHIP DETECTED AT $4000)',13,10,0 ; this point should be less than $E800! ORG $F4F5 FCB $00 ; disable digital signature check ORG $FB81 JMP START ; reset vector END