DBLHIRES.S (12403B)
1 * ed/dblhires 2 org = $ee00 3 lst off 4 *------------------------------- 5 * 6 * D B L H I R E S 7 * 8 * Sits in aux l.c. 9 * Expects dblhires image tables to be in auxmem 10 * (We use aux l.c. bank 2) 11 * Carrybuf & dpeelbufs must also be in auxmem 12 * 13 * Assume going in that aux l.c. & bank 2 are switched in 14 * 15 *------------------------------- 16 put hrparams 17 18 CARRYBUF = $f700 19 20 dblimage = $d000 ;aux l.c. bank 2 21 textset = $d800 22 23 *------------------------------- 24 org org 25 26 JMP DBLCLS 27 JMP DBLLAY 28 JMP DBLFAST 29 JMP DBLSAVE 30 jmp DBLWIPE 31 32 jmp DBLPRINT 33 jmp DBLIMSEEK 34 jmp DBLORA 35 36 *------------------------------- 37 * Local vars 38 39 locals = $f0 40 locals2 = $18 41 42 dum locals 43 44 BASE ds 2 45 IMSAVE ds 2 46 XSAVE ds 1 47 YSAVE ds 1 48 WIDTH ds 1 49 HEIGHT ds 1 50 51 INDEX ds 1 52 RAM ds 1 53 SCREEN ds 1 54 AMASK ds 1 55 BMASK ds 1 56 57 dcolor ds 2 ;address of 4-byte color table 58 colortemp ds 1 59 60 dum locals2 61 62 bits ds 1 63 bytes ds 1 64 temp ds 1 65 66 dend 67 68 *------------------------------- 69 * 70 * D B L C L S 71 * 72 * Clear screen 73 * 74 *------------------------------- 75 DBLCLS STA $C004 ;RAMWRT main 76 JSR CLS 77 78 STA $C005 ;RAMWRT aux 79 80 CLS LDA PAGE 81 CLC 82 ADC #$20 83 STA BASE+1 84 85 LDY #0 86 STY BASE 87 88 :1 LDA #$80 ;black 89 90 :2 STA (BASE),Y 91 INY 92 BNE :2 93 94 INC BASE+1 95 LDA BASE+1 96 AND #$1F 97 BNE :1 98 99 RTS 100 101 *------------------------------- 102 * 103 * D B L L A Y 104 * 105 * Same I/O structure as single-hires LAY except: 106 * 1. Image table is listed by columns (T-B, L-R) 107 * 2. XCO range is 0-79 108 * 3. No mirroring 109 * 110 *------------------------------- 111 DBLLAY 112 lda OPACITY 113 cmp #4 ;4=MASK 114 bne :notmask 115 jmp DBLMASK 116 117 :notmask jsr PREP 118 119 LDA XCO ;0-79 120 AND #1 121 EOR #1 122 STA RAM ;0=main, 1=aux 123 124 * Divide XCO by two 125 126 LDA XCO 127 BPL :15 128 129 EOR #$FF 130 LSR 131 EOR #$FF 132 STA XCO ;negative XCO 133 134 JMP :1 135 136 :15 LSR XCO ;0-39 137 138 * Self-mod code depending on OFFSET and OPACITY 139 140 :1 LDX OFFSET ;0-6 141 142 LDA SHIFTL,X 143 STA :91+1 144 LDA SHIFTH,X 145 STA :91+2 146 147 LDA CARRYL,X 148 STA :92+1 149 LDA CARRYH,X 150 STA :92+2 151 152 LDA AMASKS,X 153 STA AMASK 154 155 LDA BMASKS,X 156 STA BMASK 157 158 LDX OPACITY ;0=AND, 1=ORA, 2=STA, 3=EOR 159 LDA OPCODE,X 160 STA :81 161 STA :82 162 163 JSR INITCARRY 164 165 * Start new column at top edge of image (YCO) 166 167 :2 LDX YSAVE 168 169 LDA #0 170 STA INDEX ;Index to image table 171 172 LDY RAM ;0=main, 1=aux 173 STA $C004,Y ;RAMWRT main/aux 174 175 * Lay column down top-to-bottom 176 177 :loop sta $c003 ;RAMRD aux (where img table is) 178 179 LDA YLO,X 180 STA BASE 181 182 LDA YHI,X 183 CLC 184 ADC PAGE 185 STA BASE+1 186 187 STX YCO 188 189 LDY INDEX ;Indexed from top line of image 190 LDA (IMAGE),Y ;Assume MSB is off 191 ora #$80 ;turn on MSB 192 TAX 193 :91 LDA $FFFF,X ;SHIFTn 194 ORA CARRYBUF,Y 195 196 STA SCREEN 197 198 :92 LDA $FFFF,X ;CARRYn 199 STA CARRYBUF,Y 200 201 LDX YCO 202 cpx TOPCUT 203 bcc :5 204 CPX #192 205 BCS :5 ;Off top or bottom 206 207 LDY XCO 208 CPY #40 209 BCS :5 ;Off left or right 210 211 lda RAM 212 bne :10 213 sta $c002 ;mustn't trash y 214 215 :10 LDA SCREEN 216 :81 STA (BASE),Y ;STA/ORA/AND according to OPACITY 217 STA (BASE),Y 218 219 :5 INX 220 INC INDEX 221 222 LDA INDEX 223 CMP HEIGHT 224 BCC :loop ;Next line down 225 226 * Next column over 227 228 LDA IMAGE 229 CLC 230 ADC HEIGHT 231 STA IMAGE 232 BCC :6 233 INC IMAGE+1 234 235 :6 LDA RAM 236 EOR #1 237 STA RAM 238 BEQ :7 239 INC XCO 240 241 :7 DEC WIDTH 242 BNE :2 243 244 * Extra column on right (carryover) 245 246 LDX YSAVE 247 248 LDA #0 249 STA INDEX ;Index to image table 250 251 LDY RAM ;0=main, 1=aux 252 STA $C004,Y ;RAMWRT 253 STA $C002,Y ;RAMRD 254 255 * Lay column down top-to-bottom 256 257 :30 LDA YLO,X 258 STA BASE 259 260 LDA YHI,X 261 CLC 262 ADC PAGE 263 STA BASE+1 264 265 STX YCO 266 267 LDY INDEX ;Indexed from top line of image 268 269 LDA CARRYBUF,Y 270 STA SCREEN 271 272 LDX YCO 273 cpx TOPCUT 274 bcc :50 275 CPX #192 276 BCS :50 ;Off top or bottom 277 278 LDY XCO 279 CPY #40 280 BCS :50 ;Off left or right 281 282 LDA (BASE),Y 283 284 AND BMASK 285 ORA SCREEN 286 :82 STA (BASE),Y ;STA/ORA/AND according to OPACITY 287 STA (BASE),Y 288 289 :50 INX 290 INC INDEX 291 292 LDA INDEX 293 CMP HEIGHT 294 BCC :30 ;Next line down 295 296 DONE 297 STA $C003 298 STA $C005 ;RAMWRT and RAMRD aux 299 300 LDA IMSAVE 301 STA IMAGE 302 LDA IMSAVE+1 303 STA IMAGE+1 304 305 LDA XSAVE 306 STA XCO 307 LDA YSAVE 308 STA YCO 309 310 RTS 311 312 *------------------------------- 313 * 314 * D B L M A S K 315 * 316 *------------------------------- 317 DBLMASK jsr PREP 318 319 LDA XCO ;0-79 320 AND #1 321 EOR #1 322 STA RAM ;0=main, 1=aux 323 324 * Divide XCO by two 325 326 LDA XCO 327 BPL :15 328 329 EOR #$FF 330 LSR 331 EOR #$FF 332 STA XCO ;negative XCO 333 334 JMP :1 335 336 :15 LSR XCO ;0-39 337 338 * Self-mod code depending on OFFSET and OPACITY 339 340 :1 LDX OFFSET ;0-6 341 342 LDA SHIFTL,X 343 STA :91+1 344 LDA SHIFTH,X 345 STA :91+2 346 347 LDA CARRYL,X 348 STA :92+1 349 LDA CARRYH,X 350 STA :92+2 351 352 LDA AMASKS,X 353 STA AMASK 354 355 LDA BMASKS,X 356 STA BMASK 357 358 JSR INITCARRY 359 360 * Start new column at top edge of image (YCO) 361 362 :2 LDX YSAVE 363 364 LDA #0 365 STA INDEX ;Index to image table 366 367 LDY RAM ;0=main, 1=aux 368 STA $C004,Y 369 370 * Lay column down top-to-bottom 371 372 :loop sta $c003 ;RAMRD aux 373 374 LDA YLO,X 375 STA BASE 376 377 LDA YHI,X 378 CLC 379 ADC PAGE 380 STA BASE+1 381 382 STX YCO 383 384 LDY INDEX ;Indexed from top line of image 385 386 LDA (IMAGE),Y ;Assume MSB is off 387 TAX 388 lda masktabl,x 389 ora #$80 ;turn on MSB 390 tax 391 392 :91 LDA $FFFF,X ;SHIFTn 393 ORA CARRYBUF,Y 394 395 STA SCREEN 396 397 :92 LDA $FFFF,X ;CARRYn 398 STA CARRYBUF,Y 399 400 LDX YCO 401 cpx TOPCUT 402 bcc :5 403 CPX #192 404 BCS :5 ;Off top or bottom 405 406 LDY XCO ;ironic, isn't it? 407 CPY #40 408 BCS :5 ;Off left or right 409 410 lda RAM 411 bne :10 412 sta $c002 ;mustn't trash y 413 414 :10 LDA SCREEN 415 :81 AND (BASE),Y ;STA/ORA/AND according to OPACITY 416 STA (BASE),Y 417 418 :5 INX 419 INC INDEX 420 421 LDA INDEX 422 CMP HEIGHT 423 BCC :loop ;Next line down 424 425 * Next column over 426 427 LDA IMAGE 428 CLC 429 ADC HEIGHT 430 STA IMAGE 431 BCC :6 432 INC IMAGE+1 433 434 :6 LDA RAM 435 EOR #1 436 STA RAM 437 BEQ :7 438 INC XCO 439 440 :7 DEC WIDTH 441 BNE :2 442 443 * Extra column on right (carryover) 444 445 LDX YSAVE 446 447 LDA #0 448 STA INDEX ;Index to image table 449 450 LDY RAM ;0=main, 1=aux 451 STA $C004,Y 452 STA $C002,Y 453 454 * Lay column down top-to-bottom 455 456 :30 LDA YLO,X 457 STA BASE 458 459 LDA YHI,X 460 CLC 461 ADC PAGE 462 STA BASE+1 463 464 STX YCO 465 466 LDY INDEX ;Indexed from top line of image 467 468 LDA CARRYBUF,Y 469 STA SCREEN 470 471 LDX YCO 472 cpx TOPCUT 473 bcc :50 474 CPX #192 475 BCS :50 ;Off top or bottom 476 477 LDY XCO 478 CPY #40 479 BCS :50 ;Off left or right 480 481 LDA (BASE),Y 482 483 AND BMASK 484 ORA SCREEN 485 :82 AND (BASE),Y ;STA/ORA/AND according to OPACITY 486 STA (BASE),Y 487 488 :50 INX 489 INC INDEX 490 491 LDA INDEX 492 CMP HEIGHT 493 BCC :30 ;Next line down 494 495 JMP DONE 496 497 *------------------------------- 498 * 499 * P R E P A R E 500 * 501 *------------------------------- 502 PREP LDA IMAGE 503 STA IMSAVE 504 LDA IMAGE+1 505 STA IMSAVE+1 506 507 LDA XCO 508 STA XSAVE 509 LDA YCO 510 STA YSAVE 511 512 LDY #0 513 LDA (IMAGE),Y 514 STA WIDTH 515 516 INY 517 LDA (IMAGE),Y 518 STA HEIGHT 519 520 LDA IMAGE 521 CLC 522 ADC #2 523 STA IMAGE 524 BCC :1 525 INC IMAGE+1 526 527 :1 RTS 528 529 *------------------------------- 530 * 531 * I N I T C A R R Y 532 * 533 * Initialize carry buffer 534 * 535 *------------------------------- 536 INITCARRY 537 LDY RAM 538 STA $C004,Y 539 STA $C002,Y 540 541 LDX #0 542 543 LDY XCO 544 BPL ZZYK 545 546 * Take black from offscreen 547 548 LDY HEIGHT 549 550 LDA #0 551 :1 STA CARRYBUF,Y 552 DEY 553 BNE :1 554 STA CARRYBUF 555 556 JMP DUN 557 558 ZZYK STX INDEX 559 560 LDX YCO 561 562 LDA YLO,X 563 STA BASE 564 565 LDA YHI,X 566 CLC 567 ADC PAGE 568 STA BASE+1 569 570 INC YCO 571 572 LDA (BASE),Y 573 AND AMASK 574 575 LDX INDEX 576 STA CARRYBUF,X 577 578 INX 579 CPX HEIGHT 580 BCC ZZYK 581 582 DUN STA $C002 583 STA $C004 584 585 RTS 586 587 *------------------------------- 588 * 589 * D B L F A S T 590 * 591 * No offset - no clipping - no mirroring - STA only - 592 * trashes vars 593 * 594 *------------------------------- 595 DBLFAST JSR PREP 596 597 LDA XCO 598 AND #1 599 EOR #1 600 STA RAM 601 602 LSR XCO 603 604 :2 LDX YSAVE 605 606 LDA #0 607 STA INDEX 608 609 LDY RAM 610 STA $C004,Y ;RAMWRT main/aux 611 612 :3 LDA YLO,X 613 STA BASE 614 615 LDA YHI,X 616 CLC 617 ADC PAGE 618 STA BASE+1 619 620 LDY INDEX 621 LDA (IMAGE),Y 622 623 LDY XCO 624 STA (BASE),Y 625 626 INX 627 INC INDEX 628 629 LDA INDEX 630 CMP HEIGHT 631 BCC :3 632 633 LDA IMAGE 634 CLC 635 ADC HEIGHT 636 STA IMAGE 637 BCC :6 638 INC IMAGE+1 639 640 :6 LDA RAM 641 EOR #1 642 STA RAM 643 BEQ :7 644 INC XCO 645 646 :7 DEC WIDTH 647 BNE :2 648 649 sta $c003 650 sta $c005 651 652 RTS 653 654 *------------------------------- 655 * 656 * D B L O R A 657 * 658 * Same as DBLWIPE except 1 image table byte 659 * is ORed with screen (e.g. to draw a vertical line) 660 * 661 *------------------------------- 662 DBLORA 663 jsr PREP 664 665 ldy #0 666 lda (IMAGE),y 667 sta dcolor 668 669 LDA XCO 670 AND #1 671 EOR #1 672 STA RAM 673 674 LSR XCO 675 676 :2 LDX YSAVE 677 678 LDA #0 679 STA INDEX 680 681 LDY RAM 682 sta $c002,y 683 STA $C004,Y ;RAMRD/WRT main/aux 684 685 lda XCO 686 and #1 687 asl 688 ora RAM 689 eor #1 690 tay 691 692 :3 LDA YLO,X 693 STA BASE 694 695 LDA YHI,X 696 CLC 697 ADC PAGE 698 STA BASE+1 699 700 LDY XCO 701 702 lda dcolor 703 ora (BASE),y 704 sta (BASE),y 705 706 INX 707 INC INDEX 708 709 LDA INDEX 710 CMP HEIGHT 711 BCC :3 712 713 LDA RAM 714 EOR #1 715 STA RAM 716 BEQ :7 717 INC XCO 718 719 :7 DEC WIDTH 720 BNE :2 721 722 STA $C003 723 STA $C005 724 725 RTS 726 727 *------------------------------- 728 * 729 * D B L W I P E 730 * 731 * Same as DBLFAST except only 1st byte of image table 732 * is used (to represent color: 0-15) 733 * 734 *------------------------------- 735 DBLWIPE 736 jsr PREP 737 738 ldy #0 739 lda (IMAGE),y 740 and #$0f ;color: 0-15 741 asl 742 asl 743 clc 744 adc #colortab 745 sta dcolor 746 lda #0 747 adc #>colortab 748 sta dcolor+1 ;address of 4-byte color pattern 749 750 LDA XCO 751 AND #1 752 EOR #1 753 STA RAM 754 755 LSR XCO 756 757 :2 LDX YSAVE 758 759 LDA #0 760 STA INDEX 761 762 LDY RAM 763 STA $C004,Y ;RAMWRT main/aux 764 765 lda XCO 766 and #1 767 asl 768 ora RAM 769 eor #1 770 tay 771 lda (dcolor),y 772 sta colortemp 773 774 :3 LDA YLO,X 775 STA BASE 776 777 LDA YHI,X 778 CLC 779 ADC PAGE 780 STA BASE+1 781 782 lda colortemp 783 LDY XCO 784 STA (BASE),Y 785 786 INX 787 INC INDEX 788 789 LDA INDEX 790 CMP HEIGHT 791 BCC :3 792 793 LDA RAM 794 EOR #1 795 STA RAM 796 BEQ :7 797 INC XCO 798 799 :7 DEC WIDTH 800 BNE :2 801 802 STA $C003 803 STA $C005 804 805 RTS 806 807 *------------------------------- 808 * 809 * D B L S A V E 810 * 811 * Save underlayer in BUFFER (replace with DBLFAST) 812 * 813 * PEELBUF is permanent 2-byte ptr to first available byte 814 * in peel buffer for each page. 815 * 816 * In: params set for LAY 817 * Out: PEELIMG (2b), PEELXCO, PEELYCO, PEELBUF (2b) 818 * PEELIMG+1 = 0 means no image has been stored 819 * 820 *------------------------------- 821 DBLSAVE JSR PREP 822 823 LDY #0 824 825 LDA OFFSET 826 BEQ :1 827 LDA #1 ;To cover carryover 828 829 :1 CLC 830 ADC WIDTH 831 STA WIDTH 832 STA (PEELBUF),Y 833 834 INY 835 LDA HEIGHT 836 STA (PEELBUF),Y 837 838 LDA YCO 839 STA PEELYCO 840 LDA XCO 841 STA PEELXCO 842 843 lda PEELBUF+1 844 sta PEELIMG+1 845 846 lda PEELBUF 847 sta PEELIMG 848 849 CLC 850 ADC #2 851 STA PEELBUF 852 853 bcc :ok 854 inc PEELBUF+1 855 :ok 856 857 * Buffer's set up; now fill it 858 859 LDA XCO 860 AND #1 861 EOR #1 862 STA RAM 863 864 LSR XCO 865 866 :2 LDX YSAVE 867 868 LDA #0 869 STA INDEX 870 871 LDY RAM 872 STA $C002,Y ;RAMRD 873 874 :3 LDA YLO,X 875 STA BASE 876 877 LDA YHI,X 878 CLC 879 ADC PAGE 880 STA BASE+1 881 882 LDY XCO 883 LDA (BASE),Y 884 885 LDY INDEX 886 STA (PEELBUF),Y 887 888 INX 889 INC INDEX 890 891 LDA INDEX 892 CMP HEIGHT 893 BCC :3 894 895 LDA PEELBUF 896 CLC 897 ADC HEIGHT 898 STA PEELBUF 899 BCC :6 900 INC PEELBUF+1 901 902 :6 LDA RAM 903 EOR #1 904 STA RAM 905 BEQ :7 906 INC XCO 907 908 :7 DEC WIDTH 909 BNE :2 910 911 JMP DONE 912 913 SKIPIT LDA #0 914 sta PEELIMG+1 ;no image saved 915 916 JMP DONE 917 918 *------------------------------- 919 * 920 * D B L P R I N T 921 * 922 * print a dblhires character 923 * In: XCO/OFFSET = x; YCO = y; IMAGE = textset index 924 * Out: XCO/OFFSET = space to next char 925 * 926 *------------------------------- 927 DBLPRINT 928 929 * get start of image table 930 931 lda IMAGE 932 asl 933 sec 934 sbc #1 935 tay 936 lda textset,y 937 sta IMAGE 938 lda textset+1,y 939 sta IMAGE+1 940 941 * swallow first 2 bytes 942 943 ldy #0 944 lda (IMAGE),y ;width in bytes & bits 945 pha 946 and #$0f 947 sta bits 948 pla 949 lsr 950 lsr 951 lsr 952 lsr 953 sta bytes 954 955 iny 956 lda (IMAGE),y ;y-offset 957 clc 958 adc YCO 959 sta YCO 960 961 lda IMAGE 962 clc 963 adc #2 964 sta IMAGE 965 lda IMAGE+1 966 adc #0 967 sta IMAGE+1 ;advance 2 bytes 968 969 * dump image to screen 970 971 lda #4 972 sta OPACITY ;"MASK" 973 jsr DBLLAY 974 975 lda #1 976 sta OPACITY ;"OR" 977 jsr DBLLAY 978 979 * return char shift 980 981 lda bits 982 sta OFFSET 983 lda bytes 984 sta XCO 985 986 rts 987 988 *------------------------------- 989 * 990 * D B L I M S E E K 991 * 992 * In: TABLE = image table start addr 993 * IMAGE = image # 994 * 995 * Out: IMAGE (2 bytes) = image start addr 996 * 997 *------------------------------- 998 DBLIMSEEK 999 lda IMAGE 1000 asl 1001 tay 1002 dey 1003 1004 lda (TABLE),y 1005 sta IMAGE 1006 1007 iny 1008 lda (TABLE),y 1009 sta IMAGE+1 1010 1011 rts 1012 1013 *------------------------------- 1014 * 1015 * C O L O R T A B 1016 * 1017 * 4-byte color patterns for 16 dblhires colors 1018 * 1019 *------------------------------- 1020 colortab hex 00,00,00,00 1021 hex 08,11,22,44 1022 hex 44,08,11,22 1023 hex 4c,19,33,66 1024 1025 hex 22,44,08,11 1026 hex 2a,55,2a,55 1027 hex 66,4c,19,33 1028 hex 6e,5d,3b,77 1029 1030 hex 11,22,44,08 1031 hex 19,33,66,4c 1032 hex 55,2a,55,2a 1033 hex 5d,3b,77,6e 1034 1035 hex 33,66,4c,19 1036 hex 3b,77,6e,5d 1037 hex 77,6e,5d,3b 1038 hex 7f,7f,7f,7f 1039 1040 *------------------------------- 1041 * 1042 * M A S K T A B 1043 * 1044 *------------------------------- 1045 masktabl 1046 hex 7F706060404040400000000000000000 1047 hex 01000000000000000000000000000000 1048 hex 03000000000000000000000000000000 1049 hex 01000000000000000000000000000000 1050 hex 07000000000000000000000000000000 1051 hex 01000000000000000000000000000000 1052 hex 03000000000000000000000000000000 1053 hex 01000000000000000000000000000000 1054 1055 do 0 1056 masktabh 1057 hex 7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F 1058 hex 7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7F 1059 hex 7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C 1060 hex 7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C 1061 hex 78787878787878787878787878787878 1062 hex 78787878787878787878787878787878 1063 hex 78787878787878787878787878787878 1064 hex 78787878787878787878787878787878 1065 1066 fin 1067 1068 *------------------------------- 1069 lst 1070 eof ds 1 1071 usr $a9,27,$0000,*-org 1072 lst off