5b.s

; da65 V2.11.9 - (C) Copyright 2000-2005,  Ullrich von Bassewitz
; Created:    2006-09-21 17:08:53
; Input	file: 5b.prg
; Page:	      1


	.setcpu	"6502"


player_xpos	:= $0010
player_ypos	:= $0011
tile_xpos	:= $0012
tile_ypos	:= $0013
map_x		:= $0014
map_y		:= $0015
current_location:= $001A
game_mode	:= $001B
dungeon_level	:= $001C
player_transport:= $001E
party_size	:= $001F
dng_direction	:= $0020
light_duration	:= $0021
moon_phase_trammel:= $0022
moon_phase_felucca:= $0023
horse_mode	:= $0024
ship_hull	:= $002B
move_counter	:= $002C
key_buf		:= $0030
key_buf_len	:= $0038
charptr		:= $003D
attacking_monster_type:= $0040
attacking_monster_xpos:= $0041
attacking_monster_ypos:= $0042
attacking_monster_terrain:= $0043
magic_aura	:= $0046
aura_duration	:= $0047
tile_under_player:= $0048
tile_north	:= $0049
tile_south	:= $004A
tile_east	:= $004B
tile_west	:= $004C
music_volume	:= $004D
console_xpos	:= $004E
console_ypos	:= $004F
diskid		:= $0050
numdrives	:= $0051
currdisk_drive1	:= $0052
currdisk_drive2	:= $0053
currplayer	:= $0054
hexnum		:= $0056
bcdnum		:= $0057
zptmp1		:= $005A
reqdisk		:= $005E
currdrive	:= $005F
lt_y		:= $0060
lt_x		:= $0061
lt_rwflag	:= $0062
lt_addr_hi	:= $0063
monster_type	:= $0066
game_mode_temp	:= $0068
moongate_tile	:= $006D
moongate_xpos	:= $006E
moongate_ypos	:= $006F
movement_mode	:= $0074
direction	:= $0075
ptr2		:= $007C
ptr1		:= $007E
j_waitkey	:= $0800
j_player_teleport:= $0803
j_move_east	:= $0806
j_move_west	:= $0809
j_move_south	:= $080C
j_move_north	:= $080F
j_drawinterface	:= $0812
j_drawview	:= $0815
j_update_britannia:= $0818
j_primm_xy	:= $081E
j_primm		:= $0821
j_console_out	:= $0824
j_clearbitmap	:= $0827
j_mulax		:= $082A
j_get_stats_ptr	:= $082D
j_printname	:= $0830
j_printbcd	:= $0833
j_drawcursor	:= $0836
j_drawcursor_xy	:= $0839
j_drawvert	:= $083C
j_drawhoriz	:= $083F
j_request_disk	:= $0842
j_update_status	:= $0845
j_blocked_tile	:= $0848
j_idle		:= $084B
j_rand		:= $084E
j_loadsector	:= $0851
j_playsfx	:= $0854
j_idle_combat	:= $0857
j_getnumber	:= $085A
j_getplayernum	:= $085D
j_update_wind	:= $0860
j_animate_view	:= $0863
j_printdigit	:= $0866
j_clearstatwindow:= $0869
j_animate_creatures:= $086C
j_centername	:= $086F
j_print_direction:= $0872
j_clearview	:= $0875
j_invertview	:= $0878
j_centerstring	:= $087B
j_printstring	:= $087E
j_gettile_bounds:= $0881
j_gettile	:= $0884
L0887		:= $0887
L088A		:= $088A
j_gettile_combat:= $088D
L0890		:= $0890
j_gettile_town	:= $0893
j_gettile_dungeon:= $0896
L8800		:= $8800
L8803		:= $8803
L8859		:= $8859
L8C00		:= $8C00
dungeon_update	:= $8C03
L8C06		:= $8C06
L9000		:= $9000
gettile_bounds	:= $9F00
gettile		:= $9F26
mul11		:= $9F49
gettile_combat	:= $9F85
gettile_town	:= $9FAF
gettile_dungeon	:= $9FCE
j_fileio	:= $A100
j_readblock	:= $A103
j_loadtitle	:= $A106
j_togglesnd	:= $A109
j_kernalin	:= $A10C
j_setirqv	:= $A10F
j_clearkbd	:= $A112
j_irqhandler	:= $A115
party_stats	:= $AA00
game_stats	:= $AB00
food_hi		:= $AB10
food_lo		:= $AB11
food_frac	:= $AB12
gold		:= $AB13
mixtures	:= $AB40
map_status	:= $AC00
object_xpos	:= $AC20
object_ypos	:= $AC40
object_tile	:= $AC60
monster_xpos	:= $AD00
monster_ypos	:= $AD10
monster_hp	:= $AD40
cbt_monster_type:= $AD50
monster_tile	:= $AD60
cbt_player_xpos	:= $AD80
cbt_player_ypos	:= $AD90
player_tile	:= $ADA0
missile		:= $ADFD
missile_xpos	:= $ADFE
missile_ypos	:= $ADFF
currmap		:= $AE00
tempmap		:= $AE80
music_ctl	:= $AF20
music_nop	:= $AF23
bmplineaddr_lo	:= $E000
bmplineaddr_hi	:= $E0C0
chrlineaddr_lo	:= $E180
chrlineaddr_hi	:= $E198
tile_color	:= $E1B0
music_init	:= $EC00

	.word	$4000				; 3FFE

j_startgate:
	jmp	startgame			; 4000

j_camp_ambushed:
	jmp	camp_ambushed			; 4003

	jmp	dungeon_combat_start		; 4006

startgame:
	lda	#$00				; 4009  .
	jsr	music_ctl			; 400B
	jsr	j_drawinterface			; 400E
	lda	#$0D				; 4011  M
	sta	console_ypos			; 4013
	lda	#$18				; 4015  X
	sta	console_xpos			; 4017
	lda	#$00				; 4019  .
	sta	game_mode			; 401B
	lda	#$25				; 401D  %
	sta	magic_aura			; 401F
	lda	#$02				; 4021  B
	jsr	j_request_disk			; 4023
	lda	party_size			; 4026
	beq	@loadgame			; 4028
	jmp	@gamestarted			; 402A

@loadgame:
	lda	#$CC				; 402D  L
	ldx	#$1A				; 402F  Z
	jsr	j_fileio			; 4031
	lda	party_size			; 4034
	bne	@gotgame			; 4036
	jsr	j_primm				; 4038
	.byte	$8D,$CE,$CF,$A0,$C1,$C3,$D4,$C9	; 403B  MNO ACTI
	.byte	$D6,$C5,$A0,$C7,$C1,$CD,$C5,$A1	; 4043  VE GAME!
	.byte	$8D,$00				; 404B  M.

@nogame:
	jmp	@nogame				; 404D

@gotgame:
	lda	#$CC				; 4050  L
	ldx	#$7F				; 4052  .
	jsr	j_fileio			; 4054
	ldx	#$80				; 4057  .
	jsr	j_fileio			; 4059
@gamestarted:
	lda	#$00				; 405C  .
	sta	$1D				; 405E
	sta	movement_mode			; 4060
	sta	current_location		; 4062
	sta	horse_mode			; 4064
	lda	#$01				; 4066  A
	sta	game_mode			; 4068
	sta	direction			; 406A
	jsr	j_update_status			; 406C
	jsr	j_player_teleport		; 406F
	lda	#$FF				; 4072  .
	sta	music_volume			; 4074
	lda	#$CF				; 4076  O
	jsr	music_ctl			; 4078
game_main:
	jsr	j_idle				; 407B
	jsr	check_triggers			; 407E
	jsr	check_party_alive		; 4081
	bpl	@prompt				; 4084
	jmp	cmd_sleep			; 4086

@prompt:
	jsr	j_primm				; 4089
	.byte	$8D,$1E,$00			; 408C  M^.

	jsr	j_waitkey			; 408F
	cmp	#$00				; 4092  .
	bne	@gotkey				; 4094
	jmp	cmd_pass			; 4096

