peasant_band: peasant_band

This commit is contained in:
Vince Weaver 2024-11-03 00:07:42 -04:00
parent 2054349f4e
commit 24ffc2ccf7
41 changed files with 8484 additions and 0 deletions

View File

@ -0,0 +1,136 @@
; Rather Dashing Band
;
; by deater (Vince Weaver) <vince@deater.net>
.include "zp.inc"
.include "hardware.inc"
DEBUG=0
driven_start:
;=====================
; initializations
;=====================
jsr hardware_detect
jsr hgr_make_tables
;===================
; restart?
;===================
restart:
lda #0
sta DRAW_PAGE
;==================================
; setup music
;==================================
; read/write RAM, use $d000 bank1
bit $C083
bit $C083
lda #<music_compressed
sta zx_src_l+1
lda #>music_compressed
sta zx_src_h+1
lda #$d0
jsr zx02_full_decomp
lda #0
sta DONE_PLAYING
lda #1
sta LOOP
; patch mockingboard
lda SOUND_STATUS
beq skip_mbp1
jsr mockingboard_patch ; patch to work in slots other than 4?
skip_mbp1:
;=======================
; Set up 50Hz interrupt
;========================
jsr mockingboard_init
jsr mockingboard_setup_interrupt
;============================
; Init the Mockingboard
;============================
jsr reset_ay_both
jsr clear_ay_both
;==================
; init song
;==================
jsr pt3_init_song
dont_enable_mc:
skip_all_checks:
cli ; start interrupts (music)
jsr intro_start
forever:
jmp forever
.include "wait_keypress.s"
.include "zx02_optim.s"
.include "pt3_lib_mockingboard_patch.s"
.include "hardware_detect.s"
PT3_ENABLE_APPLE_IIC = 1
.include "wait.s"
.include "lc_detect.s"
.include "wait_a_bit.s"
.include "gr_fast_clear.s"
.include "text_print.s"
.include "gr_offsets.s"
.include "gs_interrupt.s"
.include "pt3_lib_detect_model.s"
.include "pt3_lib_core.s"
.include "pt3_lib_init.s"
.include "pt3_lib_mockingboard_setup.s"
.include "interrupt_handler.s"
.include "pt3_lib_mockingboard_detect.s"
mod7_table = $1c00
div7_table = $1d00
hposn_low = $1e00
hposn_high = $1f00
.include "hgr_table.s"
.include "band_core.s"
;.align $100
PT3_LOC = $D000
music_compressed:
.incbin "music/bugsy_still_alive.pt3.zx02"

View File

@ -0,0 +1,317 @@
; Credits
; o/~ It's the credits, yeah, that's the best part
; When the movie ends and the reading starts o/~
;
; by deater (Vince Weaver) <vince@deater.net>
;.include "zp.inc"
;.include "hardware.inc"
;.include "../qload.inc"
;.include "../music.inc"
;mod7_table = $1c00
;div7_table = $1d00
;hposn_low = $1e00
;hposn_high = $1f00
intro_start:
;=====================
; initializations
;=====================
bit KEYRESET ; clear just in case
;===================
; Load graphics
;===================
load_loop:
bit SET_GR
bit HIRES
bit FULLGR
bit PAGE1
lda #0
jsr hgr_page1_clearscreen ; unrolled
jsr hgr_page2_clearscreen ; unrolled
; jsr hgr_make_tables
;=======================
;=======================
; scroll job
;=======================
;=======================
; so the way this works is that it only displays PAGE1
; and it prints new credits just off the bottom of it which
; is essentially the top of PAGE2
; then it scrolls things up
ldx #0
stx FRAME
; print message
lda #<final_credits ; store location of string
sta BACKUP_OUTL
lda #>final_credits
sta BACKUP_OUTH
scroll_loop:
jsr hgr_vertical_scroll
;============================================
; clear lines to get rid of stray old chars
;============================================
; just erase line 158 and 159
; $39D0, $3DD0
clc
lda #$39
adc DRAW_PAGE
sta cl_smc+2
clc
lda #$3d
adc DRAW_PAGE
sta cl_smc+5
ldy #39
lda #$00
cl_inner_loop:
cl_smc:
sta $39D0,Y
sta $3DD0,Y
dey
bpl cl_inner_loop
;=============================
;=============================
; draw text
;=============================
;=============================
;=======================
; draw one line at 158
;=======================
lda #158 ;
sta CV
lda BACKUP_OUTL ; get saved text location
ldy BACKUP_OUTH ; and load direct in A/Y
ldx FRAME ; load which line of text to draw
jsr draw_condensed_1x8
; X points to last char printed?
;=========================================
; check if increment to next line of text
;=========================================
; flip over if frame==9
lda FRAME
cmp #9
bcc skip_next_text
; point to location after
sec ; always add 1
txa ; afterward X points to end of string
adc OUTL ; (OUTL is already+1)
sta BACKUP_OUTL
lda #$0
adc OUTH
sta BACKUP_OUTH
lda #$ff
sta FRAME
skip_next_text:
;===========================
; draw second line at 159
;===========================
lda #159 ;
sta CV
lda BACKUP_OUTL ; get saved text location
ldy BACKUP_OUTH ; and load direct in A/Y
ldx FRAME
inx
jsr draw_condensed_1x8
;=================================
; increment the frame
;=================================
inc FRAME ; next frame
; lda FRAME ; wrap frame after 10 lines
; cmp #10
; bne no_update_message
; lda #0
; sta FRAME
;=============================
; draw sprites
;=============================
lda #18
sta CURSOR_X
lda #160
sta CURSOR_Y
inc GUITAR_FRAME
lda GUITAR_FRAME
and #7
tax
lda guitar_pattern,X
tax
lda guitar_l,X
sta INL
lda guitar_h,X
sta INH
jsr hgr_draw_sprite
;===========================
; keeper1
lda GUITAR_FRAME
and #$1f
tax
lda keeper1_pattern,X
tax
lda #14
sta CURSOR_X
lda #160
sta CURSOR_Y
lda keeper_l,X
sta INL
lda keeper_h,X
sta INH
jsr hgr_draw_sprite
;====================
; keeper2
lda GUITAR_FRAME
and #$1f
tax
lda keeper2_pattern,X
tax
lda #22
sta CURSOR_X
lda #160
sta CURSOR_Y
lda keeper_l,X
sta INL
lda keeper_h,X
sta INH
jsr hgr_draw_sprite
;=============================
; do the scroll
;=============================
jsr wait_vblank
jsr hgr_page_flip
jmp scroll_loop
.align $100
; .include "wait_keypress.s"
; .include "zx02_optim.s"
.include "hgr_clear_screen.s"
.include "vertical_scroll.s"
.include "font_4am_1x8_oneline.s"
.include "fonts/font_4am_1x8_data.s"
; .include "font_4am_1x10.s"
; .include "fonts/font_4am_1x10_data.s"
; .include "irq_wait.s"
.include "hgr_page_flip.s"
.include "vblank.s"
.include "hgr_sprite.s"
.include "graphics/guitar_sprites.inc"
guitar_pattern:
.byte 0,0,1,1,2,2,1,1
guitar_l:
.byte <guitar0,<guitar1,<guitar2
guitar_h:
.byte >guitar0,>guitar1,>guitar2
.include "graphics/keeper1_sprites.inc"
.include "graphics/keeper2_sprites.inc"
keeper_l:
.byte <keeper_r0,<keeper_r1,<keeper_r2
.byte <keeper_r3,<keeper_r4,<keeper_r5
.byte <keeper_r6,<keeper_r7
.byte <keeper_l0,<keeper_l1,<keeper_l2
.byte <keeper_l3,<keeper_l4,<keeper_l5
.byte <keeper_l6,<keeper_l7
keeper_h:
.byte >keeper_r0,>keeper_r1,>keeper_r2
.byte >keeper_r3,>keeper_r4,>keeper_r5
.byte >keeper_r6,>keeper_r7
.byte >keeper_l0,>keeper_l1,>keeper_l2
.byte >keeper_l3,>keeper_l4,>keeper_l5
.byte >keeper_l6,>keeper_l7
keeper1_pattern:
.byte 1,1,2,2,1,1,2,2
.byte 1,2,3,4,5,4,3,4
.byte 5,4,3,4,5,6,7,5
.byte 7,6,5,4,3,2,1,2
keeper2_pattern:
.byte 1+8,1+8,2+8,2+8,1+8,1+8,2+8,2+8
.byte 1+8,2+8,3+8,4+8,5+8,4+8,3+8,4+8
.byte 5+8,4+8,3+8,4+8,5+8,6+8,7+8,5+8
.byte 7+8,6+8,5+8,4+8,3+8,2+8,1+8,2+8
final_credits:
.include "lyrics.s"

View File

@ -0,0 +1,198 @@
;license:MIT
;(c) 2023 by 4am
;
; drawing routines for Million Perfect Tiles Condensed
;
; Public functions:
; - draw_condensed_1x8
;
; VMW: commented, reformatted, minor changes, ca65 assembly
; hacked up some more
FONT_OFFSET = $13
;------------------------------------------------------------------------------
; draw_condensed_1x8
;
; in: A/Y points to zero terminated string, with x-pos and y-pos at start
; out: clobbers all registers & flags
;------------------------------------------------------------------------------
draw_condensed_1x8:
; store the string location
sta OUTL
sty OUTH
draw_condensed_1x8_again:
ldy #0
lda (OUTL),Y
sta CH
bpl still_good
demo_demo_done:
; FIXME: stop music?
jmp demo_demo_done
still_good:
clc
lda #1
adc OUTL
sta OUTL
sta dcb_loop_1x8_smc+1
lda #0
adc OUTH
sta OUTH
sta dcb_loop_1x8_smc+2
ldy CV
; row0
lda hposn_low, Y ; get low memory offset
clc
adc CH ; add in x-coord
sta dcb_row_1x8_0+4
lda hposn_high, Y ; get high memory offset
sta dcb_row_1x8_0+5 ; save it out
iny ; go to next row
; row1
lda hposn_low, Y
adc CH
sta dcb_row_1x8_1+4
lda hposn_high, Y
sta dcb_row_1x8_1+5
iny
; row2
lda hposn_low, Y
adc CH
sta dcb_row_1x8_2+4
lda hposn_high, Y
sta dcb_row_1x8_2+5
iny
; row3
lda hposn_low, Y
adc CH
sta dcb_row_1x8_3+4
lda hposn_high, Y
sta dcb_row_1x8_3+5
iny
; row4
lda hposn_low, Y
adc CH
sta dcb_row_1x8_4+4
lda hposn_high, Y
sta dcb_row_1x8_4+5
iny
; row5
lda hposn_low, Y
adc CH
sta dcb_row_1x8_5+4
lda hposn_high, Y
sta dcb_row_1x8_5+5
iny
; row6
lda hposn_low, Y
adc CH
sta dcb_row_1x8_6+4
lda hposn_high, Y
sta dcb_row_1x8_6+5
iny
; row7
lda hposn_low, Y
adc CH
sta dcb_row_1x8_7+4
lda hposn_high, Y
sta dcb_row_1x8_7+5
ldx #0
dcb_loop_1x8:
dcb_loop_1x8_smc:
ldy $FDFD, X ; load next char into Y
beq dcb_done_1x8
; cpy #13
; bne not_linefeed
; lda #0
; sta CH
; clc
; lda CV
; adc #8
; sta CV
; inx
; lda CV
; cmp #192
; bcc dcb_loop_1x8
; lda #184
; sta CV
; stx XSAVE
; jsr scroll_screen
; ldx XSAVE
; jmp dcb_loop_1x8
not_linefeed:
; unrolled loop to write out each line
dcb_row_1x8_0:
lda font_1x8_row0-FONT_OFFSET, Y ; get 1-byte font row
sta $FDFD, X ; write out to graphics mem
dcb_row_1x8_1:
lda font_1x8_row1-FONT_OFFSET, Y
sta $FDFD, X
dcb_row_1x8_2:
lda font_1x8_row2-FONT_OFFSET, Y
sta $FDFD, X
dcb_row_1x8_3:
lda font_1x8_row3-FONT_OFFSET, Y
sta $FDFD, X
dcb_row_1x8_4:
lda font_1x8_row4-FONT_OFFSET, Y
sta $FDFD, X
dcb_row_1x8_5:
lda font_1x8_row5-FONT_OFFSET, Y
sta $FDFD, X
dcb_row_1x8_6:
lda font_1x8_row6-FONT_OFFSET, Y
sta $FDFD, X
dcb_row_1x8_7:
lda font_1x8_row7-FONT_OFFSET, Y
sta $FDFD, X
inc CH
inx ; move to next
bne dcb_loop_1x8 ; bra (well, as long as string
; is less than 255 chars)
dcb_done_1x8:
rts

View File

@ -0,0 +1,170 @@
;license:MIT
;(c) 2023 by 4am
;
; drawing routines for Million Perfect Tiles Condensed
;
; Public functions:
; - draw_condensed_1x8
;
; VMW: commented, reformatted, minor changes, ca65 assembly
FONT_OFFSET = $13
;------------------------------------------------------------------------------
; draw_condensed_1x8
;
; in: A/Y points to zero terminated string, with x-pos and y-pos at start
; X is which line
; if line>7 then just print 0
; out: clobbers all registers & flags
;------------------------------------------------------------------------------
draw_condensed_1x8:
; store the string location
sta OUTL
sty OUTH
draw_condensed_1x8_again:
ldy #0 ; get X position before string
lda (OUTL),Y
sta CH
bpl still_good
demo_demo_done:
; FIXME: stop music?
jmp demo_demo_done
still_good:
clc ; increment font pointer
lda #1
adc OUTL
sta OUTL
sta dcb_loop_1x8_smc+1
sta dcb_loop_1x8b_smc+1
lda #0 ; 16 bits
adc OUTH
sta OUTH
sta dcb_loop_1x8_smc+2
sta dcb_loop_1x8b_smc+2
ldy CV ; get ypos
cpx #8
bcs draw_blank_line ; if row>7 draw blank line
draw_font_line:
; point to proper row of font (row in X)
lda font_rows_l,X
sta dcb_row_1x8_0+1
lda font_rows_h,X
sta dcb_row_1x8_0+2
;===================================
; setup output pointer to hgr area
lda hposn_low, Y ; get low memory offset
clc
adc CH ; add in x-coord
sta dcb_row_1x8_0+4
lda hposn_high, Y ; get high memory offset
adc DRAW_PAGE
sta dcb_row_1x8_0+5 ; save it out
; iny ; go to next row
;=========================
; loop across string
ldx #0
dcb_loop_1x8:
dcb_loop_1x8_smc:
ldy $FDFD, X ; load next char into Y
beq dcb_done_1x8
dcb_row_1x8_0:
lda font_1x8_row0-FONT_OFFSET, Y ; get 1-byte font row
sta $FDFD, X ; write out to graphics mem
inc CH
inx ; move to next
bne dcb_loop_1x8 ; bra (well, as long as string
; is less than 255 chars)
dcb_done_1x8:
rts
draw_blank_line:
;===================================
; setup output pointer to hgr area
lda hposn_low, Y ; get low memory offset
clc
adc CH ; add in x-coord
sta dcb_row_1x8_b+3
lda hposn_high, Y ; get high memory offset
adc DRAW_PAGE
sta dcb_row_1x8_b+4 ; save it out
; iny ; go to next row
;=========================
; loop across string
ldx #0
dcb_loop_1x8b:
dcb_loop_1x8b_smc:
ldy $FDFD, X ; load next char into Y
beq dcb_done_1x8b
dcb_row_1x8_b:
lda #0
sta $FDFD, X ; write out to graphics mem
inc CH
inx ; move to next
bne dcb_loop_1x8b ; bra (well, as long as string
; is less than 255 chars)
dcb_done_1x8b:
rts
font_rows_l:
.byte <(font_1x8_row0-FONT_OFFSET)
.byte <(font_1x8_row1-FONT_OFFSET)
.byte <(font_1x8_row2-FONT_OFFSET)
.byte <(font_1x8_row3-FONT_OFFSET)
.byte <(font_1x8_row4-FONT_OFFSET)
.byte <(font_1x8_row5-FONT_OFFSET)
.byte <(font_1x8_row6-FONT_OFFSET)
.byte <(font_1x8_row7-FONT_OFFSET)
font_rows_h:
.byte >(font_1x8_row0-FONT_OFFSET)
.byte >(font_1x8_row1-FONT_OFFSET)
.byte >(font_1x8_row2-FONT_OFFSET)
.byte >(font_1x8_row3-FONT_OFFSET)
.byte >(font_1x8_row4-FONT_OFFSET)
.byte >(font_1x8_row5-FONT_OFFSET)
.byte >(font_1x8_row6-FONT_OFFSET)
.byte >(font_1x8_row7-FONT_OFFSET)

View File

