-
Notifications
You must be signed in to change notification settings - Fork 4
/
loadsave.dasm16
126 lines (118 loc) · 2.41 KB
/
loadsave.dasm16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
.MACRO DO_A(aSub, anArg)
SET A, anArg
JSR aSub
.ENDMACRO
; stub for loading a demo from another part of RAM
:STMT_LOAD
IF_NEXT_STMT
JMP LOAD_NEXT_FILE
; FILENAME GET
SET I, 0
SET X, DIRECTORY
:LOADSEARCHLOOP
IFE A, CBM_QUOTE
JSR CHRGET
ife a, 0x2a ; ASTERISK
JMP LOAD_NEXT_FILE
:LOOPTHING
IFE A, [X]
JMP FOUND_FILE
ADD X, 3
IFL X, DIRECTORY_END
JMP LOOPTHING
SET X, 0x04 ; ?file not found
JMP ERROR
:FOUND_FILE
SET I, [X+1]
SET B, [X+2]
; load from I-B to BASICMEM
:START_LOAD
SET PUSH, I
SET PUSH, B
SET A, LOADINGMSG
JSR STROUT
SET B, POP
SET I, POP
SET J, BASICMEM+1
:LOADLOOP
STI [J], [I]
IFL I, B
JMP LOADLOOP
SET [VARTAB], J
JSR FIX_LINKS
JMP STMT_DATA
:LOAD_NEXT_FILE
SET A, FOUNDMSG
JSR STROUT
SET A, [FILEPOINTER]
SET A, [A+2]
ADD A, 1
JSR STROUT
SET X, [FILEPOINTER]
SET A, X
:ADVANCE_DIR_POINTER
ADD A, 3
IFE [A], 0x24 ; skip $
ADD A, 3
IFE A, DIRECTORY_END
SET A, DIRECTORY
SET [FILEPOINTER], A
JMP FOUND_FILE
:FOUNDMSG
DAT "FOUND ", 0
:LOADINGMSG
DAT 13, "LOADING", 0
:FILEPOINTER
DAT DIRECTORY
:STMT_SAVE
RTS
:STMT_VERIFY
; Not the real verify command but allows me to see
; various memory sizes at a glance
; display basic text size
DO_A(STROUT, TXT_H)
DO_A(LINPRT, [TXTTAB])
DO_A(CHROUT, 32)
SET A, [VARTAB]
SUB A, [TXTTAB]
JSR LINPRT
DO_A(CHROUT, CBM_RETURN)
; display scalar variable size
DO_A(STROUT, VAR_H)
DO_A(LINPRT, [VARTAB])
DO_A(CHROUT, 32)
SET A, [ARYTAB]
SUB A, [VARTAB]
JSR LINPRT
DO_A(CHROUT, CBM_RETURN)
; display array variable size
DO_A(STROUT, ARY_H)
DO_A(LINPRT, [ARYTAB])
DO_A(CHROUT, 32)
SET A, [STREND]
SUB A, [ARYTAB]
JSR LINPRT
DO_A(CHROUT, CBM_RETURN)
; display free space size
DO_A(STROUT, FREE_H)
DO_A(LINPRT, [STREND])
DO_A(CHROUT, 32)
SET A, [FREETOP]
SUB A, [STREND]
JSR LINPRT
DO_A(CHROUT, CBM_RETURN)
; display string size
DO_A(STROUT, STR_H)
DO_A(LINPRT, [FREETOP])
DO_A(CHROUT, 32)
SET A, [MEMSIZ]
SUB A, [FREETOP]
JSR LINPRT
DO_A(CHROUT, CBM_RETURN)
RTS
:TXT_H DAT "TXT: ", 0
:VAR_H DAT "VAR: ", 0
:ARY_H DAT "ARY: ", 0
:FREE_H DAT "FREE:", 0
:STR_H DAT "STR: ", 0
.include "demo.dasm16"