@gotkey:
	cmp	#$A0				; 4099   
	bne	@north				; 409B
	jmp	cmd_pass			; 409D

@north:
	cmp	#$C0				; 40A0  @
	bne	@south				; 40A2
	jmp	cmd_north			; 40A4

@south:
	cmp	#$AF				; 40A7  /
	bne	@east				; 40A9
	jmp	cmd_south			; 40AB

@east:
	cmp	#$BA				; 40AE  :
	bne	@west				; 40B0
	jmp	cmd_west			; 40B2

@west:
	cmp	#$BB				; 40B5  ;
	bne	@home				; 40B7
	jmp	cmd_east			; 40B9

@home:
	cmp	#$93				; 40BC  S
	bne	@atoz				; 40BE
	jsr	printcr				; 40C0
	lda	#$00				; 40C3  .
	sta	$6A				; 40C5
@printvirtue:
	ldx	$6A				; 40C7
	lda	game_stats,x			; 40C9
	jsr	j_printbcd			; 40CC
	inc	$6A				; 40CF
	lda	$6A				; 40D1
	cmp	#$08				; 40D3  H
	bcc	@printvirtue			; 40D5
	jsr	printcr				; 40D7
	jmp	game_main			; 40DA

@atoz:
	cmp	#$C1				; 40DD  A
	bcc	cmd_unknown			; 40DF
	cmp	#$DB				; 40E1  [
	bcs	cmd_unknown			; 40E3
	sec					; 40E5
	sbc	#$C1				; 40E6  A
	asl	a				; 40E8
	tay					; 40E9
	lda	cmd_jump_table,y		; 40EA
	sta	ptr1				; 40ED
	lda	cmd_jump_table+1,y		; 40EF
	sta	ptr1+1				; 40F2
	jmp	(ptr1)				; 40F4

cmd_sleep:
	jsr	j_primm				; 40F7
	.byte	$8D,$1E,$DA,$FA,$FA,$FA,$FA,$8D	; 40FA  M^ZzzzzM
	.byte	$00				; 4102  .

	jmp	cmd_done			; 4103

cmd_pass:
	jsr	j_primm				; 4106
	.byte	$D0,$E1,$F3,$F3,$8D,$00		; 4109  PassM.

	jmp	cmd_done			; 410F

cmd_unknown:
	jsr	j_primm				; 4112
	.byte	$D7,$C8,$C1,$D4,$BF,$8D,$00	; 4115  WHAT?M.

cmd_error:
	lda	#$02				; 411C  B
	jsr	j_playsfx			; 411E
	jmp	cmd_done			; 4121

print_not_a_player:
	jsr	j_primm				; 4124
	.byte	$CE,$CF,$D4,$A0,$C1,$A0,$D0,$CC	; 4127  NOT A PL
	.byte	$C1,$D9,$C5,$D2,$A1,$8D,$00	; 412F  AYER!M.

	jmp	cmd_done			; 4136

print_only_on_foot:
	jsr	j_primm				; 4139
	.byte	$CF,$CE,$CC,$D9,$A0,$CF,$CE,$A0	; 413C  ONLY ON 
	.byte	$C6,$CF,$CF,$D4,$A1,$8D,$00	; 4144  FOOT!M.

	jmp	cmd_error			; 414B

print_nothing_there:
	jsr	j_primm				; 414E
	.byte	$CE,$CF,$D4,$C8,$C9,$CE,$C7,$A0	; 4151  NOTHING 
	.byte	$D4,$C8,$C5,$D2,$C5,$A1,$8D,$00	; 4159  THERE!M.

	jmp	cmd_done			; 4161

print_slow_progress:
	jsr	j_primm				; 4164
	.byte	$D3,$CC,$CF,$D7,$A0,$D0,$D2,$CF	; 4167  SLOW PRO
	.byte	$C7,$D2,$C5,$D3,$D3,$A1,$8D,$00	; 416F  GRESS!M.

	rts					; 4177

print_not_here:
	jsr	j_primm				; 4178
	.byte	$CE,$CF,$D4,$A0,$C8,$C5,$D2,$C5	; 417B  NOT HERE
	.byte	$A1,$8D,$00			; 4183  !M.

	jmp	cmd_done			; 4186

print_cant:
	jsr	j_primm				; 4189
	.byte	$C3,$C1,$CE,$A7,$D4,$A1,$8D,$00	; 418C  CAN'T!M.

	jmp	cmd_done			; 4194

print_aborted:
	jsr	j_primm				; 4197
	.byte	$C1,$C2,$CF,$D2,$D4,$C5,$C4,$A1	; 419A  ABORTED!
	.byte	$8D,$00				; 41A2  M.

	jmp	cmd_done			; 41A4

print_done:
	jsr	j_update_status			; 41A7
	jsr	j_primm				; 41AA
	.byte	$C4,$CF,$CE,$C5,$AE,$8D,$00	; 41AD  DONE.M.

	jmp	cmd_done			; 41B4

print_you_have_none:
	jsr	j_primm				; 41B7
	.byte	$D9,$CF,$D5,$A0,$C8,$C1,$D6,$C5	; 41BA  YOU HAVE
	.byte	$A0,$CE,$CF,$CE,$C5,$A1,$8D,$00	; 41C2   NONE!M.

	jmp	cmd_done			; 41CA

print_disabled:
	jsr	j_primm				; 41CD
	.byte	$C4,$C9,$D3,$C1,$C2,$CC,$C5,$C4	; 41D0  DISABLED
	.byte	$A1,$8D,$00			; 41D8  !M.

	jmp	cmd_done			; 41DB

move_blocked:
	jsr	j_primm				; 41DE
	.byte	$C2,$CC,$CF,$C3,$CB,$C5,$C4,$A1	; 41E1  BLOCKED!
	.byte	$8D,$00				; 41E9  M.

	lda	#$01				; 41EB  A
	jsr	j_playsfx			; 41ED
	lda	#$00				; 41F0  .
	sta	key_buf_len			; 41F2
	jmp	cmd_done			; 41F4

print_drift_only:
	jsr	j_primm				; 41F7
	.byte	$C4,$D2,$C9,$C6,$D4,$A0,$CF,$CE	; 41FA  DRIFT ON
	.byte	$CC,$D9,$A1,$8D,$00		; 4202  LY!M.

	jmp	cmd_done			; 4207

cmd_jump_table:
	.addr	cmd_attack			; 420A
	.addr	cmd_board			; 420C
	.addr	cmd_cast			; 420E
	.addr	cmd_descend			; 4210
	.addr	cmd_enter			; 4212
	.addr	cmd_fire			; 4214
	.addr	cmd_get_chest			; 4216
	.addr	cmd_hole_up_and_camp		; 4218
	.addr	cmd_ignite			; 421A
	.addr	cmd_jimmy_lock			; 421C
	.addr	cmd_klimb			; 421E
	.addr	cmd_locate			; 4220
	.addr	cmd_mix_reagents		; 4222
	.addr	cmd_new_order			; 4224
	.addr	cmd_open			; 4226
	.addr	cmd_peer_at_gem			; 4228
	.addr	cmd_quit_and_save		; 422A
	.addr	cmd_ready_weapon		; 422C
	.addr	cmd_search			; 422E
	.addr	cmd_talk			; 4230
	.addr	cmd_use				; 4232
	.addr	cmd_volume			; 4234
	.addr	cmd_wear_armor			; 4236
	.addr	cmd_xit				; 4238
	.addr	cmd_yell			; 423A
	.addr	cmd_ztats			; 423C

cmd_north:
	lda	game_mode			; 423E
	cmp	#$03				; 4240  C
	bne	@balloon			; 4242
	jmp	cmd_forward			; 4244

@balloon:
	lda	player_transport		; 4247
	cmp	#$18				; 4249  X
	bne	@shipnorth			; 424B
	jmp	print_drift_only		; 424D

@shipnorth:
	cmp	#$11				; 4250  Q
	bne	@shipother			; 4252
	jmp	@checkshipmove			; 4254

