NOTICE
TO ALL PERSONS RECEIVING THIS DOCUMENT
AUGUST 1981
Reproduction is forbidden without the specific written permission of ATARI, INC. Sunnyvale, CA 94086. No right to reproduce this document, nor the subject matter thereof, is granted unless by written agreement with, or written permission from the Corporation.
MANUAL CONTENTS © 1981 ATARI, INC.
ERR LINE ADDR B1 B2 B3 B4 6500 ASSEMBLER VER 1. OMR
1 LIST X
2 THIS IS THE ORIGINAL JUNE 1979 ATARI 400/800 COMPUTER OPERATING
3 SYSTEM LISTING, MODIFIED TO ASSEMBLE ON THE MICROTEC CROSS
4 ASSEMBLER. IN THE MODULES INTERUPT HANDLER AND MONITOR THERE IS
5 CODE WHICH IS USED FOR DEBUGGING. IT ASSEMBLES TO ADDRESS $9000
6 TO $9020. THIS IS NOT IN THE OS ROM AND THEREFORE NOT IN ANY
7 SYSTEMS EXCEPT THOSE USED FOR DEBUGGING. IT IS INCLUDED FOR
8 HISTORICAL REASONS ONLY.
9 .PAGE
10 ;
11 ;
12 ; COLLEEN OPERATING SYSTEM EQUATE FILE
13 ;
14 ;
15 ;
16 ; MODULE ORIGIN TABLE
17 ;
18 E000 CHRORG = $E000 ;CHARACTER SET
19 E400 VECTBL = $E400 ;VECTOR TABLE
20 E480 VCTABL = $E480 ;RAM VECTOR INITIAL VALUE TABLE
21 E4A6 CIOORG = $E4A6 ;CENTRAL I/O HANDLER
22 E6D5 INTORG = $E6D5 ;INTERRUPT HANDLER
23 E944 SIOORG = $E944 ;SERIAL I/O DRIVER
24 EDEA DSKORG = $EDEA ;DISK HANDLER
25 EE78 PRNORG = $EE78 ;PRINTER HANDLER
26 EF41 CASORG = $EF41 ;CASSETTE HANDLER
27 F0E3 MONORG = $F0E3 ;MOINTOR/POWER UP MODULE
28 F3E4 KBDORG = $F3E4 ;KEYBOARD/DISPLAY HANDLER
29 ;
30 ;
31 ;
32 ;
33 ; VECTOR TABLE
34 ;
35 ;HANDLER ENTRY POINTS ARE CALLED OUT IN THE FOLLOWING VECTOR
36 ;TABLE. THESE ARE THE ADDRESSES MINUS ONE.
37 ;
38 ;
39 ;EXAMPLE FOR EDITOR
40 ;
41 ; E400 OPEN
42 ; 2 CLOSE
43 ; 4 GET
44 ; 6 PUT
45 ; 8 STATUS
46 ; A SPECIAL
47 ; C JUMP TO POWER ON INITIALIZATION ROUTINE
48 ; F NOT USED
49 ;
50 ;
51 E400 EDITRV = $E400 ;EDITOR
52 E410 SCRENV = $E410 ;TELEVISION SCREEN
53 E420 KEYBDV = $E420 ;KEYBOARD
54 E430 PRINTV = $E430 ;PRINTER
55 E440 CASETV = $E440 ;CASSETTE
56 ;
57 ; JUMP VECTOR TABLE
58 ;
59 ;THE FOLLOWING IS A TABLE OF JUMP INSTRUCTIONS
60 ;TO VARIOUS ENTRY POINTS IN THE OPERATING SYSTEM.
61 ;
62 E450 DISKIV = $E450 ;DISK INITIALIZATION
63 E453 DSKINV = $E453 ;DISK INTERFACE
64 E456 CIOV = $E456 ;CENTRAL INPUT OUTPUT ROUTINE
65 E459 SIOV = $E459 ;SERIAL INPUT OUTPUT ROUTINE
66 E45C SETVBV = $E45C ;SET SYSTEM TIMERS ROUTINE
67 E45F SYSVBV = $E45F ;SYSTEM VERTICAL BLANK CALCULATIONS
68 E462 XITVBV = $E462 ;EXIT VERTICAL BLANK CALCULATIONS
69 E465 SIOINV = $E465 ;SERIAL INPUT OUTPUT INITIALIZATION
70 E468 SENDEV = $E468 ;SEND ENABLE ROUTINE
71 E46B INTINV = $E46B ;INTERRUPT HANDLER INITIALIZATION
72 E46E CIOINV = $E46E ;CENTRAL INPUT OUTPUT INITIALIZATION
73 E471 BLKBDV = $E471 ;BLACKBOARD MODE
74 E474 WARMSV = $E474 ;WARM START ENTRY POINT
75 E477 COLDSV = $E477 ;COLD START ENTRY POINT
76 E47A RBLOKV = $E47A ;CASSETTE READ BLOCK ENTRY POINT VECTOR
77 E47D CSOPIV = $E47D ;CASSETTE OPEN FOR INPUT VECTOR
78 ;VCTABL = $E480
79 ;
80 ;
81 ; OPERATING SYSTEM EQUATES
82 ;
83 ; COMMAND CODES FOR IOCB
84 0003 OPEN = 3 ;OPEN FOR INPUT/OUTPUT
85 0005 GETREC = 5 ;GET RECORD (TEXT)
86 0007 GETCHR = 7 ;GET CHARACTER(S)
87 0009 PUTREC = 9 ;PUT RECORD (TEXT)
88 000B PUTCHR = $B ;PUT CHARACTER(S)
89 000C CLOSE = $C ;CLOSE DEVICE
90 000D STATIS = $D ;STATUS REQUEST
91 000E SPECIL = $E ;BEGINNING OF SPECIAL ENTRY COMMANDS
92 ;
93 ; SPECIAL ENTRY COMMANDS
94 ;
95 0011 DRAWLN = $11 ;DRAW LINE
96 0012 FILLIN = $12 ;DRAW LINE WITH RIGHT FILL
97 0020 RENAME = $20 ;RENAME DISK FILE
98 0021 DELETE = $21 ;DELETE DISK FILE
99 0022 FORMAT = $22 ;FORMAT
100 0023 LOCKFL = $23 ;LOCK FILE TO READ ONLY
101 0024 UNLOCK = $24 ;UNLOCK LOCKED FILE
102 0025 POINT = $25 ;POINT SECTOR
103 0026 NOTE = $26 ;NOTE SECTOR
104 00FF IOCFRE = $FF ;IOCB "FREE"
105 ;
106 ; AUX1 EQUATES
107 ; () INDICATES WHICH DEVICES USE BIT
108 ;
109 0001 APPEND = $1 ;OPEN FOR WRITE APPEND (D), OR SCREEN READ (E)
110 0002 DIRECT = $2 ;OPEN FOR DIRECTORY ACCESS (D)
111 0004 OPNIN = $4 ;OPEN FOR INPUT (ALL DEVICES)
112 0008 OPNOT = $8 ;OPEN FOR OUTPUT (ALL DEVICES)
113 000C OPNINO = OPNIN+OPNOT ;OPEN FOR INPUT AND OUTPUT (ALL DEVICES)
114 0010 MXDMOD = $10 ;OPEN FOR MIXED MODE (E,S)
115 0020 INSCLR = $20 ;OPEN WITHOUT CLEARING SCREEN (E,S)
116 ;
117 ; DEVICE NAMES
118 ;
119 0045 SCREDT = 'E ;SCREEN EDITOR (R/W)
120 004B KBD = 'K ;KEYBOARD (R ONLY)
121 0053 DISPLY = 'S ;SCREEN DISPLY (R/W)
122 0050 PRINTR = 'P ;PRINTER (W ONLY)
123 0043 CASSET = 'C ;CASSETTE
124 004D MODEM = 'M ;MODEM
125 0044 DISK = 'D ;DISK (R/W)
126 ;
127 ; SYSTEM EOL (CARRIAGE RETURN)
128 ;
129 009B CR = $9B
130 ;
131 ;
132 ; OPERATING SYSTEM STATUS CODES
133 ;
134 ;
135 0001 SUCCES = $01 ;SUCCESSFUL OPERATION
136 ;
137 0080 BRKABT = $80 ;BREAK KEY ABORT
138 0081 PRVOPN = $81 ;IOCB ALREADY OPEN
139 0082 NONDEV = $82 ;NON-EXISTANT DEVICE
140 0083 WRONLY = $83 ;IOCB OPENED FOR WRITE ONLY
141 0084 NVALID = $84 ;INVALID COMMAND
142 0085 NOTOPN = $85 ;DEVICE OR FILE NOT OPEN
143 0086 BADIOC = $86 ;INVALID IOCB NUMBER
144 0087 RDONLY = $87 ;IOCB OPENED FOR READ ONLY
145 0088 EOFERR = $88 ;END OF FILE
146 0089 TRNRCD = $89 ;TRUNCATED RECORD
147 008A TIMOUT = $8A ;PERIPHERAL DEVICE TIME OUT
148 008B DNACK = $8B ;DEVICE DOES NOT ACKNOWLEDGE COMMAND
149 008C FRMERR = $8C ;SERIAL BUS FRAMING ERROR
150 008D CRSROR = $8D ;CURSOR OVERRANGE
151 008E OVRRUN = $8E ;SERIAL BUS DATA OVERRUN
152 008F CHKERR = $8F ;SERIAL BUS CHECKSUM ERROR
153 ;
154 0090 DERROR = $90 ;PERIPHERAL DEVICE ERROR (OPERATION NOT COMPLETED)
155 0091 BADMOD = $91 ;BAD SCREEN MODE NUMBER
156 0092 FNCNOT = $92 ;FUNCTION NOT IMPLEMENTED IN HANDLER
157 0093 SCRMEM = $93 ;INSUFFICIENT MEMORY FOR SCREEN MODE
158 ;
159 ;
160 ;
161 ;
162 ;
163 ;
164 ; PAGE ZERO RAM ASSIGNMENTS
165 ;
166 *=$0000
167 0000 LINZBS: .RES 2 ;LINBUG RAM (WILL BE REPLACED BY MONITOR RAM)
168 ;
169 ; THESE LOCATIONS ARE NOT CLEARED
170 0002 CASINI: .RES 2 ;CASSETTE INIT LOCATION
171 0004 RAMLO: .RES 2 ;RAM POINTER FOR MEMORY TEST
172 0006 TRAMSZ: .RES 1 ;TEMPORARY REGISTER FOR RAM SIZE
173 0007 TSTDAT: .RES 1 ;RAM TEST DATA REGISTER
174 ;
175 ; CLEARED ON COLDSTART ONLY
176 0008 WARMST: .RES 1 ;WARM START FLAG
177 0009 BOOT?: .RES 1 ;SUCCESSFUL BOOT FLAG
178 000A DOSVEC: .RES 2 ;DISK SOFTWARE START VECTOR
179 000C DOSINI: .RES 2 ;DISK SOFTWARE INIT ADDRESS
180 000E APPMHI: .RES 2 ;APPLICATIONS MEMORY HI LIMIT
181 ;
182 ; CLEARED ON COLD OR WARM START
183 0010 INTZBS =* ;INTERRUPT HANDLER
184 0010 POKMSK: .RES 1 ;SYSTEM MASK FOR POKEY IRQ ENABLE
185 0011 BRKKEY: .RES 1 ;BREAK KEY FLAG
186 0012 RTCLOK: .RES 3 ;REAL TIME CLOCK (IN 16 MSEC UNITS)
187 ;
188 0015 BUFADR: .RES 2 ;INDIRECT BUFFER ADDRESS REGISTER
189 ;
190 0017 ICCOMT: .RES 1 ;COMMAND FOR VECTOR
191 ;
192 0018 DSKFMS: .RES 2 ;DISK FILE MANAGER POINTER
193 001A DSKUTL: .RES 2 ;DISK UTILITIES POINTER
194 ;
195 001C PTIMOT: .RES 1 ;PRINTER TIME OUT REGISTER
196 001D PBPNT: .RES 1 ;PRINT BUFFER POINTER
197 001E PBUFSZ: .RES 1 ;PRINT BUFFER SIZE
198 001F PTEMP: .RES 1 ;TEMPORARY REGISTER
199 ;
200 0020 ZIOCB =* ;ZERO PAGE I/O CONTROL BLOCK
201 0010 IOCBSZ = 16 ;NUMBER OF BYTES PER IOCB
202 0080 MAXIOC = 8*IOCBSZ ;LENGTH OF THE IOCB AREA
203 0020 IOCBAS =*
204 0020 ICHIDZ: .RES 1 ;HANDLER INDEX NUMBER (FF = IOCB FREE)
205 0021 ICDNOZ: .RES 1 ;DEVICE NUMBER (DRIVE NUMBER)
206 0022 ICCOMZ: .RES 1 ;COMMAND CODE
207 0023 ICSTAZ: .RES 1 ;STATUS OF LAST IOCB ACTION
208 0024 ICBALZ: .RES 1 ;BUFFER ADDRESS LOW BYTE
209 0025 ICBAHZ: .RES 1
210 0026 ICPTLZ: .RES 1 ;PUT BYTE ROUTINE ADDRESS - 1
211 0027 ICPTHZ: .RES 1
212 0028 ICBLLZ: .RES 1 ;BUFFER LENGTH LOW BYTE
213 0029 ICBLHZ: .RES 1
214 002A ICAX1Z: .RES 1 ;AUXILLARY INFORMATION FIRST BYTE
215 002B ICAX2Z: .RES 1
216 002C ICSPRZ: .RES 4 ;TWO SPARE BYTES (CIO LOCAL USE)
217 002E ICIDNO = ICSPRZ+2 ;IOCB NUMBER X 16
218 002F CIOCHR = ICSPRZ+3 ;CHARACTER BYTE FOR CURRENT OPERATION
219 ;
220 0030 STATUS: .RES 1 ;INTERNAL STATUS STORAGE
221 0031 CHKSUM: .RES 1 ;CHECKSUM (SINGLE BYTE SUM WITH CARRY)
222 0032 BUFRLO: .RES 1 ;POINTER TO DATA BUFFER (LO BYTE)
223 0033 BUFRHI: .RES 1 ;POINTER TO DATA BUFFER (HI BYTE)
224 0034 BFENLO: .RES 1 ;NEXT BYTE PAST END OF THE DATA BUFFER (LO BYTE)
225 0035 BFENHI: .RES 1 ;NEXT BYTE PAST END OF THE DATA BUFFER (HI BYTE)
226 0036 CRETRY: .RES 1 ;NUMBER OF COMMAND FRAME RETRIES
227 0037 DRETRY: .RES 1 ;NUMBER OF DEVICE RETRIES
228 0038 BUFRFL: .RES 1 ;DATA BUFFER FULL FLAG
229 0039 RECVDN: .RES 1 ;RECEIVE DONE FLAG
230 003A XMTDON: .RES 1 ;TRANSMISSION DONE FLAG
231 003B CHKSNT: .RES 1 ;CHECKSUM SENT FLAG
232 003C NOCKSM: .RES 1 ;NO CHECKSUM FOLLOWS DATA FLAG
233 ;
234 ;
235 003D BPTR: .RES 1
236 003E FTYPE: .RES 1
237 003F FEOF: .RES 1
238 0040 FREQ: .RES 1
239 0041 SOUNDR: .RES 1 ;NOISY I/O FLAG. (ZERO IS QUIET)
240 0042 CRITIC: .RES 1 ;DEFINES CRITICAL SECTION (CRITICAL IF NON-ZERO)
241 ;
242 0043 FMSZPG: .RES 7 ;DISK FILE MANAGER SYSTEM ZERO PAGE
243 ;
244 ;
245 004A CKEY: .RES 1 ;FLAG SET WHEN GAME START PRESSED
246 004B CASSBT: .RES 1 ;CASSETTE BOOT FLAG
247 004C DSTAT: .RES 1 ;DISPLAY STATUS
248 ;
249 004D ATRACT: .RES 1 ;ATTRACT FLAG
250 004E DRKMSK: .RES 1 ;DARK ATTRACT MASK
251 004F COLRSH: .RES 1 ;ATTRACT COLOR SHIFTER (EOR'ED WITH PLAYFIELD COLORS)
252 ;
253 0002 LEDGE = 2 ;LMARGN'S VALUE AT COLD START
254 0027 REDGE = 39 ;RMARGN'S VALUE AT COLD START
255 0050 TMPCHR: .RES 1
256 0051 HOLD1: .RES 1
257 0052 LMARGN: .RES 1 ;LEFT MARGIN (SET TO 1 AT POWER ON)
258 0053 RMARGN: .RES 1 ;RIGHT MARGIN (SET TO 38 AT POWER ON)
259 0054 ROWCRS: .RES 1 ;CURSOR COUNTERS
260 0055 COLCRS: .RES 2
261 0057 DINDEX: .RES 1
262 0058 SAVMSC: .RES 2
263 005A OLDROW: .RES 1
264 005B OLDCOL: .RES 2
265 005D OLDCHR: .RES 1 ;DATA UNDER CURSOR
266 005E OLDADR: .RES 2
267 0060 NEWROW: .RES 1 ;POINT DRAW GOES TO
268 0061 NEWCOL: .RES 2
269 0063 LOGCOL: .RES 1 ;POINTS AT COLUMN IN LOGICAL LINE
270 0064 ADRESS: .RES 2
271 0066 MLTTMP: .RES 2
272 0066 OPNTMP = MLTTMP ;FIRST BYTE IS USED IN OPEN AS TEMP
273 0068 SAVADR: .RES 2
274 006A RAMTOP: .RES 1 ;RAM SIZE DEFINED BY POWER ON LOGIC
275 006B BUFCNT: .RES 1 ;BUFFER COUNT
276 006C BUFSTR: .RES 2 ;EDITOR GETCH POINTER
277 006E BITMSK: .RES 1 ;BIT MASK
278 006F SHFAMT: .RES 1
279 0070 ROWAC: .RES 2
280 0072 COLAC: .RES 2
281 0074 ENDPT: .RES 2
282 0076 DELTAR: .RES 1
283 0077 DELTAC: .RES 2
284 0079 ROWINC: .RES 1
285 007A COLINC: .RES 1
286 007B SWPFLG: .RES 1 ;NON-0 IF TXT AND REGULAR RAM IS SWAPPED
287 007C HOLDCH: .RES 1 ;CH IS MOVED HERE IN KGETCH BEFORE CNTL & SHIFT PROC
288 007D INSDAT: .RES 1
289 007E COUNTR: .RES 2
290 ;
291 ;
292 ;
293 ;
294 ; 80 - FF ARE RESERVED FOR USER APPLICATIONS
295 ;
296 ;
297 ;
298 ; NOTE : SEE FLOATING POINT SUBROUTINE AREA FOR ZERO PAGE CELLS
299 ;
300 ;
301 ;
302 ;
303 ; PAGE 1 - STACK
304 ;
305 ;
306 ;
307 ;
308 ; PAGE TWO RAM ASSIGNMENTS
309 ;
310 *=$0200
311 0200 INTABS =* ;INTERRUPT RAM
312 0200 VDSLST: .RES 2 ;DISPLAY LIST NMI VECTOR
313 0202 VPRCED: .RES 2 ;PROCEED LINE IRQ VECTOR
314 0204 VINTER: .RES 2 ;INTERRUPT LINE IRQ VECTOR
315 0206 VBREAK: .RES 2 ;SOFTWARE BREAK (00) INSTRUCTION IRQ VECTOR
316 0208 VKEYBD: .RES 2 ;POKEY KEYBOARD IRQ VECTOR
317 020A VSERIN: .RES 2 ;POKEY SERIAL INPUT READY IRQ
318 020C VSEROR: .RES 2 ;POKEY SERIAL OUTPUT READY IRQ
319 020E VSEROC: .RES 2 ;POKEY SERIAL OUTPUT COMPLETE IRQ
320 0210 VTIMR1: .RES 2 ;POKEY TIMER 1 IRQ
321 0212 VTIMR2: .RES 2 ;POKEY TIMER 2 IRQ
322 0214 VTIMR4: .RES 2 ;POKEY TIMER 4 IRQ
323 0216 VIMIRQ: .RES 2 ;IMMEDIATE IRQ VECTOR
324 0218 CDTMV1: .RES 2 ;COUNT DOWN TIMER 1
325 021A CDTMV2: .RES 2 ;COUNT DOWN TIMER2
326 021C CDTMV3: .RES 2 ;COUNT DOWN TIMER 3
327 021E CDTMV4: .RES 2 ;COUNT DOWN TIMER 4
328 0220 CDTMV5: .RES 2 ;COUNT DOWN TIMER 5
329 0222 VVBLKI: .RES 2 ;IMMEDIATE VERTICAL BLANK NMI VECTOR
330 0224 VVBLKD: .RES 2 ;DEFERRED VERTICAL BLANK NMI VECTOR
331 0226 CDTMA1: .RES 2 ;COUNT DOWN TIMER 1 JSR ADDRESS
332 0228 CDTMA2: .RES 2 ;COUNT DOWN TIMER 2 JSR ADDRESS
333 022A CDTMF3: .RES 1 ;COUNT DOWN TIMER 3 FLAG
334 022B SRTIMR: .RES 1 ;SOFTWARE REPEAT TIMER
335 022C CDTMF4: .RES 1 ;COUNT DOWN TIMER 4 FLAG
336 022D INTEMP: .RES 1 ;IAN'S TEMP (RENAMED FROM T1 BY POPULAR DEMAND)
337 022E CDTMF5: .RES 1 ;COUNT DOWN TIMER FLAG 5
338 022F SDMCTL: .RES 1 ;SAVE DMACTL REGISTER
339 0230 SDLSTL: .RES 1 ;SAVE DISPLAY LIST LOW BYTE
340 0231 SDLSTH: .RES 1 ;SAVE DISPLAY LIST HI BYTE
341 0232 SSKCTL: .RES 1 ;SKCTL REGISTER RAM
342 0233 .RES 1
343 ;
344 0234 LPENH: .RES 1 ;LIGHT PEN HORIZONTAL VALUE
345 0235 LPENV: .RES 1 ;LIGHT PEN VERTICAL VALUE
346 0236 .RES 2 ;SPARE BYTES
347 ;
348 0238 .RES 2 ;SPARE
349 ;
350 023A CDEVIC: .RES 1 ;COMMAND FRAME BUFFER - DEVICE
351 023B CCOMND: .RES 1 ;COMMAND
352 023C CAUX1: .RES 1 ;COMMAND AUX BYTE 1
353 023D CAUX2: .RES 1 ;COMMAND AUX BYTE 2
354 ;
355 ; NOTE: MAY NOT BE THE LAST WORD ON A PAGE
356 ;
357 023E TEMP: .RES 1 ;TEMPORARY RAM CELL
358 ;
359 ; NOTE: MAY NOT BE THE LAST WORD ON A PAGE
360 ;
361 023F ERRFLG: .RES 1 ;ERROR FLAG - ANY DEVICE ERROR EXCEPT TIME OUT
362 ;
363 0240 DFLAGS: .RES 1 ;DISK FLAGS FROM SECTOR ONE
364 0241 DBSECT: .RES 1 ;NUMBER OF DISK BOOT SECTORS
365 0242 BOOTAD: .RES 2 ;ADDRESS WHERE DISK BOOT LOADER WILL BE PUT
366 0244 COLDST: .RES 1 ;COLDSTART FLAG (1=IN MIDDLE OF COLDSTART)
367 ;
368 0245 .RES 1 ;SPARE
369 ;
370 0246 DSKTIM: .RES 1 ;DISK TIME OUT REGISTER
371 ;
372 0247 LINBUF: .RES 40 ;CHAR LINE BUFFER
373 ;
374 026F GPRIOR: .RES 1 ;GLOBAL PRIORITY CELL
375 ;
376 0270 PADDL0: .RES 1 ;POTENTIOMETER 0 RAM CELL
377 0271 PADDL1: .RES 1
378 0272 PADDL2: .RES 1
379 0273 PADDL3: .RES 1
380 0274 PADDL4: .RES 1
381 0275 PADDL5: .RES 1
382 0276 PADDL6: .RES 1
383 0277 PADDL7: .RES 1
384 0278 STICK0: .RES 1 ;JOYSTICK 0 RAM CELL
385 0279 STICK1: .RES 1
386 027A STICK2: .RES 1
387 027B STICK3: .RES 1
388 027C PTRIG0: .RES 1 ;PADDLE TRIGGER 0
389 027D PTRIG1: .RES 1
390 027E PTRIG2: .RES 1
391 027F PTRIG3: .RES 1
392 0280 PTRIG4: .RES 1
393 0281 PTRIG5: .RES 1
394 0282 PTRIG6: .RES 1
395 0283 PTRIG7: .RES 1
396 0284 STRIG0: .RES 1 ;JOYSTICK TRIGGER 0
397 0285 STRIG1: .RES 1
398 0286 STRIG2: .RES 1
399 0287 STRIG3: .RES 1
400 ;
401 0288 CSTAT: .RES 1
402 0289 WMODE: .RES 1
403 028A BLIM: .RES 1
404 ;
405 028B .RES 5 ;SPARE
406 ;
407 ;
408 ;
409 ;
410 0290 TXTROW: .RES 1 ;TEXT ROWCRS
411 0291 TXTCOL: .RES 2 ;TEXT COLCRS
412 0293 TINDEX: .RES 1 ;TEXT INDEX
413 0294 TXTMSC: .RES 2 ;FOOLS CONVRT INTO NEW MSC
414 0296 TXTOLD: .RES 6 ;OLDROW & OLDCOL FOR TEXT (AND THEN SOME)
415 029C TMPX1: .RES 1
416 029D HOLD3: .RES 1
417 029E SUBTMP: .RES 1
418 029F HOLD2: .RES 1
419 02A0 DMASK: .RES 1
420 02A1 TMPLBT: .RES 1
421 02A2 ESCFLG: .RES 1 ;ESCAPE FLAG
422 02A3 TABMAP: .RES 15
423 02B2 LOGMAP: .RES 4 ;LOGICAL LINE START BIT MAP
424 02B6 INVFLG: .RES 1 ;INVERSE VIDEO FLAG (TOGGLED BY ATARI KEY)
425 02B7 FILFLG: .RES 1 ;RIGHT FILL FLAG FOR DRAW
426 02B8 TMPROW: .RES 1
427 02B9 TMPCOL: .RES 2
428 02BB SCRFLG: .RES 1 ;SET IF SCROLL OCCURS
429 02BC HOLD4: .RES 1 ;TEMP CELL USED IN DRAW ONLY
430 02BD HOLD5: .RES 1 ;DITTO
431 02BE SHFLOK: .RES 1
432 02BF BOTSCR: .RES 1 ;BOTTOM OF SCREEN : 24 NORM 4 SPLIT
433 ;
434 ;
435 02C0 PCOLR0: .RES 1 ;P0 COLOR
436 02C1 PCOLR1: .RES 1 ;P1 COLOR
437 02C2 PCOLR2: .RES 1 ;P2 COLOR
438 02C3 PCOLR3: .RES 1 ;P3 COLOR
439 02C4 COLOR0: .RES 1 ;COLOR 0
440 02C5 COLOR1: .RES 1
441 02C6 COLOR2: .RES 1
442 02C7 COLOR3: .RES 1
443 02C8 COLOR4: .RES 1
444 ;
445 ;
446 02C9 .RES 23 ;SPARE
447 ;
448 ;
449 ;
450 02E0 GLBABS =* ;GLOBAL VARIABLES
451 ;
452 02E0 .RES 4 ;SPARE
453 ;
454 02E4 RAMSIZ: .RES 1 ;RAM SIZE (HI BYTE ONLY)
455 02E5 MEMTOP: .RES 2 ;TOP OF AVAILABLE USER MEMORY
456 02E7 MEMLO: .RES 2 ;BOTTOM OF AVAILABLE USER MEMORY
457 02E9 .RES 1 ;SPARE
458 02EA DVSTAT: .RES 4 ;STATUS BUFFER
459 02EE CBAUDL: .RES 1 ;CASSETTE BAUD RATE LOW BYTE
460 02EF CBAUDH: .RES 1
461 ;
462 02F0 CRSINH: .RES 1 ;CURSOR INHIBIT (00 = CURSOR ON)
463 02F1 KEYDEL: .RES 1 ;KEY DELAY
464 02F2 CH1: .RES 1
465 ;
466 02F3 CHACT: .RES 1 ;CHACTL REGISTER RAM
467 02F4 CHBAS: .RES 1 ;CHBAS REGISTER RAM
468 ;
469 02F5 .RES 5 ;SPARE BYTES
470 ;
471 02FA CHAR: .RES 1
472 02FB ATACHR: .RES 1 ;ATASCII CHARACTER
473 02FC CH: .RES 1 ;GLOBAL VARIABLE FOR KEYBOARD
474 02FD FILDAT: .RES 1 ;RIGHT FILL DATA (DRAW)
475 02FE DSPFLG: .RES 1 ;DISPLAY FLAG : DISPLAY CNTLS IF NON-ZERO
476 02FF SSFLAG: .RES 1 ;START/STOP FLAG FOR PAGING (CNTL 1). CLEARED BY BREAK
477 ;
478 ;
479 ;
480 ;
481 ;
482 ;
483 ;
484 ; PAGE THREE RAM ASSIGNMENTS
485 ;
486 0300 DCB =* ;DEVICE CONTROL BLOCK
487 0300 DDEVIC: .RES 1 ;PERIPHERAL UNIT 1 BUS I.D. NUMBER
488 0301 DUNIT: .RES 1 ;UNIT NUMBER
489 0302 DCOMND: .RES 1 ;BUS COMMAND
490 0303 DSTATS: .RES 1 ;COMMAND TYPE/STATUS RETURN
491 0304 DBUFLO: .RES 1 ;DATA BUFFER POINTER LOW BYTE
492 0305 DBUFHI: .RES 1
493 0306 DTIMLO: .RES 1 ;DEVICE TIME OUT IN 1 SECOND UNITS
494 0307 DUNUSE: .RES 1 ;UNUSED BYTE
495 0308 DBYTLO: .RES 1 ;NUMBER OF BYTES TO BE TRANSFERRED LOW BYTE
496 0309 DBYTHI: .RES 1
497 030A DAUX1: .RES 1 ;COMMAND AUXILLARY BYTE 1
498 030B DAUX2: .RES 1
499 ;
500 030C TIMER1: .RES 2 ;INITIAL TIMER VALUE
501 030E ADDCOR: .RES 1 ;ADDITION CORRECTION
502 030F CASFLG: .RES 1 ;CASSETTE MODE WHEN SET
503 0310 TIMER2: .RES 2 ;FINAL TIMER VALUE. THESE TWO TIMER VALUES
504 ; ARE USED TO COMPUTE INTERVAL FOR BAUD RATE
505 0312 TEMP1: .RES 2 ;TEMPORARY STORAGE REGISTER
506 0314 TEMP2: .RES 1 ;TEMPORARY STORAGE REGISTER
507 0315 TEMP3: .RES 1 ;TEMPORARY STORAGE REGISTER
508 0316 SAVIO: .RES 1 ;SAVE SERIAL IN DATA PORT
509 0317 TIMFLG: .RES 1 ;TIME OUT FLAG FOR BAUD RATE CORRECTION
510 0318 STACKP: .RES 1 ;SIO STACK POINTER SAVE CELL
511 0319 TSTAT: .RES 1 ;TEMPORARY STATUS HOLDER
512 ;
513 ;
514 ;
515 031A HATABS: .RES 38 ;HANDLER ADDRESS TABLE
516 0021 MAXDEV = *-HATABS-5 ;MAXIMUM HANDLER ADDRESS INDEX
517 ;
518 ; NOTE : THE ENTIRE IOCB DEFINITIONS HAVE BEEN MODIFIED
519 ;
520 IOCB: *= * ;I/O CONTROL BLOCKS
521 0340 ICHID: .RES 1 ;HANDLER INDEX NUMBER (FF = IOCB FREE)
522 0341 ICDNO: .RES 1 ;DEVICE NUMBER (DRIVE NUMBER)
523 0342 ICCOM: .RES 1 ;COMMAND CODE
524 0343 ICSTA: .RES 1 ;STATUS OF LAST IOCB ACTION
525 0344 ICBAL: .RES 1 ;BUFFER ADDRESS LOW BYTE
526 0345 ICBAH: .RES 1
527 0346 ICPTL: .RES 1 ;PUT BYTE ROUTINE ADDRESS - 1
528 0347 ICPTH: .RES 1
529 0348 ICBLL: .RES 1 ;BUFFER LENGTH LOW BYTE
530 0349 ICBLH: .RES 1
531 034A ICAX1: .RES 1 ;AUXILLARY INFORMATION FIRST BYTE
532 034B ICAX2: .RES 1
533 034C ICSPR: .RES 4 ;FOUR SPARE BYTES
534 0350 .RES MAXIOC-IOCBSZ
535 ;
536 03C0 PRNBUF: .RES 40 ;PRINTER BUFFER
537 ;
538 03E8 .RES 21 ;SPARE BYTES
539 ;
540 ;
541 ;
542 ;
543 ;
544 ;
545 ;
546 ; PAGE FOUR RAM ASSIGNMENTS
547 ;
548 03FD CASBUF: .RES 131 ;CASSETTE BUFFER
549 ;
550 ; USER AREA STARTS HERE AND GOES TO END OF PAGE FIVE
551 0480 USAREA: .RES 128 ;SPARE
552 ;
553 ;
554 ;
555 ;
556 ;
557 ;
558 ;
559 ; PAGE FIVE RAM ASSIGNMENTS
560 ;
561 ; PAGE FIVE IS RESERVED AS A USER WORK SPACE
562 ;
563 ; NOTE: SEE FLOATING POINT SUBROUTINE AREA FOR PAGE FIVE CELLS
564 ;
565 ;
566 ; PAGE SIX RAM ASSIGNMENTS
567 ;
568 ; PAGE SIX IS RESERVED AS A USER'S USER WORK SPACE
569 ;
570 ;
571 ;
572 ;
573 ; FLOATING POINT SUBROUTINES
574 ;
575 0006 FPREC = 6 ;FLOATING PT PRECISION (# OF BYTES)
576 ;
577 ; IF CARRY USED THEN CARRY CLEAR => NO ERROR, CARRY SET => ERROR
578 ;
579 D800 AFP = $D800 ;ASCII->FLOATING POINT (FP)
580 ;
581 ; INBUFF+CIX -> FR0, CIX, CARRY
582 ;
583 D8E6 FASC = $D8E6 ;FP -> ASCII FR0-> LBUFF (INBUFF)
584 D9AA IFP = $D9AA ;INTEGER -> FP
585 ;
586 ; 0-$FFFF (LSB,MSB) IN FR0,FR0+1->FR0
587 ;
588 D9D2 FPI = $D9D2 ;FP -> INTEGER FR0 -> FR0,FR0+1, CARRY
589 DA60 FSUB = $DA60 ;FR0 <- FR0 - FR1 ,CARRY
590 DA66 FADD = $DA66 ;FR0 <- FR0 + FR1 ,CARRY
591 DADB FMUL = $DADB ;FR0 <- FR0 * FR1 ,CARRY
592 DB28 FDIV = $DB28 ;FR0 <- FR0 / FR1 ,CARRY
593 DD89 FLD0R = $DD89 ;FLOATING LOAD REG0 FR0 <- (X,Y)
594 DD8D FLD0P = $DD8D ; " " " FR0 <- (FLPTR)
595 DD98 FLD1R = $DD98 ; " " REG1 FR1 <- (X,Y)
596 DD9C FLD1P = $DD9C ; " " " FR1 <- (FLPTR)
597 DDA7 FST0R = $DDA7 ;FLOATING STORE REG0 (X,Y) <- FR0
598 DDAB FST0P = $DDAB ; " " " (FLPTR)<- FR0
599 DDB6 FMOVE = $DDB6 ;FR1 <- FR0
600 DD40 PLYEVL = $DD40 ;FR0 <- P(Z) = SUM(I=N TO 0) (A(I)*Z**I) CARRY
601 ; INPUT: (X,Y) = A(N),A(N-1)...A(0) -> PLYARG
602 ; ACC = # OF COEFFICIENTS = DEGREE+1
603 ; FR0 = Z
604 DDC0 EXP = $DDC0 ;FR0 <- E**FR0 = EXP10(FR0 * LOG10(E)) CARRY
605 DDCC EXP10 = $DDCC ;FR0 <- 10**FR0 CARRY
606 DECD LOG = $DECD ;FR0 <- LN(FR0) = LOG10(FR0)/LOG10(E) CARRY
607 DED1 LOG10 = $DED1 ;FR0 <- LOG10 (FR0) CARRY
608 ;
609 ; THE FOLLOWING ARE IN BASIC CARTRIDGE:
610 ;
611 BD81 SIN = $BD81 ;FR0 <- SIN(FR0) DEGFLG=0 =>RADS, 6=>DEG. CARRY
612 BD73 COS = $BD73 ;FR0 <- COS(FR0) CARRY
613 BE43 ATAN = $BE43 ;FR0 <- ATAN(FR0) CARRY
614 BEB1 SQR = $BEB1 ;FR0 <- SQUAREROOT(FR0) CARRY
615 ;
616 ;FLOATING POINT ROUTINES ZERO PAGE (NEEDED ONLY IF F.P. ROUTINES ARE CALLED)
617 ;
618 *=$D4
619 00D4 FR0: .RES FPREC ;FP REG0
620 00DA FRE: .RES FPREC
621 00E0 FR1: .RES FPREC ;FP REG1
622 00E6 FR2: .RES FPREC
623 00EC FRX: .RES 1 ;FP SPARE
624 00ED EEXP: .RES 1 ;VALUE OF E
625 00EE NSIGN: .RES 1 ;SIGN OF #
626 00EF ESIGN: .RES 1 ;SIGN OF EXPONENT
627 00F0 FCHRFLG:.RES 1 ;1ST CHAR FLAG
628 00F1 DIGRT: .RES 1 ;# OF DIGITS RIGHT OF DECIMAL
629 00F2 CIX: .RES 1 ;CURRENT INPUT INDEX
630 00F3 INBUFF: .RES 2 ;POINTS TO USER'S LINE INPUT BUFFER
631 00F5 ZTEMP1: .RES 2
632 00F7 ZTEMP4: .RES 2
633 00F9 ZTEMP3: .RES 2
634 DEGFLG
635 00FB RADFLG: .RES 1 ;0=RADIANS, 6=DEGREES
636 0000 RADON = 0 ;INDICATES RADIANS
637 0006 DEGON = 6 ;INDICATES DEGREES
638 00FC FLPTR: .RES 2 ;POINTS TO USER'S FLOATING PT NUMBER
639 00FE FPTR2: .RES 2
640 ;
641 ;FLOATING PT ROUTINES' NON-ZERO PAGE RAM (NEEDED ONLY IF F.P. ROUTINES CALLED)
642 ;
643 *=$57E
644 057E LBPR1: .RES 1 ;LBUFF PREFIX 1
645 057F LBPR2: .RES 1 ;LBUFF PREFIX 2
646 0580 LBUFF: .RES 128 ;LINE BUFFER
647 05E0 PLYARG = LBUFF+$60 ;POLYNOMIAL ARGUMENTS
648 05E6 FPSCR = PLYARG+FPREC
649 05EC FPSCR1 = FPSCR+FPREC
650 05E6 FSCR = FPSCR
651 05EC FSCR1 = FPSCR1
652 05FF LBFEND = *-1 ;END OF LBUFF
653 ;
654 ;
655 ;
656 ;
657 ;
658 ;
659 ;
660 ;
661 ;
662 ; COLLEEN MNEMONICS
663 ;
664 D200 POKEY = $D200 ;VBLANK ACTION: DESCRIPTION:
665 D200 POT0 = POKEY+0 ;POT0-->PADDL0 0-227 IN RAM CELL
666 D201 POT1 = POKEY+1 ;POT1-->PADDL1 0-227 IN RAM CELL
667 D202 POT2 = POKEY+2 ;POT2-->PADDL2 0-227 IN RAM CELL
668 D203 POT3 = POKEY+3 ;POT3-->PADDL3 0-227 IN RAM CELL
669 D204 POT4 = POKEY+4 ;POT4-->PADDL4 0-227 IN RAM CELL
670 D205 POT5 = POKEY+5 ;POT5-->PADDL5 0-227 IN RAM CELL
671 D206 POT6 = POKEY+6 ;POT6-->PADDL6 0-227 IN RAM CELL
672 D207 POT7 = POKEY+7 ;POT7-->PADDL7 0-227 IN RAM CELL
673 D208 ALLPOT = POKEY+8 ;???
674 D209 KBCODE = POKEY+9
675 D20A RANDOM = POKEY+10
676 D20B POTGO = POKEY+11 ;STROBED
677 D20D SERIN = POKEY+13
678 D20E IRQST = POKEY+14
679 D20F SKSTAT = POKEY+15
680 D200 AUDF1 = POKEY+0
681 D201 AUDC1 = POKEY+1
682 D202 AUDF2 = POKEY+2
683 D203 AUDC2 = POKEY+3
684 D204 AUDF3 = POKEY+4
685 D205 AUDC3 = POKEY+5
686 D206 AUDF4 = POKEY+6
687 D207 AUDC4 = POKEY+7
688 D208 AUDCTL = POKEY+8 ;NONE AUDCTL<--[SIO]
689 D209 STIMER = POKEY+9
690 D20A SKRES = POKEY+10 ;NONE SKRES<--[SIO]
691 D20D SEROUT = POKEY+13 ;NONE SEROUT<--[SIO]
692 D20E IRQEN = POKEY+14 ;POKMSK-->IRQEN (AFFECTED BY OPEN S: OR E:)
693 D20F SKCTL = POKEY+15 ;SSKCTL-->SKCTL SSKCTL<--[SIO]
694 ;
695 D000 CTIA = $D000 ;VBLANK ACTION: DESCRIPTION:
696 D000 HPOSP0 = CTIA+0
697 D001 HPOSP1 = CTIA+1
698 D002 HPOSP2 = CTIA+2
699 D003 HPOSP3 = CTIA+3
700 D004 HPOSM0 = CTIA+4
701 D005 HPOSM1 = CTIA+5
702 D006 HPOSM2 = CTIA+6
703 D007 HPOSM3 = CTIA+7
704 D008 SIZEP0 = CTIA+8
705 D009 SIZEP1 = CTIA+9
706 D00A SIZEP2 = CTIA+10
707 D00B SIZEP3 = CTIA+11
708 D00C SIZEM = CTIA+12
709 D00D GRAFP0 = CTIA+13
710 D00E GRAFP1 = CTIA+14
711 D00F GRAFP2 = CTIA+15
712 D010 GRAFP3 = CTIA+16
713 D011 GRAFM = CTIA+17
714 D012 COLPM0 = CTIA+18 ;PCOLR0-->COLPM0 WITH ATTRACT MODE
715 D013 COLPM1 = CTIA+19 ;PCOLR1-->COLPM1 WITH ATTRACT MODE
716 D014 COLPM2 = CTIA+20 ;PCOLR2-->COLPM2 WITH ATTRACT MODE
717 D015 COLPM3 = CTIA+21 ;PCOLR3-->COLPM3 WITH ATTRACT MODE
718 D016 COLPF0 = CTIA+22 ;COLOR0-->COLPF0 WITH ATTRACT MODE
719 D017 COLPF1 = CTIA+23 ;COLOR1-->COLPF1 WITH ATTRACT MODE
720 D018 COLPF2 = CTIA+24 ;COLOR2-->COLPF2 WITH ATTRACT MODE
721 D019 COLPF3 = CTIA+25 ;COLOR3-->COLPF3 WITH ATTRACT MODE
722 D01A COLBK = CTIA+26 ;COLOR4-->COLBK WITH ATTRACT MODE
723 D01B PRIOR = CTIA+27 ;(ON OPEN S: OR E:) GPRIOR-->PRIOR
724 D01C VDELAY = CTIA+28
725 D01D GRACTL = CTIA+29
726 D01E HITCLR = CTIA+30
727 D01F CONSOL = CTIA+31 ;$08-->CONSOL TURN OFF SPEAKER
728 D000 M0PF = CTIA+0
729 D001 M1PF = CTIA+1
730 D002 M2PF = CTIA+2
731 D003 M3PF = CTIA+3
732 D004 P0PF = CTIA+4
733 D005 P1PF = CTIA+5
734 D008 P2PF = CTIA+8
735 D007 P3PF = CTIA+7
736 D008 M0PL = CTIA+8
737 D009 M1PL = CTIA+9
738 D00A M2PL = CTIA+10
739 D00B M3PL = CTIA+11
740 D00C P0PL = CTIA+12
741 D00D P1PL = CTIA+13
742 D00E P2PL = CTIA+14
743 D00F P3PL = CTIA+15
744 D010 TRIG0 = CTIA+16 ;TRIG0-->STRIG0
745 D011 TRIG1 = CTIA+17 ;TRIG1-->STRIG1
746 D012 TRIG2 = CTIA+18 ;TRIG2-->STRIG2
747 D013 TRIG3 = CTIA+19 ;TRIG3-->STRIG3
748 ;
749 D400 ANTIC = $D400 ;VBLANK ACTION DESCRIPTION
750 D400 DMACTL = ANTIC+0 ;DMACTL<--SDMCTL ON OPEN S: OR E:
751 D401 CHACTL = ANTIC+1 ;CHACTL<--CHACT ON OPEN S: OR E:
752 D402 DLISTL = ANTIC+2 ;DLISTL<--SDLSTL ON OPEN S: OR E:
753 D403 DLISTH = ANTIC+3 ;DLISTH<--SDLSTH ON OPEN S: OR E:
754 D404 HSCROL = ANTIC+4
755 D405 VSCROL = ANTIC+5
756 D407 PMBASE = ANTIC+7
757 D409 CHBASE = ANTIC+9 ;CHBASE<--CHBAS ON OPEN S: OR E:
758 D40A WSYNC = ANTIC+10
759 D40B VCOUNT = ANTIC+11
760 D40C PENH = ANTIC+12
761 D40D PENV = ANTIC+13
762 D40E NMIEN = ANTIC+14 ;NMIEN<--40 POWER ON AND [SETVBV]
763 D40F NMIRES = ANTIC+15 ;STROBED
764 D40F NMIST = ANTIC+15
765 D300 PIA = $D300 ;VBLANK ACTION DESCRIPTION
766 D300 PORTA = PIA+0 ;PORTA-->STICK0,1 X-Y CONTROLLERS
767 D301 PORTB = PIA+1 ;PORTB-->STICK2,3 X-Y CONTROLLERS
768 D302 PACTL = PIA+2 ;NONE PACTL<--3C [INIT]
769 D303 PBCTL = PIA+3 ;NONE PBCTL<--3C [INIT]
770 ;
771 ;
772 ;
773 ; .PAGE
774 .PAGE
775 LIST S
776 .TITLE 'CENTRAL INPUT/OUTPUT (CIO) 2-7-79'
777 ; UPDATED BY AL MILLER 3-9-79
778 0030 ASCZER = '0 ;ASCII ZERO
779 003A COLON = $3A ;ASCII COLON
780 009B EOL = $9B ;END OF RECORD
781 .PAGE
782 ;
783 ; CIO JUMP VECTOR FOR USERS
784 *=CIOV
785 E456 4C C4 E4 JMP CIO ;GO TO CIO
786 ;
787 ; CIO INIT JUMP VECTOR FOR POWER UP
788 *=CIOINV
789 E46E 4C A6 E4 JMP CIOINT ;GO TO INIT
790 ;
791 ;
792 ; ERROR ROUTINE ADDRESS EQUATE
793 ;ERRTNH=ERRTN/256 "MOVED TO LINE 788"
794 ;ERRTNL=-ERRTNH*256+ERRTN "MOVED TO LINE 789"
795 ;
796 ;
797 *=CIOORG
798 ;
799 ; CIO INITIALIZATION (CALLED BY MONITOR AT POWER UP)
800 E4A6 A2 00 CIOINT: LDX #0
801 E4A8 A9 FF CIOI1: LDA #IOCFRE ;SET ALL IOCB'S TO FREE
802 E4AA 9D 40 03 STA ICHID,X ;BY SETTING HANDLER ID'S=$FF
803 E4AD A9 C0 LDA #ERRTNL
804 E4AF 9D 46 03 STA ICPTL,X ;POINT PUT TO ERROR ROUTINE
805 E4B2 A9 E4 LDA #ERRTNH
806 E4B4 9D 47 03 STA ICPTH,X
807 E4B7 8A TXA
808 E4B8 18 CLC
809 E4B9 69 10 ADC #IOCBSZ ;BUMP INDEX BY SIZE
810 E4BB AA TAX
811 E4BC C9 80 CMP #MAXIOC ;DONE?
812 E4BE 90 E8 BCC CIOI1 ;NO
813 E4C0 60 RTS ;YES, RETURN
814 ;
815 ; ERROR ROUTINE FOR ILLEGAL PUT
816 E4C0 ERRTN=*-1
817 00E4 ERRTNH=ERRTN/256
818 00C0 ERRTNL=(-ERRTNH)*256+ERRTN
819 E4C1 A0 85 LDY #NOTOPN ;IOCB NOT OPEN
820 E4C3 60 RTS
821 .PAGE
822 ;
823 ; CIO LOCAL RAM (USES SPARE BYTES IN ZERO PAGE IOCB)
824 002C ENTVEC = ICSPRZ
825 ;
826 ; CIO MAIN ROUTINE
827 ;
828 ; CIO INTERFACES BETWEEN USER AND INPUT/OUTPUT DE
829 E4C4 85 2F CIO: STA CIOCHR ;SAVE POSSIBLE OUTPUT CHARACTER
830 E4C6 86 2E STX ICIDNO ;SAVE IOCB NUMBER * N
831 ;
832 ; CHECK FOR LEGAL IOCB
833 E4C8 8A TXA
834 E4C9 29 0F AND #$F ;IS IOCB MULTIPLE OF 16?
835 E4CB D0 04 BNE CIERR1 ;NO, ERROR
836 E4CD E0 80 CPX #MAXIOC ;IS INDEX TOO LARGE?
837 E4CF 90 05 BCC IOC1 ;NO
838 ;
839 ; INVALID IOCB NUMBER -- RETURN ERROR
840 E4D1 A0 86 CIERR1: LDY #BADIOC ;ERROR CODE
841 E4D3 4C 1B E6 JMP CIRTN1 ;RETURN
842 ;
843 ; MOVE USER IOCB TO ZERO PAGE
844 E4D6 A0 00 IOC1: LDY #0
845 E4D8 BD 40 03 IOC1A: LDA IOCB,X ;USER IOCB
846 E4DB 99 20 00 STA IOCBAS,Y ;TO ZERO PAGE
847 E4DE E8 INX ;
848 E4DF C8 INY ;
849 E4E0 C0 0C CPY #12 ;12 BYTES
850 E4E2 90 F4 BCC IOC1A
851 ;
852 ; COMPUTE CIO INTERNAL VECTOR FOR COMMAND
853 E4E4 A0 84 LDY #NVALID ;ASSUME INVALID CODE
854 E4E6 A5 22 LDA ICCOMZ ;COMMAND CODE TO INDEX
855 E4E8 C9 03 CMP #OPEN ;IS COMMAND LEGAL?
856 E4EA 90 25 BCC CIERR4 ;NO
857 E4EC A8 TAY
858 ;
859 ; MOVE COMMAND TO ZERO BASE FOR INDEX
860 E4ED C0 0E CPY #SPECIL ;IS COMMAND SPECIAL?
861 E4EF 90 02 BCC IOC2 ;NO
862 E4F1 A0 0E LDY #SPECIL ;YES, SET SPECIAL OFFSET INDEX
863 E4F3 84 17 IOC2: STY ICCOMT ;SAVE COMMAND FOR VECTOR
864 E4F5 B9 C6 E6 LDA COMTAB-3,Y ;GET VECTOR OFFSET FROM TABLE
865 E4F8 F0 0F BEQ CIOPEN ;GO IF OPEN COMMAND
866 E4FA C9 02 CMP #2 ;IS IT CLOSE?
867 E4FC F0 35 BEQ CICLOS ;YES
868 E4FE C9 08 CMP #8 ;IS IT STATUS OR SPECIAL?
869 E500 B0 4C BCS CISTSP ;YES
870 E502 C9 04 CMP #4 ;IS IT READ?
871 E504 F0 63 BEQ CIREAD ;YES
872 E506 4C C9 E5 JMP CIWRIT ;ELSE, MUST BE WRITE
873 .PAGE
874 ;
875 ; OPEN COMMAND
876 ;
877 ; FIND DEVICE HANDLER IN HANDLER ADDRESS TABLE
878 E509 A5 20 CIOPEN: LDA ICHIDZ ;GET HANDLER ID
879 E50B C9 FF CMP #IOCFRE ;IS THIS IOCB CLOSED?
880 E50D F0 05 BEQ IOC6 ;YES
881 ;
882 ; ERROR -- IOCB ALREADY OPEN
883 E50F A0 81 CIERR3: LDY #PRVOPN ;ERROR CODE
884 E511 4C 1B E6 CIERR4: JMP CIRTN1 ;RETURN
885 ;
886 ; GO FIND DEVICE
887 E514 20 9E E6 IOC6: JSR DEVSRC ;CALL DEVICE SEARCH
888 E517 B0 F8 BCS CIERR4 ;GO IF DEVICE NOT FOUND
889 ;
890 ; DEVICE FOUND, INITIALIZE IOCB FOR OPEN
891 ;
892 ; COMPUTE HANDLER ENTRY POINT
893 E519 20 3D E6 IOC7: JSR COMENT
894 E51C B0 F3 BCS CIERR4 ;GO IF ERROR IN COMPUTE
895 ;
896 ; GO TO HANDLER FOR INITIALIZATION
897 E51E 20 89 E6 JSR GOHAND ;USE INDIRECT JUMP
898 ;
899 ; STORE PUT BYTE ADDRESS-1 INTO IOCB
900 E521 A9 0B LDA #PUTCHR ;SIMULATE PUT CHARACTER
901 E523 85 17 STA ICCOMT
902 E525 20 3D E6 JSR COMENT ;COMPUTE ENTRY POINT
903 E528 A5 2C LDA ICSPRZ ;MOVE COMPUTED VALUE
904 E52A 85 26 STA ICPTLZ ;TO PUT BYTE ADDRESS
905 E52C A5 2D LDA ICSPRZ+1
906 E52E 85 27 STA ICPTHZ
907 E530 4C 1D E6 JMP CIRTN2 ;RETURN TO USER
908 .PAGE
909 ;
910 ;
911 ; CLOSE COMMAND
912 E533 A0 01 CICLOS: LDY #SUCCES ;ASSUME GOOD CLOSE
913 E535 84 23 STY ICSTAZ
914 E537 20 3D E6 JSR COMENT ;COMPUTE HANDLER ENTRY POINT
915 E53A B0 03 BCS CICLO2 ;GO IF ERROR IN COMPUTE
916 E53C 20 89 E6 JSR GOHAND ;GO TO HANDLER TO CLOSE DEVICE
917 E53F A9 FF CICLO2: LDA #IOCFRE ;GET IOCB "FREE" VALUE
918 E541 85 20 STA ICHIDZ ;SET HANDLER ID
919 E543 A9 E4 LDA #ERRTNH
920 E545 85 27 STA ICPTHZ ;SET PUT BYTE TO POINT TO ERROR
921 E547 A9 C0 LDA #ERRTNL
922 E549 85 26 STA ICPTLZ
923 E54B 4C 1D E6 JMP CIRTN2 ;RETURN
924 ;
925 ;
926 ; STATUS AND SPECIAL REQUESTS
927 ; DO IMPLIED OPEN IF NECESSARY AND GO TO DEVICE
928 E54E A5 20 CISTSP: LDA ICHIDZ ;IS THERE A HANDLER ID?
929 E550 C9 FF CMP #IOCFRE
930 E552 D0 05 BNE CIST1 ;YES
931 ;
932 ; IOCB IS FREE, DO IMPLIED OPEN
933 E554 20 9E E6 JSR DEVSRC ;FIND DEVICE IN TABLE
934 E557 B0 B8 BCS CIERR4 ;GO IF ERROR IN COMPUTE
935 ;
936 ; COMPUTE AND GO TO ENTRY POINT IN HANDLER
937 E559 20 3D E6 CIST1: JSR COMENT ;COMPUTER HANDLER ENTRY VECTOR
938 E55C 20 89 E6 JSR GOHAND ;GO TO HANDLER
939 ;
940 ; RESTORE HANDLER INDEX (DO IMPLIED CLOSE)
941 E55F A6 2E LDX ICIDNO ;IOCB INDEX
942 E561 BD 40 03 LDA ICHID,X ;GET ORIGINAL HANDLER ID
943 E564 85 20 STA ICHIDZ ;RESTORE ZERO PAGE
944 E566 4C 1D E6 JMP CIRTN2 ;RETURN
945 .PAGE
946 ;
947 ; READ -- DO GET COMMANDS
948 E569 A5 22 CIREAD: LDA ICCOMZ ;GET COMMAND BYTE
949 E56B 25 2A AND ICAX1Z ;IS THIS READ LEGAL?
950 E56D D0 05 BNE RCI1A ;YES
951 ;
952 ; ILLEGAL READ -- IOCB OPENED FOR WRITE ONLY
953 E56F A0 83 LDY #WRONLY ;ERROR CODE
954 E571 4C 1B E6 RCI1B: JMP CIRTN1 ;RETURN
955 ;
956 ; COMPUTE AND CHECK ENTRY POINT
957 E574 20 3D E6 RCI1A: JSR COMENT ;COMPUTE ENTRY POINT
958 E577 B0 F8 BCS RCI1B ;GO IF ERROR IN COMPUTE
959 ;
960 ; GET RECORD OR CHARACTERS
961 E579 A5 28 LDA ICBLLZ
962 E57B 05 29 ORA ICBLLZ+1 ;IS BUFFER LENGTH ZERO?
963 E57D D0 08 BNE RCI3 ;NO
964 E57F 20 89 E6 JSR GOHAND
965 E582 85 2F STA CIOCHR
966 E584 4C 1D E6 JMP CIRTN2
967 ;
968 ; LOOP TO FILL BUFFER OR END RECORD
969 E587 20 89 E6 RCI3: JSR GOHAND ;GO TO HANDLER TO GET BYTE
970 E58A 85 2F STA CIOCHR ;SAVE BYTE
971 E58C 30 35 BMI RCI4 ;END TRANSFER IF ERROR
972 E58E A0 00 LDY #0
973 E590 91 24 STA (ICBALZ),Y ;PUT BYTE IN USER BUFFER
974 E592 20 70 E6 JSR INCBFP ;INCREMENT BUFFER POINTER
975 E595 A5 22 LDA ICCOMZ ;GET COMMAND CODE
976 E597 29 02 AND #2 ;IS IT GET RECORD?
977 E599 D0 0C BNE RCI1 ;NO
978 ;
979 ; CHECK FOR EOL ON TEXT RECORDS
980 E59B A5 2F LDA CIOCHR ;GET BYTE
981 E59D C9 9B CMP #EOL ;IS IT AN EOL?
982 E59F D0 06 BNE RCI1 ;NO
983 E5A1 20 63 E6 JSR DECBFL ;YES, DECREMENT BUFFER LENGTH
984 E5A4 4C C3 E5 JMP RCI4 ;END TRANSFER
985 ;
986 ; CHECK BUFFER FULL
987 E5A7 20 63 E6 RCI1: JSR DECBFL ;DECREMENT BUFFER LENGTH
988 E5AA D0 DB BNE RCI3 ;CONTINUE IF NON ZERO
989 .PAGE
990 ;
991 ; BUFFER FULL, RECORD NOT ENDED
992 ; DISCARD BYTES UNTIL END OF RECORD
993 E5AC A5 22 RCI2: LDA ICCOMZ ;GET COMMAND BYTE
994 E5AE 29 02 AND #2 ;IS IT GET CHARACTER?
995 E5B0 D0 11 BNE RCI4 ;YES, END TRANSFER
996 ;
997 ; LOOP TO WAIT FOR EOL
998 E5B2 20 89 E6 RCI6: JSR GOHAND ;GET BYTE FROM HANDLER
999 E5B5 85 2F STA CIOCHR ;SAVE CHARACTER
1000 E5B7 30 0A BMI RCI4 ;GO IF ERROR
1001 ;
1002 ; TEXT RECORD, WAIT FOR EOL
1003 E5B9 A5 2F LDA CIOCHR ;GET GOT BYTE
1004 E5BB C9 9B CMP #EOL ;IS IT EOL?
1005 E5BD D0 F3 BNE RCI6 ;NO, CONTINUE
1006 ;
1007 ; END OF RECORD, BUFFER FULL -- SEND TRUNCATED RECORD MESSAGE
1008 E5BF A9 89 RCI11: LDA #TRNRCD ;ERROR CODE
1009 E5C1 85 23 STA ICSTAZ ;STORE IN IOCB
1010 ;
1011 ; TRANSFER DONE
1012 E5C3 20 77 E6 RCI4: JSR SUBBFL ;SET FINAL BUFFER LENGTH
1013 E5C6 4C 1D E6 JMP CIRTN2 ;RETURN
1014 .PAGE
1015 ;
1016 ; WRITE -- DO PUT COMMANDS
1017 E5C9 A5 22 CIWRIT: LDA ICCOMZ ;GET COMMAND BYTE
1018 E5CB 25 2A AND ICAX1Z ;IS THIS WRITE LEGAL?
1019 E5CD D0 05 BNE WCI1A ;YES
1020 ;
1021 ; ILLEGAL WRITE -- DEVICE OPENED FOR READ ONLY
1022 E5CF A0 87 LDY #RDONLY ;ERROR CODE
1023 E5D1 4C 1B E6 WCI1B: JMP CIRTN1 ;RETURN
1024 ;
1025 ; COMPUTE AND CHECK ENTRY POINT
1026 E5D4 20 3D E6 WCI1A: JSR COMENT ;COMPUTE HANDLER ENTRY POINT
1027 E5D7 B0 F8 BCS WCI1B ;GO IF ERROR IN COMPUTE
1028 ;
1029 ; PUT RECORD OR CHARACTERS
1030 E5D9 A5 28 LDA ICBLLZ
1031 E5DB 05 29 ORA ICBLLZ+1 ;IS BUFFER LENGTH ZERO?
1032 E5DD D0 06 BNE WCI3 ;NO
1033 E5DF A5 2F LDA CIOCHR ;GET CHARACTER
1034 E5E1 E6 28 INC ICBLLZ ;SET BUFFER LENGTH=1
1035 E5E3 D0 06 BNE WCI4 ;THEN JUST TRANSFER ONE BYTE
1036 ;
1037 ; LOOP TO TRANSFER BYTES FROM BUFFER TO HANDLER
1038 E5E5 A0 00 WCI3: LDY #0
1039 E5E7 B1 24 LDA (ICBALZ),Y ;GET BYTE FROM BUFFER
1040 E5E9 85 2F STA CIOCHR ;SAVE
1041 E5EB 20 89 E6 WCI4: JSR GOHAND ;GO PUT BYTE
1042 E5EE 30 25 BMI WCI5 ;END IF ERROR
1043 E5F0 20 70 E6 JSR INCBFP ;INCREMENT BUFFER POINTER
1044 ;
1045 ; CHECK FOR TEXT RECORD
1046 E5F3 A5 22 LDA ICCOMZ ;GET COMMAND BYTE
1047 E5F5 29 02 AND #2 ;IS IT PUT RECORD?
1048 E5F7 D0 0C BNE WCI1 ;NO
1049 ;
1050 ; TEXT RECORD -- CHECK FOR EOL TRANSFER
1051 E5F9 A5 2F LDA CIOCHR ;GET LAST CHARACTER
1052 E5FB C9 9B CMP #EOL ;IS IT AN EOL?
1053 E5FD D0 06 BNE WCI1 ;NO
1054 E5FF 20 63 E6 JSR DECBFL ;DECREMENT BUFFER LENGTH
1055 E602 4C 15 E6 JMP WCI5 ;END TRANSFER
1056 ;
1057 ; CHECK FOR BUFFER EMPTY
1058 E605 20 63 E6 WCI1: JSR DECBFL ;DECREMENT BUFFER LENGTH
1059 E608 D0 DB BNE WCI3 ;CONTINUE IF NON ZERO
1060 .PAGE
1061 ;
1062 ; BUFFER EMPTY, RECORD NOT FILLED
1063 ; CHECK TYPE OF TRANSFER
1064 E60A A5 22 WCI2: LDA ICCOMZ ;GET COMMAND CODE
1065 E60C 29 02 AND #2 ;IS IT PUT CHARACTER?
1066 E60E D0 05 BNE WCI5 ;YES, END TRANSFER
1067 ;
1068 ; PUT RECORD (TEXT), BUFFER EMPTY, SEND EOL
1069 E610 A9 9B LDA #EOL
1070 E612 20 89 E6 JSR GOHAND ;GO TO HANDLER
1071 ;
1072 ; END PUT TRANSFER
1073 E615 20 77 E6 WCI5: JSR SUBBFL ;SET ACTUAL PUT BUFFER LENGTH
1074 E618 4C 1D E6 JMP CIRTN2 ;RETURN
1075 .PAGE
1076 ;
1077 ; CIO RETURNS
1078 ; RETURNS WITH Y=STATUS
1079 E61B 84 23 CIRTN1: STY ICSTAZ ;SAVE STATUS
1080 ;
1081 ; RETURNS WITH STATUS STORED IN ICSTAZ
1082 ; MOVE IOCB IN ZERO PAGE BACK TO USER AREA
1083 ;
1084 E61D A4 2E CIRTN2: LDY ICIDNO ;GET IOCB INDEX
1085 E61F B9 44 03 LDA ICBAL,Y
1086 E622 85 24 STA ICBALZ ;RESTORE USER BUFFER POINTER
1087 E624 B9 45 03 LDA ICBAH,Y
1088 E627 85 25 STA ICBAHZ
1089 E629 A2 00 LDX #0 ;LOOP COUNT AND INDEX
1090 E62B B5 20 CIRT3: LDA IOCBAS,X ;ZERO PAGE
1091 E62D 99 40 03 STA IOCB,Y ;TO USER AREA
1092 E630 E8 INX
1093 E631 C8 INY
1094 E632 E0 0C CPX #12 ;12 BYTES
1095 E634 90 F5 BCC CIRT3
1096 ;
1097 ; RESTORE A,X, & Y
1098 ;
1099 E636 A5 2F LDA CIOCHR ;GET LAST CHARACTER
1100 E638 A6 2E LDX ICIDNO ;IOCB INDEX
1101 E63A A4 23 LDY ICSTAZ ;GET STATUS AND SET FLAGS
1102 E63C 60 RTS ;RETURN TO USER
1103 .PAGE
1104 ;
1105 ;
1106 ; CIO SUBROUTINES
1107 ;
1108 ; COMENT -- CHECK AND COMPUTE HANDLER ENTRY POINT
1109 E63D A4 20 COMENT: LDY ICHIDZ ;GET HANDLER INDEX
1110 E63F C0 22 CPY #MAXDEV+1 ;IS IT A LEGAL INDEX?
1111 E641 90 04 BCC COM1 ;YES
1112 ;
1113 ; ILLEGAL HANDLER INDEX MEANS DEVICE NOT OPEN FOR OPERATION
1114 E643 A0 85 LDY #NOTOPN ;ERROR CODE
1115 E645 B0 1B BCS COM2 ;RETURN
1116 ;
1117 ; USE HANDLER ADDRESS TABLE AND COMMAND TABLE TO GET VECTOR
1118 E647 B9 1B 03 COM1: LDA HATABS+1,Y ;GET LOW BYTE OF ADDRESS
1119 E64A 85 2C STA ICSPRZ ;AND SAVE IN POINTER
1120 E64C B9 1C 03 LDA HATABS+2,Y ;GET HI BYTE OF ADDRESS
1121 E64F 85 2D STA ICSPRZ+1
1122 E651 A4 17 LDY ICCOMT ;GET COMMAND CODE
1123 E653 B9 C6 E6 LDA COMTAB-3,Y ;GET COMMAND OFFSET
1124 E656 A8 TAY
1125 E657 B1 2C LDA (ICSPRZ),Y ;GET LOW BYTE OF VECTOR FROM
1126 E659 AA TAX ;HANDLER ITSELF AND SAVE
1127 E65A C8 INY
1128 E65B B1 2C LDA (ICSPRZ),Y ;GET HI BYTE OF VECTOR
1129 E65D 85 2D STA ICSPRZ+1
1130 E65F 86 2C STX ICSPRZ ;SET LO BYTE
1131 E661 18 CLC ;SHOW NO ERROR
1132 E662 60 COM2: RTS
1133 ;
1134 ;
1135 ; DECBFL -- DECREMENT BUFFER LENGTH DOUBLE BYTE
1136 ; Z FLAG = 0 ON RETURN IF LENGTH = 0 AFTER DECREMENT
1137 E663 C6 28 DECBFL: DEC ICBLLZ ;DECREMENT LOW BYTE
1138 E665 A5 28 LDA ICBLLZ ;CHECK IT
1139 E667 C9 FF CMP #$FF ;DID IT GO BELOW?
1140 E669 D0 02 BNE DECBF1 ;NO
1141 E66B C6 29 DEC ICBLLZ+1 ;DECREMENT HI BYTE
1142 E66D 05 29 DECBF1: ORA ICBLLZ+1 ;SET Z IF BOTH ARE ZERO
1143 E66F 60 RTS
1144 ;
1145 ;
1146 ; INCBFP -- INCREMENT WORKING BUFFER POINTER
1147 E670 E6 24 INCBFP: INC ICBALZ ;BUMP LOW BYTE
1148 E672 D0 02 BNE INCBF1 ;GO IF NOT ZERO
1149 E674 E6 25 INC ICBALZ+1 ;ELSE, BUMP HI BYTE
1150 E676 60 INCBF1: RTS
1151 ;
1152 ;
1153 ; SUBBFL -- SET BUFFER LENGTH = BUFFER LENGTH - WORKING BYTE COUNT
1154 E677 A6 2E SUBBFL: LDX ICIDNO ;GET IOCB INDEX
1155 E679 38 SEC
1156 E67A BD 48 03 LDA ICBLL,X ;GET LOW BYTE OF INITIAL LENGTH
1157 E67D E5 28 SBC ICBLLZ ;SUBTRACT FINAL LOW BYTE
1158 E67F 85 28 STA ICBLLZ ;AND SAVE BACK
1159 E681 BD 49 03 LDA ICBLH,X ;GET HI BYTE
1160 E684 E5 29 SBC ICBLLZ+1
1161 E686 85 29 STA ICBLHZ
1162 E688 60 RTS
1163 ;
1164 ;
1165 ; GOHAND -- GO INDIRECT TO A DEVICE HANDLER
1166 ; Y= STATUS ON RETURN, N FLAG=1 IF ERROR ON RETURN
1167 E689 A0 92 GOHAND: LDY #FNCNOT ;PREPARE NO FUNCTION STATUS FOR HANDLER RTS
1168 E68B 20 93 E6 JSR CIJUMP ;USE THE INDIRECT JUMP
1169 E68E 84 23 STY ICSTAZ ;SAVE STATUS
1170 E690 C0 00 CPY #0 ;AND SET N FLAG
1171 E692 60 RTS
1172 ;
1173 ; INDIRECT JUMP TO HANDLER BY PAUL'S METHOD
1174 E693 AA CIJUMP: TAX ;SAVE A
1175 E694 A5 2D LDA ICSPRZ+1 ;GET JUMP ADDRESS HI BYTE
1176 E696 48 PHA ;PUT ON STACK
1177 E697 A5 2C LDA ICSPRZ ;GET JUMP ADDRESS LO BYTE
1178 E699 48 PHA ;PUT ON STACK
1179 E69A 8A TXA ;RESTORE A
1180 E69B A6 2E LDX ICIDNO ;GET IOCB INDEX
1181 E69D 60 RTS ;GO TO HANDLER INDIRECTLY
1182 .PAGE
1183 ;
1184 ; DEVSRC -- DEVICE SEARCH, FIND DEVICE IN HANDLER ADDRESS TABLE
1185 ;
1186 ; LOOP TO FIND DEVICE
1187 E69E A0 00 DEVSRC: LDY #0
1188 E6A0 B1 24 LDA (ICBALZ),Y ;GET DEVICE NAME FROM USER
1189 E6A2 F0 0C BEQ CIERR2
1190 E6A4 A0 21 LDY #MAXDEV ;INITIAL COMPARE INDEX
1191 E6A6 D9 1A 03 DEVS1: CMP HATABS,Y ;IS THIS THE DEVICE?
1192 E6A9 F0 0A BEQ DEVS2 ;YES
1193 E6AB 88 DEY
1194 E6AC 88 DEY ;ELSE, POINT TO NEXT DEVICE NAME
1195 E6AD 88 DEY
1196 E6AE 10 F6 BPL DEVS1 ;CONTINUE FOR ALL DEVICES
1197 ;
1198 ; NO DEVICE FOUND, DECLARE NON-EXISTENT DEVICE ERROR
1199 E6B0 A0 82 CIERR2: LDY #NONDEV ;ERROR CODE
1200 E6B2 38 SEC ;SHOW ERROR
1201 E6B3 B0 13 BCS DEVS4 ;AND RETURN
1202 ;
1203 ; FOUND DEVICE, SET ICHID,ICDNO, AND INIT DEVICE
1204 E6B5 98 DEVS2: TYA
1205 E6B6 85 20 STA ICHIDZ ;SAVE HANDLER INDEX
1206 E6B8 38 SEC
1207 E6B9 A0 01 LDY #1
1208 E6BB B1 24 LDA (ICBALZ),Y ;GET DEVICE NUMBER (DRIVE NUMBER)
1209 E6BD E9 30 SBC #ASCZER ;SUBTRACT ASCII ZERO
1210 E6BF C9 0A CMP #$A ;IS NUMBER IN RANGE?
1211 E6C1 90 02 BCC DEVS3 ;YES
1212 E6C3 A9 01 LDA #1 ;NO, DEFAULT TO ONE
1213 E6C5 85 21 DEVS3: STA ICDNOZ ;SAVE DEVICE NUMBER
1214 E6C7 18 CLC ;SHOW NO ERROR
1215 ;
1216 ; RETURN
1217 E6C8 60 DEVS4: RTS
1218 .PAGE
1219 ;
1220 ;
1221 ; CIO ROM TABLES
1222 ;
1223 ; COMMAND TABLE
1224 ; MAPS EACH COMMAND TO OFFSET FOR APPROPRIATE VECTOR IN HANDLER
1225 E6C9 00 04 04 04 COMTAB: .BYTE 0,4,4,4,4,6,6,6,6,2,8,10
1226 E6CD 04 06 06 06
1227 E6D1 06 02 08 0A
1228 022F LENGTH =*-CIOINT
1229 E6D5 CRNTP1 =*
1230 *=$14
1231 0014 00 CIOSPR: .BYTE INTORG-CRNTP1 ;^GCIOL IS TOO LONG
1232
1233 LIST S
1234 .TITLE 'INTERRUPT HANDLER'
1235 ;LIVES ON DK1:INTHV.SRC
1236 0006 SRTIM2 = 6 ;SECOND REPEAT INTERVAL
1237 *=SETVBV
1238 E45C 4C 12 E9 JMP SETVBL
1239 E45F 4C D1 E7 JMP SYSVBL
1240 E462 4C 3E E9 JMP XITVBL
1241 *=INTINV
1242 E46B 4C D5 E6 JMP IHINIT
1243 ;
1244 *=VCTABL+INTABS-VDSLST
1245 ; ;
1246 E480 B3 E7 .WORD SYRTI ;VDSLST
1247 E482 B2 E7 .WORD SYIRQB ;VPRCED
1248 E484 B2 E7 .WORD SYIRQB ;VINTER
1249 E486 B2 E7 .WORD SYIRQB ;VBREAK
1250 ;
1251 E488 .RES 8
1252 E490 B2 E7 .WORD SYIRQB ;VTIMR1
1253 E492 B2 E7 .WORD SYIRQB ;VTIMR2
1254 E494 B2 E7 .WORD SYIRQB ;VTMIR4
1255 E496 F6 E6 .WORD SYIRQ ;VIMIRQ
1256 E498 00 00 00 00 .WORD 0,0,0,0,0 ;CDTMV1-4
1257 E49C 00 00 00 00
1258 E4A0 00 00
1259 E4A2 D1 E7 .WORD SYSVBL ;VVBLKI
1260 E4A4 3E E9 .WORD XITVBL ;VVBLKD
1261 ;
1262 *=$900C
1263 ;
1264 900C A9 E6 LDA #PIRQH ;SET UP RAM VECTORS FOR LINBUG VERSION
1265 900E 8D F9 FF STA $FFF9
1266 9011 A9 F3 LDA #PIRQL
1267 9013 8D F8 FF STA $FFF8
1268 9016 A9 E7 LDA #PNMIH
1269 9018 8D FB FF STA $FFFB
1270 901B A9 B4 LDA #PNMIL
1271 901D 8D FA FF STA $FFFA
1272 9020 60 RTS
1273 .PAGE
1274 ;
1275 ; IRQ HANDLER
1276 ;
1277 ; JUMP THRU IMMEDIATE IRQ VECTOR, WHICH ORDINARILY POINTS TO
1278 ; SYSTEM IRQ: DETERMINE & CLEAR CAUSE, JUMP THRU SOFTWARE VECTOR.
1279 ;
1280 *=INTORG
1281 E6D5 A9 40 IHINIT: LDA #$40 ;VBL ON BUF DLIST OFF***FOR NOW***
1282 E6D7 8D 0E D4 STA NMIEN ;ENABLE DISPLAY LIST, VERTICAL BLANK
1283 E6DA A9 38 LDA #$38 ;LOOK AT DATA DIRECTION REGISTERS IN PIA
1284 E6DC 8D 02 D3 STA PACTL
1285 E6DF 8D 03 D3 STA PBCTL
1286 E6E2 A9 00 LDA #0 ;MAKE ALL INPUTS
1287 E6E4 8D 00 D3 STA PORTA
1288 E6E7 8D 01 D3 STA PORTB
1289 E6EA A9 3C LDA #$3C ;BACK TO PORTS
1290 E6EC 8D 02 D3 STA PACTL
1291 E6EF 8D 03 D3 STA PBCTL
1292 E6F2 60 RTS
1293 E6F3 6C 16 02 PIRQ: JMP (VIMIRQ)
1294 E6F6 48 SYIRQ: PHA ;SAVE A ON STACK
1295 E6F7 A9 10 LDA #$10 ;SERIAL OUT READ BIT
1296 E6F9 2C 0E D2 BIT IRQST ;SEE IF SER OUT RDY
1297 E6FC D0 0D BNE SYIRQ1 ;JUMP IF NOT
1298 E6FE A9 EF LDA #$EF
1299 E700 8D 0E D2 STA IRQEN
1300 E703 A5 10 LDA POKMSK ;RESET ENABLE BYTE
1301 E705 8D 0E D2 STA IRQEN
1302 E708 6C 0C 02 JMP (VSEROR) ;JUMP THRU VECTOR
1303 E70B A9 20 SYIRQ1: LDA #$20 ;SERIAL IN READY BIT
1304 E70D 2C 0E D2 BIT IRQST
1305 E710 D0 0D BNE SYIRQ2
1306 E712 A9 DF LDA #$DF
1307 E714 8D 0E D2 STA IRQEN
1308 E717 A5 10 LDA POKMSK
1309 E719 8D 0E D2 STA IRQEN
1310 E71C 6C 0A 02 JMP (VSERIN)
1311 E71F A9 08 SYIRQ2: LDA #$08 ;SERIAL OUT COMPLETE
1312 E721 24 10 BIT POKMSK ;ONLY CHECK IF ENABLED
1313 E723 F0 12 BEQ SYIRQ3 ;SINCE THIS IS A WEIRD CASE IN THE
1314 E725 2C 0E D2 BIT IRQEN ;HARDWARE
1315 E728 D0 0D BNE SYIRQ3
1316 E72A A9 F7 LDA #$F7
1317 E72C 8D 0E D2 STA IRQEN
1318 E72F A5 10 LDA POKMSK
1319 E731 8D 0E D2 STA IRQEN
1320 E734 6C 0E 02 JMP (VSEROC)
1321 E737 AD 0E D2 SYIRQ3: LDA IRQEN ;TO CHECK TIMERS
1322 E73A 6A ROR A
1323 E73B B0 0D BCS SYIRQ4 ;TIMER1
1324 E73D A9 FE LDA #$FE
1325 E73F 8D 0E D2 STA IRQEN
1326 E742 A5 10 LDA POKMSK
1327 E744 8D 0E D2 STA IRQEN
1328 E747 6C 10 02 JMP (VTIMR1)
1329 E74A 6A SYIRQ4: ROR A
1330 E74B B0 0D BCS SYIRQ5
1331 E74D A9 FD LDA #$FD
1332 E74F 8D 0E D2 STA IRQEN
1333 E752 A5 10 LDA POKMSK
1334 E754 8D 0E D2 STA IRQEN
1335 E757 6C 12 02 JMP (VTIMR2)
1336 E75A 6A SYIRQ5: ROR A
1337 E75B B0 0A BCS SYIRQ6
1338 E75D A9 FB LDA #$FB
1339 E75F 8D 0E D2 STA IRQEN
1340 E762 A5 10 LDA POKMSK
1341 E764 8D 0E D2 STA IRQEN
1342 ; JMP (VTIMR4)
1343 E767 2C 0E D2 SYIRQ6: BIT IRQEN ;CHECK BREAK KEY, KEYBOARD INTERRUPTS
1344 E76A 70 0D BVS SYIRQ7 ;IF KEYBOARD
1345 E76C A9 BF LDA #$BF
1346 E76E 8D 0E D2 STA IRQEN
1347 E771 A5 10 LDA POKMSK
1348 E773 8D 0E D2 STA IRQEN
1349 E776 6C 08 02 JMP (VKEYBD)
1350 E779 30 18 SYIRQ7: BMI SYIRQ8 ;BREAK KEY
1351 E77B A9 7F LDA #$7F
1352 E77D 8D 0E D2 STA IRQEN
1353 E780 A5 10 LDA POKMSK
1354 E782 8D 0E D2 STA IRQEN
1355 E785 A9 00 LDA #0
1356 E787 85 11 STA BRKKEY ;SET BREAK KEY FLAG
1357 E789 8D FF 02 STA SSFLAG ;START/STOP FLAG
1358 E78C 8D F0 02 STA CRSINH ;CURSOR INHIBIT
1359 E78F 85 4D STA ATRACT ;TURN OFF ATRACT MODE
1360 E791 68 PLA
1361 E792 40 RTI ;EXIT FROM INT
1362 E793 2C 02 D3 SYIRQ8: BIT PACTL ;PROCEED ***I GUESS***
1363 E796 10 06 BPL SYIRQ9
1364 E798 AD 00 D3 LDA PORTA ;CLEAR INT STATUS BIT
1365 E79B 6C 02 02 JMP (VPRCED)
1366 E79E 2C 03 D3 SYIRQ9: BIT PBCTL ;INTERRUPT ***I GUESS***
1367 E7A1 10 06 BPL SYIRQA
1368 E7A3 AD 01 D3 LDA PORTB ;CLEAR INT STATUS
1369 E7A6 6C 04 02 JMP (VINTER)
1370 E7A9 08 SYIRQA: PHP
1371 E7AA 68 PLA ;SEE IF SOFTWARE BREAK
1372 E7AB 29 10 AND #$10 ;B BIT OF P REGISTER
1373 E7AD F0 03 BEQ SYIRQB
1374 E7AF 6C 06 02 JMP (VBREAK)
1375 E7B2 68 SYIRQB: PLA
1376 E7B3 40 SYRTI: RTI ;UNIDENTIFIED INTERRUPT, JUST RETURN.
1377 .PAGE
1378 ;
1379 ; NMI HANDLER
1380 ;
1381 ; DETERMINE CAUSE AND JUMP THRU VECTOR
1382 ;
1383 E7B4 2C 0F D4 PNMI: BIT NMIST
1384 E7B7 10 03 BPL PNMI1 ;SEE IF DISPLAY LIST
1385 E7B9 6C 00 02 JMP (VDSLST)
1386 E7BC 48 PNMI1: PHA
1387 E7BD AD 0F D4 LDA NMIST
1388 E7C0 29 20 AND #$20 ;SEE IF RESET
1389 E7C2 F0 03 BEQ *+5
1390 E7C4 4C 74 E4 JMP WARMSV ;GO THRU WARM START JUMP
1391 E7C7 8A TXA ;SAVE REGISTERS
1392 E7C8 48 PHA
1393 E7C9 98 TYA
1394 E7CA 48 PHA
1395 E7CB 8D 0F D4 STA NMIRES ;RESET INTERRUPT STATUS
1396 E7CE 6C 22 02 JMP (VVBLKI) ;JUMP THRU VECTOR
1397 .PAGE
1398 ;
1399 ; SYSTEM VBLANK ROUTINE
1400 ;
1401 ; INC FRAME COUNTER. PROCESS COUNTDOWN TIMERS. EXIT IF I WAS SET, CLEAR I.
1402 ; SET DLISTL, DLISTH, DMACTL FROM RAM CELLS. DO SOFTWARE REPEAT.
1403 ;
1404 E7D1 E6 14 SYSVBL: INC RTCLOK+2 ;INC FRAME COUNTER
1405 E7D3 D0 08 BNE SYSVB1
1406 E7D5 E6 4D INC ATRACT ;INCREMENT ATRACT (CAUSES ATRACT WHEN MINUS)
1407 E7D7 E6 13 INC RTCLOK+1
1408 E7D9 D0 02 BNE SYSVB1
1409 E7DB E6 12 INC RTCLOK
1410 E7DD A9 FE SYSVB1: LDA #$FE ;{ATRACT] SET DARK MASK TO NORMAL
1411 E7DF A2 00 LDX #0 ;SET COLRSH TO NORMAL
1412 E7E1 A4 4D LDY ATRACT ;TEST ATRACT FOR NEGATIVE
1413 E7E3 10 06 BPL VBATRA ;WHILE POSITIVE, DONT GO INTO ATRACT
1414 E7E5 85 4D STA ATRACT ;IN ATRACT, SO STAY BY STA $FE
1415 E7E7 A6 13 LDX RTCLOK+1 ;COLOR SHIFT FOLLOWS RTCLOK+1
1416 E7E9 A9 F6 LDA #$F6 ;SET DARK MASK TO DARK
1417 E7EB 85 4E VBATRA: STA DRKMSK
1418 E7ED 86 4F STX COLRSH
1419 E7EF A2 00 LDX #0 ;POINT TO TIMER1
1420 E7F1 20 F5 E8 JSR DCTIMR ;GO DECREMENT TIMER1
1421 E7F4 D0 03 BNE SYSVB2 ;BRANCH IF STILL COUNTING
1422 E7F6 20 EF E8 JSR JTIMR1 ;GO JUMP TO ROUTINE
1423 E7F9 A5 42 SYSVB2: LDA CRITIC
1424 E7FB D0 08 BNE XXIT ;GO IF CRITICAL SET
1425 E7FD BA TSX ;SEE IF I WAS SET
1426 E7FE BD 04 01 LDA $104,X ;GET STACKED P
1427 E801 29 04 AND #$04 ;I BIT
1428 E803 F0 03 BEQ SYSVB3 ;BRANCH IF OK
1429 E805 4C 3E E9 XXIT: JMP XITVBL ;I WAS SET, EXIT
1430 E808 58 SYSVB3: CLI
1431 E809 AD 0D D4 LDA PENV
1432 E80C 8D 35 02 STA LPENV
1433 E80F AD 0C D4 LDA PENH
1434 E812 8D 34 02 STA LPENH
1435 E815 AD 31 02 LDA SDLSTH
1436 E818 8D 03 D4 STA DLISTH
1437 E81B AD 30 02 LDA SDLSTL
1438 E81E 8D 02 D4 STA DLISTL
1439 E821 AD 2F 02 LDA SDMCTL
1440 E824 8D 00 D4 STA DMACTL
1441 E827 AD 6F 02 LDA GPRIOR ;GLOBAL PRIOR
1442 E82A 8D 1B D0 STA PRIOR
1443 E82D A9 08 LDA #$08 ;TURN OFF KEYBOARD SPEAKER
1444 E82F 8D 1F D0 STA CONSOL
1445 E832 A2 08 LDX #8
1446 E834 BD C0 02 SCOLLP: LDA PCOLR0,X ;LOAD COLOR REGISTERS FROM RAM
1447 E837 45 4F EOR COLRSH ;DO COLOR SHIFT
1448 E839 25 4E AND DRKMSK ;AND DARK ATRACT
1449 E83B 9D 12 D0 STA COLPM0,X
1450 E83E CA DEX
1451 E83F 10 F3 BPL SCOLLP
1452 E841 AD F4 02 LDA CHBAS
1453 E844 8D 09 D4 STA CHBASE
1454 E847 AD F3 02 LDA CHACT
1455 E84A 8D 01 D4 STA CHACTL
1456 E84D A2 02 LDX #2 ;POINT TO TIMER 2
1457 E84F 20 F5 E8 JSR DCTIMR
1458 E852 D0 03 BNE SYSVB4 ;IF DIDNT GO ZERO
1459 E854 20 F2 E8 JSR JTIMR2 ;GO JUMP TO TIMER2 ROUTINE
1460 E857 A2 02 SYSVB4: LDX #2 ;RESTORE X
1461 E859 E8 SYSVBB: INX
1462 E85A E8 INX
1463 E85B BD 18 02 LDA CDTMV1,X
1464 E85E 1D 19 02 ORA CDTMV1+1,X
1465 E861 F0 06 BEQ SYSVBA
1466 E863 20 F5 E8 JSR DCTIMR ;DECREMENT AND SET FLAG IF NONZERO
1467 E866 9D 26 02 STA CDTMF3-4,X
1468 E869 E0 08 SYSVBA: CPX #8 ;SEE IF DONE ALL 3
1469 E86B D0 EC BNE SYSVBB ;LOOP
1470 ;CHECK DEBOUNCE COUNTER
1471 E86D AD 0F D2 LDA SKSTAT
1472 E870 29 04 AND #$04 ;KEY DOWN BIT
1473 E872 F0 08 BEQ SYVB6A ;IF KEY DOWN
1474 ;KEY UP SO COUNT IT
1475 E874 AD F1 02 LDA KEYDEL ;KEY DELAY COUNTER
1476 E877 F0 03 BEQ SYVB6A ;IF COUNTED DOWN ALREADY
1477 E879 CE F1 02 DEC KEYDEL ;COUNT IT
1478 ; CHECK SOFTWARE REPEAT TIMER
1479 E87C AD 2B 02 SYVB6A: LDA SRTIMR
1480 E87F F0 17 BEQ SYSVB7 ;DOESN'T COUNT
1481 E881 AD 0F D2 LDA SKSTAT
1482 E884 29 04 AND #$04 ;CHECK KEY DOWN BIT
1483 E886 D0 60 BNE SYSVB6 ;BRANCH IF NO LONGER DOWN
1484 E888 CE 2B 02 DEC SRTIMR ;COUNT FRAME OF KEY DOWN
1485 E88B D0 0B BNE SYSVB7 ;BRANCH IF NOT RUN OUT
1486 ; TIMER RAN OUT - RESET AND SIMULATE KEYBOARD IRQ
1487 E88D A9 06 LDA #SRTIM2 ;TIMER VALUE
1488 E88F 8D 2B 02 STA SRTIMR ;SET TIMER
1489 E892 AD 09 D2 LDA KBCODE ;GET THE KEY
1490 E895 8D FC 02 STA CH ;PUT INTO CH
1491 ; READ GAME CONTROLLERS
1492 E898 A0 01 SYSVB7: LDY #1
1493 E89A A2 03 LDX #3
1494 E89C B9 00 D3 STLOOP: LDA PORTA,Y
1495 E89F 4A LSR A
1496 E8A0 4A LSR A
1497 E8A1 4A LSR A
1498 E8A2 4A LSR A
1499 E8A3 9D 78 02 STA STICK0,X ;STORE JOYSTICK
1500 E8A6 CA DEX
1501 E8A7 B9 00 D3 LDA PORTA,Y
1502 E8AA 29 0F AND #$F
1503 E8AC 9D 78 02 STA STICK0,X ;STORE JOYSTICK
1504 E8AF CA DEX
1505 E8B0 88 DEY
1506 E8B1 10 E9 BPL STLOOP
1507 ;
1508 E8B3 A2 03 LDX #3
1509 E8B5 BD 10 D0 STRL: LDA TRIG0,X ;MOVE JOYSTICK TRIGGERS
1510 E8B8 9D 84 02 STA STRIG0,X
1511 E8BB BD 00 D2 LDA POT0,X ;MOVE POT VALUES
1512 E8BE 9D 70 02 STA PADDL0,X
1513 E8C1 BD 04 D2 LDA POT4,X
1514 E8C4 9D 74 02 STA PADDL4,X
1515 E8C7 CA DEX
1516 E8C8 10 EB BPL STRL
1517 E8CA 8D 0B D2 STA POTGO ;START POTS FOR NEXT TIME
1518 ;
1519 E8CD A2 06 LDX #6
1520 E8CF A0 03 LDY #3
1521 E8D1 B9 78 02 PTRLP: LDA STICK0,Y ;TRANSFER BITS FROM JOYSTICKS
1522 E8D4 4A LSR A ;TO PADDLE TRIGGERS
1523 E8D5 4A LSR A
1524 E8D6 4A LSR A
1525 E8D7 9D 7D 02 STA PTRIG1,X
1526 E8DA A9 00 LDA #0
1527 E8DC 2A ROL A
1528 E8DD 9D 7C 02 STA PTRIG0,X
1529 E8E0 CA DEX
1530 E8E1 CA DEX
1531 E8E2 88 DEY
1532 E8E3 10 EC BPL PTRLP
1533 ;
1534 E8E5 6C 24 02 JMP (VVBLKD) ;GO TO DEFERRED VBLANK ROUTINE
1535 00E8 SV7H = SYSVB7/256
1536 0098 SV7L = (-256)*SV7H+SYSVB7
1537 E8E8 A9 00 SYSVB6: LDA #0
1538 E8EA 8D 2B 02 STA SRTIMR ;ZERO TIMER
1539 E8ED F0 A9 BEQ SYSVB7 ;UNCOND
1540 E8EF 6C 26 02 JTIMR1: JMP (CDTMA1)
1541 E8F2 6C 28 02 JTIMR2: JMP (CDTMA2)
1542 ;
1543 ; SUBROUTINE TO DECREMENT A COUNTDOWN TIMER
1544 ; ENTRY X=OFFSET FROM TIMER 1
1545 ; EXIT A,P=ZERO IF WENT ZERO, FF OTHERWISE
1546 ;
1547 E8F5 BC 18 02 DCTIMR: LDY CDTMV1,X ;LO BYTE
1548 E8F8 D0 08 BNE DCTIM1 ;NONZERO, GO DEC IT
1549 E8FA BC 19 02 LDY CDTMV1+1,X ;SEE IF BOTH ZERO
1550 E8FD F0 10 BEQ DCTXF ;YES, EXIT NONZERO
1551 E8FF DE 19 02 DEC CDTMV1+1,X ;DEC HI BYTE
1552 E902 DE 18 02 DCTIM1: DEC CDTMV1,X ;DEC LO BYTE
1553 E905 D0 08 BNE DCTXF
1554 E907 BC 19 02 LDY CDTMV1+1,X
1555 E90A D0 03 BNE DCTXF
1556 E90C A9 00 LDA #0 ;WENT ZERO, RETURN ZERO
1557 E90E 60 RTS
1558 E90F A9 FF DCTXF: LDA #$FF ;RETURN NONZERO
1559 E911 60 RTS
1560 .PAGE
1561 ;
1562 ; SUBROUTINE TO SET VERTICAL BLANK VECTORS AND TIMERS
1563 ; ENTRY X=HI,Y=LO BYTE TO SET
1564 ; A= 1-5 TIMERS 1-5
1565 ; 6 IMM VBLANK
1566 ; 7 DEF VBLANK
1567 ;
1568 E912 0A SETVBL: ASL A ;MUL BY 2
1569 E913 8D 2D 02 STA INTEMP
1570 E916 A9 00 LDA #$00 ;DLIST OFF BUT VBLANK OFF***FOR NOW***
1571 E918 8D 0E D4 STA NMIEN
1572 E91B 8A TXA
1573 E91C AE 2D 02 LDX INTEMP
1574 E91F 9D 17 02 STA CDTMV1-1,X
1575 E922 98 TYA
1576 E923 9D 16 02 STA CDTMV1-2,X
1577 E926 A9 40 LDA #$40 ;DLIST OFF***FOR NOW***, VBLANK ON
1578 E928 8D 0E D4 STA NMIEN
1579 E92B 2C 0F D4 BIT NMIST ;SEE IF A VBLANK HAPPENED
1580 E92E 50 0D BVC SETVB1 ;IF NOT, GO EXIT
1581 ; SIMULATE VERTICAL BLANK NMI
1582 E930 A9 E9 LDA #SV1H
1583 E932 48 PHA ;PUSH PC ON STACK AS IF INTERRUPT
1584 E933 A9 3D LDA #SV1L
1585 E935 48 PHA
1586 E936 08 PHP ;DUMMY P
1587 E937 48 PHA ;DUMMY A
1588 E938 48 PHA ;DUMMY X
1589 E939 48 PHA ;DUMMY Y
1590 E93A 6C 22 02 JMP (VVBLKI) ;GO THRU VBLANK VECTOR
1591 E93D 60 SETVB1: RTS
1592 00E9 SV1H = SETVB1/256
1593 003D SV1L = (-256)*SV1H+SETVB1
1594 ;
1595 ; EXIT FROM VERTICAL BLANK
1596 ;
1597 E93E 68 XITVBL: PLA ;UNSTACK Y
1598 E93F A8 TAY
1599 E940 68 PLA ;UNSTACK X
1600 E941 AA TAX
1601 E942 68 PLA ;UNSTACK A
1602 E943 40 RTI ;AND GO BACK FROM WHENCE.
1603 00E6 PIRQH = PIRQ/256
1604 00F3 PIRQL = (-256)*PIRQH+PIRQ
1605 00E7 PNMIH = PNMI/256
1606 00B4 PNMIL = (-256)*PNMIH+PNMI
1607 ;SPARE BYTE OR MODULE TOO LONG FLAG
1608 E944 CRNTP2 =*
1609 *=$14
1610 0014 00 INTSPR: .BYTE SIOORG-CRNTP2 ;^GINTHV IS TOO LONG
1611
1612 .TITLE 'SIO ( SERIAL BUS INPUT/OUTPUT CONTROLLER )'
1613 ; COLLEEN OPERATING SYSTEM
1614 ;
1615 ; SIO ( SERIAL BUS INPUT/OUTPUT CONTROLLER )
1616 ; WITH SOFTWARE BAUD RATE CORRECTION ON CASSETTE
1617 ;
1618 ;
1619 ; AL MILLER 3-APR-79
1620 ;
1621 ;
1622 ;THIS MODULE HAS ONE ENTRY POINT. IT IS CALLED BY THE DEVICE
1623 ;HANDLERS. IT INTERPRETS A PREVIOUSLY ESTABLISHED DEVICE CONTROL
1624 ;BLOCK (STORED IN GLOBAL RAM) TO ISSUE COMMANDS
1625 ;TO THE SERIAL BUS TO CONTROL TRANSMITTING AND RECEIVING DATA.
1626 ;
1627 ;
1628 ;
1629 ;
1630 .PAGE
1631 ;EQUATES
1632 ;
1633 ;DCD DEVICE BUS ID NUMBERS
1634 0030 FLOPPY = $30
1635 ;PRINTR = $40
1636 ;CASSET = $60 ;!!!!! *****
1637 0060 CASET = $60 ;!!!!! *****
1638 ;
1639 ;
1640 ;BUS COMMANDS
1641 ;
1642 0052 READ = 'R
1643 0057 WRITE = 'W
1644 ;STATIS = 'S
1645 ;FORMAT = '!
1646 ;
1647 ;
1648 ;COMMAND AUX BYTES
1649 ;
1650 0053 SIDWAY = 'S ;PRINT 16 CHARACTERS SIDEWAYS
1651 004E NORMAL = 'N ;PRINT 40 CHARACTERS NORMALLY
1652 0044 DOUBLE = 'D ;PRINT 20 CHARACTERS DOUBLE WIDE
1653 0050 PLOT = 'P ;PLOT MODE
1654 ;
1655 ;
1656 ;BUS RESPONSES
1657 ;
1658 0041 ACK = 'A ;DEVICE ACKNOWLEDGES INFORMATION
1659 004E NACK = 'N ;DEVICE DID NOT UNDERSTAND
1660 0043 COMPLT = 'C ;DEVICE SUCCESSFULLY COMPLETED OPERATION
1661 0045 ERROR = 'E ;DEVICE INCURRED AN ERROR IN AN ATTEMPTED OPERATION
1662 ;
1663 ;
1664 ;MISCELLANEOUS EQUATES
1665 ;
1666 0028 B192LO = $28 ;19200 BAUD RATE POKEY COUNTER VALUES (LO BYTE)
1667 0000 B192HI = $00 ;(HI BYTE)
1668 00CC B600LO = $CC ;600 BAUD (LO BYTE)
1669 0005 B600HI = $05 ;(HI BYTE)
1670 0005 HITONE = $05 ;FSK HI FREQ POKEY COUNTE VALUE (5326 HZ)
1671 0007 LOTONE = $07 ;FSK LO FREQ POKEY COUNTER VALUE (3995 HZ)
1672 ;
1673 00B4 WIRGLO = 180 ;WRITE INTER RECORD GAP (IN 1/60 SEC)
1674 0000 WIRGHI = 0
1675 0078 RIRGLO = 120 ;READ INTER RECORD GAP (IN 1/60 SEC)
1676 0000 RIRGHI = 0
1677 000F WSIRG = 15 ;SHORT WRITE INTER RECORD GAP
1678 000A RSIRG = 10 ;SHORT READ INTER RECORD GAP
1679 ;
1680 0034 NCOMLO = $34 ;PIA COMMAND TO LOWER NOT COMMAND LINE
1681 003C NCOMHI = $3C ;PIA COMMAND TO RAISE NOT COMMAND LINE
1682 0034 MOTRGO = $34 ;PIA COMMAND TO TURN ON CASSETTE MOTOR
1683 003C MOTRST = $3C ;PIA COMMAND TO TURN OFF MOTOR
1684 ;
1685 0002 TEMPHI = TEMP/256 ;ADDRESS OF TEMP CELL (HI BYTE)
1686 003E TEMPLO = (-256)*TEMPHI+TEMP ;(LO BYTE)
1687 0002 CBUFHI = CDEVIC/256 ;ADDRESS OF COMMAND BUFFER (HI BYTE)
1688 003A CBUFLO = (-256)*CBUFHI+CDEVIC ;(LO BYTE)
1689 ;
1690 000D CRETRI = 13 ;NUMBER OF COMMAND FRAME RETRIES
1691 0001 DRETRI = 1 ;NUMBER OF DEVICE RETRIES
1692 0002 CTIMLO = 2 ;COMMAND FRAME ACK TIME OUT (LO BYTE)
1693 0000 CTIMHI = 0 ;COMMAND FRAME ACK TIME OUT (HI BYTE)
1694 ;
1695 ;
1696 ;JTADRH = JTIMER/256 HI BYTE OF JUMP TIMER ROUTINE ADDR
1697 ; MOVED TO LINE 1427
1698 ;JTADRL = (-256)*JTADRH+JTIMER "MOVED TO LINE 1428"
1699 ;
1700 .PAGE
1701 ; SIO
1702 ;
1703 ;
1704 *=SIOV
1705 E459 4C 59 E9 JMP SIO ;SIO ENTRY POINT
1706 ;
1707 *=SIOINV
1708 E465 4C 44 E9 JMP SIOINT ;SIO INITIALIZATION ENTRY POINT
1709 ;
1710 *=SENDEV
1711 E468 4C F6 EB JMP SENDEN ;SEND ENABLE ENTRY POINT
1712 ;
1713 *=VCTABL-INTABS+VSERIN
1714 ;
1715 E48A 11 EB .WORD ISRSIR ;VSERIN
1716 E48C 90 EA .WORD ISRODN ;VSEROR
1717 E48E D1 EA .WORD ISRTD ;VSEROC
1718 ;
1719 ;
1720 ;
1721 *=SIOORG
1722 ;
1723 ;SIO INITIALIZATION SUBROUTINE
1724 ;
1725 E944 A9 3C SIOINT: LDA #MOTRST
1726 E946 8D 02 D3 STA PACTL ;TURN OFF MOTOR
1727 ;
1728 E949 A9 3C LDA #NCOMHI
1729 E94B 8D 03 D3 STA PBCTL ;RAISE NOT COMMAND LINE
1730 ;
1731 ;
1732 E94E A9 03 LDA #3
1733 E950 8D 32 02 STA SSKCTL ;GET POKEY OUT OF INITIALIZE MODE
1734 E953 85 41 STA SOUNDR ;INIT POKE ADDRESS FOR QUIET I/O
1735 E955 8D 0F D2 STA SKCTL
1736 ;
1737 ;
1738 E958 60 RTS ;RETURN
1739 ;
1740 ;
1741 ;
1742 ;
1743 ;
1744 ;
1745 E959 BA SIO: TSX
1746 E95A 8E 18 03 STX STACKP ;SAVE STACK POINTER
1747 E95D A9 01 LDA #1
1748 E95F 85 42 STA CRITIC
1749 ;
1750 E961 AD 00 03 LDA DDEVIC
1751 E964 C9 60 CMP #CASET
1752 E966 D0 03 BNE NOTCST ;BRANCH IF NOT CASSETTE
1753 E968 4C 84 EB JMP CASENT ;OTHERWISE JUMP TO CASSETTE ENTER
1754 ;
1755 ;ALL DEVICES EXCEPT CASSETTE ARE INTELLIGENT
1756 ;
1757 E96B A9 00 NOTCST: LDA #0
1758 E96D 8D 0F 03 STA CASFLG ;INIT CASSETTE FLAG TO NO CASSETTE
1759 ;
1760 E970 A9 01 LDA #DRETRI ;SET NUMBER OF DEVICE RETRIES
1761 E972 85 37 STA DRETRY
1762 E974 A9 0D COMMND: LDA #CRETRI ;SET NUMBER OF COMMAND FRAME RETRIES
1763 E976 85 36 STA CRETRY
1764 ;
1765 ;SEND A COMMAND FRAME
1766 ;
1767 E978 A9 28 COMFRM: LDA #B192LO ;SET BAUD RATE TO 19200
1768 E97A 8D 04 D2 STA AUDF3
1769 E97D A9 00 LDA #B192HI
1770 E97F 8D 06 D2 STA AUDF4
1771 ;
1772 E982 18 CLC ;SET UP COMMAND BUFFER
1773 E983 AD 00 03 LDA DDEVIC
1774 E986 6D 01 03 ADC DUNIT
1775 E989 69 FF ADC #$FF ;SUBTRACT 1
1776 E98B 8D 3A 02 STA CDEVIC ;SET BUS ID NUMBER
1777 ;
1778 E98E AD 02 03 LDA DCOMND
1779 E991 8D 3B 02 STA CCOMND ;SET BUS COMMAND
1780 ;
1781 E994 AD 0A 03 LDA DAUX1 ;STORE COMMAND FRAME AUX BYTES 1 AND 2
1782 E997 8D 3C 02 STA CAUX1
1783 E99A AD 0B 03 LDA DAUX2
1784 E99D 8D 3D 02 STA CAUX2 ;DONE SETTING UP COMMAND BUFFER
1785 ;
1786 E9A0 18 CLC ;SET BUFFER POINTER TO COMMAND FRAME BUFFER
1787 E9A1 A9 3A LDA #CBUFLO
1788 E9A3 85 32 STA BUFRLO ;AND BUFFER END ADDRESS
1789 E9A5 69 04 ADC #4
1790 E9A7 85 34 STA BFENLO
1791 E9A9 A9 02 LDA #CBUFHI
1792 E9AB 85 33 STA BUFRHI
1793 E9AD 85 35 STA BFENHI ;DONE SETTING UP BUFFER POINTER
1794 ;
1795 E9AF A9 34 LDA #NCOMLO ;LOWER NOT COMMAND LINE
1796 E9B1 8D 03 D3 STA PBCTL
1797 ;
1798 E9B4 20 8E EC JSR SENDIN ;SEND THE COMMAND FRAME TO A SMART DEVICE
1799 ;
1800 E9B7 AD 3F 02 LDA ERRFLG
1801 E9BA D0 03 BNE BADCOM ;BRANCH IF AN ERROR RECEIVED
1802 ;
1803 E9BC 98 TYA
1804 E9BD D0 07 BNE ACKREC ;BRANCH IF ACK RECEIVED
1805 ;
1806 ;
1807 E9BF C6 36 BADCOM: DEC CRETRY ;A NACK OR TIME OUT OCCURED
1808 E9C1 10 B5 BPL COMFRM ;SO BRANCH IF ANY RETRIES LEFT
1809 ;
1810 E9C3 4C 06 EA JMP DERR1 ;OTHERWISE, JUMP TO RETURN SECTION
1811 ;
1812 ;
1813 E9C6 AD 03 03 ACKREC: LDA DSTATS ;ACK WAS RECEIVED
1814 E9C9 10 0C BPL WATCOM ;BRANCH TO WAIT FOR COMPLETE ,
1815 ; IF THERE IS NO DATA TO BE SENT
1816 ;
1817 ;
1818 ;
1819 ;SEND A DATA FRAME TO PERIPHERAL
1820 ;
1821 E9CB A9 0D LDA #CRETRI ;SET NUMBER OF RETRIES
1822 E9CD 85 36 STA CRETRY
1823 ;
1824 E9CF 20 6E EB JSR LDPNTR ;LOAD BUFFER POINTER WITH DCB INFORMATION
1825 ;
1826 E9D2 20 8E EC JSR SENDIN ;GO SEND THE DATA FRAME TO A SMART DEVICE
1827 ;
1828 E9D5 F0 E8 BEQ BADCOM ;BRANCH IF BAD
1829 ;
1830 ;
1831 ;
1832 ;WAIT FOR COMPLETE SIGNAL FROM PERIPHERAL
1833 ;
1834 E9D7 20 79 EC WATCOM: JSR STTMOT ;SET DDEVICE TIME OUT VALUES IN Y,X
1835 ;
1836 E9DA A9 00 LDA #$00
1837 E9DC 8D 3F 02 STA ERRFLG ;CLEAR ERROR FLAG
1838 ;
1839 E9DF 20 9F EC JSR WAITER ;SET UP TIMER AND WAIT
1840 E9E2 F0 12 BEQ DERR ;BRANCH IF TIME OUT
1841 ;
1842 ;
1843 ;DEVICE DID NOT TIME OUT
1844 ;
1845 E9E4 2C 03 03 BIT DSTATS
1846 E9E7 70 07 BVS MODATA ;BRANCH IF MORE DATA FOLLOWS
1847 ;
1848 E9E9 AD 3F 02 LDA ERRFLG
1849 E9EC D0 18 BNE DERR1 ;BRANCH IF AN ERROR OCCURRED
1850 E9EE F0 1D BEQ RETURN ;OTHERWISE RETURN
1851 ;
1852 ;
1853 ;
1854 ;
1855 ;RECEIVE A DATA FRAME FROM PERIPHERAL
1856 ;
1857 E9F0 20 6E EB MODATA: JSR LDPNTR ;LOAD BUFFER POINTER WITH DCB INFORMATION
1858 ;
1859 E9F3 20 E2 EA JSR RECEIV ;GO RECEIVE A DATA FRAME
1860 ;
1861 E9F6 AD 3F 02 DERR: LDA ERRFLG
1862 E9F9 F0 05 BEQ NOTERR ;BRANCH IF NO ERROR PRECEEDED DATA
1863 ;
1864 E9FB AD 19 03 LDA TSTAT ;GET TEMP STATUS
1865 E9FE 85 30 STA STATUS ;STORE IN REAL STATUS
1866 ;
1867 ;
1868 EA00 A5 30 NOTERR: LDA STATUS
1869 EA02 C9 01 CMP #SUCCES
1870 EA04 F0 07 BEQ RETURN ;BRANCH IF COMPLETELY SUCCESSFUL
1871 ;
1872 EA06 C6 37 DERR1: DEC DRETRY
1873 EA08 30 03 BMI RETURN ;BRANCH IF OUT OF DEVICE RETRIES
1874 ;
1875 EA0A 4C 74 E9 JMP COMMND ;OTHERWISE, ONE MORE TIME
1876 ;
1877 ;
1878 ;
1879 ;
1880 EA0D 20 63 EC RETURN: JSR SENDDS ;DISABLE POKEY INTERRUPTS
1881 EA10 A9 00 LDA #0
1882 EA12 85 42 STA CRITIC
1883 EA14 A4 30 LDY STATUS ;RETURN STATUS IN Y
1884 EA16 8C 03 03 STY DSTATS ;AND THE DCB STATUS WORD
1885 EA19 60 RTS RETURN
1886 ;
1887 ;
1888 ;
1889 ;
1890 ;WAIT SUBROUTINE
1891 ;
1892 ;WAITS FOR COMPLETE OR ACK
1893 ;RETURNS Y=$FF IF SUCCESSFUL, Y=$00 IF NOT
1894 ;
1895 EA1A A9 00 WAIT: LDA #$00
1896 EA1C 8D 3F 02 STA ERRFLG ;CLEAR ERROR FLAG
1897 ;
1898 EA1F 18 CLC ;LOAD BUFFER POINTER WITH ADDRESS
1899 EA20 A9 3E LDA #TEMPLO ;OF TEMPORARY RAM CELL
1900 EA22 85 32 STA BUFRLO
1901 EA24 69 01 ADC #1
1902 EA26 85 34 STA BFENLO ;ALSO SET BUFFER END +1 ADDRESS
1903 EA28 A9 02 LDA #TEMPHI
1904 EA2A 85 33 STA BUFRHI
1905 EA2C 85 35 STA BFENHI ;DONE LOADING POINTER
1906 ;
1907 EA2E A9 FF LDA #$FF
1908 EA30 85 3C STA NOCKSM ;SET NO CHECKSUM FOLLOWS DATA FLAG
1909 ;
1910 EA32 20 E2 EA JSR RECEIV ;GO RECEIVE A BYTE
1911 ;
1912 EA35 A0 FF LDY #$FF ;ASSUME SUCCESS
1913 EA37 A5 30 LDA STATUS
1914 EA39 C9 01 CMP #SUCCES
1915 EA3B D0 19 BNE NWOK ;BRANCH IF IT DID NOT WORK OK
1916 ;
1917 ;
1918 ;
1919 ;
1920 EA3D AD 3E 02 WOK: LDA TEMP ;MAKE SURE THE BYTE SUCCESSFULLY RECEIVED
1921 EA40 C9 41 CMP #ACK ;WAS ACTUALLY AN ACK OR COMPLETE
1922 EA42 F0 21 BEQ GOOD
1923 EA44 C9 43 CMP #COMPLT
1924 EA46 F0 1D BEQ GOOD
1925 ;
1926 EA48 C9 45 CMP #ERROR
1927 EA4A D0 06 BNE NOTDER ;BRANCH IF DEVICE DID NOT SEND BACK
1928 ;A DEVICE ERROR CODE
1929 EA4C A9 90 LDA #DERROR
1930 EA4E 85 30 STA STATUS ;SET DEVICE ERROR STATUS
1931 EA50 D0 04 BNE NWOK
1932 ;
1933 EA52 A9 8B NOTDER: LDA #DNACK ;OTHERWISE SET NACK STATUS
1934 EA54 85 30 STA STATUS
1935 ;
1936 EA56 A5 30 NWOK: LDA STATUS
1937 EA58 C9 8A CMP #TIMOUT
1938 EA5A F0 07 BEQ BAD ;BRANCH IF TIME OUT
1939 ;
1940 EA5C A9 FF LDA #$FF
1941 EA5E 8D 3F 02 STA ERRFLG ;SET SOME ERROR FLAG
1942 EA61 D0 02 BNE GOOD ;RETURN WITH OUT SETTING Y = 0
1943 ;
1944 EA63 A0 00 BAD: LDY #0
1945 ;
1946 EA65 A5 30 GOOD: LDA STATUS
1947 EA67 8D 19 03 STA TSTAT
1948 EA6A 60 RTS ;RETURN
1949 ;
1950 ;
1951 ;
1952 ;
1953 ;
1954 ;SEND SUBROUTINE
1955 ;
1956 ;SENDS A BUFFER OF BYTES OUT OVER THE SERIAL BUS
1957 ;
1958 ;
1959 EA6B A9 01 SEND: LDA #SUCCES ;ASSUME SUCCESS
1960 EA6D 85 30 STA STATUS
1961 ;
1962 EA6F 20 F6 EB JSR SENDEN ;ENABLE SENDING
1963 ;
1964 EA72 A0 00 LDY #0
1965 EA74 84 31 STY CHKSUM ;CLEAR CHECK SUM
1966 EA76 84 3B STY CHKSNT ;CHECKSUM SENT FLAG
1967 EA78 84 3A STY XMTDON ;TRANSMISSION DONE FLAG
1968 ;
1969 ;
1970 EA7A B1 32 LDA (BUFRLO),Y ;PUT FIRST BYTE FROM BUFFER
1971 EA7C 8D 0D D2 STA SEROUT ;INTO THE SERIAL OUTPUT REGISTER
1972 ;
1973 ;
1974 EA7F 85 31 STA CHKSUM ;PUT IT IN CHECKSUM
1975 ;
1976 EA81 A5 11 NOTDON: LDA BRKKEY
1977 EA83 D0 03 BNE NTBRK0
1978 EA85 4C A4 ED JMP BROKE ;JUMP IF BREAK KEY PRESSED
1979 ;
1980 EA88 A5 3A NTBRK0: LDA XMTDON ;LOOP UNTIL TRANSMISSION IS DONE
1981 EA8A F0 F5 BEQ NOTDON
1982 ;
1983 EA8C 20 63 EC JSR SENDDS ;DISABLE SENDING
1984 ;
1985 EA8F 60 RTS ;RETURN
1986 ;
1987 ;
1988 ;
1989 ;
1990 ;
1991 ;
1992 ;OUTPUT DATA NEEDED INTERRUPT SERVICE ROUTINE
1993 ;
1994 EA90 98 ISRODN: TYA
1995 EA91 48 PHA ;SAVE Y REG ON STACK
1996 ;
1997 EA92 E6 32 INC BUFRLO ;INCREMENT BUFFER POINTER
1998 EA94 D0 02 BNE NOWRP0
1999 EA96 E6 33 INC BUFRHI
2000 ;
2001 EA98 A5 33 NOWRP0: LDA BUFRHI ;CHECK IF PAST END OF BUFFER
2002 EA9A C5 35 CMP BFENHI
2003 EA9C 90 22 BCC NOTEND
2004 EA9E A5 32 LDA BUFRLO
2005 EAA0 C5 34 CMP BFENLO
2006 EAA2 90 1C BCC NOTEND ;BRANCH IF NOT PAST END OF BUFFER
2007 ;
2008 EAA4 A5 3B LDA CHKSNT
2009 EAA6 D0 0B BNE RELONE ;BRANCH IF CHECKSUM ALREADY SENT
2010 ;
2011 EAA8 A5 31 LDA CHKSUM
2012 EAAA 8D 0D D2 STA SEROUT ;SEND CHECK SUM
2013 EAAD A9 FF LDA #$FF
2014 EAAF 85 3B STA CHKSNT ;SET CHECKSUM SENT FLAG
2015 EAB1 D0 09 BNE CHKDON
2016 ;
2017 EAB3 A5 10 RELONE: LDA POKMSK ;ENABLE TRANSMIT DONE INTERRUPT
2018 EAB5 09 08 ORA #$08
2019 EAB7 85 10 STA POKMSK
2020 EAB9 8D 0E D2 STA IRQEN
2021 ;
2022 EABC 68 CHKDON: PLA
2023 EABD A8 TAY ;RESTORE Y REG
2024 EABE 68 PLA ;RETURN FROM INTERRUPT
2025 EABF 40 RTI
2026 ;
2027 ;
2028 EAC0 A0 00 NOTEND: LDY #0
2029 EAC2 B1 32 LDA (BUFRLO),Y ;PUT NEXT BYTE FROM BUFFER
2030 EAC4 8D 0D D2 STA SEROUT ;INTO THE SERIAL OUTPUT REGISTER
2031 ;
2032 EAC7 18 CLC ;ADD IT TO CHECKSUM
2033 EAC8 65 31 ADC CHKSUM
2034 EACA 69 00 ADC #0
2035 EACC 85 31 STA CHKSUM
2036 ;
2037 EACE 4C BC EA JMP CHKDON ;GO RETURN
2038 ;
2039 ;
2040 ;
2041 ;
2042 ;
2043 ;
2044 ;TRANSMIT DONE INTERRUPT SERVICE ROUTINE
2045 ;
2046 EAD1 A5 3B ISRTD: LDA CHKSNT
2047 EAD3 F0 0B BEQ FOOEY ;BRANCH IF CHECKSUM NOT YET SENT
2048 ;
2049 EAD5 85 3A STA XMTDON ;OTHERWISE SET TRANSMISSION DONE FLAG
2050 ;
2051 EAD7 A5 10 LDA POKMSK ;DISABLE TRANSMIT DONE INTERRUPT
2052 EAD9 29 F7 AND #$F7
2053 EADB 85 10 STA POKMSK
2054 EADD 8D 0E D2 STA IRQEN
2055 ;
2056 EAE0 68 FOOEY: PLA ;RETURN FROM INTERRUPT
2057 EAE1 40 RTI
2058 ;
2059 ;
2060 ;
2061 ;
2062 ;
2063 ;
2064 ;
2065 ;
2066 ;RECEIVE SUBROUTINE
2067 ;
2068 EAE2 A9 00 RECEIV: LDA #0
2069 ;
2070 EAE4 AC 0F 03 LDY CASFLG
2071 EAE7 D0 02 BNE NOCLR ;BRANCH IF CASSETTE
2072 ;
2073 EAE9 85 31 STA CHKSUM ;CLEAR CHKSUM
2074 EAEB 85 38 NOCLR: STA BUFRFL ;BUFFER FULL FLAG
2075 EAED 85 39 STA RECVDN ;RECEIVE DONE FLAG
2076 ;
2077 ;
2078 ;
2079 EAEF A9 01 LDA #SUCCES
2080 EAF1 85 30 STA STATUS ;SET GOOD STATUS FOR DEFAULT CASE.
2081 EAF3 20 1F EC JSR RECVEN ;DO RECEIVE ENABLE
2082 EAF6 A9 3C LDA #NCOMHI ;COMMAND FRAME HI COMMAND
2083 EAF8 8D 03 D3 STA PBCTL ;STORE IN PIA
2084 EAFB A5 11 CHKTIM: LDA BRKKEY
2085 EAFD D0 03 BNE NTBRK1
2086 EAFF 4C A4 ED JMP BROKE ;JUMP IF BREAK KEY PRESSED
2087 ;
2088 EB02 AD 17 03 NTBRK1: LDA TIMFLG ;NO,
2089 EB05 F0 05 BEQ TOUT ;IF TIMEOUT, GO SET ERROR STATUS
2090 EB07 A5 39 LDA RECVDN
2091 EB09 F0 F0 BEQ CHKTIM ;DONE ?
2092 EB0B 60 GOBACK: RTS
2093 EB0C A9 8A TOUT: LDA #TIMOUT ;YES,
2094 EB0E 85 30 STA STATUS ;SET TIMEOUT STATUS
2095 ;
2096 ;
2097 ;
2098 ;
2099 ;
2100 ;
2101 EB10 60 RRETRN: RTS ;RETURN
2102 ;
2103 ;
2104 ;
2105 ;
2106 ;
2107 ;
2108 ;
2109 ;SERIAL INPUT READY INTERRUPT SERVICE ROUTINE
2110 ;
2111 EB11 98 ISRSIR: TYA
2112 EB12 48 PHA ;SAVE Y REG ON STACK
2113 ;
2114 ;
2115 ;
2116 EB13 AD 0F D2 LDA SKSTAT
2117 EB16 8D 0A D2 STA SKRES ;RESET STATUS REGISTER
2118 ;******** THIS MAY NOT BE THE PLACE TO DO IT *********
2119 ;
2120 EB19 30 04 BMI NTFRAM ;BRANCH IF NO FRAMING ERROR
2121 ;
2122 EB1B A0 8C LDY #FRMERR
2123 EB1D 84 30 STY STATUS ;SET FRAME ERRORR STATUS
2124 ;
2125 EB1F 29 20 NTFRAM: AND #$20
2126 EB21 D0 04 BNE NTOVRN ;BRANCH IF NO OVERRUN ERROR
2127 ;
2128 EB23 A0 8E LDY #OVRRUN
2129 EB25 84 30 STY STATUS ;SET OVERRUN ERROR STATUS
2130 ;
2131 EB27 A5 38 NTOVRN: LDA BUFRFL
2132 EB29 F0 13 BEQ NOTYET ;BRANCH IF BUFFER WAS NOT YET FILLED
2133 ;
2134 EB2B AD 0D D2 LDA SERIN ;THIS INPUT BYTE IS THE CHECKSUM
2135 EB2E C5 31 CMP CHKSUM
2136 EB30 F0 04 BEQ SRETRN ;BRANCH IF CHECKSUMS MATCH
2137 ;
2138 EB32 A0 8F LDY #CHKERR
2139 EB34 84 30 STY STATUS ;SET CHECKSUM ERROR STATUS
2140 ;
2141 EB36 A9 FF SRETRN: LDA #$FF ;SET RECEIVE DONE FLAG
2142 EB38 85 39 STA RECVDN
2143 ;
2144 EB3A 68 SUSUAL: PLA
2145 EB3B A8 TAY ;RESTORE Y REG
2146 EB3C 68 PLA ;RETURN FROM INTERRUPT
2147 EB3D 40 RTI
2148 ;
2149 ;
2150 ;
2151 EB3E AD 0D D2 NOTYET: LDA SERIN
2152 EB41 A0 00 LDY #0
2153 EB43 91 32 STA (BUFRLO),Y ;STORE INPUT REGISTER INTO BUFFER
2154 ;
2155 EB45 18 CLC ;ADD IT TO CHECKSUM
2156 EB46 65 31 ADC CHKSUM
2157 EB48 69 00 ADC #0
2158 EB4A 85 31 STA CHKSUM
2159 ;
2160 EB4C E6 32 INC BUFRLO ;INCREMENT BUFFER POINTER
2161 EB4E D0 02 BNE NTWRP1
2162 EB50 E6 33 INC BUFRHI
2163 ;
2164 EB52 A5 33 NTWRP1: LDA BUFRHI
2165 EB54 C5 35 CMP BFENHI
2166 EB56 90 E2 BCC SUSUAL
2167 EB58 A5 32 LDA BUFRLO
2168 EB5A C5 34 CMP BFENLO
2169 EB5C 90 DC BCC SUSUAL ;BRANCH IF NEW BUFFER ADDRESS IS IN BUFFER LIMITS
2170 ;
2171 EB5E A5 3C LDA NOCKSM
2172 EB60 F0 06 BEQ GOON ;BRANCH IF A CHECKSUM WILL FOLLOW DATA
2173 ;
2174 EB62 A9 00 LDA #0
2175 EB64 85 3C STA NOCKSM ;CLEAR NO CHECKSUM FLAG
2176 ;
2177 EB66 F0 CE BEQ SRETRN ;GO RETURN AND SET RECEIVE DONE FLAG
2178 ;
2179 ;
2180 EB68 A9 FF GOON: LDA #$FF
2181 EB6A 85 38 STA BUFRFL ;SET BUFFER FULL FLAG
2182 ;
2183 EB6C D0 CC BNE SUSUAL ;GO RETURN
2184 ;
2185 ;
2186 ;
2187 ;
2188 ;
2189 ;
2190 ;
2191 ;
2192 ;LOAD BUFFER POINTER SUBROUTINE
2193 ;
2194 ;LOAD BUFFER POINTER WITH DCB BUFFER INFORMATION
2195 ;
2196 EB6E 18 LDPNTR: CLC
2197 EB6F AD 04 03 LDA DBUFLO
2198 EB72 85 32 STA BUFRLO
2199 EB74 6D 08 03 ADC DBYTLO
2200 EB77 85 34 STA BFENLO ;ALSO SET BUFFER END + 1 ADDRESS
2201 ;
2202 EB79 AD 05 03 LDA DBUFHI
2203 EB7C 85 33 STA BUFRHI
2204 EB7E 6D 09 03 ADC DBYTHI
2205 EB81 85 35 STA BFENHI
2206 ;
2207 EB83 60 RTS ;RETURN
2208 ;
2209 ;
2210 ;
2211 ;
2212 ;
2213 ;
2214 ;
2215 ;
2216 ;CASSETTE HANDLING CODE
2217 ;
2218 EB84 AD 03 03 CASENT: LDA DSTATS
2219 EB87 10 2E BPL CASRED ;BRANCH IF INPUT FROM CASSETTE
2220 ;
2221 ;WRITE A RECORD
2222 ;
2223 EB89 A9 CC LDA #B600LO ;SET BAUD RATE TO 600
2224 EB8B 8D 04 D2 STA AUDF3
2225 EB8E A9 05 LDA #B600HI
2226 EB90 8D 06 D2 STA AUDF4
2227 ;
2228 EB93 20 F6 EB JSR SENDEN ;TURN ON POKEY MARK TONE
2229 ;
2230 EB96 A0 0F LDY #WSIRG ;LOAD SHORT WRITE INTER RECORD GAP TIME
2231 EB98 AD 0B 03 LDA DAUX2
2232 EB9B 30 02 BMI SRTIR0 ;BRANCH IF SHORT GAP IS DESIRED
2233 ;
2234 EB9D A0 B4 LDY #WIRGLO ;SET WRITE IRG TIME
2235 EB9F A2 00 SRTIR0: LDX #WIRGHI
2236 EBA1 20 BD ED JSR SETVBX
2237 ;
2238 EBA4 A9 34 LDA #MOTRGO
2239 EBA6 8D 02 D3 STA PACTL ;TURN ON MOTOR
2240 ;
2241 EBA9 AD 17 03 TIMIT: LDA TIMFLG ;LOOP UNTIL DONE
2242 EBAC D0 FB BNE TIMIT
2243 ;
2244 EBAE 20 6E EB JSR LDPNTR ;LOAD BUFFER POINTER WITH DCB INFORMATION
2245 ;
2246 EBB1 20 6B EA JSR SEND ;SEND A BUFFER
2247 ;
2248 EBB4 4C E3 EB JMP CRETRN ;GO RETURN
2249 ;
2250 ;
2251 ;
2252 ;RECEIVE A RECORD
2253 ;
2254 EBB7 A9 FF CASRED: LDA #$FF
2255 EBB9 8D 0F 03 STA CASFLG ;SET SET CASSETTE FLAG
2256 ;
2257 EBBC A0 0A LDY #RSIRG ;LOAD SHORT READ INTER RECORD GAP TIME
2258 EBBE AD 0B 03 LDA DAUX2
2259 EBC1 30 02 BMI SRTIR1 ;BRANCH IF SHORT GAP IS DESIRED
2260 ;
2261 EBC3 A0 78 LDY #RIRGLO ;SET TIME OUT FOR READ IRG
2262 EBC5 A2 00 SRTIR1: LDX #RIRGHI
2263 EBC7 20 BD ED JSR SETVBX
2264 ;
2265 EBCA A9 34 LDA #MOTRGO
2266 EBCC 8D 02 D3 STA PACTL ;TURN ON MOTOR
2267 ;
2268 EBCF AD 17 03 TIMIT1: LDA TIMFLG ;LOOP UNTIL DONE
2269 EBD2 D0 FB BNE TIMIT1
2270 ;
2271 EBD4 20 6E EB JSR LDPNTR ;LOAD BUFFER POINTER WITH DCB INFORMATION
2272 ;
2273 EBD7 20 79 EC JSR STTMOT ;SET DEVICE TIME OUT IN Y,X
2274 EBDA 20 BD ED JSR SETVBX
2275 ;
2276 EBDD 20 14 ED JSR BEGIN ;SET INITIAL BAUD RATE
2277 ;
2278 EBE0 20 E2 EA JSR RECEIV ;GO RECEIVE A BLOCK
2279 ;
2280 EBE3 AD 0B 03 CRETRN: LDA DAUX2
2281 EBE6 30 05 BMI SRTIR2 ;BRANCH IF DOING SHORT INTER RECORD GAPS
2282 ; DON'T TURN OFF CASSETTE MOTOR
2283 EBE8 A9 3C LDA #MOTRST
2284 EBEA 8D 02 D3 STA PACTL ;TURN OFF MOTOR
2285 ;
2286 EBED 4C 0D EA SRTIR2: JMP RETURN ;GO RETURN
2287 ;
2288 ;
2289 ;
2290 ;
2291 ;
2292 EBF0 A9 00 JTIMER: LDA #$00
2293 00EB JTADRH = JTIMER/256 ;HI BYTE OF JUMP TIMER ROUTINE ADDR
2294 00F0 JTADRL = (-256)*JTADRH+JTIMER
2295 EBF2 8D 17 03 STA TIMFLG ;SET TIME OUT FLAG
2296 EBF5 60 RTS
2297 ;
2298 ;
2299 ;
2300 ;
2301 ;
2302 ;
2303 ;SEND ENABLE SUBROUTINE
2304 ;
2305 EBF6 A9 07 SENDEN: LDA #$07 ;MASK OFF PREVIOUS SERIAL BUS CONTROL BITS
2306 EBF8 2D 32 02 AND SSKCTL
2307 EBFB 09 20 ORA #$20 ;SET TRANSMIT MODE
2308 ;
2309 EBFD AC 00 03 LDY DDEVIC
2310 EC00 C0 60 CPY #CASET
2311 EC02 D0 0C BNE NOTCAS ;BRANCH IF NOT CASSETTE
2312 ;
2313 EC04 09 08 ORA #$08 ;SET THE FSK OUTPUT BIT
2314 ;
2315 EC06 A0 07 LDY #LOTONE ;SET FSK TONE FREQUENCIES
2316 EC08 8C 02 D2 STY AUDF2
2317 EC0B A0 05 LDY #HITONE
2318 EC0D 8C 00 D2 STY AUDF1
2319 ;
2320 EC10 8D 32 02 NOTCAS: STA SSKCTL ;STORE NEW VALUE TO SYSTEM MASK
2321 EC13 8D 0F D2 STA SKCTL ;STORE TO ACTUAL REGISTER
2322 ;
2323 EC16 A9 C7 LDA #$C7 ;MASK OFF PREVIOUS SERIAL BUS INTERRUPT BITS
2324 EC18 25 10 AND POKMSK
2325 EC1A 09 10 ORA #$10 ;ENABLE OUTPUT DATA NEEDED INTERRUPT
2326 ;
2327 ;
2328 EC1C 4C 35 EC JMP CONTIN ;GO CONTINUE IN RECEIVE ENABLE SUBROUTINE
2329 ;
2330 ;
2331 ;
2332 ;
2333 ;
2334 ;
2335 ;
2336 ;
2337 ;
2338 ;
2339 ;RECEIVE ENABLE SUBROUTINE
2340 ;
2341 EC1F A9 07 RECVEN: LDA #$07 ;MASK OFF PREVIOUS SERIAL BUS CONTROL BITS
2342 EC21 2D 32 02 AND SSKCTL
2343 EC24 09 10 ORA #$10 ;SET RECEIVE MODE ASYNCH.
2344 EC26 8D 32 02 STA SSKCTL ;STORE NEW VALUE TO SYSTEM MASK
2345 EC29 8D 0F D2 STA SKCTL ;STORE TO ACTUAL REGISTER
2346 ;
2347 EC2C 8D 0A D2 STA SKRES ;RESET SERIAL PORT/KEYBOARD STATUS REGISTER
2348 ;
2349 EC2F A9 C7 LDA #$C7 ;MASK OFF PREVIOUS SERIAL BUS INTERRUPT BITS
2350 EC31 25 10 AND POKMSK
2351 EC33 09 20 ORA #$20 ;ENABLE RECEIVE INTERRUPT
2352 EC35 85 10 CONTIN: STA POKMSK ;STORE NEW VALUE TO SYSTEM MASK
2353 EC37 8D 0E D2 STA IRQEN ;STORE TO ACTUAL REGISTER
2354 ;
2355 ;
2356 EC3A A9 28 LDA #$28 ;CLOCK CH.3 WITH 1.79 MHZ
2357 EC3C 8D 08 D2 STA AUDCTL ;CLOCK CH.4 WITH CH. 3
2358 ;
2359 EC3F A2 06 LDX #6 ;SET PURE TONES, NO VOLUME
2360 EC41 A9 A8 LDA #$A8
2361 EC43 A4 41 LDY SOUNDR ;TEST QUIET I/O FLAG
2362 EC45 D0 02 BNE NOISE1 ;NE IS NORMAL (NOISY)
2363 EC47 A9 A0 LDA #$A0
2364 EC49 9D 01 D2 NOISE1: STA AUDC1,X
2365 EC4C CA DEX
2366 EC4D CA DEX
2367 EC4E 10 F9 BPL NOISE1
2368 ;
2369 EC50 A9 A0 LDA #$A0
2370 EC52 8D 05 D2 STA AUDC3 ;TURN OFF SOUND ON CHANNEL 3
2371 EC55 AC 00 03 LDY DDEVIC
2372 EC58 C0 60 CPY #CASET
2373 EC5A F0 06 BEQ CAS31 ;BRANCH IF CASSETTE IS DESIRED
2374 EC5C 8D 01 D2 STA AUDC1 ;OTHERWISE TURN OFF CHANNELS 1 AND 2
2375 EC5F 8D 03 D2 STA AUDC2
2376 ;
2377 ;
2378 EC62 60 CAS31: RTS ;RETURN
2379 ;
2380 ;
2381 ;
2382 ;
2383 ;
2384 ;
2385 ;
2386 ;
2387 ;
2388 ;
2389 ;DISABLE SEND AND DISABLE RECEIVE SUBROUTINES
2390 ;
2391 EC63 EA SENDDS: NOP
2392 EC64 A9 C7 RECVDS: LDA #$C7 ;MASK OFF SERIAL BUS INTERRUPTS
2393 EC66 25 10 AND POKMSK
2394 EC68 85 10 STA POKMSK ;STORE NEW VALUE TO SYSTEM MASK
2395 EC6A 8D 0E D2 STA IRQEN ;STORE TO ACTUAL REGISTER
2396 ;
2397 EC6D A2 06 LDX #6
2398 EC6F A9 00 LDA #0
2399 EC71 9D 01 D2 ZERIT: STA AUDC1,X
2400 EC74 CA DEX
2401 EC75 CA DEX
2402 EC76 10 F9 BPL ZERIT ;TURN OFF AUDIO VOLUME
2403 ;
2404 EC78 60 RTS ;RETURN
2405 ;
2406 ;
2407 ;
2408 ;
2409 ;
2410 ;
2411 ;
2412 ;
2413 ;
2414 ;
2415 ;SET DDEVICE TIME OUT VALUES IN Y,X SUBROUTINE
2416 ;
2417 EC79 AD 06 03 STTMOT: LDA DTIMLO ;GET DEVICE TIME OUT IN 1 SECOND INCR
2418 EC7C 6A ROR A ;PUT 6 HI BITS IN X, LO 2 BITS IN Y
2419 EC7D 6A ROR A
2420 EC7E A8 TAY ;TEMP SAVE
2421 EC7F 29 3F AND #$3F ;MASK OFF 2 HI BITS
2422 EC81 AA TAX ;THIS IS HI BYTE OF TIME OUT
2423 ;
2424 EC82 98 TYA ;RESTORE
2425 EC83 6A ROR A
2426 EC84 29 C0 AND #$C0 ;MASK OFF ALL BUT 2 HI BITS
2427 EC86 A8 TAY ;THIS IS LO BYTE OF TIME OUT
2428 ;
2429 EC87 60 RTS
2430 ;
2431 ;
2432 ;
2433 ;
2434 ;
2435 ;
2436 ;
2437 ;
2438 ;
2439 ;
2440 EC88 11 EB INTTBL: .WORD ISRSIR ;SERIAL INPUT READY
2441 EC8A 90 EA .WORD ISRODN ;OUTPUT DATA NEEDED
2442 EC8C D1 EA .WORD ISRTD ;TRANSMISSION DONE
2443 ;
2444 00EB SIRHI = ISRSIR/256 ;SERIAL INPUT READY ISR ADDRESS
2445 0011 SIRLO = (-256)*SIRHI+ISRSIR
2446 00EA ODNHI = ISRODN/256 ;OUTPUT DATA NEEDED ISR ADDRESS
2447 0090 ODNLO = (-256)*ODNHI+ISRODN
2448 00EA TDHI = ISRTD/256 ;TRANSMISSION DONE ISR ADDRESS
2449 00D1 TDLO = (-256)*TDHI+ISRTD
2450 ;
2451 ;
2452 ;
2453 ;
2454 ;SEND A DATA FRAME TO AN INTELLIGENT PERIPHERAL SUBROUTINE
2455 ;
2456 ;
2457 EC8E A2 01 SENDIN: LDX #$01
2458 EC90 A0 FF DELAY0: LDY #$FF
2459 EC92 88 DELAY1: DEY
2460 EC93 D0 FD BNE DELAY1
2461 EC95 CA DEX
2462 EC96 D0 F8 BNE DELAY0
2463 ;
2464 EC98 20 6B EA JSR SEND ;GO SEND THE DATA FRAME
2465 ;
2466 EC9B A0 02 LDY #CTIMLO ;SET ACK TIME OUT
2467 EC9D A2 00 LDX #CTIMHI
2468 EC9F 20 BD ED WAITER: JSR SETVBX
2469 ;
2470 ECA2 20 1A EA JSR WAIT ;WAIT FOR ACK
2471 ;
2472 ECA5 98 TYA ;IF Y=0, A TIME OUT OR NACK OCCURED
2473 ;
2474 ECA6 60 RTS ;RETURN
2475 ;
2476 ;
2477 ;
2478 ;
2479 ;
2480 ;
2481 ;
2482 ;
2483 ;
2484 ;
2485 ;
2486 ; COMPUTE VALUE FOR POKEY FREQ REGS FOR THE BAUD RATE AS
2487 ; MEASURED BY AN INTERVAL OF THE 'VCOUNT' TIMER.
2488 ;
2489 ECA7 8D 10 03 COMPUT: STA TIMER2
2490 ECAA 8C 11 03 STY TIMER2+1 ;SAVE FINAL TIMER VALUE
2491 ECAD 20 08 ED JSR ADJUST ;ADJUST VCOUNT VALUE
2492 ECB0 8D 10 03 STA TIMER2 ;SAVE ADJUSTED VALUE
2493 ECB3 AD 0C 03 LDA TIMER1
2494 ECB6 20 08 ED JSR ADJUST ;ADJUST
2495 ECB9 8D 0C 03 STA TIMER1 ;SAVE ADJUSTED TIMER1 VALUE
2496 ECBC AD 10 03 LDA TIMER2
2497 ECBF 38 SEC
2498 ECC0 ED 0C 03 SBC TIMER1
2499 ECC3 8D 12 03 STA TEMP1 ;FIND VCOUNT DIFFERENCE
2500 ECC6 AD 11 03 LDA TIMER2+1
2501 ECC9 38 SEC
2502 ECCA ED 0D 03 SBC TIMER1+1
2503 ECCD A8 TAY ;FIND VBLANK COUNT DIFFERENCE
2504 ECCE A9 7D LDA #-$83
2505 ECD0 18 HITIMR: CLC
2506 ECD1 69 83 ADC #$83 ;ACCUMULATE MULTIPLICATION
2507 ECD3 88 DEY
2508 ECD4 10 FA BPL HITIMR ;DONE?
2509 ECD6 18 CLC
2510 ECD7 6D 12 03 ADC TEMP1 ;TOTAL VCOUNT DIFFERENCE
2511 ECDA A8 FINDX: TAY ;SAVE ACCUM
2512 ECDB 4A LSR A
2513 ECDC 4A LSR A
2514 ECDD 4A LSR A
2515 ECDE 0A ASL A
2516 ECDF 38 SEC
2517 ECE0 E9 16 SBC #22 ;ADJUST TABLE INDEX
2518 ECE2 AA TAX ;DIVIDE INTERVAL BY 4 TO GET TABLE INDEX
2519 ECE3 98 TYA ;RESTORE ACCUM
2520 ECE4 29 07 AND #7
2521 ECE6 A8 TAY ;PULL OFF 3 LO BITS OF INTERVAL
2522 ECE7 A9 F5 LDA #-11
2523 ECE9 18 DOINTP: CLC
2524 ECEA 69 0B ADC #11 ;ACCUMULATE INTERPOLATION CONSTANT
2525 ECEC 88 DEY
2526 ECED 10 FA BPL DOINTP ;INTERPOLATION CONSTANT COMPUTATION DONE?
2527 ;
2528 ECEF A0 00 ENINTP: LDY #0
2529 ECF1 8C 0E 03 STY ADDCOR ;CLEAR ADDITION CORRECTION FLAG
2530 ECF4 38 SEC
2531 ECF5 E9 07 SBC #7 ;ADJUST INTERPOLATION CONSTANT
2532 ECF7 10 03 BPL PLUS
2533 ECF9 CE 0E 03 DEC ADDCOR
2534 ECFC 18 PLUS: CLC
2535 ECFD 7D D2 ED ADC POKTAB,X ;ADD CONSTANT TO LO BYTE TABLE VALUE
2536 ED00 A8 TAY ;LO BYTE POKEY FREQ VALUE
2537 ED01 AD 0E 03 LDA ADDCOR
2538 ED04 7D D3 ED ADC POKTAB+1,X ;ADD CARRY TO HI BYTE TABLE VALUE
2539 ; HI BYTE POKEY FREQ VALUE
2540 ED07 60 RTS
2541 ;
2542 ;
2543 ;
2544 ; ROUTINE TO ADJUST VCOUNT VALUE
2545 ;
2546 ED08 C9 7C ADJUST: CMP #$7C
2547 ED0A 30 04 BMI ADJ1 ;LARGER THAN '7C' ?
2548 ED0C 38 SEC ;YES,
2549 ED0D E9 7C SBC #$7C
2550 ED0F 60 RTS
2551 ED10 18 ADJ1: CLC
2552 ED11 69 07 ADC #$7
2553 ED13 60 RTS
2554 ;
2555 ;
2556 ;
2557 ;
2558 ;
2559 ;
2560 ;
2561 ; INITIAL BAUD RATE MEASUREMENT -- USED TO SET THE
2562 ; BAUD RATE AT THE START OF A RECORD.
2563 ;
2564 ; IT IS ASSUMED THAT THE FIRST TWO BYTES OF EVERY
2565 ; RECORD ARE 'AA' HEX.
2566 ;
2567 ED14 A5 11 BEGIN: LDA BRKKEY
2568 ED16 D0 03 BNE NTBRK2
2569 ED18 4C A4 ED JMP BROKE ;JUMP IF BREAK KEY PRESSED
2570 ;
2571 ED1B 78 NTBRK2: SEI
2572 ;
2573 ED1C AD 17 03 LDA TIMFLG
2574 ED1F D0 02 BNE OKTIM1 ;BRANCH IF NOT TIMED OUT
2575 ED21 F0 25 BEQ TOUT1 ;BRANCH IF TIME OUT
2576 ;
2577 ED23 AD 0F D2 OKTIM1: LDA SKSTAT
2578 ED26 29 10 AND #$10 ;READ SERIAL PORT
2579 ED28 D0 EA BNE BEGIN ;START BIT?
2580 ED2A 8D 16 03 STA SAVIO ;SAVE SER. DATA IN
2581 ED2D AE 0B D4 LDX VCOUNT ;READ VERTICAL LINE COUNTER
2582 ED30 A4 14 LDY RTCLOK+2 ;READ LO BYTE OF VBLANK CLOCK
2583 ED32 8E 0C 03 STX TIMER1
2584 ED35 8C 0D 03 STY TIMER1+1 ;SAVE INITIAL TIMER VALUE
2585 ;
2586 ED38 A2 01 LDX #1 ;SET MODE FLAG
2587 ED3A 8E 15 03 STX TEMP3
2588 ED3D A0 0A LDY #10 ;SET BIT COUNTER FOR 10 BITS
2589 ED3F A5 11 COUNT: LDA BRKKEY
2590 ED41 F0 61 BEQ BROKE ;BRANCH IF BREAK KEY PRESSED
2591 ;
2592 ED43 AD 17 03 LDA TIMFLG
2593 ED46 D0 04 BNE OKTIMR ;BRANCH IF NOT TIMED OUT
2594 ED48 58 TOUT1: CLI
2595 ED49 4C 0C EB JMP TOUT ;BRANCH IF TIME OUT
2596 ;
2597 ED4C AD 0F D2 OKTIMR: LDA SKSTAT
2598 ED4F 29 10 AND #$10 ;READ SERIAL PORT
2599 ED51 CD 16 03 CMP SAVIO ;DATA IN CHANGED YET?
2600 ED54 F0 E9 BEQ COUNT
2601 ED56 8D 16 03 STA SAVIO ;YES,SAVE SER. DATA IN
2602 ED59 88 DEY ;DECR. BIT COUNTER
2603 ED5A D0 E3 BNE COUNT ;DONE?
2604 ;
2605 ED5C CE 15 03 DEC TEMP3 ;YES,
2606 ED5F 30 12 BMI GOREAD ;DONE WITH BOTH MODES?
2607 ED61 AD 0B D4 LDA VCOUNT
2608 ED64 A4 14 LDY RTCLOK+2 ;READ TIMER LO & HI BYTES
2609 ED66 20 A7 EC JSR COMPUT ;NO, COMPUTE BAUD RATE
2610 ED69 8C EE 02 STY CBAUDL
2611 ED6C 8D EF 02 STA CBAUDH ;SET BAUD RATE INTO RAM CELLS
2612 ED6F A0 09 LDY #9 ;SET BIT COUNTER FOR 9 BITS
2613 ED71 D0 CC BNE COUNT
2614 ;
2615 ED73 AD EE 02 GOREAD: LDA CBAUDL
2616 ED76 8D 04 D2 STA AUDF3
2617 ED79 AD EF 02 LDA CBAUDH
2618 ED7C 8D 06 D2 STA AUDF4 ;SET POKEY FREQ REGS FOR BAUD RATE
2619 ED7F A9 00 LDA #0
2620 ED81 8D 0F D2 STA SKSTAT
2621 ED84 AD 32 02 LDA SSKCTL
2622 ED87 8D 0F D2 STA SKSTAT ;INIT. POKEY SERIAL PORT
2623 ED8A A9 55 LDA #$55
2624 ED8C 91 32 STA (BUFRLO),Y ;STORE '$55' AS FIRST RCV. BUFFER
2625 ED8E C8 INY
2626 ED8F 91 32 STA (BUFRLO),Y
2627 ED91 A9 AA LDA #$AA
2628 ED93 85 31 STA CHKSUM ;STORE CHECKSUM FOR 2 BYTES OF '$AA'
2629 ED95 18 CLC
2630 ED96 A5 32 LDA BUFRLO
2631 ED98 69 02 ADC #2
2632 ED9A 85 32 STA BUFRLO
2633 ED9C A5 33 LDA BUFRHI
2634 ED9E 69 00 ADC #0
2635 EDA0 85 33 STA BUFRHI ;INCR. BUFFER POINTER BY 1
2636 EDA2 58 CLI
2637 EDA3 60 RTS
2638 ;
2639 ;
2640 ;
2641 EDA4 20 63 EC BROKE: JSR SENDDS ;BREAK KEY WAS PRESSED, SO PREPARE
2642 EDA7 A9 3C LDA #MOTRST ;TO RETURN
2643 EDA9 8D 02 D3 STA PACTL ;TURN OFF MOTOR
2644 EDAC 8D 03 D3 STA PBCTL ;RAISE NOT COMMAND LINE
2645 ;
2646 EDAF A9 80 LDA #BRKABT
2647 EDB1 85 30 STA STATUS ;STORE BREAK ABORT STATUS CODE
2648 ;
2649 EDB3 AE 18 03 LDX STACKP
2650 EDB6 9A TXS ;RESTORE STACK POINTER
2651 ;
2652 EDB7 C6 11 DEC BRKKEY ;SET BREAK KEY FLAG TO NONZERO
2653 EDB9 58 CLI ;ALLOW IRQ'S
2654 ;
2655 EDBA 4C 0D EA JMP RETURN ;GO RETURN
2656 ;
2657 ;
2658 ;
2659 ;
2660 ;
2661 EDBD A9 F0 SETVBX: LDA #JTADRL ;STORE TIME OUT ROUTINE ADDRESS
2662 EDBF 8D 26 02 STA CDTMA1
2663 EDC2 A9 EB LDA #JTADRH
2664 EDC4 8D 27 02 STA CDTMA1+1
2665 ;
2666 EDC7 A9 01 LDA #1 ;SET FOR TIMER 1
2667 EDC9 8D 17 03 STA TIMFLG ;SET FLAG TO NOT TIMED OUT
2668 ;
2669 EDCC 78 SEI ;THE SETVBL ROUTINE NEEDS THIS TO CUT SHORT
2670 EDCD 20 5C E4 JSR SETVBV ;ANY VBLANKS THAT OCCUR
2671 EDD0 58 CLI
2672 EDD1 60 RTS
2673 ;
2674 ;
2675 ;
2676 ;
2677 ;
2678 ;
2679 ;
2680 ; 'VCOUNT' INTERVAL TIMER MEASUREMENT -- TO -- POKEY FREQ REG VALUE
2681 ; CONVERSION TABLE
2682 ;
2683 ;
2684 ; THE VALUES STORED IN THE TABLE ARE 'AUDF+7'.
2685 ;
2686 ; THE FOLLOWING FORMULAS WERE USED TO DETERMINE THE TABLE VALUES:
2687 ;
2688 ; F OUT= F IN/(2*(AUDF+M)) , WHERE F IN=1.78979 MHZ. & M=7
2689 ;
2690 ; FROM THIS WAS DERIVED THE FORMULA USED THE COMPUTE THE
2691 ; TABLE VALUES BASED ON A MEASUREMENT OF THE PERIOD BY
2692 ; AN INTERVAL OF THE 'VCOUNT' TIMER.
2693 ;
2694 ; AUDF+7=(11.365167)*T OUT, WHERE T OUT=# OF COUNTS (127 USEC.
2695 ; RESOLUTION) OF 'VCOUNT' FOR 1
2696 ; CHARACTER TIME (10 BIT TIMES).
2697 ;
2698 ;
2699 ;
2700 ;
2701 ; AUDF+7 ;BAUD RATE VCOUNT INTERVAL
2702 ; ------ ;----------- ----------------
2703 ; .WORD $27C ;1407 56
2704 ; .WORD $2D7 ;1231 64
2705 ; .WORD $332 ;1094 72
2706 ; .WORD $38D ;985 80
2707 EDD2 E8 03 POKTAB: .WORD $3E8 ;895 88
2708 EDD4 43 04 .WORD $443 ;820 96
2709 EDD6 9E 04 .WORD $49E ;757 104
2710 EDD8 F9 04 .WORD $4F9 ;703 112
2711 EDDA 54 05 .WORD $554 ;656 120
2712 EDDC AF 05 .WORD $5AF ;615 128
2713 EDDE 0A 06 .WORD $60A ;579 136
2714 EDE0 65 06 .WORD $665 ;547 144
2715 EDE2 C0 06 .WORD $6C0 ;518 152
2716 EDE4 1A 07 .WORD $71A ;492 160
2717 EDE6 75 07 .WORD $775 ;469 168
2718 EDE8 D0 07 .WORD $7D0 ;447 176
2719 ; .WORD $82B ;428 184
2720 ; .WORD $886 ;410 192
2721 ; .WORD $8E1 ;394 200
2722 ; .WORD $93C ;379 208
2723 ; .WORD $997 ;365 216
2724 ; .WORD $9F2 ;352 224
2725 ; .WORD $A4D ;339 232
2726 ; .WORD $AA8 ;328 240
2727 ; .WORD $B03 ;318 248
2728 ;
2729 ;
2730 ;
2731 ;
2732 ;************************************************************************
2733 EDEA CRNTP3 =*
2734 *=$14
2735 0014 00 SIOSPR: .BYTE DSKORG-CRNTP3 ;^GSIOL IS TOO LONG
2736
2737 .TITLE 'DISK ***** DISKP.SRC ***** 3/9/79 ***** 4:00:00 P.M.'
2738 ;
2739 ;
2740 ;
2741 ;
2742 ;
2743 ;
2744 0002 STATVH = DVSTAT/256
2745 00EA STATVL = (-256)*STATVH+DVSTAT ;STATUS POINTER
2746 ;
2747 ;
2748 ;
2749 ;
2750 ; CONSTANT EQUATES
2751 ;
2752 0031 DISKID = $31 ;SERIAL BUS DISK I.D.
2753 0050 PUTSEC = $50 ;DISK PUT SECTOR DCB COMMAND
2754 0053 STATC = $53 ;DISK STATUS DCB COMMAND
2755 0021 FOMAT = $21 ;DISK FORMAT DCB COMMAND !!!!! *****
2756 0000 NODAT = 0 ;SIO COMMAND FOR "NO DATA" OPERATION
2757 0040 GETDAT = $40 ;SIO COMMAND FOR "DATA FROM DEVICE"
2758 0080 PUTDAT = $80 ;SIO COMMAND FOR "DATA TO DEVICE"
2759 ;
2760 ;
2761 ; VECTORS
2762 ;
2763 *=$E450
2764 ;
2765 E450 4C EA ED JMP DINIT ;DISK INIT. VECTOR
2766 E453 4C F0 ED JMP DSKIF ;DISK INTERFACE ENTRY POINT
2767 ;
2768 ;
2769 ;
2770 ;
2771 ;
2772 ;
2773 ; CONSTANTS
2774 ;
2775 *=DSKORG
2776 ;
2777 ;
2778 ;
2779 ;
2780 ;
2781 ;
2782 ;
2783 ;
2784 ;
2785 ;***********************************************************************
2786 ; DISK INTERFACE ROUTINE STARTS HERE
2787 ;***********************************************************************
2788 ;
2789 ;
2790 ;
2791 ;
2792 ; DISK INTERFACE INITIALIZATION ROUTINE
2793 ;
2794 EDEA A9 A0 DINIT: LDA #160
2795 EDEC 8D 46 02 STA DSKTIM ;SET INITIAL DISK TIMEOUT TO 160 SEC
2796 EDEF 60 RTS
2797 ;
2798 ;
2799 ;
2800 ; DISK INTERFACE ENTRY POINT
2801 ;
2802 EDF0 A9 31 DSKIF: LDA #DISKID
2803 EDF2 8D 00 03 STA DDEVIC ;SET SERIAL BUS I.D IN DCB
2804 EDF5 AD 46 02 LDA DSKTIM
2805 EDF8 AE 02 03 LDX DCOMND
2806 EDFB E0 21 CPX #FOMAT ;IS COMMAND A FORMAT COMMAND?
2807 EDFD F0 02 BEQ PUTDTO
2808 EDFF A9 07 LDA #7 ;NO, SET TIMEOUT TO 7 SECS.
2809 EE01 8D 06 03 PUTDTO: STA DTIMLO ;PUT DISK TIMEOUT IN DCB
2810 EE04 A2 40 LDX #GETDAT ;SET "GET DATA" COMMAND FOR SIO
2811 EE06 A0 80 LDY #$80 ;SET BYTE COUNT TO 128
2812 EE08 AD 02 03 LDA DCOMND ;READ COMMAND IN DCB
2813 EE0B C9 57 CMP #WRITE ;IS COMMAND A "PUT SECTOR" COMMAND?
2814 EE0D D0 02 BNE CKSTC
2815 EE0F A2 80 LDX #PUTDAT ;YES, SET "PUT DATA" COMMAND FOR SIO
2816 EE11 C9 53 CKSTC: CMP #STATC ;IS COMMAND A STATUS COMMAND?
2817 EE13 D0 0C BNE PUTCNT
2818 EE15 A9 EA LDA #STATVL
2819 EE17 8D 04 03 STA DBUFLO
2820 EE1A A9 02 LDA #STATVH
2821 EE1C 8D 05 03 STA DBUFHI ;SET BUFFER ADDR TO GLOBAL STATUS BUFFER
2822 EE1F A0 04 LDY #4 ;YES, SET BYTE COUNT TO 4
2823 EE21 8E 03 03 PUTCNT: STX DSTATS ;PUT STATUS COMMAND FOR SIO IN DCB
2824 EE24 8C 08 03 STY DBYTLO
2825 EE27 A9 00 LDA #0
2826 EE29 8D 09 03 STA DBYTHI ;PUT BYTE COUNT IN DCB
2827 EE2C 20 59 E4 JSR SIOV ;CALL SERIAL I/O.
2828 EE2F 10 01 BPL GOODST ;NO ERROR
2829 EE31 60 RTS ;NO, GO BACK
2830 EE32 AD 02 03 GOODST: LDA DCOMND ;READ THE COMMAND
2831 EE35 C9 53 CMP #STATC ;WAS IT A STATUS COMMAND?
2832 EE37 D0 0A BNE PUTBC
2833 EE39 20 6D EE JSR PUTADR ;PUT BUFFER ADDR IN TEMP REG.
2834 EE3C A0 02 LDY #2
2835 EE3E B1 15 LDA (BUFADR),Y ;READ DISK TIMEOUT VALUE BYTE OF STATUS
2836 EE40 8D 46 02 STA DSKTIM ;PUT IT IN DISK TIMEOUT REG.
2837 EE43 AD 02 03 PUTBC: LDA DCOMND
2838 EE46 C9 21 CMP #FOMAT ;WAS COMMAND A FORMAT COMMAND?
2839 EE48 D0 1F BNE ENDDIF
2840 EE4A 20 6D EE FMTD: JSR PUTADR ;YES, PUT BUFFER ADDR INTO TEMP REG
2841 EE4D A0 FE LDY #$FE ;SET BUFFER POINTER
2842 EE4F C8 TWICE: INY
2843 EE50 C8 INY ;INCR BUFFER POINTER BY 2
2844 EE51 B1 15 RDBAD: LDA (BUFADR),Y ;READ LO BYTE BAD SECTOR DATA
2845 EE53 C9 FF CMP #$FF
2846 EE55 D0 F8 BNE TWICE ;IS IT "FF" ?
2847 EE57 C8 INY ;YES,
2848 EE58 B1 15 LDA (BUFADR),Y ;READ HI BYTE BAD SECTOR DATA
2849 EE5A C8 INY
2850 EE5B C9 FF CMP #$FF
2851 EE5D D0 F2 BNE RDBAD ;IS IT "FF" ?
2852 EE5F 88 DEY
2853 EE60 88 DEY ;YES,
2854 EE61 8C 08 03 STY DBYTLO ;PUT BAD SECTOR BYTE COUNT INTO DCB
2855 EE64 A9 00 LDA #0
2856 EE66 8D 09 03 STA DBYTHI
2857 EE69 AC 03 03 ENDDIF: LDY DSTATS
2858 EE6C 60 RTS
2859 ;
2860 ;
2861 ;
2862 ;
2863 ; S U B R O U T I N E S
2864 ;
2865 ;
2866 ; PUT BUFFER ADDR FROM DCB INTO TEMP REG
2867 ;
2868 EE6D AD 04 03 PUTADR: LDA DBUFLO
2869 EE70 85 15 STA BUFADR
2870 EE72 AD 05 03 LDA DBUFHI
2871 EE75 85 16 STA BUFADR+1 ;PUT BUFFER ADDR IN TEMP REG
2872 EE77 60 RTS
2873 ;****************************************************************
2874 ;
2875 ;
2876 ; SPARE BYTE OR MODULE TOO LONG FLAG
2877 ;
2878 EE78 CRNTP4 = *
2879 ;
2880 *=$14
2881 0014 00 DSKSPR: .BYTE PRNORG-CRNTP4 ;^GDISKP TOO LONG
2882 ;
2883 .PAGE
2884 .TITLE 'PRINTER ***** PRINTP.SRC ***** 3/9/79 ***** 4:00:00 P.M.'
2885 ;
2886 ;
2887 ;
2888 ;
2889 ;
2890 ;
2891 ;
2892 ;
2893 ;
2894 ;
2895 ;
2896 ; DEVICE NUMBER OR CODE EQUATES
2897 ;
2898 0002 OPNOUT = $2 ;IOCB OPEN FOR OUTPUT COMMAND
2899 0028 NBUFSZ = 40 ;PRINT NORMAL BUFFER SIZE
2900 0014 DBUFSZ = 20 ;PRINT DOUBLE BUFFFER SIZE
2901 001D SBUFSZ = 29 ;PRINT SIDEWAYS BUFFER SIZE
2902 0040 PDEVN = $40 ;PRINTER DEVICE NUMBER
2903 0057 WRITEC = $57 ;DCB WRITE COMMAND
2904 0020 SPACE = $20 ;ASCII SPACE CHAR.
2905 004E N = $4E ;ASCII "N" CHAR.
2906 0044 D = $44 ;ASCII "D" CHAR.
2907 0053 S = $53 ;ASCII "S" CHAR.
2908 ;
2909 ;
2910 ; PRINTER HANDLER ENTRY POINTS
2911 ;
2912 ;
2913 ;
2914 ;
2915 *=$E430
2916 ;
2917 E430 9E EE .WORD PHOPEN-1 ;PRINTER HANDLER OPEN
2918 E432 DB EE .WORD PHCLOS-1 ;PH CLOSE
2919 E434 9D EE .WORD BADST-1 ;PH READ
2920 E436 A6 EE .WORD PHWRIT-1 ;PH WRITE
2921 E438 80 EE .WORD PHSTAT-1 ;PH STATUS
2922 E43A 9D EE .WORD BADST-1 ;PH SPECIAL
2923 E43C 4C 78 EE JMP PHINIT ;PH INIT.
2924 E43F 00 .BYTE 0 ;ROM FILLER
2925 ;
2926 ;
2927 ;
2928 ;
2929 ;
2930 *=PRNORG
2931 ;
2932 ;
2933 ;
2934 ;
2935 ; PRINTER HANDLER INITIALIZATION ROUTINE
2936 ;
2937 EE78 A9 1E PHINIT: LDA #30
2938 EE7A 85 1C STA PTIMOT ;SET UP INITIAL PRINTER TIMEOUT OF 30 SEC.
2939 EE7C 60 RTS
2940 ;
2941 ;
2942 ; PRINTER HANDLER CONSTANTS
2943 ;
2944 EE7D EA 02 PHSTLO: .WORD DVSTAT ;STATUS BUFFER POINTER
2945 EE7F C0 03 PHCHLO: .WORD PRNBUF ;CHAR. BUFFER POINTER
2946 ;
2947 ;
2948 ;
2949 ; ************************
2950 ; PRINTER HANDLER ROUTINES
2951 ; ************************
2952 ;
2953 ;
2954 ;
2955 ;
2956 ;
2957 ; PRINTER HANDLER STATUS ROUTINE
2958 ;
2959 EE81 A9 04 PHSTAT: LDA #4
2960 EE83 85 1E STA PBUFSZ ;SET BUFFER SIZE TO 4 BYTES
2961 EE85 AE 7D EE LDX PHSTLO
2962 EE88 AC 7E EE LDY PHSTLO+1 ;SET POINTER TO STATUS BUFFER
2963 EE8B A9 53 LDA #STATC ;SET COMMAND TO "STATUS"
2964 EE8D 8D 02 03 STA DCOMND ;SET STATUS COMMAND
2965 EE90 8D 0A 03 STA DAUX1
2966 EE93 20 E6 EE JSR SETDCB ;GO SETUP DCB
2967 EE96 20 59 E4 JSR SIOV ;SEND STATUS COMMAND
2968 EE99 30 03 BMI BADST ;GO IF ERROR
2969 EE9B 20 14 EF JSR PHPUT ;YES,PUT STATUS INTO GLOBAL BUFFER.
2970 EE9E 60 BADST: RTS
2971 ;
2972 ;
2973 ;
2974 ;
2975 ; PRINTER HANDLER OPEN ROUTINE
2976 ;
2977 EE9F 20 81 EE PHOPEN: JSR PHSTAT ;DO STATUS COMMAND TO SIO
2978 EEA2 A9 00 LDA #0
2979 EEA4 85 1D STA PBPNT ;CLEAR PRINT BUFFER POINTER
2980 EEA6 60 RTS
2981 ;
2982 ;
2983 ;
2984 ;
2985 ; PRINTER HANDLER WRITE ROUTINE
2986 ;
2987 EEA7 85 1F PHWRIT: STA PTEMP ;SAVE ACCUM
2988 EEA9 20 1A EF JSR PRMODE ;GO DETERMINE PRINT MODE
2989 EEAC A6 1D LDX PBPNT
2990 EEAE A5 1F LDA PTEMP ;GET CHAR. SENT BY CIO
2991 EEB0 9D C0 03 STA PRNBUF,X ;PUT CHAR. IN PRINT BUFFER
2992 EEB3 E8 INX ;INCR. BUFFER POINTER
2993 EEB4 E4 1E CPX PBUFSZ ;BUFFER POINTER=BUFFER SIZE?
2994 EEB6 F0 13 BEQ BUFFUL
2995 EEB8 86 1D STX PBPNT ;SAVE BUFFER POINTER
2996 EEBA C9 9B CMP #CR ;IS CHAR. = EOL ?
2997 EEBC F0 03 BEQ BLFILL ;IF YES, GO DO BLANK FILL.
2998 EEBE A0 01 LDY #SUCCES ;PUT GOOD STATUS IN Y REG FOR CIO.
2999 EEC0 60 RTS
3000 EEC1 A9 20 BLFILL: LDA #SPACE ;PUT BLANK IN ACCUM.
3001 EEC3 9D C0 03 FILLBF: STA PRNBUF,X ;STORE IT IN PRINT BUFFER.
3002 EEC6 E8 INX
3003 EEC7 E4 1E CPX PBUFSZ
3004 EEC9 D0 F8 BNE FILLBF ;BUFFER BLANK FILLED?
3005 EECB A9 00 BUFFUL: LDA #0
3006 EECD 85 1D STA PBPNT ;CLEAR PRINT BUFFER POINTER
3007 EECF AE 7F EE LDX PHCHLO
3008 EED2 AC 80 EE LDY PHCHLO+1 ;SET POINTER TO PRINT BUFFER
3009 EED5 20 E6 EE JSR SETDCB ;GO SETUP DCB
3010 EED8 20 59 E4 JSR SIOV ;SEND PRINT COMMAND
3011 EEDB 60 RTS ;YES.
3012 ;
3013 ;
3014 ;
3015 ;
3016 ; PRINTER HANDLER CLOSE ROUTINE
3017 ;
3018 EEDC 20 1A EF PHCLOS: JSR PRMODE ;GO DETERMINE PRINT MODE
3019 EEDF A6 1D LDX PBPNT
3020 EEE1 D0 DE BNE BLFILL
3021 EEE3 A0 01 LDY #SUCCES
3022 EEE5 60 RTS
3023 ;
3024 ;
3025 ;
3026 ;
3027 ;
3028 ;
3029 ;
3030 ;
3031 ; S U B R O U T I N E S
3032 ;
3033 ;
3034 ;
3035 ;
3036 ;
3037 ; SET UP DCB TO CALL SIO
3038 ;
3039 EEE6 8E 04 03 SETDCB: STX DBUFLO
3040 EEE9 8C 05 03 STY DBUFHI ;SET BUFFER POINTER
3041 EEEC A9 40 LDA #PDEVN
3042 EEEE 8D 00 03 STA DDEVIC ;SET PRINTER BUS I.D. FOR DCB
3043 EEF1 A9 01 LDA #1
3044 EEF3 8D 01 03 STA DUNIT ;SET UNIT NUMBER TO 1
3045 EEF6 A9 80 LDA #$80 ;DEVICE WILL EXPECT DATA
3046 EEF8 AE 02 03 LDX DCOMND
3047 EEFB E0 53 CPX #STATC ;STATUS COMMAND?
3048 EEFD D0 02 BNE PSIOC
3049 EEFF A9 40 LDA #$40 ;EXPECT DATA FROM DEVICE
3050 EF01 8D 03 03 PSIOC: STA DSTATS ;SET SIO MODE COMMAND.
3051 EF04 A5 1E LDA PBUFSZ
3052 EF06 8D 08 03 STA DBYTLO ;SET LO BYTE COUNT
3053 EF09 A9 00 LDA #0
3054 EF0B 8D 09 03 STA DBYTHI ;SET HI BYTE COUNT
3055 EF0E A5 1C LDA PTIMOT
3056 EF10 8D 06 03 STA DTIMLO ;SET DEVICE TIMEOUT COUNT
3057 EF13 60 RTS
3058 ;
3059 ;
3060 ;
3061 ;
3062 ; GET DEVICE TIMEOUT FROM STATUS & SAVE IT
3063 ;
3064 EF14 AD EC 02 PHPUT: LDA DVSTAT+2
3065 EF17 85 1C STA PTIMOT ;SAVE DEVICE TIMEOUT
3066 EF19 60 RTS
3067 ;
3068 ;
3069 ;
3070 ;
3071 ;DETERMINE PRINT MODE & SETUP PRINT BUFFER SIZE, DCB PRINT
3072 ;COMMAND, & DCB AUX1 FOR PRINT MODE
3073 ;
3074 EF1A A0 57 PRMODE: LDY #WRITEC ;PUT WRITE COMMAND IN Y REG
3075 EF1C A5 2B LDA ICAX2Z ;READ PRINT MODE
3076 EF1E C9 4E CMODE: CMP #N
3077 EF20 D0 04 BNE CDUBL ;PRINT NORMAL ?
3078 EF22 A2 28 LDX #NBUFSZ ;YES, SET NORMAL CHAR. BUFFER SIZE
3079 EF24 D0 0E BNE SETBSZ
3080 EF26 C9 44 CDUBL: CMP #D
3081 EF28 D0 04 BNE CSIDE ;PRINT DOUBLE?
3082 EF2A A2 14 LDX #DBUFSZ ;YES, SET DOUBLE CHAR. BUFFER SIZE
3083 EF2C D0 06 BNE SETBSZ
3084 EF2E C9 53 CSIDE: CMP #S ;PRINT SIDEWAYS ?
3085 EF30 D0 0B BNE GOERR ;IF NOT, GO TO ERROR ROUTINE
3086 EF32 A2 1D LDX #SBUFSZ ;YES, SET SIDEWAYS BUFFER SIZE
3087 EF34 86 1E SETBSZ: STX PBUFSZ ;STORE PRINT BUFFER SIZE
3088 EF36 8C 02 03 STY DCOMND ;STORE DCB COMMAND
3089 EF39 8D 0A 03 STA DAUX1 ;STORE DCB AUX1 PRINT MODE
3090 EF3C 60 RTS
3091 EF3D A9 4E GOERR: LDA #N ;SET DEFAULT PRINT MODE TO NORMAL
3092 EF3F D0 DD BNE CMODE
3093 ;*************************************************************
3094 ;
3095 ;
3096 ; SPARE BYTE OR MODULE TOO LONG FLAG
3097 ;
3098 EF41 CRNTP5 = *
3099 ;
3100 *=$14
3101 ;
3102 0014 00 PRNSPR: .BYTE CASORG-CRNTP5 ;^GPRINTP TOO LONG
3103 ;
3104 .PAGE
3105 LIST S
3106 .TITLE 'CASSET HANDLER 3/12 (DK1:CASCV)'
3107 0003 CBUFH = CASBUF/256
3108 00FD CBUFL = (-256)*CBUFH+CASBUF
3109 0040 SRSTA = $40 ;SIO READ STATUS
3110 0080 SWSTA = $80 ;SIO WRITE STATUS
3111 ;
3112 ;
3113 00FC DTA = $FC ;DATA RECORD TYPE BYTE
3114 00FA DT1 = $FA ;LAST DATA RECORD
3115 00FE EOT = $FE ;END OF TAPE
3116 00FB HDR = $FB ;HEADER
3117 0002 TONE1 = 2 ;CHANGE TO RECORD MODE TONE
3118 0001 TONE2 = 1 ;PRESS PLAY TONE
3119 ;
3120 ;
3121 ;
3122 *=CASETV
3123 E440 4B EF 2A F0 .WORD OPENC-1,CLOSEC-1,GBYTE-1,PBYTE-1,STATU-1,SPECIAL-1
3124 E444 D5 EF 0F F0
3125 E448 27 F0 4A EF
3126 E44C 4C 41 EF JMP INIT
3127 E44F 00 .BYTE 0 ;ROM FILLER BYTE
3128 ;
3129 ;
3130 ;
3131 ; USED IN MONITP FOR CASSETTE BOOT
3132 ;
3133 *=RBLOKV
3134 E47A 4C E9 EF JMP RBLOK
3135 ;
3136 *=CSOPIV
3137 E47D 4C 5D EF JMP OPINP
3138 ;
3139 ;
3140 *=CASORG
3141 ;
3142 ;
3143 ; INIT ROUTINE
3144 ;
3145 EF41 A9 CC INIT: LDA #$CC
3146 EF43 8D EE 02 STA CBAUDL
3147 EF46 A9 05 LDA #$05
3148 EF48 8D EF 02 STA CBAUDH ;SET CASSET BAUD RATE TO 600
3149 EF4B 60 SPECIAL:RTS ;THATS ALL FOLKS
3150 .PAGE
3151 ;
3152 ; OPEN FUNCTION - WITH NO TIMING ADJUST
3153 ;
3154 EF4C A5 2B OPENC: LDA ICAX2Z ;GET AX2
3155 EF4E 85 3E STA FTYPE ;SAVE IT FOR FUTURE REFERENCE
3156 EF50 A5 2A LDA ICAX1Z
3157 EF52 29 0C AND #$0C ;IN AND OUT BITS
3158 EF54 C9 04 CMP #$04
3159 EF56 F0 05 BEQ OPINP
3160 EF58 C9 08 CMP #$08 ;SEE IF OPEN FOR OUTPUT
3161 EF5A F0 39 BEQ OPOUT
3162 EF5C 60 RTS ;IF ALREADY OPEN, RETURN LEAVING STATUS=$84
3163 EF5D A9 00 OPINP: LDA #0
3164 EF5F 8D 89 02 STA WMODE ;SET READ MODE
3165 EF62 85 3F STA FEOF ;NO EOF YET
3166 EF64 A9 01 SFH: LDA #TONE2 ;TONE FOR PRESS PLAY
3167 EF66 20 58 F0 JSR BEEP ;GO BEEP
3168 EF69 30 24 BMI OPNRTN ;IF ERROR DURING BEEP
3169 EF6B A9 34 LDA #MOTRGO
3170 EF6D 8D 02 D3 STA PACTL ;TURN MOTOR ON
3171 EF70 A0 40 LDY #$40 ;5-31-79 - 9 SEC READ LEADER
3172 EF72 A2 02 LDX #2
3173 EF74 A9 03 LDA #3
3174 EF76 8D 2A 02 STA CDTMF3
3175 EF79 20 5C E4 JSR SETVBV ;SET UP VBLANK TIMER
3176 EF7C AD 2A 02 WAITTM: LDA CDTMF3
3177 EF7F D0 FB BNE WAITTM ;WAIT FOR MOTOR TO COME UP TO SPEED
3178 EF81 A9 80 LDA #$80 ;NEXT BYTE=NO BYTES IN BUFFER
3179 EF83 85 3D STA BPTR
3180 EF85 8D 8A 02 STA BLIM
3181 EF88 4C D3 EF JMP OPOK ;OPEN OK
3182 ;
3183 ; OPEN FOR OUTPUT
3184 ;
3185 EF8B A0 80 PBRK: LDY #BRKABT ;BREAK KEY ABORT STATUS
3186 EF8D C6 11 DEC BRKKEY ;RESET BREAK KEY
3187 EF8F A9 00 OPNRTN: LDA #0 ;CLEAR WRITE MODE FLAG
3188 EF91 8D 89 02 STA WMODE
3189 EF94 60 RTS ;AND EXIT.
3190 ;
3191 EF95 A9 80 OPOUT: LDA #$80
3192 EF97 8D 89 02 STA WMODE ;SET WRITE MODE
3193 EF9A A9 02 LDA #TONE1 ;TELL USER TO TURN ON RECORD MODE
3194 EF9C 20 58 F0 JSR BEEP
3195 EF9F 30 EE BMI OPNRTN ;IF ERROR DURING BEEP
3196 EFA1 A9 CC LDA #$CC ;SET BAUD RATE
3197 EFA3 8D 04 D2 STA AUDF3 ;WHICH SEEMS TO BE NESSECARY
3198 EFA6 A9 05 LDA #$05 ;FOR SOME OBSCURE REASON
3199 EFA8 8D 06 D2 STA AUDF4
3200 EFAB A9 60 LDA #$60
3201 EFAD 8D 00 03 STA DDEVIC
3202 EFB0 20 68 E4 JSR SENDEV ;TELL POKEY TO WRITE MARKS
3203 EFB3 A9 34 LDA #MOTRGO ;WRITE 5 SEC BLANK TAPE
3204 EFB5 8D 02 D3 STA PACTL
3205 EFB8 A9 03 LDA #3
3206 EFBA A2 04 LDX #4 ;5/30/79 20 SEC LEADER
3207 EFBC A0 80 LDY #$80
3208 EFBE 20 5C E4 JSR SETVBV
3209 EFC1 A9 FF LDA #$FF
3210 EFC3 8D 2A 02 STA CDTMF3
3211 EFC6 A5 11 WDLR: LDA BRKKEY
3212 EFC8 F0 C1 BEQ PBRK ;IF BREAK DURING WRITE LEADER
3213 EFCA AD 2A 02 LDA CDTMF3
3214 EFCD D0 F7 BNE WDLR
3215 EFCF A9 00 LDA #0 ;INIT BUFFER POINTER
3216 EFD1 85 3D STA BPTR
3217 EFD3 A0 01 OPOK: LDY #SUCCES
3218 EFD5 60 RTS
3219 .PAGE
3220 ;
3221 ; GET BYTE
3222 ;
3223 EFD6 A5 3F GBYTE: LDA FEOF ;IF AT EOF ALREADY
3224 EFD8 30 33 BMI ISEOF ;RETURN EOF STATUS
3225 EFDA A6 3D LDX BPTR ;BUFFER POINTER
3226 EFDC EC 8A 02 CPX BLIM ;IF END OF BUFFER
3227 EFDF F0 08 BEQ RBLOK ;READ ANOTHER BLOCK
3228 EFE1 BD 00 04 LDA CASBUF+3,X ;GET NEXT BYTE
3229 EFE4 E6 3D INC BPTR ;BUMP POINTER
3230 EFE6 A0 01 LDY #SUCCES ;OK STATUS
3231 EFE8 60 GBX: RTS
3232 EFE9 A9 52 RBLOK: LDA #'R ;READ OPCODE
3233 EFEB 20 95 F0 JSR SIOSB ;SIO ON SYS BUF
3234 EFEE 98 TYA
3235 EFEF 30 F7 BMI GBX ;IF SIO ERRORS, RETURN
3236 EFF1 A9 00 LDA #0
3237 EFF3 85 3D STA BPTR ;RESET POINTER
3238 EFF5 A2 80 LDX #$80 ;DEFAULT # BYTES
3239 EFF7 AD FF 03 LDA CASBUF+2
3240 EFFA C9 FE CMP #EOT
3241 EFFC F0 0D BEQ ATEOF ;IF HEADER, GO READ AGAIN
3242 EFFE C9 FA CMP #DT1 ;IF LAST DATA REC
3243 F000 D0 03 BNE NLR
3244 F002 AE 7F 04 LDX CASBUF+130 ;LAST DATA RECORD, GET # BYTES
3245 F005 8E 8A 02 NLR: STX BLIM
3246 F008 4C D6 EF JMP GBYTE ;GET NEXT BYTE
3247 F00B C6 3F ATEOF: DEC FEOF ;SET FEOF
3248 F00D A0 88 ISEOF: LDY #EOFERR ;ENDFILE STATUS
3249 F00F 60 RTS
3250 .PAGE
3251 ;
3252 ; PUT BYTE TO BUFFER
3253 ;
3254 F010 A6 3D PBYTE: LDX BPTR ;BUFFER POINTER
3255 F012 9D 00 04 STA CASBUF+3,X ;STORE CHAR AWAY
3256 F015 E6 3D INC BPTR ;BUMP POINTER
3257 F017 A0 01 LDY #SUCCES ;OK STATUS
3258 F019 E0 7F CPX #127 ;IF BUFFER FULL
3259 F01B F0 01 BEQ *+3
3260 F01D 60 RTS
3261 ; WRITE OUT THE BUFFER
3262 F01E A9 FC LDA #DTA ;RECORD TYPE = DATA
3263 F020 20 D2 F0 JSR WSIOSB ;DO WRITE ON SYSTEM BUFFER
3264 F023 A9 00 LDA #0
3265 F025 85 3D STA BPTR ;RESET BUFFER POINTER
3266 F027 60 RTS ;EXIT.
3267 .PAGE
3268 ;
3269 ; STATUS - RETURN STATUS INFO THRU DVSTAT
3270 ;
3271 F028 A0 01 STATU: LDY #SUCCES
3272 F02A 60 RTS
3273 .PAGE
3274 ;
3275 ; CLOSE
3276 ;
3277 F02B AD 89 02 CLOSEC: LDA WMODE ;SEE IF WRITING
3278 F02E 30 08 BMI CLWRT ;GO CLOSE FOR WRITE
3279 ; CLOSE FOR READ - FLAG CLOSED
3280 F030 A0 01 LDY #SUCCES ;SUCCESSFULL
3281 F032 A9 3C FCAX: LDA #MOTRST ;STOP THE MOTOR IN CASE WAS SHORT IRG MODE
3282 F034 8D 02 D3 STA PACTL
3283 F037 60 RTS
3284 F038 A6 3D CLWRT: LDX BPTR ;BUFFER POINTER
3285 F03A F0 0A BEQ WTLR ;IF NO DATA BYTES IN BUFFER, NO DT1 REC
3286 F03C 8E 7F 04 STX CASBUF+130 ;WRITE TO LAST RECORD
3287 F03F A9 FA LDA #DT1 ;REC TYPE
3288 F041 20 D2 F0 JSR WSIOSB ;WRITE OUT USER BUFFER
3289 F044 30 EC BMI FCAX ;GO IF ERROR
3290 F046 A2 7F WTLR: LDX #127 ;ZERO BUFFER
3291 F048 A9 00 LDA #0
3292 F04A 9D 00 04 ZTBUF: STA CASBUF+3,X
3293 F04D CA DEX
3294 F04E 10 FA BPL ZTBUF
3295 F050 A9 FE LDA #EOT ;WRITE EOT RECORD
3296 F052 20 D2 F0 JSR WSIOSB
3297 F055 4C 32 F0 JMP FCAX ;FLAG CLOSED AND EXIT
3298 .PAGE
3299 ;
3300 ; SUBROUTINES
3301 ;
3302 ; BEEP - GENERATE TONE ON KEYBOARD SPEAKER
3303 ; ON ENTRY A= FREQ
3304 ;
3305 F058 85 40 BEEP: STA FREQ
3306 F05A A5 14 BEEP1: LDA RTCLOK+2 ;CURRENT CLOCK
3307 F05C 18 CLC
3308 F05D 69 1E ADC #30 ;1 SEC TONE
3309 F05F AA TAX
3310 F060 A9 FF WFL: LDA #$FF
3311 F062 8D 1F D0 STA CONSOL ;TURN ON SPEAKER
3312 F065 A9 00 LDA #0
3313 F067 A0 F0 LDY #$F0
3314 F069 88 DEY
3315 F06A D0 FD BNE *-1
3316 F06C 8D 1F D0 STA CONSOL ;TURN OFF SPEAKER
3317 F06F A0 F0 LDY #$F0
3318 F071 88 DEY
3319 F072 D0 FD BNE *-1
3320 F074 E4 14 CPX RTCLOK+2 ;SEE IF 1 SEC IS UP YET
3321 F076 D0 E8 BNE WFL
3322 F078 C6 40 DEC FREQ ;COUNT BEEPS
3323 F07A F0 0B BEQ WFAK ;IF ALL DONE GO WAIT FOR KEY
3324 F07C 8A TXA
3325 F07D 18 CLC
3326 F07E 69 0A ADC #10
3327 F080 AA TAX
3328 F081 E4 14 CPX RTCLOK+2
3329 F083 D0 FC BNE *-2
3330 F085 F0 D3 BEQ BEEP1 ;UNCOND GO BEEP AGIN
3331 F087 20 8C F0 WFAK: JSR WFAK1 ;USE SIMULATED "JMP (KGETCH)"
3332 F08A 98 TYA
3333 F08B 60 RTS
3334 F08C AD 25 E4 WFAK1: LDA KEYBDV+5
3335 F08F 48 PHA
3336 F090 AD 24 E4 LDA KEYBDV+4 ;SIMULATE "JMP (KGETCH)"
3337 F093 48 PHA
3338 F094 60 RTS
3339 ;
3340 ; SIOSB - CALL SIO ON SYSTEM BUFFER
3341 ;
3342 F095 8D 02 03 SIOSB: STA DCOMND ;SAVE COMMAND
3343 F098 A9 00 LDA #0
3344 F09A 8D 09 03 STA DBYTHI ;SET BUFFER LENGTH
3345 F09D A9 83 LDA #131
3346 F09F 8D 08 03 STA DBYTLO
3347 F0A2 A9 03 LDA #CBUFH
3348 F0A4 8D 05 03 STA DBUFHI ;SET BUFFER ADDRESS
3349 F0A7 A9 FD LDA #CBUFL
3350 F0A9 8D 04 03 STA DBUFLO
3351 F0AC A9 60 CSIO: LDA #$60 ;CASSET PSEUDO DEVICE
3352 F0AE 8D 00 03 STA DDEVIC
3353 F0B1 A9 00 LDA #0
3354 F0B3 8D 01 03 STA DUNIT
3355 F0B6 A9 23 LDA #35 ;DEVICE TIMEOUT (5/30/79)
3356 F0B8 8D 06 03 STA DTIMLO
3357 F0BB AD 02 03 LDA DCOMND ;GET COMMAND BACK
3358 F0BE A0 40 LDY #SRSTA ;SIO READ STATUS COMMAND
3359 F0C0 C9 52 CMP #'R
3360 F0C2 F0 02 BEQ *+4
3361 F0C4 A0 80 LDY #SWSTA ;SIO WRITE STATUS COMMAND
3362 F0C6 8C 03 03 STY DSTATS ;SET STATUS FOR SIO
3363 F0C9 A5 3E LDA FTYPE
3364 F0CB 8D 0B 03 STA DAUX2 ;INDICATE IF SHORT IRG MODE
3365 F0CE 20 59 E4 JSR SIOV ;GO CALL SIO
3366 F0D1 60 RTS
3367 ;
3368 ; WSIOSB - WRITE SIO SYSTEM BUFFER
3369 ;
3370 F0D2 8D FF 03 WSIOSB: STA CASBUF+2 ;STORE TYPE BYTE
3371 F0D5 A9 55 LDA #$55
3372 F0D7 8D FD 03 STA CASBUF+0
3373 F0DA 8D FE 03 STA CASBUF+1
3374 F0DD A9 57 LDA #'W ;WRITE
3375 F0DF 20 95 F0 JSR SIOSB ;CALL SIO ON SYSTEM BUFFER
3376 F0E2 60 RTS AND ;RETURN
3377 F0E3 CRNTP6 =*
3378 *=$14
3379 0014 00 CASSPR: .BYTE MONORG-CRNTP6 ;^GCASCV IS TOO LONG
3380
3381 .TITLE 'MONITOR ***** MONITP.SRC ***** 3/9/79 ***** 4:00:00 P.M.'
3382 ;
3383 ;
3384 ;
3385 ; CONSTANT EQUATES
3386 ;
3387 0009 PUTTXT = $9 ;"PUT TEXT RECORD" CIO COMMAND CODE
3388 0007 GETCAR = $7 ;"GET CHARACTER" CIO COMMAND CODE
3389 000B PUTCAR = $B ;"PUT CHARACTER" CIO COMMAND CODE
3390 0000 INIMLL = $00 ;INITIAL MEM LO LOW BYTE
3391 0007 INIMLH = $07 ;INITIAL MEM LO HIGH BYTE
3392 0000 SEX = $0 ;SCREEN EDITOR IOCB INDEX
3393 007D CLS = $7D ;CLEAR SCREEN CODE
3394 0092 CTRLC = $92 ;KEYBOARD CODE FOR 'CONTROL C'
3395 0088 EOF = $88 ;CASSETTE END OF FILE CODE
3396 0000 LIRG = $0 ;LONG IRG TYPE CODE
3397 ;
3398 0004 BUFFH = (CASBUF+3)/256
3399 0000 BUFFL = (-256)*BUFFH+CASBUF+3 ;BUFFER POINTER
3400 ;
3401 ;
3402 ;
3403 ;THE FOLLOWING EQUATES ARE IN THE CARTRIDGE ADDRESS SPACE.
3404 ;
3405 ;
3406 ; "B" CARTRIDGE ADDR'S ARE 8000-9FFF (36K CONFIG. ONLY)
3407 ; "A" CART. ADDR'S ARE A000-BFFF (36K CONFIG. ONLY)
3408 ;
3409 ; "A" CART. ADDR'S ARE B000-BFFF (48K CONFIG. ONLY)
3410 ;
3411 *=$BFFA
3412 BFFA CARTCS: .RES 2 ;CARTRIDGE COLD START ADDRESS.
3413 BFFC CART: .RES 1 ;CARTRIDGE AVAILABLE FLAG BYTE.
3414 BFFD CARTFG: .RES 1 ;CARTRIDGE FLAG BYTE. BIT 0=FLAG1,
3415 BFFE CARTAD: .RES 2 ;2-BYTE CARTRIDGE START VECTOR
3416 ;
3417 ;
3418 ; CARTRIDGE FLAG ACTION DEFINITIONS
3419 ;
3420 ;
3421 ; BIT ACTION IF SET
3422 ;
3423 ; 7 SPECIAL -- DON'T POWER-UP, JUST RUN CARTRIDGE
3424 ; 6-3 NONE
3425 ; 2 RUN CARTRIDGE
3426 ; 1 NONE
3427 ; 0 BOOT DOS
3428 ;
3429 ;
3430 ; *****
3431 ; NOTE
3432 ; *****
3433 ;
3434 ; 1.IF BIT2 IS 0, GOTO BLACKBOARD MODE.
3435 ; 2.IF BIT0 SET, THE DISK WILL BE BOOTED BEFORE ANY
3436 ; OTHER ACTION.
3437 ;
3438 ;
3439 ;
3440 ;
3441 ;
3442 ;
3443 ;
3444 ;
3445 ;
3446 ; POWER-UP VECTOR
3447 ;
3448 ;****************************
3449 ; * = $FFFC
3450 ;
3451 ;PVECT .WORD PWRUP ;POWER-UP VECTOR
3452 ;*************************
3453 ;
3454 ;
3455 ;
3456 ;
3457 ;
3458 ; ENTRY POINT VECTOR
3459 ;
3460 *=BLKBDV
3461 ;
3462 E471 4C 23 F2 JMP SIGNON ;BLACK BOARD VECTOR
3463 ;
3464 *=WARMSV
3465 ;
3466 E474 4C 1B F1 JMP RESET ;WARM START VECTOR
3467 ;
3468 *=COLDSV
3469 ;
3470 E477 4C 25 F1 JMP PWRUP ;COLD START VECTOR (9000 FOR RAM VECTOR WRITING)
3471 ;
3472 *=$9000
3473 9000 20 0C 90 JSR $900C
3474 9003 4C 25 F1 JMP PWRUP ;(TO HANDLE RAM VECTOR WRITING)
3475 9006 20 0C 90 JSR $900C
3476 9009 4C 1B F1 JMP RESET
3477 ;
3478 ;
3479 ;
3480 *=MONORG
3481 ;
3482 ;
3483 ;
3484 ;
3485 ; HANDLER TABLE ENTRIES
3486 ;
3487 F0E3 50 TBLENT: .BYTE 'P'
3488 F0E4 30 E4 .WORD PRINTV
3489 F0E6 43 .BYTE 'C'
3490 F0E7 40 E4 .WORD CASETV
3491 F0E9 45 .BYTE 'E'
3492 F0EA 00 E4 .WORD EDITRV
3493 F0EC 53 .BYTE 'S'
3494 F0ED 10 E4 .WORD SCRENV
3495 F0EF 4B .BYTE 'K'
3496 F0F0 20 E4 .WORD KEYBDV
3497 ;
3498 ;
3499 ;TBLLEN = IDENT-TBLENT-1 HANDLER TABLE LENGTH. "MOVED TO LINE 8
3500 ;
3501 ; ***** PRINT MESSAGES *****
3502 ;
3503 ;
3504 F0F2 7D 41 54 41 IDENT: .BYTE CLS,'ATARI COMPUTER - MEMO PAD',CR
3505 F0F6 52 49 20 43
3506 F0FA 4F 4D 50 55
3507 F0FE 54 45 52 20
3508 F102 2D 20 4D 45
3509 F106 4D 4F 20 50
3510 F10A 41 44 9B
3511 ;
3512 00F0 IDENTH = IDENT/256
3513 00F2 IDENTL = (-256)*IDENTH+IDENT ;SYSTEM I.D. MSG POINTER
3514 ;
3515 000E TBLLEN = IDENT-TBLENT-1 ;HANDLER TABLE LENGTH
3516 F10D 42 4F 4F 54 DERR5: .BYTE 'BOOT ERROR',CR
3517 F111 20 45 52 52
3518 F115 4F 52 9B
3519 ;
3520 00F1 DERRH = DERR5/256
3521 000D DERRL = (-256)*DERRH+DERR5 ;DISK ERROR MSG POINTER
3522 ;
3523 ;
3524 ;
3525 ;
3526 ; DEVICE/FILENAME SPECIFICATIONS
3527 ;
3528 F118 45 3A 9B OPNEDT: .BYTE 'E:',CR ;"OPEN SCREEN EDITOR" DEVICE SPEC.
3529 ;
3530 00F1 OPNH = OPNEDT/256
3531 0018 OPNL =(-256)*OPNH+OPNEDT ;SCREEN EDITOR OPEN POINTER
3532
3533 ;
3534 ;
3535 ;
3536 ;
3537 ;*****************************************************************
3538 ; RESET BUTTON ROUTINE STARTS HERE
3539 ;*****************************************************************
3540 ;
3541 F11B 78 RESET: SEI ;DISABLE IRQ INTERRUPTS
3542 F11C AD 44 02 LDA COLDST ;WERE WE IN MIDDLE OF COLDSTART?
3543 F11F D0 04 BNE PWRUP ;YES, GO TRY IT AGAIN
3544 F121 A9 FF LDA #$FF
3545 F123 D0 03 BNE PWRUP1 ;SET WARM START FLAG
3546 ;
3547 ;
3548 ;
3549 ;***************************************************************
3550 ; POWER UP ROUTINES START HERE
3551 ;***************************************************************
3552 ;
3553 F125 78 PWRUP: SEI ;DISABLE IRQ INTERRUPTS
3554 F126 A9 00 LDA #0 ;CLEAR WARMSTART FLAG
3555 F128 85 08 PWRUP1: STA WARMST
3556 F12A D8 CLD ;CLEAR DECIMAL FLAG.
3557 F12B A2 FF LDX #$FF
3558 F12D 9A TXS ;SET STACK POINTER
3559 F12E 20 3F F2 JSR SPECL ;CARTRIDGE SPECIAL CASE?
3560 F131 20 81 F2 JSR HARDI ;DO HARDWARE INITIALIZATION
3561 F134 A5 08 LDA WARMST ;IS IT WARMSTART?
3562 F136 D0 28 BNE ZOSRAM ;YES, ONLY ZERO OS RAM
3563 ;
3564 F138 A9 00 ZERORM: LDA #0
3565 F13A A0 08 LDY #WARMST
3566 F13C 85 04 STA RAMLO
3567 F13E 85 05 STA RAMLO+1 ;INITIALIZE RAM POINTER
3568 F140 91 04 CLRRAM: STA (RAMLO),Y ;CLEAR MEMORY LOC.
3569 F142 C8 INY
3570 F143 C0 00 CPY #0 ;AT END OF PAGE?
3571 F145 D0 F9 BNE CLRRAM
3572 F147 E6 05 INC RAMLO+1 ;YES, INCR PAGE POINTER
3573 F149 A6 05 LDX RAMLO+1
3574 F14B E4 06 CPX TRAMSZ ;AT END OF MEM?
3575 F14D D0 F1 BNE CLRRAM ;NO.
3576 ;
3577 ; INITIALIZE DOSVEC TO POINT TO SIGNON (BLACKBOARD)
3578 F14F AD 72 E4 LDA BLKBDV+1
3579 F152 85 0A STA DOSVEC ;USE BLACKBOARD VECTOR
3580 F154 AD 73 E4 LDA BLKBDV+2 ;FOR DOSVEC
3581 F157 85 0B STA DOSVEC+1
3582 F159 A9 FF LDA #$FF
3583 F15B 8D 44 02 STA COLDST ;SET TO SHOW IN MIDDLE OF COLDSTART
3584 F15E D0 13 BNE ESTSCM ;GO AROUND ZOSRAM
3585 ;
3586 ; CLEAR OS RAM (FOR WARMSTART)
3587 F160 A2 00 ZOSRAM: LDX #0
3588 F162 8A TXA
3589 F163 9D 00 02 ZOSRM2: STA $200,X ;CLEAR PAGES 2 AND 3
3590 F166 9D 00 03 STA $300,X
3591 F169 CA DEX
3592 F16A D0 F7 BNE ZOSRM2
3593 F16C A2 10 LDX #INTZBS
3594 F16E 95 00 ZOSRM3: STA 0,X ;CLEAR ZERO PAGE LOCATIONS INTZBS-7F
3595 F170 E8 INX
3596 F171 10 FB BPL ZOSRM3
3597 ;
3598 ; ESTABLISH SCREEN MARGINS
3599 F173 A9 02 ESTSCM: LDA #LEDGE
3600 F175 85 52 STA LMARGN
3601 F177 A9 27 LDA #REDGE
3602 F179 85 53 STA RMARGN
3603 ;
3604 ;
3605 ; MOVE VECTOR TABLE FROM ROM TO RAM
3606 F17B A2 25 OPSYS: LDX #$25
3607 F17D BD 80 E4 MOVVEC: LDA VCTABL,X ;ROM TABLE
3608 F180 9D 00 02 STA INTABS,X ;TO RAM
3609 F183 CA DEX
3610 F184 10 F7 BPL MOVVEC
3611 F186 20 94 F2 JSR OSRAM ;DO O.S. RAM SETUP
3612 F189 58 CLI ;ENABLE IRQ INTERRUPTS
3613 ;
3614 ;
3615 ; LINK HANDLERS
3616 ;
3617 F18A A2 0E LDX #TBLLEN
3618 F18C BD E3 F0 NXTENT: LDA TBLENT,X ;READ HANDLER TABLE ENTRY
3619 F18F 9D 1A 03 STA HATABS,X ;PUT IN TABLE
3620 F192 CA DEX
3621 F193 10 F7 BPL NXTENT ;DONE WITH ALL ENTRIES?
3622 ;
3623 ;
3624 ;
3625 ;
3626 ;
3627 ; INTERROGATE CARTRIDGE ADDR. SPACE TO SEE WHICH CARTRIDGES THERE ARE
3628 ;
3629 F195 A2 00 LDX #0
3630 F197 86 07 STX TSTDAT ;CLEAR "B" CART. FLAG
3631 F199 86 06 STX TRAMSZ ;CLEAR "A" CART. FLAG
3632 F19B AE E4 02 LDX RAMSIZ
3633 F19E E0 90 CPX #$90 ;RAM IN "B" CART. SLOT?
3634 F1A0 B0 0A BCS ENDBCK
3635 F1A2 AD FC 9F LDA CART-$2000 ;NO,
3636 F1A5 D0 05 BNE ENDBCK ;CART. PLUGGED INTO "B" SLOT?
3637 F1A7 E6 07 INC TSTDAT ;YES, SET "B" CART. FLAG
3638 F1A9 20 3C F2 JSR CBINI ;INITIALIZE CARTRIDGE "B"
3639 ;
3640 F1AC AE E4 02 ENDBCK: LDX RAMSIZ
3641 F1AF E0 B0 CPX #$B0 ;RAM IN "A" CART. SLOT?
3642 F1B1 B0 0A BCS ENDACK
3643 F1B3 AE FC BF LDX CART ;NO,
3644 F1B6 D0 05 BNE ENDACK ;CART. PLUGGED INTO "A" SLOT?
3645 F1B8 E6 06 INC TRAMSZ ;YES, SET "A" CART. FLAG
3646 F1BA 20 39 F2 JSR CAINI ;INITIALIZE CARTRIDGE "A"
3647 ;
3648 ;
3649 ; OPEN SCREEN EDITOR
3650 ;
3651 F1BD A9 03 ENDACK: LDA #3
3652 F1BF A2 00 LDX #SEX
3653 F1C1 9D 42 03 STA ICCOM,X ;OPEN I/O COMMAND
3654 F1C4 A9 18 LDA #OPNL
3655 F1C6 9D 44 03 STA ICBAL,X
3656 F1C9 A9 F1 LDA #OPNH
3657 F1CB 9D 45 03 STA ICBAH,X ;SET BUFFER POINTER TO OPEN SCREEN EDITOR
3658 F1CE A9 0C LDA #$C
3659 F1D0 9D 4A 03 STA ICAX1,X ;SET UP OPEN FOR INPUT/OUTPUT
3660 F1D3 20 56 E4 JSR CIOV ;GO TO CIO
3661 ;
3662 F1D6 10 03 BPL SCRNOK ;BR IF NO ERROR
3663 F1D8 4C 25 F1 JMP PWRUP ;RETRY PWRUP IF ERROR (SHOULD NEVER HAPPEN!)
3664 F1DB E8 SCRNOK: INX ;SCREEN OK, SO WAIT FOR VBLANK TO
3665 F1DC D0 FD BNE SCRNOK ;BRING UP THE DISPLAY
3666 F1DE C8 INY
3667 F1DF 10 FA BPL SCRNOK
3668 ;
3669 ;
3670 ; DO CASSETTE BOOT
3671 F1E1 20 B2 F3 JSR CSBOOT ;CHECK, BOOT, AND INIT
3672 ;
3673 ; CHECK TO SEE IF EITHER CARTRIDGE WANTS DISK BOOT
3674 F1E4 A5 06 LDA TRAMSZ ;CHECK BOTH CARTRIDGES
3675 F1E6 05 07 ORA TSTDAT ;
3676 F1E8 F0 12 BEQ NOCART ;NEITHER CARTRIDGE LIVES
3677 F1EA A5 06 LDA TRAMSZ ;"A" CART?
3678 F1EC F0 03 BEQ NOA1 ;NO
3679 F1EE AD FD BF LDA CARTFG ;GET CARTRIDGE MODE FLAG
3680 F1F1 A6 07 NOA1: LDX TSTDAT ;"B" CART?
3681 F1F3 F0 03 BEQ NOB1 ;NO
3682 F1F5 0D FD 9F ORA CARTFG-$2000;ADD OTHER FLAG
3683 F1F8 29 01 NOB1: AND #1 ;DOES EITHER CART WANT BOOT?
3684 F1FA F0 03 BEQ NOBOOT ;NO
3685 ;
3686 ; DO DISK BOOT
3687 F1FC 20 CF F2 NOCART: JSR BOOT ;CHECK, BOOT, AND INIT
3688 ;
3689 ; GO TO ONE OF THE CARTRIDGES IF THEY SO DESIRE
3690 F1FF A9 00 NOBOOT: LDA #0
3691 F201 8D 44 02 STA COLDST ;RESET TO SHOW DONE WITH COLDSTART
3692 F204 A5 06 LDA TRAMSZ ;"A" CART?
3693 F206 F0 0A BEQ NOA2 ;NO
3694 F208 AD FD BF LDA CARTFG ;GET CARTRIDGE MODE FLAG
3695 F20B 29 04 AND #4 ;DOES IT WANT TO RUN?
3696 F20D F0 03 BEQ NOA2 ;NO
3697 F20F 6C FA BF JMP (CARTCS) ;RUN "A" CARTRIDGE
3698 F212 A5 07 NOA2: LDA TSTDAT ;"B" CART?
3699 F214 F0 0A BEQ NOCAR2 ;NO
3700 F216 AD FD 9F LDA CARTFG-$2000;GET "B" MODE FLAG
3701 F219 29 04 AND #4 ;DOES IT WANT TO RUN?
3702 F21B F0 DF BEQ NOCART ;NO
3703 F21D 6C FA 9F JMP (CARTCS-$2000) ;RUN "B" CARTRIDGE
3704 ;
3705 ; NO CARTRIDGES, OR NEITHER WANTS TO RUN,
3706 ; SO GO TO DOSVEC (DOS, CASSETTE, OR BLACKBOARD)
3707 F220 6C 0A 00 NOCAR2: JMP (DOSVEC)
3708 ;
3709 ; PRINT SIGN-ON MESSAGE
3710 F223 A2 F2 SIGNON: LDX #IDENTL
3711 F225 A0 F0 LDY #IDENTH
3712 F227 20 85 F3 JSR PUTLIN ;GO PUT SIGN-ON MSG ON SCREEN
3713 ;
3714 ;
3715 ;
3716 ; BLACKBOARD ROUTINE
3717 F22A 20 30 F2 BLACKB: JSR BLKB2 ;"JSR EGETCH"
3718 F22D 4C 2A F2 JMP BLACKB ;FOREVER
3719 F230 AD 05 E4 BLKB2: LDA EDITRV+5 ;HIGH BYTE
3720 F233 48 PHA
3721 F234 AD 04 E4 LDA EDITRV+4 ;LOW BYTE
3722 F237 48 PHA
3723 F238 60 RTS ;SIMULATES "JMP (EDITRV)"
3724 ;
3725 ;
3726 ; CARTRIDGE INITIALIZATION INDIRECT JUMPS
3727 F239 6C FE BF CAINI: JMP (CARTAD)
3728 F23C 6C FE 9F CBINI: JMP (CARTAD-$2000)
3729 .PAGE
3730 ;
3731 ;
3732 ;
3733 ;
3734 ;
3735 ;
3736 ; S U B R O U T I N E S
3737 ;
3738 ;
3739 ;
3740 ;
3741 ;
3742 ;
3743 ;
3744 ;
3745 ;
3746 ;
3747 ;
3748 ;
3749 ;
3750 ;
3751 ;
3752 ;
3753 ;
3754 ;
3755 ; CHECK FOR HOW MUCH RAM & SPECIAL CARTRIDGE CASE.
3756 ; IF SPECIAL CARTRIDGE CASE, DON'T GO BACK -- GO TO CART.
3757 ;
3758 F23F AD FC BF SPECL: LDA CART ;CHECK FOR RAM OR CART
3759 F242 D0 12 BNE ENSPEC ;GO IF NOTHING OR MAYBE RAM
3760 F244 EE FC BF INC CART ;NOW DO RAM CHECK
3761 F247 AD FC BF LDA CART ;IS IT ROM?
3762 F24A D0 0A BNE ENSPEC ;NO
3763 F24C AD FD BF LDA CARTFG ;YES,
3764 F24F 29 80 AND #$80 ;MASK OFF SPECIAL BIT
3765 F251 F0 03 BEQ ENSPEC ;BIT SET?
3766 F253 6C FE BF JMP (CARTAD) ;YES, GO RUN CARTRIDGE
3767 ;
3768 ; CHECK FOR AMOUNT OF RAM
3769 ;
3770 ;
3771 F256 CE FC BF ENSPEC: DEC CART ;RESTORE RAM IF NEEDED
3772 F259 A9 00 LDA #0
3773 F25B 85 05 STA RAMLO+1
3774 F25D A9 10 LDA #$10
3775 F25F 85 06 STA TRAMSZ ;SET RAM POINTER TO 4K.
3776 F261 A0 00 LDY #0
3777 F263 B1 05 HOWMCH: LDA (RAMLO+1),Y ;READ RAM LOCATION
3778 F265 85 07 STA TSTDAT ;SAVE DATA
3779 F267 49 FF EOR #$FF ;INVERT IT.
3780 F269 85 04 STA RAMLO ;SAVE INVERTED DATA
3781 F26B 91 05 STA (RAMLO+1),Y ;WRITE INVERTED DATA.
3782 F26D B1 05 LDA (RAMLO+1),Y ;READ RAM AGAIN
3783 F26F C5 04 CMP RAMLO ;IS IT THE INVERTED DATA?
3784 F271 D0 0D BNE ENDRAM
3785 F273 A5 07 LDA TSTDAT ;YES,
3786 F275 91 05 STA (RAMLO+1),Y ;RESTORE ORIGINAL RAM DATA
3787 F277 A5 06 LDA TRAMSZ
3788 F279 18 CLC
3789 F27A 69 10 ADC #$10
3790 F27C 85 06 STA TRAMSZ ;INCR. RAM POINTER BY 4K.
3791 F27E D0 E3 BNE HOWMCH ;GO FIND HOW MUCH RAM.
3792 F280 60 ENDRAM: RTS
3793 ;
3794 ;
3795 ;
3796 ;
3797 ; HARDWARE INITIALIZATION
3798 ;
3799 ;
3800 F281 A9 00 HARDI: LDA #0
3801 F283 AA TAX
3802 F284 9D 00 D0 CLRCHP: STA $D000,X
3803 F287 9D 00 D4 STA $D400,X
3804 F28A 9D 00 D2 STA $D200,X
3805 F28D 9D 00 D3 STA $D300,X
3806 F290 E8 INX
3807 F291 D0 F1 BNE CLRCHP
3808 F293 60 RTS
3809 ;
3810 ;
3811 ; O.S. RAM SETUP
3812 ;
3813 F294 C6 11 OSRAM: DEC BRKKEY ;TURN OFF BREAK KEY FLAG
3814 F296 A5 06 LDA TRAMSZ ;READ RAM SIZE IN TEMP. REG.
3815 F298 8D E4 02 STA RAMSIZ ;SAVE IT IN RAM SIZE.
3816 F29B 8D E6 02 STA MEMTOP+1 ;INIT. MEMTOP ADDR HI BYTE
3817 F29E A9 00 LDA #0
3818 F2A0 8D E5 02 STA MEMTOP ;INIT. MEMTOP ADDR LO BYTE
3819 F2A3 A9 00 LDA #INIMLL
3820 F2A5 8D E7 02 STA MEMLO
3821 F2A8 A9 07 LDA #INIMLH
3822 F2AA 8D E8 02 STA MEMLO+1 ;INITIALIZE MEMLO ADDR VECTOR
3823 F2AD 20 0C E4 JSR EDITRV+$C ;EDITOR INIT.
3824 F2B0 20 1C E4 JSR SCRENV+$C ;SCREEN INIT.
3825 F2B3 20 2C E4 JSR KEYBDV+$C ;KEYBOARD INIT.
3826 F2B6 20 3C E4 JSR PRINTV+$C ;PRINTER HANDLER INIT
3827 F2B9 20 4C E4 JSR CASETV+$C ;CASSETTE HANDLER INIT
3828 F2BC 20 6E E4 JSR CIOINV ;CIO INIT.
3829 F2BF 20 65 E4 JSR SIOINV ;SIO INIT.
3830 F2C2 20 6B E4 JSR INTINV ;INTERRUPT HANDLER INIT.
3831 F2C5 AD 1F D0 LDA CONSOL
3832 F2C8 29 01 AND #$1
3833 F2CA D0 02 BNE NOKEY ;GAME START KEY DEPRESSED?
3834 F2CC E6 4A INC CKEY ;YES, SET KEY FLAG.
3835 F2CE 60 NOKEY: RTS
3836
3837 ;
3838 ; DO BOOT OF DISK
3839 ;
3840 F2CF A5 08 BOOT: LDA WARMST
3841 F2D1 F0 0A BEQ NOWARM ;WARM START?
3842 F2D3 A5 09 LDA BOOT? ;YES,
3843 F2D5 29 01 AND #1
3844 F2D7 F0 03 BEQ NOINIT ;VALID BOOT?
3845 F2D9 20 7E F3 JSR DINI ;YES, RE-INIT. DOS SOFTWARE
3846 F2DC 60 NOINIT: RTS
3847 F2DD A9 01 NOWARM: LDA #1
3848 F2DF 8D 01 03 STA DUNIT ;ASSIGN DISK DRIVE NO.
3849 F2E2 A9 53 LDA #STATC
3850 F2E4 8D 02 03 STA DCOMND ;SET UP STATUS COMMAND
3851 F2E7 20 53 E4 JSR DSKINV ;GO DO DISK STATUS
3852 F2EA 10 01 BPL DOBOOT ;IS STATUS FROM SIO GOOD?
3853 F2EC 60 RTS ;NO, GO BACK WITH BAD BOOT STATUS
3854 ;
3855 F2ED A9 00 DOBOOT: LDA #0
3856 F2EF 8D 0B 03 STA DAUX2
3857 F2F2 A9 01 LDA #1
3858 F2F4 8D 0A 03 STA DAUX1 ;SET SECTOR # TO 1.
3859 F2F7 A9 00 LDA #BUFFL
3860 F2F9 8D 04 03 STA DBUFLO
3861 F2FC A9 04 LDA #BUFFH
3862 F2FE 8D 05 03 STA DBUFHI ;SET UP BUFFER ADDR
3863 F301 20 9D F3 SECT1: JSR GETSEC ;GET SECTOR
3864 F304 10 08 BPL ALLSEC ;STATUS O.K. ?
3865 F306 20 81 F3 BADDSK: JSR DSKRDE ;NO, GO PRINT DISK READ ERROR
3866 F309 A5 4B LDA CASSBT
3867 F30B F0 E0 BEQ DOBOOT ;CASSETTE BOOT?
3868 F30D 60 RTS ;YES, QUIT
3869 F30E A2 03 ALLSEC: LDX #3
3870 F310 BD 00 04 RDBYTE: LDA CASBUF+3,X ;READ A BUFFER BYTE
3871 F313 9D 40 02 STA DFLAGS,X ;STORE IT
3872 F316 CA DEX
3873 F317 10 F7 BPL RDBYTE ;DONE WITH 4 BYTE TRANSFER ?
3874 F319 AD 42 02 LDA BOOTAD ;YES,
3875 F31C 85 04 STA RAMLO
3876 F31E AD 43 02 LDA BOOTAD+1
3877 F321 85 05 STA RAMLO+1 ;PUT BOOT ADDR INTO Z. PAGE RAM
3878 F323 AD 04 04 LDA CASBUF+7
3879 F326 85 0C STA DOSINI ;ESTABLISH DOS INIT ADDRESS
3880 F328 AD 05 04 LDA CASBUF+8
3881 F32B 85 0D STA DOSINI+1
3882 F32D A0 7F MVBUFF: LDY #$7F ;YES, SET BYTE COUNT
3883 F32F B9 00 04 MVNXB: LDA CASBUF+3,Y
3884 F332 91 04 STA (RAMLO),Y ;MOVE A BYTE FROM SECTOR BUFFER TO BOOT ADDR.
3885 F334 88 DEY
3886 F335 10 F8 BPL MVNXB ;DONE ?
3887 F337 18 CLC ;YES,
3888 F338 A5 04 LDA RAMLO
3889 F33A 69 80 ADC #$80
3890 F33C 85 04 STA RAMLO
3891 F33E A5 05 LDA RAMLO+1
3892 F340 69 00 ADC #0
3893 F342 85 05 STA RAMLO+1 ;INCR BOOT LOADER BUFFER POINTER.
3894 F344 CE 41 02 DEC DBSECT ;DECR # OF SECTORS.
3895 F347 F0 11 BEQ ENBOOT ;MORE SECTORS ?
3896 F349 EE 0A 03 INC DAUX1 ;YES, INCR SECTOR #
3897 F34C 20 9D F3 SECTX: JSR GETSEC ;GO GET SECTOR.
3898 F34F 10 DC BPL MVBUFF ;STATUS O.K. ?
3899 F351 20 81 F3 JSR DSKRDE ;NO, GO PRINT DISK READ ERROR
3900 F354 A5 4B LDA CASSBT
3901 F356 D0 AE BNE BADDSK ;IF CASSETTE, QUIT.
3902 F358 F0 F2 BEQ SECTX ;IF DISK, TRY SECTOR AGAIN.
3903 F35A A5 4B ENBOOT: LDA CASSBT
3904 F35C F0 03 BEQ XBOOT ;CASSETTE BOOT ?
3905 F35E 20 9D F3 JSR GETSEC ;YES, GET EOF RECORD, BUT DON'T USE IT.
3906 F361 20 6C F3 XBOOT: JSR BLOAD ;GO EXECUTE BOOT LOADER
3907 F364 B0 A0 BCS BADDSK ;IF BAD BOOT, DO IT OVER AGAIN
3908 F366 20 7E F3 JSR DINI ;GO INIT. SOFTWARE
3909 F369 E6 09 INC BOOT? ;SHOW BOOT SUCCESS
3910 F36B 60 RTS
3911 F36C 18 BLOAD: CLC
3912 F36D AD 42 02 LDA BOOTAD
3913 F370 69 06 ADC #6
3914 F372 85 04 STA RAMLO
3915 F374 AD 43 02 LDA BOOTAD+1
3916 F377 69 00 ADC #0
3917 F379 85 05 STA RAMLO+1 ;PUT START ADDR OF BOOTLOADER INTO RAM
3918 F37B 6C 04 00 JMP (RAMLO)
3919 F37E 6C 0C 00 DINI: JMP (DOSINI)
3920 ;
3921 ;
3922 ;
3923 ;
3924 ; DISPLAY DISK READ ERROR MSG
3925 ;
3926 F381 A2 0D DSKRDE: LDX #DERRL
3927 F383 A0 F1 LDY #DERRH
3928 ;
3929 ;
3930 ;
3931 ; PUT LINE ON SCREEN AT PRESENT CURSOR POSITION
3932 ;
3933 ; X-REG -- LO BYTE, BEGIN ADDR OF LINE
3934 ; Y-REG -- HI BYTE, BEGIN ADDR OF LINE
3935 ;
3936 F385 8A PUTLIN: TXA
3937 F386 A2 00 LDX #SEX
3938 F388 9D 44 03 STA ICBAL,X
3939 F38B 98 TYA
3940 F38C 9D 45 03 STA ICBAH,X ;SET UP ADDR OF BEGIN OF LINE
3941 F38F A9 09 LDA #PUTTXT
3942 F391 9D 42 03 STA ICCOM,X ;"PUT TEXT RECORD" COMMAND
3943 F394 A9 FF LDA #$FF
3944 F396 9D 48 03 STA ICBLL,X ;SET BUFFER LENGTH
3945 F399 20 56 E4 JSR CIOV ;PUT LINE ON SCREEN
3946 F39C 60 RTS
3947 ;
3948 ;
3949 ;
3950 ;
3951 ; GET SECTOR FROM DISK 0
3952 ;
3953 F39D A5 4B GETSEC: LDA CASSBT
3954 F39F F0 03 BEQ DISKM ;CASSETTE BOOT ?
3955 F3A1 4C 7A E4 JMP RBLOKV ;YES, GO TO READ BLOCK ROUTINE
3956 F3A4 A9 52 DISKM: LDA #READ
3957 F3A6 8D 02 03 STA DCOMND ;SET READ SECTOR COMMAND
3958 F3A9 A9 01 LDA #1
3959 F3AB 8D 01 03 STA DUNIT ;SET DRIVE NO. TO DRIVE 0
3960 F3AE 20 53 E4 JSR DSKINV ;GET SECTOR
3961 F3B1 60 RTS
3962 ;
3963 ;
3964 ;
3965 ; DO CHECK FOR CASSETTE BOOT & IF SO, DO BOOT
3966 ;
3967 F3B2 A5 08 CSBOOT: LDA WARMST ;WARMSTART?
3968 F3B4 F0 0A BEQ CSBOT2 ;NO
3969 F3B6 A5 09 LDA BOOT? ;GET BOOT FLAG
3970 F3B8 29 02 AND #2 ;WAS CASSETTE BOOT SUCCESFULL?
3971 F3BA F0 03 BEQ NOCSB2 ;NO
3972 F3BC 20 E1 F3 JSR CINI ;YES, INIT CASSETTE SOFTWARE
3973 F3BF 60 NOCSB2: RTS
3974 ;
3975 F3C0 A5 4A CSBOT2: LDA CKEY
3976 F3C2 F0 1C BEQ NOCSBT ;"C" KEY FLAG SET ?
3977 F3C4 A9 80 LDA #$80 ;YES,
3978 F3C6 85 3E STA FTYPE ;SET LONG IRG TYPE
3979 F3C8 E6 4B INC CASSBT ;SET CASSETTE BOOT FLAG
3980 F3CA 20 7D E4 JSR CSOPIV ;OPEN CASSETTE FOR INPUT
3981 F3CD 20 01 F3 JSR SECT1 ;DO BOOT & INIT.
3982 F3D0 A9 00 LDA #0
3983 F3D2 85 4B STA CASSBT ;RESET CASSETTE BOOT FLAG
3984 F3D4 85 4A STA CKEY ;CLEAR KEY FLAG
3985 F3D6 06 09 ASL BOOT? ;SHIFT BOOT FLAG (NOW=2 IF SUCCESS)
3986 F3D8 A5 0C LDA DOSINI
3987 F3DA 85 02 STA CASINI ;MOVE INIT ADDRESS FOR CASSETTE
3988 F3DC A5 0D LDA DOSINI+1
3989 F3DE 85 03 STA CASINI+1
3990 F3E0 60 NOCSBT: RTS
3991 ;
3992 F3E1 6C 02 00 CINI: JMP (CASINI) ;INIT CASSETTE
3993 ;***********************************************************************
3994 ;
3995 ;
3996 ; SPARE BYTE OR MODULE TOO LONG FLAG
3997 ;
3998 F3E4 CRNTP7 = *
3999 ;
4000 *=$14
4001 0014 00 MONSPR: .BYTE KBDORG-CRNTP7 ;^GMONITP TOO LONG
4002 ;
4003 .PAGE
4004 .TITLE 'DISPLAY HANDLER -- 10-30-78 -- DISPLC'
4005 ;
4006 ; HANDLER DEPENDENT EQUATES
4007 ;
4008 007D CLRCOD = $7D ;CLEAR SCREEN ATASCI CODE
4009 009F CNTL1 = $9F ;POKEY KEY CODE FOR ^1
4010 ;
4011 0068 FRMADR = SAVADR
4012 0066 TOADR = MLTTMP
4013 ;
4014 .PAGE
4015 ;
4016 ;
4017 *=EDITRV
4018 ;
4019 ; SCREEN EDITOR HANDLER ENTRY POINT
4020 ;
4021 E400 FB F3 EDITOR: .WORD EOPEN-1
4022 E402 33 F6 .WORD RETUR1-1 ;(CLOSE)
4023 E404 3D F6 .WORD EGETCH-1
4024 E406 A3 F6 .WORD EOUTCH-1
4025 E408 33 F6 .WORD RETUR1-1 ;(STATUS)
4026 E40A 3C F6 .WORD NOFUNC-1 ;(SPECIAL)
4027 E40C 4C E4 F3 JMP PWRONA
4028 E40F 38 .BYTE $38 ;ROM FILLER BYTE
4029 ;
4030 *=SCRENV
4031 ;
4032 ; DISPLAY HANDLER ENTRY POINT
4033 ;
4034 E410 F5 F3 DISPLA: .WORD DOPEN-1
4035 E412 33 F6 .WORD RETUR1-1 ;(CLOSE)
4036 E414 92 F5 .WORD GETCH-1
4037 E416 B6 F5 .WORD OUTCH-1
4038 E418 33 F6 .WORD RETUR1-1 ;(STATUS)
4039 E41A FB FC .WORD DRAW-1 ;(SPECIAL)
4040 E41C 4C E4 F3 JMP PWRONA
4041 E41F F6 .BYTE $F6 ;ROM FILLER BYTE
4042 ;
4043 *=KEYBDV
4044 ;
4045 ;
4046 ; KEYBOARD HANDLER ENTRY POINT
4047 ;
4048 E420 33 F6 KBDHND: .WORD RETUR1-1
4049 E422 33 F6 .WORD RETUR1-1 ;(CLOSE)
4050 E424 E1 F6 .WORD KGETCH-1
4051 E426 3C F6 .WORD NOFUNC-1 ;(OUTCH)
4052 E428 33 F6 .WORD RETUR1-1 ;(STATUS)
4053 E42A 3C F6 .WORD NOFUNC-1 ;(SPECIAL)
4054 E42C 4C E4 F3 JMP PWRONA
4055 E42F 00 .BYTE 0 ;ROM FILLER BYTE
4056 ;
4057 ;
4058 ; INTERRUPT VECTOR TABLE ENTRY
4059 *=VCTABL-INTABS+VKEYBD
4060 E488 BE FF .WORD PIRQQ ;KEYBOARD IRQ INTERRUPT VECTOR
4061
4062 *=KBDORG
4063 ;
4064 F3E4 A9 FF PWRONA: LDA #$FF
4065 F3E6 8D FC 02 STA CH
4066 F3E9 AD E6 02 LDA MEMTOP+1
4067 F3EC 29 F0 AND #$F0 ;INSURE 4K PAGE BOUNDARY
4068 F3EE 85 6A STA RAMTOP
4069 F3F0 A9 40 LDA #$40 ;DEFAULT TO UPPER CASE ALPHA AT PWRON
4070 F3F2 8D BE 02 STA SHFLOK
4071 F3F5 60 RTS ;POWER ON COMPLETED
4072 .PAGE
4073 ;
4074 ;
4075 ; BEGIN DISPLAY HANDLER OPEN PROCESSING
4076 ;
4077 F3F6 A5 2B DOPEN: LDA ICAX2Z ;GET AUX 2 BYTE
4078 F3F8 29 0F AND #$F
4079 F3FA D0 08 BNE OPNCOM ;IF MODE ZERO, CLEAR ICAX1Z
4080 F3FC A5 2A EOPEN: LDA ICAX1Z ;CLEAR "CLR INHIBIT" AND "MXD MODE" BITS
4081 F3FE 29 0F AND #$F
4082 F400 85 2A STA ICAX1Z
4083 F402 A9 00 LDA #0
4084 F404 85 57 OPNCOM: STA DINDEX
4085 F406 A9 E0 LDA #$E0 ;INITIALIZE GLOBAL VBLANK RAM
4086 F408 8D F4 02 STA CHBAS
4087 F40B A9 02 LDA #2
4088 F40D 8D F3 02 STA CHACT
4089 F410 8D 2F 02 STA SDMCTL ;TURN OFF DMA NEXT VBLANK
4090 F413 A9 01 LDA #SUCCES
4091 F415 85 4C STA DSTAT ;CLEAR STATUS
4092 F417 A9 C0 LDA #$C0 ;DO IRQEN
4093 F419 05 10 ORA POKMSK
4094 F41B 85 10 STA POKMSK
4095 F41D 8D 0E D2 STA IRQEN
4096 F420 A9 00 LDA #0
4097 F422 8D 93 02 STA TINDEX ;TEXT INDEX MUST ALWAYS BE 0
4098 F425 85 64 STA ADRESS
4099 F427 85 7B STA SWPFLG
4100 F429 8D F0 02 STA CRSINH ;TURN CURSOR ON AT OPEN
4101 F42C A0 0E LDY #14 ;CLEAR TAB STOPS
4102 F42E A9 01 LDA #1 ;INIT TAB STOPS TO EVERY 8 CHARACTERS
4103 F430 99 A3 02 CLRTBS: STA TABMAP,Y
4104 F433 88 DEY
4105 F434 10 FA BPL CLRTBS
4106 F436 A2 04 LDX #4 ;LOAD COLOR REGISTERS
4107 F438 BD C1 FE DOPEN8: LDA COLRTB,X
4108 F43B 9D C4 02 STA COLOR0,X
4109 F43E CA DEX
4110 F43F 10 F7 BPL DOPEN8
4111 F441 A4 6A LDY RAMTOP ;DO TXTMSC=$2C40 (IF MEMTOP=3000)
4112 F443 88 DEY
4113 F444 8C 95 02 STY TXTMSC+1
4114 F447 A9 60 LDA #$60
4115 F449 8D 94 02 STA TXTMSC
4116 F44C A6 57 LDX DINDEX
4117 F44E BD 69 FE LDA ANCONV,X ;CONVERT IT TO ANTIC CODE
4118 F451 D0 04 BNE DOPENA ;IF ZERO, IT IS ILLEGAL
4119 F453 A9 91 OPNERR: LDA #BADMOD ;SET ERROR STATUS
4120 F455 85 4C STA DSTAT
4121 F457 85 51 DOPENA: STA HOLD1
4122 F459 A5 6A LDA RAMTOP ;SET UP AN INDIRECT POINTER
4123 F45B 85 65 STA ADRESS+1
4124 F45D BC 45 FE LDY ALOCAT,X ;ALLOCATE N BLOCKS OF 40 BYTES
4125 F460 A9 28 DOPEN1: LDA #40
4126 F462 20 21 F9 JSR DBSUB
4127 F465 88 DEY
4128 F466 D0 F8 BNE DOPEN1
4129 F468 AD 6F 02 LDA GPRIOR ;CLEAR GTIA MODES
4130 F46B 29 3F AND #$3F
4131 F46D 85 67 STA OPNTMP+1
4132 F46F A8 TAY
4133 F470 E0 08 CPX #8 ;TEST IF 320X1
4134 F472 90 17 BCC NOT8
4135 F474 8A TXA ;GET 2 LOW BITS
4136 F475 6A ROR A
4137 F476 6A ROR A
4138 F477 6A ROR A
4139 F478 29 C0 AND #$C0 ;NOW 2 TOP BITS
4140 F47A 05 67 ORA OPNTMP+1
4141 F47C A8 TAY
4142 F47D A9 10 LDA #16 ;SUBTRACT 16 MORE FOR PAGE BOUNDARY
4143 F47F 20 21 F9 JSR DBSUB
4144 F482 E0 0B CPX #11 ;TEST MODE 11
4145 F484 D0 05 BNE NOT8 ;IF MODE = 11
4146 F486 A9 06 LDA #6 ;PUT GTIA LUM VALUE INTO BACKGROUND REGISTER
4147 F488 8D C8 02 STA COLOR4
4148 F48B 8C 6F 02 NOT8: STY GPRIOR ;STORE NEW PRIORITY
4149 F48E A5 64 LDA ADRESS ;SAVE MEMORY SCAN COUNTER ADDRESS
4150 F490 85 58 STA SAVMSC
4151 F492 A5 65 LDA ADRESS+1
4152 F494 85 59 STA SAVMSC+1
4153 F496 AD 0B D4 VBWAIT: LDA VCOUNT ;WAIT FOR NEXT VBLANK BEFORE MESSING
4154 F499 C9 7A CMP #$7A ;WITH THE DISPLAY LIST
4155 F49B D0 F9 BNE VBWAIT
4156 F49D 20 1F F9 JSR DBDEC ;START PUTTING DISPLAY LIST RIGHT UNDER RAM
4157 F4A0 BD 75 FE LDA PAGETB,X ;TEST IF DISPLAY LIST WILL BE IN TROUBLE
4158 F4A3 F0 06 BEQ NOMOD ;OF CROSSING A 256 BYTE PAGE BOUNDARY
4159 F4A5 A9 FF LDA #$FF ;IF SO, DROP DOWN A PAGE
4160 F4A7 85 64 STA ADRESS
4161 F4A9 C6 65 DEC ADRESS+1
4162 F4AB A5 64 NOMOD: LDA ADRESS ;SAVE END OF DISPLAY LIST FOR LATER
4163 F4AD 85 68 STA SAVADR
4164 F4AF A5 65 LDA ADRESS+1
4165 F4B1 85 69 STA SAVADR+1
4166 F4B3 20 13 F9 JSR DBDDEC ;(DOUBLE BYTE DOUBLE DECREMENT)
4167 F4B6 A9 41 LDA #$41 ;(ANTIC) WAIT FOR VBLANK AND JMP TO TOP
4168 F4B8 20 17 F9 JSR STORE
4169 F4BB 86 66 STX OPNTMP
4170 F4BD A9 18 LDA #24 ;INITIALIZE BOTSCR
4171 F4BF 8D BF 02 STA BOTSCR
4172 F4C2 A5 57 LDA DINDEX ;DISALLOW MIXED MODE IF MODE.GE.9
4173 F4C4 C9 09 CMP #9
4174 F4C6 B0 2D BCS NOTMXD
4175 F4C8 A5 2A LDA ICAX1Z ;TEST MIXED MODE
4176 F4CA 29 10 AND #$10
4177 F4CC F0 27 BEQ NOTMXD
4178 F4CE A9 04 LDA #4
4179 F4D0 8D BF 02 STA BOTSCR
4180 F4D3 A2 02 LDX #2 ;ADD 4 LINES OF TEXT AT BOTTOM OF SCREEN
4181 F4D5 A9 02 DOPEN2: LDA #2
4182 F4D7 20 17 F9 JSR STORE
4183 F4DA CA DEX
4184 F4DB 10 F8 BPL DOPEN2
4185 F4DD A4 6A LDY RAMTOP ;RELOAD MSC FOR TEXT
4186 F4DF 88 DEY
4187 F4E0 98 TYA
4188 F4E1 20 17 F9 JSR STORE
4189 F4E4 A9 60 LDA #$60
4190 F4E6 20 17 F9 JSR STORE
4191 F4E9 A9 42 LDA #$42
4192 F4EB 20 17 F9 JSR STORE
4193 F4EE 18 CLC
4194 F4EF A9 0C LDA #MXDMDE-NUMDLE ;POINT X AT MIXED MODE TABLE
4195 F4F1 65 66 ADC OPNTMP
4196 F4F3 85 66 STA OPNTMP
4197 F4F5 A4 66 NOTMXD: LDY OPNTMP
4198 F4F7 BE 51 FE LDX NUMDLE,Y ;GET NUMBER OF DISPLAY LIST ENTRIES
4199 F4FA A5 51 DOPEN3: LDA HOLD1 ;STORE N DLE'S
4200 F4FC 20 17 F9 JSR STORE
4201 F4FF CA DEX
4202 F500 D0 F8 BNE DOPEN3
4203 F502 A5 57 LDA DINDEX ;DO THE MESSY 320X1 PROBLEM
4204 F504 C9 08 CMP #8
4205 F506 90 1C BCC DOPEN5
4206 F508 A2 5D LDX #93 ;GET REMAINING NUMBER OF DLE'S
4207 F50A A5 6A LDA RAMTOP ;RELOAD MEMORY SCAN COUNTER
4208 F50C 38 SEC
4209 F50D E9 10 SBC #$10
4210 F50F 20 17 F9 JSR STORE
4211 F512 A9 00 LDA #0
4212 F514 20 17 F9 JSR STORE
4213 F517 A9 4F LDA #$4F ;(ANTIC) RELOAD MSC CODE
4214 F519 20 17 F9 JSR STORE
4215 F51C A5 51 DOPEN4: LDA HOLD1 ;DO REMAINING DLE'S
4216 F51E 20 17 F9 JSR STORE
4217 F521 CA DEX
4218 F522 D0 F8 BNE DOPEN4
4219 F524 A5 59 DOPEN5: LDA SAVMSC+1 ;POLISH OFF DISPLAY LIST
4220 F526 20 17 F9 JSR STORE
4221 F529 A5 58 LDA SAVMSC
4222 F52B 20 17 F9 JSR STORE
4223 F52E A5 51 LDA HOLD1
4224 F530 09 40 ORA #$40
4225 F532 20 17 F9 JSR STORE
4226 F535 A9 70 LDA #$70 ;24 BLANK LINES
4227 F537 20 17 F9 JSR STORE
4228 F53A A9 70 LDA #$70
4229 F53C 20 17 F9 JSR STORE
4230 F53F A5 64 LDA ADRESS ;SAVE DISPLAY LIST ADDRESS
4231 F541 8D 30 02 STA SDLSTL
4232 F544 A5 65 LDA ADRESS+1
4233 F546 8D 31 02 STA SDLSTL+1
4234 F549 A9 70 LDA #$70 ;ADD LAST BLANK LINE ENTRY
4235 F54B 20 17 F9 JSR STORE ;POSITION ADRESS=SDLSTL-1
4236 F54E A5 64 LDA ADRESS ;STORE NEW MEMTOP
4237 F550 8D E5 02 STA MEMTOP
4238 F553 A5 65 LDA ADRESS+1
4239 F555 8D E6 02 STA MEMTOP+1
4240 F558 A5 68 LDA SAVADR
4241 F55A 85 64 STA ADRESS
4242 F55C A5 69 LDA SAVADR+1
4243 F55E 85 65 STA ADRESS+1
4244 F560 AD 31 02 LDA SDLSTL+1
4245 F563 20 17 F9 JSR STORE
4246 F566 AD 30 02 LDA SDLSTL
4247 F569 20 17 F9 JSR STORE
4248 F56C A5 4C LDA DSTAT ;IF ERROR OCURRED ON ALLOCATION, OPEN THE EDITOR
4249 F56E 10 07 BPL DOPEN9
4250 F570 48 PHA ;SAVE STATUS
4251 F571 20 FC F3 JSR EOPEN ;OPEN THE EDITOR
4252 F574 68 PLA ;RESTORE STATUS
4253 F575 A8 TAY ;AND RETURN IT TO CIO
4254 F576 60 RTS
4255 F577 A5 2A DOPEN9: LDA ICAX1Z ;TEST CLEAR INHIBIT BIT
4256 F579 29 20 AND #$20
4257 F57B D0 0B BNE DOPEN7
4258 F57D 20 B9 F7 JSR CLRSCR ;CLEAR SCREEN
4259 F580 8D 90 02 STA TXTROW ;AND HOME TEXT CURSOR (AC IS ZERO)
4260 F583 A5 52 LDA LMARGN
4261 F585 8D 91 02 STA TXTCOL
4262 F588 A9 22 DOPEN7: LDA #$22 ;EVERYTHING ELSE IS SET UP
4263 F58A 0D 2F 02 ORA SDMCTL ;SO TURN ON DMACTL
4264 F58D 8D 2F 02 STA SDMCTL
4265 F590 4C 21 F6 JMP RETURM
4266 ;
4267 ;
4268 F593 20 96 FA GETCH: JSR RANGE ;GETCH DOES INCRSR, GETPLT DOESN'T
4269 F596 20 A2 F5 JSR GETPLT
4270 F599 20 32 FB JSR INATAC ;CONVERT INTERNAL CODE TO ATASCII
4271 F59C 20 D4 F9 JSR INCRSB
4272 F59F 4C 34 F6 JMP RETUR1
4273 F5A2 20 47 F9 GETPLT: JSR CONVRT ;CONVERT ROW/COLUMN TO ADRESS
4274 F5A5 B1 64 LDA (ADRESS),Y
4275 F5A7 2D A0 02 AND DMASK
4276 F5AA 46 6F SHIFTD: LSR SHFAMT ;SHIFT DATA DOWN TO LOW BITS
4277 F5AC B0 03 BCS SHIFT1
4278 F5AE 4A LSR A
4279 F5AF 10 F9 BPL SHIFTD ;(UNCONDITIONAL)
4280 F5B1 8D FA 02 SHIFT1: STA CHAR
4281 F5B4 C9 00 CMP #0 ;RESTORE FLAGS ALSO
4282 F5B6 60 RTS
4283 ;
4284 ;
4285 ;
4286 F5B7 8D FB 02 OUTCH: STA ATACHR
4287 F5BA 20 96 FA JSR RANGE
4288 ; JSR OFFCRS
4289 F5BD AD FB 02 OUTCHA: LDA ATACHR ;TEST FOR CLEAR SCREEN
4290 F5C0 C9 7D CMP #CLRCOD
4291 F5C2 D0 06 BNE OUTCHE
4292 F5C4 20 B9 F7 JSR CLRSCR
4293 F5C7 4C 21 F6 JMP RETURM
4294 F5CA AD FB 02 OUTCHE: LDA ATACHR ;TEST FOR CARRIAGE RETURN
4295 F5CD C9 9B CMP #CR
4296 F5CF D0 06 BNE OUTCHB
4297 F5D1 20 30 FA JSR DOCRWS ;DO CR
4298 F5D4 4C 21 F6 JMP RETURM
4299 F5D7 20 E0 F5 OUTCHB: JSR OUTPLT
4300 F5DA 20 D8 F9 JSR INCRSR
4301 F5DD 4C 21 F6 JMP RETURM
4302 ;
4303 ;
4304 F5E0 AD FF 02 OUTPLT: LDA SSFLAG ;*****LOOP HERE IF START/STOP FLAG IS NON-0
4305 F5E3 D0 FB BNE OUTPLT
4306 F5E5 A2 02 LDX #2
4307 F5E7 B5 54 CRLOOP: LDA ROWCRS,X ;SAVE CURSOR LOCATION FOR DRAW LINE TO DRAW FROM
4308 F5E9 95 5A STA OLDROW,X
4309 F5EB CA DEX
4310 F5EC 10 F9 BPL CRLOOP
4311 F5EE AD FB 02 LDA ATACHR ;CONVERT ATASCII(ATACHR) TO INTERNAL(CHAR)
4312 F5F1 A8 TAY ;SAVE ATACHR
4313 F5F2 2A ROL A
4314 F5F3 2A ROL A
4315 F5F4 2A ROL A
4316 F5F5 2A ROL A
4317 F5F6 29 03 AND #3
4318 F5F8 AA TAX ;X HAS INDEX INTO ATAINT
4319 F5F9 98 TYA ;RESTORE ATACHR
4320 F5FA 29 9F AND #$9F ;STRIP OFF COLUMN ADDRESS
4321 F5FC 1D F6 FE ORA ATAINT,X ;OR IN NEW COLUMN ADDRESS
4322 F5FF 8D FA 02 OUTCH2: STA CHAR
4323 F602 20 47 F9 JSR CONVRT
4324 F605 AD FA 02 LDA CHAR
4325 F608 46 6F SHIFTU: LSR SHFAMT ;SHIFT UP TO PROPER POSITION
4326 F60A B0 04 BCS SHIFT2
4327 F60C 0A ASL A
4328 F60D 4C 08 F6 JMP SHIFTU
4329 F610 2D A0 02 SHIFT2: AND DMASK
4330 F613 85 50 STA TMPCHR ;SAVE SHIFTED DATA
4331 F615 AD A0 02 LDA DMASK ;INVERT MASK
4332 F618 49 FF EOR #$FF
4333 F61A 31 64 AND (ADRESS),Y ;MASK OFF OLD DATA
4334 F61C 05 50 ORA TMPCHR ;OR IN NEW DATA
4335 F61E 91 64 STA (ADRESS),Y
4336 F620 60 RTS
4337 ;
4338 ;
4339 F621 20 A2 F5 RETURM: JSR GETPLT ;DO CURSOR ON THE WAY OUT
4340 F624 85 5D STA OLDCHR
4341 F626 A6 57 LDX DINDEX ;GRAPHICS HAVE INVISIBLE CURSOR
4342 F628 D0 0A BNE RETUR1
4343 F62A AE F0 02 LDX CRSINH ;TEST CURSOR INHIBIT
4344 F62D D0 05 BNE RETUR1
4345 F62F 49 80 EOR #$80 ;TOGGLE MSB
4346 F631 20 FF F5 JSR OUTCH2 ;DISPLAY IT
4347 F634 A4 4C RETUR1: LDY DSTAT ;RETURN TO CIO WITH STATUS IN Y
4348 F636 A9 01 LDA #SUCCES
4349 F638 85 4C STA DSTAT ;SET STATUS= SUCCESSFUL COMPLETION
4350 F63A AD FB 02 LDA ATACHR ;PUT ATACHR IN AC FOR RETURN TO CIO
4351 F63D 60 NOFUNC: RTS ;(NON-EXISTENT FUNCTION RETURN POINT)
4352 ;
4353 ;
4354 ;
4355 ; END OF DISPLAY HANDLER
4356 ;
4357 .PAGE
4358 ;
4359 ;
4360 ;
4361 ;
4362 F63E 20 B3 FC EGETCH: JSR SWAP
4363 F641 20 88 FA JSR ERANGE
4364 F644 A5 6B LDA BUFCNT ;ANYTHING IN THE BUFFER?
4365 F646 D0 34 BNE EGETC3 ;YES
4366 F648 A5 54 LDA ROWCRS ;NO, SO SAVE BUFFER START ADDRESS
4367 F64A 85 6C STA BUFSTR
4368 F64C A5 55 LDA COLCRS
4369 F64E 85 6D STA BUFSTR+1
4370 F650 20 E2 F6 EGETC1: JSR KGETCH ;LET'S FILL OUR BUFFER
4371 F653 84 4C STY DSTAT ;SAVE KEYBOARD STATUS
4372 F655 AD FB 02 LDA ATACHR ;TEST FOR CR
4373 F658 C9 9B CMP #CR
4374 F65A F0 12 BEQ EGETC2
4375 F65C 20 AD F6 JSR DOSS ;NO, SO PRINT IT
4376 F65F 20 B3 FC JSR SWAP ;JSR DOSS DID SWAP SO SWAP BACK
4377 F662 A5 63 LDA LOGCOL ;BEEP IF NEARING LOGICAL COL 120
4378 F664 C9 71 CMP #113
4379 F666 D0 03 BNE EGETC6
4380 F668 20 0A F9 JSR BELL
4381 F66B 4C 50 F6 EGETC6: JMP EGETC1
4382 F66E 20 E4 FA EGETC2: JSR OFFCRS ;GET BUFFER COUNT
4383 F671 20 00 FC JSR DOBUFC
4384 F674 A5 6C LDA BUFSTR ;RETURN A CHARACTER
4385 F676 85 54 STA ROWCRS
4386 F678 A5 6D LDA BUFSTR+1
4387 F67A 85 55 STA COLCRS
4388 F67C A5 6B EGETC3: LDA BUFCNT
4389 F67E F0 11 BEQ EGETC5
4390 F680 C6 6B EGETC7: DEC BUFCNT ;AND RETURN TILL BUFCNT=0
4391 F682 F0 0D BEQ EGETC5
4392 F684 A5 4C LDA DSTAT ;IF ERROR, LOOP ON EGETC7 UNTIL BUFFER IS EMPTIED
4393 F686 30 F8 BMI EGETC7
4394 F688 20 93 F5 JSR GETCH
4395 F68B 8D FB 02 STA ATACHR
4396 F68E 4C B3 FC JMP SWAP ;AND RETURN WITHOUT TURNING CURSOR BACK ON
4397 F691 20 30 FA EGETC5: JSR DOCRWS ;DO REAL CARRIAGE RETURN
4398 F694 A9 9B LDA #CR ;AND RETURN EOL
4399 F696 8D FB 02 STA ATACHR
4400 F699 20 21 F6 JSR RETURM ;TURN ON CURSOR THEN SWAP
4401 F69C 84 4C STY DSTAT ;SAVE KEYBOARD STATUS
4402 F69E 4C B3 FC JMP SWAP ;AND RETURN THROUGH RETUR1
4403 ;
4404 F6A1 6C 64 00 JSRIND: JMP (ADRESS) ;JSR TO THIS CAUSES JSR INDIRECT
4405 ;
4406 F6A4 8D FB 02 EOUTCH: STA ATACHR ;SAVE ATASCII VALUE
4407 F6A7 20 B3 FC JSR SWAP
4408 F6AA 20 88 FA JSR ERANGE
4409 F6AD 20 E4 FA DOSS: JSR OFFCRS ;TURN OFF CURSOR
4410 F6B0 20 8D FC JSR TSTCTL ;TEST FOR CONTROL CHARACTERS (Z=1 IF CTL)
4411 F6B3 F0 09 BEQ EOUTC5
4412 F6B5 0E A2 02 EOUTC6: ASL ESCFLG ;ESCFLG ONLY WORKS ONCE
4413 F6B8 20 CA F5 JSR OUTCHE
4414 F6BB 4C B3 FC ERETN: JMP SWAP ;AND RETURN THROUGH RETUR1
4415 F6BE AD FE 02 EOUTC5: LDA DSPFLG ;DO DSPFLG AND ESCFLG
4416 F6C1 0D A2 02 ORA ESCFLG
4417 F6C4 D0 EF BNE EOUTC6 ;IF NON-0 DISPLAY RATHER THAN EXECUTE IT
4418 F6C6 0E A2 02 ASL ESCFLG
4419 F6C9 E8 INX ;PROCESS CONTROL CHARACTERS
4420 F6CA BD C6 FE LDA CNTRLS,X ;GET DISPLACEMENT INTO ROUTINE
4421 F6CD 85 64 STA ADRESS
4422 F6CF BD C7 FE LDA CNTRLS+1,X ;GET HIGH BYTE
4423 F6D2 85 65 STA ADRESS+1
4424 F6D4 20 A1 F6 JSR JSRIND ;DO COMPUTED JSR
4425 F6D7 20 21 F6 JSR RETURM ;DO CURSOR
4426 F6DA 4C B3 FC JMP SWAP ;ALL DONE SO RETURN THROUGH RETUR1
4427 ;
4428 ;
4429 ;
4430 ;
4431 ; END SCREEN EDITOR.
4432 ;
4433 ;
4434 ; BEGIN KEYBOARD HANDLER
4435 ;
4436 ;
4437 ;
4438 ;
4439 F6DD A9 FF KGETC2: LDA #$FF
4440 F6DF 8D FC 02 STA CH
4441 F6E2 A5 2A KGETCH: LDA ICAX1Z ;TEST LSB OF AUX1 FOR SPECIAL EDITOR READ MODE
4442 F6E4 4A LSR A
4443 F6E5 B0 62 BCS GETOUT
4444 F6E7 A9 80 LDA #BRKABT
4445 F6E9 A6 11 LDX BRKKEY ;TEST BREAK
4446 F6EB F0 58 BEQ K7 ;IF BREAK, PUT BRKABT IN DSTAT AND CR IN ATACHR
4447 F6ED AD FC 02 LDA CH
4448 F6F0 C9 FF CMP #$FF
4449 F6F2 F0 EE BEQ KGETCH
4450 F6F4 85 7C STA HOLDCH ;SAVE CH FOR SHIFT LOCK PROC
4451 F6F6 A2 FF LDX #$FF ;"CLEAR" CH
4452 F6F8 8E FC 02 STX CH
4453 F6FB 20 D8 FC JSR CLICK ;DO KEYBOARD AUDIO FEEDBACK (A IS OK)
4454 F6FE AA KGETC3: TAX ;DO ASCCON
4455 F6FF E0 C0 CPX #$C0 ;TEST FOR CTL & SHIFT TOGETHER
4456 F701 90 02 BCC ASCCO1
4457 F703 A2 03 LDX #3 ;BAD CODE
4458 F705 BD FE FE ASCCO1: LDA ATASCI,X
4459 F708 8D FB 02 STA ATACHR ;DONE
4460 F70B C9 80 CMP #$80 ;DO NULLS
4461 F70D F0 CE BEQ KGETC2
4462 F70F C9 81 CMP #$81 ;CHECK ATARI KEY
4463 F711 D0 0B BNE KGETC1
4464 F713 AD B6 02 LDA INVFLG
4465 F716 49 80 EOR #$80
4466 F718 8D B6 02 STA INVFLG
4467 F71B 4C DD F6 JMP KGETC2 ;DONT RETURN A VALUE
4468 F71E C9 82 KGETC1: CMP #$82 ;CAPS/LOWER
4469 F720 D0 07 BNE K1
4470 F722 A9 00 LDA #0 ;CLEAR SHFLOK
4471 F724 8D BE 02 STA SHFLOK
4472 F727 F0 B4 BEQ KGETC2
4473 F729 C9 83 K1: CMP #$83 ;SHIFT CAPS/LOWER
4474 F72B D0 07 BNE K2
4475 F72D A9 40 LDA #$40
4476 F72F 8D BE 02 STA SHFLOK ;SHIFT BIT
4477 F732 D0 A9 BNE KGETC2
4478 F734 C9 84 K2: CMP #$84 ;CNTL CAPS/LOWER
4479 F736 D0 07 BNE K3
4480 F738 A9 80 LDA #$80 ;CNTL BIT
4481 F73A 8D BE 02 STA SHFLOK
4482 F73D D0 9E BNE KGETC2
4483 F73F C9 85 K3: CMP #$85 ;DO EOF
4484 F741 D0 0A BNE K6
4485 F743 A9 88 LDA #EOFERR
4486 F745 85 4C K7: STA DSTAT
4487 F747 85 11 STA BRKKEY ;RESTORE BREAK
4488 F749 A9 9B GETOUT: LDA #CR ;PUT CR IN ATACHR
4489 F74B D0 26 BNE K8 ;(UNCONDITIONAL)
4490 F74D A5 7C K6: LDA HOLDCH ;PROCESS SHIFT LOCKS
4491 F74F C9 40 CMP #$40 ;REGULAR SHIFT AND CONTROL TAKE PRECEDENCE
4492 F751 B0 15 BCS K5 ;OVER LOCK
4493 F753 AD FB 02 LDA ATACHR ;TEST FOR ALPHA
4494 F756 C9 61 CMP #$61 ;LOWER CASE A
4495 F758 90 0E BCC K5 ;NOT ALPHA IF LT
4496 F75A C9 7B CMP #$7B ;LOWER CASE Z+1
4497 F75C B0 0A BCS K5 ;NOT ALPHA IF GE
4498 F75E AD BE 02 LDA SHFLOK ;DO SHIFT/CONTROL LOCK
4499 F761 F0 05 BEQ K5 ;IF NO LOCK, DONT RE-DO IT
4500 F763 05 7C ORA HOLDCH
4501 F765 4C FE F6 JMP KGETC3 ;DO RETRY
4502 F768 20 8D FC K5: JSR TSTCTL ;DONT INVERT MSB OF CONTROL CHARACTERS
4503 F76B F0 09 BEQ K4
4504 F76D AD FB 02 LDA ATACHR
4505 F770 4D B6 02 EOR INVFLG
4506 F773 8D FB 02 K8: STA ATACHR
4507 F776 4C 34 F6 K4: JMP RETUR1 ;ALL DONE
4508 ;
4509 ;
4510 .PAGE
4511 ;
4512 ;
4513 ; CONTROL CHARACTER PROCESSORS
4514 ;
4515 F779 A9 80 ESCAPE: LDA #$80 ;SET ESCAPE FLAG
4516 F77B 8D A2 02 STA ESCFLG
4517 F77E 60 RTS
4518 F77F C6 54 CRSRUP: DEC ROWCRS
4519 F781 10 06 BPL COMRET
4520 F783 AE BF 02 LDX BOTSCR ;WRAPAROUND
4521 F786 CA DEX
4522 F787 86 54 UPDNCM: STX ROWCRS
4523 F789 4C 5C FC COMRET: JMP STRBEG ;COLVERT ROW AND COL TO LOGCOL AND RETURN
4524 F78C E6 54 CRSRDN: INC ROWCRS
4525 F78E A5 54 LDA ROWCRS
4526 F790 CD BF 02 CMP BOTSCR
4527 F793 90 F4 BCC COMRET
4528 F795 A2 00 LDX #0
4529 F797 F0 EE BEQ UPDNCM ;(UNCONDITIONAL)
4530 F799 C6 55 CRSRLF: DEC COLCRS
4531 F79B A5 55 LDA COLCRS
4532 F79D 30 04 BMI CRSRL1 ;(IF LMARGN=0, THIS ELIMINATES PROBLEM CASE)
4533 F79F C5 52 CMP LMARGN
4534 F7A1 B0 04 BCS COMRE1
4535 F7A3 A5 53 CRSRL1: LDA RMARGN
4536 F7A5 85 55 LFRTCM: STA COLCRS
4537 F7A7 4C DD FB COMRE1: JMP DOLCOL ;COLVERT ROW AND COL TO LOGCOL AND RETURN
4538 F7AA E6 55 CRSRRT: INC COLCRS
4539 F7AC A5 55 LDA COLCRS
4540 F7AE C5 53 CMP RMARGN
4541 F7B0 90 F5 BCC COMRE1
4542 F7B2 F0 F3 BEQ COMRE1 ;(CAUSE BLE)
4543 F7B4 A5 52 LDA LMARGN
4544 F7B6 4C A5 F7 JMP LFRTCM ;UNCONDITIONAL TO COMMON STORE
4545 F7B9 20 F3 FC CLRSCR: JSR PUTMSC
4546 F7BC A0 00 LDY #0
4547 F7BE 98 TYA ;PUT 0 IN THE AC
4548 F7BF 91 64 CLRSC2: STA (ADRESS),Y ;(AC IS ZERO)
4549 F7C1 C8 INY
4550 F7C2 D0 FB BNE CLRSC2
4551 F7C4 E6 65 INC ADRESS+1
4552 F7C6 A6 65 LDX ADRESS+1
4553 F7C8 E4 6A CPX RAMTOP
4554 F7CA 90 F3 BCC CLRSC2
4555 F7CC A9 FF LDA #$FF ;CLEAN UP LOGICAL LINE BIT MAP
4556 F7CE 99 B2 02 CLRSC3: STA LOGMAP,Y ;(Y IS ZERO AFTER CLRSC2 LOOP)
4557 F7D1 C8 INY
4558 F7D2 C0 04 CPY #4
4559 F7D4 90 F8 BCC CLRSC3
4560 F7D6 20 E4 FC HOME: JSR COLCR ;PLACE COLCRS AT LEFT EDGE
4561 F7D9 85 63 STA LOGCOL
4562 F7DB 85 6D STA BUFSTR+1
4563 F7DD A9 00 LDA #0
4564 F7DF 85 54 STA ROWCRS
4565 F7E1 85 56 STA COLCRS+1
4566 F7E3 85 6C STA BUFSTR
4567 F7E5 60 RTS
4568 ;
4569 F7E6 A5 63 BS: LDA LOGCOL ;BACKSPACE
4570 F7E8 C5 52 CMP LMARGN
4571 F7EA F0 21 BEQ BS1
4572 F7EC A5 55 BSA: LDA COLCRS ;LEFT EDGE?
4573 F7EE C5 52 CMP LMARGN
4574 F7F0 D0 03 BNE BS3 ;NO
4575 F7F2 20 73 FC JSR DELTIM ;YES, SEE IF LINE SHOULD BE DELETED
4576 F7F5 20 99 F7 BS3: JSR CRSRLF
4577 F7F8 A5 55 LDA COLCRS
4578 F7FA C5 53 CMP RMARGN
4579 F7FC D0 07 BNE BS2
4580 F7FE A5 54 LDA ROWCRS
4581 F800 F0 03 BEQ BS2
4582 F802 20 7F F7 JSR CRSRUP
4583 F805 A9 20 BS2: LDA #$20 ;MAKE BACKSPACE DESTRUCTIVE
4584 F807 8D FB 02 STA ATACHR
4585 F80A 20 E0 F5 JSR OUTPLT
4586 F80D 4C DD FB BS1: JMP DOLCOL ;AND RETURN
4587 F810 20 AA F7 TAB: JSR CRSRRT ;BEGIN SEARCH
4588 F813 A5 55 LDA COLCRS ;TEST FOR NEW LINE
4589 F815 C5 52 CMP LMARGN
4590 F817 D0 0A BNE TAB1 ;NO
4591 F819 20 34 FA JSR DOCR ;DO CARRIAGE RETURN
4592 F81C 20 20 FB JSR LOGGET ;CHECK IF END OF LOGICAL LINE
4593 F81F 90 02 BCC TAB1 ;NO, CONTINUE
4594 F821 B0 07 BCS TAB2 ;(UNCONDITIONAL)
4595 F823 A5 63 TAB1: LDA LOGCOL ;CHECK FOR TAB STOP
4596 F825 20 25 FB JSR BITGET
4597 F828 90 E6 BCC TAB ;NO, SO KEEP LOOKING
4598 F82A 4C DD FB TAB2: JMP DOLCOL ;COLVERT ROW AND COL TO LOGCOL AND RETURN
4599 F82D A5 63 SETTAB: LDA LOGCOL
4600 F82F 4C 06 FB JMP BITSET ;SET BIT IN MAP AND RETURN
4601 F832 A5 63 CLRTAB: LDA LOGCOL
4602 F834 4C 12 FB JMP BITCLR ;CLEAR " " " " "
4603 F837 20 9D FC INSCHR: JSR PHACRS
4604 F83A 20 A2 F5 JSR GETPLT ;GET CHARACTER UNDER CURSOR
4605 F83D 85 7D STA INSDAT
4606 F83F A9 00 LDA #0
4607 F841 8D BB 02 STA SCRFLG
4608 F844 20 FF F5 INSCH4: JSR OUTCH2 ;STORE DATA
4609 F847 A5 63 LDA LOGCOL ;SAVE LOGCOL: IF AFTER INCRSA LOGCOL IS
4610 F849 48 PHA ;< THAN IT IS NOW, END LOOP
4611 F84A 20 DC F9 JSR INCRSA ;SPECIAL INCRSR ENTRY POINT
4612 F84D 68 PLA
4613 F84E C5 63 CMP LOGCOL
4614 F850 B0 0C BCS INSCH3 ;QUIT
4615 F852 A5 7D INSCH1: LDA INSDAT ;KEEP GOING
4616 F854 48 PHA
4617 F855 20 A2 F5 JSR GETPLT
4618 F858 85 7D STA INSDAT
4619 F85A 68 PLA
4620 F85B 4C 44 F8 JMP INSCH4
4621 F85E 20 A8 FC INSCH3: JSR PLACRS
4622 F861 CE BB 02 INSCH6: DEC SCRFLG
4623 F864 30 04 BMI INSCH5 ;IF SCROLL OCCURRED
4624 F866 C6 54 DEC ROWCRS ;MOVE CURSOR UP
4625 F868 D0 F7 BNE INSCH6 ;(UNCOND) CONTINUE UNTIL SCRFLG IS MINUS
4626 F86A 4C DD FB INSCH5: JMP DOLCOL ;COLVERT ROW AND COL TO LOGCOL AND RETURN
4627 ;
4628 ;
4629 F86D 20 9D FC DELCHR: JSR PHACRS
4630 F870 20 47 F9 DELCH1: JSR CONVRT ;GET DATA TO THE RIGHT OF THE CURSOR
4631 F873 A5 64 LDA ADRESS
4632 F875 85 68 STA SAVADR ;SAVE ADRESS TO KNOW WHERE TO PUT DATA
4633 F877 A5 65 LDA ADRESS+1
4634 F879 85 69 STA SAVADR+1
4635 F87B A5 63 LDA LOGCOL
4636 F87D 48 PHA
4637 F87E 20 D4 F9 JSR INCRSB ;PUT CURSOR OVER NEXT CHARACTER
4638 F881 68 PLA
4639 F882 C5 63 CMP LOGCOL ;TEST NEW LOGCOL AGAINST OLD LOGCOL
4640 F884 B0 10 BCS DELCH2 ;IF OLD.GE.NEW THEN QUIT
4641 F886 A5 54 LDA ROWCRS ;IS ROW OFF SCREEN?
4642 F888 CD BF 02 CMP BOTSCR
4643 F88B B0 09 BCS DELCH2 ;YES, SO QUIT
4644 F88D 20 A2 F5 JSR GETPLT ;GET DATA UNDER CURSOR
4645 F890 A0 00 LDY #0
4646 F892 91 68 STA (SAVADR),Y ;PUT IT IN PREVIOUS POSITION
4647 F894 F0 DA BEQ DELCH1 ;AND LOOP (UNCONDITIONAL)
4648 F896 A0 00 DELCH2: LDY #0
4649 F898 98 TYA
4650 F899 91 68 STA (SAVADR),Y ;CLEAR THE LAST POSITION
4651 F89B 20 68 FC JSR DELTIA ;TRY TO DELETE A LINE
4652 F89E 20 A8 FC JSR PLACRS
4653 F8A1 4C DD FB JMP DOLCOL ;AND RETURN
4654 F8A4 38 INSLIN: SEC ;NORMAL INSLIN PUTS "1" INTO BIT MAP
4655 F8A5 20 7B FB INSLIA: JSR EXTEND ;ENTRY POINT FOR C=0
4656 F8A8 A5 52 LDA LMARGN ;DO CARRIAGE RETURN (NO LF)
4657 F8AA 85 55 STA COLCRS
4658 F8AC 20 47 F9 JSR CONVRT ;GET ADDRESS
4659 F8AF A5 64 LDA ADRESS ;SET UP T0=40+FROM (FROM = CURSOR)
4660 F8B1 85 68 STA FRMADR
4661 F8B3 18 CLC
4662 F8B4 69 28 ADC #40
4663 F8B6 85 66 STA TOADR
4664 F8B8 A5 65 LDA ADRESS+1
4665 F8BA 85 69 STA FRMADR+1
4666 F8BC 69 00 ADC #0
4667 F8BE 85 67 STA TOADR+1
4668 F8C0 A6 54 LDX ROWCRS ;SET UP LOOP COUNTER
4669 F8C2 E0 17 CPX #23
4670 F8C4 F0 08 BEQ INSLI2
4671 F8C6 20 4E FB INSLI1: JSR MOVLIN
4672 F8C9 E8 INX
4673 F8CA E0 17 CPX #23
4674 F8CC D0 F8 BNE INSLI1
4675 F8CE 20 9B FB INSLI2: JSR CLRLIN ;CLEAR CURRENT LINE
4676 F8D1 4C DD FB JMP DOLCOL ;COLVERT ROW AND COL TO LOGCOL AND RETURN
4677 F8D4 20 DD FB DELLIN: JSR DOLCOL ;GET BEGINNING OF LOG LINE (HOLD1)
4678 F8D7 A4 51 DELLIA: LDY HOLD1 ;SQUEEZE BIT MAP
4679 F8D9 84 54 STY ROWCRS ;PUT CURSOR THERE
4680 F8DB A4 54 DELLIB: LDY ROWCRS
4681 F8DD 98 DELLI1: TYA
4682 F8DE 38 SEC
4683 F8DF 20 23 FB JSR LO2GET ;GET NEXT BIT
4684 F8E2 08 PHP
4685 F8E3 98 TYA
4686 F8E4 18 CLC
4687 F8E5 69 78 ADC #120
4688 F8E7 28 PLP
4689 F8E8 20 04 FB JSR BITPUT ;WRITE IT OVER PRESENT BIT
4690 F8EB C8 INY
4691 F8EC C0 18 CPY #24
4692 F8EE D0 ED BNE DELLI1 ;LOOP
4693 F8F0 AD B4 02 LDA LOGMAP+2 ;SET LSB
4694 F8F3 09 01 ORA #1
4695 F8F5 8D B4 02 STA LOGMAP+2
4696 F8F8 A5 52 DELLI2: LDA LMARGN ;DELETE LINE OF DATA USING PART OF SCROLL
4697 F8FA 85 55 STA COLCRS ;CR NO LF
4698 F8FC 20 47 F9 JSR CONVRT
4699 F8FF 20 B7 FB JSR SCROL1
4700 F902 20 20 FB JSR LOGGET ;TEST NEXT LINE FOR CONTINUATION
4701 ;IS IT A NEW LOG LINE?
4702 F905 90 D4 BCC DELLIB ;NO SO DELETE ANOTHER
4703 F907 4C DD FB JMP DOLCOL ;YES SO DOLCOL AND RETURN
4704 F90A A0 20 BELL: LDY #$20
4705 F90C 20 D8 FC BELL1: JSR CLICK
4706 F90F 88 DEY
4707 F910 10 FA BPL BELL1
4708 F912 60 RTS
4709 .PAGE
4710 ;
4711 ;
4712 ; ROUTINES
4713 ;
4714 ;
4715 ; DOUBLE BYTE DECREMENT OF INDIRECT POINTER
4716 ;INCLUDING DB SUBTRACT AND DB DOUBLE DECREMENT
4717 ;
4718 F913 A9 02 DBDDEC: LDA #2
4719 F915 D0 0A BNE DBSUB ;(UNCONDITIONAL)
4720 ;
4721 ; STORE DATA INDIRECT AND DECREMENT POINTER
4722 ; (PLACED HERE TO SAVE JMP DBDEC AFTER STORE)
4723 F917 A4 4C STORE: LDY DSTAT ;RETURN ON ERROR
4724 F919 30 2B BMI STROK
4725 F91B A0 00 LDY #0
4726 F91D 91 64 STORE1: STA (ADRESS),Y
4727 ; JMP DBDEC DECREMENT AND RETURN
4728 ;
4729 F91F A9 01 DBDEC: LDA #1
4730 F921 8D 9E 02 DBSUB: STA SUBTMP
4731 F924 A5 4C LDA DSTAT ;RETURN ON ERROR
4732 F926 30 1E BMI STROK
4733 F928 A5 64 LDA ADRESS
4734 F92A 38 SEC
4735 F92B ED 9E 02 SBC SUBTMP
4736 F92E 85 64 STA ADRESS
4737 F930 B0 02 BCS DBSUB1
4738 F932 C6 65 DEC ADRESS+1
4739 F934 A5 0F DBSUB1: LDA APPMHI+1 ;MAKE SURE NOTHING EVER OVERWRITES APPMHI
4740 F936 C5 65 CMP ADRESS+1
4741 F938 90 0C BCC STROK ;OK
4742 F93A D0 06 BNE STRERR ;ERROR
4743 F93C A5 0E LDA APPMHI
4744 F93E C5 64 CMP ADRESS
4745 F940 90 04 BCC STROK
4746 F942 A9 93 STRERR: LDA #SCRMEM ;SHOW MEM TOO SMALL FOR SCREEN ERROR
4747 F944 85 4C STA DSTAT
4748 F946 60 STROK: RTS
4749 ;
4750 ;
4751 ;
4752 ; CONVERT ROW/COLUMN CURSOR INTO REAL ADDRESS (FROM SAVMSC ON UP)
4753 ;
4754 F947 A5 54 CONVRT: LDA ROWCRS ;SAVE CURSOR
4755 F949 48 PHA
4756 F94A A5 55 LDA COLCRS
4757 F94C 48 PHA
4758 F94D A5 56 LDA COLCRS+1
4759 F94F 48 PHA
4760 F950 20 F3 FC JSR PUTMSC
4761 F953 A5 54 LDA ROWCRS ;PUT 10*ROWCRS INTO MLTTMP
4762 F955 85 66 STA MLTTMP
4763 F957 A9 00 LDA #0
4764 F959 85 67 STA MLTTMP+1
4765 F95B A5 66 LDA MLTTMP ;QUICK X8
4766 F95D 0A ASL A
4767 F95E 26 67 ROL MLTTMP+1
4768 F960 85 51 STA HOLD1 ; (SAVE 2X VALUE)
4769 F962 A4 67 LDY MLTTMP+1 ; ""
4770 F964 8C 9F 02 STY HOLD2 ; ""
4771 F967 0A ASL A
4772 F968 26 67 ROL MLTTMP+1
4773 F96A 0A ASL A
4774 F96B 26 67 ROL MLTTMP+1
4775 F96D 18 CLC ;ADD IN 2X
4776 F96E 65 51 ADC HOLD1
4777 F970 85 66 STA MLTTMP
4778 F972 A5 67 LDA MLTTMP+1
4779 F974 6D 9F 02 ADC HOLD2
4780 F977 85 67 STA MLTTMP+1
4781 F979 A6 57 LDX DINDEX ;NOW SHIFT MLTTMP LEFT DHLINE TIMES TO FINISH
4782 F97B BC 81 FE LDY DHLINE,X ;MULTIPLY
4783 F97E 88 CONVR1: DEY ;LOOP N TIMES
4784 F97F 30 07 BMI CONVR2
4785 F981 06 66 ASL MLTTMP
4786 F983 26 67 ROL MLTTMP+1
4787 F985 4C 7E F9 JMP CONVR1
4788 F988 BC A5 FE CONVR2: LDY DIV2TB,X ;NOW DIVIDE HCRSR TO ACCOUNT FOR PARTIAL BYTES
4789 F98B A5 55 LDA COLCRS
4790 F98D A2 07 LDX #7 ;* TRICKY *
4791 F98F 88 CONVR3: DEY
4792 F990 30 0A BMI CONVR4
4793 F992 CA DEX
4794 F993 46 56 LSR COLCRS+1
4795 F995 6A ROR A
4796 F996 6E A1 02 ROR TMPLBT ;SAVE LOW BITS FOR MASK
4797 F999 4C 8F F9 JMP CONVR3
4798 F99C C8 CONVR4: INY ;SO Y IS ZERO UPON RETURN FROM THIS ROUTINE
4799 F99D 18 CLC
4800 F99E 65 66 ADC MLTTMP ;ADD SHIFTED COLCRS TO MLTTMP
4801 F9A0 85 66 STA MLTTMP
4802 F9A2 90 02 BCC CONVR5
4803 F9A4 E6 67 INC MLTTMP+1
4804 F9A6 38 CONVR5: SEC ;* TRICKY *
4805 F9A7 6E A1 02 CONVR6 ROR TMPLBT ;SLIDE A "1" UP AGAINST LOW BITS (CONTINUE TILL X=-1)
4806 F9AA 18 CLC
4807 F9AB CA DEX ;AND FINISH SHIFT SO LOW BITS ARE
4808 F9AC 10 F9 BPL CONVR6 ;RIGHT JUSTIFIED.
4809 F9AE AE A1 02 LDX TMPLBT ;TMPLBT IS NOW THE INDEX INTO DMASKTB
4810 F9B1 A5 66 LDA MLTTMP ;PREPARE FOR RETURN
4811 F9B3 18 CLC
4812 F9B4 65 64 ADC ADRESS
4813 F9B6 85 64 STA ADRESS
4814 F9B8 85 5E STA OLDADR ;REMEMBER THIS ADDRESS FOR CURSOR
4815 F9BA A5 67 LDA MLTTMP+1
4816 F9BC 65 65 ADC ADRESS+1
4817 F9BE 85 65 STA ADRESS+1
4818 F9C0 85 5F STA OLDADR+1
4819 F9C2 BD B1 FE LDA DMASKT,X
4820 F9C5 8D A0 02 STA DMASK
4821 F9C8 85 6F STA SHFAMT
4822 F9CA 68 PLA
4823 F9CB 85 56 STA COLCRS+1
4824 F9CD 68 PLA
4825 F9CE 85 55 STA COLCRS
4826 F9D0 68 PLA
4827 F9D1 85 54 STA ROWCRS
4828 F9D3 60 RTS
4829 ;
4830 ;
4831 ; INCREMENT CURSOR AND DETECT BOTH END OF LINE AND END OF SCREEN
4832 ;
4833 F9D4 A9 00 INCRSB: LDA #0 ;NON-EXTEND ENTRY POINT
4834 F9D6 F0 02 BEQ INCRSC
4835 F9D8 A9 9B INCRSR: LDA #$9B ;SPECIAL CASE ELIMINATOR
4836 F9DA 85 7D INCRSC: STA INSDAT
4837 F9DC E6 63 INCRSA: INC LOGCOL ;(INSCHR ENTRY POINT)
4838 F9DE E6 55 INC COLCRS
4839 F9E0 D0 02 BNE INCRS2 ;DO HIGH BYTE
4840 F9E2 E6 56 INC COLCRS+1
4841 F9E4 A5 55 INCRS2: LDA COLCRS ;TEST END OF LINE
4842 F9E6 A6 57 LDX DINDEX
4843 F9E8 DD 8D FE CMP COLUMN,X ;TEST TABLED VALUE FOR ALL SCREEN MODES
4844 F9EB F0 0B BEQ INC2A ;DO CR IF EQUAL
4845 F9ED E0 00 CPX #0 ;MODE 0?
4846 F9EF D0 06 BNE INCRS3 ;IF NOT, JUST RETURN
4847 F9F1 C5 53 CMP RMARGN ;TEST AGAINST RMARGN
4848 F9F3 F0 02 BEQ INCRS3 ;EQUAL IS OK
4849 F9F5 B0 01 BCS INC2A ;IF GREATER THAN, DO CR
4850 F9F7 60 INCRS3: RTS
4851 F9F8 E0 08 INC2A: CPX #8 ;CHECK MODE
4852 F9FA 90 04 BCC DOCR1 ;NOT 320X1 SO DO IT
4853 F9FC A5 56 LDA COLCRS+1 ;TEST MSD
4854 F9FE F0 F7 BEQ INCRS3 ;ONLY AT 64 SO DON'T DO IT
4855 FA00 A5 57 DOCR1: LDA DINDEX ;DONT MESS WITH LOGMAP IF NO MODE ZERO
4856 FA02 D0 30 BNE DOCR
4857 FA04 A5 63 LDA LOGCOL ;TEST LINE OVERRUN
4858 FA06 C9 51 CMP #81
4859 FA08 90 0A BCC DOCR1B ;IF LESS THAN 81 IT IS DEFINITELY NOT LINE 3
4860 FA0A A5 7D LDA INSDAT
4861 FA0C F0 26 BEQ DOCR ;ONLY DO LOG LINE OVERFLOW IF INSDAT <>0
4862 FA0E 20 30 FA JSR DOCRWS ;LOG LINE OVERFLOW IS SPECIAL CASE
4863 FA11 4C 77 FA JMP INCRS1 ;RETURN
4864 FA14 20 34 FA DOCR1B: JSR DOCR ;GET IT OVER WITH
4865 FA17 A5 54 LDA ROWCRS
4866 FA19 18 CLC ;TEST LOGICAL LINE BIT MAP
4867 FA1A 69 78 ADC #120
4868 FA1C 20 25 FB JSR BITGET
4869 FA1F 90 08 BCC DOCR1A ;DONT EXTEND IF OVERRUN IS INTO MIDDLE OF LOG LINE
4870 FA21 A5 7D LDA INSDAT ;DONT EXTEND IF INSDAT IS ZERO
4871 FA23 F0 04 BEQ DOCR1A ;(INSCHR SPECIAL CASE)
4872 FA25 18 CLC ;INSERT "0" INTO BIT MAP
4873 FA26 20 A5 F8 JSR INSLIA
4874 FA29 4C DD FB DOCR1A: JMP DOLCOL ;CONVERT ROW AND COL TO LOGCOL AND RETURN
4875 FA2C A9 00 NOSCRL: LDA #0 ;DOCR WITHOUT SCROLL
4876 FA2E F0 02 BEQ NOSCR1 ;(UNCONDITIONAL)
4877 FA30 A9 9B DOCRWS: LDA #$9B ;DOCR WITH SCROLLING (NORMAL MODE)
4878 FA32 85 7D NOSCR1: STA INSDAT
4879 FA34 20 E4 FC DOCR: JSR COLCR ;PLACE COLCRS AT LEFT EDGE
4880 FA37 A9 00 LDA #0
4881 FA39 85 56 STA COLCRS+1
4882 FA3B E6 54 INC ROWCRS
4883 FA3D A6 57 DOCR2: LDX DINDEX
4884 FA3F A0 18 LDY #24 ;SET UP SCROLL LOOP COUNTER
4885 FA41 24 7B BIT SWPFLG
4886 FA43 10 05 BPL DOCR2A ;BRANCH IF NORMAL
4887 FA45 A0 04 LDY #4
4888 FA47 98 TYA
4889 FA48 D0 03 BNE DOCR2B ;(UNCONDITIONAL)
4890 FA4A BD 99 FE DOCR2A: LDA NOROWS,X ;GET NO OF ROWS
4891 FA4D C5 54 DOCR2B: CMP ROWCRS
4892 FA4F D0 26 BNE INCRS1
4893 FA51 8C 9D 02 STY HOLD3
4894 FA54 8A TXA ;DONT SCROLL IF MODE <> 0
4895 FA55 D0 20 BNE INCRS1
4896 FA57 A5 7D LDA INSDAT ;OR IF INSDAT = 0
4897 FA59 F0 1C BEQ INCRS1
4898 ; LDA INSDAT IF INSDAT <> $9B THEN ROLL IN A 0
4899 FA5B C9 9B CMP #$9B ;TO EXTEND BOTTOM LOGICAL LINE
4900 FA5D 38 SEC
4901 FA5E F0 01 BEQ DOCR4B
4902 FA60 18 CLC
4903 FA61 20 AC FB DOCR4B: JSR SCROLL ;LOOP BACK TO HERE IF >1 SCROLLS
4904 FA64 EE BB 02 INC SCRFLG
4905 FA67 C6 6C DEC BUFSTR ;ROWS MOVE UP SO BUFSTR SHOULD TOO
4906 FA69 CE 9D 02 DEC HOLD3
4907 FA6C AD B2 02 LDA LOGMAP
4908 FA6F 38 SEC ;FOR PARTIAL LINES, ROLL IN A "1"
4909 FA70 10 EF BPL DOCR4B ;AGAIN IF PARTIAL LOGICAL LINE
4910 FA72 AD 9D 02 LDA HOLD3 ;PLACE CURSOR AT NEW LINE NEAR THE BOTTOM
4911 FA75 85 54 STA ROWCRS
4912 FA77 4C DD FB INCRS1: JMP DOLCOL ;COLVERT ROW AND COL TO LOGCOL AND RETURN
4913 ;
4914 ;
4915 ; SUBEND: SUBTRACT ENDPT FROM ROWAC OR COLAC. (X=0 OR 2)
4916 ;
4917 FA7A 38 SUBEND: SEC
4918 FA7B B5 70 LDA ROWAC,X
4919 FA7D E5 74 SBC ENDPT
4920 FA7F 95 70 STA ROWAC,X
4921 FA81 B5 71 LDA ROWAC+1,X
4922 FA83 E5 75 SBC ENDPT+1
4923 FA85 95 71 STA ROWAC+1,X
4924 FA87 60 RTS
4925 ;
4926 ;
4927 ; RANGE: DO CURSOR RANGE TEST. IF ERROR, POP STACK TWICE AND JMP RETURN
4928 ;(ERANGE IS EDITOR ENTRY POINT AND TEST IF EDITOR IS OPEN.
4929 ;IF IT ISNT IT OPENS THE EDITOR AND CONTINUES)
4930 ;
4931 FA88 AD BF 02 ERANGE: LDA BOTSCR ;IF BOTSCR=4
4932 FA8B C9 04 CMP #4
4933 FA8D F0 07 BEQ RANGE ;THEN IT IS IN MIXED MODE AND OK
4934 FA8F A5 57 LDA DINDEX ;IF MODE = 0
4935 FA91 F0 03 BEQ RANGE ;THEN IT IS IN EDITOR MODE AND OK
4936 FA93 20 FC F3 JSR EOPEN ;IF NOT, OPEN EDITOR
4937 FA96 A9 27 RANGE: LDA #39 ;***** RANGE CHECK RMARGN ***** SET UP AC
4938 FA98 C5 53 CMP RMARGN ;***** RANGE CHECK RMARGN ***** COMPARE
4939 FA9A B0 02 BCS RANGE3 ;***** RANGE CHECK RMARGN ***** BRANCH GE
4940 FA9C 85 53 STA RMARGN ;***** RANGE CHECK RMARGN ***** BAD SO STORE 39
4941 FA9E A6 57 RANGE3: LDX DINDEX
4942 FAA0 BD 99 FE LDA NOROWS,X ;CHECK ROWS
4943 FAA3 C5 54 CMP ROWCRS
4944 FAA5 90 2A BCC RNGERR ;(ERROR IF TABLE.GE.ROWCRS)
4945 FAA7 F0 28 BEQ RNGERR
4946 FAA9 E0 08 CPX #8 ;CHECK FOR 320X1
4947 FAAB D0 0A BNE RANGE1 ;SPECIAL CASE IT
4948 FAAD A5 56 LDA COLCRS+1
4949 FAAF F0 13 BEQ RNGOK ;IF HIGH BYTE IS 0, COL IS OK
4950 FAB1 C9 01 CMP #1
4951 FAB3 D0 1C BNE RNGERR ;IF >1, BAD
4952 FAB5 F0 04 BEQ RANGE2 ;IF 1, GO CHECK LOW BYTE
4953 FAB7 A5 56 RANGE1: LDA COLCRS+1 ;FOR OTHERS, NON-ZERO HIGH BYTE IS BAD
4954 FAB9 D0 16 BNE RNGERR
4955 FABB BD 8D FE RANGE2: LDA COLUMN,X ;CHECK LOW BYTE
4956 FABE C5 55 CMP COLCRS
4957 FAC0 90 0F BCC RNGERR
4958 FAC2 F0 0D BEQ RNGERR
4959 FAC4 A9 01 RNGOK: LDA #SUCCES ;SET STATUS OK
4960 FAC6 85 4C STA DSTAT
4961 FAC8 A9 80 LDA #BRKABT ;PREPARE BREAK ABORT STATUS
4962 FACA A6 11 LDX BRKKEY ;CHECK BREAK KEY FLAG
4963 FACC 85 11 STA BRKKEY ;'CLEAR' BREAK
4964 FACE F0 06 BEQ RNGER2 ;IF BREAK, QUIT IMMEDIATELY AND RETURN TO CIO
4965 FAD0 60 RTS
4966 FAD1 20 D6 F7 RNGERR: JSR HOME ;ON RANGE ERROR, BRING CURSOR BACK
4967 FAD4 A9 8D LDA #CRSROR ;SHOW CURSOR OVERRANGE ERROR
4968 FAD6 85 4C RNGER2: STA DSTAT
4969 FAD8 68 RNGER1: PLA ;RESTORE STACK (THIS ROUTINE IS ALWAYS 1 LEVEL
4970 FAD9 68 PLA ;AWAY FROM RETURN TO CIO)
4971 FADA A5 7B LDA SWPFLG ;IF SWAPPED, SWAP BACK
4972 FADC 10 03 BPL RETUR3
4973 FADE 20 B9 FC JSR SWAPA ;AND DONT DO RETUR1
4974 FAE1 4C 34 F6 RETUR3: JMP RETUR1 ;RETURN TO CIO
4975 ;
4976 ;
4977 ;
4978 ; OFFCRS: RESTORE OLD DATA UNDER CURSOR SO IT CAN BE MOVED
4979 ;
4980 FAE4 A0 00 OFFCRS: LDY #0
4981 FAE6 A5 5D LDA OLDCHR
4982 FAE8 91 5E STA (OLDADR),Y
4983 FAEA 60 RTS
4984 ;
4985 ;
4986 ;
4987 ; BITMAP ROUTINES:
4988 ;
4989 ; BITCON: PUT MASK IN BITMSK AND INDEX IN X
4990 ; BITPUT: PUT CARRY INTO BITMAP
4991 ; BITROL: ROL CARRY INTO BOTTOM OF BITMAP (SCROLL)
4992 ; BITSET: SET PROPER BIT
4993 ; BITCLR: CLEAR PROPER BIT
4994 ; BITGET: RETURN CARRY SET IF BIT IS THERE
4995 ; LOGGET: DO BITGET FOR LOGMAP INSTEAD OF TABMAP
4996 ;
4997 FAEB 48 BITCON: PHA
4998 FAEC 29 07 AND #7
4999 FAEE AA TAX ;GET MASK
5000 FAEF BD B9 FE LDA MASKTB,X
5001 FAF2 85 6E STA BITMSK
5002 FAF4 68 PLA ;PROCESS INDEX
5003 FAF5 4A LSR A
5004 FAF6 4A LSR A
5005 FAF7 4A LSR A
5006 FAF8 AA TAX
5007 FAF9 60 RTS
5008 ;
5009 ;
5010 FAFA 2E B4 02 BITROL: ROL LOGMAP+2
5011 FAFD 2E B3 02 ROL LOGMAP+1
5012 FB00 2E B2 02 ROL LOGMAP
5013 FB03 60 RTS
5014 ;
5015 ;
5016 FB04 90 0C BITPUT: BCC BITCLR ;AND RETURN
5017 ;OTHERWISE FALL THROUGH TO BITSET AND RETURN
5018 FB06 20 EB FA BITSET: JSR BITCON
5019 FB09 BD A3 02 LDA TABMAP,X
5020 FB0C 05 6E ORA BITMSK
5021 FB0E 9D A3 02 STA TABMAP,X
5022 FB11 60 RTS
5023 ;
5024 FB12 20 EB FA BITCLR: JSR BITCON
5025 FB15 A5 6E LDA BITMSK
5026 FB17 49 FF EOR #$FF
5027 FB19 3D A3 02 AND TABMAP,X
5028 FB1C 9D A3 02 STA TABMAP,X
5029 FB1F 60 RTS
5030 ;
5031 FB20 A5 54 LOGGET: LDA ROWCRS
5032 FB22 18 LO1GET: CLC
5033 FB23 69 78 LO2GET: ADC #120
5034 FB25 20 EB FA BITGET: JSR BITCON
5035 FB28 18 CLC
5036 FB29 BD A3 02 LDA TABMAP,X
5037 FB2C 25 6E AND BITMSK
5038 FB2E F0 01 BEQ BITGE1
5039 FB30 38 SEC
5040 FB31 60 BITGE1: RTS
5041 ;
5042 ;
5043 ;
5044 ;
5045 ; INATAC: INTERNAL(CHAR) TO ATASCII(ATACHR) CONVERSION
5046 ;
5047 FB32 AD FA 02 INATAC: LDA CHAR
5048 FB35 A4 57 LDY DINDEX ;IF GRAPHICS MODES
5049 FB37 C0 03 CPY #3
5050 FB39 B0 0F BCS INATA1 ;THEN DONT CHANGE CHAR
5051 FB3B 2A ROL A
5052 FB3C 2A ROL A
5053 FB3D 2A ROL A
5054 FB3E 2A ROL A
5055 FB3F 29 03 AND #3
5056 FB41 AA TAX
5057 FB42 AD FA 02 LDA CHAR
5058 FB45 29 9F AND #$9F
5059 FB47 1D FA FE ORA INTATA,X
5060 FB4A 8D FB 02 INATA1: STA ATACHR
5061 FB4D 60 RTS
5062 ;
5063 ;
5064 ;
5065 ; MOVLIN: MOVE 40 BYTES AT FRMADR TO TOADR SAVING OLD TOADR
5066 ; DATA IN THE LINBUF. THEN MAKE NEXT FRMADR
5067 ; BE AT LINBUF FOR NEXT TRANSFER & TOADR=TOADR+40
5068 ;
5069 FB4E A9 02 MOVLIN: LDA #LINBUF/256 ;SET UP ADRESS=LINBUF=$247
5070 FB50 85 65 STA ADRESS+1
5071 FB52 A9 47 LDA #LINBUF.AND.$FF
5072 FB54 85 64 STA ADRESS
5073 FB56 A0 27 LDY #39
5074 FB58 B1 66 MOVLI1: LDA (TOADR),Y ;SAVE TO DATA
5075 FB5A 85 50 STA TMPCHR
5076 FB5C B1 68 LDA (FRMADR),Y ;STORE DATA
5077 FB5E 91 66 STA (TOADR),Y
5078 FB60 A5 50 LDA TMPCHR
5079 FB62 91 64 STA (ADRESS),Y
5080 FB64 88 DEY
5081 FB65 10 F1 BPL MOVLI1
5082 FB67 A5 65 LDA ADRESS+1 ;SET UP FRMADR=LAST LINE
5083 FB69 85 69 STA FRMADR+1
5084 FB6B A5 64 LDA ADRESS
5085 FB6D 85 68 STA FRMADR
5086 FB6F 18 CLC ;ADD 40 TO TOADR
5087 FB70 A5 66 LDA TOADR
5088 FB72 69 28 ADC #40
5089 FB74 85 66 STA TOADR
5090 FB76 90 02 BCC MOVLI2
5091 FB78 E6 67 INC TOADR+1
5092 FB7A 60 MOVLI2: RTS
5093 ;
5094 ;
5095 ;
5096 ; EXTEND: EXTEND BIT MAP FROM ROWCRS (EXTEND LOGICAL LINE
5097 ;
5098 FB7B 08 EXTEND: PHP ;SAVE CARRY
5099 FB7C A0 17 LDY #23
5100 FB7E 98 EXTEN1: TYA
5101 FB7F 20 22 FB JSR LO1GET
5102 FB82 08 PHP
5103 FB83 98 TYA
5104 FB84 18 CLC
5105 FB85 69 79 ADC #121
5106 FB87 28 PLP
5107 FB88 20 04 FB JSR BITPUT
5108 FB8B 88 EXTEN3: DEY
5109 FB8C 30 04 BMI EXTEN4
5110 FB8E C4 54 CPY ROWCRS
5111 FB90 B0 EC BCS EXTEN1
5112 FB92 A5 54 EXTEN4: LDA ROWCRS
5113 FB94 18 CLC
5114 FB95 69 78 ADC #120
5115 FB97 28 PLP
5116 FB98 4C 04 FB JMP BITPUT ;STORE NEW LINE'S BIT AND RETURN
5117 ;
5118 ;
5119 ;
5120 ; CLRLIN: CLEAR LINE CURSOR IS ON
5121 ;
5122 FB9B A5 52 CLRLIN: LDA LMARGN
5123 FB9D 85 55 STA COLCRS
5124 FB9F 20 47 F9 JSR CONVRT
5125 FBA2 A0 27 LDY #39
5126 FBA4 A9 00 LDA #0
5127 FBA6 91 64 CLRLI1: STA (ADRESS),Y
5128 FBA8 88 DEY
5129 FBA9 10 FB BPL CLRLI1
5130 FBAB 60 RTS
5131 ;
5132 ;
5133 ;
5134 ;
5135 ; SCROLL: SCROLL SCREEN
5136 ;
5137 FBAC 20 FA FA SCROLL: JSR BITROL ;ROLL IN CARRY
5138 FBAF A5 58 LDA SAVMSC ;SET UP WORKING REGISTERS
5139 FBB1 85 64 STA ADRESS
5140 FBB3 A5 59 LDA SAVMSC+1
5141 FBB5 85 65 STA ADRESS+1
5142 FBB7 A0 28 SCROL1: LDY #40 ;LOOP
5143 FBB9 B1 64 LDA (ADRESS),Y
5144 FBBB A6 6A LDX RAMTOP ;TEST FOR LAST LINE
5145 FBBD CA DEX
5146 FBBE E4 65 CPX ADRESS+1
5147 FBC0 D0 08 BNE SCROL2
5148 FBC2 A2 D7 LDX #$D7
5149 FBC4 E4 64 CPX ADRESS
5150 FBC6 B0 02 BCS SCROL2
5151 FBC8 A9 00 LDA #0 ;YES SO STORE ZERO DATA FOR THIS ENTIRE LINE
5152 FBCA A0 00 SCROL2: LDY #0
5153 FBCC 91 64 STA (ADRESS),Y
5154 FBCE E6 64 INC ADRESS
5155 FBD0 D0 E5 BNE SCROL1
5156 FBD2 E6 65 INC ADRESS+1
5157 FBD4 A5 65 LDA ADRESS+1
5158 FBD6 C5 6A CMP RAMTOP
5159 FBD8 D0 DD BNE SCROL1
5160 FBDA 4C DD FB JMP DOLCOL ;AND RETURN
5161 ;
5162 ;
5163 ; DOLCOL: DO LOGICAL COLUMN FROM BITMAP AND COLCRS
5164 ;
5165 FBDD A9 00 DOLCOL: LDA #0 ;START WITH ZERO
5166 FBDF 85 63 STA LOGCOL
5167 FBE1 A5 54 LDA ROWCRS
5168 FBE3 85 51 STA HOLD1
5169 FBE5 A5 51 DOLCO1: LDA HOLD1 ;ADD IN ROW COMPONENT
5170 FBE7 20 22 FB JSR LO1GET
5171 FBEA B0 0C BCS DOLCO2 ;FOUND BEGINNING OF LINE
5172 FBEC A5 63 LDA LOGCOL ;ADD 40 AND LOOK BACK ONE
5173 FBEE 18 CLC
5174 FBEF 69 28 ADC #40
5175 FBF1 85 63 STA LOGCOL
5176 FBF3 C6 51 DEC HOLD1 ;UP ONE LINE
5177 FBF5 4C E5 FB JMP DOLCO1
5178 FBF8 18 DOLCO2: CLC ;ADD IN COLCRS
5179 FBF9 A5 63 LDA LOGCOL
5180 FBFB 65 55 ADC COLCRS
5181 FBFD 85 63 STA LOGCOL
5182 FBFF 60 RTS
5183 ;
5184 ;
5185 ;
5186 ; DOBUFC: COMPUTE BUFFER COUNT AS THE NUMBER OF BYTES FROM
5187 ; BUFSTR TO END OF LOGICAL LINE WITH TRAILING SPACES REMOVED
5188 ;
5189 FC00 20 9D FC DOBUFC: JSR PHACRS
5190 FC03 A5 63 LDA LOGCOL
5191 FC05 48 PHA
5192 FC06 A5 6C LDA BUFSTR ;START
5193 FC08 85 54 STA ROWCRS
5194 FC0A A5 6D LDA BUFSTR+1
5195 FC0C 85 55 STA COLCRS
5196 FC0E A9 01 LDA #1
5197 FC10 85 6B STA BUFCNT
5198 FC12 A2 17 DOBUF1: LDX #23 ;NORMAL
5199 FC14 A5 7B LDA SWPFLG ;IF SWAPPED, ROW 3 IS THE LAST LINE ON SCREEN
5200 FC16 10 02 BPL DOB1
5201 FC18 A2 03 LDX #3
5202 FC1A E4 54 DOB1: CPX ROWCRS ;TEST IF CRSR IS AT LAST SCREEN POSITION
5203 FC1C D0 0B BNE DOBU1A
5204 FC1E A5 55 LDA COLCRS
5205 FC20 C5 53 CMP RMARGN
5206 FC22 D0 05 BNE DOBU1A
5207 FC24 E6 6B INC BUFCNT ;YES SO FAKE INCRSR TO AVOID SCROLLING
5208 FC26 4C 39 FC JMP DOBUF2
5209 FC29 20 D4 F9 DOBU1A: JSR INCRSB
5210 FC2C E6 6B INC BUFCNT
5211 FC2E A5 63 LDA LOGCOL
5212 FC30 C5 52 CMP LMARGN
5213 FC32 D0 DE BNE DOBUF1 ;NOT YET EOL
5214 FC34 C6 54 DEC ROWCRS ;BACK UP ONE INCRSR
5215 FC36 20 99 F7 JSR CRSRLF
5216 FC39 20 A2 F5 DOBUF2: JSR GETPLT ;TEST CURRENT COLUMN FOR NON-ZERO DATA
5217 FC3C D0 17 BNE DOBUF4 ;QUIT IF NON-ZERO
5218 FC3E C6 6B DEC BUFCNT ;DECREMENT COUNTER
5219 FC40 A5 63 LDA LOGCOL ;BEGINNING OF LOGICAL LINE YET?
5220 FC42 C5 52 CMP LMARGN
5221 FC44 F0 0F BEQ DOBUF4 ;YES, SO QUIT
5222 FC46 20 99 F7 JSR CRSRLF ;BACK UP CURSOR
5223 FC49 A5 55 LDA COLCRS ;IF LOGCOL=RMARGN, GO UP 1 ROW
5224 FC4B C5 53 CMP RMARGN
5225 FC4D D0 02 BNE DOBUF3
5226 FC4F C6 54 DEC ROWCRS
5227 FC51 A5 6B DOBUF3: LDA BUFCNT
5228 FC53 D0 E4 BNE DOBUF2 ;LOOP UNLESS BUFCNT JUST WENT TO ZERO
5229 FC55 68 DOBUF4: PLA
5230 FC56 85 63 STA LOGCOL
5231 FC58 20 A8 FC JSR PLACRS
5232 FC5B 60 RTS
5233 ;
5234 ;
5235 ;
5236 ;
5237 ; STRBEG: MOVE BUFSTR TO BEGINNING OF LOGICAL LINE.
5238 ;
5239 FC5C 20 DD FB STRBEG: JSR DOLCOL ;USE DOLCOL TO POINT HOLD1 AT BOL
5240 FC5F A5 51 LDA HOLD1
5241 FC61 85 6C STA BUFSTR
5242 FC63 A5 52 LDA LMARGN
5243 FC65 85 6D STA BUFSTR+1
5244 FC67 60 RTS
5245 ;
5246 ;
5247 ;
5248 ;
5249 ;
5250 ; DELTIM: TIME TO DELETE A LINE IF IT IS EMPTY AND AN EXTENSION
5251 ;
5252 FC68 A5 63 DELTIA: LDA LOGCOL ;IF LOGCOL<>LMARGN
5253 FC6A C5 52 CMP LMARGN ;THEN DONT MOVE UP ONE
5254 FC6C D0 02 BNE DELTIB ;LINE BEFORE TESTING DELTIM
5255 FC6E C6 54 DEC ROWCRS
5256 FC70 20 DD FB DELTIB: JSR DOLCOL
5257 FC73 A5 63 DELTIM: LDA LOGCOL ;TEST FOR EXTENSION
5258 FC75 C5 52 CMP LMARGN
5259 FC77 F0 13 BEQ DELTI3 ;NO
5260 FC79 20 47 F9 JSR CONVRT
5261 FC7C A5 53 LDA RMARGN ;SET UP COUNT
5262 FC7E 38 SEC
5263 FC7F E5 52 SBC LMARGN
5264 FC81 A8 TAY
5265 FC82 B1 64 DELTI1: LDA (ADRESS),Y
5266 FC84 D0 06 BNE DELTI3 ;FOUND A NON-0 SO QUIT AND RETURN
5267 FC86 88 DEY
5268 FC87 10 F9 BPL DELTI1
5269 FC89 4C DB F8 DELTI2: JMP DELLIB ;DELETE A LINE AND RETURN
5270 FC8C 60 DELTI3: RTS
5271 ;
5272 ;
5273 ;
5274 ; TSTCTL: SEARCH CNTRLS TABLE TO SEE IF ATACHR IS A CNTL CHAR
5275 ;
5276 FC8D A2 2D TSTCTL: LDX #45 ;PREPARE TO SEARCH TABLE
5277 FC8F BD C6 FE TSTCT1: LDA CNTRLS,X
5278 FC92 CD FB 02 CMP ATACHR
5279 FC95 F0 05 BEQ TSTCT2
5280 FC97 CA DEX
5281 FC98 CA DEX
5282 FC99 CA DEX
5283 FC9A 10 F3 BPL TSTCT1
5284 FC9C 60 TSTCT2: RTS
5285 ;
5286 ;
5287 ;
5288 ; PUSH ROWCRS,COLCRS AND COLCRS+1
5289 ;
5290 FC9D A2 02 PHACRS: LDX #2
5291 FC9F B5 54 PHACR1: LDA ROWCRS,X
5292 FCA1 9D B8 02 STA TMPROW,X
5293 FCA4 CA DEX
5294 FCA5 10 F8 BPL PHACR1
5295 FCA7 60 RTS
5296 ;
5297 ;
5298 ; PULL COLCRS+1,COLCRS AND ROWCRS
5299 ;
5300 FCA8 A2 02 PLACRS: LDX #2
5301 FCAA BD B8 02 PLACR1: LDA TMPROW,X
5302 FCAD 95 54 STA ROWCRS,X
5303 FCAF CA DEX
5304 FCB0 10 F8 BPL PLACR1
5305 FCB2 60 RTS
5306 ;
5307 ;
5308 ;
5309 ; SWAP: IF MIXED MODE, SWAP TEXT CURSORS WITH REGULAR CURSORS
5310 ;
5311 FCB3 20 B9 FC SWAP: JSR SWAPA ;THIS ENTRY POINT DOES RETUR1
5312 FCB6 4C 34 F6 JMP RETUR1
5313 FCB9 AD BF 02 SWAPA: LDA BOTSCR
5314 FCBC C9 18 CMP #24
5315 FCBE F0 17 BEQ SWAP3
5316 FCC0 A2 0B LDX #11
5317 FCC2 B5 54 SWAP1: LDA ROWCRS,X
5318 FCC4 48 PHA
5319 FCC5 BD 90 02 LDA TXTROW,X
5320 FCC8 95 54 STA ROWCRS,X
5321 FCCA 68 PLA
5322 FCCB 9D 90 02 STA TXTROW,X
5323 FCCE CA DEX
5324 FCCF 10 F1 BPL SWAP1
5325 FCD1 A5 7B LDA SWPFLG
5326 FCD3 49 FF EOR #$FF
5327 FCD5 85 7B STA SWPFLG
5328 FCD7 60 SWAP3: RTS
5329 ;
5330 ;
5331 ; CLICK: MAKE CLICK THROUGH KEYBOARD SPEAKER
5332 ;
5333 FCD8 A2 7F CLICK: LDX #$7F
5334 FCDA 8E 1F D0 CLICK1: STX CONSOL
5335 FCDD 8E 0A D4 STX WSYNC
5336 FCE0 CA DEX
5337 FCE1 10 F7 BPL CLICK1
5338 FCE3 60 RTS
5339 ;
5340 ;
5341 ; COLCR: PUTS EITHER 0 OR LMARGN INTO COLCRS BASED ON MODE AND SWPFLG
5342 ;
5343 FCE4 A9 00 COLCR: LDA #0
5344 FCE6 A6 7B LDX SWPFLG
5345 FCE8 D0 04 BNE COLCR1
5346 FCEA A6 57 LDX DINDEX
5347 FCEC D0 02 BNE COLCR2
5348 FCEE A5 52 COLCR1: LDA LMARGN
5349 FCF0 85 55 COLCR2: STA COLCRS
5350 FCF2 60 RTS
5351 ;
5352 ;
5353 ; PUTMSC: PUT SAVMSC INTO ADRESS
5354 ;
5355 FCF3 A5 58 PUTMSC: LDA SAVMSC ;SET UP ADDRESS
5356 FCF5 85 64 STA ADRESS
5357 FCF7 A5 59 LDA SAVMSC+1
5358 FCF9 85 65 STA ADRESS+1
5359 FCFB 60 RTS
5360 ;
5361 .PAGE
5362 ;
5363 ;
5364 ; DRAW -- DRAW A LINE FROM OLDROW,OLDCOL TO NEWROW,NEWCOL
5365 ; (THE AL MILLER METHOD FROM BASKETBALL)
5366 FCFC A2 00 DRAW: LDX #0
5367 FCFE A5 22 LDA ICCOMZ ;TEST COMMAND: $11=DRAW $12=FILL
5368 FD00 C9 11 CMP #$11
5369 FD02 F0 08 BEQ DRAWA
5370 FD04 C9 12 CMP #$12 ;TEST FILL
5371 FD06 F0 03 BEQ DRAWB ;YES
5372 FD08 A0 84 LDY #NVALID ;NO, SO RETURN INVALID COMMAND
5373 FD0A 60 RTS
5374 FD0B E8 DRAWB: INX
5375 FD0C 8E B7 02 DRAWA: STX FILFLG
5376 FD0F A5 54 LDA ROWCRS ;PUT CURSOR INTO NEWROW,NEWCOL
5377 FD11 85 60 STA NEWROW
5378 FD13 A5 55 LDA COLCRS
5379 FD15 85 61 STA NEWCOL
5380 FD17 A5 56 LDA COLCRS+1
5381 FD19 85 62 STA NEWCOL+1
5382 FD1B A9 01 LDA #1
5383 FD1D 85 79 STA ROWINC ;SET UP INITIAL DIRECTIONS
5384 FD1F 85 7A STA COLINC
5385 FD21 38 SEC
5386 FD22 A5 60 LDA NEWROW ;DETERMINE DELTA ROW
5387 FD24 E5 5A SBC OLDROW
5388 FD26 85 76 STA DELTAR
5389 FD28 B0 0D BCS DRAW1 ;DO DIRECTION AND ABSOLUTE VALUE
5390 FD2A A9 FF LDA #$FF ;BORROW WAS ATTEMPTED
5391 FD2C 85 79 STA ROWINC ;SET DIRECTION=DOWN
5392 FD2E A5 76 LDA DELTAR
5393 FD30 49 FF EOR #$FF ;DELTAR = |DELTAR|
5394 FD32 18 CLC
5395 FD33 69 01 ADC #1
5396 FD35 85 76 STA DELTAR
5397 FD37 38 DRAW1: SEC
5398 FD38 A5 61 LDA NEWCOL ;NOW DELTA COLUMN
5399 FD3A E5 5B SBC OLDCOL
5400 FD3C 85 77 STA DELTAC
5401 FD3E A5 62 LDA NEWCOL+1 ;TWO-BYTE QUANTITY
5402 FD40 E5 5C SBC OLDCOL+1
5403 FD42 85 78 STA DELTAC+1
5404 FD44 B0 16 BCS DRAW2 ;DIRECTION AND ABSOLUTE VALUE
5405 FD46 A9 FF LDA #$FF ;BORROW WAS ATTEMPTED
5406 FD48 85 7A STA COLINC ;SET DIRECTION = LEFT
5407 FD4A A5 77 LDA DELTAC
5408 FD4C 49 FF EOR #$FF ;DELTAC = |DELTAC|
5409 FD4E 85 77 STA DELTAC
5410 FD50 A5 78 LDA DELTAC+1
5411 FD52 49 FF EOR #$FF
5412 FD54 85 78 STA DELTAC+1
5413 FD56 E6 77 INC DELTAC ;ADD ONE FOR TWOS COMPLEMENT
5414 FD58 D0 02 BNE DRAW2
5415 FD5A E6 78 INC DELTAC+1
5416 FD5C A2 02 DRAW2: LDX #2 ;ZERO RAM FOR DRAW LOOP
5417 FD5E A0 00 LDY #0
5418 FD60 84 73 STY COLAC+1
5419 FD62 98 DRAW3A: TYA
5420 FD63 95 70 STA ROWAC,X
5421 FD65 B5 5A LDA OLDROW,X
5422 FD67 95 54 STA ROWCRS,X
5423 FD69 CA DEX
5424 FD6A 10 F6 BPL DRAW3A
5425 FD6C A5 77 LDA DELTAC ;FIND LARGER ONE (ROW OR COL)
5426 ; STA COUNTR (PREPARE COUNTR AND ENDPT)
5427 ; STA ENDPT
5428 FD6E E8 INX ;MAKE X 0
5429 FD6F A8 TAY
5430 FD70 A5 78 LDA DELTAC+1
5431 FD72 85 7F STA COUNTR+1
5432 FD74 85 75 STA ENDPT+1
5433 FD76 D0 0B BNE DRAW3 ;AUTOMATICALLY LARGER IF MSD>0
5434 FD78 A5 77 LDA DELTAC
5435 FD7A C5 76 CMP DELTAR ;LOW COL >LOW ROW?
5436 FD7C B0 05 BCS DRAW3 ;YES
5437 FD7E A5 76 LDA DELTAR
5438 FD80 A2 02 LDX #2
5439 FD82 A8 TAY
5440 FD83 98 DRAW3: TYA ;PUT IN INITIAL CONDITIONS
5441 FD84 85 7E STA COUNTR
5442 FD86 85 74 STA ENDPT
5443 FD88 48 PHA ;SAVE AC
5444 FD89 A5 75 LDA ENDPT+1 ;PUT LSB OF HIGH BYTE
5445 FD8B 4A LSR A ;INTO CARRY
5446 FD8C 68 PLA ;RESTORE AC
5447 FD8D 6A ROR A ;ROR THE 9 BIT ACUMULATOR
5448 FD8E 95 70 STA ROWAC,X
5449 FD90 A5 7E DRAW4A: LDA COUNTR ;TEST ZERO
5450 FD92 05 7F ORA COUNTR+1
5451 FD94 D0 03 BNE DRAW11 ;IF COUNTER IS ZERO, LEAVE DRAW
5452 FD96 4C 42 FE JMP DRAW10
5453 FD99 18 DRAW11: CLC ;ADD ROW TO ROWAC (PLOT LOOP)
5454 FD9A A5 70 LDA ROWAC
5455 FD9C 65 76 ADC DELTAR
5456 FD9E 85 70 STA ROWAC
5457 FDA0 90 02 BCC DRAW5
5458 FDA2 E6 71 INC ROWAC+1
5459 FDA4 A5 71 DRAW5: LDA ROWAC+1 ;COMPARE ROW TO ENDPOINT
5460 FDA6 C5 75 CMP ENDPT+1 ;IF HIGH BYTE OF ROW IS .LT. HIGH
5461 FDA8 90 14 BCC DRAW6 ;BYTE OF ENDPT, BLT TO COLUMN
5462 FDAA D0 06 BNE DRAW5A
5463 FDAC A5 70 LDA ROWAC
5464 FDAE C5 74 CMP ENDPT ;LOW BYTE
5465 FDB0 90 0C BCC DRAW6 ;ALSO BLT
5466 FDB2 18 DRAW5A: CLC ;GE SO MOVE POINT
5467 FDB3 A5 54 LDA ROWCRS
5468 FDB5 65 79 ADC ROWINC
5469 FDB7 85 54 STA ROWCRS
5470 FDB9 A2 00 LDX #0 ;AND SUBTRACT ENDPT FROM ROWAC
5471 FDBB 20 7A FA JSR SUBEND
5472 FDBE 18 DRAW6: CLC ;DO SAME FOR COLUMN (DOUBLE BYTE ADD)
5473 FDBF A5 72 LDA COLAC ;ADD
5474 FDC1 65 77 ADC DELTAC
5475 FDC3 85 72 STA COLAC
5476 FDC5 A5 73 LDA COLAC+1
5477 FDC7 65 78 ADC DELTAC+1
5478 FDC9 85 73 STA COLAC+1
5479 FDCB C5 75 CMP ENDPT+1 ;COMPARE HIGH BYTE
5480 FDCD 90 27 BCC DRAW8
5481 FDCF D0 06 BNE DRAW6A
5482 FDD1 A5 72 LDA COLAC ;COMPARE LOW BYTE
5483 FDD3 C5 74 CMP ENDPT
5484 FDD5 90 1F BCC DRAW8
5485 FDD7 24 7A DRAW6A: BIT COLINC ;+ OR - ?
5486 FDD9 10 10 BPL DRAW6B
5487 FDDB C6 55 DEC COLCRS ;DO DOUBLE BYTE DECREMENT
5488 FDDD A5 55 LDA COLCRS
5489 FDDF C9 FF CMP #$FF
5490 FDE1 D0 0E BNE DRAW7
5491 FDE3 A5 56 LDA COLCRS+1
5492 FDE5 F0 0A BEQ DRAW7 ;DONT DEC IF ZERO
5493 FDE7 C6 56 DEC COLCRS+1
5494 FDE9 10 06 BPL DRAW7 ;(UNCONDITIONAL)
5495 FDEB E6 55 DRAW6B: INC COLCRS ;DO DOUBLE BYTE INCREMENT
5496 FDED D0 02 BNE DRAW7
5497 FDEF E6 56 INC COLCRS+1
5498 FDF1 A2 02 DRAW7: LDX #2 ;AND SUBTRACT ENDPT FROM COLAC
5499 FDF3 20 7A FA JSR SUBEND
5500 FDF6 20 96 FA DRAW8: JSR RANGE
5501 FDF9 20 E0 F5 JSR OUTPLT ;PLOT POINT
5502 FDFC AD B7 02 LDA FILFLG ;TEST RIGHT FILL
5503 FDFF F0 2F BEQ DRAW9
5504 FE01 20 9D FC JSR PHACRS
5505 FE04 AD FB 02 LDA ATACHR
5506 FE07 8D BC 02 STA HOLD4
5507 FE0A A5 54 DRAW8A: LDA ROWCRS ;SAVE ROW IN CASE OF CR
5508 FE0C 48 PHA
5509 FE0D 20 DC F9 JSR INCRSA ;POSITION CURSOR ONE PAST DOT
5510 FE10 68 PLA ;RESTORE ROWCRS
5511 FE11 85 54 STA ROWCRS
5512 FE13 20 96 FA DRAW8C: JSR RANGE
5513 FE16 20 A2 F5 JSR GETPLT ;GET DATA
5514 FE19 D0 0C BNE DRAW8B ;STOP IF NON-ZERO DATA IS ENCOUNTERED
5515 FE1B AD FD 02 LDA FILDAT ;FILL DATA
5516 FE1E 8D FB 02 STA ATACHR
5517 FE21 20 E0 F5 JSR OUTPLT ;DRAW IT
5518 FE24 4C 0A FE JMP DRAW8A ;LOOP
5519 FE27 AD BC 02 DRAW8B: LDA HOLD4
5520 FE2A 8D FB 02 STA ATACHR
5521 FE2D 20 A8 FC JSR PLACRS
5522 FE30 38 DRAW9: SEC ;DO DOUBLE BYTE SUBTRACT
5523 FE31 A5 7E LDA COUNTR
5524 FE33 E9 01 SBC #1
5525 FE35 85 7E STA COUNTR
5526 FE37 A5 7F LDA COUNTR+1
5527 FE39 E9 00 SBC #0
5528 FE3B 85 7F STA COUNTR+1
5529 FE3D 30 03 BMI DRAW10
5530 FE3F 4C 90 FD JMP DRAW4A
5531 FE42 4C 34 F6 DRAW10: JMP RETUR1
5532 .PAGE
5533 ;
5534 ;
5535 ; TABLES
5536 ;
5537 ;
5538 ; MEMORY ALLOCATION
5539 ;
5540 FE45 18 10 0A 0A ALOCAT: .BYTE 24,16,10,10,16,28,52,100,196,196,196,196
5541 FE49 10 1C 34 64
5542 FE4D C4 C4 C4 C4
5543 ;
5544 ;
5545 ; NUMBER OF DISPLAY LIST ENTRIES
5546 ;
5547 FE51 17 17 0B 17 NUMDLE: .BYTE 23,23,11,23,47,47,95,95,97,97,97,97
5548 FE55 2F 2F 5F 5F
5549 FE59 61 61 61 61
5550 FE5D 13 13 09 13 MXDMDE: .BYTE 19,19,9,19,39,39,79,79,65,65,65,65 ;(EXTENSION OF NUMDLE)
5551 FE61 27 27 4F 4F
5552 FE65 41 41 41 41
5553 ;
5554 ;
5555 ; ANTIC CODE FROM INTERNAL MODE CONVERSION TABLE
5556 ;
5557 ; INTERNAL ANTIC CODE DESCRIPTION
5558 ; 0 2 40X2X8 CHARACTERS
5559 ; 1 6 20X5X8 ""
5560 ; 2 7 20X5X16 ""
5561 ; 3 8 40X4X8 GRAPHICS
5562 ; 4 9 80X2X4 ""
5563 ; 5 A 80X4X4 ""
5564 ; 6 B 160X2X2 ""
5565 ; 7 D 160X4X2 ""
5566 ; 8 F 320X2X1 ""
5567 ; 9 SAME AS 8 BUT GTIA 'LUM' MODE
5568 ; 10 SAME AS 8 BUT GTIA 'COL/LUM REGISTER' MODE
5569 ; 11 SAME AS 8 BUT GTIA 'COLOR' MODE
5570 ;
5571 FE69 02 06 07 08 ANCONV: .BYTE 2,6,7,8,9,$A,$B,$D,$F,$F,$F,$F ;ZEROS FOR RANGE TEST IN PAGETB
5572 FE6D 09 0A 0B 0D
5573 FE71 0F 0F 0F 0F
5574 ;
5575 ;
5576 ; PAGE TABLE TELLS WHICH DISPLAY LISTS ARE IN DANGER OF
5577 ; CROSSING A 256 BYTE PAGE BOUNDARY
5578 ;
5579 FE75 00 00 00 00 PAGETB: .BYTE 0,0,0,0,0,0,0,1,1,1,1,1
5580 FE79 00 00 00 01
5581 FE7D 01 01 01 01
5582 ;
5583 ;
5584 ; THIS IS THE NUMBER OF LEFT SHIFTS NEEDED TO MULTIPLY
5585 ; COLCRS BY 10,20, OR 40. (ROWCRS*10)/(2**DHLINE)
5586 ;
5587 FE81 02 01 01 00 DHLINE: .BYTE 2,1,1,0,0,1,1,2,2,2,2,2
5588 FE85 00 01 01 02
5589 FE89 02 02 02 02
5590 ;
5591 ;
5592 ; COLUMN: NUMBER OF COLUMNS
5593 ;
5594 FE8D 28 14 14 28 COLUMN: .BYTE 40,20,20,40,80,80,160,160,64,80,80,80 ;MODE 8 IS SPECIAL CASE
5595 FE91 50 50 A0 A0
5596 FE95 40 50 50 50
5597 ;
5598 ;
5599 ;
5600 ; NOROWS: NUMBER OF ROWS
5601 ;
5602 FE99 18 18 0C 18 NOROWS: .BYTE 24,24,12,24,48,48,96,96,192,192,192,192
5603 FE9D 30 30 60 60
5604 FEA1 C0 C0 C0 C0
5605 ;
5606 ;
5607 ;
5608 ;
5609 ; DIV2TB: HOW MANY RIGHT SHIFTS FOR HCRSR FOR PARTIAL BYTE MODES
5610 ;
5611 FEA5 00 00 00 02 DIV2TB: .BYTE 0,0,0,2,3,2,3,2,3,1,1,1
5612 FEA9 03 02 03 02
5613 FEAD 03 01 01 01
5614 ;
5615 ;
5616 ; DMASKT: DISPLAY MASK TABLE
5617 ;
5618 FEB1 00 FF F0 0F DMASKT: .BYTE $00,$FF,$F0,$0F
5619 FEB5 C0 30 0C 03 .BYTE $C0,$30,$0C,$03
5620 ;
5621 ; MASKTB: BIT MASK. (ALSO PART OF DMASKTB! DO NOT SEPARATE)
5622 ;
5623 FEB9 80 40 20 10 MASKTB: .BYTE $80,$40,$20,$10,$08,$04,$02,$01
5624 FEBD 08 04 02 01
5625 ;
5626 ;
5627 ;
5628 ;
5629 FEC1 28 CA 94 46 COLRTB: .BYTE $28,$CA,$94,$46,$00
5630 FEC5 00
5631 ;
5632 ;
5633 ;
5634 ;
5635 ; CNTRLS: CONTROL CODES AND THEIR DISPLACEMENTS INTO THE
5636 ; CONTROL CHARACTER PROCESSORS
5637 ;
5638 FEC6 1B CNTRLS: .BYTE $1B
5639 FEC7 79 F7 .WORD ESCAPE
5640 FEC9 1C .BYTE $1C
5641 FECA 7F F7 .WORD CRSRUP
5642 FECC 1D .BYTE $1D
5643 FECD 8C F7 .WORD CRSRDN
5644 FECF 1E .BYTE $1E
5645 FED0 99 F7 .WORD CRSRLF
5646 FED2 1F .BYTE $1F
5647 FED3 AA F7 .WORD CRSRRT
5648 FED5 7D .BYTE $7D
5649 FED6 B9 F7 .WORD CLRSCR
5650 FED8 7E .BYTE $7E
5651 FED9 E6 F7 .WORD BS
5652 FEDB 7F .BYTE $7F
5653 FEDC 10 F8 .WORD TAB
5654 FEDE 9B .BYTE $9B
5655 FEDF 30 FA .WORD DOCRWS
5656 FEE1 9C .BYTE $9C
5657 FEE2 D4 F8 .WORD DELLIN
5658 FEE4 9D .BYTE $9D
5659 FEE5 A4 F8 .WORD INSLIN
5660 FEE7 9E .BYTE $9E
5661 FEE8 32 F8 .WORD CLRTAB
5662 FEEA 9F .BYTE $9F
5663 FEEB 2D F8 .WORD SETTAB
5664 FEED FD .BYTE $FD
5665 FEEE 0A F9 .WORD BELL
5666 FEF0 FE .BYTE $FE
5667 FEF1 6D F8 .WORD DELCHR
5668 FEF3 FF .BYTE $FF
5669 FEF4 37 F8 .WORD INSCHR
5670 ;
5671 ;
5672 ;
5673 ;
5674 ;
5675 ; ATAINT: ATASCI TO INTERNAL TABLE
5676 ;
5677 FEF6 40 00 20 60 ATAINT: .BYTE $40,$00,$20,$60
5678 ;
5679 ;
5680 ; INTATA: INTERNAL TO ATASCI TABLE
5681 ;
5682 FEFA 20 40 00 60 INTATA: .BYTE $20,$40,$00,$60
5683 ;
5684 ;
5685 ; ATASCI: ATASCII CONVERSION TABLE
5686 ;
5687 FEFE 6C 6A 3B 80 ATASCI: .BYTE $6C,$6A,$3B,$80,$80,$6B,$2B,$2A ;LOWER CASE
5688 FF02 80 6B 2B 2A
5689 FF06 6F 80 70 75 .BYTE $6F,$80,$70,$75,$9B,$69,$2D,$3D
5690 FF0A 9B 69 2D 3D
5691 FF0E
5692 FF0E 76 80 63 80 .BYTE $76,$80,$63,$80,$80,$62,$78,$7A
5693 FF12 80 62 78 7A
5694 FF16 34 80 33 36 .BYTE $34,$80,$33,$36,$1B,$35,$32,$31
5695 FF1A 1B 35 32 31
5696 FF1A
5697 FF1E 2C 20 2E 6E .BYTE $2C,$20,$2E,$6E,$80,$6D,$2F,$81
5698 FF22 80 6D 2F 81
5699 FF26 72 80 65 79 .BYTE $72,$80,$65,$79,$7F,$74,$77,$71
5700 FF2A 7F 74 77 71
5701 FF2E
5702 FF2E 39 80 30 37 .BYTE $39,$80,$30,$37,$7E,$38,$3C,$3E
5703 FF32 7E 38 3C 3E
5704 FF36 66 68 64 80 .BYTE $66,$68,$64,$80,$82,$67,$73,$61
5705 FF3A 82 67 73 61
5706 FF3E
5707 FF3E
5708 FF3E 4C 4A 3A 80 .BYTE $4C,$4A,$3A,$80,$80,$4B,$5C,$5E ;UPPER CASE
5709 FF42 80 4B 5C 5E
5710 FF46 4F 80 50 55 .BYTE $4F,$80,$50,$55,$9B,$49,$5F,$7C
5711 FF4A 9B 49 5F 7C
5712 FF4E
5713 FF4E 56 80 43 80 .BYTE $56,$80,$43,$80,$80,$42,$58,$5A
5714 FF52 80 42 58 5A
5715 FF56 24 80 23 26 .BYTE $24,$80,$23,$26,$1B,$25,$22,$21
5716 FF5A 1B 25 22 21
5717 FF5E
5718 FF5E 5B 20 5D 4E .BYTE $5B,$20,$5D,$4E,$80,$4D,$3F,$81
5719 FF62 80 4D 3F 81
5720 FF66 52 80 45 59 .BYTE $52,$80,$45,$59,$9F,$54,$57,$51
5721 FF6A 9F 54 57 51
5722 FF6E
5723 FF6E 28 80 29 27 .BYTE $28,$80,$29,$27,$9C,$40,$7D,$9D
5724 FF72 9C 40 7D 9D
5725 FF76 46 48 44 80 .BYTE $46,$48,$44,$80,$83,$47,$53,$41
5726 FF7A 83 47 53 41
5727 FF7E
5728 FF7E
5729 FF7E 0C 0A 7B 80 .BYTE $0C,$0A,$7B,$80,$80,$0B,$1E,$1F ;CONTROL
5730 FF82 80 0B 1E 1F
5731 FF86 0F 80 10 15 .BYTE $0F,$80,$10,$15,$9B,$09,$1C,$1D
5732 FF8A 9B 09 1C 1D
5733 FF8E
5734 FF8E 16 80 03 80 .BYTE $16,$80,$03,$80,$80,$02,$18,$1A
5735 FF92 80 02 18 1A
5736 FF96 80 80 85 80 .BYTE $80,$80,$85,$80,$1B,$80,$FD,$80
5737 FF9A 1B 80 FD 80
5738 FF9E
5739 FF9E 00 20 60 0E .BYTE $00,$20,$60,$0E,$80,$0D,$80,$81
5740 FFA2 80 0D 80 81
5741 FFA6 12 80 05 19 .BYTE $12,$80,$05,$19,$9E,$14,$17,$11
5742 FFAA 9E 14 17 11
5743 FFAE
5744 FFAE 80 80 80 80 .BYTE $80,$80,$80,$80,$FE,$80,$7D,$FF
5745 FFB2 FE 80 7D FF
5746 FFB6 06 08 04 80 .BYTE $06,$08,$04,$80,$84,$07,$13,$01
5747 FFBA 84 07 13 01
5748 ;
5749 ;
5750 ;
5751 ;
5752 ;
5753 FFBE AD 09 D2 PIRQQ: LDA KBCODE
5754 FFC1 CD F2 02 CMP CH1 ;TEST AGAINST LAST KEY PRESSED
5755 FFC4 D0 05 BNE PIRQ3 ;IF NOT, GO PROCESS KEY
5756 FFC6 AD F1 02 LDA KEYDEL ;IF KEY DELAY BYTE > 0
5757 FFC9 D0 20 BNE PIRQ4 ;IGNORE KEY AS BOUNCE
5758 FFCB AD 09 D2 PIRQ3: LDA KBCODE ;RESTORE AC
5759 FFCE C9 9F CMP #CNTL1 ;TEST CONTROL 1 (SSFLAG)
5760 FFD0 D0 0A BNE PIRQ1
5761 FFD2 AD FF 02 LDA SSFLAG
5762 FFD5 49 FF EOR #$FF
5763 FFD7 8D FF 02 STA SSFLAG
5764 FFDA B0 0F BCS PIRQ4 ;(UNCONDITIONAL) MAKE ^1 INVISIBLE
5765 FFDC 8D FC 02 PIRQ1: STA CH
5766 FFDF 8D F2 02 STA CH1
5767 FFE2 A9 03 LDA #3
5768 FFE4 8D F1 02 STA KEYDEL ;INITIALIZE KEY DELAY FOR DEBOUNCE
5769 FFE7 A9 00 LDA #0 ;CLEAR COLOR SHIFT BYTE
5770 FFE9 85 4D STA ATRACT
5771 FFEB A9 30 PIRQ4: LDA #$30
5772 FFED 8D 2B 02 STA SRTIMR
5773 FFF0 68 PIRQ2: PLA
5774 FFF1 40 RTI
5775 ;
5776 ;
5777 FFF2 FF FF FF FF .BYTE $FF,$FF,$FF,$FF,$FF,$FF
5778 FFF6 FF FF
5779 ;
5780 FFF8 CRNTP8 =*
5781 *=$FFF8
5782 FFF8 DD 57 CHKSUN: .DBYTE $DD57
5783 *=$14
5784 0014 00 KBDSPR: .BYTE $FFF8-CRNTP8 ;^GDISPLC IS TOO LONG
5785 0015 .END
ASSEMBLY ERRORS = 0
DISPLAY HANDLER -- 10-30-78 -- DISPLC
CROSS REFERENCE
LABEL VALUE REFERENCE
ACK 0041 -1658 1921
ACKREC E9C6 1804 -1813
ADDCOR 030E -501 2529 2533 2537
ADJ1 ED10 2547 -2551
ADJUST ED08 2491 2494 -2546
ADRESS 0064 -270 4098 4123 4149 4151 4160 4161 4162
4164 4230 4232 4236 4238 4241 4243 4274
4333 4335 4404 4421 4423 4548 4551 4552
4631 4633 4659 4664 4726 4733 4736 4736
4740 4744 4812 4813 4816 4817 5070 5072
5079 5082 5084 5127 5139 5141 5143 5146
5149 5153 5154 5156 5157 5265 5356 5358
AFP D800 -579
ALLPOT D208 -673
ALLSEC F30E 3864 -3869
ALOCAT FE45 4124 -5540
ANCONV FE69 4117 -5571
ANTIC D400 -749 750 751 752 753 754 755 756
757 758 759 760 761 762 763 764
APPEND 0001 -109
APPMHI 000E -180 4739 4743
ASCCO1 F705 4456 -4458
ASCZER 0030 -778 1209
ATACHR 02FB -472 4286 4289 4294 4311 4350 4372 4395
4399 4406 4459 4493 4504 4506 4584 5060
5278 5505 5516 5520
ATAINT FEF6 4321 -5677
ATAN BE43 -613
ATASCI FEFE 4458 -5687
ATEOF F00B 3241 -3247
ATRACT 004D -249 1359 1406 1412 1414 5770
AUDC1 D201 -681 2364 2374 2399
AUDC2 D203 -683 2375
AUDC3 D205 -685 2370
AUDC4 D207 -687
AUDCTL D208 -688 2357
AUDF1 D200 -680 2318
AUDF2 D202 -682 2316
AUDF3 D204 -684 1768 2224 2616 3197
AUDF4 D206 -686 1770 2226 2618 3199
B192HI 0000 -1667 1769
B192LO 0023 -1666 1767
B600HI 0005 -1669 2225
B600LO 00CC -1668 2223
BAD EA63 1938 -1944
BADCOM E9BF 1801 -1807 1828
BADDSK F306 -3865 3901 3907
BADIOC 0086 -143 840
BADMOD 0091 -155 4119
BADST EE9E 2919 2922 2968 -2970
BEEP F058 3167 3194 -3303
BEEP1 F05A -3306 3330
BEGIN ED14 2276 -2567 2579
BELL F90A 4380 -4704 5665
BELL1 F90C -4705 4707
BFENHI 0035 -225 1793 1905 2002 2165 2205
BFENLO 0034 -224 1790 1902 2005 2168 2200
BITCLR FB12 4602 5016 -5024
BITCON FAEB -4997 5018 5024 5034
BITGE1 FB31 5038 -5040
BITGET FB25 4596 4868 -5034
BITMSK 006E -277 5001 5020 5025 5037
BITPUT FB04 4689 -5016 5107 5116
BITROL FAFA -5010 5137
BITSET FB06 4600 -5018
BLACKB F22A -3717 3718
BLFILL EEC1 2997 -3000 3020
BLIM 028A -403 3180 3226 3245
BLKB2 F230 3717 -3719
BLKBDV E471 -73 3460 3578 3580
BLOAD F36C 3906 -3911
BOOT F2CF 3687 -3840
BOOTAD 0242 -365 3874 3876 3912 3915
BOOT? 0009 -177 3842 3909 3969 3985
BOTSCR 02BF -432 4171 4179 4520 4526 4642 4931 5313
BPTR 003D -235 3179 3216 3225 3229 3237 3254 3256
3265 3284
BRKABT 0080 -137 2646 3185 4444 4961
BRKKEY 0011 -105 1356 1976 2084 2567 2589 2652 3186
3211 3813 4445 4487 4962 4963
BROKE EDA4 1978 2086 2569 2590 -2641
BS F7E6 -4569 5651
BS1 F80D 4571 -4586
BS2 F805 4579 4581 -4583
BS3 F7F5 4574 -4576
BSA F7EC -4572
BUFADR 0015 -188 2835 2844 2848 2869 2871
BUFCNT 006B -275 4364 4388 4390 5197 5207 5210 5218
5227
BUFFH 0004 -3398 3399 3861
BUFFL 0000 -3399 3859
BUFFUL EECB 2994 -3005
BUFRFL 0038 -228 2074 2131 2181
BUFRHI 0033 -223 1792 1904 1999 2001 2162 2164 2203
2633 2635
BUFRLO 0032 -222 1788 1900 1970 1997 2004 2029 2153
2160 2167 2198 2624 2626 2630 2632
BUFSTR 006C -276 4367 4369 4384 4386 4562 4566 4905
5192 5194 5241 5243
CAINI F239 3646 -3727
CART BFFC -3413 3635 3643 3758 3760 3761 3771
CARTAD BFFE -3415 3727 3728 3766
CARTCS BFFA -3412 3697 3703
CARTFG BFFD -3414 3679 3682 3694 3700 3763
CAS31 EC62 2373 -2378
CASBUF 03FD -548 3107 3108 3228 3239 3244 3255 3286
3292 3370 3372 3373 3398 3399 3870 3878
3880 3883
CASENT EB84 1733 -2218
CASET 0060 -1637 1751 2310 2372
CASETV E440 -55 3122 3490 3827
CASFLG 030F -502 1758 2070 2255
CASINI 0002 -170 3987 3989 3992
CASORG EF41 -26 3102 3140
CASRED EBB7 2219 -2254
CASSBT 004B -246 3866 3900 3903 3953 3979 3983
CASSET 0043 -123
CASSPR 0014 -3379
CAUX1 023C -352 1782
CAUX2 023D -353 1784
CBAUDH 02EF -460 2611 2617 3148
CBAUDL 02EE -459 2610 2615 3146
CBINI F23C 3638 -3728
CBUFH 0003 -3107 3108 3347
CBUFHI 0002 -1687 1688 1791
CBUFL 00FD -3108 3349
CBUFLO 003A -1688 1787
CCOMND 023B -351 1779
CDEVIC 023A -350 1687 1688 1776
CDTMA1 0226 -331 1540 2662 2664
CDTMA2 0228 -332 1541
CDTMF3 022A -333 1467 3174 3176 3210 3213
CDTMF4 022C -335
CDTMF5 022E -337
CDTMV1 0218 -324 1463 1464 1547 1549 1551 1552 1554
1574 1576
CDTMV2 021A -325
CDTMV3 021C -326
CDTMV4 021E -327
CDTMV5 0220 -328
CDUBL EF26 3077 -3080
CH 02FC -473 1490 4065 4440 4447 4452 5765
CH1 02F2 -464 5754 5766
CHACT 02F3 -466 1454 4088
CHACTL D401 -751 1455
CHAR 02FA -471 4280 4322 4324 5047 5057
CHBAS 02F4 -467 1452 4086
CHBASE D409 -757 1453
CHKDON EABC 2015 -2022 2037
CHKERR 008F -152 2138
CHKSNT 003B -231 1966 2008 2014 2046
CHKSUM 0031 -221 1965 1974 2011 2033 2035 2073 2135
2156 2158 2628
CHKSUN FFF8 -5782
CHKTIM EAFB -2084 2091
CHRORG E000 -18
CICLO2 E53F 915 -917
CICLOS E533 867 -912
CIERR1 E4D1 835 -840
CIERR2 E6B0 1189 -1199
CIERR3 E50F -883
CIERR4 E511 856 -884 888 894 934
CIJUMP E693 1168 -1174
CINI F3E1 3972 -3992
CIO E4C4 785 -829
CIOCHR 002F -218 829 965 970 980 999 1003 1033
1040 1051 1099
CIOI1 E4A8 -801 812
CIOINT E4A6 789 -800 1228
CIOINV E46E -72 788 3828
CIOORG E4A6 -21 797
CIOPEN E509 865 -878
CIOSPR 0014 -1231
CIOV E456 -64 784 3660 3945
CIREAD E569 871 -948
CIRT3 E62B -1090 1095
CIRTN1 E61B 841 884 954 1023 -1079
CIRTN2 E61D 907 923 944 966 1013 1074 -1084
CIST1 E559 930 -937
CISTSP E54E 869 -928
CIWRIT E5C9 872 -1017
CIX 00F2 -629
CKEY 004A -245 3834 3975 3984
CKSTC EE11 2814 -2816
CLICK FCD8 4453 4705 -5333
CLICK1 FCDA -5334 5337
CLOSE 000C -89
CLOSEC F02B 3123 -3277
CLRCHP F284 -3802 3807
CLRCOD 007D -4008 4290
CLRLI1 FBA6 -5127 5129
CLRLIN FB9B 4675 -5122
CLRRAM F140 -3568 3571 3575
CLRSC2 F7BF -4548 4550 4554
CLRSC3 F7CE -4556 4559
CLRSCR F7B9 4258 4292 -4545 5649
CLRTAB F832 -4601 5661
CLRTBS F430 -4103 4105
CLS 007D -3393 3504
CLWRT F038 3278 -3284
CMODE EF1E -3076 3092
CNTL1 009F -4009 5759
CNTRLS FEC6 4420 4422 5277 -5638
COLAC 0072 -280 5418 5473 5475 5476 5478 5482
COLBK D01A -722
COLCR FCE4 4560 4879 -5343
COLCR1 FCEE 5345 -5348
COLCR2 FCF0 5347 -5349
COLCRS 0055 -260 4368 4387 4530 4531 4536 4538 4539
4565 4572 4577 4588 4657 4697 4756 4758
4789 4794 4823 4825 4838 4840 4841 4853
4881 4948 4953 4956 5123 5180 5195 5204
5223 5349 5378 5380 5487 5488 5491 5493
5495 5497
COLDST 0244 -366 3542 3583 3691
COLDSV E477 -75 3468
COLINC 007A -285 5384 5406 5485
COLON 003A -779
COLOR0 02C4 -439 4108
COLOR1 02C5 -440
COLOR2 02C6 -441
COLOR3 02C7 -442
COLOR4 02C8 -443 4147
COLPF0 D016 -718
COLPF1 D017 -719
COLPF2 D018 -720
COLPF3 D019 -721
COLPM0 D012 -714 1449
COLPM1 D013 -715
COLPM2 D014 -716
COLPM3 D015 -717
COLRSH 004F -251 1418 1447
COLRTB FEC1 4107 -5629
COLUMN FE8D 4843 4955 -5594
COM1 E647 1111 -1118
COM2 E662 1115 -1132
COMENT E63D 893 902 914 937 957 1026 -1109
COMFRM E978 -1767 1808
CGMMND E974 -1762 1875
COMPLT 0043 -1660 1923
COMPUT ECA7 -2489 2609
COMRE1 F7A7 4534 -4537 4541 4542
COMRET F789 4519 -4523 4527
COMTAB E6C9 864 1123 -1225
CONSOL D01F -727 1444 3311 3316 3831 5334
CONTIN EC35 2328 -2352
CONVR1 F97E -4783 4787
CONVR2 F988 4784 -4788
CONVR3 F98F -4791 4797
CONVR4 F99C 4792 -4798
CONVR5 F9A6 4802 -4804
CONVR6 F9A7 -4805 4808
CONVRT F947 4273 4323 4630 4658 4698 -4754 5124 5260
COS BD73 -612
COUNT ED3F -2589 2600 2603 2613
COUNTR 007E -289 5431 5441 5449 5450 5523 5525 5526
5528
CR 009B -129 2996 3504 3516 3528 4295 4373 4398
4488
CRETRI 000D -1690 1762 1821
CRETRN EBE3 2248 -2280
CRETRY 0036 -226 1763 1807 1822
CRITIC 0042 -240 1423 1748 1882
CRLOOP F5E7 -4307 4310
CRNTP1 E6D5 -1229 1231
CRNTP2 E944 -1608 1610
CRNTP3 E0EA -2733 2735
CRNTP4 EE78 -2878 2881
CRNTP5 EF41 -3098 3102
CRNTP6 F0E3 -3377 3379
CRNTP7 F3E4 -3998 4001
CRNTP8 FFF8 -5780 5784
CRSINH 02F0 -462 1358 4100 4343
CRSRDN F78C -4524 5643
CRSRL1 F7A3 4532 -4535
CRSRLF F799 -4530 4576 5215 5222 5645
CRSROR 0080 -150 4967
CRSRRT F7AA -4538 4587 5647
CRSRUP F77F -4518 4582 5641
CSBOOT F3B2 3671 -3967
CSBOT2 F3C0 3968 -3975
CSIDE EF2E 3081 -3084
CSIO F0AC -3351
CSOPIV E47D -77 3136 3980
CSTAT 0288 -401
CTIA D000 -695 696 697 698 699 700 701 702
703 704 705 706 707 708 709 710
711 712 713 714 715 716 717 718
719 720 721 722 723 724 725 726
727 728 729 730 731 732 733 734
735 736 737 738 739 740 741 742
743 744 745 746 747
CTIMHI 0000 -1693 2467
CTIMLO 0002 -1692 2466
CTRLC 0092 -3394
D 0044 -2906 3080
DAUX1 030A -497 1781 2965 3089 3858 3896
DAUX2 030B -498 1783 2231 2258 2280 3364 3856
DBDDEC F913 4166 -4718
DBDEC F91F 4156 -4729
DBSECT 0241 -364 3894
DBSUB F921 4126 4143 4719 -4730
DBSUB1 F934 4737 -4739
DBUFHI 0305 -492 2202 2821 2870 3040 3348 3862
DBUFLO 0304 -491 2197 2819 2868 3039 3350 3860
DBUFSZ 0014 -2900 3082
DBYTHI 0309 -496 2204 2826 2856 3054 3344
DBYTLO 0308 -495 2199 2824 2854 3052 3346
DCB 0300 -486
DCOMND 0302 -489 1778 2805 2812 2830 2837 2964 3046
3088 3342 3357 3850 3957
DCTIM1 E902 1548 -1552
DCTIMR E8F5 1420 1457 1466 -1547
DCTXF E90F 1550 1553 1555 -1558
DDEVIC 0300 -487 1750 1773 2309 2371 2803 3042 3201
3352
DECBF1 E66D 1140 -1142
DECBFL E663 983 987 1054 1058 -1137
DECFLG 00FB -634
DEGON 0006 -637
DELAY0 EC90 -2458 2462
DELAY1 EC92 -2459 2460
DELCH1 F870 -4630 4647
DELCH2 F896 4640 4643 -4648
DELCHR F86D -4629 5667
DELETE 0021 -98
DELLI1 F8DD -4681 4692
DELLI2 F8F8 -4696
DELLIA F8D7 -4678
DELLIB F8DB -4680 4702 5269
DELLIN F8D4 -4677 5657
DELTAC 0077 -283 5400 5403 5407 5409 5410 5412 5413
5415 5425 5430 5434 5474 5477
DELTAR 0076 -282 5388 5392 5396 5435 5437 5455
DELTI1 FC82 -5265 5268
DELTI2 FC89 -5269
DELTI3 FC8C 5259 5266 -5270
DELTIA FC68 4651 -5252
DELTIB FC70 5254 -5256
DELTIM FC73 4575 -5257
DERR E9F6 1840 -1861
DERR1 EA06 1810 1849 -1872
DERR5 F10D -3516 3520 3521
DERRH 00F1 -3520 3521 3927
DERRL 000D -3521 3926
DERROR 0090 -154 1929
DEVS1 E6A6 -1191 1196
DEVS2 E6B5 1192 -1204
DEVS3 E6C5 1211 -1213
DEVS4 E6C8 1201 -1217
DEVSRC E69E 887 933 -1187
DFLAGS 0240 -363 3871
DHLINE FE81 4782 -5587
DIGRT 00F1 -628
DINDEX 0057 -261 4084 4116 4172 4203 4341 4781 4842
4855 4883 4934 4941 5048 5346
DINI F37E 3845 3908 -3919
DINIT EDEA 2765 -2794
DIRECT 0002 -110
DISK 0044 -125
DISKID 0031 -2752 2802
DISKIV E450 -62
DISKM F3A4 3954 -3956
DISPLA E410 -4034
DISPLY 0053 -121
DIV2TB FEA5 4788 -5611
DLISTH D403 -753 1436
DLISTL D402 -752 1438
DMACTL D400 -750 1440
DMASK 02A0 -419 4275 4329 4331 4820
DMASKT FEB1 4819 -5618
DNACK 008B -148 1933
DOB 1 FC1A 3200 -5202
DOBOOT F2ED 3852 -3855 3867
DOBU1A FC29 3203 5206 -5209
DOBUF1 FC12 -5198 5213
DOBUF2 FC39 5208 -5216 5228
DOBUF3 FC51 5225 -5227
DOBUF4 FC55 5217 5221 -5229
DOBUFC FC00 4383 -5189
DOCR FA34 4591 4856 4861 4864 -4879
DOCR1 FA00 4852 -4855
DOCR1A FA29 4869 4871 -4874
DOCRIB FA14 4859 -4864
DOCR2 FA3D -4883
DOCR2A FA4A 4886 -4890
DOCR2B FA4D 4889 -4891
DOCR4B FA61 4901 -4903 4909
DOCRWS FA30 4297 4397 4862 -4877 5655
DOINTP ECE9 -2523 2526
DOLCO1 FBE5 -5169 5177
DOLCO2 FBF8 5171 -5178
DOLCOL FBDD 4537 4586 4598 4626 4653 4676 4677 4703
4874 4912 5160 -5165 5239 5256
DOPEN F3F6 4034 -4077
DOPEN1 F460 -4125 4128
DOPEN2 F4D5 -4181 4184
DOPEN3 F4FA -4199 4202
DOPEN4 F51C -4215 4218
DOPEN5 F524 4205 -4219
DOPEN7 F588 4257 -4262
DOPEN8 F438 -4107 4110
DOPEN9 F377 4249 -4255
DOPENA F457 4118 -4121
DOSINI 000C -179 3879 3881 3919 3986 3988
DOSS F6AD 4375 -4409
DOSVEC 000A -178 3579 3581 3707
DOUBLE 0044 -1652
DRAW FCFC 4039 -5366
DRAW1 FD37 5389 -5397
DRAW10 FE42 5452 5529 -5531
DRAW11 FD99 5451 -5453
DRAW2 FD5C 5404 5414 -5416
DRAW3 FD83 5433 5436 -5440
DRAW3A FD62 -5419 5424
DRAW4A FD90 -5449 5530
DRAWS FDA4 5457 -5459
DRAW5A FDB2 5462 -5466
DRAW6 FDBE 5461 5465 -5472
DRAW6A FDD7 5481 -5485
DRAW6B FDEB 5486 -5495
DRAW7 FDF1 5490 5492 5494 5496 -5498
DRAWS FDF6 5480 5484 -5500
DRAW8A FE0A -5507 5518
DRAW8B FE27 5514 -5519
DRAW8C FE13 -5512
DRAW9 FE30 5503 -5522
DRAWA FD0C 5369 -5375
DRAWB FD0B 5371 -5374
DRAWLN 0011 -95
DRETRI 0001 -1691 1760
DRETRY 0037 -227 1761 1872
DRKMSK 004E -250 1417 1448
DSKFMS 0018 -192
DSKIF EDF0 2766 -2802
DSKINV E453 -63 3851 3960
DSKORG EDEA -24 2735 2775
DSKRDE F381 3865 3899 -3926
DSKSPR 0014 -2881
DSKTIM 0246 -370 2795 2804 2836
DSKUTL 001A -193
DSPFLC 02FE -475 4415
DSTAT 004C -247 4091 4120 4248 4347 4349 4371 4392
4401 4486 4723 4731 4747 4960 4968
DSTATS 0303 -490 1813 1845 1884 2218 2823 2857 3050
3362
DT1 00FA -3114 3242 3287
DTA 00FC -3113 3262
DTIMLO 0306 -493 2417 2809 3056 3356
DUNIT 0301 -488 1774 3044 3354 3848 3959
DUNUSE 0307 -494
DVSTAT 02EA -458 2744 2745 2944 3064
EDITOR E400 -4021
EDITRV E400 -51 3492 3719 3721 3823 4017
EEXP 00ED -624
EGETC1 F650 -4370 4381
EGETC2 F66E 4374 -4382
EGETC3 F67C 4365 -4388
EGETC5 F691 4389 4391 -4397
EGETC6 F66B 4379 -4381
EGETC7 F680 -4390 4393
EGETCH F63E 4023 -4362
ENBOOT F35A 3895 -3903
ENDACK F1BD 3642 3644 -3651
ENDBCK F1AC 3634 3636 -3640
ENDDIF EE69 2839 -2857
ENDPT 0074 -281 4919 4922 5432 5442 5444 5460 5464
5479 5483
ENDRAM F280 3784 -3792
ENINTP ECEF -2528
ENSPEC F256 3759 3762 3765 -3771
ENTVEC 002C -824
EOF 0088 -3395
EOFERR 0088 -145 3248 4485
EOL 009B -780 981 1004 1052 1069
EOPEN F3FC 4021 -4080 4251 4936
EOT 00FE -3115 3240 3295
EOUTC5 F6BE 4411 -4415
EOUTC6 F6B5 -4412 4417
EOUTCH F6A4 4024 -4406
ERANOE FA88 4363 4408 -4931
ERETN F6BB -4414
ERRFLG 023F -361 1800 1837 1848 1861 1896 1941
ERROR 0045 -1661 1926
ERRTN E4C0 -816 817 818
ERRTNH 00E4 805 -817 818 919
ERRTNL 00C0 803 -818 921
ESCAPE F779 -4515 5639
ESCFLG 02A2 -421 4412 4416 4418 4516
ESIGN 00EF -626
ESTSCM F173 3584 -3599
EXP DDC0 -604
EXP10 DDCC -605
EXTEN1 FB7E -5100 5111
EXTEN3 FB8B -5108
EXTEN4 FB92 5109 -5112
EXTEND FB7B 4655 -5098
FADD DA66 -590
FASC D8E6 -583
FCAX F032 -3281 3289 3297
FCHRFL 00F0 -627
FDIV DB28 -592
FEOF 003F -237 3165 3223 3247
FILDAT 02FD -474 5515
FILFLG 02B7 -425 5375 5502
FILLBF EEC3 -3001 3004
FILLIN 0012 -96
FINDX ECDA -2511
FLDOP DD8D -594
FL.DOR DD89 -593
FLD1P DD9C -596
FLD1R DD98 -595
FLOPPY 0030 -1634
FLPTR 00FC -638
FMOVE DDB6 -599
FMSZPG 0043 -242
FMTD EE4A -2840
FMUL DADB -591
FNCNOT 0092 -156 1167
FOMAT 0021 -2755 2806 2838
FOOEY EAE0 2047 -2056
FORMAT 0022 -99
FPI D9D2 -588
FPREC 0006 -575 648 649
FPSCR 05E6 -648 649 650
FPSCR1 05EC -649 651
FPTR2 00FE -639
FR0 00D4 -619
FR1 00E0 -621
FR2 00E6 -622
FRE 00DA -620
FREQ 0040 -238 3305 3322
FRMADR 0068 -4011 4660 4665 5076 5083 5085
FRMERR 008C -149 2122
FRX 00EC -623
FSCR 05E6 -650
FSCR1 05EC -651
FSTOP DDAB -598
FSTOR DDA7 -597
FSUB DA60 -589
FTYPE 003E -236 3155 3363 3978
GBX EFE8 -3231 3235
GBYTE EFD6 3123 -3223 3246
GETCAR 0007 -3388
GETCH F593 4036 -4268 4394
GETCHR 0007 -86
GETDAT 0040 -2757 2810
GETOUT F749 4443 -4488
GETPLT F5A2 4269 -4273 4339 4604 4617 4644 5216 5513
GETREC 0005 -85
GETSEC F39D 3863 3897 3905 -3953
GLBABS 02E0 -450
GOBACK EB0B -2092
GOERR EF3D 3085 -3091
GOHAND E689 897 916 938 964 969 998 1041 1070
-1167
GOOD EA65 1922 1924 1942 -1946
GOODST EE32 2828 -2830
GOON EB68 2172 -2180
GOREAD ED73 2606 -2615
GPRIOR 026F -374 1441 4129 4148
GRACTL D01D -725
GRAFM D011 -713
GRAFP0 D00D -709
GRAFP1 D00E -710
GRAFP2 D00F -711
GRAFP3 D010 -712
HARDI F281 3560 -3800
HATABS 031A -515 516 1118 1120 1191 3619
HDR 00FB -3116
HITCLR D01E -726
HITIMR ECD0 -2505 2508
HITONE 0005 -1670 2317
HOLD1 0051 -256 4121 4199 4215 4223 4678 4768 4776
5168 5169 5176 5240
HOLD2 029F -418 4770 4779
HOLD3 029D -416 4893 4906 4910
HOLD4 02BC -429 5506 5519
HOLDS 02BD -430
HOLDCH 007C -287 4450 4490 4500
HOME F7D6 -4560 4966
HOWMCH F263 -3777 3791
HPOSM0 D004 -700
HPOSM1 D005 -701
HPOSM2 D006 -702
HPOSM3 D007 -703
HPOSP0 D000 -696
HPOSP1 D001 -697
HPOSP2 D002 -698
HPOSP3 D003 -699
HSCROL D404 -754
ICAX1 034A -531 3659
ICAX1Z 002A -214 949 1018 3156 4080 4082 4175 4255
4441
ICAX2 034B -532
ICAX2Z 002B -215 3075 3154 4077
ICBAH 0345 -526 1087 3657 3940
ICBAHZ 0025 -209 1088
ICBAL 0344 -525 1085 3655 3938
ICBALZ 0024 -208 973 1039 1086 1147 1149 1188 1208
ICBLH 0349 -530 1159
ICBLHZ 0029 -213 1161
ICBLL 0348 -529 1156 3944
ICBLLZ 0028 -212 961 962 1030 1031 1034 1137 1138
1141 1142 1157 1158 1160
ICCOM 0342 -523 3653 3942
ICCOMT 0017 -190 863 901 1122
ICCOMZ 0022 -206 854 948 975 993 1017 1046 1064
5367
ICDNO 0341 -522
ICDNOZ 0021 -205 1213
ICHID 0340 -521 802 942
ICHIDZ 0020 -204 878 918 928 943 1109 1205
ICIDNO 002E -217 830 941 1084 1100 1154 1180
ICPTH 0347 -528 806
ICPTHZ 0027 -211 906 920
ICPTL 0346 -527 804
ICPTLZ 0026 -210 904 922
ICSPR 034C -533
ICSPRZ 002C -216 217 218 824 903 905 1119 1121
1125 1128 1129 1130 1175 1177
ICSTA 0343 -524
ICSTAZ 0023 -207 913 1009 1079 1101 1169
IDENT F0F2 -3504 3512 3513 3515
IDENTH 00F0 -3512 3513 3711
IDENTL 00F2 -3513 3710
IFP D9AA -584
IHINIT E6D5 1242 -1281
INATA1 FB4A 5050 -5060
INATAC FB32 4270 -5047
INBUFF 00F3 -630
INC2A F9F8 4844 4849 -4851
INCBF1 E676 1148 -1150
INCBFP E670 974 1043 -1147
INCRS1 FA77 4863 4892 4895 4897 -4912
INCRS2 F9E4 4839 -4841
INCRS3 F9F7 4846 4848 -4850 4854
INCRSA F9DC 4611 -4837 5509
INCRSB F9D4 4271 4637 -4833 5209
INCRSC F9DA 4834 -4836
INCRSR F9D8 4300 -4835
INIMLH 0007 -3391 3821
INIMLL 0000 -3390 3819
INIT EF41 3126 -3145
INSCH1 F852 -4615
INSCH3 F85E 4614 -4621
INSCH4 F844 -4608 4620
INSCH5 F86A 4623 -4626
INSCH6 F861 -4622 4625
INSCHR F837 -4603 5669
INSCLR 0020 -115
INSDAT 007D -288 4605 4615 4618 4836 4860 4870 4878
4896
INSLI1 F8C6 -4671 4674
INSLI2 F8CE 4670 -4675
INSLIA F8A5 -4655 4873
INSLIN F8A4 -4654 5659
INTABS 0200 -311 1244 1713 3608 4059
INTATA FEFA 5059 -5682
INTEMP 022D -336 1569 1573
INTINV E46B -71 1241 3830
INTORG E6D5 -22 1231 1280
INTSPR 0014 -1610
INTTBL EC88 -2440
INTZBS 0010 -183 3593
INVFLG 02B6 -424 4464 4466 4505
IOC1 E4D6 837 -844
IOC1A E4D8 -845 850
IOC2 E4F3 861 -863
IOC6 E514 880 -887
IOC7 E519 -893
IOCB 0340 -520 845 1091
IOCBAS 0020 -203 846 1090
IOCBSZ 0010 -201 202 809
IOCFRE 00FF -104 801 879 917 929
IRQEN D20E -692 1299 1301 1307 1309 1314 1317 1319
1321 1325 1327 1332 1334 1339 1341 1343
1346 1348 1352 1354 2020 2054 2353 2395
4095
IRQST D20E -678 1296 1304
ISEOF F00D 3224 -3248
ISRODN EA90 1716 -1994 2441 2446 2447
ISRSIR EB11 1715 -2111 2440 2444 2445
ISRTD EAD1 1717 -2046 2442 2448 2449
JSRIND F6A1 -4404 4424
JTADRH 00EB -2293 2294 2663
JTADRL 00F0 -2294 2661
JTIMER EBF0 -2292 2293 2294
JTIMR1 E8EF 1422 -1540
JTIMR2 E8F2 1459 -1541
K1 F729 4469 -4473
K2 F734 4474 -4478
K3 F73F 4479 -4483
K4 F776 4503 -4507
K5 F768 4492 4495 4497 4499 -4502
K6 F74D 4484 -4490
K7 F745 4446 -4486
K8 F773 4489 -4506
KBCODE D209 -674 1489 5753 5758
KBD 004B -120
KBDHND E420 -4048
KBDORG F3E4 -28 4001 4062
KBDSPR 0014 -5784
KEYBDV E420 -53 3334 3336 3496 3325 4043
KEYDEL 02F1 -463 1475 1477 5756 5768
KGETC1 F71E 4463 -4468
KGETC2 F6DD -4439 4461 4467 4472 4477 4482
KGETC3 F6FE -4454 4501
KGETCH F6E2 4050 4370 -4441 4449
LBFEND 05FF -652
LBPR1 057E -644
LBPR2 057F -645
LBUFF 0580 -646 647
LDPNTR EB6E 1824 1857 -2196 2244 2271
LEDGE 0002 -253 3599
LENGTH 022F -1228
LFRTCM F7A5 -4536 4544
LINBUF 0247 -372 5069 5071
LIN7BS 0000 —167
LIRG 0000 -3396
LMARGN 0052 -257 3600 4260 4533 4543 4570 4573 4589
4656 4696 5122 5212 5220 5242 5253 5258
5263 5348
LO1GET FB22 -5032 5101 5170
LO2GET FB23 4683 -5033
LOCKFL 0023 -100
LOG DECD -606
LOG10 DED1 -607
LOGCOL 0063 -269 4377 4561 4569 4595 4599 4601 4609
4613 4635 4639 4837 4857 5166 5172 5175
5179 5181 5190 5211 5219 5230 5252 5257
LOGGET FB20 4592 4700 -5031
LOGMAP 02B2 -423 4556 4693 4695 4907 5010 5011 5012
LOTONE 0007 -1671 2315
LPENH 0234 -344 1434
LPENV 0235 -345 1432
MOPF D000 -728
MOPL D008 -736
M1PF D001 -729
M1PL D009 -737
M2PF D002 -730
M2PL D00A -738
M3PF D003 -731
M3PL D00B -739
MASKTB FEB9 5000 5623
MAXDEV 0021 -516 1110 1190
MAXIOC 0080 -202 811 836
MEMLO 02E7 -456 3820 3822
MEMORY M 0000 0
MEMTOP 02E5 -455 3816 3818 4066 4237 4239
MLTTMP 0066 -271 272 4012 4762 4764 4765 4767 4769
4772 4774 4777 4778 4780 4785 4786 4800
4801 4803 4810 4815
MODATA E9F0 1846 -1857
MODEM 004D -124
MONORG F0E3 -27 3379 3480
MONSPR 0014 -4001
MOTRGO 0034 -1682 2238 2265 3169 3203
MOTRST 003C -1683 1725 2283 2642 3281
MOVLI1 FB5B -5074 5081
MOVLI2 FB7A 5090 -5092
MOVLIN FB4E 4671 -5069
MOVVEC F17D -3607 3610
MVBUFF F32D -3882 3898
MVNXB F32F -3883 3886
MXDMDE FE5D 4194 -5550
MXDMOD 0010 -114
N 004E -2905 3076 3091
NACK 004E -1659
NARG 0000 0
NBUFSZ 0028 -2899 3078
NCOMHI 003C -1681 1728 2082
NCOMLO 0034 -1680 1795
NEWCOL 0061 -268 5379 5381 5398 5401
NEUROW 0060 -267 5377 5386
NLR F005 3243 -3245
NMIEN D40E -762 1282 1571 1578
NMIRES D40F -763 1395
NMIST D40F -764 1383 1387 1579
NOA1 F1F1 3678 -3680
NOA2 F212 3693 3696 -3698
NOB1 F1F8 3681 -3683
NOBOOT F1FF 3684 -3690
NOCAR2 F220 3699 -3707
NOCART F1FC 3676 -3687 3702
NOCKSM 003C -232 1908 2171 2175
NOCLR EAEB 2071 -2074
NOCSB2 F3BF 3971 -3973
NOCSBT F3E0 3976 -3990
NODAT 0000 -2756
NOFUNC F63D 4026 4051 4053 -4351
NOINIT F2DC 3844 -3846
NOISE1 EC49 2362 -2364 2367
NOKEY F2CE 3833 -3835
NOMOD F4AB 4158 -4162
NONDEV 0082 -139 1199
NORMAL 004E -1651
NOROWS FE99 4890 4942 -5602
NOSCR1 FA32 4876 -4878
NOSCRL FA2C -4875
NOT8 F48B 4134 4145 -4148
NOTCAS EC10 2311 -2320
NOTCST E96B 1752 -1757
NOTDER EA52 1927 -1933
NOTDON EA81 -1976 1981
NOTE 0026 -103
NOTEND EAC0 2003 2006 -2028
NOTERR EA00 1862 -1868
NOTMXD F4F5 4174 4177 -4197
NOTOPN 0085 -142 819 1114
NOTYET EB3E 2132 -2151
NOWARM F2DD 3841 -3847
NOWRP0 EA98 1998 -2001
NSIGN 00EE -625
NTBRK0 EA88 1977 -1980
NTBRK1 EB02 2085 -2088
NTBRK2 ED1B 2568 -2571
NTFRAM EB1F 2120 -2125
NTOVRN EB27 2126 -2131
NTWRP1 EB52 2161 -2164
NUMDLE FE51 4194 4198 -5547
NVALID 0084 -141 853 5372
NWOK EA56 1915 1931 -1936
NXTENT F18C -3618 3621
ODNHI 00EA -2446 2447
ODNLO 0090 -2447
OFFCRS FAE4 4382 4409 -4980
OKTIM1 ED23 2574 -2577
OKTIMR ED4C 2593 -2597
OLDADR 005E -266 4814 4818 4982
OLDCHR 005D -265 4340 4981
OLDCOL 005B -264 5399 5402
OLDROW 005A -263 4308 5387 5421
OPEN 0003 -84 855
OPENC EF4C 3123 -3154
OPINP EF5D 3137 3159 -3163
OPNCOM F404 4079 -4084
OPNEDT F118 -3528 3530 3531
OPNERR F453 -4119
OPNH 00F1 -3530 3531 3656
OPNIN 0004 -111 113
OPNINO 000C -113
OPNL 0018 -3531 3654
OPNOT 0008 -112 113
OPNOUT 0002 —2898
OPNRTN EF8F 3168 -3187 3195
OPNTMP 0066 -272 4131 4140 4169 4195 4196 4197
OPOK EFD3 3181 -3217
OPOUT EF95 3161 -3191
OPSYS F17B -3606
OSRAM F294 3611 -3813
OUTCH F5B7 4037 -4286
OUTCH2 F5FF -4322 4346 4608
OUTCHA F5BD -4289
OUTCHB F5D7 4296 -4299
OUTCHE F5CA 4291 -4294 4413
OUTPLT F5E0 4299 -4304 4305 4585 5501 5517
OVRRUN 008E -151 2128
P0PF D004 -732
P0PL D00C -740
P1PF D005 -733
P1PL D00D -741
P2PF D006 -734
P2PL D00E -742
P3PF D007 -735
P3PL D00F -743
PACTL D302 -768 1284 1290 1362 1726 2239 2266 2284
2643 3170 3204 3282
PADDL0 0270 -376 1512
PADDL1 0271 -377
PADDL2 0272 -378
PADDL3 0273 -379
PADDL4 0274 -380 1514
PADDL5 0275 -381
PADDL6 0276 -382
PADDL7 0277 -383
PAGETB FE75 4157 -5579
PBCTL D303 -769 1285 1291 1366 1729 1796 2083 2644
PBPNT 001D -196 2979 2989 2995 3006 3019
PBRK EF8B -3185 3212
PBUFSZ 001E -197 2960 2993 3003 3051 3087
PBYTE F010 3123 -3254
PCOLR0 02C0 -435 1446
PCOLR1 02C1 -436
PCOLR2 02C2 -437
PCOLR3 02C3 -438
PDEVN 0040 -2902 3041
PENH D40C -760 1433
PENV D40D -761 1431
PHACR1 FC9F -5291 5294
PHACRS FC9D 4603 4629 5189 -5290 5504
PHCHLO EE7F -2945 3007 3008
PHCLOS EEDC 2918 -3018
PHINIT EE78 2923 -2937
PHOPEN EE9F 2917 -2977
PHPUT EF14 2969 -3064
PHSTAT EE81 2921 -2959 2977
PHSTLO EE7D -2944 2961 2962
PHWRIT EEA7 2920 -2907
PIA D300 -765 766 767 768 769
PIRQ E6F3 -1293 1603 1604
PIRQ1 FFDC 5760 -5765
PIRQ2 FFF0 -5773
PIRQ3 FFCB 5755 -5758
PIRQ4 FFEB 5757 5764 -5771
PIRGH 00E6 1264 -1603 1604
PIRQL 00F3 1266 -1604
PIROQ FFBE 4060 -5753
PLACR1 FCAA -5301 5304
PLACRS FCA8 4621 4652 5231 -5300 5521
PLOT 0050 -1653
PLUS ECFC 2532 -2534
PLYARG 05E0 -647 648
PLYEVL DD40 -600
PMBASE D407 -756
PNMI E7B4 -1383 1605 1606
PNMI1 E7BC 1384 -1386
PNMIH 00E7 1268 -1605 1606
PNMIL 00B4 1270 -1606
POINT 0025 -102
POKEY D200 -664 665 666 667 668 669 670 671
672 673 674 675 676 677 678 679
680 681 682 683 684 685 686 687
688 689 690 691 692 693
POKMSK 0010 -104 1300 1308 1312 1318 1326 1333 1340
1347 1353 2017 2019 2051 2053 2324 2350
2352 2393 2394 4093 4094
POKTAB EDD2 2535 2538 -2707
PORTA D300 -766 1287 1364 1494 1501
PORTB D301 -767 1288 1368
POT0 D200 -665 1511
POT1 D201 -666
POT2 D202 -667
POT3 D203 -668
POT4 D204 -669 1513
POT5 D205 -670
POT6 D206 -671
POT7 D207 -672
POTGO D20B -676 1517
PRINTR 0050 -122
PRINTV E430 -54 3488 3826
PRIOR D01B -723 1442
PRMODE EF1A 2988 3018 -3074
PRNBUF 03C0 -536 2945 2991 3001
PRNORG EE78 -25 2881 2930
PRNSPR 0014 -3102
PRVOPN 0081 -138 883
PSIOC EF01 3048 -3050
PTEMP 001F -198 2987 2990
PTIMOT 001C -195 2938 3055 3065
PTRIG0 027C -388 1528
PTRIG1 027D -389 1525
PTRIG2 027E -390
PTRIG3 027F -391
PTRIG4 0280 -392
PTRIG5 0281 -393
PTRIG6 0282 -394
PTRIG7 0283 -395
PTRLP E8D1 -1521 1532
PUTADR EE6D 2833 2840 -2868
PUTBC EE43 2832 -2837
PUTCAR 000B -3389
PUTCHR 000B -88 900
PUTCNT EE21 2817 -2823
PUTDAT 0080 -2758 2815
PUTDTO EE01 2807 -2809
PUTLIN F385 3712 -3936
PUTMSC FCF3 4545 4760 -5355
PUTREC 0009 -87
PUTSEC 0050 -2753
PUTTXT 0009 -3387 3941
PWRONA F3E4 4027 4040 4054 -4064
PWRUP F125 3470 3474 3543 -3553 3663
PWRUP1 F128 3545 -3555
RADFLG 00FB -635
RADON 0000 -636
RAMLO 0004 -171 3566 3567 3568 3572 3573 3773 3777
3780 3781 3782 3783 3786 3875 3877 3884
3888 3890 3891 3893 3914 3917 3918
RAMSIZ 02E4 -454 3632 3640 3815
RAMTOP 006A -274 4068 4111 4122 4185 4207 4553 5144
5158
RANDOM D20A -675
RANGE FA96 4268 4287 4933 4935 -4937 5500 5512
RANGE1 FAB7 4947 -4953
RANGE2 FABB 4952 -4955
RANGE3 FA9E 4939 -4941
RBLOK EFE9 3134 3227 -3232
RBLOKV E47A -76 3133 3955
RCI1 E5A7 977 982 -987
RC111 E5BF -1008
RCI1A E574 950 -957
RCI1B E571 -954 958
RCI2 E5AC -993
RC13 E587 963 -969 988
RC14 E5C3 971 984 995 1000 -1012
RCI6 E5B2 -998 1005
RDBAD EE51 -2844 2851
RDBYTE F310 -3870 3873
RDONLY 0087 -144 1022
READ 0052 -1642 3956
RECEIV EAE2 1859 1910 -2068 2278
RECVDN 0039 -229 2075 2090 2142
RECVDS EC64 -2392
RECVEN EC1F 2001 -2341
REDGE 0027 -254 3601
RELONE EAB3 2009 -2017
RENAME 0020 -97
RESET F11B 3466 3476 -3541
RETUR1 F634 4022 4025 4035 4038 4048 4049 4052 4272
4342 4344 -4347 4507 4974 5312 5531
RETUR3 FAE1 4972 -4974
RETURM F621 4265 4293 4298 4301 -4339 4400 4425
RETURN EA0D 1850 1870 1873 -1880 2286 2655
RIRGHI 0000 -1676 2262
RIRGLO 0078 -1675 2261
RMARGN 0053 -258 3602 4535 4540 4578 4847 4938 4940
5205 5224 5261
RNGER1 FAD8 -4969
RNGER2 FAD6 4964 -4968
RNGERR FAD1 4944 4945 4951 4954 4957 4958 -4966
RNGOK FAC4 4949 -4959
ROWAC 0070 -279 4918 4920 4921 4923 5420 5448 5454
5456 5458 5459 5463
ROUCRS 0054 -259 4307 4366 4385 4518 4522 4524 4525
4564 4580 4624 4641 4668 4679 4680 4754
4761 4827 4865 4882 4891 4911 4943 5031
5110 5112 5167 5193 5202 5214 5226 5255
5291 5302 5317 5320 5376 5422 5467 5469
5507 5511
ROWINC 0079 -284 5383 5391 5468
RRETRN EB10 -2101
RSIRG 000A -1678 2257
RTCLOK 0012 -186 1404 1407 1409 1415 2582 2608 3306
3320 3328
S 0053 -2907 3084
SAVADR 0068 -273 4011 4163 4165 4240 4242 4632 4634
4646 4650
SAVIO 0316 -508 2580 2599 2601
SAVMSC 0058 -262 4150 4152 4219 4221 5138 5140 5355
5357
SBUFSZ 001D -2901 3086
SCOLLP E834 -1446 1451
SCREDT 0045 -119
SCRENV E410 -52 3494 3824 4030
SCRFLC 02BB -428 4607 4622 4904
SCRMEM 0093 -157 4746
SCRNOK F1DB 3662 -3664 3665 3667
SCROL1 FBB7 4699 -5142 5155 5159
SCROL2 FBCA 5147 5150 -5152
SCROLL FBAC 4903 -5137
SDLSTH 0231 -340 1435
SDLSTL 0230 -339 1437 4231 4233 4244 4246
SDMCTL 022F -338 1439 4089 4263 4264
SECT1 F301 -3863 3981
SECTX F34C -3897 3902
SEND EA6B -1959 2246 2464
SENDDS EC63 1880 1983 -2391 2641
SENDEN EBF6 1711 1962 2228 -2305
SENDEV E468 -70 1710 3202
SENDIN EC8E 1798 1826 -2457
SERIN D20D -677 2134 2151
SEROUT D20D -691 1971 2012 2030
SETBSZ EF34 3079 3083 -3087
SETDCB EEE6 2966 3009 -3039
SETTAB F82D -4599 5663
SETVB1 E93D 1580 -1591 1592 1593
SETVBL E912 1238 -1568
SETVBV E45C -66 1237 2670 3175 3208
SETVBX EDBD 2236 2263 2274 2468 -2661
SEX 0000 -3392 3652 3937
SFH EF64 -3166
SHFAMT 006F -278 4276 4325 4821
SHFLOK 02BE -431 4070 4471 4476 4481 4498
SHIFT1 F5B1 4277 -4280
SHIFT2 F610 4326 -4329
SHIFTD F5AA -4276 4279
SHIFTU F60B -4325 4328
SIDWAY 0053 -1650
SIGNON F223 3462 -3710
SIN BD81 -611
SIO E959 1705 -1745
SIOINT E944 1708 -1725
SIOINV E465 -69 1707 3829
SIOORG E944 -23 1610 1721
SIOSB F095 3233 -3342 3375
SIOSPR 0014 -2735
SIOV E459 -65 1704 2827 2967 3010 3365
SIRHI 00E8 -2444 2445
SIRLO 0011 -2445
SIZEM D00C -708
SIZEP0 D00B -704
SIZEP1 D009 -705
SIZEP2 D00A -706
SIZEP3 D00B -707
SKCTL D20F -693 1735 2321 2345
SKRES D20A -690 2117 2347
SKSTAT D20F -679 1471 1481 2116 2577 2597 2620 2622
SOUNDR 0041 -239 1734 2361
SPACE 0020 -2904 3000
SPECIA EF4B 3123 -3149
SPECIL 000E -91 860 862
SPECL F23F 3559 -3758
SQR BEB1 -614
SRETRN EB36 2136 -2141 2177
SRSTA 0040 -3109 3358
SRTIM2 0006 -1236 1487
SRTIMR 022B -334 1479 1484 1488 1538 5772
SRTIR0 EB9F 2232 -2235
SRTIR1 EBC5 2259 -2262
SRTIR2 EBED 2281 -2286
SSFLAG 02FF -476 1357 4304 5761 5763
SSKCTL 0232 -341 1733 2306 2320 2342 2344 2621
STACK S 0000 0
STACKP 0318 -510 1746 2649
STATC 0053 -2754 2816 2831 2963 3047 3849
STATIS 000D -90
STATU F028 3123 -3271
STATUS 0030 -220 1865 1868 1883 1913 1930 1934 1936
1946 1960 2080 2094 2123 2129 2139 2647
STATVH 0002 -2744 2745 2820
STATVL 00EA -2745 2818
STICK0 0278 -384 1499 1503 1521
STICK1 0279 -385
STICK2 027A -386
STICK3 027B -387
STIMER D209 -689
STLOOP E89C -1494 1506
STORE F917 4168 4182 4188 4190 4192 4200 4210 4212
4214 4216 4220 4222 4225 4227 4229 4235
4245 4247 -4723
STORE1 F91D -4726
STRBEG FC5C 4523 -5239
STRERR F942 4742 -4746
STRIG0 02B4 -396 1510
STRIG1 02B5 -397
STRIG2 02B6 -398
STRIG3 0287 -399
STRL E8B5 -1509 1516
STROK F946 4724 4732 4741 4745 -4743
STTMOT EC79 1834 2273 -2417
SUBBFL E677 1012 1073 -1154
SUBEND FA7A -4917 5471 5499
SUBTMP 029E -417 4730 4735
SUCCES 0001 -135 912 1869 1914 1959 2079 2998 3021
3217 3230 3257 3271 3200 4090 4348 4959
SUSUAL EB3A -2144 2166 2169 2183
SV1H 00E9 1582 -1592 1593
SV1L 003D 1584 -1593
SV7H 00E8 -1535 1536
SV7L 0098 -1536
SWAP FCB3 4362 4376 4396 4402 4407 4414 4426 -5311
SWAP1 FCC2 -5317 5324
SWAP3 FCD7 5315 -5328
SWAPA FCB9 4973 5311 -5313
SWPFLG 007B -286 4099 4885 4971 5199 5325 5327 5344
SWSTA 00B0 -3110 3361
SYIRQ E6F6 1255 -1294
SYIRQ1 E70B 1297 -1303
SYIRQ2 E71F 1305 -1311
SYIRQ3 E737 1313 1315 -1321
SYIRQ4 E74A 1323 -1329
SYIRQ5 E75A 1330 -1336
SYIRQ6 E767 1337 -1343
SYIRQ7 E779 1344 -1330
SYIRQ8 E793 1350 -1362
SYIRQ9 E79E 1363 -1366
SYIRQA E7A9 1367 -1370
SYIRQB E7B2 1247 1248 1249 1252 1253 1254 1373 -1375
SYRTI E7B3 1246 -1376
SYSVB1 E7DD 1405 1408 -1410
SYSVB2 E7F9 1421 -1423
SYSVB3 E80B 1428 -1430
SYSVB4 E857 1458 -1460
SYSVB6 E8E8 1483 -1537
SYSVB7 E898 1480 1485 -1492 1535 1536 1539
SYSVBA E869 1465 -1468
SYSVBB E859 -1461 1469
SYSVBL E7D1 1239 1259 -1404
SYSVBV E45F -67
SYVB6A E87C 1473 1476 -1479
TAB F810 -4587 4597 5653
TAB1 F823 4590 4593 -4595
TAB2 F82A 4594 -4598
TABMAP 02A3 -422 4103 5019 5021 5027 5028 5036
TBLENT F0E3 -3487 3515 3618
TBLLEN 000E -3515 3617
TDHI 00EA -2448 2449
TDLO 00D1 -2449
TEMP 023E -357 1685 1686 1920
TEMP1 0312 -505 2499 2510
TEMP2 0314 -506
TEMP3 0315 -507 2587 2605
TEMPHI 0002 -1685 1686 1903
TEMPLO 003E -1686 1899
TIMER1 030C -500 2493 2493 2498 2502 2583 2584
TIMER2 0310 -503 2489 2490 2492 2496 2500
TIMFLG 0317 -509 2088 2241 2268 2295 2573 2592 2667
TIMIT EBA9 -2241 2242
TIMIT1 EBCF -2268 2269
TIMOUT 008A -147 1937 2093
TINDEX 0293 -412 4097
TMPCHR 0050 -255 4330 4334 5075 5078
TMPCOL 02B9 -427
TMPLBT 02A1 -420 4796 4805 4809
TMPROW 02B8 -426 5292 5301
TMPX1 029C -415
TOADR 0066 -4012 4663 4667 5074 5077 5087 5089 5091
TONE1 0002 -3117 3193
TONE2 0001 -3118 3166
TOUT EB0C 2089 -2093 2595
TOUT1 ED48 2575 -2594
TRAMSZ 0006 -172 3574 3631 3645 3674 3677 3692 3775
3787 3790 3814
TRIG0 D010 -744 1509
TRIG1 D011 -745
TRIG2 D012 -746
TRIG3 D013 -747
TRNRCD 0089 -146 1008
TSTAT 0319 -511 1864 1947
TSTCT1 FC8F -5277 3283
TSTCT2 FC9C 5279 -5284
TSTCTL FC8D 4410 4502 -5276
TSTDAT 0007 -173 3630 3637 3673 3680 3698 3778 3785
TWICE EE4F -2842 2846
TXTCOL 0291 -411 4261
TXTMSC 0294 -413 4113 4115
TXTOLD 0296 -414
TXTROW 0290 -410 4259 5319 5322
UNLOCK 0024 -101
UPDNCM F787 -4522 4529
USAREA 0480 -551
VBATRA E7EB 1413 -1417
VBREAK 0206 -315 1374
VBWAIT F496 -4153 4155
VCOUNT D40B -759 2581 2607 4153
VCTABL E480 -20 1244 1713 3607 4059
VDELAY D01C -724
VDSLST 0200 -312 1244 1385
VECTBL E400 -19
VIMIRG 0216 -323 1293
VINTER 0204 -314 1369
VKEYBD 0208 -316 1349 4059
VPRCED 0202 -313 1365
VSCROL D405 -755
VSERIN 020A -317 1310 1713
VSEROC 020E -319 1320
VSEROR 020C -318 1302
VTIMR1 0210 -320 1328
VTIMR2 0212 -321 1335
VTIMR4 0214 -322
VVBLKD 0224 -330 1534
VVBLKI 0222 -329 1396 1590
WAIT EA1A -1895 2470
WAITER EC9F 1839 -2468
WAITTM EF7C -3176 3177
WARMST 0008 -176 3555 3561 3565 3840 3967
WARMSV E474 -74 1390 3464
WATCOM E9D7 1814 -1834
WCI1 E605 1048 1053 -1058
WCI1A E5D4 1019 -1026
WCI1B E5D1 -1023 1027
WCI2 E60A -1064
WC13 E5E5 1032 -1038 1059
WCI4 E5EB 1035 -1041
WC15 E615 1042 1055 1066 -1073
WDLR EFC6 -3211 3214
WFAK F087 3323 -3331
WFAK1 F08C 3331 -3334
WFL F060 -3310 3321
WIRGHI 0000 -1674 2235
WIRGLO 00B4 -1673 2234
WMODE 0289 -402 3164 3188 3192 3277
WOK EA3D -1920
WRITE 0057 -1643 2813
WRITEC 0057 -2903 3074
WRONLY 0083 -140 953
WSIOSB F0D2 3263 3288 3296 -3370
WSIRG 000F -1677 2230
WSYNC D40A -758 5335
WTLR F046 3285 -3290
XBOOT F361 3904 -3906
XITVBL E93E 1240 1260 1429 -1597
XITVBV E462 -68
XMTDON 003A -230 1967 1980 2049
XXIT E805 1424 -1429
ZERIT EC71 -2399 2402
ZERORM F138 -3564
ZIOCB 0020 -200
ZOSRAM F160 3562 -3587
ZOSRM2 F163 -3589 3592
ZOSRM3 F16E -3594 3596
ZTBUF F04A -3292 3294
ZTEMP1 00F5 -631
ZTEMP3 00F9 -633
ZTEMP4 00F7 -632