mirror of
https://github.com/a2-4am/4cade.git
synced 2024-06-14 03:29:38 +00:00
games.conf parser works, okvs works, glue.prorwts2 works
This commit is contained in:
parent
323e715cb1
commit
ae064cdee6
2
Makefile
2
Makefile
|
@ -27,7 +27,7 @@ dsk: md asm
|
||||||
cp res/_FileInformation.txt build/
|
cp res/_FileInformation.txt build/
|
||||||
$(CADIUS) ADDFILE build/"$(DISK)" "/${VOLUME}/" "res/PRODOS" >/dev/null
|
$(CADIUS) ADDFILE build/"$(DISK)" "/${VOLUME}/" "res/PRODOS" >/dev/null
|
||||||
$(CADIUS) ADDFILE build/"$(DISK)" "/${VOLUME}/" "build/LAUNCHER.SYSTEM" >/dev/null
|
$(CADIUS) ADDFILE build/"$(DISK)" "/${VOLUME}/" "build/LAUNCHER.SYSTEM" >/dev/null
|
||||||
$(CADIUS) ADDFILE build/"$(DISK)" "/${VOLUME}/" "res/games.conf" >/dev/null
|
$(CADIUS) ADDFILE build/"$(DISK)" "/${VOLUME}/" "res/GAMES.CONF" >/dev/null
|
||||||
$(CADIUS) ADDFILE build/"$(DISK)" "/${VOLUME}/" "res/COVER" >/dev/null
|
$(CADIUS) ADDFILE build/"$(DISK)" "/${VOLUME}/" "res/COVER" >/dev/null
|
||||||
$(CADIUS) ADDFILE build/"$(DISK)" "/${VOLUME}/" "res/COVER.A2FC" >/dev/null
|
$(CADIUS) ADDFILE build/"$(DISK)" "/${VOLUME}/" "res/COVER.A2FC" >/dev/null
|
||||||
$(CADIUS) CREATEFOLDER build/"$(DISK)" "/${VOLUME}/X/" >/dev/null
|
$(CADIUS) CREATEFOLDER build/"$(DISK)" "/${VOLUME}/X/" >/dev/null
|
||||||
|
|
|
@ -2,3 +2,4 @@ PRODOS=Type(FF),AuxType(0000),Access(C3)
|
||||||
LAUNCHER.SYSTEM=Type(FF),AuxType(2000),Access(C3)
|
LAUNCHER.SYSTEM=Type(FF),AuxType(2000),Access(C3)
|
||||||
COVER=Type(06),AuxType(2000),Access(C3)
|
COVER=Type(06),AuxType(2000),Access(C3)
|
||||||
COVER.A2FC=Type(06),AuxType(2000),Access(C3)
|
COVER.A2FC=Type(06),AuxType(2000),Access(C3)
|
||||||
|
GAMES.CONF=Type(04),AuxType(4000),Access(C3)
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
#
# 4cade master game list
#
# Format:
# AB,name=directory
#
# A=1 if game requires joystick, 0 if playable on keyboard
# B=1 if game requires 128K, 0 if playable on 64K
# all other values for A or B -> ignore entire line
#
00,Agent USA=AGENT.USA
11,Airheart=AIRHEART
00,Alcazar=ALCAZAR
00,Alien Downpour=ALIEN.DOWNPOUR
# TODO: Alien Rain volume name and executable filename do not match (one has period, one doesn't)
00,Alien Rain=ALIENRAIN
00,Ankh=ANKH
00,Apple Panic=APPLE.PANIC
00,Aquatron=AQUATRON
10,Arkanoid=ARKANOID
00,Battlezone=BATTLEZONE
10,BC's Quest For Tires=BCS.QUEST
00,Beer Run=BEER.RUN
00,Bellhop=BELLHOP
00,Bill Budge's Trilogy=BUDGETRILOGY
00,Blister Ball=BLISTER.BALL
00,Bolo=BOLO
00,Brainteaser Boulevard=BRAINTEASERBLVD
00,BurgerTime=BURGERTIME
00,Cannonball Blitz=CANNONBALL.BLTZ
00,Canyon Climber=CANYON.CLIMBER
00,Centipede=CENTIPEDE
10,Choplifter=CHOPLIFTER
00,Commando=COMMANDO
00,Conan=CONAN
10,Crisis Mountain=CRISIS.MOUNTAIN
00,Crossfire=CROSSFIRE
01,D-Generation=D.GENERATION
10,David's Midnight Magic=DAVIDS.MAGIC
10,Defender=DEFENDER
00,Dig Dug=DIG.DUG
10,Dino Eggs=DINO.EGGS
10,Donkey Kong=DONKEY.KONG
10,Drelbs=DRELBS
00,Drol=DROL
00,Epoch=EPOCH
00,Falcons=FALCONS
00,Flight Simulator I=FS1
00,Flip Out=FLIP.OUT
10,Formula 1 Racer=FORMULA.1
00,Frogger=FROGGER
10,Galaxian=GALAXIAN
10,The Goonies=GOONIES
00,Gremlins=GREMLINS
10,H.E.R.O.=HERO
00,Hard Hat Mack=HARD.HAT.MACK
00,Head On=HEAD.ON
00,High Rise=HIGH.RISE
00,Hungry Boy=HUNGRYBOY
10,Impossible Mission=IMPOSSIBLE.MISS
00,Joust=JOUST
00,Jungle Hunt=JUNGLE.HUNT
00,Karateka=KARATEKA
00,Lady Tut=LADY.TUT
10,Lost Tomb=LOST.TOMB
10,Mad Bomber=MAD.BOMBER
00,Mario Bros=MARIO.BROS
00,Montezuma's Revenge=MONTEZUMA
00,Moon Patrol=MOON.PATROL
00,Mr. Cool=MR.COOL
10,Mr. Do=MR.DO
00,Mr. Robot=MR.ROBOT
00,Ms. Pacman=MS.PACMAN
00,Nibbler=NIBBLER
00,Night Stalker=NIGHT.STALKER
00,Nightmare Gallery=NIGHTMARE
00,NORAD=NORAD
00,O'Riley's Mine=ORILEYS.MINE
00,Outpost=OUTPOST
00,Pac-Man=PAC.MAN
00,Paperboy=PAPERBOY
00,Pest Patrol=PEST.PATROL
00,Pie-Man=PIEMAN
00,Pit Stop II=PITSTOP.II
10,Pitfall II=PITFALL.II
00,Plasmania=PLASMANIA
00,Pooyan=POOYAN
01,Prince of Persia=PRINCEUNP
00,Puckman=PUCK.MAN
11,Qix=QIX
01,Radwarrior=RADWARRIOR
00,Repton=REPTON
00,Ribbit=RIBBIT
00,Robotron 2084=ROBOTRON.2084
00,Sabotage=SABOTAGE
00,Serpentine=SERPENTINE
10,Shamus=SHAMUS
00,Snack Attack=SNACK.ATTACK
00,Snake Byte=SNAKE.BYTE
00,Sneakers=SNEAKERS
00,Snoggle=SNOGGLE
00,Space Raiders=SPACE.RAIDERS
00,Spider Raid=SPIDER.RAID
01,Spiderbot=SPIDERBOT
00,Spy Hunter=SPY.HUNTER
00,Spy's Demise=SPYS.DEMISE
10,Starblaster=STARBLASTER
10,Stargate=STARGATE
00,Stellar 7=STELLAR.7
00,Succession=SUCCESSION
00,Swashbuckler=SWASHBUCKLER
00,Tag Team Wrestling=TAG.TEAM
00,Tapper=TAPPER
00,Thief=THIEF
00,Thunder Bombs=THUNDERBOMBS
10,Tomahawk=TOMAHAWK
00,Track N Field=TRACK.AND.FIELD
10,Tubeway ][=TUBEWAY
01,Victory Road=VICTORY.ROAD
00,Wavy Navy=WAVY.NAVY
[eof]
|
#
# 4cade master game list
#
# Format:
# AB,name=directory
#
# A=1 if game requires joystick, 0 if playable on keyboard
# B=1 if game requires 128K, 0 if playable on 64K
# all other values for A or B -> ignore entire line (like this one!)
#
00,Agent USA=AGENT.USA
11,Airheart=AIRHEART
00,Alcazar=ALCAZAR
00,Alien Downpour=ALIEN.DOWNPOUR
# TODO: Alien Rain volume name and executable filename do not match (one has period, one doesn't)
00,Alien Rain=ALIENRAIN
00,Ankh=ANKH
00,Apple Panic=APPLE.PANIC
00,Aquatron=AQUATRON
10,Arkanoid=ARKANOID
00,Battlezone=BATTLEZONE
10,BC's Quest For Tires=BCS.QUEST
00,Beer Run=BEER.RUN
00,Bellhop=BELLHOP
00,Bill Budge's Trilogy=BUDGETRILOGY
00,Blister Ball=BLISTER.BALL
00,Bolo=BOLO
00,Brainteaser Boulevard=BRAINTEASERBLVD
00,BurgerTime=BURGERTIME
00,Cannonball Blitz=CANNONBALL.BLTZ
00,Canyon Climber=CANYON.CLIMBER
00,Centipede=CENTIPEDE
10,Choplifter=CHOPLIFTER
00,Commando=COMMANDO
00,Conan=CONAN
10,Crisis Mountain=CRISIS.MOUNTAIN
00,Crossfire=CROSSFIRE
01,D-Generation=D.GENERATION
10,David's Midnight Magic=DAVIDS.MAGIC
10,Defender=DEFENDER
00,Dig Dug=DIG.DUG
10,Dino Eggs=DINO.EGGS
10,Donkey Kong=DONKEY.KONG
10,Drelbs=DRELBS
00,Drol=DROL
00,Epoch=EPOCH
00,Falcons=FALCONS
00,Flight Simulator I=FS1
00,Flip Out=FLIP.OUT
10,Formula 1 Racer=FORMULA.1
00,Frogger=FROGGER
10,Galaxian=GALAXIAN
10,The Goonies=GOONIES
00,Gremlins=GREMLINS
10,H.E.R.O.=HERO
00,Hard Hat Mack=HARD.HAT.MACK
00,Head On=HEAD.ON
00,High Rise=HIGH.RISE
00,Hungry Boy=HUNGRYBOY
10,Impossible Mission=IMPOSSIBLE.MISS
00,Joust=JOUST
00,Jungle Hunt=JUNGLE.HUNT
00,Karateka=KARATEKA
00,Lady Tut=LADY.TUT
10,Lost Tomb=LOST.TOMB
10,Mad Bomber=MAD.BOMBER
00,Mario Bros=MARIO.BROS
00,Montezuma's Revenge=MONTEZUMA
00,Moon Patrol=MOON.PATROL
00,Mr. Cool=MR.COOL
10,Mr. Do=MR.DO
00,Mr. Robot=MR.ROBOT
00,Ms. Pacman=MS.PACMAN
00,Nibbler=NIBBLER
00,Night Stalker=NIGHT.STALKER
00,Nightmare Gallery=NIGHTMARE
00,NORAD=NORAD
00,O'Riley's Mine=ORILEYS.MINE
00,Outpost=OUTPOST
00,Pac-Man=PAC.MAN
00,Paperboy=PAPERBOY
00,Pest Patrol=PEST.PATROL
00,Pie-Man=PIEMAN
00,Pit Stop II=PITSTOP.II
10,Pitfall II=PITFALL.II
00,Plasmania=PLASMANIA
00,Pooyan=POOYAN
01,Prince of Persia=PRINCEUNP
00,Puckman=PUCK.MAN
11,Qix=QIX
01,Radwarrior=RADWARRIOR
00,Repton=REPTON
00,Ribbit=RIBBIT
00,Robotron 2084=ROBOTRON.2084
00,Sabotage=SABOTAGE
00,Serpentine=SERPENTINE
10,Shamus=SHAMUS
00,Snack Attack=SNACK.ATTACK
00,Snake Byte=SNAKE.BYTE
00,Sneakers=SNEAKERS
00,Snoggle=SNOGGLE
00,Space Raiders=SPACE.RAIDERS
00,Spider Raid=SPIDER.RAID
01,Spiderbot=SPIDERBOT
00,Spy Hunter=SPY.HUNTER
00,Spy's Demise=SPYS.DEMISE
10,Starblaster=STARBLASTER
10,Stargate=STARGATE
00,Stellar 7=STELLAR.7
00,Succession=SUCCESSION
00,Swashbuckler=SWASHBUCKLER
00,Tag Team Wrestling=TAG.TEAM
00,Tapper=TAPPER
00,Thief=THIEF
00,Thunder Bombs=THUNDERBOMBS
10,Tomahawk=TOMAHAWK
00,Track N Field=TRACK.AND.FIELD
10,Tubeway ][=TUBEWAY
01,Victory Road=VICTORY.ROAD
00,Wavy Navy=WAVY.NAVY
[eof]
|
124
src/4cade.a
124
src/4cade.a
|
@ -5,8 +5,33 @@
|
||||||
!source "src/constants.a"
|
!source "src/constants.a"
|
||||||
!source "src/macros.a"
|
!source "src/macros.a"
|
||||||
|
|
||||||
|
Init
|
||||||
jsr Has64K ; check for 64K (required)
|
jsr Has64K ; check for 64K (required)
|
||||||
bcc @found64K
|
bcs @no64K
|
||||||
|
jsr DisableAccelerator ; set to 1 MHz
|
||||||
|
jsr Has128K ; check for 128K (absence is OK, we just filter out some games)
|
||||||
|
ror MachineStatus
|
||||||
|
jsr HasJoystick ; check for joystick (absence is OK, we just filter out some games)
|
||||||
|
ror MachineStatus
|
||||||
|
|
||||||
|
+READ_ROM_WRITE_RAM1
|
||||||
|
ldx #$00 ; relocate rest of program to RAM bank 1 in language card
|
||||||
|
@FM lda FirstMover,x
|
||||||
|
sta $D000,x
|
||||||
|
inx
|
||||||
|
bne @FM
|
||||||
|
lda @FM+2
|
||||||
|
cmp #>LastMover
|
||||||
|
bcs +
|
||||||
|
inc @FM+2
|
||||||
|
inc @FM+5
|
||||||
|
bne @FM
|
||||||
|
+
|
||||||
|
jsr init ; initialize ProRWTS2 (bye bye ProDOS)
|
||||||
|
+READ_RAM1_WRITE_RAM1
|
||||||
|
jmp Start
|
||||||
|
|
||||||
|
@no64K
|
||||||
jsr $FB2F
|
jsr $FB2F
|
||||||
jsr $FC58
|
jsr $FC58
|
||||||
ldy #@no64Klen
|
ldy #@no64Klen
|
||||||
|
@ -18,85 +43,53 @@
|
||||||
@s_no64K !raw "REQUIRES 64K"
|
@s_no64K !raw "REQUIRES 64K"
|
||||||
@no64Klen=*-@s_no64K
|
@no64Klen=*-@s_no64K
|
||||||
|
|
||||||
@found64K
|
; these routines will only be called once, from main memory, before relocating to language card
|
||||||
jsr DisableAccelerator ; set to 1 MHz
|
|
||||||
jsr Has128K ; check for 128K (absence is OK, we just filter out some games)
|
|
||||||
ror MachineStatus
|
|
||||||
jsr HasJoystick ; check for joystick (absence is OK, we just filter out some games)
|
|
||||||
ror MachineStatus
|
|
||||||
|
|
||||||
lda LCBANK1WRITE ; read ROM / write LC bank 1
|
|
||||||
lda LCBANK1WRITE
|
|
||||||
ldx #$00
|
|
||||||
FM lda FirstMover,x
|
|
||||||
sta $D000,x
|
|
||||||
inx
|
|
||||||
bne FM
|
|
||||||
; inc FM+2
|
|
||||||
; inc FM+5
|
|
||||||
; lda FM+5
|
|
||||||
; cmp #>LastMover
|
|
||||||
; bcc FM
|
|
||||||
|
|
||||||
jsr init ; initialize ProRWTS2 (bye bye ProDOS)
|
|
||||||
lda LCBANK1 ; read/write LC bank 1
|
|
||||||
lda LCBANK1
|
|
||||||
jmp Start
|
|
||||||
|
|
||||||
!source "src/memcheck.a"
|
!source "src/memcheck.a"
|
||||||
!source "src/joystick.a"
|
!source "src/joystick.a"
|
||||||
!source "src/normfast.a"
|
!source "src/normfast.a"
|
||||||
|
; ProRWTS2 has its own function to relocate itself
|
||||||
!source "src/prorwts2.a"
|
!source "src/prorwts2.a"
|
||||||
|
|
||||||
FirstMover
|
FirstMover
|
||||||
!pseudopc $D000 {
|
!pseudopc $D000 {
|
||||||
!zone
|
!zone
|
||||||
Start
|
Start
|
||||||
lda #$00 ; read first $2000 bytes
|
|
||||||
sta sizelo
|
|
||||||
lda #$20
|
|
||||||
sta sizehi
|
|
||||||
lda #0 ; 0 = read into main memory
|
|
||||||
sta auxreq
|
|
||||||
lda #cmdread ; read (instead of write)
|
|
||||||
sta reqcmd
|
|
||||||
bit MachineStatus
|
bit MachineStatus
|
||||||
bvs @ShowCover128K
|
bvs @Load128
|
||||||
lda #<cover64 ; pointer to length-prefixed filename
|
jsr LoadFile
|
||||||
sta namlo
|
!word cover64
|
||||||
lda #>cover64
|
|
||||||
sta namhi
|
|
||||||
jsr hddopendir ; call ProRWTS2
|
|
||||||
clc
|
clc
|
||||||
bcc @Show
|
bcc @Show
|
||||||
@ShowCover128K
|
@Load128
|
||||||
inc auxreq ; 1 = read into aux memory
|
jsr LoadDHRFile
|
||||||
lda #<cover128 ; pointer to length-prefixed filename
|
!word cover128
|
||||||
sta namlo
|
sta $C000 ; double hi-res mode
|
||||||
lda #>cover128
|
|
||||||
sta namhi
|
|
||||||
jsr hddopendir ; call ProRWTS2
|
|
||||||
lda #$20 ; read next $2000 bytes
|
|
||||||
sta sizehi
|
|
||||||
dec auxreq ; 0 = read into main memory
|
|
||||||
jsr hddrdwrpart ; call ProRWTS2
|
|
||||||
|
|
||||||
sta $C000 ; display double hi-res page 1
|
|
||||||
sta $C00D
|
sta $C00D
|
||||||
sta $C05E
|
sta $C05E
|
||||||
sta $C001
|
sta $C001
|
||||||
@Show
|
@Show
|
||||||
sta $C057
|
sta $C057 ; show graphics page 1 (HGR or DHGR)
|
||||||
sta $C052
|
sta $C052
|
||||||
sta $C054
|
sta $C054
|
||||||
sta $C050
|
sta $C050
|
||||||
|
|
||||||
|
jsr LoadFile
|
||||||
|
- !word gamesconf
|
||||||
|
jsr ParseGamesList
|
||||||
|
!word gGamesListStore
|
||||||
|
!word -
|
||||||
|
|
||||||
bit $C010
|
bit $C010
|
||||||
- lda $C000
|
- lda $C000
|
||||||
bpl -
|
bpl -
|
||||||
bit $C010
|
bit $C010
|
||||||
brk
|
brk
|
||||||
|
|
||||||
|
gamesconf
|
||||||
|
!byte gamesconf_e-gamesconf_b
|
||||||
|
gamesconf_b
|
||||||
|
!text "GAMES.CONF"
|
||||||
|
gamesconf_e
|
||||||
cover64
|
cover64
|
||||||
!byte cover64_e-cover64_b
|
!byte cover64_e-cover64_b
|
||||||
cover64_b
|
cover64_b
|
||||||
|
@ -107,24 +100,11 @@ cover128
|
||||||
cover128_b
|
cover128_b
|
||||||
!text "COVER.A2FC"
|
!text "COVER.A2FC"
|
||||||
cover128_e
|
cover128_e
|
||||||
|
; these routines will only be called after relocating to language card
|
||||||
|
!source "src/glue.prorwts2.a"
|
||||||
!source "src/okvs.a"
|
!source "src/okvs.a"
|
||||||
|
!source "src/parse.games.a"
|
||||||
|
gGamesListStore
|
||||||
|
!word *+2 ; address of first okvs store
|
||||||
}
|
}
|
||||||
LastMover
|
LastMover
|
||||||
|
|
||||||
;LoadDHGR
|
|
||||||
; sta $C000
|
|
||||||
; ldx #$20 ; copy $2000 bytes to auxmem
|
|
||||||
; stx @copya+2
|
|
||||||
; stx @copyb+2
|
|
||||||
; ldy #0
|
|
||||||
;@writeToAuxLoop
|
|
||||||
; sta $C005
|
|
||||||
;@copya lda $FF00, y
|
|
||||||
;@copyb sta $FF00, y
|
|
||||||
; iny
|
|
||||||
; bne @copya
|
|
||||||
; sta $C004
|
|
||||||
; inc @copya+2
|
|
||||||
; inc @copyb+2
|
|
||||||
; dex
|
|
||||||
; bne @writeToAuxLoop
|
|
||||||
|
|
|
@ -3,25 +3,14 @@
|
||||||
;
|
;
|
||||||
|
|
||||||
; soft switches
|
; soft switches
|
||||||
STOREOFF = $C000 ; write to use following flags:
|
STOREOFF = $C000 ; write to use following 4 flags:
|
||||||
READMAINMEM = $C002 ; write to R main mem
|
READMAINMEM = $C002 ; write to R main mem
|
||||||
READAUXMEM = $C003 ; write to R aux mem
|
READAUXMEM = $C003 ; write to R aux mem
|
||||||
WRITEMAINMEM = $C004 ; write to W main mem
|
WRITEMAINMEM = $C004 ; write to W main mem
|
||||||
WRITEAUXMEM = $C005 ; write to W aux mem
|
WRITEAUXMEM = $C005 ; write to W aux mem
|
||||||
SETMAINZP = $C008 ; write to R/W main mem zero page
|
;
|
||||||
SETAUXZP = $C009 ; write to R/W aux mem zero page
|
|
||||||
AUXMEMSTATUS = $C013 ; read high bit only
|
|
||||||
AUXZPSTATUS = $C016 ; read high bit only
|
|
||||||
SLOT3STATUS = $C017 ; read high bit only
|
SLOT3STATUS = $C017 ; read high bit only
|
||||||
|
|
||||||
LCBANK2READ = $C080 ; read once to R RAM bank 2 / no write
|
|
||||||
ROMIN = $C081 ; read twice to R ROM / W RAM bank 2
|
|
||||||
ROMONLY = $C082 ; read once to R ROM / no write
|
|
||||||
;LCBANK2 = $C083 ; read twice to R/W RAM bank 2
|
|
||||||
LCBANK1READ = $C088 ; read once to R RAM bank 1 / no write
|
|
||||||
LCBANK1WRITE = $C089 ; read twice to R ROM / W RAM bank 1
|
|
||||||
LCBANK1 = $C08B ; read twice to R/W RAM bank 1
|
|
||||||
|
|
||||||
; ROM
|
; ROM
|
||||||
MACHINEID = $FBB3
|
MACHINEID = $FBB3
|
||||||
|
|
||||||
|
@ -31,5 +20,13 @@ PTR = $02
|
||||||
SRC = $04
|
SRC = $04
|
||||||
DEST = $06
|
DEST = $06
|
||||||
SAVE = $08
|
SAVE = $08
|
||||||
MachineStatus =$FF ; bit 7 = 1 if machine has joystick
|
MachineStatus =$F0 ; bit 7 = 1 if machine has joystick
|
||||||
; bit 6 = 1 if machine has 128K
|
; bit 6 = 1 if machine has 128K
|
||||||
|
; $FE ; used by ParseGamesList
|
||||||
|
; $FF ; used by ParseGamesList
|
||||||
|
|
||||||
|
; main memory
|
||||||
|
gKeyLen = $1F00 ; used by ParseGamesList
|
||||||
|
gKey = $1F01
|
||||||
|
gValLen = $1F80
|
||||||
|
gVal = $1F81
|
||||||
|
|
63
src/glue.prorwts2.a
Normal file
63
src/glue.prorwts2.a
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
;license:MIT
|
||||||
|
;(c) 2017-8 by 4am
|
||||||
|
;
|
||||||
|
; ProRWTS2 glue functions
|
||||||
|
;
|
||||||
|
; Public functions
|
||||||
|
; - LoadFile
|
||||||
|
;
|
||||||
|
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
; LoadFile
|
||||||
|
; load a file into memory all at once, using ProRWTS2
|
||||||
|
; uses file's load address
|
||||||
|
;
|
||||||
|
; in: stack contains 2 bytes of parameters:
|
||||||
|
; +1 address of filename
|
||||||
|
; out: all flags clobbered
|
||||||
|
; all registers clobbered
|
||||||
|
; stack set to next instruction after parameters
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
LoadFile
|
||||||
|
+PARAMS_ON_STACK 2
|
||||||
|
+LDPARAM 1
|
||||||
|
+STAY namlo ; set filename
|
||||||
|
lda #$FF ; read entire file (ProRWTS2 will figure out exact size)
|
||||||
|
sta sizelo
|
||||||
|
sta sizehi
|
||||||
|
lda #0 ; 0 = read into main memory
|
||||||
|
sta auxreq
|
||||||
|
lda #cmdread ; read (instead of write)
|
||||||
|
sta reqcmd
|
||||||
|
jmp hddopendir ; exit via ProRWTS2
|
||||||
|
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
; LoadDHRFile
|
||||||
|
; load .A2FC file (uncompressed double hi-res graphics) into memory
|
||||||
|
; all at once, using ProRWTS2
|
||||||
|
; first $2000 bytes of file are loaded into auxiliary memory $2000..$3FFF
|
||||||
|
; second $2000 bytes of file are loaded into main memory $2000..$3FFF
|
||||||
|
;
|
||||||
|
; in: stack contains 2 bytes of parameters:
|
||||||
|
; +1 address of filename
|
||||||
|
; out: all flags clobbered
|
||||||
|
; all registers clobbered
|
||||||
|
; stack set to next instruction after parameters
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
LoadDHRFile
|
||||||
|
+PARAMS_ON_STACK 2
|
||||||
|
+LDPARAM 1
|
||||||
|
+STAY namlo ; set filename
|
||||||
|
lda #$00 ; read first $2000 bytes
|
||||||
|
sta sizelo
|
||||||
|
lda #$20
|
||||||
|
sta sizehi
|
||||||
|
lda #1 ; 1 = read into aux memory
|
||||||
|
sta auxreq
|
||||||
|
lda #cmdread ; read (instead of write)
|
||||||
|
sta reqcmd
|
||||||
|
jsr hddopendir ; call ProRWTS2
|
||||||
|
lda #$20 ; read next $2000 bytes
|
||||||
|
sta sizehi
|
||||||
|
dec auxreq ; 0 = read into main memory
|
||||||
|
jmp hddrdwrpart ; call ProRWTS2
|
15
src/macros.a
15
src/macros.a
|
@ -66,3 +66,18 @@
|
||||||
!macro HIDE_NEXT_2_BYTES {
|
!macro HIDE_NEXT_2_BYTES {
|
||||||
!byte $2C
|
!byte $2C
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; various language card configurations
|
||||||
|
!macro READ_RAM1_WRITE_RAM1 {
|
||||||
|
bit $C08B
|
||||||
|
bit $C08B
|
||||||
|
}
|
||||||
|
|
||||||
|
!macro READ_ROM_WRITE_RAM1 {
|
||||||
|
bit $C089
|
||||||
|
bit $C089
|
||||||
|
}
|
||||||
|
|
||||||
|
!macro READ_ROM_NO_WRITE {
|
||||||
|
bit $C082
|
||||||
|
}
|
||||||
|
|
|
@ -9,8 +9,7 @@
|
||||||
; ROM in memory (not LC RAM bank)
|
; ROM in memory (not LC RAM bank)
|
||||||
;------------------------------------------------------------------------------
|
;------------------------------------------------------------------------------
|
||||||
Has64K
|
Has64K
|
||||||
lda LCBANK1 ; read/write LC RAM bank 1
|
+READ_RAM1_WRITE_RAM1
|
||||||
lda LCBANK1
|
|
||||||
lda #$AA ; test #1 for $D0 page
|
lda #$AA ; test #1 for $D0 page
|
||||||
sta $D000
|
sta $D000
|
||||||
eor $D000
|
eor $D000
|
||||||
|
@ -22,7 +21,7 @@ Has64K
|
||||||
clc
|
clc
|
||||||
+HIDE_NEXT_BYTE
|
+HIDE_NEXT_BYTE
|
||||||
@no sec
|
@no sec
|
||||||
sta ROMONLY
|
+READ_ROM_NO_WRITE
|
||||||
rts
|
rts
|
||||||
|
|
||||||
;------------------------------------------------------------------------------
|
;------------------------------------------------------------------------------
|
||||||
|
@ -41,7 +40,8 @@ Has64K
|
||||||
; https://github.com/jmechner/Prince-of-Persia-Apple-II/blob/master/01%20POP%20Source/Source/BOOT.S#L119
|
; https://github.com/jmechner/Prince-of-Persia-Apple-II/blob/master/01%20POP%20Source/Source/BOOT.S#L119
|
||||||
;------------------------------------------------------------------------------
|
;------------------------------------------------------------------------------
|
||||||
Has128K
|
Has128K
|
||||||
sta ROMONLY ; need ROM for machine ID byte
|
+READ_ROM_NO_WRITE
|
||||||
|
sta STOREOFF
|
||||||
lda MACHINEID
|
lda MACHINEID
|
||||||
cmp #6
|
cmp #6
|
||||||
bne @no ; earlier than //e -> no 128K
|
bne @no ; earlier than //e -> no 128K
|
||||||
|
|
129
src/parse.games.a
Normal file
129
src/parse.games.a
Normal file
|
@ -0,0 +1,129 @@
|
||||||
|
;license:MIT
|
||||||
|
;(c) 2018 by 4am
|
||||||
|
;
|
||||||
|
; GAMES.CONF parser
|
||||||
|
;
|
||||||
|
; Public functions:
|
||||||
|
; - ParseGamesList
|
||||||
|
;
|
||||||
|
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
; ParseGamesList
|
||||||
|
; parse buffer with AB,KEY=VALUE lines of text into an okvs
|
||||||
|
; keys and values limited to 127 characters, which should be enough for anyone
|
||||||
|
; '[' character at beginning of line ends the parsing
|
||||||
|
; (see games.conf file for more format information)
|
||||||
|
;
|
||||||
|
; in: stack contains 4 bytes of parameters:
|
||||||
|
; +1 [word] handle to storage space for okvs
|
||||||
|
; +3 [word] handle to buffer containing contents of GAMES.CONF
|
||||||
|
; out: all registers and flags clobbered
|
||||||
|
; $1F00..$1FFF clobbered
|
||||||
|
; $00/$01 clobbered
|
||||||
|
; $02/$03 clobbered
|
||||||
|
; $04/$05 has the address of the next available byte after the okvs
|
||||||
|
; $FE/$FF clobbered
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
ParseGamesList
|
||||||
|
+PARAMS_ON_STACK 4
|
||||||
|
|
||||||
|
+LDPARAM 1
|
||||||
|
+STAY @store1
|
||||||
|
+STAY @store2
|
||||||
|
|
||||||
|
+LDPARAM 3
|
||||||
|
+STAY $FE
|
||||||
|
|
||||||
|
ldy #0
|
||||||
|
lda ($FE),y
|
||||||
|
pha
|
||||||
|
iny
|
||||||
|
lda ($FE),y
|
||||||
|
tay
|
||||||
|
pla
|
||||||
|
sec
|
||||||
|
sbc #$01
|
||||||
|
sta $FE
|
||||||
|
bcs +
|
||||||
|
dey
|
||||||
|
+ sty $FF
|
||||||
|
jsr okvs_init ; reset key/value store
|
||||||
|
@store1 !word $FDFD ; SMC
|
||||||
|
|
||||||
|
ldy #$00 ; index into ($FE) pointing to current character
|
||||||
|
@newkey ldx #$00 ; X = index into current key
|
||||||
|
jsr IncAndGetChar ; get first filter character ('1' if game requires joystick)
|
||||||
|
cmp #$0D ; ignore blank line
|
||||||
|
beq @newkey
|
||||||
|
cmp #$5B ; '[' ends the parsing
|
||||||
|
beq .parseKeyValueDone
|
||||||
|
cmp #$30 ; '0' -> no filtering on joystick
|
||||||
|
beq @filterOnMemory
|
||||||
|
cmp #$31 ; not '0' or '1' or '[' or CR -> ignore entire line (e.g. comment)
|
||||||
|
bne @skipLine
|
||||||
|
bit MachineStatus
|
||||||
|
bpl @skipLine ; game requires joystick but we don't have one, so ignore entire line
|
||||||
|
@filterOnMemory
|
||||||
|
jsr IncAndGetChar ; get second filter character ('1' if game requires 128K)
|
||||||
|
cmp #$30 ; '0' -> no filtering on memory
|
||||||
|
beq @swallowComma
|
||||||
|
cmp #$31 ; not '0' or '1' -> ignore entire line
|
||||||
|
bne @skipLine
|
||||||
|
bit MachineStatus
|
||||||
|
bvc @skipLine ; game requires 128K but we only have 64K, so ignore entire line
|
||||||
|
@swallowComma
|
||||||
|
jsr IncAndGetChar
|
||||||
|
cmp #$2C ; ',' delimiter (required)
|
||||||
|
bne @skipLine
|
||||||
|
@gatherKey
|
||||||
|
jsr IncAndGetChar
|
||||||
|
cmp #$3D ; '=' ends the key
|
||||||
|
beq @endKey
|
||||||
|
sta gKey,x
|
||||||
|
inx
|
||||||
|
bpl @gatherKey
|
||||||
|
@endKey stx gKeyLen
|
||||||
|
ldx #$00 ; now X = index into the current value
|
||||||
|
@gatherValue
|
||||||
|
jsr IncAndGetChar
|
||||||
|
cmp #$0D ; CR ends the value
|
||||||
|
beq @endValue
|
||||||
|
sta gVal,x
|
||||||
|
inx
|
||||||
|
bpl @gatherValue
|
||||||
|
@endValue
|
||||||
|
stx gValLen
|
||||||
|
tya
|
||||||
|
pha ; okvs functions clobber everything but we need Y
|
||||||
|
jsr okvs_append
|
||||||
|
@store2 !word $FDFD ; SMC
|
||||||
|
!word gKeyLen
|
||||||
|
!word gValLen
|
||||||
|
!byte 0
|
||||||
|
pla
|
||||||
|
tay
|
||||||
|
clc
|
||||||
|
bcc @newkey ; always branches
|
||||||
|
|
||||||
|
@skipLine ; skip to CR
|
||||||
|
jsr IncAndGetChar
|
||||||
|
cmp #$0D ; CR
|
||||||
|
bne @skipLine
|
||||||
|
beq @newkey ; always branches
|
||||||
|
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
; IncAndGetChar
|
||||||
|
;
|
||||||
|
; in: Y = index into ($FE)
|
||||||
|
; ($FE) -> buffer
|
||||||
|
; out: A contains next byte from buffer
|
||||||
|
; Y incremented
|
||||||
|
; $FF possibly incremented
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
IncAndGetChar
|
||||||
|
iny
|
||||||
|
bne +
|
||||||
|
inc $FF
|
||||||
|
+ lda ($FE),y
|
||||||
|
.parseKeyValueDone
|
||||||
|
rts
|
455
src/prodos.mli.a
455
src/prodos.mli.a
|
@ -1,455 +0,0 @@
|
||||||
;license:MIT
|
|
||||||
;(c) 2017-8 by 4am
|
|
||||||
;
|
|
||||||
; ProDOS - file and other MLI routines
|
|
||||||
;
|
|
||||||
; Public functions
|
|
||||||
; - LoadFile
|
|
||||||
; - LoadDHRFile
|
|
||||||
; - LoadSHRFile
|
|
||||||
; - SaveFile
|
|
||||||
; - SetPrefix
|
|
||||||
; - GetFileInfo
|
|
||||||
;
|
|
||||||
|
|
||||||
; MLI command codes
|
|
||||||
CMD_QUIT = $65 ; quit to ProDOS
|
|
||||||
CMD_CREATE = $C0 ; create new file
|
|
||||||
CMD_DESTROY = $C1 ; delete a file
|
|
||||||
CMD_SETFILEINFO= $C3 ; set file info
|
|
||||||
CMD_GETFILEINFO= $C4 ; get file (or volume) info
|
|
||||||
CMD_SETPREFIX = $C6 ; change default pathname prefix
|
|
||||||
CMD_OPEN = $C8 ; open a file
|
|
||||||
CMD_READ = $CA ; read an open file
|
|
||||||
CMD_WRITE = $CB ; write to an open file
|
|
||||||
CMD_CLOSE = $CC ; close an open file
|
|
||||||
|
|
||||||
; MLI parameter counts
|
|
||||||
PC_QUIT = $04
|
|
||||||
PC_CREATE = $07
|
|
||||||
PC_DESTROY = $01
|
|
||||||
PC_SETFILEINFO = $07
|
|
||||||
PC_GETFILEINFO = $0A
|
|
||||||
PC_SETPREFIX = $01
|
|
||||||
PC_OPEN = $03
|
|
||||||
PC_READ = $04
|
|
||||||
PC_WRITE = $04
|
|
||||||
PC_CLOSE = $01
|
|
||||||
|
|
||||||
; ROM addresses
|
|
||||||
PRODOSMLI = $BF00 ; [callable] MLI entry point
|
|
||||||
MACHID = $BF98 ; machine identification byte
|
|
||||||
|
|
||||||
kAccessBits = $C3 ; full access (used in SaveFile)
|
|
||||||
|
|
||||||
;-------------------------------
|
|
||||||
; LoadFile
|
|
||||||
; load a file into memory all at once, using ProDOS MLI calls
|
|
||||||
;
|
|
||||||
; in: stack contains 6 bytes of parameters:
|
|
||||||
; +1 address of pathname
|
|
||||||
; +3 address of data buffer (to receive file contents)
|
|
||||||
; +5 address of ProDOS file buffer
|
|
||||||
; out: if C set, load failed and A contains error code
|
|
||||||
; from open or read
|
|
||||||
; if C clear, load succeeded and ($02) contains
|
|
||||||
; data loaded from file
|
|
||||||
; all other flags clobbered
|
|
||||||
; all registers clobbered
|
|
||||||
; stack set to next instruction after parameters
|
|
||||||
;-------------------------------
|
|
||||||
LoadFile
|
|
||||||
+PARAMS_ON_STACK 6
|
|
||||||
|
|
||||||
+LDPARAM 1
|
|
||||||
+STAY mliparam+1 ; pathname
|
|
||||||
+LDPARAM 5
|
|
||||||
+STAY mliparam+3 ; ProDOS file buffer
|
|
||||||
|
|
||||||
jsr _openfile
|
|
||||||
bcs @exit ; C set on error
|
|
||||||
|
|
||||||
pha ; push file reference number
|
|
||||||
+LDPARAM 3
|
|
||||||
+STAY mliparam+2 ; data buffer
|
|
||||||
lda #$FF
|
|
||||||
sta mliparam+4 ; max data length (unlimited, YOLO)
|
|
||||||
sta mliparam+5
|
|
||||||
pla ; pull file reference number
|
|
||||||
jsr _readfile
|
|
||||||
php ; save flags from readfile
|
|
||||||
pha
|
|
||||||
jsr _closefile ; always close whether read worked or not
|
|
||||||
pla
|
|
||||||
plp ; restore flags from readfile
|
|
||||||
; (so caller gets codes from read attempt,
|
|
||||||
; not close)
|
|
||||||
@exit rts
|
|
||||||
|
|
||||||
;-------------------------------
|
|
||||||
; LoadDHRFile
|
|
||||||
; load uncompressed DHR file into memory from .A2FC file
|
|
||||||
; 1. load first half ($2000 bytes)
|
|
||||||
; 2. copy to auxmem
|
|
||||||
; 3. load second half ($2000 bytes)
|
|
||||||
;
|
|
||||||
; always loads into graphics page 1 ($2000/main and $2000/aux)
|
|
||||||
;
|
|
||||||
; in: stack contains 4 bytes of parameters:
|
|
||||||
; +1 address of pathname
|
|
||||||
; +3 address of ProDOS file buffer
|
|
||||||
; out: if C set, load failed
|
|
||||||
; if C clear, load succeeded
|
|
||||||
; all other flags clobbered
|
|
||||||
; all registers clobbered
|
|
||||||
; stack set to next instruction after parameters
|
|
||||||
;-------------------------------
|
|
||||||
LoadDHRFile
|
|
||||||
+PARAMS_ON_STACK 4
|
|
||||||
|
|
||||||
ldy #$04
|
|
||||||
- lda (PARAM),y
|
|
||||||
sta mliparam,y
|
|
||||||
dey
|
|
||||||
bne -
|
|
||||||
|
|
||||||
jsr _openfile
|
|
||||||
bcs @exit ; C set on error
|
|
||||||
sta @saverefnum ; store file refnum
|
|
||||||
|
|
||||||
ldy #$20
|
|
||||||
stz mliparam+2 ; read into $2000 in main mem
|
|
||||||
sty mliparam+3
|
|
||||||
stz mliparam+4 ; read length = $2000 bytes (first half of file)
|
|
||||||
sty mliparam+5
|
|
||||||
|
|
||||||
jsr _readfile
|
|
||||||
bcs @close
|
|
||||||
|
|
||||||
sta $C000
|
|
||||||
ldx #$20 ; copy $2000 bytes to auxmem
|
|
||||||
stx @copya+2
|
|
||||||
stx @copyb+2
|
|
||||||
ldy #0
|
|
||||||
@writeToAuxLoop
|
|
||||||
sta $C005
|
|
||||||
@copya lda $FF00, y
|
|
||||||
@copyb sta $FF00, y
|
|
||||||
iny
|
|
||||||
bne @copya
|
|
||||||
sta $C004
|
|
||||||
inc @copya+2
|
|
||||||
inc @copyb+2
|
|
||||||
dex
|
|
||||||
bne @writeToAuxLoop
|
|
||||||
|
|
||||||
lda @saverefnum
|
|
||||||
jsr _readfile ; read another $2000 bytes into $2000 (stays in main mem)
|
|
||||||
|
|
||||||
@close php ; save flags from readfile
|
|
||||||
@saverefnum=*+1
|
|
||||||
lda #$FD ; file refnum (SMC)
|
|
||||||
jsr _closefile
|
|
||||||
plp ; restore flags from readfile
|
|
||||||
@exit rts
|
|
||||||
|
|
||||||
;-------------------------------
|
|
||||||
; LoadSHRFile
|
|
||||||
; load uncompressed SHR file into memory from .PIC file
|
|
||||||
; 1. load first quarter ($2000 bytes)
|
|
||||||
; 2. copy to graphics memory
|
|
||||||
; 3. load second quarter ($2000 bytes)
|
|
||||||
; 4. copy to graphics memory
|
|
||||||
; 5. load third quarter ($2000 bytes)
|
|
||||||
; 6. copy to graphics memory
|
|
||||||
; 7. load fourth quarter ($2000 bytes)
|
|
||||||
; 8. copy to graphics memory
|
|
||||||
;
|
|
||||||
; in: stack contains 4 bytes of parameters:
|
|
||||||
; +1 address of pathname
|
|
||||||
; +3 address of ProDOS file buffer
|
|
||||||
; out: if C set, load failed
|
|
||||||
; if C clear, load succeeded
|
|
||||||
; all other flags clobbered
|
|
||||||
; all registers clobbered
|
|
||||||
; stack set to next instruction after parameters
|
|
||||||
;-------------------------------
|
|
||||||
LoadSHRFile
|
|
||||||
+PARAMS_ON_STACK 4
|
|
||||||
|
|
||||||
ldy #$04
|
|
||||||
- lda (PARAM),y
|
|
||||||
sta mliparam,y
|
|
||||||
dey
|
|
||||||
bne -
|
|
||||||
|
|
||||||
jsr _openfile
|
|
||||||
bcs @exit ; C set on error
|
|
||||||
sta @saverefnum ; store file refnum
|
|
||||||
|
|
||||||
ldy #$20
|
|
||||||
stz mliparam+2 ; read into $2000 in main mem
|
|
||||||
sty mliparam+3
|
|
||||||
stz mliparam+4 ; read length = $2000 bytes (one quarter of file)
|
|
||||||
sty mliparam+5
|
|
||||||
sty @shrdest+2
|
|
||||||
|
|
||||||
ldx #4 ; four quarters
|
|
||||||
- lda @saverefnum ; file refnum
|
|
||||||
jsr _readfile
|
|
||||||
bcs @close
|
|
||||||
phx
|
|
||||||
|
|
||||||
!cpu 65816
|
|
||||||
xce
|
|
||||||
rep #$30
|
|
||||||
!rl
|
|
||||||
!al
|
|
||||||
lda #$1FFF
|
|
||||||
tax
|
|
||||||
inx
|
|
||||||
@shrdest ldy #$FD00 ; SMC
|
|
||||||
phb
|
|
||||||
mvn 0,$E1
|
|
||||||
plb
|
|
||||||
sty @shrdest+1
|
|
||||||
!as
|
|
||||||
!rs
|
|
||||||
sec
|
|
||||||
xce
|
|
||||||
!cpu 65C02
|
|
||||||
|
|
||||||
plx
|
|
||||||
dex
|
|
||||||
bne -
|
|
||||||
|
|
||||||
@close php ; save flags from readfile
|
|
||||||
@saverefnum=*+1
|
|
||||||
lda #$FD ; file refnum (SMC)
|
|
||||||
jsr _closefile
|
|
||||||
plp ; restore flags from readfile
|
|
||||||
@exit rts
|
|
||||||
|
|
||||||
;-------------------------------
|
|
||||||
; SaveFile
|
|
||||||
; save a file to disk all at once, using ProDOS MLI calls
|
|
||||||
;
|
|
||||||
; in: stack contains 11 ($0B) bytes of parameters:
|
|
||||||
; +1 address of pathname
|
|
||||||
; +3 [byte] file type
|
|
||||||
; +4 [word] aux file type
|
|
||||||
; +6 address of data buffer
|
|
||||||
; +8 [word] length of data buffer
|
|
||||||
; +A address of ProDOS file buffer
|
|
||||||
; out: if C set, save failed
|
|
||||||
; if C clear, save succeeded
|
|
||||||
; all other flags clobbered
|
|
||||||
; all registers clobbered
|
|
||||||
; stack set to next instruction after parameters
|
|
||||||
;-------------------------------
|
|
||||||
SaveFile
|
|
||||||
+PARAMS_ON_STACK $0B
|
|
||||||
+LDPARAM 1
|
|
||||||
+STAY mliparam+1 ; pathname
|
|
||||||
lda #CMD_DESTROY ; MLI destroy command
|
|
||||||
ldy #PC_DESTROY ; number of parameters for 'destroy' command
|
|
||||||
jsr mli ; don't care if this fails
|
|
||||||
|
|
||||||
ldy #$03
|
|
||||||
lda (PARAM),y ; file type
|
|
||||||
sta mliparam+4
|
|
||||||
+LDPARAM 4
|
|
||||||
+STAY mliparam+5 ; aux file type
|
|
||||||
lda #kAccessBits
|
|
||||||
sta mliparam+3 ; access bits (full access)
|
|
||||||
ldy #1
|
|
||||||
sty mliparam+7 ; storage type (file)
|
|
||||||
dey
|
|
||||||
sty mliparam+8 ; creation date (current)
|
|
||||||
sty mliparam+9
|
|
||||||
sty mliparam+10 ; creation time (current)
|
|
||||||
sty mliparam+11
|
|
||||||
lda #CMD_CREATE ; MLI create command
|
|
||||||
ldy #PC_CREATE ; number of parameters for 'create' command
|
|
||||||
jsr mli
|
|
||||||
bcs @exit
|
|
||||||
|
|
||||||
+LDPARAM 10
|
|
||||||
+STAY mliparam+3 ; PrODOS file buffer
|
|
||||||
jsr _openfile
|
|
||||||
bcs @exit
|
|
||||||
|
|
||||||
sta mliparam+1 ; store file reference number
|
|
||||||
+LDPARAM 6
|
|
||||||
+STAY mliparam+2 ; data buffer
|
|
||||||
+LDPARAM 8
|
|
||||||
+STAY mliparam+4 ; data length
|
|
||||||
lda #CMD_WRITE ; MLI write command
|
|
||||||
ldy #PC_WRITE ; number of parameters for 'write' command
|
|
||||||
jsr mli
|
|
||||||
php ; save flags from write command
|
|
||||||
jsr _closefile ; always close whether write worked or not
|
|
||||||
plp ; restore flags from write
|
|
||||||
; (so caller gets codes from write attempt,
|
|
||||||
; not close)
|
|
||||||
@exit rts
|
|
||||||
|
|
||||||
;-------------------------------
|
|
||||||
; SetAuxFileType
|
|
||||||
; set auxiliary file information only
|
|
||||||
; access bits and file-type are hard-coded
|
|
||||||
; intended for updating save-games only
|
|
||||||
;
|
|
||||||
; in: stack contains 4 bytes of parameters:
|
|
||||||
; +1 address of pathname
|
|
||||||
; +3 auxiliary type to set
|
|
||||||
; out: if C set, MLI call failed and A contains error code
|
|
||||||
; from set
|
|
||||||
; if C clear, MLI call succeeded
|
|
||||||
; all other flags clobbered
|
|
||||||
; all registers clobbered
|
|
||||||
; stack set to next instruction after parameters
|
|
||||||
;-------------------------------
|
|
||||||
SetAuxFileType
|
|
||||||
+PARAMS_ON_STACK 4
|
|
||||||
+LDPARAM 1
|
|
||||||
+STAY mliparam+1 ; pathname
|
|
||||||
+LDPARAM 3
|
|
||||||
+STAY mliparam+5 ; aux type
|
|
||||||
lda #%11000011
|
|
||||||
sta mliparam+3 ; access bits
|
|
||||||
lda #4
|
|
||||||
sta mliparam+4 ; file type
|
|
||||||
lda #0
|
|
||||||
sta extra+0 ; date
|
|
||||||
sta extra+1 ; date
|
|
||||||
sta extra+2 ; time
|
|
||||||
sta extra+3 ; time
|
|
||||||
lda #CMD_SETFILEINFO ; MLI command
|
|
||||||
ldy #PC_SETFILEINFO ; number of parameters for 'setfileinfo' command
|
|
||||||
bra mli
|
|
||||||
|
|
||||||
;-------------------------------
|
|
||||||
; SetPrefix
|
|
||||||
; set current directory
|
|
||||||
;
|
|
||||||
; in: stack contains 2 bytes of parameters:
|
|
||||||
; +1 address of pathname
|
|
||||||
; out: if C set, call failed and A contains error code
|
|
||||||
; if C clear, call succeeded
|
|
||||||
; all other flags clobbered
|
|
||||||
; all registers clobbered
|
|
||||||
; stack set to next instruction after parameters
|
|
||||||
;-------------------------------
|
|
||||||
SetPrefix
|
|
||||||
+PARAMS_ON_STACK 2
|
|
||||||
+LDPARAM 1
|
|
||||||
+STAY mliparam+1 ; pathname
|
|
||||||
lda #CMD_SETPREFIX
|
|
||||||
ldy #PC_SETPREFIX
|
|
||||||
bra mli
|
|
||||||
|
|
||||||
;-------------------------------
|
|
||||||
; GetFileInfo
|
|
||||||
; just what it says on the tin
|
|
||||||
;
|
|
||||||
; in: stack contains 2 bytes of parameters:
|
|
||||||
; +1 address of pathname
|
|
||||||
; out: if C set, MLI call failed and A contains error code
|
|
||||||
; from open or read
|
|
||||||
; if C clear, MLI call succeeded and mliparam contains
|
|
||||||
; all the info
|
|
||||||
; all other flags clobbered
|
|
||||||
; all registers clobbered
|
|
||||||
; stack set to next instruction after parameters
|
|
||||||
;-------------------------------
|
|
||||||
GetFileInfo
|
|
||||||
+PARAMS_ON_STACK 2
|
|
||||||
+LDPARAM 1
|
|
||||||
+STAY mliparam+1 ; pathname
|
|
||||||
lda #CMD_GETFILEINFO ; MLI command
|
|
||||||
ldy #PC_GETFILEINFO ; number of parameters for 'getfileinfo' command
|
|
||||||
bra mli
|
|
||||||
|
|
||||||
;-------------------------------
|
|
||||||
; open file via ProDOS MLI
|
|
||||||
;
|
|
||||||
; in: caller has filled @mliparam with address of
|
|
||||||
; pathname, address of data buffer, and maximum
|
|
||||||
; data length
|
|
||||||
; out: if C set, open failed and A contains error code
|
|
||||||
; if C clear, open succeeded and A contains
|
|
||||||
; file reference number
|
|
||||||
;-------------------------------
|
|
||||||
_openfile
|
|
||||||
lda #CMD_OPEN ; MLI command
|
|
||||||
ldy #PC_OPEN ; number of parameters for 'open' command
|
|
||||||
jsr mli
|
|
||||||
bcs @exit
|
|
||||||
lda refnum ; caller should save file reference number
|
|
||||||
; as this memory location may be
|
|
||||||
; overwritten by later MLI calls
|
|
||||||
@exit rts
|
|
||||||
|
|
||||||
;-------------------------------
|
|
||||||
; read an open file via ProDOS MLI
|
|
||||||
;
|
|
||||||
; in: A = file reference number
|
|
||||||
; caller has filled @mliparam with address of
|
|
||||||
; data buffer and maximum data length
|
|
||||||
; out: if C set, read failed and A contains error code
|
|
||||||
; if C clear, read succeeded and A contains the same
|
|
||||||
; file reference number that was passed in
|
|
||||||
;-------------------------------
|
|
||||||
_readfile
|
|
||||||
sta mliparam+1 ; store file reference number
|
|
||||||
lda #CMD_READ ; MLI read command
|
|
||||||
ldy #PC_READ ; number of parameters for 'read' command
|
|
||||||
jsr mli
|
|
||||||
bcs @exit
|
|
||||||
lda mliparam+1 ; if no error, return file reference number
|
|
||||||
@exit rts
|
|
||||||
|
|
||||||
;-------------------------------
|
|
||||||
; close an open file
|
|
||||||
; in: A = file reference number
|
|
||||||
; out: if error, C set and A contains error code
|
|
||||||
; if success, C clear
|
|
||||||
;-------------------------------
|
|
||||||
_closefile
|
|
||||||
sta mliparam+1 ; store file reference number
|
|
||||||
lda #CMD_CLOSE ; MLI close command
|
|
||||||
ldy #PC_CLOSE ; number of parameters for 'close' command
|
|
||||||
bra mli
|
|
||||||
|
|
||||||
QuitToProDOS
|
|
||||||
lda #CMD_QUIT
|
|
||||||
ldy #PC_QUIT
|
|
||||||
; execution falls through here
|
|
||||||
;-------------------------------
|
|
||||||
; low-level MLI wrapper
|
|
||||||
; in: A = MLI command code
|
|
||||||
; Y = number of MLI parameters
|
|
||||||
; caller has filled @mliparam
|
|
||||||
; with all relevant parameters
|
|
||||||
; out: returns immediately after
|
|
||||||
; calling MLI, so whatever
|
|
||||||
; state the MLI routine sets,
|
|
||||||
; the caller will see it
|
|
||||||
; verbatim
|
|
||||||
;-------------------------------
|
|
||||||
mli sta mlicmd ; store command code
|
|
||||||
sty mliparam ; number of parameters
|
|
||||||
jsr PRODOSMLI ; call ProDOS
|
|
||||||
mlicmd !byte 00 ; command number
|
|
||||||
!word mliparam ; address of parameter table
|
|
||||||
rts
|
|
||||||
mliparam !byte $FE,$FE,$FE,$FE
|
|
||||||
filetype !byte $FE ; file type (set by MLI get_file_info)
|
|
||||||
auxtype ; auxiliary file type (2 bytes, set by MLI get_file_info)
|
|
||||||
refnum !byte $FE ; file refnum (set by MLI open)
|
|
||||||
mlilen !byte $FE,$FE ; file length (set by MLI read)
|
|
||||||
blocks !byte $FE,$FE ; blocks used (set by getvolumeinfo/getfileinfo)
|
|
||||||
; member is also used by createfile
|
|
||||||
extra !byte $FE,$FE,$FE,$FE,$FE,$FE,$FE,$FE
|
|
||||||
; used by get_file_info
|
|
Loading…
Reference in New Issue
Block a user