diff --git a/demos/dni/Makefile b/demos/dni/Makefile new file mode 100644 index 00000000..5c4af26c --- /dev/null +++ b/demos/dni/Makefile @@ -0,0 +1,36 @@ +include ../../Makefile.inc + +DOS33 = ../../utils/dos33fs-utils/dos33 +B2D = ../../utils/bmp2dhr/b2d +PNG_TO_40x48D = ../../utils/gr-utils/png_to_40x48d +PNG_TO_40x96 = ../../utils/gr-utils/png_to_40x96 +TOKENIZE = ../../utils/asoft_basic-utils/tokenize_asoft +EMPTY = ../../empty_disk/ + + +all: numbers.dsk + +numbers.dsk: HELLO NUMBERS + cp $(EMPTY)/empty.dsk numbers.dsk + $(DOS33) -y numbers.dsk SAVE A HELLO + $(DOS33) -y numbers.dsk BSAVE -a 0x2000 NUMBERS + + +#### + +NUMBERS: numbers.o + ld65 -o NUMBERS numbers.o -C ../../linker_scripts/apple2_2000.inc + +numbers.o: numbers.s \ + zp.inc hardware.inc number_sprites.inc + ca65 -o numbers.o numbers.s -l numbers.lst + +#### + +HELLO: hello.bas + $(TOKENIZE) < hello.bas > HELLO + +#### + +clean: + rm -f *~ *.o *.lst NUMBERS diff --git a/demos/dni/gr_offsets.s b/demos/dni/gr_offsets.s new file mode 100644 index 00000000..5a3a29cd --- /dev/null +++ b/demos/dni/gr_offsets.s @@ -0,0 +1,6 @@ +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/demos/dni/hardware.inc b/demos/dni/hardware.inc new file mode 100644 index 00000000..eb28ede9 --- /dev/null +++ b/demos/dni/hardware.inc @@ -0,0 +1,99 @@ +;; HARDWARE LOCATIONS + +KEYPRESS = $C000 +KEYRESET = $C010 + +;; SOFT SWITCHES +CLR80COL = $C000 ; PAGE1/PAGE2 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 +CYAREG = $C036 ; iigs motor detect and clock speed +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 + +;; BASIC ROUTINES + +NORMAL = $F273 + +;; 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 +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 +WAIT = $FCA8 ;; delay 1/2(26+27A+5A^2) us +CROUT1 = $FD8B +SETINV = $FE80 ;; INVERSE +SETNORM = $FE84 ;; NORMAL +COUT = $FDED ;; output A to screen +COUT1 = $FDF0 ;; output A to screen + + + + + + + +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/demos/dni/hello.bas b/demos/dni/hello.bas new file mode 100644 index 00000000..a8ac9a85 --- /dev/null +++ b/demos/dni/hello.bas @@ -0,0 +1,2 @@ +5 HOME +120 PRINT CHR$(4);"BRUN NUMBERS" diff --git a/demos/dni/number_sprites.inc b/demos/dni/number_sprites.inc new file mode 100644 index 00000000..57b5105c --- /dev/null +++ b/demos/dni/number_sprites.inc @@ -0,0 +1,141 @@ +; 18x13 + +; frame + +frame_sprite: + +.byte 3,41 ; 3*13, ((3*13)+2) +.byte $FF,$FF,$C0 +.byte $60,$01,$80 +.byte $60,$01,$80 +.byte $60,$01,$80 +.byte $60,$01,$80 +.byte $60,$01,$80 +.byte $60,$01,$80 +.byte $60,$01,$80 +.byte $60,$01,$80 +.byte $60,$01,$80 +.byte $60,$01,$80 +.byte $60,$01,$80 +.byte $FF,$FF,$C0 + + +zero_sprite: +.byte 1,8 ; 1*6 +.byte $00 +.byte $00 +.byte $00 +.byte $00 +.byte $00 +.byte $06 + +one_sprite: +.byte 1,13 ; 11+2 +.byte $06 +.byte $06 +.byte $06 +.byte $06 +.byte $06 +.byte $06 +.byte $06 +.byte $06 +.byte $06 +.byte $06 +.byte $06 + +two_sprite: +.byte 1,13 ; 11+2 +.byte $80 +.byte $C0 +.byte $60 +.byte $60 +.byte $60 +.byte $60 +.byte $60 +.byte $60 +.byte $60 +.byte $C0 +.byte $80 + +three_sprite: +.byte 1,13 ; 11+2 +.byte $06 +.byte $0C +.byte $18 +.byte $30 +.byte $60 +.byte $C0 +.byte $60 +.byte $30 +.byte $18 +.byte $0c +.byte $06 + +four_sprite: +.byte 2,24 ; 11*2+2 +.byte $00,$00 +.byte $00,$00 +.byte $07,$F0 +.byte $06,$00 +.byte $06,$00 +.byte $06,$00 +.byte $06,$00 +.byte $06,$00 +.byte $06,$00 +.byte $06,$00 +.byte $06,$00 + + + +empty_sprite: +.byte 1,3 +.byte $00 + +five_sprite: +.byte 2,14 ; 2*6 +.byte $00,$00 +.byte $00,$00 +.byte $00,$00 +.byte $00,$00 +.byte $00,$00 +.byte $FF,$F0 + +ten_sprite: +.byte 2,24 ; 2*11 +.byte $00,$00 +.byte $00,$00 +.byte $00,$00 +.byte $00,$00 +.byte $00,$00 +.byte $00,$00 +.byte $00,$00 +.byte $00,$00 +.byte $3F,$c0 +.byte $40,$20 +.byte $80,$10 + +fifteen_sprite: +.byte 2,24 ; 2*11 +.byte $00,$00 +.byte $00,$00 +.byte $00,$00 +.byte $00,$00 +.byte $80,$10 +.byte $C0,$30 +.byte $60,$60 +.byte $30,$c0 +.byte $19,$80 +.byte $0f,$00 +.byte $06,$10 + +twenty_sprite: +.byte 2,14 ; 2*6 +.byte $30,$00 +.byte $30,$00 +.byte $30,$00 +.byte $30,$00 +.byte $30,$00 +.byte $3f,$f0 + + + diff --git a/demos/dni/numbers.s b/demos/dni/numbers.s new file mode 100644 index 00000000..3d8a1078 --- /dev/null +++ b/demos/dni/numbers.s @@ -0,0 +1,271 @@ +; numbers + +; by Vince `deater` Weaver + +.include "hardware.inc" +.include "zp.inc" + +numbers: + bit SET_GR + bit LORES + bit PAGE1 + + lda #0 + sta DRAW_PAGE + + jsr CLRTOP + + lda #$00 + sta NUMBER_HIGH + lda #$00 + sta NUMBER_LOW + +number_loop: + + jsr CLRTOP + + lda #4 + sta XPOS + lda #5 + sta YPOS + + jsr draw_full_dni_number + + +wait_for_it: + lda KEYPRESS + bpl wait_for_it + + bit KEYRESET + + ; four-digit base 5 increment +base5_inc: + + inc NUMBER_LOW + lda NUMBER_LOW + and #$f + cmp #5 + bne base5_inc_done + + clc + lda NUMBER_LOW + adc #$b + sta NUMBER_LOW + + lda NUMBER_LOW + cmp #$50 + bne base5_inc_done + + ; if here, overflow to top byte + lda #0 + sta NUMBER_LOW + + inc NUMBER_HIGH + lda NUMBER_HIGH + and #$f + cmp #5 + bne base5_inc_done + + clc + lda NUMBER_HIGH + adc #$b + sta NUMBER_HIGH + + lda NUMBER_HIGH + cmp #$50 + bne base5_inc_done + + lda #$0 + sta NUMBER_HIGH + +base5_inc_done: + + jmp number_loop + + ;===================== + +draw_full_dni_number: +; ldx #1 +; stx LEADING_ZERO + + lda NUMBER_HIGH + beq draw_only_low_dni_number + + ; drawing high number + +; ldx #0 +; stx LEADING_ZERO + + jsr draw_dni_number + + ; adjust for right number + lda #14 + bne draw_low_dni_number ; bra + +draw_only_low_dni_number: + + lda #7 +draw_low_dni_number: + clc + adc XPOS + sta XPOS + + lda NUMBER_LOW + + + + ;===================== + ; number in A + +draw_dni_number: + + sta DRAW_NUMBER + + ; draw frame + + lda #frame_sprite + sta INH + + jsr put_number_sprite + + ; adjust to be inside frame + + inc YPOS + inc XPOS + inc XPOS + inc XPOS + + ; draw ones values + + lda DRAW_NUMBER + bne regular_number + +; lda LEADING_ZERO ; if 0 then regular +; beq regular_number + + ; if all zeros, then draw special zero char + + lda #zero_sprite + jmp finally_draw + + +regular_number: + and #$f + tax + + lda ones_sprites_l,X + sta INL + lda ones_sprites_h,X +finally_draw: + sta INH + + jsr put_number_sprite + + lda DRAW_NUMBER + lsr + lsr + lsr + lsr + tax + + lda fives_sprite_l,X + sta INL + lda fives_sprite_h,X + sta INH + + jsr put_number_sprite + + + ; restore + + dec YPOS + dec XPOS + dec XPOS + dec XPOS + + rts + + + + ;===================== + +put_number_sprite: + + ldy #0 + lda (INL),Y + sta pns_xsize_smc+1 + iny + lda (INL),Y + sta pns_ysize_smc+1 + iny + + lda #0 + sta SPRITEY +pns_yloop: + + lda SPRITEY + clc + adc YPOS + asl + tax + lda gr_offsets,X +; clc + adc XPOS + sta pns_out_smc+1 + + lda gr_offsets+1,X +; clc + adc DRAW_PAGE + sta pns_out_smc+2 + + lda #0 + sta SPRITEX +pns_xloop: + + ldx #8 ; rotate through 8 bits + lda (INL),Y + sta COLOR +pns_inner_loop: + asl COLOR + bcc pns_transparent + lda #$FF +pns_out_smc: + sta $400 +pns_transparent: + inc pns_out_smc+1 + dex + bne pns_inner_loop + + iny + + inc SPRITEX + lda SPRITEX +pns_xsize_smc: + cmp #3 + bne pns_xloop + + inc SPRITEY +pns_ysize_smc: + cpy #39 + bcc pns_yloop ; blt + + rts + +ones_sprites_l: + .byte empty_sprite,>one_sprite,>two_sprite,>three_sprite,>four_sprite + +fives_sprite_l: + .byte empty_sprite,>five_sprite,>ten_sprite,>fifteen_sprite,>twenty_sprite + +.include "number_sprites.inc" + +.include "gr_offsets.s" + diff --git a/demos/dni/riven_numbers.png b/demos/dni/riven_numbers.png new file mode 100644 index 00000000..02ee908f Binary files /dev/null and b/demos/dni/riven_numbers.png differ diff --git a/demos/dni/zp.inc b/demos/dni/zp.inc new file mode 100644 index 00000000..9e7a47fa --- /dev/null +++ b/demos/dni/zp.inc @@ -0,0 +1,126 @@ +;; Zero Page + +;; ZX02 addresses + +ZP=$00 + +offset = ZP+0 +ZX0_src = ZP+2 +ZX0_dst = ZP+4 +bitr = ZP+6 +pntr = ZP+7 + +; disk code + +NIBCOUNT = $09 +CURRENT_DRIVE = $0A +DRIVE1_DISK = $0B +DRIVE2_DISK = $0C +DRIVE1_TRACK = $0D +DRIVE2_TRACK = $0E + + + +;; Zero page monitor routines addresses + +WNDLFT = $20 +WNDWDTH = $21 +WNDTOP = $22 +WNDBTM = $23 +CH = $24 +CV = $25 +GBASL = $26 +GBASH = $27 +BASL = $28 +BASH = $29 +H2 = $2C +X_LEFT = $2C +V2 = $2D +MASK = $2E +COLOR_MASK = $2F +COLOR = $30 + +SEEDL = $4e +SEEDH = $4f +XMAX = $50 + + +; note 70-7f used by disk code (?) do we need to preserve? + +; We have to save/restore the following values +; when loading/storing from disk + +WHICH_LOAD = $80 ; which file to load + +DIRECTION = $81 + DIRECTION_N = $1 + DIRECTION_S = $2 + DIRECTION_E = $4 + DIRECTION_W = $8 + DIRECTION_ANY=$f + DIRECTION_ONLY_POINT = $40 ; do not change pointer to grab + DIRECTION_SPLIT = $80 ; split text/graphics + +LOCATION = $82 + +JS_BUTTON_STATE = $83 +CURRENT_DISK = $84 +JOYSTICK_ENABLED = $85 +SOUND_STATUS = $86 + SOUND_DISABLED = $80 + SOUND_IN_LC = $01 ; $01 sound effects in language card + SOUND_MOCKINGBOARD = $02 ; mockingboard detected + +SCENE_COUNT = $87 +ANIMATE_FRAME = $88 +LEVEL_OVER = $89 + GAME_OVER = $FF + TOUCHED_ENEMY = $80 + NEXT_LEVEL = $01 +LOCATIONS_L = $8A +LOCATIONS_H = $8B + +DISP_PAGE = $8C +DRAW_PAGE = $8D + +WHICH_OVERLAY = $8E + +; Riven zero page addresses + +FRAMEL = $90 +FRAMEH = $91 +CURSOR_X = $92 +CURSOR_Y = $93 +XPOS = $94 +YPOS = $95 +LOCATION_STRUCT_L = $96 +LOCATION_STRUCT_H = $97 +IN_SPECIAL = $98 +CURSOR_VISIBLE = $99 +IN_LEFT = $9A +IN_RIGHT = $9B + +UPDATE_POINTER = $9C +APPLEII_MODEL = $9D +HGR_PAGE = $9E +WHICH_SLOT = $9F + +MAGLEV_FLIP_DIRECTION = $A0 +BEACH_ANIMALS_SEEN = $A1 + +LEADING_ZERO = $F2 +DRAW_NUMBER = $F3 +NUMBER_HIGH = $F4 +NUMBER_LOW = $F5 + +SPRITEX = $F6 +SPRITEY = $F7 +SPRITE_XSIZE = $F8 +TEMP = $F9 +MASKL = $FA +MASKH = $FB +INL = $FC +INH = $FD +OUTL = $FE +OUTH = $FF +