------- FILE DBOOTNEW.ASM LEVEL 1 PASS 2 1 10000 processor 6502 2 10000 ???? ;TOP OF FILE 3 10000 ???? 4 10000 ???? 5 10000 ???? 6 10000 ???? 7 10000 ???? 8 10000 ???? 9 10000 ???? 10 10000 ???? 11 10000 ???? 12 10000 ???? 13 10000 ???? 14 10000 ???? 15 10000 ???? 16 10000 ???? 17 10000 ???? 18 10000 ???? 19 10000 ???? 20 10000 ???? 21 10000 ???? 22 10000 ???? ;************************************************************* 23 10000 ???? ;************************************************************* 24 10000 ???? ;* * 25 10000 ???? ;* THE FOLLOWING CODE IS CONTAINED IN VISUAL PART * 26 10000 ???? ;* NUMBER IC244-033, V1050 DBOOT FIRMWARE. * 27 10000 ???? ;* * 28 10000 ???? ;* RELEASE 1.1, MARCH 27, 1984 (03-27-84) * 29 10000 ???? ;* * 30 10000 ???? ;************************************************************* 31 10000 ???? ;************************************************************* 32 10000 ???? ;PAGE 33 10000 ???? ;DISPBOOT.ASM BRUCE KOMUSIN APRIL 15, 1983, PM 34 10000 ???? ; STUART SHERMAN AUGUST 5, 1983 35 10000 ???? ; SEPT 16, 1983 36 10000 ???? ; I. NASSI/S.S. SEPT 21, 1983 37 10000 ???? ; S.S. DEC 06, 1983 38 10000 ???? ; FEB 02, 1984 39 10000 ???? ;************************************************************* 40 10000 ???? ;************************************************************* 41 10000 ???? ;02/02/84 42 10000 ???? ; PHOSPHOR SAVER NOW 'TELLS' Z-80 WHEN SCREEN BLANKS. 43 10000 ???? ;************************************************************* 44 10000 ???? ;12/06/83 45 10000 ???? ; FIXED INITIAL FORM FEED AND 'ESC c' PROBLEMS. 46 10000 ???? ;************************************************************* 47 10000 ???? ;11/07/83 48 10000 ???? ; DELETED FORM FEED AT 'START'. 49 10000 ???? ;************************************************************* 50 10000 ???? ;11/01/83 51 10000 ???? ; ADDED KEITH DAVISON'S ESCAPE SEQUENCES. 52 10000 ???? ;************************************************************* 53 10000 ???? ;10/25/83 54 10000 ???? ; DISABLE EXTERNAL INTERRUPTS FIRST THING DONE. 55 10000 ???? ;************************************************************* 56 10000 ???? ;10/21/83 57 10000 ???? ; MOVED 6845 INITIALIZATION TO START OF CODE TO FIX DRAM 58 10000 ???? ; REFRESH PROBLEM. 59 10000 ???? ;************************************************************* 60 10000 ???? ;10/13/83 61 10000 ???? ; SPACE PROBLEMS -- SO MOVED 'HASH' & 'RAMTEST' TO 62 10000 ???? ; CHARACTER FONT AREA ('GARBAGE' AREA). ALSO 63 10000 ???? ; SUBROUTINIZED INITIALIZATION SECTION. 64 10000 ???? ;************************************************************* 65 10000 ???? ;10/12/83 66 10000 ???? ; CHANGED SCREEN DEFAULT TO DIM, ATTRIBUTE BOLD. 67 10000 ???? ; ALSO ADDED 'HASH' & 'RAMTEST' ROUTINES. 68 10000 ???? ;************************************************************* 69 10000 ???? ;10/3/83 70 10000 ???? ; INVERT HARDWARE INTENSITY CONTROL BIT 71 10000 ???? ;************************************************************* 72 10000 ???? ;09/21/83 73 10000 ???? ; MORE CHANGES TO CORRECT MISTAKES. 74 10000 ???? ;************************************************************* 75 10000 ???? ;09/15/83 76 10000 ???? ; VERSION REQUEST ROUTINE FIXED & WORKS. 77 10000 ???? ;************************************************************* 78 10000 ???? ;09/07/83 79 10000 ???? ; FIXED 'ESC [ 2 J' ROUTINE. 80 10000 ???? ;************************************************************* 81 10000 ???? ;09/06/83 82 10000 ???? ; ADDED CODE FOR 'ESC [ 2 J' TO CLEAR SCREEN AND LEAVE 83 10000 ???? ; CURSOR WHERE IT CURRENTLY IS. 84 10000 ???? ;************************************************************* 85 10000 ???? ;08/29/83 86 10000 ???? ; ADDED CODE FOR SOFTWARE CONTROLLED BLINK . 87 10000 ???? ;************************************************************* 88 10000 ???? ;08/22/83 89 10000 ???? ; ADDED ADJUSTABLE SCROLLING REGION A LA VT100. 90 10000 ???? ;************************************************************* 91 10000 ???? ;08/19/83 92 10000 ???? ; CHANGED 'BPL' TO 'BNE' TO LOAD 256 CHARACTERS INTO 93 10000 ???? ; CHARACTER RAM INSTEAD OF 128 CHARACTERS. 94 10000 ???? ;************************************************************* 95 10000 ???? ;08/18/83 96 10000 ???? ; TWEEKED START OF (VERTICAL SYNC-1) FOR 16 MHZ 1050 97 10000 ???? ; BREADBOARD. 98 10000 ???? ;************************************************************* 99 10000 ???? ;08/12/83 100 10000 ???? ; FIXED DEFAULT G1 CHARACTER SET AND ADDED GRAPHICS 101 10000 ???? ; CHARACTERS AT 020H THRU 03FH (G2 FONT). 102 10000 ???? ;************************************************************* 103 10000 ???? ;************************************************************* 104 10000 ???? 105 10000 ???? ;BOOTSTRAP PROGRAM FOR DISPLAY SECTION OF VISUAL "SOLUTION" 106 10000 ???? ;6502 PROCESSOR MNEMONICS 107 10000 ???? 108 10000 ???? ;EQUATES 109 10000 ???? 110 10000 ???? 00 1e ONTIME EQU 30 ;VALUE FOR 1/2 SECOND ON TIME 111 10000 ???? 00 1e OFFTIME EQU 30 ;VALUE FOR 1/2 SECOND OFF TIME 112 10000 ???? 113 10000 ???? 31 31 VERSION EQU $3131 ;BUG FIX/MAJOR REV ie. BUG FIX 1 FOR REV 1 (RELEASE 1.1) 114 10000 ???? 115 10000 ???? ;MEMORY MAPPED I/O REGISTERS 116 10000 ???? 80 00 CRTCA EQU $08000 ;CRTC ADDRESS REGISTER 117 10000 ???? 80 01 CRTCD EQU $08001 ;CRTC DATA REGISTER 118 10000 ???? 119 10000 ???? 90 00 IOPA EQU $09000 ;DISPLAY/PROCESSING I/O PORT A 120 10000 ???? 90 01 IOPB EQU $09001 ;DISPLAY/PROCESSING I/O PORT B 121 10000 ???? 90 02 IOPC EQU $09002 ;DISPLAY/PROCESSING I/O PORT C 122 10000 ???? 90 03 IOCTRL EQU $09003 ;DISPLAY/PROCESSING I/O CONTROL PORT 123 10000 ???? 124 10000 ???? a0 00 ATT EQU $0A000 ;ATTRIBUTE REGISTER 125 10000 ???? 126 10000 ???? b0 00 Z80 EQU $0B000 ;WRITE 01H TO HERE SETS Z-80 INTERRUPT 127 10000 ???? 128 10000 ???? c0 00 RTC EQU $0C000 ;WRITE TO HERE RESETS VERTICAL RETRACE INTERRUPT 129 10000 ???? 130 10000 ???? ;ASCII CHARACTERS 131 10000 ???? 00 0d CR EQU $0D 132 10000 ???? 00 0a LF EQU $0A 133 10000 ???? 00 08 BS EQU $08 134 10000 ???? 00 09 HT EQU $09 135 10000 ???? 00 0c FF EQU $0C 136 10000 ???? 00 0e SO EQU $0E 137 10000 ???? 00 0f SI EQU $0F 138 10000 ???? 00 00 NUL EQU $00 139 10000 ???? 00 1b ESC EQU $1B 140 10000 ???? 00 07 BEL EQU $07 141 10000 ???? 00 20 SPC EQU $20 142 10000 ???? 143 10000 ???? ;PROM ADDRESSES 144 10000 ???? e0 00 PROM EQU $0E000 ;START OF PROM 145 10000 ???? 20 00 PROMLEN EQU 8*1024 ;2764 PROM, 8K LONG 146 10000 ???? 147 10000 ???? 148 10000 ???? ;NOTE; 149 10000 ???? ;A USER PROGRAM MAY BE LOADED INTO THE RAM IN THE ADDRESS RANGE FROM 150 10000 ???? ;0E00H TO 1FF9H. LOADING IS DONE BY MULTIPLE "MEMORY POKE" COMMANDS. 151 10000 ???? ;AT LOCATIONS 1FF7H TO 1FF9H MUST BE A JUMP TO THE START OF THE 152 10000 ???? ;ROUTINE TO BE EXECUTED WHEN ESC : IS RECEIVED. THE USER PROGRAM MAY 153 10000 ???? ;USE ANY OF THE SUBROUTINES POINTED TO BY THE SUBROUTINE TABLE STARTING 154 10000 ???? ;AT ADDRESS E002H IN PROM. 155 10000 ???? 156 10000 ???? ;THE USER PROGRAM MUST TERMINATE WITH AN RTS INSTRUCTION. 157 10000 ???? 158 10000 ???? ;PAGE 159 10000 ???? ;DATA AREAS 160 10000 ???? 161 10000 ???? ;LOCATIONS 0-31 ARE GENERAL REGISTERS 162 10000 ???? 163 0020 ORG $20 164 0020 165 0020 ;POINTERS TO THE RASTER LINES OF THE CHARACTER AT THE CURSOR POS'N. 166 0020 ;THESE POINTERS ARE UNDEFINED UNLESS THE LNOK VARIABLE IS NON-ZERO. 167 0020 00 LNOK DS 1 ;LN0 - LN11 POINTERS DEFINED ONLY IF NON-ZERO 168 0021 00 00 LN0 DS 2 169 0023 00 00 LN1 DS 2 170 0025 00 00 LN2 DS 2 171 0027 00 00 LN3 DS 2 172 0029 00 00 LN4 DS 2 173 002b 00 00 LN5 DS 2 174 002d 00 00 LN6 DS 2 175 002f 00 00 LN7 DS 2 176 0031 00 00 LN8 DS 2 177 0033 00 00 LN9 DS 2 178 0035 00 00 LN10 DS 2 179 0037 00 00 LN11 DS 2 180 0039 181 0039 00 00 00 00*CURMSK DS 12 ;12 BYTES OF THE CURSOR MASK. EXCLUSIVE-ORED WITH THE 182 0045 ; CURRENT CHARACTER TO EFFECT CURSOR DISPLAY. 183 0045 00 00 00 00*REVMSK DS 12 ;12 BYTES OF 0FFH. EXCLUSIVE-ORED WITH THE CURRENT 184 0051 ; CHARACTER TO EFFECT CHARACTER REVERSAL. 185 0051 186 0051 ;CHARACTER ORIENTED VARIABLES 187 0051 00 CONDS DS 1 ;CONDITIONS. BITS: 188 0052 ; 7 1 = OVERSTRIKE, 0 = REPLACE 189 0052 ; 6 1 = CURSOR WANTED FOR DISPLAY 190 0052 ; 5 1 = CURSOR BLINK 191 0052 ; 4 1 = SLOW SCROLL 192 0052 ; 3 1 = AUTO NEWLINE 193 0052 ; 2 1 = DISABLE PHOSPHOR SAVER 194 0052 ; 1 1 = UNDERLINE ENABLE 195 0052 00 HCUR DS 1 ;CURRENT HORIZONTAL CURSOR POSITION, 0 - 79 196 0053 00 VCUR DS 1 ;CURRENT VERTICAL CURSOR POSITION, 0 - 24 197 0054 00 ATTRIB DS 1 ;CURRENT ATTRIBUTES BYTE. BITS: 198 0055 ; 7 SOFTWARE BLINK BIT 199 0055 ; 6 1 = INTENSITY ATTRIBUTE MAKES TEXT BRIGHTER 200 0055 ; 0 = INTENSITY ATTRIBUTE MAKES TEXT DIMMER 201 0055 ; 5 HARDWARE BLANK THE WHOLE SCREEN 202 0055 ; 4 HARDWARE REVERSE THE WHOLE SCREEN 203 0055 ; 3 SOFTWARE REVERSE TO BE DONE DURING WRITING 204 0055 ; 2 1 = SET ATTRIBUTE RAM FROM ATTRIB LATCH 205 0055 ; 0 = PERSERVE LAST READ ATTRIBUTE 206 0055 ; 1 BLINK TO BE DONE DURING WRITING 207 0055 ; 0 INTENSITY TO BE DONE DURING WRITING 208 0055 ;NOTE: THIS BYTE DOUBLES AS THE RAM "SHADOW" OF THE 209 0055 ; ATTRIBUTE LATCH AT ADDR A000H 210 0055 00 CRTCRG12 DS 1 ;"SHADOW" OF CRTC HOME ADDRESS HIGH REGISTER 211 0056 00 CRTCRG13 DS 1 ;"SHADOW" OF CRTC HOME ADDRESS LOW REGISTER 212 0057 00 CURDSP DS 1 ;SOFTWARE CURSOR CURRENTLY BEING DISPLAYED: NON-ZERO 213 0058 00 00 00 CURBLK DS 3 ;CURSOR BLINK AND PHOSPHOR SAVER COUNTER 214 005b 00 PSAVCNT DS 1 ;PHOSPHOR SAVER 4-MINUTE COUNTER 215 005c 00 SOFLG DS 1 ;SHIFT OUT FLAG. 0=NORMAL(SHIFT IN), 80H=SHIFT OUT MODE 216 005d 00 G0VAL DS 1 ;VALUE ADDED TO 7-BIT CHAR CODE TO ADDRESS CHARACTER 217 005e ; GENERATOR FOR G0 GRAPHICS SET 218 005e 00 G1VAL DS 1 ;VALUE ADDED TO 7-BIT CHAR CODE TO ADDRESS CHARACTER 219 005f ; GENERATOR FOR G1 GRAPHICS SET 220 005f 221 005f 00 CSIPTR DS 1 ;POINTER TO CURRENT PARAMETER DURING CSI STRING 222 0060 00 00 CSIPR0 DS 2 ;CSI PARAMETER 0 223 0062 00 00 CSIPR1 DS 2 ;CSI PARAMETER 1 224 0064 00 00 CSIPR2 DS 2 ;CSI PARAMETER 2 225 0066 00 00 CSIPR3 DS 2 ;CSI PARAMETER 3 226 0068 00 00 CSIPR4 DS 2 ;CSI PARAMETER 4 227 006a 00 00 CSIPR5 DS 2 ;CSI PARAMETER 5 228 006c 00 00 CSIPR6 DS 2 ;CSI PARAMETER 6 229 006e 00 00 CSIPR7 DS 2 ;CSI PARAMETER 7 230 0070 00 00 CSIPR8 DS 2 ;CSI PARAMETER 8 231 0072 00 00 CSIPR9 DS 2 ;CSI PARAMETER 9 232 0074 00 00 CSIPRX DS 2 ;FAKE PARAMETER NECESSARY TO GRACEFULLY TRICK CSI CODE 233 0076 ; IF TOO MANY PARAMETERS SENT 234 0076 235 0076 ;PAGE 236 0076 ;GRAPHICS ORIENTED VARIABLES 237 0076 238 0076 ;POINT ROUTINE VARIABLES. 239 0076 00 00 X DS 2 ; 0 <= X <= 639 240 0078 00 00 Y DS 2 ; 0 <= Y <= 299 241 007a 00 XYDOTS DS 1 ;ORIGINAL BIT MASK FOR CONTROLLING DOTTED, DASHED. 242 007b 00 TMPXYDOT DS 1 ;BIT MASK ROTATED AND USED TO CONTROL DOTTED, DASHED. 243 007c 00 XYOPR DS 1 ;BIT OPERATION. 0 = SET, + = RESET, - = TOGGLE BIT 244 007d 00 XYOK DS 1 ;NON-ZERO IF THE XYADDR AND XYMASK VARIABLES OK 245 007e 00 00 XYADDR DS 2 ;PTR TO THE BYTE ADDRESS CONTAINING X,Y 246 0080 00 XYMASK DS 1 ;BIT MASK FOR POINT X,Y 247 0081 248 0081 ;LINE DRAWING VARIABLES. 249 0081 00 00 X1 DS 2 ;SECOND COORDINATE 250 0083 00 00 Y1 DS 2 251 0085 00 XSTEP DS 1 ;STEPS ARE: + = INCREMENT, - = DECREMENT, 0 = NO CHANGE 252 0086 00 YSTEP DS 1 253 0087 00 00 XDELTA DS 2 ;DELTAS ARE ABSOLUTE DIFFERENCE OF COORDINATE 1 AND 0 254 0089 00 00 YDELTA DS 2 255 008b 00 00 VARS DS 2 ;VARS USED TO DECIDE IF DEPENDANT VARIABLE NEEDS STEP 256 008d 257 008d ;CIRCLE DRAWING VARIABLES. 258 008d 00 00 XC DS 2 ;CENTER OF CIRCLE, X 259 008f 00 00 YC DS 2 ;CENTER OF CIRCLE, Y 260 008f 00 8b Z EQU VARS ;(B*B)*(X*X) + (A*A)*(Y*Y) - (A*A)*(B*B)*(R*R) 261 0091 ; I.E. DIFFERENCE BETWEEN MATHEMATICALLY CORRECT 262 0091 ; CIRCLE AND THE CURRENT POINT JUST PLOTTED 263 0091 00 00 DZX DS 2 ;CHANGE IN Z FOR STEP OF +-1 IN X 264 0093 00 00 DZY DS 2 ;CHANGE IN Z FOR STEP OF +-1 IN Y 265 0095 00 00 DDZX DS 2 ;CHANGE IN DZX OR DZTX FOR STEP OF +-1 IN X 266 0097 00 00 DDZY DS 2 ;CHANGE IN DZY OR DZTY FOR STEP OF +-1 IN Y 267 0099 00 00 DZTX DS 2 ;CHANGE IN Z FOR STEP OF +-1/2 IN X 268 009b 00 00 DZTY DS 2 ;CHANGE IN Z FOR STEP OF +-1/2 IN Y 269 009d 00 00 BSQ DS 2 ;THE PIXEL ASPECT RATIO FOR X (SQUARED) 270 009f 00 00 ASQ DS 2 ;THE PIXEL ASPECT RATIO FOR Y (SQUARED) 271 00a1 00 QUAD DS 1 ;CURRENT QUADRANT 272 00a2 00 ENDQUAD DS 1 ;END POINT QUADRANT 273 00a3 274 00a3 ;PAGE 275 00a3 ;NEW VARIABLES ADDED FOR VERSION 2, VISUAL "SOLUTION". 276 00a3 277 00a3 00 CLKTICK DS 1 ;INCREMENTED BY 1 EACH CLOCK TICK (EACH SCREEN SCAN) 278 00a4 00 LOGTOP DS 1 ;LOGICAL TOP LINE OF SCREEN, DEFAULTED TO 0 (TOP LINE 279 00a5 ;OF SCREEN.) THIS VALUE IS USED FOR ADJUSTABLE SCROL- 280 00a5 ;LING REGIONS TO BE USED BY DELETE LINE ROUTINE. 281 00a5 00 LOGBOT DS 1 ;LOGICAL BOTTOM LINE OF SCREEN, DEFAULTED TO 24 (FULL 282 00a6 ;25-LINE SCREEN.) THIS VALUE IS USED TO TERMINATE THE 283 00a6 ;INSERT LINE AND DELETE LINE ROUTINES. 284 00a6 00 KBDBYT DS 1 ;"SHADOW" OF THE BYTE TO BE SENT TO THE VISUAL KB010 285 00a7 ;KEYBOARD WHEN THE KEYBOARD MODE IS TO BE CHANGED. 286 00a7 ;THE BITS IN THIS BYTE ARE ASSUMED TO BE AS FOLLOWS: 287 00a7 ; 7 BELL (250 MILLISEC OF 1 KHZ TONE) 288 00a7 ; 6 KEYCLICK ENABLE 289 00a7 ; 5 HELP KEY (FUNCTION KEY) LED, KEY 79 290 00a7 ; 4 CAPS LOCK LED, KEY 53 291 00a7 ; 3 AUTO-REPEAT ENABLE 292 00a7 ; 2 RESERVED FOR FUTURE USE 293 00a7 ; 1-0 ENCODING SELECTION 294 00a7 ; 00 US/UK 295 00a7 ; 01 AZERTY 296 00a7 ; 10 NOR/DAN/SWE/FINN 297 00a7 ; 11 PORT/SPANISH 298 00a7 299 00a7 00 BLNKCTR DS 1 ;BLINK COUNTER FOR SOFTWARE BLINK 300 00a8 00 TIMEON DS 1 ;TO ENABLE ON THE FLY CHANGES TO BLINK 'ON TIME' 301 00a9 00 TIMEOFF DS 1 ;TO ENABLE ON THE FLY CHANGES TO BLINK 'OFF TIME' 302 00aa 00 SCRATCH DS 1 ;SCRATCH VARIABLE 303 00ab ;PAGE 304 00ab ;CHARACTER FONT TABLE. 305 00ab 306 0200 ORG $0200 307 0200 308 0200 ;THE CHARACTER FONTS ARE READ FROM THE PROM, BIT ORDER REVERSED, AND 309 0200 ; WRITTEN TO THIS RAM FOR USE BY THE DISP ROUTINE. THIS ALLOWS THE 310 0200 ; CHARACTERS TO BE INDIVIDUALLY RE-DEFINED IF NECESSARY. 311 0200 ;CHARACTERS IN THE FONT TABLE ARE ARRANGED DIFFERENTLY THAN IN THE 312 0200 ; PROM; IN PROM EACH SUCCESSIVE BYTE OF A GIVEN CHARACTER IS ADJACENT 313 0200 ; IN MEMORY. IN THIS TABLE, HOWEVER, ALL TOP BYTES ARE IN SUCCESIVE 314 0200 ; LOCATIONS, THEN ALL SECOND BYTES, ALL THIRD, ETC. OBVIOUSLY, BOTH 315 0200 ; FORMATS REQUIRE THE SAME AMOUNT OF ROOM. THIS ARRANGEMENT IN RAM 316 0200 ; IS CHOSEN BECAUSE IT ALLOWS QUICKER ACCESS TO THE BYTES OF A GIVEN 317 0200 ; CHARACTER. 318 0200 319 0200 ;TABLE MUST BEGIN AT 0200H; SEE POKE AND PEEK FONT CODE. 320 0200 00 00 00 00*CGLN0 DS 256 321 0300 00 00 00 00*CGLN1 DS 256 322 0400 00 00 00 00*CGLN2 DS 256 323 0500 00 00 00 00*CGLN3 DS 256 324 0600 00 00 00 00*CGLN4 DS 256 325 0700 00 00 00 00*CGLN5 DS 256 326 0800 00 00 00 00*CGLN6 DS 256 327 0900 00 00 00 00*CGLN7 DS 256 328 0a00 00 00 00 00*CGLN8 DS 256 329 0b00 00 00 00 00*CGLN9 DS 256 330 0c00 00 00 00 00*CGLN10 DS 256 331 0d00 00 00 00 00*CGLN11 DS 256 332 0e00 CGEND 333 0e00 334 0e00 ;PAGE 335 0e00 ;USER AREA 336 0e00 337 1ff7 ORG $2000-(3*3) 338 1ff7 00 00 00 XUSER DS 3 339 1ffa 00 00 00 NMI DS 3 340 1ffd 00 00 00 XINT DS 3 341 2000 342 2000 ;PAGE 343 2000 ;CODE AREA 344 2000 345 e000 ORG PROM 346 e000 347 e000 ; P R O M V E R S I O N 348 e000 31 31 DC.W VERSION ;CURRENT VERSION OF PROGRAM 349 e002 350 e002 ; A D D R E S S T A B L E F O R S U B R O U T I N E S 351 e002 34 e0 DC.W MAIN 352 e004 2c e0 DC.W DOIT 353 e006 c4 e7 DC.W DISP 354 e008 88 e9 DC.W GETCHR 355 e00a b1 e9 DC.W PUTCHR 356 e00c 4d e0 DC.W XCONTROL 357 e00e e6 e9 DC.W GETPARS 358 e010 73 eb DC.W DOLN 359 e012 f9 eb DC.W NEWGCUR 360 e014 09 ec DC.W DOGLN 361 e016 66 ec DC.W DOXSTEP 362 e018 ab ec DC.W DOYSTEP 363 e01a df ec DC.W POINT 364 e01c e6 ec DC.W PNT 365 e01e 04 ed DC.W XPLUSY 366 e020 14 ed DC.W XMINUSY 367 e022 24 ed DC.W MOV2W 368 e024 2e ed DC.W MOV1W 369 e026 39 ed DC.W XMULT 370 e028 59 ed DC.W XNEG 371 e02a d2 e9 DC.W IPUTCHR 372 e02c 373 e02c ;PAGE 374 e02c 375 e02c ; M A I N L O O P 376 e02c 377 e02c DOIT ;UNSTRUCTERED JUMP OUT OF A LOWER LEVEL ROUTINE BECAUSE OF AN ILLEGAL 378 e02c ; CHARACTER ENCOUNTERED IN AN ESCAPE SEQUENCE. EXIT THE SEQUENCE AND 379 e02c ; DO WHATEVER THE CHARACTER WOULD HAVE DONE IN THE NORMAL STATE. 380 e02c a2 ff LDX #$0FF 381 e02e 9a TXS ;RESET THE STACK 382 e02f d0 11 BNE DOIT1 ;EXECUTE THE CHARACTER (ALWAYS BRANCHES) 383 e031 384 e031 20 c4 e7 WRITE JSR DISP ;WRITE THE CHARACTER IN THE ACC TO THE SCREEN 385 e034 MAIN 386 e034 78 SEI ;DISABLE INTERRUPTS 387 e035 a5 54 LDA ATTRIB ;GET ATTRIBUTE BYTE 388 e037 29 fb AND #$0FB ;RESET BIT 2 TO ZERO (STREAMING BIT - PRESERVE READ ATTRIBUTE) 389 e039 85 54 STA ATTRIB ;RESTORE ATTRIB BYTE 390 e03b 8d 00 a0 STA ATT ;TELL HARDWARE 391 e03e 58 CLI ;RE-ENABLE INTERRUPTS 392 e03f 20 88 e9 JSR GETCHR ;ACC = THE NEXT CHARACTER FROM THE PROCESSING SECTION 393 e042 2c 8a ff DOIT1 BIT CTRLTST ;TEST CHARACTER AGAINST CONTROL CHARACTER MASK OF 60H 394 e045 d0 ea BNE WRITE ;NOT A CONTROL CHARACTER, DISPLAY IT 395 e047 20 4d e0 JSR XCONTROL ;THE CHARACTER HAS SPECIAL MEANING & MUST BE EXECUTED 396 e04a 4c 34 e0 JMP MAIN ;REPEAT FOREVER 397 e04d 398 e04d ;PAGE 399 e04d ;EXECUTE THE APPROPRIATE CONTROL FUNCTION 400 e04d ;CONTROL CHARACTER IN ACC, SEE IF IT IS ONE OF THE ACTIVE ONES. 401 e04d c9 0a XCONTROL CMP #LF ;LINE FEED? (TEST FIRST FOR THE SLOWEST FREQUENTLY 402 e04f ; RECEIVED CHARACTER) 403 e04f f0 6d BEQ XLF 404 e051 c9 0d CMP #CR ;CARRIAGE RETURN? (MOST COMMONLY RECEIVED CHAR) 405 e053 f0 60 BEQ XCR 406 e055 c9 09 CMP #HT ;TAB? 407 e057 f0 22 BEQ XHT 408 e059 c9 0c CMP #FF ;FORM FEED? (ABSOLUTELY SLOWEST CHAR NEXT) 409 e05b f0 6b BEQ XFF 410 e05d c9 08 CMP #BS ;BACKSPACE? 411 e05f f0 42 BEQ XBS 412 e061 c9 9b CMP #$9B ;8-BIT CONTROL SEQUENCE INTRODUCER? 413 e063 f0 13 BEQ GOXCSI1 414 e065 c9 0e CMP #SO ;SHIFT OUT (TO ALTERNATE 128-CHARACTER SET)? 415 e067 f0 30 BEQ XSO 416 e069 c9 0f CMP #SI ;SHIFT IN (TO NORMAL ASCII 128-CHARACTER SET)? 417 e06b f0 31 BEQ XSI 418 e06d c9 07 CMP #BEL ;BELL? 419 e06f f0 21 BEQ XBEL 420 e071 c9 1b CMP #ESC ;ESCAPE? 421 e073 d0 28 BNE RTS0 ;IF NONE OF THE ABOVE, IGNORE IT 422 e075 4c 8f e1 JMP XESC 423 e078 424 e078 4c 7e e3 GOXCSI1 JMP XCSI ;EXECUTE COMMAND SEQUENCE INTRODUCER CODE 425 e07b 426 e07b XHT ;HORIZONTAL TAB RECEIVED, PROCESS IT. 427 e07b a9 20 LDA #SPC 428 e07d 20 c4 e7 JSR DISP ;UNCONDITIONALLY OUTPUT AT LEAST ONE SPACE 429 e080 a5 52 LDA HCUR 430 e082 c9 4f CMP #79 ;ON LAST POSITION OF THE LINE? 431 e084 d0 07 BNE XHT1 ;NO, OUTPUT MORE SPACES UNTIL HCUR IS MULTIPLE OF 8 432 e086 a5 51 LDA CONDS ;YES, SEE IF WE SHOULD FALL OFF THE LINE ONTO THE NEXT 433 e088 29 08 AND #$08 ;AUTO NEWLINE ON? 434 e08a d0 ef BNE XHT ;YES, OUTPUT ONE MORE SPACE SO WE GO TO POS'N 00 OF 435 e08c ; THE NEXT LINE 436 e08c 60 RTS ;NO, STOP 437 e08d 438 e08d 29 07 XHT1 AND #$07 ;ARE WE AT A POSITION WHICH IS MULTIPLE OF EIGHT? 439 e08f d0 ea BNE XHT ;NO, OUTPUT MORE SPACES 440 e091 60 RTS ;YES, DONE 441 e092 442 e092 443 e092 XBEL ;BELL RECEIVED, INTERRUPT THE Z-80 TO TELL IT TO BEEP. 444 e092 a5 a6 LDA KBDBYT 445 e094 09 80 ORA #$80 ;TURN ON BELL BIT IN Z-80'S KEYBOARD BYTE 446 e096 4c d2 e9 JMP IPUTCHR ;INTERRUPT Z-80 AND SEND THIS BYTE 447 e099 448 e099 ;PAGE 449 e099 ;SHIFT OUT RECEIVED, PROCESS IT. 450 e099 a9 80 XSO LDA #$80 451 e09b 85 5c STA SOFLG ;SET SHIFT OUT FLAG TO 80H SO THE G1 FONT IS USED 452 e09d 60 RTS0 RTS 453 e09e 454 e09e 455 e09e ;SHIFT IN RECEIVED, PROCESS IT. 456 e09e a9 00 XSI LDA #0 457 e0a0 85 5c STA SOFLG ;CLEAR SHIFT OUT FLAG TO 00H SO THE G0 FONT IS USED 458 e0a2 60 RTS 459 e0a3 460 e0a3 461 e0a3 ;BACKSPACE RECEIVED, PROCESS IT. 462 e0a3 c6 52 XBS DEC HCUR ;MOVE THE CURSOR BACKWARDS 463 e0a5 10 12 BPL LNSNG ;IF NOT BEFORE THE BEGINNING, INDICATE LN NOT OK, DONE 464 e0a7 a9 4f LDA #79 465 e0a9 85 52 STA HCUR ;MOVE CURSOR TO THE END OF THE LINE 466 e0ab c6 53 XUP DEC VCUR ;MOVE CURSOR TO THE PREVIOUS LINE 467 e0ad 10 0a BPL LNSNG ;IF NOT BEFORE FIRST LINE, INDICATE LN NOT OK, DONE 468 e0af a9 18 LDA #24 469 e0b1 85 53 STA VCUR ;MOVE CURSOR TO THE LAST LINE 470 e0b3 d0 04 BNE LNSNG ;INDICATE LN NOT OK, DONE (ALWAYS BRANCHES) 471 e0b5 472 e0b5 473 e0b5 ;CARRIAGE RETURN RECEIVED, PROCESS IT. 474 e0b5 a9 00 XCR LDA #0 475 e0b7 85 52 STA HCUR ;MOVE THE CURSOR TO THE BEGINNING OF THE LINE 476 e0b9 a9 00 LNSNG LDA #0 477 e0bb 85 20 STA LNOK ;FORCE RE-COMPUTATION OF LN0 - LN11 POINTERS 478 e0bd 60 RTS 479 e0be 480 e0be 481 e0be ;LINE FEED RECEIVED, PROCESS IT. 482 e0be a5 53 XLF LDA VCUR ;CURSOR ON LAST LINE? (SCROLLING NECESSARY?) 483 e0c0 c5 a5 CMP LOGBOT ;COMPARE WITH LOGICAL BOTTOM OF SCREEN 484 e0c2 f0 56 BEQ SCROL ;YES, DO THE SCROLL 485 e0c4 e6 53 INC VCUR 486 e0c6 d0 f1 BNE LNSNG ;INDICATE LN NOT OK, DONE (ALWAYS BRANCHES) 487 e0c8 488 e0c8 489 e0c8 ;FORM FEED RECEIVED, PROCESS IT. 490 e0c8 XFF ;THIS MEANS TO CLEAR ALL BYTES TO 00 FROM ADDRESS 2000H TO 7FFFH, 491 e0c8 ; INCLUDING THE ATTRIBUTE BYTES. 492 e0c8 ;TURN OFF ALL ATTRIBUTES. 493 e0c8 a5 51 LDA CONDS ;GET CONDITION BYTE 494 e0ca 29 fd AND #$0FD ;TURN OFF UNDERLINE 495 e0cc 85 51 STA CONDS ;RESTORE CONDITION BYTE 496 e0ce 78 SEI ;DISABLE INTERRUPTS 497 e0cf a5 54 LDA ATTRIB ;ACC = THE ATTRIBUTES 498 e0d1 29 70 AND #$70 ;TURN OFF ALL ATTRIBUTES EXCEPT OVERALL BRIGHTNESS 499 e0d3 09 04 ORA #$04 ;SET BIT 2 TO A ONE (ENABLE ATTRIBUTE WRITE FROM LATCH) 500 e0d5 85 54 STA ATTRIB ;TELL THE SOFTWARE 501 e0d7 8d 00 a0 STA ATT ;TELL THE HARDWARE 502 e0da 58 CLI ;RE-ENABLE INTERRUPTS 503 e0db 504 e0db ;FORM A TABLE IN MEMORY. 505 e0db a0 00 LDY #0 506 e0dd a9 80 LDA #$80 507 e0df a2 0b LDX #11 508 e0e1 38 XFF1 SEC 509 e0e2 e9 10 SBC #$10 510 e0e4 95 00 STA 0,X 511 e0e6 ca DEX 512 e0e7 94 00 STY 0,X 513 e0e9 ca DEX 514 e0ea 10 f5 BPL XFF1 ;AT ADDR 10 PTR TO 7000H 515 e0ec ;AT ADDR 8 PTR TO 6000H 516 e0ec ;AT ADDR 6 PTR TO 5000H 517 e0ec ;AT ADDR 4 PTR TO 4000H 518 e0ec ;AT ADDR 2 PTR TO 3000H 519 e0ec ;AT ADDR 0 PTR TO 2000H 520 e0ec aa TAX ;X = 20H 521 e0ed 98 TYA ;ACC = 00 522 e0ee 523 e0ee ;NOW DO THE CLEARING IN A PARTIALLY "UN-ROLLED" LOOP. 524 e0ee 91 00 CLRLUP STA (0),Y 525 e0f0 91 02 STA (2),Y 526 e0f2 91 04 STA (4),Y 527 e0f4 91 06 STA (6),Y 528 e0f6 91 08 STA (8),Y 529 e0f8 91 0a STA (10),Y ;CLEAR ALL THE BYTES THAT WE CAN ADDRESS WITH THE 530 e0fa ; Y REGISTER FROM 00 TO FF 531 e0fa c8 INY 532 e0fb d0 f1 BNE CLRLUP ;DO 256 CLEARS 533 e0fd 534 e0fd ;NOW INCREMENT THE PAGES TO GET THE OTHER ADDRESSES. 535 e0fd e6 01 INC 1 536 e0ff e6 03 INC 3 537 e101 e6 05 INC 5 538 e103 e6 07 INC 7 539 e105 e6 09 INC 9 540 e107 e6 0b INC 11 541 e109 10 e3 BPL CLRLUP ;CONTINUE IF THE 7X00H PART HASN'T INCREMENTED TO 8000H 542 e10b 543 e10b ;CLEARING DONE. NOW SET UP THE SOFTWARE VARIABLES. 544 e10b 85 52 STA HCUR 545 e10d 85 53 STA VCUR ;CURSOR TO HOME POSITION 546 e10f 85 20 STA LNOK ;FORCE RE-COMPUTATION OF LN0 - LN11 POINTERS 547 e111 85 7d STA XYOK ;SAME FOR GRAPHIC VARIABLES: THIS FIXES OUTSTANDING BUG 548 e113 549 e113 ;POINT THE HARDWARE START OF SCREEN ADDRESS TO 2000H. 550 e113 ;X = 20H FROM ABOVE 551 e113 78 SEI ;DISABLE INTERRUPTS 552 e114 86 55 STX CRTCRG12 ;SET SOFTWARE TO 2000H, THE START OF THE SCREEN BUFFER 553 e116 85 56 STA CRTCRG13 554 e118 58 CLI ;RE-ENABLE INTERRUPTS 555 e119 60 RTS ;RETURN FROM SUBROUTINE 556 e11a 557 e11a 558 e11a ;PAGE 559 e11a SCROL 560 e11a ;FIRST CHECK FOR ALTERNATE SCROLLING REGION 561 e11a a5 a4 LDA LOGTOP ;GET LOGICAL TOP LINE 562 e11c d0 51 BNE ALTSCROL ;OTHER THAN TOP LINE ? IF YES, BRANCH 563 e11e a9 18 LDA #24 ;LOAD ACC W/ BOTTOM LINE NUMBER 564 e120 c5 a5 CMP LOGBOT ;OTHER THAN BOTTOM LINE ? 565 e122 d0 4b BNE ALTSCROL ;YES, DO SELECTIVE SCROLL 566 e124 ; 567 e124 ;CLEAR THE SUB-CELL JUST BELOW THE BOTTOM OF THE SCREEN AND THEN 568 e124 ; SCROLL IT UP ONTO THE SCREEN. DO THIS FOUR TIMES FOR THE FULL 569 e124 ; CHARACTER LINE. 570 e124 ;FIRST, SET UP THE MAJOR LOOP COUNTER TO CLEAR AND SCROLL 4 SUB-CELLS. 571 e124 a9 03 LDA #3 572 e126 85 06 STA 6 ;LOC 6 IS MAJOR LOOP COUNTER 573 e128 ;WE LOOP UNTIL NEGATIVE 574 e128 575 e128 SCR1 ;WE COMPUTE "26-TH. LINE" BY ADDING 25 * (4 * 80) = 1F40H TO THE HOME 576 e128 ; ADDRESS FROM THE CRTC. 577 e128 a5 56 LDA CRTCRG13 ;ACC = HOME ADDR LOW 578 e12a 18 CLC 579 e12b 69 40 ADC #$40 ;ADD 1F40H LOW 580 e12d a8 TAY ;Y = 26-TH LINE LOW 581 e12e a5 55 LDA CRTCRG12 ;ACC = HOME ADDR HIGH 582 e130 69 1f ADC #$1F ;ADD 1F40H HIGH PLUS THE CARRY 583 e132 29 1f AND #$1F 584 e134 09 20 ORA #$20 ;WRAP AROUND FROM 3FFFH TO 2000H 585 e136 586 e136 ;ACC,Y = PTR TO NEXT SUB-CELL AFTER THE BOTTOM OF SCREEN. 587 e136 a2 50 LDX #80 ;CLEAR 80 SUB-CELLS 588 e138 20 d5 ea JSR CLRSUB 589 e13b 590 e13b ;NOW ACTUALLY MOVE THE SOFTWARE HOME ADDRESS DOWNWARDS BY ONE 591 e13b ; SUB-CELL, EITHER SLOWLY OR IMMEDIATELY. 592 e13b a5 56 LDA CRTCRG13 ;ACC = HOME ADDRESS LOW 593 e13d 18 CLC 594 e13e 69 50 ADC #80 595 e140 48 PHA ;SAVE VALUE ON STACK 596 e141 a5 55 LDA CRTCRG12 ;ACC = CRTC HOME ADDRESS HIGH 597 e143 69 00 ADC #0 ;ADD IN CARRY, IF ANY 598 e145 29 1f AND #$1F 599 e147 09 20 ORA #$20 ;WRAP AROUND 3FFFH TO 2000H 600 e149 78 SEI ;DISABLE INTERRUPTS 601 e14a 85 55 STA CRTCRG12 ;UPDATE HOME ADDRESS HIGH 602 e14c 68 PLA ;GET SAVED VALUE 603 e14d 85 56 STA CRTCRG13 ;SEND TO 6845 CTRC CHIP 604 e14f 58 CLI ;RE-ENABLE INTERRUPTS 605 e150 606 e150 a5 06 LDA 6 ;ACC = CURRENT LOOP COUNT 607 e152 f0 06 BEQ SCR3 ;ON THE LAST TIME THROUGH THE LOOP, ALWAYS COPY THE 608 e154 ; SOFTWARE SCREEN ADDRESS TO THE HARDWARE 609 e154 610 e154 ;ON THE THREE OTHER TIMES, COPY ONLY IF WE'RE DOING A SLOW SCROLL. 611 e154 a5 51 LDA CONDS ;GET THE CONDITIONS 612 e156 29 10 AND #$10 ;TEST THE SLOW SCROLL BIT 613 e158 f0 0b BEQ NOSLOW ;IF LOW, NO SLOW SCROLL 614 e15a 615 e15a ;DELAY FOR SOME TIME SO THE FOUR INDIVIDUAL SUB-CELL SCROLLS ARE SEEN. 616 e15a SCR3 617 e15a a2 0b LDX #11 ;WAIT ABOUT 18.2 MILLISECONDS 618 e15c 86 07 STX 7 ;TEMP STORAGE TO HOLD DELAY COUNT 619 e15e SCR2 620 e15e c6 07 DEC 7 ;DECREMENT COUNT 621 e160 d0 fc BNE SCR2 ;INNER DELAY IS 8 CYCLES, 7.11 USECS PER LOOP 622 e162 ca DEX ;DECREMENT X REGISTER 623 e163 d0 f9 BNE SCR2 ;OUTER DELAY IS 1.82 MILLISECONDS PER LOOP 624 e165 625 e165 626 e165 c6 06 NOSLOW DEC 6 ;DONE ALL FOUR SCROLLS? 627 e167 10 bf BPL SCR1 ;NO, CONTINUE 628 e169 20 b9 e0 JSR LNSNG ;INDICATE LN NOT OK 629 e16c 4c 8b ec JMP XYNG ;SAME FOR XY 630 e16f 631 e16f ALTSCROL 632 e16f a5 53 LDA VCUR ;GET CURRENT VERTICAL CURSOR POSITION 633 e171 48 PHA ;SAVE ON STACK 634 e172 a5 a4 LDA LOGTOP ;GET CURRENT LOGICAL TOP LINE 635 e174 85 53 STA VCUR ;...& PUT INTO CURRENT VERTICAL CURSOR POSITION 636 e176 20 19 e4 JSR XDL ;DELETE A LINE AT LOGTOP 637 e179 68 PLA ;RESTORE SAVED CURRENT VERTICAL POSITION 638 e17a 85 53 STA VCUR ;... 639 e17c 60 RTS ;RETURN FROM SUBROUTINE 640 e17d 641 e17d 642 e17d ;PAGE 643 e17d 4c e2 e2 GOXPOKE JMP XPOKE 644 e180 4c 44 e3 GOXPEEK JMP XPEEK 645 e183 4c 7e e3 GOXCSI2 JMP XCSI 646 e186 4c 3b ef GOSTART JMP START 647 e189 4c d6 e4 GOXGRPH JMP XGRPH 648 e18c 4c f7 1f GOXUSER JMP XUSER 649 e18f 650 e18f ;ESCAPE RECEIVED, EXAMINE THE NEXT CHARACTER(S) FOR FURTHER INFO. 651 e18f 20 88 e9 XESC JSR GETCHR ;ACC = THE NEXT CHARACTER 652 e192 c9 5b CMP #"[" ;ESC FOLLOWED BY [ IS COMMAND STRING INTRODUCER 653 e194 f0 ed BEQ GOXCSI2 654 e196 c9 3c CMP #"<" ;ESC FOLLOWED BY < IS A PEEK COMMAND 655 e198 f0 e6 BEQ GOXPEEK 656 e19a c9 63 CMP #"c" ;ESC FOLLOWED BY LOWER CASE C IS A RESET COMMAND 657 e19c f0 e8 BEQ GOSTART 658 e19e c9 3d CMP #"=" ;ESC FOLLOWED BY = IS A NON-PREFERRED CURSOR POS'N 659 e1a0 f0 1b BEQ XCUR 660 e1a2 c9 28 CMP #"(" ;ESC FOLLOWED BY ( IS A SET G0 FONT COMMAND 661 e1a4 f0 2a BEQ XSETG0 662 e1a6 c9 29 CMP #")" ;ESC FOLLOWED BY ) IS A SET G1 FONT COMMAND 663 e1a8 f0 40 BEQ XSETG1 664 e1aa c9 3e CMP #">" ;ESC FOLLOWED BY > IS A POKE COMMAND 665 e1ac f0 cf BEQ GOXPOKE 666 e1ae c9 3b CMP #";" ;ESC FOLLOWED BY ; IS A MISCELLANEOUS COMMAND 667 e1b0 f0 3f BEQ XMISC 668 e1b2 c9 3f CMP #"?" ;ESC FOLLOWED BY ? IS A GRAPHICS COMMAND 669 e1b4 f0 d3 BEQ GOXGRPH 670 e1b6 c9 3a CMP #":" ;ESC FOLLOWED BY : IS USER COMMAND 671 e1b8 f0 d2 BEQ GOXUSER 672 e1ba 4c 2c e0 JMP DOIT ;IF NO MATCH FOUND, EXIT ESCAPE MODE AND PROCESS 673 e1bd ; CHARACTER NORMALLY 674 e1bd 675 e1bd ;NON-PREFERRED CURSOR POSITION COMMAND. 676 e1bd ;ESC = RECEIVED, WAIT FOR CURSOR POS'N IN THE FORM Y+1FH X+1FH 677 e1bd ; (X AND Y IN THE RANGE 1 TO 80 AND 1 TO 25) 678 e1bd 20 88 e9 XCUR JSR GETCHR ;READ Y+1FH 679 e1c0 38 SEC 680 e1c1 e9 20 SBC #$20 ;STRIP THE OFFSET 681 e1c3 48 PHA ;SAVE Y COORDINATE IN RANGE 0 - 24 682 e1c4 20 88 e9 JSR GETCHR ;READ X+1FH 683 e1c7 38 SEC 684 e1c8 e9 20 SBC #$20 ;STRIP THE OFFSET 685 e1ca aa TAX ;X = X COORDINATE IN RANGE 0 - 79 686 e1cb 68 PLA 687 e1cc a8 TAY ;Y = Y COORDINATE 688 e1cd 4c f9 e3 JMP TSTCUR ;SEE IF LEGAL COORDS 689 e1d0 690 e1d0 XSETG0 ;SET UP THE G0 CHARACTER FONT. 691 e1d0 20 88 e9 JSR GETCHR ;ACC = THE FONT CHOSEN 692 e1d3 a2 5d LDX #G0VAL ;RESULT WILL BE WRITTEN TO G0 VALUE 693 e1d5 a0 e0 SETGX LDY #(-$20) ;SUBTRACT 20H FROM NORMAL ASCII FOR FIRST 96 CHARS 694 e1d7 c9 30 CMP #"0" ;SELECTOR OF 0? 695 e1d9 f0 0c BEQ SETGX1 ;YES, SET IT 696 e1db a0 40 LDY #$40 ;ADD 40H TO NORMAL ASCII FOR SECOND 96 CHARS 697 e1dd c9 31 CMP #"1" ;SELECTOR OF 1? 698 e1df f0 06 BEQ SETGX1 ;YES, SET IT 699 e1e1 a0 a0 LDY #$0A0 ;ADD 0A0H TO NORMAL ASCII FOR THIRD 64 CHARS 700 e1e3 c9 32 CMP #"2" ;SELECTOR OF 2? 701 e1e5 d0 02 BNE RTS1 ;NO, IGNORE COMMAND 702 e1e7 94 00 SETGX1 STY 0,X ;SET GXVAL TO THE PROPER NUMBER 703 e1e9 60 RTS1 RTS 704 e1ea 705 e1ea XSETG1 ;SET UP THE G1 CHARACTER FONT. 706 e1ea 20 88 e9 JSR GETCHR ;ACC = THE FONT CHOSEN 707 e1ed a2 5e LDX #G1VAL ;RESULT WILL BE WRITTEN TO G1 VALUE 708 e1ef d0 e4 BNE SETGX ;CONTINUE (ALWAYS BRANCHES) 709 e1f1 710 e1f1 711 e1f1 XMISC ;MISCELLANEOUS COMMANDS EITHER SET THE OVERALL SCREEN BRIGHTNESS OR 712 e1f1 ; SET OR CLEAR TERMINAL MODES, I.E. BITS IN THE CONDS VARIABLE. 713 e1f1 20 88 e9 JSR GETCHR ;ACC = THE PARAMETER 714 e1f4 c9 40 CMP #$40 ;LESS THAN 40H? 715 e1f6 90 f1 BCC RTS1 ;YES, LEVEL SET, IGNORE IT IN THIS VERSION 716 e1f8 a2 40 LDX #$40 ;DEAL WITH INTENSITY BIT IN ATTRIBUTE BYTE 717 e1fa c9 50 CMP #"P" ;INTENSITY ATTRIBUTE IS DIM? 718 e1fc d0 0b BNE XM1 719 e1fe 8a XM2 TXA ;ACC = THE BIT TO TURN ON 720 e1ff 78 SEI ;DISABLE INTERRUPTS 721 e200 05 54 ORA ATTRIB ;TURN IT ON 722 e202 85 54 XM3 STA ATTRIB ;SAVE FOR SOFTWARE 723 e204 8d 00 a0 STA ATT ;INFORM HARDWARE 724 e207 58 CLI ;RE-ENABLE INTERRUPTS 725 e208 60 RTS 726 e209 727 e209 c9 58 XM1 CMP #"X" ;INTENSITY ATTRIBUTE IS BOLD? 728 e20b d0 09 BNE XM4 729 e20d 8a XM5 TXA ;ACC = THE BIT TO TURN OFF 730 e20e 49 ff EOR #$0FF ;ACC = ALL BITS ON BUT THE ONE TO TURN OFF 731 e210 78 SEI ;DISABLE INTERRUPTS 732 e211 25 54 AND ATTRIB ;TURN IT OFF 733 e213 4c 02 e2 JMP XM3 734 e216 735 e216 a2 10 XM4 LDX #$10 ;DEAL WITH REVERSE SCREEN BIT 736 e218 c9 59 CMP #"Y" ;REVERSE SCREEN? 737 e21a f0 e2 BEQ XM2 738 e21c c9 51 CMP #"Q" ;NORMAL SCREEN? 739 e21e f0 ed BEQ XM5 740 e220 741 e220 c9 5c CMP #"\" ;SET LOGICAL LAST LINE? 742 e222 d0 05 BNE XM65 743 e224 a5 53 LDA VCUR ;ACC = CURRENT LINE NUMBER 744 e226 85 a5 STA LOGBOT ;SAVE IT 745 e228 60 RTS 746 e229 747 e229 XM65 748 e229 c9 74 CMP #"t" ;SET LOGICAL TOP LINE ? 749 e22b d0 05 BNE XM6 ;NO, CHECK NEXT SEQUENCE 750 e22d a5 53 LDA VCUR ;ACC = CURRENT LINE NUMBER 751 e22f 85 a4 STA LOGTOP ;SAVE IT 752 e231 60 RTS ;RETURN FROM SUBROUTINE 753 e232 754 e232 a2 40 XM6 LDX #$40 ;DEAL WITH CLICK ENABLE/DISABLE IN KEYBOARD BYTE 755 e234 c9 5a CMP #"Z" ;ENABLE CLICK? 756 e236 d0 08 BNE XM7 757 e238 8a XM8 TXA ;ACC = BIT TO TURN ON 758 e239 05 a6 ORA KBDBYT 759 e23b 85 a6 XM9 STA KBDBYT 760 e23d 4c d2 e9 JMP IPUTCHR ;INTERRUPT Z-80 AND SEND THE NEW KEYBOARD BYTE 761 e240 762 e240 c9 52 XM7 CMP #"R" ;DISABLE CLICK? 763 e242 d0 08 BNE XM10 764 e244 8a XM11 TXA 765 e245 49 ff EOR #$0FF ;ACC = ALL BITS ON BUT THE ONE TO TURN OFF 766 e247 25 a6 AND KBDBYT ;TURN IT OFF 767 e249 4c 3b e2 JMP XM9 768 e24c 769 e24c a2 08 XM10 LDX #$08 ;DEAL WITH AUTO-REPEAT BIT 770 e24e c9 5b CMP #"[" ;ENABLE AUTO-REPEAT? 771 e250 f0 e6 BEQ XM8 772 e252 c9 53 CMP #"S" ;DISABLE AUTO-REPEAT? 773 e254 f0 ee BEQ XM11 774 e256 775 e256 a2 00 LDX #0 ;DEAL WITH THE MAPPING OPTIONS 776 e258 c9 55 CMP #"U" ;US/UK? 777 e25a f0 0f BEQ XM12 778 e25c e8 INX 779 e25d c9 5d CMP #"]" ;AZERTY? 780 e25f f0 0a BEQ XM12 781 e261 e8 INX 782 e262 c9 56 CMP #"V" ;NOR/DAN/SWE/FINN? 783 e264 f0 05 BEQ XM12 784 e266 e8 INX 785 e267 c9 5e CMP #"^" ;PORT/SPANISH? 786 e269 d0 09 BNE XM13 787 e26b a5 a6 XM12 LDA KBDBYT 788 e26d 29 fc AND #$0FC ;STRIP OFF CURRENT MAPPING BITS 789 e26f 85 a6 STA KBDBYT 790 e271 4c 38 e2 JMP XM8 791 e274 792 e274 c9 54 XM13 CMP #"T" ;TRANSPARENT MODE? 793 e276 d0 45 BNE CHECKV ;NO, VERSION NUMBER REQUEST ? 794 e278 795 e278 ;TRANSPARENT MODE. DISPLAY ALL RECEIVED CHARACTERS. 796 e278 20 c8 e0 JSR XFF ;CLEAR THE SCREEN. TURN OFF ALL THE ATTRIBUTES. 797 e27b 20 9e e0 JSR XSI ;ENTER NORMAL MODE 798 e27e 20 88 e9 TRNS1 JSR GETCHR ;GET THE NEXT CHARACTER 799 e281 48 TRNS2 PHA ;SAVE IT 800 e282 a2 00 LDX #0 ;X = THE REVERSE AND BRIGHT ATTRIBUTES, IF ANY 801 e284 ; (WRITE CHARACTERS WITH BIT 7 ON AS REVERSED, AND 802 e284 ; CONTROL CHARACTERS AS BRIGHT.) 803 e284 a8 TAY ;DOES THE CHARACTER HAVE BIT 7 ON? 804 e285 10 04 BPL TRNS3 ;NO, CONTINUE 805 e287 a2 08 LDX #$08 ;SET-UP TO WRITE CHARACTER REVERSED 806 e289 29 7f AND #$7F ;STRIP THE CHARACTER'S BIT 7 807 e28b 2c 8a ff TRNS3 BIT CTRLTST ;IS THE CHARACTER A CONTROL CHARACTER? 808 e28e d0 04 BNE TRNS4 ;NO, CONTINUE 809 e290 e8 INX ;SET-UP TO WRITE THE CHARACTER BRIGHT 810 e291 18 CLC 811 e292 69 40 ADC #$40 ;FORCE THE CONTROL CHARACTER TO ITS UPPER CASE EQUIV. 812 e294 a8 TRNS4 TAY ;Y = THE CHARACTER 813 e295 8a TXA ;ACC = THE ATTRIBUTE TO USE FOR WRITING 814 e296 78 SEI ;DISABLE INTERRUPTS 815 e297 05 54 ORA ATTRIB 816 e299 85 54 STA ATTRIB ;SET THE ATTRIBUTES FOR THIS WRITE 817 e29b 8d 00 a0 STA ATT ;SET HARDWARE ATTRIBUTES TOO 818 e29e 58 CLI ;RE-ENABLE INTERRUPTS 819 e29f 98 TYA ;ACC = THE CHARACTER AGAIN 820 e2a0 20 c4 e7 JSR DISP ;WRITE THE CHARACTER 821 e2a3 78 SEI ;DISABLE INTERRUPTS 822 e2a4 a5 54 LDA ATTRIB 823 e2a6 29 f6 AND #$0F6 ;STRIP BOTH THE BRIGHT AND REVERSE ATTRIBUTES, IF SET 824 e2a8 85 54 STA ATTRIB 825 e2aa 8d 00 a0 STA ATT 826 e2ad 58 CLI ;RE-ENABLE INTERRUPTS 827 e2ae 68 PLA ;ACC = THE ORIGINAL CHARACTER 828 e2af c9 1b CMP #ESC ;IS IT THE ESCAPE CHARACTER? 829 e2b1 d0 cb BNE TRNS1 ;NO, CONTINUE 830 e2b3 20 88 e9 JSR GETCHR ;WAIT FOR THE NEXT CHARACTER 831 e2b6 c9 63 CMP #"c" ;IS THE FIRST ESCAPE FOLLOWED BY A LOWER CASE C? 832 e2b8 d0 c7 BNE TRNS2 ;NO, WRITE THIS FOLLOWING CHARACTER 833 e2ba 4c 3b ef JMP START ;YES, DO THE RESET 834 e2bd 835 e2bd ;VERSION NUMBER REQUEST 836 e2bd CHECKV 837 e2bd c9 76 CMP #"v" ;VERSION NUMBER REQUEST ? 838 e2bf d0 0b BNE SETCLR ;SET/CLEAR TERMINAL MODE CHECK 839 e2c1 a9 31 LDA # < VERSION ;GET MAJOR REV NUMBER 840 e2c3 20 b1 e9 JSR PUTCHR ;SEND 1-ST BYTE TO Z-80 uP 841 e2c6 a9 31 LDA # > VERSION ;GET MINOR REV NUMBER 842 e2c8 20 b1 e9 JSR PUTCHR ;SEND 2-ND BYTE TO Z-80 uP 843 e2cb 60 RTS ;RETURN FROM SUBROUTINE 844 e2cc 845 e2cc ;SET/CLEAR TERMINAL MODES. 846 e2cc c9 48 SETCLR CMP #$48 ;40H-47H IS FOR CLEAR, 48H-4FH IS FOR SET 847 e2ce ;CARRY CLEAR IF FOR CLEAR 848 e2ce 29 07 AND #$07 ;ISOLATE THE BIT NUMBER TO SET/CLEAR 849 e2d0 a8 TAY ;Y = THE BIT NUMBER 850 e2d1 b9 8b ff LDA BITPAT,Y ;ACC = THE BIT MASK FOR THE BIT NUMBER 851 e2d4 90 05 BCC CLRBT ;IF CARRY CLEAR, CLEAR THE BIT 852 e2d6 05 51 ORA CONDS ;SET THE BIT 853 e2d8 85 51 MSC1 STA CONDS ;UPDATE IT 854 e2da 60 RTS 855 e2db 856 e2db 49 ff CLRBT EOR #$0FF ;INVERT THE BIT MASK 857 e2dd 25 51 AND CONDS ;CLEAR THE BIT 858 e2df 4c d8 e2 JMP MSC1 ;CONTINUE 859 e2e2 860 e2e2 XPOKE 861 e2e2 20 88 e9 JSR GETCHR ;GET NEXT CHARACTER 862 e2e5 c9 3a CMP #":" ;DOWN LOAD HEX FILE ? 863 e2e7 f0 37 BEQ GOHEX ;YES, SO GO DO IT 864 e2e9 c9 3e CMP #">" ;ONE OF THE SOFT CHARACTER COMMANDS ? 865 e2eb d0 12 BNE FIXPOKE ;NO, SO FIX UP POKE COMMAND 866 e2ed a4 20 LDY LNOK ;PER KEITH DAVISON 867 e2ef d0 03 BNE SKIPFIX ;PER KEITH DAVISON 868 e2f1 20 77 eb JSR DOLN1 ;PER KEITH DAVISON 869 e2f4 SKIPFIX 870 e2f4 20 88 e9 JSR GETCHR ;GET NEXT CHARACTER 871 e2f7 c9 31 CMP #"1" ;LOAD ONE SOFT CHARACTER ? 872 e2f9 f0 28 BEQ GOSOFT ;YES, SO GO DO IT 873 e2fb c9 48 CMP #"H" ;LOAD MULTIPLE SOFT CHARACTERS ? 874 e2fd f0 27 BEQ GOSOFTH ;YES, SO GO DO IT 875 e2ff FIXPOKE 876 e2ff a2 74 LDX #CSIPRX ;X = PTR TO LAST PARAMETER 877 e301 48 PHA ;SAVE LAST CHARACTER ON STACK 878 e302 a9 00 LDA #0 ;ACC = 0 879 e304 FIXPOKE1 880 e304 ca DEX ;DECREMENT COUNT 881 e305 95 00 STA 0,X ;CLEAR THE PARAMETER 882 e307 e0 60 CPX #CSIPR0 ;AER WE DONE ? 883 e309 d0 f9 BNE FIXPOKE1 ;NO, SO DO SOME MORE 884 e30b 86 5f STX CSIPTR ;INITIALIZE PARA POINTER TO FIRST PARAMETER 885 e30d 68 PLA ;RESTORE SAVED CHARACTER 886 e30e 20 f6 e9 JSR PARLUP1 ;ENTER 'GETPARS' ROUTINE (GET CSI TYPE PARAMS) 887 e311 888 e311 a2 00 LDX #0 ;X = 00 889 e313 c9 46 CMP #"F" ;FONT POKE? 890 e315 f0 12 BEQ POKFNT 891 e317 c9 4d CMP #"M" ;MEMORY POKE? 892 e319 d0 04 BNE RTS4 ;NO, IGNORE 893 e31b 894 e31b POKMEM ;PARAMETER 0 IS ADDRESS, PARAMETER 1 IS DATA. 895 e31b a5 62 LDA CSIPR1 ;ACC = DATA 896 e31d 81 60 STA (CSIPR0,X) ;WRITE DATA TO MEMORY 897 e31f 60 RTS4 RTS 898 e320 899 e320 4c c5 fa GOHEX JMP HEX ;DOWN LOAD INTEL HEX FILE 900 e323 4c 64 fa GOSOFT JMP WRITE1 ;LOAD ONE SOFT CHARACTER 901 e326 4c 6a fa GOSOFTH JMP WRITEH ;LOAD MULTIPLE SOFT CHARACTERS 902 e329 903 e329 POKFNT ;PARAMETER 0 IS CHARACTER, PARAMETER 1 IS LINE, PARAMETER 2 IS DATA. 904 e329 a5 61 LDA CSIPR0+1 ;IF CHAR > 255, THEN IT'S A CURSOR FONT 905 e32b d0 0b BNE POKCUR 906 e32d a4 62 LDY CSIPR1 ;Y = RASTER LINE 907 e32f c8 INY 908 e330 c8 INY ;Y = ;PAGE IN MEMORY FOR TABLE OF THOSE RASTER LINES 909 e331 84 61 STY CSIPR0+1 ;CSIPR0 = PTR TO PROPER BYTE IN CHARACTER GENERATOR 910 e333 a5 64 POKF1 LDA CSIPR2 ;ACC = DATA 911 e335 81 60 STA (CSIPR0,X) ;WRITE DATA TO FONT 912 e337 60 RTS 913 e338 914 e338 a5 62 POKCUR LDA CSIPR1 ;ACC = RASTER LINE 915 e33a 18 CLC 916 e33b 69 39 ADC #CURMSK ;ACC = OFFSET IN CURSOR MASK FOR DATA (CLEARS CARRY) 917 e33d 85 60 STA CSIPR0 918 e33f 86 61 STX CSIPR0+1 ;CSIPR0 = PTR TO PROPER BYTE IN CURSOR MASK 919 e341 4c 33 e3 JMP POKF1 ;WRITE THE DATA 920 e344 921 e344 ;PAGE 922 e344 20 73 eb XPEEK JSR DOLN ;SET UP LN0 - LN11 POINTERS IN CASE THEY ARE PEEKED 923 e347 20 e6 e9 JSR GETPARS ;GET CSI TYPE PARAMETERS 924 e34a a2 00 LDX #0 ;X = 00 925 e34c c9 4d CMP #"M" ;MEMORY PEEK? 926 e34e f0 0e BEQ PEKMEM 927 e350 c9 46 CMP #"F" ;FONT PEEK? 928 e352 d0 cb BNE RTS4 ;NO, IGNORE 929 e354 930 e354 PEKFNT ;PARAMETER 0 IS CHARACTER, PARAMETER 1 IS LINE. 931 e354 a5 61 LDA CSIPR0+1 ;IF CHAR > 255, THEN IT'S A CURSOR FONT 932 e356 d0 0b BNE PEKCUR 933 e358 a4 62 LDY CSIPR1 ;Y = RASTER LINE 934 e35a c8 INY 935 e35b c8 INY ;Y = ;PAGE IN MEMORY FOR TABLE OF THOSE RASTER LINES 936 e35c 84 61 STY CSIPR0+1 ;CSIPR0 = PTR TO PROPER BYTE IN CHARACTER GENERATOR 937 e35e 938 e35e PEKMEM ;PARAMETER 0 IS ADDRESS. 939 e35e a1 60 LDA (CSIPR0,X) ;ACC = DATA 940 e360 4c b1 e9 JMP PUTCHR ;SEND IT 941 e363 942 e363 a5 62 PEKCUR LDA CSIPR1 ;ACC = RASTER LINE 943 e365 18 CLC 944 e366 69 39 ADC #CURMSK ;ACC = OFFSET IN CURSOR MASK FOR DATA (CLEARS CARRY) 945 e368 85 60 STA CSIPR0 946 e36a 86 61 STX CSIPR0+1 ;CSIPR0 = PTR TO PROPER BYTE IN CURSOR MASK 947 e36c 4c 5e e3 JMP PEKMEM ;READ AND SEND THE DATA (ALWAYS BRANCHES) 948 e36f 949 e36f ;PAGE 950 e36f 4c 86 e4 GOXSGR JMP XSGR 951 e372 4c ab e0 GOXUP JMP XUP 952 e375 4c a3 e0 GOXBS JMP XBS 953 e378 4c 79 e4 GOXDOWN JMP XDOWN 954 e37b 4c 6f e4 GOXRIGHT JMP XRIGHT 955 e37e 956 e37e ;CSI RECEIVED, WAIT FOR UP TO 4 DECIMALLY SPECIFIED PARAMETERS, 957 e37e ; TERMINATED BY A COMMAND CHARACTER. 958 e37e 20 e6 e9 XCSI JSR GETPARS ;GET THE CSI PARAMETERS, RETURN WITH TERM CHAR IN Y 959 e381 960 e381 ;ALL PARAMETERS RECEIVED. NOW, BASED ON THE TERMINATING CHARACTER, 961 e381 ; DO THE APPROPRIATE COMMAND, POSSIBLY USING THE PARAMETERS. 962 e381 c9 41 CMP #"A" ;CURSOR UP? 963 e383 f0 ed BEQ GOXUP 964 e385 c9 42 CMP #"B" ;CURSOR DOWN? 965 e387 f0 ef BEQ GOXDOWN 966 e389 c9 43 CMP #"C" ;CURSOR RIGHT? 967 e38b f0 ee BEQ GOXRIGHT 968 e38d c9 44 CMP #"D" ;CURSOR LEFT? (BACKSPACE) 969 e38f f0 e4 BEQ GOXBS 970 e391 c9 4b CMP #"K" ;ERASE IN LINE COMMAND? 971 e393 f0 1b BEQ XEL 972 e395 c9 4a CMP #"J" ;ERASE IN DISPLAY COMMAND? 973 e397 f0 1a BEQ XED 974 e399 c9 6d CMP #"m" ;SELECT GRAPHIC RENDITION COMMAND? 975 e39b f0 d2 BEQ GOXSGR 976 e39d c9 48 CMP #"H" ;CURSOR POSITION COMMAND? 977 e39f f0 40 BEQ XHVP 978 e3a1 c9 66 CMP #"f" ;HORIZONTAL & VERTICAL POSITION COMMAND? 979 e3a3 f0 3c BEQ XHVP 980 e3a5 c9 4c CMP #"L" ;INSERT LINE COMMAND? 981 e3a7 f0 64 BEQ XIL 982 e3a9 c9 4d CMP #"M" ;DELETE LINE COMMAND? 983 e3ab f0 6c BEQ XDL 984 e3ad 4c 2c e0 JMP DOIT ;WRITE OR EXECUTE ALL OTHERS 985 e3b0 986 e3b0 ;PAGE 987 e3b0 XEL ;ERASE IN LINE, FROM CURSOR TO END OF LINE. 988 e3b0 4c ab ea JMP EREOL ;ERASE TO END OF LINE 989 e3b3 990 e3b3 XED ;ERASE IN DISPLAY, FROM CURSOR TO END OF DISPLAY IF 'ESC [ J' OR 991 e3b3 ; WHOLE DISPLAY IF 'ESC [ 2 J' 992 e3b3 993 e3b3 a5 52 LDA HCUR 994 e3b5 48 PHA ;SAVE CURRENT HORIZONTAL CURSOR, 995 e3b6 a5 53 LDA VCUR 996 e3b8 48 PHA ;SAVE CURRENT VERTICAL CURSOR 997 e3b9 b4 00 LDY 0,X ;GET NEXT TO LAST PARAMETER SENT 998 e3bb c0 02 CPY #$02 ;IS IT A 2 ? 999 e3bd d0 06 BNE XPART ;YES, ERASE WHOLE SCREEN 1000 e3bf a9 00 LDA #00 ;LOAD ACC WITH A ZERO FOR HOME POSITION 1001 e3c1 85 52 STA HCUR ;SET HORIZONTAL CURSOR POSITION 1002 e3c3 85 53 STA VCUR ;SET VERTICAL CURSOR POSITION 1003 e3c5 XPART 1004 e3c5 20 cf e3 JSR XED1 ;ERASE LINES 1005 e3c8 68 PLA 1006 e3c9 85 53 STA VCUR ;RESTORE VERTICAL AND 1007 e3cb 68 PLA 1008 e3cc 85 52 STA HCUR ; HORIZONTAL CURSOR 1009 e3ce 60 RTS ;FORCE RE-COMPUTATION (FROM ABOVE) AND DONE 1010 e3cf 1011 e3cf 20 ab ea XED1 JSR EREOL ;ERASE THE LINE 1012 e3d2 a9 00 LDA #0 1013 e3d4 85 52 STA HCUR ;MOVE TO THE BEGINNING OF 1014 e3d6 e6 53 INC VCUR ; THE NEXT LINE 1015 e3d8 85 20 STA LNOK ;FORCE RE-COMPUTATION OF LN0 - LN11 1016 e3da a5 53 LDA VCUR 1017 e3dc c9 19 CMP #25 ;STILL LESS THAN THE (IMAGINARY) 25-TH. LINE? 1018 e3de 90 ef BCC XED1 ;YES, CONTINUE 1019 e3e0 60 RTS ;RETURN FROM SUBROUTINE 1020 e3e1 1021 e3e1 ;PAGE 1022 e3e1 XHVP 1023 e3e1 XCUP ;PREFERRED CURSOR POSITION COMMAND. 1024 e3e1 ;THE DESIRED COORDINATES ARE IN THE CSI PARAMETERS. 1025 e3e1 ;DEAL WITH THE X COORDINATE FIRST. 1026 e3e1 a2 00 LDX #0 ;DEFAULT IT TO 00 1027 e3e3 a5 63 LDA CSIPR1+1 1028 e3e5 d0 06 BNE CRX1 ;IF HOR POS'N > 255, DEFAULT TO POS'N 00 1029 e3e7 a5 62 LDA CSIPR1 1030 e3e9 f0 02 BEQ CRX1 ;IF HOR POS'N NOT SPECIFIED, DEFAULT IT TO 00 1031 e3eb aa TAX 1032 e3ec ca DEX ;DECREMENT HOR POS'N SINCE SPEC SAYS COORDS START AT 1 1033 e3ed CRX1 1034 e3ed 1035 e3ed ;NOW DEAL SIMILARLY WITH THE Y COORDINATE. 1036 e3ed a0 00 LDY #0 ;DEFAULT IT TO 00 1037 e3ef a5 61 LDA CSIPR0+1 1038 e3f1 d0 06 BNE CRX2 ;IF LINE > 255, DEFAULT TO LINE 00 1039 e3f3 a5 60 LDA CSIPR0 1040 e3f5 f0 02 BEQ CRX2 ;IF LINE NOT SPECIFIED, DEFAULT IT TO 00 1041 e3f7 a8 TAY 1042 e3f8 88 DEY ;DECREMENT LINE SINCE SPEC SAYS COORDS START AT 1 1043 e3f9 CRX2 1044 e3f9 1045 e3f9 TSTCUR ;PERFORM TESTS TO SEE IF REGISTERS X AND Y ARE LEGAL CURSOR VALUES IN 1046 e3f9 ; THE RANGE 0 <= X <= 79, AND 0 <= Y <= 24. 1047 e3f9 ;IF SO, MOVES CURSOR TO THE SPECIFIED COORDINATES. 1048 e3f9 e0 50 CPX #80 ;HORIZONTAL BEYOND END OF LINE? 1049 e3fb 90 02 BCC TSTC1 ;NO, CONTINUE 1050 e3fd a2 4f LDX #79 ;YES, DEFAULT IT TO THE END OF THE LINE 1051 e3ff c0 19 TSTC1 CPY #25 ;VERTICAL BEYOND END OF SCREEN? 1052 e401 90 02 BCC TSTC2 ;NO, CONTINUE 1053 e403 a0 18 LDY #24 ;YES, DEFAULT IT TO THE END OF THE SCREEN 1054 e405 86 52 TSTC2 STX HCUR 1055 e407 84 53 STY VCUR ;SET UP THE CURSOR VARIABLES 1056 e409 4c b9 e0 JMP LNSNG ;FORCE RE-COMPUTATION AND DONE 1057 e40c 1058 e40c ;PAGE 1059 e40c 60 RTS8 RTS 1060 e40d 1061 e40d XIL ;INSERT LINE. 1062 e40d ;MOVE LINE N-1 TO LINE N; DO THIS STARTING AT 24 AND DECREMENTING. 1063 e40d a6 a5 LDX LOGBOT ;START ACTION ON LAST LINE 1064 e40f e4 53 CPX VCUR ;COMPARE WITH CURRENT LINE 1065 e411 90 f9 BCC RTS8 ;CURSOR BELOW BOTTOM, DONE 1066 e413 a4 53 LDY VCUR ;STOP ON CURSOR'S LINE 1067 e415 a9 ff LDA #-1 ;DECREMENT 1068 e417 d0 0a BNE XDL3 ;CONTINUE (ALWAYS BRANCHES) 1069 e419 1070 e419 1071 e419 XDL ;DELETE LINE. 1072 e419 ;MOVE LINE N+1 TO LINE N; DO THIS STARTING AT CURSOR AND INCREMENTING. 1073 e419 a6 53 LDX VCUR ;START ACTION ON CURSOR'S LINE 1074 e41b a4 a5 LDY LOGBOT ;STOP ON LAST LINE 1075 e41d c4 53 CPY VCUR ;COMPARE WITH CURRENT LINE 1076 e41f 90 eb BCC RTS8 ;CURSOR BELOW BOTTOM, DONE 1077 e421 a9 01 LDA #1 ;INCREMENT 1078 e423 85 0c XDL3 STA 12 ;SAVE +1 OR -1 FOR INCREMENTING OR DECREMENTING 1079 e425 84 0d STY 13 ;SAVE STOPPING LINE 1080 e427 a5 53 LDA VCUR 1081 e429 48 PHA ;SAVE THE CURSOR'S STARTING LINE 1082 e42a 86 53 STX VCUR ;MOVE THE CURSOR TO THE ACTION STARTING LINE 1083 e42c a9 00 LDA #0 1084 e42e 85 52 STA HCUR ;MOVE CURSOR TO THE BEGINNING OF THIS LINE 1085 e430 85 20 STA LNOK ;FORCE RE-COMPUTATION OF LN0 - LN11 1086 e432 a5 53 XDL0 LDA VCUR ;ACC = CURSOR'S LINE 1087 e434 c5 0d CMP 13 ;HAVE WE REACHED THE STOPPING LINE? 1088 e436 f0 2e BEQ XDL9 ;YES, NOW CLEAR LAST LINE AND RETURN TO CURSOR'S LINE 1089 e438 20 73 eb JSR DOLN ;SET UP LN0 - LN11 FOR LINE N 1090 e43b a2 05 LDX #5 1091 e43d b5 21 XDL1 LDA LN0,X ;COPY LN0 - LN2 1092 e43f 95 06 STA 6,X ; TO THE DESTINATION POINTERS 1093 e441 ca DEX ;COPIED ALL 6 BYTES YET? 1094 e442 10 f9 BPL XDL1 ;NO, CONTINUE 1095 e444 a5 53 LDA VCUR 1096 e446 18 CLC 1097 e447 65 0c ADC 12 ;INCREMENT OR DECREMENT TO THE NEXT LINE 1098 e449 85 53 STA VCUR 1099 e44b 20 77 eb JSR DOLN1 ;COMPUTE NEW LN0 - LN11 1100 e44e a2 05 LDX #5 1101 e450 b5 21 XDL2 LDA LN0,X ;COPY LN0 - LN2 1102 e452 95 00 STA 0,X ; TO THE SOURCE POINTERS 1103 e454 ca DEX ;COPIED ALL 6 BYTES YET? 1104 e455 10 f9 BPL XDL2 ;NO, CONTINUE 1105 e457 20 29 eb JSR MOVSUB ;MOVE SUB-CELL LINE POINTED TO BY 0,1 (TOP), 1106 e45a ; 2,3 (MIDDLE), AND 4,5 (BOTTOM) TO SUB-CELL LINE 1107 e45a ; POINTED TO BY 6,7 (TOP), 8,9 (MIDDLE), AND 1108 e45a ; 10,11 (BOTTOM) 1109 e45a 20 29 eb JSR MOVSUB ;MOVE FOUR TIMES (ADDRESS OF SECOND SUB-CELL LINE IS 1110 e45d 20 29 eb JSR MOVSUB ; 80 AFTER THE FIRST, AND SO ON, SO IT IS UNNECESSARY 1111 e460 20 29 eb JSR MOVSUB ; TO UPDATE THE ADDRESSES) 1112 e463 4c 32 e4 JMP XDL0 ;REPEAT UNTIL LAST LINE HAS BEEN MOVED UP 1113 e466 1114 e466 20 ab ea XDL9 JSR EREOL ;ERASE THE ENTIRE LAST LINE (ALSO SETS ATT TO ATTRIB) 1115 e469 68 PLA 1116 e46a 85 53 STA VCUR 1117 e46c 4c b9 e0 JMP LNSNG ;FORCE RE-COMPUTATION AND DONE 1118 e46f 1119 e46f ;PAGE 1120 e46f e6 52 XRIGHT INC HCUR ;GO TO THE RIGHT 1121 e471 a5 52 LDA HCUR 1122 e473 49 50 EOR #80 ;BEYOND THE LAST (79TH.) CHARACTER? 1123 e475 d0 0c BNE XRGHT1 ;NO, DONE 1124 e477 85 52 STA HCUR ;YES, GO TO POS'N 00 1125 e479 e6 53 XDOWN INC VCUR ;GO DOWN 1126 e47b a5 53 LDA VCUR 1127 e47d 49 19 EOR #25 ;BEYOND THE BOTTOM LINE? 1128 e47f d0 02 BNE XRGHT1 ;NO, DONE 1129 e481 85 53 STA VCUR ;YES, GO TO LINE 00 1130 e483 4c b9 e0 XRGHT1 JMP LNSNG 1131 e486 1132 e486 ;PAGE 1133 e486 XSGR ;ATTRIBUTE SETTING COMMAND RECEIVED, EXECUTE IT. 1134 e486 a2 5e LDX #CSIPR0-2 ;X = PTR TO THE FIRST PARAMETER - 2 1135 e488 1136 e488 ;SCAN ALL PARAMETERS, WHICH ARE REALLY SELECTORS, TURNING ON THE 1137 e488 ;ATTRIBUTES AS SELECTED. 1138 e488 e8 ATRX0 INX 1139 e489 e8 INX ;GO TO THE NEXT PARAMETER 1140 e48a b4 01 LDY 1,X ;MOST SIG BYTE OF PARAMETER NON-ZERO? 1141 e48c d0 25 BNE ATRX1 ;YES, IGNORE IT 1142 e48e b4 00 LDY 0,X ;Y = THE SELECTOR 1143 e490 ;SELECTOR = 0? 1144 e490 f0 2a BEQ ATOFF ;YES, TURN OFF ALL ATTRIBUTES 1145 e492 a9 01 LDA #$01 ;HARDWARE CODE FOR BRIGHT 1146 e494 c0 01 CPY #1 ;SELECTOR = 1? 1147 e496 f0 12 BEQ ATON ;YES, TURN ON BRIGHT 1148 e498 a9 02 LDA #$02 ;SOFTWARE CODE FOR UNDERLINE 1149 e49a c0 04 CPY #4 ;SELECTOR = 4? 1150 e49c f0 2c BEQ CONDON ;YES, TURN ON UNDERLINE 1151 e49e a9 02 LDA #$02 ;HARDWARE CODE FOR BLINK 1152 e4a0 c0 05 CPY #5 ;SELECTOR = 5? 1153 e4a2 f0 06 BEQ ATON ;YES, TURN ON BLINK 1154 e4a4 a9 08 LDA #$08 ;SOFTWARE CODE FOR REVERSE 1155 e4a6 c0 07 CPY #7 ;SELECTOR = 7? 1156 e4a8 d0 09 BNE ATRX1 ;NO, IGNORE SELECTOR 1157 e4aa ATON 1158 e4aa 78 SEI ;DISABLE INTERRUPTS 1159 e4ab 05 54 ORA ATTRIB ;"OR" IN THE NEW ATTRIBUTE BITS 1160 e4ad 85 54 ATON1 STA ATTRIB ;TELL THE SOFTWARE 1161 e4af 8d 00 a0 STA ATT ;TELL THE HARDWARE 1162 e4b2 58 CLI ;RE-ENABLE INTERRUPTS 1163 e4b3 e4 5f ATRX1 CPX CSIPTR ;JUST FINISHED DOING THE LAST ATTRIBUTE? 1164 e4b5 f0 04 BEQ RTS2 ;YES, STOP 1165 e4b7 e0 72 CPX #CSIPRX - 2 ;JUST FINISHED DOING THE LAST IMPLEMENTED ATTR? 1166 e4b9 d0 cd BNE ATRX0 ;NO, CONTINUE 1167 e4bb 60 RTS2 RTS ;YES, FINISHED 1168 e4bc 1169 e4bc ATOFF 1170 e4bc a5 51 LDA CONDS ;GET CONDITION BYTE 1171 e4be 29 fd AND #$0FD ;TURN OFF UNDERLINE BIT 1172 e4c0 85 51 STA CONDS ;RESTORE CONDITION BYTE 1173 e4c2 78 SEI ;DISABLE INTERRUPTS 1174 e4c3 a5 54 LDA ATTRIB 1175 e4c5 29 70 AND #$70 1176 e4c7 4c ad e4 JMP ATON1 ;TURN OFF ALL ATTRIBUTES 1177 e4ca 1178 e4ca CONDON 1179 e4ca 05 51 ORA CONDS ;COMBINE UNDERLINE BIT WITH CONDITION BYTE 1180 e4cc 85 51 STA CONDS ;RESTORE CONDITION BYTE 1181 e4ce d0 e3 BNE ATRX1 ;CONTINUE (ALWAYS BRANCHES) 1182 e4d0 1183 e4d0 ;PAGE 1184 e4d0 ;GRAPHICS ROUTINES. 1185 e4d0 1186 e4d0 4c b7 e5 GOXLINE JMP XLINE 1187 e4d3 4c 8b e6 GOXARC JMP XARC 1188 e4d6 1189 e4d6 XGRPH ;GRAPHICS. 1190 e4d6 20 e6 e9 JSR GETPARS ;RECEIVE THE PARAMETERS, RETURN WITH Y = TERM CHAR 1191 e4d9 c9 4c CMP #"L" ;LINE? 1192 e4db f0 f3 BEQ GOXLINE 1193 e4dd c9 4d CMP #"M" ;MARKER? 1194 e4df f0 64 BEQ XMARK 1195 e4e1 c9 54 CMP #"T" ;TYPE? 1196 e4e3 f0 50 BEQ XTYPE 1197 e4e5 c9 43 CMP #"C" ;CURSOR? 1198 e4e7 f0 59 BEQ XGCUR 1199 e4e9 c9 4f CMP #"O" ;ARC? 1200 e4eb f0 e6 BEQ GOXARC 1201 e4ed c9 57 CMP #"W" ;WRITE (POKE) 1202 e4ef f0 13 BEQ XGPOKE 1203 e4f1 c9 52 CMP #"R" ;READ (PEEK) 1204 e4f3 f0 31 BEQ XGPEEK 1205 e4f5 4c 2c e0 JMP DOIT 1206 e4f8 ;WRITE ATTRIBUTE RAM FROM NEW ATTRIBUTES IN ATT LATCH 1207 e4f8 ; 1208 e4f8 1209 e4f8 GRFATT 1210 e4f8 78 SEI ;DISABLE INTERRUPTS 1211 e4f9 a5 54 LDA ATTRIB ;GET ATTRIBUTES 1212 e4fb 09 04 ORA #$04 ;SET BIT 2 TO ONE 1213 e4fd 85 54 STA ATTRIB ;TELL SOFTWARE 1214 e4ff 8d 00 a0 STA ATT ;TELL HARDWARE 1215 e502 58 CLI ;RE-ENABLE INTERRUPTS 1216 e503 60 RTS ;RETURN FROM SUBROUTINE 1217 e504 1218 e504 XGPOKE ;PAR0 IS X, PAR1 IS Y, PAR2 IS DATA BYTE, PAR3 IS ATTRIBUTES. 1219 e504 20 f9 eb JSR NEWGCUR ;PUT PARAMS TO (X,Y) 1220 e507 a5 66 LDA CSIPR3 1221 e509 29 07 AND #$07 ; 1222 e50b 85 66 STA CSIPR3 ;STRIP ALL BUT ATTRIBUTE BITS AND DISABLE WRITE 1223 e50d 78 SEI ;DISABLE INTERRUPTS 1224 e50e a5 54 LDA ATTRIB 1225 e510 29 70 AND #$70 ;GET ONLY SCREEN BRIGHTNESS BITS 1226 e512 05 66 ORA CSIPR3 ;COMBINE WITH ATTRIBUTE BITS 1227 e514 8d 00 a0 STA ATT ;WRITE TO HARDWARE 1228 e517 a0 00 LDY #0 1229 e519 b1 7e LDA (XYADDR),Y ;READ THE OLD SCREEN BYTE (AND MORE PARTICULARLY, THE 1230 e51b ; CURRENT ATTRIBUTE BITS) IN CASE THE "STREAMING" 1231 e51b ; ATTRIBUTE BIT WAS ON 1232 e51b a5 64 LDA CSIPR2 ;ACC = THE DATA BYTE 1233 e51d 91 7e STA (XYADDR),Y ;STORE IT ON THE SCREEN WITH SPECIFIED ATTRIBUTE 1234 e51f a5 54 LDA ATTRIB 1235 e521 8d 00 a0 STA ATT ;RESTORE OLD ATTRIBUTES 1236 e524 58 CLI ;RE-ENABLE INTERRUPTS 1237 e525 60 RTS 1238 e526 1239 e526 XGPEEK ;PAR0 IS X, PAR1 IS Y. 1240 e526 20 f9 eb JSR NEWGCUR ;PUT PARAMS TO (X,Y) 1241 e529 a0 00 LDY #0 1242 e52b b1 7e LDA (XYADDR),Y ;ACC = THE DATA BYTE FROM THE SCREEN 1243 e52d 20 b1 e9 JSR PUTCHR ;SEND THE DATA BYTE 1244 e530 a5 80 LDA XYMASK 1245 e532 4c b1 e9 JMP PUTCHR ;SEND THE MASK FOR THE BIT ALSO 1246 e535 1247 e535 XTYPE ;SET UP THE DRAWING MODE AND THE LINE TYPE. 1248 e535 ;PAR0 = DRAWING MODE, PAR1 = LINE TYPE IF NON-ZERO. 1249 e535 a5 60 LDA CSIPR0 1250 e537 85 7c STA XYOPR ;SET UP OPERATION 1251 e539 a5 62 LDA CSIPR1 1252 e53b f0 04 BEQ RTS3 ;IF ZERO, LEAVE OLD LINE TYPE 1253 e53d 85 7a STA XYDOTS ;SET UP LINE TYPE 1254 e53f 85 7b STA TMPXYDOT ;BOTH OF THEM 1255 e541 60 RTS3 RTS 1256 e542 1257 e542 XGCUR ;MOVE THE (X,Y) CURSOR WITHOUT DRAWING AND RESET THE TMPXYDOTS. 1258 e542 ;PAR0 = X, PAR1 = Y. 1259 e542 4c f9 eb JMP NEWGCUR ;PUT PARAMS TO (X,Y) 1260 e545 1261 e545 XMARK ;DRAW A MARK (POINT). 1262 e545 ;PAR0 = X, PAR1 = Y, PAR2 = FLAG: 0=DRAW A POINT, ELSE DRAW ASCII CHAR. 1263 e545 ; 1264 e545 20 f8 e4 JSR GRFATT ;TAKE CARE OF GRAPHIC ATTRIBUTES 1265 e548 ; 1266 e548 20 f9 eb JSR NEWGCUR ;PUT PARAMS TO (X,Y) 1267 e54b a5 64 LDA CSIPR2 ;ARE WE TO DRAW A POINT? 1268 e54d d0 03 BNE XMRK1 ;NO, DRAW THE ASCII CHARACTER IN ACC 1269 e54f 4c e6 ec JMP PNT ;YES, DRAW THE POINT 1270 e552 85 00 XMRK1 STA 0 ;SAVE THE CHAR IN 0 1271 e554 1272 e554 ;WRITE A GIVEN CHARACTER TO THE DISPLAY AT A GIVEN GRAPHICS COORDINATE. 1273 e554 ;ENTER: LOC. 0 = CHARACTER TO WRITE 1274 e554 ; LOC. X & Y = COORDINATE ABOUT WHICH CHARACTER WILL BE CENTERED 1275 e554 1276 e554 a0 76 LDY #X 1277 e556 a2 04 LDX #4 1278 e558 20 24 ed JSR MOV2W ;TEMP SAVE (X,Y) IN 4,5 AND 6,7 1279 e55b 1280 e55b ;POSITION THE X,Y GRAPHICS COORDINATES TO THE UPPER LEFT CORNER OF THE 1281 e55b ; CHARACTER CELL PRIOR TO "SCANNING" THE CHARACTER TO THE DISPLAY. 1282 e55b a2 fd LDX #-3 1283 e55d 86 85 STX XSTEP ;MOVE LEFT 1284 e55f 20 66 ec WRTG1 JSR DOXSTEP 1285 e562 e8 INX 1286 e563 d0 fa BNE WRTG1 ;THREE TIMES 1287 e565 a2 fa LDX #-6 1288 e567 86 86 STX YSTEP ;MOVE UP 1289 e569 20 ab ec WRTG2 JSR DOYSTEP 1290 e56c e8 INX 1291 e56d d0 fa BNE WRTG2 ;SIX TIMES 1292 e56f 1293 e56f a9 01 LDA #1 1294 e571 85 85 STA XSTEP 1295 e573 85 86 STA YSTEP ;SET UP TO STEP TO THE RIGHT AND DOWN 1296 e575 a9 02 LDA #> CGLN0 1297 e577 85 01 STA 1 ;0,1 = PTR TO TOP LINE OF CHAR IN CHAR GENERATOR 1298 e579 1299 e579 ;SCAN THE 8 * 12 = 96 BITS OF THE CHARACTER. 1300 e579 a0 00 WRTG3 LDY #0 1301 e57b b1 00 LDA (0),Y ;ACC = THE CURRENT RASTER LINE OF THE CHARACTER 1302 e57d f0 1f BEQ WRTG4 ;IF ALL ZEROS, DON'T BOTHER WRITING THIS LINE 1303 e57f 85 7b STA TMPXYDOT ;ALL THE "1" BITS IN THE CHARACTER WILL BE WRITTEN 1304 e581 a9 08 LDA #8 1305 e583 85 02 STA 2 ;LOC. 2 = LOOP COUNT 1306 e585 a5 76 LDA X 1307 e587 48 PHA ;SAVE X-COORDINATE OF LEFT SIDE OF THE CHAR CELL 1308 e588 a5 77 LDA X+1 1309 e58a 48 PHA 1310 e58b 20 df ec WRTG5 JSR POINT ;PLOT THE POINT 1311 e58e 20 66 ec JSR DOXSTEP ;SCAN TO THE RIGHT 1312 e591 c6 02 DEC 2 ;MORE DOTS TO GO IN THIS BYTE? 1313 e593 d0 f6 BNE WRTG5 ;YES, CONTINUE 1314 e595 68 PLA 1315 e596 85 77 STA X+1 1316 e598 68 PLA ;ACC = X-COORDINATE OF LEFT SIDE OF THE CHAR CELL 1317 e599 85 76 STA X ;GO BACK TO THE LEFT SIDE 1318 e59b 20 8b ec JSR XYNG ;SET TO RE-CALCULATE THE XY VARIABLES 1319 e59e 20 ab ec WRTG4 JSR DOYSTEP ;ADVANCE TO THE NEXT LOWER RASTER LINE 1320 e5a1 e6 01 INC 1 ;UPDATE THE POINTER TO THE CHARACTER GENERATOR 1321 e5a3 a5 01 LDA 1 1322 e5a5 c9 0e CMP #> CGEND ;AT THE END OF THE CHARACTER GEN? 1323 e5a7 d0 d0 BNE WRTG3 ;NO, CONTINUE 1324 e5a9 a0 04 LDY #4 1325 e5ab a2 76 LDX #X 1326 e5ad 20 24 ed JSR MOV2W ;RESTORE ORIGINAL (X,Y) FROM 4,5 AND 6,7 1327 e5b0 a5 7a LDA XYDOTS 1328 e5b2 85 7b STA TMPXYDOT ;RESTORE THE DOTS TO THE GIVEN LINE TYPE 1329 e5b4 4c 8b ec JMP XYNG 1330 e5b7 1331 e5b7 1332 e5b7 XLINE ;DRAW ALL THE POINTS OF A LINE BETWEEN THE CURSOR AND (X1,Y1). 1333 e5b7 ;PAR0 = X1, PAR1 = Y1. 1334 e5b7 ; 1335 e5b7 20 f8 e4 JSR GRFATT ;TAKE CARE OF GRAPHIC ATTRIBUTES 1336 e5ba ; 1337 e5ba a0 60 LDY #CSIPR0 1338 e5bc a2 81 LDX #X1 1339 e5be 20 24 ed JSR MOV2W ;COPY PAR0 AND 1 TO (X1,Y1) 1340 e5c1 1341 e5c1 ;INITIALIZE XSTEP AND YSTEP TO POSITIVE AND NON-ZERO. 1342 e5c1 a0 01 LDY #1 1343 e5c3 84 85 STY XSTEP 1344 e5c5 84 86 STY YSTEP 1345 e5c7 88 DEY ;REG Y = 00 1346 e5c8 1347 e5c8 ;COMPUTE DELTA X AS DIFFERENCE BETWEEN X1 AND X. 1348 e5c8 38 SEC 1349 e5c9 a5 81 LDA X1 1350 e5cb e5 76 SBC X 1351 e5cd 85 87 STA XDELTA 1352 e5cf a5 82 LDA X1+1 1353 e5d1 e5 77 SBC X+1 1354 e5d3 85 88 STA XDELTA+1 ;XDELTA = X1 - X 1355 e5d5 1356 e5d5 ;IF DELTA X IS NEGATIVE, MAKE IT POSITIVE AND MAKE XSTEP NEGATIVE. 1357 e5d5 10 0d BPL L34 1358 e5d7 85 85 STA XSTEP ;XSTEP MADE NEGATIVE 1359 e5d9 38 SEC 1360 e5da 98 TYA ;ACC = 00 1361 e5db e5 87 SBC XDELTA 1362 e5dd 85 87 STA XDELTA 1363 e5df 98 TYA ;ACC = 00 1364 e5e0 e5 88 SBC XDELTA+1 1365 e5e2 85 88 STA XDELTA+1 ;DELTA X NEGATED 1366 e5e4 L34 1367 e5e4 1368 e5e4 ;IF DELTA X IS ZERO, CHANGE XSTEP TO 0. 1369 e5e4 ;ACC = XDELTA+1 FROM ABOVE 1370 e5e4 05 87 ORA XDELTA ;BOTH HALVES 00? 1371 e5e6 d0 02 BNE L36 ;NO, CONTINUE 1372 e5e8 84 85 STY XSTEP ;XSTEP MADE 0 1373 e5ea L36 1374 e5ea 1375 e5ea ;COMPUTE DELTA Y AS DIFFERENCE BETWEEN Y1 AND Y. 1376 e5ea 38 SEC 1377 e5eb a5 83 LDA Y1 1378 e5ed e5 78 SBC Y 1379 e5ef 85 89 STA YDELTA 1380 e5f1 a5 84 LDA Y1+1 1381 e5f3 e5 79 SBC Y+1 1382 e5f5 85 8a STA YDELTA+1 ;YDELTA = Y1 - Y 1383 e5f7 1384 e5f7 ;IF DELTA Y IS NEGATIVE, MAKE IT POSITIVE AND MAKE YSTEP NEGATIVE. 1385 e5f7 10 0d BPL L39 1386 e5f9 85 86 STA YSTEP ;YSTEP MADE NEGATIVE 1387 e5fb 38 SEC 1388 e5fc 98 TYA ;ACC = 00 1389 e5fd e5 89 SBC YDELTA 1390 e5ff 85 89 STA YDELTA 1391 e601 98 TYA ;ACC = 00 1392 e602 e5 8a SBC YDELTA+1 1393 e604 85 8a STA YDELTA+1 ;DELTA Y NEGATED 1394 e606 L39 1395 e606 1396 e606 ;IF DELTA Y IS 0, CHANGE YSTEP TO 0. 1397 e606 ;ACC = YDELTA+1 FROM ABOVE 1398 e606 05 89 ORA YDELTA ;BOTH HALVES 00? 1399 e608 d0 02 BNE L42 ;NO, CONTINUE 1400 e60a 84 86 STY YSTEP ;YSTEP MADE 0 1401 e60c L42 1402 e60c 1403 e60c ;EVERYTHING'S SETUP. NOW EXAMINE VALUES TO SEE IF LINE IS FLATTER 1404 e60c ; OR STEEPER THAN 45 DEGREES. 1405 e60c 38 SEC 1406 e60d a5 89 LDA YDELTA 1407 e60f e5 87 SBC XDELTA 1408 e611 a5 8a LDA YDELTA+1 1409 e613 e5 88 SBC XDELTA+1 ;YDELTA - XDELTA 1410 e615 b0 3a BCS L99 ;YDELTA GREATER THAN OR EQUAL TO XDELTA: STEEP 1411 e617 1412 e617 ;YDELTA IS LESS THAN XDELTA: FLAT. 1413 e617 ;STEP X AND COMPUTE Y. 1414 e617 1415 e617 ;INITIALIZE THE Y STEP CONTROL TO HALF DELTA X SO THAT FOR VERY VERY 1416 e617 ; FLAT LINES, THE Y STEP WILL OCCUR NEAR THE MIDDLE, NOT RIGHT AT THE 1417 e617 ; BEGINNING OR END. 1418 e617 a5 88 LDA XDELTA+1 1419 e619 4a LSR 1420 e61a 85 8c STA VARS+1 1421 e61c a5 87 LDA XDELTA 1422 e61e 6a ROR 1423 e61f 85 8b STA VARS ;VARS = XDELTA / 2 1424 e621 1425 e621 L43X ;PLOT ONE POINT AT (X,Y). 1426 e621 20 df ec JSR POINT 1427 e624 1428 e624 ;SEE IF X HAS BEEN STEPPED TO X1. 1429 e624 a5 76 LDA X 1430 e626 c5 81 CMP X1 1431 e628 d0 07 BNE L44X ;NO, CONTINUE 1432 e62a a5 77 LDA X+1 1433 e62c c5 82 CMP X1+1 1434 e62e d0 01 BNE L44X ;NO, CONTINUE 1435 e630 60 RTS ;YES, DONE 1436 e631 1437 e631 L44X ;STEP X BY +1 OR -1 TO THE NEXT X COORDINATE CLOSER TO X1. 1438 e631 20 66 ec JSR DOXSTEP ;X = X + XSTEP 1439 e634 1440 e634 ;ADD DELTA Y TO VARS. 1441 e634 a0 89 LDY #YDELTA 1442 e636 a2 8b LDX #VARS 1443 e638 20 04 ed JSR XPLUSY 1444 e63b 1445 e63b ;IF VARS + DELTA Y IS GREATER THAN OR EQUAL TO DELTA X, THEN 1446 e63b ; DECREASE VARS BY DELTA X AND STEP Y. 1447 e63b 38 SEC 1448 e63c a5 8b LDA VARS 1449 e63e e5 87 SBC XDELTA 1450 e640 aa TAX 1451 e641 a5 8c LDA VARS+1 1452 e643 e5 88 SBC XDELTA+1 ;COMPUTE NEW VARS - DELTA X 1453 e645 90 da BCC L43X ;IF NEW VARS - DELTA X LESS THAN 0, LOOP 1454 e647 1455 e647 ;ELSE, NEW VARS IS GREATER THAN OR EQUAL TO DELTA X. 1456 e647 86 8b STX VARS 1457 e649 85 8c STA VARS+1 ;VARS = VARS - DELTA X 1458 e64b 20 ab ec JSR DOYSTEP ;Y = Y + YSTEP 1459 e64e 4c 21 e6 JMP L43X ;LOOP 1460 e651 1461 e651 1462 e651 L99 ;YDELTA IS GREATER THAN OR EQUAL TO XDELTA: STEEP. 1463 e651 ;STEP Y AND COMPUTE X. 1464 e651 1465 e651 ;INITIALIZE THE X STEP CONTROL TO HALF DELTA Y SO THAT FOR VERY VERY 1466 e651 ; STEEP LINES, THE X STEP WILL OCCUR NEAR THE MIDDLE, NOT RIGHT AT THE 1467 e651 ; BEGINNING OR END. 1468 e651 a5 8a LDA YDELTA+1 1469 e653 4a LSR 1470 e654 85 8c STA VARS+1 1471 e656 a5 89 LDA YDELTA 1472 e658 6a ROR 1473 e659 85 8b STA VARS ;VARS = YDELTA / 2 1474 e65b 1475 e65b L143X ;PLOT ONE POINT AT (X,Y). 1476 e65b 20 df ec JSR POINT 1477 e65e 1478 e65e ;SEE IF Y HAS BEEN STEPPED TO Y1. 1479 e65e a5 78 LDA Y 1480 e660 c5 83 CMP Y1 1481 e662 d0 07 BNE L144X ;NO, CONTINUE 1482 e664 a5 79 LDA Y+1 1483 e666 c5 84 CMP Y1+1 1484 e668 d0 01 BNE L144X ;NO, CONTINUE 1485 e66a 60 RTS ;YES, DONE 1486 e66b 1487 e66b L144X ;STEP Y BY +1 OR -1 TO THE NEXT Y COORDINATE CLOSER TO Y1. 1488 e66b 20 ab ec JSR DOYSTEP ;Y = Y + YSTEP 1489 e66e 1490 e66e ;ADD DELTA X TO VARS. 1491 e66e a0 87 LDY #XDELTA 1492 e670 a2 8b LDX #VARS 1493 e672 20 04 ed JSR XPLUSY 1494 e675 1495 e675 ;IF VARS + DELTA X IS GREATER THAN OR EQUAL TO DELTA Y, THEN 1496 e675 ; DECREASE VARS BY DELTA Y AND STEP X. 1497 e675 38 SEC 1498 e676 a5 8b LDA VARS 1499 e678 e5 89 SBC YDELTA 1500 e67a aa TAX 1501 e67b a5 8c LDA VARS+1 1502 e67d e5 8a SBC YDELTA+1 ;COMPUTE NEW VARS - DELTA Y 1503 e67f 90 da BCC L143X ;IF NEW VARS - DELTA Y LESS THAN 0, LOOP 1504 e681 1505 e681 ;ELSE, NEW VARS IS GREATER THAN OR EQUAL TO DELTA Y. 1506 e681 86 8b STX VARS 1507 e683 85 8c STA VARS+1 ;VARS = VARS - DELTA Y 1508 e685 20 66 ec JSR DOXSTEP ;X = X + XSTEP 1509 e688 4c 5b e6 JMP L143X ;LOOP 1510 e68b 1511 e68b ;PAGE 1512 e68b XARC ;ARC PLOTTING ROUTINE 1513 e68b 1514 e68b ;A CIRCLE IS PLOTTED USING THE EQUATION: 1515 e68b 1516 e68b ; 2 2 1517 e68b ; X Y 1518 e68b ; ------- + ------- = 1 OR 1519 e68b ; 2 2 2 2 1520 e68b ; A R B R 1521 e68b 1522 e68b 1523 e68b ; 2 2 2 2 2 2 2 1524 e68b ; Z = B X + A Y - A B R 1525 e68b 1526 e68b ;WITH Z BEING >0 OUTSIDE THE CIRCLE, 0 ON IT, AND <0 INSIDE IT. 1527 e68b 1528 e68b ;THE COEFICIENTS A AND B ARE SMALL INTEGERS WHICH REALLY MAKE THE 1529 e68b ; MATHEMATICS APPLY TO AN ELLIPSE, BUT ARE HERE USED TO COMPENSATE 1530 e68b ; FOR THE NON-SQUARE PIXEL ASPECT RATIO. WE WILL LET A = B = 1 1531 e68b ; WHEN WE WANT NO CORRECTION, OR A = 3, B = 2 WHEN WE DO. 1532 e68b 1533 e68b ;IF X INCREASES BY A SMALL AMOUNT, DX, THEN BY CALCULATION Z CHANGES 1534 e68b ; BY THE AMOUNT: 1535 e68b 1536 e68b ; 2 2 2 1537 e68b ; DZ(X) = 2 B X DX + B DX 1538 e68b 1539 e68b ;SIMILARLY FOR Y: 1540 e68b 1541 e68b ; 2 2 2 1542 e68b ; DZ(Y) = 2 A Y DY + A DY 1543 e68b 1544 e68b ;A SIMILAR CALCULATION YIELDS THE CHANGE IN DZ(X) AND DZ(Y): 1545 e68b 1546 e68b ; 2 2 2 2 1547 e68b ; DDZ(X) = 2 B DX DDZ(Y) = 2 A DY 1548 e68b 1549 e68b ;NOW, DX AND DY MUST ALWAYS BE +1 OR -1 BECAUSE OF PIXEL CONSTRAINTS 1550 e68b ; SO FOR A TRUE STEP IN EITHER THE X OR Y DIRECTION, THESE FORMULAS 1551 e68b ; CAN BE SIMPLIFIED. 1552 e68b 1553 e68b ;WE COMPUTE THE LOCUS OF POINTS IN THE CIRCLE BY STEPPING THE 1554 e68b ; INDEPENDANT COORDINATE, EITHER X OR Y, BY 1 OR -1 AND THEN 1555 e68b ; PERFORMING A "TRIAL" STEP OF THE DEPENDANT COORDINATE BY 1/2 OR 1556 e68b ; -1/2. THE RESULTING Z, COMPUTED BY ADDING THE TWO DZ'S TO THE 1557 e68b ; ORIGINAL, TELLS US IF THE TRIAL POINT IS OUTSIDE OR INSIDE THE 1558 e68b ; CIRCLE, AND THUS WHETHER A STEP SHOULD BE TAKEN BY THE DEPENDANT 1559 e68b ; COORDINATE. 1560 e68b 1561 e68b ;THE EQUATIONS FOR DZ(X), DZ(Y), DDZ(X), DDZ(Y) (THE SECOND ORDER 1562 e68b ; DIFFERENTIALS), AND DZT(X), DZT(Y) (FOR THE TRIAL STEPS) FOLLOW: 1563 e68b ; (WITH DX AND DY + OR -1 FOR TRUE STEPS AND + OR -1/2 FOR TRIALS.) 1564 e68b 1565 e68b ; 2 2 2 2 1566 e68b ; DZ(X) = 2 B X DX + B DZ(Y) = 2 A Y DY + A 1567 e68b 1568 e68b ; 2 2 2 2 1569 e68b ; DZT(X) = 2 B X DX + B /4 DZT(Y) = 2 A Y DY + A /4 1570 e68b 1571 e68b ; 2 2 1572 e68b ; DDZ(X) = 2 B DDZ(Y) = 2 A 1573 e68b 1574 e68b ;PAGE 1575 e68b 1576 e68b ;PAR0=RADIUS, PAR1=START X, PAR2=START Y, PAR3=END X, PAR4=END Y, 1577 e68b ; PAR5 LOW = B SQUARED, PAR5 HIGH = A SQUARED (IF BOTH ARE ZERO, 1578 e68b ; THEN USE 4 AND 9) 1579 e68b 1580 e68b ; 1581 e68b 20 f8 e4 JSR GRFATT ;TAKE CARE OF GRAPHIC ATTRIBUTES 1582 e68e ; 1583 e68e ;INITIALIZE TMPXYDOT ALWAYS TO A KNOWN STATE. 1584 e68e a5 7a LDA XYDOTS 1585 e690 85 7b STA TMPXYDOT 1586 e692 1587 e692 ;IF RADIUS IS ZERO, PLOT ONLY THE SINGLE POINT AND QUIT. 1588 e692 a5 60 LDA CSIPR0 1589 e694 05 61 ORA CSIPR0+1 ;RADIUS = 0? 1590 e696 d0 03 BNE ARC00 ;NO, CONTINUE 1591 e698 4c e6 ec JMP PNT ;YES, PLOT AND DONE 1592 e69b 1593 e69b ARC00 ;SET UP THE PIXEL ASPECT RATIO. IF PAR5 IS ZERO, USE B=2, A=3. 1594 e69b ; OTHERWISE, PAR5 LOW IS B SQUARED, PAR5 HIGH IS A SQUARED. 1595 e69b a6 6a LDX CSIPR5 ;X = B SQUARED, IF GIVEN 1596 e69d a4 6b LDY CSIPR5+1 ;Y = A SQUARED, IF GIVEN 1597 e69f d0 04 BNE ARC0 ;ASPECT GIVEN, USE AS GIVEN 1598 e6a1 a2 04 LDX #4 ;ELSE, SET B SQUARED = 4 AND 1599 e6a3 a0 09 LDY #9 ; A SQUARED = 9 1600 e6a5 86 9d ARC0 STX BSQ 1601 e6a7 84 9f STY ASQ 1602 e6a9 a9 00 LDA #0 1603 e6ab 85 9e STA BSQ+1 1604 e6ad 85 a0 STA ASQ+1 ;SAVE THE VALUES AWAY AS WORDS 1605 e6af 1606 e6af ;INITIALIZE Z, THE "ERROR" TERM, TO ZERO. 1607 e6af 85 8b STA Z 1608 e6b1 85 8c STA Z+1 1609 e6b3 1610 e6b3 ;SAVE THE CURRENT GRAPHICS CURSOR POSITION (THE CENTER) IN (XC,YC). 1611 e6b3 a0 76 LDY #X ;(X,Y) = SOURCE 1612 e6b5 a2 8d LDX #XC ;(XC,YC) = DESTINATION 1613 e6b7 20 24 ed JSR MOV2W ;MOVE BOTH X AND Y 1614 e6ba 1615 e6ba ;SEE IF A FULL CIRCLE IS TO BE DRAWN (IF START AND END POINTS ARE 0). 1616 e6ba a2 07 LDX #7 ;"OR" EIGHT BYTES (FOUR WORDS) 1617 e6bc a9 00 LDA #0 1618 e6be 15 62 ARC1 ORA CSIPR1,X ;"OR" TOGETHER START AND END, X AND Y 1619 e6c0 ca DEX 1620 e6c1 10 fb BPL ARC1 ;LOOP UNTIL ALL "OR"S COMPLETE 1621 e6c3 aa TAX ;TEST ACC 1622 e6c4 d0 19 BNE XARC1 ;ARC, NOT FULL CIRCLE, CONTINUE 1623 e6c6 1624 e6c6 ;FULL CIRCLE, SET UP PARAMETERS AS IF ARC OF 360 DEGREES WAS ASKED FOR. 1625 e6c6 ;COPY CENTER TO START XY. 1626 e6c6 a2 62 LDX #CSIPR1 ;PARAMETER 1 IS START X 1627 e6c8 20 24 ed JSR MOV2W 1628 e6cb 1629 e6cb ;ADD RADIUS TO START Y. 1630 e6cb a0 60 LDY #CSIPR0 ;PARAMETER 0 IS RADIUS 1631 e6cd a2 64 LDX #CSIPR2 1632 e6cf 20 04 ed JSR XPLUSY 1633 e6d2 1634 e6d2 ;COPY START XY TO END XY. 1635 e6d2 a0 62 LDY #CSIPR1 1636 e6d4 a2 66 LDX #CSIPR3 ;PARAMETER 3 IS END X 1637 e6d6 20 24 ed JSR MOV2W 1638 e6d9 1639 e6d9 ;MAKE END X BE ONE MORE SO END POINT FALLS IN QUADRANT I. 1640 e6d9 e6 66 INC CSIPR3 1641 e6db d0 02 BNE ARC2 1642 e6dd e6 67 INC CSIPR3+1 1643 e6df ARC2 1644 e6df 1645 e6df XARC1 ;THE VARIABLES (X,Y) ARE USED TO PLOT THE POINTS. INITIALIZE THEM TO 1646 e6df ; THE START XY VALUES. 1647 e6df a0 62 LDY #CSIPR1 1648 e6e1 a2 76 LDX #X 1649 e6e3 20 24 ed JSR MOV2W 1650 e6e6 20 8b ec JSR XYNG ;XY HAS BEEN CHANGED 1651 e6e9 1652 e6e9 ;THE START AND END COORDINATES ARE GIVEN AS ABSOLUTE. COMPUTE THEM 1653 e6e9 ; RELATIVE TO THE CIRCLE'S CENTER. 1654 e6e9 a0 8d LDY #XC 1655 e6eb a2 62 LDX #CSIPR1 1656 e6ed 20 14 ed JSR XMINUSY 1657 e6f0 a2 66 LDX #CSIPR3 1658 e6f2 20 14 ed JSR XMINUSY 1659 e6f5 a0 8f LDY #YC 1660 e6f7 a2 64 LDX #CSIPR2 1661 e6f9 20 14 ed JSR XMINUSY 1662 e6fc a2 68 LDX #CSIPR4 1663 e6fe 20 14 ed JSR XMINUSY 1664 e701 1665 e701 ;DETERMINE AND SAVE AWAY THE QUADRANT OF THE END POINT. 1666 e701 a0 66 LDY #CSIPR3 1667 e703 a2 81 LDX #X1 1668 e705 20 24 ed JSR MOV2W 1669 e708 20 6c ed JSR QUADRNT ;DETERMINE THE QUADRANT OF (X1,Y1) 1670 e70b 10 06 BPL XARC2 ;NOT AT THE CENTER, CONTINUE 1671 e70d 20 e6 ec ENDNG JSR PNT ;AT THE CENTER, JUST PLOT ONE POINT 1672 e710 4c ba e7 JMP XACDUN 1673 e713 1674 e713 85 a2 XARC2 STA ENDQUAD ;SAVE THE RESULT 1675 e715 1676 e715 ;(X1,Y1) ARE USED AS THE CALCULATING VARIABLES; INITIALIZE THEM TO 1677 e715 ; THE START XY. 1678 e715 a0 62 LDY #CSIPR1 1679 e717 20 24 ed JSR MOV2W 1680 e71a 1681 e71a 20 97 ed JSR DIFFS ;COMPUTE THE DIFFERENTIALS 1682 e71d 30 ee BMI ENDNG ;END XY IS AT THE CENTER OF THE CIRCLE, ERROR 1683 e71f 1684 e71f ;INITIALIZE Z TO DZT(X) OR DZT(Y), WHICHEVER IS NEGATIVE. 1685 e71f a0 99 LDY #DZTX 1686 e721 a2 8b LDX #Z 1687 e723 a5 9a LDA DZTX+1 1688 e725 30 06 BMI ARC3 ;DZT(X) IS NEGATIVE, USE IT 1689 e727 a0 9b LDY #DZTY 1690 e729 a5 9c LDA DZTY+1 1691 e72b 10 03 BPL ARC4 ;DZT(Y) IS POSITIVE TOO, USE ZERO 1692 e72d 20 2e ed ARC3 JSR MOV1W ;INITIALIZE Z 1693 e730 ARC4 1694 e730 1695 e730 ;ENTER THE CIRCLE DRAWING LOOP AT ONE OF FOUR ENTRY POINTS, DEPENDING 1696 e730 ; ON THE CURRENT QUADRANT. 1697 e730 a6 a1 LDX QUAD 1698 e732 f0 0d BEQ Q1ENT 1699 e734 ca DEX 1700 e735 f0 28 BEQ Q2ENT 1701 e737 ca DEX 1702 e738 f0 43 BEQ Q3ENT 1703 e73a d0 62 BNE Q4ENT ;(ALWAYS BRANCHES) 1704 e73c 1705 e73c 20 74 ee Q1A JSR YY ;PLOT A POINT, STEP Y AS INDEPENDANT AND X AS DEPENDANT 1706 e73f f0 79 BEQ XACDUN ;REACHED END POINT, DONE 1707 e741 20 c0 ee Q1ENT JSR TRANS ;ARE WE AT THE TRANSITION POINT, ABOUT 45 DEGREES? 1708 e744 30 f6 BMI Q1A ;NO, CONTINUE STEPPING 1709 e746 f0 72 BEQ XACDUN ;YES, AND THE END POINT IS THERE TOO, DONE 1710 e748 1711 e748 ;SWITCH THE ROLES OF X AND Y. 1712 e748 a5 81 Q1B LDA X1 1713 e74a 05 82 ORA X1+1 ;ARE WE AT THE END OF THE QUADRANT, THE Y AXIS? 1714 e74c f0 07 BEQ Q1C ;YES, DONE 1715 e74e 20 28 ee JSR XX 1716 e751 d0 f5 BNE Q1B 1717 e753 f0 65 BEQ XACDUN ;DONE IF WE HIT STOP POINT 1718 e755 1719 e755 20 97 ed Q1C JSR DIFFS ;RE-COMPUTE THE DIFFERENTIALS FOR QUADRANT II 1720 e758 30 b3 BMI ENDNG ;END XY IS AT THE CENTER OF THE CIRCLE, ERROR 1721 e75a 1722 e75a 20 28 ee Q2A JSR XX ;PLOT A POINT, STEP X AS INDEPENDANT AND Y AS DEPENDANT 1723 e75d f0 5b BEQ XACDUN ;REACHED END POINT, DONE 1724 e75f 20 c0 ee Q2ENT JSR TRANS ;ARE WE AT THE TRANSITION POINT, ABOUT 45 DEGREES? 1725 e762 30 f6 BMI Q2A ;NO, CONTINUE STEPPING 1726 e764 f0 54 BEQ XACDUN ;YES, AND THE END POINT IS THERE TOO, DONE 1727 e766 1728 e766 ;SWITCH THE ROLES OF X AND Y. 1729 e766 a5 83 Q2B LDA Y1 1730 e768 05 84 ORA Y1+1 ;ARE WE AT THE END OF THE QUADRANT, THE X AXIS? 1731 e76a f0 07 BEQ Q2C ;YES, DONE 1732 e76c 20 74 ee JSR YY 1733 e76f d0 f5 BNE Q2B 1734 e771 f0 47 BEQ XACDUN ;DONE IF WE HIT STOP POINT 1735 e773 1736 e773 20 97 ed Q2C JSR DIFFS ;RE-COMPUTE THE DIFFERENTIALS FOR QUADRANT III 1737 e776 30 95 BMI ENDNG ;END XY IS AT THE CENTER OF THE CIRCLE, ERROR 1738 e778 1739 e778 20 74 ee Q3A JSR YY ;PLOT A POINT, STEP Y AS INDEPENDANT AND X AS DEPENDANT 1740 e77b f0 3d BEQ XACDUN ;REACHED END POINT, DONE 1741 e77d 20 c0 ee Q3ENT JSR TRANS ;ARE WE AT THE TRANSITION POINT, ABOUT 45 DEGREES? 1742 e780 30 f6 BMI Q3A ;NO, CONTINUE STEPPING 1743 e782 f0 36 BEQ XACDUN ;YES, AND THE END POINT IS THERE TOO, DONE 1744 e784 1745 e784 ;SWITCH THE ROLES OF X AND Y. 1746 e784 a5 81 Q3B LDA X1 1747 e786 05 82 ORA X1+1 ;ARE WE AT THE END OF THE QUADRANT, THE Y AXIS? 1748 e788 f0 07 BEQ Q3C ;YES, DONE 1749 e78a 20 28 ee JSR XX 1750 e78d d0 f5 BNE Q3B 1751 e78f f0 29 BEQ XACDUN ;DONE IF WE HIT STOP POINT 1752 e791 1753 e791 20 97 ed Q3C JSR DIFFS ;RE-COMPUTE THE DIFFERENTIALS FOR QUADRANT IV 1754 e794 10 03 BPL Q4A ;XY OK, CONTINUE 1755 e796 4c 0d e7 JMP ENDNG ;END XY IS AT THE CENTER OF THE CIRCLE, ERROR 1756 e799 1757 e799 20 28 ee Q4A JSR XX ;PLOT A POINT, STEP X AS INDEPENDANT AND Y AS DEPENDANT 1758 e79c f0 1c BEQ XACDUN ;REACHED END POINT, DONE 1759 e79e 20 c0 ee Q4ENT JSR TRANS ;ARE WE AT THE TRANSITION POINT, ABOUT 45 DEGREES? 1760 e7a1 30 f6 BMI Q4A ;NO, CONTINUE STEPPING 1761 e7a3 f0 15 BEQ XACDUN ;YES, AND THE END POINT IS THERE TOO, DONE 1762 e7a5 1763 e7a5 ;SWITCH THE ROLES OF X AND Y. 1764 e7a5 a5 83 Q4B LDA Y1 1765 e7a7 05 84 ORA Y1+1 ;ARE WE AT THE END OF THE QUADRANT, THE X AXIS? 1766 e7a9 f0 07 BEQ Q4C ;YES, DONE 1767 e7ab 20 74 ee JSR YY 1768 e7ae d0 f5 BNE Q4B 1769 e7b0 f0 08 BEQ XACDUN ;DONE IF WE HIT STOP POINT 1770 e7b2 1771 e7b2 20 97 ed Q4C JSR DIFFS ;RE-COMPUTE THE DIFFERENTIALS FOR QUADRANT I 1772 e7b5 10 85 BPL Q1A ;OK, CONTINUE 1773 e7b7 4c 0d e7 JMP ENDNG ;END XY IS AT THE CENTER OF THE CIRCLE, ERROR 1774 e7ba 1775 e7ba a0 8d XACDUN LDY #XC 1776 e7bc a2 76 LDX #X 1777 e7be 20 24 ed JSR MOV2W ;RESTORE THE CENTER (XC,YC) TO THE CURSOR POS'N, (X,Y) 1778 e7c1 4c 8b ec JMP XYNG 1779 e7c4 1780 e7c4 ;PAGE 1781 e7c4 ;>>>>>>> S U B R O U T I N E S <<<<<<< 1782 e7c4 1783 e7c4 DISP ;WRITE THE FONT REPRESENTATION OF THE CHARACTER IN ACC TO THE SCREEN 1784 e7c4 ; AT THE CURRENT CURSOR POSITION. 1785 e7c4 ;DURING THE WRITING, THE CURRENT ATTRIBUTES FOR BRIGHT AND BLINK WILL 1786 e7c4 ; BE AUTOMATICALLY ADDED TO THE MEMORY AS EACH BYTE IS WRITTEN. 1787 e7c4 ; HOWEVER, THE REVERSE AND UNDERLINE ATTRIBUTES MUST BE EXPLICITLY 1788 e7c4 ; DONE BY THE SOFTWARE. 1789 e7c4 1790 e7c4 ;INPUT: ACC THE CHARACTER, 00 - FF 1791 e7c4 1792 e7c4 ; ATTRIB THE CURRENT ATTRIBUTES. 1793 e7c4 1794 e7c4 ; CGLN0 THE FONT TABLES FOR THE CHARACTERS, 12 TABLES, ONE FOR 1795 e7c4 ; THRU EACH OF THE 12 RASTER LINES. EACH TABLE HOLDS RASTER 1796 e7c4 ; CGLN11 LINE N OF ALL 256 CHARACTERS. 1797 e7c4 1798 e7c4 ; LN0 POINTERS TO THE BYTES OF THE CHARACTER AT THE CURRENT 1799 e7c4 ; THRU CURSOR POSITION. THESE ADDRESSES ARE KEPT UP-TO-DATE 1800 e7c4 ; LN11 BY THE DOLN ROUTINE. 1801 e7c4 1802 e7c4 ;WRITE ATTRIBUTE RAM FROM NEW ATTRIBUTES IN ATT LATCH 1803 e7c4 ; 1804 e7c4 1805 e7c4 48 PHA ;SAVE ACC 1806 e7c5 78 SEI ;DISABLE INTERRUPTS 1807 e7c6 a5 54 LDA ATTRIB ;GET ATTRIBUTES 1808 e7c8 09 04 ORA #$04 ;SET BIT 2 TO ONE 1809 e7ca 85 54 STA ATTRIB ;TELL SOFTWARE 1810 e7cc 8d 00 a0 STA ATT ;TELL HARDWARE 1811 e7cf 58 CLI ;RE-ENABLE INTERRUPTS 1812 e7d0 68 PLA ;RESTORE SAVED ACC 1813 e7d1 1814 e7d1 a4 20 LDY LNOK ;LN0 - LN11 POINTERS UP-TO-DATE? 1815 e7d3 d0 03 BNE DISP8 ;YES, CONTINUE 1816 e7d5 20 77 eb JSR DOLN1 ;NO, UPDATE THEM 1817 e7d8 DISP8 1818 e7d8 05 5c ORA SOFLG ;OR THE CHARACTER WITH THE SHIFT OUT FLAG TO POSSIBLY 1819 e7da ; SET BIT 7 HIGH 1820 e7da 18 CLC 1821 e7db 10 07 BPL DISP0A ;USE G0 CHARACTER SET SINCE BIT 7 IS LOW 1822 e7dd 29 7f AND #$7F ;STRIP BIT 7 1823 e7df 65 5e ADC G1VAL ;USE G1 CHARACTER SET 1824 e7e1 4c e6 e7 JMP DISP0B ;CONTINUE 1825 e7e4 65 5d DISP0A ADC G0VAL 1826 e7e6 a8 DISP0B TAY ;Y = THE CHARACTER 1827 e7e7 a2 00 LDX #0 ;X = 00 1828 e7e9 24 51 BIT CONDS ;IN OVERSTRIKE MODE? 1829 e7eb 10 66 BPL DISP1 ;NO, REPLACE THE OLD CHARACTER WITH THE NEW CHARACTER 1830 e7ed 1831 e7ed ;OVERSTRIKE THE CHARACTER RATHER THAN REPLACING IT. 1832 e7ed ;CONDITIONALLY UN-REVERSE THE CHARACTER AT THE CURSOR POS'N BUT ONLY 1833 e7ed ; IF IT SEEMS NOT TO BE A SPACE, I.E. NOT ALL ZEROS. 1834 e7ed a1 25 LDA (LN2,X) 1835 e7ef 01 2b ORA (LN5,X) 1836 e7f1 01 31 ORA (LN8,X) ;TEST A FEW LINES OF THE CHARACTER 1837 e7f3 f0 07 BEQ DISP0 ;IF NOT ALREADY REVERSED, DON'T UN-REVERSE 1838 e7f5 84 00 STY 0 ;TEMP SAVE THE CHAR 1839 e7f7 20 4c ea JSR REVCHR ;REMOVE THE REVERSAL ONLY IF WE ARE IN THE REVERSE MODE 1840 e7fa a4 00 LDY 0 ;RESTORE IT 1841 e7fc DISP0 1842 e7fc 1843 e7fc ;FOR EACH OF THE TWELVE RASTER LINES, 1844 e7fc b9 00 02 LDA CGLN0,Y ;GET CHAR GEN CONTENTS, 1845 e7ff 01 21 ORA (LN0,X) ; OR IT WITH THE CURRENT CHARACTER, 1846 e801 81 21 STA (LN0,X) ; AND STORE IT IN MEMORY. 1847 e803 b9 00 03 LDA CGLN1,Y 1848 e806 01 23 ORA (LN1,X) 1849 e808 81 23 STA (LN1,X) 1850 e80a b9 00 04 LDA CGLN2,Y 1851 e80d 01 25 ORA (LN2,X) 1852 e80f 81 25 STA (LN2,X) 1853 e811 b9 00 05 LDA CGLN3,Y 1854 e814 01 27 ORA (LN3,X) 1855 e816 81 27 STA (LN3,X) 1856 e818 b9 00 06 LDA CGLN4,Y 1857 e81b 01 29 ORA (LN4,X) 1858 e81d 81 29 STA (LN4,X) 1859 e81f b9 00 07 LDA CGLN5,Y 1860 e822 01 2b ORA (LN5,X) 1861 e824 81 2b STA (LN5,X) 1862 e826 b9 00 08 LDA CGLN6,Y 1863 e829 01 2d ORA (LN6,X) 1864 e82b 81 2d STA (LN6,X) 1865 e82d b9 00 09 LDA CGLN7,Y 1866 e830 01 2f ORA (LN7,X) 1867 e832 81 2f STA (LN7,X) 1868 e834 b9 00 0a LDA CGLN8,Y 1869 e837 01 31 ORA (LN8,X) 1870 e839 81 31 STA (LN8,X) 1871 e83b b9 00 0b LDA CGLN9,Y 1872 e83e 01 33 ORA (LN9,X) 1873 e840 81 33 STA (LN9,X) 1874 e842 b9 00 0c LDA CGLN10,Y 1875 e845 01 35 ORA (LN10,X) 1876 e847 81 35 STA (LN10,X) 1877 e849 b9 00 0d LDA CGLN11,Y 1878 e84c 01 37 ORA (LN11,X) 1879 e84e 81 37 STA (LN11,X) 1880 e850 4c 8f e8 JMP DISP2 ;CONTINUE 1881 e853 1882 e853 DISP1 ;FOR EACH OF THE TWELVE RASTER LINES, 1883 e853 b9 00 02 LDA CGLN0,Y ;GET CHAR GEN CONTENTS 1884 e856 81 21 STA (LN0,X) ; AND STORE IT IN MEMORY 1885 e858 b9 00 03 LDA CGLN1,Y 1886 e85b 81 23 STA (LN1,X) 1887 e85d b9 00 04 LDA CGLN2,Y 1888 e860 81 25 STA (LN2,X) 1889 e862 b9 00 05 LDA CGLN3,Y 1890 e865 81 27 STA (LN3,X) 1891 e867 b9 00 06 LDA CGLN4,Y 1892 e86a 81 29 STA (LN4,X) 1893 e86c b9 00 07 LDA CGLN5,Y 1894 e86f 81 2b STA (LN5,X) 1895 e871 b9 00 08 LDA CGLN6,Y 1896 e874 81 2d STA (LN6,X) 1897 e876 b9 00 09 LDA CGLN7,Y 1898 e879 81 2f STA (LN7,X) 1899 e87b b9 00 0a LDA CGLN8,Y 1900 e87e 81 31 STA (LN8,X) 1901 e880 b9 00 0b LDA CGLN9,Y 1902 e883 81 33 STA (LN9,X) 1903 e885 b9 00 0c LDA CGLN10,Y 1904 e888 81 35 STA (LN10,X) 1905 e88a b9 00 0d LDA CGLN11,Y 1906 e88d 81 37 STA (LN11,X) 1907 e88f 1908 e88f DISP2 ;SEE IF FIX-UP IS NEEDED FOR THE SOFTWARE ATTRIBUTES. 1909 e88f a5 51 LDA CONDS ;GET CONDITION BYTE 1910 e891 29 02 AND #$02 ;ISOLATE UNDERLINE BIT 1911 e893 f0 04 BEQ DISP2A ;NO UNDERLINE, SO CONTINUE 1912 e895 a9 ff LDA #$0FF 1913 e897 81 35 STA (LN10,X) ;UNCONDITIONALLY TURN ON THE UNDERLINE 1914 e899 20 4c ea DISP2A JSR REVCHR ;REVERSE THE CHARACTER IF REVERSE ATTRIBUTE IS ON 1915 e89c 1916 e89c ;NOW INCREMENT THE CURSOR IF IT IS NOT ALREADY ON THE LAST POSITION 1917 e89c ; OF THE LINE. 1918 e89c a5 52 LDA HCUR 1919 e89e c9 4f CMP #79 ;CURSOR CURRENTLY AT THE END OF THE LINE? 1920 e8a0 d0 0d BNE DISP7 ;NO, INCREMENT CURSOR AND CONTINUE 1921 e8a2 1922 e8a2 ;FALLING OFF THE END OF A LINE WE MUST EXAMINE STATE OF AUTO NEWLINE. 1923 e8a2 a5 51 LDA CONDS 1924 e8a4 29 08 AND #$08 ;AUTO NEWLINE ON? 1925 e8a6 f0 06 BEQ RTS9 ;NO, JUST STAY AT THE END OF THE LINE 1926 e8a8 20 b5 e0 JSR XCR ;YES, MOVE CURSOR TO BEGINNING OF 1927 e8ab 4c be e0 JMP XLF ; THE NEXT LINE 1928 e8ae 60 RTS9 RTS 1929 e8af 1930 e8af e6 52 DISP7 INC HCUR ;INCREMENT THE SOFTWARE CURSOR 1931 e8b1 1932 e8b1 ;INCREMENT ALL THE POINTERS TO THE CURSOR CHARACTER'S RASTER LINES. 1933 e8b1 ;FIRST DO THE FIRST SUB-CELL. 1934 e8b1 e6 21 INC LN0 ;LEAST SIG BYTES OF SUB-CELL 1935 e8b3 a5 21 LDA LN0 1936 e8b5 85 23 STA LN1 ;(ALL THESE POINTERS SHOULD HAVE THE SAME VALUE) 1937 e8b7 85 25 STA LN2 1938 e8b9 d0 13 BNE DISP3 ;NO OVERFLOW, CONTINUE 1939 e8bb 1940 e8bb ;OVERFLOW, FIX IT UP. 1941 e8bb e6 22 INC LN0+1 ;MOST SIG BYTES OF SUB-CELL 1942 e8bd e6 24 INC LN1+1 ;(THESE BYTES ARE OFFSET BY 20H OR 2000H IN ADDRESS) 1943 e8bf e6 26 INC LN2+1 ;THIS BYTE WILL INCREMENT FROM 7FH TO 80H ON OVERFLOW 1944 e8c1 10 0b BPL DISP3 ;IF NO WRAP AROUND NEEDED, CONTINUE 1945 e8c3 a9 60 LDA #$60 1946 e8c5 85 26 STA LN2+1 ;PUT 6000H INTO LN2 1947 e8c7 a9 40 LDA #$40 1948 e8c9 85 24 STA LN1+1 ;PUT 4000H INTO LN1 1949 e8cb 4a LSR ;CONVERT 40H TO 20H 1950 e8cc 85 22 STA LN0+1 ;PUT 2000H INTO LN0 1951 e8ce DISP3 1952 e8ce 1953 e8ce ;DO THE SAME FOR THE SECOND SUB-CELL. 1954 e8ce e6 27 INC LN3 ;LEAST SIG BYTES OF SUB-CELL 1955 e8d0 a5 27 LDA LN3 1956 e8d2 85 29 STA LN4 ;(ALL THESE POINTERS SHOULD HAVE THE SAME VALUE) 1957 e8d4 85 2b STA LN5 1958 e8d6 d0 13 BNE DISP4 ;NO OVERFLOW, CONTINUE 1959 e8d8 1960 e8d8 ;OVERFLOW, FIX IT UP. 1961 e8d8 e6 28 INC LN3+1 ;MOST SIG BYTES OF SUB-CELL 1962 e8da e6 2a INC LN4+1 ;(THESE BYTES ARE OFFSET BY 20H OR 2000H IN ADDRESS) 1963 e8dc e6 2c INC LN5+1 ;THIS BYTE WILL INCREMENT FROM 7FH TO 80H ON OVERFLOW 1964 e8de 10 0b BPL DISP4 ;IF NO WRAP AROUND NEEDED, CONTINUE 1965 e8e0 a9 60 LDA #$60 1966 e8e2 85 2c STA LN5+1 ;PUT 6000H INTO LN5 1967 e8e4 a9 40 LDA #$40 1968 e8e6 85 2a STA LN4+1 ;PUT 4000H INTO LN4 1969 e8e8 4a LSR ;CONVERT 40H TO 20H 1970 e8e9 85 28 STA LN3+1 ;PUT 2000H INTO LN3 1971 e8eb DISP4 1972 e8eb 1973 e8eb ;DO THE SAME FOR THE THIRD SUB-CELL. 1974 e8eb e6 2d INC LN6 ;LEAST SIG BYTES OF SUB-CELL 1975 e8ed a5 2d LDA LN6 1976 e8ef 85 2f STA LN7 ;(ALL THESE POINTERS SHOULD HAVE THE SAME VALUE) 1977 e8f1 85 31 STA LN8 1978 e8f3 d0 13 BNE DISP5 ;NO OVERFLOW, CONTINUE 1979 e8f5 1980 e8f5 ;OVERFLOW, FIX IT UP. 1981 e8f5 e6 2e INC LN6+1 ;MOST SIG BYTES OF SUB-CELL 1982 e8f7 e6 30 INC LN7+1 ;(THESE BYTES ARE OFFSET BY 20H OR 2000H IN ADDRESS) 1983 e8f9 e6 32 INC LN8+1 ;THIS BYTE WILL INCREMENT FROM 7FH TO 80H ON OVERFLOW 1984 e8fb 10 0b BPL DISP5 ;IF NO WRAP AROUND NEEDED, CONTINUE 1985 e8fd a9 60 LDA #$60 1986 e8ff 85 32 STA LN8+1 ;PUT 6000H INTO LN8 1987 e901 a9 40 LDA #$40 1988 e903 85 30 STA LN7+1 ;PUT 4000H INTO LN7 1989 e905 4a LSR ;CONVERT 40H TO 20H 1990 e906 85 2e STA LN6+1 ;PUT 2000H INTO LN6 1991 e908 DISP5 1992 e908 1993 e908 ;DO THE SAME FOR THE LAST SUB-CELL. 1994 e908 e6 33 INC LN9 ;LEAST SIG BYTES OF SUB-CELL 1995 e90a a5 33 LDA LN9 1996 e90c 85 35 STA LN10 ;(ALL THESE POINTERS SHOULD HAVE THE SAME VALUE) 1997 e90e 85 37 STA LN11 1998 e910 d0 13 BNE RTS10 ;NO OVERFLOW, DONE 1999 e912 2000 e912 ;OVERFLOW, FIX IT UP. 2001 e912 e6 34 INC LN9+1 ;MOST SIG BYTES OF SUB-CELL 2002 e914 e6 36 INC LN10+1 ;(THESE BYTES ARE OFFSET BY 20H OR 2000H IN ADDRESS) 2003 e916 e6 38 INC LN11+1 ;THIS BYTE WILL INCREMENT FROM 7FH TO 80H ON OVERFLOW 2004 e918 10 0b BPL RTS10 ;IF NO WRAP AROUND NEEDED, CONTINUE 2005 e91a a9 60 LDA #$60 2006 e91c 85 38 STA LN11+1 ;PUT 6000H INTO LN11 2007 e91e a9 40 LDA #$40 2008 e920 85 36 STA LN10+1 ;PUT 4000H INTO LN10 2009 e922 4a LSR ;CONVERT 40H TO 20H 2010 e923 85 34 STA LN9+1 ;PUT 2000H INTO LN9 2011 e925 60 RTS10 RTS 2012 e926 2013 e926 ;PAGE 2014 e926 CURGET ;INITIALIZE THE PHOSPHOR SAVER ATTRIBUTE BYTE. 2015 e926 a9 04 LDA #4 2016 e928 85 5b STA PSAVCNT ;INITIALIZE 4-MINUTE COUNT TO 16 MINUTES 2017 e92a 2018 e92a CURG2 ;WAIT A CERTAIN AMOUNT OF TIME FOR THE Z-80 TO PASS ANOTHER CHAR. 2019 e92a e6 58 INC CURBLK 2020 e92c d0 3d BNE CURG1 ;NO OVERFLOW, CONTINUE 2021 e92e 2022 e92e ;OK, THE Z-80 ISN'T PASSING CHARS TO US, LOOK AT THE PHOSPHOR SAVER. 2023 e92e e6 59 INC CURBLK + 1 ;INCREMENT THE SECOND CURSOR BLINK COUNTER 2024 e930 d0 22 BNE CURG3 ;NO OVERFLOW, CONTINUE 2025 e932 e6 5a INC CURBLK + 2 ;INCREMENT THE PHOSPHOR SAVER COUNTER 2026 e934 d0 1e BNE CURG3 ;NO OVERFLOW, CONTINUE 2027 e936 2028 e936 ;COME HERE EVERY 4 MINUTES. 2029 e936 a5 5b LDA PSAVCNT 2030 e938 f0 1a BEQ CURG3 ;ALREADY BLANK, DONE 2031 e93a c6 5b DEC PSAVCNT ;DECREMENT 4-MINUTE COUNT 2032 e93c d0 16 BNE CURG3 ;NOT TO 16 MINS YET, CONTINUE 2033 e93e a5 51 LDA CONDS 2034 e940 29 04 AND #$04 2035 e942 d0 10 BNE CURG3 ;PHOSPHOR SAVER DISABLED, DONE 2036 e944 78 SEI ;DISABLE INTERRUPTS 2037 e945 a5 54 LDA ATTRIB 2038 e947 09 20 ORA #$20 2039 e949 85 54 STA ATTRIB 2040 e94b 8d 00 a0 STA ATT ;BLANK THE SCREEN 2041 e94e 58 CLI ;RE-ENABLE INTERRUPTS 2042 e94f ; 2043 e94f a9 ff LDA #$0FF ;COMMAND TO Z-80 THAT PHOSPHOR SAVER IN EFFECT 2044 e951 20 d2 e9 JSR IPUTCHR ;INTERRUPT Z-80 2045 e954 ; 2046 e954 CURG3 2047 e954 2048 e954 ;EVERY 256 COUNT, CHECK THE CURSOR. 2049 e954 a9 20 LDA #$20 ;MASK FOR CURSOR BLINK 2050 e956 24 51 BIT CONDS ;CURSOR WANTED? 2051 e958 50 11 BVC CURG1 ;NO, MERELY WAIT FOR THE NEXT CHARACTER 2052 e95a f0 0c BEQ ONGET ;YES, BUT NO BLINK, TURN ON THE CURSOR 2053 e95c 2054 e95c ;CURSOR BLINK IN THE FOLLOWING MANNER: 75% ON, 25% OFF. 2055 e95c 24 59 BIT CURBLK+1 ;TEST COUNTER VALUE 2056 e95e 10 08 BPL ONGET ;TURN ON CURSOR IF B7 = 0 2057 e960 50 06 BVC ONGET ;TURN ON CURSOR IF B7 = 1 AND B6 = 0 2058 e962 20 9c e9 JSR CUROFF ;TURN OFF CURSOR 2059 e965 4c 6b e9 JMP CURG1 2060 e968 2061 e968 20 a1 e9 ONGET JSR CURON ;TURN ON THE CURSOR 2062 e96b ad 02 90 CURG1 LDA IOPC ;READ PORT C FOR STATUS BITS 2063 e96e 29 08 AND #$08 ;BYTE HERE? 2064 e970 f0 b8 BEQ CURG2 ;NO, PC3 = 0, LOOP AND WAIT 2065 e972 2066 e972 ;BYTE HERE, TURN OFF THE CURSOR, RESET THE BLINK VARIABLES, GET BYTE. 2067 e972 20 9c e9 JSR CUROFF ;TURN OFF THE CURSOR 2068 e975 78 SEI ;DISABLE INTERRUPTS 2069 e976 a5 54 LDA ATTRIB 2070 e978 29 df AND #$0DF ;TURN SCREEN BACK ON 2071 e97a 85 54 STA ATTRIB 2072 e97c 8d 00 a0 STA ATT ;UPDATE HARDWARE 2073 e97f 58 CLI ;RE-ENABLE INTERRUPTS 2074 e980 a9 00 LDA #0 2075 e982 85 58 STA CURBLK 2076 e984 85 59 STA CURBLK+1 ;CLEAR THE CURSOR BLINK COUNTER SO THE CURSOR WILL 2077 e986 ; START OFF IN THE ON STATE 2078 e986 85 5a STA CURBLK+2 ;RESET THE PHOSPHOR SAVER COUNT TOO 2079 e988 2080 e988 2081 e988 GETCHR ;WAIT FOR A CHARACTER FROM THE DISPLAY SECTION, RETURN IT IN ACC. 2082 e988 ad 02 90 LDA IOPC ;READ PORT C FOR STATUS BITS 2083 e98b 29 08 AND #$08 ;BYTE HERE? 2084 e98d f0 97 BEQ CURGET ;NO, PC3 = 0, LOOP AND WAIT 2085 e98f 2086 e98f ;INPUT THE BYTE FROM THE PROCESSING SECTION. 2087 e98f ad 00 90 LDA IOPA ;ACC = THE BYTE 2088 e992 2089 e992 ;ACCEPT BYTE FROM PROCESSING SECTION. 2090 e992 a2 0e LDX #$0E ;MASK TO RESET PORT C, BIT 7 2091 e994 8e 03 90 STX IOCTRL ;RESET IT 2092 e997 e8 INX ;MASK TO SET PORT C, BIT 7 2093 e998 8e 03 90 STX IOCTRL ;SET IT AGAIN 2094 e99b 60 RTS ;RETURN WITH THE CHARACTER IN ACC. 2095 e99c 2096 e99c CUROFF ;TURN OFF THE SOFTWARE CURSOR. 2097 e99c a5 57 LDA CURDSP ;CURSOR ALREADY ON? 2098 e99e 30 05 BMI CURTOG ;YES, TURN IT OFF 2099 e9a0 60 CO1 RTS ;NO, DONE 2100 e9a1 2101 e9a1 CURON ;TURN ON THE SOFTWARE CURSOR. 2102 e9a1 a5 57 LDA CURDSP ;CURSOR ALREADY ON? 2103 e9a3 30 fb BMI CO1 ;YES, DONE 2104 e9a5 2105 e9a5 CURTOG ;TOGGLE THE SOFTWARE CURSOR. 2106 e9a5 49 80 EOR #$80 ;TOGGLE BIT 7 2107 e9a7 85 57 STA CURDSP ;TOGGLE THE CURSOR DISPLAYED FLAG 2108 e9a9 20 73 eb JSR DOLN ;RE-COMPUTE THE LN0 - LN11 POINTERS 2109 e9ac a0 39 LDY #CURMSK ;Y = POINTER TO THE CURSOR MASK ON ;PAGE 00 2110 e9ae 4c 54 ea JMP EORCHR ;TURN THE CURSOR ON OR OFF 2111 e9b1 ;NO NEED TO RESTORE THE ATTRIBUTES; THEY AREN'T BEING 2112 e9b1 ; WRITTEN AND WILL BE RESTORED LATER WHEN THE NEXT 2113 e9b1 ; CHARACTER ARRIVES. 2114 e9b1 2115 e9b1 ;PAGE 2116 e9b1 PUTCHR ;OUTPUT A CHARACTER TO THE PROCESSING SECTION. 2117 e9b1 8d 01 90 STA IOPB ;OUTPUT THE CHARACTER 2118 e9b4 a9 0c LDA #$0C ;MASK TO RESET PORT C, BIT 6 2119 e9b6 8d 03 90 STA IOCTRL ;RESET IT 2120 e9b9 a9 0d LDA #$0D ;MASK TO SET PORT C, BIT 6 2121 e9bb 8d 03 90 STA IOCTRL ;SET IT 2122 e9be ad 02 90 PCH1 LDA IOPC ;READ PORT C FOR STATUS BITS 2123 e9c1 29 08 AND #$08 ;BYTE HERE? 2124 e9c3 f0 05 BEQ PCH2 ;NO, PC3 = 0, CONTINUE 2125 e9c5 a9 00 LDA #NUL ;BYTE FROM PROCESSING SECTION, 2126 e9c7 4c 2c e0 JMP DOIT ; FIX UP STACK AND PROCESS IT 2127 e9ca 2128 e9ca ad 02 90 PCH2 LDA IOPC ;READ PORT C FOR STATUS BITS 2129 e9cd 29 01 AND #$01 ;PROCESSING SECTION READY? 2130 e9cf f0 ed BEQ PCH1 ;NO, PC0 = 0, LOOP AND WAIT 2131 e9d1 60 RTS 2132 e9d2 2133 e9d2 IPUTCHR ;INTERRUPT AND THEN OUTPUT A CHARACTER TO THE PROCESSING SECTION. 2134 e9d2 8d 01 90 STA IOPB ;OUTPUT THE CHARACTER 2135 e9d5 a9 0c LDA #$0C ;MASK TO RESET PORT C, BIT 6 2136 e9d7 8d 03 90 STA IOCTRL ;RESET IT 2137 e9da a9 0d LDA #$0D ;MASK TO SET PORT C, BIT 6 2138 e9dc 8d 03 90 STA IOCTRL ;SET IT 2139 e9df a9 01 LDA #$01 2140 e9e1 8d 00 b0 STA Z80 ;INTERRUPT THE Z-80 2141 e9e4 d0 e4 BNE PCH2 ;WAIT FOR ACKNOWLEDGEMENT 2142 e9e6 2143 e9e6 ;PAGE 2144 e9e6 GETPARS ;ACCEPT PARAMETERS AS FOR A COMMAND STRING INTRODUCER (CSI). 2145 e9e6 ;RETURN WITH THE PARAMETERS STARTING AT CSIPR0, 2146 e9e6 ; POINTER TO LAST RECEIVED PARAMETER IN X AND CSIPTR, 2147 e9e6 ; (WITH X AND CSIPTR = CSIPRX IF TOO MANY RECEIVED) 2148 e9e6 ; AND TERMINATING CHARACTER IN ACC AND Y. 2149 e9e6 2150 e9e6 ;CLEAR OUT THE PARAMETERS TO ALL ZEROS AND INIT THE PARAM POINTER. 2151 e9e6 a2 74 LDX #CSIPRX ;X = PTR TO LAST PARAMETER 2152 e9e8 a9 00 LDA #0 ;ACC = 00 2153 e9ea ca GETP1 DEX 2154 e9eb 95 00 STA 0,X ;CLEAR THE PARAMETER 2155 e9ed e0 60 CPX #CSIPR0 2156 e9ef d0 f9 BNE GETP1 2157 e9f1 86 5f GETP2 STX CSIPTR ;INITIALIZE PARA POINTER TO FIRST PARAMETER 2158 e9f3 2159 e9f3 ;NOW ACCEPT AND PARSE THE PARAMETERS. 2160 e9f3 20 88 e9 PARLUP JSR GETCHR ;GET THE NEXT CHARACTER 2161 e9f6 PARLUP1 2162 e9f6 a6 5f LDX CSIPTR ;X = PTR TO CURRENT PARAMETER 2163 e9f8 a8 TAY ;SAVE THE CHAR 2164 e9f9 29 f0 AND #$0F0 ;ISOLATE UPPER NIBBLE 2165 e9fb c9 30 CMP #$30 ;TEST FOR AN ASCII NUMERIC 2166 e9fd d0 4b BNE GETPDUN ;NO, TERMINATING CHARACTER, DONE 2167 e9ff 98 TYA ;ACC = THE CHARACTER AGAIN 2168 ea00 c9 3d CMP #"=" ;BINARY MODE INDICATOR? 2169 ea02 d0 11 BNE PARL1 ;NO, CONTINUE 2170 ea04 2171 ea04 ;YES, TWO BYTES FOLLOW, LOW THEN HIGH BYTE. 2172 ea04 20 88 e9 JSR GETCHR ;GET LOW BYTE 2173 ea07 48 PHA ;SAVE IT 2174 ea08 20 88 e9 JSR GETCHR ;GET HIGH BYTE 2175 ea0b a6 5f LDX CSIPTR ;X = PTR TO CURRENT PARAMETER 2176 ea0d 95 01 STA 1,X ;SECOND BYTE IS HIGH BYTE 2177 ea0f 68 PLA 2178 ea10 95 00 STA 0,X ;FIRST IS LOW 2179 ea12 4c f3 e9 JMP PARLUP ;LOOK FOR THE FOLLOWING SEMICOLON 2180 ea15 2181 ea15 c9 3b PARL1 CMP #";" ;PARAMETER TERMINATOR? 2182 ea17 f0 29 BEQ NXTPAR ;YES, ADVANCE TO THE NEXT PARAMETER 2183 ea19 2184 ea19 ;CONTINUATION OF THE CURRENT PARAMETER. INCLUDE THIS DIGIT BY 2185 ea19 ; MULTIPLYING THE OLD PARAMETER BY 10 AND THEN ADDING THE NEW DIGIT 2186 ea19 ; TO IT. 2187 ea19 b5 01 LDA 1,X 2188 ea1b 48 PHA ;PUSH MOST SIG BYTE OF CURRENT PARA 2189 ea1c b5 00 LDA 0,X ;ACC = LEAST SIG BYTE OF CURRENT PARA 2190 ea1e 16 00 ASL 0,X 2191 ea20 36 01 ROL 1,X ;CURRENT PARA MULTIPLIED BY 2 2192 ea22 16 00 ASL 0,X 2193 ea24 36 01 ROL 1,X ;NOW BY 4 2194 ea26 18 CLC 2195 ea27 75 00 ADC 0,X ;ACC = (CURRENT PARA * 5) LOW 2196 ea29 95 00 STA 0,X ;SAVE IT 2197 ea2b 68 PLA 2198 ea2c 75 01 ADC 1,X ;ACC = (CURRENT PARA * 5) HIGH 2199 ea2e 95 01 STA 1,X ;SAVE IT 2200 ea30 16 00 ASL 0,X 2201 ea32 36 01 ROL 1,X ;CURRENT PARA NOW MULTIPLIED BY 10 2202 ea34 98 TYA ;ACC = THE NEW DIGIT JUST RECEIVED 2203 ea35 29 0f AND #$0F ;STRIP TO GET NUMBER FROM 00H TO 09H 2204 ea37 18 CLC 2205 ea38 75 00 ADC 0,X 2206 ea3a 95 00 STA 0,X ;ADD NEW DIGIT TO 10 TIMES OLD PARA 2207 ea3c 90 b5 BCC PARLUP ;IF NO CARRY, WAIT FOR NEXT DIGIT 2208 ea3e f6 01 INC 1,X ;INCLUDE CARRY IN PARA 2209 ea40 b0 b1 BCS PARLUP ;ALWAYS BRANCHES 2210 ea42 2211 ea42 NXTPAR ;SEMICOLON RECEIVED, ADVANCE TO THE NEXT PARAMETER. 2212 ea42 e0 74 CPX #CSIPRX ;MORE THAN FOUR PARAMETERS RECEIVED SO FAR? 2213 ea44 f0 ad BEQ PARLUP ;YES, TOO MANY, IGNORE ANY MORE BY "STICKING" AT THIS 2214 ea46 ; CSIPRX PARAMETER 2215 ea46 e8 INX 2216 ea47 e8 INX 2217 ea48 d0 a7 BNE GETP2 ;INCR PARA PTR TO NEXT PARA & LOOP (ALWAYS BRANCHES) 2218 ea4a 2219 ea4a 98 GETPDUN TYA ;EXIT WITH TERMINATING CHAR IN ACC 2220 ea4b 60 RTS 2221 ea4c 2222 ea4c ;PAGE 2223 ea4c REVCHR ;REVERSE OR UN-REVERSE THE CHARACTER AT THE CURSOR POS'N. TEST THE 2224 ea4c ; REVERSE BIT OF THE ATTRIB BYTE TO DECIDE IF THE REVERSAL IS NEEDED. 2225 ea4c a5 54 LDA ATTRIB 2226 ea4e 29 08 AND #$08 ;REVERSE ATTRIBUTE ON? 2227 ea50 f0 58 BEQ RVCH1 ;NO, DO NOTHING 2228 ea52 a0 45 LDY #REVMSK ;POINT Y TO THE REVERSE MASK 2229 ea54 2230 ea54 EORCHR ;EXCLUSIVE-OR THE CHARACTER POINTED TO BY THE LN0 THROUGH LN11 2231 ea54 ; VARIABLES WITH THE CHARACTER, ON ;PAGE 00, POINTED TO BY REGISTER Y. 2232 ea54 a2 00 LDX #0 ;X = 00 2233 ea56 a1 21 LDA (LN0,X) ;GET THE BYTE 2234 ea58 59 00 00 EOR 0,Y ;EXCLUSIVE OR IT 2235 ea5b 81 21 STA (LN0,X) ;STORE IT BACK 2236 ea5d a1 23 LDA (LN1,X) 2237 ea5f 59 01 00 EOR 1,Y 2238 ea62 81 23 STA (LN1,X) 2239 ea64 a1 25 LDA (LN2,X) 2240 ea66 59 02 00 EOR 2,Y 2241 ea69 81 25 STA (LN2,X) 2242 ea6b a1 27 LDA (LN3,X) 2243 ea6d 59 03 00 EOR 3,Y 2244 ea70 81 27 STA (LN3,X) 2245 ea72 a1 29 LDA (LN4,X) 2246 ea74 59 04 00 EOR 4,Y 2247 ea77 81 29 STA (LN4,X) 2248 ea79 a1 2b LDA (LN5,X) 2249 ea7b 59 05 00 EOR 5,Y 2250 ea7e 81 2b STA (LN5,X) 2251 ea80 a1 2d LDA (LN6,X) 2252 ea82 59 06 00 EOR 6,Y 2253 ea85 81 2d STA (LN6,X) 2254 ea87 a1 2f LDA (LN7,X) 2255 ea89 59 07 00 EOR 7,Y 2256 ea8c 81 2f STA (LN7,X) 2257 ea8e a1 31 LDA (LN8,X) 2258 ea90 59 08 00 EOR 8,Y 2259 ea93 81 31 STA (LN8,X) 2260 ea95 a1 33 LDA (LN9,X) 2261 ea97 59 09 00 EOR 9,Y 2262 ea9a 81 33 STA (LN9,X) 2263 ea9c a1 35 LDA (LN10,X) 2264 ea9e 59 0a 00 EOR 10,Y 2265 eaa1 81 35 STA (LN10,X) 2266 eaa3 a1 37 LDA (LN11,X) 2267 eaa5 59 0b 00 EOR 11,Y 2268 eaa8 81 37 STA (LN11,X) 2269 eaaa 60 RVCH1 RTS 2270 eaab 2271 eaab ;PAGE 2272 eaab EREOL ;ERASE FROM CURSOR POS'N TO END OF LINE. 2273 eaab 20 73 eb JSR DOLN ;RE-COMPUTE THE LN0 - LN11 POINTERS 2274 eaae a9 50 LDA #80 2275 eab0 38 SEC 2276 eab1 e5 52 SBC HCUR ;ACC = 80 - HORIZONTAL CURSOR = # OF CHARS TO THE END 2277 eab3 aa TAX ;X = # OF CHARS 2278 eab4 86 06 STX 6 ;TEMP SAVE # OF CHARS 2279 eab6 a4 21 LDY LN0 2280 eab8 a5 22 LDA LN0+1 2281 eaba 20 d5 ea JSR CLRSUB ;CLEAR THE FIRST SUB-CELL 2282 eabd a4 27 LDY LN3 2283 eabf a5 28 LDA LN3+1 2284 eac1 a6 06 LDX 6 2285 eac3 20 d5 ea JSR CLRSUB ;CLEAR THE SECOND SUB-CELL 2286 eac6 a4 2d LDY LN6 2287 eac8 a5 2e LDA LN6+1 2288 eaca a6 06 LDX 6 2289 eacc 20 d5 ea JSR CLRSUB ;CLEAR THE THIRD SUB-CELL 2290 eacf a4 33 LDY LN9 2291 ead1 a5 34 LDA LN9+1 2292 ead3 a6 06 LDX 6 ;SET UP TO CLEAR THE LAST SUB-CELL 2293 ead5 2294 ead5 CLRSUB ;CLEAR SUB-CELLS. 2295 ead5 ; X NUMBER OF SUB-CELLS TO CLEAR. 2296 ead5 ; Y ADDRESS OF BEGINNING OF CLEARING, LOW 2297 ead5 ; ACC ADDRESS OF BEGINNING OF CLEARING, HIGH 2298 ead5 2299 ead5 ;DO THE CLEARING BY CREATING THREE POINTERS ON ;PAGE 00 TO THE SCREEN: 2300 ead5 ;0,1 PTR TO TOP RASTER LINE IN SUB-CELL 2301 ead5 ;2,3 PTR TO MIDDLE RASTER LINE 2302 ead5 ;4,5 PTR TO BOTTOM RASTER LINE 2303 ead5 2304 ead5 85 01 STA 1 ;SET UP HIGH POINTERS TO TOP, 2305 ead7 18 CLC 2306 ead8 69 20 ADC #$20 ;(LEAVES CARRY CLEAR) 2307 eada 85 03 STA 3 ; MIDDLE, AND 2308 eadc 69 20 ADC #$20 ;(LEAVES CARRY CLEAR) 2309 eade 85 05 STA 5 ; BOTTOM RASTER LINES OF SUB-CELL 2310 eae0 2311 eae0 ;TEMPORARILY SET ATTRIBUTES TO ALL OFF SO SCREEN IS CLEARED TO NORMAL 2312 eae0 ; SPACES. 2313 eae0 78 SEI ;DISABLE INTERRUPTS 2314 eae1 a5 54 LDA ATTRIB 2315 eae3 48 PHA ;SAVE ACC ON STACK 2316 eae4 29 70 AND #$70 ;STRIP ATTRIBUTES EXCEPT FOR SCREEN BRIGHTNESS 2317 eae6 09 04 ORA #$04 ;TAKE ATTRIBUTE FROM LATCH 2318 eae8 85 54 STA ATTRIB ;SAVE IN SOFTWARE 2319 eaea 8d 00 a0 STA ATT ;TELL HARDWARE 2320 eaed 58 CLI ;RE-ENABLE INTERRUPTS 2321 eaee 2322 eaee a9 00 LDA #0 2323 eaf0 85 00 STA 0 2324 eaf2 85 02 STA 2 2325 eaf4 85 04 STA 4 ;BOTH LOW AND HIGH PARTS OF POINTERS NOW SET 2326 eaf6 2327 eaf6 91 00 CLS1 STA (0),Y ;CLEAR TOP RASTER LINE OF THE SUB-CELL 2328 eaf8 91 02 STA (2),Y ;CLEAR MIDDLE RASTER LINE OF THE SUB-CELL 2329 eafa 91 04 STA (4),Y ;CLEAR BOTTOM RASTER LINE OF THE SUB-CELL 2330 eafc c8 INY ;GO TO NEXT SUB-CELL HORIZONTALLY 2331 eafd d0 14 BNE CLS2 ;DIDN'T FALL OFF END OF MEMORY, CONTINUE 2332 eaff e6 01 INC 1 ;ADVANCE MOST SIG BYTE OF ADDRESS PTR TO SUB-CELLS 2333 eb01 e6 03 INC 3 2334 eb03 e6 05 INC 5 2335 eb05 10 0c BPL CLS2 ;CONTINUE IF THE 7X00H PART HASN'T INCREMENTED TO 8000H 2336 eb07 a9 60 LDA #$60 ;DO WRAP AROUND 2337 eb09 85 05 STA 5 ;PUT 6000H INTO 4,5 2338 eb0b a9 40 LDA #$40 2339 eb0d 85 03 STA 3 ;4000H INTO 2,3 2340 eb0f 4a LSR ;CONVERT 40H TO 20H 2341 eb10 85 01 STA 1 ;2000H INTO 0,1 2342 eb12 98 TYA ;ACC = 00 2343 eb13 ca CLS2 DEX ;HAVE ALL SUB-CELLS BEEN CLEARED? 2344 eb14 d0 e0 BNE CLS1 ;NO, CONTINUE 2345 eb16 68 PLA ;OTHERWISE, RESTORE SAVED ATTRIB 2346 eb17 29 7f AND #$7F ;ISOLATE LEAST SIGNIFICANT 7 BITS 2347 eb19 85 aa STA SCRATCH ;SAVE IN 'SCRATCH' IN ZERO ;PAGE RAM 2348 eb1b 78 SEI ;DISABLE INTERRUPTS 2349 eb1c a5 54 LDA ATTRIB ;GET ATTRIBUTE BYTE 2350 eb1e 29 80 AND #$80 ;ISOLATE SOFTWARE BLINK BIT 2351 eb20 05 aa ORA SCRATCH ;COMBINE WITH ATTRIBUTE BYTE 2352 eb22 85 54 STA ATTRIB ;STORE BACK IN ATTRIB 2353 eb24 8d 00 a0 STA ATT ;TELL HARDWARE 2354 eb27 58 CLI ;RE-ENABLE INTERRUPTS 2355 eb28 60 CLS3 RTS 2356 eb29 2357 eb29 ;PAGE 2358 eb29 MOVSUB ;MOVE 80 SUB-CELLS TO A DIFFERENT AREA. 2359 eb29 ;INPUT POINTERS ON ;PAGE ZERO: 2360 eb29 ; 0,1 TOP RASTER LINE OF SOURCE SUB-CELL 2361 eb29 ; 2,3 MIDDLE RASTER LINE 2362 eb29 ; 4,5 BOTTOM RASTER LINE 2363 eb29 2364 eb29 ; 6,7 TOP RASTER LINE OF DESTINATION SUB-CELL 2365 eb29 ; 8,9 MIDDLE RASTER LINE 2366 eb29 ; 10,11 BOTTOM RASTER LINE 2367 eb29 2368 eb29 a0 50 LDY #80 ;MOVE 80 SUB-CELLS, A WHOLE LINE 2369 eb2b a2 00 LDX #0 2370 eb2d a1 00 MVSB1 LDA (0,X) 2371 eb2f 81 06 STA (6,X) ;MOVE TOP, 2372 eb31 a1 02 LDA (2,X) 2373 eb33 81 08 STA (8,X) ; MIDDLE, 2374 eb35 a1 04 LDA (4,X) 2375 eb37 81 0a STA (10,X) ; AND BOTTOM BYTES 2376 eb39 e6 00 INC 0 2377 eb3b e6 02 INC 2 2378 eb3d e6 04 INC 4 ;INCREMENT LOW SOURCE POINTERS 2379 eb3f d0 13 BNE MVSB2 ;NO OVERFLOW, CONTINUE 2380 eb41 e6 01 INC 1 2381 eb43 e6 03 INC 3 2382 eb45 e6 05 INC 5 ;INCREMENT HIGH SOURCE POINTERS 2383 eb47 10 0b BPL MVSB2 ;NO WRAP, CONTINUE 2384 eb49 a9 60 LDA #$60 2385 eb4b 85 05 STA 5 ;WRAP BOTTOM TO 6000H, 2386 eb4d a9 40 LDA #$40 2387 eb4f 85 03 STA 3 ; MIDDLE TO 4000H, 2388 eb51 4a LSR 2389 eb52 85 01 STA 1 ; AND TOP TO 2000H 2390 eb54 e6 06 MVSB2 INC 6 2391 eb56 e6 08 INC 8 2392 eb58 e6 0a INC 10 ;INCREMENT LOW DESTINATION POINTERS 2393 eb5a d0 13 BNE MVSB3 ;NO OVERFLOW, CONTINUE 2394 eb5c e6 07 INC 7 2395 eb5e e6 09 INC 9 2396 eb60 e6 0b INC 11 ;INCREMENT HIGH SOURCE POINTERS 2397 eb62 10 0b BPL MVSB3 ;NO WRAP, CONTINUE 2398 eb64 a9 60 LDA #$60 2399 eb66 85 0b STA 11 ;WRAP BOTTOM TO 6000H, 2400 eb68 a9 40 LDA #$40 2401 eb6a 85 09 STA 9 ; MIDDLE TO 4000H, 2402 eb6c 4a LSR 2403 eb6d 85 07 STA 7 ; AND TOP TO 2000H 2404 eb6f 88 MVSB3 DEY ;MORE SUB-CELLS? 2405 eb70 d0 bb BNE MVSB1 ;YES, CONTINUE 2406 eb72 60 RTS 2407 eb73 2408 eb73 ;PAGE 2409 eb73 DOLN ;COMPUTE THE LN0 THROUGH LN11 VARIABLES GIVEN HCUR, VCUR, AND 2410 eb73 ; THE HARDWARE HOME ADDRESS IN CRTC REGISTERS 12 AND 13. 2411 eb73 ;DO THE COMPUTATION ONLY IF THE LNOK VARIABLE IS ZERO. 2412 eb73 a4 20 LDY LNOK ;ALREADY OK? 2413 eb75 d0 b1 BNE CLS3 ;YES, DONE 2414 eb77 48 DOLN1 PHA ;SAVE ACC 2415 eb78 2416 eb78 ;FIRST COMPUTE THE ADDRESS OF THE TOP RASTER LINE OF THE CURSOR. 2417 eb78 a4 53 LDY VCUR ;Y = CURSOR'S LINE NUMBER 2418 eb7a a5 56 LDA CRTCRG13 ;ACC = CRTC HOME ADDRESS LOW 2419 eb7c 18 CLC 2420 eb7d 79 58 ff ADC LOLINTBL,Y ;ACC = CRTC HOME ADDRESS LOW + OFFSET TO CURSOR LINE 2421 eb80 aa TAX ;X = CURSOR LINE ADDRESS LOW 2422 eb81 a5 55 LDA CRTCRG12 ;ACC = CRTC HOME ADDRESS HIGH 2423 eb83 79 71 ff ADC HILINTBL,Y ;ACC = CRTC HOME ADDRESS HIGH + OFFSET TO CURSOR LINE + 2424 eb86 ; CARRY (LEAVES CARRY CLEAR) 2425 eb86 85 20 STA LNOK ;SET THE LNOK FLAG SO WE WON'T COMPUTE AGAIN 2426 eb88 ; (ACC MUST BE 2000H-3FFFH OR MAYBE 40XX) 2427 eb88 ;ALSO, LNOK IS USED AS A TEMP VARIABLE FOR THIS VALUE 2428 eb88 2429 eb88 ;AT THIS POINT, LNOK,X HOLD THE CURSOR LINE ADDRESS. IT MIGHT BE 2430 eb88 ; GREATER THAN 3FFFH BUT IT IS UNNECESSARY TO WRAP IT AROUND TO 2000H 2431 eb88 ; NOW SINCE IT WILL BE DONE SHORTLY. 2432 eb88 ;ADD THE CURSOR HORIZONTAL OFFSET TO GET THE CURSOR ADDRESS. 2433 eb88 8a TXA 2434 eb89 65 52 ADC HCUR ;ACC = CURSOR ADDRESS LOW 2435 eb8b 2436 eb8b ;SET UP THE ADDRESSES FOR THE FIRST SUB-CELL. 2437 eb8b 85 21 STA LN0 2438 eb8d 85 23 STA LN1 2439 eb8f 85 25 STA LN2 ;ALL LOW BYTES ARE THE SAME 2440 eb91 a5 20 LDA LNOK ;ACC = CURSOR LINE ADDRESS HIGH 2441 eb93 69 00 ADC #0 ;ADD CARRY FROM ADDITION OF CURSOR HORIZONTAL OFFSET 2442 eb95 ;(LEAVES CARRY CLEAR) 2443 eb95 29 1f AND #$1F 2444 eb97 09 20 ORA #$20 ;WRAP 3FFFH AROUND TO 2000H 2445 eb99 85 22 STA LN0+1 ;HIGH BYTES START AT 2000H, 2446 eb9b 69 20 ADC #$20 ;(LEAVES CARRY CLEAR) 2447 eb9d 85 24 STA LN1+1 ; 4000H, 2448 eb9f 69 20 ADC #$20 ;(LEAVES CARRY CLEAR) 2449 eba1 85 26 STA LN2+1 ; AND 6000H 2450 eba3 2451 eba3 ;SET UP THE ADDRESSES FOR THE SECOND SUB-CELL. 2452 eba3 a5 21 LDA LN0 2453 eba5 69 50 ADC #80 ;THIS SUB-CELL STARTS 80 AFTER THE PREVIOUS 2454 eba7 85 27 STA LN3 2455 eba9 85 29 STA LN4 2456 ebab 85 2b STA LN5 ;ALL LOW BYTES ARE THE SAME 2457 ebad a5 22 LDA LN0+1 2458 ebaf 69 00 ADC #0 ;ADD CARRY (LEAVES CARRY LOW) 2459 ebb1 29 1f AND #$1F 2460 ebb3 09 20 ORA #$20 ;WRAP 3FFFH AROUND TO 2000H 2461 ebb5 85 28 STA LN3+1 ;HIGH BYTES START AT 2000H, 2462 ebb7 69 20 ADC #$20 ;(LEAVES CARRY CLEAR) 2463 ebb9 85 2a STA LN4+1 ; 4000H, 2464 ebbb 69 20 ADC #$20 ;(LEAVES CARRY CLEAR) 2465 ebbd 85 2c STA LN5+1 ; AND 6000H 2466 ebbf 2467 ebbf ;SET UP THE ADDRESSES FOR THE THIRD SUB-CELL. 2468 ebbf a5 27 LDA LN3 2469 ebc1 69 50 ADC #80 ;THIS SUB-CELL STARTS 80 AFTER THE PREVIOUS 2470 ebc3 85 2d STA LN6 2471 ebc5 85 2f STA LN7 2472 ebc7 85 31 STA LN8 ;ALL LOW BYTES ARE THE SAME 2473 ebc9 a5 28 LDA LN3+1 2474 ebcb 69 00 ADC #0 ;ADD CARRY (LEAVES CARRY LOW) 2475 ebcd 29 1f AND #$1F 2476 ebcf 09 20 ORA #$20 ;WRAP 3FFFH AROUND TO 2000H 2477 ebd1 85 2e STA LN6+1 ;HIGH BYTES START AT 2000H, 2478 ebd3 69 20 ADC #$20 ;(LEAVES CARRY CLEAR) 2479 ebd5 85 30 STA LN7+1 ; 4000H, 2480 ebd7 69 20 ADC #$20 ;(LEAVES CARRY CLEAR) 2481 ebd9 85 32 STA LN8+1 ; AND 6000H 2482 ebdb 2483 ebdb ;SET UP THE ADDRESSES FOR THE LAST SUB-CELL. 2484 ebdb a5 2d LDA LN6 2485 ebdd 69 50 ADC #80 ;THIS SUB-CELL STARTS 80 AFTER THE PREVIOUS 2486 ebdf 85 33 STA LN9 2487 ebe1 85 35 STA LN10 2488 ebe3 85 37 STA LN11 ;ALL LOW BYTES ARE THE SAME 2489 ebe5 a5 2e LDA LN6+1 2490 ebe7 69 00 ADC #0 ;ADD CARRY (LEAVES CARRY LOW) 2491 ebe9 29 1f AND #$1F 2492 ebeb 09 20 ORA #$20 ;WRAP 3FFFH AROUND TO 2000H 2493 ebed 85 34 STA LN9+1 ;HIGH BYTES START AT 2000H, 2494 ebef 69 20 ADC #$20 ;(LEAVES CARRY CLEAR) 2495 ebf1 85 36 STA LN10+1 ; 4000H, 2496 ebf3 69 20 ADC #$20 ;(LEAVES CARRY CLEAR) 2497 ebf5 85 38 STA LN11+1 ; AND 6000H 2498 ebf7 68 PLA ;RESTORE ACC 2499 ebf8 60 GLNDUN RTS 2500 ebf9 2501 ebf9 ;PAGE 2502 ebf9 NEWGCUR ;MOVE THE CURSOR TO PAR0, PAR1 AND RESET THE TMPXYDOTS. 2503 ebf9 ;PAR0 = X, PAR1 = Y. 2504 ebf9 a5 7a LDA XYDOTS 2505 ebfb 85 7b STA TMPXYDOT ;LINE DRAWN FROM THIS NEW POINT WILL START AT THE 2506 ebfd ; FIRST BIT OF THE MASK 2507 ebfd a2 03 LDX #3 2508 ebff b5 60 NEWGC1 LDA CSIPR0,X ;COPY PAR0 AND PAR1 TO X AND Y 2509 ec01 95 76 STA X,X 2510 ec03 ca DEX 2511 ec04 10 f9 BPL NEWGC1 2512 ec06 20 8b ec JSR XYNG ;FORCE RE-COMPUTATION OF XY VARIABLES 2513 ec09 2514 ec09 DOGLN ;GIVEN A POINT SPECIFIED BY THE COORDINATES IN THE VARIABLES X, Y. 2515 ec09 ; COMPUTE: 2516 ec09 ; XYADDR = THE ADDRESS OF THE BYTE CONTAINING THE POINT 2517 ec09 ; XYMASK = AN 8-BIT MASK WITH THE BIT ON CORRESPONDING TO XY 2518 ec09 2519 ec09 ;DON'T BOTHER WITH COMPUTATION IF THE VALUES HAVE ALREADY BEEN FOUND. 2520 ec09 a5 7d LDA XYOK ;NEED RE-COMPUTATION? 2521 ec0b d0 eb BNE GLNDUN ;NO, DONE 2522 ec0d 2523 ec0d ;COMPUTE X/8, THE BYTE OFFSET FROM THE BEGINNING OF THE LINE. 2524 ec0d ;AT THE SAME TIME, CHECK IF X COORDINATE IS TOO LARGE. 2525 ec0d a5 77 LDA X+1 ;ACC = X HIGH = X/256 2526 ec0f 4a LSR 2527 ec10 85 7e STA XYADDR ;TEMP = X/512 2528 ec12 a5 76 LDA X ;ACC = X LOW 2529 ec14 6a ROR ;X HAS NOW BEEN DIVIDED BY 2, DOUBLE PRECISION 2530 ec15 46 7e LSR XYADDR ;TEMP = X/1024 2531 ec17 d0 6c BNE NOPLOT ;IF NOT ZERO, X IS 1024 OR MORE, DON'T PLOT 2532 ec19 6a ROR ;X HAS NOW BEEN DIVIDED BY 4, DOUBLE PRECISION 2533 ec1a 2534 ec1a ;FROM THIS POINT ON, WE CAN DEAL WITH SINGLE PRECISION ONLY FOR X. 2535 ec1a c9 a0 CMP #640/4 ;WAS X GREATER THAN 639? 2536 ec1c b0 67 BCS NOPLOT ;YES, DON'T PLOT 2537 ec1e 4a LSR ;X HAS NOW BEEN DIVIDED BY 8 2538 ec1f aa TAX ;REG X = BYTE OFFSET ON RASTER LINE 2539 ec20 2540 ec20 ;CHECK IF Y COORDINATE IS NOT TOO LARGE. 2541 ec20 a5 78 LDA Y ;ACC = Y LOW 2542 ec22 a4 79 LDY Y+1 ;REG Y = Y/256 = Y HIGH 2543 ec24 f0 08 BEQ DOGLN1 ;Y IS 255 OR LESS, NO NEED TO CHECK FURTHER 2544 ec26 88 DEY 2545 ec27 d0 5c BNE NOPLOT ;IF NOT ZERO, Y IS 512 OR MORE, DON'T PLOT 2546 ec29 c8 INY ;REG Y = Y HIGH 2547 ec2a c9 2c CMP #< 300 ;WAS Y GREATER THAN 299? 2548 ec2c b0 57 BCS NOPLOT ;YES, DON'T PLOT 2549 ec2e DOGLN1 ;ACC = Y LOW, REG Y = Y HIGH 2550 ec2e 2551 ec2e ;MULTIPLY Y BY 2 FOR USE AS ON OFFSET IN THE GRAPHICS LINE TABLE. 2552 ec2e 0a ASL 2553 ec2f 85 7e STA XYADDR ;TEMP = Y * 2 LOW 2554 ec31 98 TYA 2555 ec32 2a ROL ;ACC = Y * 2 HIGH (LEAVES CARRY CLEAR) 2556 ec33 2557 ec33 ;ADD OFFSET IN TABLE TO START ADDRESS OF TABLE, ASSUMED TO START ON 2558 ec33 ; A ;PAGE BOUNDARY. 2559 ec33 69 fd ADC #> GLNTBL 2560 ec35 85 7f STA XYADDR+1 ;TEMP+1 = Y * 2 HIGH 2561 ec37 ;AT THIS POINT, XYADDR TEMPORARILY HAS PTR TO GRAPHICS 2562 ec37 ; RASTER LINE TABLE 2563 ec37 85 7d STA XYOK ;SET FLAG SO NEXT TIME WE WON'T COMPUTE AGAIN 2564 ec39 ; (ACC MUST BE NON-ZERO HERE, I.E. GLNTBL OR HIGHER) 2565 ec39 2566 ec39 ;ADD RASTER LINE OFFSET IN REG X TO GRAPHICS TABLE ENTRY TO 2567 ec39 ; GET TOTAL OFFSET FROM HOME ADDRESS. 2568 ec39 8a TXA 2569 ec3a a0 00 LDY #0 2570 ec3c 71 7e ADC (XYADDR),Y ;ADD LOW BYTES 2571 ec3e aa TAX ;TEMP SAVE OFFSET 2572 ec3f c8 INY ;ADVANCE Y TO READ HIGH PART OF TABLE ENTRY 2573 ec40 b1 7e LDA (XYADDR),Y 2574 ec42 a8 TAY ;REG Y = OFFSET TO BEG OF LINE HIGH 2575 ec43 69 00 ADC #0 ;ADD CARRY TO HIGH BYTE (LEAVES CARRY LOW) 2576 ec45 85 7f STA XYADDR+1 ;TEMP SAVE OFFSET HIGH 2577 ec47 2578 ec47 ;NOW ADD THE TOTAL OFFSET TO THE HOME ADDRESS FROM THE CRTC. 2579 ec47 8a TXA ;ACC = OFFSET LOW 2580 ec48 65 56 ADC CRTCRG13 ;ADD CRTC HOME ADDRESS LOW 2581 ec4a 85 7e STA XYADDR ;LOW NOW SETUP 2582 ec4c a5 7f LDA XYADDR+1 2583 ec4e 65 55 ADC CRTCRG12 ;ADD HIGH BYTES 2584 ec50 29 1f AND #$1F ;STRIP OFF ALL BUT OFFSET WITHIN THE 2000H LONG BLOCK 2585 ec52 85 7f STA XYADDR+1 ;TEMP SAVE OFFSET 2586 ec54 98 TYA ;REG Y = OFFSET TO BEG OF LINE HIGH 2587 ec55 29 e0 AND #$0E0 ;STRIP OFF ALL BUT CORRECT 2000H LONG BLOCK 2588 ec57 05 7f ORA XYADDR+1 ;ACC = CORRECT HIGH ADDRESS 2589 ec59 85 7f STA XYADDR+1 ;XYADDR NOW SETUP 2590 ec5b 2591 ec5b ;COMPUTE THE BIT MASK. 2592 ec5b a5 76 LDA X 2593 ec5d 29 07 AND #$07 ;STRIP ALL BUT THE BIT INFORMATION, I.E. X MOD 8 2594 ec5f a8 TAY 2595 ec60 b9 8b ff LDA BITPAT,Y ;ACC = THE BIT MASK 2596 ec63 85 80 STA XYMASK ;MASK NOW SETUP 2597 ec65 60 RTS 2598 ec66 2599 ec66 ;PAGE 2600 ec66 DOXSTEP ;STEP X BY -1, 0, OR +1 DEPENDING ON THE XSTEP. 2601 ec66 ;EITHER LEAVE THE XY VARIABLES CORRECTLY SET UP, OR CLEAR XYOK SO 2602 ec66 ; THEY'LL BE RE-COMPUTED. 2603 ec66 a5 85 LDA XSTEP ;TEST STEP DIRECTION 2604 ec68 f0 25 BEQ XYDONE ;ZERO, DON'T STEP AFTER ALL 2605 ec6a 30 24 BMI DOXMI ;NEGATIVE, STEP TO THE LEFT 2606 ec6c 2607 ec6c ;XSTEP POSITIVE, STEP TO THE RIGHT. 2608 ec6c e6 76 INC X 2609 ec6e d0 02 BNE DOXPL1 ;NO OVERFLOW, CONTINUE 2610 ec70 e6 77 INC X+1 2611 ec72 DOXPL1 2612 ec72 2613 ec72 ;NOW FIX THE XYMASK 2614 ec72 46 80 LSR XYMASK ;THE BIT SHIFTS TO THE RIGHT 2615 ec74 90 19 BCC XYDONE ;STILL IN THE SAME BYTE, DONE 2616 ec76 2617 ec76 ;SEE IF X IS NOW BEYOND 639. 2618 ec76 a5 76 LDA X 2619 ec78 c9 80 CMP #< 640 2620 ec7a f0 0f BEQ XYNG ;IF MATCH, MIGHT BE BEYOND SO RE-CALCULATE SINCE 2621 ec7c ; IT NEVER HURTS TO DO SO 2622 ec7c 2623 ec7c ;GO THE NEXT BYTE. 2624 ec7c a9 80 LDA #$80 2625 ec7e 85 80 STA XYMASK ;NEW MASK FOR NEXT BYTE 2626 ec80 e6 7e INC XYADDR 2627 ec82 f0 07 BEQ XYNG ;AT MEMORY ;PAGE BOUNDARIES, RE-COMPUTE BECAUSE OF 2628 ec84 ; THE POSSIBLE PROBLEMS WITH WRAPAROUND 2629 ec84 60 RTS 2630 ec85 2631 ec85 NOPLOT ;SET UP THE VARIABLES SO THAT A POINT PLOT WON'T HURT ANYTHING. 2632 ec85 a9 ff LDA #$0FF 2633 ec87 85 7e STA XYADDR 2634 ec89 85 7f STA XYADDR+1 ;POINT TO PROM 2635 ec8b a9 00 XYNG LDA #0 2636 ec8d 85 7d STA XYOK ;FORCE RE-COMPUTATION 2637 ec8f 60 XYDONE RTS 2638 ec90 2639 ec90 DOXMI ;XSTEP NEGATIVE, STEP TO THE LEFT. 2640 ec90 a5 76 LDA X 2641 ec92 d0 02 BNE DOXMI1 ;WON'T BE UNDERFLOW, CONTINUE 2642 ec94 c6 77 DEC X+1 2643 ec96 c6 76 DOXMI1 DEC X 2644 ec98 2645 ec98 ;NOW FIX THE XYMASK 2646 ec98 06 80 ASL XYMASK ;THE BIT SHIFTS TO THE LEFT 2647 ec9a 90 f3 BCC XYDONE ;STILL IN THE SAME BYTE, DONE 2648 ec9c 2649 ec9c ;SEE IF X IS NOW LESS THAN 0. 2650 ec9c a5 77 LDA X+1 2651 ec9e 30 eb BMI XYNG ;YES, FORCE RE-COMPUTATION 2652 eca0 2653 eca0 ;GO THE PREVIOUS BYTE. 2654 eca0 a9 01 LDA #$01 2655 eca2 85 80 STA XYMASK ;NEW MASK FOR PREVIOUS BYTE 2656 eca4 a5 7e LDA XYADDR 2657 eca6 f0 e3 BEQ XYNG ;AT MEMORY ;PAGE BOUNDARIES, RE-COMPUTE BECAUSE OF 2658 eca8 ; THE POSSIBLE PROBLEMS WITH WRAPAROUND 2659 eca8 c6 7e DEC XYADDR 2660 ecaa 60 RTS 2661 ecab 2662 ecab ;PAGE 2663 ecab DOYSTEP ;STEP Y BY -1, 0, OR +1 DEPENDING ON THE YSTEP. 2664 ecab ;EITHER LEAVE THE XY VARIABLES CORRECTLY SET UP, OR CLEAR XYOK SO 2665 ecab ; THEY'LL BE RE-COMPUTED. 2666 ecab a5 86 LDA YSTEP ;TEST STEP DIRECTION 2667 ecad f0 e0 BEQ XYDONE ;ZERO, DON'T STEP AFTER ALL 2668 ecaf 30 16 BMI DOYMI ;NEGATIVE, STEP UPWARDS 2669 ecb1 2670 ecb1 ;YSTEP POSITIVE, STEP DOWNWARDS. 2671 ecb1 e6 78 INC Y 2672 ecb3 d0 02 BNE DOYPL1 ;NO OVERFLOW, CONTINUE 2673 ecb5 e6 79 INC Y+1 2674 ecb7 DOYPL1 2675 ecb7 2676 ecb7 ;SEE IF Y IS NOW BEYOND 299. 2677 ecb7 a5 78 LDA Y 2678 ecb9 c9 2c CMP #< 300 2679 ecbb f0 ce BEQ XYNG ;IF MATCH, MIGHT BE BEYOND SO RE-CALCULATE SINCE 2680 ecbd ; IT NEVER HURTS TO DO SO 2681 ecbd 2682 ecbd ;NOW UPDATE THE ADDRESS. 2683 ecbd a5 7f LDA XYADDR+1 2684 ecbf 18 CLC 2685 ecc0 69 20 ADC #$20 ;JUST ADD 2000H TO THE ADDRESS TO GO TO THE NEXT LINE 2686 ecc2 ; IN THE SAME SUB-CELL 2687 ecc2 30 c7 BMI XYNG ;IF SUB-CELL EXCEEDED, RE-COMPUTE 2688 ecc4 85 7f STA XYADDR+1 2689 ecc6 60 RTS 2690 ecc7 2691 ecc7 DOYMI ;YSTEP NEGATIVE, STEP UPWARDS. 2692 ecc7 a5 78 LDA Y 2693 ecc9 d0 02 BNE DOYMI1 ;WON'T BE UNDERFLOW, CONTINUE 2694 eccb c6 79 DEC Y+1 2695 eccd c6 78 DOYMI1 DEC Y 2696 eccf 2697 eccf ;SEE IF Y IS NOW LESS THAN 0. 2698 eccf a5 79 LDA Y+1 2699 ecd1 30 b8 BMI XYNG ;YES, FORCE RE-COMPUTATION 2700 ecd3 2701 ecd3 ;NOW UPDATE THE ADDRESS. 2702 ecd3 a5 7f LDA XYADDR+1 2703 ecd5 38 SEC 2704 ecd6 e9 20 SBC #$20 ;JUST SUBTRACT 2000H FROM THE ADDRESS TO GO TO THE 2705 ecd8 ; PREVIOUS LINE IN THE SAME SUB-CELL 2706 ecd8 c9 20 CMP #$20 ;ADDRESS NOW LESS THAN 2000H? 2707 ecda 90 af BCC XYNG ;YES, SUB-CELL EXCEEDED, RE-COMPUTE 2708 ecdc 85 7f STA XYADDR+1 2709 ecde 60 RTS 2710 ecdf 2711 ecdf ;PAGE 2712 ecdf POINT ;PLOT A POINT AT (X,Y). 2713 ecdf ;DO THE PLOT OR NOT, DEPENDING ON THE NEXT BIT ROTATED IN TMPXYDOT. 2714 ecdf ; (THIS ALLOWS DOTTED, DASHED, DOT-DASHED, ETC.) 2715 ecdf ;IF IT IS DONE, DO A BIT SET, RESET, OR TOGGLE DEPENDING ON XYOPR. 2716 ecdf a5 7b LDA TMPXYDOT 2717 ece1 2a ROL ;CARRY = TMPXYDOT BIT 7 2718 ece2 26 7b ROL TMPXYDOT ;CIRCULAR ROTATE TMPXYDOT LEFT 2719 ece4 90 13 BCC PDONE ;IF MOST SIG BIT OF ROTATED DOTS CLEAR, DON'T PLOT 2720 ece6 20 09 ec PNT JSR DOGLN 2721 ece9 a0 00 LDY #0 2722 eceb a5 80 LDA XYMASK 2723 eced a6 7c LDX XYOPR 2724 ecef f0 09 BEQ PSET ;XYOPR = 0, SET THE BIT 2725 ecf1 30 0c BMI PTOG ;XYOPR NEGATIVE, TOGGLE THE BIT 2726 ecf3 2727 ecf3 ;XYOPR POSITIVE, RESET THE BIT. 2728 ecf3 49 ff EOR #$0FF ;INVERT THE MASK 2729 ecf5 31 7e AND (XYADDR),Y ;"AND" IT WITH THE CURRENT SCREEN 2730 ecf7 91 7e STA (XYADDR),Y ;WRITE NEW VALUE 2731 ecf9 PDONE 2732 ecf9 60 RTS 2733 ecfa 2734 ecfa ;XYOPR ZERO, SET THE BIT. 2735 ecfa 11 7e PSET ORA (XYADDR),Y ;"OR" THE MASK WITH THE CURRENT SCREEN 2736 ecfc 91 7e STA (XYADDR),Y ;WRITE THE NEW VALUE 2737 ecfe 60 RTS 2738 ecff 2739 ecff ;XYOPR NEGATIVE, TOGGLE THE BIT. 2740 ecff 51 7e PTOG EOR (XYADDR),Y ;"EOR" THE MASK WITH THE CURRENT SCREEN 2741 ed01 91 7e STA (XYADDR),Y ;WRITE THE NEW VALUE 2742 ed03 60 RTS 2743 ed04 2744 ed04 ;PAGE 2745 ed04 XPLUSY ;ADD MEMORY POINTED TO BY Y TO MEMORY POINTED TO BY X, STORE IN MEMORY 2746 ed04 ; POINTED TO BY X. DO THIS DOUBLE PRECISION. DON'T CHANGE XY. 2747 ed04 18 CLC 2748 ed05 b5 00 LDA 0,X 2749 ed07 79 00 00 ADC 0,Y 2750 ed0a 95 00 STA 0,X 2751 ed0c b5 01 LDA 1,X 2752 ed0e 79 01 00 ADC 1,Y 2753 ed11 95 01 STA 1,X 2754 ed13 60 RTS 2755 ed14 2756 ed14 XMINUSY ;SUBTRACT MEMORY POINTED TO BY X FROM MEMORY POINTED TO BY Y, STORE IN 2757 ed14 ; MEMORY POINTED TO BY X. DO THIS DOUBLE PRECISION. DON'T CHANGE XY. 2758 ed14 38 SEC 2759 ed15 b5 00 LDA 0,X 2760 ed17 f9 00 00 SBC 0,Y 2761 ed1a 95 00 STA 0,X 2762 ed1c b5 01 LDA 1,X 2763 ed1e f9 01 00 SBC 1,Y 2764 ed21 95 01 STA 1,X 2765 ed23 60 RTS 2766 ed24 2767 ed24 MOV2W ;MOVE TWO WORDS FROM MEMORY POINTED TO BY Y TO MEMORY POINTED TO BY X. 2768 ed24 ; DON'T CHANGE XY. 2769 ed24 b9 02 00 LDA 2,Y 2770 ed27 95 02 STA 2,X 2771 ed29 b9 03 00 LDA 3,Y 2772 ed2c 95 03 STA 3,X 2773 ed2e 2774 ed2e MOV1W ;MOVE ONE WORD FROM MEMORY POINTED TO BY Y TO MEMORY POINTED TO BY X. 2775 ed2e ; DON'T CHANGE XY. 2776 ed2e b9 00 00 LDA 0,Y 2777 ed31 95 00 STA 0,X 2778 ed33 b9 01 00 LDA 1,Y 2779 ed36 95 01 STA 1,X 2780 ed38 60 RTS 2781 ed39 2782 ed39 XMULT ;MULTIPLY MEMORY WORD POINTED TO BY X BY THE NUMBER IN Y. 2783 ed39 ; DON'T CHANGE X. USE TEMPORARY VARIABLES 0, 1, 2. 2784 ed39 b5 00 LDA 0,X 2785 ed3b 85 00 STA 0 2786 ed3d 15 01 ORA 1,X 2787 ed3f f0 13 BEQ RTS6 ;IF ORIGINAL NUMBER IS ZERO, FAST EXIT 2788 ed41 84 02 STY 2 ;SAVE THE NUMBER TO MULTIPLY BY 2789 ed43 b5 01 LDA 1,X 2790 ed45 85 01 STA 1 ;COPY THE ORIGINAL NUMBER TO 0,1 2791 ed47 a0 00 LDY #0 2792 ed49 94 00 STY 0,X 2793 ed4b 94 01 STY 1,X ;CLEAR THE "ACCUMULATOR" 2794 ed4d 20 04 ed XMLT1 JSR XPLUSY ;ADD THE ORIGINAL NUMBER TO THE "ACCUMULATOR" 2795 ed50 c6 02 DEC 2 ; AS MANY TIMES AS SPECIFIED 2796 ed52 d0 f9 BNE XMLT1 2797 ed54 60 RTS6 RTS 2798 ed55 2799 ed55 DODX ;"APPLY" THE XSTEP TO THE WORD POINTED TO BY X, I.E. IF XSTEP IS -1 2800 ed55 ; THEN NEGATE THE WORD. 2801 ed55 a5 85 LDA XSTEP ;TEST XSTEP 2802 ed57 10 0d BPL RTS5 ;XTEP IS +1, LEAVE THE WORD ALONE 2803 ed59 ;ELSE, -1, NEGATE THE WORD 2804 ed59 a9 00 XNEG LDA #0 2805 ed5b 38 SEC 2806 ed5c f5 00 SBC 0,X 2807 ed5e 95 00 STA 0,X 2808 ed60 a9 00 LDA #0 2809 ed62 f5 01 SBC 1,X 2810 ed64 95 01 STA 1,X 2811 ed66 60 RTS5 RTS 2812 ed67 2813 ed67 DODY ;"APPLY" THE YSTEP TO THE WORD POINTED TO BY X, AS ABOVE. 2814 ed67 a5 86 LDA YSTEP ;TEST YSTEP 2815 ed69 30 ee BMI XNEG ;YSTEP IS -1, NEGATE THE WORD 2816 ed6b 60 RTS ;YSTEP IS +1, LEAVE THE WORD ALONE 2817 ed6c 2818 ed6c QUADRNT ;COMPUTE THE QUADRANT IN WHICH (X1,Y1) RESIDES, ASSUMING THAT A 2819 ed6c ; COUNTER-CLOCKWISE ARC IS TO BE DRAWN. 2820 ed6c 2821 ed6c ; Y 2822 ed6c ; ^ QUADRANT ACC ON OUTPUT 2823 ed6c ; II ! I I 0 2824 ed6c ; ! II 1 2825 ed6c ; -----------------> X III 2 2826 ed6c ; ! IV 3 2827 ed6c ; III ! IV AT THE CENTER -1 2828 ed6c ; ! 2829 ed6c 2830 ed6c a5 82 LDA X1+1 ;SENSE SIGN OF X1 2831 ed6e 30 0e BMI QDR1 ;MINUS, MUST BE II OR III 2832 ed70 05 81 ORA X1 ;SENSE IF X1 = 0 2833 ed72 f0 18 BEQ QDR2 ;X1 = 0, MUST BE IV, II, OR ERROR 2834 ed74 ;ELSE, X1 IS POSITIVE, MUST BE I OR IV 2835 ed74 a5 84 LDA Y1+1 ;SENSE SIGN OF Y1 2836 ed76 30 03 BMI QIV ;MINUS, QUADRANT IV 2837 ed78 a9 00 LDA #0 ;Y1 IS ZERO OR POSITIVE, QUADRANT I 2838 ed7a 60 RTS 2839 ed7b 2840 ed7b a9 03 QIV LDA #3 2841 ed7d 60 RTS 2842 ed7e 2843 ed7e a5 84 QDR1 LDA Y1+1 ;SENSE SIGN OF Y1 2844 ed80 30 07 BMI QIII ;MINUS, QUADRANT III 2845 ed82 05 83 ORA Y1 ;SENSE IF Y1 = 0 2846 ed84 f0 03 BEQ QIII ;Y1 = 0, QUADRANT III 2847 ed86 a9 01 QII LDA #1 ;QUADRANT II 2848 ed88 60 RTS 2849 ed89 2850 ed89 a9 02 QIII LDA #2 2851 ed8b 60 RTS 2852 ed8c 2853 ed8c a5 84 QDR2 LDA Y1+1 ;SENSE SIGN OF Y1 2854 ed8e 30 eb BMI QIV ;MINUS, QUADRANT IV 2855 ed90 05 83 ORA Y1 ;SENSE IF Y1 = 0 2856 ed92 d0 f2 BNE QII ;Y1 IS POSITIVE, QUADRANT II 2857 ed94 a9 ff LDA #-1 ;BOTH X1 AND Y1 ARE 0, ERROR 2858 ed96 60 RTS 2859 ed97 2860 ed97 DIFFS ;COMPUTE ALL FIRST AND SECOND ORDER DIFFERENTIALS FOR THE DDA ALGORITHM. 2861 ed97 ; RETURN S = TRUE IF UNTENABLE (X1,Y1), I.E. AT THE CENTER. 2862 ed97 2863 ed97 ;DETERMINE THE QUADRANT THAT (X1,Y1) IS IN AND SET X AND Y STEPS 2864 ed97 ; AND DELTAS, AS APPROPRIATE. 2865 ed97 20 6c ed JSR QUADRNT 2866 ed9a 30 ca BMI RTS5 2867 ed9c 85 a1 STA QUAD ;SAVE THE CURRENT QUADRANT 2868 ed9e aa TAX ;X = THE QUADRANT, 0 TO 3 2869 ed9f bd 93 ff LDA QSTEPX,X ;READ CORRESPONDING XSTEP FROM TABLE 2870 eda2 85 85 STA XSTEP ;X STEP SET TO +1 OR -1 AS A BYTE 2871 eda4 85 87 STA XDELTA 2872 eda6 30 02 BMI ARC2A 2873 eda8 a9 00 LDA #0 2874 edaa 85 88 ARC2A STA XDELTA+1 ;X DELTA SET TO +1 OR -1 AS A WORD 2875 edac bd 97 ff LDA QSTEPY,X ;SAME FOR YSTEP 2876 edaf 85 86 STA YSTEP 2877 edb1 85 89 STA YDELTA 2878 edb3 30 02 BMI ARC2B 2879 edb5 a9 00 LDA #0 2880 edb7 85 8a ARC2B STA YDELTA+1 2881 edb9 2882 edb9 ;INITIALIZE THE DIFFERENTIALS FOR THE DDA ALGORITHM. 2883 edb9 ;FIRST THE SECOND ORDER TERMS. 2884 edb9 a0 9d LDY #BSQ 2885 edbb a2 95 LDX #DDZX 2886 edbd 20 24 ed JSR MOV2W ;DDZ(X) = B SQUARED, DDZ(Y) = A SQUARED 2887 edc0 20 04 ed JSR XPLUSY ;DDZX = 2 (B*B) 2888 edc3 a0 9f LDY #ASQ 2889 edc5 a2 97 LDX #DDZY 2890 edc7 20 04 ed JSR XPLUSY ;DDZY = 2 (A*A) 2891 edca 2892 edca ;NOW (PARTIALLY) THE FIRST ORDER TRIAL TERMS. 2893 edca a0 81 LDY #X1 2894 edcc a2 99 LDX #DZTX 2895 edce 20 24 ed JSR MOV2W ;DZT(X) = X, DZT(Y) = Y 2896 edd1 2897 edd1 a4 9d LDY BSQ ;REG Y = B SQUARED 2898 edd3 20 39 ed JSR XMULT ;DZT(X) = (B*B) X 2899 edd6 a0 02 LDY #2 ;MULTIPLING FACTOR OF 2 2900 edd8 20 39 ed JSR XMULT ;DZT(X) = 2 (B*B) X 2901 eddb 20 55 ed JSR DODX ;DZT(X) = (B*B) X DX 2902 edde 2903 edde a4 9f LDY ASQ ;REG Y = A SQUARED 2904 ede0 a2 9b LDX #DZTY 2905 ede2 20 39 ed JSR XMULT ;DZT(Y) = (A*A) Y 2906 ede5 a0 02 LDY #2 ;MULTIPLING FACTOR OF 2 2907 ede7 20 39 ed JSR XMULT ;DZT(Y) = 2 (A*A) Y 2908 edea 20 67 ed JSR DODY ;DZT(Y) = (A*A) Y DY 2909 eded 2910 eded ; AND THE FIRST ORDER NORMAL TERMS. 2911 eded a0 99 LDY #DZTX 2912 edef a2 91 LDX #DZX 2913 edf1 20 24 ed JSR MOV2W ;DZ(X) = 2 (B*B) X DX, DZ(Y) = 2 (A*A) Y DY 2914 edf4 2915 edf4 a0 9d LDY #BSQ 2916 edf6 20 04 ed JSR XPLUSY ;DZ(X) = 2 (B*B) X DX + (B*B) 2917 edf9 2918 edf9 a2 93 LDX #DZY 2919 edfb a0 9f LDY #ASQ 2920 edfd 20 04 ed JSR XPLUSY ;DZ(Y) = 2 (A*A) Y DY + (A*A) 2921 ee00 2922 ee00 ;NOW COMPLETE THE FIRST ORDER NORMAL TERMS. 2923 ee00 a0 9d LDY #BSQ 2924 ee02 a2 00 LDX #0 2925 ee04 20 24 ed JSR MOV2W ;0,1 = (B*B) 2,3 = (A*A) 2926 ee07 46 01 LSR 1 2927 ee09 66 00 ROR 0 2928 ee0b 46 01 LSR 1 2929 ee0d 66 00 ROR 0 ;0,1 = (B*B)/4 2930 ee0f 46 03 LSR 3 2931 ee11 66 02 ROR 2 2932 ee13 46 03 LSR 3 2933 ee15 66 02 ROR 2 ;2,3 = (A*A)/4 2934 ee17 a0 00 LDY #0 2935 ee19 a2 99 LDX #DZTX 2936 ee1b 20 04 ed JSR XPLUSY ;DZT(X) = (B*B) X DX + (B*B)/4 2937 ee1e a0 02 LDY #2 2938 ee20 a2 9b LDX #DZTY 2939 ee22 20 04 ed JSR XPLUSY ;DZT(Y) = (A*A) Y DY + (A*A)/4 2940 ee25 2941 ee25 a9 01 LDA #1 2942 ee27 60 RTS ;RETURN S = FALSE 2943 ee28 2944 ee28 XX ;PLOT THE POINT (X1,Y1). DETERMINE IF THIS POINT IS AT THE END POINT 2945 ee28 ; AND RETURN Z = TRUE IF SO. IF NOT, UNCONDITIONALLY STEP X AND 2946 ee28 ; CONDITIONALLY STEP Y. RETURN Z FALSE. 2947 ee28 2948 ee28 20 df ec JSR POINT ;PLOT A POINT 2949 ee2b a5 a1 LDA QUAD 2950 ee2d c5 a2 CMP ENDQUAD ;ARE WE IN THE END POINT'S QUADRANT? 2951 ee2f d0 0d BNE XX1 ;NO, CONTINUE 2952 ee31 a5 81 LDA X1 2953 ee33 c5 66 CMP CSIPR3 2954 ee35 d0 07 BNE XX1 2955 ee37 a5 82 LDA X1+1 2956 ee39 c5 67 CMP CSIPR3+1 2957 ee3b d0 01 BNE XX1 2958 ee3d 60 RTS 2959 ee3e 2960 ee3e XX1 ;STEP X1 BY DELTA X, Z BY DZX, DZX AND DZTX BY DDZX, AND X BY X STEP. 2961 ee3e 20 a0 ee JSR YY3 2962 ee41 2963 ee41 ;SEE IF WE MUST STEP Y1 BY SEEING IF A Y1 STEP OF 1/2 WOULD GO TO THE 2964 ee41 ; OTHER SIDE OF THE CIRCLE. 2965 ee41 a5 8c LDA Z+1 2966 ee43 45 94 EOR DZY+1 2967 ee45 10 2a BPL XX2 ;IF Z AND DZY HAVE THE SAME SIGN, THEN STEPPING Y1 2968 ee47 ; CAN NEVER HELP 2969 ee47 a5 8b LDA Z 2970 ee49 18 CLC 2971 ee4a 65 9b ADC DZTY 2972 ee4c a5 8c LDA Z+1 2973 ee4e 65 9c ADC DZTY+1 2974 ee50 45 8c EOR Z+1 2975 ee52 30 1d BMI XX2 ;IF Z + DZTY CHANGES SIGN THEN DON'T DO Y1 STEP 2976 ee54 2977 ee54 ;STEP Y1 BY DELTA Y, Z BY DZY, DZY AND DZTY BY DDZY, AND Y BY Y STEP. 2978 ee54 a0 89 XX3 LDY #YDELTA 2979 ee56 a2 83 LDX #Y1 2980 ee58 20 04 ed JSR XPLUSY 2981 ee5b a0 93 LDY #DZY 2982 ee5d a2 8b LDX #Z 2983 ee5f 20 04 ed JSR XPLUSY 2984 ee62 a0 97 LDY #DDZY 2985 ee64 a2 93 LDX #DZY 2986 ee66 20 04 ed JSR XPLUSY 2987 ee69 a2 9b LDX #DZTY 2988 ee6b 20 04 ed JSR XPLUSY 2989 ee6e 20 ab ec JSR DOYSTEP 2990 ee71 a9 01 XX2 LDA #1 2991 ee73 60 RTS ;RETURN Z FALSE 2992 ee74 2993 ee74 YY ;PLOT THE POINT (X1,Y1). DETERMINE IF THIS POINT IS AT THE END POINT 2994 ee74 ; AND RETURN Z = TRUE IF SO. IF NOT, UNCONDITIONALLY STEP Y AND 2995 ee74 ; CONDITIONALLY STEP X. RETURN Z FALSE. 2996 ee74 2997 ee74 20 df ec JSR POINT ;PLOT A POINT 2998 ee77 a5 a1 LDA QUAD 2999 ee79 c5 a2 CMP ENDQUAD ;ARE WE IN THE END POINT'S QUADRANT? 3000 ee7b d0 0d BNE YY1 ;NO, CONTINUE 3001 ee7d a5 83 LDA Y1 3002 ee7f c5 68 CMP CSIPR4 3003 ee81 d0 07 BNE YY1 3004 ee83 a5 84 LDA Y1+1 3005 ee85 c5 69 CMP CSIPR4+1 3006 ee87 d0 01 BNE YY1 3007 ee89 60 RTS 3008 ee8a 3009 ee8a YY1 ;STEP Y1 BY DELTA Y, Z BY DZY, DZY AND DZTY BY DDZY, AND Y BY Y STEP. 3010 ee8a 20 54 ee JSR XX3 3011 ee8d 3012 ee8d ;SEE IF WE MUST STEP X1 BY SEEING IF A X1 STEP OF 1/2 WOULD GO TO THE 3013 ee8d ; OTHER SIDE OF THE CIRCLE. 3014 ee8d a5 8c LDA Z+1 3015 ee8f 45 92 EOR DZX+1 3016 ee91 10 2a BPL YY2 ;IF Z AND DZX HAVE THE SAME SIGN, THEN STEPPING X1 3017 ee93 ; CAN NEVER HELP 3018 ee93 a5 8b LDA Z 3019 ee95 18 CLC 3020 ee96 65 99 ADC DZTX 3021 ee98 a5 8c LDA Z+1 3022 ee9a 65 9a ADC DZTX+1 3023 ee9c 45 8c EOR Z+1 3024 ee9e 30 1d BMI YY2 ;IF Z + DZTX CHANGES SIGN THEN DON'T DO X1 STEP 3025 eea0 3026 eea0 ;STEP X1 BY DELTA X, Z BY DZX, DZX AND DZTX BY DDZX, AND X BY X STEP. 3027 eea0 a0 87 YY3 LDY #XDELTA 3028 eea2 a2 81 LDX #X1 3029 eea4 20 04 ed JSR XPLUSY 3030 eea7 a0 91 LDY #DZX 3031 eea9 a2 8b LDX #Z 3032 eeab 20 04 ed JSR XPLUSY 3033 eeae a0 95 LDY #DDZX 3034 eeb0 a2 91 LDX #DZX 3035 eeb2 20 04 ed JSR XPLUSY 3036 eeb5 a2 99 LDX #DZTX 3037 eeb7 20 04 ed JSR XPLUSY 3038 eeba 20 66 ec JSR DOXSTEP 3039 eebd a9 01 YY2 LDA #1 3040 eebf 60 RTS7 RTS ;RETURN Z FALSE 3041 eec0 3042 eec0 TRANS ;DETECT A TRANSITION FROM STEPPING X OR Y TO STEPPING THE OTHER WHEN 3043 eec0 ; WE REACH 45 DEGREES, I.E. WHEN DZX + DZY IS NO LONGER NEGATIVE. 3044 eec0 ; THIS CRITERION IS CORRECT IN ALL QUADRANTS. 3045 eec0 a5 91 LDA DZX 3046 eec2 18 CLC 3047 eec3 65 93 ADC DZY 3048 eec5 a5 92 LDA DZX+1 3049 eec7 65 94 ADC DZY+1 3050 eec9 30 f4 BMI RTS7 ;IF DZX + DZY < 0, CONTINUE IN LOOP BY EXITING 3051 eecb ; WITH MINUS TRUE 3052 eecb 3053 eecb ;WE ARE AT THE TRANSITION POINT. SEE IF THE END POINT IS OUTSIDE THE 3054 eecb ; CIRCLE AND WILL NEVER BE HIT ON THE NEXT OCTANT. IF SO, RETURN Z 3055 eecb ; TRUE. 3056 eecb ;TO DO THIS, DETERMINE THE END POINT RELATIVE TO THE CURRENT POINT. 3057 eecb a0 81 LDY #X1 3058 eecd a2 04 LDX #4 3059 eecf 20 24 ed JSR MOV2W ;TEMP SAVE (X1,Y1) 3060 eed2 a0 66 LDY #CSIPR3 3061 eed4 a2 81 LDX #X1 3062 eed6 20 14 ed JSR XMINUSY 3063 eed9 20 59 ed JSR XNEG 3064 eedc a0 68 LDY #CSIPR4 3065 eede a2 83 LDX #Y1 3066 eee0 20 14 ed JSR XMINUSY 3067 eee3 20 59 ed JSR XNEG 3068 eee6 20 6c ed JSR QUADRNT ;ACC =QUADRANT OF END POINT RELATIVE TO (X1,Y1) 3069 eee9 30 0e BMI TRS1 ;END POINT RIGHT AT THE TRANSITION, DONE, EXIT Z TRUE 3070 eeeb c5 a1 CMP QUAD ;IS IT THE SAME AS THE CURRENT QUADRANT? 3071 eeed f0 0a BEQ TRS1 ;YES, STOP RIGHT HERE, EXIT Z TRUE 3072 eeef a0 04 LDY #4 3073 eef1 a2 81 LDX #X1 3074 eef3 20 24 ed JSR MOV2W ;RESTORE (X1,Y1) 3075 eef6 a9 01 LDA #1 3076 eef8 60 RTS ;EXIT S AND Z FALSE 3077 eef9 3078 eef9 a9 00 TRS1 LDA #0 ;EXIT Z TRUE 3079 eefb 60 RTS 3080 eefc 3081 eefc ;PAGE 3082 eefc 3083 eefc ;>>>>>>> I N T E R R U P T S E R V I C E R O U T I N E <<<<<<< 3084 eefc 8d 00 c0 INT STA RTC ;RESET SOURCE OF INTERRUPT 3085 eeff e6 a3 INC CLKTICK ;INCREMENT CLOCK TICK VARIABLE 3086 ef01 ; THIS AFFECTS CONDITION FLAGS, BUT THEY'RE SAVED BY 3087 ef01 ; THE HARDWARE DURING AN INTERRUPT 3088 ef01 3089 ef01 ;COPY THE SOFTWARE HOME ADDRESS TO THE HARDWARE HOME ADDRESS. 3090 ef01 48 PHA ;SAVE ACC REGISTER 3091 ef02 98 TYA ;MOVE Y REG TO ACC 3092 ef03 48 PHA ;SAVE Y REGISTER 3093 ef04 8a TXA ;MOVE X REG TO ACC 3094 ef05 48 PHA ;SAVE X REGISTER 3095 ef06 a5 55 SETCRT LDA CRTCRG12 ;READ SOFTWARE HOME HIGH 3096 ef08 a4 56 LDY CRTCRG13 ; AND LOW 3097 ef0a a2 0c LDX #12 ;X = PTR TO CRTC HOME ADDRESS HIGH 3098 ef0c 8e 00 80 STX CRTCA ;SELECT IT 3099 ef0f e8 INX ;X = PTR TO CRTC HOME ADDRESS LOW 3100 ef10 3101 ef10 ;AS QUICKLY AS POSSIBLE, LOAD UP THE NEW HOME ADDRESS TO THE CRTC. 3102 ef10 ; THIS PRECAUTION MINIMIZES THE TIME DURING WHICH THE CRTC HARDWARE 3103 ef10 ; MIGHT READ THE HOME ADDRESS AND CATCH IT IN THE MIDDLE OF A CHANGE. 3104 ef10 8d 01 80 STA CRTCD ;WRITE NEW VALUE HIGH 3105 ef13 8e 00 80 STX CRTCA ;SELECT LOW ADDRESS 3106 ef16 8c 01 80 STY CRTCD ;WRITE NEW VALUE LOW 3107 ef19 68 PLA ;GET SAVED X REGISTER 3108 ef1a aa TAX ;RESTORE X REGISTER 3109 ef1b 68 PLA ;GET SAVED Y REGISTER 3110 ef1c a8 TAY ;RESTORE Y REGISTER 3111 ef1d 68 PLA ;RESTORE SAVED ACC 3112 ef1e 3113 ef1e c6 a7 DEC BLNKCTR ;DECREMENT BLINK COUNTER 3114 ef20 f0 01 BEQ TOGGLE ;IF EXPIRED, THEN TOGGLE STATE 3115 ef22 40 RTI ;RETURN FROM INTERRUPT 3116 ef23 TOGGLE 3117 ef23 48 PHA ;SAVE ACC REGISTER 3118 ef24 a5 54 LDA ATTRIB ;GET CURRENT ATTRIB BYTE 3119 ef26 49 80 EOR #$80 ;INVERT BIT 7 OF CURRENT ATTRIB 3120 ef28 85 54 STA ATTRIB ;RESTORE NEW ATTRIB BYTE 3121 ef2a 8d 00 a0 STA ATT ;WRITE ATTRIB TO HARDWARE 3122 ef2d 30 06 BMI TOGON ;GO LOAD COUNTER FOR 'ONTIME' IF BIT 7 = 1 3123 ef2f a5 a9 LDA TIMEOFF ;OTHERWISE, GET 'OFFTIME' VALUE 3124 ef31 85 a7 STA BLNKCTR ;STORE IN COUNTER 3125 ef33 68 PLA ;RESTORE ACC TO PREVIOUS VALUE 3126 ef34 40 RTI ;RETURN FROM INTERRUPT 3127 ef35 TOGON 3128 ef35 a5 a8 LDA TIMEON ;GET 'ONTIME' COUNTER 3129 ef37 85 a7 STA BLNKCTR ;STORE IN COUNTER 3130 ef39 68 PLA ;RESTORE ACC TO PREVIOUS VALUE 3131 ef3a 40 RTI ;RETURN FROM INTERRUPT 3132 ef3b 3133 ef3b ;PAGE 3134 ef3b START 3135 ef3b a2 ff LDX #$0FF ;LOAD X REGISTER WITH 0FFH 3136 ef3d 9a TXS ;LOAD STACK POINTER 3137 ef3e 20 46 ef JSR INIT ;INITIALIZE DISPLAY HARDWARE 3138 ef41 a9 0c LDA #FF ;LOAD UP A FORM FEED CHARACTER 3139 ef43 4c 2c e0 JMP DOIT ;JUMP AND DO IT 3140 ef46 ; 3141 ef46 ; 3142 ef46 INIT 3143 ef46 ;HARDWARE INITIALIZATION. 3144 ef46 ;FIRST, DO INTERNAL HOUSEKEEPING. 3145 ef46 d8 CLD ;SET BINARY MODE 3146 ef47 3147 ef47 ;SET UP 8255A INTERFACE CHIP TO TALK WITH THE PROCESSING SECTION. 3148 ef47 a9 b4 LDA #$0B4 ;MODE 1, PORT A INPUT, PORT B OUTPUT, PORT C HANDSHAKE 3149 ef49 8d 03 90 STA IOCTRL ;SET UP THE HARDWARE 3150 ef4c a9 0f LDA #$0F ;INDIVIDUALLY TURN ON PORT C, BIT 7 AND 3151 ef4e 8d 03 90 STA IOCTRL 3152 ef51 a9 0d LDA #$0D ; BIT 6. THIS IS REQUIRED BY THE 3153 ef53 8d 03 90 STA IOCTRL ; DISCIPLINE, WHICH LATER STROBES THEM LOW. 3154 ef56 a9 09 LDA #$09 3155 ef58 8d 03 90 STA IOCTRL ;ALSO SET PC4 AND 3156 ef5b a9 05 LDA #$05 3157 ef5d 8d 03 90 STA IOCTRL ; PC2 3158 ef60 3159 ef60 3160 ef60 ;COPY THE CURSOR MASK FROM PROM TO RAM. 3161 ef60 a2 0b LDX #12-1 3162 ef62 bd a7 ff CURCPY LDA CURSOR,X 3163 ef65 95 39 STA CURMSK,X 3164 ef67 ca DEX 3165 ef68 10 f8 BPL CURCPY 3166 ef6a 3167 ef6a ;CREATE THE REVERSE MASK IN THE RAM. 3168 ef6a a2 0b LDX #12-1 3169 ef6c a9 ff LDA #$0FF 3170 ef6e 95 45 REVCRT STA REVMSK,X 3171 ef70 ca DEX 3172 ef71 10 fb BPL REVCRT 3173 ef73 3174 ef73 ;COPY THE CHARACTER FONT FROM PROM TO RAM SO IT CAN BE CHANGED. 3175 ef73 ;COPY 256 CHARS FROM THE PROM. 3176 ef73 a0 00 LDY #0 ;Y = 00 3177 ef75 84 02 STY 2 3178 ef77 a2 e4 FNTL4 LDX #< CHARS 3179 ef79 86 00 STX 0 3180 ef7b a2 ef LDX #> CHARS 3181 ef7d 86 01 STX 1 ;0,1 = PTR TO SOURCE OF CHARS 3182 ef7f a2 02 FNTL0 LDX #> CGLN0 3183 ef81 86 03 STX 3 ;2,3 = PTR TO DESTINATION OF CHARS 3184 ef83 b1 00 FNTLUP LDA (0),Y 3185 ef85 91 02 STA (2),Y ;COPY ONE BYTE OF THE FONT 3186 ef87 3187 ef87 ;UPDATE THE SOURCE POINTER IN THE PROM. 3188 ef87 e6 00 INC 0 ;GO TO NEXT BYTE IN PROM 3189 ef89 d0 02 BNE FNTL2 ;IF NO OVERFLOW, CONTINUE 3190 ef8b e6 01 INC 1 3191 ef8d FNTL2 ;SOURCE POINTER NOW UPDATED 3192 ef8d 3193 ef8d ;UPDATE THE DESTINATION POINTER IN THE RAM. 3194 ef8d e6 03 INC 3 ;STORE NEXT FONT BYTE ON NEXT ;PAGE 3195 ef8f a5 03 LDA 3 ;WHAT ;PAGE ARE WE ON NOW? 3196 ef91 c9 0e CMP #> CGEND ;AFTER ALL THE CHARACTER FONT PAGES? 3197 ef93 d0 ee BNE FNTLUP ;NO, CONTINUE 3198 ef95 e6 02 INC 2 ;YES, DO THE NEXT CHARACTER 3199 ef97 d0 e6 BNE FNTL0 ;IF MORE CHARACTERS, CONTINUE ON FIRST ;PAGE (TOP BYTE) 3200 ef99 3201 ef99 ;INITIALIZE THE ATTRIBUTES TO ALL OFF, BUT INTENSITY ATTRIBUTE IS BOLD. 3202 ef99 a9 44 LDA #$44 ; 3203 ef9b 85 54 STA ATTRIB ;TELL THE SOFTWARE 3204 ef9d ; (HARDWARE WILL BE TOLD LATER BY THE XFF ROUTINE.) 3205 ef9d 3206 ef9d a9 1e LDA #ONTIME ;GET DEFAULT 'ON TIME' VALUE 3207 ef9f 85 a8 STA TIMEON ;STORE AT 'TIMEON' IN RAM 3208 efa1 a9 1e LDA #OFFTIME ;GET DEFAULT 'OFF TIME' VALUE 3209 efa3 85 a9 STA TIMEOFF ;STORE AT 'TIMEOFF' IN RAM 3210 efa5 85 a7 STA BLNKCTR ;STORE VALUE IN COUNTER 3211 efa7 3212 efa7 ;INITIALIZE THE CONDITIONS. 3213 efa7 a9 78 LDA #$78 ;REPLACE MODE, BLINKING CURSOR, 3214 efa9 ; SLOW SCROLL, AUTO NEWLINE, UNDERLINE OFF 3215 efa9 85 51 STA CONDS 3216 efab a0 00 LDY #0 ;Y = 00 3217 efad 84 5c STY SOFLG ;SET SHIFT IN MODE 3218 efaf 84 57 STY CURDSP ;CURSOR NOT CURRENTLY DISPLAYED 3219 efb1 84 5a STY CURBLK+2 ;INITIALIZE PHOSPHOR SAVER 3220 efb3 84 7c STY XYOPR ;DEFAULT GRAPHICS TO "OR" ON THE DOTS 3221 efb5 88 DEY ;Y = FFH 3222 efb6 84 7a STY XYDOTS 3223 efb8 84 7b STY TMPXYDOT ;DEFAULT GRAPHICS TO DRAW ALL DOTS 3224 efba a9 e0 LDA #(-$20) 3225 efbc 85 5d STA G0VAL ;USE FIRST 96 CHARS AS G0 SET 3226 efbe a9 e0 LDA #(-$20) 3227 efc0 85 5e STA G1VAL ;USE FIRST 96 CHARS AS G1 SET 3228 efc2 a9 60 LDA #$60 ;OP CODE FOR RTS INSTRUCTION 3229 efc4 8d f7 1f STA XUSER ;PLANT IT IN USER ESCAPE SEQUENCE TO ACT AS NO-OP 3230 efc7 a9 00 LDA #00 3231 efc9 85 a4 STA LOGTOP ;DEFAULT VALUE FOR ADJUSTABLE SCROLLING REGION 3232 efcb a9 18 LDA #24 3233 efcd 85 a5 STA LOGBOT ;DEFAULT INSERT/DELETE TO DO ENTIRE SCREEN 3234 efcf a9 4c LDA #$4C ;OP CODE FOR JMP INSTRUCTION 3235 efd1 8d fd 1f STA XINT ;PLANT IT IN INTERRUPT TABLE 3236 efd4 a9 fc LDA #< INT 3237 efd6 8d fe 1f STA XINT + 1 3238 efd9 a9 ee LDA #> INT 3239 efdb 8d ff 1f STA XINT + 2 ; SO INTERRUPTS JUMP TO INT 3240 efde 58 CLI ;TURN ON INTERRUPTS 3241 efdf a9 48 LDA #$48 3242 efe1 85 a6 STA KBDBYT ;KEYBOARD DEFAULTS TO US, CLICK AND AUTO-REPEAT ON. 3243 efe3 60 RTS ;RETURN FROM SUBROUTINE 3244 efe4 3245 efe4 3246 efe4 ;PAGE 3247 efe4 ;CHARACTER GENERATOR 3248 efe4 3249 efe4 ;THE CHARACTERS ARE INTENDED TO BE DISPLAYED IN AN EIGHT WIDE BY TWELVE 3250 efe4 ; HIGH CELL. THE RASTER LINES IN THE CELL ARE ASSIGNED, BY 3251 efe4 ; CONVENTION, AS FOLLOWS: 3252 efe4 3253 efe4 ; UPPER LOWER CASE HAS THREE VERSIONS 3254 efe4 ;LINE CASE NORMAL ASCNDR DESCENDER 3255 efe4 ;----- ----- ----- ----- ----- 3256 efe4 ; 0 THIS LINE IS RESERVED FOR ACCENTS 3257 efe4 ; 1 THIS LINE IS RESERVED FOR ACCENTS 3258 efe4 ; 2 * * 3259 efe4 ; 3 * * 3260 efe4 ; 4 * * * * 3261 efe4 ; 5 * * * * 3262 efe4 ; 6 * * * * 3263 efe4 ; 7 * * * * 3264 efe4 ; 8 * * * * 3265 efe4 ; 9 * 3266 efe4 ; 10 * THIS LINE ALSO HAS UNDERLINES 3267 efe4 ; 11 * 3268 efe4 3269 efe4 ;EXAMPLES OF LOWER CASE WITH ASCENDERS: BDFHIKLT. 3270 efe4 ;EXAMPLES OF LOWER CASE WITH DESCENDERS: GJPQY. 3271 efe4 3272 efe4 ;THE FIRST BYTE OF ALL CHARACTERS IS ASSUMED TO BE DESTINED FOR RASTER 3273 efe4 ; LINE 0. THE FOLLOWING ELEVEN BYTES ARE FOR THE REMAINING LINES. 3274 efe4 3275 efe4 ;THE HEX CODES ARE GENERATED BY DRAWING THE CHARACTER, FOR EXAMPLE "E", 3276 efe4 ; ON GRAPH PAPER (OR USING THE FONTDB PROGRAM) AND THEN ASSIGNING 3277 efe4 ; THE PIXELS TO BITS AS FOLLOWS (BIT 7 IS NORMALLY BLANK): 3278 efe4 3279 efe4 ; B7 B6 B5 B4 B3 B2 B1 B0 3280 efe4 ; * * * * = HEX 3C 3281 efe4 ; * * = HEX 42 3282 efe4 ; * * * * * * = HEX 7E 3283 efe4 ; * = HEX 40 3284 efe4 ; * * * * = HEX 3C 3285 efe4 3286 efe4 ;PAGE 3287 efe4 CHARS 3288 efe4 ;THE FIRST 96 CHARS ARE THE NORMAL ASCII CHARACTERS. (G0 FONT) 3289 efe4 3290 efe4 ;HEX 20 - 7F 3291 efe4 ;LINE 0 1 2 3 4 5 6 7 8 9 10 11 3292 efe4 00 00 00 00* DC.B $000,$000,$000,$000,$000,$000,$000,$000,$000,$000,$000,$000 3293 eff0 00 00 20 20* DC.B $000,$000,$020,$020,$020,$020,$020,$000,$020,$000,$000,$000 3294 effc 00 00 24 24* DC.B $000,$000,$024,$024,$024,$000,$000,$000,$000,$000,$000,$000 3295 f008 00 00 24 24* DC.B $000,$000,$024,$024,$07E,$024,$07E,$024,$024,$000,$000,$000 3296 f014 00 00 10 3c* DC.B $000,$000,$010,$03C,$050,$038,$014,$078,$010,$000,$000,$000 3297 f020 00 00 31 32* DC.B $000,$000,$031,$032,$004,$008,$010,$026,$046,$000,$000,$000 3298 f02c 00 00 30 48* DC.B $000,$000,$030,$048,$048,$030,$04A,$044,$03A,$000,$000,$000 3299 f038 10 20 40 00* DC.B $010,$020,$040,$000,$000,$000,$000,$000,$000,$000,$000,$000 3300 f044 00 00 04 08* DC.B $000,$000,$004,$008,$010,$010,$010,$008,$004,$000,$000,$000 3301 f050 00 00 20 10* DC.B $000,$000,$020,$010,$008,$008,$008,$010,$020,$000,$000,$000 3302 f05c 00 00 00 10* DC.B $000,$000,$000,$010,$054,$038,$054,$010,$000,$000,$000,$000 3303 f068 00 00 00 10* DC.B $000,$000,$000,$010,$010,$07C,$010,$010,$000,$000,$000,$000 3304 f074 00 00 00 00* DC.B $000,$000,$000,$000,$000,$000,$000,$030,$030,$010,$020,$000 3305 f080 00 00 00 00* DC.B $000,$000,$000,$000,$000,$07E,$000,$000,$000,$000,$000,$000 3306 f08c 00 00 00 00* DC.B $000,$000,$000,$000,$000,$000,$000,$030,$030,$000,$000,$000 3307 f098 00 00 01 02* DC.B $000,$000,$001,$002,$004,$008,$010,$020,$040,$000,$000,$000 3308 f0a4 00 00 3c 42* DC.B $000,$000,$03C,$042,$046,$04A,$052,$062,$03C,$000,$000,$000 3309 f0b0 00 00 08 18* DC.B $000,$000,$008,$018,$028,$008,$008,$008,$07E,$000,$000,$000 3310 f0bc 00 00 3c 42* DC.B $000,$000,$03C,$042,$004,$008,$010,$020,$07E,$000,$000,$000 3311 f0c8 00 00 3c 42* DC.B $000,$000,$03C,$042,$002,$01C,$002,$042,$03C,$000,$000,$000 3312 f0d4 00 00 40 44* DC.B $000,$000,$040,$044,$044,$07E,$004,$004,$004,$000,$000,$000 3313 f0e0 00 00 7e 40* DC.B $000,$000,$07E,$040,$07C,$002,$002,$042,$03C,$000,$000,$000 3314 f0ec 00 00 3e 40* DC.B $000,$000,$03E,$040,$040,$07C,$042,$042,$03C,$000,$000,$000 3315 f0f8 00 00 7e 04* DC.B $000,$000,$07E,$004,$008,$010,$020,$020,$020,$000,$000,$000 3316 f104 00 00 3c 42* DC.B $000,$000,$03C,$042,$042,$03C,$042,$042,$03C,$000,$000,$000 3317 f110 00 00 3c 42* DC.B $000,$000,$03C,$042,$042,$03E,$002,$002,$07C,$000,$000,$000 3318 f11c 00 00 00 30* DC.B $000,$000,$000,$030,$030,$000,$000,$030,$030,$000,$000,$000 3319 f128 00 00 00 30* DC.B $000,$000,$000,$030,$030,$000,$000,$030,$030,$010,$020,$000 3320 f134 00 00 04 08* DC.B $000,$000,$004,$008,$010,$020,$010,$008,$004,$000,$000,$000 3321 f140 00 00 00 00* DC.B $000,$000,$000,$000,$07E,$000,$07E,$000,$000,$000,$000,$000 3322 f14c 00 00 20 10* DC.B $000,$000,$020,$010,$008,$004,$008,$010,$020,$000,$000,$000 3323 f158 00 00 3c 42* DC.B $000,$000,$03C,$042,$002,$004,$008,$000,$008,$000,$000,$000 3324 f164 00 00 3c 42* DC.B $000,$000,$03C,$042,$04E,$052,$04C,$040,$03E,$000,$000,$000 3325 f170 00 00 3c 42* DC.B $000,$000,$03C,$042,$042,$07E,$042,$042,$042,$000,$000,$000 3326 f17c 00 00 7c 42* DC.B $000,$000,$07C,$042,$042,$07C,$042,$042,$07C,$000,$000,$000 3327 f188 00 00 3c 42* DC.B $000,$000,$03C,$042,$040,$040,$040,$042,$03C,$000,$000,$000 3328 f194 00 00 78 44* DC.B $000,$000,$078,$044,$042,$042,$042,$044,$078,$000,$000,$000 3329 f1a0 00 00 7e 40* DC.B $000,$000,$07E,$040,$040,$078,$040,$040,$07E,$000,$000,$000 3330 f1ac 00 00 7e 40* DC.B $000,$000,$07E,$040,$040,$078,$040,$040,$040,$000,$000,$000 3331 f1b8 00 00 3c 42* DC.B $000,$000,$03C,$042,$040,$04E,$042,$042,$03C,$000,$000,$000 3332 f1c4 00 00 42 42* DC.B $000,$000,$042,$042,$042,$07E,$042,$042,$042,$000,$000,$000 3333 f1d0 00 00 7c 10* DC.B $000,$000,$07C,$010,$010,$010,$010,$010,$07C,$000,$000,$000 3334 f1dc 00 00 0f 02* DC.B $000,$000,$00F,$002,$002,$002,$002,$042,$03C,$000,$000,$000 3335 f1e8 00 00 42 44* DC.B $000,$000,$042,$044,$048,$050,$068,$044,$042,$000,$000,$000 3336 f1f4 00 00 40 40* DC.B $000,$000,$040,$040,$040,$040,$040,$040,$07E,$000,$000,$000 3337 f200 00 00 42 66* DC.B $000,$000,$042,$066,$05A,$042,$042,$042,$042,$000,$000,$000 3338 f20c 00 00 42 62* DC.B $000,$000,$042,$062,$052,$04A,$046,$042,$042,$000,$000,$000 3339 f218 00 00 3c 42* DC.B $000,$000,$03C,$042,$042,$042,$042,$042,$03C,$000,$000,$000 3340 f224 00 00 7c 42* DC.B $000,$000,$07C,$042,$042,$07C,$040,$040,$040,$000,$000,$000 3341 f230 00 00 3c 42* DC.B $000,$000,$03C,$042,$042,$042,$04A,$044,$03A,$000,$000,$000 3342 f23c 00 00 7c 42* DC.B $000,$000,$07C,$042,$042,$07C,$048,$044,$042,$000,$000,$000 3343 f248 00 00 3c 42* DC.B $000,$000,$03C,$042,$040,$03C,$002,$042,$03C,$000,$000,$000 3344 f254 00 00 7f 08* DC.B $000,$000,$07F,$008,$008,$008,$008,$008,$008,$000,$000,$000 3345 f260 00 00 42 42* DC.B $000,$000,$042,$042,$042,$042,$042,$042,$03C,$000,$000,$000 3346 f26c 00 00 42 42* DC.B $000,$000,$042,$042,$042,$042,$044,$028,$010,$000,$000,$000 3347 f278 00 00 42 42* DC.B $000,$000,$042,$042,$042,$042,$05A,$066,$042,$000,$000,$000 3348 f284 00 00 41 22* DC.B $000,$000,$041,$022,$014,$008,$014,$022,$041,$000,$000,$000 3349 f290 00 00 41 22* DC.B $000,$000,$041,$022,$014,$008,$008,$008,$008,$000,$000,$000 3350 f29c 00 00 7f 02* DC.B $000,$000,$07F,$002,$004,$008,$010,$020,$07F,$000,$000,$000 3351 f2a8 00 00 1c 10* DC.B $000,$000,$01C,$010,$010,$010,$010,$010,$01C,$000,$000,$000 3352 f2b4 00 00 40 20* DC.B $000,$000,$040,$020,$010,$008,$004,$002,$001,$000,$000,$000 3353 f2c0 00 00 38 08* DC.B $000,$000,$038,$008,$008,$008,$008,$008,$038,$000,$000,$000 3354 f2cc 10 28 44 00* DC.B $010,$028,$044,$000,$000,$000,$000,$000,$000,$000,$000,$000 3355 f2d8 00 00 00 00* DC.B $000,$000,$000,$000,$000,$000,$000,$000,$000,$000,$0FF,$000 3356 f2e4 10 08 04 00* DC.B $010,$008,$004,$000,$000,$000,$000,$000,$000,$000,$000,$000 3357 f2f0 00 00 00 00* DC.B $000,$000,$000,$000,$03C,$002,$03E,$042,$03E,$000,$000,$000 3358 f2fc 00 00 40 40* DC.B $000,$000,$040,$040,$05C,$062,$042,$062,$05C,$000,$000,$000 3359 f308 00 00 00 00* DC.B $000,$000,$000,$000,$03E,$040,$040,$040,$03E,$000,$000,$000 3360 f314 00 00 02 02* DC.B $000,$000,$002,$002,$03A,$046,$042,$046,$03A,$000,$000,$000 3361 f320 00 00 00 00* DC.B $000,$000,$000,$000,$03C,$042,$07E,$040,$03C,$000,$000,$000 3362 f32c 00 00 1c 22* DC.B $000,$000,$01C,$022,$020,$078,$020,$020,$020,$000,$000,$000 3363 f338 00 00 00 00* DC.B $000,$000,$000,$000,$03A,$044,$044,$038,$040,$03C,$042,$03C 3364 f344 00 00 40 40* DC.B $000,$000,$040,$040,$05C,$062,$042,$042,$042,$000,$000,$000 3365 f350 00 00 08 00* DC.B $000,$000,$008,$000,$018,$008,$008,$008,$01C,$000,$000,$000 3366 f35c 00 00 08 00* DC.B $000,$000,$008,$000,$018,$008,$008,$008,$008,$008,$008,$070 3367 f368 00 00 40 40* DC.B $000,$000,$040,$040,$048,$050,$068,$044,$042,$000,$000,$000 3368 f374 00 00 30 10* DC.B $000,$000,$030,$010,$010,$010,$010,$010,$038,$000,$000,$000 3369 f380 00 00 00 00* DC.B $000,$000,$000,$000,$076,$049,$049,$049,$049,$000,$000,$000 3370 f38c 00 00 00 00* DC.B $000,$000,$000,$000,$05C,$062,$042,$042,$042,$000,$000,$000 3371 f398 00 00 00 00* DC.B $000,$000,$000,$000,$03C,$042,$042,$042,$03C,$000,$000,$000 3372 f3a4 00 00 00 00* DC.B $000,$000,$000,$000,$05C,$062,$042,$062,$05C,$040,$040,$040 3373 f3b0 00 00 00 00* DC.B $000,$000,$000,$000,$03A,$046,$042,$046,$03A,$002,$002,$002 3374 f3bc 00 00 00 00* DC.B $000,$000,$000,$000,$05C,$062,$040,$040,$040,$000,$000,$000 3375 f3c8 00 00 00 00* DC.B $000,$000,$000,$000,$03E,$040,$03C,$002,$07C,$000,$000,$000 3376 f3d4 00 00 10 10* DC.B $000,$000,$010,$010,$07E,$010,$010,$010,$00E,$000,$000,$000 3377 f3e0 00 00 00 00* DC.B $000,$000,$000,$000,$042,$042,$042,$046,$03A,$000,$000,$000 3378 f3ec 00 00 00 00* DC.B $000,$000,$000,$000,$042,$042,$044,$028,$010,$000,$000,$000 3379 f3f8 00 00 00 00* DC.B $000,$000,$000,$000,$041,$049,$049,$049,$036,$000,$000,$000 3380 f404 00 00 00 00* DC.B $000,$000,$000,$000,$044,$028,$010,$028,$044,$000,$000,$000 3381 f410 00 00 00 00* DC.B $000,$000,$000,$000,$042,$042,$044,$028,$010,$020,$040,$080 3382 f41c 00 00 00 00* DC.B $000,$000,$000,$000,$07C,$008,$010,$020,$07E,$000,$000,$000 3383 f428 00 00 06 08* DC.B $000,$000,$006,$008,$008,$030,$008,$008,$006,$000,$000,$000 3384 f434 00 00 10 10* DC.B $000,$000,$010,$010,$010,$000,$010,$010,$010,$000,$000,$000 3385 f440 00 00 60 10* DC.B $000,$000,$060,$010,$010,$00C,$010,$010,$060,$000,$000,$000 3386 f44c 32 4c 00 00* DC.B $032,$04C,$000,$000,$000,$000,$000,$000,$000,$000,$000,$000 3387 f458 00 00 00 7e* DC.B $000,$000,$000,$07E,$07E,$07E,$07E,$07E,$000,$000,$000,$000 3388 f464 3389 f464 ;PAGE 3390 f464 ;THE NEXT 96 CHARACTERS ARE 32 SPECIAL SYMBOLS FOLLOWED BY 64 3391 f464 ; GARBAGE CHARACTERS. 3392 f464 ; (G1 FONT) 3393 f464 ORG CHARS + ( 96 * 12 ) 3394 f464 ;LINE 0 1 2 3 4 5 6 7 8 9 10 11 3395 f464 00 00 00 00* DC.B $000,$000,$000,$000,$000,$000,$010,$000,$000,$000,$000,$000 3396 f470 00 00 3f 7a* DC.B $000,$000,$03F,$07A,$07A,$03A,$00A,$00A,$00A,$000,$000,$000 3397 f47c 00 00 10 48* DC.B $000,$000,$010,$048,$024,$012,$024,$048,$010,$000,$000,$000 3398 f488 00 00 08 12* DC.B $000,$000,$008,$012,$024,$048,$024,$012,$008,$000,$000,$000 3399 f494 00 00 7e 40* DC.B $000,$000,$07E,$040,$040,$070,$040,$04B,$04C,$008,$008,$000 3400 f4a0 00 00 3c 42* DC.B $000,$000,$03C,$042,$042,$04C,$042,$052,$04C,$000,$000,$000 3401 f4ac 00 00 01 02* DC.B $000,$000,$001,$002,$004,$008,$050,$020,$000,$000,$000,$000 3402 f4b8 00 00 18 18* DC.B $000,$000,$018,$018,$018,$000,$000,$000,$000,$000,$000,$000 3403 f4c4 00 00 00 10* DC.B $000,$000,$000,$010,$020,$07E,$020,$010,$000,$000,$000,$000 3404 f4d0 00 00 00 08* DC.B $000,$000,$000,$008,$004,$07E,$004,$008,$000,$000,$000,$000 3405 f4dc 00 00 10 10* DC.B $000,$000,$010,$010,$010,$010,$054,$038,$010,$000,$000,$000 3406 f4e8 00 00 38 40* DC.B $000,$000,$038,$040,$038,$044,$038,$004,$038,$000,$000,$000 3407 f4f4 00 00 10 38* DC.B $000,$000,$010,$038,$054,$010,$010,$010,$010,$000,$000,$000 3408 f500 00 00 00 00* DC.B $000,$000,$000,$000,$000,$004,$00C,$01C,$03C,$000,$000,$000 3409 f50c 00 00 18 18* DC.B $000,$000,$018,$018,$000,$07E,$000,$018,$018,$000,$000,$000 3410 f518 00 00 00 7f* DC.B $000,$000,$000,$07F,$008,$070,$010,$060,$000,$000,$000,$000 3411 f524 38 7c 7c 38* DC.B $038,$07C,$07C,$038,$000,$000,$000,$000,$000,$000,$000,$000 3412 f530 38 44 44 38* DC.B $038,$044,$044,$038,$000,$000,$000,$000,$000,$000,$000,$000 3413 f53c 00 00 44 38* DC.B $000,$000,$044,$038,$044,$044,$038,$044,$000,$000,$000,$000 3414 f548 00 00 08 3e* DC.B $000,$000,$008,$03E,$048,$048,$048,$03E,$008,$000,$000,$000 3415 f554 00 00 1c 22* DC.B $000,$000,$01C,$022,$020,$070,$020,$022,$07C,$000,$000,$000 3416 f560 10 7c 10 10* DC.B $010,$07C,$010,$010,$010,$010,$010,$000,$000,$000,$000,$000 3417 f56c 10 7c 10 10* DC.B $010,$07C,$010,$010,$010,$07C,$010,$000,$000,$000,$000,$000 3418 f578 00 00 10 10* DC.B $000,$000,$010,$010,$07C,$010,$010,$000,$07C,$000,$000,$000 3419 f584 38 44 7c 44* DC.B $038,$044,$07C,$044,$000,$000,$000,$000,$000,$000,$000,$000 3420 f590 00 40 42 44* DC.B $000,$040,$042,$044,$048,$050,$02C,$052,$004,$008,$01E,$000 3421 f59c 00 40 42 44* DC.B $000,$040,$042,$044,$048,$052,$026,$04A,$01E,$002,$002,$000 3422 f5a8 00 00 00 00* DC.B $000,$000,$000,$000,$008,$014,$022,$07F,$000,$000,$000,$000 3423 f5b4 24 00 00 00* DC.B $024,$000,$000,$000,$000,$000,$000,$000,$000,$000,$000,$000 3424 f5c0 00 00 00 00* DC.B $000,$000,$000,$000,$03E,$040,$040,$040,$03E,$008,$030,$000 3425 f5cc 00 00 04 00* DC.B $000,$000,$004,$000,$004,$004,$004,$004,$004,$000,$000,$000 3426 f5d8 00 00 10 00* DC.B $000,$000,$010,$000,$010,$020,$040,$042,$03C,$000,$000,$000 3427 f5e4 3428 f5e4 ;PAGE 3429 f5e4 ;THE NEXT 64 CHARACTERS ARE 64 GARBAGE CHARACTERS. 3430 f5e4 ; (THIS IS WHERE THE POWER-UP-DIAGNOSTICS ARE PLACED) 3431 f5e4 ; 3432 f5e4 ;The purpose of this code is to do a hash total on the 6502 EPROM 3433 f5e4 ; as a diagnostic tool during system boot-up. The range of 3434 f5e4 ; the EPROM addresses is 0E000H to 0F000H. 3435 f5e4 ; 3436 f5e4 ; 3437 f5e4 ; EQUATES 3438 f5e4 ; ======= 3439 f5e4 e0 00 STRTAD EQU $0E000 ;START ADDRESS OF DBOOT ROM 3440 f5e4 00 00 ENDADD EQU $0000 ;PROM END ADDRESS + 1 3441 f5e4 00 00 HSTART EQU 0 ;ZERO ;PAGE LOCATION FOR START ADDRESS 3442 f5e4 00 02 HEND EQU 2 ;ZERO ;PAGE LOCATION FOR END ADDRESS 3443 f5e4 00 04 HASH EQU 4 ;ZERO ;PAGE LOCATION FOR HASH ACCUMULATOR 3444 f5e4 3445 f5e4 3446 f5e4 ; START OF CODE 3447 f5e4 ; ============= 3448 f5e4 ; 3449 f5e4 ;CLEAR AND CHECK INTEGRITY OF MINIMAL RAM FOR OVERHEAD 3450 f5e4 ; 3451 f5e4 ; 3452 f5e4 HASHTEST 3453 f5e4 ; 3454 f5e4 ; 3455 f5e4 78 SEI ;DISABLE EXTERNAL INTERRUPTS 3456 f5e5 ; 3457 f5e5 ; 3458 f5e5 ;BLANK THE SCREEN... 3459 f5e5 a9 20 LDA #$20 ;BIT TO BLANK SCREEN 3460 f5e7 8d 00 a0 STA ATT ;TELL HARDWARE 3461 f5ea ;NOW SET UP THE CRT CONTROLLER CHIP SO STUFF WILL BE DISPLAYED. 3462 f5ea a2 00 LDX #0 ;START WITH REGISTER 0 3463 f5ec 8e 00 80 CRTINT STX CRTCA ;SELECT IT 3464 f5ef bd 9b ff LDA CRTTBL,X ;READ THE INITIALIZATION TABLE VALUE 3465 f5f2 8d 01 80 STA CRTCD ;OUTPUT IT 3466 f5f5 e8 INX ;GO TO THE NEXT REGISTER 3467 f5f6 e0 0c CPX #12 ;REGISTER 11 JUST OUTPUT? 3468 f5f8 d0 f2 BNE CRTINT ;NO, CONTINUE 3469 f5fa ; 3470 f5fa ; 3471 f5fa a0 04 LDY #$04 ;# OF DATA PATTERNS TO TEST 3472 f5fc MORE 3473 f5fc 88 DEY ;POINT TO NEXT DATA PATTERN 3474 f5fd a2 05 LDX #$05 ;# OF RAM LOCATIONS TO CHECK 3475 f5ff AGAIN 3476 f5ff ca DEX ;POINT TO NEXT LOCATION 3477 f600 b9 9c f6 LDA DATA,Y ;GET DATA PATTERN TO CHECK 3478 f603 95 00 STA 0,X ;STORE IN RAM 3479 f605 d5 00 CMP 0,X ;CHECK TO SEE IF STORED CORRECTLY 3480 f607 d0 3b BNE HERROR ;IF NOT, THEN RAM ERROR 3481 f609 8a TXA ;GET X INDEX REGISTER INTO ACC 3482 f60a d0 f3 BNE AGAIN ;IF NOT DONE, GO DO ANOTHER LOCATION 3483 f60c 98 TYA ;GET Y INDEX REGISTER INTO ACC 3484 f60d d0 ed BNE MORE ;IF NOT DONE WITH DATA PATTERNS, GO DO MORE 3485 f60f ; 3486 f60f ; 3487 f60f ;START OF HASH TEST PROPER... 3488 f60f ; 3489 f60f ; 3490 f60f a9 00 LDA #< STRTAD ;GET LOW BYTE OF START ADDRESS 3491 f611 85 00 STA HSTART ;...STORE IN ZERO ;PAGE RAM 3492 f613 a9 e0 LDA #> STRTAD ;GET HIGH BYTE OF START ADDRESS 3493 f615 85 01 STA HSTART+1 ;...STORE IN ZERO ;PAGE RAM 3494 f617 a9 00 LDA #< ENDADD ;GET LOW BYTE OF END ADDRESS 3495 f619 85 02 STA HEND ;...STORE IN ZERO ;PAGE RAM 3496 f61b a9 00 LDA #> ENDADD ;GET HIGH BYTE OF END ADDRESS 3497 f61d 85 03 STA HEND+1 ;...STORE IN ZERO ;PAGE RAM 3498 f61f a9 00 LDA #0 ;LOAD ACC WITH ZERO 3499 f621 85 04 STA HASH ;INIT HASH TOTAL 3500 f623 aa TAX ;LOAD X REGISTER WITH ZERO 3501 f624 18 CLC ;CLEAR CARRY BIT 3502 f625 HLOOP 3503 f625 a1 00 LDA (HSTART,X) ;LOAD BY INDIRECT INDEXED MODE (GET BYTE) 3504 f627 65 04 ADC HASH ;ADD WITH CARRY 3505 f629 85 04 STA HASH ;STORE SUM IN HASH 3506 f62b e6 00 INC HSTART ;INCREMENT STARTING ADDRESS (LO) 3507 f62d d0 02 BNE HSKIP ;IF NO WRAP AROUND, SKIP OVER 3508 f62f e6 01 INC HSTART+1 ;INCREMENT STARTING ADDRESS (HI) 3509 f631 HSKIP 3510 f631 a5 03 LDA HEND+1 ;GET END ADDRESS (HI) 3511 f633 c5 01 CMP HSTART+1 ;COMPARE WITH START ADDRESS (HI) 3512 f635 d0 ee BNE HLOOP ;IF DIFFERENT, NOT DONE...DO MORE 3513 f637 a5 02 LDA HEND ;GET END ADDRESS (LO) 3514 f639 c5 00 CMP HSTART ;COMPARE WITH START ADDRESS (LO) 3515 f63b d0 e8 BNE HLOOP ;DIFFERENT ? THEN GO LOOP SOME MORE 3516 f63d ; 3517 f63d ; 3518 f63d ;MAKE SURE THE HASH TOTAL IS CORRECT... 3519 f63d ; 3520 f63d ; 3521 f63d a5 04 LDA HASH ;IS HASH TOTAL CORRECT ? 3522 f63f d0 03 BNE HERROR ;NO... ERROR 3523 f641 4c a1 f6 JMP RAMTEST ;YES...DONE, GO DO RAMTEST 3524 f644 ; 3525 f644 ; 3526 f644 ;ERROR MESSAGE ROUTINE... 3527 f644 ; 3528 f644 ; 3529 f644 HERROR 3530 f644 a2 ff LDX #$0FF ;LOAD FF INTO X REGISTER 3531 f646 9a TXS ;TRANSFER INDEX X TO STACK POINTER 3532 f647 20 46 ef JSR INIT ;TRY TO INITIALIZE DISPLAY 3533 f64a ; 3534 f64a ; 3535 f64a 20 c8 e0 JSR XFF ;DO A FORM FEED 3536 f64d ; 3537 f64d ; 3538 f64d a0 00 LDY #0 ;LOAD Y REGISTER WITH ZERO 3539 f64f HNCHAR 3540 f64f 98 TYA ;MOVE Y REGISTER TO ACC 3541 f650 48 PHA ;...SAVE ON STACK 3542 f651 b9 6e f6 LDA HMSSG,Y ;GET MESSAGE BYTE 3543 f654 c9 24 CMP #'$ ;END OF STRING ? 3544 f656 f0 09 BEQ HHALT ;YES...ENTER INFINITE LOOP 3545 f658 20 c4 e7 JSR DISP ;WRITE ONE CHARACTER TO SCREEN 3546 f65b 68 PLA ;GET SAVED Y REGISTER BACK 3547 f65c a8 TAY ;...MOVE BACK TO Y REGISTER 3548 f65d c8 INY ;POINT TO NEXT MESSAGE CHARACTER BYTE 3549 f65e 4c 4f f6 JMP HNCHAR ;ON TO NEXT CHARACTER 3550 f661 ; 3551 f661 ; 3552 f661 HHALT 3553 f661 a9 99 LDA #CRASHMD ;GET 8255 COMMAND BYTE 3554 f663 8d 03 90 STA IOCTRL ;SET UP 8255 (A=IN,B=OUT,C=IN) 3555 f666 a9 30 LDA #$30 ;LOAD ASCII '0' 3556 f668 8d 01 90 STA IOPB ;SEND TO PORT B 3557 f66b ; 3558 f66b ; 3559 f66b HHALT1 3560 f66b 4c 6b f6 JMP HHALT1 ;INFINITE LOOP... 3561 f66e ; 3562 f66e ; 3563 f66e ;---------------------------------------------------------------------- 3564 f66e 46 61 69 6c*HMSSG DC.B "Failed EPROM hash total test. System halted.","$" 3565 f69c ;---------------------------------------------------------------------- 3566 f69c ; 3567 f69c ; 3568 f69c 00 55 aa ff DATA DC.B 0,$55,$0AA,$0FF ;DATA PATTERNS TO CHECK RAM 3569 f6a0 ; 3570 f6a0 ; 3571 f6a0 HASHTOT 3572 f6a0 00 DC.B $00 ;THIS IS WHERE THE HASH TOTAL WILL GO 3573 f6a1 ; 3574 f6a1 ; 3575 f6a1 ;PAGE 3576 f6a1 ;This routine is used to fill a block of memory in the 6502's 3577 f6a1 ; address space. It uses some memory in page 0 and the 3578 f6a1 ; main routine can be located anywhere else. It fills the 3579 f6a1 ; RAM with AA's, 55's, and 00's as a diagnostic test. 3580 f6a1 ; Attribute ram is also checked with 10's, 01's and 00's. 3581 f6a1 ; NOTE: ATTRIBUTE RAM IS LOCATED AT 2000H TO 7FFFH ONLY. 3582 f6a1 ; 3583 f6a1 ; 3584 f6a1 ; EQUATES 3585 f6a1 ; ======= 3586 f6a1 00 99 CRASHMD EQU $99 ;8255 COMMAND BYTE 3587 f6a1 ; 3588 f6a1 ; 3589 f6a1 00 20 STARTWO EQU $0020 ;START ADDRESS OF RAM TO CHECK (WITH OUT ATTRIBUTES) 3590 f6a1 20 00 ENDADWO EQU $2000 ;END ADDRESS + 1 (WITH OUT ATTRIBUTES) 3591 f6a1 20 00 STARTW EQU $2000 ;START ADDRESS (RAM WITH ATTRIBUTES) 3592 f6a1 80 00 ENDADW EQU $8000 ;END ADDRESS + 1 (WITH ATTRIBUTES) 3593 f6a1 00 20 OVRCNT EQU $20 ;OVER HEAD RAM COUNT 3594 f6a1 ; 3595 f6a1 ; 3596 f6a1 00 1b STARTAD EQU $001B ;RAM LOCATION FOR MEMORY POINTER 3597 f6a1 TIMEOUT SET STARTAD+2 ;RAM LOCATION FOR TIMEOUT COUNTER 3598 f6a1 ERRNUM SET TIMEOUT+2 ;RAM LOCATION FOR ERROR NUMBER 3599 f6a1 ; 3600 f6a1 ; 3601 f6a1 ;CHECK A FEW RAM LOCATIONS TO BE USED FOR OVERHEAD (;PAGE ZERO RAM)... 3602 f6a1 ; 3603 f6a1 ; 3604 f6a1 ;ZERO OUT OVER HEAD RAM... (00H - 1FH) 3605 f6a1 ; 3606 f6a1 ; 3607 f6a1 RAMTEST 3608 f6a1 a2 20 LDX #OVRCNT ;# OF RAM LOCATIONS TO TEST 3609 f6a3 LDZEROS 3610 f6a3 ca DEX ;ADJUST INDEX FOR NEXT BYTE 3611 f6a4 a9 00 LDA #0 ;VALUE TO STORE IN RAM 3612 f6a6 95 00 STA 0,X ;STORE VALUE IN RAM 3613 f6a8 8a TXA ;COPY X INDEX TO ACC 3614 f6a9 d0 f8 BNE LDZEROS ;IF NOT DONE, DO MORE 3615 f6ab ; 3616 f6ab ; 3617 f6ab ;CHECK FOR ZEROS IN OVER HEAD RAM... 3618 f6ab ; 3619 f6ab ; 3620 f6ab a2 20 LDX #OVRCNT ;# OF RAM LOCATIONS TO CHECK 3621 f6ad CHKZEROS 3622 f6ad ca DEX ;ADJUST INDEX FOR NEXT BYTE 3623 f6ae b5 00 LDA 0,X ;GET BYTE OF DATA FROM RAM 3624 f6b0 d0 06 BNE ERRVECT1 ;IF NOT ZERO, THEN ERROR 3625 f6b2 8a TXA ;XFER X INDEX TO ACC 3626 f6b3 d0 f8 BNE CHKZEROS ;IF NOT DONE, DO SOME MORE 3627 f6b5 4c bf f6 JMP NEXT ;CONTINUE TEST... 3628 f6b8 ; 3629 f6b8 ; 3630 f6b8 ERRVECT1 ;>>> OVERHEAD RAM (00H-1FH) NOT ZEROED <<< 3631 f6b8 a9 31 LDA #$31 ;LOAD ASCII '1' 3632 f6ba ERRVECT 3633 f6ba 85 1f STA ERRNUM ;SAVE IN RAM 3634 f6bc 4c c6 f7 JMP ERROR ;GO TO ERROR ROUTINE 3635 f6bf ; 3636 f6bf ; 3637 f6bf ;RAM IS ZEROED... 3638 f6bf ; 3639 f6bf ; 3640 f6bf ;LOAD OVER HEAD RAM WITH DEFAULT VALUES AND CHECK RAM... 3641 f6bf ; 3642 f6bf ; 3643 f6bf NEXT 3644 f6bf a0 00 LDY #0 ;INDEX FOR DEFAULT VALUES 3645 f6c1 a2 20 LDX #OVRCNT ;# OF RAM LOCATIONS TO LOAD 3646 f6c3 LOADMORE 3647 f6c3 ca DEX ;ADJUST INDEX FOR NEXT BYTE 3648 f6c4 b9 d8 f6 LDA VALUES,Y ;GET DEFAULT VALUE 3649 f6c7 95 00 STA 0,X ;...AND PUT INTO RAM 3650 f6c9 49 ff EOR #$0FF ;CHANGE VALUE IN ACC 3651 f6cb b5 00 LDA 0,X ;READ BACK RAM LOCATION JUST LOADED 3652 f6cd d9 d8 f6 CMP VALUES,Y ;COMPARE WITH VALUE JUST LOADED INTO RAM 3653 f6d0 d0 26 BNE ERRVECT2 ;IF DIFFERENT, THEN ERROR 3654 f6d2 c8 INY ;POINT TO NEXT DEFAULT VALUE 3655 f6d3 8a TXA ;XFER X INDEX TO ACC 3656 f6d4 d0 ed BNE LOADMORE ;IF NOT DONE, DO SOME MORE 3657 f6d6 f0 25 BEQ BEGIN ;CONTINUE TEST... 3658 f6d8 ; 3659 f6d8 ; 3660 f6d8 VALUES 3661 f6d8 00 00 00 DC.B 0,0,0 ;DUMMY VALUES 3662 f6db 00 20 DC.B (> STARTWO),(< STARTWO) 3663 f6dd 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;DUMMY VALUES 3664 f6e5 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ; " " 3665 f6ed 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ; " " 3666 f6f5 00 00 00 DC.B 0,0,0 ; " " 3667 f6f8 ; 3668 f6f8 ; 3669 f6f8 ERRVECT2 ;>>> OVERHEAD RAM FAILURE (00H-1FH) IN WRITING DEFAULT VALUES <<< 3670 f6f8 a9 32 LDA #$32 ;LOAD ASCII '2' 3671 f6fa 4c ba f6 JMP ERRVECT ;STORE AND EXIT 3672 f6fd ; 3673 f6fd ; 3674 f6fd ;RAM TEST PROPER... (20H - 1FFFH) 3675 f6fd ; 3676 f6fd ; 3677 f6fd BEGIN 3678 f6fd a2 00 LDX #0 ;INITIALIZE RAM INDEX POINTER 3679 f6ff a0 00 LDY #0 ;INITIALIZE DATPAT INDEX POINTER 3680 f701 ; 3681 f701 ; 3682 f701 ;FILL RAM WITH DATA PATTERN... 3683 f701 ; 3684 f701 ; 3685 f701 FILLMORE 3686 f701 b9 b8 f7 LDA DATPAT,Y ;GET DATA PATTERN TO CHECK 3687 f704 81 1b STA (STARTAD,X) ;STORE DATPAT IN RAM 3688 f706 e6 1b INC STARTAD ;INCREMENT RAM ADDRESS (LO) 3689 f708 d0 02 BNE SKIP1 ;IF NO WRAP AROUND, SKIP OVER 3690 f70a e6 1c INC STARTAD+1 ;OTHERWISE, INCREMENT RAM ADDRESS (HI) 3691 f70c SKIP1 3692 f70c a9 20 LDA #> ENDADWO ;GET END ADDRESS (HI) 3693 f70e c5 1c CMP STARTAD+1 ;ARE WE ON LAST ;PAGE OF RAM ? 3694 f710 d0 ef BNE FILLMORE ;NO, SO DO SOME MORE RAM FILL 3695 f712 a9 00 LDA #< ENDADWO ;GET END ADDRESS (LO) 3696 f714 c5 1b CMP STARTAD ;LAST ADDRESS OF CURRENT ;PAGE ? 3697 f716 d0 e9 BNE FILLMORE ;NO, DO SOME MORE RAM FILL 3698 f718 ; 3699 f718 ; 3700 f718 ;NOW CHECK THAT DATA WAS STORED CORRECTLY... 3701 f718 ; 3702 f718 ; 3703 f718 CHECK 3704 f718 a9 20 LDA #< STARTWO ;GET RAM START ADDRESS (LO) 3705 f71a 85 1b STA STARTAD ;...AND PUT INTO RAM POINTER 3706 f71c a9 00 LDA #> STARTWO ;GET RAM START ADRRESS (HI) 3707 f71e 85 1c STA STARTAD+1 ;...AND PUT INTO RAM POINTER 3708 f720 ALPHA 3709 f720 a1 1b LDA (STARTAD,X) ;GET DATA BYTE FROM RAM 3710 f722 d9 b8 f7 CMP DATPAT,Y ;COMPARE WITH PATTERN THAT SHOULD BE THERE 3711 f725 d0 21 BNE ERRVECT3 ;NOT THERE, SO ERROR 3712 f727 e6 1b INC STARTAD ;INCREMENT START ADDRESS POINTER (LO) 3713 f729 d0 02 BNE SKIP2 ;IF NO WRAP AROUND, SKIP OVER NEXT INSTRUCTION 3714 f72b e6 1c INC STARTAD+1 ;INCREMENT START ADDRESS POINTER (HI) 3715 f72d SKIP2 3716 f72d a9 20 LDA #> ENDADWO ;GET RAM END ADDRESS (HI) 3717 f72f c5 1c CMP STARTAD+1 ;COMPARE WITH RAM POINTER (HI) 3718 f731 d0 ed BNE ALPHA ;NOT ON LAST ;PAGE YET, SO CONTINUE AT 'ALPHA' 3719 f733 a9 00 LDA #< ENDADWO ;GET RAM END ADDRESS (LO) 3720 f735 c5 1b CMP STARTAD ;DONE WITH LAST LOCATION ON CURRENT ;PAGE ? 3721 f737 d0 e7 BNE ALPHA ;NO, SO DO SOME MORE 3722 f739 ; 3723 f739 ; 3724 f739 a9 20 LDA #< STARTWO ;GET START ADDRESS (LO) 3725 f73b 85 1b STA STARTAD ;...AND STORE IN RAM POINTER 3726 f73d a9 00 LDA #> STARTWO ;GET START ADDRESS (HI) 3727 f73f 85 1c STA STARTAD+1 ;...AND STORE IN RAM POINTER 3728 f741 ; 3729 f741 ; 3730 f741 c8 INY ;POINT TO NEXT DATA PATTERN TO CHECK 3731 f742 c0 02 CPY #2 ;LAST PATTERN DONE ? 3732 f744 d0 bb BNE FILLMORE ;NO, DO NEXT PATTERN 3733 f746 f0 05 BEQ WITHATTS ;CHECK RAM WITH ATTRIBUTES 3734 f748 ; 3735 f748 ; 3736 f748 ERRVECT3 ;>>> RAM WITHOUT ATTRIBUTE RAM ERROR (20H-1FFFH) <<< 3737 f748 a9 33 LDA #$33 ;LOAD ASCII '3' 3738 f74a 4c ba f6 JMP ERRVECT ;STORE AND EXIT 3739 f74d ; 3740 f74d ; 3741 f74d ;THIS IS WHERE RAM AND ATTRIBUTE RAM GETS TESTED.... (2000H - 7FFFH) 3742 f74d ; 3743 f74d ; 3744 f74d WITHATTS 3745 f74d a9 00 LDA #< STARTW ;GET RAM START ADDRESS (LO) 3746 f74f 85 1b STA STARTAD ;...AND PUT INTO RAM POINTER 3747 f751 a9 20 LDA #> STARTW ;GET RAM START ADRRESS (HI) 3748 f753 85 1c STA STARTAD+1 ;...AND PUT INTO RAM POINTER 3749 f755 ; 3750 f755 ; 3751 f755 a2 00 LDX #0 ;INITIALIZE RAM INDEX POINTER 3752 f757 a0 00 LDY #0 ;INITIALIZE DATPAT & ATTPAT INDEX POINTER 3753 f759 ; 3754 f759 ; 3755 f759 ;LOAD ATTRIBUTE LATCH WITH ATTRIBUTE DATA... 3756 f759 ; 3757 f759 ; 3758 f759 LOADATT 3759 f759 b9 ba f7 LDA ATTPAT,Y ;GET ATTRIBUTE DATA VALUE 3760 f75c 8d 00 a0 STA ATT ;LOAD ATTRIBUTE LATCH 3761 f75f ; 3762 f75f ; 3763 f75f ;FILL RAM WITH DATA PATTERN... 3764 f75f ; 3765 f75f ; 3766 f75f FILLWATT 3767 f75f b9 b8 f7 LDA DATPAT,Y ;GET DATA PATTERN TO CHECK 3768 f762 81 1b STA (STARTAD,X) ;STORE DATPAT IN RAM 3769 f764 e6 1b INC STARTAD ;INCREMENT RAM ADDRESS (LO) 3770 f766 d0 02 BNE SKIPWATT ;IF NO WRAP AROUND, SKIP OVER 3771 f768 e6 1c INC STARTAD+1 ;OTHERWISE, INCREMENT RAM ADDRESS (HI) 3772 f76a SKIPWATT 3773 f76a a9 80 LDA #> ENDADW ;GET END ADDRESS (HI) 3774 f76c c5 1c CMP STARTAD+1 ;ARE WE ON LAST ;PAGE OF RAM ? 3775 f76e d0 ef BNE FILLWATT ;NO, SO DO SOME MORE RAM FILL 3776 f770 a9 00 LDA #< ENDADW ;GET END ADDRESS (LO) 3777 f772 c5 1b CMP STARTAD ;LAST ADDRESS OF CURRENT ;PAGE ? 3778 f774 d0 e9 BNE FILLWATT ;NO, DO SOME MORE RAM FILL 3779 f776 ; 3780 f776 ; 3781 f776 ;NOW CHECK THAT DATA WAS STORED CORRECTLY... 3782 f776 ; 3783 f776 ; 3784 f776 a9 20 LDA # %00100000 ;ENABLE STREAMING MODE (READ CURRENT ATTRIBUTE FROM RAM) 3785 f778 8d 00 a0 STA ATT ;...SEND TO ATT LATCH 3786 f77b ; 3787 f77b ; 3788 f77b CHKATT 3789 f77b a9 00 LDA #< STARTW ;GET RAM START ADDRESS (LO) 3790 f77d 85 1b STA STARTAD ;...AND PUT INTO RAM POINTER 3791 f77f a9 20 LDA #> STARTW ;GET RAM START ADRRESS (HI) 3792 f781 85 1c STA STARTAD+1 ;...AND PUT INTO RAM POINTER 3793 f783 ALPHATT 3794 f783 a1 1b LDA (STARTAD,X) ;GET DATA BYTE FROM RAM 3795 f785 d9 b8 f7 CMP DATPAT,Y ;COMPARE WITH PATTERN THAT SHOULD BE THERE 3796 f788 d0 32 BNE ERRVECT4 ;NOT THERE, SO ERROR 3797 f78a ad 00 a0 LDA ATT ;READ ATTRIBUTE RAM 3798 f78d 29 03 AND # %00000011 ;CLEAR ALL NON-RAM BITS 3799 f78f 09 24 ORA # %00100100 ;RESET EXTRA MODE BITS FOR COMPARE INSTRUCTION 3800 f791 d9 ba f7 CMP ATTPAT,Y ;COMPARE WITH PATTERN THAT SHOULD BE THERE 3801 f794 d0 2b BNE ERRVECT5 ;IF NOT THERE, ERROR 3802 f796 e6 1b INC STARTAD ;INCREMENT START ADDRESS POINTER (LO) 3803 f798 d0 02 BNE SKIP2ATT ;IF NO WRAP AROUND, SKIP OVER NEXT INSTRUCTION 3804 f79a e6 1c INC STARTAD+1 ;INCREMENT START ADDRESS POINTER (HI) 3805 f79c SKIP2ATT 3806 f79c a9 80 LDA #> ENDADW ;GET RAM END ADDRESS (HI) 3807 f79e c5 1c CMP STARTAD+1 ;COMPARE WITH RAM POINTER (HI) 3808 f7a0 d0 e1 BNE ALPHATT ;NOT ON LAST ;PAGE YET, SO CONTINUE AT 'ALPHATT' 3809 f7a2 a9 00 LDA #< ENDADW ;GET RAM END ADDRESS (LO) 3810 f7a4 c5 1b CMP STARTAD ;DONE WITH LAST LOCATION ON CURRENT ;PAGE ? 3811 f7a6 d0 db BNE ALPHATT ;NO, SO DO SOME MORE 3812 f7a8 ; 3813 f7a8 ; 3814 f7a8 a9 00 LDA #< STARTW ;GET START ADDRESS (LO) 3815 f7aa 85 1b STA STARTAD ;...AND STORE IN RAM POINTER 3816 f7ac a9 20 LDA #> STARTW ;GET START ADDRESS (HI) 3817 f7ae 85 1c STA STARTAD+1 ;...AND STORE IN RAM POINTER 3818 f7b0 ; 3819 f7b0 ; 3820 f7b0 c8 INY ;POINT TO NEXT DATA PATTERN TO CHECK 3821 f7b1 c0 02 CPY #2 ;LAST PATTERN DONE ? 3822 f7b3 d0 a4 BNE LOADATT ;NO, DO NEXT PATTERN 3823 f7b5 ; 3824 f7b5 ; 3825 f7b5 4c 3e f8 JMP NOTE ;TEST PASSED, CONTINUE ON... 3826 f7b8 ; 3827 f7b8 ; 3828 f7b8 aa 55 DATPAT DC.B $0AA,$55 3829 f7ba 26 25 ATTPAT DC.B %00100110,%00100101 3830 f7bc ; 3831 f7bc ; 3832 f7bc ERRVECT4 ;>>> RAM PATTERN FAILURE (2000H-7FFFH) <<< 3833 f7bc a9 34 LDA #$34 ;LOAD ASCII '4' 3834 f7be 4c ba f6 JMP ERRVECT ;STORE AND EXIT 3835 f7c1 ERRVECT5 ;>>> ATTRIBUTE RAM PATTERN FAILURE (2000H-7FFFH) <<< 3836 f7c1 a9 35 LDA #$35 ;LOAD ASCII '5' 3837 f7c3 4c ba f6 JMP ERRVECT ;STORE AND EXIT 3838 f7c6 ; 3839 f7c6 ; 3840 f7c6 ;ERROR MESSAGE ROUTINE... 3841 f7c6 ; 3842 f7c6 ; 3843 f7c6 ERROR 3844 f7c6 a2 ff LDX #$0FF ;LOAD FF INTO X REGISTER 3845 f7c8 9a TXS ;TRANSFER INDEX X TO STACK POINTER 3846 f7c9 20 46 ef JSR INIT ;INITIALIZE THE DISPLAY 3847 f7cc ; 3848 f7cc ; 3849 f7cc 20 c8 e0 JSR XFF ;DO A FORM FEED 3850 f7cf ; 3851 f7cf ; 3852 f7cf a0 00 LDY #0 ;INITIALIZE Y INDEX TO ZERO 3853 f7d1 RCHAR 3854 f7d1 98 TYA ;MOVE Y REGISTER TO ACC 3855 f7d2 48 PHA ;...AND SAVE ON STACK 3856 f7d3 b9 e3 f7 LDA MSSG1,Y ;GET NEXT MESSAGE BYTE 3857 f7d6 c9 24 CMP #'$ ;TERMINATOR ? 3858 f7d8 f0 30 BEQ TELLNUM ;YES... INDICATE ERROR NUMBER 3859 f7da 20 c4 e7 JSR DISP ;DISPLAY THE CHARACTER 3860 f7dd 68 PLA ;GET SAVED Y REGISTER 3861 f7de a8 TAY ;...AND PUT BACK INTO Y REGISTER 3862 f7df c8 INY ;INCREMENT MESSAGE INDEX POINTER 3863 f7e0 4c d1 f7 JMP RCHAR ;LOOP AND DISPLAY THE NEXT CHARACTER 3864 f7e3 ; 3865 f7e3 ; 3866 f7e3 ;---------------------------------------------------------------------- 3867 f7e3 36 35 30 32*MSSG1 DC.B "6502 Memory Error. System Halted. ","$" 3868 f80a ;---------------------------------------------------------------------- 3869 f80a ; 3870 f80a ; 3871 f80a TELLNUM 3872 f80a 68 PLA ;ADJUST STACK 3873 f80b a0 00 LDY #0 ;INITIALIZE Y INDEX TO ZERO 3874 f80d TELLNUM1 3875 f80d 98 TYA ;COPY Y INDEX TO ACC 3876 f80e 48 PHA ;...AND SAVE ON STACK 3877 f80f b9 1f f8 LDA MSSG3,Y ;GET NEXT MESSAGE BYTE 3878 f812 c9 24 CMP #'$ ;TERMINATOR ? 3879 f814 f0 15 BEQ TELLNUM2 ;GO DISPLAY ACTUAL NUMBER 3880 f816 20 c4 e7 JSR DISP ;DISPLAY MESSAGE CHARACTER 3881 f819 68 PLA ;GET SAVED Y REGISTER 3882 f81a a8 TAY ;...AND PUT BACK INTO Y REGISTER 3883 f81b c8 INY ;INCREMENT INDEX POINTER 3884 f81c 4c 0d f8 JMP TELLNUM1 ;LOOP AND DISPALY NEXT CHARACTER 3885 f81f ; 3886 f81f ; 3887 f81f ;---------------------------------------------------------------------- 3888 f81f 45 52 52 4f*MSSG3 DC.B "ERROR NUM: ","$" 3889 f82b ;---------------------------------------------------------------------- 3890 f82b ; 3891 f82b ; 3892 f82b TELLNUM2 3893 f82b 68 PLA ;ADJUST STACK 3894 f82c a5 1f LDA ERRNUM ;GET ERROR NUMBER 3895 f82e 20 c4 e7 JSR DISP ;DISPLAY IT 3896 f831 ; 3897 f831 ; 3898 f831 a9 99 LDA #CRASHMD ;GET 8255 COMMAND BYTE 3899 f833 8d 03 90 STA IOCTRL ;SET UP 8255 (A=IN,B=OUT,C=IN) 3900 f836 a5 1f LDA ERRNUM ;LOAD ASCII ERROR NUMBER 3901 f838 8d 01 90 STA IOPB ;SEND TO PORT B 3902 f83b ; 3903 f83b ; 3904 f83b HALT 3905 f83b 4c 3b f8 JMP HALT ;INFINITE LOOP (HALT) 3906 f83e ; 3907 f83e ; 3908 f83e NOTE 3909 f83e a2 ff LDX #$0FF ;LOAD FF INTO X REGISTER 3910 f840 9a TXS ;TRANSFER INDEX X TO STACK POINTER 3911 f841 20 46 ef JSR INIT ;INITIALIZE THE DISPLAY 3912 f844 ; 3913 f844 ; 3914 f844 20 c8 e0 JSR XFF ;DO A FORM FEED 3915 f847 ; 3916 f847 ; 3917 f847 a0 00 LDY #0 ;INITIALIZE Y INDEX TO ZERO 3918 f849 RCHAR2 3919 f849 98 TYA ;COPY Y INDEX TO ACC 3920 f84a 48 PHA ;SAVE ON STACK 3921 f84b b9 5b f8 LDA MSSG2,Y ;GET NEXT MESSAGE BYTE 3922 f84e c9 24 CMP #'$ ;TERMINATOR ? 3923 f850 f0 21 BEQ DONE ;YES... DONE 3924 f852 20 c4 e7 JSR DISP ;IF NOT, DISPLAY THE CHARACTER 3925 f855 68 PLA ;GET SAVED Y INDEX 3926 f856 a8 TAY ;...RESTORE Y INDEX 3927 f857 c8 INY ;INCREMENT MESSAGE INDEX 3928 f858 4c 49 f8 JMP RCHAR2 ;LOOP AND DO THE NEXT CHARACTER 3929 f85b ; 3930 f85b ; 3931 f85b ;---------------------------------------------------------------------- 3932 f85b 53 65 6c 66*MSSG2 DC.B "Self-Test in Progress. ","$" 3933 f873 ;---------------------------------------------------------------------- 3934 f873 ; 3935 f873 ; 3936 f873 DONE 3937 f873 a9 00 LDA #0 ;LOAD UP A NULL CHARACTER 3938 f875 4c 2c e0 JMP DOIT ;YES, TEST PASSED...JUMP TO NORMAL START OF IDLE LOOP 3939 f878 ; 3940 f878 ; 3941 f878 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 3942 f880 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 3943 f888 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 3944 f890 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 3945 f898 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 3946 f8a0 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 3947 f8a8 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 3948 f8b0 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 3949 f8b8 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 3950 f8c0 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 3951 f8c8 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 3952 f8d0 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 3953 f8d8 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 3954 f8e0 00 00 00 00 DS.B 4,0 ;RDB dasm reverse index 3955 f8e4 ;DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 3956 f8e4 ;DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 3957 f8e4 ;DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 3958 f8e4 ;DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 3959 f8e4 ; 3960 f8e4 ; 3961 f8e4 ;PAGE 3962 f8e4 ;THESE ARE THE GRAPHIC CHARACTERS (020H THRU 03FH) (G2 FONT) 3963 f8e4 ; 3964 f8e4 ORG CHARS + (2 * 96 * 12) 3965 f8e4 ; 3966 f8e4 ; 3967 f8e4 00 00 00 00* DC.B $000,$000,$000,$000,$000,$000,$000,$000,$000,$000,$000,$000 ;020 3968 f8f0 00 00 10 38* DC.B $000,$000,$010,$038,$07C,$038,$010,$000,$000,$000,$000,$000 ;021 3969 f8fc 00 54 28 54* DC.B $000,$054,$028,$054,$028,$054,$028,$054,$000,$000,$000,$000 ;022 3970 f908 00 50 50 70* DC.B $000,$050,$050,$070,$05E,$054,$004,$004,$004,$000,$000,$000 ;023 3971 f914 00 78 40 70* DC.B $000,$078,$040,$070,$05E,$050,$01C,$010,$010,$000,$000,$000 ;024 3972 f920 00 78 40 40* DC.B $000,$078,$040,$040,$040,$07E,$012,$01E,$014,$012,$000,$000 ;025 3973 f92c 00 40 40 40* DC.B $000,$040,$040,$040,$07E,$010,$01C,$010,$010,$000,$000,$000 ;026 3974 f938 00 18 24 24* DC.B $000,$018,$024,$024,$018,$000,$000,$000,$000,$000,$000,$000 ;027 3975 f944 00 10 10 7c* DC.B $000,$010,$010,$07C,$010,$010,$000,$07C,$000,$000,$000,$000 ;028 3976 f950 00 48 68 58* DC.B $000,$048,$068,$058,$048,$008,$008,$00E,$000,$000,$000,$000 ;029 3977 f95c 00 50 50 50* DC.B $000,$050,$050,$050,$05E,$024,$004,$004,$004,$000,$000,$000 ;02A 3978 f968 10 10 10 10* DC.B $010,$010,$010,$010,$010,$0F0,$000,$000,$000,$000,$000,$000 ;02B 3979 f974 00 00 00 00* DC.B $000,$000,$000,$000,$000,$0F0,$010,$010,$010,$010,$010,$010 ;02C 3980 f980 00 00 00 00* DC.B $000,$000,$000,$000,$000,$01F,$010,$010,$010,$010,$010,$010 ;02D 3981 f98c 10 10 10 10* DC.B $010,$010,$010,$010,$010,$01F,$000,$000,$000,$000,$000,$000 ;02E 3982 f998 10 10 10 10* DC.B $010,$010,$010,$010,$010,$0FF,$010,$010,$010,$010,$010,$010 ;02F 3983 f9a4 00 ff 00 00* DC.B $000,$0FF,$000,$000,$000,$000,$000,$000,$000,$000,$000,$000 ;030 3984 f9b0 00 00 00 ff* DC.B $000,$000,$000,$0FF,$000,$000,$000,$000,$000,$000,$000,$000 ;031 3985 f9bc 00 00 00 00* DC.B $000,$000,$000,$000,$000,$0FF,$000,$000,$000,$000,$000,$000 ;032 3986 f9c8 00 00 00 00* DC.B $000,$000,$000,$000,$000,$000,$000,$0FF,$000,$000,$000,$000 ;033 3987 f9d4 00 00 00 00* DC.B $000,$000,$000,$000,$000,$000,$000,$000,$000,$000,$0FF,$000 ;034 3988 f9e0 10 10 10 10* DC.B $010,$010,$010,$010,$010,$01F,$010,$010,$010,$010,$010,$010 ;035 3989 f9ec 10 10 10 10* DC.B $010,$010,$010,$010,$010,$0F0,$010,$010,$010,$010,$010,$010 ;036 3990 f9f8 10 10 10 10* DC.B $010,$010,$010,$010,$010,$0FF,$000,$000,$000,$000,$000,$000 ;037 3991 fa04 00 00 00 00* DC.B $000,$000,$000,$000,$000,$0FF,$010,$010,$010,$010,$010,$010 ;038 3992 fa10 10 10 10 10* DC.B $010,$010,$010,$010,$010,$010,$010,$010,$010,$010,$010,$010 ;039 3993 fa1c 00 04 08 10* DC.B $000,$004,$008,$010,$020,$010,$008,$004,$07E,$000,$000,$000 ;03A 3994 fa28 00 20 10 08* DC.B $000,$020,$010,$008,$004,$008,$010,$020,$07E,$000,$000,$000 ;03B 3995 fa34 00 02 7c 24* DC.B $000,$002,$07C,$024,$024,$024,$024,$024,$000,$000,$000,$000 ;03C 3996 fa40 00 00 00 02* DC.B $000,$000,$000,$002,$004,$07E,$010,$07E,$040,$000,$000,$000 ;03D 3997 fa4c 00 00 1c 22* DC.B $000,$000,$01C,$022,$020,$070,$020,$022,$07C,$000,$000,$000 ;03E 3998 fa58 00 00 00 00* DC.B $000,$000,$000,$000,$000,$000,$010,$000,$000,$000,$000,$000 ;03F 3999 fa64 ; 4000 fa64 ; 4001 fa64 ; THE NEXT 32 CHARACTERS ARE GARBAGE CHARACTERS... 4002 fa64 ; (THIS IS WHERE KEITH DAVISON'S ESCAPE SEQUENCES GO) 4003 fa64 ; 4004 fa64 ;SEND ONE SOFT CHARACTER - 12 BYTES, TOP TO BOTTOM. 4005 fa64 ; ESC > > 1 12-BYTES-OF-DATA. 4006 fa64 ; 4007 fa64 ; 4008 fa64 WRITE1 4009 fa64 20 7a fa JSR WRTSUB ;WRITE A SOFT CHARACTER TO SCREEN 4010 fa67 4c 8f e8 JMP DISP2 ;FINISH UP CURSOR POSITIONING AND DO 4011 fa6a ; SOME ATTRIBUTE PROCESSING. 4012 fa6a ; 4013 fa6a ; 4014 fa6a ;WRITE A HORIZONTAL STRING OF SOFT CHARACTERS, 12 BYTES EACH, TOP TO BOTTOM. 4015 fa6a ; ESC > > H #-SOFT-CHARS THAT-BY-12-BYTES-OF-DATA 4016 fa6a ;0=256 BYTES ! 4017 fa6a ; 4018 fa6a ; 4019 fa6a WRITEH 4020 fa6a 20 b9 fa JSR GETCHRY ;GET NUMBER OF SOFT CHARACTERS TO SEND 4021 fa6d 85 aa STA SCRATCH ;SAVE IN TEMPORARY STORAGE 4022 fa6f WRITEHL 4023 fa6f 20 7a fa JSR WRTSUB ;WRITE A SOFT CHARACTER TO SCREEN 4024 fa72 20 9c e8 JSR DISP2A+3 ; 4025 fa75 c6 aa DEC SCRATCH ;DECREMENT CHARACTER COUNT 4026 fa77 d0 f6 BNE WRITEHL ;IF NOT DONE, DO SOME MORE 4027 fa79 60 RTS ;RETURN FROM SUBROUTINE 4028 fa7a ; 4029 fa7a ; 4030 fa7a ;WRITE A SOFT CHARACTER TO SCREEN 4031 fa7a ; 4032 fa7a ; 4033 fa7a WRTSUB 4034 fa7a a0 00 LDY #00 ;SET Y INDEX TO ZERO 4035 fa7c 20 b9 fa JSR GETCHRY ;GET TOP 8 BITS OF CHARACTER CELL 4036 fa7f 91 21 STA (LN0),Y ;STORE IT 4037 fa81 20 b9 fa JSR GETCHRY ;GET NEXT 8 BITS OF CHARACTER CELL 4038 fa84 91 23 STA (LN1),Y ;STORE IT 4039 fa86 20 b9 fa JSR GETCHRY ;GET NEXT 8 BITS 4040 fa89 91 25 STA (LN2),Y ;STORE IT 4041 fa8b 20 b9 fa JSR GETCHRY ;...NEXT 8 BITS 4042 fa8e 91 27 STA (LN3),Y ;STORE IT 4043 fa90 20 b9 fa JSR GETCHRY ;...NEXT 8 BITS 4044 fa93 91 29 STA (LN4),Y ;STORE IT 4045 fa95 20 b9 fa JSR GETCHRY ;...NEXT 8 BITS 4046 fa98 91 2b STA (LN5),Y ;STORE IT 4047 fa9a 20 b9 fa JSR GETCHRY ;...NEXT 8 BITS 4048 fa9d 91 2d STA (LN6),Y ;STORE IT 4049 fa9f 20 b9 fa JSR GETCHRY ;...NEXT 8 BITS 4050 faa2 91 2f STA (LN7),Y ;STORE IT 4051 faa4 20 b9 fa JSR GETCHRY ;...NEXT 8 BITS 4052 faa7 91 31 STA (LN8),Y ;STORE IT 4053 faa9 20 b9 fa JSR GETCHRY ;...NEXT 8 BITS 4054 faac 91 33 STA (LN9),Y ;STORE IT 4055 faae 20 b9 fa JSR GETCHRY ;...NEXT 8 BITS 4056 fab1 91 35 STA (LN10),Y ;STORE IT 4057 fab3 20 b9 fa JSR GETCHRY ;BOTTOM 8 BITS 4058 fab6 91 37 STA (LN11),Y ;STORE IT 4059 fab8 60 RTS ;RETURN FROM SUBROUTINE 4060 fab9 ; 4061 fab9 ;'GETCHR' SUBROUTINE THAT SAVES THE Y INDEX... 4062 fab9 ; 4063 fab9 GETCHRY 4064 fab9 98 TYA ;XFER Y INDEX TO ACC 4065 faba 48 PHA ;SAVE ON STACK 4066 fabb 20 88 e9 JSR GETCHR ;GET NEXT CHARACTER 4067 fabe 85 ad STA SCRATCH+3 ;SAVE CHARACTER IN TEMP RAM LOCATION 4068 fac0 68 PLA ;GET SAVED Y INDEX BACK 4069 fac1 a8 TAY ;MOVE IT BACK TO Y INDEX 4070 fac2 a5 ad LDA SCRATCH+3 ;MOVE SAVED CHARACTER BACK TO ACC 4071 fac4 60 RTS ;RETURN FROM SUBROUTINE 4072 fac5 ; 4073 fac5 ; 4074 fac5 ;DOWN LOAD AN INTEL HEX FORMAT FILE INTO USER RAM. 4075 fac5 ; ESC > : 4076 fac5 ; 4077 fac5 ; 4078 fac5 HEX 4079 fac5 20 ee fa JSR GET2 ;GET DATA BYTE COUNT 4080 fac8 f0 23 BEQ ABORT ;IF ZERO, THEN DONE 4081 faca a8 TAY ;XFER DATA BYTE COUNT TO Y INDEX 4082 facb 20 ee fa JSR GET2 ;GET LOAD ADDRESS, HIGH BYTE 4083 face 85 ab STA SCRATCH+1 ;SAVE IN RAM STORAGE 4084 fad0 20 ee fa JSR GET2 ;GET LOAD ADDRESS, LOW BYTE 4085 fad3 85 aa STA SCRATCH ;SAVE IN RAM STORAGE 4086 fad5 20 ee fa JSR GET2 ;GET "UNUSED BYTE" 4087 fad8 d0 13 BNE ABORT ;IF NOT ZERO, THEN ERROR, SO ABORT 4088 fada HEXLOOP 4089 fada 20 ee fa JSR GET2 ;GET A DATA BYTE 4090 fadd a2 00 LDX #0 ;LOAD X INDEX WITH ZERO 4091 fadf 81 aa STA (SCRATCH,X) ;STORE DATA AT LOAD ADDRESS 4092 fae1 e6 aa INC SCRATCH ;INCREMENT LOAD ADDRESS, LOW BYTE 4093 fae3 d0 02 BNE CONT ;IF NO WRAP AROUND, CONTINUE AT 'CONT' 4094 fae5 e6 ab INC SCRATCH+1 ;OTHERWISE, INCREMENT LOAD ADDRESS, HIGH BYTE 4095 fae7 CONT 4096 fae7 88 DEY ;DECREMENT DATA BYTE COUNT 4097 fae8 d0 f0 BNE HEXLOOP ;IF NOT DONE, DO SOME MORE 4098 faea 20 ee fa JSR GET2 ;FLUSH CHECK SUM BYTE 4099 faed ABORT 4100 faed 60 RTS ;RETURN FROM SUBROUTINE 4101 faee ; 4102 faee ; 4103 faee ;GET 2 ASCII CHARACTERS, CONVERT TO HEX 4104 faee ; 4105 faee ; 4106 faee GET2 4107 faee 20 88 e9 JSR GETCHR ;GET AN ASCII CHARACTER 4108 faf1 20 03 fb JSR CONV ;CONVERT ASCII DATA TO HEX DATA 4109 faf4 0a ASL ;ROTATE DATA ONE BIT LEFT ( X2 ) 4110 faf5 0a ASL ; " " " " " ( X4 ) 4111 faf6 0a ASL ; " " " " " ( X8 ) 4112 faf7 0a ASL ;LOWER NIBBLE NOW UPPER NIBBLE ( X16 ) 4113 faf8 85 ac STA SCRATCH+2 ;SAVE IN TEMP STORAGE 4114 fafa 20 88 e9 JSR GETCHR ;GET AN ASCII CHARACTER 4115 fafd 20 03 fb JSR CONV ;CONVERT ASCII DATA TO HEX DATA 4116 fb00 05 ac ORA SCRATCH+2 ;COMBINE UPPER & LOWER HEX NIBBLES 4117 fb02 60 RTS ;RETURN FROM SUBROUTINE 4118 fb03 ; 4119 fb03 ; 4120 fb03 ;CONVERT ONE HEX DIGIT TO NUMBER 4121 fb03 ; 4122 fb03 ; 4123 fb03 CONV 4124 fb03 38 SEC ;PREPAER FOR A SUBTRACT 4125 fb04 e9 30 SBC #$30 ;SUBTRACT AN ASCII '0' 4126 fb06 c9 11 CMP #$11 ;WAS CHARACTER GREATER THAN ASCII '9' ? 4127 fb08 90 03 BCC CONVNUM ;NO, SO EXIT ROUTINE 4128 fb0a 38 SEC ;YES, SO PREPARE TO SUBTRACT 4129 fb0b e9 07 SBC #$07 ;ADJUST ASCII 'A' THRU 'F' TO HEX 4130 fb0d CONVNUM 4131 fb0d 60 RTS ;RETURN FROM SUBROUTINE 4132 fb0e ; 4133 fb0e ; 4134 fb0e 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4135 fb16 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4136 fb1e 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4137 fb26 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4138 fb2e 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4139 fb36 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4140 fb3e 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4141 fb46 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4142 fb4e 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4143 fb56 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4144 fb5e 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4145 fb66 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4146 fb6e 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4147 fb76 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4148 fb7e 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4149 fb86 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4150 fb8e 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4151 fb96 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4152 fb9e 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4153 fba6 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4154 fbae 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4155 fbb6 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4156 fbbe 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4157 fbc6 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4158 fbce 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4159 fbd6 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4160 fbde 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4161 fbe6 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4162 fbee 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4163 fbf6 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4164 fbfe 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4165 fc06 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4166 fc0e 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4167 fc16 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4168 fc1e 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4169 fc26 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4170 fc2e 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4171 fc36 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4172 fc3e 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4173 fc46 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4174 fc4e 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4175 fc56 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4176 fc5e 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4177 fc66 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4178 fc6e 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4179 fc76 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4180 fc7e 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4181 fc86 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4182 fc8e 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4183 fc96 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4184 fc9e 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4185 fca6 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4186 fcae 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4187 fcb6 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4188 fcbe 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4189 fcc6 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4190 fcce 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4191 fcd6 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4192 fcde 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4193 fce6 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4194 fcee 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4195 fcf6 00 00 00 00* DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4196 fcfe 00 00 DS.B 2,0 ;RDB dasm reverse index 4197 fd00 ;DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4198 fd00 ;DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4199 fd00 ;DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4200 fd00 ;DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4201 fd00 ;DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4202 fd00 ;DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4203 fd00 ;DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4204 fd00 ;DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4205 fd00 ;DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4206 fd00 ;DC.B 0,0,0,0,0,0,0,0 ;FILL IN EMPTY HOLES OF ROM 4207 fd00 ; 4208 fd00 ; 4209 fd00 ;PAGE 4210 fd00 ORG PROM + PROMLEN - $0300 4211 fd00 ;THE TABLE MUST BEGIN ON A ;PAGE BOUNDARY 4212 fd00 4213 fd00 GLNTBL ;GRAPHICS RASTER LINE ADDRESS TABLE. 4214 fd00 ;THIS TABLE CONSISTS OF 300 ENTRIES, ONE FOR EACH RASTER LINE ON THE 4215 fd00 ; SCREEN. EACH ENTRY IS THE ABSOLUTE ADDRESS IN MEMORY OF THE 4216 fd00 ; CORRESPONDING RASTER LINE'S FIRST BYTE, ASSUMING THAT THE CRTC 4217 fd00 ; SCREEN HOME OFFSET IS 0000H. THE ACTUAL SCREEN HOME OFFSET IS THE 4218 fd00 ; SCREEN HOME ADDRESS FROM THE CRTC ANDED WITH 1FFFH. 4219 fd00 4220 fd00 00 20 DC.W (0*80) +$2000 4221 fd02 00 40 DC.W (0*80) +$4000 4222 fd04 00 60 DC.W (0*80) +$6000 4223 fd06 50 20 DC.W (1*80) +$2000 4224 fd08 50 40 DC.W (1*80) +$4000 4225 fd0a 50 60 DC.W (1*80) +$6000 4226 fd0c a0 20 DC.W (2*80) +$2000 4227 fd0e a0 40 DC.W (2*80) +$4000 4228 fd10 a0 60 DC.W (2*80) +$6000 4229 fd12 f0 20 DC.W (3*80) +$2000 4230 fd14 f0 40 DC.W (3*80) +$4000 4231 fd16 f0 60 DC.W (3*80) +$6000 4232 fd18 40 21 DC.W (4*80) +$2000 4233 fd1a 40 41 DC.W (4*80) +$4000 4234 fd1c 40 61 DC.W (4*80) +$6000 4235 fd1e 90 21 DC.W (5*80) +$2000 4236 fd20 90 41 DC.W (5*80) +$4000 4237 fd22 90 61 DC.W (5*80) +$6000 4238 fd24 e0 21 DC.W (6*80) +$2000 4239 fd26 e0 41 DC.W (6*80) +$4000 4240 fd28 e0 61 DC.W (6*80) +$6000 4241 fd2a 30 22 DC.W (7*80) +$2000 4242 fd2c 30 42 DC.W (7*80) +$4000 4243 fd2e 30 62 DC.W (7*80) +$6000 4244 fd30 80 22 DC.W (8*80) +$2000 4245 fd32 80 42 DC.W (8*80) +$4000 4246 fd34 80 62 DC.W (8*80) +$6000 4247 fd36 d0 22 DC.W (9*80) +$2000 4248 fd38 d0 42 DC.W (9*80) +$4000 4249 fd3a d0 62 DC.W (9*80) +$6000 4250 fd3c 20 23 DC.W (10*80) +$2000 4251 fd3e 20 43 DC.W (10*80) +$4000 4252 fd40 20 63 DC.W (10*80) +$6000 4253 fd42 70 23 DC.W (11*80) +$2000 4254 fd44 70 43 DC.W (11*80) +$4000 4255 fd46 70 63 DC.W (11*80) +$6000 4256 fd48 c0 23 DC.W (12*80) +$2000 4257 fd4a c0 43 DC.W (12*80) +$4000 4258 fd4c c0 63 DC.W (12*80) +$6000 4259 fd4e 10 24 DC.W (13*80) +$2000 4260 fd50 10 44 DC.W (13*80) +$4000 4261 fd52 10 64 DC.W (13*80) +$6000 4262 fd54 60 24 DC.W (14*80) +$2000 4263 fd56 60 44 DC.W (14*80) +$4000 4264 fd58 60 64 DC.W (14*80) +$6000 4265 fd5a b0 24 DC.W (15*80) +$2000 4266 fd5c b0 44 DC.W (15*80) +$4000 4267 fd5e b0 64 DC.W (15*80) +$6000 4268 fd60 00 25 DC.W (16*80) +$2000 4269 fd62 00 45 DC.W (16*80) +$4000 4270 fd64 00 65 DC.W (16*80) +$6000 4271 fd66 50 25 DC.W (17*80) +$2000 4272 fd68 50 45 DC.W (17*80) +$4000 4273 fd6a 50 65 DC.W (17*80) +$6000 4274 fd6c a0 25 DC.W (18*80) +$2000 4275 fd6e a0 45 DC.W (18*80) +$4000 4276 fd70 a0 65 DC.W (18*80) +$6000 4277 fd72 f0 25 DC.W (19*80) +$2000 4278 fd74 f0 45 DC.W (19*80) +$4000 4279 fd76 f0 65 DC.W (19*80) +$6000 4280 fd78 40 26 DC.W (20*80) +$2000 4281 fd7a 40 46 DC.W (20*80) +$4000 4282 fd7c 40 66 DC.W (20*80) +$6000 4283 fd7e 90 26 DC.W (21*80) +$2000 4284 fd80 90 46 DC.W (21*80) +$4000 4285 fd82 90 66 DC.W (21*80) +$6000 4286 fd84 e0 26 DC.W (22*80) +$2000 4287 fd86 e0 46 DC.W (22*80) +$4000 4288 fd88 e0 66 DC.W (22*80) +$6000 4289 fd8a 30 27 DC.W (23*80) +$2000 4290 fd8c 30 47 DC.W (23*80) +$4000 4291 fd8e 30 67 DC.W (23*80) +$6000 4292 fd90 80 27 DC.W (24*80) +$2000 4293 fd92 80 47 DC.W (24*80) +$4000 4294 fd94 80 67 DC.W (24*80) +$6000 4295 fd96 d0 27 DC.W (25*80) +$2000 4296 fd98 d0 47 DC.W (25*80) +$4000 4297 fd9a d0 67 DC.W (25*80) +$6000 4298 fd9c 20 28 DC.W (26*80) +$2000 4299 fd9e 20 48 DC.W (26*80) +$4000 4300 fda0 20 68 DC.W (26*80) +$6000 4301 fda2 70 28 DC.W (27*80) +$2000 4302 fda4 70 48 DC.W (27*80) +$4000 4303 fda6 70 68 DC.W (27*80) +$6000 4304 fda8 c0 28 DC.W (28*80) +$2000 4305 fdaa c0 48 DC.W (28*80) +$4000 4306 fdac c0 68 DC.W (28*80) +$6000 4307 fdae 10 29 DC.W (29*80) +$2000 4308 fdb0 10 49 DC.W (29*80) +$4000 4309 fdb2 10 69 DC.W (29*80) +$6000 4310 fdb4 60 29 DC.W (30*80) +$2000 4311 fdb6 60 49 DC.W (30*80) +$4000 4312 fdb8 60 69 DC.W (30*80) +$6000 4313 fdba b0 29 DC.W (31*80) +$2000 4314 fdbc b0 49 DC.W (31*80) +$4000 4315 fdbe b0 69 DC.W (31*80) +$6000 4316 fdc0 00 2a DC.W (32*80) +$2000 4317 fdc2 00 4a DC.W (32*80) +$4000 4318 fdc4 00 6a DC.W (32*80) +$6000 4319 fdc6 50 2a DC.W (33*80) +$2000 4320 fdc8 50 4a DC.W (33*80) +$4000 4321 fdca 50 6a DC.W (33*80) +$6000 4322 fdcc a0 2a DC.W (34*80) +$2000 4323 fdce a0 4a DC.W (34*80) +$4000 4324 fdd0 a0 6a DC.W (34*80) +$6000 4325 fdd2 f0 2a DC.W (35*80) +$2000 4326 fdd4 f0 4a DC.W (35*80) +$4000 4327 fdd6 f0 6a DC.W (35*80) +$6000 4328 fdd8 40 2b DC.W (36*80) +$2000 4329 fdda 40 4b DC.W (36*80) +$4000 4330 fddc 40 6b DC.W (36*80) +$6000 4331 fdde 90 2b DC.W (37*80) +$2000 4332 fde0 90 4b DC.W (37*80) +$4000 4333 fde2 90 6b DC.W (37*80) +$6000 4334 fde4 e0 2b DC.W (38*80) +$2000 4335 fde6 e0 4b DC.W (38*80) +$4000 4336 fde8 e0 6b DC.W (38*80) +$6000 4337 fdea 30 2c DC.W (39*80) +$2000 4338 fdec 30 4c DC.W (39*80) +$4000 4339 fdee 30 6c DC.W (39*80) +$6000 4340 fdf0 80 2c DC.W (40*80) +$2000 4341 fdf2 80 4c DC.W (40*80) +$4000 4342 fdf4 80 6c DC.W (40*80) +$6000 4343 fdf6 d0 2c DC.W (41*80) +$2000 4344 fdf8 d0 4c DC.W (41*80) +$4000 4345 fdfa d0 6c DC.W (41*80) +$6000 4346 fdfc 20 2d DC.W (42*80) +$2000 4347 fdfe 20 4d DC.W (42*80) +$4000 4348 fe00 20 6d DC.W (42*80) +$6000 4349 fe02 70 2d DC.W (43*80) +$2000 4350 fe04 70 4d DC.W (43*80) +$4000 4351 fe06 70 6d DC.W (43*80) +$6000 4352 fe08 c0 2d DC.W (44*80) +$2000 4353 fe0a c0 4d DC.W (44*80) +$4000 4354 fe0c c0 6d DC.W (44*80) +$6000 4355 fe0e 10 2e DC.W (45*80) +$2000 4356 fe10 10 4e DC.W (45*80) +$4000 4357 fe12 10 6e DC.W (45*80) +$6000 4358 fe14 60 2e DC.W (46*80) +$2000 4359 fe16 60 4e DC.W (46*80) +$4000 4360 fe18 60 6e DC.W (46*80) +$6000 4361 fe1a b0 2e DC.W (47*80) +$2000 4362 fe1c b0 4e DC.W (47*80) +$4000 4363 fe1e b0 6e DC.W (47*80) +$6000 4364 fe20 00 2f DC.W (48*80) +$2000 4365 fe22 00 4f DC.W (48*80) +$4000 4366 fe24 00 6f DC.W (48*80) +$6000 4367 fe26 50 2f DC.W (49*80) +$2000 4368 fe28 50 4f DC.W (49*80) +$4000 4369 fe2a 50 6f DC.W (49*80) +$6000 4370 fe2c a0 2f DC.W (50*80) +$2000 4371 fe2e a0 4f DC.W (50*80) +$4000 4372 fe30 a0 6f DC.W (50*80) +$6000 4373 fe32 f0 2f DC.W (51*80) +$2000 4374 fe34 f0 4f DC.W (51*80) +$4000 4375 fe36 f0 6f DC.W (51*80) +$6000 4376 fe38 40 30 DC.W (52*80) +$2000 4377 fe3a 40 50 DC.W (52*80) +$4000 4378 fe3c 40 70 DC.W (52*80) +$6000 4379 fe3e 90 30 DC.W (53*80) +$2000 4380 fe40 90 50 DC.W (53*80) +$4000 4381 fe42 90 70 DC.W (53*80) +$6000 4382 fe44 e0 30 DC.W (54*80) +$2000 4383 fe46 e0 50 DC.W (54*80) +$4000 4384 fe48 e0 70 DC.W (54*80) +$6000 4385 fe4a 30 31 DC.W (55*80) +$2000 4386 fe4c 30 51 DC.W (55*80) +$4000 4387 fe4e 30 71 DC.W (55*80) +$6000 4388 fe50 80 31 DC.W (56*80) +$2000 4389 fe52 80 51 DC.W (56*80) +$4000 4390 fe54 80 71 DC.W (56*80) +$6000 4391 fe56 d0 31 DC.W (57*80) +$2000 4392 fe58 d0 51 DC.W (57*80) +$4000 4393 fe5a d0 71 DC.W (57*80) +$6000 4394 fe5c 20 32 DC.W (58*80) +$2000 4395 fe5e 20 52 DC.W (58*80) +$4000 4396 fe60 20 72 DC.W (58*80) +$6000 4397 fe62 70 32 DC.W (59*80) +$2000 4398 fe64 70 52 DC.W (59*80) +$4000 4399 fe66 70 72 DC.W (59*80) +$6000 4400 fe68 c0 32 DC.W (60*80) +$2000 4401 fe6a c0 52 DC.W (60*80) +$4000 4402 fe6c c0 72 DC.W (60*80) +$6000 4403 fe6e 10 33 DC.W (61*80) +$2000 4404 fe70 10 53 DC.W (61*80) +$4000 4405 fe72 10 73 DC.W (61*80) +$6000 4406 fe74 60 33 DC.W (62*80) +$2000 4407 fe76 60 53 DC.W (62*80) +$4000 4408 fe78 60 73 DC.W (62*80) +$6000 4409 fe7a b0 33 DC.W (63*80) +$2000 4410 fe7c b0 53 DC.W (63*80) +$4000 4411 fe7e b0 73 DC.W (63*80) +$6000 4412 fe80 00 34 DC.W (64*80) +$2000 4413 fe82 00 54 DC.W (64*80) +$4000 4414 fe84 00 74 DC.W (64*80) +$6000 4415 fe86 50 34 DC.W (65*80) +$2000 4416 fe88 50 54 DC.W (65*80) +$4000 4417 fe8a 50 74 DC.W (65*80) +$6000 4418 fe8c a0 34 DC.W (66*80) +$2000 4419 fe8e a0 54 DC.W (66*80) +$4000 4420 fe90 a0 74 DC.W (66*80) +$6000 4421 fe92 f0 34 DC.W (67*80) +$2000 4422 fe94 f0 54 DC.W (67*80) +$4000 4423 fe96 f0 74 DC.W (67*80) +$6000 4424 fe98 40 35 DC.W (68*80) +$2000 4425 fe9a 40 55 DC.W (68*80) +$4000 4426 fe9c 40 75 DC.W (68*80) +$6000 4427 fe9e 90 35 DC.W (69*80) +$2000 4428 fea0 90 55 DC.W (69*80) +$4000 4429 fea2 90 75 DC.W (69*80) +$6000 4430 fea4 e0 35 DC.W (70*80) +$2000 4431 fea6 e0 55 DC.W (70*80) +$4000 4432 fea8 e0 75 DC.W (70*80) +$6000 4433 feaa 30 36 DC.W (71*80) +$2000 4434 feac 30 56 DC.W (71*80) +$4000 4435 feae 30 76 DC.W (71*80) +$6000 4436 feb0 80 36 DC.W (72*80) +$2000 4437 feb2 80 56 DC.W (72*80) +$4000 4438 feb4 80 76 DC.W (72*80) +$6000 4439 feb6 d0 36 DC.W (73*80) +$2000 4440 feb8 d0 56 DC.W (73*80) +$4000 4441 feba d0 76 DC.W (73*80) +$6000 4442 febc 20 37 DC.W (74*80) +$2000 4443 febe 20 57 DC.W (74*80) +$4000 4444 fec0 20 77 DC.W (74*80) +$6000 4445 fec2 70 37 DC.W (75*80) +$2000 4446 fec4 70 57 DC.W (75*80) +$4000 4447 fec6 70 77 DC.W (75*80) +$6000 4448 fec8 c0 37 DC.W (76*80) +$2000 4449 feca c0 57 DC.W (76*80) +$4000 4450 fecc c0 77 DC.W (76*80) +$6000 4451 fece 10 38 DC.W (77*80) +$2000 4452 fed0 10 58 DC.W (77*80) +$4000 4453 fed2 10 78 DC.W (77*80) +$6000 4454 fed4 60 38 DC.W (78*80) +$2000 4455 fed6 60 58 DC.W (78*80) +$4000 4456 fed8 60 78 DC.W (78*80) +$6000 4457 feda b0 38 DC.W (79*80) +$2000 4458 fedc b0 58 DC.W (79*80) +$4000 4459 fede b0 78 DC.W (79*80) +$6000 4460 fee0 00 39 DC.W (80*80) +$2000 4461 fee2 00 59 DC.W (80*80) +$4000 4462 fee4 00 79 DC.W (80*80) +$6000 4463 fee6 50 39 DC.W (81*80) +$2000 4464 fee8 50 59 DC.W (81*80) +$4000 4465 feea 50 79 DC.W (81*80) +$6000 4466 feec a0 39 DC.W (82*80) +$2000 4467 feee a0 59 DC.W (82*80) +$4000 4468 fef0 a0 79 DC.W (82*80) +$6000 4469 fef2 f0 39 DC.W (83*80) +$2000 4470 fef4 f0 59 DC.W (83*80) +$4000 4471 fef6 f0 79 DC.W (83*80) +$6000 4472 fef8 40 3a DC.W (84*80) +$2000 4473 fefa 40 5a DC.W (84*80) +$4000 4474 fefc 40 7a DC.W (84*80) +$6000 4475 fefe 90 3a DC.W (85*80) +$2000 4476 ff00 90 5a DC.W (85*80) +$4000 4477 ff02 90 7a DC.W (85*80) +$6000 4478 ff04 e0 3a DC.W (86*80) +$2000 4479 ff06 e0 5a DC.W (86*80) +$4000 4480 ff08 e0 7a DC.W (86*80) +$6000 4481 ff0a 30 3b DC.W (87*80) +$2000 4482 ff0c 30 5b DC.W (87*80) +$4000 4483 ff0e 30 7b DC.W (87*80) +$6000 4484 ff10 80 3b DC.W (88*80) +$2000 4485 ff12 80 5b DC.W (88*80) +$4000 4486 ff14 80 7b DC.W (88*80) +$6000 4487 ff16 d0 3b DC.W (89*80) +$2000 4488 ff18 d0 5b DC.W (89*80) +$4000 4489 ff1a d0 7b DC.W (89*80) +$6000 4490 ff1c 20 3c DC.W (90*80) +$2000 4491 ff1e 20 5c DC.W (90*80) +$4000 4492 ff20 20 7c DC.W (90*80) +$6000 4493 ff22 70 3c DC.W (91*80) +$2000 4494 ff24 70 5c DC.W (91*80) +$4000 4495 ff26 70 7c DC.W (91*80) +$6000 4496 ff28 c0 3c DC.W (92*80) +$2000 4497 ff2a c0 5c DC.W (92*80) +$4000 4498 ff2c c0 7c DC.W (92*80) +$6000 4499 ff2e 10 3d DC.W (93*80) +$2000 4500 ff30 10 5d DC.W (93*80) +$4000 4501 ff32 10 7d DC.W (93*80) +$6000 4502 ff34 60 3d DC.W (94*80) +$2000 4503 ff36 60 5d DC.W (94*80) +$4000 4504 ff38 60 7d DC.W (94*80) +$6000 4505 ff3a b0 3d DC.W (95*80) +$2000 4506 ff3c b0 5d DC.W (95*80) +$4000 4507 ff3e b0 7d DC.W (95*80) +$6000 4508 ff40 00 3e DC.W (96*80) +$2000 4509 ff42 00 5e DC.W (96*80) +$4000 4510 ff44 00 7e DC.W (96*80) +$6000 4511 ff46 50 3e DC.W (97*80) +$2000 4512 ff48 50 5e DC.W (97*80) +$4000 4513 ff4a 50 7e DC.W (97*80) +$6000 4514 ff4c a0 3e DC.W (98*80) +$2000 4515 ff4e a0 5e DC.W (98*80) +$4000 4516 ff50 a0 7e DC.W (98*80) +$6000 4517 ff52 f0 3e DC.W (99*80) +$2000 4518 ff54 f0 5e DC.W (99*80) +$4000 4519 ff56 f0 7e DC.W (99*80) +$6000 4520 ff58 4521 ff58 ;PAGE 4522 ff58 ;DATA TABLE FOR LINE ADDRESSES. 4523 ff58 ;THIS TABLE HAS THE ADDRESS OFFSET FROM THE HOME ADDRESS FOR 4524 ff58 ; EACH OF THE 25 LINES ON THE SCREEN. 4525 ff58 4526 ff58 00 LOLINTBL DC.B < (0 * (4*80)) 4527 ff59 40 DC.B < (1 * (4*80)) 4528 ff5a 80 DC.B < (2 * (4*80)) 4529 ff5b c0 DC.B < (3 * (4*80)) 4530 ff5c 00 DC.B < (4 * (4*80)) 4531 ff5d 40 DC.B < (5 * (4*80)) 4532 ff5e 80 DC.B < (6 * (4*80)) 4533 ff5f c0 DC.B < (7 * (4*80)) 4534 ff60 00 DC.B < (8 * (4*80)) 4535 ff61 40 DC.B < (9 * (4*80)) 4536 ff62 80 DC.B < (10 * (4*80)) 4537 ff63 c0 DC.B < (11 * (4*80)) 4538 ff64 00 DC.B < (12 * (4*80)) 4539 ff65 40 DC.B < (13 * (4*80)) 4540 ff66 80 DC.B < (14 * (4*80)) 4541 ff67 c0 DC.B < (15 * (4*80)) 4542 ff68 00 DC.B < (16 * (4*80)) 4543 ff69 40 DC.B < (17 * (4*80)) 4544 ff6a 80 DC.B < (18 * (4*80)) 4545 ff6b c0 DC.B < (19 * (4*80)) 4546 ff6c 00 DC.B < (20 * (4*80)) 4547 ff6d 40 DC.B < (21 * (4*80)) 4548 ff6e 80 DC.B < (22 * (4*80)) 4549 ff6f c0 DC.B < (23 * (4*80)) 4550 ff70 00 DC.B < (24 * (4*80)) 4551 ff71 4552 ff71 00 HILINTBL DC.B > (0 * (4*80)) 4553 ff72 01 DC.B > (1 * (4*80)) 4554 ff73 02 DC.B > (2 * (4*80)) 4555 ff74 03 DC.B > (3 * (4*80)) 4556 ff75 05 DC.B > (4 * (4*80)) 4557 ff76 06 DC.B > (5 * (4*80)) 4558 ff77 07 DC.B > (6 * (4*80)) 4559 ff78 08 DC.B > (7 * (4*80)) 4560 ff79 0a DC.B > (8 * (4*80)) 4561 ff7a 0b DC.B > (9 * (4*80)) 4562 ff7b 0c DC.B > (10 * (4*80)) 4563 ff7c 0d DC.B > (11 * (4*80)) 4564 ff7d 0f DC.B > (12 * (4*80)) 4565 ff7e 10 DC.B > (13 * (4*80)) 4566 ff7f 11 DC.B > (14 * (4*80)) 4567 ff80 12 DC.B > (15 * (4*80)) 4568 ff81 14 DC.B > (16 * (4*80)) 4569 ff82 15 DC.B > (17 * (4*80)) 4570 ff83 16 DC.B > (18 * (4*80)) 4571 ff84 17 DC.B > (19 * (4*80)) 4572 ff85 19 DC.B > (20 * (4*80)) 4573 ff86 1a DC.B > (21 * (4*80)) 4574 ff87 1b DC.B > (22 * (4*80)) 4575 ff88 1c DC.B > (23 * (4*80)) 4576 ff89 1e DC.B > (24 * (4*80)) 4577 ff8a 4578 ff8a 60 CTRLTST DC.B $60 ;BIT MASK FOR TESTING FOR CONTROL CHARACTERS 4579 ff8b 4580 ff8b 80 40 20 10 BITPAT DC.B $080,$040,$020,$010 4581 ff8f 08 04 02 01 DC.B $008,$004,$002,$001 4582 ff93 4583 ff93 ff ff 01 01 QSTEPX DC.B -1,-1,1,1 ;XSTEP FOR QUADRANTS I, II, III, IV 4584 ff97 01 ff ff 01 QSTEPY DC.B 1,-1,-1,1 ;YSTEP FOR QUADRANTS I, II, III, IV 4585 ff9b 4586 ff9b ;PAGE 4587 ff9b ;DATA TABLES FOR INITIALIZATION. 4588 ff9b ; (1050 DISPLAY) 4589 ff9b 4590 ff9b CRTTBL ;FOR THE CRT CONTROLLER. 4591 ff9b 63 DC.B 100 - 1 ;TOTAL HORIZONTAL CHARACTERS - 1 4592 ff9c 50 DC.B 80 ;DISPLAYED HORIZONTAL CHARACTERS 4593 ff9d 52 DC.B 83 - 1 ;START OF HORIZONTAL SYNC - 1 ( IN CHARACTERS) 4594 ff9e 3d DC.B (3*16) + 13 ;VERTICAL SYNC 3 RASTERS WIDE AND 4595 ff9f ; HORIZONTAL SYNC 13 CHARACTERS WIDE 4596 ff9f 69 DC.B 106 - 1 ;TOTAL VERTICAL CHARACTER LINES - 1 4597 ffa0 02 DC.B 2 ;ADDITIONAL INCREMENT OF RASTER LINES TO TOTAL VERTICAL 4598 ffa1 64 DC.B 100 ;DISPLAYED VERTICAL CHARACTER LINES 4599 ffa2 64 DC.B 100 ;START OF VERTICAL SYNC - 1 (IN CHAR LINES) 4600 ffa3 ; VALUE IS 100-1 FOR ORIGINAL CODE 4601 ffa3 00 DC.B 0 ;NO DISPLAY BLANKING SKEW, 4602 ffa4 ; CURSOR SKEW, 4603 ffa4 ; OR INTERLACING 4604 ffa4 02 DC.B 2 ;MAXIMUM RASTER LINE COUNT IN A CHARACTER 4605 ffa5 20 DC.B $20 ;NO HARDWARE CURSOR, 4606 ffa6 ; STARTING ON RASTER LINE 0 OF A CHARACTER 4607 ffa6 00 DC.B 0 ; AND ENDING ON RASTER LINE 0 OF THE CHARACTER 4608 ffa7 4609 ffa7 ;PAGE 4610 ffa7 ;THE PROTOTYPE OF THE SOFTWARE CURSOR. 4611 ffa7 00 00 00 00 CURSOR DC.B 0,0,0,0 4612 ffab 00 00 00 00 DC.B 0,0,0,0 4613 ffaf 00 18 3c 7e DC.B 0,$18,$03C,$7E 4614 ffb3 00 00 00 00* DS.B 71,0 ; RDB zero fill to match ROM dump 4615 fffa ;PAGE 4616 fffa ;JUMP VECTORS FOR INTERRUPTS AND RESET. 4617 fffa 4618 fffa ORG PROM + PROMLEN - $0100 + $00FA 4619 fffa fa 1f DC.W NMI ;NON-MASKABLE INTERRUPT VECTOR 4620 fffc e4 f5 DC.W HASHTEST ;RESET VECTOR (DO Power-Up-Diagnostics) 4621 fffe fd 1f DC.W XINT ;INTERRUPT VECTOR 4622 10000 4623 10000 END