@ -0,0 +1,880 @@
font_1x8_row0:
.byte $08 ;
.byte $08 ;
.byte $00 ;
.byte $10 ;
.byte $10 ;
.byte $14 ;
.byte $14 ;
.byte $14 ;
.byte $14 ;
.byte $00 ;
.byte $00 ;
.byte $00 ;
.byte $14 ;
.byte $00 ;
.byte $08 ; !
.byte $14 ; "
.byte $14 ; #
.byte $08 ; $
.byte $06 ; %
.byte $0C ; &
.byte $08 ; '
.byte $08 ; (
.byte $08 ; )
.byte $00 ; *
.byte $00 ; +
.byte $00 ; ,
.byte $00 ; -
.byte $00 ; .
.byte $00 ; /
.byte $1C ; 0
.byte $08 ; 1
.byte $1C ; 2
.byte $1C ; 3
.byte $10 ; 4
.byte $3E ; 5
.byte $18 ; 6
.byte $3E ; 7
.byte $1C ; 8
.byte $1C ; 9
.byte $00 ; :
.byte $00 ; ;
.byte $10 ; <
.byte $00 ; =
.byte $04 ; >
.byte $1C ; ?
.byte $1C ; @
.byte $08 ; A
.byte $1E ; B
.byte $18 ; C
.byte $0E ; D
.byte $3E ; E
.byte $3E ; F
.byte $38 ; G
.byte $22 ; H
.byte $1C ; I
.byte $38 ; J
.byte $26 ; K
.byte $0E ; L
.byte $22 ; M
.byte $22 ; N
.byte $08 ; O
.byte $1E ; P
.byte $1C ; Q
.byte $1E ; R
.byte $1C ; S
.byte $3E ; T
.byte $22 ; U
.byte $22 ; V
.byte $22 ; W
.byte $22 ; X
.byte $22 ; Y
.byte $3E ; Z
.byte $3C ; [
.byte $00 ; \
.byte $1E ; ]
.byte $08 ; ^
.byte $00 ; _
.byte $08 ; `
.byte $00 ; a
.byte $06 ; b
.byte $00 ; c
.byte $30 ; d
.byte $00 ; e
.byte $18 ; f
.byte $00 ; g
.byte $06 ; h
.byte $08 ; i
.byte $20 ; j
.byte $06 ; k
.byte $0C ; l
.byte $00 ; m
.byte $00 ; n
.byte $00 ; o
.byte $00 ; p
.byte $00 ; q
.byte $00 ; r
.byte $00 ; s
.byte $00 ; t
.byte $00 ; u
.byte $00 ; v
.byte $00 ; w
.byte $00 ; x
.byte $00 ; y
.byte $00 ; z
.byte $30 ; {
.byte $08 ; |
.byte $06 ; }
.byte $2C ; ~
.byte $00 ;
font_1x8_row1:
.byte $08 ;
.byte $08 ;
.byte $00 ;
.byte $08 ;
.byte $08 ;
.byte $14 ;
.byte $14 ;
.byte $14 ;
.byte $14 ;
.byte $00 ;
.byte $00 ;
.byte $00 ;
.byte $14 ;
.byte $00 ;
.byte $1C ; !
.byte $14 ; "
.byte $14 ; #
.byte $3C ; $
.byte $26 ; %
.byte $12 ; &
.byte $08 ; '
.byte $04 ; (
.byte $10 ; )
.byte $22 ; *
.byte $08 ; +
.byte $00 ; ,
.byte $00 ; -
.byte $00 ; .
.byte $20 ; /
.byte $22 ; 0
.byte $0C ; 1
.byte $22 ; 2
.byte $22 ; 3
.byte $18 ; 4
.byte $02 ; 5
.byte $04 ; 6
.byte $22 ; 7
.byte $22 ; 8
.byte $22 ; 9
.byte $08 ; :
.byte $08 ; ;
.byte $08 ; <
.byte $00 ; =
.byte $08 ; >
.byte $22 ; ?
.byte $22 ; @
.byte $14 ; A
.byte $24 ; B
.byte $24 ; C
.byte $14 ; D
.byte $24 ; E
.byte $24 ; F
.byte $04 ; G
.byte $22 ; H
.byte $08 ; I
.byte $10 ; J
.byte $24 ; K
.byte $04 ; L
.byte $36 ; M
.byte $26 ; N
.byte $14 ; O
.byte $24 ; P
.byte $22 ; Q
.byte $24 ; R
.byte $22 ; S
.byte $2A ; T
.byte $22 ; U
.byte $22 ; V
.byte $22 ; W
.byte $22 ; X
.byte $22 ; Y
.byte $22 ; Z
.byte $04 ; [
.byte $02 ; \
.byte $10 ; ]
.byte $14 ; ^
.byte $00 ; _
.byte $08 ; `
.byte $00 ; a
.byte $04 ; b
.byte $00 ; c
.byte $10 ; d
.byte $00 ; e
.byte $24 ; f
.byte $00 ; g
.byte $04 ; h
.byte $00 ; i
.byte $00 ; j
.byte $04 ; k
.byte $08 ; l
.byte $00 ; m
.byte $00 ; n
.byte $00 ; o
.byte $00 ; p
.byte $00 ; q
.byte $00 ; r
.byte $00 ; s
.byte $04 ; t
.byte $00 ; u
.byte $00 ; v
.byte $00 ; w
.byte $00 ; x
.byte $00 ; y
.byte $00 ; z
.byte $08 ; {
.byte $08 ; |
.byte $08 ; }
.byte $1A ; ~
.byte $08 ;
font_1x8_row2:
.byte $7F ;
.byte $08 ;
.byte $7F ;
.byte $3E ;
.byte $36 ;
.byte $17 ;
.byte $74 ;
.byte $17 ;
.byte $74 ;
.byte $1F ;
.byte $7C ;
.byte $7F ;
.byte $14 ;
.byte $00 ;
.byte $1C ; !
.byte $14 ; "
.byte $3E ; #
.byte $02 ; $
.byte $10 ; %
.byte $0C ; &
.byte $04 ; '
.byte $02 ; (
.byte $20 ; )
.byte $1C ; *
.byte $08 ; +
.byte $00 ; ,
.byte $00 ; -
.byte $00 ; .
.byte $10 ; /
.byte $32 ; 0
.byte $0A ; 1
.byte $20 ; 2
.byte $20 ; 3
.byte $14 ; 4
.byte $1E ; 5
.byte $02 ; 6
.byte $10 ; 7
.byte $22 ; 8
.byte $22 ; 9
.byte $08 ; :
.byte $08 ; ;
.byte $04 ; <
.byte $3E ; =
.byte $10 ; >
.byte $20 ; ?
.byte $2A ; @
.byte $22 ; A
.byte $24 ; B
.byte $02 ; C
.byte $24 ; D
.byte $04 ; E
.byte $04 ; F
.byte $02 ; G
.byte $22 ; H
.byte $08 ; I
.byte $10 ; J
.byte $14 ; K
.byte $04 ; L
.byte $2A ; M
.byte $2A ; N
.byte $22 ; O
.byte $24 ; P
.byte $22 ; Q
.byte $24 ; R
.byte $02 ; S
.byte $08 ; T
.byte $22 ; U
.byte $22 ; V
.byte $22 ; W
.byte $14 ; X
.byte $14 ; Y
.byte $10 ; Z
.byte $04 ; [
.byte $04 ; \
.byte $10 ; ]
.byte $22 ; ^
.byte $00 ; _
.byte $10 ; `
.byte $1C ; a
.byte $04 ; b
.byte $1C ; c
.byte $10 ; d
.byte $1C ; e
.byte $04 ; f
.byte $1C ; g
.byte $1C ; h
.byte $0C ; i
.byte $30 ; j
.byte $24 ; k
.byte $08 ; l
.byte $16 ; m
.byte $1A ; n
.byte $1C ; o
.byte $1E ; p
.byte $3C ; q
.byte $1A ; r
.byte $3C ; s
.byte $1E ; t
.byte $22 ; u
.byte $22 ; v
.byte $22 ; w
.byte $22 ; x
.byte $22 ; y
.byte $3E ; z
.byte $08 ; {
.byte $08 ; |
.byte $08 ; }
.byte $00 ; ~
.byte $14 ;
font_1x8_row3:
.byte $00 ;
.byte $08 ;
.byte $00 ;
.byte $7F ;
.byte $41 ;
.byte $10 ;
.byte $04 ;
.byte $10 ;
.byte $04 ;
.byte $10 ;
.byte $04 ;
.byte $00 ;
.byte $14 ;
.byte $00 ;
.byte $08 ; !
.byte $00 ; "
.byte $14 ; #
.byte $1C ; $
.byte $08 ; %
.byte $2A ; &
.byte $00 ; '
.byte $02 ; (
.byte $20 ; )
.byte $3E ; *
.byte $3E ; +
.byte $00 ; ,
.byte $3E ; -
.byte $00 ; .
.byte $08 ; /
.byte $2A ; 0
.byte $08 ; 1
.byte $18 ; 2
.byte $18 ; 3
.byte $12 ; 4
.byte $20 ; 5
.byte $1E ; 6
.byte $08 ; 7
.byte $1C ; 8
.byte $3C ; 9
.byte $00 ; :
.byte $00 ; ;
.byte $02 ; <
.byte $00 ; =
.byte $20 ; >
.byte $10 ; ?
.byte $3A ; @
.byte $22 ; A
.byte $1C ; B
.byte $02 ; C
.byte $24 ; D
.byte $1C ; E
.byte $1C ; F
.byte $02 ; G
.byte $3E ; H
.byte $08 ; I
.byte $10 ; J
.byte $0C ; K
.byte $04 ; L
.byte $22 ; M
.byte $32 ; N
.byte $22 ; O
.byte $1C ; P
.byte $22 ; Q
.byte $1C ; R
.byte $1C ; S
.byte $08 ; T
.byte $22 ; U
.byte $22 ; V
.byte $2A ; W
.byte $08 ; X
.byte $08 ; Y
.byte $08 ; Z
.byte $04 ; [
.byte $08 ; \
.byte $10 ; ]
.byte $00 ; ^
.byte $00 ; _
.byte $00 ; `
.byte $20 ; a
.byte $1C ; b
.byte $22 ; c
.byte $1C ; d
.byte $22 ; e
.byte $0E ; f
.byte $22 ; g
.byte $24 ; h
.byte $08 ; i
.byte $20 ; j
.byte $14 ; k
.byte $08 ; l
.byte $2A ; m
.byte $26 ; n
.byte $22 ; o
.byte $24 ; p
.byte $12 ; q
.byte $24 ; r
.byte $02 ; s
.byte $04 ; t
.byte $22 ; u
.byte $22 ; v
.byte $22 ; w
.byte $14 ; x
.byte $22 ; y
.byte $10 ; z
.byte $06 ; {
.byte $00 ; |
.byte $30 ; }
.byte $00 ; ~
.byte $22 ;
font_1x8_row4:
.byte $7F ;
.byte $08 ;
.byte $7F ;
.byte $3F ;
.byte $21 ;
.byte $17 ;
.byte $74 ;
.byte $1F ;
.byte $7C ;
.byte $17 ;
.byte $74 ;
.byte $7F ;
.byte $14 ;
.byte $00 ;
.byte $08 ; !
.byte $00 ; "
.byte $3E ; #
.byte $20 ; $
.byte $04 ; %
.byte $12 ; &
.byte $00 ; '
.byte $02 ; (
.byte $20 ; )
.byte $1C ; *
.byte $08 ; +
.byte $08 ; ,
.byte $00 ; -
.byte $00 ; .
.byte $04 ; /
.byte $26 ; 0
.byte $08 ; 1
.byte $04 ; 2
.byte $20 ; 3
.byte $3E ; 4
.byte $20 ; 5
.byte $22 ; 6
.byte $04 ; 7
.byte $22 ; 8
.byte $20 ; 9
.byte $08 ; :
.byte $08 ; ;
.byte $04 ; <
.byte $3E ; =
.byte $10 ; >
.byte $08 ; ?
.byte $1A ; @
.byte $3E ; A
.byte $24 ; B
.byte $02 ; C
.byte $24 ; D
.byte $04 ; E
.byte $04 ; F
.byte $32 ; G
.byte $22 ; H
.byte $08 ; I
.byte $12 ; J
.byte $0C ; K
.byte $04 ; L
.byte $22 ; M
.byte $22 ; N
.byte $22 ; O
.byte $04 ; P
.byte $2A ; Q
.byte $0C ; R
.byte $20 ; S
.byte $08 ; T
.byte $22 ; U
.byte $22 ; V
.byte $2A ; W
.byte $14 ; X
.byte $08 ; Y
.byte $04 ; Z
.byte $04 ; [
.byte $10 ; \
.byte $10 ; ]
.byte $00 ; ^
.byte $00 ; _
.byte $00 ; `
.byte $3C ; a
.byte $24 ; b
.byte $02 ; c
.byte $12 ; d
.byte $3E ; e
.byte $04 ; f
.byte $22 ; g
.byte $24 ; h
.byte $08 ; i
.byte $20 ; j
.byte $0C ; k
.byte $08 ; l
.byte $2A ; m
.byte $22 ; n
.byte $22 ; o
.byte $24 ; p
.byte $12 ; q
.byte $04 ; r
.byte $1C ; s
.byte $04 ; t
.byte $22 ; u
.byte $22 ; v
.byte $2A ; w
.byte $08 ; x
.byte $22 ; y
.byte $08 ; z
.byte $08 ; {
.byte $08 ; |
.byte $08 ; }
.byte $00 ; ~
.byte $22 ;
font_1x8_row5:
.byte $00 ;
.byte $08 ;
.byte $08 ;
.byte $3F ;
.byte $21 ;
.byte $14 ;
.byte $14 ;
.byte $00 ;
.byte $00 ;
.byte $14 ;
.byte $14 ;
.byte $00 ;
.byte $14 ;
.byte $00 ;
.byte $00 ; !
.byte $00 ; "
.byte $14 ; #
.byte $1E ; $
.byte $32 ; %
.byte $12 ; &
.byte $00 ; '
.byte $04 ; (
.byte $10 ; )
.byte $22 ; *
.byte $08 ; +
.byte $08 ; ,
.byte $00 ; -
.byte $08 ; .
.byte $02 ; /
.byte $22 ; 0
.byte $08 ; 1
.byte $22 ; 2
.byte $22 ; 3
.byte $10 ; 4
.byte $22 ; 5
.byte $22 ; 6
.byte $04 ; 7
.byte $22 ; 8
.byte $10 ; 9
.byte $08 ; :
.byte $08 ; ;
.byte $08 ; <
.byte $00 ; =
.byte $08 ; >
.byte $00 ; ?
.byte $02 ; @
.byte $22 ; A
.byte $24 ; B
.byte $24 ; C
.byte $14 ; D
.byte $24 ; E
.byte $04 ; F
.byte $24 ; G
.byte $22 ; H
.byte $08 ; I
.byte $12 ; J
.byte $14 ; K
.byte $24 ; L
.byte $22 ; M
.byte $22 ; N
.byte $14 ; O
.byte $04 ; P
.byte $1C ; Q
.byte $14 ; R
.byte $22 ; S
.byte $08 ; T
.byte $22 ; U
.byte $14 ; V
.byte $36 ; W
.byte $22 ; X
.byte $08 ; Y
.byte $22 ; Z
.byte $04 ; [
.byte $20 ; \
.byte $10 ; ]
.byte $00 ; ^
.byte $00 ; _
.byte $00 ; `
.byte $22 ; a
.byte $24 ; b
.byte $22 ; c
.byte $12 ; d
.byte $02 ; e
.byte $04 ; f
.byte $3C ; g
.byte $24 ; h
.byte $08 ; i
.byte $22 ; j
.byte $14 ; k
.byte $08 ; l
.byte $2A ; m
.byte $22 ; n
.byte $22 ; o
.byte $1C ; p
.byte $1C ; q
.byte $04 ; r
.byte $20 ; s
.byte $24 ; t
.byte $32 ; u
.byte $14 ; v
.byte $2A ; w
.byte $14 ; x
.byte $3C ; y
.byte $04 ; z
.byte $08 ; {
.byte $08 ; |
.byte $08 ; }
.byte $00 ; ~
.byte $3E ;
font_1x8_row6:
.byte $00 ;
.byte $08 ;
.byte $08 ;
.byte $7E ;
.byte $4A ;
.byte $14 ;
.byte $14 ;
.byte $00 ;
.byte $00 ;
.byte $14 ;
.byte $14 ;
.byte $00 ;
.byte $14 ;
.byte $00 ;
.byte $08 ; !
.byte $00 ; "
.byte $14 ; #
.byte $08 ; $
.byte $30 ; %
.byte $2C ; &
.byte $00 ; '
.byte $08 ; (
.byte $08 ; )
.byte $00 ; *
.byte $00 ; +
.byte $04 ; ,
.byte $00 ; -
.byte $08 ; .
.byte $00 ; /
.byte $1C ; 0
.byte $3E ; 1
.byte $3E ; 2
.byte $1C ; 3
.byte $38 ; 4
.byte $1C ; 5
.byte $1C ; 6
.byte $04 ; 7
.byte $1C ; 8
.byte $0C ; 9
.byte $00 ; :
.byte $04 ; ;
.byte $10 ; <
.byte $00 ; =
.byte $04 ; >
.byte $08 ; ?
.byte $3C ; @
.byte $22 ; A
.byte $1E ; B
.byte $18 ; C
.byte $0E ; D
.byte $3E ; E
.byte $0E ; F
.byte $38 ; G
.byte $22 ; H
.byte $1C ; I
.byte $0C ; J
.byte $26 ; K
.byte $3E ; L
.byte $22 ; M
.byte $22 ; N
.byte $08 ; O
.byte $0E ; P
.byte $20 ; Q
.byte $26 ; R
.byte $1C ; S
.byte $1C ; T
.byte $1C ; U
.byte $08 ; V
.byte $22 ; W
.byte $22 ; X
.byte $1C ; Y
.byte $3E ; Z
.byte $3C ; [
.byte $00 ; \
.byte $1E ; ]
.byte $00 ; ^
.byte $00 ; _
.byte $00 ; `
.byte $3C ; a
.byte $1C ; b
.byte $1C ; c
.byte $3C ; d
.byte $1C ; e
.byte $0E ; f
.byte $20 ; g
.byte $26 ; h
.byte $1C ; i
.byte $22 ; j
.byte $24 ; k
.byte $1C ; l
.byte $22 ; m
.byte $22 ; n
.byte $1C ; o
.byte $04 ; p
.byte $10 ; q
.byte $0E ; r
.byte $1E ; s
.byte $18 ; t
.byte $2C ; u
.byte $08 ; v
.byte $36 ; w
.byte $22 ; x
.byte $20 ; y
.byte $3E ; z
.byte $30 ; {
.byte $08 ; |
.byte $06 ; }
.byte $00 ; ~
.byte $00 ;
font_1x8_row7:
.byte $00 ;
.byte $08 ;
.byte $08 ;
.byte $36 ;
.byte $36 ;
.byte $14 ;
.byte $14 ;
.byte $00 ;
.byte $00 ;
.byte $14 ;
.byte $14 ;
.byte $00 ;
.byte $14 ;
.byte $00 ;
.byte $00 ; !
.byte $00 ; "
.byte $00 ; #
.byte $00 ; $
.byte $00 ; %
.byte $00 ; &
.byte $00 ; '
.byte $00 ; (
.byte $00 ; )
.byte $00 ; *
.byte $00 ; +
.byte $00 ; ,
.byte $00 ; -
.byte $00 ; .
.byte $00 ; /
.byte $00 ; 0
.byte $00 ; 1
.byte $00 ; 2
.byte $00 ; 3
.byte $00 ; 4
.byte $00 ; 5
.byte $00 ; 6
.byte $00 ; 7
.byte $00 ; 8
.byte $00 ; 9
.byte $00 ; :
.byte $00 ; ;
.byte $00 ; <
.byte $00 ; =
.byte $00 ; >
.byte $00 ; ?
.byte $00 ; @
.byte $00 ; A
.byte $00 ; B
.byte $00 ; C
.byte $00 ; D
.byte $00 ; E
.byte $00 ; F
.byte $00 ; G
.byte $00 ; H
.byte $00 ; I
.byte $00 ; J
.byte $00 ; K
.byte $00 ; L
.byte $00 ; M
.byte $00 ; N
.byte $00 ; O
.byte $00 ; P
.byte $00 ; Q
.byte $00 ; R
.byte $00 ; S
.byte $00 ; T
.byte $00 ; U
.byte $00 ; V
.byte $00 ; W
.byte $00 ; X
.byte $00 ; Y
.byte $00 ; Z
.byte $00 ; [
.byte $00 ; \
.byte $00 ; ]
.byte $00 ; ^
.byte $7F ; _
.byte $00 ; `
.byte $00 ; a
.byte $00 ; b
.byte $00 ; c
.byte $00 ; d
.byte $00 ; e
.byte $00 ; f
.byte $1E ; g
.byte $00 ; h
.byte $00 ; i
.byte $1C ; j
.byte $00 ; k
.byte $00 ; l
.byte $00 ; m
.byte $00 ; n
.byte $00 ; o
.byte $0E ; p
.byte $38 ; q
.byte $00 ; r
.byte $00 ; s
.byte $00 ; t
.byte $00 ; u
.byte $00 ; v
.byte $00 ; w
.byte $00 ; x
.byte $1E ; y
.byte $00 ; z
.byte $00 ; {
.byte $00 ; |
.byte $00 ; }
.byte $00 ; ~
.byte $00 ;

View File

@ -0,0 +1,201 @@
clear_screens:
;===================================
; Clear top/bottom of page 0
;===================================
lda #$0
sta DRAW_PAGE
jsr clear_top
jsr clear_bottom
;===================================
; Clear top/bottom of page 1
;===================================
lda #$4
sta DRAW_PAGE
jsr clear_top
jsr clear_bottom
rts
;=========================================================
; clear_top
;=========================================================
; clear DRAW_PAGE
; original = 14,558 cycles(?) 15ms, 70Hz
; OPTIMIZED MAX (page0,48rows): 45*120+4+6 = 5410 = 5.4ms 185Hz
; (pageX,40rows): 50*120+4+6 = 6010 = 6.0ms 166Hz
; 50*120+4+6+37 = 6055 = 6.0ms 166Hz
clear_top:
lda #0 ; 2
clear_top_a:
sta COLOR ; 3
clc ; 2
lda DRAW_PAGE ; 3
adc #4 ; 2
sta __ctf+2 ; 3
sta __ctf+5 ; 3
adc #1 ; 2
sta __ctf+8 ; 3
sta __ctf+11 ; 3
adc #1 ; 2
sta __ctf2+2 ; 3
sta __ctf2+5 ; 3
adc #1 ; 2
sta __ctf2+8 ; 3
sta __ctf2+11 ; 3
ldy #120 ; 2
lda COLOR ; 3
clear_top_fast_loop:
__ctf:
sta $400,Y ; 5
sta $480,Y ; 5
sta $500,Y ; 5
sta $580,Y ; 5
cpy #80 ; 2
bpl no_draw_bottom ; 2nt/3
__ctf2:
sta $600,Y ; 5
sta $680,Y ; 5
sta $700,Y ; 5
sta $780,Y ; 5
no_draw_bottom:
dey ; 2
bpl clear_top_fast_loop ; 2nt/3
rts ; 6
;=========================================================
; clear_bottom
;=========================================================
; clear bottom of draw page
clear_bottom:
clc ; 2
lda DRAW_PAGE ; 3
adc #6 ; 2
sta __cbf2+2 ; 3
sta __cbf2+5 ; 3
adc #1 ; 2
sta __cbf2+8 ; 3
sta __cbf2+11 ; 3
ldy #120 ; 2
lda #$a0 ; Normal Space ; 2
clear_bottom_fast_loop:
__cbf2:
sta $600,Y ; 5
sta $680,Y ; 5
sta $700,Y ; 5
sta $780,Y ; 5
dey ; 2
cpy #80 ; 2
bpl clear_bottom_fast_loop ; 2nt/3
rts ; 6
;clear_screens_notext:
;===================================
; Clear top/bottom of page 0
;===================================
; lda #$0
; sta DRAW_PAGE
; jsr clear_all
;===================================
; Clear top/bottom of page 1
;===================================
; lda #$4
; sta DRAW_PAGE
; jsr clear_all
; rts
clear_bottoms:
lda DRAW_PAGE
pha
;===================================
; Clear bottom of page 0
;===================================
lda #$0
sta DRAW_PAGE
jsr clear_bottom
;===================================
; Clear bottom of page 1
;===================================
lda #$4
sta DRAW_PAGE
jsr clear_bottom
pla
sta DRAW_PAGE
rts
;=========================================================
; clear_all
;=========================================================
; clear 48 rows
clear_all:
clc ; 2
lda DRAW_PAGE ; 3
adc #4 ; 2
sta __caf+2 ; 3
sta __caf+5 ; 3
adc #1 ; 2
sta __caf+8 ; 3
sta __caf+11 ; 3
adc #1 ; 2
sta __caf2+2 ; 3
sta __caf2+5 ; 3
adc #1 ; 2
sta __caf2+8 ; 3
sta __caf2+11 ; 3
ldy #120 ; 2
clear_all_color:
lda #' '|$80 ; 2
clear_all_fast_loop:
__caf:
sta $400,Y ; 5
sta $480,Y ; 5
sta $500,Y ; 5
sta $580,Y ; 5
__caf2:
sta $600,Y ; 5
sta $680,Y ; 5
sta $700,Y ; 5
sta $780,Y ; 5
dey ; 2
bpl clear_all_fast_loop ; 2nt/3
rts ; 6

View File

@ -0,0 +1,5 @@
gr_offsets:
.word $400,$480,$500,$580,$600,$680,$700,$780
.word $428,$4a8,$528,$5a8,$628,$6a8,$728,$7a8
.word $450,$4d0,$550,$5d0,$650,$6d0,$750,$7d0

View File

@ -0,0 +1,39 @@
HGR_SPRITE = ../../../../utils/hgr-utils/hgr_make_sprite
all: keeper1_sprites.inc \
keeper2_sprites.inc guitar_sprites.inc
keeper1_sprites.inc: keeper1_sprites.png
$(HGR_SPRITE) -s -l keeper_r0 keeper1_sprites.png 14 128 27 156 > keeper1_sprites.inc
$(HGR_SPRITE) -s -l keeper_r1 keeper1_sprites.png 42 128 62 156 >> keeper1_sprites.inc
$(HGR_SPRITE) -s -l keeper_r2 keeper1_sprites.png 70 128 90 156 >> keeper1_sprites.inc
$(HGR_SPRITE) -s -l keeper_r3 keeper1_sprites.png 98 128 118 156 >> keeper1_sprites.inc
$(HGR_SPRITE) -s -l keeper_r4 keeper1_sprites.png 126 128 146 156 >> keeper1_sprites.inc
$(HGR_SPRITE) -s -l keeper_r5 keeper1_sprites.png 154 128 174 156 >> keeper1_sprites.inc
$(HGR_SPRITE) -s -l keeper_r6 keeper1_sprites.png 182 128 202 156 >> keeper1_sprites.inc
$(HGR_SPRITE) -s -l keeper_r7 keeper1_sprites.png 210 128 230 156 >> keeper1_sprites.inc
keeper2_sprites.inc: keeper2_sprites.png
$(HGR_SPRITE) -s -l keeper_l0 keeper2_sprites.png 14 128 34 156 > keeper2_sprites.inc
$(HGR_SPRITE) -s -l keeper_l1 keeper2_sprites.png 42 128 62 156 >> keeper2_sprites.inc
$(HGR_SPRITE) -s -l keeper_l2 keeper2_sprites.png 70 128 90 156 >> keeper2_sprites.inc
$(HGR_SPRITE) -s -l keeper_l3 keeper2_sprites.png 98 128 118 156 >> keeper2_sprites.inc
$(HGR_SPRITE) -s -l keeper_l4 keeper2_sprites.png 126 128 146 156 >> keeper2_sprites.inc
$(HGR_SPRITE) -s -l keeper_l5 keeper2_sprites.png 154 128 174 156 >> keeper2_sprites.inc
$(HGR_SPRITE) -s -l keeper_l6 keeper2_sprites.png 182 128 202 156 >> keeper2_sprites.inc
$(HGR_SPRITE) -s -l keeper_l7 keeper2_sprites.png 210 128 230 156 >> keeper2_sprites.inc
guitar_sprites.inc: guitar_sprites.png
$(HGR_SPRITE) -s -l guitar0 guitar_sprites.png 14 32 41 62 > guitar_sprites.inc
$(HGR_SPRITE) -s -l guitar1 guitar_sprites.png 56 32 83 62 >> guitar_sprites.inc
$(HGR_SPRITE) -s -l guitar2 guitar_sprites.png 98 32 125 62 >> guitar_sprites.inc
# $(HGR_SPRITE) -l guitar0_mask guitar_sprites.png 14 63 41 92 >> guitar_sprites.inc
# $(HGR_SPRITE) -l guitar1_mask guitar_sprites.png 56 63 83 92 >> guitar_sprites.inc
# $(HGR_SPRITE) -l guitar2_mask guitar_sprites.png 98 63 125 92 >> guitar_sprites.inc
clean:
rm -f *~ \
keeper1_sprites.inc \
keeper2_sprites.inc guitar_sprites.inc

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View File

