diff --git a/pt3_player/README.pt3 b/pt3_player/README.pt3 index eef168b7..1d81c1fa 100644 --- a/pt3_player/README.pt3 +++ b/pt3_player/README.pt3 @@ -1,2 +1,5 @@ PT3_player + + +ASR = CMP #$80 / ROR diff --git a/pt3_player/pt3_lib.s b/pt3_player/pt3_lib.s index 01ac305f..1de47b6a 100644 --- a/pt3_player/pt3_lib.s +++ b/pt3_player/pt3_lib.s @@ -197,6 +197,8 @@ PT3_ORNAMENT_LOC_L = $A9 PT3_OTNAMENT_LOC_H = $AA PT3_PATTERN_TABLE = $C9 +ysave: .byte $00 + ;=========================== ; Load Ornament ;=========================== @@ -204,42 +206,102 @@ PT3_PATTERN_TABLE = $C9 load_ornament: + sty ysave + ; save as new ornament ; sta note_a+NOTE_ORNAMENT ; do we use this? ;pt3->ornament_patterns[i]= ; (pt3->data[0xaa+(i*2)]<<8)|pt3->data[0xa9+(i*2)]; -; 20A9+(a*2) -> ornament_pointer_l -; 20AA+(a*2) -> ornament_pointer_h - -; a->ornament_pointer=pt3->ornament_patterns[a->ornament]; -; a->ornament_loop=pt3->data[a->ornament_pointer]; -; a->ornament_pointer++; -; a->ornament_length=pt3->data[a->ornament_pointer]; -; a->ornament_pointer++; + ; 20A9+(a*2) -> ornament_pointer_l clc - lda note_a+NOTE_ORNAMENT_POINTER_L - adc #2 - sta note_a+NOTE_ORNAMENT_POINTER_L - lda note_a+NOTE_ORNAMENT_POINTER_H - adc #0 - sta note_a+NOTE_ORNAMENT_POINTER_H + asl ; A*2 + adc #$a9 + tay + lda PT3_LOC,Y + sta ORNAMENT_A_L + + iny + lda PT3_LOC,Y + clc + adc #>PT3_LOC + sta ORNAMENT_A_H ; a->ornament_pointer=pt3->ornament_patterns[a->ornament]; + + ldy #0 + + lda (ORNAMENT_A_L),Y + sta note_a+NOTE_ORNAMENT_LOOP +; a->ornament_loop=pt3->data[a->ornament_pointer]; + + iny + lda (ORNAMENT_A_L),Y + sta note_a+NOTE_ORNAMENT_LENGTH + +; a->ornament_length=pt3->data[a->ornament_pointer]; + + + clc + lda ORNAMENT_A_L + adc #$2 + sta ORNAMENT_A_L + +; clc +; lda note_a+NOTE_ORNAMENT_POINTER_L +; adc #2 +; sta note_a+NOTE_ORNAMENT_POINTER_L +; lda note_a+NOTE_ORNAMENT_POINTER_H +; adc #0 +; sta note_a+NOTE_ORNAMENT_POINTER_H + + + ldy ysave rts ;=========================== ; Load Sample ;=========================== - ; + ; sample in A load_sample: -; a->sample_pointer=pt3->sample_patterns[a->sample]; -; a->sample_loop=pt3->data[a->sample_pointer]; -; a->sample_pointer++; -; a->sample_length=pt3->data[a->sample_pointer]; -; a->sample_pointer++; + + sty ysave + + ;pt3->ornament_patterns[i]= + ; (pt3->data[0x6a+(i*2)]<<8)|pt3->data[0x69+(i*2)]; + + clc + asl ; A*2 + adc #$69 + tay + + lda PT3_LOC,Y + sta SAMPLE_A_L + + iny + lda PT3_LOC,Y + clc + adc #>PT3_LOC + sta SAMPLE_A_H ; a->sample_pointer=pt3->sample_patterns[a->sample]; + + ldy #0 + + lda (SAMPLE_A_L),Y + sta note_a+NOTE_SAMPLE_LOOP ; a->sample_loop=pt3->data[a->sample_pointer]; + + iny + lda (SAMPLE_A_L),Y + sta note_a+NOTE_SAMPLE_LENGTH ; a->sample_length=pt3->data[a->sample_pointer]; + + clc + lda SAMPLE_A_L + adc #$2 + sta SAMPLE_A_L + + + ldy ysave rts @@ -265,17 +327,20 @@ pt3_init_song: lda #0 jsr load_ornament lda #'A' + lda #1 jsr load_sample - lda #'B' - lda #0 - jsr load_ornament - lda #'B' - jsr load_sample - lda #'C' - lda #0 - jsr load_ornament - lda #'C' - jsr load_sample +; lda #'B' +; lda #0 +; jsr load_ornament +; lda #'B' +; lda #1 +; jsr load_sample +; lda #'C' +; lda #0 +; jsr load_ornament +; lda #'C' +; lda #1 +; jsr load_sample lda #$0 sta pt3_noise_period @@ -291,17 +356,44 @@ pt3_init_song: ; Calculate Note ;===================================== calculate_note: - ldy #0 - lda note_a+NOTE_ENABLED,Y + lda note_a+NOTE_ENABLED bne note_enabled lda #0 - sta note_a+NOTE_AMPLITUDE,Y + sta note_a+NOTE_AMPLITUDE jmp done_note note_enabled: + lda note_a+NOTE_SAMPLE_POSITION + asl + asl + tay + lda (SAMPLE_A_L),Y + sta sample_b0 + + iny + lda (SAMPLE_A_L),Y + sta sample_b1 + + iny + lda (SAMPLE_A_L),Y + sta note_a+NOTE_TONE_L + + iny + lda (SAMPLE_A_L),Y + sta note_a+NOTE_TONE_H + + clc + lda note_a+NOTE_TONE_ACCUMULATOR_L + adc note_a+NOTE_TONE_L + sta note_a+NOTE_TONE_L + lda note_a+NOTE_TONE_H + adc note_a+NOTE_TONE_ACCUMULATOR_H + sta note_a+NOTE_TONE_H + + ; b0 = pt3->data[a->sample_pointer + a->sample_position * 4]; ; b1 = pt3->data[a->sample_pointer + a->sample_position * 4 + 1]; ; a->tone = pt3->data[a->sample_pointer + a->sample_position * 4 + 2]; @@ -381,7 +473,7 @@ done_amp_sliding: ; clamp amplitude to 0 - 15 - lda note_a+NOTE_AMPLITUDE,Y + lda note_a+NOTE_AMPLITUDE check_amp_lo: bpl check_amp_hi lda #0 @@ -392,7 +484,7 @@ check_amp_hi: bcc done_clamp_amplitude ; blt lda #15 write_clamp_amplitude: - sta note_a+NOTE_AMPLITUDE,Y + sta note_a+NOTE_AMPLITUDE done_clamp_amplitude: ; if (PlParams.PT3.PT3_Version <= 4) @@ -400,15 +492,15 @@ done_clamp_amplitude: ; } ; else { - lda note_a+NOTE_VOLUME,Y + lda note_a+NOTE_VOLUME asl asl asl asl - ora note_a+NOTE_AMPLITUDE,Y + ora note_a+NOTE_AMPLITUDE tax lda PT3VolumeTable_35,X - sta note_a+NOTE_AMPLITUDE,Y ; a->amplitude = PT3VolumeTable_35[a->volume][a->amplitude]; + sta note_a+NOTE_AMPLITUDE ; a->amplitude = PT3VolumeTable_35[a->volume][a->amplitude]; ; } lda sample_b0 ; if (((b0 & 0x1) == 0) && ( a->envelope_enabled)) { @@ -722,7 +814,7 @@ decode_case_bX: ;============================================ ; $BX -- note length or envelope manipulation ;============================================ - cmp #$b0 + cmp #$b0 ; FIXME: this cmp not needed, from before? bne decode_case_cX txa @@ -1020,10 +1112,10 @@ pt3_decode_line: jsr decode_note ; decode_note(&pt3->b,&(pt3->b_addr),pt3); - jsr decode_note +; jsr decode_note ; decode_note(&pt3->c,&(pt3->c_addr),pt3); - jsr decode_note +; jsr decode_note ; if (pt3->a.all_done && pt3->b.all_done && pt3->c.all_done) { ; return 1; @@ -1179,10 +1271,10 @@ do_frame: lda #0 ; Note A jsr calculate_note - lda #1 ; Note B - jsr calculate_note - lda #2 ; Note C - jsr calculate_note +; lda #1 ; Note B +; jsr calculate_note +; lda #2 ; Note C +; jsr calculate_note ; Load up the Frequency Registers diff --git a/pt3_player/zp.inc b/pt3_player/zp.inc index 2e4a5d2c..3b8218d5 100644 --- a/pt3_player/zp.inc +++ b/pt3_player/zp.inc @@ -84,63 +84,36 @@ ENVELOPE_COARSE EQU $7C ENVELOPE_SHAPE EQU $7D COPY_OFFSET EQU $7E DECODER_STATE EQU $7F - ;SPACEY_I EQU $70 - ;SPACEY_F EQU $71 - ;CY_I EQU $72 - ;CY_F EQU $73 - ;TEMP_I EQU $74 - ;TEMP_F EQU $75 - ;DISTANCE_I EQU $76 - ;DISTANCE_F EQU $77 - ;SPACEZ_I EQU $78 - ;SPACEZ_F EQU $79 - ;DRAW_SPLASH EQU $7A - ;SPEED EQU $7B - ;SPLASH_COUNT EQU $7C - ;OVER_LAND EQU $7D - ;NUM1L EQU $7E - ;NUM1H EQU $7F + PATTERN_L EQU $80 PATTERN_H EQU $81 -DECODE_ERROR EQU $82 +ORNAMENT_A_L EQU $82 +ORNAMENT_A_H EQU $83 +SAMPLE_A_L EQU $84 +SAMPLE_A_H EQU $85 -A_COLOR EQU $83 -B_COLOR EQU $84 -C_COLOR EQU $85 -COPY_TIME EQU $86 -DECOMPRESS_TIME EQU $87 -TIME_TAKEN EQU $88 -SCREEN_Y EQU $89 -WHICH_FILE EQU $8A - ;NUM2L EQU $80 - ;NUM2H EQU $81 - ;RESULT EQU $82 ; 83,84,85 - ;NEGATE EQU $86 ; UNUSED? - ;LAST_SPACEX_I EQU $87 - ;LAST_SPACEY_I EQU $88 - ;LAST_MAP_COLOR EQU $89 - ;DRAW_SKY EQU $8A -COLOR_MASK EQU $8B -RASTERBARS_ON EQU $8C - ;KEY_COUNT EQU $8C - ;KEY_OFFSET EQU $8D - ;DRAW_BLUE_SKY EQU $8E -RANDOM_POINTER EQU $8F -FRAME_COUNT EQU $90 -MB_VALUE EQU $91 -;MB_CHUNK EQU $92 -MB_ADDRL EQU $91 -MB_ADDRH EQU $92 -DONE_PLAYING EQU $93 -;MB_FRAME_DIFF EQU $94 -MB_CHUNK_OFFSET EQU $94 - ;LZSS_RL EQU $95 - ;LZSS_RH EQU $96 - ;LZSS_COUNT EQU $97 - ;LZSS_MASK EQU $98 - ;LZSS_ENDL EQU $99 - ;LZSS_ENDH EQU $9A - ;MB_FRAME_DIFF2 EQU $9F + + + +DECODE_ERROR EQU $90 +A_COLOR EQU $91 +B_COLOR EQU $92 +C_COLOR EQU $93 +COPY_TIME EQU $94 +DECOMPRESS_TIME EQU $95 +TIME_TAKEN EQU $96 +SCREEN_Y EQU $97 +WHICH_FILE EQU $98 +COLOR_MASK EQU $99 +RASTERBARS_ON EQU $9A +RANDOM_POINTER EQU $9B +FRAME_COUNT EQU $9C +MB_VALUE EQU $9D +;MB_CHUNK EQU $9E +MB_ADDRL EQU $9F +MB_ADDRH EQU $A0 +DONE_PLAYING EQU $A1 +MB_CHUNK_OFFSET EQU $A2 ; More zero-page addresses ; we try not to conflict with anything DOS, MONITOR or BASIC related