;;============================================================================ ;; ;; SSSS tt lll lll ;; SS SS tt ll ll ;; SS tttttt eeee ll ll aaaa ;; SSSS tt ee ee ll ll aa ;; SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator" ;; SS SS tt ee ll ll aa aa ;; SSSS ttt eeeee llll llll aaaaa ;; ;; Copyright (c) 1995-2012 by Bradford W. Mott, Stephen Anthony ;; and the Stella Team ;; ;; See the file "License.txt" for information on usage and redistribution of ;; this file, and for a DISCLAIMER OF ALL WARRANTIES. ;; ;; $Id: scrom.asm,v 1.3 2005-06-16 01:11:29 stephena Exp $ ;;============================================================================ ;; ;; This file contains a "dummy" Supercharger BIOS for Stella. It is based ;; on routines developed by Eckhard Stolberg. ;; ;;============================================================================ processor 6502 VSYNC equ $00 VBLANK equ $01 WSYNC equ $02 COLUPF equ $08 COLUBK equ $09 CTRLPF equ $0a PF0 equ $0d PF1 equ $0e PF2 equ $0f RESP0 equ $10 RESP1 equ $11 AUDC0 equ $15 AUDF0 equ $17 AUDV0 equ $19 AUDV1 equ $1a GRP0 equ $1b GRP1 equ $1c ENAM0 equ $1d ENAM1 equ $1e ENABL equ $1f HMP0 equ $20 HMP1 equ $21 HMOVE equ $2a ;; ;; Entry point for multi-load reading ;; org $F800 LDA $FA ; Grab the load number and store it in $80 where the STA $80 ; emulator will grab it when it does the loading JMP clrp7 ; Go clear page 7 of RAM bank 1 like the real SC ;; ;; Entry point for initial load (invoked when the system is reset) ;; org $F80A start SEI CLD ;; ;; Clear page zero routine for initial load (e.g., RAM and TIA registers) ;; LDY #$00 LDX #$00 ilclr STY $00,X INX BNE ilclr JMP load ;; ;; Clear page 7 of RAM bank 1 (used for stars in the real SC) ;; clrp7 LDX #$00 LDA $F006,X LDA $FFF8 LDX #$00 mlclr3 LDA $F000 NOP LDA $F700,X DEX BNE mlclr3 JMP load ;; ;; NOTE: The emulator does the actual reading of the new load when the ;; next instruction is accessed. The emulator expects the load number to ;; to be stored in location $80. As a side-effect the emulator sets $80 ;; to contain the bank selection byte from the load's header and sets ;; $FE and $FF to contain the starting address from the load's header. ;; load org $F850 ;; ;; Copy code into page zero to do the bank switching ;; LDX #$03 copy LDY code,X STY $FA,X DEX BPL copy ;; ;; Clear some of the 2600's RAM and TIA registers like the real SC BIOS does ;; LDY #$00 LDX #$28 mlclr1 STY $04,X DEX BPL mlclr1 LDX #$1C mlclr2 STY $81,X DEX BPL mlclr2 ;; ;; Display the "emulated" Supercharger loading progress bar ;; ;; Check if we should skip the loading progress bar ;; Note that the following code seems to never do a jump ;; However, the comparison value can be patched outside this code ;; LDA #$FF CMP #$00 ; patch this value to $FF outside ROM to do a jump BNE startbars JMP skipbars ;; Otherwise we display them startbars: LDA #$00 STA GRP0 STA GRP1 STA ENAM0 STA ENAM1 STA ENABL STA AUDV0 STA AUDV1 STA COLUPF STA VBLANK LDA #$10 STA HMP1 STA WSYNC LDX #$07 DEX pos DEX BNE pos LDA #$00 STA HMP0 STA RESP0 STA RESP1 STA WSYNC STA HMOVE LDA #%00000101 STA CTRLPF LDA #$FF STA PF0 STA PF1 STA PF2 STA $84 STA $85 LDA #$F0 STA $83 LDA #$74 STA COLUBK LDA #$0C STA AUDC0 LDA #$1F STA AUDF0 STA $82 LDA #$07 STA AUDV0 a1 LDX #$08 LDY #$00 a2 STA WSYNC DEY BNE a2 STA WSYNC STA WSYNC LDA #$02 STA WSYNC STA VSYNC STA WSYNC STA WSYNC STA WSYNC LDA #$00 STA VSYNC DEX BPL a2 ASL $83 ROR $84 ROL $85 LDA $83 STA PF0 LDA $84 STA PF1 LDA $85 STA PF2 LDX $82 DEX STX $82 STX AUDF0 CPX #$0A BNE a1 LDA #%00000010 STA VBLANK LDX #$1C LDY #$00 STY AUDV0 STY COLUBK clear: STY $81,x DEX BPL clear skipbars: ;; ;; Setup value to be stored in the bank switching control register ;; LDX $80 CMP $F000,X ;; ;; Initialize A, X, Y, and SP registers ;; LDA #$9a ;; This is patched outside the ROM to a random value LDX #$FF LDY #$00 TXS ;; ;; Execute the code to do bank switch and start running cartridge code ;; JMP $FA code dc.b $cd, $f8, $ff ;; CMP $fff8 dc.b $4c ;; JMP $????