@ -0,0 +1,9 @@
gs_interrupt_handler:
; swap back in language card
; read/write RAM, use $d000 bank1
bit $C083
bit $C083
jmp interrupt_handler

View File

@ -0,0 +1,102 @@
; HARDWARE LOCATIONS
KEYPRESS = $C000
KEYRESET = $C010
; SOFT SWITCHES
CLR80COL = $C000 ; PAGE1/PAGE1 normal
SET80COL = $C001 ; PAGE1/PAGE2 switches PAGE1 in Aux instead
EIGHTYCOLOFF = $C00C
EIGHTYCOLON = $C00D
TBCOLOR = $C022 ; IIgs text fg/bg colors
NEWVIDEO = $C029 ; IIgs graphics modes
SPEAKER = $C030
CLOCKCTL = $C034 ; bits 0-3 are IIgs border color
CYAREG = $C036 ; iigs motor detect and clock speed
SET_GR = $C050
SET_TEXT = $C051
FULLGR = $C052
TEXTGR = $C053
PAGE1 = $C054
PAGE2 = $C055
LORES = $C056 ; Enable LORES graphics
HIRES = $C057 ; Enable HIRES graphics
AN3 = $C05E ; Annunciator 3
PADDLE_BUTTON0 = $C061
PADDL0 = $C064
PTRIG = $C070
; APPLESOFT BASIC ROUTINES
NORMAL = $F273
HGR2 = $F3D8
HGR = $F3E2
BKGND0 = $F3F4 ; clear current page to A
HPOSN = $F411 ; (Y,X),(A) (values stores in HGRX,XH,Y)
HPLOT0 = $F457 ; plot at (Y,X), (A)
COLOR_SHIFT = $F47E
HLINRL = $F530 ; (X,A),(Y)
HGLIN = $F53A ; line to (X,A),(Y)
COLORTBL = $F6F6
; MONITOR ROUTINES
HLINE = $F819 ; HLINE Y,$2C at A
VLINE = $F828 ; VLINE A,$2D at Y
CLRSCR = $F832 ; Clear low-res screen
CLRTOP = $F836 ; clear only top of low-res screen
GBASCALC= $F847
SETCOL = $F864 ; COLOR=A
ROM_TEXT2COPY = $F962 ; iigs
TEXT = $FB36
TABV = $FB5B ; VTAB to A
ROM_MACHINEID = $FBB3 ; iigs
BASCALC = $FBC1 ;
BELL = $FBDD ; ring the bell
VTAB = $FC22 ; VTAB to CV
HOME = $FC58 ; Clear the text screen
WAIT = $FCA8 ; delay 1/2(26+27A+5A^2) us
SETINV = $FE80 ; INVERSE
SETNORM = $FE84 ; NORMAL
COUT = $FDED ; output A to screen
COUT1 = $FDF0 ; output A to screen
COLOR_BLACK = 0
COLOR_RED = 1
COLOR_DARKBLUE = 2
COLOR_PURPLE = 3
COLOR_DARKGREEN = 4
COLOR_GREY = 5
COLOR_MEDIUMBLUE = 6
COLOR_LIGHTBLUE = 7
COLOR_BROWN = 8
COLOR_ORANGE = 9
COLOR_GREY2 = 10
COLOR_PINK = 11
COLOR_LIGHTGREEN = 12
COLOR_YELLOW = 13
COLOR_AQUA = 14
COLOR_WHITE = 15
COLOR_BOTH_BLACK = $00
COLOR_BOTH_RED = $11
COLOR_BOTH_DARKBLUE = $22
COLOR_BOTH_DARKGREEN = $44
COLOR_BOTH_GREY = $55
COLOR_BOTH_MEDIUMBLUE = $66
COLOR_BOTH_LIGHTBLUE = $77
COLOR_BOTH_BROWN = $88
COLOR_BOTH_ORANGE = $99
COLOR_BOTH_PINK = $BB
COLOR_BOTH_LIGHTGREEN = $CC
COLOR_BOTH_YELLOW = $DD
COLOR_BOTH_AQUA = $EE
COLOR_BOTH_WHITE = $FF

View File

@ -0,0 +1,81 @@
;====================
; Hardware Detect
; called for disk1 and disk2
; simplified version that just detects model and mockingboard
; for the fake BIOS we do a bit more, but we do rely
; on this being run first
hardware_detect:
;=======================
; Hardware Detect Model
;=======================
; Yes Michaelangel007 I will eventually update linux_logo 6502
jsr detect_appleii_model
lda APPLEII_MODEL
cmp #'g'
bne not_iigs
is_a_iigs:
; enable 1MHz mode
; see hw.accel.a in 4cade
setspeed:
lda CYAREG
and #$7f
sta CYAREG
; gr/text page2 handling broken on early IIgs models
; this enables the workaround
jsr ROM_TEXT2COPY ; set alternate display mode on IIgs
; set background color to black instead of blue
lda NEWVIDEO
and #%00011111 ; bit 7 = 0 -> IIgs Apple II-compat video modes
; bit 6 = 0 -> IIgs 128K memory map same as IIe
; bit 5 = 0 -> IIgs DHGR is color, not mono
; bits 0-4 unchanged
sta NEWVIDEO
lda #$F0
sta TBCOLOR ; white text on black background
lda #$00
sta CLOCKCTL ; black border
sta CLOCKCTL ; set twice for VidHD
; gs always swaps in RAM
lda #<gs_interrupt_handler
sta $3FE
lda #>gs_interrupt_handler
sta $3FF
not_iigs:
;======================
; detect mockingboard
lda #0
sta SOUND_STATUS
;PT3_ENABLE_APPLE_IIC = 1 ; we set this earlier
jsr mockingboard_detect
bcc mockingboard_notfound
mockingboard_found:
lda SOUND_STATUS
ora #SOUND_MOCKINGBOARD
sta SOUND_STATUS
mockingboard_notfound:
rts
;.include "pt3_lib_mockingboard.inc"

View File

@ -0,0 +1,89 @@
hgr_clear_screen:
lda DRAW_PAGE
beq hgr_page1_clearscreen
lda #0
beq hgr_page2_clearscreen
hgr_page1_clearscreen:
ldy #0
hgr_page1_cls_loop:
sta $2000,Y
sta $2100,Y
sta $2200,Y
sta $2300,Y
sta $2400,Y
sta $2500,Y
sta $2600,Y
sta $2700,Y
sta $2800,Y
sta $2900,Y
sta $2A00,Y
sta $2B00,Y
sta $2C00,Y
sta $2D00,Y
sta $2E00,Y
sta $2F00,Y
sta $3000,Y
sta $3100,Y
sta $3200,Y
sta $3300,Y
sta $3400,Y
sta $3500,Y
sta $3600,Y
sta $3700,Y
sta $3800,Y
sta $3900,Y
sta $3A00,Y
sta $3B00,Y
sta $3C00,Y
sta $3D00,Y
sta $3E00,Y
sta $3F00,Y
iny
bne hgr_page1_cls_loop
rts
hgr_page2_clearscreen:
ldy #0
hgr_page2_cls_loop:
sta $4000,Y
sta $4100,Y
sta $4200,Y
sta $4300,Y
sta $4400,Y
sta $4500,Y
sta $4600,Y
sta $4700,Y
sta $4800,Y
sta $4900,Y
sta $4A00,Y
sta $4B00,Y
sta $4C00,Y
sta $4D00,Y
sta $4E00,Y
sta $4F00,Y
sta $5000,Y
sta $5100,Y
sta $5200,Y
sta $5300,Y
sta $5400,Y
sta $5500,Y
sta $5600,Y
sta $5700,Y
sta $5800,Y
sta $5900,Y
sta $5A00,Y
sta $5B00,Y
sta $5C00,Y
sta $5D00,Y
sta $5E00,Y
sta $5F00,Y
iny
bne hgr_page2_cls_loop
rts

View File

@ -0,0 +1,18 @@
hgr_page_flip:
lda DRAW_PAGE
beq flip_to_page1
flip_to_page2:
bit PAGE2
lda #0
beq done_hgr_page_flip ; bra
flip_to_page1:
bit PAGE1
lda #$20
done_hgr_page_flip:
sta DRAW_PAGE
rts

View File

@ -0,0 +1,88 @@
;===========================================
; hgr draw sprite (only at 7-bit boundaries)
;===========================================
; SPRITE in INL/INH
; Location at CURSOR_X CURSOR_Y
; xsize, ysize in first two bytes
; sprite AT INL/INH
hgr_draw_sprite:
ldy #0
lda (INL),Y ; load xsize
clc
adc CURSOR_X
sta sprite_width_end_smc+1 ; self modify for end of line
iny ; load ysize
lda (INL),Y
sta sprite_ysize_smc+1 ; self modify
; skip the xsize/ysize and point to sprite
clc
lda INL ; 16-bit add
adc #2
sta sprite_smc1+1
lda INH
adc #0
sta sprite_smc1+2
ldx #0 ; X is pointer offset
stx MASK ; actual row
hgr_sprite_yloop:
lda MASK ; row
clc
adc CURSOR_Y ; add in cursor_y
; calc GBASL/GBASH
tay ; get output ROW into GBASL/H
lda hposn_low,Y
sta GBASL
lda hposn_high,Y
; eor #$00 draws on page2
; eor #$60 draws on page1
;hgr_sprite_page_smc:
; eor #$00
clc
adc DRAW_PAGE
sta GBASH
ldy CURSOR_X
sprite_inner_loop:
sprite_smc1:
lda $d000 ; get sprite pattern
sta (GBASL),Y ; store out
inx
iny
inc sprite_smc1+1
bne sprite_noflo
inc sprite_smc1+2
sprite_noflo:
sprite_width_end_smc:
cpy #6
bne sprite_inner_loop
inc MASK ; row
lda MASK ; row
sprite_ysize_smc:
cmp #31
bne hgr_sprite_yloop
rts

View File

@ -0,0 +1,97 @@
;div7_table = $b800
;mod7_table = $b900
;hposn_high = $ba00
;hposn_low = $bb00
hgr_make_tables:
;=====================
; make /7 %7 tables
;=====================
hgr_make_7_tables:
ldy #0
lda #0
ldx #0
div7_loop:
sta div7_table,Y
inx
cpx #7
bne div7_not7
clc
adc #1
ldx #0
div7_not7:
iny
bne div7_loop
ldy #0
lda #0
mod7_loop:
sta mod7_table,Y
clc
adc #1
cmp #7
bne mod7_not7
lda #0
mod7_not7:
iny
bne mod7_loop
; Hposn table
; hposn_low, hposn_high will each be filled with $C0 bytes
; based on routine by John Brooks
; posted on comp.sys.apple2 on 2018-07-11
; https://groups.google.com/d/msg/comp.sys.apple2/v2HOfHOmeNQ/zD76fJg_BAAJ
; clobbers A,X
; preserves Y
; vmw note: version I was using based on applesoft HPOSN was ~64 bytes
; this one is 37 bytes
build_hposn_tables:
ldx #0
btmi:
txa
and #$F8
bpl btpl1
ora #5
btpl1:
asl
bpl btpl2
ora #5
btpl2:
asl
asl
sta hposn_low, X
txa
and #7
rol
asl hposn_low, X
rol
ora #$20
sta hposn_high, X
inx
cpx #$C0
bne btmi
; go 16 beyond, which allows our text scrolling routine
ldx #16
extra_table_loop:
lda hposn_low,X
sta hposn_low+192,X
lda hposn_high,X
eor #$60
sta hposn_high+192,X
dex
bpl extra_table_loop
rts

View File

@ -0,0 +1,74 @@
;================================
;================================
; mockingboard interrupt handler
;================================
;================================
; On Apple II/6502 the interrupt handler jumps to address in 0xfffe
; This is in the ROM, which saves the registers
; on older IIe it saved A to $45 (which could mess with DISK II)
; newer IIe doesn't do that.
; It then calculates if it is a BRK or not (which trashes A)
; Then it sets up the stack like an interrupt and calls 0x3fe
; Note: the IIc is much more complicated
; its firmware tries to decode the proper source
; based on various things, including screen hole values
; we bypass that by switching out ROM and replacing the
; $fffe vector with this, but that does mean we have
; to be sure status flag and accumulator set properly
interrupt_handler:
php ; save status flags
cld ; clear decimal mode
pha ; save A ; 3
; A is saved in $45 by firmware
txa
pha ; save X
tya
pha ; save Y
; inc $0404 ; debug (flashes char onscreen)
lda IRQ_COUNTDOWN
beq skip_irq_dec
dec IRQ_COUNTDOWN
skip_irq_dec:
.include "pt3_lib_irq_handler.s"
jmp exit_interrupt
;=================================
; Finally done with this interrupt
;=================================
quiet_exit:
stx DONE_PLAYING
jsr clear_ay_both
ldx #$ff ; also mute the channel
stx AY_REGISTERS+7 ; just in case
exit_interrupt:
pla
tay ; restore Y
pla
tax ; restore X
pla ; restore a ; 4
; on II+/IIe (but not IIc) we need to do this?
interrupt_smc:
lda $45 ; restore A
plp
rti ; return from interrupt ; 6
;============
; typical
; ???? cycles

View File

@ -0,0 +1,94 @@
;============================
; wait for music pattern
; also check for keypress
;============================
; pattern # in A
wait_for_pattern:
cmp current_pattern_smc+1
bcc done_check_pattern_done ; blt
beq done_check_pattern_done ; ble
lda KEYPRESS
bpl done_check_pattern_notdone
bit KEYRESET
jmp done_check_pattern_done
;============================
; setup timeout of A seconds
;============================
setup_timeout:
sta SECOND_COUNTDOWN
lda #0
sta IRQ_COUNTDOWN
rts
;===========================
; countodown second timeout
; also check for keypress
;===========================
; carry set = done
check_timeout:
; check keyboard first
lda KEYPRESS
bpl timeout_not_keypress
bit KEYRESET
; lda #0 ; reset, is this necessary?
; sta IRQ_COUNTDOWN
; sta SECOND_COUNTDOWN
jmp done_check_timeout_done
timeout_not_keypress:
lda IRQ_COUNTDOWN
bne done_check_timeout_notdone
irq_countdown_zero:
lda SECOND_COUNTDOWN
beq done_check_timeout_done
; otherwise we need to decrement and update
dec SECOND_COUNTDOWN
lda #50
sta IRQ_COUNTDOWN
done_check_pattern_notdone:
done_check_timeout_notdone:
clc
rts
done_check_pattern_done:
done_check_timeout_done:
sec
rts
;==========================
; busy wait A * 1 50Hz tick
;==========================
wait_ticks:
sta IRQ_COUNTDOWN
wait_tick_loop:
lda IRQ_COUNTDOWN
bne wait_tick_loop
wait_tick_done:
rts
;====================
; busy wait A seconds
;====================
; exit early if key pressed
wait_seconds:
tax
wait_seconds_loop:
lda #50 ; wait 1s
jsr wait_ticks
lda KEYPRESS
bmi wait_seconds_done
dex
bpl wait_seconds_loop
wait_seconds_done:
bit KEYRESET
rts

View File

@ -0,0 +1,40 @@
; Code from TotalReplay by 4am and qkumba
;------------------------------------------------------------------------------
; Has64K
; Checks whether computer has functioning language card (64K)
;
; in: none
; out: C clear if 64K detected
; C set if 64K not detected
; all other flags and registers clobbered
; ROM in memory (not LC RAM bank)
;------------------------------------------------------------------------------
detect_language_card:
; enable language card
; READ_RAM1_WRITE_RAM1
bit $C08B
bit $C08B
lda #$AA ; test #1 for $D0 page
sta $D000
eor $D000
bne no_lc
lsr $D000 ; test #2 for $D0 page
lda #$55
eor $D000
bne no_lc
clc
bcc done_detect
no_lc:
sec
done_detect:
; READ_ROM_NO_WRITE
bit $C08A
rts

View File

