253 lines
5.2 KiB
NASM
253 lines
5.2 KiB
NASM
![]() |
;;============================================================================
|
||
|
;;
|
||
|
;; 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 $????
|
||
|
|