diff --git a/games/sb/Makefile b/games/sb/Makefile index b2f7d6d3..ec925014 100644 --- a/games/sb/Makefile +++ b/games/sb/Makefile @@ -12,7 +12,7 @@ all: sb.dsk #### -sb.dsk: QBOOT QLOAD TITLE DUCK_POND ROOF ASPLODE BACK_OFF TARGET CLIFF RAT +sb.dsk: QBOOT QLOAD TITLE DUCK_POND ROOF ASPLODE BACK_OFF TARGET ./cliff/CLIFF RAT cp $(EMPTY_DISK) sb.dsk $(DOS33_RAW) sb.dsk 0 0 QBOOT 0 1 $(DOS33_RAW) sb.dsk 0 2 QBOOT 1 1 @@ -23,7 +23,7 @@ sb.dsk: QBOOT QLOAD TITLE DUCK_POND ROOF ASPLODE BACK_OFF TARGET CLIFF RAT $(DOS33_RAW) sb.dsk 10 0 ROOF 0 0 $(DOS33_RAW) sb.dsk 15 0 ASPLODE 0 0 $(DOS33_RAW) sb.dsk 20 0 TARGET 0 0 - $(DOS33_RAW) sb.dsk 25 0 CLIFF 0 0 + $(DOS33_RAW) sb.dsk 25 0 ./cliff/CLIFF 0 0 $(DOS33_RAW) sb.dsk 30 0 RAT 0 0 $(DOS33_RAW) sb.dsk 32 0 BACK_OFF 0 0 @@ -97,16 +97,19 @@ back_off.o: back_off.s zx02_optim.s \ #### -CLIFF: cliff.o - ld65 -o CLIFF cliff.o -C $(LINKER_SCRIPTS)/apple2_6000.inc +./cliff/CLIFF: + cd cliff && make -cliff.o: cliff.s zx02_optim.s \ - cliff_graphics/cliff_base.hgr.zx02 \ - zp.inc hardware.inc - ca65 -o cliff.o cliff.s -l cliff.lst +#CLIFF: cliff.o +# ld65 -o CLIFF cliff.o -C $(LINKER_SCRIPTS)/apple2_6000.inc -cliff_graphics/cliff_base.hgr.zx02: - cd cliff_graphics && make +#cliff.o: cliff.s zx02_optim.s \ +# cliff_graphics/cliff_base.hgr.zx02 \ +# zp.inc hardware.inc +# ca65 -o cliff.o cliff.s -l cliff.lst + +#cliff_graphics/cliff_base.hgr.zx02: +# cd cliff_graphics && make #### diff --git a/games/sb/cliff.s b/games/sb/cliff.s deleted file mode 100644 index 78330f69..00000000 --- a/games/sb/cliff.s +++ /dev/null @@ -1,74 +0,0 @@ -; Cliff climb minigame from Peasant's Quest -; -; Yet Another HR project -; -; by deater (Vince Weaver) - - -.include "zp.inc" -.include "hardware.inc" - - -hires_start: - - ;=================== - ; set graphics mode - ;=================== - jsr HOME - - bit HIRES - bit FULLGR - bit SET_GR - bit PAGE1 - - - ;=================== - ; Load graphics - ;=================== -load_loop: - - ;============================= - - - ;========================== - ; Load Image - ;=========================== - -load_image: - - ; size in ldsizeh:ldsizel (f1/f0) - - lda #comp_data - sta ZX0_src+1 - - - lda #$20 - - - jsr full_decomp - -; rts - - - -wait_until_keypress: - lda KEYPRESS ; 4 - bpl wait_until_keypress ; 3 - bit KEYRESET ; clear the keyboard buffer - -which_ok: - lda #0 - sta WHICH_LOAD - rts - - - - - - .include "zx02_optim.s" - - -comp_data: - .incbin "cliff_graphics/cliff_base.hgr.zx02" diff --git a/games/sb/cliff/Makefile b/games/sb/cliff/Makefile new file mode 100644 index 00000000..a976be59 --- /dev/null +++ b/games/sb/cliff/Makefile @@ -0,0 +1,30 @@ +include ../../../Makefile.inc + +ZX02 = ~/research/6502_compression/zx02.git/build/zx02 +PNG_TO_HGR = ../../utils/hgr-utils/png2hgr +LINKER_SCRIPTS = ../../../linker_scripts +DOS33 = ../../utils/dos33fs-utils/dos33 +DOS33_RAW = ../../utils/dos33fs-utils/dos33_raw +EMPTY_DISK = ../../empty_disk/empty.dsk +TOKENIZE = ../../utils/asoft_basic-utils/tokenize_asoft + +all: CLIFF + +#### + +CLIFF: cliff.o + ld65 -o CLIFF cliff.o -C $(LINKER_SCRIPTS)/apple2_6000.inc + +cliff.o: cliff.s ../zx02_optim.s \ + cliff_graphics/cliff_base.hgr.zx02 \ + zp.inc hardware.inc + ca65 -o cliff.o cliff.s -l cliff.lst + +cliff_graphics/cliff_base.hgr.zx02: + cd cliff_graphics && make + +#### + +clean: + rm -f *.lst *.o CLIFF + cd cliff_graphics && make clean diff --git a/games/sb/cliff/cliff.s b/games/sb/cliff/cliff.s new file mode 100644 index 00000000..940ee6bf --- /dev/null +++ b/games/sb/cliff/cliff.s @@ -0,0 +1,161 @@ +; Cliff climb minigame from Peasant's Quest +; +; Yet Another HR project +; +; by deater (Vince Weaver) + + +.include "zp.inc" +.include "hardware.inc" + +;div7_table = $400 +;mod7_table = $500 +;hposn_high = $600 +;hposn_low = $700 + +div7_table = $b800 +mod7_table = $b900 +hposn_high = $ba00 +hposn_low = $bb00 + +cliff_base: + + ;=================== + ; set graphics mode + ;=================== + jsr HOME + + bit HIRES + bit FULLGR + bit SET_GR + bit PAGE1 + + lda #0 + sta LEVEL_OVER + sta FRAME + + lda #10 + sta PEASANT_X + lda #100 + sta PEASANT_Y + + jsr hgr_make_tables + + + ;=================== + ; Load graphics + ;=================== + + lda #priority_data + sta ZX0_src+1 + + lda #$20 ; temporarily load to $2000 + + jsr full_decomp + + ; copy to $400 + + jsr gr_copy_to_page1 + + + + ;============================= + + + ;========================== + ; Load Image + ;=========================== + +load_image: + + ; size in ldsizeh:ldsizel (f1/f0) + + lda #bg_data + sta ZX0_src+1 + + + lda #$20 + + jsr full_decomp + + jsr hgr_copy + + + + ;========================== + ;========================== + ; main loop + ;========================== + ;========================== +game_loop: + + ;===================== + ; move peasant + + jsr move_peasant + + ;===================== + ; draw peasant + + jsr draw_peasant + + ;===================== + ; increment frame + + inc FRAME + + ;===================== + ; check keyboard + + jsr check_keyboard + + lda LEVEL_OVER + bne done_cliff + + ; delay + + lda #200 + jsr wait + + jmp game_loop + + +done_cliff: + lda #0 + sta WHICH_LOAD + rts + + + .include "../hgr_tables.s" + + .include "../zx02_optim.s" + + .include "wait.s" + + .include "keyboard.s" + + .include "draw_peasant.s" + + .include "move_peasant.s" + + .include "hgr_partial_save.s" + + .include "hgr_1x28_sprite_mask.s" + + .include "gr_copy.s" + .include "hgr_copy.s" + + .include "cliff_graphics/peasant_robe_sprites.inc" + +bg_data: + .incbin "cliff_graphics/cliff_base.hgr.zx02" + +priority_data: + + .incbin "cliff_graphics/cliff_base_priority.zx02" + + diff --git a/games/sb/cliff/cliff_graphics/Makefile b/games/sb/cliff/cliff_graphics/Makefile new file mode 100644 index 00000000..edee7e70 --- /dev/null +++ b/games/sb/cliff/cliff_graphics/Makefile @@ -0,0 +1,51 @@ +include ../../../../Makefile.inc + +ZX02 = ~/research/6502_compression/zx02.git/build/zx02 -f +PNG_TO_HGR = ../../../../utils/hgr-utils/png2hgr +PNG2GR = ../../../../utils/gr-utils/png2gr +PNG2SPRITES = ../../../../utils/gr-utils/png2sprites +HGR_SPRITE = ../../../../utils/hgr-utils/hgr_make_sprite + +all: cliff_base.hgr.zx02 peasant_robe_sprites.inc \ + cliff_base_priority.zx02 + +#### + +peasant_robe_sprites.inc: peasant_sprites.png + $(HGR_SPRITE) -l peasant_right1_sprite peasant_sprites.png 133 1 133 29 > peasant_robe_sprites.inc + $(HGR_SPRITE) -l peasant_right1_mask peasant_sprites.png 119 1 119 29 >> peasant_robe_sprites.inc + $(HGR_SPRITE) -l peasant_right2_sprite peasant_sprites.png 133 34 133 62 >> peasant_robe_sprites.inc + $(HGR_SPRITE) -l peasant_right2_mask peasant_sprites.png 119 34 119 62 >> peasant_robe_sprites.inc + $(HGR_SPRITE) -l peasant_up1_sprite peasant_sprites.png 133 68 133 96 >> peasant_robe_sprites.inc + $(HGR_SPRITE) -l peasant_up1_mask peasant_sprites.png 119 68 119 96 >> peasant_robe_sprites.inc + $(HGR_SPRITE) -l peasant_up2_sprite peasant_sprites.png 133 102 133 130 >> peasant_robe_sprites.inc + $(HGR_SPRITE) -l peasant_up2_mask peasant_sprites.png 119 102 119 130 >> peasant_robe_sprites.inc + $(HGR_SPRITE) -l peasant_left1_sprite peasant_sprites.png 182 1 188 29 >> peasant_robe_sprites.inc + $(HGR_SPRITE) -l peasant_left1_mask peasant_sprites.png 168 1 174 29 >> peasant_robe_sprites.inc + $(HGR_SPRITE) -l peasant_left2_sprite peasant_sprites.png 182 34 188 62 >> peasant_robe_sprites.inc + $(HGR_SPRITE) -l peasant_left2_mask peasant_sprites.png 168 34 174 62 >> peasant_robe_sprites.inc + $(HGR_SPRITE) -l peasant_down1_sprite peasant_sprites.png 182 68 188 96 >> peasant_robe_sprites.inc + $(HGR_SPRITE) -l peasant_down1_mask peasant_sprites.png 168 68 174 96 >> peasant_robe_sprites.inc + $(HGR_SPRITE) -l peasant_down2_sprite peasant_sprites.png 182 102 188 130 >> peasant_robe_sprites.inc + $(HGR_SPRITE) -l peasant_down2_mask peasant_sprites.png 168 102 174 130 >> peasant_robe_sprites.inc + +#### + +cliff_base.hgr.zx02: cliff_base.hgr + $(ZX02) cliff_base.hgr cliff_base.hgr.zx02 + +cliff_base.hgr: cliff_base.png + $(PNG_TO_HGR) cliff_base.png > cliff_base.hgr + +#### + +cliff_base_priority.zx02: cliff_base_priority.gr + $(ZX02) -f cliff_base_priority.gr cliff_base_priority.zx02 + +cliff_base_priority.gr: cliff_base_priority.png + $(PNG2GR) cliff_base_priority.png cliff_base_priority.gr + +#### + +clean: + rm -f *~ *.o *.zx02 *.lst peasant_robe_sprites.inc diff --git a/games/sb/cliff_graphics/cliff_base.png b/games/sb/cliff/cliff_graphics/cliff_base.png similarity index 100% rename from games/sb/cliff_graphics/cliff_base.png rename to games/sb/cliff/cliff_graphics/cliff_base.png diff --git a/games/sb/cliff/cliff_graphics/cliff_base_priority.png b/games/sb/cliff/cliff_graphics/cliff_base_priority.png new file mode 100644 index 00000000..5dbd87f0 Binary files /dev/null and b/games/sb/cliff/cliff_graphics/cliff_base_priority.png differ diff --git a/games/sb/cliff/cliff_graphics/peasant_sprites.png b/games/sb/cliff/cliff_graphics/peasant_sprites.png new file mode 100644 index 00000000..1efa458f Binary files /dev/null and b/games/sb/cliff/cliff_graphics/peasant_sprites.png differ diff --git a/games/sb/cliff/draw_peasant.s b/games/sb/cliff/draw_peasant.s new file mode 100644 index 00000000..949523ba --- /dev/null +++ b/games/sb/cliff/draw_peasant.s @@ -0,0 +1,116 @@ + + ;============================ + ; draw peasant + ;============================ +draw_peasant: + + ; skip if room over, as otherwise we'll draw at the + ; wrong edge of screen + + lda LEVEL_OVER + bne done_draw_peasant + + lda PEASANT_X + sta CURSOR_X + lda PEASANT_Y + sta CURSOR_Y + + lda PEASANT_DIR + cmp #PEASANT_DIR_RIGHT + beq peasant_right + cmp #PEASANT_DIR_LEFT + beq peasant_left + cmp #PEASANT_DIR_DOWN + beq peasant_down + + ; else we are up + + ;===================== + ; up up up up +peasant_up: + + lda PEASANT_Y + and #4 + beq peasant_up1 + +peasant_up2: + lda #peasant_up2_sprite + jmp done_pick_draw + +peasant_up1: + lda #peasant_up1_sprite + jmp done_pick_draw + + ;===================== + ; down down down +peasant_down: + + lda PEASANT_Y + and #4 + beq peasant_down1 + +peasant_down2: + lda #peasant_down2_sprite + jmp done_pick_draw + +peasant_down1: + lda #peasant_down1_sprite + jmp done_pick_draw + + ;===================== + ; left left left + +peasant_left: + lda CURSOR_X + and #1 + bne draw_left1 + +draw_left2: + lda #peasant_left2_sprite + jmp done_pick_draw + +draw_left1: + lda #peasant_left1_sprite + jmp done_pick_draw + + +peasant_right: + lda CURSOR_X + and #1 + bne draw_right1 + +draw_right2: + lda #peasant_right2_sprite + jmp done_pick_draw + +draw_right1: + lda #peasant_right1_sprite + +done_pick_draw: + sta INH + + jsr hgr_draw_sprite_1x28 + +done_draw_peasant: + + rts + + +;.include "sprites/peasant_sprites.inc" +;.include "sprites/peasant_robe_sprites.inc" diff --git a/games/sb/cliff/gr_copy.s b/games/sb/cliff/gr_copy.s new file mode 100644 index 00000000..ddb537f0 --- /dev/null +++ b/games/sb/cliff/gr_copy.s @@ -0,0 +1,39 @@ + ;========================================================= + ; gr_copy_to_page1, 40x48 version + ;========================================================= + ; copy $2000 to $400, careful to avoid screen holes + +gr_copy_to_page1: + + ldy #119 ; for early ones, copy 120 bytes ; 2 + +gr_copy_line: + lda $2000,Y ; load a byte (self modified) ; 4 + sta $400,Y ; store a byte (self modified) ; 5 + + lda $2080,Y ; load a byte (self modified) ; 4 + sta $480,Y ; store a byte (self modified) ; 5 + + lda $2100,Y ; load a byte (self modified) ; 4 + sta $500,Y ; store a byte (self modified) ; 5 + + lda $2180,Y ; load a byte (self modified) ; 4 + sta $580,Y ; store a byte (self modified) ; 5 + + lda $2200,Y ; load a byte (self modified) ; 4 + sta $600,Y ; store a byte (self modified) ; 5 + + lda $2280,Y ; load a byte (self modified) ; 4 + sta $680,Y ; store a byte (self modified) ; 5 + + lda $2300,Y ; load a byte (self modified) ; 4 + sta $700,Y ; store a byte (self modified) ; 5 + + lda $2380,Y ; load a byte (self modified) ; 4 + sta $780,Y ; store a byte (self modified) ; 5 + + dey ; decrement pointer ; 2 + bpl gr_copy_line ; ; 2nt/3 + + rts ; 6 + diff --git a/games/sb/cliff/gr_offsets.s b/games/sb/cliff/gr_offsets.s new file mode 100644 index 00000000..d3af91f7 --- /dev/null +++ b/games/sb/cliff/gr_offsets.s @@ -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 + diff --git a/games/sb/cliff/hardware.inc b/games/sb/cliff/hardware.inc new file mode 100644 index 00000000..97d6d13b --- /dev/null +++ b/games/sb/cliff/hardware.inc @@ -0,0 +1,105 @@ +; 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 foreground / background colors +NEWVIDEO = $C029 ; IIgs graphics modes +SPEAKER = $C030 +CLOCKCTL = $C034 ; bits 0-3 are IIgs border color +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 + +LCBANK2 = $C083 +LCBANK1 = $C08B + +; 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 +;SETCOL = $F864 ; COLOR=A +;ROM_TEXT2COPY = $F962 ; iigs +TEXT = $FB36 ; qboot +;TABV = $FB5B ; VTAB to A +ROM_MACHINEID = $FBB3 ; iigs +;BELL = $FBDD ; ring the bell +;BASCALC = $FBC1 ; +;VTAB = $FC22 ; VTAB to CV +HOME = $FC58 ; Clear the text screen ; qboot +;WAIT = $FCA8 ; delay 1/2(26+27A+5A^2) us +;CROUT1 = $FD8B +;SETINV = $FE80 ; INVERSE +;SETNORM = $FE84 ; NORMAL +COUT = $FDED ; output A to screen ; qboot +COUT1 = $FDF0 ; output A to screen ; qload + + + + + + + +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 + diff --git a/games/sb/cliff/hgr_1x28_sprite_mask.s b/games/sb/cliff/hgr_1x28_sprite_mask.s new file mode 100644 index 00000000..35312f6f --- /dev/null +++ b/games/sb/cliff/hgr_1x28_sprite_mask.s @@ -0,0 +1,309 @@ + ;=============================================== + ; hgr 1x28 draw sprite, with bg mask in GR $400 + ;=============================================== + ; used primarily to draw Rather Dashing + ;=============================================== + ; + ; SPRITE in INL/INH + ; Location at CURSOR_X CURSOR_Y + + ; for now, BG mask is only all or nothing + ; so we just skip drawing if behind + + ; sprite AT INL/INH + ; mask at INL/INH + 28 + +hgr_draw_sprite_1x28: + + lda #0 + sta MASK_COUNTDOWN + + ; calculate peasant priority + ; based on head + + lda PEASANT_Y + sec + sbc #48 ; Y=48 + lsr ; div by 8 + lsr + lsr + clc + adc #2 + sta PEASANT_PRIORITY + + ; set up sprite pointers + lda INL + sta h728_smc1+1 + lda INH + sta h728_smc1+2 + + ; set up mask pointers + clc + lda INL + adc #28 + sta h728_smc3+1 + lda INH + adc #0 + sta h728_smc3+2 + + ldx #0 ; X is row counter +hgr_1x28_sprite_yloop: + lda MASK_COUNTDOWN + and #$3 ; only update every 4th + bne mask_good + + txa + pha ; save X + + ; recalculate mask + txa + clc + adc CURSOR_Y + tax + ldy CURSOR_X + jsr update_bg_mask + + + pla ; restore X + tax + +mask_good: + lda MASK + bne draw_sprite_skip + + + txa ; X is current 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 + sta GBASH + + ldy CURSOR_X + + lda (GBASL),Y ; load background +h728_smc3: + and $d000,X ; mask with sprite mask +h728_smc1: + ora $d000,X ; or in sprite + sta (GBASL),Y ; store out + + +draw_sprite_skip: + + inc MASK_COUNTDOWN + + inx + cpx #28 + bne hgr_1x28_sprite_yloop + + rts + +.if 0 + ;====================== + ; save bg 1x28 + ;====================== + +bsave_bg_1x28: + + ldx #0 +save_yloop: + txa + pha + + clc + adc CURSOR_Y + + + ; calc GBASL/GBASH + + tax + lda hposn_low,X + sta GBASL + lda hposn_high,X + sta GBASH + + pla + tax + + ldy CURSOR_X + + lda (GBASL),Y + sta save_sprite_1x28,X + + inx + cpx #28 + bne save_yloop + + rts +.endif + + ;====================== + ; restore bg 1x28 + ;====================== + +restore_bg_1x28: + + ; restore bg behind peasant + + ; is this actually faster than using the generic version? + + ldy CURSOR_Y ; y start point + + ldx #27 ; height + +restore_yloop: + ; calc GBASL/GBASH using lookup table + + clc + lda hposn_low,Y + adc PEASANT_X + sta restore_page1_smc+1 + sta restore_page2_smc+1 + + ; $40 -> $20 0100 0000 -> 0010 0000 + ; $41 -> $21 0100 0001 -> 0010 0001 + ; $51 -> $31 0101 0011 -> 0101 0001 + + lda hposn_high,Y + sta restore_page2_smc+2 + eor #$60 + sta restore_page1_smc+2 + +restore_page1_smc: + lda $DDDD +restore_page2_smc: + sta $DDDD + + iny + + dex + bpl restore_yloop + + rts + + + ;=================== + ; update_bg_mask + ;=================== + ; newx/7 in Y + ; newy in X + ; updates MASK +update_bg_mask: + + ; rrrr rtii top 5 bits row, bit 2 top/bottom + + sty xsave +mask_try_again: + stx ysave + + txa + and #$04 ; see if odd/even + beq bg_mask_even + +bg_mask_odd: + lda #$f0 + bne bg_mask_mask ; bra + +bg_mask_even: + lda #$0f +bg_mask_mask: + + sta MASK + + txa + lsr + lsr ; need to divide by 8 then * 2 + lsr ; can't just div by 4 as we need to mask bottom bit + asl + tax + + lda gr_offsets,X + sta BASL + lda gr_offsets+1,X + sta BASH + + lda (BASL),Y + + ldy MASK + cpy #$f0 + bne mask_bottom +mask_top: + lsr + lsr + lsr + lsr + jmp mask_mask_mask +mask_bottom: + and #$0f +mask_mask_mask: + sta MASK + + cmp #$0 ; 0 means collision, find mask + bne mask_not_zero ; by iteratively going down till + ldx ysave ; non-zero + ldy xsave + inx + inx + inx + inx + jmp mask_try_again + +mask_not_zero: + cmp #$f ; priority F means always on top + beq mask_true + + cmp PEASANT_PRIORITY + beq mask_false ; branch less than equal + bcc mask_false ; blt + +mask_true: + lda #$ff + sta MASK + rts + +mask_false: + lda #$00 + sta MASK + rts + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; priorities +; 0 = collision +; 1 = bg = always draw ; Y-48 +; 2 0-55 +; 3 56-63 ; 8/8+2 = 3 +; 4 64-71 ; 16/8+2 = 4 +; 5 72-79 +; 6 80-87 ; 32/8+2 = 6 +; 7 88-95 +; 8 96-103 +; 9 104-111 +; 10 112-119 +; 11 120-127 +; 12 128-135 ; 8 +; 13 136-143 +; 14 144-151 +; 15 = fg = always hide +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;==================== +; save area +;==================== + +;save_sprite_1x28: +;.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 +;.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 + +ysave: +.byte $00 +xsave: +.byte $00 diff --git a/games/sb/cliff/hgr_copy.s b/games/sb/cliff/hgr_copy.s new file mode 100644 index 00000000..c44c0d02 --- /dev/null +++ b/games/sb/cliff/hgr_copy.s @@ -0,0 +1,40 @@ + ;========================================================= + ; hgr copy from $2000 to $4000 + ;========================================================= + ; copy $2000 to $4000 + + ; intentionally slow for the miniblind effect + +hgr_copy: + lda #0 ; blurgh + sta INL + sta OUTL + + lda #$20 + sta INH + lda #$40 + sta OUTH + + + ldy #0 +hgr_copy_outer: + +hgr_copy_inner: + lda #1 + jsr wait + + lda (INL),Y + sta (OUTL),Y + iny + bne hgr_copy_inner + + inc INH + inc OUTH + lda OUTH + cmp #$60 + bne hgr_copy_outer + + rts + + + diff --git a/games/sb/cliff/hgr_partial_save.s b/games/sb/cliff/hgr_partial_save.s new file mode 100644 index 00000000..7c983c2d --- /dev/null +++ b/games/sb/cliff/hgr_partial_save.s @@ -0,0 +1,89 @@ + ;======================= + ; HGR Partial Save + ;======================= + ; loads from $40 + ; save to $20 + ; only save from row in P2 to P2+P4 +.if 0 +hgr_partial_save: + + clc + lda BOX_Y1 + sta SAVED_Y1 + + ldx BOX_Y2 + stx SAVED_Y2 + +partial_save_yloop: + + lda hposn_low,X + sta psx_smc1+1 + sta psx_smc2+1 + + lda hposn_high,X + sta psx_smc1+2 + sec + sbc #$20 + sta psx_smc2+2 + + ldy #$27 +partial_save_xloop: +psx_smc1: + lda $d000,Y +psx_smc2: + sta $d000,Y + dey + bpl partial_save_xloop + + dex + cpx BOX_Y1 + bcs partial_save_yloop + + rts +.endif + + + ;======================= + ; HGR Partial Restore + ;======================= + ; loads from $20 + ; save to $40 + + ; restores from X = A<=to<=X + ; Y = SAVED_Y1 to SAVED_Y2 + +hgr_partial_restore: + sta partial_restore_x1_smc+1 + stx partial_restore_x2_smc+1 + + ldx SAVED_Y2 + +partial_restore_yloop: + + lda hposn_low,X + sta prx_smc2+1 + sta prx_smc1+1 + + lda hposn_high,X + sta prx_smc2+2 + sec + sbc #$20 + sta prx_smc1+2 + +partial_restore_x2_smc: + ldy #$27 +partial_restore_xloop: +prx_smc1: + lda $d000,Y +prx_smc2: + sta $d000,Y + dey +partial_restore_x1_smc: + cpy #$00 + bpl partial_restore_xloop + + dex + cpx SAVED_Y1 + bcs partial_restore_yloop ; bge + + rts diff --git a/games/sb/cliff/keyboard.s b/games/sb/cliff/keyboard.s new file mode 100644 index 00000000..17337067 --- /dev/null +++ b/games/sb/cliff/keyboard.s @@ -0,0 +1,152 @@ + + ;========================== + ; check keyboard + ; for main game + ;========================== + + ; Movement + ; Note in the game, pressing a key starts walking + ; To stop you have to press the same direction again + + ; Text + ; We require ENTER/RETURN pressed before entering text + ; this is mildly annoying, but lets us use + ; WASD to walk. The Apple II+ doesn't have + ; up or down buttons + +check_keyboard: + + lda KEYPRESS + bmi key_was_pressed + rts + +key_was_pressed: + inc SEEDL + + and #$5f ; strip off high bit and make uppercase + + ;========================== + ; Left + ;========================== +check_left: + cmp #$8 + beq left_pressed + cmp #'A' + bne check_right +left_pressed: ; if peasant_moving_left, stop + ; otherwise clear all movement, move left + + ldx PEASANT_XADD + + jsr stop_peasant + + cpx #$FF ; if not left, start moving left + beq continue_left + + lda #$FF ; move left + sta PEASANT_XADD + +continue_left: + lda #PEASANT_DIR_LEFT + sta PEASANT_DIR + + jmp done_check_keyboard + +check_right: + cmp #$15 + beq right_pressed + cmp #'D' + bne check_up +right_pressed: + + ldx PEASANT_XADD + + jsr stop_peasant + + cpx #$1 ; if already right, stop + beq continue_right + + lda #$1 + sta PEASANT_XADD + +continue_right: + lda #PEASANT_DIR_RIGHT + sta PEASANT_DIR + + jmp done_check_keyboard + +check_up: + cmp #'W' + beq up_pressed + cmp #$0B + bne check_down + +up_pressed: + + ldx PEASANT_YADD + + jsr stop_peasant + + cpx #$FC ; if already up, stop + beq continue_up + + lda #$FC + sta PEASANT_YADD + +continue_up: + + lda #PEASANT_DIR_UP + sta PEASANT_DIR + + + jmp done_check_keyboard + +check_down: + cmp #'S' + beq down_pressed + cmp #$0A + bne check_enter + +down_pressed: + + ldx PEASANT_YADD + + jsr stop_peasant + + cpx #$04 ; if already down, stop + beq continue_down + + lda #$4 + sta PEASANT_YADD + +continue_down: + lda #PEASANT_DIR_DOWN + sta PEASANT_DIR + + jmp done_check_keyboard + +check_enter: + cmp #13 + beq enter_pressed + cmp #' ' + bne done_check_keyboard +enter_pressed: +; jsr clear_bottom +; jsr hgr_input + +; jsr parse_input + +; jsr clear_bottom + +done_check_keyboard: + + bit KEYRESET + + rts + +stop_peasant: + lda #0 + sta PEASANT_XADD + sta PEASANT_YADD + rts + diff --git a/games/sb/cliff/move_peasant.s b/games/sb/cliff/move_peasant.s new file mode 100644 index 00000000..2c09b7f0 --- /dev/null +++ b/games/sb/cliff/move_peasant.s @@ -0,0 +1,253 @@ +; Move that Peasant! + +move_peasant: + + ; redraw peasant if moved + + lda PEASANT_XADD + ora PEASANT_YADD + bne really_move_peasant + + jmp peasant_the_same + +really_move_peasant: + + ; restore bg behind peasant + + jsr erase_peasant + + ;========================= + ;========================= + ; move peasant + ;========================= + ;========================= + + + ;========================== + ; first move in X direction + + clc + lda PEASANT_X + adc PEASANT_XADD ; A = new X + + bmi peasant_x_negative ; if newx <0, handle + + cmp #40 + bcs peasant_x_toobig ; if newx>=40, hanfle (bge) + + + ;====================================== + ; not off screen, so check if collision + + pha + + tay + ; FIXME: should we add YADD first, like we do in peasant_move_tiny? + + ldx PEASANT_Y + jsr peasant_collide + + pla + + bcc do_move_peasant_y ; no X collide + + ;================================== + ; we collided in X, so stop moving + + jsr stop_peasant ; stop moving + + ; leave PEASANT_X same as was + lda PEASANT_X + jmp do_move_peasant_y + + ;============================ +peasant_x_toobig: + + jsr move_map_east + + lda #0 ; new X location + + jmp done_movex + + ;============================ +peasant_x_negative: + + jsr move_map_west + + lda #39 ; new X location + + jmp done_movex + + ; check edge of screen +done_movex: + ; if we get here we changed screens + sta PEASANT_X ; update new location + jmp peasant_the_same ; skip checking for Y collision + + + + ; Move Peasant Y +do_move_peasant_y: + sta PEASANT_X + clc + lda PEASANT_Y + adc PEASANT_YADD ; newy in A + + cmp #45 ; if <45 then off screen + bcc peasant_y_negative ; blt + + cmp #160 ; if >=150 then off screen + bcs peasant_y_toobig ; bge + + ; check collide + + pha + + ldy PEASANT_X + tax ; newy + jsr peasant_collide + + pla + + bcc done_movey ; no collide + + jsr stop_peasant ; stop moving + + lda PEASANT_Y ; leave same + + jmp done_movey + + + ;============================ +peasant_y_toobig: + + jsr move_map_south + + lda #45 ; new X location + + jmp done_movey + + + ;============================ +peasant_y_negative: + + jsr move_map_north + + lda #160 ; new X location + + jmp done_movey + + ; check edge of screen +done_movey: + sta PEASANT_Y + + ; if we moved off screen, don't re-draw peasant ? + +peasant_the_same: + + rts + + + ;=========================== + ; erase peasant + ;=========================== + + ; restore bg behind peasant +erase_peasant: + lda PEASANT_Y + sta SAVED_Y1 + clc + adc #28 + sta SAVED_Y2 + + ldx PEASANT_X + txa + inx + + jmp hgr_partial_restore ; tail call + + + + +; when peasants collide + + ;=================== + ; peasant_collide + ;=================== + ; newx/7 in Y + ; newy in X + ; returns C=0 if no collide + ; C=1 if collide +peasant_collide: + ; rrrr rtii top 5 bits row, bit 2 top/bottom + + ; add 28 to collide with feet + txa + clc + adc #28 + tax + + txa + and #$04 ; see if odd/even + beq peasant_collide_even + +peasant_collide_odd: + lda #$f0 + bne peasant_collide_mask ; bra + +peasant_collide_even: + lda #$0f +peasant_collide_mask: + + sta MASK + + txa + lsr + lsr ; need to divide by 8 then * 2 + lsr ; can't just div by 4 as we need to mask bottom bit + asl + tax + + lda gr_offsets,X + sta INL + lda gr_offsets+1,X + sta INH + + lda (INL),Y ; get value + + and MASK + +; ldy MASK +; cpy #$f0 +; beq in_top +;in_bottom: +; and #$0f +; jmp done_feet +;in_top: +; lsr +; lsr +; lsr +; lsr +;done_feet: + + beq collide_true ; true if color 0 + ;bne collide_false + +collide_false: + clc + rts + +collide_true: + sec + rts + + +move_map_east: +move_map_west: +move_map_north: +move_map_south: + rts + + +.include "gr_offsets.s" + diff --git a/games/sb/cliff/wait.s b/games/sb/cliff/wait.s new file mode 100644 index 00000000..12c4319c --- /dev/null +++ b/games/sb/cliff/wait.s @@ -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" diff --git a/games/sb/cliff/zp.inc b/games/sb/cliff/zp.inc new file mode 100644 index 00000000..c260e6da --- /dev/null +++ b/games/sb/cliff/zp.inc @@ -0,0 +1,348 @@ + +JS_BUTTON_STATE = $03 +JOYSTICK_ENABLED= $04 +SOUND_STATUS = $05 + SOUND_DISABLED = $80 + SOUND_IN_LC = $01 ; sound in language card + SOUND_MOCKINGBOARD = $02 ; mockingboard detected + SOUND_SSI263 = $04 ; SSI-263 speech chip detected +MOCKINGBOARD_SLOT = $06 +DISP_PAGE = $07 ; only in videlectrix intro? +DRAW_PAGE = $08 +NIBCOUNT = $09 +CURRENT_DRIVE = $0A +DRIVE1_DISK = $0B +DRIVE2_DISK = $0C +DRIVE1_TRACK = $0D +DRIVE2_TRACK = $0E + +TEMP0 = $10 +TEMP1 = $11 +TEMP2 = $12 +TEMP3 = $13 +TEMP4 = $14 +TEMP5 = $15 + +; zx02 code +offset = $10 +offseth = $11 +ZX0_src = $12 +ZX0_dst = $14 +ZX0_srch= $15 +bitr = $16 +pntr = $17 +pntrh = $18 +; electric duet +FREQ1 = $10 +FREQ2 = $11 +DURATION = $12 +INSTRUMENT1 = $13 +INSTRUMENT2 = $14 +MADDRL = $15 +MADDRH = $16 +LOC4E = $4E +COUNT256 = $4F + + +HGR_BITS = $1C + +CH = $24 +CV = $25 +GBASL = $26 +GBASH = $27 +BASL = $28 +BASH = $29 +MASK = $2E +MASK_COUNTDOWN = $2F +PEASANT_PRIORITY = $30 + +SEEDL = $4E +SEEDH = $4F + + +INVENTORY_MASK = $60 +INVENTORY_Y = $61 + +CURSOR_X = $63 +CURSOR_Y = $64 +FRAME = $65 +ALTFIRE = $66 +ALTL = $67 +ALTH = $68 +SAVED_X = $69 +PEASANT_XADD = $6A +PEASANT_YADD = $6B +LEVEL_OVER = $6C + NEW_LOCATION = $FF + NEW_FROM_DISK = $01 + NEW_FROM_LOAD = $02 ; loaded from load/save menu +KERREK_SPEED = $6D +KERREK_DIRECTION= $6E ; 0 = left, 1=right + KERREK_LEFT = 0 + KERREK_RIGHT = 1 + + +SPEECH_PTRL = $70 +SPEECH_PTRH = $71 + +; pt3 player registers +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 + + +; 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 + +ESC_PRESSED = $8C +PREVIOUS_LOCATION= $8D + + + +;======================= +; savegame state +;======================= + +WHICH_LOAD = $90 +PEASANT_X = $91 +PEASANT_Y = $92 +PEASANT_DIR = $93 + PEASANT_DIR_UP = 0 + PEASANT_DIR_RIGHT = 1 + PEASANT_DIR_LEFT = 2 + PEASANT_DIR_DOWN = 3 + +GAME_STATE_3 = $94 +; SWORD_THROWN = $01 + +MAP_LOCATION = $96 + +GAME_STATE_0 = $97 + BABY_IN_WELL=$01 + BUCKET_DOWN_WELL=$02 + TALKED_TO_MENDELEV=$04 + HALDO_TO_DONGOLEV=$08 + ARROW_BEATEN=$10 + GARY_SCARED=$20 + LADY_GONE=$40 + TRINKET_GIVEN=$80 +GAME_STATE_1 = $98 + FISH_FED=$01 ; also implies man gone and inn open + PUDDLE_WET=$02 + IN_HAY_BALE=$04 + ALREADY_GOT_ROOM=$08 + RAINING=$10 + NIGHT=$20 + POT_ON_HEAD=$40 + WEARING_ROBE=$80 +GAME_STATE_2 = $99 + ON_FIRE = $01 + COTTAGE_ROCK_MOVED=$02 + KNUCKLES_BLEED=$04 + DRESSER_OPEN=$08 + TALKED_TO_KNIGHT = $10 + COVERED_IN_MUD = $20 + GOT_MUDDY_ALREADY = $40 + GREASE_ON_HEAD =$80 + +NED_STATUS = $9A + ; 0 = hiding (no increment) + ; 1..127 = count up to appearing + ; 126,255 = hands on tree + ; 127,254 = half out + ; 128 = out (no increment) + +BUSH_STATUS = $9B ; status of bush search + BUSH_1_SEARCHED = $01 + BUSH_2_SEARCHED = $02 + BUSH_3_SEARCHED = $04 + BUSH_4_SEARCHED = $08 + +KERREK_STATE = $9C + KERREK_ALIVE = $00 + KERREK_DEAD = $01 + KERREK_DECOMPOSING = $02 + KERREK_SKELETON = $03 + KERREK_ROW1 = $40 + KERREK_ONSCREEN = $80 + +ARROW_SCORE = $9D ; bottom=score, top=random num needed 3-5? + ARROW_DONE = $80 + +SCORE_HUNDREDS = $9E +SCORE_TENSONES = $9F + +INVENTORY_1 = $A0 + INV1_ARROW = $01 + INV1_BABY = $02 + INV1_KERREK_BELT = $04 + INV1_CHICKEN_FEED = $08 + INV1_BOW = $10 + INV1_MONSTER_MASK = $20 + INV1_PEBBLES = $40 + INV1_PILLS = $80 + +INVENTORY_2 = $A1 + INV2_RICHES = $01 + INV2_ROBE = $02 + INV2_SODA = $04 + INV2_MEATBALL_SUB = $08 + INV2_TRINKET = $10 + INV2_TROGHELM = $20 + INV2_TROGSHIELD = $40 + INV2_TROGSWORD = $80 + +INVENTORY_3 = $A2 + INV3_IMPOSSIBLE = $01 + INV3_SHIRT = $02 + INV3_MAP = $04 + +INVENTORY_1_GONE = $A3 ; had item, but now it's gone +INVENTORY_2_GONE = $A4 +INVENTORY_3_GONE = $A5 +KERREK_X = $A6 ; should be in save area, as we use +KERREK_Y = $A7 ; for skeleton location + +VISITED_0 = $A8 ; for MAP drawing purposes +VISITED_1 = $A9 +VISITED_2 = $AA +VISITED_3 = $AB + +END_OF_SAVE = $AC + +;============================================= + +CURRENT_VERB = $B0 ; parser +CURRENT_NOUN = $B1 +WORD_MATCH = $B2 + +INPUT_X = $C0 +BOX_X1L = $C1 +BOX_X1H = $C2 +BOX_Y1 = $C3 +BOX_X2L = $C4 +BOX_X2H = $C5 +BOX_Y2 = $C6 +SAVED_Y1 = $C7 +SAVED_Y2 = $C8 + +; temp for animations, etc +BABY_COUNT = $C9 +PREV_X = $CA +PREV_Y = $CB + +; D0-D? used by HGR? + +WHICH_SLOT = $DA +CURRENT_DISK = $DC +HGR_COLOR = $E4 +HGR_PAGE = $E6 + +P0 = $F1 +P1 = $F2 +P2 = $F3 +P3 = $F4 +P4 = $F5 +P5 = $F6 + + +INL = $FC +INH = $FD +OUTL = $FE +OUTH = $FF + +; constants + +LOAD_VID_LOGO = 0 +LOAD_TITLE = 1 +LOAD_INTRO = 2 +LOAD_COPY_CHECK = 3 +LOAD_PEASANT1 = 4 +LOAD_PEASANT2 = 5 +LOAD_PEASANT3 = 6 +LOAD_PEASANT4 = 7 +LOAD_TROGDOR = 8 +LOAD_ENDING = 9 +LOAD_MUSIC = 10 +LOAD_CLIFF = 11 +LOAD_GAME_OVER = 12 +LOAD_INVENTORY = 13 +LOAD_PARSE_INPUT= 14 +LOAD_INN = 15 +LOAD_INSIDE = 16 +LOAD_ARCHERY = 17 +LOAD_MAP = 18 + +LOAD_SAVE1 = 19 +LOAD_SAVE2 = 20 +LOAD_SAVE3 = 21 + + +VGI_RCOLOR = P0 +VGI_RX1 = P1 +VGI_RY1 = P2 +VGI_RXRUN = P3 +VGI_RYRUN = P4 +VGI_RCOLOR2 = P5 ; only for dither +COUNT = TEMP5 + + +; LOCATIONS +LOCATION_POOR_GARY = 0 +LOCATION_KERREK_1 = 1 +LOCATION_OLD_WELL = 2 +LOCATION_YELLOW_TREE = 3 +LOCATION_WATERFALL = 4 +LOCATION_HAY_BALE = 5 +LOCATION_MUD_PUDDLE = 6 +LOCATION_ARCHERY = 7 +LOCATION_RIVER_STONE = 8 +LOCATION_MOUNTAIN_PASS = 9 +LOCATION_JHONKA_CAVE = 10 +LOCATION_YOUR_COTTAGE = 11 +LOCATION_LAKE_WEST = 12 +LOCATION_LAKE_EAST = 13 +LOCATION_OUTSIDE_INN = 14 +LOCATION_OUTSIDE_NN = 15 +LOCATION_WAVY_TREE = 16 +LOCATION_KERREK_2 = 17 +LOCATION_OUTSIDE_LADY = 18 +LOCATION_BURN_TREES = 19 +LOCATION_CLIFF_BASE = 20 +LOCATION_CLIFF_HEIGHTS = 21 +LOCATION_TROGDOR_OUTER = 22 +LOCATION_TROGDOR_LAIR = 23 +LOCATION_HIDDEN_GLEN = 24 +LOCATION_INSIDE_LADY = 25 +LOCATION_INSIDE_NN = 26 +LOCATION_INSIDE_INN = 27 +LOCATION_ARCHERY_GAME = 28 +LOCATION_MAP = 29 + +LOCATION_EMPTY = 30 diff --git a/games/sb/cliff_graphics/Makefile b/games/sb/cliff_graphics/Makefile deleted file mode 100644 index a1e21801..00000000 --- a/games/sb/cliff_graphics/Makefile +++ /dev/null @@ -1,27 +0,0 @@ -include ../../../Makefile.inc - -ZX02 = ~/research/6502_compression/zx02.git/build/zx02 -f -PNG_TO_HGR = ../../../utils/hgr-utils/png2hgr -LINKER_SCRIPTS = ../../../linker_scripts -DOS33 = ../../../utils/dos33fs-utils/dos33 -EMPTY_DISK = ../../../empty_disk/empty.dsk -TOKENIZE = ../../../utils/asoft_basic-utils/tokenize_asoft -PNG2GR = ../../../utils/gr-utils/png2gr -PNG2SPRITES = ../../../utils/gr-utils/png2sprites -HGR_SPRITE = ../../../utils/hgr-utils/hgr_make_sprite - -all: cliff_base.hgr.zx02 - -#### - -cliff_base.hgr.zx02: cliff_base.hgr - $(ZX02) cliff_base.hgr cliff_base.hgr.zx02 - -cliff_base.hgr: cliff_base.png - $(PNG_TO_HGR) cliff_base.png > cliff_base.hgr - -#### - -clean: - rm -f *~ *.o *.lst -