@ -0,0 +1,670 @@
.byte 20," ",0
.byte 10,"This was a triumph.",0
.byte 20," ",0
.byte 20," ",0
.byte 8,"I'm making a note here:",0
.byte 20," ",0
.byte 20," ",0
.byte 13,"HUGE SUCCESS.",0
.byte 20," ",0
.byte 20," ",0
.byte 9,"It's hard to overstate",0
.byte 20," ",0
.byte 20," ",0
.byte 11,"my statisfaction.",0
.byte 20," ",0
.byte 20," ",0
.byte 20," ",0
.byte 12,"Aperture Science",0
.byte 20," ",0
.byte 20," ",0
.byte 11,"We do what we must",0
.byte 20," ",0
.byte 20," ",0
.byte 12,"because we can.",0
.byte 20," ",0
.byte 20," ",0
.byte 0,"For the good of all of us.",0
.byte 20," ",0
.byte 20," ",0
.byte 0,"Except the ones who are dead.",0
.byte 20," ",0
.byte 20," ",0
.byte 0,"But there's no sense crying",0
.byte 20," ",0
.byte 20," ",0
.byte 0,"over every mistake.",0
.byte 20," ",0
.byte 20," ",0
.byte 0,"You just keep on trying",0
.byte 20," ",0
.byte 20," ",0
.byte 0,"till you run out of cake",0
.byte 20," ",0
.byte 20," ",0
.byte 0,"And the Science gets done.",0
.byte 20," ",0
.byte 20," ",0
.byte 0,"And you make a neat gun.",0
.byte 20," ",0
.byte 20," ",0
.byte 0,"For the people who are",0
.byte 20," ",0
.byte 20," ",0
.byte 0,"still alive",0
.byte 20," ",0
.byte 20," ",0
.if 0
; 438: "I'm "
.byte $DE,$C9,$A7,$ED,$A0,$00
; 440: "not "
.byte $DF,$EE,$EF,$F4,$A0,$00
; 442: "ev"
.byte $E0,$E5,$F6,$00
; 444: "en "
.byte $E1,$E5,$EE,$A0,$00
; 446: "an"
.byte $E2,$E1,$EE,$00
; 449: "gry.\n"
.byte $E4,$E7,$F2,$F9,$AE,$8D,$00
; 472: "I'm "
.byte $EC,$C9,$A7,$ED,$A0,$00
; 474: "be"
.byte $ED,$E2,$E5,$00
; 476: "ing "
.byte $EE,$E9,$EE,$E7,$A0,$00
; 478: "so "
.byte $EF,$F3,$EF,$A0,$00
; 484: "sin"
.byte $F1,$F3,$E9,$EE,$00
; 486: "cere "
.byte $F2,$E3,$E5,$F2,$E5,$A0,$00
; 490: "right "
.byte $F3,$F2,$E9,$E7,$E8,$F4,$A0,$00
; 494: "now.\n"
.byte $F5,$EE,$EF,$F7,$AE,$8D,$00
; 512: "Ev"
.byte $FC,$C5,$F6,$00
; 516: "en "
.byte $FD,$E5,$EE,$A0,$00
; 518: "though "
.byte $FE,$F4,$E8,$EF,$F5,$E7,$E8,$A0,$00
; 524: "you "
.byte $FF,$F9,$EF,$F5,$A0,$00
; 528: "broke "
.byte $00,$E2,$F2,$EF,$EB,$E5,$A0,$00
; 532: "my "
.byte $01,$ED,$F9,$A0,$00
; 534: "\4heart.\n"
.byte $02,$04,$E8,$E5,$E1,$F2,$F4,$AE,$8D,$00
; 540: "And "
.byte $03,$C1,$EE,$E4,$A0,$00
; 542: "killed "
.byte $04,$EB,$E9,$EC,$EC,$E5,$E4,$A0,$00
; 546: "me.\n"
.byte $06,$ED,$E5,$AE,$8D,$00
; 566: "\5And "
.byte $0E,$05,$C1,$EE,$E4,$A0,$00
; 568: "tore "
.byte $0F,$F4,$EF,$F2,$E5,$A0,$00
; 570: "me "
.byte $10,$ED,$E5,$A0,$00
; 572: "to "
.byte $11,$F4,$EF,$A0,$00
; 574: "pie"
.byte $12,$F0,$E9,$E5,$00
; 576: "ces.\n"
.byte $13,$E3,$E5,$F3,$AE,$8D,$00
; 598: "And "
.byte $1B,$C1,$EE,$E4,$A0,$00
; 600: "threw "
.byte $1C,$F4,$E8,$F2,$E5,$F7,$A0,$00
; 602: "eve"
.byte $1D,$E5,$F6,$E5,$00
; 604: "ry "
.byte $1E,$F2,$F9,$A0,$00
; 606: "piece "
.byte $1F,$F0,$E9,$E5,$E3,$E5,$A0,$00
; 612: "in"
.byte $22,$E9,$EE,$00
; 614: "to "
.byte $23,$F4,$EF,$A0,$00
; 620: "a "
.byte $26,$E1,$A0,$00
; 622: "\6fire.\n"
.byte $27,$06,$E6,$E9,$F2,$E5,$AE,$8D,$00
; 640: "As "
.byte $2E,$C1,$F3,$A0,$00
; 644: "they "
.byte $2F,$F4,$E8,$E5,$F9,$A0,$00
; 646: "burned "
.byte $30,$E2,$F5,$F2,$EE,$E5,$E4,$A0,$00
; 652: "it "
.byte $31,$E9,$F4,$A0,$00
; 656: "hurt "
.byte $32,$E8,$F5,$F2,$F4,$A0,$00
; 660: "be"
.byte $33,$E2,$E5,$00
; 662: "cause\n"
.byte $34,$E3,$E1,$F5,$F3,$E5,$8D,$00
; 666: "I "
.byte $36,$C9,$A0,$00
; 668: "was "
.byte $37,$F7,$E1,$F3,$A0,$00
; 670: "so "
.byte $38,$F3,$EF,$A0,$00
; 672: "hap"
.byte $39,$E8,$E1,$F0,$00
; 674: "py "
.byte $3A,$F0,$F9,$A0,$00
; 676: "for "
.byte $3B,$E6,$EF,$F2,$A0,$00
; 678: "you!\n"
.byte $3C,$F9,$EF,$F5,$A1,$8D,$00
; 684: "\7Now "
.byte $3E,$07,$CE,$EF,$F7,$A0,$00
; 686: "these "
.byte $3F,$F4,$E8,$E5,$F3,$E5,$A0,$00
; 688: "points "
.byte $40,$F0,$EF,$E9,$EE,$F4,$F3,$A0,$00
; 692: "of "
.byte $41,$EF,$E6,$A0,$00
; 696: "da"
.byte $42,$E4,$E1,$00
; 698: "ta\n"
.byte $43,$F4,$E1,$8D,$00
; 700: "make "
.byte $44,$ED,$E1,$EB,$E5,$A0,$00
; 702: "a "
.byte $45,$E1,$A0,$00
; 704: "beau"
.byte $46,$E2,$E5,$E1,$F5,$00
; 706: "ti"
.byte $47,$F4,$E9,$00
; 708: "ful "
.byte $48,$E6,$F5,$EC,$A0,$00
; 712: "line.\n"
.byte $49,$EC,$E9,$EE,$E5,$AE,$8D,$00
; 716: "And "
.byte $4A,$C1,$EE,$E4,$A0,$00
; 718: "we're "
.byte $4B,$F7,$E5,$A7,$F2,$E5,$A0,$00
; 720: "out "
.byte $4C,$EF,$F5,$F4,$A0,$00
; 724: "of "
.byte $4D,$EF,$E6,$A0,$00
; 728: "be"
.byte $4E,$E2,$E5,$00
; 730: "ta.\n"
.byte $4F,$F4,$E1,$AE,$8D,$00
; 732: "We're "
.byte $50,$D7,$E5,$A7,$F2,$E5,$A0,$00
; 734: "re"
.byte $51,$F2,$E5,$00
; 736: "leas"
.byte $52,$EC,$E5,$E1,$F3,$00
; 738: "ing "
.byte $53,$E9,$EE,$E7,$A0,$00
; 740: "on "
.byte $54,$EF,$EE,$A0,$00
; 744: "time.\n"
.byte $55,$F4,$E9,$ED,$E5,$AE,$8D,$00
; 748: "\5So "
.byte $56,$05,$D3,$EF,$A0,$00
; 750: "I'm "
.byte $57,$C9,$A7,$ED,$A0,$00
; 752: "GLaD. "
.byte $58,$C7,$CC,$E1,$C4,$AE,$A0,$00
; 754: "I "
.byte $59,$C9,$A0,$00
; 756: "got "
.byte $5A,$E7,$EF,$F4,$A0,$00
; 760: "burned.\n"
.byte $5B,$E2,$F5,$F2,$EE,$E5,$E4,$AE,$8D,$00
; 764: "\3Think "
.byte $5C,$03,$D4,$E8,$E9,$EE,$EB,$A0,$00
; 766: "of "
.byte $5D,$EF,$E6,$A0,$00
; 768: "all "
.byte $5E,$E1,$EC,$EC,$A0,$00
; 770: "the "
.byte $5F,$F4,$E8,$E5,$A0,$00
; 772: "things "
.byte $60,$F4,$E8,$E9,$EE,$E7,$F3,$A0,$00
; 774: "we "
.byte $61,$F7,$E5,$A0,$00
; 776: "learned\n"
.byte $62,$EC,$E5,$E1,$F2,$EE,$E5,$E4,$8D,$00
; 780: "\1for "
.byte $63,$01,$E6,$EF,$F2,$A0,$00
; 782: "the "
.byte $64,$F4,$E8,$E5,$A0,$00
; 784: "peo"
.byte $65,$F0,$E5,$EF,$00
; 786: "ple "
.byte $66,$F0,$EC,$E5,$A0,$00
; 788: "who "
.byte $67,$F7,$E8,$EF,$A0,$00
; 790: "are\n"
.byte $68,$E1,$F2,$E5,$8D,$00
; 794: "still "
.byte $6A,$F3,$F4,$E9,$EC,$EC,$A0,$00
; 796: "a"
.byte $6B,$E1,$00
; 798: "live.\n"
.byte $6C,$EC,$E9,$F6,$E5,$AE,$8D,$00
; 800: "\f"
.byte $6D,$0C,$00
; 802: "\iForms "
.byte $6E,$C6,$EF,$F2,$ED,$F3,$A0,$00
; 804: "\iFORM-"
.byte $6F,$C6,$CF,$D2,$CD,$AD,$00
; 806: "\i5555"
.byte $71,$B5,$B5,$B5,$B5,$00
; 808: "\i1-6:\n"
.byte $72,$B1,$AD,$B6,$BA,$8D,$00
; 810: "\iPerson"
.byte $73,$D0,$E5,$F2,$F3,$EF,$EE,$00
; 812: "\inel "
.byte $74,$EE,$E5,$EC,$A0,$00
; 814: "\iFile "
.byte $75,$C6,$E9,$EC,$E5,$A0,$00
; 816: "\iAdd"
.byte $76,$C1,$E4,$E4,$00
; 818: "\iendum "
.byte $77,$E5,$EE,$E4,$F5,$ED,$A0,$00
; 820: "\iAdd"
.byte $78,$C1,$E4,$E4,$00
; 822: "\iendum"
.byte $79,$E5,$EE,$E4,$F5,$ED,$00
; 824: "\i:\n\n"
.byte $7A,$BA,$8D,$8D,$00
; 848: "\iOne "
.byte $86,$CF,$EE,$E5,$A0,$00
; 850: "\ilast "
.byte $87,$EC,$E1,$F3,$F4,$A0,$00
; 852: "\ithing:\n"
.byte $88,$F4,$E8,$E9,$EE,$E7,$BA,$8D,$00
; 854: "\i\n"
.byte $89,$8D,$00
; 856: "Go "
.byte $8A,$C7,$EF,$A0,$00
; 858: "ah"
.byte $8B,$E1,$E8,$00
; 859: "ead"
.byte $8C,$E5,$E1,$E4,$00
; 860: " and "
.byte $8D,$A0,$E1,$EE,$E4,$A0,$00
; 862: "leave "
.byte $8E,$EC,$E5,$E1,$F6,$E5,$A0,$00
; 866: "me.\n"
.byte $90,$ED,$E5,$AE,$8D,$00
; 886: "I "
.byte $9B,$C9,$A0,$00
; 888: "think "
.byte $9C,$F4,$E8,$E9,$EE,$EB,$A0,$00
; 890: "I "
.byte $9D,$C9,$A0,$00
; 892: "pre"
.byte $9E,$F0,$F2,$E5,$00
; 894: "fer "
.byte $9F,$E6,$E5,$F2,$A0,$00
; 900: "to "
.byte $A3,$F4,$EF,$A0,$00
; 902: "stay "
.byte $A4,$F3,$F4,$E1,$F9,$A0,$00
; 908: "in"
.byte $A8,$E9,$EE,$00
; 910: "side.\n"
.byte $A9,$F3,$E9,$E4,$E5,$AE,$8D,$00
; 928: "May"
.byte $B3,$CD,$E1,$F9,$00
; 932: "be "
.byte $B5,$E2,$E5,$A0,$00
; 934: "you'll "
.byte $B6,$F9,$EF,$F5,$A7,$EC,$EC,$A0,$00
; 940: "find "
.byte $B9,$E6,$E9,$EE,$E4,$A0,$00
; 944: "some"
.byte $BB,$F3,$EF,$ED,$E5,$00
; 948: "one "
.byte $BD,$EF,$EE,$E5,$A0,$00
; 950: "else\n"
.byte $BE,$E5,$EC,$F3,$E5,$8D,$00
; 956: "to "
.byte $C1,$F4,$EF,$A0,$00
; 958: "help "
.byte $C2,$E8,$E5,$EC,$F0,$A0,$00
; 962: "you.\n"
.byte $C4,$F9,$EF,$F5,$AE,$8D,$00
; 984: "\8May"
.byte $D0,$08,$CD,$E1,$F9,$00
; 986: "be "
.byte $D1,$E2,$E5,$A0,$00
; 988: "Black "
.byte $D2,$C2,$EC,$E1,$E3,$EB,$A0,$00
; 990: "Me"
.byte $D3,$CD,$E5,$00
; 994: "sa"
.byte $D5,$F3,$E1,$00
; 1002: "."
.byte $DA,$AE,$00
; 1008: "."
.byte $DD,$AE,$00
; 1012: ".\n"
.byte $DF,$AE,$8D,$00
; 1016: "THAT "
.byte $E1,$D4,$C8,$C1,$D4,$A0,$00
; 1018: "WAS "
.byte $E2,$D7,$C1,$D3,$A0,$00
; 1020: "A "
.byte $E3,$C1,$A0,$00
; 1022: "JOKE. "
.byte $E4,$CA,$CF,$CB,$C5,$AE,$A0,$00
; 1036: "FAT "
.byte $ED,$C6,$C1,$D4,$A0,$00
; 1038: "CHANCE.\n"
.byte $EE,$C3,$C8,$C1,$CE,$C3,$C5,$AE,$8D,$00
; 1056: "\9An"
.byte $F8,$09,$C1,$EE,$00
; 1060: "y"
.byte $FA,$F9,$00
; 1062: "way, "
.byte $FB,$F7,$E1,$F9,$AC,$A0,$00
; 1068: "this "
.byte $FE,$F4,$E8,$E9,$F3,$A0,$00
; 1072: "cake "
.byte $00,$E3,$E1,$EB,$E5,$A0,$00
; 1076: "is "
.byte $02,$E9,$F3,$A0,$00
; 1078: "great.\n"
.byte $03,$E7,$F2,$E5,$E1,$F4,$AE,$8D,$00
; 1082: "It's "
.byte $06,$C9,$F4,$A7,$F3,$A0,$00
; 1084: "so "
.byte $07,$F3,$EF,$A0,$00
; 1086: "de"
.byte $08,$E4,$E5,$00
; 1088: "li"
.byte $09,$EC,$E9,$00
; 1090: "cious "
.byte $0A,$E3,$E9,$EF,$F5,$F3,$A0,$00
; 1092: "and "
.byte $0B,$E1,$EE,$E4,$A0,$00
; 1094: "moist.\n"
.byte $0C,$ED,$EF,$E9,$F3,$F4,$AE,$8D,$00
; 1100: "\:Look "
.byte $10,$0A,$CC,$EF,$EF,$EB,$A0,$00
; 1102: "at "
.byte $11,$E1,$F4,$A0,$00
; 1104: "me "
.byte $12,$ED,$E5,$A0,$00
; 1108: "still "
.byte $14,$F3,$F4,$E9,$EC,$EC,$A0,$00
; 1112: "talk"
.byte $15,$F4,$E1,$EC,$EB,$00
; 1114: "ing\n"
.byte $16,$E9,$EE,$E7,$8D,$00
; 1116: "when "
.byte $17,$F7,$E8,$E5,$EE,$A0,$00
; 1118: "there's "
.byte $18,$F4,$E8,$E5,$F2,$E5,$A7,$F3,$A0,$00
; 1120: "\2Sci"
.byte $19,$02,$D3,$E3,$E9,$00
; 1122: "ence "
.byte $1A,$E5,$EE,$E3,$E5,$A0,$00
; 1124: "to "
.byte $1B,$F4,$EF,$A0,$00
; 1128: "do.\n"
.byte $1D,$E4,$EF,$AE,$8D,$00
; 1132: "\1When "
.byte $1F,$01,$D7,$E8,$E5,$EE,$A0,$00
; 1134: "I "
.byte $20,$C9,$A0,$00
; 1136: "look "
.byte $21,$EC,$EF,$EF,$EB,$A0,$00
; 1140: "out "
.byte $23,$EF,$F5,$F4,$A0,$00
; 1144: "there,\n"
.byte $24,$F4,$E8,$E5,$F2,$E5,$AC,$8D,$00
; 1146: "it "
.byte $25,$E9,$F4,$A0,$00
; 1148: "makes "
.byte $26,$ED,$E1,$EB,$E5,$F3,$A0,$00
; 1150: "me "
.byte $27,$ED,$E5,$A0,$00
; 1152: "GLaD "
.byte $28,$C7,$CC,$E1,$C4,$A0,$00
; 1154: "I'm "
.byte $29,$C9,$A7,$ED,$A0,$00
; 1156: "not "
.byte $2A,$EE,$EF,$F4,$A0,$00
; 1160: "you.\n"
.byte $2C,$F9,$EF,$F5,$AE,$8D,$00
; 1164: "\3I've "
.byte $2E,$03,$C9,$A7,$F6,$E5,$A0,$00
; 1166: "ex"
.byte $2F,$E5,$F8,$00
; 1168: "per"
.byte $30,$F0,$E5,$F2,$00
; 1170: "i"
.byte $31,$E9,$00
; 1172: "ments "
.byte $32,$ED,$E5,$EE,$F4,$F3,$A0,$00
; 1174: "to "
.byte $33,$F4,$EF,$A0,$00
; 1176: "run.\n"
.byte $34,$F2,$F5,$EE,$AE,$8D,$00
; 1180: "\5There "
.byte $36,$05,$D4,$E8,$E5,$F2,$E5,$A0,$00
; 1182: "is "
.byte $37,$E9,$F3,$A0,$00
; 1184: "re"
.byte $38,$F2,$E5,$00
; 1186: "search "
.byte $39,$F3,$E5,$E1,$F2,$E3,$E8,$A0,$00
; 1188: "to "
.byte $3A,$F4,$EF,$A0,$00
; 1190: "be "
.byte $3B,$E2,$E5,$A0,$00
; 1192: "done.\n"
.byte $3C,$E4,$EF,$EE,$E5,$AE,$8D,$00
; 1196: "\1On "
.byte $3E,$01,$CF,$EE,$A0,$00
; 1198: "the "
.byte $3F,$F4,$E8,$E5,$A0,$00
; 1200: "peo"
.byte $40,$F0,$E5,$EF,$00
; 1202: "ple "
.byte $42,$F0,$EC,$E5,$A0,$00
; 1204: "who "
.byte $43,$F7,$E8,$EF,$A0,$00
; 1206: "are "
.byte $44,$E1,$F2,$E5,$A0,$00
; 1210: "still "
.byte $46,$F3,$F4,$E9,$EC,$EC,$A0,$00
; 1212: "a"
.byte $47,$E1,$00
; 1213: "l"
.byte $48,$EC,$00
; 1214: "i"
.byte $49,$E9,$00
; 1215: "v"
.byte $4A,$F6,$00
; 1216: "e"
.byte $4B,$E5,$00
; 1217: "."
.byte $4C,$AE,$00
; 1218: "\n"
.byte $4D,$8D,$00
; 1220: "\f"
.byte $4E,$0C,$00
; 1222: "\n"
.byte $4F,$8D,$00
; 1224: "\n"
.byte $50,$8D,$00
; 1226: "\iPS: "
.byte $52,$D0,$D3,$BA,$A0,$00
; 1228: "And "
.byte $53,$C1,$EE,$E4,$A0,$00
; 1230: "be"
.byte $54,$E2,$E5,$00
; 1232: "lieve "
.byte $55,$EC,$E9,$E5,$F6,$E5,$A0,$00
; 1234: "me "
.byte $56,$ED,$E5,$A0,$00
; 1236: "I "
.byte $57,$C9,$A0,$00
; 1238: "am\n"
.byte $58,$E1,$ED,$8D,$00
; 1242: "still "
.byte $5A,$F3,$F4,$E9,$EC,$EC,$A0,$00
; 1244: "a"
.byte $5B,$E1,$00
; 1246: "live.\n"
.byte $5C,$EC,$E9,$F6,$E5,$AE,$8D,$00
; 1256: "\iPPS: "
.byte $62,$D0,$D0,$D3,$BA,$A0,$00
; 1258: "I'm "
.byte $63,$C9,$A7,$ED,$A0,$00
; 1260: "do"
.byte $64,$E4,$EF,$00
; 1262: "ing "
.byte $65,$E9,$EE,$E7,$A0,$00
; 1264: "sci"
.byte $66,$F3,$E3,$E9,$00
; 1266: "ence "
.byte $67,$E5,$EE,$E3,$E5,$A0,$00
; 1268: "and "
.byte $68,$E1,$EE,$E4,$A0,$00
; 1270: "I'm\n"
.byte $69,$C9,$A7,$ED,$8D,$00
; 1274: "still "
.byte $6B,$F3,$F4,$E9,$EC,$EC,$A0,$00
; 1276: "a"
.byte $6C,$E1,$00
; 1278: "live.\n"
.byte $6D,$EC,$E9,$F6,$E5,$AE,$8D,$00
; 1288: "\iPPPS: "
.byte $73,$D0,$D0,$D0,$D3,$BA,$A0,$00
; 1290: "I "
.byte $74,$C9,$A0,$00
; 1292: "feel "
.byte $75,$E6,$E5,$E5,$EC,$A0,$00
; 1294: "FAN"
.byte $76,$C6,$C1,$CE,$00
; 1296: "TAS"
.byte $77,$D4,$C1,$D3,$00
; 1298: "TIC "
.byte $78,$D4,$C9,$C3,$A0,$00
; 1300: "and "
.byte $79,$E1,$EE,$E4,$A0,$00
; 1302: "I'm\n"
.byte $7A,$C9,$A7,$ED,$8D,$00
; 1306: "still "
.byte $7C,$F3,$F4,$E9,$EC,$EC,$A0,$00
; 1308: "a"
.byte $7D,$E1,$00
; 1310: "live.\n\n"
.byte $7E,$EC,$E9,$F6,$E5,$AE,$8D,$8D,$00
; 1318: "\iFIN"
.byte $82,$C6,$C9,$CE,$00
; 1320: "\iAL TH"
.byte $83,$C1,$CC,$A0,$D4,$C8,$00
; 1322: "\iOUGHT:\n"
.byte $85,$CF,$D5,$C7,$C8,$D4,$BA,$8D,$00
; 1324: "While "
.byte $86,$D7,$E8,$E9,$EC,$E5,$A0,$00
; 1326: "you're "
.byte $87,$F9,$EF,$F5,$A7,$F2,$E5,$A0,$00
; 1328: "dy"
.byte $88,$E4,$F9,$00
; 1330: "ing "
.byte $89,$E9,$EE,$E7,$A0,$00
; 1332: "I'll "
.byte $8A,$C9,$A7,$EC,$EC,$A0,$00
; 1334: "be\n"
.byte $8B,$E2,$E5,$8D,$00
; 1338: "still "
.byte $8D,$F3,$F4,$E9,$EC,$EC,$A0,$00
; 1340: "a"
.byte $8E,$E1,$00
; 1342: "live.\n\n"
.byte $8F,$EC,$E9,$F6,$E5,$AE,$8D,$8D,$00
; 1344: "\iFIN"
.byte $90,$C6,$C9,$CE,$00
; 1346: "\iAL "
.byte $91,$C1,$CC,$A0,$00
; 1348: "\iTHO"
.byte $92,$D4,$C8,$CF,$00
; 1350: "\iUGHT "
.byte $94,$D5,$C7,$C8,$D4,$A0,$00
; 1352: "\iPS:\n"
.byte $95,$D0,$D3,$BA,$8D,$00
; 1354: "And "
.byte $96,$C1,$EE,$E4,$A0,$00
; 1356: "when "
.byte $97,$F7,$E8,$E5,$EE,$A0,$00
; 1358: "you're "
.byte $98,$F9,$EF,$F5,$A7,$F2,$E5,$A0,$00
; 1360: "dead "
.byte $99,$E4,$E5,$E1,$E4,$A0,$00
; 1362: "I "
.byte $9A,$C9,$A0,$00
; 1364: "will "
.byte $9B,$F7,$E9,$EC,$EC,$A0,$00
; 1366: "be\n"
.byte $9C,$E2,$E5,$8D,$00
; 1370: "still "
.byte $9E,$F3,$F4,$E9,$EC,$EC,$A0,$00
; 1372: "a"
.byte $9F,$E1,$00
; 1374: "live.\n"
.byte $A0,$EC,$E9,$F6,$E5,$AE,$8D,$00
; 1380: "\n"
.byte $A3,$8D,$00
; 1382: "\n"
.byte $A4,$8D,$00
; 1386: "STILL "
.byte $A7,$D3,$D4,$C9,$CC,$CC,$A0,$00
; 1388: "A"
.byte $A8,$C1,$00
; 1390: "LIVE\n"
.byte $A9,$CC,$C9,$D6,$C5,$8D,$00
; 1392: "\i\n"
.byte $AA,$8D,$00
; 1424: "\iTHANK"
.byte $B0,$D4,$C8,$C1,$CE,$CB,$00
; 1426: "\i YOU "
.byte $B1,$A0,$D9,$CF,$D5,$A0,$00
; 1428: "\iFOR "
.byte $B2,$C6,$CF,$D2,$A0,$00
; 1430: "\iPAR"
.byte $B3,$D0,$C1,$D2,$00
; 1432: "\iTIC"
.byte $B4,$D4,$C9,$C3,$00
; 1434: "\iIPAT"
.byte $B5,$C9,$D0,$C1,$D4,$00
; 1436: "\iING\n"
.byte $B6,$C9,$CE,$C7,$8D,$00
; 1438: "\iIN "
.byte $B7,$C9,$CE,$A0,$00
; 1440: "\iTHIS\n"
.byte $B8,$D4,$C8,$C9,$D3,$8D,$00
; 1442: "\iENRICH"
.byte $B9,$C5,$CE,$D2,$C9,$C3,$C8,$00
; 1444: "\iMENT"
.byte $BA,$CD,$C5,$CE,$D4,$00
; 1446: "\i CEN"
.byte $BB,$A0,$C3,$C5,$CE,$00
; 1448: "\iTER "
.byte $BC,$D4,$C5,$D2,$A0,$00
; 1450: "\iACT"
.byte $BD,$C1,$C3,$D4,$00
; 1452: "\iIVIT"
.byte $BE,$C9,$D6,$C9,$D4,$00
; 1454: "\iY!!\n"
.byte $BF,$D9,$A1,$A1,$8D,$00
.endif
.byte $FF

View File