@shipother:
	cmp	#$10				; 4257  P
	beq	@turnship			; 4259
	cmp	#$12				; 425B  R
	beq	@turnship			; 425D
	cmp	#$13				; 425F  S
	beq	@turnship			; 4261
	lda	#$00				; 4263  .
	jsr	j_playsfx			; 4265
	jsr	print_north			; 4268
	lda	horse_mode			; 426B
	beq	@nohorse			; 426D
	jsr	@checkblock			; 426F
	jsr	j_idle				; 4272
@nohorse:
	jsr	@checkblock			; 4275
	jmp	cmd_done			; 4278

@turnship:
	lda	#$11				; 427B  Q
	sta	player_transport		; 427D
	jsr	print_turn			; 427F
	jsr	print_north			; 4282
	jmp	cmd_done			; 4285

@checkshipmove:
	jsr	print_sail			; 4288
	jsr	print_north			; 428B
	lda	tile_north			; 428E
	jsr	check_sailable			; 4290
	bpl	@shipnotblocked			; 4293
	jmp	move_blocked			; 4295

@shipnotblocked:
	lda	#$01				; 4298  A
	jsr	check_wind_direction		; 429A
	beq	@moveship			; 429D
	jsr	print_slow_progress		; 429F
	jmp	cmd_done			; 42A2

@moveship:
	jsr	j_move_north			; 42A5
	jmp	cmd_done			; 42A8

@checkblock:
	lda	tile_under_player		; 42AB
	cmp	#$0E				; 42AD  N
	beq	@blocked			; 42AF
	lda	tile_north			; 42B1
	cmp	#$0E				; 42B3  N
	beq	@notblocked			; 42B5
	jsr	j_blocked_tile			; 42B7
	bpl	@notblocked			; 42BA
@blocked:
	pla					; 42BC
	pla					; 42BD
	jmp	move_blocked			; 42BE

@notblocked:
	lda	tile_north			; 42C1
	jsr	check_slow_progress		; 42C3
	beq	@notslow			; 42C6
	jsr	print_slow_progress		; 42C8
	jmp	@done				; 42CB

@notslow:
	lda	#$00				; 42CE  .
	jsr	j_playsfx			; 42D0
	lda	game_mode			; 42D3
	cmp	#$01				; 42D5  A
	bne	@checkexit			; 42D7
	jsr	j_move_north			; 42D9
	lda	tile_north			; 42DC
	jmp	check_moongate			; 42DE

@checkexit:
	dec	player_ypos			; 42E1
	lda	player_ypos			; 42E3
	bpl	@done				; 42E5
	pla					; 42E7
	pla					; 42E8
	jmp	exit_location			; 42E9

@done:
	rts					; 42EC

cmd_forward:
	jsr	j_primm				; 42ED
	.byte	$C1,$E4,$F6,$E1,$EE,$E3,$E5,$8D	; 42F0  AdvanceM
	.byte	$00				; 42F8  .

	lda	tile_north			; 42F9
	jsr	dng_check_forward_block		; 42FB
	bpl	@notblocked			; 42FE
	jmp	move_blocked			; 4300

@notblocked:
	ldx	dng_direction			; 4303
dng_move:
	clc					; 4305
	lda	player_xpos			; 4306
	adc	dng_move_deltax,x		; 4308
	and	#$07				; 430B  G
	sta	player_xpos			; 430D
	clc					; 430F
	lda	player_ypos			; 4310
	adc	dng_move_deltay,x		; 4312
	and	#$07				; 4315  G
	sta	player_ypos			; 4317
	jmp	cmd_done			; 4319

dng_move_deltax:
	.byte	$00,$01,$00,$FF			; 431C  .A..
dng_move_deltay:
	.byte	$FF,$00,$01,$00			; 4320  ..A.

cmd_south:
	lda	game_mode			; 4324
	cmp	#$03				; 4326  C
	bne	@balloon			; 4328
	jsr	j_primm				; 432A
	.byte	$D2,$E5,$F4,$F2,$E5,$E1,$F4,$8D	; 432D  RetreatM
	.byte	$00				; 4335  .

	lda	tile_west			; 4336
	jsr	dng_check_retreat_block		; 4338
	bpl	@retreat			; 433B
	jmp	move_blocked			; 433D

@retreat:
	lda	dng_direction			; 4340
	eor	#$02				; 4342  B
	tax					; 4344
	jmp	dng_move			; 4345

@balloon:
	lda	player_transport		; 4348
	cmp	#$18				; 434A  X
	bne	@shipsouth			; 434C
	jmp	print_drift_only		; 434E

@shipsouth:
	cmp	#$13				; 4351  S
	bne	@shipother			; 4353
	jmp	@checkshipmove			; 4355

@shipother:
	cmp	#$12				; 4358  R
	beq	@turnship			; 435A
	cmp	#$10				; 435C  P
	beq	@turnship			; 435E
	cmp	#$11				; 4360  Q
	beq	@turnship			; 4362
	lda	#$00				; 4364  .
	jsr	j_playsfx			; 4366
	jsr	print_south			; 4369
	lda	horse_mode			; 436C
	beq	@nohorse			; 436E
	jsr	@checkblock			; 4370
	jsr	j_idle				; 4373
@nohorse:
	jsr	@checkblock			; 4376
	lda	player_xpos			; 4379
	cmp	#$E5				; 437B  e
	bcc	@notisleofabyss			; 437D
	cmp	#$EA				; 437F  j
	bcs	@notisleofabyss			; 4381
	lda	player_ypos			; 4383
	cmp	#$D4				; 4385  T
	bcc	@notisleofabyss			; 4387
	cmp	#$D9				; 4389  Y
	bcs	@notisleofabyss			; 438B
	jmp	generate_daemons		; 438D

@notisleofabyss:
	jmp	cmd_done			; 4390

@turnship:
	lda	#$13				; 4393  S
	sta	player_transport		; 4395
	jsr	print_turn			; 4397
	jsr	print_south			; 439A
	jmp	cmd_done			; 439D

@checkshipmove:
	jsr	print_sail			; 43A0
	jsr	print_south			; 43A3
	lda	tile_south			; 43A6
	jsr	check_sailable			; 43A8
	bpl	@shipnotblocked			; 43AB
	jmp	move_blocked			; 43AD

@shipnotblocked:
	lda	#$03				; 43B0  C
	jsr	check_wind_direction		; 43B2
	beq	@moveship			; 43B5
	jsr	print_slow_progress		; 43B7
	jmp	cmd_done			; 43BA

@moveship:
	jsr	j_move_south			; 43BD
	jmp	cmd_done			; 43C0

@checkblock:
	lda	tile_south			; 43C3
	jsr	j_blocked_tile			; 43C5
	bpl	@notblocked			; 43C8
	pla					; 43CA
	pla					; 43CB
	jmp	move_blocked			; 43CC

@notblocked:
	lda	tile_south			; 43CF
	jsr	check_slow_progress		; 43D1
	beq	@notslow			; 43D4
	jsr	print_slow_progress		; 43D6
	jmp	@done				; 43D9

@notslow:
	lda	#$00				; 43DC  .
	jsr	j_playsfx			; 43DE
	lda	game_mode			; 43E1
	cmp	#$01				; 43E3  A
	bne	@checkexit			; 43E5
	jsr	j_move_south			; 43E7
	lda	tile_south			; 43EA
	jmp	check_moongate			; 43EC

@checkexit:
	inc	player_ypos			; 43EF
	lda	player_ypos			; 43F1
	cmp	#$20				; 43F3   
	bcc	@done				; 43F5
	pla					; 43F7
	pla					; 43F8
	jmp	exit_location			; 43F9

@done:
	rts					; 43FC

cmd_west:
	lda	game_mode			; 43FD
	cmp	#$03				; 43FF  C
	bne	@balloon			; 4401
	jsr	print_turn			; 4403
	jsr	j_primm				; 4406
	.byte	$EC,$E5,$E6,$F4,$8D,$00		; 4409  leftM.

	sec					; 440F
	lda	dng_direction			; 4410
	sbc	#$01				; 4412  A
	and	#$03				; 4414  C
	sta	dng_direction			; 4416
	jsr	L8C00				; 4418
	jsr	j_print_direction		; 441B
	jmp	game_main			; 441E

