; NOTE: this is from a pre-release version dated 1984-04-23 at: ; http://archives.atarimuseum.com/archives/pdf/videogames/7800/7800_os_source_code.pdf ; ; This does NOT match up with the "offical" version of the ROM! ; ; Places where code was unreadable (and not otherwise positively identifiable) ; are marked with "~~~", and chopped off ends of lines are marked with "...". ; If someone has access to a more readable copy, it would be nice to find out ; what the missing parts are. ; ; Depending on your assembler, at the very minimum, you will have to substitute ; "H(" -> ">(" and "L(" -> "<(", and probably "FATAL$" -> "FATAL" too, to get ; this to assemble. ; STACKPTR EQU $FF ; could not find this in the source listing scan ;===================================================================== * MARIAOS MARIA DATA LOCATION DEFINITIONS * NOTE THE FOLLOWING WIERD THINGS ABOUT THE RAM: * $00-$3F <=> $100-$13F * $80-$FF <=> $180-$1FF * $40-$FF <=> $2040-$20FF * $140-$1FF <=> $2140-$21FF * TIA REGISTERS INPTCTRL EQU $01 ;INPUT CONTROL INPT4 EQU $0C ;BITS 7 PLAYER 0 BUTTO... INPT5 EQU $0D ;BITS 7 PLAYER 1 BUTTO... AUDC0 EQU $15 ;BITS 3210 AUDIO CONTROL ... AUDC1 EQU $16 ;BITS 3210 AUDIO CONTROL ... AUDF0 EQU $17 ;BITS 43210 AUDIO FREQUENC... AUDF1 EQU $18 ;BITS 43210 AUDIO FREQUENC... AUDV0 EQU $19 ;BITS 3210 AUDIO VOLUME 0... AUDV1 EQU $1A ;BITS 3210 AUDIO VOLUME 1... * MARIA REGISTERS BACKGRND EQU $20 ;BACKGROUND COLOR P0C1 EQU $21 ;PALETTE 0, COLOR 1 P0C2 EQU $22 ;PALETTE 0, COLOR 2 P0C3 EQU $23 ;PALETTE 0, COLOR 3 WSYNC EQU $24 ;FAST MARIA WSYNC STROBE P1C1 EQU $25 ;PALETTE 1, COLOR 1 P1C2 EQU $26 ;PALETTE 1, COLOR 2 P1C3 EQU $27 ;PALETTE 1, COLOR 3 MSTAT EQU $28 ;BIT 6 IN VBLANK, BIT ? IN D... P2C1 EQU $29 ;PALETTE 2, COLOR 1 P2C2 EQU $2A ;PALETTE 2, COLOR 2 P2C3 EQU $2B ;PALETTE 2, COLOR 3 DPPH EQU $2C ;DISPLAY LIST POINTER HIGH P3C1 EQU $2D ;PALETTE 3, COLOR 1 P3C2 EQU $2E ;PALETTE 3, COLOR 2 P3C3 EQU $2F ;PALETTE 3, COLOR 3 DPPL EQU $30 ;DISPLAY LIST POINTER LOW P4C1 EQU $31 ;PALETTE 4, COLOR 1 P4C2 EQU $32 ;PALETTE 4, COLOR 2 P4C3 EQU $33 ;PALETTE 4, COLOR 3 CHARBASE EQU $34 ;CHARACTER MODE HIGH POINTER P5C1 EQU $35 ;PALETTE 5, COLOR 1 P5C2 EQU $36 ;PALETTE 5, COLOR 2 P5C3 EQU $37 ;PALETTE 5, COLOR 3 OFFSET EQU $38 ;NOT USED ****** P6C1 EQU $39 ;PALETTE 6, COLOR 1 P6C2 EQU $3A ;PALETTE 6, COLOR 2 P6C3 EQU $3B ;PALETTE 6, COLOR 3 CTRL EQU $3C ;BIT 7 CHARACTER WIDTH, BIT 6... P7C1 EQU $3D ;PALETTE 7, COLOR 1 P7C2 EQU $3E ;PALETTE 7, COLOR 2 P7C3 EQU $3F ;PALETTE 7, COLOR 3 * FREE RAM - $40-$FF * ALIASED RAM - $100-$13F * STACK - $140-$1FF * 6532 TIMERS AND PORTS SWCHA EQU $280 ;JOYSTICKS * BIT 7 PLAYER 0 EAST IF CLEAR * BIT 6 WEST * BIT 5 SOUTH * BIT 4 NORTH * BIT 3 PLAYER 1 EAST IF CLEAR * BIT 2 WEST * BIT 1 SOUTH * BIT 0 NORTH SWCHB EQU $282 ;CONSOLE SWITCHES * BIT 7 PLAYER 1 DIFFICULTY A IF SET, B IF CLEAR * BIT 6 PLAYER 2 DIFFICULTY A IF SET, B IF CLEAR * BIT 3 BLACK AND WHITE VS COLOR - COLOR WHEN SET * BIT 1 GAME SELECT - CLEAR WHEN PRESSED * BIT 0 GAME RESET - CLEAR WHEN PRESSED CTLSWA EQU $281 CTLSWB EQU $283 INTIM EQU $284 ;INTERVAL TIMER IN TIM8T EQU $295 ;TIMER 8T WRITE OUT TIM64T EQU $296 ;TIMER 64T WRITE OUT TIM64TI EQU $29E ;INTERRUPT TIMER 64T * ENDEF.S ENCRYPTION SYMBOL DEFINITIONS * ADDRESS DEFINITIONS * PAGE 0 - $080-$0FF ($40-$7F TAKEN BY A REGISTER) TEST0 EQU $00 ;TEST DATA FOR CPU TEST TEST1 EQU $01 TESTW0 EQU $02 ;2 BYTES TESTW1 EQU $04 ;2 BYTES TEMP0 EQU $00 ;SCRATCH DATA FOR PROGRAM USE... TEMP1 EQU $01 ;MORE SCRATCH DATA TEMP2 EQU $02 ;MORE SCRATCH DATA TEMP3 EQU $03 ;MORE SCRATCH DATA TEMP4 EQU $04 ;MORE SCRATCH DATA TEMP5 EQU $05 ;MORE SCRATCH DATA STARTA EQU $E0 ;WHERE ACCUMULATOR STARTS OFFSETA EQU $E1 ;OFFSET INTO ACCUMULATOR OFFSETR EQU $E2 ;OFFSET INTO A REGISTER SIZEA EQU $E3 ;SIZE OF ACCUMULATOR SIZER0 EQU $E4 ;SIZE OF REGISTER 0 SIZER1 EQU $E5 ;SIZE OF REGISTER 1 SIZER3 EQU $E6 ;SIZE OF REGISTER 3 SIZER5 EQU $E7 ;SIZE OF REGISTER 5 CARTBOTM EQU $EE ;BOTTOM OF CARTRIDGE ADDRESS FUJICOLR EQU $EF ;STARTING COLOR FOR FUJI-A KNLSTATE EQU $F0 ;HOW MANY MORE ITERATIONS T... KNLCOUNT EQU $F1 ;TIMER FOR CHANGING FUJI COL... KNLTIME EQU $F2 ;TIME THAT COUNT IS GOOD FOR... KNLOFSET EQU $F3 ;HOW STAGGERED THE FUJI COLO... DLIADDR EQU $F4 ;SAME ADDRESS AS IN PACK-IN ... * HIGH RAM - $1800-$27FF ACC EQU $1800 ;256 BYTE ACCUMULATOR REG0 EQU $1900 ;128 BYTE REGISTER REG2 EQU $1A00 ;128 BYTE REGISTER REG4 EQU $1B00 ;128 BYTE REGISTER REG6 EQU $1C00 ;128 BYTE REGISTER REG8 EQU $1D00 ;128 BYTE REGISTER REG10 EQU $1E00 ;128 BYTE REGISTER REG12 EQU $1F00 ;128 BYTE REGISTER RAMGRAPH EQU $1984 ;GRAHPICS IN RAM, $19XX-$1EXX RAMDLL EQU $1F84 ;DLL REG1 EQU $2000 ;128 BYTE REGISTER * ***** HOLE FROM $2040 TO $20FF - SHADOWED IN PAGE 0 ***** REG14 EQU $2100 ;128 BYTE REGISTER (OVERLA~... * ***** HOLE FROM $2140 TO $21FF SHADOWED IN PAGE 1 ***** * DISPLAY LIST RAM RAMDLIST EQU $2200 ;~~~ FOR DLISTS FOR WORDS AN... * MEMORY LOCATIONS FOR CO~~~~~~~~~~~~~~~~~~~~~~~~~~~ ROMCODE EQU $F400 ;~~~~~~~~~~~~~~CODE LIVES ROMCODE2 EQU $F880 ;~~~~~~~~~ DROPPED CODE RAMCODE EQU $2300 ;~~~~~~~~~~~~~~FOR CODE CODEDIF EQU $D100 ;DIFFERENCE BETWEEN OLD AND ... * ENCRYPTION CONST~~~~~~~~~~~~~~~~~~~ ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ;~~~~~~~~~~~ IS ON~~~~~~~~~ REGION EQU $FE ;MASK FOR COUNTRY RANDBYTE EQU $04 ;RANDOM BYTE IN CHECKSUM *NTGAME EQU $D804 ;INTERNAL GAME ROM START LOCA... *NTDLI EQU $D800 ;INTERNAL GAME DLI HANDLER INTDLI EQU $F000 ;OUR DLI * SCAFFOLD.S * THIS DOES THE DISPATCHING WHENEVER THE PACK-IN ISN'T AROUND ORG INTDLI PHA JMP (DLIADDR) * CART.S ROUTINES DEALING WITH CHECKING THE CARTRIDGE OUT ORG ROMCODE NOCART JMP LOCK2600-CODEDIF ;NO INTERNAL CART *OCART LDA #$13 ;TURN SECURITY ROM BACK ON - ... * STA INPTCTRL * JSR GRAPHON2 * * LDX #$80 *OCTLOOP LDA KNLSTATE ;WAIT A WHILE WITH THE DISPLA... * BNE NOCTLOOP * LDA #$00 * STA KNLSTATE * DEX * BNE NOCTLOOP * * JMP INTGAME ;JUMP TO INTERNAL GAME BADCART JMP LOCK2600-CODEDIF ;CART DOES NOT CHECK, DO 2600... CARTTEST LDA #$16 ;TURN EXTERNAL CART ON STA INPTCTRL LDY #$FF LDX #$7F ;SEE IF A CART PLUGGED IN CTSTLOOP LDA $FE00,X CMP $FD80,Y BNE NOCART DEY DEX BPL CTSTLOOP ;X LEFT = FF, Y LEFT = 7F LDA $FFFC ;SEE IF START AT FFFF AND $FFFD CMP #$FF BEQ NOCART ;ALL LINES DRAWN HIGH, NO CA... LDA $FFFC ;SEE IF START AT 0000 ORA $FFFD BEQ NOCART ;ALL LINES DRAWN LOW, NO CAR... LDA $FFF8 ;CHECK FOR REGION VERIFICATI... ORA #REGION CMP #$FF BNE BADCART LDA $FFF9 ;SEE IF MARIA SIGNATURE EXIS... AND #$0B ;$07 OR $03 VALID CMP #$03 BNE BADCART LDA $FFF9 ;GET BOTTOM OF CART ADDRESS AND #$F0 STA CARTBOTM STA CSCMOD0+2-CODEDIF ;SET UP FOR START OF CHECKSU... CMP #$40 ;MAKE SURE IT IS NOT TOO LOW BCC BADCART ; SEC SBC #$01 ;MAKE SURE WE GET FENCEPOST ... CMP $FFFD ;MAKE SURE START VECTOR WITH... BCS BADCART JSR DECRYPT-CODEDIF ;GET THE DECRYPTED CHECKSUM LDA #$00 STA KNLSTATE ;GET OUR STATE READY WITH DL... JSR CSCHKDLI-CODEDIF ;CHECK FOR COMING DLI LDA #$16 ;GENERATE THE CHECKSUM FOR C... STA INPTCTRL ;FIRST, TURN CART BACK ON LDX #$00 TXA CS0LOOP STA ACC,X ;ZERO OUT THE CHECKSUM ACC DEX BNE CS0LOOP PHA ;PUT 0 ON STACK TO INIT CSCH... LDY #$7F ;Y STARTS = 7F CSALOOP LDA $FF00,Y ;GET HI PAGE INTO ACC STA ACC,Y ;$FF00-$FF7F AND $FFF9-$FFFF DEY CPY #$F8 BNE CSALOOP LDA #L(S-CODEDIF) ;SET UP FOR THE RETURN STA CSCMOD1+1-CODEDIF LDA #H(S-CODEDIF) STA CSCMOD1+2-CODEDIF CSCSLOOP JSR CSCHKDLI-CODEDIF ;CHECK FOR COMING DLI PLA ;SAVE LOWER STATE JSR CSCHECK-CODEDIF ;MARCH UP THE CODE PHA ;PUT BACK LOWER STATE INC CSCMOD0+2-CODEDIF LDA CSCMOD0+2-CODEDIF CMP #$FF BNE CSCSLOOP JSR CSCHKDLI-CODEDIF ;CHECK FOR COMING DLI JSR CSROTATE-CODEDIF ;ROTATE THE BITS AROUND A BIT JSR CSROTATE-CODEDIF ;ROTATE THE BITS AROUND A BIT LDA #L(T-CODEDIF) ;SET UP FOR THE RETURN MARCH STA CSCMOD1+1-CODEDIF LDA #H(T-CODEDIF) STA CSCMOD1+2-CODEDIF DEC CSCMOD0+2-CODEDIF CSCTLOOP JSR CSCHKDLI-CODEDIF ;CHECK FOR COMING DLI PLA ;SAVE LOWER STATE JSR CSCHECK-CODEDIF ;MARCH UP THE CODE PHA ;PUT BACK LOWER STATE DEC CSCMOD0+2-CODEDIF LDA CSCMOD0+2-CODEDIF CMP CARTBOTM BCS CSCTLOOP LDA #$60 ;DONE WITH DECRYPT, TURN OF G... STA CTRL LDX #NLEN ;'FOLD' THE CHECKSUM TOGETHER CSCFLOOP LDA ACC,X ;AND MOVE IT TO REG2 EOR ACC+$50,X EOR ACC+$FF-NLEN,X STA REG2,X DEX BPL CSCFLOOP LDA REG2 ;MAKE SURE IT IS LESS THAN N AND #NMASK STA REG2 LDA #$00 ;GET RID OF RANDOM BYTE LDX #RANDBYTE STA REG2,X STA REG1,X LDX #NLEN ;SEE IF THEY CHECK!! CSCCLOOP LDA REG1,X ;THE DECRYPTED SIGNATURE CMP REG2,X ;THE COMPUTED CHECKSUM BNE NOCHECK DEX BPL CSCCLOOP JMP SETMARIA-CODEDIF ;EVERYTHING CHECKS!!!!! NOCHECK JMP LOCK2600-CODEDIF ;DECRYPT FAILED, PUT HIM IN 2... CSCHECK LDX #$00 ;ROUTINE TO CHECKSUM ONE PAGE CSCLOOP ADC ACC,X CSCMOD0 ADC $FF00,X TAY CSCMOD1 LDA N-CODEDIF,Y STA ACC,X INX BNE CSCLOOP RTS CSROTATE LDX #$00 ;ROUTINE TO ROTATE CHECKSUM A... CSRLOOP ROL ACC,X INX BNE CSRLOOP RTS CSCHKDLI PHP ;SAVE PROCESSOR STATUS DEC KNLSTATE ;SEE IF DLI ABOUT TO HAPPEN BPL CSCDOUT ;COUNT DOWN OUR TIMER LDA #$02 ;KERNEL NOT HAPPENED, BUT ABO... STA INPTCTRL ;DISABLE CART, TURN ON SECURI... CSCDLOOP LDA KNLSTATE ;AND THEN WAIT FOR THE KERNEL... BMI CSCDLOOP LDA #$16 ;DISABLE SECURITY ROM, TURN O... STA INPTCTRL CSCDOUT PLP ;RESTORE PROCESSOR STATUS RTS * THESE TABLES ARE USED FOR NON-LINEAR ~~~~~~~~~~~ S DB $C7,$65,$AB,$CA,$EE,$F7,$83,$09 T DB $E1,$D0,$92,$67,$62,$B6,$72,$55 DB $8E,$91,$DC,$C5,$81,$BE,$78,$20 DB $59,$B7,$E6,$3D,$06,$45,$AF,$C8 DB $08,$31,$38,$D1,$FB,$73,$84,$A9 DB $17,$FC,$34,$87,$A3,$94,$FA,$90 DB $B8,$ED,$CE,$3B,$5B,$0A,$43,$D9 DB $F3,$53,$82,$B3,$0D,$6D,$5A,$60 DB $9D,$51,$A7,$B9,$11,$10,$BC,$E4 DB $7F,$80,$41,$E7,$E3,$F6,$56,$26 DB $35,$EC,$D6,$DF,$0C,$7F,$F4,$9E DB $AC,$52,$46,$EF,$CF,$BF,$A2,$3F DB $A4,$13,$15,$97,$4A,$1C,$B0,$42 DB $8C,$B1,$05,$58,$80,$18,$77,$2B DB $02,$3E,$A8,$49,$1A,$6A,$CB,$6E DB $0B,$8A,$EB,$F1,$4F,$14,$79,$8B DB $D8,$9F,$9B,$57,$19,$F8,$2A,$2D DB $76,$0E,$E8,$2E,$4B,$F9,$07,$03 DB $DE,$93,$16,$7E,$D4,$E5,$B2,$F0 DB $7D,$7A,$DA,$D2,$A1,$CC,$1D,$E0 DB $5E,$23,$A0,$95,$22,$1E,$36,$85 DB $FE,$1F,$39,$AA,$89,$96,$AD,$0F DB $2F,$C0,$47,$27,$5D,$24,$EA,$C3 DB $A5,$F5,$21,$5F,$1B,$40,$8F,$AE DB $74,$25,$DD,$C1,$7C,$CD,$A6,$70 DB $D7,$33,$7B,$2C,$75,$BB,$86,$99 DB $BD,$54,$9A,$6C,$63,$32,$48,$4C DB $8D,$BA,$5C,$61,$C4,$4E,$29,$37 DB $12,$C6,$98,$9C,$D5,$69,$6B,$E2 DB $04,$4D,$E9,$C2,$88,$3A,$DB,$64 DB $01,$44,$6F,$B5,$F2,$30,$28,$FD DB $50,$71,$3C,$B4,$66,$68,$C9,$D3 DB $CA,$83,$C7,$AB,$F7,$65,$09,$EE * METHOD.S THIS IS A PACKAGE OF ROUTINES THAT DO THE ACTUAL DE... * THIS ROUTINE DECRYPTS A SIGNATURE. THE KEY IS PLACED INTO REG1. * MODULUS IS N. EVERYTHING IS ASSUMED TO BE SIZE NLEN. * INPUT: SIG IN $FF80, N, NLEN * OUTPUT: DECRYPTED SIG IN REG1 (LENGTH NLEN) * REG1 = SIG * SIG MOD N (DECRYPTION FUNCTION) DECRYPT LDX #NLEN STX SIZER0 STX SIZER1 DCLOOP LDA $FF80,X STA REG0+1,X STA REG1,X DEX BPL DCLOOP LDA #$02 ;TURN SECURITY ROM BACK ON STA INPTCTRL JSR GRAPHON ;TURN GRAPHICS ON JSR MULTIPLY-CODEDIF ;START WITH THE MULTIPLY DEC KNLTIME ;SPEED UP FUJI ROLLING LDX #NLEN ;SIZE OF REGISTER STX SIZER0 ;SET UP SIZE FOR DIVIDE MDMRLOOP LDA N,X ;MOVE MODULO TO REG0 STA REG0+1,X ;STORE IT DEX BPL MDMRLOOP ;KEEP GOING TILL REGISTER 0 ... LDA OFFSETA STA SIZEA JSR DIVIDE-CODEDIF ;AND DO THE DIVIDE DEC KNLTIME ;SPEED UP FUJI ROLLING LDA STARTA ;SET UP FOR MOVE STA DCMOD0+1-CODEDIF LDX #NLEN ;PUT ACC INTO REG1 DCMLOOP DCMOD0 LDA ACC,X STA REG1,X DEX BPL DCMLOOP RTS ;ALL DONE, GET CHECKSUM TO C... * MULTIPLY TWO NUMBERS - THE TWO NUMBERS TO BE MULTIPLIED ARE PLACED... * REG0 AND REG1. THE RESULT IS LEFT IN ACC. ACC WILL HAVE A LEADIN... * (TO MAKE IT EASIER TO USE WITH A MODULO FOLLOWING IT). REG0 SHOUL... * AT REG0+1 (SO THE FIRST LOCATION CAN BE SMASHED) THOUGH SIZER0 SHO... * REMAIN UNCHANGED. * INPUT: REG0, REG1, SIZER0, SIZER1 * OUTPUT: ACC, STARTA, OFFSETA MULTIPLY JSR SETREGS-CODEDIF ;INITIALIZE REGISTERS LDY SIZER1 ;PREPARE ACCUMULATOR INY STY OFFSETA ;OFFSET INTO REG0 AND ACC TYA CLC ADC OFFSETR ;SET SIZE TO CLEAR PHA ;PUSH SIZE OF ACCUMULATOR ON... TAX LDA #$00 STA ADDMOD+1-CODEDIF ;WE ONLY USE EVEN REGISTERS MULCALP STA ACC,X ;CLEAR ACC DEX BNE MULCALP STA ACC ;CLEAR LEADING BYTE INY ;Y STILL ~~~~~~SETA, INC FOR... STY ADACMOD0+1-CODEDIF ;MODIFY ~~~ACCUMULATOR INDEX... STY ADACMOD1+1-CODEDIF STY ADACMOD2+1-CODEDIF STY ADACMOD3+1-CODEDIF MULLOOP0 LDX #$00 ;RESET BIT OFFSET DEC ADACMOD0+1-CODEDIF ;MODIFY ~~~~ACCUMULATOR INDEX... DEC ADACMOD1+1-CODEDIF DEC ADACMOD2+1-CODEDIF DEC ADACMOD3+1-CODEDIF DEC OFFSETA ;GO TO NEXT REG1 BYTE BMI MULOUT MULLOOP LDY OFFSETA ;GET OFFSET INTO REG0 LDA REG1,Y ;SEE WHAT OUR 'CURRENT BIT' ... AND MULTMASK-CODEDIF,X BEQ MULNEXT LDA HSEROFF-CODEDIF,X ;IT IS A 1, ADD IN APPROPRIA... STA ADDMOD+2-CODEDIF JSR MULTADD-CODEDIF MULNEXT INX ;GO TO NEXT BIT IN BYTE CPX #$08 BMI MULLOOP JMP MULLOOP0-CODEDIF MULOUT PLA ;GET SIZE OF ACCUMULATOR BAC... STA OFFSETA LDA #$01 ;STARTING BYTE OF ACCUMULATO... STA STARTA RTS MULTMASK DB $01,$02,$04,$08,$10,$20,$40,$80 * DIVIDE TWO NUMBERS - THE ACCUMULATOR IS DIVIDED BY REG0. THE REMA... * PLACED IN REG1. THE ACCUMULATOR MUST START OUT WITH A NULL HI BYT... * (THE INITIAL STARTA OF 1, THE FIRST BYTE OF ACC IS ZEROED HERE). * AS IN MULTIPLY, REG0 SHOULD START AT REG0+1. * INPUT: ACC, REG0, SIZER0, SIZEA * OUTPUT: ACC, STARTA, OFFSETA * USES: REG2-REG14 EVEN DIVIDE JSR SETREGS-CODEDIF ;SET SHIFTED REGISTERS LDA SIZEA SEC SBC SIZER0 STA STARTA ;THIS IS THE START OF WHAT IS... STA OFFSETA ;THIS IS NUMBER OF TIMES LOOP... LDX #$00 STX ACC ;MAKE SURE LEADING BYTE IS 2 STX SUBMOD+1-CODEDIF ;WE ONLY USE EVEN REGISTERS STX CMPMOD+1-CODEDIF DEX ;THESE WILL BE INCREMENTED ON... STX CMACMOD+1-CODEDIF STX SBACMOD0+1-CODEDIF STX SBACMOD1+1-CODEDIF STX SBACMOD2+1-CODEDIF STX SBACMOD3+1-CODEDIF DIVLOOP0 LDX #$07 ;RESET BIT OFFSET INC CMACMOD+1-CODEDIF INC SBACMOD0+1-CODEDIF INC SBACMOD1+1-CODEDIF INC SBACMOD2+1-CODEDIF INC SBACMOD3+1-CODEDIF DEC OFFSETA BMI DIVOUT DIVLOOP LDA HSEROFF-CODEDIF,X ;DO MODIFICATION FOR COMPARE STA SUBMOD+2-CODEDIF STA CMPMOD+2-CODEDIF JSR DIVCOMP-CODEDIF ;SEE IF REGISTER IS LARGER BCC DIVNEXT ; IF SO, DO NOTHING JSR DIVSUB-CODEDIF ;AND DO THE SUBTRACT DIVNEXT DEX ;GO TO NEXT BIT IN BYTE BPL DIVLOOP JMP DIVLOOP0-CODEDIF DIVOUT LDA SIZEA ;SET LAST RETURN VALUE STA OFFSETA ;THIS IS THE END OF WHAT IS L... RTS * THIS ROUTINE SETS UP REGISTERS FOR MULTIPLY AND DIVIDE. THE REGIST... * IS SHIFTED LEFT 7 TIMES, WITH THE INTERMEDIATE FORMS LEFT IN REG2-R... * (IN ORDER OF HOW MUCH THEY HAVE BEEN SHIFTED). IT IS ASSUMED THAT ... * A LEADING ZERO. THE LEADING BYTE IS ZEROED SO WHOEVER LOADS REG0 ~... * HAVE TO ZERO IT. NOTE THAT SIZER0 SHOULD NOT INCLUDE THE LEADING Z... * INPUT: REG0, SIZER0 * OUTPUT: REG0-REG14 EVEN, OFFSETR (INDEX INTO ABOVE) SETREGS LDX SIZER0 INX STX OFFSETR LDY #$00 STY REG0 ;CLEAR THE EXTRA BYTE. SERLOOP LDA HSEROFF-CODEDIF,Y STA SERSMOD1+2-CODEDIF INY ;GO TO NEXT REG LDA HSEROFF-CODEDIF,Y STA SERSMOD2+2-CODEDIF LDX OFFSETR ;DO A LEFT SHIFT OF THE REGIS... CLC SERSLOOP SERSMOD1 LDA REG0,X ;GET DATA ROL A ;ROTATE IT SERSMOD2 STA REG0,X ;STORE IT DEX BPL SERSLOOP CPY #$07 BMI SERLOOP SEROUT RTS * OFFSET TABLES AND MASK BYTES USED BY SETTINGS HSEROFF DB H(REG0),H(REG2),H(REG4),H(REG6) DB H(REG8),H(REG10),H(REG12),H(REG14) * ADD TWO NUMBERS - CALLER MODIFIES ADDMOD+1,ADDMOD+2 TO THE ADDRESS ... * REGISTER TO BE ADDED IN. CALLER MODIFIES ADACMOD0..3+1 FOR OFFSET ... * ACCUMULATOR. * INPUT: ACC, REGN, OFFSETR, X * OUTPUT: ACC * ACC = ACC + REGN MULTADD LDY OFFSETR ;START AT THE END OF THE REGI... CLC ADDLOOP ADACMOD0 LDA ACC,Y ;ADD THE REGISTER TO THE ACCU... ADDMOD ADC REG0,Y ADACMOD1 STA ACC,Y DEY BPL ADDLOOP ;KEEP GOING TILL REGISTER EXHA... ADDLOOP2 BCC ADDOUT ;IF CARRY CLEAR, ALL DONE ADACMOD2 LDA ACC-$100,Y ;PROPAGATE CARRY (Y IS WRAPPED... ADC #$00 ADACMOD3 STA ACC-$100,Y DEY JMP ADDLOOP2-CODEDIF ADDOUT RTS * SUBTRACT TWO NUMBERS - CALLER MODIFIES SUBMOD+1,SUBMOD+2 TO THE AD... * THE REGISTER TO BE SUBTRACTED. CALLER MODIFIES SBACMOD0..3+1 TO T... * INTO THE ACCUMULATOR. * INPUT: ACC, REGN, OFFSETR, X * OUTPUT: ACC * ACC = ACC - REGN DIVSUB LDY OFFSETR ;START AT THE END OF THE REG... SEC SUBLOOP SBACMOD0 LDA ACC,Y ;ADD THE REGISTER TO THE ACC... SUBMOD SBC REG0,Y SBACMOD1 STA ACC,Y DEY BPL SUBLOOP ;KEEP GOING TILL REGISTER EX... SUBLOOP2 BCS SUBOUT ;IF CARRY CLEAR, ALL DONE SBACMOD2 LDA ACC-$100,Y ;PROPAGATE CARRY (Y IS WRAPP... SBC #$00 SBACMOD3 STA ACC-$100,Y DEY JMP SUBLOOP2-CODEDIF SUBOUT RTS * COMPARE TWO NUMBERS - CALLER MODIFIES CMPMOD+1,CMPMOD+2 TO THE ADD... * THE REGISTER TO BE SUBTRACTED. CMACMOD+1 IS MODIFIED FOR THE OFFS... * THE ACCUMULATOR. * INPUT: ACC, REGN, OFFSETR * OUTPUT: CARRY SET IF REGISTER LESS THAN ACCUMULATOR DIVCOMP LDY #$00 ;START AT THE TOP OF THE REG... CMPLOOP CMACMOD LDA ACC,Y ;ADD THE REGISTER TO THE ACC... CMPMOD CMP REG0,Y BEQ CMPNEXT CMPOUT RTS CMPNEXT CPY OFFSETR ;WE HAVE TO LOOK AT ANOTHER,... BEQ CMPOUT ; HAVE MADE IT TO THE END O... INY ;NO, DO ANOTHER BYTE JMP CMPLOOP-CODEDIF * VECTOR.S WE HAVE DETERMINED VALIDITY, VECTOR TO CART IN 2600... * 3600 MODE SETMARIA LDX #$16 ;~~~~~~~~~IN 3600 MODE, CART... STX INPTCTRL TXS SED JMP ($FFFC) ;VECTOR INTO THE CART IN 360... LOCK2600 LDA #$02 ;TURN SECURITY ROM ON STA INPTCTRL ;LOCK CART IN 2600 MODE, CART... LDX #$7F ;MOVE CODE TO RAM L2LOOP LDA SYNC,X ;MOVE INTO 6532 RAM STA $480,X DEX BPL L2LOOP JMP $480 ;AND EXECUTE OUT OF RAM SYNC LDA #0 TAX ZEROLP STA 1,X INX CPX #$2C BNE ZEROLP LDA #4 STA 2 LDA #4 NOP BMI E LDX #4 DEX DEX BPL DEX TXS STA $110 JSR DUMMY+1-SYNC+$480 JSR DUMMY+1-SYNC+$480 STA $11 STA 2 STA $1B STA $1C STA $F STA 2 BIT 3 BMI OUT E LDA #2 STA 9 STA $F112 BNE DONE OUT BIT 2 BMI DONE LDA #2 STA 6 STA $F118 DUMMY STA $F460 DONE LDA #$FD STA 8 JMP ($FFFC) ENDROM NOP ;END OF FIRST PART OF ROM * TEST.S RAM AND CPU TESTS - IF EITHER ARE BAD, DECRYPTION WI... * THUS, THESE MUST BE TESTED FIRST * ***** NOTE: ***** THE FOLLOWING INSTRUCTIONS ARE NOT TESTED BY THE... * AND THUS SHOULD NOT BE USED IN THE VALIDATION/DECRYPTION CODE: * BRK, RTI, PLP, PHP, CLV, SEV, BVC, BVS, CLD, SED, BIT, SEI,... * TEST FAILURE MODES BADCPU EQU $00 ;CPU ERROR BAD6116A EQU $01 ;ERROR IN RAM $2000-$27FF BAD6116B EQU $02 ;ERROR IN RAM $1800-$1FFF BADRAM EQU $03 ;CAN'T GET TO ANY OF THE RAM BADMARIA EQU $04 ;MARIA SHADOWING NOT WORKING BADVALID EQU $05 ;BAD VALIDATION OR DECRYPTION ORG ROMCODE2 FATAL$ LDA #$1D ;THERE HAS BEEN SOMETHING BA... STA INPTCTRL ;LOCK IN 2600 MODE, TEST CART... MAIN SEI ;INITIALIZE CLD LDA #$02 ;PUT BASE UNIT INTO MARIA ENA... STA INPTCTRL LDA #H(ENDDLI) ;WESTBERG SUX STA DLIADDR+1 ;WESTBERG SUX LDA #L(ENDDLI) ;WESTBERG SUX STA DLIADDR ;WESTBERG SUX LDA #$7F STA CTRL ;TURN OFF DMA LDA #$00 STA BACKGRND ;BACKGROUND COLOR TO BLACK * ***** RAM TESTS ***** * A SIMPLE RAM TEST TO CHECK PAGES $2000 AND $2100 IS DONE FIRST TO ... * ENOUGH RAM TO TEST OUT THE CPU (SHADOWED TO PAGES $0000 AND $0100). * THE CPU TEST, A FULL RAM TEST IS DONE * EARLY RAM TEST, JUST CHECK OUT OUR TWO PAGES USING MINIMAL INSTRUC... RAMCHECK LDX #$05 ;TEST OUT 4 PATTERNS OF RAM RCAGAIN LDA RAMPAT,X LDY #$00 RCLOOP STA $2000,Y ;CHECK ZERO PAGE CMP $2000,Y BNE CHKRAMB STA $2100,Y ;CHECK PAGE 1 CMP $2100,Y BNE CHKRAMB DEY BNE RCLOOP DEX BPL RCAGAIN * SEE IF MARIA SHADOWING WORKS LDA #$43 ;A SIMPLE ~~~~ TO SEE IF SHAD... STA $2080 CMP $0080 BNE MARIAERR STA $2180 CMP $0180 BNE MARIAERR JMP CPUTEST ;IF SHADOW~~~~~~~ RAM WORKS, ... * RAM FAILURE ROUTINES MARIAERR LDY #BADMARIA ;MARIA SHADOWING BAD JMP FATAL$ CHKRAMB STA $1800 ;RAMA HAS FAILED IN SIMPLE TE... CMP $1800 ; TO SEE IF ANY RAM WORKS BNE RAMERR RAMAERR LDY #BAD6116A ;BAD RAM CHIP - $2000-$27FF JMP FATAL$ RAMBERR LDY #BAD6116B ;BAD RAM CHIP - $1800-$1FFF JMP FATAL$ RAMERR LDY #BADRAM ;ALL RAM BAD - COULD BE ANOTH... JMP FATAL$ * A FULL RAM TEST, TO BE DONE AFTER THE CPU TEST SUCEEDS RAMTEST LDA #$00 ;SET UP STATE TO MARCH THROU... STA $F0 ;(F0) = $2000 STA $F2 ;(F2) = $1800 LDY #$07 ;NUMBER OF PAGES TO CHECK STY $F4 RTPAGE LDA RAMAPAGE,Y ;SET UP RAM A PAGE TO CHECK STA $F1 LDA RAMBPAGE,Y ;SET UP RAM B PAGE TO CHECK STA $F3 LDX #$05 ;NUMBER OF RAM PATTERNS TO C... RTPAT LDA RAMPAT,X ;GET RAM PATTERN LDY #$00 ;INITIALIZE INDEX RTLOOP STA ($F0),Y ;CHECK RAM A CMP ($F0),Y BNE RAMAERR STA ($F2),Y ;CHECK RAM B CMP ($F2),Y BNE RAMBERR DEY BNE RTLOOP DEX BPL RTPAT DEC $F4 ;ONE LESS PAGE LDY $F4 BPL RTPAGE JMP STARTVND ;START THE VALIDATION AND DE... RAMPAT DB $00,$FF,$55,$AA,$69,$0F ;PATTERNS FOR RA... RAMAPAGE DB $22,$23,$24,$25,$26,$27,$22,$23 ;HI BYTES OF RAM... RAMBPAGE DB $18,$19,$1A,$1B,$1C,$1D,$1E,$1F ;HI BYTES OF RAM... * ***** CPU TESTS ***** IRQINT ;IF WE GET AN IRQ, IT IS A C... CPUERR LDY #BADCPU ;CPU ERROR JMP FATAL$ * CPU TEST, METHODICALLY CHECK ALL INSTRUCTIONS, ADDRESSING MODES, AN... * BITS THAT THE DECRYPTION WILL BE USING CPUTEST LDA #$AA ;FIRST, TEST OUT LDA AND BRA BEQ CPUERR ;CHECK BEQ FAIL BPL CPUERR ;CHECK BPL FAIL BMI CTA ;CHECK BMI SUCCEED JMP CPUERR CTA BNE CTB ;CHECK BNE SUCCEED JMP CPUERR CTB STA $AA ;STORE IT ~~~~~ $AA = AA CMP $AA ;SEE IF IT ADDRESSES AND COM... BNE CPUERR LDA #$00 ;TEST ALTERNATE POLARITY BNE CPUERR ;CHECK BNE FAIL BMI CPUERR ;CHECK BMI FAIL BPL CTC ;CHECK BPL SUCCEED JMP CPUERR CTC BEQ CTD ;CHECK BEQ SUCCEED JMP CPUERR CTD CMP #$00 BNE CPUERR ;CHECK CMP FAIL BCC CPUERR ;CHECK BCC FAIL BCS CTE ;CHECK BCS SUCCEED JMP CPUERR CTE CMP #$01 BCS CPUERR ;CHECK BCS FAIL BCC CTF ;CHECK BCC SUCCEED JMP CPUERR CTF LDX #$55 ;TEST X AND Y LOADS, STORES CPX #$56 ;CHECK CPX BEQ CPUERR STX $1AA ;CHECK STX - $1AA = 55 CPX $1AA ;CHECK CPX BNE CPUERR LDY $AA ;CHECK LDY, - Y = AA CPY #$AB BEQ CPUERR STY $155 ;CHECK STY - $155 = AA CPY $155 ;CHECK CPY BNE CPUERR DEX ;CHECK TRANSFER DATA PATHS A... TXS ;TO POINT TO $155, S MUST BE... INX PLA ;S HAS 55, A = $155 (= AA) CMP #$AA ;TEST TXS AND PLA BNE CPUERR0 TXA ;A = 55 PHA ;$155 = 55 CPX $155 ;TEST TXA DNA PHA BNE CPUERR0 TYA ;A = AA CMP #$AA ;TEST TYA BNE CPUERR0 TAX LDA $100,X ;NORM,X - A = $1AA (= 55) TAY ;Y = 55 CPY #$55 ;TEST NORM,X, TAX, TAY BNE CPUERR0 ;TEST ADDRESSING MODES (NORM... LDA $00,X ;ZP,X - A = $AA (= AA) CMP $AA ;ZP, TEST ZP AND ZP,X BNE CPUERR0 CMP #$AA ;TEST ZP AND ZP,X BNE CPUERR0 EOR #$FF ;A = 55 STA $00,Y ;ZP,Y - $55 = 55 CMP $55 BNE CPUERR0 CMP $100,Y ;NORM,Y ($155) BNE CPUERR0 CMP $20AB,X ;NORM,X W/WRAP ($155) BNE CPUERR0 LDA #$20 ;SET UP ADDR, TEST (IND,X), (... STA $F1 LDA #$CC STA $F0 ;($F0) = $20CC (WHICH IS $CC) STA ($F0-$AA,X) ;(IND,X) - $CC = CC CMP $CC BNE CPUERR0 STA ($F0),Y ;(IND),Y - $2121 = CC CMP $2121 BNE CPUERR0 LDA #L(CTCONT) ;TEST (IND), ONLY JMP USES STA $F0 LDA #H(CTCONT) STA $F1 JMP ($F0) ;(IND) JMP CPUERR0 CPUERR0 JMP CPUERR ;ANOTHER CPUERR CTCONT LDA #$55 ;TEST ADDER CLC ADC #$55 ;55 - 55 = AA NOP ;NOP, MAKE SURE IT DOESN'T A... BCS CPUERR0 BPL CPUERR0 BEQ CPUERR0 CMP #$AA BNE CPUERR0 ; SEC ADC #$55 ;AA + 55 + C = 0 + C NOP ;NOP, MAKE SURE IT DOESN'T AL... BCC CPUERR0 BMI CPUERR0 BNE CPUERR0 ; SEC ;TEST SU~~~~~~~~~ SBC #$55 ;0 - 55 ~~~~~~~~~ BCS CPUERR0 BPL CPUERR0 BEQ CPUERR0 CMP #$AB BNE CPUERR0 CLC SBC #$AA ;AB - AA ~~~~~~~~ BCC CPUERR0 BMI CPUERR0 BNE CPUERR0 LDA #$FF ;TEST OUT INCREMENTS AND DEC... TAX ;X = FF INX ;TEST INX - X = 0 BNE CPUERR1 DEX ;TEST DEX - X = FF BEQ CPUERR1 BPL CPUERR1 CPX #$FF BNE CPUERR1 TAY ;Y = FF INY ;TEST INY - Y = 0 BNE CPUERR1 DEY ;TEST DEY - Y = FF BEQ CPUERR1 INY ;Y = 0 BNE CPUERR1 STA $F0 ;$F0 = FF INC $F0 ;TEST INC - $F0 = 0 BNE CPUERR1 CPY $F0 BNE CPUERR1 DEC $F0 ;TEST DEC - $F0 = FF BEQ CPUERR1 CMP $F0 BNE CPUERR1 LDA #$AA ;TEST SHIFTS AND ROTATES - 1... CLC ;C = 0 ROL A ;01010100, C=1 ROL A ;10101001, C=0 ROL A ;01010010, C=1 CMP #$52 ;01010010 BNE CPUERR1 ; SEC ;C = 1 ROR A ;10101001, C=0 ROR A ;01010100, C=1 ROR A ;10101010, C=0 CMP #$AA ;10101010 BEQ CTSHIFT CPUERR1 JMP CPUERR ;ANOTHER CPUERR CTSHIFT ASL A ;01010100, C=1 BCC CPUERR1 ASL A ;10101000, C=0 BCS CPUERR1 ASL A ;01010000, C=1 CMP #$50 BNE CPUERR1 EOR #$05 ;01010101 LSR A ;00101010, C=1 BCC CPUERR1 LSR A ;00010101, C=0 BCS CPUERR1 LSR A ;00001010, C=1 CMP #$0A BNE CPUERR1 LDA #$55 ;TEST LOGICAL OPERATIONS ORA #$1B ;TEST OR - A = 5F CMP #$5F BNE CPUERR1 AND #$55 ;A = 55 AND #$1B ;TEST AND - A = 11 CMP #$11 BNE CPUERR1 ORA #$55 ;A = 55 EOR #$1B ;TEST EOR CMP #$4E BNE CPUERR1 JSR CTJSR ;GRAND FINALE, TEST JSR, S =... CTJSRRET JMP CPUERR1 ;NO GOOD IF WE DIDN'T JSR CTJSR TSX ;SEE WHERE STACK IS CPX #$52 BNE CPUERR1 PLA ;GET RETURN ADDRESS CMP #L(CTJSRRET-1) BNE CPUERR1 PLA CMP #H(CTJSRRET-1) BNE CPUERR1 LDA #H(RAMTEST-1) ;PUT START OF CODE AS RETURN PHA LDA #L(RAMTEST-1) PHA RTS ;DO IT JMP CPUERR1 ;AGAIN, NO GOOD IF WE DI... * KERNEL.S DLI ROUTINES FOR THE SECURITY ROM * OUR DLI HANDLER DLI TXA ;STACK REGISTERS, A ALRE... PHA LDA #$43 STA CTRL LDX #$0F LDA FUJICOLR STA P0C2 ;INITIALIZE COLOR BIT KNLOFSET ;FIGURE OUT STAGGERING BVC DFJMP1 BPL DFJMP0 DFLOOP STA WSYNC ;CHANGE COLOR ONCE PER ... DFJMP0 STA WSYNC ;SECOND LINE DFJMP1 STA WSYNC ;THIRD LINE SEC SBC #$10 CMP #$10 BCS DFNEXT SBC #$0F DFNEXT STA P0C2 ;CHANGE COLORS DEX BPL DFLOOP DLIATARI LDX #$40 ;SET UP CTRL FOR ATARI STX CTRL AND #$F0 ORA #$0E STA P1C3 LDA FUJICOLR AND #$F0 ORA #$06 STA P1C1 AND #$F0 CLC ;ROTATE BAR COLOR ADC #$40 BCC DLAJMP ADC #$0F DLAJMP ORA #$03 STA P1C2 DEC KNLCOUNT ;SEE IF TIME FOR A COLOR... BPL DLIDONE LDA KNLOFSET ;SEE IF TIME TO STAGGER, OR ... ADC #$60 BCC DLIOFSET LDA FUJICOLR ;ROTATE FUJI COLOR CLC ADC #$10 BCC DLJMP0 ADC #$0F DLJMP0 STA FUJICOLR LDA KNLTIME ;RESET TIMER STA KNLCOUNT LDA #$00 DLIOFSET STA KNLOFSET ;UPDATE KERNAL STAGGERING CO... DLIDONE LDA #$02 ;NOTE THAT WE HAVE DONE KERN... STA KNLSTATE PLA ;UNSTACK REGISTERS TAX ENDDLI PLA RTI INFLOOP JMP INFLOOP * MAIN.S MAIN ROUTINE FOR DECRYPTION CODE * CALLED FROM ROUTINES IN TESTS.S STARTVND LDX #STACKPTR TXS ;SET STACK POINTER LDA #0 ;ZERO THE TIA REGISTERS OUT TAX TIA0LOOP STA 1,X INX CPX #$2C BNE TIA0LOOP LDA #$02 ;BACK INTO MARIA MODE STA INPTCTRL * THIS ROUTINE DROPS OUR CODE INTO RAM DROPRAM LDX #$00 ;X = 0, DROP CODE AND GRAPHI... STX BACKGRND ;PUT BACKGROUND TO BLACK DRLOOP LDA ROMCODE+$000,X ;DROP CODE STA RAMCODE+$000,X LDA ROMCODE+$100,X STA RAMCODE+$100,X LDA ROMCODE+$200,X STA RAMCODE+$200,X LDA ROMCODE+$300,X STA RAMCODE+$300,X LDA ROMCODE+$400,X STA RAMCODE+$400,X LDA ROMDLIST,X ;DROP DISPLAY LISTS STA RAMDLIST,X CPX #$00 BMI DRLJMP0 LDA ROMDLL,X ;DROP DL~~~~~~ STA RAMDLL,X LDA ROMGRPH6,X ;DROP GRAPHICS INTO HALF PAGE STA RAMGRAPH+$000,X LDA ROMGRPH5,X STA RAMGRAPH+$100,X LDA ROMGRPH4,X STA RAMGRAPH+$200,X LDA ROMGRPH3,X STA RAMGRAPH+$300,X LDA ROMGRPH2,X STA RAMGRAPH+$400,X LDA ROMGRPH1,X STA RAMGRAPH+$500,X DRLJMP0 DEX BNE DRLOOP JMP CARTTEST-CODEDIF ;START THE DECRYPTION * TURN THE GRAPHICS ON GRAPHON LDA $FFF9 ;SEE IF DISPLAY IS TO BE START... AND #$04 BEQ STRTCRPT GRAPHON2 LDA #$03 ;SET UP KERNEL STA KNLCOUNT STA KNLTIME LDA #$49 ;SET COLOR STA FUJICOLR LDA #$66 STA P1C1 LDA #$56 STA P1C2 LDA #$2E STA P1C3 LDA #L(DLI) ;SET DLI STA DLIADDR LDA #H(DLI) STA DLIADDR+1 SCREENOF BIT MSTAT ;IS VBLANK ENDED YET? BMI SCREENOF SCREENON BIT MSTAT ;IS VBLNAK STARTED YET? BPL SCREENON LDA #L(RAMDLL) STA DPPL ;SET DPPL AND DPPH TO DLLIST LDA #H(RAMDLL) STA DPPH LDA #$43 STA CTRL ;TURN GRAPHICS ON STRTCRPT RTS * DISPLAY LISTS ROMDLIST DB L(RAMGRAPH),$1F,H(RAMGRAPH),$BB,$00,$00 ;4 BY... RDL5BYTE DB L(RAMGRAPH),$40,H(RAMGRAPH),$1F,$BB,$00,$00 ;5 BY... RDLFUJI1 DB L(RAMGRAPH+ROMFUJI1-ROMGRAPH),$1C,H(RAMGRAPH),$4A,$00,$00 RDLFUJI2 DB L(RAMGRAPH+ROMFUJI2-ROMGRAPH),$1C,H(RAMGRAPH),$4A,$00,$00 RDLFUJI3 DB L(RAMGRAPH+ROMFUJI3-ROMGRAPH),$1C,H(RAMGRAPH),$48,$00,$00 RDLFUJI4 DB L(RAMGRAPH+ROMFUJI4-ROMGRAPH),$1B,H(RAMGRAPH),$46,$00,$00 RDLFUJI5 DB L(RAMGRAPH+ROMFUJI5-ROMGRAPH),$19,H(RAMGRAPH),$42,$00,$00 RDLFUJI6 DB L(RAMGRAPH+ROMFUJI6-ROMGRAPH),$17,H(RAMGRAPH),$3E,$00,$00 RDLFUJI7 DB L(RAMGRAPH+ROMFUJI7-ROMGRAPH),$17,H(RAMGRAPH),$3E,$00,$00 RDLRACE DB L(RAMGRAPH+ROMSTRIP-ROMGRPH3),$2C,H(RAMGRAPH+$300),$00 DB L(RAMGRAPH+ROMSTRIP-ROMGRPH3),$2C,H(RAMGRAPH+$300),$50,$00,$00 RDLRACEL DB L(RAMGRAPH+ROMSTRIP-ROMGRPH3),$2C,H(RAMGRAPH+$400),$00 DB L(RAMGRAPH+ROMSTRIP-ROMGRPH3),$2C,H(RAMGRAPH+$400),$50,$00,$00 RDLINE01 DB L(RAMGRAPH+ROMLINE1-ROMGRAPH),$2D,H(RAMGRAPH+$000),$28,$00,$00 RDLINE02 DB L(RAMGRAPH+ROMLINE2-ROMGRAPH),$2D,H(RAMGRAPH+$000),$28,$00,$00 RDLINE03 DB L(RAMGRAPH+ROMLINE3-ROMGRAPH),$2D,H(RAMGRAPH+$000),$28,$00,$00 RDLINE04 DB L(RAMGRAPH+ROMLINE4-ROMGRAPH),$2D,H(RAMGRAPH+$000),$28,$00,$00 RDLINE05 DB L(RAMGRAPH+ROMLINE1-ROMGRAPH),$2D,H(RAMGRAPH+$100),$28,$00,$00 RDLINE06 DB L(RAMGRAPH+ROMLINE2-ROMGRAPH),$2D,H(RAMGRAPH+$100),$28,$00,$00 RDLINE07 DB L(RAMGRAPH+ROMLINE3-ROMGRAPH),$2D,H(RAMGRAPH+$100),$28,$00,$00 RDLINE08 DB L(RAMGRAPH+ROMLINE4-ROMGRAPH),$2D,H(RAMGRAPH+$100),$28,$00,$00 RDLINE09 DB L(RAMGRAPH+ROMLINE1-ROMGRAPH),$2D,H(RAMGRAPH+$200),$28,$00,$00 RDLINE10 DB L(RAMGRAPH+ROMLINE2-ROMGRAPH),$2D,H(RAMGRAPH+$200),$28,$00,$00 RDLINE11 DB L(RAMGRAPH+ROMLINE3-ROMGRAPH),$2D,H(RAMGRAPH+$200),$28,$00,$00 * DISPLAY LIST LIST ROMDLL DB $0F,H(RAMDLIST),L(RAMDLIST+RDL5BYTE-ROMDLIST) ;5 BY... DB $0F,H(RAMDLIST),L(RAMDLIST+$00) DB $0F,H(RAMDLIST),L(RAMDLIST+$00) DB $0F,H(RAMDLIST),L(RAMDLIST+$00) DB $03,H(RAMDLIST),L(RAMDLIST+$00) DB $85,H(RAMDLIST),L(RAMDLIST+RDLFUJI1-ROMDLIST) DB $05,H(RAMDLIST),L(RAMDLIST+RDLFUJI2-ROMDLIST) DB $05,H(RAMDLIST),L(RAMDLIST+RDLFUJI3-ROMDLIST) DB $05,H(RAMDLIST),L(RAMDLIST+RDLFUJI4-ROMDLIST) DB $05,H(RAMDLIST),L(RAMDLIST+RDLFUJI5-ROMDLIST) DB $05,H(RAMDLIST),L(RAMDLIST+RDLFUJI6-ROMDLIST) DB $05,H(RAMDLIST),L(RAMDLIST+RDLFUJI7-ROMDLIST) DB $0F,H(RAMDLIST),L(RAMDLIST+$00) ;CENTER SPACE DB $01,H(RAMDLIST),L(RAMDLIST+RDLRACE-ROMDLIST) ;ATAR... DB $00,H(RAMDLIST),L(RAMDLIST+RDLINE01-ROMDLIST) DB $02,H(RAMDLIST),L(RAMDLIST+RDLRACE-ROMDLIST) DB $00,H(RAMDLIST),L(RAMDLIST+RDLINE02-ROMDLIST) DB $02,H(RAMDLIST),L(RAMDLIST+RDLRACE-ROMDLIST) DB $00,H(RAMDLIST),L(RAMDLIST+RDLINE03-ROMDLIST) DB $02,H(RAMDLIST),L(RAMDLIST+RDLRACE-ROMDLIST) DB $00,H(RAMDLIST),L(RAMDLIST+RDLINE04-ROMDLIST) DB $02,H(RAMDLIST),L(RAMDLIST+RDLRACE-ROMDLIST) DB $00,H(RAMDLIST),L(RAMDLIST+RDLINE05-ROMDLIST) DB $02,H(RAMDLIST),L(RAMDLIST+RDLRACE-ROMDLIST) DB $00,H(RAMDLIST),L(RAMDLIST+RDLINE06-ROMDLIST) DB $02,H(RAMDLIST),L(RAMDLIST+RDLRACE-ROMDLIST) DB $00,H(RAMDLIST),L(RAMDLIST+RDLINE07-ROMDLIST) DB $02,H(RAMDLIST),L(RAMDLIST+RDLRACE-ROMDLIST) DB $00,H(RAMDLIST),L(RAMDLIST+RDLINE08-ROMDLIST) DB $02,H(RAMDLIST),L(RAMDLIST+RDLRACE-ROMDLIST) DB $00,H(RAMDLIST),L(RAMDLIST+RDLINE09-ROMDLIST) DB $02,H(RAMDLIST),L(RAMDLIST+RDLRACE-ROMDLIST) DB $00,H(RAMDLIST),L(RAMDLIST+RDLINE10-ROMDLIST) DB $02,H(RAMDLIST),L(RAMDLIST+RDLRACE-ROMDLIST) DB $00,H(RAMDLIST),L(RAMDLIST+RDLINE11-ROMDLIST) DB $01,H(RAMDLIST),L(RAMDLIST+RDLRACEL-ROMDLIST) DB $0F,H(RAMDLIST),L(RAMDLIST+$00) ;TRAILING SPA... DB $0F,H(RAMDLIST),L(RAMDLIST+$00) DB $0F,H(RAMDLIST),L(RAMDLIST+$00) DB $0F,H(RAMDLIST),L(RAMDLIST+$00) DB $0F,H(RAMDLIST),L(RAMDLIST+$00) * ROM GRAPHICS FOR THE FUJI-A AND WORDS ROMGRAPH ROMGRPH6 DB $00 ;NULL INFO ROMFUJI1 DB $7C,$7F,$8F,$80 ;LINE 6 ROMFUJI2 DB $FC,$7F,$8F,$C0 ROMFUJI3 DB $1F,$87,$F8,$7E ROMFUJI4 DB $0F,$E0,$7F,$81,$FC ROMFUJI5 DB $07,$FF,$80,$7F,$80,$7F,$F8 ROMFUJI6 DB $1F,$FF,$F0,$00,$7F,$80,$03,$FF,$FE ROMFUJI7 DB $1F,$00,$00,$00,$7F,$80,$00,$00,$3E ROMLINE1 DB $00,$00,$0C,$00,$3F,$FF,$FF,$FF ;LINE 1 OF A... DB $F0,$00,$C0,$00,$00,$3F,$FF,$FF DB $00,$03,$FC ROMLINE2 DB $00,$00,$3F,$00,$3F,$FF,$FF,$FF ;LINE 2 OF A... DB $F0,$03,$F0,$00,$00,$3F,$FF,$FF DB $FC,$03,$FC ROMLINE3 DB $00,$00,$FF,$C0,$00,$03,$FF,$00 ;LINE 3 OF ... DB $00,$0F,$FC,$00,$00,$3F,$F0,$03 DB $FF,$C3,$FC ROMLINE4 DB $00,$03,$FF,$F0,$00,$03,$FF,$00 ;LINE 4 OF AT... DB $00,$3F,$FF,$00,$00,$3F,$F0,$00 DB $3F,$C3,$FC ROMGRPH5 DB $00 ;NULL INFO DB $7C,$7F,$8F,$80 ;LINE 5 DB $7C,$7F,$8F,$80 DB $1F,$87,$F8,$7E DB $0F,$F0,$7F,$83,$FC DB $01,$FF,$80,$7F,$80,$7F,$E0 DB $1F,$FF,$F8,$00,$7F,$80,$07,$FF,$FE DB $1F,$F0,$00,$00,$7F,$80,$00,$03,$FE DB $00,$0F,$F3,$FC,$00,$03,$FF,$00 ;LINE 5 OF ... DB $00,$FF,$3F,$C0,$00,$3F,$F0,$00 DB $FF,$C3,$FC DB $00,$3F,$C0,$FF,$00,$03,$FF,$00 ;LINE 6 OF ... DB $03,$FC,$0F,$F0,$00,$3F,$F0,$3F DB $FC,$03,$FC DB $00,$FF,$00,$3F,$C0,$03,$FF,$00 ;LINE 7 OF ... DB $0F,$F0,$03,$FC,$00,$3F,$F0,$FF DB $C0,$03,$FC DB $03,$FF,$FF,$FF,$F0,$03,$FF,$00 ;LINE 8 OF ... DB $3F,$FF,$FF,$FF,$00,$3F,$F0,$3F DB $F0,$03,$FC ROMGRPH4 DB $00 ;NULL INFO DB $7C,$7F,$8F,$80 ;LINE 4 DB $7C,$7F,$8F,$80 DB $1F,$87,$F8,$7E DB $07,$F0,$7F,$83,$F8 DB $00,$FF,$C0,$7F,$80,$FF,$C0 DB $1F,$FF,$FC,$00,$7F,$80,$0F,$FF,$FE DB $1F,$FC,$00,$00,$7F,$80,$00,$0F,$FE DB $0F,$FF,$FF,$FF,$FC,$03,$FF,$00 ;LINE 9 OF ... DB $FF,$FF,$FF,$FF,$C0,$3F,$F0,$0F DB $FC,$03,$FC DB $3F,$F0,$00,$03,$FF,$03,$FF,$03 ;LINE 10 OF... DB $FF,$00,$00,$3F,$F0,$3F,$F0,$03 DB $FF,$03,$FC DB $FF,$C0,$00,$00,$FF,$C3,$FF,$0F ;LINE 11 OF A... DB $FC,$00,$00,$0F,$FC,$3F,$F0,$00 DB $FF,$C3,$FC ROMGRPH3 DB $00 ;NULL INFO DB $7C,$7F,$8F,$80 ;LINE 3 DB $7C,$7F,$8F,$80 DB $0F,$87,$F8,$7C DB $07,$F0,$7F,$83,$F8 DB $00,$7F,$C0,$7F,$80,$FF,$80 DB $1F,$FF,$FE,$00,$7F,$80,$1F,$FF,$FE DB $1F,$FF,$00,$00,$7F,$80,$00,$3F,$FE ROMSTRIP DB $55,$55,$55,$55,$55,$55,$55,$55 ;RACING STR... DB $55,$55,$55,$55,$55,$55,$55,$55 DB $55,$55,$55,$55 ROMGRPH2 DB $00 ;NULL INFO DB $7C,$7F,$8F,$80 ;LINE 2 DB $7C,$7F,$8F,$80 DB $0F,$C7,$F8,$FC DB $03,$F0,$7F,$83,$F0 DB $00,$3F,$E0,$7F,$81,$FF,$00 DB $01,$FF,$FE,$00,$7F,$80,$1F,$FF,$E0 DB $1F,$FF,$C0,$00,$7F,$80,$00,$FF,$FE DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA ;RACING STR... DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA DB $AA,$AA,$AA,$AA ROMGRPH1 DB $00 ;NULL INFO DB $7C,$7F,$8F,$80 ;LINE 1 DB $7C,$7F,$8F,$80 DB $0F,$C7,$F8,$FC DB $03,$F8,$7F,$87,$F0 DB $00,$1F,$E0,$7F,$81,$FE,$00 DB $00,$1F,$FF,$00,$7F,$80,$3F,$FE,$00 DB $1F,$FF,$E0,$00,$7F,$80,$01,$FF,$FE DB $55,$55,$55,$55,$55,$55,$55,$55 ;RACING STR... DB $55,$55,$55,$55,$55,$55,$55,$55 DB $55,$55,$55,$55 * NUMBERS.S NUMBERS FOR THE ENCRYPTION ~~~~~~~~~ * THIS IS A MASK APPLIED TO THE HI BYTE OF TH~~~~~~~~~~~ MAKE SURE... * LESS THAN N NMASK EQU $07 * N = P*Q, THE BASIC MODULO OF DECRYPTION NLEN EQU $77 N DB $09,$CA,$C9,$C6,$B4,$12,$08,$1B DB $60,$58,$81,$4B,$86,$01,$D8,$BF DB $D9,$25,$A0,$7B,$DC,$32,$79,$84 DB $3B,$7C,$BC,$2F,$E2,$E2,$FA,$8D DB $0A,$00,$3B,$C5,$EC,$AF,$2D,$8A DB $CD,$06,$93,$6A,$A5,$14,$46,$77 DB $C4,$6A,$B2,$53,$36,$EF,$8C,$CE DB $0C,$A2,$68,$71,$D3,$73,$E8,$F7 DB $6D,$06,$B5,$20,$EF,$23,$47,$0C DB $51,$55,$C8,$FE,$F4,$58,$C4,$3F DB $20,$A7,$67,$38,$B0,$76,$E2,$C4 DB $D8,$05,$63,$F8,$3C,$58,$3B,$2D DB $22,$CC,$88,$B3,$71,$8F,$1D,$80 DB $0A,$87,$BD,$A1,$59,$23,$E9,$70 DB $E2,$D3,$EC,$46,$68,$80,$42,$39 * END.S END OF CODE ENDROM2 NOP ORG $FFEE DB 'GCC(C)1984' ORG $FFF8 DB $F0 ;CHECKSUM, MAKES EOR CHECK... DB $F7 ;CART STARTS AT $F000 - 7 ... DW INTDLI ;INTERNAL GAME DLI HANDLER DW MAIN DW IRQINT END