HIRES.S (8915B)
1 * draz hires 2 org equ $8400 3 lst off 4 5 org org 6 7 put hrparams 8 put hrtables 9 *------------------------------- 10 ds org+$a00-* 11 12 JMP CLS 13 JMP LAY 14 jmp DIAMOND 15 16 * Local vars 17 18 dum $e0 19 20 BASE ds 2 21 IMSAVE ds 2 22 XSAVE ds 1 23 YSAVE ds 1 24 WIDTH ds 1 25 HEIGHT ds 1 26 TOPEDGE ds 1 27 OFFLEFT ds 1 28 OFFRIGHT ds 1 29 YREG ds 1 30 CARRY ds 1 31 AMASK ds 1 32 BMASK ds 1 33 VISWIDTH ds 1 34 RMOST ds 1 35 36 saveimg ds 3 37 destheight ds 1 38 temp1 ds 1 39 imgline ds 1 40 41 dend 42 43 *------------------------------- 44 * C L S 45 * 46 * Clear screen to black2 47 48 CLS LDA PAGE 49 CLC 50 ADC #$20 51 STA BASE+1 52 53 LDY #$00 54 STY BASE 55 56 :1 LDA #$80 57 58 :2 STA (BASE),Y 59 INY 60 BNE :2 61 62 INC BASE+1 63 LDA BASE+1 64 AND #$1F 65 BNE :1 66 67 RTS 68 69 *------------------------------- 70 * L A Y 71 * 72 * Parameters: 73 * 74 * PAGE $00 = page 1, $20 = page 2 75 * XCO byte (0=left, 39=right) 76 * YCO line (0=top, 191=bottom) 77 * OFFSET # bits to shift right (0-6) 78 * IMAGE starting address of image table 79 * OPACITY Bits 0-1: 0 = AND, 1 = ORA, 2 = STA, 3 = EOR 80 * Bit 7: 0 = normal, 1 = mirror 81 * 82 * Image table: 83 * 84 * 0: width (# bytes) 85 * 1: height (# lines) 86 * 2-n: image reading L-R, T-B 87 * 88 *------------------------------- 89 90 LAY LDA OPACITY 91 BPL :99 92 93 AND #$7F 94 STA OPACITY 95 JMP MLAY 96 97 :99 JSR PREPREP 98 JSR PREPARE 99 CMP #-1 100 BCC :8 101 JMP DONE 102 103 :8 LDX OFFSET 104 105 LDA SHIFTL,X 106 STA :91+1 107 LDA SHIFTH,X 108 STA :91+2 109 110 LDA CARRYL,X 111 STA :90+1 112 STA :92+1 113 LDA CARRYH,X 114 STA :90+2 115 STA :92+2 116 117 LDA AMASKS,X 118 STA AMASK 119 LDA BMASKS,X 120 STA BMASK 121 122 LDX OPACITY 123 LDA OPCODE,X 124 STA :80 125 STA :81 126 127 LDY YCO 128 129 :0 LDA YLO,Y 130 CLC 131 ADC XCO 132 STA BASE 133 134 LDA YHI,Y 135 ADC PAGE 136 STA BASE+1 137 138 LDY OFFLEFT 139 BEQ :2 140 141 * Take CARRY from off left edge 142 143 DEY 144 LDA (IMAGE),Y 145 TAX 146 :90 LDA $FFFF,X ;CARRYn 147 STA CARRY 148 149 LDA IMAGE 150 CLC 151 ADC OFFLEFT 152 STA IMAGE 153 BCC :1 154 INC IMAGE+1 155 156 :1 LDY #0 157 158 LDA VISWIDTH 159 STA WIDTH 160 BNE :3 161 BEQ :4 ;Zero width 162 163 * Start a new line at left edge 164 165 :2 LDA (BASE),Y 166 AND AMASK 167 STA CARRY 168 169 * Lay line down left-to-right fast as you can 170 171 :3 LDA (IMAGE),Y 172 TAX 173 :91 LDA $FFFF,X ;SHIFTn 174 ORA CARRY ;Combine with carryover from previous byte 175 176 :80 STA (BASE),Y ;STA/ORA/AND/EOR depending on OPACITY 177 STA (BASE),Y 178 179 :92 LDA $FFFF,X ;CARRYn 180 STA CARRY ;Carry over to next byte 181 182 INY 183 CPY VISWIDTH 184 BCC :3 185 186 * Extra byte on right (carryover) 187 188 LDA OFFRIGHT 189 BNE :5 ;Rightmost byte is offscreen 190 191 :4 LDA (BASE),Y 192 193 AND BMASK 194 ORA CARRY 195 :81 STA (BASE),Y 196 STA (BASE),Y 197 198 * Next line up 199 200 :5 LDA WIDTH 201 CLC 202 ADC IMAGE 203 STA IMAGE 204 BCC :6 205 INC IMAGE+1 206 207 :6 DEC YCO 208 LDY YCO 209 CPY TOPEDGE 210 BNE :0 211 212 * Restore parameters 213 214 DONE LDA IMSAVE 215 STA IMAGE 216 LDA IMSAVE+1 217 STA IMAGE+1 218 219 LDA XSAVE 220 STA XCO 221 LDA YSAVE 222 STA YCO 223 224 RTS 225 226 *------------------------------- 227 * P R E P A R E 228 * 229 * Save parameters 230 231 PREPREP LDA IMAGE 232 STA IMSAVE 233 LDA IMAGE+1 234 STA IMSAVE+1 235 236 LDA XCO 237 STA XSAVE 238 LDA YCO 239 STA YSAVE 240 241 * Read first two bytes (width, height) of image table 242 243 LDY #0 244 LDA (IMAGE),Y 245 STA WIDTH 246 247 INY 248 LDA (IMAGE),Y 249 STA HEIGHT 250 251 LDA IMAGE 252 CLC 253 ADC #2 254 STA IMAGE 255 BCC :3 256 INC IMAGE+1 257 258 :3 RTS 259 260 *------------------------------- 261 * PREPARE 262 * 263 * Crop top and bottom edges 264 265 PREPARE LDA YCO 266 SEC 267 SBC HEIGHT 268 CMP #192 269 BCC :4 ;Top is onscreen 270 271 LDA YCO 272 CMP #192 273 BCS :8 ;Top and bottom o.s. - skip it 274 275 LDA #-1 ;Top is offscreen 276 :4 STA TOPEDGE ;(Top line -1) 277 278 LDY YCO 279 :41 CPY #192 280 BCC :6 ;Bottom is onscreen 281 282 * Advance pointer past bottom offscreen portion 283 284 LDA IMAGE 285 CLC 286 ADC WIDTH 287 STA IMAGE 288 BCC :5 289 INC IMAGE+1 290 291 :5 DEY 292 STY YCO 293 BNE :41 294 295 * Crop sides 296 297 :6 LDA #0 298 STA OFFLEFT 299 STA OFFRIGHT 300 STA RMOST 301 302 LDA WIDTH 303 STA VISWIDTH 304 305 LDA XCO 306 BPL :7 ;Left edge is onscreen 307 308 * Left edge is offscreen 309 310 EOR #$FF 311 CLC 312 ADC #1 313 STA OFFLEFT ;Width of o.s. portion 314 315 LDA XCO 316 CLC 317 ADC WIDTH 318 BCC :8 ;Entire image is o.s. - skip it 319 STA VISWIDTH ;(Width of onscreen portion) 320 321 LDA #0 322 STA XCO 323 BEQ LAYON 324 325 * Left edge OK 326 327 :7 CMP #40 328 BCS :8 ;Entire image is o.s. - skip it 329 330 CLC 331 ADC WIDTH 332 CMP #40 333 BCC LAYON ;Right edge OK - lay on 334 335 SEC 336 SBC #39 337 STA OFFRIGHT ;Width of o.s. portion 338 339 LDA #40 340 SEC 341 SBC XCO 342 STA VISWIDTH 343 344 LDA WIDTH 345 SEC 346 SBC VISWIDTH 347 STA RMOST 348 349 BPL LAYON 350 351 :8 LDA #-1 ;Image is o.s. - skip it 352 353 LAYON RTS 354 355 356 *------------------------------- 357 * M I R R O R L A Y 358 * 359 * Specified starting byte (XCO,YCO) is image's bottom 360 * right corner, not bottom left; bytes are read off image 361 * table R-L, T-B and mirrored before printing. 362 363 MLAY JSR PREPREP 364 365 LDA XCO 366 SEC 367 SBC WIDTH 368 STA XCO 369 370 JSR PREPARE 371 CMP #-1 372 BCC :8 373 JMP DONE 374 375 :8 LDX OFFSET 376 377 LDA SHIFTL,X 378 STA :91+1 379 LDA SHIFTH,X 380 STA :91+2 381 382 LDA CARRYL,X 383 STA :90+1 384 STA :92+1 385 LDA CARRYH,X 386 STA :90+2 387 STA :92+2 388 389 LDA AMASKS,X 390 STA AMASK 391 LDA BMASKS,X 392 STA BMASK 393 394 LDX OPACITY 395 LDA OPCODE,X 396 STA :80 397 STA :81 398 399 * Lay on 400 401 LDY YCO 402 403 :0 LDA YLO,Y 404 STA BASE 405 406 LDA YHI,Y 407 CLC 408 ADC PAGE 409 STA BASE+1 410 411 LDY OFFLEFT 412 BEQ :2 413 414 * Take CARRY from off left edge 415 416 LDY VISWIDTH 417 LDA (IMAGE),Y 418 TAX 419 420 LDA MIRROR-$80,X 421 TAX 422 423 :90 LDA $FFFF,X ;CARRYn 424 STA CARRY 425 426 :1 DEY 427 BPL :3 428 BMI :4 429 430 * Start a new line at left edge 431 432 :2 LDY XCO 433 LDA (BASE),Y 434 AND AMASK 435 STA CARRY 436 437 LDY WIDTH 438 DEY 439 440 * Lay line down left-to-right fast as you can 441 442 :3 STY YREG 443 LDA (IMAGE),Y 444 TAX 445 446 LDA MIRROR-$80,X 447 TAX 448 449 :91 LDA $FFFF,X ;SHIFTn 450 ORA CARRY ;Combine with carryover from previous byte 451 452 LDY XCO 453 :80 STA (BASE),Y ;STA/ORA/AND/EOR depending on OPACITY 454 STA (BASE),Y 455 456 :92 LDA $FFFF,X ;CARRYn 457 STA CARRY ;Carry over to next byte 458 459 INC BASE 460 461 LDY YREG 462 CPY RMOST 463 BEQ :7 464 465 DEY 466 BPL :3 467 468 * Extra byte on right (carryover) 469 470 :7 LDA OFFRIGHT 471 BNE :5 ;Rightmost byte is offscreen 472 473 :4 LDY XCO 474 LDA (BASE),Y 475 476 AND BMASK 477 ORA CARRY 478 :81 STA (BASE),Y 479 STA (BASE),Y 480 481 * Next line up 482 483 :5 LDA WIDTH 484 CLC 485 ADC IMAGE 486 STA IMAGE 487 BCC :6 488 INC IMAGE+1 489 490 :6 DEC YCO 491 LDY YCO 492 CPY TOPEDGE 493 BNE :0 494 495 JMP DONE 496 497 *------------------------------- 498 * F A S T L A Y 499 * 500 * Limitations: No offset - no clipping - no mirroring - 501 * STA only - trashes IMAGE. 502 503 FASTLAY LDY #0 504 LDA (IMAGE),Y 505 STA WIDTH 506 507 INY 508 LDA YCO 509 SEC 510 SBC (IMAGE),Y 511 STA TOPEDGE 512 513 LDA IMAGE 514 CLC 515 ADC #2 516 STA IMAGE 517 BCC :5 518 INC IMAGE+1 519 520 :5 LDX YCO 521 522 :0 LDA YLO,X 523 CLC 524 ADC XCO 525 STA BASE 526 527 LDA YHI,X 528 ADC PAGE 529 STA BASE+1 530 531 LDY #0 532 533 :1 LDA (IMAGE),Y 534 STA (BASE),Y 535 536 INY 537 CPY WIDTH 538 BCC :1 539 540 TYA 541 CLC 542 ADC IMAGE 543 STA IMAGE 544 BCC :2 545 INC IMAGE+1 546 547 :2 DEX 548 CPX TOPEDGE 549 BNE :0 550 551 RTS 552 553 *------------------------------- 554 * 555 * D I A M O N D 556 * 557 * Works like FASTLAY, but it lays down the image 558 * at a slant. 559 * 560 *------------------------------- 561 widtable ;INT(7x/2) for x=0 to 40 562 db 0,3,7,10,14,17,21,24,28 563 db 31,35,38,42,45,49,52,56,59 564 db 63,66,70,73,77,80,84,87,91 565 db 94,98,101,105,108,112,115,119,122 566 db 126,129,133,136,140 567 *------------------------------- 568 569 DIAMOND 570 LDY #0 571 LDA (IMAGE),Y 572 STA WIDTH 573 574 INY 575 LDA (IMAGE),Y ;original image height 576 sta HEIGHT 577 578 ldx WIDTH 579 clc 580 adc widtable,x ;INT(7x/2) 581 sta destheight 582 583 LDA YCO 584 SEC 585 sbc destheight 586 STA TOPEDGE 587 588 LDA IMAGE 589 CLC 590 ADC #2 591 STA IMAGE 592 BCC :5 593 INC IMAGE+1 594 :5 595 596 * Now lay down image (slanted)...L-R, B-T 597 598 ldx YCO ;bottom line of screen dump area 599 600 lda #0 ;bottom line of image 601 sta imgline 602 603 :loop 604 LDA YLO,X 605 CLC 606 ADC XCO 607 STA BASE 608 609 LDA YHI,X 610 ADC PAGE 611 STA BASE+1 ;get base addr 612 613 lda IMAGE 614 sta saveimg 615 lda IMAGE+1 616 sta saveimg+1 617 618 lda imgline 619 sta saveimg+2 620 621 LDY #0 622 623 * Do a line (L-R), 2 bytes at a time 624 625 :loop1 626 jsr getimgbyte ;lda (IMAGE),y 627 and #%00000011 ;2 leftmost bits (on this line) 628 sta temp1 629 630 jsr onelinedn ;move 1 line down & getimgbyte 631 and #%00001100 ;next 2 bits (from line below) 632 ora temp1 633 sta temp1 634 635 jsr onelinedn 636 and #%00110000 ;next 2 bits (from 2 lines down) 637 ora temp1 638 sta temp1 639 640 jsr onelinedn 641 and #%01000000 ;rightmost bit (from 3 lines down) 642 ora temp1 643 ;Got it 644 jsr putbyte 645 646 INY 647 CPY WIDTH 648 bcs :eol 649 650 * Next byte over on this line 651 652 jsr getimgbyte 653 and #%00000001 ;leftmost bit (still from 3 lines down) 654 sta temp1 655 656 jsr onelinedn 657 and #%00000110 ;next 2 bits (from 4 lines down) 658 ora temp1 659 sta temp1 660 661 jsr onelinedn 662 and #%00011000 ;next 2 bits (from 5 lines down) 663 ora temp1 664 sta temp1 665 666 jsr onelinedn 667 and #%01100000 ;rightmost 2 bits (from 6 lines down) 668 ora temp1 669 670 jsr putbyte 671 672 jsr onelinedn ;7 lines down (prepare for next 2 bytes) 673 674 INY 675 CPY WIDTH 676 bcc :loop1 ;next 2 bytes in this line 677 678 :eol 679 680 * Done with this line 681 * Up to the next line 682 683 lda saveimg 684 sta IMAGE 685 lda saveimg+1 686 sta IMAGE+1 ;reset IMAGE to point to this line 687 lda saveimg+2 688 sta imgline 689 690 lda WIDTH 691 CLC 692 ADC IMAGE 693 STA IMAGE 694 BCC :2 695 INC IMAGE+1 696 :2 697 inc imgline 698 699 DEX 700 CPX TOPEDGE 701 beq :rts 702 703 cpx #192 704 bcs :rts ;offscreen 705 706 jmp :loop 707 708 :rts rts 709 710 *------------------------------- 711 onelinedn 712 lda IMAGE 713 sec 714 sbc WIDTH 715 sta IMAGE 716 717 bcs :1 718 dec IMAGE+1 719 :1 720 721 dec imgline 722 723 jmp getimgbyte 724 725 *------------------------------- 726 getimgbyte 727 lda imgline 728 cmp HEIGHT 729 bcs :outside 730 731 lda (IMAGE),y 732 rts 733 734 :outside lda #$80 ;blank space outside image 735 rts 736 *------------------------------- 737 putbyte ;in: A 738 cpy #40 739 bcs :skip 740 741 ora #$80 742 sta (BASE),y 743 744 :skip rts 745 *------------------------------- 746 lst 747 eof ds 1 748 lst off 749 *-------------------------------