mirror of
https://github.com/a2geek/jewel-of-kaldun.git
synced 2025-03-20 07:29:34 +00:00
296 lines
10 KiB
ArmAsm
Executable File
296 lines
10 KiB
ArmAsm
Executable File
********************************
|
|
* Jewel of Kaldun loader *
|
|
* program. *
|
|
********************************
|
|
|
|
TYP $FF ; system program
|
|
ORG $2000 ; they originate @ $2000
|
|
|
|
* General Macros --
|
|
|
|
MOVB MAC
|
|
LDA ]1
|
|
STA ]2
|
|
EOM
|
|
|
|
MOVW MAC
|
|
MOVB ]1;]2
|
|
IF #=]1
|
|
MOVB ]1/$100;]2+1
|
|
ELSE
|
|
MOVB ]1+1;]2+1
|
|
FIN
|
|
EOM
|
|
|
|
* ProDOS Command Codes --
|
|
|
|
OPEN = $C8 ; open file
|
|
READ = $CA ; read file
|
|
CLOSE = $CC ; close file
|
|
|
|
* ProDOS addresses --
|
|
|
|
MLI = $BF00
|
|
|
|
* ProDOS Macro commands --
|
|
* call: @name parameter #1;parameter #2; ... ;parameter #n
|
|
|
|
@OPEN MAC ; @open path;file_buffer; (1K)
|
|
MOVW ]1;D:C8PATH ; reference_number (ret)
|
|
MOVW ]2;D:C8BUFF
|
|
JSR _OPEN
|
|
MOVB D:C8REF;]3
|
|
EOM
|
|
|
|
@READ MAC ; @read ref_num;input_buff;
|
|
MOVB ]1;D:CAREF ; requested_length
|
|
MOVW ]2;D:CABUFF ; (actual_length returned)
|
|
MOVW ]3;D:CARLEN
|
|
JSR _READ
|
|
EOM
|
|
|
|
@CLOSE MAC ; @close reference_number
|
|
MOVB ]1;D:CCREF
|
|
JSR _CLOSE
|
|
EOM
|
|
|
|
* Memory locations:
|
|
|
|
PTR EQU $00 ; pointer for checksum
|
|
LINE10 EQU $05A8 ; text line #10
|
|
LINE12 EQU $06A8 ; " " #12
|
|
LINE15 EQU $0450 ; " " #15
|
|
LINE24 EQU $07D0 ; " " #24
|
|
JOK_BUFF EQU $3000 ; ProDOS buffer
|
|
JOK_ADDR EQU $6000 ; Address to load at
|
|
JOK_LEN EQU $5EFF ; Length of JOK (this is max)
|
|
JOK2BUFF EQU $3000
|
|
JOK2ADDR EQU $0800
|
|
JOK2LEN EQU $07FF
|
|
TIT_BUFF EQU $3000 ; ProDOS buffer
|
|
TIT_ADDR EQU $4000 ; Address to load at
|
|
TIT_LEN EQU $2000 ; Length of Title (full screen)
|
|
|
|
********************************
|
|
* Main program: *
|
|
********************************
|
|
LDA #149 ; disable 80 columns
|
|
JSR $FDED
|
|
JSR $FB2F ; text
|
|
JSR $FC58 ; home
|
|
* Draw title lines:
|
|
LDY #13
|
|
:LINE10 LDA DATA10-1,Y
|
|
STA LINE10+12,Y
|
|
DEY
|
|
BNE :LINE10
|
|
LDY #26
|
|
:LINE12 LDA DATA12-1,Y
|
|
STA LINE12+6,Y
|
|
DEY
|
|
BNE :LINE12
|
|
LDY #19
|
|
:LINE15 LDA DATA15A-1,Y
|
|
STA LINE15+9,Y
|
|
DEY
|
|
BNE :LINE15
|
|
* Clear memory:
|
|
LDY #24 ; clear the bitmap of the
|
|
LDA #0 ; system...
|
|
:CLRMEM STA $BF58-1,Y
|
|
DEY
|
|
BPL :CLRMEM
|
|
LDA #$CF ; and set back to memory
|
|
STA $BF58 ; as being empty except
|
|
LDA #$01 ; ProDOS.
|
|
STA $BF6F
|
|
* Load in Title:
|
|
@OPEN #TIT_NAME;#TIT_BUFF;REFNUM
|
|
BCC :OK_TITLE
|
|
JMP LOADERRT
|
|
:OK_TITLE @READ REFNUM;#TIT_ADDR;#TIT_LEN
|
|
@CLOSE REFNUM
|
|
* Print version of Loader:
|
|
LDY #19
|
|
:LINE15B LDA DATA15B-1,Y
|
|
STA LINE15+9,Y
|
|
DEY
|
|
BNE :LINE15B
|
|
* Calculate checksum:
|
|
JSR CHECKSUM
|
|
* Load in JOK:
|
|
@OPEN #JOK_NAME;#JOK_BUFF;REFNUM
|
|
BCC :OK_JOK
|
|
JMP LOADERRJ
|
|
:OK_JOK @READ REFNUM;#JOK_ADDR;#JOK_LEN
|
|
@CLOSE REFNUM
|
|
* Load in JOK end game:
|
|
@OPEN #JOK2NAME;#JOK2BUFF;REFNUM
|
|
BCS LOADERRE
|
|
@READ REFNUM;#JOK2ADDR;#JOK2LEN
|
|
@CLOSE REFNUM
|
|
* Check Checksum: (A0E647)
|
|
LDA SUM+2
|
|
CMP #$A0
|
|
BNE :DATACORR
|
|
LDA SUM+1
|
|
CMP #$E6
|
|
BNE DATACORR
|
|
LDA SUM
|
|
CMP #$47
|
|
:DATACORR BNE DATACORR
|
|
* Start JOK:
|
|
JMP JOK_ADDR ; begin game!
|
|
|
|
LOADERRT LDA #>TIT_NAME
|
|
LDY #<TIT_NAME
|
|
JMP :MSG
|
|
LOADERRJ LDA #>JOK_NAME
|
|
LDY #<JOK_NAME
|
|
JMP :MSG
|
|
LOADERRE LDA #>JOK2NAME
|
|
LDY #<JOK2NAME
|
|
:MSG PHA
|
|
TYA
|
|
PHA
|
|
LDY #40
|
|
:LOOP1 LDA ERRORMSG-1,Y
|
|
STA LINE24-1,Y
|
|
DEY
|
|
BNE :LOOP1
|
|
* Print filename on LINE24 overlaying <FILENAME> in the text...
|
|
PLA
|
|
STA PTR
|
|
PLA
|
|
STA PTR+1
|
|
LDY #0
|
|
LDA (PTR),Y ; length byte
|
|
TAX
|
|
:LOOP2 INY
|
|
LDA (PTR),Y
|
|
STA LINE24+7,Y
|
|
DEX
|
|
BNE :LOOP2
|
|
ERRORXX JSR $FF3A ; bell
|
|
FOREVER LDA #<$0200 ; sets $03F0 (BRK address) to
|
|
STA $3F0 ; point at $0200.
|
|
STA $201 ; And, sets $0200:4C 00 02
|
|
LDA #>$0200 ; ie, JMP $0200.
|
|
STA $3F1 ; ... the begining of FOREVER!
|
|
STA $202
|
|
LDA #$4C
|
|
STA $200
|
|
LDA $3F3 ; scramble power-up byte, so
|
|
EOR #%11111111 ; power-up automatically occurs
|
|
STA $3F3 ; upon RESET.
|
|
LDY #0 ; prepare to erase memory from
|
|
LDA #<$4000 ; $4000 - $BEFF ...
|
|
STA $00
|
|
LDA #>$4000
|
|
STA $01
|
|
LDA #0
|
|
:ERASE STA ($00),Y ; erase a page.
|
|
INY
|
|
BNE :ERASE
|
|
INC $01 ; add 1 to hi byte
|
|
LDA $01
|
|
CMP #$BF ; at end?
|
|
BLT :ERASE ; nope, do more
|
|
LDA #$20 ; yes: Erase loader program.
|
|
STA $01 ; will exit when BRK
|
|
JMP :ERASE ; encountered.
|
|
|
|
DATACORR LDY #28
|
|
:LOOP LDA DATA15C-1,Y
|
|
STA LINE15+5,Y
|
|
DEY
|
|
BNE :LOOP
|
|
JSR $FF3A ; bell
|
|
JMP FOREVER
|
|
|
|
ERRORMSG ASC "ERROR: <FILENAME> IS UNACCESSABLE!"
|
|
JOK2NAME STR "JEWEL.END.GAME"
|
|
JOK_NAME STR "JEWEL.OF.KALDUN"
|
|
TIT_NAME STR "JEWEL.TITLE.PIC"
|
|
REFNUM HEX 00
|
|
DATA10 INV " PLEASE WAIT "
|
|
DATA12 ASC "JEWEL OF KALDUN IS LOADING"
|
|
DATA15A ASC " L O A D E R "
|
|
DATA15B ASC "LOADER: VERSION 1.3"
|
|
DATA15C ASC "CANNOT LOAD: DATA CORRUPTED!"
|
|
|
|
* ProDOS Routines --
|
|
|
|
_OPEN JSR MLI ; perform open function
|
|
DFB OPEN
|
|
DW D:OPEN
|
|
RTS
|
|
|
|
_READ JSR MLI ; perform read function
|
|
DFB READ
|
|
DW D:READ
|
|
RTS
|
|
|
|
_CLOSE JSR MLI ; perform close function
|
|
DFB CLOSE
|
|
DW D:CLOSE
|
|
RTS
|
|
|
|
* ProDOS data/parameters --
|
|
|
|
D:OPEN DFB $3 ; 3 parameters
|
|
D:C8PATH DW 0 ; address of path name
|
|
D:C8BUFF DW 0 ; address of file buffer
|
|
D:C8REF DFB 0 ; reference number (returned)
|
|
|
|
D:READ DFB $4 ; 4 parameters
|
|
D:CAREF DFB 0 ; reference number
|
|
D:CABUFF DW 0 ; address of data buffer
|
|
D:CARLEN DW 0 ; requested length
|
|
D:CAALEN DW 0 ; actual length
|
|
|
|
D:CLOSE DFB $1 ; 1 parameter
|
|
D:CCREF DFB 0 ; reference number
|
|
|
|
********************************
|
|
* Compute a checksum on the *
|
|
* graphic title page after *
|
|
* being loaded into memory. *
|
|
********************************
|
|
CHECKSUM LDA #$00 ; point to location
|
|
STA PTR ; $4000, beginning
|
|
LDA #$40 ; of graphics page
|
|
STA PTR+1
|
|
LDA #0 ; initialize checksum
|
|
STA SUM ; to be zero.
|
|
STA SUM+1
|
|
STA SUM+2
|
|
LDY #0
|
|
:LOOP CLC
|
|
LDA (PTR),Y ; grab byte
|
|
ADC SUM ; and add it to
|
|
STA SUM ; the sum.
|
|
ADC SUM+1 ; add following
|
|
STA SUM+1 ; carry bits.
|
|
ADC SUM+2
|
|
STA SUM+2
|
|
INY
|
|
BNE :LOOP
|
|
INC PTR+1
|
|
CMP #$60 ; check if done
|
|
BLT :LOOP ; if not, continue
|
|
LDA SUM+2 ; dump sum to screen.
|
|
JSR $FDDA ; will be replaced to
|
|
LDA SUM+1 ; actually check if a
|
|
JSR $FDDA ; an unmodified page
|
|
LDA SUM ; was loaded.
|
|
JSR $FDDA
|
|
RTS
|
|
SUM HEX 000000 ; check sum
|
|
|
|
* Save file:
|
|
|
|
SAV JOK.SYSTEM.bin
|
|
|
|
|