tb_6502-1.1/0040755000367200001440000000000010100624506011462 5ustar vinceuserstb_6502-1.1/Makefile0100644000367200001440000000046507724230406013136 0ustar vinceusersall: TB_6502 TB_6502: tb_6502 make_b ./tb_6502 ./TB_6502 0xC00 tb_6502: tb_6502.o ld65 -C ./apple2_c00.inc -o tb_6502 tb_6502.o tb_6502.o: tb_6502.s ca65 -o tb_6502.o -l tb_6502.s disk: dos33 tb_6502.dsk SAVE B TB_6502 clean: rm -f *.lst *.o tb_6502 *~ add_to_disk TB_6502 make_b a.out tb_6502-1.1/Changelog0100644000367200001440000000742010100624456013300 0ustar vinceusers8 April 2003 + Got simple hello world to compile and run when entered in hex by hand [ od -t x1 hello ] into apple emulator. + start work on add-file-to-disk-image program 10 April 2003 + Add to disk program now lets you add arbitrary files to a disk image. + Hello World program now works from "BRUN TB_6502" 11 April 2003 + Move from default Apple start addy of $800 to $c00 so we can use low-res page flipping (page1 is from $800-$bff) + Got print_text_xy routine working + Got blit working! VMW opening screen now comes up! 14 April 2003 + RLE compress the sprites + get title screen displaying after figuring out minor problem [was > 256 bytes] 15 April 2003 + Add support for in-line x and y on put_text_xy 16 April 2003 + Worked on dos3.3 utils rather than any useful menu stuff 9 May 2003 + Have menu partially working, plus the about and phobos sprites loading 15 May 2003 + Have "ABOUT" running the way I like, and not as cluttered as it was. 28 May 2003 + Fix up printxy to correctly wrap at 8-byte boundary + have the story output text set up correctly. + add a "clear_bottom_ function. 1 June 2003 + Story works + Spent 3 hours figuring out why put_text_xy have sporadic problem. Stupid 6502 and no-16-bit addition. So very tired... 12 June 2003 + Add arrow key support + Faster clear-screen 13 June 2003 + Fix arrow keys being backwards, add escape key support 21 June 2003 + Get normal TB left/right support, and clipping. + Add missile support + Fix various minor bugs. + Set up page flipping. Make clear_screen, clear_bottom, and blit handle this properly + Get preliminary shields/level/score indicator working + (yes my gf was out of town, how can you guess) 11 July 2003 + Got an enemy to appear in upper left 14 July 2003 + Enemy moving back and forth, but major heisenbug. Why, why, why? 15 July 2003 + Not heisenbug at all. Was running the move-enemy routine when no enemy.out. Glad I didn't post on usenet asking why my code was broken! 16 July 2003 + Minimal y movement implemented 17 July 2003 + Added random number generator 18 July 2003 + Re structure enemy handling code to do a copy to zero page first, thus streamlining things + Have missile <-> enemy collision detection working + Have minimal score keeping working + Have minimal enemy spawning working + (Yes gf was out on work related business, how did you guess) 29 August 2003 + Long delay due to move to Ithaca + Annoying work getting 16-bit BCD printing to work. Harder than it looks! 30 August 2003 + Implement Proper Collision detection + Enemies can actually damage you + Explosions no longer move + Have "GAME OVER" print when you die 7 September 2003 + Have it print "Level 1" at start of level 27 September 2003 + HUGELY busy with grad school. Trying to get this done for minigames competition 28 September 2003 + Actual varied levels working. Trying to adjust speed for playability. + Added two more enemies, as having 8 is easier to do with mask instructions ;) + Attempting to add Boss. + Added shield increment every 100 points + S now toggles sound + P now pauses + While waiting for keypress, random number gen seeded + Updated timinings. yae is too slow :( am trusting xapple2 as it seems to play most other games properly. Should fire up my _real_ IIe. 11 July 2004 + Finally got around to uploading on my real IIe. Subjective delay timing, seems to work. + Boss seems to act irregularly? 13 July 2004 + Scrolling stars implemented. 18 July 2004 + "Ending" for end of level 1 ported over. + Bonuses added + Hi-score (though not to disk) implemented + Final balancing on my Apple IIe Platinum + Fix some minor bugs + Fixed bug where unitialized memory was causing star scrolling to mess up + Bumped version number to 1.0 24 July 2004 + Added sort-of-working paddle/joystick code. tb_6502-1.1/tb_6502.s0100644000367200001440000022404510100624314012730 0ustar vinceusers.define EQU = ; blt = bcc ; bge = bcs ;; ZERO PAGE CH EQU $24 CV EQU $25 BASL EQU $28 BASH EQU $29 H2 EQU $2C COLOR EQU $30 YSAV EQU $34 YSAV1 EQU $35 RANDOM_SEED EQU $43 ;; Our Zero Page Allocations PADDLE_STATUS EQU $CA HISCORE_1 EQU $CB HISCORE_2 EQU $CC HISCORE_3 EQU $CD HISCORE_H EQU $CE HISCORE_L EQU $CF BOSS_X EQU $D0 BOSS_XADD EQU $D1 BOSS_COUNT EQU $D2 BOSS_SMOKE EQU $D3 BOSS_EXPLODING EQU $D4 BOSS_WAITING EQU $D5 BOSS_HITS EQU $D6 BOSS_SHOOTING EQU $D7 ENEMIES_SPAWNED EQU $D8 ENEMY_TYPE EQU $D9 ENEMY_WAVE EQU $DA CURRENT_INIT_X EQU $DB CURRENT_ENEMY_KIND EQU $DC TOTAL_ENEMIES_OUT EQU $DD SCROLL EQU $DE SOUND_ON EQU $DF SHIPX EQU $E0 SHIPXADD EQU $E1 ENEMY_PL EQU $E2 ENEMY_PH EQU $E3 MISSILE_PL EQU $E4 MISSILE_PH EQU $E5 GR_PAGE EQU $E6 LEVEL EQU $E7 SHIELDS EQU $E8 SCOREL EQU $E9 SCOREH EQU $EA BONUS_FLAGS EQU $EB BCD_BYTEH EQU $EC BCD_BYTE EQU $ED COL_X1 EQU $EC COL_X2 EQU $ED COL_X3 EQU $EE COL_X4 EQU $EF ENEMY_EXPLODING EQU $F0 ENEMY_KIND EQU $F1 ENEMY_X EQU $F2 ENEMY_Y EQU $F3 ENEMY_XADD EQU $F4 ENEMY_YADD EQU $F5 ENEMY_XMIN EQU $F6 ENEMY_XMAX EQU $F7 BETWEEN_DELAY EQU $F8 ENEMY_WAIT EQU $F9 STRINGL EQU $FA STRINGH EQU $FB PARAM2 EQU $FC RESULT EQU $FD LASTKEY EQU $FE TEMP EQU $FF ;; VECTORS BASIC EQU $3D0 ;; VECTOR for return to Applesoft KEYPRESS EQU $C000 KEYRESET EQU $C010 SPEAKER EQU $C030 ;; SOFT SWITCHES GR EQU $C050 TEXT EQU $C051 FULLGR EQU $C052 TEXTGR EQU $C053 PAGE0 EQU $C054 PAGE1 EQU $C055 LORES EQU $C056 HIRES EQU $C057 PADDLE_BUTTON0 EQU $C061 PADDL0 EQU $C064 PTRIG EQU $C070 ;; MONITOR ROUTINES HLINE EQU $F819 ;; HLINE Y,$2C at A VLINE EQU $F828 ;; VLINE A,$2D at Y CLRSCR EQU $F832 ;; Clear low-res screen CLRTOP EQU $F836 ;; clear only top of low-res screen SETCOL EQU $F864 ;; COLOR=A BASCALC EQU $FBC1 ;; HOME EQU $FC58 ;; Clear the text screen WAIT EQU $FCA8 ;; delay 1/2(26+27A+5A^2) us SETINV EQU $FE80 ;; INVERSE SETNORM EQU $FE84 ;; NORMAL COUT1 EQU $FDF0 ;; output A to screen ;; GAME PARAMETERS NUM_MISSILES EQU 2 NUM_ENEMIES EQU 6 UP_SHIELDS EQU 32 WAVE_SIZE EQU 16 WAVES_TILL_BOSS EQU 5 ;; BONUS_FLAGS PERFECT_SHIELDS EQU $80 PERFECT_KILLS EQU $40 PERFECT_AIM EQU $1 ;========================================================== ; MAIN() ;========================================================== ;============================== ; back up part of the zero page ;============================== lda #>zero_page_save sta BASH lda #(score_string+31) sta STRINGH lda #<(score_string+31) sta STRINGL jsr print_high_score ;============= ; put vmw logo ;============= lda #$7 ; y=7 sta CV lda #$8 ; x=8 sta CH lda #>vmw_sprite sta STRINGH lda #vmw_string ; string = vmw_string sta STRINGH lda #opener_sprite sta STRINGH lda #opener_sprite_2 sta STRINGH lda #mercy_string ; string = MMMM sta STRINGH lda #help_string ; string = "H FOR HELP" sta STRINGH lda #zero_page_save sta BASH lda #new_game_string ; string starts at "NEW GAME" sta STRINGH lda #vince_sprite sta STRINGH lda #about_lines sta STRINGH lda #help_lines sta STRINGH lda #phobos_sprite sta STRINGH lda #story_lines sta STRINGH lda #evil_ship_sprite sta STRINGH lda #tom_sprite sta STRINGH lda #you_are_tom sta STRINGH lda #earth_sprite sta STRINGH lda #ending_lines sta STRINGH lda #susie_sprite sta STRINGH lda #susie_lines sta STRINGH lda #tom_head_sprite sta STRINGH lda #tom_sigh sta STRINGH lda #missile_0 ; clear the missile struct sta MISSILE_PH ; should make this clear all BSS lda #enemy_0 sta ENEMY_PH lda #(level_string+9) sta STRINGH lda #<(level_string+9) sta STRINGL lda #0 sta BCD_BYTEH lda LEVEL sta BCD_BYTE jsr print_bcd_byte ;====================== ; Print level on screen ;====================== lda #>(level_string_xy) sta STRINGH lda #<(level_string_xy) sta STRINGL jsr print_text_xy ldx #20 jsr wait_X_100msec ; pause for 3 seconds bit KEYRESET ; clear keyboard ;================================== ; Enter graphics mode, clear screen ;================================== jsr set_page0_gr ; set graphics mode jsr clear_screen ; clear screen draw_stars: ;===================== ; Setup star field ;===================== lda #>(star_field) sta STRINGH lda #<(star_field) sta STRINGL ldy #$0 star_init: jsr random_number and #$9f clc adc #$4 sta (STRINGL),Y iny lda #$0 sta (STRINGL),Y iny bne star_init lda #$0 sta SCROLL ;/========================\ ;+ + ;+ MAIN GAME LOOP + ;+ + ;\========================/ main_game_loop: jsr clear_screen ; clear screen jsr show_stars done_scrolling: ; ================================ ; put out new enemies (if needed) ; ================================ inc BETWEEN_DELAY ; inc how long we've delayed lda BETWEEN_DELAY ; load it in cmp ENEMY_WAIT ; have we waited long enough? beq reset_delay jmp move_enemies ; if not, go on to movement reset_delay: ; delay==wait, so attempt to put out new enemy lda BETWEEN_DELAY and #$1 sta BETWEEN_DELAY ; reset delay ; special case for boss lda #$9 ; if boss, don't keep track of cmp ENEMY_TYPE ; how many enemies were spawned bne not_boss_dont_clear lda #$1 ; store 1 so we don't increment wave sta ENEMIES_SPAWNED not_boss_dont_clear: ; see if we are at a new wave ; basically, if 16 have been spawned, change lda ENEMIES_SPAWNED and #$0f bne same_enemy_type ; if not 16 gone by, move on ;======================= ; change the enemy type inc ENEMIES_SPAWNED jsr random_number and #$7 ; get a random number 0-7 sta ENEMY_TYPE inc ENEMY_WAVE lda ENEMY_WAVE ; have we gone enough waves to reach boss? cmp #WAVES_TILL_BOSS bne not_boss_yet lda #$8 sta ENEMY_TYPE not_boss_yet: ; set various constants ; these may be overriden later lda #20 sec sbc LEVEL sta ENEMY_WAIT ; enemy_wait=20-level ; set kind and init x to be random by default lda #$ff sta CURRENT_ENEMY_KIND sta CURRENT_INIT_X same_enemy_type: ; find empty enemy slot ldy #$0 ; point to enemies[0] tya find_empty_enemy: pha lda (ENEMY_PL),Y ; get enemy[y].out beq add_enemy pla clc adc #$9 tay cpy #(NUM_ENEMIES*9) bne find_empty_enemy jmp move_enemies ; no empty, slots, move on add_enemy: pla ;============================================== ; First see if we must wait for enemy to clear ; types 2 and 8 lda ENEMY_TYPE cmp #$2 bne check_type_8 lda TOTAL_ENEMIES_OUT beq change_to_type_3 jmp move_enemies change_to_type_3: lda #$3 sta ENEMY_TYPE jsr random_number and #$8 sta CURRENT_ENEMY_KIND jsr random_number and #$1F ; mask off so 0-31 clc adc #$2 asl A sta CURRENT_INIT_X jmp setup_enemy_defaults check_type_8: cmp #$8 beq before_boss_stuff jmp check_type_9 before_boss_stuff: ;====================== ; before boss stuff lda TOTAL_ENEMIES_OUT beq prepare_for_boss jmp move_enemies prepare_for_boss: ;=============== ; HANDLE BONUSES ;=============== ; Set text mode jsr set_page0_text jsr HOME ; Print "BONUS POINTS" lda #>bonus_string sta STRINGH lda #bonus_shields sta STRINGH lda #bonus_kills sta STRINGH lda #bonus_aim sta STRINGH lda #no_bonus_string sta STRINGH lda #34 lda CURRENT_INIT_X bpl store_init_x jsr random_number and #$1f clc adc #$2 asl store_init_x: iny ; X sta (ENEMY_PL),Y ; enemy_y is always 0 by default iny ; Y lda #$0 sta (ENEMY_PL),Y lda #$0 iny sta (ENEMY_PL),Y ; xadd iny sta (ENEMY_PL),Y ; yadd lda #$2 iny sta (ENEMY_PL),Y ; xmin iny lda #$24 sta (ENEMY_PL),Y ; ymin dey ; xmin dey ; yadd dey ; xadd ;=========================================== ; Enemy specific inits lda ENEMY_TYPE beq enemy_type_0 cmp #$1 beq enemy_type_1 jmp enemy_type_2 enemy_type_0: enemy_type_1: ;================================ ; ENEMY TYPE 0 and 1 ; diagonal, no wait ; movement proportional to level lda LEVEL ; xadd = level sta (ENEMY_PL),Y iny lsr A ora #$1 sta (ENEMY_PL),Y ; yadd = level/2 jmp move_enemies enemy_type_2: ;===================== ; Enemy Type 2 ; just a place-holder ; waits for enemies to die then moves on to 3 cmp #$2 bne enemy_type_3 jmp move_enemies enemy_type_3: cmp #$3 bne enemy_type_4 ;====================== ; Enemy type 3 lda #$1 sta (ENEMY_PL),Y ; xadd=1 iny lda LEVEL sta (ENEMY_PL),Y ; yadd=level jmp move_enemies enemy_type_4: cmp #$4 bne enemy_type_5 ;========================= ; Enemy Type 4 ; Horizontal, then fall lda #$2 sta (ENEMY_PL),Y ; xadd = 2 iny jsr random_number ora #$80 ; set negative sta (ENEMY_PL),y ; yadd = -(random%128) ; this means bop back and forth a random ; time, then drop jmp move_enemies enemy_type_5: cmp #$5 bne enemy_type_6 ;======================== ; Enemy Type 5 ; "wiggle" lda #$1 sta (ENEMY_PL),y ; xadd=1 iny lda LEVEL sta (ENEMY_PL),y ; yadd=2 iny jsr random_number and #$0f clc adc #$2 sta (ENEMY_PL),y ; xmin=(rand%16)+2 dey ; yadd dey ; xadd dey ; y dey ;x asl A sta (ENEMY_PL),y iny ;y iny ; xadd iny ; yadd iny ; xmin jsr random_number and #$0f clc adc (ENEMY_PL),Y adc #$02 iny sta (ENEMY_PL),Y ; xmax = xmin+(rand%16)+2 jmp move_enemies enemy_type_6: cmp #$6 beq enemy_type_7 cmp #$7 beq enemy_type_7 jmp enemy_type_8 enemy_type_7: ;===================== ; Enemy Types 6+7 ; "Rain" jsr random_number and #6 bne no_use_own_x dey ; y dey ; x lda SHIPX cmp #$2 bpl shipx_ok lda #$2 ; stupid bug where gets stuck is < xmin shipx_ok: asl A sta (ENEMY_PL),Y ; one-in-four chance we use shipx as X iny ; y iny ; xadd no_use_own_x: lda #$0 sta (ENEMY_PL),Y ; xadd=0 iny lda #$1 sta (ENEMY_PL),Y ; yadd = 1 jmp move_enemies enemy_type_8: enemy_type_9: ;====================== ; Things flung by boss dey ; y dey ; x lda BOSS_X clc adc #$5 asl A sta (ENEMY_PL),Y ; enemy_x=boss_x+5 iny lda #$3 asl A asl A sta (ENEMY_PL),Y ; enemy_y=3 iny lda #$0 sta (ENEMY_PL),Y ; xadd=0 iny lda #$2 sta (ENEMY_PL),Y ; yadd=2 move_enemies: ;============================================== ; Move Enemies! (first thing, if no new added) ;============================================== ldy #$0 ; point to enemies[0] handle_enemies: tya pha ; store y on stack lda (ENEMY_PL),Y ; get enemy[y].out bne load_enemy_zero_page ; if enemy.out then we are good jmp skip_to_next_enemy ; enemy is not out, so skip to next ;========================================== ; load this enemy stuff into zero page for ; easier access ;========================================== load_enemy_zero_page: ldx #ENEMY_EXPLODING load_to_zero_page: iny ; point to exploding lda (ENEMY_PL),Y sta 0,X ; store to zero page inx cpx #(ENEMY_XMAX+1) ; see if reached end bne load_to_zero_page ; if not keep copying ;================================ ; skip all movement and collision ; if exploding ;================================ lda ENEMY_EXPLODING beq move_enemy_x jmp draw_enemy ;================================ ; Start the enemy movement engine ;================================ ;======== ; Move X ;======== move_enemy_x: clc lda ENEMY_X ; X adc ENEMY_XADD ; x+=xadd sta ENEMY_X lsr A cmp ENEMY_XMIN ; are we less than xmin? bmi switch_dir_enemy_x ; if so, switch direction cmp ENEMY_XMAX ; are we greater than xmax? bpl switch_dir_enemy_x ; if so, switch direction jmp move_enemy_y switch_dir_enemy_x: ; switch X direction lda #$0 ; load zero sec sbc ENEMY_XADD ; 0 - ENEMY_XADD sta ENEMY_XADD ; store it back out, negated jmp move_enemy_x ; re-add it in ;======== ; Move Y ;======== move_enemy_y: lda #$0 ; load in zero cmp ENEMY_YADD ; compare to YADD bmi no_y_special_case ; if minus, we have special case inc ENEMY_YADD bne done_enemy_y lda #$0 sta ENEMY_XADD lda #$2 sta ENEMY_YADD ; increment y ; is it > 0? ; if not keep going ; if so, yadd=level*2 jmp done_enemy_y no_y_special_case: clc lda ENEMY_Y ; get Y adc ENEMY_YADD ; y+=yadd sta ENEMY_Y ; store back out lsr A lsr A cmp #$12 ; is y<=12? bmi done_enemy_y ; if so no need to do anything beq done_enemy_y ; off screen pla ; pop saved Y off stack tay pha ; push y back on stack lda #$0 sta (ENEMY_PL),Y ; set enemy[i].out=0 dec TOTAL_ENEMIES_OUT lda BONUS_FLAGS and #<(~PERFECT_KILLS) sta BONUS_FLAGS jmp skip_to_next_enemy ; skip to next enemy done_enemy_y: ;=============== ; Done Movement ;=============== ;====================== ; Check for Collisions ;====================== ;================================== ; Check ENEMY <> MISSILE collision ;================================== check_enemy_missile_collision: ldy #$0 sty YSAV check_missile_loop: lda (MISSILE_PL),Y beq missile_not_out iny ; point to missile.x lda (MISSILE_PL),Y ; load missile.x sta COL_X1 sta COL_X2 lda ENEMY_X lsr A sta COL_X3 clc adc #3 sta COL_X4 jsr check_inside bcc missile_done x_in_range: iny lda (MISSILE_PL),Y ; load missile.y sta COL_X3 clc adc #2 sta COL_X4 lda ENEMY_Y lsr A lsr A sta COL_X1 clc adc #1 sta COL_X2 jsr check_inside bcc missile_done horrible_explosion: ; clear missile ldy YSAV lda #$0 sta (MISSILE_PL),Y ; clear enemy lda #$1 sta ENEMY_EXPLODING lda #$40 sta ENEMY_KIND jsr inc_score jmp draw_enemy missile_done: missile_not_out: ldy YSAV iny iny iny sty YSAV cpy #(NUM_MISSILES*3) bne check_missile_loop ;================================= ; Done missile <> enemy collision ;================================= ;==================================== ; check for ship <-> enemy collision ;==================================== lda SHIPX sta COL_X3 clc adc #8 sta COL_X4 ; big check is shipx - shipx+8 lda ENEMY_X lsr A sta COL_X1 clc adc #2 sta COL_X2 ; small check enemy_x - enemy_x+2 jsr check_inside ; check if overlap bcc draw_enemy ; if not, move ahead lda #16 sta COL_X3 lda #18 sta COL_X4 ; big check is 16 - 18 lda ENEMY_Y lsr A lsr A sta COL_X1 clc adc #$1 sta COL_X2 ; little check is enemy_y - enemy_y+1 jsr check_inside ; check if overlap bcc draw_enemy ; if not, move ahead ; make the enemy explode lda #$1 sta ENEMY_EXPLODING lda #$40 sta ENEMY_KIND dec SHIELDS jsr update_shields ; move shields down lda #<(~PERFECT_SHIELDS) ; (~PERFECT_SHIELDS) and BONUS_FLAGS ; remove perfect shield bonus sta BONUS_FLAGS ;===================================== ; Done ship <> enemy collision detect ;===================================== draw_enemy: ; See if the enemy is currently exploding ; if so, do explosion stuff check_enemy_explode: lda ENEMY_EXPLODING ; load enemy[i].exploding beq not_exploding ; if 0 then not exploding handle_exploding: jsr click ; make some noise clc lda ENEMY_KIND ; move to next step in explosion adc #$4 sta ENEMY_KIND cmp #$58 ; have we cycles through explosion? bne draw_enemy_sprite ; if not, we are still exploding dec TOTAL_ENEMIES_OUT ; total_enemies_out-- pla tay ; load y pha lda #$0 ; enemy[i].out=0 sta (ENEMY_PL),Y jmp skip_to_next_enemy ; point to enemies_x ; goto enemies_xy not_exploding: draw_enemy_sprite: ; point to proper sprite lda #>enemy_sprite0 ; point to the missile sprite sta STRINGH lda #boss_sprite sta STRINGH lda #smoke_sprite0 ; point to the missile sprite sta STRINGH lda #laser_sprite0 ; point to the missile sprite sta STRINGH lda #smoke_sprite0 ; point to the missile sprite sta STRINGH lda #missile_sprite ; point to the missile sprite sta STRINGH lda #ship_sprite sta STRINGH lda #shields_string sta STRINGH lda #score_string sta STRINGH lda #level_string sta STRINGH lda #game_over_string sta STRINGH lda #(score_string+31) sta STRINGH lda #<(score_string+31) sta STRINGL jsr print_high_score jsr HOME ; print new high score message lda #>new_high_score_string sta STRINGH lda #high_score_string sta STRINGH lda #shields_string sta STRINGH lda #(score_string+7) sta STRINGH lda #<(score_string+7) sta STRINGL tya pha ; save Y on stack ldy #$0 lda SCOREH sta BCD_BYTEH lda SCOREL sta BCD_BYTE jsr print_bcd_word pla ; restore Y tay rts ;====================== ; print high_score ;====================== ; location to output to in STRINGH/STRINGL print_high_score: tya pha ; save Y on stack ldy #$0 lda HISCORE_H sta BCD_BYTEH lda HISCORE_L sta BCD_BYTE jsr print_bcd_word pla ; restore Y tay rts ;========================================================== ; print_bcd_word ;========================================================== ; string to output in STRINGH/STRINGL ; byte to output in BCD_BYTE print_bcd_word: lda BCD_BYTEH lsr A lsr A lsr A lsr A and #$f ; mask low nybble bne to_ascii_thou lda #$A0 ; load a space jmp write_thousands to_ascii_thou: adc #$B0 ; covert to ascii write_thousands: sta (STRINGL),Y ; store output iny lda BCD_BYTEH and #$f bne to_ascii_hun cmp BCD_BYTEH bne to_ascii_hun lda #$A0 jmp write_hundreds to_ascii_hun: adc #$B0 write_hundreds: sta (STRINGL),Y iny print_bcd_byte: lda BCD_BYTE lsr A lsr A lsr A lsr A and #$f ; mask low nybble bne to_ascii_tens ; if not zero, convert to ascii cmp BCD_BYTEH bne to_ascii_tens lda #$A0 jmp write_tens to_ascii_tens: adc #$B0 ; covert to ascii write_tens: sta (STRINGL),Y ; store output iny ; point one lower lda BCD_BYTE clc and #$f adc #$B0 sta (STRINGL),Y rts ;========================================================== ; check inside ;========================================================== ; Simple collision detection. Have small line x1<->x2 ; Want to see if it overlaps long line x3<---------->x4 ; so: ; if ((x1>x3)&&(x1x3) && (x2 40? bmi bottom_loop ; if not, loop lda #$80 ; go to next line [they are $80 apart] clc adc BASL ; increment base sta BASL ; store it out lda #$0 ; load 0 into A adc BASH ; carry into top byte if need be sta BASH ; and store out inx ; increment line count cpx #$4 ; have we done 4 bcc bottom_y ; if not, loop rts ;========================================================== ; print X strings ;========================================================== ; ; print_x_strings: stx TEMP jsr print_text_xy ldx TEMP dex bne print_x_strings rts ;========================================================== ; Print text x,y ;========================================================== ; x=ch y=cv ; string=string_addr print_text_xy: ldy #$0 ; clear IY lda (STRINGL),Y ; load x from memory sta CH ; store to CH iny ; point to next value lda (STRINGL),Y ; load y from memory sta CV ; store to CV ; point to beginning of string clc lda #$2 adc STRINGL sta STRINGL lda #$0 adc STRINGH sta STRINGH print_text: ldy #$0 lda CV jsr BASCALC ; get the address of y in BASH:BASL clc ; clear the carry lda BASL ; load BASL adc CH ; add x sta BASL ; store BASL back out output_loop: lda (STRINGL),Y ; load char from string_addr+y beq print_done ; if null terminated, done sta (BASL),Y ; store to BASH:BASL iny ; IY++ jmp output_loop ; loop print_done: iny tya ; transfer y to accumulator adc STRINGL ; add y and stringl sta STRINGL ; and store it out lda #$0 ; clear accumulator adc STRINGH ; add with carry from prev stringh sta STRINGH ; and save it rts ;========================================================== ; clear_screen ;========================================================== ; clear_screen: ldx #$0 clear_0: cpx #$0 bne clear_1 lda GR_PAGE sta BASH lda #$0 sta BASL ldy #$78 jmp clear_it clear_1: cpx #$1 bne clear_2 lda #$80 sta BASL ldy #$78 jmp clear_it clear_2: cpx #$2 bne clear_3 clc lda #$1 adc GR_PAGE sta BASH ldy #$78 jmp clear_it clear_3: cpx #$3 bne clear_4 lda #$0 sta BASL ldy #$78 jmp clear_it clear_4: cpx #$4 bne clear_5 clc lda #$2 adc GR_PAGE sta BASH ldy #$50 jmp clear_it clear_5: cpx #$5 bne clear_6 lda #$80 sta BASL ldy #$50 jmp clear_it clear_6: cpx #$6 bne clear_7 clc lda #$3 adc GR_PAGE sta BASH ldy #$50 jmp clear_it clear_7: cpx #$7 bne clear_8 lda #$0 sta BASL ldy #$50 jmp clear_it clear_8: rts clear_it: lda #$00 clear_loop: dey sta (BASL),Y bne clear_loop inx jmp clear_0 ;========================================================== ; show_stars ;========================================================== ; show_stars: lda #>star_field ; Load the star offsets sta STRINGH ; array into lda # #include int main(int argc, char **argv) { char string[BUFSIZ]; int i; while(1) { fgets(string,BUFSIZ,stdin); if (feof(stdin)) goto done; printf(";# %s\n",string); printf(".byte\t"); printf("$%X",string[0]+128); for (i=1;i int random_num(int seed) { static int our_seed; if (seed!=-1) our_seed=seed; if (our_seed==0) our_seed=13; our_seed<<=1; if (our_seed & 0x100) our_seed^=0x87; our_seed&=0xff; return our_seed; } int main(int argc, char **argv) { int i; int frequency[256]; for(i=0;i<256;i++) frequency[i]=0; for(i=0;i<4096;i++) frequency[random_num(-1)]++; for(i=0;i<256;i++) printf("%i : %i\n",i,frequency[i]); } tb_6502-1.1/tools/rle_data.c0100644000367200001440000000733207646671535014574 0ustar vinceusers/* The following code is UGLY. Read at your own risk. --vmw */ #include #include /* strncpy() */ #include /* isdigit() */ #include /* open() */ #include /* close() */ char dos_color_to_apple[16]= {0, /* 0 black */ 2, /* 1 blue */ 4, /* 2 green */ 7, /* 3 cyan */ 1, /* 4 red */ 3, /* 5 purple */ 8, /* 6 brown */ 10,/* 7 l grey */ 5, /* 8 d grey */ 6, /* 9 l blue */ 12, /*10 l green */ 14, /*11 l cyan */ 9, /*12 l red */ 11, /*13 pink */ 13, /*14 yellow */ 15, /* 15 white */ } ; int get_number(char *string, int *pointer) { int temp_number; if (string[*pointer]=='0') { /* Hexadecimal */ if (string[*pointer+1]=='x') { (*pointer)++; (*pointer)++; temp_number=0; while(isxdigit(string[*pointer])) { if ((string[*pointer]>='a') && (string[*pointer]<='f')) temp_number=16*temp_number+(10+(string[*pointer]-'a')); if ((string[*pointer]>='A') && (string[*pointer]<='F')) temp_number=16*temp_number+(10+(string[*pointer]-'A')); if ((string[*pointer]>='0') && (string[*pointer]<='9')) temp_number=16*temp_number+(string[*pointer]-'0'); (*pointer)++; } } else { /* Octal */ temp_number=0; while(isdigit(string[*pointer])) { temp_number=8*temp_number+(string[*pointer]-'0'); (*pointer)++; } } } else { /* Decimal */ temp_number=0; while(isdigit(string[*pointer])) { temp_number=10*temp_number+(string[*pointer]-'0'); (*pointer)++; } } return temp_number; } int main(int argc, char **argv) { FILE *input,*output; char input_filename[]="sprites"; int pointer,temp_pointer; char input_line[BUFSIZ]; char temp_string[BUFSIZ]; int color=0,oldcolor,run; input=fopen(input_filename,"r"); if (input==NULL) goto file_error; while(1) { if ( fgets(input_line,BUFSIZ,input) ==NULL) goto close_file; pointer=0; while(pointer14)) { printf("$%X,",(run<<4)+dos_color_to_apple[oldcolor]); run=0; } run++; oldcolor=color; while(!isdigit(input_line[pointer])) pointer++; } if (color!=0) { printf("$%X,",(run<<4)+dos_color_to_apple[color]); } printf("$00\n"); goto done_with_string; } else { printf("Unknown directive!\n"); goto close_file; } } /* end of label */ if (input_line[pointer]==':') { temp_pointer=pointer; while( (temp_pointer>0) && (input_line[temp_pointer]!='\t') && (input_line[temp_pointer]!=' ')) temp_pointer--; strncpy(temp_string,input_line+temp_pointer,pointer-temp_pointer); temp_string[pointer]='\0'; printf("\t.byte $00\n"); printf("%s:\n",temp_string); } pointer++; } done_with_string: ; } close_file: if (input!=NULL) fclose(input); file_error: return 0; } tb_6502-1.1/tools/wait.c0100644000367200001440000000027607666525267013767 0ustar vinceusers#include int main(int argc, char **argv) { int i; for(i=0;i<256;i++) { printf("%i = %x = %i\n",i,i,(26+27*i+5*i*i)/2); } return 0; } tb_6502-1.1/apple2_c00.inc0100644000367200001440000000043707645563273014032 0ustar vinceusersMEMORY { ZP: start = $00, size = $1A, type = rw; RAM: start = $C00, size = $8E00, file = %O; } SEGMENTS { CODE: load = RAM, type = ro; RODATA: load = RAM, type = ro; DATA: load = RAM, type = rw; BSS: load = RAM, type = bss, define = yes; ZEROPAGE: load = ZP, type = zp; } tb_6502-1.1/tb_6502.dsk0100644000367200001440000043000010100624320013232 0ustar vinceusers' +JJJJ ?\>m0M='+l> /+l   d]@ŵLҦ]]LF L}BBL] X  ` 鷎귭෍ᷩ췩緈JJJJx Lȿ L8ᷭ緍췩 緍i 8 `巬 췌`x (`(8`I`B` ``>J>J>VU)?`8'x0|&HhHh VY)'&Y)xꪽ)' `Hh`V0^*^*>&` aI꽌ɪVɭ&Y&&Y& 꽌ɪ\8`&&꽌ɪɖ'*&%&,E'зЮ꽌ɪФ`+*xS&x'8*3Ixix&& 8  '  & x)*++`FG8`0($ p,&"ųųೳŪŪųųij  !"#$%&'()*+,-./0123456789:;<=>?  , = #""*( (9"1 ( ,.(0# 2 /#0/#0 *?'#07#00/0/'#07#0:"4<*55/**5/*%5/)1/)1/)1/)'#0/#0*5/*75/**5/*:5//#0/#0'#07#0:::*::'#07#0!!+'2+4:'/+'2+4'??4)E81B $! h h Լ ռ ռ ռ`HJ>݌h Hh݌`IHɭ ɭ R`ӤL߼IHHHHhHH݌hHhHh݌H6 VDP (ED Z $0x8x D- ܸDD# H8`?E Vk *f???0xE Hh D#-EEE8` D ܸx D - ܸx8`-0ݩ?ʥD EEE`   LDcpq` [` ~  LɜK JI8h hLߍ ԧ᜙߼IHͺ9ٜ췈뷠詷 뷍ߜLJ` H`ߜߜ8)H`H`H` L` Ry-ӛu`".Q`pNФbptťܥm2<(-Py0\|e<6e<g< JJJJj귍hI  aUL@ kU8  L  Q^R(jQ0l^l\  wUuW ԧ H h@ [_ /QSIRb_L`LLLL`ª`LQLYLeLXLeLee ўQH\(h0L& Ꝥ$`( R \ZLl8 ўR HH\`\Z[YS6`LxQɿu3'RͲʎRʎ]]]ɍuL͟ɍ}RLRɍg^H8 ^hZLɍR LͲɊRR% QLܤͲ Z@ -^ ş\[Z QY\[Z8`l6Lş_Ȍb_Ͳ] )Y h( ֭ͲLɍ [LLĦ__ ^ 9 LҦ3 9 a   0LjLY u< (_9 ˭ɠuɠK_9 ?LˆʎõĵL õ ĵµ aµ`` L̦µ_bJLuLz`  ȟ QlXJ̥KlV  ȟ QlV eօ3L e3L &RL &QL d L4 Ne)n `@-eff L f`L . tQLѤ LҦL` OPu d L Ne)noon 8ɍ` ^f\õL ^NR  RΩLҦ)\Z ʽ LHv 3h`0h8` [L NС õ`A@` ŵL^Lõ`  \ 濭0 \  ȟ Q ^\lZl^?cqH şch`fhjõĵ@OAP`u@`@&`QR`E Ls  @DAE@u`8` %@ @A@`@`@A`Mµ ) LЦ`8@AWc@8@-@HAȑ@hHȑ@ȑ@hHȑ@Ȋ@ch8&ȑ@Hȑ@Ah@LHȑ@ȑ@ htphso`hMhL`9V8U897T6S67`INILOASAVRUCHAIDELETLOCUNLOCCLOSREAEXEWRITPOSITIOOPEAPPENRENAMCATALOMONOMOPRINMAXFILEFINBSAVBLOABRUVERIF!pppp p p p p`" t""#x"p0p@p@@@p@!y q q p@  LANGUAGE NOT AVAILABLRANGE ERROWRITE PROTECTEEND OF DATFILE NOT FOUNVOLUME MISMATCI/O ERRODISK FULFILE LOCKESYNTAX ERRONO BUFFERS AVAILABLFILE TYPE MISMATCPROGRAM TOO LARGNOT DIRECT COMMANč$3>L[dmx- (  Ϡ@跻~!Wo*9~~~~ɬƬ~_ j ʪHɪH`Lc (L ܫ㵮赎 ɱ^_ J QL_Ls贩紎 DǴҵԵƴѵӵµȴ 7 ַ :ŵƴѵǴҵȴµ納贍﵎ٵ്ᵭⳍڵL^ѵ-I `  4 ò-յ!  8صٵ紭ﵝ 7L (0+BC  7L HH`LgL{0 HH` õL H hBL BH [ h`Lo õ ڬL B ڬ LʬH hB@ յյ [L (ȴ) ȴ 7L L ( L (ȴL{ƴѵ洩ƴǴҵ 7 ^* B0 HȱBh ӵԵ 8 L8 ݲ` ܫ  / / ED B / / ]ƴS0Jȴ ȴ)  紅D贅E B ƴ  / 0L Ν `HD٤DEEhiHLGh ` ŵBѵ-` ѵB-` ܫ XI볩쳢8 DH ᜢ E𳈈췍Ȍ X0 · JLǵBȵC`,յp` 䯩 R-յյ`յ0` K R-յյ`ɵʵӵԵ` 4 K ( ѵҵLBȱBL8` DBHBH : ַ޵BȭߵBhhӵԵ RBܵmڵ޵ȱBݵm۵ߵ` 䯩LR˵̵ֵ׵`êĪLR E( 8` R` ELRŪƪ`췌 յյI뷭鷭귭ⵍ㵍跬ª 뷰` Lf ݵܵߵ޵ ^`8ܵ i B8` 4L ֵȱB׵ ܯ䵍൭嵍 ` DȑB׵Bֵ  ַ յյ`굎뵎쵬 뵎쵌``õĵBCõĵ`µµ`L õBĵCصص Qƴ0"Bƴ 󮜳` 0۰ϬBƴ8`i#`ЗLw!0>ﵭ` m ﳐ 7i볍 8 ЉLw`H h ݲL~ `浍국䵍뵩嵠Jm赍嵊mjnnn浈ۭm浍浭m䵍䵩m嵍`"L ŵ8ŵH ~(` d ֠z# u`      s%)((8 X  6Ωϩօ˩̩ׅͩͅ* %$ @ G   X 6%$ ƅ  %!x \ G   X G LLz L LgL L %)((8 Xl% $   L& Q`H`ILe MLe `ЌL ,P 6% $!ۅ ݅ G G )Ѕ(  G G La  X1 < `,P 6%$" n G G G G   G G G$%"  d$i, $ $$%   6% $" v G G G G La  6 %$$1 p G G G ,   G G G G  6 % $$L 7 G  6 %$$ ` G LI$s$ys$<  kڅ݅؅  X< 1 G ,  $ )iȩ  L) إ)" )ڥ٩8܅۠H hi 6Lh L ) )i LLL  X G$9 ; G$P ; : G$ ; " GL  G ,   Щх )ҩӅԅץ i֩ L Lݩȑȥ )8L )i ȑȩȑȑȑȩ$∈L?J LL ȥL  L/ȥ )i∈ )qiȑLL ) ȩȩLi ȩ ȩȩHLAȱLeJ0L8L0,LUeJJ0hHݥ)LA4DȱJi .ȱiJJi 4@ ML4Ȅ4ЭiJi +JJi @ % iX hHLA#~)eeJ$JJ% hHȵhi 6L L%Ѕ$# 8#ԅ)eei$% i8х$% ӥN H$) eeЅ$ i% i $hH i% hм lբ H#ԅJJ) ee )% )eЅ$ h (L| k  LKL" L )i0ҩ ץeх 8хL/Ѕe i  ) hi%LO EȅЅi /i  /ԩLOLQЍȱ$ȱ%5#w 5Lz vQLJLLK 0LP , LS ILH ɠ$ȩeȩLLe L!0!%$#e  e)P(0U() (&e((3( $,UL,Te L ,  X G  LgLgϥΩ*  X _ G G˅̅ͩ)((ȑ(ȑ(ޑ(ˑȥ̑ȥ͑  %IMKJ0L X R G7ˠȑȑ=  La ,0` `1L 0L `C IC`CL 'ɠ%)_KJ I MQL5,`iPiLkiiإ  H h`H΅υ h`JJJJ)Liȥ) LiȥJJJJ) Liȥ)i`00 08``,T,Q`,T,V,S,P`e)P(((0e((e))` G`$ȱ%ee% (e$((LmȘee` )(xL (xL e)xL (xL e)PL (PL e)PL (PL`(L$)ޤޢ)H0L3 h)e(H(hȱH0PLVh)e(H(hȥi)Ь (L! PL!`% $e))(e$()'4H dhJJJJ0(L((4Lȱ%L`Ӻ      o%)((8 X  6Ωϩօ˩̩ׅͩͅ& %$ < C   X 6%$ …  %!t X C   X C LLz L LcL L %)((8 Xl% $   L& Q`H`ILe MLe `ЌL ,P 6% $!ׅ م C C )Ѕ(  C C La  X- 8 `,P 6%$" j C C C C   C C C$%"  d$i, $ $$%   6% $" r C C C C La  6 %$$- l C C C ,   C C C C  6 % $$H 3 C  6 %$$ \ C LE$o$uo$<  gڅ݅؅  X8 - C ,  $ )i  L) إ)" )ڥ٩8܅۠H hi 6Lh L ) )i LLL  X C$9 7  C$P 7 6 C$ 7  CL C ,   Щх )ҩӅԅץ i֩ L Lݩȑȥ )8L )i ȑȩȑȑȑȩ$∈L;J LL ȥL  L/ȥ )i∈ )qiȑLL ) ȩȩLi ȩ ȩȩHL=ȱLeJ0L8L0,LQeJJ0hHݥ)L=4DȱJi .ȱiJJi 4@ IL4Ȅ4ЭiJi +JJi @ % iX hHL=#z)eeJ$JJ% hHȵhi 6L L%Ѕ$#܅ 8#Ѕ)eei$% i8х$% ӥN H#) eeЅ$ i% i $hH i% hм lբ H#ЅJJ) ee )% )eЅ$ h (L| g  LKL" L )i0ҩ ץeх 8хL/Ѕe i  ) hi%LK EȅЅi /i  /ԩLKLMЍȱ$ȱ%5#s 5Lv vQLJLLK 0LP , LS ILH ɠ$ȩeȩLLe L!0!%$#a  e)P(0U()(&e((/( $,UL,Te L ,  X C  LcLcϥΩ&  X [ C C˅̅ͩ)((ȑ(ȑ(ޑ(ˑȥ̑ȥ͑  %IMKJ0L X N C7ˠȑȑ=  La ,0` `1L 0L `C IC`CL'ɠ%)_KJ I MQL1,`iPiLgiiإ  H h`H΅υ h`JJJJ)Liȥ) LiȥJJJJ) Liȥ)i`00 08``,T,Q`,T,V,S,P`e)P(((0e((e))` C`$ȱ%ee% (e$((LiȘee` )(xL (xL e)xL (xL e)PL (PL e)PL (PL`(L$)ޤޢ)H0L/ h)e(H(hȱH0PLRh)e(H(hȥi)Ь (L PL`% $e))(e$()'4H dhJJJJ0(L((4Lȱ%L`Ӻ      k%)((8 X  6Ωϩօ˩̩ׅͩͅ" }%$ 8 ?   X 6%$  %!p T ?   X ? LLz L L_L L %)((8 Xl% $   L& Q`H`ILe MLe `ЌL ,P 6% $!Ӆ Յ ? ? )Ѕ(  ? ? La  X) 4 `,P 6%$" f ? ? ? ?   ? ? ?$%"  d$i, $ $$%   6% $" n ? ? ? ? La  6 %$$) h ? ? ? ,   ? ? ? ?  6 % $$D / ?  6 %$$ X ? LE$k$qk$<  cڅ݅؅  X4 ) ? ,  |$ )i | L) إ)" )ڥ٩8܅۠H hi 6Lh L ) )i LLL  X ?$9 3  ?$P 3 2 ?$ 3  ?L ? ,   Щх )ҩӅԅץ i֩ L Lݩȑȥ )8L )i ȑȩȑȑȑȩ$∈L;J LL ȥL  L/ȥ )i∈ )qiȑLL ) ȩȩLi ȩ ȩȩHL=ȱLeJ0L8L0,LQeJJ0hHݥ)L=4DȱJi .ȱiJJi 4@ EL4Ȅ4ЭiJi +JJi @ % iX hHL=#v)eeJ$JJ% hHȵhi 6L L%Ѕ$#؅ 8#̅)eei$% i8х$% ӥN H#) eeЅ$ i% i $hH i% hм lբ H#̅JJ) ee )% )eЅ$ h (L| c  LKL" L )i0ҩ ץeх 8хL/Ѕe i  ) hi%LK EȅЅi /i  /ԩLKLMЍȱ$ȱ%5#o 5Lv vQLJLLK 0LP , LS ILH ɠ$ȩeȩLLe L!0!%$#]  e)P(0U()(&e((+( $,UL,Te L ,  X~ ?   L_L_ϥΩ" } X W ? ?˅̅ͩ)((ȑ(ȑ(ޑ(ˑȥ̑ȥ͑  %IMKJ0L  X J ?7ˠȑȑ= } La ,0` `1L 0L `C IC`CL'ɠ%)_KJ I MQL-,`iPiLciiإ   H h`H΅υ h`JJJJ)Liȥ) LiȥJJJJ) Liȥ)i`00 08``,T,Q`,T,V,S,P`e)P(((0e((e))` ?`$ȱ%ee% (e$((LeȘee` )(xL (xL e)xL (xL e)PL (PL e)PL (PL`(L~$)ޤޢ)H0L+ h)e(H(hȱH0PLNh)e(H(hȥi)Ь (L PL`% $e))(e$()'4H dhJJJJ0(L((4Lȱ%L`Ӻ      k%)((8 X  6Ωϩօ˩̩ׅͩͅ" }%$ 8 ?   X 6%$  %!p T ?   X ? LLz L L_L L %)((8 Xl% $   L& Q`H`ILe MLe `ЌL ,P 6% $!Ӆ Յ ? ? )Ѕ(  ? ? La  X) 4 `,P 6%$" f ? ? ? ?   ? ? ?$%"  d$i, $ $$%   6% $" n ? ? ? ? La  6 %$$) h ? ? ? ,   ? ? ? ?  6 % $$D / ?  6 %$$ X ? LE$k$qk$<  cڅ݅؅  X4 ) ? ,  |$ )i | L) إ)" )ڥ٩8܅۠H hi 6Lh L ) )i LLL  X ?$9 3  ?$P 3 2 ?$ 3  ?L ? ,   Щх )ҩӅԅץ i֩ L Lݩȑȥ )8L )i ȑȩȑȑȑȩ$∈L;J LL ȥL  L/ȥ )i∈ )qiȑLL ) ȩȩLi ȩ ȩȩHL=ȱLeJ0L8L0,LQeJJ0hHݥ)L=4DȱJi .ȱiJJi 4@ EL4Ȅ4ЭiJi +JJi @ % iX hHL=#v)eeJ$JJ% hHȵhi 6L L%Ѕ$#؅ 8#̅)eei$% i8х$% ӥN H#) eeЅ$ i% i $hH i% hм lբ H#̅JJ) ee )% )eЅ$ h (L| c  LKL" L )i0ҩ ץeх 8хL/Ѕe i  ) hi%LK EȅЅi /i  /ԩLKLMЍȱ$ȱ%5#o 5Lv vQLJLLK 0LP , LS ILH ɠ$ȩeȩLLe L!0!%$#]  e)P(0U()(&e((+( $,UL,Te L ,  X~ ?   L_L_ϥΩ" } X W ? ?˅̅ͩ)((ȑ(ȑ(ޑ(ˑȥ̑ȥ͑  %IMKJ0L  X J ?7ˠȑȑ= } La ,0` `1L 0L `C IC`CL'ɠ%)_KJ I MQL-,`iPiLciiإ   H h`H΅υ h`JJJJ)Liȥ) LiȥJJJJ) Liȥ)i`00 08``,T,Q`,T,V,S,P`e)P(((0e((e))` ?`$ȱ%ee% (e$((LeȘee` )(xL (xL e)xL (xL e)PL (PL e)PL (PL`(L~$)ޤޢ)H0L+ h)e(H(hȱH0PLNh)e(H(hȥi)Ь (L PL`% $e))(e$()'4H dhJJJJ0(L((4Lȱ%L`Ӻ      c%)((8 X  6Ωϩօ˩̩ׅͩͅ u%$  0 7   X 6%$  %!h L 7   X 7 LLz L LWL L %)((8 Xl% $   L& Q`H`ILe MLe `ЌL ,P 6% $!˅ ͅ 7 7 )Ѕ(  7 7 La  X! , `,P 6%$" ^ 7 7 7 7   7 7 7$%"  d$i, $ $$%   6% $" f 7 7 7 7 La  6 %$$! ` 7 7 7 ,   7 7 7 7  6 % $$< ' 7  6 %$# P 7 L=$c$ic$<  [څ݅؅  X, ! 7 ,  t$ )i t L) إ)" )ڥ٩8܅۠H hi 6Lh L ) )i LLL  X 7$9 + 7$P + * 7$ +  7L 7   Щх )ҩӅԅץ i֩ L Lݩȑȥ )8L )i ȑȩȑȑȑȩ$∈L3J LL ȥL  L/ȥ )i∈ )qiȑLL ) ȩȩLi ȩ ȩȩHL5ȱLeJ0L8L0,LIeJJ0hHݥ)L54DȱJi .ȱiJJi 4@ =L4Ȅ4ЭiJi +JJi @ % iX hHL5#n)eeJ$JJ% hHȵhi 6L L%Ѕ$#Ѕ 8#ą)eei$% i8х$% ӥN H#) eeЅ$ i% i $hH i% hм lբ H#ąJJ) ee )% )eЅ$ h (L| [  LKL" L )i0ҩ ץeх 8хL/Ѕe i  ) hi%LC EȅЅi /i  /ԩLCLEЍȱ$ȱ%5#g 5Ln vQLJLLK 0LP , LS ILH ɠ$ȩeȩLLe L!0!%$#U  ݅e)P(0U()(&e((#( $,UL,Te L ,  Xv 7   LWLWϥΩ u X O 7 7˅̅ͩ)((ȑ(ȑ(ޑ(ˑȥ̑ȥ͑  %IMKJ0L X B 77ˠȑȑ= u La ,0` `݅1L 0L `C IC`CL'ɠ%)_KJ I MQL%,`iPiL[iiإ  H h`H΅υ h`JJJJ)Liȥ) LiȥJJJJ) Liȥ)i`00 08``,T,Q`,T,V,S,P`e)P(((0e((e))` 7`$ȱ%ee% (e$((L]Șee` )(xL (xL e)xL (xL e)PL (PL e)PL (PL`(Lv$)ޤޢ)H0L# h)e(H(hȱH0PLFh)e(H(hȥi)Ь (L PL`% $e))(e$()'4H dhJJJJ0(L((4Lȱ%L`Ӻ      X%)((8 X  6Ωϩօ˩̩ׅͩͅ j%$ t % ,   X 6%$  %!] A ,   X , LLz L LLL L %)((8 Xl%w $   L& Q`H`ILe MLe `ЌL ,P 6% $! … , , )Ѕ(  , , La  X ! `,P 6%$" S , , , ,   , , ,$%"օ  d$i, $ $$%   6% $"ۅ [ , , , , La  6 %$$ U , , , ,   , , , ,  6 % $$1  ,  6 %$# E , L=$X$^X$<  Pڅ݅؅  X!  , ,  i$ )i i L) إ)" )ڥ٩8܅۠H hi 6Lh L ) )i LLL  Xم ,$9  ,$P   ,$   ,L ,   Щх )ҩӅԅץ i֩ L Lݩȑȥ )8L )i ȑȩȑȑȑȩ$∈L3J LL ȥL  L/ȥ )i∈ )qiȑLL ) ȩȩLi ȩ ȩȩHL5ȱLeJ0L8L0,LIeJJ0hHݥ)L54DȱJi .ȱiJJi 4@ 2L4Ȅ4ЭiJi +JJi @ % iX hHL5#c)eeJ$JJ% hHȵhi 6L L%Ѕ$#Ņ 8#)eei$% i8х$% ӥN H#) eeЅ$ i% i $hH i% hм lբ H#JJ) ee )% )eЅ$ h (L| P  LKL" L )i0ҩ ץeх 8хL/Ѕe i  ) hi%LC EȅЅi /i  /ԩLCLEЍȱ$ȱ%5#\ 5Ln vQLJLLK 0LP , LS ILH ɠ$ȩeȩLLe L!0!%$#J  ҅e)P(0U()(&e((( $,UL,Te L ,  Xk ,   LLLLϥ X D , ,˅̅ͩ)((ȑ(ȑ(ޑ(ˑȥ̑ȥ͑  %IMKJ0L X 7 ,7ˠȑȑ= j La ,0` `҅1L 0L `C IC`CL'ɠ%)_KJ I MQL,`iPiLPiiإ  H |h`H΅υ |h`JJJJ)Liȥ) LiȥJJJJ) Liȥ)i`00 08``,T,Q`,T,V,S,P`e)P(((0e((e))` ,`$ȱ%ee% (e$((LRȘee` )(xL (xL e)xL (xL e)PL (PL e)PL (PL`(Lk$)ޤޢ)H0L h)e(H(hȱH0PL;h)e(H(hȥi)Ь (L PL`% $e))(e$()'4H dhJJJJ0(L((4Lȱ%L`Ӻź           P%)((8 X  6Ωϩօ˩̩ׅͩͅ b%$ l w $   X 6%$ w %!U w9 $   X $ LLz L LDL L %)((8 Xl%o $   L& Q`H`ILe MLe `ЌL ,P 6% $! w $ $ )Ѕ(  $ $ La  X  `,P 6%$"w wK $ $ $ $   $ $ $$%"΅ w d$i, $ $$%   6% $"Ӆ wS $ $ $ $ La  6 %$$ wM $ $ $   $ $ $ $  6 % $$) w $  6 %$# w= $ L5$P$VP$<  Hڅ݅؅  X  $ ,  a$ )i a L) إ)" )ڥ٩8܅۠H hi 6Lh L ) )i LLL  Xх $$9  $$P   $$  $L $   Щх )ҩӅԅץ i֩ L Lݩȑȥ )8L )i ȑȩȑȑȑȩ$∈L+J LL ȥL  L/ȥ )i∈ )qiȑLL ) ȩȩLi ȩ ȩȩHL-ȱLeJ0L 8L0,LAeJJ0hHݥ)L-4DȱJi .ȱiJJi 4@ *L4Ȅ4ЭiJi +JJi @ % {iX hHL-#[)eeJ$JJ% whHȵhi 6L L%Ѕ$# w8#)eei$% wi8х$% wӥN {H#) eeЅ$ i% wi $hH i% whм {lբ H#JJ) ee )% )eЅ$ wh {(L| H  LCL}" L} )i0ҩ ץeх 8хL}/Ѕe i  ) hi%L; EȅЅi /i  /ԩL;L=Ѝȱ$ȱ%5#T w5Lf vQLJLLK 0LP , LS ILH ɠ$ȩeȩLLe L!0!%$#B w ʅe)P(0U()(&e((( $,UL,Te L ,  Xc $   LDLDϥ X < $ $˅̅ͩ)((ȑ(ȑ(ޑ(ˑȥ̑ȥ͑  %IMKJ0L X / $7ˠȑȑ= b La ,0` `ʅ1L 0L `C IC`CL'ɠ%)_KJ I MQL,`iPiLHiiإ  H th`H΅υ th`JJJJ)Liȥ) LiȥJJJJ) Liȥ)i`00 08``,T,Q`,T,V,S,P`e)P(((0e((e))` $`$ȱ%ee% (e$((LJȘee` )(xL (xL e)xL (xL e)PL (PL e)PL (PL`(Lc$)ޤޢ)H0L h)e(H(hȱH0PL3h)e(H(hȥi)Ь (L PL`% $e))(e$()'4H dhJJJJ0(L((4Lȱ%Ly`Ӻź                   P%)((8 X  6Ωϩօ˩̩ׅͩͅ b%$ l w $   X 6%$ w %!U w9 $   X $ LLz L LDL L %)((8 Xl%o $   L& Q`H`ILe MLe `ЌL ,P 6% $! w $ $ )Ѕ(  $ $ La  X  `,P 6%$"w wK $ $ $ $   $ $ $$%"΅ w d$i, $ $$%   6% $"Ӆ wS $ $ $ $ La  6 %$$ wM $ $ $   $ $ $ $  6 % $$) w $  6 %$# w= $ L5$P$VP$<  Hڅ݅؅  X  $ ,  a$ )i a L) إ)" )ڥ٩8܅۠H hi 6Lh L ) )i LLL  Xх $$9  $$P   $$  $L $   Щх )ҩӅԅץ i֩ L Lݩȑȥ )8L )i ȑȩȑȑȑȩ$∈L+J LL ȥL  L/ȥ )i∈ )qiȑLL ) ȩȩLi ȩ ȩȩHL-ȱLeJ0L 8L0,LAeJJ0hHݥ)L-4DȱJi .ȱiJJi 4@ *L4Ȅ4ЭiJi +JJi @ % {iX hHL-#[)eeJ$JJ% whHȵhi 6L L%Ѕ$# w8#)eei$% wi8х$% wӥN {H#) eeЅ$ i% wi $hH i% whм {lբ H#JJ) ee )% )eЅ$ wh {(L| H  LCL}" L} )i0ҩ ץeх 8хL}/Ѕe i  ) hi%L; EȅЅi /i  /ԩL;L=Ѝȱ$ȱ%5#T w5Lf vQLJLLK 0LP , LS ILH ɠ$ȩeȩLLe L!0!%$#B w ʅe)P(0U()(&e((( $,UL,Te L ,  Xc $   LDLDϥ X < $ $˅̅ͩ)((ȑ(ȑ(ޑ(ˑȥ̑ȥ͑  %IMKJ0L X / $7ˠȑȑ= b La ,0` `ʅ1L 0L `C IC`CL'ɠ%)_KJ I MQL,`iPiLHiiإ  H th`H΅υ th`JJJJ)Liȥ) LiȥJJJJ) Liȥ)i`00 08``,T,Q`,T,V,S,P`e)P(((0e((e))` $`$ȱ%ee% (e$((LJȘee` )(xL (xL e)xL (xL e)PL (PL e)PL (PL`(Lc$)ޤޢ)H0L h)e(H(hȱH0PL3h)e(H(hȥi)Ь (L PL`% $e))(e$()'4H dhJJJJ0(L((4Lȱ%Ly`Ӻź                   P%)((8 X  6Ωϩօ˩̩ׅͩͅ b%$ l w $   X 6%$ w %!U w9 $   X $ LLz L LDL L %)((8 Xl%o $   L& Q`H`ILe MLe `ЌL ,P 6% $! w $ $ )Ѕ(  $ $ La  X  `,P 6%$"w wK $ $ $ $   $ $ $$%"΅ w d$i, $ $$%   6% $"Ӆ wS $ $ $ $ La  6 %$$ wM $ $ $   $ $ $ $  6 % $$) w $  6 %$# w= $ L5$P$VP$<  Hڅ݅؅  X  $ ,  a$ )i a L) إ)" )ڥ٩8܅۠H hi 6Lh L ) )i LLL  Xх $$9  $$P   $$  $L $   Щх )ҩӅԅץ i֩ L Lݩȑȥ )8L )i ȑȩȑȑȑȩ$∈L+J LL ȥL  L/ȥ )i∈ )qiȑLL ) ȩȩLi ȩ ȩȩHL-ȱLeJ0L 8L0,LAeJJ0hHݥ)L-4DȱJi .ȱiJJi 4@ *L4Ȅ4ЭiJi +JJi @ % {iX hHL-#[)eeJ$JJ% whHȵhi 6L L%Ѕ$# w8#)eei$% wi8х$% wӥN {H#) eeЅ$ i% wi $hH i% whм {lբ H#JJ) ee )% )eЅ$ wh {(L| H  LCL}" L} )i0ҩ ץeх 8хL}/Ѕe i  ) hi%L; EȅЅi /i  /ԩL;L=Ѝȱ$ȱ%5#T w5Lf vQLJLLK 0LP , LS ILH ɠ$ȩeȩLLe L!0!%$#B w ʅe)P(0U()(&e((( $,UL,Te L ,  Xc $   LDLDϥ X < $ $˅̅ͩ)((ȑ(ȑ(ޑ(ˑȥ̑ȥ͑  %IMKJ0L X / $7ˠȑȑ= b La ,0` `ʅ1L 0L `C IC`CL'ɠ%)_KJ I MQL,`iPiLHiiإ  H th`H΅υ th`JJJJ)Liȥ) LiȥJJJJ) Liȥ)i`00 08``,T,Q`,T,V,S,P`e)P(((0e((e))` $`$ȱ%ee% (e$((LJȘee` )(xL (xL e)xL (xL e)PL (PL e)PL (PL`(Lc$)ޤޢ)H0L h)e(H(hȱH0PL3h)e(H(hȥi)Ь (L PL`% $e))(e$()'4H dhJJJJ0(L((4Lȱ%Ly`Ӻźe))(e$()'4H dhJJJJ0(L1((4L ȱ%L`Ӻźź ̺נŠӠǠӠ ŠנɠȠҠԿŠՠſ͠͠٠ŠҠàũĠΠؠ͠ŠɠҮк׮Үԯůį±Š͠ȠӠͬէŠŠšԠԡӠŠǠǠӮҬՠΧԠԠĠ̠ŠӮҠԠǠӠǠͺȪԠӠŠҠ̠ӠĠˠŭӠŠΠϠӮԠŠǠĠ٠ŠϠȠŠǠĮ ͠ Š٠ӺРҠɧŠՠΠҠͧŠՠӠԠ ԠҠ˧ӠР ԠҠʧӠР ҠȧӠàҠѧЧӧӠçӠՠŠͮ͠ՠנŠԠԠӠРϠՠϠ٠ŠĠŠŠϠŠ̠ͮӠ ԠӠ Ԡ͠ ԠӠ Ƞ נȠŠӠϠҠqrrqrrQ4R4RQ4R4R 1T2T2 1T2T20tt0tt660) 90) )0 &&)) )) ) ) ) 00 0 60) 90) )00p@PP*0:!=6`)-/F@)-/V`)0o@J)@!@P OO*Z*?:*%%%O?%@ 0 /0?*O0%_5*/O:/*?** * // * :*% O%0%P0`PO@i0Y)009IP0P0Y)@@iPO0 bF "@%& "@%& "@%& "@%&@B&"&B&)"&"&BF"&"&BF"&"&BF"&"&BF"&'."&"&'.@"&"&@"&"&@"&"&@'.'.@%*%* 6?**0/?((/*4 <3-*%%%*y!!2&     "B6/,&6,&//:*  *  :*ZJ5Z5JЅi /i  /ԩL;L=Ѝȱ$ȱ%5#I l5Lf vQLJLLK 0LP , LS ILH ɠ$ȩeȩLLe L!0!%$#7 l e)P(0U()݅(&e((( $,UL,Te L x,  XX    L90 X 1  ˅̅ͩ)((ȑ(ȑ(ޑ(ˑȥ̑ȥ͑  %IMKJ0L X $ 7ˠȑȑ= W La ,0` `1L 0L `C IC`CL'ɠ%)_KJ I MQL,`iPiL=iiإ  H ih`H΅υ ih`JJJJ)Lziȥ) LiȥJJJJ) Liȥ)i`00 08``,T,Q`,T,V,S,P`e)P(((0e((e))` `$ȱ%ee% (e$((L?Șee` )(xL (xL e)xL (xL e)PL (PL e)PL (PL`(LX$)ޤޢ)H0L h)e(H(hȱH0PL(h)e(H(hȥi)Ь (L PL`% $e))(e$()'4H dhJJJJ0(L((4Lȱ%Ln`Ӻźź                   &)((8 X U 6Ωυʩօ˩̩ׅͩͅ %$    U X 6%$!5  %!    N X  LL| L LyL L N&)((8 Xl% $   L( Q`H`ILg MLg `ЌL ,P 6% $"J 2   )Ѕ( s   Lc N X  `,P 6%$# Å      f   $%#`  d$i, $ $$%  f 6% $#e      Lc U 6 f%$$ Ņ    ,  f      6 f% $$    6 f%$$|   LK$$$<  څ݅؅ N X   , U % )iȩ  \L) إ)" )ڥ٩8܅۠H hi 6Lh L ) )i LLL N X c $9  y $P  $  L r  ,  U Щх )ҩӅԅץ i֩ L Lݩȑȥ )8L )i ȑȩȑȑȑȩ$∈LAJ LL ȥL  L/ȥ )i∈ )qiȑLL ) ȩȩLi ȩ ȩȩHLCȱLeJ0L!8L0,LWeJJ0hHݥ)LC4DȱJi 6.ȱiJJi 64@ L4Ȅ4ЭiJi 6+JJi 6@ % iX hHLC#)eeJ$JJ% hHȵhi 6L L%Ѕ$$O 8$C)eei$% i8х$% ӥN H$r) eeЅ$ i% i $hH i% hм lբ H$CJJ) ee )% )eЅ$ h (L~   LML" L )i0ҩ ץeх 8хL/Ѕe 6i 6 ) hi%LQ EȅЅi 6/i 6 /ԩLQLSЍȱ$ȱ%5# 5L| LQLJLLK 0LC ILP , LS ILH Uɠ$ȩeȩL Le L,!0!%$#ԅ  fBe)P(0U()`(&e((( $,UL,Te L , N Xۅ   NLyLyϥΩ  X ΅  ˅̅ͩ)((ȑ(ȑ(ޑ(ˑȥ̑ȥ͑  %IMKJ0L' X 7ˠȑȑ=  Lc ,0` `B1L 0L `C IC`CL(,aL'ɠ^)_KJ I M@QL$5ʥ)L)ʢpd`0 0 KLJL,`iPiLiiإ  gH h`H΅υ h`JJJJ)Liȥ) LiȥJJJJ) L)iȥ)i`00 08``,T,Q`,T,V,S,P`e)P(((0e((e))` `$ȱ%ee% (e$((LȘee` )(xLQ (xLQ e)xLQ (xLQ e)PLQ (PLQ e)PLQ (PLQ`(L%)ޤޢ)H0L h)e(H(hȱH0PLh)e(H(hȥi)Ь (Lv PLv`% $              %)((8 X = 6Ωϩօ˩̩ׅͩͅg %$ ̅ }   = X 6%$!  %!    6 X  LLz L LgL L 6%)((8 Xl%υ $   L& Q`H`ILe MLe `ЌL ,P 6% $"    )Ѕ( [   La 6 Xn y `,P 6%$"ׅ       N   $%#.  d$i, $ $$%  N 6% $#3      La = 6 N%$$n     ,  N      6 N% $$ t   6 N%$$J   LI$婰$㩶$<  څ݅؅ 6 Xy n  , = $ )iȩ  DL) إ)" )ڥ٩8܅۠H hi 6Lh L ) )i LLL 6 X 1 $9 x G $P x w $ x _ L @  ,  = Щх )ҩӅԅץ i֩ L Lݩȑȥ )8L )i ȑȩȑȑȑȩ$∈L?J LL ȥL  L/ȥ )i∈ )qiȑLL ) ȩȩLi ȩ ȩȩHLAȱLeJ0L8L0,LUeJJ0hHݥ)LA4DȱJi .ȱiJJi 4@ L4Ȅ4ЭiJi +JJi @ % iX hHLA#)eeJ$JJ% hHȵhi 6L L%Ѕ$$ 8$)eei$% i8х$% ӥN H$@) eeЅ$ i% i $hH i% hм lբ H$JJ) ee )% )eЅ$ h (L|   LKL" L )i0ҩ ץeх 8хL/Ѕe i  ) hi%LO EȅЅi /i  /ԩLOLQЍȱ$ȱ%5# 5Lz vQLJLLK 0LP , LS ILH =ɠ$ȩeȩLLe L!0!%$#  N*e)P(0U()H(&e((p( $,UL,Te L , 6 XÅ   6LgLgϥΩg  X  ˅̅ͩ)((ȑ(ȑ(ޑ(ˑȥ̑ȥ͑  %IMKJ0L X 7ˠȑȑ=  La ,0` `*1L 0L `C IC`CL,aLr'ɠX)_KJ I M:QLrʥ)Lpʢpd`0 0 KLrJLr,`iPiLiiإ  OH h`H΅υ h`JJJJ)Liȥ) LiȥJJJJ) Liȥ)i`00 08``,T,Q`,T,V,S,P`e)P(((0e((e))` `$ȱ%ee% (e$((LȘee` )(xL9 (xL9 e)xL9 (xL9 e)PL9 (PL9 e)PL9 (PL9`(L$)ޤޢ)H0Lp h)e(H(hȱH0PLh)e(H(hȥi)Ь (L^ PL^`% $e))(e$()'4H       %)((8 X ; 6Ωϩօ˩̩ׅͩͅe %$ ʅ {   ; X 6%$!  %!    4 X  LLz L LgL L 4%)((8 Xl%ͅ $   L& Q`H`ILe MLe `ЌL ,P 6% $"    )Ѕ( Y   La 4 Xl w `,P 6%$"Յ       L   $%#,  d$i, $ $$%  L 6% $#1      La ; 6 L%$$l     ,  L      6 L% $$ r   6 L%$$H   LI$婮$㩴$<  څ݅؅ 4 Xw l  , ; $ )iȩ  BL) إ)" )ڥ٩8܅۠H hi 6Lh L ) )i LLL 4 X / $9 v E $P v u $ v ] L >  ,  ; Щх )ҩӅԅץ i֩ L Lݩȑȥ )8L )i ȑȩȑȑȑȩ$∈L?J LL ȥL  L/ȥ )i∈ )qiȑLL ) ȩȩLi ȩ ȩȩHLAȱLeJ0L8L0,LUeJJ0hHݥ)LA4DȱJi .ȱiJJi 4@ L4Ȅ4ЭiJi +JJi @ % iX hHLA#)eeJ$JJ% hHȵhi 6L L%Ѕ$$ 8$)eei$% i8х$% ӥN H$>) eeЅ$ i% i $hH i% hм lբ H$JJ) ee )% )eЅ$ h (L|   LKL" L )i0ҩ ץeх 8хL/Ѕe i  ) hi%LO EȅЅi /i  /ԩLOLQЍȱ$ȱ%5# 5Lz vQLJLLK 0LP , LS ILH ;ɠ$ȩeȩLLe L!0!%$#  L(e)P(0U()F(&e((n( $,UL,Te L , 4 X   4LgLgϥΩe  X  ˅̅ͩ)((ȑ(ȑ(ޑ(ˑȥ̑ȥ͑  %IMKJ0L X 7ˠȑȑ=  La ,0` `(1L 0L `C IC`CL,aLp'ɠV)_KJ I M8QLpʥ)Lnʭpd`0 0 KLpJLp,`iPiLiiإ  MH h`H΅υ h`JJJJ)Liȥ) LiȥJJJJ) Liȥ)i`00 08``,T,Q`,T,V,S,P`e)P(((0e((e))` `$ȱ%ee% (e$((LȘee` )(xL7 (xL7 e)xL7 (xL7 e)PL7 (PL7 e)PL7 (PL7`(L$)ޤޢ)H0Ln h)e(H(hȱH0PLh)e(H(hȥi)Ь (L\ PL\`% $e))(e$()'4H d      U)(( X,V,S,T,P 6%$ 2Յ r ,T X 6%$ 2 %h 2 r ,Q X> r LjLk L LYL L ,T,Q)(( Xl% $   L Q`H`ILV MLV `ЌL ,P 6% $˅ 2f r r )Ѕ( I r r LK X g `,P 6%$ 2 r r r r  < r r r$% 2 d$i, $ $$%  < 6% $ 2 r r r r LK U< \,P  KH6ȑ )8ȩȩȩ  ȩȩ$hLhi 6мHLȱe0L88L0"Lde0 hHL48ȱ Lȱ 8L40 L4Ȅ4йiH hHLn)ee$% 2hHȵhi 6Li %L&L(ڠȱ$ȱ%5g 25LQ ^QLYJLLK 0LPSHɠ$ȩeȩLLe L!0!%$U 2 <e)P(()(&e((Ʌ( $,ULO,T橋 LLK 1L 0L `C IC`L'ɠ%)_KJ I MQL,`iiةH  h`JJJJ) HhL/iȥ)i`e)P(((0e((e))` r`$ȱ%ee% (e$((LȘee` )(xL' (xL' e)xL' (xL' e)PL' (PL' e)PL' (PL'`(L% $e))(e$()'4H dhJJJJ0(Lt((4LOȱ%L4`Ӻźź̺נŠӠǠӠנɠȠҠԿŠՠſ͠͠٠ŠҠàũĠΠؠ͠ŠɠҮк׮Үԯůį±ԠӠŠҠ̠ӠĠˠŭӠŠΠϠӮԠŠǠĠ٠ŠϠȠŠǠĮ ͠ Š٠ӺРҠɧŠՠΠҠͧŠՠӠԠ ԠҠ˧ӠР ԠҠʧӠР ҠȧӠàҠѧЧӧӠՠŠͮ͠ՠנŠԠԠӠРϠՠϠ٠ŠĠŠŠϠŠ̠ͮqrrqrrQ4R4RQ4R4R 1T2T2 1T2T20tt0tt660) 90) )0 &&)) )) ) ) ) 00 0 60) 90) )00p@PP*0:!=6`)-/F@)-/V`)0o@J)@!@P OO*Z*?:*%%%O?%@ 0 /0?*O0%_5*/O:/*?** * // * :*% O%0%P0`PO@i0Y)009IP0P0Y)@@iPO0 bF "@%& "@%& "@%& "@%&@B&"&B&)"&"&BF"&"&BF"&"&BF"&"&BF"&'."&"&'.@"&"&@"&"&@"&"&@'.'.@%*%* 6?**0/?((/*4-*%%y!!2&  z #??     Ϡ ߶ӠӠ          s%)((8 X  6Ωϩօ˩̩ׅͩͅ* %$ @ G   X 6%$ ƅ  %!x \ G   X G LLz L LgL L %)((8 Xl% $   L& Q`H`ILe MLe `ЌL ,P 6% $!ۅ ݅ G G )Ѕ(  G G La  X1 < `,P 6%$" n G G G G   G G G$%"  d$i, $ $$%   6% $" v G G G G La  6 %$$1 p G G G ,   G G G G  6 % $$L 7 G  6 %$$ ` G LI$s$ys$<  kڅ݅؅  X< 1 G ,  $ )iȩ  L) إ)" )ڥ٩8܅۠H hi 6Lh L ) )i LLL  X G$9 ; G$P ; : G$ ; " GL  G ,   Щх )ҩӅԅץ i֩ L Lݩȑȥ )8L )i ȑȩȑȑȑȩ$∈L?J LL ȥL  L/ȥ )i∈ )qiȑLL ) ȩȩLi ȩ ȩȩHLAȱLeJ0L8L0,LUeJJ0hHݥ)LA4DȱJi .ȱiJJi 4@ ML4Ȅ4ЭiJi +JJi @ % iX hHLA#~)eeJ$JJ% hHȵhi 6L L%Ѕ$# 8#ԅ)eei$% i8х$% ӥN H$) eeЅ$ i% i $hH i% hм lբ H#ԅJJ) ee )% )eЅ$ h (L| k  LKL" L )i0ҩ ץeх 8хL/Ѕe i  ) hi%LO EȅЅi /i  /ԩLOLQЍȱ$ȱ%5#w 5Lz vQLJLLK 0LP , LS ILH ɠ$ȩeȩLLe L!0!%$#e  e)P(0U() (&e((3( $,UL,Te L ,  X G  LgLgϥΩ*  X _ G G˅̅ͩ)((ȑ(ȑ(ޑ(ˑȥ̑ȥ͑  %IMKJ0L X R G7ˠȑȑ=  La ,0` `1L 0L `C IC`CL 'ɠ%)_KJ I MQL5,`iPiLkiiإ  H h`H΅υ h`JJJJ)Liȥ) LiȥJJJJ) Liȥ)i`00 08``,TI ."LOADING TB_6502 BY VINCE WEAVER"G(4)"BRUN TB_6502"l PI3.14159265358979+X039C(Y10((X40)2PI)J-1Y2X,(Y20)`72x9Y10((X40)2PI):X,(Y20)<X         s%)((8 X  6Ωϩօ˩̩ׅͩͅ* %$ @ G   X 6%$ ƅ  %!x \ G   X G LLz L LgL L %)((8 Xl% $   L& Q`H`ILe MLe `ЌL ,P 6% $!ۅ ݅ G G )Ѕ(  G G La  X1 < `,P 6%$" n G G G G   G G G$%"  d$i, $ $$%   6% $" v G G G G La  6 %$$1 p G G G ,   G G G G  6 % $$L 7 G  6 %$$ ` G LI$s$ys$<  kڅ݅؅  X< 1 G ,  $ )iȩ  L) إ)" )ڥ٩8܅۠H hi 6Lh L ) )i LLL  X G$9 ; G$P ; : G$ ; " GL  G ,   Щх )ҩӅԅץ i֩ L Lݩȑȥ )8L )i ȑȩȑȑȑȩ$∈L?J LL ȥL  L/ȥ )i∈ )qiȑLL ) ȩȩLi ȩ ȩȩHLAȱLeJ0L8L0,LUeJJ0hHݥ)LA4DȱJi .ȱiJJi 4@ ML4Ȅ4ЭiJi +JJi @ % iX hHLA#~)eeJ$JJ% hHȵhi 6L L%Ѕ$# 8#ԅ)eei$% i8х$% ӥN H$) eeЅ$ i% i $hH i% hм lբ H#ԅJJ) ee )% )eЅ$ h (L| k  LKL" L )i0ҩ ץeх 8хL/Ѕe i  ) hi%LO EȅЅi /i  /ԩLOLQЍȱ$ȱ%5#w 5Lz vQLJLLK 0LP , LS ILH ɠ$ȩeȩLLe L!0!%$#e  e)P(0U() (&e((3( $,UL,Te L ,  X G  LgLgϥΩ*  X _ G G˅̅ͩ)((ȑ(ȑ(ޑ(ˑȥ̑ȥ͑  %IMKJ0L X R G7ˠȑȑ=  La ,0` `1L 0L `C IC`CL 'ɠ%)_KJ I MQL5,`iPiLkiiإ  H h`H΅υ h`JJJJ)Liȥ) LiȥJJJJ) Liȥ)i`00 08``,T      }%)((8 X  6Ωϩօ˩̩ׅͩͅ4 %$ J Q   X 6%$ Ѕ  %! f Q   X Q LLz L LgL L %)((8 Xl% $   L& Q`H`ILe MLe `ЌL ,P 6% $!  Q Q )Ѕ( ( Q Q La  X; F `,P 6%$" x Q Q Q Q   Q Q Q$%"  d$i, $ $$%   6% $#  Q Q Q Q La  6 %$$; z Q Q Q ,   Q Q Q Q  6 % $$V A Q  6 %$$ j Q LI$}$㩃}$<  uڅ݅؅  XF ; Q ,  $ )iȩ  L) إ)" )ڥ٩8܅۠H hi 6Lh L ) )i LLL  X Q$9 E  Q$P E D Q$ E , QL Q ,   Щх )ҩӅԅץ i֩ L Lݩȑȥ )8L )i ȑȩȑȑȑȩ$∈L?J LL ȥL  L/ȥ )i∈ )qiȑLL ) ȩȩLi ȩ ȩȩHLAȱLeJ0L8L0,LUeJJ0hHݥ)LA4DȱJi .ȱiJJi 4@ WL4Ȅ4ЭiJi +JJi @ % iX hHLA#)eeJ$JJ% hHȵhi 6L L%Ѕ$# 8#ޅ)eei$% i8х$% ӥN H$ ) eeЅ$ i% i $hH i% hм lբ H#ޅJJ) ee )% )eЅ$ h (L| u  LKL" L )i0ҩ ץeх 8хL/Ѕe i  ) hi%LO EȅЅi /i  /ԩLOLQЍȱ$ȱ%5# 5Lz vQLJLLK 0LP , LS ILH ɠ$ȩeȩLLe L!0!%$#o  e)P(0U()(&e((=( $,UL,Te L ,  X Q  LgLgϥΩ4  X i Q Q˅̅ͩ)((ȑ(ȑ(ޑ(ˑȥ̑ȥ͑  %IMKJ0L X \ Q7ˠȑȑ=  La ,0` `1L 0L `C IC`CL,aL?'ɠ%)_KJ I MQL?,`iPiLuiiإ  H h`H΅υ h`JJJJ)Liȥ) LiȥJJJJ) Liȥ)i`00 08``,T,Q`,T,V,S,P`e)P(((0e((e))` Q`$ȱ%ee% (e$((LwȘee` )(xL (xL e)xL (xL e)PL (PL e)PL (PL`(L$)ޤޢ)H0L= h)e(H(hȱH0PL`h)e(H(hȥi)Ь (L+ PL+`% $e))(e$()'4H dhJJJJ0(L((4Lȱ%L`      %)م((8 X + 6Ωϩօ˩̩ׅͩͅU %$ k r  + X 6%$  %!  r  $ X r LLz L LgL L $%)م((8 Xl% $   L& Q`H`ILe MLe `ЌL ,P 6% $"  r r )Ѕ( I r r La $ X\ g `,P 6%$"Ņ  r r r r  < r r r$%#  d$i, $ $$%  < 6% $#!  r r r r La + 6 <%$$\  r r r ,  < r r r r  6 <% $$w b r  6 <%$$8  r LI$婞$㩤$<  څ݅؅ $ Xg \ r , + $څ )iȩ  2L) إ)" )ڥ٩8܅۠H hi 6Lh L ) )i LLL $ X  r$9 f 5 r$P f e r$ f M rL . r ,  + Щх )ҩӅԅץ i֩ L Lݩȑȥ )8L )i ȑȩȑȑȑȩ$∈L?J LL ȥL  L/ȥ )i∈ )qiȑLL ) ȩȩLi ȩ ȩȩHLAȱLeJ0L8L0,LUeJJ0hHݥ)LA4DȱJi .ȱiJJi 4@ xL4Ȅ4ЭiJi +JJi @ % iX hHLA#)eeJ$JJ% hHȵhi 6L L%Ѕ$$ 8#)eei$% i8х$% ӥN H$.) eeЅ$ i% i $hH i% hм lբ H#JJ) ee )% )eЅ$ h (L|   LKL" L )i0ҩ ץeх 8хL/Ѕe i  ) hi%LO EȅЅi /i  /ԩLOLQЍȱ$ȱ%5# 5Lz vQLJLLK 0LP , LS ILH +ɠ$ȩeȩLLe L!0!%$#  <e)P(0U()6(&e((^( $,UL,Te L , $ X r  $LgLgϥΩU  X r r˅̅ͩ)((ȑ(ȑ(ޑ(ˑȥ̑ȥ͑  %IMKJ0L X } r7ˠȑȑ=  La ,0` `1L 0L `C IC`CL7pdɐKL&p0J,aL`'ɠ%)_KJ I MQL`,`iPiLiiإ  =H h`H΅υ h`JJJJ)Liȥ) LiȥJJJJ) Liȥ)i`00 08``,T,Q`,T,V,S,P`e)P(((0e((e))` r`$ȱ%ee% (e$((LȘee` )(xL' (xL' e)xL' (xL' e)PL' (PL' e)PL' (PL'`(L$څ)ޤޢ)H0L^ h)e(H(hȱH0PLh)e(H(hȥi)Ь (LL PLL`% $e))(e$()'4H dhJJJJ0(      %)م((8 X + 6Ωϩօ˩̩ׅͩͅU %$ k r  + X 6%$  %!  r  $ X r LLz L LgL L $%)م((8 Xl% $   L& Q`H`ILe MLe `ЌL ,P 6% $"  r r )Ѕ( I r r La $ X\ g `,P 6%$"Ņ  r r r r  < r r r$%#  d$i, $ $$%  < 6% $#!  r r r r La + 6 <%$$\  r r r ,  < r r r r  6 <% $$w b r  6 <%$$8  r LI$婞$㩤$<  څ݅؅ $ Xg \ r , + $څ )iȩ  2L) إ)" )ڥ٩8܅۠H hi 6Lh L ) )i LLL $ X  r$9 f 5 r$P f e r$ f M rL . r ,  + Щх )ҩӅԅץ i֩ L Lݩȑȥ )8L )i ȑȩȑȑȑȩ$∈L?J LL ȥL  L/ȥ )i∈ )qiȑLL ) ȩȩLi ȩ ȩȩHLAȱLeJ0L8L0,LUeJJ0hHݥ)LA4DȱJi .ȱiJJi 4@ xL4Ȅ4ЭiJi +JJi @ % iX hHLA#)eeJ$JJ% hHȵhi 6L L%Ѕ$$ 8#)eei$% i8х$% ӥN H$.) eeЅ$ i% i $hH i% hм lբ H#JJ) ee )% )eЅ$ h (L|   LKL" L )i0ҩ ץeх 8хL/Ѕe i  ) hi%LO EȅЅi /i  /ԩLOLQЍȱ$ȱ%5# 5Lz vQLJLLK 0LP , LS ILH +ɠ$ȩeȩLLe L!0!%$#  <e)P(0U()6(&e((^( $,UL,Te L , $ X r  $LgLgϥΩU  X r r˅̅ͩ)((ȑ(ȑ(ޑ(ˑȥ̑ȥ͑  %IMKJ0L X } r7ˠȑȑ=  La ,0` `1L 0L `C IC`CL7pdKL&p0J,aL`'ɠ%)_KJ I MQL`,`iPiLiiإ  =H h`H΅υ h`JJJJ)Liȥ) LiȥJJJJ) Liȥ)i`00 08``,T,Q`,T,V,S,P`e)P(((0e((e))` r`$ȱ%ee% (e$((LȘee` )(xL' (xL' e)xL' (xL' e)PL' (PL' e)PL' (PL'`(L$څ)ޤޢ)H0L^ h)e(H(hȱH0PLh)e(H(hȥi)Ь (LL PLL`% $e))(e$()'4H dhJJJJ0(      %)م((8 X + 6Ωϩօ˩̩ׅͩͅU %$ k r  + X 6%$  %!  r  $ X r LLz L LgL L $%)م((8 Xl% $   L& Q`H`ILe MLe `ЌL ,P 6% $"  r r )Ѕ( I r r La $ X\ g `,P 6%$"Ņ  r r r r  < r r r$%#  d$i, $ $$%  < 6% $#!  r r r r La + 6 <%$$\  r r r ,  < r r r r  6 <% $$w b r  6 <%$$8  r LI$婞$㩤$<  څ݅؅ $ Xg \ r , + $څ )iȩ  2L) إ)" )ڥ٩8܅۠H hi 6Lh L ) )i LLL $ X  r$9 f 5 r$P f e r$ f M rL . r ,  + Щх )ҩӅԅץ i֩ L Lݩȑȥ )8L )i ȑȩȑȑȑȩ$∈L?J LL ȥL  L/ȥ )i∈ )qiȑLL ) ȩȩLi ȩ ȩȩHLAȱLeJ0L8L0,LUeJJ0hHݥ)LA4DȱJi .ȱiJJi 4@ xL4Ȅ4ЭiJi +JJi @ % iX hHLA#)eeJ$JJ% hHȵhi 6L L%Ѕ$$ 8#)eei$% i8х$% ӥN H$.) eeЅ$ i% i $hH i% hм lբ H#JJ) ee )% )eЅ$ h (L|   LKL" L )i0ҩ ץeх 8хL/Ѕe i  ) hi%LO EȅЅi /i  /ԩLOLQЍȱ$ȱ%5# 5Lz vQLJLLK 0LP , LS ILH +ɠ$ȩeȩLLe L!0!%$#  <e)P(0U()6(&e((^( $,UL,Te L , $ X r  $LgLgϥΩU  X r r˅̅ͩ)((ȑ(ȑ(ޑ(ˑȥ̑ȥ͑  %IMKJ0L X } r7ˠȑȑ=  La ,0` `1L 0L `C IC`CL7pd0KL&p0J,aL`'ɠ%)_KJ I MQL`,`iPiLiiإ  =H h`H΅υ h`JJJJ)Liȥ) LiȥJJJJ) Liȥ)i`00 08``,T,Q`,T,V,S,P`e)P(((0e((e))` r`$ȱ%ee% (e$((LȘee` )(xL' (xL' e)xL' (xL' e)PL' (PL' e)PL' (PL'`(L$څ)ޤޢ)H0L^ h)e(H(hȱH0PLh)e(H(hȥi)Ь (LL PLL`% $e))(e$()'4H dhJJJJ0(        %)υ((8 X ! 6Ωϩօ˩̩ׅͩͅK %$ a h  ! X 6%$  %! } h   Xօ h LLz L LgL L %)υ((8 Xl% $   L& Q`H`ILe MLe `ЌL ,P 6% $!  h h )Ѕ( ? h h La  XR ] `,P 6%$"  h h h h  2 h h h$%#  d$i, $ $$%  2 6% $#  h h h h La ! 6 2%$$R  h h h ,  2 h h h h  6 2% $$m X h  6 2%$$.  h LI$婔$㩚$<  څ݅؅  X] R h , ! $Ѕ )iȩ  (L) إ)" )ڥ٩8܅۠H hi 6Lh L ) )i LLL  X  h$9 \ + h$P \ [ h$ \ C hL $ h ,  ! Щх )ҩӅԅץ i֩ L Lݩȑȥ )8L )i ȑȩȑȑȑȩ$∈L?J LL ȥL  L/ȥ )i∈ )qiȑLL ) ȩȩLi ȩ ȩȩHLAȱLeJ0L8L0,LUeJJ0hHݥ)LA4DȱJi .ȱiJJi 4@ nL4Ȅ4ЭiJi +JJi @ % iX hHLA#)eeJ$JJ% hHȵhi 6L L%Ѕ$$ 8#)eei$% i8х$% ӥN H$$) eeЅ$ i% i $hH i% hм lբ H#JJ) ee )% )eЅ$ h (L|   LKL" L )i0ҩ ץeх 8хL/Ѕe i  ) hi%LO EȅЅi /i  /ԩLOLQЍȱ$ȱ%5# 5Lz vQLJLLK 0LP , LS ILH !ɠ$ȩeȩLLe L!0!%$#  2e)P(0U(),(&e((T( $,UL,Te L ,  X h  LgLgϥΩK  X h h˅̅ͩ)((ȑ(ȑ(ޑ(ˑȥ̑ȥ͑  %IMKJ0L X s h7ˠȑȑ=  La ,0` `1L 0L `C IC`CL-pdLJ,aLV'ɠ%)_KJ I MQLV,`iPiLiiإ  3H h`H΅υ h`JJJJ)Liȥ) LiȥJJJJ) Liȥ)  A(256)I1256.A(I)((1)40)O#(((1)2))1A(I)A(I)100V(I^2I0d<pFJ039zKKJILK256KK256PA(K)100Ġ5:A(K),JUA(K)100Ġ10:A(K)100,JZJdII1iI0II256n60 I      %)څ((8 X , 6Ωϩօ˩̩ׅͩͅV %$ l s  , X 6%$  %!  s  % X s LLz L LgL L %%)څ((8 Xl% $   L& Q`H`ILe MLe `ЌL ,P 6% $"  s s )Ѕ( J s s La % X] h `,P 6%$"ƅ  s s s s  = s s s$%#  d$i, $ $$%  = 6% $#"  s s s s La , 6 =%$$]  s s s ,  = s s s s  6 =% $$x c s  6 =%$$9  s LI$婟$㩥$<  څ݅؅ % Xh ] s , , $ۅ )iȩ  3L) إ)" )ڥ٩8܅۠H hi 6Lh L ) )i LLL % X s$9 g 6 s$P g f s$ g N sL / s ,  , Щх )ҩӅԅץ i֩ L Lݩȑȥ )8L )i ȑȩȑȑȑȩ$∈L?J LL ȥL  L/ȥ )i∈ )qiȑLL ) ȩȩLi ȩ ȩȩHLAȱLeJ0L8L0,LUeJJ0hHݥ)LA4DȱJi .ȱiJJi 4@ yL4Ȅ4ЭiJi +JJi @ % iX hHLA#)eeJ$JJ% hHȵhi 6L L%Ѕ$$ 8$)eei$% i8х$% ӥN H$/) eeЅ$ i% i $hH i% hм lբ H$JJ) ee )% )eЅ$ h (L|   LKL" L )i0ҩ ץeх 8хL/Ѕe i  ) hi%LO EȅЅi /i  /ԩLOLQЍȱ$ȱ%5# 5Lz vQLJLLK 0LP , LS ILH ,ɠ$ȩeȩLLe L!0!%$#  =e)P(0U()7(&e((_( $,UL,Te L , % X s  %LgLgϥΩV  X s s˅̅ͩ)((ȑ(ȑ(ޑ(ˑȥ̑ȥ͑  %IMKJ0L X ~ s7ˠȑȑ=  La ,0` `1L 0L `C IC`CL,aLa'ɠG)_KJ I M)QLapd0KLap0JLa,`iPiLiiإ  >H h`H΅υ h`JJJJ)Liȥ) LiȥJJJJ) Liȥ)i`00 08``,T,Q`,T,V,S,P`e)P(((0e((e))` s`$ȱ%ee% (e$((LȘee` )(xL( (xL( e)xL( (xL( e)PL( (PL( e)PL( (PL(`(L$ۅ)ޤޢ)H0L_ h)e(H(hȱH0PLh)e(H(hȥi)Ь (LM PLM`% $e))(e$()'4H dhJJJJ0(      %)څ((8 X , 6Ωϩօ˩̩ׅͩͅV %$ l s  , X 6%$  %!  s  % X s LLz L LgL L %%)څ((8 Xl% $   L& Q`H`ILe MLe `ЌL ,P 6% $"  s s )Ѕ( J s s La % X] h `,P 6%$"ƅ  s s s s  = s s s$%#  d$i, $ $$%  = 6% $#"  s s s s La , 6 =%$$]  s s s ,  = s s s s  6 =% $$x c s  6 =%$$9  s LI$婟$㩥$<  څ݅؅ % Xh ] s , , $ۅ )iȩ  3L) إ)" )ڥ٩8܅۠H hi 6Lh L ) )i LLL % X s$9 g 6 s$P g f s$ g N sL / s ,  , Щх )ҩӅԅץ i֩ L Lݩȑȥ )8L )i ȑȩȑȑȑȩ$∈L?J LL ȥL  L/ȥ )i∈ )qiȑLL ) ȩȩLi ȩ ȩȩHLAȱLeJ0L8L0,LUeJJ0hHݥ)LA4DȱJi .ȱiJJi 4@ yL4Ȅ4ЭiJi +JJi @ % iX hHLA#)eeJ$JJ% hHȵhi 6L L%Ѕ$$ 8$)eei$% i8х$% ӥN H$/) eeЅ$ i% i $hH i% hм lբ H$JJ) ee )% )eЅ$ h (L|   LKL" L )i0ҩ ץeх 8хL/Ѕe i  ) hi%LO EȅЅi /i  /ԩLOLQЍȱ$ȱ%5# 5Lz vQLJLLK 0LP , LS ILH ,ɠ$ȩeȩLLe L!0!%$#  =e)P(0U()7(&e((_( $,UL,Te L , % X s  %LgLgϥΩV  X s s˅̅ͩ)((ȑ(ȑ(ޑ(ˑȥ̑ȥ͑  %IMKJ0L X ~ s7ˠȑȑ=  La ,0` `1L 0L `C IC`CL,aLa'ɠG)_KJ I M)QLapd0KLapJLa,`iPiLiiإ  >H h`H΅υ h`JJJJ)Liȥ) LiȥJJJJ) Liȥ)i`00 08``,T,Q`,T,V,S,P`e)P(((0e((e))` s`$ȱ%ee% (e$((LȘee` )(xL( (xL( e)xL( (xL( e)PL( (PL( e)PL( (PL(`(L$ۅ)ޤޢ)H0L_ h)e(H(hȱH0PLh)e(H(hȥi)Ь (LM PLM`% $e))(e$()'4H dhJJJJ0(      %)څ((8 X , 6Ωϩօ˩̩ׅͩͅV %$ l s  , X 6%$  %!  s  % X s LLz L LgL L %%)څ((8 Xl% $   L& Q`H`ILe MLe `ЌL ,P 6% $"  s s )Ѕ( J s s La % X] h `,P 6%$"ƅ  s s s s  = s s s$%#  d$i, $ $$%  = 6% $#"  s s s s La , 6 =%$$]  s s s ,  = s s s s  6 =% $$x c s  6 =%$$9  s LI$婟$㩥$<  څ݅؅ % Xh ] s , , $ۅ )iȩ  3L) إ)" )ڥ٩8܅۠H hi 6Lh L ) )i LLL % X s$9 g 6 s$P g f s$ g N sL / s ,  , Щх )ҩӅԅץ i֩ L Lݩȑȥ )8L )i ȑȩȑȑȑȩ$∈L?J LL ȥL  L/ȥ )i∈ )qiȑLL ) ȩȩLi ȩ ȩȩHLAȱLeJ0L8L0,LUeJJ0hHݥ)LA4DȱJi .ȱiJJi 4@ yL4Ȅ4ЭiJi +JJi @ % iX hHLA#)eeJ$JJ% hHȵhi 6L L%Ѕ$$ 8$)eei$% i8х$% ӥN H$/) eeЅ$ i% i $hH i% hм lբ H$JJ) ee )% )eЅ$ h (L|   LKL" L )i0ҩ ץeх 8хL/Ѕe i  ) hi%LO EȅЅi /i  /ԩLOLQЍȱ$ȱ%5# 5Lz vQLJLLK 0LP , LS ILH ,ɠ$ȩeȩLLe L!0!%$#  =e)P(0U()7(&e((_( $,UL,Te L , % X s  %LgLgϥΩV  X s s˅̅ͩ)((ȑ(ȑ(ޑ(ˑȥ̑ȥ͑  %IMKJ0L X ~ s7ˠȑȑ=  La ,0` `1L 0L `C IC`CL,aLa'ɠG)_KJ I M)QLapdKLap0JLa,`iPiLiiإ  >H h`H΅υ h`JJJJ)Liȥ) LiȥJJJJ) Liȥ)i`00 08``,T,Q`,T,V,S,P`e)P(((0e((e))` s`$ȱ%ee% (e$((LȘee` )(xL( (xL( e)xL( (xL( e)PL( (PL( e)PL( (PL(`(L$ۅ)ޤޢ)H0L_ h)e(H(hȱH0PLh)e(H(hȥi)Ь (LM PLM`% $e))(e$()'4H dhJJJJ0(      %)څ((8 X , 6Ωϩօ˩̩ׅͩͅV %$ l s  , X 6%$  %!  s  % X s LLz L LgL L %%)څ((8 Xl% $   L& Q`H`ILe MLe `ЌL ,P 6% $"  s s )Ѕ( J s s La % X] h `,P 6%$"ƅ  s s s s  = s s s$%#  d$i, $ $$%  = 6% $#"  s s s s La , 6 =%$$]  s s s ,  = s s s s  6 =% $$x c s  6 =%$$9  s LI$婟$㩥$<  څ݅؅ % Xh ] s , , $ۅ )iȩ  3L) إ)" )ڥ٩8܅۠H hi 6Lh L ) )i LLL % X s$9 g 6 s$P g f s$ g N sL / s ,  , Щх )ҩӅԅץ i֩ L Lݩȑȥ )8L )i ȑȩȑȑȑȩ$∈L?J LL ȥL  L/ȥ )i∈ )qiȑLL ) ȩȩLi ȩ ȩȩHLAȱLeJ0L8L0,LUeJJ0hHݥ)LA4DȱJi .ȱiJJi 4@ yL4Ȅ4ЭiJi +JJi @ % iX hHLA#)eeJ$JJ% hHȵhi 6L L%Ѕ$$ 8$)eei$% i8х$% ӥN H$/) eeЅ$ i% i $hH i% hм lբ H$JJ) ee )% )eЅ$ h (L|   LKL" L )i0ҩ ץeх 8хL/Ѕe i  ) hi%LO EȅЅi /i  /ԩLOLQЍȱ$ȱ%5# 5Lz vQLJLLK 0LP , LS ILH ,ɠ$ȩeȩLLe L!0!%$#  =e)P(0U()7(&e((_( $,UL,Te L , % X s  %LgLgϥΩV  X s s˅̅ͩ)((ȑ(ȑ(ޑ(ˑȥ̑ȥ͑  %IMKJ0L X ~ s7ˠȑȑ=  La ,0` `1L 0L `C IC`CL,aLa'ɠG)_KJ I M)QLapd` 0 KLaJLa,`iPiLiiإ  >H h`H΅υ h`JJJJ)Liȥ) LiȥJJJJ) Liȥ)i`00 08``,T,Q`,T,V,S,P`e)P(((0e((e))` s`$ȱ%ee% (e$((LȘee` )(xL( (xL( e)xL( (xL( e)PL( (PL( e)PL( (PL(`(L$ۅ)ޤޢ)H0L_ h)e(H(hȱH0PLh)e(H(hȥi)Ь (LM PLM`% $e))(e$()'4H dhJJJJ0(      %)څ((8 X , 6Ωϩօ˩̩ׅͩͅV %$ l s  , X 6%$  %!  s  % X s LLz L LgL L %%)څ((8 Xl% $   L& Q`H`ILe MLe `ЌL ,P 6% $"  s s )Ѕ( J s s La % X] h `,P 6%$"ƅ  s s s s  = s s s$%#  d$i, $ $$%  = 6% $#"  s s s s La , 6 =%$$]  s s s ,  = s s s s  6 =% $$x c s  6 =%$$9  s LI$婟$㩥$<  څ݅؅ % Xh ] s , , $ۅ )iȩ  3L) إ)" )ڥ٩8܅۠H hi 6Lh L ) )i LLL % X s$9 g 6 s$P g f s$ g N sL / s ,  , Щх )ҩӅԅץ i֩ L Lݩȑȥ )8L )i ȑȩȑȑȑȩ$∈L?J LL ȥL  L/ȥ )i∈ )qiȑLL ) ȩȩLi ȩ ȩȩHLAȱLeJ0L8L0,LUeJJ0hHݥ)LA4DȱJi .ȱiJJi 4@ yL4Ȅ4ЭiJi +JJi @ % iX hHLA#)eeJ$JJ% hHȵhi 6L L%Ѕ$$ 8$)eei$% i8х$% ӥN H$/) eeЅ$ i% i $hH i% hм lբ H$JJ) ee )% )eЅ$ h (L|   LKL" L )i0ҩ ץeх 8хL/Ѕe i  ) hi%LO EȅЅi /i  /ԩLOLQЍȱ$ȱ%5# 5Lz vQLJLLK 0LP , LS ILH ,ɠ$ȩeȩLLe L!0!%$#  =e)P(0U()7(&e((_( $,UL,Te L , % X s  %LgLgϥΩV  X s s˅̅ͩ)((ȑ(ȑ(ޑ(ˑȥ̑ȥ͑  %IMKJ0L X ~ s7ˠȑȑ=  La ,0` `1L 0L `C IC`CL,aLa'ɠG)_KJ I M)QLapd`0 0 KLaJLa,`iPiLiiإ  >H h`H΅υ h`JJJJ)Liȥ) LiȥJJJJ) Liȥ)i`00 08``,T,Q`,T,V,S,P`e)P(((0e((e))` s`$ȱ%ee% (e$((LȘee` )(xL( (xL( e)xL( (xL( e)PL( (PL( e)PL( (PL(`(L$ۅ)ޤޢ)H0L_ h)e(H(hȱH0PLh)e(H(hȥi)Ь (LM PLM`% $e))(e$()'4H dhJJJJ0(      %)څ((8 X , 6Ωϩօ˩̩ׅͩͅV %$ l s  , X 6%$  %!  s  % X s LLz L LgL L %%)څ((8 Xl% $   L& Q`H`ILe MLe `ЌL ,P 6% $"  s s )Ѕ( J s s La % X] h `,P 6%$"ƅ  s s s s  = s s s$%#  d$i, $ $$%  = 6% $#"  s s s s La , 6 =%$$]  s s s ,  = s s s s  6 =% $$x c s  6 =%$$9  s LI$婟$㩥$<  څ݅؅ % Xh ] s , , $ۅ )iȩ  3L) إ)" )ڥ٩8܅۠H hi 6Lh L ) )i LLL % X s$9 g 6 s$P g f s$ g N sL / s ,  , Щх )ҩӅԅץ i֩ L Lݩȑȥ )8L )i ȑȩȑȑȑȩ$∈L?J LL ȥL  L/ȥ )i∈ )qiȑLL ) ȩȩLi ȩ ȩȩHLAȱLeJ0L8L0,LUeJJ0hHݥ)LA4DȱJi .ȱiJJi 4@ yL4Ȅ4ЭiJi +JJi @ % iX hHLA#)eeJ$JJ% hHȵhi 6L L%Ѕ$$ 8$)eei$% i8х$% ӥN H$/) eeЅ$ i% i $hH i% hм lբ H$JJ) ee )% )eЅ$ h (L|   LKL" L )i0ҩ ץeх 8хL/Ѕe i  ) hi%LO EȅЅi /i  /ԩLOLQЍȱ$ȱ%5# 5Lz vQLJLLK 0LP , LS ILH ,ɠ$ȩeȩLLe L!0!%$#  =e)P(0U()7(&e((_( $,UL,Te L , % X s  %LgLgϥΩV  X s s˅̅ͩ)((ȑ(ȑ(ޑ(ˑȥ̑ȥ͑  %IMKJ0L X ~ s7ˠȑȑ=  La ,0` `1L 0L `C IC`CL,aLa'ɠG)_KJ I M)QLapd`  KLaJLa,`iPiLiiإ  >H h`H΅υ h`JJJJ)Liȥ) LiȥJJJJ) Liȥ)i`00 08``,T,Q`,T,V,S,P`e)P(((0e((e))` s`$ȱ%ee% (e$((LȘee` )(xL( (xL( e)xL( (xL( e)PL( (PL( e)PL( (PL(`(L$ۅ)ޤޢ)H0L_ h)e(H(hȱH0PLh)e(H(hȥi)Ь (LM PLM`% $e))(e$()'4H dhJJJJ0(              %)څ((8 X , 6Ωϩօ˩̩ׅͩͅV %$ l s  , X 6%$  %!  s  % X s LLz L LgL L %%)څ((8 Xl% $   L& Q`H`ILe MLe `ЌL ,P 6% $"  s s )Ѕ( J s s La % X] h `,P 6%$"ƅ  s s s s  = s s s$%#  d$i, $ $$%  = 6% $#"  s s s s La , 6 =%$$]  s s s ,  = s s s s  6 =% $$x c s  6 =%$$9  s LI$婟$㩥$<  څ݅؅ % Xh ] s , , $ۅ )iȩ  3L) إ)" )ڥ٩8܅۠H hi 6Lh L ) )i LLL % X s$9 g 6 s$P g f s$ g N sL / s ,  , Щх )ҩӅԅץ i֩ L Lݩȑȥ )8L )i ȑȩȑȑȑȩ$∈L?J LL ȥL  L/ȥ )i∈ )qiȑLL ) ȩȩLi ȩ ȩȩHLAȱLeJ0L8L0,LUeJJ0hHݥ)LA4DȱJi .ȱiJJi 4@ yL4Ȅ4ЭiJi +JJi @ % iX hHLA#)eeJ$JJ% hHȵhi 6L L%Ѕ$$ 8$)eei$% i8х$% ӥN H$/) eeЅ$ i% i $hH i% hм lբ H$JJ) ee )% )eЅ$ h (L|   LKL" L )i0ҩ ץeх 8хL/Ѕe i  ) hi%LO EȅЅi /i  /ԩLOLQЍȱ$ȱ%5# 5Lz vQLJLLK 0LP , LS ILH ,ɠ$ȩeȩLLe L!0!%$#  =e)P(0U()7(&e((_( $,UL,Te L , % X s  %LgLgϥΩV  X s s˅̅ͩ)((ȑ(ȑ(ޑ(ˑȥ̑ȥ͑  %IMKJ0L X ~ s7ˠȑȑ=  La ,0` `1L 0L `C IC`CL,aLa'ɠG)_KJ I M)QLapd`0 0 KLaJLa,`iPiLiiإ  >H h`H΅υ h`JJJJ)Liȥ) LiȥJJJJ) Liȥ)i`00 08``,T,Q`,T,V,S,P`e)P(((0e((e))` s`$ȱ%ee% (e$((LȘee` )(xL( (xL( e)xL( (xL( e)PL( (PL( e)PL( (PL(`(L$ۅ)ޤޢ)H0L_ h)e(H(hȱH0PLh)e(H(hȥi)Ь (LM PLM`% $e))(e$()'4H dhJJJJ0(          !!!!!!!!!! %)((8 X 8 6Ωϩօ˩̩ׅͩͅb %$ Dž x   8 X 6%$  %!    1 X  LLz L LgL L 1%)((8 Xl%ʅ $   L& Q`H`ILe MLe `ЌL ,P 6% $"    )Ѕ( V   La 1 Xi t `,P 6%$"҅       I   $%#)  d$i, $ $$%  I 6% $#.      La 8 6 I%$$i     ,  I      6 I% $$ o   6 I%$$E   LI$婫$㩱$<  څ݅؅ 1 Xt i  , 8 $ )iȩ  ?L) إ)" )ڥ٩8܅۠H hi 6Lh L ) )i LLL 1 X , $9 s B $P s r $ s Z L ;  ,  8 Щх )ҩӅԅץ i֩ L Lݩȑȥ )8L )i ȑȩȑȑȑȩ$∈L?J LL ȥL  L/ȥ )i∈ )qiȑLL ) ȩȩLi ȩ ȩȩHLAȱLeJ0L8L0,LUeJJ0hHݥ)LA4DȱJi .ȱiJJi 4@ L4Ȅ4ЭiJi +JJi @ % iX hHLA#)eeJ$JJ% hHȵhi 6L L%Ѕ$$ 8$ )eei$% i8х$% ӥN H$;) eeЅ$ i% i $hH i% hм lբ H$ JJ) ee )% )eЅ$ h (L|   LKL" L )i0ҩ ץeх 8хL/Ѕe i  ) hi%LO EȅЅi /i  /ԩLOLQЍȱ$ȱ%5# 5Lz vQLJLLK 0LP , LS ILH 8ɠ$ȩeȩLLe L!0!%$#  I%e)P(0U()C(&e((k( $,UL,Te L , 1 X   1LgLgϥΩb  X  ˅̅ͩ)((ȑ(ȑ(ޑ(ˑȥ̑ȥ͑  %IMKJ0L X 7ˠȑȑ=  La ,0` `%1L 0L `C IC`CL,aLm'ɠS)_KJ I M5QLmʥ) ʭpd`0 0 KLmJLm,`iPiLiiإ  JH h`H΅υ h`JJJJ)Liȥ) LiȥJJJJ) L iȥ)i`00 08``,T,Q`,T,V,S,P`e)P(((0e((e))` `$ȱ%ee% (e$((LȘee` )(xL4 (xL4 e)xL4 (xL4 e)PL4 (PL4 e)PL4 (PL4`(L$)ޤޢ)H0Lk h)e(H(hȱH0PLh)e(H(hȥi)Ь (LY PLY`% $e))(e$()'4H dhJJ!!!!!!!!! ! ! ! ! !!"""""""""" %)((8 X 8 6Ωϩօ˩̩ׅͩͅb %$ Dž x   8 X 6%$  %!    1 X  LLz L LgL L 1%)((8 Xl%ʅ $   L& Q`H`ILe MLe `ЌL ,P 6% $"    )Ѕ( V   La 1 Xi t `,P 6%$"҅       I   $%#)  d$i, $ $$%  I 6% $#.      La 8 6 I%$$i     ,  I      6 I% $$ o   6 I%$$E   LI$婫$㩱$<  څ݅؅ 1 Xt i  , 8 $ )iȩ  ?L) إ)" )ڥ٩8܅۠H hi 6Lh L ) )i LLL 1 X , $9 s B $P s r $ s Z L ;  ,  8 Щх )ҩӅԅץ i֩ L Lݩȑȥ )8L )i ȑȩȑȑȑȩ$∈L?J LL ȥL  L/ȥ )i∈ )qiȑLL ) ȩȩLi ȩ ȩȩHLAȱLeJ0L8L0,LUeJJ0hHݥ)LA4DȱJi .ȱiJJi 4@ L4Ȅ4ЭiJi +JJi @ % iX hHLA#)eeJ$JJ% hHȵhi 6L L%Ѕ$$ 8$ )eei$% i8х$% ӥN H$;) eeЅ$ i% i $hH i% hм lբ H$ JJ) ee )% )eЅ$ h (L|   LKL" L )i0ҩ ץeх 8хL/Ѕe i  ) hi%LO EȅЅi /i  /ԩLOLQЍȱ$ȱ%5# 5Lz vQLJLLK 0LP , LS ILH 8ɠ$ȩeȩLLe L!0!%$#  I%e)P(0U()C(&e((k( $,UL,Te L , 1 X   1LgLgϥΩb  X  ˅̅ͩ)((ȑ(ȑ(ޑ(ˑȥ̑ȥ͑  %IMKJ0L X 7ˠȑȑ=  La ,0` `%1L 0L `C IC`CL,aLm'ɠS)_KJ I M5QLmʥ)ʭpd`0 0 KLmJLm,`iPiLiiإ  JH h`H΅υ h`JJJJ)Liȥ) LiȥJJJJ) L iȥ)i`00 08``,T,Q`,T,V,S,P`e)P(((0e((e))` `$ȱ%ee% (e$((LȘee` )(xL4 (xL4 e)xL4 (xL4 e)PL4 (PL4 e)PL4 (PL4`(L$)ޤޢ)H0Lk h)e(H(hȱH0PLh)e(H(hȥi)Ь (LY PLY`% $e))(e$()'4H dhJJ""""""""" " " " " "" %)((8 X 8 6Ωϩօ˩̩ׅͩͅb %$ Dž x   8 X 6%$  %!    1 X  LLz L LgL L 1%)((8 Xl%ʅ $   L& Q`H`ILe MLe `ЌL ,P 6% $"    )Ѕ( V   La 1 Xi t `,P 6%$"҅       I   $%#)  d$i, $ $$%  I 6% $#.      La 8 6 I%$$i     ,  I      6 I% $$ o   6 I%$$E   LI$婫$㩱$<  څ݅؅ 1 Xt i  , 8 $ )iȩ  ?L) إ)" )ڥ٩8܅۠H hi 6Lh L ) )i LLL 1 X , $9 s B $P s r $ s Z L ;  ,  8 Щх )ҩӅԅץ i֩ L Lݩȑȥ )8L )i ȑȩȑȑȑȩ$∈L?J LL ȥL  L/ȥ )i∈ )qiȑLL ) ȩȩLi ȩ ȩȩHLAȱLeJ0L8L0,LUeJJ0hHݥ)LA4DȱJi .ȱiJJi 4@ L4Ȅ4ЭiJi +JJi @ % iX hHLA#)eeJ$JJ% hHȵhi 6L L%Ѕ$$ 8$ )eei$% i8х$% ӥN H$;) eeЅ$ i% i $hH i% hм lբ H$ JJ) ee )% )eЅ$ h (L|   LKL" L )i0ҩ ץeх 8хL/Ѕe i  ) hi%LO EȅЅi /i  /ԩLOLQЍȱ$ȱ%5# 5Lz vQLJLLK 0LP , LS ILH 8ɠ$ȩeȩLLe L!0!%$#  I%e)P(0U()C(&e((k( $,UL,Te L , 1 X   1LgLgϥΩb  X  ˅̅ͩ)((ȑ(ȑ(ޑ(ˑȥ̑ȥ͑  %IMKJ0L X 7ˠȑȑ=  La ,0` `%1L 0L `C IC`CL,aLm'ɠS)_KJ I M5QLmʥ)ʭpd`0 0 KLmJLm,`iPiLiiإ  JH h`H΅υ h`JJJJ)Liȥ) LiȥJJJJ) L iȥ)i`00 08``,T,Q`,T,V,S,P`e)P(((0e((e))` `$ȱ%ee% (e$((LȘee` )(xL4 (xL4 e)xL4 (xL4 e)PL4 (PL4 e)PL4 (PL4`(L$)ޤޢ)H0Lk h)e(H(hȱH0PLh)e(H(hȥi)Ь (LY PLY`% $e))(e$()'4H dhJJtb_6502-1.1/README.tb_65020100644000367200001440000000751210100624502013420 0ustar vinceusersTOM BOMBEM: Merciless Marauding Malicious Marketers 6502 Apple IIe Edition ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ http://www.deater.net/weave/vmwprod/tb1/tb_6502.html by Vince Weaver version 1.1 -- 24 July 2004 Quotes about tb_6502: ~~~~~~~~~~~~~~~~~~~~~ "The graphics are crude and blocky." -- random Atari 2600 developer System Requirements: ~~~~~~~~~~~~~~~~~~~~ Apple ][ Computer At least 32kB of RAM Disk drive, or Super Serial Card to load game Background: ~~~~~~~~~~~ You are Tom Bombem, a shy new intern on Moonbase Alpha. Somewhat against your will it has become your job to defend Earth! See the "Story" option in the game for the rest of the story. tb_6502 comes before "tb1: Invasion of the Inanimate Objects" chronologically, for those who might care. Keybindings: ~~~~~~~~~~~ Use arrow keys, or i,j,k,m to manuever and navigate menus. ' ' shoots and selects. 'h' displays help. 's' toggles sound 'p' pauses Options/Hiscore File: ~~~~~~~~~~~~~~~~~~~~~ not implemented yet Game Play: ~~~~~~~~~~ Manuever your ship avoiding the falling objects. Shoot them. Only 2 missiles can be in the air at the time [this is _not_ a bug. it's a limit of your ship's missile guidance system]. Every 100 points your shields will increase. There are special bonuses you can earn at the end of each level. + No Shields Hit : going through an entire level without having an enemy hit your ship + All Enemies Destroyed : all enemies were destroyed before scrolling off the screen. [Note, ramming an enemy with your ship _DOES_ count as destroying it. Just don't let them get by you] + Perfect Shot: Every missile fired hits an enemy. At the end each level you fight the boss. Then the game starts over with the enemies moving faster! Compiling / Running: ~~~~~~~~~~~~~~~~~~~~ RUNNING: Just obtain an apple emulator. Point it to the tb_6502.dsk image. Upon booting it should run! Also, you can get a real Apple II computer and download the disk image to a real floppy. That is a bit more complicated. COMPILING: The following compile instructions assume you are using Linux. * first you need the c65 package from: http://www.cc65.org/ To install cc65 you need to unpack, and do a "make -f make/gcc.mak" from the cc65/src directory. The utils we need are ca65 and ld65. Copy them somewhere in your path (ie /usr/local/bin). * To make the disk image you will need the dos33fsprogs package of mine, available from: http://www.deater.net/weave/vmwprod/apple/dos33fs.html Unpack and instal. "make; make install" * Now hopefully just type "make" in the tb_6502 directory and the program should be assembled. "make disk" should copy the new version to the disk image, assuming all the tools are installed properly. About: ~~~~~~ When I was much younger, I would type in BASIC games on the Apple II. I always wanted to write games myself, but the ones I wrote in BASIC were too slow. I was just starting to learn assembly when we got a 386 and I moved on to other things. But now, only 25 years too late, I finally wrote a playable game! The hope is maybe eventually using this as a stepping-board to creating a Game Boy Advance TomBombem game. This game was originally written for the 4k mini-game competition. It finished embarassingly low in the standings. I've added some more features now so it is well over the 4k mark. Author: ~~~~~~~ Vince Weaver http://www.deater.net/weave/ Special Thanks to KRG 24 July 2004 tb_6502-1.1/SINCOS0100644000367200001440000000022207647331007012411 0ustar vinceusers PI3.14159265358979+X039C(Y10((X40)2PI)J-1Y2X,(Y20)`72x9Y10((X40)2PI):X,(Y20)<X tb_6502-1.1/FAQ.tb_65020100644000367200001440000001740610076635200013106 0ustar vinceusersFAQ. Some questions shamelessly stolen from the tb_asm FAQ Q. Why? A. My friend John got a Gameboy Advance for Christmas. He suggested I port my game Tom Bombem to it. In actuality the specs of the GBA are similar to the machine I originally wrote TB1 on. It was on a 386-33 with 320x200x256 graphics and constrained to 640kB of RAM. The game was written in 16-bit PASCAL with some 32-bit assembly. I somehow got side-tracked into an 8k Linux x86 text-mode version first, and then it seemed obvious to port it to the 6502. Finally the disks full of poorly written way-to-slow BASIC space games I wrote when I was in elementary school have been vindicated! Q. The game runs too fast/too slow! It is unplayable! A. The game has been balanced and tested on an actual Apple IIe platinum. If you are running on an emulator, your emulator probably isn't emulating 100% accurately. If you are on a real Apple IIe... well it's probably my fault. If you're clever you can find the timing code in the source and fix it yourself. Q. Why did it take you so long to finish? A. I originally rushed to get this game entered in the 2003 Minigames Competition in the 4k game section. I had to cut down on the features a lot to get it to fit in 4k. Despite all this work, I finished 53rd or so. Most of the complaints were negative because there aren't that many good Apple ][ emulators out there, but a highlight was the infamous "blocky graphics" comment by the Atari 2600 programmer. Anyway this experience burned me out on the whole concept for a bit, plus I started grad school which sucked up most of my time. But anyway I got a chance to finish it this summer. Q. How did you do the graphics? A. With The Gimp. Used 16 color indexed palette. Saved as xpm. Edited with text editor. Q. Why LOW-RES graphics mode? A. Because I like 16 colors. High-res on the Apple ][ really isn't all that great and can only do 4 colors or so with weird placement rules. And all of you people with Atari 800s and Commodore's feel free to laugh. But my code here will run in full 16 color mode even on the Original Apple ][ released in 1977. In any case I like blocky graphics, probably dating to my time doing ANSI graphics for BBS's in the early 90s. And don't think low-res mode was a cheating way out. The Apple ][ framebuffer is _horribly_ convoluted and non-linear. Apparently this saved some chips on the memory refresh... but man is it a pain to program. Q. Why is all the text in this game SHOUTING AT ME? A. For extra perversity, I want the game to work on all machines back to the original 1977 Apple ][. Lower-case letters were an optional add-on until the Apple //e came out much later. Q. What is the high score? A. A bit of a silly question as its impossible to prove. The highest _possible_ score is 9999 I am pretty sure, due to the limitations of a 16 bit BCD number (which is how the score is stored). Q. Why does the ship have its engines constantly on, even though it is moving at a constant velocity? A. Ummmm... friction. Yeah... space friction. Q. Why are the stars moving so quickly? Are you going faster than light? A. If you look closely you'll notice the stars repeat. Hence you are really flying very fast in a big circle. Hey, maybe that's why the engine is constantly firing! Q. Where in that tiny ship are all of those missiles stored? A. In the seventh dimension. Q. Why the seventh dimension? A. The others were all full. Q. Why is there a guinea pig in the game? A. A local guinea pig threatened me with violence if I did not include a picture of her. Q. What have you learned from all this assembly programming? A. I'm just reminded what Professor Bruce Jacob always said... A computer is just a state machine. Q. Why are there only 6 enemies / 2 missiles / shields go up at 100/ etc? A. Game balance. Just trying to keep it challenging yet not overwhlmingly so. [For the original tb1 it was "because my 386 can't keep up" but that should be less of a problem these days]. If you _must_ have it some other way, feel free to mess with the constants on the first page of the tb_6502.s file, but I cannot guarantee what the consequences might be! Q. Will there be a sequel? A. Yes, it will be released shortly before either the release of "Duke Nukem Forever (tm)" or the heat death of the universe, which ever happens first. Q. Why can't Vince stay consitent between "HISCORE" and "HIGH SCORE" including all possibly variations of "HI-SCORE" "HIGH_SCORE" usw? A. The world may never know. Q. What does "usw" mean? A. Und So Weiter. Q. That wasn't helpful. A. This isn't a question. Q. What's the highest level you can get to? A. No matter how you try, once you get to level 7 it will keep repeating. This is because I multiply the level by 16 in various places for enemy movement, and it it goes above 7 then the byte will be negative causing Bad Things(tm) to happen. Q. Well why don't you modify the code so it doesn't go haywire after level 7? A. I am lazy. Also it should be too hard to get to level 7 anyway Q. What are the enemies supposed to be? A. An envelope, a clip-board, a cigarette, a telephone, a dollar-bill, and an un-identified yellow thing, possibly a banana. All things malicious marketers might have in excess. The apple II version has in addition a green toothbrush and a purple toupe. Those wacky marketers! Q. How come the stars appear in straight bands insteas of scattered in the sky? A. Because my pseudo-random number algorithm is at times more pseudo than random. Q. Why does vince use the stack so often, when it would make much more sense to backup the Y register to the zero page? A. Too much intel x86 programming has warped my mind into thinking stack usage is a good way of mitigating limited register count. Must remind myself the zero page is like a 256-byte register file. Q. Why is the 6502 instruction set so obtuse? A. I HAVE NO IDEA. In coding I keep stumbling across instructions that I think would be _so_ useful. But they don't exist. But apparently the instructions I pine for are fairly obvious... an enhanced 65C02 was released with "bonus" opcodes. Sadly I cannot use them because of the aforementioned want of Apple ][ compatibility [the 65C02 wasn't around until the //e. ABS (IND), X indexing : would be great working with structs. BRA -- Branch Always : a great opcode name, but also remove the need for 16-bit absolute JMP's when a short branch would do DEA -- Decrement Accumulator : That's right, there's no way to decrement the accumulator. You have to CLC clear carry then ADC $FF. Yet you can dec X or Y with one-byte. Weird. INA -- Incrememnt Accumlator: See DEA. Yes, even more perverse. Taking 3 bytes to do what should be a common task. PHX/PLX PHY/PLY -- Push/Pop X/Y : These would be so useful. Otherwise you can only push/pop the accumulator. STZ -- Store Zero to Memory : Would save a lot of LDA #$0 / STA pairs. TRB/TSB -- Test and Set/Reset bit: Wow, getting even more CISC here. Atomic test/set bit instructions. We're ready for SMP now. tb_6502-1.1/TODO0100644000367200001440000000004410076616177012166 0ustar vinceusersSave high score to disk. OPTIMIZE!