Penetrator-apple2/src/apple2/file.inc

235 lines
6.0 KiB
PHP

;-----------------------------------------------------------------------------
; file.inc
; Part of penetrator, the zx spectrum game, made for Apple II
;
; Stefan Wessels, 2019
; This is free and unencumbered software released into the public domain.
;-----------------------------------------------------------------------------
.segment "DATA"
createParam:
.byte $07 ; param_count
createName:
.addr PATHNAME ; pathname
.byte $C3 ; access
.byte $06 ; file_type (6 is binay)
.word $0000 ; aux_type
.byte $01 ; storage_type
.word $0000 ; create_date
.word $0000 ; create_time
openParam:
.byte $03 ; param_count
openName:
.addr PATHNAME ; pathname
.addr $2000-$400 ; io_buffer
openRef:
.byte $00 ; ref_num
readParam:
.byte $04 ; param_count
readRef:
.byte $00 ; ref_num
readAddress:
.addr worldDataStart ; data_buffer
readLength:
.word $FFFF ; request_count
.word $0000 ; trans_count
writeParam:
.byte $04 ; param_count
writeRef:
.byte $00 ; ref_num
writeAddress:
.addr worldDataStart ; data_buffer
writeLength:
.word worldDataEnd-worldDataStart ; request_count
.word $0000 ; trans_count
closeParam:
.byte $01 ; param_count
closeRef:
.byte $00 ; ref_num
;-----------------------------------------------------------------------------
.segment "CODE"
;-----------------------------------------------------------------------------
.proc saveWorld
lda #<worldDataStart ; set the location
sta writeAddress
lda #>worldDataStart
sta writeAddress + 1
lda #<(worldDataEnd-worldDataStart) ; set the size
sta writeLength
lda #>(worldDataEnd-worldDataStart)
sta writeLength + 1
jmp saveFile ; save
.endproc
;-----------------------------------------------------------------------------
.proc loadWorld
lda #<worldDataStart ; set the location
sta readAddress
lda #>worldDataStart
sta readAddress + 1
lda #<(worldDataEnd-worldDataStart) ; set the length (size)
sta readLength
lda #>(worldDataEnd-worldDataStart)
sta readLength + 1
jmp loadFile ; load
.endproc
;-----------------------------------------------------------------------------
.proc saveHighScores
jsr setHighScoreFileNames ; set the name
lda #<scoresTable ; set the location
sta writeAddress
lda #>scoresTable
sta writeAddress + 1
lda #<(scoresTableEnd-scoresTable) ; set the size
sta writeLength
lda #>(scoresTableEnd-scoresTable)
sta writeLength + 1
jmp saveFile ; save
.endproc
;-----------------------------------------------------------------------------
.proc loadHighScores
jsr setHighScoreFileNames ; set the name
lda #<scoresTable ; set the location
sta readAddress
lda #>scoresTable
sta readAddress + 1
lda #<(scoresTableEnd-scoresTable) ; set the size
sta readLength
lda #>(scoresTableEnd-scoresTable)
sta readLength + 1
jmp loadFile ; load
.endproc
;-----------------------------------------------------------------------------
.proc setHighScoreFileNames
ldx pathPos ; append to the end of the path
ldy #0 ; from the 1st char pf the name
:
lda hihgScoreFileName, y ; copy name to path
sta PATHNAME, x
beq :+
iny
inx
bne :-
:
stx PATHNAME
dec PATHNAME ; don't count the trailing null
rts
.endproc
;-----------------------------------------------------------------------------
.proc setWorldFileName
zaEntryL = zWorldPtr ; internal - ptr to a string being entered (abusing world ptr)
tya ; add the file length to the path length
clc
adc pathPos
tax
stx PATHNAME
dec PATHNAME ; don't count the trailing null
:
lda (zaEntryL), y ; copy the file name to the end of the path
sta PATHNAME, x
dex
dey
bpl :-
rts
.endproc
;-----------------------------------------------------------------------------
.proc saveFile
jsr MLI ; create the file, ignoring errors
.byte CREATE_CALL
.word createParam
jsr MLI ; open the (now hopefully existing) file
.byte OPEN_CALL
.word openParam
bcc :+
jmp error
:
lda openRef
sta writeRef
sta closeRef
jsr MLI
.byte WRITE_CALL
.word writeParam
bcs error
jsr MLI
.byte CLOSE_CALL
.word closeParam
bcs error
error:
rts
.endproc
;-----------------------------------------------------------------------------
.proc loadFile
jsr MLI
.byte OPEN_CALL
.word openParam
bcc :+
jmp error
:
lda openRef
sta readRef
sta closeRef
jsr MLI
.byte READ_CALL
.word readParam
bcs error
jsr MLI
.byte CLOSE_CALL
.word closeParam
bcs error
error:
rts
.endproc