dos33fsprogs/demos/mode7_demo/mode7_demo.s

371 lines
6.7 KiB
ArmAsm

.include "zp.inc"
square1_lo EQU $1000
square1_hi EQU $1200
square2_lo EQU $1400
square2_hi EQU $1600
scroll_row1 EQU $1800
scroll_row2 EQU $1900
scroll_row3 EQU $1a00
scroll_row4 EQU $1b00
; matches scroll_row1 - row3
star_x EQU $1800
star_y EQU $1900
star_z EQU $1a00
start:
;================================
; include VMW logo line 0
;================================
; Need to have lines at
; $4000 AA,AD,D5,AC,95
; $4400 A8,55,95,35,85
; $4800 A0,55,26,55,81
; $4C00 00,00,00,00,00
;.byte $AA,$AD,$D5,$AC,$95
tax ; $aa
lda $ACD5 ; $ad,$d5,$ac
sta $0,X ; $95,$00
;================================
; one-time setup
;================================
; Initialize the 2kB of multiply lookup tables
jsr init_multiply_tables
;================================
; Mockingboard detect
;================================
jsr mockingboard_detect_slot4 ; call detection routine
stx MB_DETECTED
;================================
; Mockingboard start
;================================
mockingboard_setup:
sei ; disable interrupts just in case
jsr mockingboard_init
jsr reset_ay_both
jsr clear_ay_both
;=========================
; Setup Interrupt Handler
;=========================
; Vector address goes to 0x3fe/0x3ff
; FIXME: should chain any existing handler
lda #<interrupt_handler
sta $03fe
lda #>interrupt_handler
sta $03ff
;============================
; Enable 50Hz clock on 6522
;============================
lda #$40 ; Continuous interrupts, don't touch PB7
sta $C40B ; ACR register
lda #$7F ; clear all interrupt flags
sta $C40E ; IER register (interrupt enable)
lda #$C0
sta $C40D ; IFR: 1100, enable interrupt on timer one oflow
sta $C40E ; IER: 1100, enable timer one interrupt
lda #$40
sta $C404 ; write into low-order latch
lda #$9c
sta $C405 ; write into high-order latch,
; load both values into counter
; clear interrupt and start counting
; 4fe7 / 1e6 = .020s, 50Hz
; 9c40 / 1e6 = .040s, 25Hz
;============================
; Start Playing
;============================
main_loop:
lda MB_DETECTED
beq mockingboard_setup_done
lda #0
sta DONE_PLAYING
sta WHICH_CHUNK
sta MB_CHUNK_OFFSET
sta MB_ADDRL ; we are aligned, so should be 0
lda #>music_start
sta MB_ADDRH
;=====================================
; clear register area
;=====================================
ldx #13 ; 2
lda #0 ; 2
mb_setup_clear_reg:
sta REGISTER_DUMP,X ; clear register value ; 4
sta REGISTER_OLD,X ; clear old values ; 4
dex ; 2
bpl mb_setup_clear_reg ; 2nt/3
cli ; start interrupts
mockingboard_setup_done:
;================================
; Clear screen and setup graphics
;================================
jsr set_gr_page0
lda #$4
sta DRAW_PAGE
;================================
; Main Loop
;================================
jsr title_routine
jsr checkerboard_demo
jsr island_demo
jsr star_demo
jsr star_credits
jmp main_loop
;===========================
; Checkerboard Demo
;===========================
checkerboard_demo:
; initialize
lda #>sky_background
sta INH
lda #<sky_background
sta INL
jsr decompress_scroll ; load sky background
lda #0 ; no draw blue sky
sta DRAW_BLUE_SKY
lda #$20 ; setup self-modifying code
sta nomatch ; to use checkerboard map
lda #<lookup_checkerboard_map
sta nomatch+1
lda #>lookup_checkerboard_map
sta nomatch+2
lda #$4c
sta nomatch+3
lda #<match
sta nomatch+4
lda #>match
sta nomatch+5
lda #<checkerboard_flying_directions
sta direction_smc_1+1
sta direction_smc_2+1
lda #>checkerboard_flying_directions
sta direction_smc_1+2
sta direction_smc_2+2
jmp mode7_flying ; call generic mode7 code
; rts ; tail call
;===========================
; Island Demo
;===========================
island_demo:
; initialize
lda #1
sta DRAW_BLUE_SKY
lda #$A5 ; fix the code that was self-modified
sta nomatch ; away in checkerboard code
lda #$6A
sta nomatch+1
lda #$8D
sta nomatch+2
lda #<(spacex_label+1)
sta nomatch+3
lda #>(spacex_label+1)
sta nomatch+4
lda #$29
sta nomatch+5
lda #<island_flying_directions
sta direction_smc_1+1
sta direction_smc_2+1
lda #>island_flying_directions
sta direction_smc_1+2
sta direction_smc_2+2
jmp mode7_flying
; rts ; tail call
;===========================
; Star Demo
;===========================
star_demo:
; initialize
lda #48
sta y_limit_smc+1
jsr starfield_demo ; tail call
rts
;===========================
; Star Credits
;===========================
star_credits:
; initialize
lda #40
sta y_limit_smc+1
jsr starfield_credits ; tail call
rts
;===========================
; Title routine
;===========================
title_routine:
bit FULLGR
jsr clear_screens_notext ; clear top/bottom of page 0/1
lda #<demo_rle
sta GBASL
lda #>demo_rle
sta GBASH
; Load offscreen
lda #<$c00
sta BASL
lda #>$c00
sta BASH
jsr load_rle_gr
;==========
; Fade in
;==========
jsr fade_in
;==========================================
; Make sure page0 and page1 show same image
;==========================================
jsr gr_copy_to_current
;===================
; Scroll the message
;===================
; Scroll "BY DEATER... A VMW PRODUCTION"
lda #>deater_scroll
sta INH
lda #<deater_scroll
sta INL
lda #40 ; scroll at bottom of screen
sta CV
jsr gr_scroll
; Scroll "* APPLE ][ FOREVER *"
lda #>a2_scroll
sta INH
lda #<a2_scroll
sta INL
jsr gr_scroll
;=============
; Fade out
;=============
jsr fade_out
rts
;============================
; These are placed so the VMW logo can be fit
;============================
.include "deater.scrolltext"
.include "a2.scrolltext"
.byte 0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0
.byte $A8,$55,$95,$35,$85 ; at $4400
.include "mockingboard.s"
.include "credits.s"
.include "interrupt_handler.s"
;.byte 0,0,0,0,0,0,0,0
;.byte 0,0,0,0,0,0,0,0 ; irq handler fix = +8 in size
.byte 0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0
.byte 0,0,0,0
.byte $A0,$55,$26,$55,$81 ; at $4800
.include "pageflip.s"
.include "rasterbars.s"
.include "starfield_demo.s"
.include "gr_unrle.s"
.include "gr_offsets.s"
.include "gr_setpage.s"
.byte 0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0 ; at $4c00
;===============================================
; External modules
;===============================================
.include "gr_fast_clear.s"
.include "gr_hlin_double.s"
.include "text_print.s"
.include "gr_fade.s"
.include "gr_plot.s"
.include "gr_copy.s"
.include "gr_scroll.s"
.include "mode7.s"
.include "mode7_demo_backgrounds.inc"
;===============================================
; More routines
;===============================================
.align 256
music_start:
.incbin "wave.krg"