mirror of
https://github.com/deater/dos33fsprogs.git
synced 2024-12-29 00:31:52 +00:00
1517 lines
26 KiB
ArmAsm
1517 lines
26 KiB
ArmAsm
.include "zp.inc"
|
|
.include "hardware.inc"
|
|
.include "qload.inc"
|
|
|
|
.include "version.inc"
|
|
.include "./inventory/inventory.inc"
|
|
|
|
.include "tokens.inc"
|
|
|
|
parse_input_file_begin:
|
|
|
|
|
|
;==========================
|
|
; parse input
|
|
;==========================
|
|
; input is in input_buffer
|
|
|
|
parse_input:
|
|
;===========================
|
|
; special case: pot on head
|
|
|
|
lda GAME_STATE_1
|
|
and #POT_ON_HEAD
|
|
beq no_pot_on_head
|
|
|
|
ldx #<inside_inn_pot_on_head_message
|
|
ldy #>inside_inn_pot_on_head_message
|
|
jmp finish_parse_message
|
|
|
|
no_pot_on_head:
|
|
;==================
|
|
; uppercase the buffer
|
|
|
|
ldx #0
|
|
upcase_loop:
|
|
lda input_buffer,X
|
|
beq done_upcase_loop
|
|
cmp #' '|$80 ; skip uppercasing space
|
|
bne skip_uppercase
|
|
and #$DF ; uppercase
|
|
skip_uppercase:
|
|
sta input_buffer,X
|
|
inx
|
|
jmp upcase_loop
|
|
done_upcase_loop:
|
|
|
|
;=====================
|
|
; get the verb
|
|
|
|
jsr get_verb
|
|
|
|
;=====================
|
|
; get the noun
|
|
|
|
jsr get_noun
|
|
|
|
|
|
;===========================================
|
|
; this is turned to a "rts" in cases where
|
|
; we want to skip the verb table
|
|
; (mostly jhonka "yes/no" and maybe in trogdor cave
|
|
parse_input_smc:
|
|
nop
|
|
|
|
|
|
;================================
|
|
; check for "dan"
|
|
|
|
lda CURRENT_NOUN
|
|
cmp #NOUN_DAN
|
|
bne not_dan
|
|
|
|
ldx #<dan_message
|
|
ldy #>dan_message
|
|
jmp finish_parse_message
|
|
|
|
not_dan:
|
|
|
|
;=================================
|
|
; check if "look"ing at something in inventory
|
|
|
|
lda CURRENT_VERB
|
|
cmp #VERB_LOOK
|
|
bne not_look
|
|
|
|
jsr look_check_if_in_inventory
|
|
|
|
; if carry clear then can return early
|
|
|
|
bcs not_look
|
|
|
|
rts
|
|
|
|
not_look:
|
|
|
|
;================================
|
|
; jump into verb table
|
|
|
|
lda CURRENT_VERB
|
|
|
|
; jump table
|
|
asl
|
|
tax
|
|
lda verb_table+1, X ; high byte first
|
|
pha
|
|
lda verb_table,X ; low byte next
|
|
pha
|
|
rts ; jump to routine
|
|
|
|
|
|
;==============================
|
|
;==============================
|
|
;==============================
|
|
;==============================
|
|
; common routines
|
|
;==============================
|
|
;==============================
|
|
;==============================
|
|
;==============================
|
|
|
|
|
|
;================
|
|
; ask
|
|
;================
|
|
parse_common_ask:
|
|
ldx #<unknown_ask_message
|
|
ldy #>unknown_ask_message
|
|
jmp finish_parse_message
|
|
|
|
;================
|
|
; boo
|
|
;================
|
|
parse_common_boo:
|
|
ldx #<boo_message
|
|
ldy #>boo_message
|
|
jmp finish_parse_message
|
|
|
|
;================
|
|
; cheat
|
|
;================
|
|
parse_common_cheat:
|
|
|
|
ldx #<cheat_message
|
|
ldy #>cheat_message
|
|
jmp finish_parse_message
|
|
|
|
;================
|
|
; climb
|
|
;================
|
|
parse_common_climb:
|
|
|
|
lda CURRENT_NOUN
|
|
cmp #NOUN_TREE
|
|
beq climb_tree
|
|
|
|
jmp parse_common_unknown
|
|
|
|
climb_tree:
|
|
lda GAME_STATE_1
|
|
and #NIGHT
|
|
beq climb_tree_day
|
|
|
|
climb_tree_night:
|
|
ldx #<climb_tree_night_message
|
|
ldy #>climb_tree_night_message
|
|
jmp finish_parse_message
|
|
|
|
climb_tree_day:
|
|
ldx #<climb_tree_message
|
|
ldy #>climb_tree_message
|
|
jmp finish_parse_message
|
|
|
|
;=================
|
|
; copy
|
|
;=================
|
|
|
|
parse_common_copy:
|
|
|
|
; want copy
|
|
lda #NEW_FROM_DISK
|
|
sta LEVEL_OVER
|
|
|
|
lda #LOAD_COPY_CHECK
|
|
sta WHICH_LOAD
|
|
|
|
jmp done_parse_message
|
|
|
|
;===================
|
|
; dance
|
|
;===================
|
|
|
|
parse_common_dance:
|
|
|
|
ldx #<dance_message
|
|
ldy #>dance_message
|
|
jmp finish_parse_message
|
|
|
|
;===================
|
|
; die
|
|
;===================
|
|
|
|
parse_common_die:
|
|
lda #LOAD_GAME_OVER
|
|
sta WHICH_LOAD
|
|
|
|
lda #NEW_FROM_DISK
|
|
sta LEVEL_OVER
|
|
|
|
ldx #<die_message
|
|
ldy #>die_message
|
|
jmp finish_parse_message
|
|
|
|
|
|
;================
|
|
; ditch/drop
|
|
;================
|
|
parse_common_ditch:
|
|
parse_common_drop:
|
|
lda CURRENT_NOUN
|
|
cmp #NOUN_BABY
|
|
beq ditch_baby
|
|
|
|
jmp parse_common_unknown
|
|
|
|
ditch_baby:
|
|
lda INVENTORY_1
|
|
and #INV1_BABY
|
|
beq no_baby
|
|
|
|
lda INVENTORY_1_GONE
|
|
and #INV1_BABY
|
|
bne no_baby
|
|
|
|
|
|
ldx #<ditch_baby_message
|
|
ldy #>ditch_baby_message
|
|
jmp finish_parse_message
|
|
|
|
no_baby:
|
|
ldx #<no_baby_message
|
|
ldy #>no_baby_message
|
|
jmp finish_parse_message
|
|
|
|
;=====================
|
|
; drink
|
|
;=====================
|
|
|
|
parse_common_drink:
|
|
|
|
ldx #<drink_message
|
|
ldy #>drink_message
|
|
jsr partial_message_step
|
|
|
|
ldx #<drink_message2
|
|
ldy #>drink_message2
|
|
|
|
jmp finish_parse_message
|
|
|
|
;================
|
|
; drop/throw
|
|
;================
|
|
parse_common_throw:
|
|
lda CURRENT_NOUN
|
|
cmp #NOUN_BABY
|
|
beq throw_baby
|
|
|
|
jmp parse_common_unknown
|
|
|
|
throw_baby:
|
|
lda INVENTORY_1
|
|
and #INV1_BABY
|
|
beq throw_baby_no_baby
|
|
|
|
lda INVENTORY_1_GONE
|
|
and #INV1_BABY
|
|
bne throw_baby_no_baby
|
|
|
|
throw_baby_yes_baby:
|
|
ldx #<throw_baby_yes_message
|
|
ldy #>throw_baby_yes_message
|
|
jmp finish_parse_message
|
|
|
|
throw_baby_no_baby:
|
|
ldx #<no_baby_message
|
|
ldy #>no_baby_message
|
|
jmp finish_parse_message
|
|
|
|
|
|
;================
|
|
; get/take/steal
|
|
;================
|
|
parse_common_get:
|
|
parse_common_take:
|
|
parse_common_steal:
|
|
lda CURRENT_NOUN
|
|
cmp #NOUN_PEBBLES
|
|
bne not_pebbles
|
|
|
|
was_pebbles:
|
|
lda INVENTORY_1
|
|
and #INV1_PEBBLES
|
|
beq not_pebbles
|
|
|
|
ldx #<get_pebbles_message
|
|
ldy #>get_pebbles_message
|
|
jmp finish_parse_message
|
|
|
|
not_pebbles:
|
|
ldx #<get_message
|
|
ldy #>get_message
|
|
jmp finish_parse_message
|
|
|
|
|
|
;================
|
|
; give
|
|
;================
|
|
parse_common_give:
|
|
ldx #<give_message
|
|
ldy #>give_message
|
|
jmp finish_parse_message
|
|
|
|
|
|
;================
|
|
; go
|
|
;================
|
|
parse_common_go:
|
|
ldx #<go_message
|
|
ldy #>go_message
|
|
jmp finish_parse_message
|
|
|
|
|
|
;================
|
|
; haldo
|
|
;================
|
|
parse_common_haldo:
|
|
ldx #<haldo_message
|
|
ldy #>haldo_message
|
|
jmp finish_parse_message
|
|
|
|
|
|
;================
|
|
; help
|
|
;================
|
|
parse_common_help:
|
|
ldx #<help_message
|
|
ldy #>help_message
|
|
jmp finish_parse_message
|
|
|
|
|
|
;====================
|
|
; inventory
|
|
;====================
|
|
|
|
parse_common_inventory:
|
|
|
|
; switch in LC bank2
|
|
|
|
lda LCBANK2
|
|
lda LCBANK2
|
|
|
|
jsr show_inventory
|
|
|
|
; switch back LC bank1
|
|
|
|
lda LCBANK1
|
|
lda LCBANK1
|
|
|
|
jmp restore_parse_message
|
|
|
|
;=====================
|
|
; load
|
|
;=====================
|
|
|
|
parse_common_load:
|
|
|
|
jsr load_menu
|
|
|
|
jmp restore_parse_message
|
|
|
|
;=================
|
|
; look
|
|
;=================
|
|
|
|
parse_common_look:
|
|
|
|
lda CURRENT_NOUN
|
|
|
|
cmp #NOUN_TREE
|
|
beq trees_look
|
|
|
|
irrelevant_look:
|
|
ldx #<look_irrelevant_message
|
|
ldy #>look_irrelevant_message
|
|
jmp finish_parse_message
|
|
|
|
trees_look:
|
|
ldx #<look_trees_message
|
|
ldy #>look_trees_message
|
|
jmp finish_parse_message
|
|
|
|
|
|
;================
|
|
; map
|
|
;================
|
|
parse_common_map:
|
|
|
|
lda INVENTORY_3
|
|
and #INV3_MAP
|
|
beq dont_have_map
|
|
|
|
do_have_map:
|
|
lda MAP_LOCATION
|
|
sta PREVIOUS_LOCATION
|
|
lda #LOAD_MAP
|
|
sta WHICH_LOAD
|
|
lda #LOCATION_MAP
|
|
sta MAP_LOCATION
|
|
lda #1
|
|
sta LEVEL_OVER
|
|
jmp done_parse_message
|
|
|
|
dont_have_map:
|
|
ldx #<map_message
|
|
ldy #>map_message
|
|
jmp finish_parse_message
|
|
|
|
|
|
;================
|
|
; party
|
|
;================
|
|
parse_common_party:
|
|
ldx #<party_message
|
|
ldy #>party_message
|
|
jmp finish_parse_message
|
|
|
|
;=====================
|
|
; pwd
|
|
;=====================
|
|
parse_common_pwd:
|
|
|
|
ldx MAP_LOCATION
|
|
lda location_names_l,X
|
|
sta INL
|
|
lda location_names_h,X
|
|
sta INH
|
|
|
|
lda #<(pwd_message_offset)
|
|
sta OUTL
|
|
lda #>(pwd_message_offset)
|
|
sta OUTH
|
|
|
|
ldy #0
|
|
pwd_loop:
|
|
lda (INL),Y
|
|
sta (OUTL),Y
|
|
beq pwd_done
|
|
iny
|
|
bne pwd_loop ; bra
|
|
|
|
pwd_done:
|
|
|
|
ldx #<pwd_message
|
|
ldy #>pwd_message
|
|
jmp finish_parse_message
|
|
|
|
|
|
|
|
;================
|
|
; quit
|
|
;================
|
|
parse_common_quit:
|
|
ldx #<quit_message
|
|
ldy #>quit_message
|
|
jmp finish_parse_message
|
|
|
|
;===================
|
|
; save
|
|
;===================
|
|
parse_common_save:
|
|
|
|
jsr save_menu
|
|
|
|
jmp restore_parse_message
|
|
|
|
;===================
|
|
; show
|
|
;===================
|
|
|
|
parse_common_show:
|
|
|
|
bit LORES
|
|
bit PAGE1
|
|
|
|
jsr wait_until_keypress
|
|
|
|
bit PAGE2
|
|
bit HIRES
|
|
|
|
jmp done_parse_message
|
|
|
|
|
|
|
|
;================
|
|
; smell / sniff
|
|
;================
|
|
parse_common_smell:
|
|
parse_common_sniff:
|
|
ldx #<smell_message
|
|
ldy #>smell_message
|
|
jmp finish_parse_message
|
|
|
|
;===================
|
|
; talk
|
|
;===================
|
|
|
|
parse_common_talk:
|
|
|
|
; else, no one
|
|
talk_noone:
|
|
ldx #<talk_noone_message
|
|
ldy #>talk_noone_message
|
|
jmp finish_parse_message
|
|
|
|
;==================
|
|
; unknown
|
|
;=================
|
|
parse_common_unknown:
|
|
ldx #<unknown_message
|
|
ldy #>unknown_message
|
|
jmp finish_parse_message
|
|
|
|
;=====================
|
|
; version
|
|
;=====================
|
|
|
|
parse_common_version:
|
|
|
|
ldx #<version_message
|
|
ldy #>version_message
|
|
jmp finish_parse_message
|
|
|
|
|
|
;================
|
|
; wear
|
|
;================
|
|
parse_common_wear:
|
|
|
|
lda CURRENT_NOUN
|
|
|
|
cmp #NOUN_ROBE
|
|
beq parse_common_wear_robe
|
|
cmp #NOUN_BELT
|
|
beq parse_common_wear_belt
|
|
cmp #NOUN_MASK
|
|
beq parse_common_wear_mask
|
|
|
|
bne wear_unknown
|
|
|
|
parse_common_wear_belt:
|
|
; first see if have it
|
|
|
|
lda INVENTORY_1
|
|
and #INV1_KERREK_BELT
|
|
beq wear_unknown
|
|
|
|
ldx #<wear_belt_message
|
|
ldy #>wear_belt_message
|
|
jmp finish_parse_message
|
|
|
|
parse_common_wear_mask:
|
|
; first see if have it
|
|
|
|
lda INVENTORY_1
|
|
and #INV1_MONSTER_MASK
|
|
beq wear_unknown
|
|
|
|
ldx #<wear_mask_message
|
|
ldy #>wear_mask_message
|
|
jmp finish_parse_message
|
|
|
|
|
|
parse_common_wear_robe:
|
|
; first check if have it
|
|
|
|
lda INVENTORY_2
|
|
and #INV2_ROBE
|
|
beq parse_common_wear_robe_no_have
|
|
|
|
; next check if already wearing
|
|
|
|
lda GAME_STATE_1
|
|
and #WEARING_ROBE
|
|
bne parse_common_wear_robe_already
|
|
|
|
parse_common_wear_robe_do_have:
|
|
; wear the robe
|
|
|
|
lda GAME_STATE_1
|
|
ora #WEARING_ROBE
|
|
sta GAME_STATE_1
|
|
|
|
; get 3 points
|
|
|
|
lda #3
|
|
jsr score_points
|
|
|
|
ldx #<wear_robe_message
|
|
ldy #>wear_robe_message
|
|
jmp finish_parse_message
|
|
|
|
parse_common_wear_robe_already:
|
|
ldx #<wear_robe_already_message
|
|
ldy #>wear_robe_already_message
|
|
jmp finish_parse_message
|
|
|
|
parse_common_wear_robe_no_have:
|
|
ldx #<wear_robe_none_message
|
|
ldy #>wear_robe_none_message
|
|
jsr partial_message_step
|
|
|
|
ldx #<wear_robe_none_message2
|
|
ldy #>wear_robe_none_message2
|
|
jmp finish_parse_message
|
|
|
|
wear_unknown:
|
|
jmp parse_common_unknown
|
|
|
|
|
|
|
|
;================
|
|
; this / what the
|
|
;================
|
|
parse_common_this:
|
|
parse_common_what:
|
|
ldx #<what_message
|
|
ldy #>what_message
|
|
jmp finish_parse_message
|
|
|
|
;=====================
|
|
; where
|
|
;=====================
|
|
parse_common_where:
|
|
|
|
ldx MAP_LOCATION
|
|
lda location_names_l,X
|
|
sta INL
|
|
lda location_names_h,X
|
|
sta INH
|
|
|
|
lda #<(where_message_offset)
|
|
sta OUTL
|
|
lda #>(where_message_offset)
|
|
sta OUTH
|
|
|
|
ldy #0
|
|
where_loop:
|
|
lda (INL),Y
|
|
sta (OUTL),Y
|
|
beq where_done
|
|
iny
|
|
bne where_loop ; bra
|
|
|
|
where_done:
|
|
|
|
ldx #<where_message
|
|
ldy #>where_message
|
|
jmp finish_parse_message
|
|
|
|
|
|
|
|
;================
|
|
; why
|
|
;================
|
|
parse_common_why:
|
|
ldx #<why_message
|
|
ldy #>why_message
|
|
jmp finish_parse_message
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
finish_parse_message_nowait:
|
|
stx OUTL
|
|
sty OUTH
|
|
jsr print_text_message
|
|
rts
|
|
|
|
finish_parse_message:
|
|
stx OUTL
|
|
sty OUTH
|
|
jsr print_text_message
|
|
|
|
jsr wait_until_keypress
|
|
|
|
|
|
restore_parse_message:
|
|
|
|
lda #0
|
|
ldx #39
|
|
jsr hgr_partial_restore
|
|
|
|
|
|
done_parse_message:
|
|
|
|
|
|
rts
|
|
|
|
|
|
|
|
;===========================
|
|
; get verb
|
|
;===========================
|
|
; verb has to be the first word
|
|
|
|
get_verb:
|
|
lda #VERB_UNKNOWN ; default
|
|
sta CURRENT_VERB
|
|
|
|
lda #<verb_lookup ; reset verb pointer
|
|
sta get_verb_loop+1
|
|
lda #>verb_lookup
|
|
sta get_verb_loop+2
|
|
|
|
next_verb_loop:
|
|
ldx #0 ; set input pointer to zero
|
|
stx WORD_MATCH ; set match count to zero
|
|
|
|
get_verb_loop:
|
|
lda verb_lookup ; get char from verb
|
|
bmi done_verb ; if high bit set, done this verb
|
|
beq done_get_verb_loop ; if zero, we're totally done
|
|
|
|
cmp input_buffer,X ; compare verb char to buffer
|
|
beq verb_char_matched ;
|
|
verb_char_nomatch:
|
|
dec WORD_MATCH ; indicate no match
|
|
verb_char_matched:
|
|
jsr inc_verb_ptr ; matched, increment verb pointer
|
|
inx ; increment input pointer
|
|
jmp get_verb_loop ; (bra) loop
|
|
|
|
done_verb:
|
|
ldx WORD_MATCH ; check if we matched
|
|
beq found_verb ; if so, found
|
|
|
|
no_found_verb:
|
|
jsr inc_verb_ptr ; not found, point to next verb
|
|
jmp next_verb_loop ; try again
|
|
|
|
found_verb:
|
|
and #$7f ; found
|
|
sta CURRENT_VERB ; strip high bit and save found verb
|
|
|
|
done_get_verb_loop:
|
|
|
|
rts
|
|
|
|
inc_verb_ptr:
|
|
inc get_verb_loop+1
|
|
bne inc_verb_ptr_noflo
|
|
inc get_verb_loop+2
|
|
inc_verb_ptr_noflo:
|
|
|
|
rts
|
|
|
|
verb_lookup:
|
|
.byte "ASK",VERB_ASK|$80
|
|
.byte "ATTACK",VERB_ATTACK|$80
|
|
.byte "BOO",VERB_BOO|$80
|
|
.byte "BREAK",VERB_BREAK|$80
|
|
.byte "BUY",VERB_BUY|$80
|
|
.byte "CHEAT",VERB_CHEAT|$80
|
|
.byte "CLIMB",VERB_CLIMB|$80
|
|
.byte "CLOSE",VERB_CLOSE|$80
|
|
.byte "COPY",VERB_COPY|$80
|
|
.byte "CUT",VERB_CUT|$80
|
|
.byte "DANCE",VERB_DANCE|$80
|
|
.byte "DEPLOY",VERB_DEPLOY|$80
|
|
.byte "DIE",VERB_DIE|$80
|
|
.byte "DITCH",VERB_DITCH|$80
|
|
.byte "DRINK",VERB_DRINK|$80
|
|
.byte "DROP",VERB_DROP|$80
|
|
.byte "ENTER",VERB_ENTER|$80
|
|
.byte "FEED",VERB_FEED|$80
|
|
.byte "GET",VERB_GET|$80
|
|
.byte "GIVE",VERB_GIVE|$80
|
|
.byte "GO ",VERB_GO|$80
|
|
.byte "HALDO",VERB_HALDO|$80
|
|
.byte "HELP",VERB_HELP|$80
|
|
.byte "HIDE",VERB_HIDE|$80
|
|
.byte "HUG",VERB_HUG|$80
|
|
.byte "INV",VERB_INVENTORY|$80
|
|
.byte "JUMP",VERB_JUMP|$80
|
|
.byte "KICK",VERB_KICK|$80
|
|
.byte "KILL",VERB_KILL|$80
|
|
.byte "KNOCK",VERB_KNOCK|$80
|
|
.byte "LIGHT",VERB_LIGHT|$80
|
|
.byte "LOAD",VERB_LOAD|$80
|
|
.byte "LOOK",VERB_LOOK|$80
|
|
.byte "MAKE",VERB_MAKE|$80
|
|
.byte "MAP",VERB_MAP|$80
|
|
.byte "MOVE",VERB_MOVE|$80
|
|
.byte "NO",VERB_NO|$80
|
|
.byte "OPEN",VERB_OPEN|$80
|
|
.byte "PARTY",VERB_PARTY|$80
|
|
.byte "PET",VERB_PET|$80
|
|
.byte "PLAY",VERB_PLAY|$80
|
|
.byte "PULL",VERB_PULL|$80
|
|
.byte "PUNCH",VERB_PUNCH|$80
|
|
.byte "PUSH",VERB_PUSH|$80
|
|
.byte "PUT",VERB_PUT|$80
|
|
.byte "PWD",VERB_PWD|$80
|
|
.byte "QUIT",VERB_QUIT|$80
|
|
.byte "READ",VERB_READ|$80
|
|
.byte "RIDE",VERB_RIDE|$80
|
|
.byte "RING",VERB_RING|$80
|
|
.byte "SAVE",VERB_SAVE|$80
|
|
.byte "SAY",VERB_SAY|$80
|
|
.byte "SCARE",VERB_SCARE|$80
|
|
.byte "SEARCH",VERB_SEARCH|$80
|
|
.byte "SHOOT",VERB_SHOOT|$80
|
|
.byte "SHOW",VERB_SHOW|$80
|
|
.byte "SIT",VERB_SIT|$80
|
|
.byte "SKIP",VERB_SKIP|$80
|
|
.byte "SLAY",VERB_SLAY|$80
|
|
.byte "SLEEP",VERB_SLEEP|$80
|
|
.byte "SMELL",VERB_SMELL|$80
|
|
.byte "SNIFF",VERB_SNIFF|$80
|
|
.byte "STEAL",VERB_STEAL|$80
|
|
.byte "SWIM",VERB_SWIM|$80
|
|
.byte "TAKE",VERB_TAKE|$80
|
|
.byte "TALK",VERB_TALK|$80
|
|
.byte "THIS",VERB_THIS|$80
|
|
.byte "THROW",VERB_THROW|$80
|
|
.byte "TRY",VERB_TRY|$80
|
|
.byte "TURN",VERB_TURN|$80
|
|
.byte "USE",VERB_USE|$80
|
|
.byte "VER",VERB_VERSION|$80
|
|
.byte "WAKE",VERB_WAKE|$80
|
|
.byte "WEAR",VERB_WEAR|$80
|
|
.byte "WHAT THE",VERB_WHAT|$80
|
|
.byte "WHERE",VERB_WHERE|$80
|
|
.byte "WHY",VERB_WHY|$80
|
|
.byte "YES",VERB_YES|$80
|
|
.byte $00
|
|
|
|
;==========================
|
|
; get noun again
|
|
;==========================
|
|
; skips "baby" and "pebbles" and tries again
|
|
; needed for Well scene
|
|
|
|
get_noun_again:
|
|
|
|
; point to alternate
|
|
|
|
lda #<noun_lookup_again
|
|
sta get_noun_src_smc1+1
|
|
lda #>noun_lookup_again
|
|
sta get_noun_src_smc2+1
|
|
|
|
jsr get_noun
|
|
|
|
; point back
|
|
|
|
lda #<noun_lookup
|
|
sta get_noun_src_smc1+1
|
|
lda #>noun_lookup
|
|
sta get_noun_src_smc2+1
|
|
|
|
rts
|
|
|
|
|
|
;===========================
|
|
;===========================
|
|
; get noun
|
|
;===========================
|
|
;===========================
|
|
;
|
|
; assume command is "VERB SOMETHING SOMETHING SOMETHING"
|
|
; skip to first space, return NONE if nothing else
|
|
; parse for first matching noun
|
|
; return UNKNOWN if no matches
|
|
|
|
get_noun:
|
|
lda #NOUN_NONE ; if we have to second word, then none
|
|
sta CURRENT_NOUN
|
|
|
|
ldx #0 ; input pointer
|
|
|
|
try_next_word:
|
|
jsr noun_next_space
|
|
bcs done_get_noun_loop
|
|
|
|
stx TEMP0 ; save input pointer
|
|
|
|
get_noun_src_smc1:
|
|
lda #<noun_lookup ; reset noun pointer
|
|
sta get_noun_smc+1
|
|
get_noun_src_smc2:
|
|
lda #>noun_lookup
|
|
sta get_noun_smc+2
|
|
|
|
lda #NOUN_UNKNOWN ; at this point we have second word
|
|
sta CURRENT_NOUN ; so if we hit end it's unknown
|
|
|
|
next_noun_loop:
|
|
ldx TEMP0 ; reset to begin of current word
|
|
lda #0
|
|
sta WORD_MATCH ; set match count to zero
|
|
|
|
get_noun_loop:
|
|
|
|
get_noun_smc:
|
|
lda noun_lookup ; load byte from current noun
|
|
bmi done_noun ; if high bit set, hit end
|
|
beq try_next_word ; if zero, end of list
|
|
|
|
cmp input_buffer,X ; compare with input buffer
|
|
beq noun_char_matched ; see if matched
|
|
noun_char_nomatch:
|
|
dec WORD_MATCH ; indicate wasn't a match
|
|
noun_char_matched:
|
|
jsr inc_noun_ptr
|
|
inx
|
|
jmp get_noun_loop ; loop
|
|
|
|
done_noun:
|
|
ldx WORD_MATCH ; if we matched noun...
|
|
beq found_noun
|
|
|
|
no_found_noun:
|
|
jsr inc_noun_ptr
|
|
jmp next_noun_loop
|
|
|
|
found_noun:
|
|
and #$7f ; found, strip high bit and save
|
|
sta CURRENT_NOUN
|
|
|
|
done_get_noun_loop:
|
|
|
|
rts
|
|
|
|
inc_noun_ptr:
|
|
inc get_noun_smc+1
|
|
bne inc_noun_ptr_noflo
|
|
inc get_noun_smc+2
|
|
inc_noun_ptr_noflo:
|
|
|
|
rts
|
|
|
|
|
|
;=========================
|
|
; noun next space
|
|
;=========================
|
|
; point X to one past next space in input_buffer
|
|
; carry set if hit end
|
|
noun_next_space:
|
|
lda input_buffer,X
|
|
beq end_of_input
|
|
|
|
cmp #' '
|
|
beq end_of_word
|
|
|
|
inx
|
|
jmp noun_next_space
|
|
|
|
end_of_word:
|
|
inx ; point one past
|
|
clc
|
|
rts
|
|
|
|
end_of_input:
|
|
sec
|
|
rts
|
|
|
|
|
|
|
|
|
|
noun_lookup:
|
|
.byte "BABY",NOUN_BABY|$80 ; these are first
|
|
.byte "PEBBLES",NOUN_PEBBLES|$80 ; so at Well we can also
|
|
.byte "STONE",NOUN_STONE|$80 ; check for destination (bucket/well)
|
|
|
|
noun_lookup_again:
|
|
.byte "ARCHER",NOUN_ARCHER|$80
|
|
.byte "ARMS",NOUN_ARMS|$80
|
|
.byte "ARROW",NOUN_ARROW|$80
|
|
.byte "BEADS",NOUN_BEADS|$80
|
|
.byte "BED",NOUN_BED|$80
|
|
.byte "BELL",NOUN_BELL|$80
|
|
.byte "BELT",NOUN_BELT|$80
|
|
.byte "BERRIES",NOUN_BERRIES|$80
|
|
.byte "BLEED",NOUN_BLEED|$80
|
|
.byte "BOAT",NOUN_BOAT|$80
|
|
.byte "BONE",NOUN_BONE|$80
|
|
.byte "BOW",NOUN_BOW|$80
|
|
.byte "BROOM",NOUN_BROOM|$80
|
|
.byte "BUCKET",NOUN_BUCKET|$80
|
|
.byte "BUSH",NOUN_BUSH|$80
|
|
.byte "CANDLE",NOUN_CANDLE|$80
|
|
.byte "CARPET",NOUN_CARPET|$80
|
|
.byte "CAVE",NOUN_CAVE|$80
|
|
.byte "CHAIR",NOUN_CHAIR|$80
|
|
.byte "CLIFF",NOUN_CLIFF|$80
|
|
.byte "CLUB",NOUN_CLUB|$80
|
|
.byte "COLD",NOUN_COLD|$80
|
|
.byte "COTTAGE",NOUN_COTTAGE|$80
|
|
.byte "CRANK",NOUN_CRANK|$80
|
|
.byte "CURTAIN",NOUN_CURTAIN|$80
|
|
.byte "DAN",NOUN_DAN|$80
|
|
.byte "DESK",NOUN_DESK|$80
|
|
.byte "DINGHY",NOUN_DINGHY|$80
|
|
.byte "DOING",NOUN_DOING_SPROINGS|$80
|
|
.byte "DONGOLEV",NOUN_DONGOLEV|$80
|
|
.byte "DOOR",NOUN_DOOR|$80
|
|
.byte "DRAGON",NOUN_DRAGON|$80
|
|
.byte "DRAWER",NOUN_DRAWER|$80
|
|
.byte "DRESSER",NOUN_DRESSER|$80
|
|
.byte "DUDE",NOUN_DUDE|$80
|
|
.byte "FEED",NOUN_FEED|$80
|
|
.byte "FENCE",NOUN_FENCE|$80
|
|
.byte "FIRE",NOUN_FIRE|$80
|
|
.byte "FLIES",NOUN_FLIES|$80
|
|
.byte "FOOD",NOUN_FOOD|$80
|
|
.byte "FOOTPRINTS",NOUN_FOOTPRINTS|$80
|
|
.byte "GAME",NOUN_GAME|$80
|
|
.byte "GARY",NOUN_GARY|$80
|
|
.byte "GOLD",NOUN_GOLD|$80
|
|
.byte "GREASE",NOUN_GREASE|$80
|
|
.byte "GREEN",NOUN_GREEN|$80
|
|
.byte "GROUND",NOUN_GROUND|$80
|
|
.byte "GUY",NOUN_GUY|$80
|
|
.byte "HALDO",NOUN_HALDO|$80
|
|
.byte "IN HAY",NOUN_IN_HAY|$80
|
|
.byte "HAY",NOUN_HAY|$80
|
|
.byte "HELM",NOUN_HELM|$80
|
|
.byte "HOLE",NOUN_HOLE|$80
|
|
.byte "HORSE",NOUN_HORSE|$80
|
|
.byte "INN",NOUN_INN|$80
|
|
.byte "JHONKA",NOUN_JHONKA|$80
|
|
.byte "KERREK",NOUN_KERREK|$80
|
|
.byte "KNIGHT",NOUN_KNIGHT|$80
|
|
.byte "LADY",NOUN_LADY|$80
|
|
.byte "LAKE",NOUN_LAKE|$80
|
|
.byte "LANTERN",NOUN_LANTERN|$80
|
|
.byte "LEG",NOUN_LEG|$80
|
|
.byte "LIGHTNING",NOUN_LIGHTNING|$80
|
|
.byte "MAN",NOUN_MAN|$80
|
|
.byte "MAP",NOUN_MAP|$80
|
|
.byte "MASK",NOUN_MASK|$80
|
|
.byte "MATTRESS",NOUN_MATTRESS|$80
|
|
.byte "MENDELEV",NOUN_MENDELEV|$80
|
|
.byte "MONEY",NOUN_MONEY|$80
|
|
.byte "MUD",NOUN_MUD|$80
|
|
.byte "NED",NOUN_NED|$80
|
|
.byte "NOTE",NOUN_NOTE|$80
|
|
.byte "OPENINGS",NOUN_OPENINGS|$80
|
|
.byte "PAINTING",NOUN_PAINTING|$80
|
|
.byte "PAPER",NOUN_PAPER|$80
|
|
.byte "PARCHMENT",NOUN_PARCHMENT|$80
|
|
.byte "PEASANT",NOUN_PEASANT|$80
|
|
.byte "PILLOW",NOUN_PILLOW|$80
|
|
.byte "PILLS",NOUN_PILLS|$80
|
|
.byte "PLAGUE",NOUN_PLAGUE|$80
|
|
.byte "PLAQUE",NOUN_PLAQUE|$80
|
|
.byte "POT",NOUN_POT|$80
|
|
.byte "PUDDLE",NOUN_PUDDLE|$80
|
|
.byte "RICHES",NOUN_RICHES|$80
|
|
.byte "RIVER",NOUN_RIVER|$80
|
|
.byte "ROBE",NOUN_ROBE|$80
|
|
.byte "ROCK",NOUN_ROCK|$80
|
|
.byte "ROOM",NOUN_ROOM|$80
|
|
.byte "RUB",NOUN_RUB|$80
|
|
.byte "RUG",NOUN_RUG|$80
|
|
.byte "SANDWICH",NOUN_SANDWICH|$80
|
|
.byte "SAND",NOUN_SAND|$80
|
|
.byte "SHELF",NOUN_SHELF|$80
|
|
.byte "SHIELD",NOUN_SHIELD|$80
|
|
.byte "SHIRT",NOUN_SHIRT|$80
|
|
.byte "SIGN",NOUN_SIGN|$80
|
|
.byte "SKELETON",NOUN_SKELETON|$80
|
|
.byte "SKULL",NOUN_SKULL|$80
|
|
.byte "SMELL",NOUN_SMELL|$80
|
|
.byte "SODA",NOUN_SODA|$80
|
|
.byte "STUFF",NOUN_STUFF|$80
|
|
.byte "STUMP",NOUN_STUMP|$80
|
|
.byte "SUB",NOUN_SUB|$80
|
|
.byte "SWORD",NOUN_SWORD|$80
|
|
.byte "TARGET",NOUN_TARGET|$80
|
|
.byte "TRACKS",NOUN_TRACKS|$80
|
|
.byte "TREE",NOUN_TREE|$80
|
|
.byte "TRINKET",NOUN_TRINKET|$80
|
|
.byte "TROGDOR",NOUN_TROGDOR|$80
|
|
.byte "WATERFALL",NOUN_WATERFALL|$80
|
|
.byte "WATER",NOUN_WATER|$80
|
|
.byte "IN WELL",NOUN_IN_WELL|$80
|
|
.byte "WELL",NOUN_WELL|$80
|
|
.byte "WINDOW",NOUN_WINDOW|$80
|
|
.byte "WISH",NOUN_WISH|$80
|
|
.byte "WOMAN",NOUN_WOMAN|$80
|
|
.byte $00
|
|
|
|
|
|
.include "text/lookup.inc"
|
|
.include "text/common.inc.lookup"
|
|
|
|
|
|
;=======================
|
|
;=======================
|
|
; print text message
|
|
;=======================
|
|
;=======================
|
|
; OUTL/OUTH point to message
|
|
|
|
; first we need to calculate the size of the message (lines)
|
|
; next we need to set up the box
|
|
|
|
print_text_message:
|
|
jsr count_message_lines
|
|
|
|
lda #0 ; always 0
|
|
sta BOX_X1H
|
|
sta BOX_X2H
|
|
|
|
lda #35 ; always 35
|
|
sta BOX_X1L
|
|
|
|
lda #24 ; always 24
|
|
sta BOX_Y1
|
|
sta SAVED_Y1
|
|
|
|
lda #253 ; always 253
|
|
sta BOX_X2L
|
|
|
|
; 1 2 3 4 5 6 7 8
|
|
;message_y2: .byte 54, 62, 70, 78, 86, 94, 102, 110
|
|
|
|
; y2 was 46+(8*(len))
|
|
; we now skip 9, so 46+(9*len)
|
|
|
|
lda message_len
|
|
asl
|
|
asl
|
|
asl
|
|
clc
|
|
adc #46
|
|
adc message_len
|
|
|
|
sta BOX_Y2
|
|
sta SAVED_Y2
|
|
|
|
; jsr hgr_partial_save
|
|
|
|
jsr draw_box
|
|
|
|
; print text at 7 (*7), 36
|
|
|
|
lda #7 ; always 7
|
|
sta CURSOR_X
|
|
|
|
lda #36 ; always 36
|
|
sta CURSOR_Y
|
|
|
|
jsr disp_put_string_cursor
|
|
|
|
rts
|
|
|
|
;======================
|
|
;======================
|
|
; count message lines
|
|
;======================
|
|
;======================
|
|
; in OUTL/OUTH
|
|
count_message_lines:
|
|
ldy #0
|
|
sty message_len
|
|
count_message_lines_loop:
|
|
lda (OUTL),Y
|
|
beq count_message_done
|
|
cmp #13
|
|
bne count_message_not_cr
|
|
inc message_len
|
|
count_message_not_cr:
|
|
iny
|
|
bne count_message_lines_loop ; bra
|
|
|
|
count_message_done:
|
|
inc message_len ; increment for end of message too
|
|
|
|
rts
|
|
|
|
message_len:
|
|
.byte $0
|
|
|
|
last_bg_l: .byte $00
|
|
last_bg_h: .byte $00
|
|
|
|
|
|
;======================
|
|
;======================
|
|
; partial message step
|
|
;======================
|
|
;======================
|
|
partial_message_step:
|
|
stx OUTL
|
|
sty OUTH
|
|
jsr print_text_message
|
|
jsr wait_until_keypress
|
|
lda #0
|
|
ldx #39
|
|
jsr hgr_partial_restore
|
|
rts
|
|
|
|
verb_table = $BF00
|
|
|
|
|
|
;=========================
|
|
;=========================
|
|
; setup default verb table
|
|
;=========================
|
|
;=========================
|
|
setup_default_verb_table:
|
|
|
|
;===========================
|
|
; first make it all unknown
|
|
|
|
ldx #0
|
|
unknown_loop:
|
|
lda #<(parse_common_unknown-1)
|
|
sta verb_table,X
|
|
lda #>(parse_common_unknown-1)
|
|
sta verb_table+1,X
|
|
inx
|
|
inx
|
|
cpx #(VERB_ALL_DONE*2)
|
|
bne unknown_loop
|
|
|
|
;=========================
|
|
; now add in common calls
|
|
|
|
lda #<common_verb_table
|
|
sta INL
|
|
lda #>common_verb_table
|
|
sta INH
|
|
|
|
; fallthrough
|
|
|
|
|
|
;=========================
|
|
;=========================
|
|
; load custom verb table
|
|
;=========================
|
|
;=========================
|
|
; verb table to load in INL/INH
|
|
load_custom_verb_table:
|
|
|
|
|
|
ldy #0
|
|
common_verb_loop:
|
|
lda (INL),Y
|
|
beq done_verb_loop ; 0 means done
|
|
|
|
asl ; mul by 2
|
|
tax
|
|
iny
|
|
lda (INL),Y
|
|
sta verb_table,X
|
|
iny
|
|
lda (INL),Y
|
|
sta verb_table+1,X
|
|
iny
|
|
jmp common_verb_loop ; make this a bne (bra)?
|
|
|
|
done_verb_loop:
|
|
rts
|
|
|
|
|
|
common_verb_table:
|
|
.byte VERB_ASK
|
|
.word parse_common_ask-1
|
|
.byte VERB_BOO
|
|
.word parse_common_boo-1
|
|
.byte VERB_CHEAT
|
|
.word parse_common_cheat-1
|
|
.byte VERB_CLIMB
|
|
.word parse_common_climb-1
|
|
.byte VERB_COPY
|
|
.word parse_common_copy-1
|
|
.byte VERB_DANCE
|
|
.word parse_common_dance-1
|
|
.byte VERB_DIE
|
|
.word parse_common_die-1
|
|
.byte VERB_DITCH
|
|
.word parse_common_ditch-1
|
|
.byte VERB_DRINK
|
|
.word parse_common_drink-1
|
|
.byte VERB_DROP
|
|
.word parse_common_drop-1
|
|
.byte VERB_GET
|
|
.word parse_common_get-1
|
|
.byte VERB_GIVE
|
|
.word parse_common_give-1
|
|
.byte VERB_GO
|
|
.word parse_common_go-1
|
|
.byte VERB_HALDO
|
|
.word parse_common_haldo-1
|
|
.byte VERB_HELP
|
|
.word parse_common_help-1
|
|
.byte VERB_INVENTORY
|
|
.word parse_common_inventory-1
|
|
.byte VERB_LOAD
|
|
.word parse_common_load-1
|
|
.byte VERB_LOOK
|
|
.word parse_common_look-1
|
|
.byte VERB_MAP
|
|
.word parse_common_map-1
|
|
.byte VERB_PARTY
|
|
.word parse_common_party-1
|
|
.byte VERB_PWD
|
|
.word parse_common_pwd-1
|
|
.byte VERB_QUIT
|
|
.word parse_common_quit-1
|
|
.byte VERB_SAVE
|
|
.word parse_common_save-1
|
|
.byte VERB_SHOW
|
|
.word parse_common_show-1
|
|
.byte VERB_SMELL
|
|
.word parse_common_smell-1
|
|
.byte VERB_SNIFF
|
|
.word parse_common_sniff-1
|
|
.byte VERB_TAKE
|
|
.word parse_common_take-1
|
|
.byte VERB_TALK
|
|
.word parse_common_talk-1
|
|
.byte VERB_THIS
|
|
.word parse_common_this-1
|
|
.byte VERB_THROW
|
|
.word parse_common_throw-1
|
|
.byte VERB_VERSION
|
|
.word parse_common_version-1
|
|
.byte VERB_WEAR
|
|
.word parse_common_wear-1
|
|
.byte VERB_WHAT
|
|
.word parse_common_what-1
|
|
.byte VERB_WHERE
|
|
.word parse_common_where-1
|
|
.byte VERB_WHY
|
|
.word parse_common_why-1
|
|
.byte 0
|
|
|
|
|
|
|
|
;===================================
|
|
; before looking
|
|
; check if item is/was in inventory
|
|
;===================================
|
|
; carry set if not found
|
|
; carry clear if found
|
|
look_check_if_in_inventory:
|
|
|
|
lda CURRENT_NOUN
|
|
|
|
ldx #INV1_ARROW
|
|
cmp #NOUN_ARROW
|
|
beq check_inventory_1
|
|
|
|
ldx #INV1_BABY
|
|
cmp #NOUN_BABY
|
|
beq check_inventory_1
|
|
|
|
ldx #INV1_KERREK_BELT
|
|
cmp #NOUN_BELT
|
|
beq check_inventory_1
|
|
|
|
ldx #INV1_CHICKEN_FEED
|
|
cmp #NOUN_FEED
|
|
beq check_inventory_1
|
|
|
|
ldx #INV1_BOW
|
|
cmp #NOUN_BOW
|
|
beq check_inventory_1
|
|
|
|
ldx #INV1_MONSTER_MASK
|
|
cmp #NOUN_MASK
|
|
beq check_inventory_1
|
|
|
|
ldx #INV1_PEBBLES
|
|
cmp #NOUN_PEBBLES
|
|
beq check_inventory_1
|
|
|
|
ldx #INV1_PILLS
|
|
cmp #NOUN_PILLS
|
|
beq check_inventory_1
|
|
|
|
ldx #INV2_RICHES
|
|
cmp #NOUN_RICHES
|
|
beq check_inventory_2
|
|
|
|
ldx #INV2_ROBE
|
|
cmp #NOUN_ROBE
|
|
beq check_inventory_2
|
|
|
|
ldx #INV2_SODA
|
|
cmp #NOUN_SODA
|
|
beq check_inventory_2
|
|
|
|
ldx #INV2_MEATBALL_SUB
|
|
cmp #NOUN_SUB
|
|
beq check_inventory_2
|
|
|
|
ldx #INV2_TRINKET
|
|
cmp #NOUN_TRINKET
|
|
beq check_inventory_2
|
|
|
|
ldx #INV2_TROGHELM
|
|
cmp #NOUN_HELM
|
|
beq check_inventory_2
|
|
|
|
ldx #INV2_TROGSHIELD
|
|
cmp #NOUN_SHIELD
|
|
beq check_inventory_2
|
|
|
|
ldx #INV2_TROGSWORD
|
|
cmp #NOUN_SWORD
|
|
beq check_inventory_2
|
|
|
|
ldx #INV3_SHIRT
|
|
cmp #NOUN_SHIRT
|
|
beq check_inventory_3
|
|
|
|
item_not_found:
|
|
sec
|
|
rts
|
|
|
|
check_inventory_1:
|
|
txa
|
|
and INVENTORY_1_GONE
|
|
bne inventory_gone
|
|
|
|
txa
|
|
and INVENTORY_1
|
|
bne inventory_there
|
|
|
|
sec
|
|
rts
|
|
|
|
check_inventory_2:
|
|
txa
|
|
and INVENTORY_2_GONE
|
|
bne inventory_gone
|
|
|
|
txa
|
|
and INVENTORY_2
|
|
bne inventory_there
|
|
|
|
sec
|
|
rts
|
|
|
|
check_inventory_3:
|
|
txa
|
|
and INVENTORY_3_GONE
|
|
bne inventory_gone
|
|
|
|
txa
|
|
and INVENTORY_3
|
|
bne inventory_there
|
|
|
|
sec
|
|
rts
|
|
|
|
inventory_gone:
|
|
ldx #<look_inventory_gone_message
|
|
ldy #>look_inventory_gone_message
|
|
jsr partial_message_step
|
|
clc
|
|
rts
|
|
inventory_there:
|
|
ldx #<look_inventory_there_message
|
|
ldy #>look_inventory_there_message
|
|
jsr partial_message_step
|
|
clc
|
|
rts
|
|
|
|
|
|
|
|
|
|
|
|
parse_input_file_end:
|
|
|
|
; make sure smaller than 4.5k
|
|
|
|
.assert (>parse_input_file_end - >parse_input_file_begin) < 18 , error, "peasant1 dialog too big"
|
|
|