-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdiskload.s
147 lines (126 loc) · 3.98 KB
/
diskload.s
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
* = $900
DIRECT := false
; other vars
data = $1000 ; max is $3848 from LZ4_compressBound
zdata = $4900 ; unlz buffer
segtotal = 10
secbyseg = 560 / segtotal ; # of sector by segment
.include "apple_enc.inc"
.enc "apple"
.include "macros.inc"
status .macro
jsr clrstatus
prt \1
.endm
start
jsr init ; init screen
jsr home ; clear screen
prt title
lda #19 ; col 20
sta ch
lda #0 ; row 0
jsr bascalc
prt screen
setupiob
jsr locrpl ; locate rwts paramlist
sty rwtsptr ; and save rwtsptr
sta rwtsptr+1
getparam status paramm
jsr xm.XModemRecv ; receive param in $1000
ldx #0 ; copy end address of segments
ldy #segtotal-1
- lda data,x ; in segl/segh
sta segl,y
lda data+1,x
sta segh,y
inx
inx
dey
bpl -
initmain
;;; init main loop
st_rwts rwtsptr,#0,rplbuf ; buffer LSB is 0 ($4800)
st_rwts rwtsptr,#0,rplvol ; every volume number
lda #0
sta trknum ; track 0
sta secnum ; sector 0
lda #segtotal-1 ; segment number
sta segcnt
segloop ; main loop
ldx #'R'-$C0
jsr draw
status loadm
ldx segcnt ; get #segment
lda segh,x ; get load end MSB
sta inflate.end+1
jsr prbyte
lda segl,x ; get load end LSB
sta inflate.end
jsr prbyte
lda #0 ; prepare loading
sta inflate.src
sta inflate.dst
lda #>data ; store start loc MSB
sta inflate.src+1
lda #>zdata
sta inflate.dst+1
jsr xm.XModemRecv ; get segment
ldx #'I'-$C0
jsr draw
status inflatem
jsr inflate
status writem
lda #>zdata ; init with zdata buffer
sta buffer
lda #secbyseg
sta seccnt ; do 7 tracks/segment
trkloop
ldx #'W'-$C0
jsr draw
st_rwts rwtsptr,trknum,rpltrk ; track number
st_rwts rwtsptr,secnum,rplsec ; sector number
st_rwts rwtsptr,buffer,rplbuf+1 ; buffer MSB
st_rwts rwtsptr,#cmdwrite,rplcmd ; write cmd
jsr locrpl ; locate rwts paramlist
jsr rwts ; do it!
lda #0
sta preg
bcc nodiskerr
ldx #"E"
jmp +
nodiskerr ldx #"."
+ jsr draw ; write dot
inc buffer ; next page to write
inc secnum
lda secnum
cmp #secmax ; more than sector max ?
blt + ; yes, next track
inc trknum
lda #0 ; init sector number
sta secnum
+ dec seccnt ; decr sector number
bne trkloop ; if >= 0, next sector
dec segcnt
bmi done ; 0, all done with segments
jmp segloop
done
status donem
jsr crout
rts
sscerr status sscerrorm
rts
xm .binclude "xmodem_recv.s"
inflate .binclude "unlz4.s"
.include "disk.inc"
.enc "apple_inv"
title .null "DISKLOAD"
.enc "apple"
paramm .null "READ PARAM"
loadm .null "RECEIVE: $1000-$"
inflatem .null "INFLATE $4900-$80FF"
formatm .null "FORMAT"
writem .null "WRITE"
donem .null "DONE"
sscerrorm .null "SSC ERROR"
segl .fill segtotal,?
segh .fill segtotal,?