diff --git a/demos/second/Makefile b/demos/second/Makefile index d1f4176b..cec20820 100644 --- a/demos/second/Makefile +++ b/demos/second/Makefile @@ -13,14 +13,16 @@ all: second.dsk # $(DOS33) -y second.dsk SAVE A HELLO # $(DOS33) -y second.dsk BSAVE -a 0x6000 ZW -second.dsk: QBOOT QLOAD SECOND MUSIC +second.dsk: QBOOT QLOAD SECOND MUSIC \ + ./part18_3d/THREED cp $(EMPTY_DISK) second.dsk $(DOS33_RAW) second.dsk 0 0 QBOOT 0 1 $(DOS33_RAW) second.dsk 0 2 QBOOT 1 1 $(DOS33_RAW) second.dsk 0 4 QBOOT 2 1 $(DOS33_RAW) second.dsk 1 0 QLOAD 0 0 $(DOS33_RAW) second.dsk 3 0 MUSIC 0 0 - $(DOS33_RAW) second.dsk 5 0 SECOND 0 0 +# $(DOS33_RAW) second.dsk 5 0 SECOND 0 0 + $(DOS33_RAW) second.dsk 5 0 ./part18_3d/THREED 0 0 #### diff --git a/demos/second/part18_3d/3d.inc b/demos/second/part18_3d/3d.inc new file mode 100644 index 00000000..f5f467fc --- /dev/null +++ b/demos/second/part18_3d/3d.inc @@ -0,0 +1,39 @@ +; +; +; optional color, x1,y1 x2,y2 +; +; HLIN x1,x2 at y1 +; VLIN y1,y2 at X1 +; PLOT x1,y1 +; BOX x1,y1 to x2,y2 +; CLEAR - + +num_scenes=2 + +frame15: + .byte SET_COLOR | BLACK + .byte CLEAR + .byte SET_COLOR | WHITE + .byte BOX, 4, 6, 35,41 + .byte END +frame16: + .byte SET_COLOR | BLACK + .byte CLEAR + .byte SET_COLOR | WHITE + .byte BOX, 4, 6, 27,41 + .byte SET_COLOR | BROWN + .byte BOX, 28, 6, 35,34 + .byte SET_COLOR | GREY1 + .byte BOX, 28, 19, 33, 21 + .byte BOX, 28, 35, 35, 38 + .byte HLIN, 28, 31, 18 + .byte HLIN, 28, 30, 34 + .byte HLIN, 33, 35, 39 + .byte SET_COLOR | RED + .byte HLIN, 28, 32, 21 + .byte SET_COLOR | LIGHT_BLUE + .byte HLIN, 28, 33, 22 + .byte HLIN, 28, 30, 23 + .byte END + + diff --git a/demos/second/part18_3d/Makefile b/demos/second/part18_3d/Makefile new file mode 100644 index 00000000..b1350b6d --- /dev/null +++ b/demos/second/part18_3d/Makefile @@ -0,0 +1,22 @@ +include ../../../Makefile.inc + +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 +LINKER_SCRIPTS = ../../../linker_scripts/ + +all: THREED + +#### + +THREED: threed.o + ld65 -o THREED threed.o -C $(LINKER_SCRIPTS)/apple2_6000.inc + +threed.o: threed.s draw_boxes.s 3d.inc + ca65 -o threed.o threed.s -l threed.lst + +#### + +clean: + rm -f *~ *.o *.lst HELLO THREED diff --git a/demos/second/part18_3d/draw_boxes.s b/demos/second/part18_3d/draw_boxes.s new file mode 100644 index 00000000..b7b17057 --- /dev/null +++ b/demos/second/part18_3d/draw_boxes.s @@ -0,0 +1,199 @@ +; +; +; optional color, x1,y1 x2,y2 +; +; HLIN x1,x2 at y1 +; VLIN y1,y2 at X1 +; PLOT x1,y1 +; BOX x1,y1 to x2,y2 +; CLEAR - + +; data in INL/INH + +SET_COLOR = $80 +END = $00 +CLEAR = $01 +BOX = $02 +HLIN = $03 +VLIN = $04 + +BLACK = $00 +RED = $01 +DARK_BLUE = $02 +MAGENTA = $03 +GREEN = $04 +GREY1 = $05 +MEDIUM_BLUE = $06 +LIGHT_BLUE = $07 +BROWN = $08 +ORANGE = $09 +GREY2 = $0A +PINK = $0B +LIGHT_GREEN = $0C +YELLOW = $0D +AQUA = $0E +WHITE = $0f + + + +draw_scene: + + ldy #0 + + lda (INL),Y + bmi set_color + beq done_scene + + ; use jump table for rest + and #$7f + tax + dex ; types start at 1 + lda draw_table_h,X + pha + lda draw_table_l,X + pha + rts ; jump to it + +done_scene: + inc INL + bne really_done_scene + inc INH +really_done_scene: + rts + +set_color: + ; make top and bottom byte the same + + and #$f + sta COLOR + asl + asl + asl + asl + adc COLOR + sta COLOR + + lda #1 ; we were one byte long + bne update_pointer + + + ; adds A to input pointer and continues +update_pointer: + clc + adc INL + sta INL + lda #0 + adc INH + sta INH + jmp draw_scene + + + +draw_table_l: + .byte <(clear_screen-1),<(draw_box-1),<(draw_hlin-1),<(draw_vlin-1) +draw_table_h: + .byte >(clear_screen-1),>(draw_box-1),>(draw_hlin-1),>(draw_vlin-1) + + + ;================================= + ;================================= + ; clear screen + ;================================= + ;================================= +clear_screen: + jsr clear_fullgr + lda #1 + jmp update_pointer + + ;================================= + ;================================= + ; draw box + ;================================= + ;================================= +draw_box: + iny + lda (INL),Y + sta X1 + iny + lda (INL),Y + sta Y1 + iny + lda (INL),Y + sta X2 + iny + lda (INL),Y + sta Y2 + + lda Y2 + lsr + sta draw_box_yend_smc+1 + + lda Y1 + lsr + tay + +draw_box_yloop: + lda gr_offsets_l,Y + sta draw_box_xloop_smc+1 + + lda gr_offsets_h,Y + clc + adc DRAW_PAGE + sta draw_box_xloop_smc+2 + + lda COLOR + ldx X2 +draw_box_xloop: +draw_box_xloop_smc: + sta $400,X + dex + cpx X1 + bcs draw_box_xloop ; bge + + iny +draw_box_yend_smc: + cpy #0 + bne draw_box_yloop + + ; done + + lda #5 + jmp update_pointer + + + ;================================= + ;================================= + ; draw hlin + ;================================= + ;================================= +draw_hlin: + ; done + + lda #4 + jmp update_pointer + + ;================================= + ;================================= + ; draw vlin + ;================================= + ;================================= +draw_vlin: + ; done + + lda #4 + jmp update_pointer + + + +.include "gr_fast_clear.s" + +gr_offsets_l: + .byte <$400,<$480,<$500,<$580,<$600,<$680,<$700,<$780 + .byte <$428,<$4a8,<$528,<$5a8,<$628,<$6a8,<$728,<$7a8 + .byte <$450,<$4d0,<$550,<$5d0,<$650,<$6d0,<$750,<$7d0 + +gr_offsets_h: + .byte >$400,>$480,>$500,>$580,>$600,>$680,>$700,>$780 + .byte >$428,>$4a8,>$528,>$5a8,>$628,>$6a8,>$728,>$7a8 + .byte >$450,>$4d0,>$550,>$5d0,>$650,>$6d0,>$750,>$7d0 + diff --git a/demos/second/part18_3d/gr_fast_clear.s b/demos/second/part18_3d/gr_fast_clear.s new file mode 100644 index 00000000..739779b9 --- /dev/null +++ b/demos/second/part18_3d/gr_fast_clear.s @@ -0,0 +1,42 @@ + ;========================================================= + ; clear_all + ;========================================================= + ; clear 48 rows + +clear_fullgr: + clc ; 2 + lda DRAW_PAGE ; 3 + + adc #4 ; 2 + sta __caf+2 ; 3 + sta __caf+5 ; 3 + adc #1 ; 2 + sta __caf+8 ; 3 + sta __caf+11 ; 3 + adc #1 ; 2 + sta __caf2+2 ; 3 + sta __caf2+5 ; 3 + adc #1 ; 2 + sta __caf2+8 ; 3 + sta __caf2+11 ; 3 + + + ldy #120 ; 2 +clear_all_color: + lda COLOR ; 2 +clear_all_fast_loop: +__caf: + sta $400,Y ; 5 + sta $480,Y ; 5 + sta $500,Y ; 5 + sta $580,Y ; 5 +__caf2: + sta $600,Y ; 5 + sta $680,Y ; 5 + sta $700,Y ; 5 + sta $780,Y ; 5 + + dey ; 2 + bpl clear_all_fast_loop ; 2nt/3 + + rts ; 6 diff --git a/demos/second/part18_3d/threed.s b/demos/second/part18_3d/threed.s new file mode 100644 index 00000000..bcc87e25 --- /dev/null +++ b/demos/second/part18_3d/threed.s @@ -0,0 +1,64 @@ +; Not actually 3D at all +; is really a lo-res shape plotter that can play movie-like things + +; o/~ We went to Threed to see the Queen o/~ + +; +; by deater (Vince Weaver) + +.include "../zp.inc" +.include "../hardware.inc" +.include "../qload.inc" +;.include "music.inc" + +threed_start: + + ;======================= + ; wait for keypress + ;======================= + +; jsr wait_until_keypress + +; lda #25 +; jsr wait_a_bit + + + + ;=================== + ; Load graphics + ;=================== +load_loop: + bit SET_GR + bit LORES + bit FULLGR + bit PAGE0 + + lda #0 + sta DRAW_PAGE + + +forever: + + lda #num_scenes + sta SCENE_COUNT + + lda #frame15 + sta INH + +scene_loop: + jsr draw_scene + + jsr wait_until_keypress + + dec SCENE_COUNT + bne scene_loop + + jmp forever + + .include "../wait_keypress.s" + + .include "draw_boxes.s" + .include "3d.inc" + diff --git a/demos/second/qload.s b/demos/second/qload.s index 0ea1da76..818703ee 100644 --- a/demos/second/qload.s +++ b/demos/second/qload.s @@ -160,19 +160,19 @@ error_string: .endif which_disk_array: - .byte 1,1,1,1 ; ZW, MUSIC, ?, ? + .byte 1,1,1,1 ; SECOND, MUSIC, ?, ? load_address_array: - .byte $60,$D0,$90,$90 ; ZW, MUSIC, ?, ? + .byte $60,$D0,$90,$90 ; SECOND, MUSIC, ?, ? track_array: - .byte 5, 3, 9,12 ; ZW, MUSIC, ?, ? + .byte 5, 3, 9,12 ; SECOND, MUSIC, ?, ? sector_array: - .byte 0, 0, 0, 0 ; ZW, MUSIC, ?, ? + .byte 0, 0, 0, 0 ; SECOND, MUSIC, ?, ? length_array: - .byte 84, 32, 48, 48 ; ZW, MUSIC, ?, ? + .byte 84, 32, 48, 48 ; SECOND, MUSIC, ?, ? .include "lc_detect.s" .include "wait.s" diff --git a/demos/second/zp.inc b/demos/second/zp.inc index dff127b8..aaf7f6ec 100644 --- a/demos/second/zp.inc +++ b/demos/second/zp.inc @@ -148,6 +148,13 @@ HGR_COLOR = $E4 ;NAMEH = $EA ;NAMEX = $EB ;CHAR = $EC + +X1 = $E8 +X2 = $E9 +Y1 = $EA +Y2 = $EB +SCENE_COUNT = $EC + STATE = $ED OFFSET = $EF