riven_numbers: print lo-res d'ni numbers

way more trouble than it was worth
This commit is contained in:
Vince Weaver 2024-06-18 17:11:16 -04:00
parent 258eb510af
commit b99c902f55
8 changed files with 681 additions and 0 deletions

36
demos/dni/Makefile Normal file
View File

@ -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

6
demos/dni/gr_offsets.s Normal file
View File

@ -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

99
demos/dni/hardware.inc Normal file
View File

@ -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

2
demos/dni/hello.bas Normal file
View File

@ -0,0 +1,2 @@
5 HOME
120 PRINT CHR$(4);"BRUN NUMBERS"

View File

@ -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

271
demos/dni/numbers.s Normal file
View File

@ -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 INL
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
sta INL
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
ones_sprites_h:
.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
fives_sprite_h:
.byte >empty_sprite,>five_sprite,>ten_sprite,>fifteen_sprite,>twenty_sprite
.include "number_sprites.inc"
.include "gr_offsets.s"

BIN
demos/dni/riven_numbers.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

126
demos/dni/zp.inc Normal file
View File

@ -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