antoine-source/ultima2/STD.SUBS.S
Antoine Vignau f01d3d6876 relocatable
2024-08-03 08:56:22 +02:00

784 lines
16 KiB
ArmAsm

*
* Ultima II: The Revenge of the Enchanteress
*
* (c) 1982, Sierra On-Line
* (s) 2020, John Disam
*
TYP BIN
ORG $4000
MX %11
LST OFF
*----------------------------
SPKR EQU $C030
PRNTAX EQU $F941
VTAB EQU $FC22
RDKEY EQU $FD0C
COUT EQU $FDED
SETINV EQU $FE80
SETNORM EQU $FE84
L4A00 EQU $4A00
L4D00 EQU $4D00
L4E00 EQU $4E00
L9154 EQU $9154
L927D EQU $927D
L933D EQU $933D
L93FD EQU $93FD
*----------------------------
L4000 SEC
LDA $00
SBC L4D00+$00,X
ASL
ASL
JSR L44BD
STA $17
SEC
LDA $01
SBC L4D00+$20,X
ASL
ASL
JSR L44BD
STA $18
RTS
L401B SEC
LDA $00
SBC L4D00+$00,X
STA $17
SEC
LDA $01
SBC L4D00+$20,X
STA $18
RTS
L402C PLA
STA $FE
PLA
STA $FF
LDY #$00
L4034 INC $FE
BNE L403A
INC $FF
L403A LDA ($FE),Y
BEQ L4046
ORA #$80
JSR COUT
JMP L4034
L4046 LDA $FF
PHA
LDA $FE
PHA
RTS
L404D LDA #>HGR1
STA $FD
LDA #<HGR1
STA $FC
L4055 LDY #$00
L4057 LDA ($FC),Y
EOR #$FF
STA ($FC),Y
DEY
BNE L4057
INC $FD
LDA $FD
CMP #>HGR2
BCC L4055
RTS
L4069 LDA L4E00+$10
CMP #$CD
BNE L4079
JSR L402C
ASC "MALE"00
RTS
L4079 JSR L402C
ASC "FEMALE"00
RTS
L4084 LDA #$00
STA $FC
LDA #L4E00+$
STA $FD
LDX #$00
L408E LDA ($FC,X)
BEQ L409B
JSR COUT
JSR L40C5
JMP L408E
L409B RTS
L409C TAY
LDA #<L40D3
STA $FC
LDA #>L40D3
STA $FD
LDX #$00
L40A7 LDA ($FC,X)
BEQ L40B1
L40AB JSR L40C5
JMP L40A7
L40B1 DEY
BEQ L40B7
JMP L40AB
L40B7 JSR L40C5
LDA ($FC,X)
BEQ L40C4
JSR COUT
JMP L40B7
L40C4 RTS
L40C5 LDA $FC
CLC
ADC #$01
STA $FC
LDA $FD
ADC #$00
STA $FD
RTS
L40D3 ASC 00
ASC "IN THE WATER."00
ASC "IN A MARSH."00
ASC "ON GRASS."00
ASC "IN WOODS."00
ASC "IN THE MTS."00
ASC "NEAR A VILLAGE."00
ASC "NEAR A TOWNE."00
ASC "NEAR A TOWER."00
ASC "NEAR A CASTLE."00
ASC "NEAR A DUNGEON."00
ASC "NEAR A SIGN."00
ASC "NEAR A HORSE."00
ASC "NEAR A FRIGATE."00
ASC "NEAR A PLANE."00
ASC "NEAR A ROCKET."00
ASC "NEAR ARMOUR."00
ASC "NEAR A HOLE."00
ASC "ON COBBLE."00
ASC "HANDS"00
ASC "DAGGER"00
ASC "MACE"00
ASC "AXE"00
ASC "BOW"00
ASC "SWORD"00
ASC "GREAT SWORD"00
ASC "LIGHT SWORD"00
ASC "PHASER"00
ASC "QUICK SWORD"00
ASC "SKIN"00
ASC "CLOTH"00
ASC "LEATHER"00
ASC "CHAIN"00
ASC "PLATE"00
ASC "REFLECT"00
ASC "POWER"00
ASC "NONE"00
ASC "LIGHT"00
ASC "DOWN LADDER"00
ASC "UP LADDER"00
ASC "PASSWALL"00
ASC "SURFACE"00
ASC "PRAYER"00
ASC "MAGIC MISSILE"00
ASC "BLINK"00
ASC "KILL"00
ASC "RING"00
ASC "WAND"00
ASC "STAFF"00
ASC "BOOT"8000
ASC "CLOAK"00
ASC "HELM"00
ASC "GEM"00
ASC "ANKH"00
ASC "RED GEM"00
ASC "SKULL KEY"00
ASC "GREEN GEM"00
ASC "BRASS BUTTON"00
ASC "BLUE TASSLE"00
ASC "STRANGE COIN"00
ASC "GREEN IDOL"00
ASC "TRI-LITHIUM"00
ASC "STRENGTH"00
ASC "AGILITY"00
ASC "STAMINA"00
ASC "CHARISMA"00
ASC "WISDOM"00
ASC " INTEL."00
ASC "HUMAN"00
ASC "ELF"00
ASC "DWARF"00
ASC "HOBBIT"00
ASC "FIGHTER"00
ASC "CLERIC"00
ASC "WIZARD"00
ASC "THIEF"00
MX %11
L437B LDY #$00
LDA $F5
STA $07
LDA #$00
TAY
LSR $07
ROR
LSR $07
ROR
ADC $F4
STA $06
CLC
LDA $07
ADC #$10
STA $07
LDA ($06),Y
RTS
L4398 HEX FF
L4399 LDA L4398
BNE L439F
RTS
L439F LDX #$A0
TXA
TAY
L43A3 DEX
BNE L43A3
BIT SPKR
DEY
TYA
TAX
BNE L43A3
RTS
L43AF LDA L4398
BNE L43B5
RTS
L43B5 LDA #$40
STA $FC
LDA #$E0
STA $FD
L43BD JSR L4592
ORA $FD
TAX
L43C3 DEX
BNE L43C3
BIT SPKR
DEC $FD
LDA $FD
CMP $FC
BCS L43BD
RTS
L43D2 LDA L4398
BNE L43D8
RTS
L43D8 LDX #$00
STA $FC
L43DC INX
BNE L43DC
BIT SPKR
DEC $FC
LDX $FC
BNE L43DC
RTS
L43E9 LDA L4398
BNE L43EF
RTS
L43EF LDA #$08
STA $FC
LDA #$00
STA $FD
L43F7 JSR L4592
ORA $FD
TAX
L43FD DEX
BNE L43FD
BIT SPKR
DEC $FC
BNE L43F7
RTS
L4408 LDA L4398
BNE L440E
RTS
L440E LDA #$FF
STA $FC
LDA #$00
STA $FD
JMP L43F7
L4419 LDA L4398
BNE L441F
RTS
L441F LDA #$FF
STA $FC
LDA #$C0
STA $FD
JMP L43F7
L442A LDA #$80
STA $FC
LDA #$40
STA $FD
JMP L4435
L4435 LDA L4398
BNE L443B
RTS
L443B LDA |$00FC ; NOT ZP - BUG, USE ZP MODE
STA L44A5
LDA #$01
STA L44A4
L4446 LDA |$00FD
L4449 PHA
LDX L44A5
L444D DEX
BNE L444D
BIT SPKR
LDX L44A4
L4456 DEX
BNE L4456
BIT SPKR
PLA
TAX
DEX
TXA
BNE L4449
LDA L44A4
CLC
ADC #$01
CMP #$1B
BEQ L4475
STA L44A4
DEC L44A5
JMP L4446
L4475 LDA |$00FD
L4478 PHA
LDX L44A5
L447C DEX
BNE L447C
BIT SPKR
LDX L44A4
L4485 DEX
BNE L4485
BIT SPKR
PLA
TAX
DEX
TXA
BNE L4478
LDA L44A4
SEC
SBC #$01
CMP #$01
BEQ L44A6
STA L44A4
INC L44A5
JMP L4475
L44A4 HEX 20
L44A5 HEX 31
L44A6 RTS
L44A7 LDA #$C0
STA $FC
LDA #$18
STA $FD
JMP L4435
LDA #$FF
STA $FC
LDA #$06
STA $FD
JMP L4435
L44BD CMP #$00
BEQ L44C8
BPL L44C6
LDA #$FF
RTS
L44C6 LDA #$01
L44C8 RTS
L44C9 CMP #$00
BEQ L44C8
CMP #$20
BCC L44C6
LDA #$FF
RTS
L44D4 CMP #$80
BCC L44C8
EOR #$FF
CLC
ADC #$01
RTS
L44DE LDA #$28
STA $21
LDA #$1E
STA $24
LDA #$13
STA $25
JSR L402C
ASC 0A
ASC "H.P.="00
LDX L4E00+$1C
LDA L4E00+$1B
BNE L44FF
JSR SETINV
L44FF JSR PRNTAX
JSR SETNORM
LDA #$1E
STA $24
JSR L402C
ASC 0A
ASC "FOOD="00
LDX L4E00+$1E
LDA L4E00+$1D
BNE L451E
JSR SETINV
L451E JSR PRNTAX
JSR SETNORM
LDA #$1E
STA $24
JSR L402C
ASC 0A
ASC "EXP.="00
LDA L4E00+$20
LDX L4E00+$21
JSR PRNTAX
LDA #$1E
STA $24
JSR L402C
ASC 0A
ASC "GOLD="00
LDA L4E00+$22
LDX L4E00+$23
JSR PRNTAX
LDA #$1E
STA $21
LDX #$00
LDY #$17
JSR L458A
RTS
L455E JSR RDKEY
CMP #$B0
BCC L455E
CMP #$BA
BCS L455E
JSR COUT
SEC
SBC #$B0
ASL
ASL
ASL
ASL
STA $FC
L4575 JSR RDKEY
CMP #$B0
BCC L4575
CMP #$BA
BCS L4575
JSR COUT
SEC
SBC #$B0
CLC
ADC $FC
RTS
L458A STX $24
STY $25
JSR VTAB
RTS
L4592 LDA $4E
ADC $4F
LDX $4F
STX $4E
STA $4F
RTS
L459D LDA #$6F
STA $A2
LDA #$7E
STA $A0
LDA #$00
STA $A1
LDA $18
CMP #$01
BEQ L45C1
CMP #$FF
BEQ L45C9
LDA $17
CMP #$01
BEQ L45D1
CMP #$FF
BEQ L45D9
JSR L45E1
RTS
L45C1 LDA #$5F
STA $A2
JSR L45E1
RTS
L45C9 LDA #$7F
STA $A2
JSR L45E1
RTS
L45D1 LDA #$8C
STA $A0
JSR L45E1
RTS
L45D9 LDA #$70
STA $A0
JSR L45E1
RTS
L45E1 STA $AB
STX $AC
STY $AD
LDA $A2
PHA
LDX $A0
LDY L9154,X
STY $AA
LDA L93FD,X
ASL
TAX
LDA L463B,X
STA $A5
LDA L463B+1,X
STA $A6
LDX #$10
STX $A8
L4604 LDY $A2
LDA L927D,Y
STA $A3
LDA L933D,Y
STA $A4
LDX #$02
STX $A9
LDX #$00
LDY $AA
L4618 LDA ($A5,X)
BEQ L4620
EOR ($A3),Y
STA ($A3),Y
L4620 INY
INC $A5
BNE L4627
INC $A6
L4627 DEC $A9
BPL L4618
DEC $A2
DEC $A8
BNE L4604
PLA
STA $A2
LDA $AB
LDX $AC
LDY $AD
RTS
L463B DA L4649
DA L4649
DA L4649
DA L4649
DA L4649
DA L4649
DA L4649
L4649 HEX 600300780F007C1F007E3F007E3F007F
HEX 7F007F7F007F7F007F7F007F7F007F7F
HEX 007E3F007E3F007C1F00780F00600300
L4679 EOR #$FF
STA $F6
INC $F6
LDA #$38
LDA $F4
SBC $F2
STA $F6
BCS L4696
L4689 EOR #$FF
STA $F6
INC $F6
LDA #$FF
STA $F8
JMP L469A
L4696 LDA #$01
STA $F8
L469A SEC
LDA $F5
SBC $F3
STA $F7
BCS L46B0
EOR #$FF
STA $F7
INC $F7
LDA #$FF
STA $F9
JMP L46B4
L46B0 LDA #$01
STA $F9
L46B4 LDA $F6
CMP $F7
BCS L46BD
JMP L46E8
L46BD LDA $F6
STA $FA
LSR
STA $FB
L46C4 CLC
LDA $FB
ADC $F7
STA $FB
SEC
SBC $F6
BCC L46D9
STA $FB
CLC
LDA $F3
ADC $F9
STA $F3
L46D9 CLC
LDA $F2
ADC $F8
STA $F2
JSR L4713
DEC $FA
BNE L46C4
RTS
L46E8 LDA $F7
STA $FA
LSR
STA $FB
L46EF CLC
LDA $FB
ADC $F6
STA $FB
SEC
SBC $F7
BCC L4704
STA $FB
CLC
LDA $F2
ADC $F8
STA $F2
L4704 CLC
LDA $F3
ADC $F9
STA $F3
JSR L4713
DEC $FA
BNE L46EF
RTS
L4713 LDY $F1
LDA L472C,Y
STA $FE
LDA L47EC,Y
STA $FF
LDX $F0
LDY L48AC,X
LDA L49CB,X
ORA ($FE),Y
STA ($FE),Y
RTS
* HGR table
L472C HEX 00000000000000008080808080808080
HEX 00000000000000008080808080808080
HEX 00000000000000008080808080808080
HEX 00000000000000008080808080808080
HEX 2828282828282828A8A8A8A8A8A8A8A8
HEX 2828282828282828A8A8A8A8A8A8A8A8
HEX 2828282828282828A8A8A8A8A8A8A8A8
HEX 2828282828282828A8A8A8A8A8A8A8A8
HEX 5050505050505050D0D0D0D0D0D0D0D0
HEX 5050505050505050D0D0D0D0D0D0D0D0
HEX 5050505050505050D0D0D0D0D0D0D0D0
HEX 5050505050505050D0D0D0D0D0D0D0D0
L47EC HEX 2024282C3034383C2024282C3034383C
HEX 2125292D3135393D2125292D3135393D
HEX 22262A2E32363A3E22262A2E32363A3E
HEX 23272B2F33373B3F23272B2F33373B3F
HEX 2024282C3034383C2024282C3034383C
HEX 2125292D3135393D2125292D3135393D
HEX 22262A2E32363A3E22262A2E32363A3E
HEX 23272B2F33373B3F23272B2F33373B3F
HEX 2024282C3034383C2024282C3034383C
HEX 2125292D3135393D2125292D3135393D
HEX 22262A2E32363A3E22262A2E32363A3E
HEX 23272B2F33373B3F23272B2F33373B3F
* Pointer tables of more than 256 entries...
L48AC HEX 00000000000000010101010101010202
HEX 02020202020303030303030304040404
HEX 04040405050505050505060606060606
HEX 06070707070707070808080808080809
HEX 0909090909090A0A0A0A0A0A0A0B0B0B
HEX 0B0B0B0B0C0C0C0C0C0C0C0D0D0D0D0D
HEX 0D0D0E0E0E0E0E0E0E0F0F0F0F0F0F0F
HEX 10101010101010111111111111111212
HEX 12121212121313131313131314141414
HEX 14141415151515151515161616161616
HEX 16171717171717171818181818181819
HEX 1919191919191A1A1A1A1A1A1A1B1B1B
HEX 1B1B1B1B1C1C1C1C1C1C1C1D1D1D1D1D
HEX 1D1D1E1E1E1E1E1E1E1F1F1F1F1F1F1F
HEX 20202020202020212121212121212222
HEX 22222222222323232323232324242424
HEX 24242425252525252525262626262626
HEX 262727272727272728282828282828
L49CB HEX 01020408102040010204081020400102
HEX 04081020400102040810204001020408
HEX 10204001020408102040010204081020
HEX 40010204081020400102040810204001
HEX 02040810204001020408102040010204
HEX 08102040010204081020400102040810
HEX 20400102040810204001020408102040
HEX 01020408102040010204081020400102
HEX 04081020400102040810204001020408
HEX 10204001020408102040010204081020
HEX 40010204081020400102040810204001
HEX 02040810204001020408102040010204
HEX 08102040010204081020400102040810
HEX 20400102040810204001020408102040
HEX 01020408102040010204081020400102
HEX 04081020400102040810204001020408
HEX 10204001020408102040010204081020
HEX 4001020408102040