jewel-of-kaldun/jok.system.s

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