@balloon:
	lda	player_transport		; 4421
	cmp	#$18				; 4423  X
	bne	@shipwest			; 4425
	jmp	print_drift_only		; 4427

@shipwest:
	cmp	#$10				; 442A  P
	bne	@shipother			; 442C
	jmp	@checkshipmove			; 442E

@shipother:
	cmp	#$11				; 4431  Q
	beq	@turnship			; 4433
	cmp	#$13				; 4435  S
	beq	@turnship			; 4437
	cmp	#$12				; 4439  R
	beq	@turnship			; 443B
	cmp	#$15				; 443D  U
	bne	@notturnhorse			; 443F
	lda	#$14				; 4441  T
	sta	player_transport		; 4443
@notturnhorse:
	lda	#$00				; 4445  .
	jsr	j_playsfx			; 4447
	jsr	print_west			; 444A
	lda	horse_mode			; 444D
	beq	@nohorse			; 444F
	jsr	@checkblock			; 4451
	jsr	j_idle				; 4454
@nohorse:
	jsr	@checkblock			; 4457
	jmp	cmd_done			; 445A

@turnship:
	lda	#$10				; 445D  P
	sta	player_transport		; 445F
	jsr	print_turn			; 4461
	jsr	print_west			; 4464
	jmp	cmd_done			; 4467

@checkshipmove:
	jsr	print_sail			; 446A
	jsr	print_west			; 446D
	lda	tile_west			; 4470
	jsr	check_sailable			; 4472
	bpl	@shipnotblocked			; 4475
	jmp	move_blocked			; 4477

@shipnotblocked:
	lda	#$00				; 447A  .
	jsr	check_wind_direction		; 447C
	beq	@moveship			; 447F
	jsr	print_slow_progress		; 4481
	jmp	cmd_done			; 4484

@moveship:
	jsr	j_move_west			; 4487
	jmp	cmd_done			; 448A

@checkblock:
	lda	tile_west			; 448D
	jsr	j_blocked_tile			; 448F
	bpl	@notblocked			; 4492
	pla					; 4494
	pla					; 4495
	jmp	move_blocked			; 4496

@notblocked:
	lda	tile_west			; 4499
	jsr	check_slow_progress		; 449B
	beq	@notslow			; 449E
	jsr	print_slow_progress		; 44A0
	jmp	@done				; 44A3

@notslow:
	lda	#$00				; 44A6  .
	jsr	j_playsfx			; 44A8
	lda	game_mode			; 44AB
	cmp	#$01				; 44AD  A
	bne	@checkexit			; 44AF
	jsr	j_move_west			; 44B1
	lda	tile_west			; 44B4
	jmp	check_moongate			; 44B6

@checkexit:
	dec	player_xpos			; 44B9
	lda	player_xpos			; 44BB
	bpl	@done				; 44BD
	pla					; 44BF
	pla					; 44C0
	jmp	exit_location			; 44C1

@done:
	rts					; 44C4

cmd_east:
	lda	game_mode			; 44C5
	cmp	#$03				; 44C7  C
	bne	@balloon			; 44C9
	jsr	print_turn			; 44CB
	jsr	j_primm				; 44CE
	.byte	$F2,$E9,$E7,$E8,$F4,$8D,$00	; 44D1  rightM.

	clc					; 44D8
	lda	dng_direction			; 44D9
	adc	#$01				; 44DB  A
	and	#$03				; 44DD  C
	sta	dng_direction			; 44DF
	jsr	L8C00				; 44E1
	jsr	j_print_direction		; 44E4
	jmp	game_main			; 44E7

@balloon:
	lda	player_transport		; 44EA
	cmp	#$18				; 44EC  X
	bne	@shipeast			; 44EE
	jmp	print_drift_only		; 44F0

@shipeast:
	cmp	#$12				; 44F3  R
	bne	@shipother			; 44F5
	jmp	@checkshipmove			; 44F7

@shipother:
	cmp	#$11				; 44FA  Q
	beq	@turnship			; 44FC
	cmp	#$13				; 44FE  S
	beq	@turnship			; 4500
	cmp	#$10				; 4502  P
	beq	@turnship			; 4504
	cmp	#$14				; 4506  T
	bne	@notturnhorse			; 4508
	lda	#$15				; 450A  U
	sta	player_transport		; 450C
@notturnhorse:
	lda	#$00				; 450E  .
	jsr	j_playsfx			; 4510
	jsr	print_east			; 4513
	lda	horse_mode			; 4516
	beq	@nohorse			; 4518
	jsr	@checkblock			; 451A
	jsr	j_idle				; 451D
@nohorse:
	jsr	@checkblock			; 4520
	jmp	cmd_done			; 4523

@turnship:
	jsr	print_turn			; 4526
	jsr	print_east			; 4529
	lda	#$12				; 452C  R
	sta	player_transport		; 452E
	jmp	cmd_done			; 4530

@checkshipmove:
	jsr	print_sail			; 4533
	jsr	print_east			; 4536
	lda	tile_east			; 4539
	jsr	check_sailable			; 453B
	bpl	@shipnotblocked			; 453E
	jmp	move_blocked			; 4540

@shipnotblocked:
	lda	#$02				; 4543  B
	jsr	check_wind_direction		; 4545
	beq	@moveship			; 4548
	jsr	print_slow_progress		; 454A
	jmp	cmd_done			; 454D

@moveship:
	jsr	j_move_east			; 4550
	lda	player_xpos			; 4553
	cmp	#$DD				; 4555  ]
	bne	@notmouthofabyss		; 4557
	lda	player_ypos			; 4559
	cmp	#$E0				; 455B  `
	bne	@notmouthofabyss		; 455D
	jmp	generate_pirates		; 455F

@notmouthofabyss:
	jmp	cmd_done			; 4562

@checkblock:
	lda	tile_east			; 4565
	jsr	j_blocked_tile			; 4567
	bpl	@notblocked			; 456A
	pla					; 456C
	pla					; 456D
	jmp	move_blocked			; 456E

@notblocked:
	lda	tile_east			; 4571
	jsr	check_slow_progress		; 4573
	beq	@notslow			; 4576
	jsr	print_slow_progress		; 4578
	jmp	@done				; 457B

@notslow:
	lda	#$00				; 457E  .
	jsr	j_playsfx			; 4580
	lda	game_mode			; 4583
	cmp	#$01				; 4585  A
	bne	@checkexit			; 4587
	jsr	j_move_east			; 4589
	lda	tile_east			; 458C
	jmp	check_moongate			; 458E

@checkexit:
	inc	player_xpos			; 4591
	lda	player_xpos			; 4593
	cmp	#$20				; 4595   
	bcc	@done				; 4597
	pla					; 4599
	pla					; 459A
	jmp	exit_location			; 459B

@done:
	rts					; 459E

print_turn:
	jsr	j_primm				; 459F
	.byte	$D4,$F5,$F2,$EE,$A0,$00		; 45A2  Turn .

	rts					; 45A8

print_sail:
	jsr	j_primm				; 45A9
	.byte	$D3,$E1,$E9,$EC,$A0,$00		; 45AC  Sail .

	rts					; 45B2

generate_pirates:
	ldy	#$07				; 45B3  G
@next:
	lda	pirate_xpos,y			; 45B5
	sta	object_xpos,y			; 45B8
	lda	pirate_ypos,y			; 45BB
	sta	object_ypos,y			; 45BE
	lda	#$80				; 45C1  .
	sta	object_tile,y			; 45C3
	lda	pirate_tile,y			; 45C6
	sta	map_status,y			; 45C9
	dey					; 45CC
	bpl	@next				; 45CD
	jmp	cmd_done			; 45CF

pirate_xpos:
	.byte	$E0,$E0,$E2,$E3,$E4,$E5,$E5,$E4	; 45D2  ``bcdeed
pirate_ypos:
	.byte	$DC,$E4,$DC,$E4,$E3,$E1,$DF,$DE	; 45DA  \d\dca_^