@ -0,0 +1,12 @@
ZX02 = ~/research/6502_compression/zx02.git/build/zx02
all: bugsy_still_alive.pt3.zx02
bugsy_still_alive.pt3.zx02: bugsy_still_alive.pt3
$(ZX02) bugsy_still_alive.pt3 bugsy_still_alive.pt3.zx02
clean:
rm -f *~ *.zx02

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,95 @@
;===========================
; Check Apple II model
;===========================
; this is mostly for IIc support
; as it does interrupts differently
; some of this info from the document:
; Apple II Family Identification Routines 2.2
;
; ' ' = Apple II
; '+' = Apple II+
; 'e' = Apple IIe
; 'c' = Apple IIc
; 'g' = Apple IIgs
; 'm' = mac L/C with board
; 'j' = jplus
; '3' = Apple III
detect_appleii_model:
lda #' '
ldx $FBB3
; II is $38
; J-plus is $C9
; II+ is $EA (so is III)
; IIe and newer is $06
cpx #$38 ; ii
beq done_apple_detect
; ii+ is EA FB1E=AD
; iii is EA FB1E=8A 00
cpx #$EA
bne not_ii_iii
ii_or_iii:
lda #'+' ; ii+/iii
ldx $FB1E
cpx #$AD
beq done_apple_detect ; ii+
lda #'3'
bne done_apple_detect ; bra iii
not_ii_iii:
lda #'j' ; jplus
cpx #$C9
beq done_apple_detect
cpx #$06
bne done_apple_detect
apple_iie_or_newer:
ldx $FBC0 ; $EA on a IIe
; $E0 on a IIe enhanced
; $00 on a IIc/IIc+
; $FE1F = $60, IIgs
beq apple_iic
lda #'e'
cpx #$EA
beq done_apple_detect
; cpx #$E0
; beq done_apple_detect
; should do something if not $E0
; GS and IIe enhanced are the same, need to check
sec ; set carry
jsr $FE1F
bcs done_apple_detect ;If carry then IIe enhanced
; get here we're a IIgs?
lda #'g'
bne done_apple_detect
apple_iic:
lda #'c'
done_apple_detect:
sta APPLEII_MODEL
rts

View File

@ -0,0 +1,575 @@
; pt3_lib_init.s
; Initialize a song
; this is done before song starts playing so it is not
; as performance / timing critical
;====================================
; pt3_init_song
;====================================
;
pt3_init_song:
lda #$0
sta DONE_SONG ; 3
ldx #(end_vars-begin_vars)
zero_song_structs_loop:
dex
sta note_a,X
bne zero_song_structs_loop
sta pt3_noise_period_smc+1 ; 4
sta pt3_noise_add_smc+1 ; 4
sta pt3_envelope_period_l_smc+1 ; 4
sta pt3_envelope_period_h_smc+1 ; 4
sta pt3_envelope_slide_l_smc+1 ; 4
sta pt3_envelope_slide_h_smc+1 ; 4
sta pt3_envelope_slide_add_l_smc+1 ; 4
sta pt3_envelope_slide_add_h_smc+1 ; 4
sta pt3_envelope_add_smc+1 ; 4
sta pt3_envelope_type_smc+1 ; 4
sta pt3_envelope_type_old_smc+1 ; 4
sta pt3_envelope_delay_smc+1 ; 4
sta pt3_envelope_delay_orig_smc+1 ; 4
sta PT3_MIXER_VAL ; 3
sta current_pattern_smc+1 ; 4
sta current_line_smc+1 ; 4
sta current_subframe_smc+1 ; 4
lda #$f ; 2
sta note_a+NOTE_VOLUME ; 4
sta note_b+NOTE_VOLUME ; 4
sta note_c+NOTE_VOLUME ; 4
; default ornament/sample in A
; X is zero coming in here
;ldx #(NOTE_STRUCT_SIZE*0) ; 2
jsr load_ornament0_sample1 ; 6+93
; default ornament/sample in B
ldx #(NOTE_STRUCT_SIZE*1) ; 2
jsr load_ornament0_sample1 ; 6+93
; default ornament/sample in C
ldx #(NOTE_STRUCT_SIZE*2) ; 2
jsr load_ornament0_sample1 ; 6+93
;=======================
; load default speed
lda PT3_LOC+PT3_SPEED ; 4
sta pt3_speed_smc+1 ; 4
;=======================
; load loop
lda PT3_LOC+PT3_LOOP ; 4
sta pt3_loop_smc+1 ; 4
;========================
;========================
; set up note/freq table
; this saves some space and makes things marginally faster longrun
;========================
;========================
; note (heh) that there are separate tables if version 3.3
; but we are going to assume we are only going to be playing
; newer 3.4+ version files so only need the newer tables
ldx PT3_LOC+PT3_HEADER_FREQUENCY ; 4
beq use_freq_table_0
dex
beq use_freq_table_1
dex
beq use_freq_table_2
; fallthrough (freq table 3)
use_freq_table_3:
;=================================================
; Create Table #3, v4+, "PT3NoteTable_REAL_34_35"
;=================================================
ldy #11 ; !2
freq_table_3_copy_loop:
; note, high lookup almost same as 2v4, just need to adjust one value
lda base2_v4_high,Y ; !3
sta NoteTable_high,Y ; !3
lda base3_low,Y ; !3
sta NoteTable_low,Y ; !3
dey ; !1
bpl freq_table_3_copy_loop ; !2
dec NoteTable_high ; adjust to right value
jsr NoteTablePropogate ; !3
lda #<table3_v4_adjust
sta note_table_adjust_smc+1
lda #>table3_v4_adjust
sta note_table_adjust_smc+2
jsr NoteTableAdjust
jmp done_set_freq_table
use_freq_table_2:
;=================================================
; Create Table #2, v4+, "PT3NoteTable_ASM_34_35"
;=================================================
ldy #11
freq_table_2_copy_loop:
lda base2_v4_high,Y
sta NoteTable_high,Y
lda base2_v4_low,Y
sta NoteTable_low,Y
dey
bpl freq_table_2_copy_loop
jsr NoteTablePropogate ; !3
lda #<table2_v4_adjust
sta note_table_adjust_smc+1
lda #>table2_v4_adjust
sta note_table_adjust_smc+2
jsr NoteTableAdjust
jmp done_set_freq_table
use_freq_table_1:
;=================================================
; Create Table #1, "PT3NoteTable_ST"
;=================================================
ldy #11
freq_table_1_copy_loop:
lda base1_high,Y
sta NoteTable_high,Y
lda base1_low,Y
sta NoteTable_low,Y
dey
bpl freq_table_1_copy_loop
jsr NoteTablePropogate ; !3
; last adjustments
lda #$FD ; Tone[23]=$3FD
sta NoteTable_low+23
dec NoteTable_low+46 ; Tone[46]-=1;
jmp done_set_freq_table
use_freq_table_0:
;=================================================
; Create Table #0, "PT3NoteTable_PT_34_35"
;=================================================
ldy #11
freq_table_0_copy_loop:
lda base0_v4_high,Y
sta NoteTable_high,Y
lda base0_v4_low,Y
sta NoteTable_low,Y
dey
bpl freq_table_0_copy_loop
jsr NoteTablePropogate ; !3
lda #<table0_v4_adjust
sta note_table_adjust_smc+1
lda #>table0_v4_adjust
sta note_table_adjust_smc+2
jsr NoteTableAdjust
done_set_freq_table:
;======================
; calculate version
ldx #6 ; 2
lda PT3_LOC+PT3_VERSION ; 4
sec ; 2
sbc #'0' ; 2
cmp #9 ; 2
bcs not_ascii_number ; bge ; 2/3
tax ; 2
not_ascii_number:
; adjust version<6 SMC code in the slide code
; FIXME: I am sure there's a more clever way to do this
lda #$2C ; BIT ; 2
cpx #$6 ; 2
bcs version_greater_than_or_equal_6 ; bgt ; 3
; less than 6, jump
; also carry is known to be clear
adc #$20 ; BIT->JMP 2C->4C ; 2
version_greater_than_or_equal_6:
sta version_smc ; 4
pick_volume_table:
;=======================
; Pick which volume number, based on version
; if (PlParams.PT3.PT3_Version <= 4)
cpx #5 ; 2
; carry clear = 3.3/3.4 table
; carry set = 3.5 table
;==========================
; VolTableCreator
;==========================
; Creates the appropriate volume table
; based on z80 code by Ivan Roshin ZXAYHOBETA/VTII10bG.asm
;
; Called with carry==0 for 3.3/3.4 table
; Called with carry==1 for 3.5 table
; 177f-1932 = 435 bytes, not that much better than 512 of lookup
VolTableCreator:
; Init initial variables
lda #$0
sta z80_d_smc+1
ldy #$11
; Set up self modify
ldx #$2A ; ROL for self-modify
bcs vol_type_35
vol_type_33:
; For older table, we set initial conditions a bit
; different
dey
tya
ldx #$ea ; NOP for self modify
vol_type_35:
sty z80_l_smc+1 ; l=16 or 17
sta z80_e_smc+1 ; e=16 or 0
stx vol_smc ; set the self-modify code
ldy #16 ; skip first row, all zeros
ldx #16 ; c=16
vol_outer:
clc ; add HL,DE
z80_l_smc:
lda #$d1
z80_e_smc:
adc #$d1
sta z80_e_smc+1
lda #0
z80_d_smc:
adc #$d1
sta z80_d_smc+1 ; carry is important
; sbc hl,hl
lda #0
adc #$ff
eor #$ff
vol_write:
sta z80_h_smc+1
pha
vol_inner:
pla
pha
vol_smc:
nop ; nop or ROL depending
z80_h_smc:
lda #$d1
adc #$0 ; a=a+carry;
sta VolumeTable,Y
iny
pla ; add HL,DE
adc z80_e_smc+1
pha
lda z80_h_smc+1
adc z80_d_smc+1
sta z80_h_smc+1
inx ; inc C
txa ; a=c
and #$f
bne vol_inner
pla
lda z80_e_smc+1 ; a=e
cmp #$77
bne vol_m3
inc z80_e_smc+1
vol_m3:
txa ; a=c
bne vol_outer
vol_done:
rts
;=========================================
; copy note table seed to proper location
;=========================================
; faster inlined
;NoteTableCopy:
; ldy #11 ; !2
;note_table_copy_loop:
;ntc_smc1:
; lda base1_high,Y ; !3
; sta NoteTable_high,Y ; !3
;ntc_smc2:
; lda base1_low,Y ; !3
; sta NoteTable_low,Y ; !3
; dey ; !1
; bpl note_table_copy_loop ; !2
; rts ; !1
;==========================================
; propogate the freq down, dividing by two
;==========================================
NoteTablePropogate:
ldy #0
note_table_propogate_loop:
clc
lda NoteTable_high,Y
ror
sta NoteTable_high+12,Y
lda NoteTable_low,Y
ror
sta NoteTable_low+12,Y
iny
cpy #84
bne note_table_propogate_loop
rts
;================================================
; propogation isn't enough, various values
; are often off by one, so adjust using a bitmask
;================================================
NoteTableAdjust:
ldx #0
note_table_adjust_outer:
note_table_adjust_smc:
lda table0_v4_adjust,X
sta PT3_TEMP
; reset smc
lda #<NoteTable_low
sta ntl_smc+1
lda #>NoteTable_low
sta ntl_smc+2
ldy #7
note_table_adjust_inner:
ror PT3_TEMP
bcc note_table_skip_adjust
ntl_smc:
inc NoteTable_low,X
note_table_skip_adjust:
clc
lda #12
adc ntl_smc+1
sta ntl_smc+1
lda #0
adc ntl_smc+2 ; unnecessary if aligned
sta ntl_smc+2
skip_adjust_done:
dey
bpl note_table_adjust_inner
inx
cpx #12
bne note_table_adjust_outer
rts
;base0_v3_high:
;.byte $0C,$0B,$0A,$0A,$09,$09,$08,$08,$07,$07,$06,$06
;base0_v3_low:
;.byte $21,$73,$CE,$33,$A0,$16,$93,$18,$A4,$36,$CE,$6D
; note: same as base0_v3_high
base0_v4_high:
.byte $0C,$0B,$0A,$0A,$09,$09,$08,$08,$07,$07,$06,$06
base0_v4_low:
.byte $22,$73,$CF,$33,$A1,$17,$94,$19,$A4,$37,$CF,$6D
base1_high:
.byte $0E,$0E,$0D,$0C,$0B,$0B,$0A,$09,$09,$08,$08,$07
base1_low:
.byte $F8,$10,$60,$80,$D8,$28,$88,$F0,$60,$E0,$58,$E0
;base2_v3_high:
;.byte $0D,$0C,$0B,$0B,$0A,$09,$09,$08,$08,$07,$07,$07
;base2_v3_low:
;.byte $3E,$80,$CC,$22,$82,$EC,$5C,$D6,$58,$E0,$6E,$04
; note almost same as above
base2_v4_high:
.byte $0D,$0C,$0B,$0A,$0A,$09,$09,$08,$08,$07,$07,$06
base2_v4_low:
.byte $10,$55,$A4,$FC,$5F,$CA,$3D,$B8,$3B,$C5,$55,$EC
; note almost same as above
;base3_high:
;.byte $0C,$0C,$0B,$0A,$0A,$09,$09,$08,$08,$07,$07,$06
base3_low:
.byte $DA,$22,$73,$CF,$33,$A1,$17,$94,$19,$A4,$37,$CF
; Adjustment factors
table0_v4_adjust:
.byte $40,$e6,$9c,$66,$40,$2c,$20,$30,$48,$6c,$1c,$5a
table2_v4_adjust:
.byte $20,$a8,$40,$f8,$bc,$90,$78,$70,$74,$08,$2a,$50
table3_v4_adjust:
.byte $B4,$40,$e6,$9c,$66,$40,$2c,$20,$30,$48,$6c,$1c
; Table #1 of Pro Tracker 3.3x - 3.5x
;PT3NoteTable_ST_high:
;.byte $0E,$0E,$0D,$0C,$0B,$0B,$0A,$09
;.byte $09,$08,$08,$07,$07,$07,$06,$06
;.byte $05,$05,$05,$04,$04,$04,$04,$03
;.byte $03,$03,$03,$03,$02,$02,$02,$02
;.byte $02,$02,$02,$01,$01,$01,$01,$01
;.byte $01,$01,$01,$01,$01,$01,$01,$00
;.byte $00,$00,$00,$00,$00,$00,$00,$00
;.byte $00,$00,$00,$00,$00,$00,$00,$00
;.byte $00,$00,$00,$00,$00,$00,$00,$00
;.byte $00,$00,$00,$00,$00,$00,$00,$00
;.byte $00,$00,$00,$00,$00,$00,$00,$00
;.byte $00,$00,$00,$00,$00,$00,$00,$00
;PT3NoteTable_ST_low:
;.byte $F8,$10,$60,$80,$D8,$28,$88,$F0
;.byte $60,$E0,$58,$E0,$7C,$08,$B0,$40
;.byte $EC,$94,$44,$F8,$B0,$70,$2C,$FD
;.byte $BE,$84,$58,$20,$F6,$CA,$A2,$7C
;.byte $58,$38,$16,$F8,$DF,$C2,$AC,$90
;.byte $7B,$65,$51,$3E,$2C,$1C,$0A,$FC
;.byte $EF,$E1,$D6,$C8,$BD,$B2,$A8,$9F
;.byte $96,$8E,$85,$7E,$77,$70,$6B,$64
;.byte $5E,$59,$54,$4F,$4B,$47,$42,$3F
;.byte $3B,$38,$35,$32,$2F,$2C,$2A,$27
;.byte $25,$23,$21,$1F,$1D,$1C,$1A,$19
;.byte $17,$16,$15,$13,$12,$11,$10,$0F
; Table #2 of Pro Tracker 3.4x - 3.5x
;PT3NoteTable_ASM_34_35_high:
;.byte $0D,$0C,$0B,$0A,$0A,$09,$09,$08
;.byte $08,$07,$07,$06,$06,$06,$05,$05
;.byte $05,$04,$04,$04,$04,$03,$03,$03
;.byte $03,$03,$02,$02,$02,$02,$02,$02
;.byte $02,$01,$01,$01,$01,$01,$01,$01
;.byte $01,$01,$01,$01,$01,$00,$00,$00
;.byte $00,$00,$00,$00,$00,$00,$00,$00
;.byte $00,$00,$00,$00,$00,$00,$00,$00
;.byte $00,$00,$00,$00,$00,$00,$00,$00
;.byte $00,$00,$00,$00,$00,$00,$00,$00
;.byte $00,$00,$00,$00,$00,$00,$00,$00
;.byte $00,$00,$00,$00,$00,$00,$00,$00
;PT3NoteTable_ASM_34_35_low:
;.byte $10,$55,$A4,$FC,$5F,$CA,$3D,$B8
;.byte $3B,$C5,$55,$EC,$88,$2A,$D2,$7E
;.byte $2F,$E5,$9E,$5C,$1D,$E2,$AB,$76
;.byte $44,$15,$E9,$BF,$98,$72,$4F,$2E
;.byte $0F,$F1,$D5,$BB,$A2,$8B,$74,$60
;.byte $4C,$39,$28,$17,$07,$F9,$EB,$DD
;.byte $D1,$C5,$BA,$B0,$A6,$9D,$94,$8C
;.byte $84,$7C,$75,$6F,$69,$63,$5D,$58
;.byte $53,$4E,$4A,$46,$42,$3E,$3B,$37
;.byte $34,$31,$2F,$2C,$29,$27,$25,$23
;.byte $21,$1F,$1D,$1C,$1A,$19,$17,$16
;.byte $15,$14,$12,$11,$10,$0F,$0E,$0D
;PT3VolumeTable_33_34:
;.byte $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
;.byte $0,$0,$0,$0,$0,$0,$0,$0,$1,$1,$1,$1,$1,$1,$1,$1
;.byte $0,$0,$0,$0,$0,$0,$1,$1,$1,$1,$1,$2,$2,$2,$2,$2
;.byte $0,$0,$0,$0,$1,$1,$1,$1,$2,$2,$2,$2,$3,$3,$3,$3
;.byte $0,$0,$0,$0,$1,$1,$1,$2,$2,$2,$3,$3,$3,$4,$4,$4
;.byte $0,$0,$0,$1,$1,$1,$2,$2,$3,$3,$3,$4,$4,$4,$5,$5
;.byte $0,$0,$0,$1,$1,$2,$2,$3,$3,$3,$4,$4,$5,$5,$6,$6
;.byte $0,$0,$1,$1,$2,$2,$3,$3,$4,$4,$5,$5,$6,$6,$7,$7
;.byte $0,$0,$1,$1,$2,$2,$3,$3,$4,$5,$5,$6,$6,$7,$7,$8
;.byte $0,$0,$1,$1,$2,$3,$3,$4,$5,$5,$6,$6,$7,$8,$8,$9
;.byte $0,$0,$1,$2,$2,$3,$4,$4,$5,$6,$6,$7,$8,$8,$9,$A
;.byte $0,$0,$1,$2,$3,$3,$4,$5,$6,$6,$7,$8,$9,$9,$A,$B
;.byte $0,$0,$1,$2,$3,$4,$4,$5,$6,$7,$8,$8,$9,$A,$B,$C
;.byte $0,$0,$1,$2,$3,$4,$5,$6,$7,$7,$8,$9,$A,$B,$C,$D
;.byte $0,$0,$1,$2,$3,$4,$5,$6,$7,$8,$9,$A,$B,$C,$D,$E
;.byte $0,$1,$2,$3,$4,$5,$6,$7,$8,$9,$A,$B,$C,$D,$E,$F
;PT3VolumeTable_35:
;.byte $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
;.byte $0,$0,$0,$0,$0,$0,$0,$0,$1,$1,$1,$1,$1,$1,$1,$1
;.byte $0,$0,$0,$0,$1,$1,$1,$1,$1,$1,$1,$1,$2,$2,$2,$2
;.byte $0,$0,$0,$1,$1,$1,$1,$1,$2,$2,$2,$2,$2,$3,$3,$3
;.byte $0,$0,$1,$1,$1,$1,$2,$2,$2,$2,$3,$3,$3,$3,$4,$4
;.byte $0,$0,$1,$1,$1,$2,$2,$2,$3,$3,$3,$4,$4,$4,$5,$5
;.byte $0,$0,$1,$1,$2,$2,$2,$3,$3,$4,$4,$4,$5,$5,$6,$6
;.byte $0,$0,$1,$1,$2,$2,$3,$3,$4,$4,$5,$5,$6,$6,$7,$7
;.byte $0,$1,$1,$2,$2,$3,$3,$4,$4,$5,$5,$6,$6,$7,$7,$8
;.byte $0,$1,$1,$2,$2,$3,$4,$4,$5,$5,$6,$7,$7,$8,$8,$9
;.byte $0,$1,$1,$2,$3,$3,$4,$5,$5,$6,$7,$7,$8,$9,$9,$A
;.byte $0,$1,$1,$2,$3,$4,$4,$5,$6,$7,$7,$8,$9,$A,$A,$B
;.byte $0,$1,$2,$2,$3,$4,$5,$6,$6,$7,$8,$9,$A,$A,$B,$C
;.byte $0,$1,$2,$3,$3,$4,$5,$6,$7,$8,$9,$A,$A,$B,$C,$D
;.byte $0,$1,$2,$3,$4,$5,$6,$7,$7,$8,$9,$A,$B,$C,$D,$E
;.byte $0,$1,$2,$3,$4,$5,$6,$7,$8,$9,$A,$B,$C,$D,$E,$F

View File

