From f5c9513998a97df339430950939bd1357f0102c3 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Tue, 8 Mar 2022 00:49:10 -0500 Subject: [PATCH] lemm: time counts down --- games/lemm/Makefile | 2 +- games/lemm/graphics/Makefile | 33 +++++++- games/lemm/graphics/sprites.png | Bin 6997 -> 7636 bytes games/lemm/hgr_sprite.s | 126 ++++++++++++++++++++++++++++ games/lemm/hgr_tables.s | 141 ++++++++++++++++++++++++++++++++ games/lemm/lc_detect.s | 40 +++++++++ games/lemm/lemm.s | 29 ++++++- games/lemm/update_time.s | 86 +++++++++++++++++++ games/lemm/wait.s | 18 ++++ games/lemm/zp.inc | 22 ++--- 10 files changed, 477 insertions(+), 20 deletions(-) create mode 100644 games/lemm/hgr_sprite.s create mode 100644 games/lemm/hgr_tables.s create mode 100644 games/lemm/lc_detect.s create mode 100644 games/lemm/update_time.s create mode 100644 games/lemm/wait.s diff --git a/games/lemm/Makefile b/games/lemm/Makefile index ef9e3d46..7e5b91c7 100644 --- a/games/lemm/Makefile +++ b/games/lemm/Makefile @@ -39,7 +39,7 @@ LEMM: lemm.o lemm.o: lemm.s zp.inc hardware.inc \ graphics/graphics_test.inc \ - intro_level1.s \ + intro_level1.s update_time.s hgr_sprite.s \ interrupt_handler.s ca65 -o lemm.o lemm.s -l lemm.lst diff --git a/games/lemm/graphics/Makefile b/games/lemm/graphics/Makefile index 47bb40a3..8b949900 100644 --- a/games/lemm/graphics/Makefile +++ b/games/lemm/graphics/Makefile @@ -3,8 +3,9 @@ PNG2GR = ../../../utils/gr-utils/png2gr PNG2HGR = ../../../utils/hgr-utils/png2hgr LZSA = ~/research/lzsa/lzsa/lzsa B2D = ../../../utils/bmp2dhr/b2d +HGR_SPRITE = ../../../utils/hgr-utils/hgr_make_sprite -all: graphics_test.inc graphics_level1.inc +all: graphics_test.inc graphics_level1.inc sprites.inc ### @@ -18,8 +19,25 @@ graphics_test.inc: \ graphics_level1.inc: \ - level1.lzsa + level1.lzsa \ + level1_preview.lzsa echo "level1_lzsa: .incbin \"level1.lzsa\"" > graphics_level1.inc + echo "level1_preview_lzsa: .incbin \"level1_preview.lzsa\"" >> graphics_level1.inc + +### + +sprites.inc: sprites.png + $(HGR_SPRITE) -s -l big0_sprite sprites.png 14 1 20 16 > sprites.inc + $(HGR_SPRITE) -s -l big1_sprite sprites.png 28 1 34 16 >> sprites.inc + $(HGR_SPRITE) -s -l big2_sprite sprites.png 42 1 48 16 >> sprites.inc + $(HGR_SPRITE) -s -l big3_sprite sprites.png 56 1 62 16 >> sprites.inc + $(HGR_SPRITE) -s -l big4_sprite sprites.png 70 1 76 16 >> sprites.inc + $(HGR_SPRITE) -s -l big5_sprite sprites.png 84 1 90 16 >> sprites.inc + $(HGR_SPRITE) -s -l big6_sprite sprites.png 98 1 104 16 >> sprites.inc + $(HGR_SPRITE) -s -l big7_sprite sprites.png 112 1 118 16 >> sprites.inc + $(HGR_SPRITE) -s -l big8_sprite sprites.png 126 1 132 16 >> sprites.inc + $(HGR_SPRITE) -s -l big9_sprite sprites.png 140 1 146 16 >> sprites.inc + ### @@ -32,6 +50,15 @@ level1.hgr: level1.png ### +level1_preview.lzsa: level1_preview.hgr + $(LZSA) -r -f2 level1_preview.hgr level1_preview.lzsa + +level1_preview.hgr: level1_preview.png + $(PNG2HGR) level1_preview.png > level1_preview.hgr + + +### + level2.lzsa: level2.hgr $(LZSA) -r -f2 level2.hgr level2.lzsa @@ -49,6 +76,6 @@ level2_actual.hgr: level2_actual.png #### clean: - rm -f *~ graphics_test.inc \ + rm -f *~ graphics_test.inc sprites.inc \ *.lzsa *.gr *.hgr diff --git a/games/lemm/graphics/sprites.png b/games/lemm/graphics/sprites.png index 5f4e13d549dca8e81ffe20b019de668b634b1899..75b398894a866640cdc5b9aacf0da8267b5ea616 100644 GIT binary patch delta 3672 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 diff --git a/games/lemm/hgr_sprite.s b/games/lemm/hgr_sprite.s new file mode 100644 index 00000000..14cfd566 --- /dev/null +++ b/games/lemm/hgr_sprite.s @@ -0,0 +1,126 @@ + ;=========================================== + ; hgr draw sprite (only at 7-bit boundaries) + ;=========================================== + ; SPRITE in INL/INH + ; Location at CURSOR_X CURSOR_Y + + ; xsize, ysize in first two bytes + + ; sprite AT INL/INH + +hgr_draw_sprite: + + ; self modify to shift for odd start location + + ; SEC=$38 0b0011 1000 CLC=$18 0b0001 10000 + + lda CURSOR_X + lsr + bcc make_it_even + +make_it_odd: + lda #$18 + bne make_it_so +make_it_even: + lda #$38 +make_it_so: + sta odd_even_smc + + + ldy #0 + lda (INL),Y ; load xsize + clc + adc CURSOR_X + sta sprite_width_end_smc+1 ; self modify for end of line + + iny ; load ysize + lda (INL),Y + sta sprite_ysize_smc+1 ; self modify + + ; skip the xsize/ysize and point to sprite + clc + lda INL ; 16-bit add + adc #2 + sta sprite_smc1+1 + lda INH + adc #0 + sta sprite_smc1+2 + + ldx #0 ; X is pointer offset + + stx MASK ; actual row + +hgr_sprite_yloop: + + lda MASK ; row + + clc + adc CURSOR_Y ; add in cursor_y + + ; calc GBASL/GBASH + + tay ; get output ROW into GBASL/H + lda hposn_low,Y + sta GBASL + lda hposn_high,Y + + ; eor #$00 draws on page2 + ; eor #$60 draws on page1 +hgr_sprite_page_smc: + eor #$00 + sta GBASH + + ldy CURSOR_X + +sprite_inner_loop: + +sprite_smc1: + lda $d000 ; get sprite pattern + +; lsr + +odd_even_smc: + sec + bcs no_adjust + + asl + php + clc + lsr + plp + ror +no_adjust: + ;? Xcababab + ;X cababab? + ;? X0cababa + +; clc ; rol asl +; rol + + + + sta (GBASL),Y ; store out + + inx + iny + + + inc sprite_smc1+1 + bne sprite_noflo + inc sprite_smc1+2 +sprite_noflo: + +sprite_width_end_smc: + cpy #6 + bne sprite_inner_loop + + + inc MASK ; row + lda MASK ; row + +sprite_ysize_smc: + cmp #31 + bne hgr_sprite_yloop + + rts + diff --git a/games/lemm/hgr_tables.s b/games/lemm/hgr_tables.s new file mode 100644 index 00000000..420baa58 --- /dev/null +++ b/games/lemm/hgr_tables.s @@ -0,0 +1,141 @@ +div7_table = $bc00 +mod7_table = $bd00 +hposn_high = $be00 +hposn_low = $bf00 + + + + ;===================== + ; make /7 %7 tables + ;===================== + +hgr_make_tables: + + ldy #0 + lda #0 + ldx #0 +div7_loop: + sta div7_table,Y + + inx + cpx #7 + bne div7_not7 + + clc + adc #1 + ldx #0 +div7_not7: + iny + bne div7_loop + + + ldy #0 + lda #0 +mod7_loop: + sta mod7_table,Y + clc + adc #1 + cmp #7 + bne mod7_not7 + lda #0 +mod7_not7: + iny + bne mod7_loop + + + ; Hposn table + + lda #0 +hposn_loop: + ldy #0 + ldx #0 + pha + jsr hposn ; (Y,X),(A) + pla + tax + + lda GBASL + sta hposn_low,X + + lda GBASH + sta hposn_high,X + + inx + txa + + cmp #192 + bne hposn_loop + + rts + + ; left masks + ; in memory on screen + ; x111 1111 1111111 start at 0 + ; x111 1110 0111111 start at 1 + ; x111 1100 0011111 start at 2 + ; ... + ; x100 0000 0000001 start at 6 + +left_masks: + .byte $FF,$FE,$FC,$F8, $F0,$E0,$C0 + + ; right masks + ; in memory on screen + ; x000 0001 1000000 end at 0 + ; x000 0011 1100000 end at 1 + ; x000 0111 1110000 end at 2 + ; ... + ; x011 1111 1111110 end at 5 + ; x111 1111 1111111 end at 6 +right_masks: + .byte $81,$83,$87, $8F,$9F,$BF,$FF + + + + + ; from the Apple II firmware +hposn: +; sta HGR_Y ; save Y and X positions +; stx HGR_X +; sty HGR_X+1 + + pha ; Y pos on stack + + and #$C0 ; calc base addr for Y-pos + + sta GBASL + lsr + lsr + ora GBASL + sta GBASL + pla + + sta GBASH + asl + asl + asl + rol GBASH + asl + rol GBASH + asl + ror GBASL + lda GBASH + + and #$1F + + ora HGR_PAGE ; default is $40 in this game + sta GBASH + +; txa +; cpy #0 +; beq xpos_lessthan_256 +; ldy #35 +; adc #4 +;label_1: +; iny +;xpos_lessthan_256: +; sbc #7 +; bcs label_1 + + rts + diff --git a/games/lemm/lc_detect.s b/games/lemm/lc_detect.s new file mode 100644 index 00000000..3123a6ae --- /dev/null +++ b/games/lemm/lc_detect.s @@ -0,0 +1,40 @@ +; Code from TotalReplay by 4am and qkumba + +;------------------------------------------------------------------------------ +; Has64K +; Checks whether computer has functioning language card (64K) +; +; in: none +; out: C clear if 64K detected +; C set if 64K not detected +; all other flags and registers clobbered +; ROM in memory (not LC RAM bank) +;------------------------------------------------------------------------------ + +detect_language_card: + + ; enable language card + ; READ_RAM1_WRITE_RAM1 + + bit $C08B + bit $C08B + + lda #$AA ; test #1 for $D0 page + sta $D000 + eor $D000 + bne no_lc + lsr $D000 ; test #2 for $D0 page + lda #$55 + eor $D000 + bne no_lc + clc + bcc done_detect + +no_lc: + sec + +done_detect: + ; READ_ROM_NO_WRITE + bit $C08A + + rts diff --git a/games/lemm/lemm.s b/games/lemm/lemm.s index 8163512f..736808f7 100644 --- a/games/lemm/lemm.s +++ b/games/lemm/lemm.s @@ -211,6 +211,10 @@ zurg: ; Load Graphics ;======================= + lda #$20 + sta HGR_PAGE + jsr hgr_make_tables + bit SET_GR bit PAGE0 bit HIRES @@ -247,13 +251,28 @@ zurg: cli + ; set up time + lda #$5 + sta TIME_MINUTES + lda #$12 + sta TIME_SECONDS + + + ;=================== ;=================== ; Main Loop ;=================== + ;=================== main_loop: + jsr update_time + + lda #$ff + jsr wait + + jmp main_loop @@ -301,12 +320,15 @@ load_song_chunk_good: ; .include "print_help.s" ; .include "gr_fast_clear.s" + .include "text_print.s" -; .include "init_vars.s" -; .include "graphics_title/title_graphics.inc" .include "lc_detect.s" + .include "wait.s" + .include "hgr_tables.s" + .include "hgr_sprite.s" + .include "update_time.s" .include "intro_level1.s" ; pt3 player @@ -324,8 +346,9 @@ config_string: .byte 0,23,"APPLE II?, 48K, MOCKINGBOARD: NO, SSI: N",0 ; MOCKINGBOARD: NONE -new_title: + .include "graphics/graphics_level1.inc" +.include "graphics/sprites.inc" music_parts_h: .byte >lemm5_part1_lzsa,>lemm5_part2_lzsa,>lemm5_part3_lzsa,$00 diff --git a/games/lemm/update_time.s b/games/lemm/update_time.s new file mode 100644 index 00000000..187f4072 --- /dev/null +++ b/games/lemm/update_time.s @@ -0,0 +1,86 @@ + + ; updates the time left +update_time: + sed + + sec + lda TIME_SECONDS + sbc #1 + cmp #$99 + bne no_time_uflo + lda #$59 + dec TIME_MINUTES + +no_time_uflo: + sta TIME_SECONDS + + cld + + +draw_time: + + ; draw minute + ldy TIME_MINUTES + + lda bignums_l,Y + sta INL + lda bignums_h,Y + sta INH + + ; 246, 152 + + ldx #35 ; 245 + stx CURSOR_X + lda #152 + sta CURSOR_Y + + jsr hgr_draw_sprite + + ; draw seconds + lda TIME_SECONDS + lsr + lsr + lsr + lsr + tay + + lda bignums_l,Y + sta INL + lda bignums_h,Y + sta INH + + ldx #37 + stx CURSOR_X + lda #152 + sta CURSOR_Y + + jsr hgr_draw_sprite + + + ; draw seconds + lda TIME_SECONDS + and #$f + tay + + lda bignums_l,Y + sta INL + lda bignums_h,Y + sta INH + + ldx #38 + stx CURSOR_X + lda #152 + sta CURSOR_Y + + jsr hgr_draw_sprite + + rts + + +bignums_l: +.byte big0_sprite,>big1_sprite,>big2_sprite,>big3_sprite,>big4_sprite +.byte >big5_sprite,>big6_sprite,>big7_sprite,>big8_sprite,>big9_sprite diff --git a/games/lemm/wait.s b/games/lemm/wait.s new file mode 100644 index 00000000..12c4319c --- /dev/null +++ b/games/lemm/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/lemm/zp.inc b/games/lemm/zp.inc index 56e2e045..f907e1a7 100644 --- a/games/lemm/zp.inc +++ b/games/lemm/zp.inc @@ -51,6 +51,12 @@ CURRENT_FRAME_H = $71 BASE_FRAME_L = $72 BASE_FRAME_H = $73 CURRENT_CHUNK = $74 +TIME_MINUTES = $75 +TIME_SECONDS = $76 +CURSOR_X = $77 +CURSOR_Y = $78 +DISP_PAGE = $79 +DRAW_PAGE = $7A APPLEII_MODEL = $8B @@ -67,21 +73,11 @@ SOUND_STATUS = $DE SOUND_IN_LC = $01 ; $01 sound effects in language card SOUND_MOCKINGBOARD = $02 ; mockingboard detected -GRID_PAGE = $DF -ANIMATE_FRAME = $E0 -LEVEL_OVER = $E1 - GAME_OVER = $FF - NEXT_LEVEL = $01 -LOCATIONS_L = $E2 -LOCATIONS_H = $E3 -; temp var per-world define -LONG_FRAME = $E4 ; nibel -CURRENT_DISPLAY = $E4 ; selena -LAST_PLAYED = $E4 ; selena +HGR_PAGE = $E6 + + -DISP_PAGE = $ED ; ALL -DRAW_PAGE = $EE ; ALL ; rest of pt3_player LOOP = $F4