|
Subject: [stella] bootstrap source code From: Eckhard Stolberg <Eckhard_Stolberg@xxxxxxxxxxxxxxxxxxxxx> Date: Fri, 23 Jul 1999 14:49:09 +0200 |
processor 6502
VSYNC = $00
VBLANK = $01
WSYNC = $02
INPT5 = $3D
SWCHA = $0280
SWACNT = $0281
INTIM = $0284
$0285 = $0285
LF000 = $F000
LF019 = $F019
LFFD0 = $FFD0
ORG $0000
RORG $FF00
LFF00: LDX #$FF ;set stack pointer to end of RAM
TXS ;
JSR LFF63 ;wait for timer, do VSYNC, set timer for 19456 cycles
LDY #$00
LDX #$36
LFF0A: LDA LFF83,X ;copy 55 bytes of code from $ff83-$ffb9
STA $80,X ; to $80-$b6 (write pulse delay at $80 was saved)
STY $44,X ; and clear TIA registers from $04 to $3a
DEX ;
BPL LFF0A ;
STY SWCHA ;set output pin = LOW
STX SWCHA ;set output pin = HIGH
; triggers start of the next full 6kb SC-RAM load ???
CLD ;clear decimal flag
LFF1B: LDY $B6 ;pointer to load information data
; LID: SC-RAM/ROM config byte
; number of 64 byte blocks to load
; start address to store new block (highbyte)
; start address to store new block (lowbyte)
LDA LFF00,Y ;load SC-RAM/ROM config byte
BNE LFF25 ;if not zero, continue to load data
JMP LFFD0 ;jump to startup code for next demo part?
; $ffd0-$ffff is the first block to be relaoded
LFF25: ORA $80 ;incorporate write pulse delay into SC-config byte
STA $82 ;patch loading code in VCS-RAM with new SC-config byte
LDX #$03 ;copy number of 64 bytes blocks to load to $bb
LFF2B: LDA LFF00,Y ; and vector for storing the block into $b9/$ba
STA $B9,X ;
INY ;
DEX ;
BPL LFF2B ;
STY $B6 ;pointer to LID has been increased by 4, save it
; initially it was #$bc, now it goes beyond
; #$d0 - $ffd0 gets replaced with new loads first
LFF36: JSR LFF63 ;wait for timer, do VSYNC, set timer for 19456 cycles
LFF39: LDY #$40 ;see if the demo unit is ready to send the next
LDA INPT5 ; 64 byte block (joystick button line = 0)
BMI LFF5A ; if not, test the timer again
STY SWCHA ;set output pin = LOW
PHA ;waste 9 cycles
PLA ;
DEY ;
STY SWCHA ;set output pin = HIGH (Y=$3f)
; triggers start of the next 64 byte block ???
JSR.w $0081 ;load next 64 bytes block
LDA $B9 ;increase loading vector lowbyte by 64 for next block
CLC ;
ADC #$40 ;
STA $B9 ;
BCC LFF56 ;if lowbyte > 256
INC $BA ; then increase highbyte
LFF56: DEC $BB ;decrease number of blocks to load
BEQ LFF1B ;if no more blocks are left, go and see if there is
; another load information data set
LFF5A: LDA INTIM ;is the timer for this frame almost expired?
CMP #$04 ;
BCS LFF39 ;if not, go and load next block
BCC LFF36 ;if yes, first wait for the timer, sync frame
; and set timer for next frame before loading
; next block
LFF63: STA WSYNC ;wait for the timer to expire
LDA $0285 ; $285 = read timer interrupt bit
BPL LFF63 ; if timer goes from $00 to $ff D7 of $285 goes '1'
LDY #$13 ;value for timer and D1 turns on VSYNC
STY VBLANK ;turn on vertical blanking
STA WSYNC ;syncronize TV with VCS
STA WSYNC ;
STA WSYNC ;
STY VSYNC ;
STA WSYNC ;
STA WSYNC ;
STY $029F ;timer for 19456 cycles ($29f=T1024T with INT enabled)
INY ;Y=$14 (D1=0 - turns off VSYNC)
STA WSYNC ;
STY VSYNC ;
RTS ;return
LFF83: .byte $00 ;SC-RAM - buffers write pulse delay value
;
;This code gets copied into VCS-RAM from $81 to $b5.
;The Y-register is set to $3f to load 64 bytes of data through the
;joystick port. The data gets loaded from byte 63 to byte 0.
LFF84: CMP LF000 ;set SC-config byte (lowbyte of address gets patched
; to actual control byte value)
CMP LFFF8 ;
LFF8A: LDA #$7F ;get state of right joystick button into carry bit
CMP INPT5 ; (this is D4 of current data byte)
EOR SWCHA ;get D7-D5 from the joystick port
STA SWCHA ; and change state of output pin to trigger
; next 4 data bits
ROL ;move D4 from carry bit to current data byte
ASL ;make room for D3-D1
ASL ;
ASL ;
STA $B7 ;temporarily store upper nibble of current data byte
LDA #$7F ;get D0 of current data byte into carry bit
CMP INPT5 ;
EOR SWCHA ;get D3-D1 from the joystick port and change
STA SWCHA ; state of output pin to trigger next 4 data bits
AND #$07 ;isolate D3-D1
ORA $B7 ;combine them with upper nibble in the temp variable
ROL ;move D0 into current data byte, completing it
TAX ;write data byte to SC-RAM
CMP LF000,X ;
CMP ($B9),Y ;
DEY ;decrease byte counter
BPL LFF8A ;if not expired, load next data byte
CMP LF019 ;set SC-config to banks 3&2, write disabled, power off
CMP LFFF8 ;
RTS ;return to loading routine in SC-RAM
LFFB9: .byte $BC ;pointer to load information data in $ff00 page
.byte $00,$00 ;filler data
.byte $1F ;SC-Config (banks 2&3, writing enabled, ROM power off)
.byte $01 ;number of 64 bytes blocks to load
.byte $F7,$C0 ;start address for storing next data blocks
; (highbyte, lowbyte)
;
;Execution of code starts here. This code initializes the joystick ports
;and the Supercharger demo unit and then jumps to the loading routine.
;It gets overwritten with new data first.
START:
LDA #$08 ;RIGHT line on right joystick = output; rest = input
LFFC2: CMP SWACNT ;are the I/O lines set correctely?
BEQ LFFCF ;if so, continue
STA SWCHA ;set output pin = HIGH
STA SWACNT ;configure I/O ports (also sends out current data)
BNE LFFC2 ;if this is the first time the I/O lines are set
; do it again for a little delay
LFFCF: LDA $80 ;load control byte as set by SC-BIOS
AND #$E0 ;isolate the write pulse delay
STA SWCHA ;set output pin = LOW [18 cycles]
TAX ;store the write pulse delay in SC-RAM
CMP LF000,X ; $ff83 will be copied to VCS-RAM at $80 later
NOP ;
CMP LFF83 ;
LDA #$28 ;set timer for 2560 cycles
STA $029E ; $29e = TIM64T with interrupts enabled
STA SWCHA ;set output pin = HIGH [20 cycles]
JMP LFF00 ;jump to loading routine
LFFE9: .byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00
ORG $2000
.word $ffc0 ;start address
.byte $1b ;SC control byte - bank 3&2, write enabled, ROM off
.byte $01 ;one 256 bytes page to load
.byte $6d ;checksum
.byte $00 ;multiload number
.word $010c ;delay value for the load progress bars
ORG $2010
.byte $1d ;put the page into page 7 [0-7] of bank 1 [0-2]
ORG $20ff
.byte $ff ;put something here to get the BIN 8448 bytes big
--
Archives (includes files) at http://www.biglist.com/lists/stella/archives/
Unsub & more at http://www.biglist.com/lists/stella/
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [stella] SC demo unit bootstrap, Eckhard Stolberg | Thread | [stella] my "pot" runneth over, gentlben |
| Re: [stella] SC demo unit bootstrap, Eckhard Stolberg | Date | Re: [stella] SC demo unit bootstrap, Eckhard Stolberg |
| Month |