@ -0,0 +1,116 @@
pt3_irq_handler:
pt3_irq_smc1:
bit MOCK_6522_T1CL ; clear 6522 interrupt by reading T1C-L ; 4
lda DONE_PLAYING ; 3
beq pt3_play_music ; if song done, don't play music ; 3/2nt
jmp done_pt3_irq_handler ; 3
;============
; 13
pt3_play_music:
; decode a frame of music
jsr pt3_make_frame
; handle song over condition
lda DONE_SONG
beq mb_write_frame ; if not done, continue
lda LOOP ; see if looping
beq move_to_next
pt3_loop_smc:
lda #$d1 ; looping, move to loop location
; non-zero to avoid the temptation
; to merge with following lda #$0
sta current_pattern_smc+1
lda #$0
sta current_line_smc+1
sta current_subframe_smc+1
sta DONE_SONG ; undo the next song
beq done_pt3_irq_handler ; branch always
move_to_next:
; same as "press right"
ldx #$20
jmp quiet_exit
;======================================
; Write frames to Mockingboard
;======================================
; for speed could merge this into
; the decode code
mb_write_frame:
tax ; set up reg count ; 2
;============
; 2
;==================================
; loop through the 14 registers
; reading the value, then write out
;==================================
mb_write_loop:
lda AY_REGISTERS,X ; load register value ; 4
; special case R13. If it is 0xff, then don't update
; otherwise might spuriously reset the envelope settings
cpx #13 ; 2
bne mb_not_13 ; 3/2nt
cmp #$ff ; 2
beq mb_skip_13 ; 3/2nt
;============
; typ 5
mb_not_13:
; address
pt3_irq_smc2:
stx MOCK_6522_ORA1 ; put address on PA1 ; 4
stx MOCK_6522_ORA2 ; put address on PA2 ; 4
ldy #MOCK_AY_LATCH_ADDR ; latch_address for PB1 ; 2
pt3_irq_smc3:
sty MOCK_6522_ORB1 ; latch_address on PB1 ; 4
sty MOCK_6522_ORB2 ; latch_address on PB2 ; 4
ldy #MOCK_AY_INACTIVE ; go inactive ; 2
pt3_irq_smc4:
sty MOCK_6522_ORB1 ; 4
sty MOCK_6522_ORB2 ; 4
; value
pt3_irq_smc5:
sta MOCK_6522_ORA1 ; put value on PA1 ; 4
sta MOCK_6522_ORA2 ; put value on PA2 ; 4
lda #MOCK_AY_WRITE ; ; 2
pt3_irq_smc6:
sta MOCK_6522_ORB1 ; write on PB1 ; 4
sty MOCK_6522_ORB1 ; 4
pt3_irq_smc7:
sta MOCK_6522_ORB2 ; write on PB2 ; 4
sty MOCK_6522_ORB2 ; 4
;===========
; 56
mb_no_write:
inx ; point to next register ; 2
cpx #14 ; if 14 we're done ; 2
bmi mb_write_loop ; otherwise, loop ; 3/2nt
;============
; 7
mb_skip_13:
;=================================
; Finally done with this interrupt
;=================================
done_pt3_irq_handler:

View File

@ -0,0 +1,54 @@
; Mockingboad programming:
; + Has two 6522 I/O chips connected to two AY-3-8910 chips
; + Optionally has some speech chips controlled via the outport on the AY
; + Often in slot 4
; TODO: how to auto-detect?
; References used:
; http://macgui.com/usenet/?group=2&id=8366
; 6522 Data Sheet
; AY-3-8910 Data Sheet
;========================
; Mockingboard card
; Essentially two 6522s hooked to the Apple II bus
; Connected to AY-3-8910 chips
; PA0-PA7 on 6522 connected to DA0-DA7 on AY
; PB0 on 6522 connected to BC1
; PB1 on 6522 connected to BDIR
; PB2 on 6522 connected to RESET
; left speaker
MOCK_6522_ORB1 = $C400 ; 6522 #1 port b data
MOCK_6522_ORA1 = $C401 ; 6522 #1 port a data
MOCK_6522_DDRB1 = $C402 ; 6522 #1 data direction port B
MOCK_6522_DDRA1 = $C403 ; 6522 #1 data direction port A
MOCK_6522_T1CL = $C404 ; 6522 #1 t1 low order latches
MOCK_6522_T1CH = $C405 ; 6522 #1 t1 high order counter
MOCK_6522_T1LL = $C406 ; 6522 #1 t1 low order latches
MOCK_6522_T1LH = $C407 ; 6522 #1 t1 high order latches
MOCK_6522_T2CL = $C408 ; 6522 #1 t2 low order latches
MOCK_6522_T2CH = $C409 ; 6522 #1 t2 high order counters
MOCK_6522_SR = $C40A ; 6522 #1 shift register
MOCK_6522_ACR = $C40B ; 6522 #1 auxilliary control register
MOCK_6522_PCR = $C40C ; 6522 #1 peripheral control register
MOCK_6522_IFR = $C40D ; 6522 #1 interrupt flag register
MOCK_6522_IER = $C40E ; 6522 #1 interrupt enable register
MOCK_6522_ORANH = $C40F ; 6522 #1 port a data no handshake
; right speaker
MOCK_6522_ORB2 = $C480 ; 6522 #2 port b data
MOCK_6522_ORA2 = $C481 ; 6522 #2 port a data
MOCK_6522_DDRB2 = $C482 ; 6522 #2 data direction port B
MOCK_6522_DDRA2 = $C483 ; 6522 #2 data direction port A
; AY-3-8910 commands on port B
; RESET BDIR BC1
MOCK_AY_RESET = $0 ; 0 0 0
MOCK_AY_INACTIVE = $4 ; 1 0 0
MOCK_AY_READ = $5 ; 1 0 1
MOCK_AY_WRITE = $6 ; 1 1 0
MOCK_AY_LATCH_ADDR = $7 ; 1 1 1

View File