pirate_tile:
	.byte	$82,$82,$82,$82,$83,$83,$81,$81	; 45E2  BBBBCCAA

generate_daemons:
	lda	magic_aura			; 45EA
	cmp	#$5F				; 45EC  _
	beq	@done				; 45EE
	ldy	#$07				; 45F0  G
@next:
	lda	#$F0				; 45F2  p
	sta	object_tile,y			; 45F4
	sta	map_status,y			; 45F7
	lda	#$E7				; 45FA  g
	sta	object_xpos,y			; 45FC
	lda	player_ypos			; 45FF
	clc					; 4601
	adc	#$01				; 4602  A
	sta	object_ypos,y			; 4604
	dey					; 4607
	bpl	@next				; 4608
@done:
	jmp	cmd_done			; 460A

exit_location:
	lda	#$00				; 460D  .
	jsr	music_ctl			; 460F
	jsr	j_primm				; 4612
	.byte	$CC,$C5,$C1,$D6,$C9,$CE,$C7,$AE	; 4615  LEAVING.
	.byte	$AE,$AE,$8D,$00			; 461D  ..M.

	jsr	j_clearkbd			; 4621
	lda	#$00				; 4624  .
	sta	game_mode			; 4626
	lda	#$02				; 4628  B
	jsr	j_request_disk			; 462A
	lda	#$CC				; 462D  L
	ldx	#$7E				; 462F  ~
	jsr	j_fileio			; 4631
	lda	$18				; 4634
	sta	player_xpos			; 4636
	lda	$19				; 4638
	sta	player_ypos			; 463A
	jsr	j_player_teleport		; 463C
	lda	#$01				; 463F  A
	sta	game_mode			; 4641
	lda	#$00				; 4643  .
	sta	current_location		; 4645
	lda	player_xpos			; 4647
	cmp	#$EF				; 4649  o
	bne	@nothythloth			; 464B
	lda	player_ypos			; 464D
	cmp	#$F0				; 464F  p
	bne	@nothythloth			; 4651
	lda	#$18				; 4653  X
	sta	$AC7F				; 4655
	sta	$AC1F				; 4658
	lda	#$E9				; 465B  i
	sta	$AC3F				; 465D
	lda	#$F2				; 4660  r
	sta	$AC5F				; 4662
@nothythloth:
	jsr	j_update_britannia		; 4665
	lda	#$CF				; 4668  O
	jsr	music_ctl			; 466A
	lda	#$00				; 466D  .
	sta	key_buf_len			; 466F
	jmp	cmd_done			; 4671

check_slow_progress:
	cmp	#$03				; 4674  C
	beq	slow_one_in_four		; 4676
	cmp	#$05				; 4678  E
	beq	slow_one_in_eight		; 467A
	cmp	#$06				; 467C  F
	beq	slow_one_in_four		; 467E
	cmp	#$07				; 4680  G
	beq	slow_one_in_two			; 4682
	cmp	#$46				; 4684  F
	beq	slow_one_in_two			; 4686
notslow:
	lda	#$00				; 4688  .
	rts					; 468A

slow:
	lda	#$FF				; 468B  .
	rts					; 468D

slow_one_in_eight:
	jsr	j_rand				; 468E
	and	#$07				; 4691  G
	beq	slow				; 4693
	bne	notslow				; 4695
slow_one_in_four:
	jsr	j_rand				; 4697
	and	#$03				; 469A  C
	beq	slow				; 469C
	bne	notslow				; 469E
slow_one_in_two:
	jsr	j_rand				; 46A0
	and	#$01				; 46A3  A
	beq	notslow				; 46A5
	bne	slow				; 46A7
check_sailable:
	cmp	#$02				; 46A9  B
	bcc	@sailable			; 46AB
	cmp	#$8C				; 46AD  L
	bcc	@blocked			; 46AF
	cmp	#$90				; 46B1  P
	bcs	@blocked			; 46B3
@sailable:
	lda	#$00				; 46B5  .
	rts					; 46B7

@blocked:
	lda	#$FF				; 46B8  .
	rts					; 46BA

cmd_attack:
	jsr	j_primm				; 46BB
	.byte	$C1,$F4,$F4,$E1,$E3,$EB,$AD,$00	; 46BE  Attack-.

	lda	game_mode			; 46C6
	cmp	#$03				; 46C8  C
	bne	@notdungeon			; 46CA
	jmp	cmd_unknown			; 46CC

@notdungeon:
	jsr	getdirection			; 46CF
	bne	@gotdir				; 46D2
	jmp	cmd_pass			; 46D4

@gotdir:
	jsr	find_creature			; 46D7
	bpl	@gotcreature			; 46DA
@nothinghere:
	jmp	print_nothing_there		; 46DC

@gotcreature:
	stx	$58				; 46DF
	lda	object_tile,x			; 46E1
	cmp	#$8C				; 46E4  L
	beq	@nothinghere			; 46E6
	cmp	#$8E				; 46E8  N
	beq	@nothinghere			; 46EA
	lda	game_mode			; 46EC
	cmp	#$02				; 46EE  B
	bne	@nottowne			; 46F0
	ldx	#$1F				; 46F2  _
@townecheck:
	lda	object_tile,x			; 46F4
	cmp	#$50				; 46F7  P
	beq	@invincible			; 46F9
	cmp	#$5E				; 46FB  ^
	bne	@townenext			; 46FD
@invincible:
	lda	#$FF				; 46FF  .
	sta	$ACC0,x				; 4701
	lda	#$00				; 4704  .
	sta	$ACE0,x				; 4706
@townenext:
	dex					; 4709
	bpl	@townecheck			; 470A
@nottowne:
	lda	game_mode			; 470C
	cmp	#$02				; 470E  B
	beq	@losekarma			; 4710
	ldx	$58				; 4712
	lda	object_tile,x			; 4714
	jsr	check_evil			; 4717
	bmi	prepare_combat			; 471A
@losekarma:
	ldy	#$01				; 471C  A
	lda	#$05				; 471E  E
	jsr	virtue_dec			; 4720
	ldy	#$03				; 4723  C
	lda	#$03				; 4725  C
	jsr	virtue_dec			; 4727
	ldy	#$05				; 472A  E
	lda	#$03				; 472C  C
	jsr	virtue_dec			; 472E
prepare_combat:
	ldx	$58				; 4731
	lda	object_tile,x			; 4733
	sta	attacking_monster_type		; 4736
	lda	object_xpos,x			; 4738
	sta	attacking_monster_xpos		; 473B
	sta	$7A				; 473D
	lda	object_ypos,x			; 473F
	sta	attacking_monster_ypos		; 4742
	sta	$7B				; 4744
	lda	game_mode			; 4746
	cmp	#$01				; 4748  A
	bne	@notbritannia			; 474A
	jsr	j_gettile_bounds		; 474C
	sta	attacking_monster_terrain	; 474F
	jmp	@deletecreature			; 4751

@notbritannia:
	jsr	j_gettile_town			; 4754
	sta	attacking_monster_terrain	; 4757
@deletecreature:
	lda	#$00				; 4759  .
	ldx	$58				; 475B
	sta	object_tile,x			; 475D
	sta	map_status,x			; 4760
	sta	$ACC0,x				; 4763
	jmp	generate_combat			; 4766

cmd_board:
	lda	player_transport		; 4769
	cmp	#$1F				; 476B  _
	beq	@onfoot				; 476D
	jsr	j_primm				; 476F
	.byte	$C2,$EF,$E1,$F2,$E4,$A0,$BC,$AD	; 4772  Board <-
	.byte	$00				; 477A  .

	jmp	print_cant			; 477B

@onfoot:
	lda	tile_under_player		; 477E
	cmp	#$14				; 4780  T
	beq	board_horse			; 4782
	cmp	#$15				; 4784  U
	beq	board_horse			; 4786
	jsr	j_primm				; 4788
	.byte	$C2,$EF,$E1,$F2,$E4,$A0,$00	; 478B  Board .

	lda	tile_under_player		; 4792
	cmp	#$10				; 4794  P
	beq	@ship				; 4796
	cmp	#$11				; 4798  Q
	beq	@ship				; 479A
	cmp	#$12				; 479C  R
	beq	@ship				; 479E
	cmp	#$13				; 47A0  S
	beq	@ship				; 47A2
	cmp	#$18				; 47A4  X
	bne	@unknown			; 47A6
	jmp	board_balloon			; 47A8

