-
Notifications
You must be signed in to change notification settings - Fork 85
/
Copy pathnewwrite
251 lines (251 loc) · 5.08 KB
/
newwrite
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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
.PAG 'WRITE 01/18/83'
; CASSETTE INFO - FSBLK IS BLOCK COUNTER FOR RECORD
; FSBLK = 2 -FIRST HEADER
; = 1 -FIRST DATA
; = 0 -SECOND DATA
;
; WRITE - TOGGLE WRITE BIT ACCORDING TO LSB IN OCHAR
;
WRITE LDA OCHAR ;SHIFT BIT TO WRITE INTO CARRY
LSR A
.IFE SYSTEM <
LDA #242 ;...C CLR WRITE SHORT
WRT1 LDX #0 ;SET AND STORE TIME
BCC WRTX
WRTW LDA #146 ;...C SET WRITE LONG
WRTW1 LDX #1
>
.IFN SYSTEM <
LDA #96 ;...C CLR WRITE SHORT
WRT1 LDX #0 ;SET AND STORE TIME
BCC WRTX
WRTW LDA #176 ;...C SET WRITE LONG
LDX #0
>
WRTX STA CIA+TBLO
STX CIA+TBHI
LDA #$19 ;TURN THE TIMER ON
STA CIA+CRB
LDA CIA+ICR ;CLEAR THE 6526
LDA TPI1+AIR ;CLEAR 6525 PRIORITY IRQ
STA TPI1+AIR
;
LDA TPI1+PB ;TOGGLE WRITE BIT
EOR #$20 ;BIT #5
STA TPI1+PB
AND #$20 ;LEAVE ONLY WRITE BIT
RTS
;
; WRTN - CALLED AT THE END OF EACH BYTE
; TO WRITE A LONG RER REZ
; HHHHHHLLLLLLHHHLLL...
;
WRTN LDA RER ;CHECK FOR ONE LONG
BNE WRTN1
.IFE SYSTEM <
LDA #82 ;WRITE A LONG BIT
LDX #2
>
.IFN SYSTEM <
LDA #16 ;WRITE A LONG BIT
LDX #1
>
JSR WRTX
BNE WRT3
INC RER
LDA PRP ;IF END OF BLOCK(BIT SET BY WRTL3)...
BPL WRT3 ;...NO END CONTINUE
JMP WRNC ;...END ...FINISH OFF
;
WRTN1 LDA REZ ;CHECK FOR A ONE BIT
BNE WRTN2
JSR WRTW
BNE WRT3
INC REZ
BNE WRT3
;
WRTN2 JSR WRITE
BNE WRT3 ;ON BIT LOW EXIT
LDA FIRT ;CHECK FOR FIRST OF DIPOLE
EOR #1
STA FIRT
BEQ WRT2 ;DIPOLE DONE
LDA OCHAR ;FLIPS BIT FOR COMPLEMENTARY RIGHT
EOR #1
STA OCHAR
AND #1 ;TOGGLE PARITY
EOR PRTY
STA PRTY
WRT3 JMP PREND ;RESTORE REGS AND RTI EXIT
;
WRT2 LSR OCHAR ;MOVE TO NEXT BIT
DEC PCNTR ;DEC COUNTER FOR # OF BITS
LDA PCNTR ;CHECK FOR 8 BITS SENT...
BEQ WRT4 ;...IF YES MOVE IN PARITY
BPL WRT3 ;...ELSE SEND REST
;
WRTS JSR NEWCH ;CLEAN UP COUNTERS
CLI ;ALLOW FOR INTERRUPTS TO NEST
LDA CNTDN ;ARE WE WRITING HEADER COUNTERS?...
BEQ WRT6 ;...NO
; WRITE HEADER COUNTERS (9876543210 TO HELP WITH READ)
LDX #0 ;CLEAR BCC
STX CDATA
WRTS1 DEC CNTDN
LDX FSBLK ;CHECK FOR FIRST BLOCK HEADER
CPX #2
BNE WRT61 ;...NO
ORA #$80 ;...YES MARK FIRST BLOCK HEADER
WRT61 STA OCHAR ;WRITE CHARACTERS IN HEADER
BNE WRT3
;
WRT6 JSR CMPSTE ;COMPARE START:END
BCC WRT7 ;NOT DONE
BNE WRTL3 ;GO MARK END
INC SAS ; OVERFLOW FOR BNE ENDING
LDA CDATA ;WRITE OUT BCC
STA OCHAR
BCS WRT3 ;JMP
;
WRTL3 SEC ;FLAG PRP FOR END OF BLOCK
ROR PRP ;REPLACE SAH WITH PRP
BMI WRT3 ; JMP
;
WRT7 LDY #0 ;GET NEXT CHARACTER
LDA (SAL)Y
STA OCHAR ;STORE IN OUTPUT CHARACTER
EOR CDATA ;UPDATE BCC
STA CDATA
JSR INCSAL ;INCREMENT FETCH ADDRESS
BNE WRT3 ;BRANCH ALWAYS
;
WRT4 LDA PRTY ;MOVE PARITY INTO OCHAR...
EOR #1
STA OCHAR ;...TO BE WRITTEN AS NEXT BIT
WRTBK JMP PREND ;RESTORE REGS AND RTI EXIT
;
WRNC DEC FSBLK ;CHECK FOR END
BNE WREND ;...BLOCK ONLY
JSR TNOF ;...WRITE, SO TURN OFF MOTOR
WREND LDA #80 ;PUT 80 CASSETTE SYNCS AT END
STA SHCNL
SEI
LDA #<WRTZ
STA CINV
LDA #>WRTZ
STA CINV+1
JMP WRTBK
;
.IFE SYSTEM <
WRTZ LDA #34 ;WRITE LEADING ZEROS FOR SYNC
CLC
JSR WRTW1
>
.IFN SYSTEM <
WRTZ LDA #120 ;WRITE LEADING ZEROS FOR SYNC
CLC
JSR WRT1
>
BNE WRTBK
DEC SHCNL ;CHECK IF DONE WITH LOW SYNC...
BNE WRTBK ;...NO
JSR NEWCH ;...YES CLEAR UP COUNTERS
DEC SHCNH ;CHECK IF DONE WITH SYNC...
BPL WRTBK ;...NO
LDA #<WRTN
STA CINV
LDA #>WRTN
STA CINV+1
CLI
INC SHCNH ;ZERO SHCNH
LDA FSBLK ;IF DONE THEN...
BEQ STKY ;...GOTO SYSTEM RESTORE
JSR RD300
LDX #9 ;SET UP FOR HEADER COUNT
STX CNTDN
STX PRP ;CLEAR END-OF-BLOCK MARK
JMP WRTS
;
TNIF PHP ;CLEAN UP INTERRUPTS AND RESTORE PIA'S
SEI
JSR TNOF ;TURN OFF MOTOR
LDA #%00010011 ;CLEAR POSSIBLE INTERRUPT
STA CIA+ICR
;
; RESTORE DEFAULTS
;
;
;RESTORE 60HZ INTERRUPTS
;
LDA #%11111
STA TPI1+MIR
;
LDA OLDINV+1 ;CHECK IF WE SHOULD
BEQ TNEND
LDA CASSVO
STA DFLTN
LDA ASERVO
STA DFLTO
STA CINV+1 ;...RESTORE INDIRECT
LDA OLDINV+2
STA I6509
LDA OLDINV
STA CINV
TNEND PLP
RTS
;
STKY JSR TNIF ;GO RESTORE SYSTEM INTERRUPTS
BEQ WRTBK ;CAME FOR CASSETTE IRQ SO RTI
;
;TURN CASSETTE MOTOR OFF
;
TNOF LDA TPI1+PB
ORA #$40 ;BIT #6 HI
STA TPI1+PB
RTS
.PAG 'TEMPORARIES'
;EQUATE SCREEN EDITOR TEMPORARILY
;
CINT =$E000+4
LP2 =$E003+4
LOOP5 =$E006+4
PRT =$E009+4
SCNKEY =$E00F+4
KEY =$E00F+4
FUNKEY =$E022
;
; NO ROUTINES IN 8032 SCREEN EDITOR
;
SCRORG =$E00C+4
PLOT =$E015+4
IOBASE =$E018+4
ESCRTS =$E01B+4
;
RD300 LDA STAH
STA SAH
LDA STAL
STA SAL
LDA STAS
STA SAS
STA I6509 ;POINT INDIRECT
RTS
;
CMPSTE SEC
LDA SAL
SBC EAL
LDA SAH
SBC EAH
LDA SAS
SBC EAS
RTS
;
INCSAL INC SAL
BNE INCR20
INC SAH
INCR10 BNE INCR20
INC SAS
INC I6509 ;CHANGE INDIRECT
LDA #$02 ;SKIP $0000 AND $0001
STA SAL
INCR20 RTS
.END