@ -0,0 +1,222 @@
;===================================================================
; code to detect mockingboard
;===================================================================
; this isn't always easy
; my inclination is to just assume slot #4 but that isn't always realistic
; code below based on "hw.mockingboard.a" from "Total Replay"
;license:MIT
; By Andrew Roughan
; in the style of 4am for Total Replay
;
; Mockingboard support functions
;
;------------------------------------------------------------------------------
; HasMockingboard
; detect Mockingboard card by searching for 6522 timers across all slots
; access 6522 timers with deterministic cycle counts
;
; based on prior art in Mockingboard Developers Toolkit
; with optimisation from deater/french touch
; also takes into account FastChip //e clock difference
;
; in: none
; accelerators should be off
; out: C set if Mockingboard found in any slot
; if card was found, X = #$Cn where n is the slot number of the card
; C clear if no Mockingboard found
; other flags clobbered
; A/Y clobbered
;------------------------------------------------------------------------------
mockingboard_detect:
; activate Mockingboard IIc
; + the Mockingboard has to take over Slot#4 (IIc has no slots)
; in theory any write to the firmware area in $C400 will
; activate it, but that might not be fast enough when detecting
; so writing $FF to $C403/$C404 is official way to enable
; + Note this disables permanently the mouse firmware in $C400
; so "normal" interrupts are broken :( The hack to fix things
; is to switch in RAM for $F000 and just replace the IRQ
; vectors at $FFFE/$FFFF instead of $3FE/$3FF but that makes
; it difficult if you actually wanted to use any
; Applesoft/Monitor ROM routines
.ifdef PT3_ENABLE_APPLE_IIC
lda APPLEII_MODEL
cmp #'c'
bne not_iic
lda #$ff
; don't bother patching these, IIc mockingboard always slot 4
sta MOCK_6522_DDRA1 ; $C403
sta MOCK_6522_T1CL ; $C404
.endif
not_iic:
lda #$00
sta MB_ADDR_L
ldx #$C7 ; start at slot #7
mb_slot_loop:
stx MB_ADDR_H
ldy #$04 ; 6522 #1 $Cx04
jsr mb_timer_check
bne mb_next_slot
ldy #$84 ; 6522 #2 $Cx84
jsr mb_timer_check
bne mb_next_slot
mb_found:
sec ; found
rts
mb_next_slot:
dex
cpx #$C0
bne mb_slot_loop
clc ; not found
rts
mb_timer_check:
lda (MB_ADDR_L),Y ; read 6522 timer low byte
sta MB_VALUE
lda (MB_ADDR_L),Y ; second time
sec
sbc MB_VALUE
cmp #$F8 ; looking for (-)8 cycles between reads
beq mb_timer_check_done
cmp #$F7 ; FastChip //e clock is different
mb_timer_check_done:
rts
.if 0
;=======================================
; Detect a Mockingboard card
;=======================================
; Based on code from the French Touch "Pure Noise" Demo
; Attempts to time an instruction sequence with a 6522
;
; If found, puts in bMB
; MB_ADDRL:MB_ADDRH has address of Mockingboard
; returns X=0 if not found, X=1 if found
mockingboard_detect:
lda #0
sta MB_ADDRL
mb_detect_loop: ; self-modifying
lda #$07 ; we start in slot 7 ($C7) and go down to 0 ($C0)
ora #$C0 ; make it start with C
sta MB_ADDRH
ldy #04 ; $CX04
ldx #02 ; 2 tries?
mb_check_cycle_loop:
lda (MB_ADDRL),Y ; timer 6522 (Low Order Counter)
; count down
sta PT3_TEMP ; 3 cycles
lda (MB_ADDRL),Y ; + 5 cycles = 8 cycles
; between the two accesses to the timer
sec
sbc PT3_TEMP ; subtract to see if we had 8 cycles
cmp #$f8 ; -8
bne mb_not_in_this_slot
dex ; decrement, try one more time
bne mb_check_cycle_loop ; loop detection
inx ; Mockingboard found (X=1)
done_mb_detect:
;stx bMB ; store result to bMB
rts ; return
mb_not_in_this_slot:
dec mb_detect_loop+1 ; decrement the "slot" (self_modify)
bne mb_detect_loop ; loop down to one
ldx #00
beq done_mb_detect
;alternative MB detection from Nox Archaist
; lda #$04
; sta MB_ADDRL
; ldx #$c7
;
;find_mb:
; stx MB_ADDRH
;
; ;detect sound I
;
; sec
; ldy #$00
; lda (MB_ADDRL), y
; sbc (MB_ADDRL), y
; cmp #$05
; beq found_mb
; dex
; cpx #$c0
; bne find_mb
; ldx #$00 ;no mockingboard found
; rts
;
;found_mb:
; ldx #$01 ;mockingboard found
; rts
;
; ;optionally detect sound II
;
; sec
; ldy #$80
; lda (MB_ADDRL), y
; sbc (MB_ADDRL), y
; cmp #$05
; beq found_mb
;=======================================
; Detect a Mockingboard card in Slot4
;=======================================
; Based on code from the French Touch "Pure Noise" Demo
; Attempts to time an instruction sequence with a 6522
;
; MB_ADDRL:MB_ADDRH has address of Mockingboard
; returns X=0 if not found, X=1 if found
mockingboard_detect_slot4:
lda #0
sta MB_ADDRL
mb4_detect_loop: ; self-modifying
lda #$04 ; we're only looking in Slot 4
ora #$C0 ; make it start with C
sta MB_ADDRH
ldy #04 ; $CX04
ldx #02 ; 2 tries?
mb4_check_cycle_loop:
lda (MB_ADDRL),Y ; timer 6522 (Low Order Counter)
; count down
sta PT3_TEMP ; 3 cycles
lda (MB_ADDRL),Y ; + 5 cycles = 8 cycles
; between the two accesses to the timer
sec
sbc PT3_TEMP ; subtract to see if we had 8 cycles
cmp #$f8 ; -8
bne mb4_not_in_this_slot
dex ; decrement, try one more time
bne mb4_check_cycle_loop ; loop detection
inx ; Mockingboard found (X=1)
done_mb4_detect:
rts ; return
mb4_not_in_this_slot:
ldx #00
beq done_mb4_detect
.endif

View File

@ -0,0 +1,121 @@
;===================================================================
; code to patch mockingboard if not in slot#4
;===================================================================
; this is the brute force version, we have to patch 39 locations
; see further below if you want to try a smaller, more dangerous, patch
.if 0
mockingboard_patch:
lda MB_ADDR_H
sta pt3_irq_smc1+2 ; 1
sta pt3_irq_smc2+2 ; 2
sta pt3_irq_smc2+5 ; 3
sta pt3_irq_smc3+2 ; 4
sta pt3_irq_smc3+5 ; 5
sta pt3_irq_smc4+2 ; 6
sta pt3_irq_smc4+5 ; 7
sta pt3_irq_smc5+2 ; 8
sta pt3_irq_smc5+5 ; 9
sta pt3_irq_smc6+2 ; 10
sta pt3_irq_smc6+5 ; 11
sta pt3_irq_smc7+2 ; 12
sta pt3_irq_smc7+5 ; 13
sta mock_init_smc1+2 ; 14
sta mock_init_smc1+5 ; 15
sta mock_init_smc2+2 ; 16
sta mock_init_smc2+5 ; 17
sta reset_ay_smc1+2 ; 18
sta reset_ay_smc2+2 ; 19
sta reset_ay_smc3+2 ; 20
sta reset_ay_smc4+2 ; 21
sta write_ay_smc1+2 ; 22
sta write_ay_smc1+5 ; 23
sta write_ay_smc2+2 ; 24
sta write_ay_smc2+5 ; 25
sta write_ay_smc3+2 ; 26
sta write_ay_smc3+5 ; 27
sta write_ay_smc4+2 ; 28
sta write_ay_smc4+5 ; 29
sta write_ay_smc5+2 ; 30
sta write_ay_smc5+5 ; 31
sta write_ay_smc6+2 ; 32
sta write_ay_smc6+5 ; 33
sta setup_irq_smc1+2 ; 34
sta setup_irq_smc2+2 ; 35
sta setup_irq_smc3+2 ; 36
sta setup_irq_smc4+2 ; 37
sta setup_irq_smc5+2 ; 38
sta setup_irq_smc6+2 ; 39
rts
.endif
;===================================================================
; dangerous code to patch mockingboard if not in slot#4
;===================================================================
; this code patches any $C4 value to the proper slot# if not slot4
; this can be dangerous, it might over-write other important values
; that should be $C4
; safer ways to do this:
; only do this if 2 bytes after a LDA/STA/LDX/STX
; count total and if not 39 then print error message
mockingboard_patch:
; from mockingboard_init $1BBF
; to done_pt3_irq_handler $1D85
ldx MB_ADDR_H
ldy #0
lda #<mockingboard_init
sta MB_ADDR_L
lda #>mockingboard_init
sta MB_ADDR_H
mb_patch_loop:
lda (MB_ADDR_L),Y
cmp #$C4
bne mb_patch_nomatch
txa
sta (MB_ADDR_L),Y
mb_patch_nomatch:
; 16-bit increment
inc MB_ADDR_L
bne mb_patch_oflo
inc MB_ADDR_H
mb_patch_oflo:
lda MB_ADDR_H
cmp #>done_pt3_irq_handler
bne mb_patch_loop
lda MB_ADDR_L
cmp #<done_pt3_irq_handler
bne mb_patch_loop
mb_patch_done:
stx MB_ADDR_H ; restore slot for later
rts

View File

@ -0,0 +1,300 @@
; Mockingboad programming:
; + Has two 6522 I/O chips connected to two AY-3-8910 chips
; + Optionally has some speech chips controlled via the outport on the AY
; + Often in slot 4
; TODO: how to auto-detect?
; References used:
; http://macgui.com/usenet/?group=2&id=8366
; 6522 Data Sheet
; AY-3-8910 Data Sheet
;========================
; Mockingboard card
; Essentially two 6522s hooked to the Apple II bus
; Connected to AY-3-8910 chips
; PA0-PA7 on 6522 connected to DA0-DA7 on AY
; PB0 on 6522 connected to BC1
; PB1 on 6522 connected to BDIR
; PB2 on 6522 connected to RESET
; left speaker
MOCK_6522_ORB1 = $C400 ; 6522 #1 port b data
MOCK_6522_ORA1 = $C401 ; 6522 #1 port a data
MOCK_6522_DDRB1 = $C402 ; 6522 #1 data direction port B
MOCK_6522_DDRA1 = $C403 ; 6522 #1 data direction port A
MOCK_6522_T1CL = $C404 ; 6522 #1 t1 low order latches
MOCK_6522_T1CH = $C405 ; 6522 #1 t1 high order counter
MOCK_6522_T1LL = $C406 ; 6522 #1 t1 low order latches
MOCK_6522_T1LH = $C407 ; 6522 #1 t1 high order latches
MOCK_6522_T2CL = $C408 ; 6522 #1 t2 low order latches
MOCK_6522_T2CH = $C409 ; 6522 #1 t2 high order counters
MOCK_6522_SR = $C40A ; 6522 #1 shift register
MOCK_6522_ACR = $C40B ; 6522 #1 auxilliary control register
MOCK_6522_PCR = $C40C ; 6522 #1 peripheral control register
MOCK_6522_IFR = $C40D ; 6522 #1 interrupt flag register
MOCK_6522_IER = $C40E ; 6522 #1 interrupt enable register
MOCK_6522_ORANH = $C40F ; 6522 #1 port a data no handshake
; right speaker
MOCK_6522_ORB2 = $C480 ; 6522 #2 port b data
MOCK_6522_ORA2 = $C481 ; 6522 #2 port a data
MOCK_6522_DDRB2 = $C482 ; 6522 #2 data direction port B
MOCK_6522_DDRA2 = $C483 ; 6522 #2 data direction port A
; AY-3-8910 commands on port B
; RESET BDIR BC1
MOCK_AY_RESET = $0 ; 0 0 0
MOCK_AY_INACTIVE = $4 ; 1 0 0
MOCK_AY_READ = $5 ; 1 0 1
MOCK_AY_WRITE = $6 ; 1 1 0
MOCK_AY_LATCH_ADDR = $7 ; 1 1 1
;========================
; Mockingboard Init
;========================
; Initialize the 6522s
; set the data direction for all pins of PortA/PortB to be output
mockingboard_init:
lda #$ff ; all output (1)
mock_init_smc1:
sta MOCK_6522_DDRB1
sta MOCK_6522_DDRA1
mock_init_smc2:
sta MOCK_6522_DDRB2
sta MOCK_6522_DDRA2
rts
;===================================
;===================================
; Reset Both AY-3-8910s
;===================================
;===================================
;======================
; Reset Left AY-3-8910
;======================
reset_ay_both:
lda #MOCK_AY_RESET
reset_ay_smc1:
sta MOCK_6522_ORB1
lda #MOCK_AY_INACTIVE
reset_ay_smc2:
sta MOCK_6522_ORB1
;======================
; Reset Right AY-3-8910
;======================
;reset_ay_right:
;could be merged with both
lda #MOCK_AY_RESET
reset_ay_smc3:
sta MOCK_6522_ORB2
lda #MOCK_AY_INACTIVE
reset_ay_smc4:
sta MOCK_6522_ORB2
rts
; Write sequence
; Inactive -> Latch Address -> Inactive -> Write Data -> Inactive
;=========================================
; Write Right/Left to save value AY-3-8910
;=========================================
; register in X
; value in MB_VALUE
write_ay_both:
; address
write_ay_smc1:
stx MOCK_6522_ORA1 ; put address on PA1 ; 4
stx MOCK_6522_ORA2 ; put address on PA2 ; 4
lda #MOCK_AY_LATCH_ADDR ; latch_address on PB1 ; 2
write_ay_smc2:
sta MOCK_6522_ORB1 ; latch_address on PB1 ; 4
sta MOCK_6522_ORB2 ; latch_address on PB2 ; 4
ldy #MOCK_AY_INACTIVE ; go inactive ; 2
write_ay_smc3:
sty MOCK_6522_ORB1 ; 4
sty MOCK_6522_ORB2 ; 4
;===========
; 28
; value
lda MB_VALUE ; 3
write_ay_smc4:
sta MOCK_6522_ORA1 ; put value on PA1 ; 4
sta MOCK_6522_ORA2 ; put value on PA2 ; 4
lda #MOCK_AY_WRITE ; ; 2
write_ay_smc5:
sta MOCK_6522_ORB1 ; write on PB1 ; 4
sta MOCK_6522_ORB2 ; write on PB2 ; 4
write_ay_smc6:
sty MOCK_6522_ORB1 ; 4
sty MOCK_6522_ORB2 ; 4
;===========
; 29
rts ; 6
;===========
; 63
write_ay_both_end:
;.assert >write_ay_both = >write_ay_both_end, error, "write_ay_both crosses page"
;=======================================
; clear ay -- clear all 14 AY registers
; should silence the card
;=======================================
; 7+(74*14)+5=1048
clear_ay_both:
ldx #13 ; 2
lda #0 ; 2
sta MB_VALUE ; 3
clear_ay_left_loop:
jsr write_ay_both ; 6+63
dex ; 2
bpl clear_ay_left_loop ; 3
; -1
rts ; 6
;=======================================
; mute AY -- just turn off all 3 channels
; should silence the card
;
;=======================================
mute_ay_both:
ldx #7 ;
lda #$FF ;
sta MB_VALUE ;
mute_ay_left_loop:
jsr write_ay_both ;
rts ;
;=======================================
; unmute AY
; restore to value we had before muting
;=======================================
unmute_ay_both:
ldx #7 ;
lda ENABLE ;
sta MB_VALUE ;
unmute_ay_left_loop:
jsr write_ay_both ;
rts ;
clear_ay_end:
;.assert >clear_ay_both = >clear_ay_end, error, "clear_ay_both crosses page"
;=============================
; Setup
;=============================
mockingboard_setup_interrupt:
; for this demo we assume we are using the language card RAM
; so we force things to be in "IIc" mode which means
; we have ROM swapped out and can directly point the
; interrupt vector at $FFFE to here
; we also nop out the load from $45 in the interrupt handler
; because we aren't running the ROM handler that saves A
; to there on IIe/II+ systems
lda #<interrupt_handler
sta $fffe
lda #>interrupt_handler
sta $ffff
; note elsewhere we put gs_interrupt_handler in $3FE/$3FF
; nop out the "lda $45" since we are bypassing the ROM irq handler
; that puts A in $45
lda #$EA
sta interrupt_smc
sta interrupt_smc+1
;=========================
; 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
;============================
; Note, on Apple II the clock isn't 1MHz but is actually closer to
; roughly 1.023MHz, and every 65th clock is stretched (it's complicated)
; 4fe7 / 1.023e6 = .020s, 50Hz
; 9c40 / 1.023e6 = .040s, 25Hz
; 411a / 1.023e6 = .016s, 60Hz
; French Touch uses
; 4e20 / 1.000e6 = .020s, 50Hz, which assumes 1MHz clock freq
sei ; disable interrupts just in case
lda #$40 ; Continuous interrupts, don't touch PB7
setup_irq_smc1:
sta MOCK_6522_ACR ; ACR register
lda #$7F ; clear all interrupt flags
setup_irq_smc2:
sta MOCK_6522_IER ; IER register (interrupt enable)
lda #$C0
setup_irq_smc3:
sta MOCK_6522_IFR ; IFR: 1100, enable interrupt on timer one oflow
setup_irq_smc4:
sta MOCK_6522_IER ; IER: 1100, enable timer one interrupt
lda #$E7
; lda #$20
setup_irq_smc5:
sta MOCK_6522_T1CL ; write into low-order latch
lda #$4f
; lda #$4E
setup_irq_smc6:
sta MOCK_6522_T1CH ; write into high-order latch,
; load both values into counter
; clear interrupt and start counting
rts
;=============================
; Disable Interrupt
;=============================
mockingboard_disable_interrupt:
sei ; disable interrupts just in case
lda #$40 ; Continuous interrupts, don't touch PB7
disable_irq_smc1:
sta MOCK_6522_ACR ; ACR register
lda #$7F ; clear all interrupt flags
disable_irq_smc2:
sta MOCK_6522_IER ; IER register (interrupt enable)
rts

View File

@ -0,0 +1,232 @@
; Loader
.include "zp.inc"
.include "hardware.inc"
.include "music.inc"
;.include "common_defines.inc"
.include "qboot.inc"
qload_start:
; init the write code
; lda WHICH_SLOT
; jsr popwr_init
; first time entry
; start by loading text title
; lda #0 ; load ZW engine
; sta WHICH_LOAD
lda #1
sta CURRENT_DISK ; current disk number
; jsr load_file
jmp driven_start
; jmp $2000 ; jump to ZW
;====================================
; loads file specified by WHICH_LOAD
;====================================
load_file:
ldx WHICH_LOAD
lda which_disk_array,X
cmp CURRENT_DISK
bne change_disk
load_file_no_diskcheck:
lda load_address_array,X
sta load_address
lda track_array,X
sta load_track
lda sector_array,X
sta load_sector
lda length_array,X
sta load_length
jsr load_new
rts
;===================================================
;===================================================
; change disk
;===================================================
;===================================================
change_disk:
.if 0
; turn off disk drive light
jsr driveoff
jsr TEXT
jsr HOME
lda #<error_string
sta OUTL
lda #>error_string
sta OUTH
ldx WHICH_LOAD
lda which_disk_array,X
clc
adc #48
ldy #19
sta (OUTL),Y
ldy #0
quick_print:
lda (OUTL),Y
beq quick_print_done
jsr COUT1
iny
jmp quick_print
quick_print_done:
fnf_keypress:
lda KEYPRESS
bpl fnf_keypress
bit KEYRESET
;==============================================
; actually verify proper disk is there
; read T0:S0 and verify proper disk
lda WHICH_LOAD
pha
ldx #LOAD_FIRST_SECTOR ; load track 0 sector 0
stx WHICH_LOAD
jsr load_file_no_diskcheck
pla
sta WHICH_LOAD
tax
; first sector now in $c00
; offset 59
; disk1 = $0a
; disk2 = $32 ('2')
; disk3 = $33 ('3')
lda $c59
cmp #$0a
beq is_disk1
cmp #$32
beq is_disk2
cmp #$33
beq is_disk3
bne change_disk ; unknown disk
is_disk1:
lda #1
bne disk_compare
is_disk2:
lda #2
bne disk_compare
is_disk3:
lda #3
disk_compare:
cmp which_disk_array,X
bne change_disk ; disk mismatch
;==============================================
; all good, retry original load
jsr HOME
ldx WHICH_LOAD
lda which_disk_array,X
sta CURRENT_DISK
jmp load_file
; offset for disk number is 19
error_string:
.byte "PLEASE INSERT DISK 1, PRESS RETURN",0
.endif
which_disk_array:
.byte 1,1,1,1 ; MUSIC_INTRO, MUSIC_MAIN, INTRO, CREDITS
.byte 1,1,1,1 ; DNI, SCROLL
.byte 1,1,1,1 ;
.byte 1,1 ;
load_address_array:
.byte $D0,$D0,$80,$80 ; MUSIC_INTRO, MUSIC_MAIN, INTRO, CREDITS
.byte $40,$80,$60,$60 ; DNI, SCROLL
.byte $60,$60,$60,$60 ;
.byte $60,$80 ;
start_address:
.byte $D0,$D0,$80,$80 ; MUSIC_INTRO, MUSIC_MAIN, INTRO, CREDITS
.byte $40,$80,$60,$80 ; DNI, SCROLL
.byte $80,$80,$80,$60 ;
.byte $80,$80 ;
aux_dest:
.byte $D0,$D0,$A0,$A0 ; MUSIC_INTRO, MUSIC_MAIN, INTRO, CREDITS
.byte $70,$50,$40,$30 ; DNI, SCROLL
.byte $20,$10,$80,$20 ;
.byte $10,$A0 ;
track_array:
.byte 2,4,9,13 ; MUSIC_INTRO, MUSIC_MAIN, INTRO, CREDITS
.byte 17,21,23,24 ; DNI, SCROLL
.byte 25,26,27,28 ;
.byte 34,9 ;
sector_array:
.byte 0,0,0,0 ; MUSIC_INTRO, MUSIC_MAIN, INTRO, CREDITS
.byte 0,0,0,0 ; DNI, SCROLL
.byte 0,0,0,0 ;
.byte 0,0 ;
length_array:
.byte 32,48,48,64 ; MUSIC_INTRO, MUSIC_MAIN, INTRO, CREDITS
.byte 32,64,16,16 ; DNI, SCROLL
.byte 16,16,16,96 ;
.byte 16,16 ;
PT3_ENABLE_APPLE_IIC = 1
.include "wait.s"
.include "start.s"
.include "lc_detect.s"
.include "wait_a_bit.s"
.include "gr_fast_clear.s"
.include "text_print.s"
.include "gr_offsets.s"
.include "pt3_lib_detect_model.s"
.include "pt3_lib_mockingboard_detect.s"
mod7_table = $1c00
div7_table = $1d00
hposn_low = $1e00
hposn_high = $1f00
.include "hgr_table.s"
qload_end:
.assert (>qload_end - >qload_start) < $e , error, "loader too big"

View File

@ -0,0 +1,93 @@
;================================
; move_and_print
;================================
; get X,Y from OUTL/OUTH
; then print following string to that address
; stop at NUL
; convert to APPLE ASCII (or with 0x80)
; leave OUTL/OUTH pointing to next string
move_and_print:
ldy #0
lda (OUTL),Y
sta CH
iny
lda (OUTL),Y
asl
tay
lda gr_offsets,Y ; lookup low-res memory address
clc
adc CH ; add in xpos
sta BASL ; store out low byte of addy
lda gr_offsets+1,Y ; look up high byte
adc DRAW_PAGE ;
sta BASH ; and store it out
; BASH:BASL now points at right place
clc
lda OUTL
adc #2
sta OUTL
lda OUTH
adc #0
sta OUTH
;================================
; print_string
;================================
print_string:
ldy #0
print_string_loop:
lda (OUTL),Y
beq done_print_string
ps_smc1:
and #$3f ; make sure we are inverse
sta (BASL),Y
iny
bne print_string_loop
done_print_string:
iny
clc
tya
adc OUTL
sta OUTL
lda OUTH
adc #0
sta OUTH
rts
; set normal text
set_normal:
lda #$80
sta ps_smc1+1
lda #09 ; ora
sta ps_smc1
rts
; restore inverse text
set_inverse:
lda #$29
sta ps_smc1
lda #$3f
sta ps_smc1+1
rts
;================================
; move and print a list of lines
;================================
; look for negative X meaning done
move_and_print_list:
jsr move_and_print
ldy #0
lda (OUTL),Y
bpl move_and_print_list
rts

View File

@ -0,0 +1,26 @@
; wait for VBLANK
; no way to do this on II/II+ short of vapor lock / floating bus
; IIe you can read $C019 (in VBLANK when top bit 0)
; IIc you can also read $C019 (also can setup interrupt)
; IIgs you can read $C019 but reverse of IIe (in VBLANK when top bit 1)
VBLANK = $C019 ;
; wait for vblank on IIe
; positive? during vblank
wait_vblank:
lda APPLEII_MODEL
cmp #'e'
bne no_vblank
wait_vblank_iie:
lda VBLANK
bmi wait_vblank_iie ; wait for positive (in vblank)
wait_vblank_done_iie:
lda VBLANK ; wait for negative (vlank done)
bpl wait_vblank_done_iie
no_vblank:
rts

View File

@ -0,0 +1,825 @@
;==============================
; two page vertical scroll
;==============================
;
; 8*192*40 = 61440 cycles = roughly 16fps best case
;
; initial code, just scroll by 1
hgr_vertical_scroll:
ldx #0
lda DRAW_PAGE
beq hgr_vertical_scroll_page1
jmp hgr_vertical_scroll_page2
hgr_vertical_scroll_page1:
; PAGE1 for now
hgr_page1_vscroll:
ldy #39
hgr_page1_vscroll_loop:
lda $2800,Y ; 2 -> 0
sta $2000,Y
lda $2C00,Y ; 3 -> 1
sta $2400,Y
lda $3000,Y ; 4 -> 2
sta $2800,Y
lda $3400,Y ; 5 -> 3
sta $2C00,Y
lda $3800,Y ; 6 -> 4
sta $3000,Y
lda $3C00,Y ; 7 -> 5
sta $3400,Y
lda $2080,Y ; 8 -> 6
sta $3800,Y
lda $2480,Y ; 9 -> 7
sta $3C00,Y
lda $2880,Y ; 10 -> 8
sta $2080,Y
lda $2C80,Y ; 11 -> 9
sta $2480,Y
lda $3080,Y ; 12 -> 10
sta $2880,Y
lda $3480,Y ; 13 -> 11
sta $2C80,Y
lda $3880,Y ; 14 -> 12
sta $3080,Y
lda $3C80,Y ; 15 -> 13
sta $3480,Y
lda $2100,Y ; 16 -> 14
sta $3880,Y
lda $2500,Y ; 17 -> 15
sta $3C80,Y
lda $2900,Y ; 18 -> 16
sta $2100,Y
lda $2D00,Y ; 19 -> 17
sta $2500,Y
lda $3100,Y ; 20 -> 18
sta $2900,Y
lda $3500,Y ; 21 -> 19
sta $2D00,Y
lda $3900,Y ; 22 -> 20
sta $3100,Y
lda $3D00,Y ; 23 -> 21
sta $3500,Y
lda $2180,Y ; 24 -> 22
sta $3900,Y
lda $2580,Y ; 25 -> 23
sta $3D00,Y
lda $2980,Y ; 26 -> 24
sta $2180,Y
lda $2D80,Y ; 27 -> 25
sta $2580,Y
lda $3180,Y ; 28 -> 26
sta $2980,Y
lda $3580,Y ; 29 -> 27
sta $2D80,Y
lda $3980,Y ; 30 -> 28
sta $3180,Y
lda $3D80,Y ; 31 -> 29
sta $3580,Y
lda $2200,Y ; 32 -> 30
sta $3980,Y
lda $2600,Y ; 33 -> 31
sta $3D80,Y
lda $2A00,Y ; 34 -> 32
sta $2200,Y
lda $2E00,Y ; 35 -> 33
sta $2600,Y
lda $3200,Y ; 36 -> 34
sta $2A00,Y
lda $3600,Y ; 37 -> 35
sta $2E00,Y
lda $3A00,Y ; 38 -> 36
sta $3200,Y
lda $3E00,Y ; 39 -> 37
sta $3600,Y
lda $2280,Y ; 40 -> 38
sta $3A00,Y
lda $2680,Y ; 41 -> 39
sta $3E00,Y
lda $2A80,Y ; 42 -> 40
sta $2280,Y
lda $2E80,Y ; 43 -> 41
sta $2680,Y
lda $3280,Y ; 44 -> 42
sta $2A80,Y
lda $3680,Y ; 45 -> 43
sta $2E80,Y
lda $3A80,Y ; 46 -> 44
sta $3280,Y
lda $3E80,Y ; 47 -> 45
sta $3680,Y
lda $2300,Y ; 48 -> 46
sta $3A80,Y
lda $2700,Y ; 49 -> 47
sta $3E80,Y
lda $2B00,Y ; 50 -> 48
sta $2300,Y
lda $2F00,Y ; 51 -> 49
sta $2700,Y
lda $3300,Y ; 52 -> 50
sta $2B00,Y
lda $3700,Y ; 53 -> 51
sta $2F00,Y
lda $3B00,Y ; 54 -> 52
sta $3300,Y
lda $3F00,Y ; 55 -> 53
sta $3700,Y
lda $2380,Y ; 56 -> 54
sta $3B00,Y
lda $2780,Y ; 57 -> 55
sta $3F00,Y
lda $2B80,Y ; 58 -> 56
sta $2380,Y
lda $2F80,Y ; 59 -> 57
sta $2780,Y
lda $3380,Y ; 60 -> 58
sta $2B80,Y
lda $3780,Y ; 61 -> 59
sta $2F80,Y
lda $3B80,Y ; 62 -> 60
sta $3380,Y
lda $3F80,Y ; 63 -> 61
sta $3780,Y
lda $2028,Y ; 64 -> 62
sta $3B80,Y
lda $2428,Y ; 65 -> 63
sta $3F80,Y
lda $2828,Y ; 66 -> 64
sta $2028,Y
lda $2C28,Y ; 67 -> 65
sta $2428,Y
lda $3028,Y ; 68 -> 66
sta $2828,Y
lda $3428,Y ; 69 -> 67
sta $2C28,Y
lda $3828,Y ; 70 -> 68
sta $3028,Y
lda $3C28,Y ; 71 -> 69
sta $3428,Y
lda $20A8,Y ; 72 -> 70
sta $3828,Y
lda $24A8,Y ; 73 -> 71
sta $3C28,Y
lda $28A8,Y ; 74 -> 72
sta $20A8,Y
lda $2CA8,Y ; 75 -> 73
sta $24A8,Y
lda $30A8,Y ; 76 -> 74
sta $28A8,Y
lda $34A8,Y ; 77 -> 75
sta $2CA8,Y
lda $38A8,Y ; 78 -> 76
sta $30A8,Y
lda $3CA8,Y ; 79 -> 77
sta $34A8,Y
lda $2128,Y ; 80 -> 78
sta $38A8,Y
lda $2528,Y ; 81 -> 79
sta $3CA8,Y
lda $2928,Y ; 82 -> 80
sta $2128,Y
lda $2D28,Y ; 83 -> 81
sta $2528,Y
lda $3128,Y ; 84 -> 82
sta $2928,Y
lda $3528,Y ; 85 -> 83
sta $2D28,Y
lda $3928,Y ; 86 -> 84
sta $3128,Y
lda $3D28,Y ; 87 -> 85
sta $3528,Y
lda $21A8,Y ; 88 -> 86
sta $3928,Y
lda $25A8,Y ; 89 -> 87
sta $3D28,Y
lda $29A8,Y ; 90 -> 88
sta $21A8,Y
lda $2DA8,Y ; 91 -> 89
sta $25A8,Y
lda $31A8,Y ; 92 -> 90
sta $29A8,Y
lda $35A8,Y ; 93 -> 91
sta $2DA8,Y
lda $39A8,Y ; 94 -> 92
sta $31A8,Y
lda $3DA8,Y ; 95 -> 93
sta $35A8,Y
lda $2228,Y ; 96 -> 94
sta $39A8,Y
lda $2628,Y ; 97 -> 95
sta $3DA8,Y
lda $2A28,Y ; 98 -> 96
sta $2228,Y
lda $2E28,Y ; 99 -> 97
sta $2628,Y
lda $3228,Y ; 100 -> 98
sta $2A28,Y
lda $3628,Y ; 101 -> 99
sta $2E28,Y
lda $3A28,Y ; 102 -> 100
sta $3228,Y
lda $3E28,Y ; 103 -> 101
sta $3628,Y
lda $22A8,Y ; 104 -> 102
sta $3A28,Y
lda $26A8,Y ; 105 -> 103
sta $3E28,Y
lda $2AA8,Y ; 106 -> 104
sta $22A8,Y
lda $2EA8,Y ; 107 -> 105
sta $26A8,Y
lda $32A8,Y ; 108 -> 106
sta $2AA8,Y
lda $36A8,Y ; 109 -> 107
sta $2EA8,Y
lda $3AA8,Y ; 110 -> 108
sta $32A8,Y
lda $3EA8,Y ; 111 -> 109
sta $36A8,Y
lda $2328,Y ; 112 -> 110
sta $3AA8,Y
lda $2728,Y ; 113 -> 111
sta $3EA8,Y
lda $2B28,Y ; 114 -> 112
sta $2328,Y
lda $2F28,Y ; 115 -> 113
sta $2728,Y
lda $3328,Y ; 116 -> 114
sta $2B28,Y
lda $3728,Y ; 117 -> 115
sta $2F28,Y
lda $3B28,Y ; 118 -> 116
sta $3328,Y
lda $3F28,Y ; 119 -> 117
sta $3728,Y
lda $23A8,Y ; 120 -> 118
sta $3B28,Y
lda $27A8,Y ; 121 -> 119
sta $3F28,Y
lda $2BA8,Y ; 122 -> 120
sta $23A8,Y
lda $2FA8,Y ; 123 -> 121
sta $27A8,Y
lda $33A8,Y ; 124 -> 122
sta $2BA8,Y
lda $37A8,Y ; 125 -> 123
sta $2FA8,Y
lda $3BA8,Y ; 126 -> 124
sta $33A8,Y
lda $3FA8,Y ; 127 -> 125
sta $37A8,Y
lda $2050,Y ; 128 -> 126
sta $3BA8,Y
lda $2450,Y ; 129 -> 127
sta $3FA8,Y
lda $2850,Y ; 130 -> 128
sta $2050,Y
lda $2C50,Y ; 131 -> 129
sta $2450,Y
lda $3050,Y ; 132 -> 130
sta $2850,Y
lda $3450,Y ; 133 -> 131
sta $2C50,Y
lda $3850,Y ; 134 -> 132
sta $3050,Y
lda $3C50,Y ; 135 -> 133
sta $3450,Y
lda $20D0,Y ; 136 -> 134
sta $3850,Y
lda $24D0,Y ; 137 -> 135
sta $3C50,Y
lda $28D0,Y ; 138 -> 136
sta $20D0,Y
lda $2CD0,Y ; 139 -> 137
sta $24D0,Y
lda $30D0,Y ; 140 -> 138
sta $28D0,Y
lda $34D0,Y ; 141 -> 139
sta $2CD0,Y
lda $38D0,Y ; 142 -> 140
sta $30D0,Y
lda $3CD0,Y ; 143 -> 141
sta $34D0,Y
lda $2150,Y ; 144 -> 142
sta $38D0,Y
lda $2550,Y ; 145 -> 143
sta $3CD0,Y
lda $2950,Y ; 146 -> 144
sta $2150,Y
lda $2D50,Y ; 147 -> 145
sta $2550,Y
lda $3150,Y ; 148 -> 146
sta $2950,Y
lda $3550,Y ; 149 -> 147
sta $2D50,Y
lda $3950,Y ; 150 -> 148
sta $3150,Y
lda $3D50,Y ; 151 -> 149
sta $3550,Y
lda $21D0,Y ; 152 -> 150
sta $3950,Y
lda $25D0,Y ; 153 -> 151
sta $3D50,Y
lda $29D0,Y ; 154 -> 152
sta $21D0,Y
lda $2DD0,Y ; 155 -> 153
sta $25D0,Y
lda $31D0,Y ; 156 -> 154
sta $29D0,Y
lda $35D0,Y ; 157 -> 155
sta $2DD0,Y
lda $39D0,Y ; 158 -> 156
sta $31D0,Y
lda $3DD0,Y ; 159 -> 157
sta $35D0,Y
.if 0
lda $2250,Y ; 160 -> 158
sta $39D0,Y
lda $2650,Y ; 161 -> 159
sta $3DD0,Y
lda $2A50,Y ; 162 -> 160
sta $2250,Y
lda $2E50,Y ; 163 -> 161
sta $2650,Y
lda $3250,Y ; 164 -> 162
sta $2A50,Y
lda $3650,Y ; 165 -> 163
sta $2E50,Y
lda $3A50,Y ; 166 -> 164
sta $3250,Y
lda $3E50,Y ; 167 -> 165
sta $3650,Y
lda $22D0,Y ; 168 -> 166
sta $3A50,Y
lda $26D0,Y ; 169 -> 167
sta $3E50,Y
lda $2AD0,Y ; 170 -> 168
sta $22D0,Y
lda $2ED0,Y ; 171 -> 169
sta $26D0,Y
lda $32D0,Y ; 172 -> 170
sta $2AD0,Y
lda $36D0,Y ; 173 -> 171
sta $2ED0,Y
lda $3AD0,Y ; 174 -> 172
sta $32D0,Y
lda $3ED0,Y ; 175 -> 173
sta $36D0,Y
lda $2350,Y ; 176 -> 174
sta $3AD0,Y
lda $2750,Y ; 177 -> 175
sta $3ED0,Y
lda $2B50,Y ; 178 -> 176
sta $2350,Y
lda $2F50,Y ; 179 -> 177
sta $2750,Y
lda $3350,Y ; 180 -> 178
sta $2B50,Y
lda $3750,Y ; 181 -> 179
sta $2F50,Y
lda $3B50,Y ; 182 -> 180
sta $3350,Y
lda $3F50,Y ; 183 -> 181
sta $3750,Y
lda $23D0,Y ; 184 -> 182
sta $3B50,Y
lda $27D0,Y ; 185 -> 183
sta $3F50,Y
lda $2BD0,Y ; 186 -> 184
sta $23D0,Y
lda $2FD0,Y ; 187 -> 185
sta $27D0,Y
lda $33D0,Y ; 188 -> 186
sta $2BD0,Y
lda $37D0,Y ; 189 -> 187
sta $2FD0,Y
lda $3BD0,Y ; 190 -> 188
sta $33D0,Y
lda $3FD0,Y ; 191 -> 189
sta $37D0,Y
lda $0000,Y ; 192 -> 190
sta $3BD0,Y
lda $0000,Y ; 193 -> 191
sta $3FD0,Y
.endif
dey
bmi done_vscroll
jmp hgr_page1_vscroll_loop
done_vscroll:
rts
hgr_vertical_scroll_page2:
; PAGE1 for now
hgr_page2_vscroll:
ldy #39
hgr_page2_vscroll_loop:
lda $4800,Y ; 2 -> 0
sta $4000,Y
lda $4C00,Y ; 3 -> 1
sta $4400,Y
lda $5000,Y ; 4 -> 2
sta $4800,Y
lda $5400,Y ; 5 -> 3
sta $4C00,Y
lda $5800,Y ; 6 -> 4
sta $5000,Y
lda $5C00,Y ; 7 -> 5
sta $5400,Y
lda $4080,Y ; 8 -> 6
sta $5800,Y
lda $4480,Y ; 9 -> 7
sta $5C00,Y
lda $4880,Y ; 10 -> 8
sta $4080,Y
lda $4C80,Y ; 11 -> 9
sta $4480,Y
lda $5080,Y ; 12 -> 10
sta $4880,Y
lda $5480,Y ; 13 -> 11
sta $4C80,Y
lda $5880,Y ; 14 -> 12
sta $5080,Y
lda $5C80,Y ; 15 -> 13
sta $5480,Y
lda $4100,Y ; 16 -> 14
sta $5880,Y
lda $4500,Y ; 17 -> 15
sta $5C80,Y
lda $4900,Y ; 18 -> 16
sta $4100,Y
lda $4D00,Y ; 19 -> 17
sta $4500,Y
lda $5100,Y ; 20 -> 18
sta $4900,Y
lda $5500,Y ; 21 -> 19
sta $4D00,Y
lda $5900,Y ; 22 -> 20
sta $5100,Y
lda $5D00,Y ; 23 -> 21
sta $5500,Y
lda $4180,Y ; 24 -> 22
sta $5900,Y
lda $4580,Y ; 25 -> 23
sta $5D00,Y
lda $4980,Y ; 26 -> 24
sta $4180,Y
lda $4D80,Y ; 27 -> 25
sta $4580,Y
lda $5180,Y ; 28 -> 26
sta $4980,Y
lda $5580,Y ; 29 -> 27
sta $4D80,Y
lda $5980,Y ; 30 -> 28
sta $5180,Y
lda $5D80,Y ; 31 -> 29
sta $5580,Y
lda $4200,Y ; 32 -> 30
sta $5980,Y
lda $4600,Y ; 33 -> 31
sta $5D80,Y
lda $4A00,Y ; 34 -> 32
sta $4200,Y
lda $4E00,Y ; 35 -> 33
sta $4600,Y
lda $5200,Y ; 36 -> 34
sta $4A00,Y
lda $5600,Y ; 37 -> 35
sta $4E00,Y
lda $5A00,Y ; 38 -> 36
sta $5200,Y
lda $5E00,Y ; 39 -> 37
sta $5600,Y
lda $4280,Y ; 40 -> 38
sta $5A00,Y
lda $4680,Y ; 41 -> 39
sta $5E00,Y
lda $4A80,Y ; 42 -> 40
sta $4280,Y
lda $4E80,Y ; 43 -> 41
sta $4680,Y
lda $5280,Y ; 44 -> 42
sta $4A80,Y
lda $5680,Y ; 45 -> 43
sta $4E80,Y
lda $5A80,Y ; 46 -> 44
sta $5280,Y
lda $5E80,Y ; 47 -> 45
sta $5680,Y
lda $4300,Y ; 48 -> 46
sta $5A80,Y
lda $4700,Y ; 49 -> 47
sta $5E80,Y
lda $4B00,Y ; 50 -> 48
sta $4300,Y
lda $4F00,Y ; 51 -> 49
sta $4700,Y
lda $5300,Y ; 52 -> 50
sta $4B00,Y
lda $5700,Y ; 53 -> 51
sta $4F00,Y
lda $5B00,Y ; 54 -> 52
sta $5300,Y
lda $5F00,Y ; 55 -> 53
sta $5700,Y
lda $4380,Y ; 56 -> 54
sta $5B00,Y
lda $4780,Y ; 57 -> 55
sta $5F00,Y
lda $4B80,Y ; 58 -> 56
sta $4380,Y
lda $4F80,Y ; 59 -> 57
sta $4780,Y
lda $5380,Y ; 60 -> 58
sta $4B80,Y
lda $5780,Y ; 61 -> 59
sta $4F80,Y
lda $5B80,Y ; 62 -> 60
sta $5380,Y
lda $5F80,Y ; 63 -> 61
sta $5780,Y
lda $4028,Y ; 64 -> 62
sta $5B80,Y
lda $4428,Y ; 65 -> 63
sta $5F80,Y
lda $4828,Y ; 66 -> 64
sta $4028,Y
lda $4C28,Y ; 67 -> 65
sta $4428,Y
lda $5028,Y ; 68 -> 66
sta $4828,Y
lda $5428,Y ; 69 -> 67
sta $4C28,Y
lda $5828,Y ; 70 -> 68
sta $5028,Y
lda $5C28,Y ; 71 -> 69
sta $5428,Y
lda $40A8,Y ; 72 -> 70
sta $5828,Y
lda $44A8,Y ; 73 -> 71
sta $5C28,Y
lda $48A8,Y ; 74 -> 72
sta $40A8,Y
lda $4CA8,Y ; 75 -> 73
sta $44A8,Y
lda $50A8,Y ; 76 -> 74
sta $48A8,Y
lda $54A8,Y ; 77 -> 75
sta $4CA8,Y
lda $58A8,Y ; 78 -> 76
sta $50A8,Y
lda $5CA8,Y ; 79 -> 77
sta $54A8,Y
lda $4128,Y ; 80 -> 78
sta $58A8,Y
lda $4528,Y ; 81 -> 79
sta $5CA8,Y
lda $4928,Y ; 82 -> 80
sta $4128,Y
lda $4D28,Y ; 83 -> 81
sta $4528,Y
lda $5128,Y ; 84 -> 82
sta $4928,Y
lda $5528,Y ; 85 -> 83
sta $4D28,Y
lda $5928,Y ; 86 -> 84
sta $5128,Y
lda $5D28,Y ; 87 -> 85
sta $5528,Y
lda $41A8,Y ; 88 -> 86
sta $5928,Y
lda $45A8,Y ; 89 -> 87
sta $5D28,Y
lda $49A8,Y ; 90 -> 88
sta $41A8,Y
lda $4DA8,Y ; 91 -> 89
sta $45A8,Y
lda $51A8,Y ; 92 -> 90
sta $49A8,Y
lda $55A8,Y ; 93 -> 91
sta $4DA8,Y
lda $59A8,Y ; 94 -> 92
sta $51A8,Y
lda $5DA8,Y ; 95 -> 93
sta $55A8,Y
lda $4228,Y ; 96 -> 94
sta $59A8,Y
lda $4628,Y ; 97 -> 95
sta $5DA8,Y
lda $4A28,Y ; 98 -> 96
sta $4228,Y
lda $4E28,Y ; 99 -> 97
sta $4628,Y
lda $5228,Y ; 100 -> 98
sta $4A28,Y
lda $5628,Y ; 101 -> 99
sta $4E28,Y
lda $5A28,Y ; 102 -> 100
sta $5228,Y
lda $5E28,Y ; 103 -> 101
sta $5628,Y
lda $42A8,Y ; 104 -> 102
sta $5A28,Y
lda $46A8,Y ; 105 -> 103
sta $5E28,Y
lda $4AA8,Y ; 106 -> 104
sta $42A8,Y
lda $4EA8,Y ; 107 -> 105
sta $46A8,Y
lda $52A8,Y ; 108 -> 106
sta $4AA8,Y
lda $56A8,Y ; 109 -> 107
sta $4EA8,Y
lda $5AA8,Y ; 110 -> 108
sta $52A8,Y
lda $5EA8,Y ; 111 -> 109
sta $56A8,Y
lda $4328,Y ; 112 -> 110
sta $5AA8,Y
lda $4728,Y ; 113 -> 111
sta $5EA8,Y
lda $4B28,Y ; 114 -> 112
sta $4328,Y
lda $4F28,Y ; 115 -> 113
sta $4728,Y
lda $5328,Y ; 116 -> 114
sta $4B28,Y
lda $5728,Y ; 117 -> 115
sta $4F28,Y
lda $5B28,Y ; 118 -> 116
sta $5328,Y
lda $5F28,Y ; 119 -> 117
sta $5728,Y
lda $43A8,Y ; 120 -> 118
sta $5B28,Y
lda $47A8,Y ; 121 -> 119
sta $5F28,Y
lda $4BA8,Y ; 122 -> 120
sta $43A8,Y
lda $4FA8,Y ; 123 -> 121
sta $47A8,Y
lda $53A8,Y ; 124 -> 122
sta $4BA8,Y
lda $57A8,Y ; 125 -> 123
sta $4FA8,Y
lda $5BA8,Y ; 126 -> 124
sta $53A8,Y
lda $5FA8,Y ; 127 -> 125
sta $57A8,Y
lda $4050,Y ; 128 -> 126
sta $5BA8,Y
lda $4450,Y ; 129 -> 127
sta $5FA8,Y
lda $4850,Y ; 130 -> 128
sta $4050,Y
lda $4C50,Y ; 131 -> 129
sta $4450,Y
lda $5050,Y ; 132 -> 130
sta $4850,Y
lda $5450,Y ; 133 -> 131
sta $4C50,Y
lda $5850,Y ; 134 -> 132
sta $5050,Y
lda $5C50,Y ; 135 -> 133
sta $5450,Y
lda $40D0,Y ; 136 -> 134
sta $5850,Y
lda $44D0,Y ; 137 -> 135
sta $5C50,Y
lda $48D0,Y ; 138 -> 136
sta $40D0,Y
lda $4CD0,Y ; 139 -> 137
sta $44D0,Y
lda $50D0,Y ; 140 -> 138
sta $48D0,Y
lda $54D0,Y ; 141 -> 139
sta $4CD0,Y
lda $58D0,Y ; 142 -> 140
sta $50D0,Y
lda $5CD0,Y ; 143 -> 141
sta $54D0,Y
lda $4150,Y ; 144 -> 142
sta $58D0,Y
lda $4550,Y ; 145 -> 143
sta $5CD0,Y
lda $4950,Y ; 146 -> 144
sta $4150,Y
lda $4D50,Y ; 147 -> 145
sta $4550,Y
lda $5150,Y ; 148 -> 146
sta $4950,Y
lda $5550,Y ; 149 -> 147
sta $4D50,Y
lda $5950,Y ; 150 -> 148
sta $5150,Y
lda $5D50,Y ; 151 -> 149
sta $5550,Y
lda $41D0,Y ; 152 -> 150
sta $5950,Y
lda $45D0,Y ; 153 -> 151
sta $5D50,Y
lda $49D0,Y ; 154 -> 152
sta $41D0,Y
lda $4DD0,Y ; 155 -> 153
sta $45D0,Y
lda $51D0,Y ; 156 -> 154
sta $49D0,Y
lda $55D0,Y ; 157 -> 155
sta $4DD0,Y
lda $59D0,Y ; 158 -> 156
sta $51D0,Y
lda $5DD0,Y ; 159 -> 157
sta $55D0,Y
.if 0
lda $4250,Y ; 160 -> 158
sta $59D0,Y
lda $4650,Y ; 161 -> 159
sta $5DD0,Y
lda $4A50,Y ; 162 -> 160
sta $4250,Y
lda $4E50,Y ; 163 -> 161
sta $4650,Y
lda $5250,Y ; 164 -> 162
sta $4A50,Y
lda $5650,Y ; 165 -> 163
sta $4E50,Y
lda $5A50,Y ; 166 -> 164
sta $5250,Y
lda $5E50,Y ; 167 -> 165
sta $5650,Y
lda $42D0,Y ; 168 -> 166
sta $5A50,Y
lda $46D0,Y ; 169 -> 167
sta $5E50,Y
lda $4AD0,Y ; 170 -> 168
sta $42D0,Y
lda $4ED0,Y ; 171 -> 169
sta $46D0,Y
lda $52D0,Y ; 172 -> 170
sta $4AD0,Y
lda $56D0,Y ; 173 -> 171
sta $4ED0,Y
lda $5AD0,Y ; 174 -> 172
sta $52D0,Y
lda $5ED0,Y ; 175 -> 173
sta $56D0,Y
lda $4350,Y ; 176 -> 174
sta $5AD0,Y
lda $4750,Y ; 177 -> 175
sta $5ED0,Y
lda $4B50,Y ; 178 -> 176
sta $4350,Y
lda $4F50,Y ; 179 -> 177
sta $4750,Y
lda $5350,Y ; 180 -> 178
sta $4B50,Y
lda $5750,Y ; 181 -> 179
sta $4F50,Y
lda $5B50,Y ; 182 -> 180
sta $5350,Y
lda $5F50,Y ; 183 -> 181
sta $5750,Y
lda $43D0,Y ; 184 -> 182
sta $5B50,Y
lda $47D0,Y ; 185 -> 183
sta $5F50,Y
lda $4BD0,Y ; 186 -> 184
sta $43D0,Y
lda $4FD0,Y ; 187 -> 185
sta $47D0,Y
lda $53D0,Y ; 188 -> 186
sta $4BD0,Y
lda $57D0,Y ; 189 -> 187
sta $4FD0,Y
lda $5BD0,Y ; 190 -> 188
sta $53D0,Y
lda $5FD0,Y ; 191 -> 189
sta $57D0,Y
lda $2000,Y ; 192 -> 190
sta $5BD0,Y
lda $2000,Y ; 193 -> 191
sta $5FD0,Y
.endif
dey
bmi done_vscroll2
jmp hgr_page2_vscroll_loop
done_vscroll2:
rts

View File

@ -0,0 +1,18 @@
; copy of ROM wait
; because we might disable ROM
wait:
sec
wait2:
pha
wait3:
sbc #$01
bne wait3
pla
sbc #$01
bne wait2
rts
wait_end:
.assert (>wait_end - >wait) < 1 , error, "wait crosses page boundary"

View File

@ -0,0 +1,37 @@
;====================================
; wait for keypress or a few seconds
;====================================
; A is length to wait
wait_a_bit:
bit KEYRESET
tax
keyloop:
lda #200 ; delay a bit
jsr wait
lda KEYPRESS
bmi done_keyloop
dex
bne keyloop
; beq no_escape
done_keyloop:
; and #$7f
; cmp #27
; bne no_escape
; inc ESC_PRESSED
;no_escape:
bit KEYRESET
rts

View File

@ -0,0 +1,5 @@
wait_until_keypress:
lda KEYPRESS ; 4
bpl wait_until_keypress ; 3
bit KEYRESET ; clear the keyboard buffer
rts ; 6

View File

@ -0,0 +1,263 @@
;==================
;==================
; Zero Page Usage
;==================
;==================
; ZX0 decompression addresses
ZX0_src = $00
ZX0_dst = $02
offset = $04
bitr = $06
pntr = $07
WHICH_LOAD = $09
CURRENT_DISK = $0A
; Zero page monitor routines addresses
; We don't use the monitor but we use some of these anyway
WNDLFT = $20
WNDWDTH = $21
WNDTOP = $22
WNDBTM = $23
CH = $24
CV = $25
GBASL = $26
GBASH = $27
BASL = $28
BASH = $29
H2 = $2C
V2 = $2D
MASK = $2E
COLOR = $30
;INVFLG = $32
WHICH_TRACK = $54
;==========================
; $60-$6F unused currently
;==========================
;==========================
; $70-$7F for PT3 Player
;==========================
AY_REGISTERS = $70
A_FINE_TONE = $70
A_COARSE_TONE = $71
B_FINE_TONE = $72
B_COARSE_TONE = $73
C_FINE_TONE = $74
C_COARSE_TONE = $75
NOISE = $76
ENABLE = $77
PT3_MIXER_VAL = $77
A_VOLUME = $78
B_VOLUME = $79
C_VOLUME = $7A
ENVELOPE_FINE = $7B
ENVELOPE_COARSE = $7C
ENVELOPE_SHAPE = $7D
PATTERN_L = $7E
PATTERN_H = $7F
;============================
; $80-$8D rest of pt3_player
;============================
PT3_TEMP = $80
ORNAMENT_L = $81
ORNAMENT_H = $82
SAMPLE_L = $83
SAMPLE_H = $84
LOOP = $85
MB_VALUE = $86
MB_ADDR_L = $87
MB_ADDR_H = $88
DONE_PLAYING = $89
DONE_SONG = $8A
APPLEII_MODEL = $8B
SOUND_STATUS = $8C
SOUND_DISABLED = $80
SOUND_IN_LC = $01 ; $01 sound effects in language card
SOUND_MOCKINGBOARD = $02 ; mockingboard detected
;=============================
; not sure why these are here
;=============================
DISP_PAGE = $8D
DRAW_PAGE = $8E
TOTAL_RAM = $8F
;=============================
; $90-$CF currently free
;=============================
; for plasma?
;Table1 = $A0 ; 40 bytes ($28) A0-C7
;Table2 = $C8 ; 40 bytes ($28) C8-EF
;=============================
; $D0-$D9 = hgr move
;=============================
HGR_X1 = $D0
HGR_X2 = $D1
HGR_Y1 = $D2
HGR_Y2 = $D3
HGR_DEST= $D4
BOARD_COUNT = $D5
WHICH_SLOT = $DA ; from boot sector
;==============================================
; $E0-$EF use for common things, don't re-use
;==============================================
IRQ_COUNTDOWN = $E0
SECOND_COUNTDOWN= $E1
COUNT = $E2
XSAVE = $E3
TEMPY = $E4
XPOS = $E5 ; gr_plot
YPOS = $E6 ; gr_plot
COLOR_MASK = $E7 ; gr_plot
FRAME = $E8
FRAMEL = $E8
FRAMEH = $E9
BTC_L = $EA ; audio
BTC_H = $EB ; audio
MASKL = $EC ; gr_putsprite_mask
MASKH = $ED
;==============================================
; $F0-$FB can re-use in each file
;==============================================
; D'NI
SPRITEY = $EE
SPRITEX = $EF
SPRITE_XSIZE = $F0
SIN_COUNT = $F1
NUMBER_HIGH = $F2
NUMBER_LOW = $F3
DRAW_NUMBER = $FA
;OUT1 = $F0
;OUT1H = $F1
;OUT2 = $F2
;OUT2H = $F3
;COMPT1 = $F4
;COMPT2 = $F5
;PARAM1 = $F6
;PARAM2 = $F7
;PARAM3 = $F8
;PARAM4 = $F9
;GRLINE = $FA
;GRLINEH = $FB
; Credits
CURSOR_X = $EE
CURSOR_Y = $EF
SCROLL_X = $F0
BACKUP_OUTL = $F2
BACKUP_OUTH = $F3
GUITAR_FRAME = $F4
; PLASMACUBE
;OUT1 = $F0
;OUT1H = $F1
;OUT2 = $F2
;OUT2H = $F3
COMPT1 = $F4
COMPT2 = $F5
PARAM1 = $F6
PARAM2 = $F7
PARAM3 = $F8
PARAM4 = $F9
;GRLINE = $FA
;GRLINEH = $FB
; PLASMA
; CUBE
SAVEX = $F3
SAVEY = $F4
SUM = $F5
; CIRCLES/DRAW_BOXES
COLOR2 = $F3
X1 = $F4
X2 = $F5
Y1 = $F6
Y2 = $F7
SCENE_COUNT = $F8
LAST_TYPE = $F9
; lens
LENS_X = $F0
LENS_Y = $F1
XADD = $F2
YADD = $F3
; rotozoom
NUM1L = $F0
NUM1H = $F1
NUM2L = $F2
NUM2H = $F3
RESULT = $F4 ; F5,F6,F7
SCALE_I = $F8
SCALE_F = $F9
ANGLE = $FA
; scroller
HGR_COPY_Y1 = $F1
HGR_COPY_Y2 = $F2
FIRE_COLOR = $F3
SCROLL_LENGTH = $F4
OFFSET = $F5
;==============================================
; $FC-$FF we use for in/out pointers
;==============================================
INL = $FC
INH = $FD
OUTL = $FE
OUTH = $FF
; read any file slot 6 version
; based on FASTLD6 and RTS copyright (c) Peter Ferrie 2011-2013,2018
; modified to assembled with ca64 -- vmw
; added code to patch it to run from current disk slot -- vmw
adrlo = $26 ; constant from boot prom
adrhi = $27 ; constant from boot prom
tmpsec = $3c ; constant from boot prom
reqsec = $3d ; constant from boot prom
sizelo = $44
sizehi = $45
secsize = $46
ldsizel = $f0
ldsizeh = $f1
namlo = $fb
namhi = $fc
step = $fd ; state for stepper motor
tmptrk = $fe ; temporary copy of current track
phase = $ff ; current phase for /seek

View File

@ -0,0 +1,159 @@
; De-compressor for ZX02 files
; ----------------------------
;
; Decompress ZX02 data (6502 optimized format), optimized for speed and size
; 138 bytes code, 58.0 cycles/byte in test file.
;
; Compress with:
; zx02 input.bin output.zx0
;
; (c) 2022 DMSC
; Code under MIT license, see LICENSE file.
;ZP=$80
;offset = ZP+0
;ZX0_src = ZP+2
;ZX0_dst = ZP+4
;bitr = ZP+6
;pntr = ZP+7
; Initial values for offset, source, destination and bitr
;zx0_ini_block:
; .byte $00, $00, <comp_data, >comp_data, <out_addr, >out_addr, $80
;--------------------------------------------------
; Decompress ZX0 data (6502 optimized format)
zx02_full_decomp:
; ; Get initialization block
; ldy #7
;
;copy_init: lda zx0_ini_block-1, y
; sta offset-1, y
; dey
; bne copy_init
sta ZX0_dst+1 ; page to output to in A
zx_src_l:
ldy #$dd
sty ZX0_src
zx_src_h:
ldy #$dd
sty ZX0_src+1
ldy #$80
sty bitr
ldy #0
sty offset
sty offset+1
sty ZX0_dst ; always on even page
; Decode literal: Ccopy next N bytes from compressed file
; Elias(length) byte[1] byte[2] ... byte[N]
decode_literal:
jsr get_elias
cop0: lda (ZX0_src), y
inc ZX0_src
bne plus1
inc ZX0_src+1
plus1: sta (ZX0_dst),y
inc ZX0_dst
bne plus2
inc ZX0_dst+1
plus2: dex
bne cop0
asl bitr
bcs dzx0s_new_offset
; Copy from last offset (repeat N bytes from last offset)
; Elias(length)
jsr get_elias
dzx0s_copy:
lda ZX0_dst
sbc offset ; C=0 from get_elias
sta pntr
lda ZX0_dst+1
sbc offset+1
sta pntr+1
cop1:
lda (pntr), y
inc pntr
bne plus3
inc pntr+1
plus3: sta (ZX0_dst),y
inc ZX0_dst
bne plus4
inc ZX0_dst+1
plus4: dex
bne cop1
asl bitr
bcc decode_literal
; Copy from new offset (repeat N bytes from new offset)
; Elias(MSB(offset)) LSB(offset) Elias(length-1)
dzx0s_new_offset:
; Read elias code for high part of offset
jsr get_elias
beq exit ; Read a 0, signals the end
; Decrease and divide by 2
dex
txa
lsr ; @
sta offset+1
; Get low part of offset, a literal 7 bits
lda (ZX0_src), y
inc ZX0_src
bne plus5
inc ZX0_src+1
plus5:
; Divide by 2
ror ; @
sta offset
; And get the copy length.
; Start elias reading with the bit already in carry:
ldx #1
jsr elias_skip1
inx
bcc dzx0s_copy
; Read an elias-gamma interlaced code.
; ------------------------------------
get_elias:
; Initialize return value to #1
ldx #1
bne elias_start
elias_get: ; Read next data bit to result
asl bitr
rol ; @
tax
elias_start:
; Get one bit
asl bitr
bne elias_skip1
; Read new bit from stream
lda (ZX0_src), y
inc ZX0_src
bne plus6
inc ZX0_src+1
plus6: ;sec ; not needed, C=1 guaranteed from last bit
rol ;@
sta bitr
elias_skip1:
txa
bcs elias_get
; Got ending bit, stop reading
exit:
rts