@unknown:
	jmp	cmd_unknown			; 47AB

@ship:
	lda	#$10				; 47AE  P
	jsr	board_find_object		; 47B0
	jsr	j_primm				; 47B3
	.byte	$E6,$F2,$E9,$E7,$E1,$F4,$E5,$A1	; 47B6  frigate!
	.byte	$8D,$00				; 47BE  M.

	lda	player_xpos			; 47C0
	cmp	player_ship_xpos		; 47C2
	bne	@newship			; 47C5
	lda	player_ypos			; 47C7
	cmp	player_ship_ypos		; 47C9
	bne	@newship			; 47CC
	jmp	cmd_done			; 47CE

@newship:
	lda	#$50				; 47D1  P
	sta	ship_hull			; 47D3
	jmp	cmd_done			; 47D5

player_ship_xpos:
	.byte	$00				; 47D8  .
player_ship_ypos:
	.byte	$00				; 47D9  .

board_horse:
	lda	#$14				; 47DA  T
	jsr	board_find_object		; 47DC
	jsr	j_primm				; 47DF
	.byte	$CD,$EF,$F5,$EE,$F4,$A0,$E8,$EF	; 47E2  Mount ho
	.byte	$F2,$F3,$E5,$A1,$8D,$00		; 47EA  rse!M.

	jmp	cmd_done			; 47F0

board_balloon:
	lda	#$18				; 47F3  X
	jsr	board_find_object		; 47F5
	jsr	j_primm				; 47F8
	.byte	$E2,$E1,$EC,$EC,$EF,$EF,$EE,$8D	; 47FB  balloonM
	.byte	$00				; 4803  .

	lda	#$00				; 4804  .
	sta	movement_mode			; 4806
	jmp	cmd_done			; 4808

board_find_object:
	sta	$58				; 480B
	ldx	#$1F				; 480D  _
@checkobject:
	lda	object_tile,x			; 480F
	and	#$FC				; 4812  |
	cmp	$58				; 4814
	bne	@next				; 4816
	lda	object_xpos,x			; 4818
	cmp	player_xpos			; 481B
	bne	@next				; 481D
	lda	object_ypos,x			; 481F
	cmp	player_ypos			; 4822
	beq	@foundobject			; 4824
@next:
	dex					; 4826
	cpx	#$08				; 4827  H
	bcs	@checkobject			; 4829
	bcc	@noobject			; 482B
@foundobject:
	lda	#$00				; 482D  .
	sta	object_tile,x			; 482F
	sta	map_status,x			; 4832
@noobject:
	lda	tile_under_player		; 4835
	sta	player_transport		; 4837
	rts					; 4839

cmd_cast:
	jsr	j_primm				; 483A
	.byte	$C3,$E1,$F3,$F4,$A0,$F3,$F0,$E5	; 483D  Cast spe
	.byte	$EC,$EC,$BA,$8D,$F0,$EC,$E1,$F9	; 4845  ll:Mplay
	.byte	$E5,$F2,$AD,$00			; 484D  er-.

	jsr	j_getplayernum			; 4851
	bne	@checknum			; 4854
@none:
	jmp	print_not_a_player		; 4856

@checknum:
	cmp	party_size			; 4859
	beq	@gotplayer			; 485B
	bcs	@none				; 485D
@gotplayer:
	sta	currplayer			; 485F
	jsr	check_awake			; 4861
	bpl	@playerok			; 4864
	jmp	print_disabled			; 4866

@playerok:
	jsr	list_mixtures			; 4869
	jsr	j_primm				; 486C
	.byte	$D3,$D0,$C5,$CC,$CC,$AD,$00	; 486F  SPELL-.

	jsr	getandprintkey			; 4876
	pha					; 4879
	jsr	j_clearstatwindow		; 487A
	jsr	j_update_status			; 487D
	lda	game_mode			; 4880
	bpl	@notcombat			; 4882
	jsr	invert_player_line		; 4884
@notcombat:
	pla					; 4887
	sec					; 4888
	sbc	#$C1				; 4889  A
	cmp	#$1A				; 488B  Z
	bcc	@validspell			; 488D
	jmp	cmd_unknown			; 488F

@validspell:
	sta	@currspell			; 4892
	clc					; 4895
	adc	#$65				; 4896  e
	jsr	j_printstring			; 4898
	jsr	j_primm				; 489B
	.byte	$A1,$8D,$00			; 489E  !M.

	ldy	@currspell			; 48A1
	lda	mixtures,y			; 48A4
	bne	@havemixed			; 48A7
	jmp	print_you_have_none		; 48A9

@havemixed:
	sed					; 48AC
	sec					; 48AD
	sbc	#$01				; 48AE  A
	sta	mixtures,y			; 48B0
	cld					; 48B3
	jsr	j_get_stats_ptr			; 48B4
	ldy	#$16				; 48B7  V
	lda	(ptr1),y			; 48B9
	ldx	@currspell			; 48BB
	sed					; 48BE
	sec					; 48BF
	sbc	@mpcost,x			; 48C0
	cld					; 48C3
	bcs	@decmp				; 48C4
	jsr	j_primm				; 48C6
	.byte	$CD,$AE,$D0,$AE,$A0,$D4,$CF,$CF	; 48C9  M.P. TOO
	.byte	$A0,$CC,$CF,$D7,$A1,$8D,$00	; 48D1   LOW!M.

	jmp	spell_failed			; 48D8

@decmp:
	sta	(ptr1),y			; 48DB
	lda	@currspell			; 48DD
	asl	a				; 48E0
	tay					; 48E1
	lda	@spelljumptable,y		; 48E2
	sta	ptr1				; 48E5
	lda	@spelljumptable+1,y		; 48E7
	sta	ptr1+1				; 48EA
	jmp	(ptr1)				; 48EC

@currspell:
	.byte	$00				; 48EF  .

@spelljumptable:
	.addr	spell_awaken			; 48F0
	.addr	spell_blink			; 48F2
	.addr	spell_cure			; 48F4
	.addr	spell_dispel			; 48F6
	.addr	spell_energyfield		; 48F8
	.addr	spell_fireball			; 48FA
	.addr	spell_gate			; 48FC
	.addr	spell_heal			; 48FE
	.addr	spell_iceball			; 4900
	.addr	spell_jinx			; 4902
	.addr	spell_kill			; 4904
	.addr	spell_light			; 4906
	.addr	spell_magicmissle		; 4908
	.addr	spell_negate			; 490A
	.addr	spell_open			; 490C
	.addr	spell_protect			; 490E
	.addr	spell_quick			; 4910
	.addr	spell_resurrect			; 4912
	.addr	spell_sleep			; 4914
	.addr	spell_tremor			; 4916
	.addr	spell_undead			; 4918
	.addr	spell_view			; 491A
	.addr	spell_winds			; 491C
	.addr	spell_xit			; 491E
	.addr	spell_yup			; 4920
	.addr	spell_zdown			; 4922

@mpcost:
	.byte	$05,$15,$05,$20,$10,$15,$40,$10	; 4924  EUE PU@P
	.byte	$20,$30,$25,$05,$05,$20,$05,$15	; 492C   0%EE EU
	.byte	$20,$45,$15,$30,$15,$15,$10,$15	; 4934   EU0UUPU
	.byte	$10,$05				; 493C  PE

spell_awaken:
	jsr	j_primm				; 493E
	.byte	$D7,$C8,$CF,$AD,$00		; 4941  WHO-.

	jsr	j_getplayernum			; 4946
	bne	@gotnum				; 4949
@fail:
	jmp	spell_failed			; 494B

