717 lines
9.9 KiB
NASM
717 lines
9.9 KiB
NASM
;------------------------------------
|
|
; DOME
|
|
;
|
|
; (c) 1998 PARAGON Productions
|
|
;
|
|
; DOME.COM
|
|
;
|
|
;------------------------------------
|
|
DOS .equ 0x5
|
|
D_OPEN .equ 0x0F
|
|
D_SETDMA .equ 0x1A
|
|
D_READ .equ 0x27
|
|
D_CLOSE .equ 0x10
|
|
|
|
.area _CODE
|
|
JP START
|
|
|
|
.db 0x0D ; type dome.com
|
|
.db 0x0D,0x0A
|
|
.str "DOME (c) 1999 PARAGON Productions"
|
|
.db 0x0D,0x0A
|
|
.db 0x1A ; Einde txt
|
|
TXT_END:
|
|
|
|
.ds 0x4000 ;-TXT_END (XASM CRACHED HIEROP !!!)
|
|
|
|
TXT_HELP:
|
|
.str "GETTING STATED WITH DOME"
|
|
.db 0x0A,0x0D
|
|
.db 0x0A,0x0D
|
|
.str "GAME STORY:"
|
|
.db 0x0A,0x0D
|
|
.db 0x0A,0x0D
|
|
.str "The evel harkonon are at war with"
|
|
.db 0x0A,0x0D
|
|
.str "the shadow attridis....."
|
|
.db 0x0A,0x0D
|
|
.db 0x0A,0x0D
|
|
.str "that is the true story of dome."
|
|
.db 0x0A,0x0D
|
|
.db 0x0A,0x0D
|
|
.str "GAME PLAY:"
|
|
.db 0x0A,0x0D
|
|
.db 0x0A,0x0D
|
|
.str "Very simple"
|
|
.db 0x0A,0x0D,0x1D
|
|
|
|
TXT_COM:
|
|
.str " "
|
|
.db 0x0A,0x0D
|
|
.str "Below you see a listing of all the"
|
|
.db 0x0A,0x0D
|
|
.str "extra options you can give to DOME."
|
|
.db 0x0A,0x0D
|
|
.str " "
|
|
.db 0x0A,0x0D
|
|
.str " /? = This text. "
|
|
.db 0x0A,0x0D
|
|
.str " "
|
|
.db 0x0A,0x0D
|
|
.str " /HELP = This functions give's you the entire "
|
|
.db 0x0A,0x0D
|
|
.str " help of DOME."
|
|
.db 0x0A,0x0D
|
|
.str " "
|
|
.db 0x0A,0x0D
|
|
.str " /TEST = START'S ONLY LEVEL 001 WITH MIN. INIT."
|
|
.db 0x0A,0x0D
|
|
.str " "
|
|
.db 0x0A,0x0D
|
|
.str " /MOUSEx = x is 1 or #2 so you can skip the mouse search."
|
|
.db 0x0A,0x0D
|
|
.str " "
|
|
.db 0x0A,0x0D
|
|
.str " /FMPAC = DOME asume's you have a FM-PAC."
|
|
.db 0x0A,0x0D
|
|
.str " And forces if moonsound drv is found to reload."
|
|
.db 0x0A,0x0D
|
|
.str " "
|
|
.db 0x0A,0x0D
|
|
.str " /NO_SCSI= DOME don't seek's thoug your MSX-SCSI config."
|
|
.db 0x0A,0x0D
|
|
.str " "
|
|
.db 0x0A,0x0D
|
|
.str " PS : Your are also able to type in small letter."
|
|
.db 0x0A,0x0D
|
|
.str " "
|
|
.db 0x0A,0x0D
|
|
|
|
.str "_______________DOME_______________"
|
|
.db 0x0A,0x0D
|
|
.str " PARAGON PRODUCTIONS (C)1999"
|
|
.db 0x0A,0x0D,0x1D
|
|
|
|
|
|
TXT_DOME_LIB: .str "LOADING : DOME_LIB...."
|
|
.db 0x1D
|
|
TXT_DOME_MUS: .str "LOADING : DOME_MUSDRV."
|
|
.db 0x1D
|
|
TXT_DOME_BIOS: .str "LOADING : DOME_BIOS..."
|
|
.db 0x1D
|
|
TXT_DOME_LOADER:.str "LOADING : DOME_LOADER."
|
|
.db 0x1D
|
|
TXT_READY: .str "Ready"
|
|
.db 0x0A,0x0D,0x1D
|
|
|
|
START:
|
|
LD A,(0x0080) ; aantal tekens
|
|
OR A
|
|
CALL NZ,GET_COM ; 0 tekens = geen tekst
|
|
|
|
CALL CHK_DISK
|
|
|
|
CALL CHK_MUS
|
|
|
|
LD A,(0x0080)
|
|
|
|
LD HL,#TXT_COM
|
|
BIT 0,A
|
|
JP NZ,PUT_TXT ; TEXT COMMMENT'S
|
|
|
|
BIT 1,A
|
|
JP NZ,PRT_HELP ; DOME HELP MOET GRAFISH
|
|
|
|
LD HL,#TXT_DOME_LIB
|
|
CALL PUT_TXT
|
|
|
|
; LD HL,#DOME_LIB
|
|
; CALL INIT_LIB
|
|
|
|
LD HL,#TXT_READY
|
|
CALL PUT_TXT
|
|
|
|
LD HL,#TXT_DOME_BIOS
|
|
CALL PUT_TXT
|
|
|
|
LD HL,#BIOS
|
|
LD DE,#0x0100
|
|
LD A,#0 ; 254
|
|
LD BC,#0x3000
|
|
CALL LOAD
|
|
|
|
LD HL,#TXT_READY
|
|
CALL PUT_TXT
|
|
|
|
LD HL,#TXT_DOME_LOADER
|
|
CALL PUT_TXT
|
|
|
|
LD HL,#LOADER
|
|
LD DE,#0x8000
|
|
LD A,#0 ; 255=+CLOSE
|
|
LD BC,#0x3000
|
|
CALL LOAD
|
|
|
|
LD HL,#TXT_READY
|
|
CALL PUT_TXT
|
|
|
|
ld e,#"0"
|
|
ld c,#0x02
|
|
call DOS
|
|
|
|
ld e,#0x0A
|
|
ld c,#0x02
|
|
call DOS
|
|
ld e,#0x0D
|
|
ld c,#0x02
|
|
call DOS
|
|
|
|
LD DE,#0x8000
|
|
DUMP_LOOP:
|
|
LD A,(DE)
|
|
PUSH DE
|
|
CALL PUTHEX
|
|
POP DE
|
|
INC DE
|
|
LD A,D
|
|
CP #0x81
|
|
JR NZ,DUMP_LOOP
|
|
|
|
DI ; VEILIGHEID
|
|
JP 0x8000
|
|
|
|
DOME_LIB: .str "DOME 000"
|
|
BIOS: .str "BIOS DAT"
|
|
LOADER: .str "LOADER DAT"
|
|
WAVEDRV: .str "WAVEDRV COM"
|
|
|
|
|
|
|
|
|
|
PUTHEX:
|
|
PUSH AF
|
|
RRCA
|
|
RRCA
|
|
RRCA
|
|
RRCA
|
|
CALL HEXSUB
|
|
POP AF
|
|
HEXSUB:
|
|
AND #0x0F
|
|
ADD A,#'0'
|
|
CP #'9'+1
|
|
JR C,HEXS1
|
|
ADD A,#'A'-10-'0'
|
|
HEXS1:
|
|
LD E,A
|
|
LD C,#2
|
|
CALL DOS
|
|
RET
|
|
|
|
CHK_DISK:
|
|
LD A,#0 ;CURRENT
|
|
LD C,#0x1B
|
|
CALL DOS
|
|
|
|
RET
|
|
|
|
CHK_MUS:
|
|
LD HL,#TXT_DOME_MUS
|
|
CALL PUT_TXT
|
|
CALL CHK_OPL4
|
|
|
|
LD HL,#TXT_READY
|
|
JP NZ,PUT_TXT
|
|
|
|
;CALL CHK_MUSIC
|
|
LD HL,#TXT_READY
|
|
JP PUT_TXT
|
|
|
|
CHK_OPL4:
|
|
LD A,#5
|
|
OUT (0xC6),A ; reg 5 ( FM)
|
|
PUSH BC
|
|
POP BC
|
|
LD A,#3
|
|
OUT (0xC5),A ; SET OPL4 REGISTER SET
|
|
PUSH BC
|
|
POP BC
|
|
LD A,#2
|
|
OUT (0x7E),A ; REG 2 (WAVE)
|
|
PUSH BC
|
|
POP BC
|
|
IN A,(0x7F) ;
|
|
CPL
|
|
OR A
|
|
RET Z ; GEEN OPL4 DUS OOK GEEN DRV
|
|
|
|
XOR A ; get mapper variable table
|
|
LD D,#4
|
|
LD E,#1
|
|
CALL 0xFFCA
|
|
LD A,C ; XOR A ???
|
|
LD BC,#2
|
|
ADD HL,BC
|
|
LD A,(HL)
|
|
|
|
CP #6 ; MUSIC NEED 4 SEGMENTS !!!!!!!!!!!!!!!!!!!
|
|
JP NC,CHK_OPL4_CONT ; MEER DAN 6
|
|
|
|
CALL CHECK_IF_INST
|
|
RET NZ ; GEEN DRV
|
|
|
|
LD HL,#WAVEDRV
|
|
CALL RELEASE_DRV
|
|
CHK_OPL4_EXIT:
|
|
LD A,#1
|
|
OR A ; NZ ANDERS MUSIC OOK
|
|
RET
|
|
|
|
CHK_OPL4_CONT:
|
|
LD A,(0x0080)
|
|
BIT 3,A
|
|
LD HL,#WAVEDRV
|
|
JR NZ,LOAD_DRV ; GEWWON NOG EEN KEER LADEN
|
|
|
|
CALL CHECK_IF_INST
|
|
JR Z,CHK_OPL4_EXIT
|
|
LD HL,#WAVEDRV
|
|
LOAD_DRV:
|
|
LD IY,#0x0080
|
|
LD A,(IY)
|
|
PUSH AF
|
|
|
|
LD (IY),#7
|
|
LD (IY),#" "
|
|
LD (IY),#"/"
|
|
LD (IY),#"I"
|
|
LD (IY),#">"
|
|
LD (IY),#"N"
|
|
LD (IY),#"U"
|
|
LD (IY),#"L"
|
|
|
|
LD DE,#0x0100
|
|
LD BC,#0x1000
|
|
LD A,#0
|
|
CALL LOAD
|
|
|
|
CALL 0x0100 ; WAVE DRV
|
|
|
|
POP AF
|
|
LD (0x0080),A
|
|
RET
|
|
|
|
RELEASE_DRV:
|
|
LD IY,#0x0080
|
|
LD A,(IY)
|
|
PUSH AF
|
|
|
|
LD (IY),#7
|
|
LD (IY),#" "
|
|
LD (IY),#"/"
|
|
LD (IY),#"R"
|
|
LD (IY),#">"
|
|
LD (IY),#"N"
|
|
LD (IY),#"U"
|
|
LD (IY),#"L"
|
|
|
|
LD DE,#0x0100
|
|
LD BC,#0x1000
|
|
LD A,#0
|
|
CALL LOAD
|
|
|
|
CALL 0x0100 ; WAVE DRV
|
|
|
|
POP AF
|
|
LD (0x0080),A
|
|
RET
|
|
|
|
|
|
|
|
; Check if replayer is installed
|
|
; output: if nz=0 not installed
|
|
; if z=1 installed
|
|
|
|
CHECK_IF_INST:
|
|
LD HL,#ID_FB04
|
|
LD DE,#0xFB04+21
|
|
LD B,#5
|
|
CHECK_IF_INST_LP:
|
|
LD A,(DE)
|
|
CP (HL)
|
|
RET NZ
|
|
INC HL
|
|
INC DE
|
|
DJNZ CHECK_IF_INST_LP
|
|
RET
|
|
|
|
ID_FB04:.str "MBTSR" ; If this is on address FB04h+21
|
|
|
|
;=====
|
|
|
|
GET_COM:
|
|
LD IY,#0x0080
|
|
LD HL,#0x0081
|
|
LD B,(IY)
|
|
LD (IY),#0
|
|
GET_COM_LP:
|
|
LD A,(HL)
|
|
INC HL
|
|
|
|
CP #"?"
|
|
JR NZ,GET_COM_CONT
|
|
SET 0,(IY) ; ACTIVATE HELP HIGHEST PIRIOTIJD
|
|
GET_COM_CONT:
|
|
|
|
PUSH BC
|
|
PUSH HL ; DOOR INC HL GA DOOR NAAR NEXT CMD
|
|
CP #"/"
|
|
CALL Z,GET_COM_STR
|
|
POP HL
|
|
POP BC
|
|
|
|
DJNZ GET_COM_LP
|
|
RET
|
|
|
|
;=====
|
|
|
|
|
|
GET_COM_STR:
|
|
LD DE,#GET_COM_TAB
|
|
GET_COM_STR_LP:
|
|
LD A,(HL)
|
|
LD C,A
|
|
|
|
LD A,(DE)
|
|
OR A
|
|
JR Z,GET_COM_BIT ; NEXT COM
|
|
|
|
CP #255 ; GEEN COMMANDO FOUND
|
|
RET Z
|
|
|
|
CP C
|
|
JR Z,GET_COM_STR_CONT ; A
|
|
|
|
ADD #32
|
|
CP C
|
|
JR Z,GET_COM_STR_CONT ; a
|
|
|
|
GET_COM_STR_NOT_LP:
|
|
LD A,(DE)
|
|
INC DE
|
|
OR A
|
|
JR NZ,GET_COM_STR_NOT_LP ; ZOEK TOT VOLGEND COM
|
|
|
|
INC DE
|
|
|
|
POP BC ; CALL STACK
|
|
POP HL ; ; org ADR OF CMD
|
|
PUSH HL
|
|
PUSH BC
|
|
|
|
JR GET_COM_STR_LP
|
|
|
|
GET_COM_STR_CONT:
|
|
INC HL
|
|
INC DE
|
|
JR GET_COM_STR_LP
|
|
|
|
;----
|
|
|
|
GET_COM_BIT:
|
|
INC DE
|
|
LD A,(DE)
|
|
DEC A
|
|
JR Z,COM_HELP
|
|
DEC A
|
|
JR Z,COM_DOS2
|
|
DEC A
|
|
JR Z,COM_FMPAC
|
|
DEC A
|
|
JR Z,COM_NO_SCSI
|
|
DEC A
|
|
JR Z,COM_MOUSE
|
|
DEC A
|
|
JR Z,COM_NO_TXT
|
|
RET
|
|
COM_HELP:
|
|
SET 1,(IY)
|
|
RET
|
|
COM_DOS2:
|
|
SET 2,(IY)
|
|
RET
|
|
COM_FMPAC:
|
|
SET 3,(IY)
|
|
RET
|
|
COM_NO_SCSI:
|
|
SET 4,(IY)
|
|
RET
|
|
COM_MOUSE:
|
|
SET 5,(IY)
|
|
LD A,(HL)
|
|
CP #"1"
|
|
RET Z
|
|
SET 6,(IY)
|
|
RET
|
|
COM_NO_TXT:
|
|
SET 7,(IY)
|
|
RET
|
|
|
|
|
|
GET_COM_TAB:
|
|
.str "HELP"
|
|
.db 0,1 ; /HELP = COM.. 0=LAST
|
|
.str "TEST"
|
|
.db 0,2
|
|
.str "FMPAC"
|
|
.db 0,3
|
|
.str "NO_SCSI"
|
|
.db 0,4
|
|
.str "MOUSE"
|
|
.db 0,5
|
|
.str "NO_TXT"
|
|
.db 0,6,255
|
|
|
|
|
|
|
|
PRT_HELP:
|
|
LD HL,#TXT_HELP
|
|
JP PUT_TXT
|
|
|
|
|
|
|
|
PUT_TXT:
|
|
LD A,(HL)
|
|
CP #0x1D
|
|
RET Z
|
|
LD E,A
|
|
LD C,#2
|
|
PUSH HL
|
|
CALL DOS
|
|
POP HL
|
|
INC HL
|
|
JR PUT_TXT
|
|
|
|
|
|
; IF A=NOT 254 OR A=NOT 255 THEN
|
|
;
|
|
; HL= FILE NAME (LOAD_BIN)
|
|
; DE= DMA-ADR
|
|
; A= HEADER TRACH
|
|
; BC= LENGTE
|
|
; ELSE
|
|
; HL= FILE NAME (LOAD_LIB)
|
|
; DE= DMA-ADR
|
|
;
|
|
; IF A=255 THEN CLOSE_LIB
|
|
; END
|
|
|
|
|
|
LOAD:
|
|
CP #254 ; CLOSE LIB ON EXIT
|
|
JR C,LOAD_BIN ; KLEINER DAN
|
|
|
|
EX AF,AF
|
|
PUSH DE ; ADR
|
|
|
|
CALL SEARCH_FILE ; if found lengte in HL
|
|
|
|
POP DE ; ADR
|
|
PUSH HL ; LENGT
|
|
CALL SETDMA ; DE is adres
|
|
|
|
POP HL
|
|
CALL READ
|
|
|
|
EX AF,AF
|
|
CP #255
|
|
RET NZ
|
|
JP CLOSE
|
|
|
|
;---------
|
|
|
|
LOAD_BIN:
|
|
PUSH BC
|
|
PUSH AF
|
|
PUSH DE
|
|
|
|
CALL PUT_NAM_FCB
|
|
CALL OPEN
|
|
|
|
POP DE
|
|
CALL SETDMA
|
|
|
|
POP HL
|
|
LD L,H ; KAN ??
|
|
LD H,#0
|
|
CALL READ ; kan dit ??
|
|
|
|
POP HL
|
|
CALL READ ; op oude DMA adres ???
|
|
CALL CLOSE ; ja !! raar he ?!
|
|
RET
|
|
|
|
; Zoek file op in directory en stel record number in
|
|
; In: HL: adres te laden file-naam
|
|
; DE: adres directory
|
|
; Uit: HL: lengte file
|
|
; A: 0 indien gelukt, 255 indien mislukt
|
|
|
|
SEARCH_FILE:
|
|
LD DE,#DIRECTORY ; eerste2 bytes zijn aantal files
|
|
SEARCH_FILE0:
|
|
|
|
PUSH HL ; adres naam v.d. file
|
|
PUSH DE ; adres directory
|
|
|
|
CALL CMP_STR
|
|
OR A
|
|
JR Z,SEARCH_FILE1
|
|
|
|
POP DE
|
|
LD HL,#11 + 2 + 3
|
|
ADD HL,DE
|
|
EX DE,HL ; DE = positie in directory
|
|
POP HL
|
|
JR SEARCH_FILE0
|
|
|
|
SEARCH_FILE1: ; HL = adres in directory
|
|
EX DE,HL
|
|
|
|
LD E,(HL)
|
|
INC HL
|
|
LD D,(HL) ; laad lengte
|
|
INC HL
|
|
PUSH DE
|
|
|
|
LD DE,#FCB + 33
|
|
LD BC,#3
|
|
LDIR ; Record Number naar FCB
|
|
|
|
XOR A ; drive ??
|
|
LD (DE),A
|
|
|
|
POP HL ; lengte in HL
|
|
|
|
POP DE
|
|
POP DE
|
|
RET
|
|
|
|
CMP_STR:
|
|
LD B,#11
|
|
CMP_STR1:
|
|
LD A,(DE)
|
|
CP (HL)
|
|
RET NZ
|
|
INC HL
|
|
INC DE
|
|
DJNZ CMP_STR1
|
|
XOR A
|
|
RET
|
|
|
|
|
|
; Laad directory
|
|
; In: HL: Adres filename
|
|
; DE: Bestemmingsadres directory
|
|
|
|
INIT_LIB:
|
|
LD DE,#DIRECTORY
|
|
|
|
PUSH DE
|
|
PUSH DE
|
|
|
|
CALL PUT_NAM_FCB ; put HL in FCB
|
|
CALL OPEN
|
|
|
|
cp #0
|
|
jr z,INIT_LIB_OK
|
|
|
|
LD HL,#FILE_ERROR
|
|
LD B,#10
|
|
CALL PUT_TXT
|
|
|
|
INIT_LIB_OK:
|
|
|
|
POP DE
|
|
CALL SETDMA ; destination is DIRECTORY
|
|
|
|
LD HL,#2
|
|
CALL READ
|
|
|
|
POP HL ; In BC aantal files
|
|
LD C,(HL)
|
|
INC HL
|
|
LD B,(HL)
|
|
|
|
LD HL,#0
|
|
LD DE,#11 + 3 + 2 ; lengte entry = name
|
|
|
|
CALC_LENGTH:
|
|
ADD HL,DE
|
|
DEC BC
|
|
LD A,B
|
|
OR C
|
|
JR NZ,CALC_LENGTH
|
|
|
|
CALL READ ; lees directory struct
|
|
|
|
RET
|
|
|
|
;=========================================================================
|
|
;=========================================================================
|
|
;=================== SUBS ==============================================
|
|
;=========================================================================
|
|
;=========================================================================
|
|
|
|
|
|
PUT_NAM_FCB: ; ; In: HL = file name pointer
|
|
LD DE,#FCB+1
|
|
LD BC,#0x0B ; Out: A = drive name (0 = def., 1 =
|
|
LDIR ; Cng: HL,DE BC,AF
|
|
XOR A
|
|
LD (FCB),A ; (DRVNAM) must be valid
|
|
RET
|
|
|
|
SETDMA:
|
|
LD C,#D_SETDMA ; DE=ADR
|
|
JP DOS
|
|
OPEN:
|
|
LD DE,#FCB
|
|
LD C,#D_OPEN
|
|
CALL DOS
|
|
LD HL,#0x01
|
|
LD (FCB+14),HL ; Record length = 1 byte
|
|
DEC L
|
|
LD (FCB+33),HL
|
|
LD (FCB+35),HL ; Current record number = 0
|
|
RET
|
|
|
|
READ:
|
|
LD DE,#FCB
|
|
LD C,#D_READ ; HL=NR BYTES
|
|
JP DOS
|
|
|
|
CLOSE:
|
|
LD DE,#FCB
|
|
LD C,#D_CLOSE
|
|
JP DOS
|
|
|
|
FILE_ERROR: .str " NOT FOUND" ; 10 len
|
|
.db 0x0A,0x0D
|
|
|
|
FCB: .db 0
|
|
FILENAME: .str " "
|
|
BLOCK: .dw #00
|
|
RECORDLENGTH: .dw #00
|
|
FILELENGTH: .dw #00,#00
|
|
SYSTEMVAR: .dw #00,#00,#00,#00,#00,#00
|
|
.db 0
|
|
RECORDNR: .dw #00,#00
|
|
|
|
|
|
DIRECTORY:
|
|
.db 0 ; 7 BYTES PER FILE OF 11+3+2 suckS
|
|
; ; NAAM - LENGTE - REC.NUM
|
|
|
|
.area _DATA
|