@gotnum:
	jsr	spell_play_effect		; 494E
	jsr	j_get_stats_ptr			; 4951
	ldy	#$12				; 4954  R
	lda	(ptr1),y			; 4956
	cmp	#$D3				; 4958  S
	bne	@fail				; 495A
	lda	#$C7				; 495C  G
	sta	(ptr1),y			; 495E
	lda	game_mode			; 4960
	bpl	@notcombat			; 4962
	jsr	something_based_on_status_and_class; 4964
	ldx	currplayer			; 4967
	sta	$AD9F,x				; 4969
@notcombat:
	jmp	print_done			; 496C

spell_blink:
	lda	player_transport		; 496F
	cmp	#$14				; 4971  T
	bcs	@notinship			; 4973
@fail:
	jmp	spell_failed			; 4975

@notinship:
	jsr	spell_ensure_outdoors		; 4978
	jsr	print_direction			; 497B
	jsr	getdirection			; 497E
	jsr	spell_play_effect		; 4981
	lda	player_xpos			; 4984
	and	player_ypos			; 4986
	cmp	#$C0				; 4988  @
	bcc	@notnearabyss			; 498A
	jmp	spell_failed			; 498C

@notnearabyss:
	jsr	@incdist			; 498F
	cmp	#$FF				; 4992  .
	bne	@notnearabyss			; 4994
@next:
	jsr	@decdist			; 4996
	cmp	#$FF				; 4999  .
	beq	@fail				; 499B
	jsr	j_blocked_tile			; 499D
	bmi	@next				; 49A0
	lda	$7A				; 49A2
	sta	player_xpos			; 49A4
	lda	$7B				; 49A6
	sta	player_ypos			; 49A8
	jsr	music_nop			; 49AA
	jsr	j_player_teleport		; 49AD
	jmp	print_done			; 49B0

@incdist:
	clc					; 49B3
	lda	$7A				; 49B4
	adc	$78				; 49B6
	sta	$7A				; 49B8
	clc					; 49BA
	lda	$7B				; 49BB
	adc	$79				; 49BD
	sta	$7B				; 49BF
	jsr	j_gettile_bounds		; 49C1
	rts					; 49C4

@decdist:
	sec					; 49C5
	lda	$7A				; 49C6
	sbc	$78				; 49C8
	sta	$7A				; 49CA
	sec					; 49CC
	lda	$7B				; 49CD
	sbc	$79				; 49CF
	sta	$7B				; 49D1
	jsr	j_gettile_bounds		; 49D3
	rts					; 49D6

spell_cure:
	jsr	j_primm				; 49D7
	.byte	$D7,$C8,$B0,$AD,$00		; 49DA  WH0-.

	jsr	j_getplayernum			; 49DF
	bne	@gotnum				; 49E2
@fail:
	jmp	spell_failed			; 49E4

@gotnum:
	jsr	spell_play_effect		; 49E7
	jsr	j_get_stats_ptr			; 49EA
	ldy	#$12				; 49ED  R
	lda	(ptr1),y			; 49EF
	cmp	#$D0				; 49F1  P
	bne	@fail				; 49F3
	lda	#$C7				; 49F5  G
	sta	(ptr1),y			; 49F7
	jmp	print_done			; 49F9

spell_dispel:
	lda	game_mode			; 49FC
	cmp	#$03				; 49FE  C
	beq	@dungeon			; 4A00
	jsr	print_direction			; 4A02
	lda	game_mode			; 4A05
	bmi	@combat				; 4A07
	cmp	#$01				; 4A09  A
	bne	@towne				; 4A0B
	beq	@britannia			; 4A0D
@fail:
	jmp	spell_failed			; 4A0F

@britannia:
	jsr	getdirection			; 4A12
	beq	@fail				; 4A15
	jsr	spell_play_effect		; 4A17
	jsr	j_gettile_bounds		; 4A1A
@checktile:
	cmp	#$44				; 4A1D  D
	bcc	@fail				; 4A1F
	cmp	#$48				; 4A21  H
	bcs	@fail				; 4A23
	lda	tile_under_player		; 4A25
	sta	(ptr2),y			; 4A27
	jmp	print_done			; 4A29

@towne:
	jsr	getdirection			; 4A2C
	beq	@fail				; 4A2F
	jsr	spell_play_effect		; 4A31
	jsr	j_gettile_town			; 4A34
	jmp	@checktile			; 4A37

@combat:
	jsr	combat_getdirection		; 4A3A
	beq	@fail				; 4A3D
	jsr	spell_play_effect		; 4A3F
	jsr	j_gettile_combat		; 4A42
	sta	tile_under_player		; 4A45
	clc					; 4A47
	lda	$16				; 4A48
	adc	$78				; 4A4A
	sta	$16				; 4A4C
	clc					; 4A4E
	lda	$17				; 4A4F
	adc	$79				; 4A51
	sta	$17				; 4A53
	jsr	j_gettile_combat		; 4A55
	cmp	#$44				; 4A58  D
	bcc	@fail				; 4A5A
	cmp	#$48				; 4A5C  H
	bcs	@fail				; 4A5E
	lda	tile_under_player		; 4A60
	sta	tempmap,y			; 4A62
	jmp	print_done			; 4A65

@dungeon:
	jsr	spell_play_effect		; 4A68
	clc					; 4A6B
	ldx	dng_direction			; 4A6C
	lda	player_xpos			; 4A6E
	adc	dng_move_deltax,x		; 4A70
	sta	$16				; 4A73
	clc					; 4A75
	lda	player_ypos			; 4A76
	adc	dng_move_deltay,x		; 4A78
	sta	$17				; 4A7B
	jsr	j_gettile_dungeon		; 4A7D
	and	#$F0				; 4A80  p
	cmp	#$A0				; 4A82   
	bne	@fail				; 4A84
	lda	#$00				; 4A86  .
	sta	(ptr1),y			; 4A88
	jmp	print_done			; 4A8A

spell_energyfield:
	jsr	j_primm				; 4A8D
	.byte	$D4,$D9,$D0,$C5,$AD,$00		; 4A90  TYPE-.

	jsr	getandprintkey			; 4A96
	ldx	#$44				; 4A99  D
	cmp	#$D0				; 4A9B  P
	beq	@gottype			; 4A9D
	inx					; 4A9F
	cmp	#$CC				; 4AA0  L
	beq	@gottype			; 4AA2
	inx					; 4AA4
	cmp	#$C6				; 4AA5  F
	beq	@gottype			; 4AA7
	inx					; 4AA9
	cmp	#$D3				; 4AAA  S
	beq	@gottype			; 4AAC
@fail:
	jmp	spell_failed			; 4AAE

@gottype:
	stx	$6A				; 4AB1
	lda	game_mode			; 4AB3
	bmi	@combat				; 4AB5
	cmp	#$03				; 4AB7  C
	bne	@fail				; 4AB9
	jsr	spell_play_effect		; 4ABB
	ldx	dng_direction			; 4ABE
	clc					; 4AC0
	lda	player_xpos			; 4AC1
	adc	dng_move_deltax,x		; 4AC3
	sta	$16				; 4AC6
	clc					; 4AC8
	lda	player_ypos			; 4AC9
	adc	dng_move_deltay,x		; 4ACB
	sta	$17				; 4ACE
	jsr	j_gettile_dungeon		; 4AD0
	bne	@fail				; 4AD3
	lda	$6A				; 4AD5
	and	#$03				; 4AD7  C
	ora	#$A0				; 4AD9   
	sta	(ptr1),y			; 4ADB
	jmp	print_done			; 4ADD

@combat:
	jsr	print_direction			; 4AE0
	jsr	combat_getdirection		; 4AE3
	beq	@fail				; 4AE6
	clc					; 4AE8
	lda	$16				; 4AE9
	adc	$78				; 4AEB
	sta	$16				; 4AED
	cmp	#$0B				; 4AEF  K
	bcs	@fail				; 4AF1
	clc					; 4AF3
	lda	$17				; 4AF4
	adc	$79				; 4AF6
	sta	$17				; 4AF8
	cmp	#$0B				; 4AFA  K
	bcs	@fail				; 4AFC
	jsr	spell_play_effect		; 4AFE
	jsr	j_gettile_combat		; 4B01
	jsr	j_blocked_tile			; 4B04
	bmi	@fail				; 4B07
	lda	$6A				; 4B09
	sta	tempmap,y			; 4B0B
	jmp	print_done			; 4B0E

spell_fireball:
	jsr	spell_ensure_combat		; 4B11
	jsr	print_direction			; 4B14
	jsr	combat_getdirection		; 4B17
	bne	@gotdir				; 4B1A
@fail:
	lda	#$00				; 4B1C  .
	sta	missile				; 4B1E
	jmp	spell_failed			; 4B21

@gotdir:
	jsr	spell_play_effect		; 4B24
	lda	#$4F				; 4B27  O
	sta	missile				; 4B29
spell_shoot_missile:
	lda	$16				; 4B2C
	sta	missile_xpos			; 4B2E
	lda	$17				; 4B31
	sta	missile_ypos			; 4B33
@again:
	jsr	combat_fire_missile		; 4B36
	bmi	@fail				; 4B39
	jsr	j_idle_combat			; 4B3B
	jsr	combat_find_monster		; 4B3E
	bmi	@again				; 4B41
	lda	#$06				; 4B43  F
	jsr	j_playsfx			; 4B45
	lda	missile				; 4B48
	cmp	#$4D				; 4B4B  M
	beq	@magic_missile			; 4B4D
	cmp	#$4E				; 4B4F  N
	beq	@iceball			; 4B51
	cmp	#$4F				; 4B53  O
	beq	@fireball			; 4B55
	lda	#$E8				; 4B57  h
	jmp	@gotdmg				; 4B59

@fireball:
	lda	#$80				; 4B5C  .
	jsr	randmax				; 4B5E
	ora	#$18				; 4B61  X
	jmp	@gotdmg				; 4B63

@iceball:
	lda	#$E0				; 4B66  `
	jsr	randmax				; 4B68
	ora	#$20				; 4B6B   
	jmp	@gotdmg				; 4B6D

@magic_missile:
	lda	#$40				; 4B70  @
	jsr	randmax				; 4B72
	ora	#$10				; 4B75  P
@gotdmg:
	ldx	#$00				; 4B77  .
	stx	missile				; 4B79
	sta	$5C				; 4B7C
	jsr	hurt_monster			; 4B7E
	jmp	print_done			; 4B81

spell_gate:
	lda	player_transport		; 4B84
	cmp	#$14				; 4B86  T
	bcc	@fail				; 4B88
	lda	game_mode			; 4B8A
	cmp	#$01				; 4B8C  A
	beq	@print_to_phase			; 4B8E
	jmp	spell_ensure_outdoors		; 4B90

@print_to_phase:
	jsr	j_primm				; 4B93
	.byte	$D4,$CF,$A0,$D0,$C8,$C1,$D3,$C5	; 4B96  TO PHASE
	.byte	$AD,$00				; 4B9E  -.

	jsr	getandprintkey			; 4BA0
	sec					; 4BA3
	sbc	#$B1				; 4BA4  1
	cmp	#$08				; 4BA6  H
	bcc	@gotphase			; 4BA8
@fail:
	jmp	spell_failed			; 4BAA

@gotphase:
	sta	$6A				; 4BAD
	jsr	spell_play_effect		; 4BAF
	ldx	$6A				; 4BB2
	lda	moongate_xpos,x			; 4BB4
	sta	player_xpos			; 4BB7
	lda	moongate_ypos,x			; 4BB9
	sta	player_ypos			; 4BBC
	jsr	music_nop			; 4BBE
	jsr	j_player_teleport		; 4BC1
	jmp	print_done			; 4BC4

moongate_xpos:
	.byte	$E0,$60,$26,$32,$A6,$68,$17,$BB	; 4BC7  ``&2&hW;
moongate_ypos:
	.byte	$85,$66,$E0,$25,$13,$C2,$7E,$A7	; 4BCF  Ef`%SB~'

spell_heal:
	jsr	j_primm				; 4BD7
	.byte	$D7,$C8,$CF,$AD,$00		; 4BDA  WHO-.

	jsr	j_getplayernum			; 4BDF
	bne	@gotplayer			; 4BE2
@fail:
	jmp	spell_failed			; 4BE4

@gotplayer:
	jsr	spell_play_effect		; 4BE7
	jsr	check_alive			; 4BEA
	bmi	@fail				; 4BED
	lda	#$19				; 4BEF  Y
	jsr	randmax				; 4BF1
	clc					; 4BF4
	adc	#$4B				; 4BF5  K
	jsr	hextobcd			; 4BF7
	jsr	stat_add_hp			; 4BFA
	jmp	print_done			; 4BFD

spell_iceball:
	jsr	spell_ensure_combat		; 4C00
	jsr	print_direction			; 4C03
	jsr	combat_getdirection		; 4C06
	bne	@gotdir				; 4C09
	jmp	spell_failed			; 4C0B

@gotdir:
	jsr	spell_play_effect		; 4C0E
	lda	#$4E				; 4C11  N
	sta	missile				; 4C13
	jmp	spell_shoot_missile		; 4C16

spell_jinx:
	jsr	spell_play_effect		; 4C19
	lda	#$CA				; 4C1C  J
spell_set_aura:
	sta	magic_aura			; 4C1E
	lda	#$0A				; 4C20  J
	sta	aura_duration			; 4C22
	jmp	print_done			; 4C24

spell_kill:
	jsr	spell_ensure_combat		; 4C27
	jsr	print_direction			; 4C2A
	jsr	combat_getdirection		; 4C2D
	bne	@gotdir				; 4C30
	jmp	spell_failed			; 4C32

@gotdir:
	jsr	spell_play_effect		; 4C35
	lda	#$8C				; 4C38  L
	sta	missile				; 4C3A
	jmp	spell_shoot_missile		; 4C3D

spell_light:
	jsr	spell_play_effect		; 4C40
	lda	#$64				; 4C43  d
	sta	light_duration			; 4C45
	lda	game_mode			; 4C47
	cmp	#$03				; 4C49  C
	bne	@notdungeon			; 4C4B
	jsr	L8C06				; 4C4D
@notdungeon:
	jmp	print_done			; 4C50

spell_magicmissle:
	jsr	spell_ensure_combat		; 4C53
	jsr	print_direction			; 4C56
	jsr	combat_getdirection		; 4C59
	bne	@gotdir				; 4C5C
	jmp	spell_failed			; 4C5E

@gotdir:
	jsr	spell_play_effect		; 4C61
	lda	#$4D				; 4C64  M
	sta	missile				; 4C66
	jmp	spell_shoot_missile		; 4C69

spell_negate:
	jsr	spell_play_effect		; 4C6C
	lda	#$CE				; 4C6F  N
	jmp	spell_set_aura			; 4C71

spell_open:
	jsr	spell_play_effect		; 4C74
	lda	game_mode			; 4C77
	bmi	@combat				; 4C79
	lda	#$00				; 4C7B  .
	sta	currplayer			; 4C7D
	jmp	get_chest			; 4C7F

@combat:
	jmp	combat_open_chest		; 4C82

spell_protect:
	jsr	spell_play_effect		; 4C85
	lda	#$D0				; 4C88  P
	jmp	spell_set_aura			; 4C8A

spell_quick:
	jsr	spell_play_effect		; 4C8D
	lda	#$D1				; 4C90  Q
	jmp	spell_set_aura			; 4C92

spell_resurrect:
	lda	game_mode			; 4C95
	bpl	L4C9C				; 4C97
L4C99:
	jmp	spell_failed			; 4C99

L4C9C:
	jsr	j_primm				; 4C9C
	.byte	$D7,$C8,$CF,$AD,$00		; 4C9F  WHO-.

	jsr	j_getplayernum			; 4CA4
	bne	L4CAC				; 4CA7
	jmp	spell_failed			; 4CA9

L4CAC:
	jsr	spell_play_effect		; 4CAC
	jsr	j_get_stats_ptr			; 4CAF
	ldy	#$12				; 4CB2  R
	lda	(ptr1),y			; 4CB4
	cmp	#$C4				; 4CB6  D