BUILDER.S (30083B)
1 * ed/builder 2 org = $8400 3 lst off 4 *------------------------------- 5 org org 6 7 JMP COLDBUILD 8 jmp WARMBUILD 9 JMP RTNBUILD 10 JMP MLEFT 11 JMP MRIGHT 12 13 JMP MDOWN 14 JMP MUP 15 JMP GETNEIGH 16 jmp CALCMAT1 17 jmp CLRLINKS 18 19 jmp RESTARTBLDR 20 21 *------------------------------- 22 put eq 23 put buildereq 24 put movedata 25 26 *------------------------------- 27 * Constraints 28 29 MAXBLOX = 24 ;max # of blocks per level 30 31 XDIM = 32 32 YDIM = 32 ;Matrix dimensions 33 34 *------------------------------- 35 * Screen display constants 36 37 xoffset = 0 38 39 STULX = 9 ;Starting position of screen u.l. 40 STULY = 12 ;(in matrix) 41 42 STPTRX = 6 ;Starting posn of pointer 43 STPTRY = 2 ;(on screen) 44 45 STMATX = STULX+STPTRX 46 STMATY = STULY+STPTRY 47 48 STBLOKX = STMATX 49 STBLOKY = STMATY+1 ;postion of starter block 50 51 DX = 40 52 DY = 12 53 54 POPY = 5 55 POPX = 4*POPY 56 57 ARPX = 30 58 ARPY = 7 59 60 SCANHT = 16 61 SCANWID = 15 ;dimensions of screen grid 62 63 LLX = POPX-DX+xoffset 64 LLY = POPY-DY+195 ;coords of lower-leftmost visible block 65 66 STX = STPTRX*DX-POPX+ARPX+LLX 67 STY = STPTRY-SCANHT+1*DY+POPY+ARPY+LLY 68 69 scrntop = 20 70 barby = 7 71 72 topmosty = -SCANHT+2*DY+LLY+POPY 73 74 75 * Limits of pointer/block posn on screen 76 77 LEFTEJ = 1 78 RIGHTEJ = 13 79 TOPEJ = 1 ;menu bar threshold 80 BOTTOMEJ = 13 81 82 83 * Limits of screen u.l. posn in matrix 84 85 minulx = -1 86 maxulx = XDIM-RIGHTEJ-1 87 minuly = -1 88 maxuly = YDIM-BOTTOMEJ-1 89 90 91 * Menu bar data 92 93 playx = 0 94 loadx = 120 95 savex = loadx+76 96 deletex = savex+76 97 clearx = deletex+92 98 trashx = 500 99 100 btnimg dfb 14,15,16,17,18,1 101 btnxl dfb playx,loadx,savex,deletex,clearx,trashx 102 btnxh dfb >playx,>loadx,>savex,>deletex,>clearx,>trashx 103 btny dfb 1,1,1,1,1,0 104 numbtns = btnxh-btnxl-1 105 106 c = 28 107 barlistl dfb playx+c,loadx+c,savex+c,deletex+c 108 dfb clearx+c,trashx+10 109 barlisth dfb >playx+c,>loadx+c,>savex+c,>deletex+c 110 dfb >clearx+c,>trashx+10 111 menulen = barlisth-barlistl-1 112 113 btnxlist dfb 0,0,1,1,2,2,3,3,4,4,4,5,5 114 ptrxlist dfb 1,4,6,8,10,13 115 116 *------------------------------- 117 arrow = 3 118 bblock = 1 119 120 *------------------------------- 121 * Special keys (development) 122 123 SHIFT = $20 124 CTRL = $60 125 126 kcopy = "c" 127 kdelblock = "d" 128 129 kcreateGD1 = "$" 130 kcreateGD2 = "@" 131 kcreateMD = "!" 132 kcreateDD = "#" 133 ksavegame1 = "g"-CTRL 134 ksavegame2 = "f"-CTRL 135 kdelgame = "d"-CTRL 136 137 krelink = "l"-CTRL 138 139 *------------------------------- 140 POPside1 = $a9 141 POPside2 = $ad 142 143 *------------------------------- 144 * 145 * C O L D B U I L D 146 * 147 * Coldstart builder 148 * 149 *------------------------------- 150 COLDBUILD 151 sta $c009 152 153 jsr movestuff 154 155 jsr initbuilder 156 157 jsr STARTCLR ;clear matrix 158 159 jmp STARTBUILDER 160 161 *------------------------------- 162 * Restart builder 163 164 RESTARTBLDR 165 sta $c009 166 167 jsr initbuilder 168 169 jsr STARTCLR 170 171 jmp STARTBUILDER 172 173 *------------------------------- 174 * 175 * W A R M B U I L D 176 * 177 * Return to builder from game 178 * Like coldstart but leave matrix & blueprint intact 179 * 180 *------------------------------- 181 WARMBUILD 182 sta $c009 183 184 jsr movestuff 185 186 jsr initbuilder 187 188 jsr reloadblue ;from backup copy in aux l.c. 189 jsr reloadbinfo 190 191 jsr reconstruct ;matrix from blueprint 192 193 jmp STARTBUILDER 194 195 *------------------------------- 196 initbuilder 197 198 lda #1 199 sta virgin ;nonzero 200 sta menuflg 201 sta shownums 202 sta inbuilder 203 ;sta sound 204 205 jsr dblhgr 206 207 jsr setfastmain ;bgtable in mainmem 208 209 jsr initgetlnbuf 210 211 lda #0 212 sta level 213 sta ineditor 214 sta inmenu 215 216 rts 217 218 *------------------------------- 219 STARTBUILDER 220 jsr initinput 221 222 jsr CTRPTR 223 224 jsr SETUP 225 226 jmp CYCLE 227 228 *------------------------------- 229 * 230 * C Y C L E 231 * 232 *------------------------------- 233 CYCLE 234 jsr input ;get joystick/kbd input 235 ;(return command in A, 0 = none) 236 jsr act ;& act on it 237 238 jsr spkeys ;development keys 239 240 lda setupflg ;redraw entire scrn? 241 beq :1 ;no 242 243 jsr SETUP 244 245 jmp CYCLE 246 247 :1 jsr moveblok 248 249 jsr pageflip 250 251 jmp CYCLE 252 253 *------------------------------- 254 * 255 * S T A R T C L E A R 256 * 257 * Start with clear matrix 258 * 259 *------------------------------- 260 STARTCLR 261 lda #0 ;set character start posn: 262 263 ldx #64 264 :loop sta INFO,x 265 inx 266 cpx #70 267 bcc :loop ;zero misc. INFO (kid, key, etc.) 268 269 jsr STARTCL1 ;clear matrix 270 271 jsr CLRLINKS ;zero link tables 272 273 ldx #STBLOKX 274 ldy #STBLOKY 275 jsr :putblock 276 277 ldx #STBLOKX+1 278 ldy #STBLOKY 279 jsr :putblock 280 281 ldx #STBLOKX 282 ldy #STBLOKY+1 283 jsr :putblock 284 285 ldx #STBLOKX+1 286 ldy #STBLOKY+1 287 288 :putblock 289 stx MATX 290 sty MATY 291 jsr CALCMAT 292 293 lda NUMNEXT 294 ldy #0 295 sta (ZTEMP),Y ;One block on screen 296 sta SCRNUM 297 298 tax 299 lda MATX ;init blueprint room loc list 300 sta INFO,x 301 lda MATY 302 sta INFO+MAXBLOX,x 303 304 inc NUMNEXT 305 306 jmp clrblock 307 308 STARTCL1 309 JSR CLEARMAT 310 311 LDA #1 312 STA NUMNEXT ;# (1-MAXBLOX) of next block to be drawn 313 314 LDA #STULX 315 STA ULX 316 LDA #STULY 317 STA ULY 318 319 rts 320 321 *------------------------------- 322 * 323 * I N I T I N P U T 324 * 325 *------------------------------- 326 ;initinput 327 lda $c010 328 329 jsr setcenter 330 331 jsr controller 332 333 lda joyX 334 beq :jok 335 lda joyY 336 beq :jok 337 338 lda #0 ;If either jstk axis is centered, 339 sta joyon ;assume a joystick is connected-- 340 ;else default to kbd-only mode 341 :jok lda #0 342 sta jcount 343 344 rts 345 346 *------------------------------- 347 * 348 * C T R P T R 349 * 350 * Center pointer 351 * 352 *------------------------------- 353 CTRPTR LDA #arrow 354 STA CURSOR 355 STA savecurs 356 357 LDA #STMATX 358 STA MATX 359 LDA #STMATY 360 STA MATY 361 362 LDA #STPTRX 363 STA PTRX 364 LDA #STPTRY 365 STA PTRY 366 367 LDA #STX 368 STA BLOCKX 369 LDA #/STX 370 STA BLOCKX+1 371 372 LDA #STY 373 STA BLOCKY 374 375 lda #0 376 sta menuflg 377 378 ]rts rts 379 380 *------------------------------- 381 * 382 * S P E C I A L K E Y S 383 * 384 *------------------------------- 385 spkeys 386 lda keypress 387 bpl ]rts 388 389 cmp #kcopy 390 beq :copy 391 cmp #kcopy-SHIFT 392 bne :notc 393 394 :copy jmp COPY 395 396 :notc cmp #kdelblock 397 beq :delblock 398 cmp #kdelblock-SHIFT 399 bne :notd 400 :delblock ;not operational yet 401 rts 402 403 :notd 404 cmp #kcreateDD 405 bne :11 406 jsr setdatadisk 407 :cd lda #5 ;create blank directory 408 jmp dodialog 409 410 :11 cmp #kcreateMD 411 bne :11a 412 jsr setmasterdisk 413 jmp :cd 414 415 :11a cmp #kcreateGD1 416 bne :11b 417 jsr setgamedisk1 418 jmp :cd 419 420 :11b cmp #kcreateGD2 421 bne :2 422 jsr setgamedisk2 423 lda #POPside2 424 sta BBundID 425 jsr :cd 426 lda #POPside1 427 sta BBundID 428 rts 429 430 :2 cmp #ksavegame1 431 bne :2a 432 jmp bsavegame1 433 434 :2a cmp #ksavegame2 435 bne :3 436 jmp bsavegame2 437 438 :3 cmp #kdelgame 439 bne :4 440 jmp bdelgame 441 442 :4 cmp #krelink 443 bne :5 444 jmp relink 445 446 :5 447 :rts 448 ]rts rts 449 450 *------------------------------- 451 * 452 * B S A V E G A M E 453 * 454 * save level -- game portion only 455 * 456 *------------------------------- 457 bsavegame1 458 jsr setgamedisk1 459 lda #POPside1 460 ]bsg sta BBundID 461 462 lda #$20 463 sta PAGE 464 lda $C054 ;show page 1 465 466 jsr setsetup 467 468 lda #2 469 jsr dodialog 470 471 cpx #$ff 472 beq :done 473 stx level 474 475 jsr makeblue 476 jsr writedir 477 jsr dsavelevelg 478 479 :done lda #POPside1 ;for master & data disks 480 sta BBundID 481 rts 482 483 bsavegame2 484 jsr setgamedisk2 485 lda #POPside2 486 jmp ]bsg 487 488 *------------------------------- 489 * 490 * Delete a file from game disk side 2 491 * 492 *------------------------------- 493 bdelgame 494 lda #POPside2 495 sta BBundID 496 497 lda #3 498 jsr dodialog 499 500 lda #POPside1 501 sta BBundID 502 rts 503 504 *------------------------------- 505 * 506 * A C T O N I N P U T 507 * 508 * In: A = command (0 = none) 509 * 510 *------------------------------- 511 act 512 cmp #0 513 beq :rts 514 515 cmp #Cleft 516 BNE :3 517 JMP MLEFT 518 519 :3 cmp #Cright 520 BNE :4 521 JMP MRIGHT 522 523 :4 CMP #Cup 524 BNE :5 525 JMP MUP 526 527 :5 CMP #Cdown 528 BNE :nomove 529 JMP MDOWN 530 531 :nomove cmp #Cbtn0 532 bne :6 533 534 lda menuflg 535 bne menufn 536 537 JMP PULLPUSH 538 539 :6 cmp #Cbtn1 540 bne :7 541 542 lda menuflg 543 bne menufn 544 545 jmp ZOOM 546 547 :7 548 :rts rts 549 550 *------------------------------- 551 * reconstruct matrix from blueprint 552 553 reconstruct 554 jsr STARTCL1 555 jsr CTRPTR 556 jmp readblue 557 558 *------------------------------- 559 * 560 * M E N U F N 561 * 562 * Menu bar functions 563 * 564 *------------------------------- 565 menufn lda menuindx 566 567 cmp #5 568 bne :1 ;trashcan 569 570 ]TrashButton 571 572 jmp TRASH 573 574 :1 cmp #3 ;delete 575 bne :6 576 577 ]DeleteButton 578 579 lda #3 580 jmp dodialog 581 582 :6 cmp #4 ;clear 583 bne :2 584 585 ]ClearButton 586 587 jsr setsetup 588 589 lda #4 590 jsr dodialog 591 cpx #$ff 592 beq :rts 593 594 JSR STARTCLR 595 JSR CTRPTR 596 597 JMP SETUP 598 599 :2 cmp #1 ;load 600 bne :3 601 602 ]LoadButton 603 jsr setsetup 604 605 lda #1 606 jsr dodialog 607 608 cpx #$ff 609 beq :rts 610 stx level 611 612 jsr dloadlevel 613 614 jsr reconstruct ;matrix from blueprint 615 616 jmp SETUP 617 618 :3 cmp #2 ;save 619 bne :4 620 621 ]SaveButton 622 623 * Note--save routine uses aux hires 1 for scratch 624 * so do dialog on page 2 625 626 lda #$20 627 sta PAGE 628 lda $C054 ;show page 1 629 630 jsr setsetup 631 632 jsr setmasterdisk ;data disk will do too 633 634 lda #2 635 jsr dodialog 636 637 cpx #$ff 638 beq :rts 639 stx level 640 641 jsr makeblue 642 jsr writedir 643 jsr dsavelevel 644 645 jmp SETUP 646 647 :4 cmp #0 ;play 648 bne :5 649 650 ]PlayButton 651 652 jmp goplay 653 654 :5 655 :rts rts 656 657 *------------------------------- 658 * 659 * M O V E B L O C K 660 * 661 *------------------------------- 662 MLEFT lda menuflg 663 bne menuleft 664 665 lda PTRX 666 cmp #LEFTEJ 667 bne :cont 668 669 jsr scrright 670 jmp setsetup 671 672 :cont DEC PTRX 673 DEC MATX 674 675 LDA BLOCKX 676 SEC 677 SBC #DX 678 STA BLOCKX 679 BCS :1 680 DEC BLOCKX+1 681 682 :1 rts 683 684 685 menuleft ldx menuindx 686 beq menuxset 687 688 dex 689 stx menuindx 690 691 menuxset lda barlistl,x 692 sta BLOCKX 693 lda barlisth,x 694 sta BLOCKX+1 695 696 rts 697 698 *------------------------------- 699 MRIGHT lda menuflg 700 bne mnuright 701 702 lda PTRX 703 cmp #RIGHTEJ 704 bcc :cont 705 706 jsr scrleft 707 jmp setsetup 708 709 :cont INC PTRX 710 INC MATX 711 712 LDA BLOCKX 713 CLC 714 ADC #DX 715 STA BLOCKX 716 BCC :1 717 INC BLOCKX+1 718 719 :1 RTS 720 721 mnuright ldx menuindx 722 cpx #menulen 723 bcs :no 724 725 inx 726 stx menuindx 727 728 :no jmp menuxset 729 730 *------------------------------- 731 MDOWN 732 lda ineditor 733 bne :normal 734 735 lda PTRY 736 cmp #TOPEJ-1 737 bne :normal 738 739 jsr exitmenu 740 741 jmp :finish 742 743 :normal lda PTRY 744 cmp #BOTTOMEJ 745 bcc :cont 746 747 jsr scrup 748 jmp setsetup 749 750 :cont LDA BLOCKY 751 CLC 752 ADC #DY 753 STA BLOCKY 754 755 :finish inc PTRY 756 inc MATY 757 758 RTS 759 760 *------------------------------- 761 MUP lda ineditor 762 bne :normal 763 764 lda PTRY 765 cmp #TOPEJ 766 bne :normal 767 768 jsr entrmenu 769 770 jmp :finish 771 772 :normal lda PTRY 773 cmp #TOPEJ+1 774 bcs :cont 775 776 jsr scrdown 777 jmp setsetup 778 779 :cont LDA BLOCKY 780 SEC 781 SBC #DY 782 STA BLOCKY 783 784 :finish DEC PTRY 785 DEC MATY 786 787 RTS 788 789 *------------------------------- 790 * 791 * S C R O L L 792 * 793 *------------------------------- 794 scrright 795 lda ULX 796 cmp #minulx 797 beq no 798 799 dec ULX 800 dec MATX 801 rts 802 803 scrleft 804 lda ULX 805 cmp #maxulx 806 beq no 807 808 inc ULX 809 inc MATX 810 rts 811 812 scrup 813 lda ULY 814 cmp #maxuly 815 beq no 816 817 inc ULY 818 inc MATY 819 rts 820 821 scrdown 822 lda ULY 823 cmp #minuly 824 beq no 825 826 dec ULY 827 dec MATY 828 no rts 829 830 *------------------------------- 831 setsetup ldx #1 832 stx setupflg 833 rts 834 835 clrptr jsr dblpeel 836 jsr pageflip 837 jmp dblpeel ;remove ptr from both pages 838 839 *------------------------------- 840 * 841 * T R A S H 842 * 843 *------------------------------- 844 TRASH lda savecurs 845 cmp #arrow 846 bne :cont 847 :rts rts 848 849 :cont lda NUMNEXT 850 cmp #3 851 bcc :rts ;last block can't be deleted 852 853 lda #arrow 854 sta savecurs 855 lda saveby 856 clc 857 adc #ARPY 858 sta saveby ;enter as block--leave as arrow 859 860 * Erase block #BLOCKNUM from matrix & INFO list 861 862 lda MATX 863 pha 864 lda MATY 865 pha 866 867 ldx BLOCKNUM 868 lda INFO,x 869 sta MATX 870 lda INFO+MAXBLOX,x 871 sta MATY 872 jsr CALCMAT 873 874 ldy #0 875 lda #0 ;empty-space code 876 sta (ZTEMP),y ;to matrix 877 878 lda #255 ;nonexistent-block code 879 sta INFO,x ;x=BLOCKNUM 880 sta INFO+MAXBLOX,x 881 882 * If the block we just trashed was the latest entry, 883 * decrement NUMNEXT to replace it; else wait till 884 * we run out of new block #s, then go back & look for gaps 885 886 lda NUMNEXT 887 sec 888 sbc #1 889 cmp BLOCKNUM 890 bne :later 891 sta NUMNEXT 892 893 :later pla 894 sta MATY 895 pla 896 sta MATX 897 898 :done jmp gtone ;"ok--it's done" 899 900 *------------------------------- 901 * 902 * E N T E R M E N U 903 * 904 *------------------------------- 905 entrmenu lda #1 906 sta menuflg 907 908 lda CURSOR 909 sta savecurs 910 lda BLOCKY 911 sta saveby 912 913 lda #arrow 914 sta CURSOR ;Force cursor to arrow 915 lda #barby 916 sta BLOCKY 917 918 * Move ptr to nearest button 919 920 ldy PTRX 921 ldx btnxlist-1,y 922 stx menuindx 923 jmp menuxset 924 925 *------------------------------- 926 * 927 * E X I T M E N U 928 * 929 *------------------------------- 930 exitmenu lda #0 931 sta menuflg 932 933 lda savecurs ;Exiting menu bar 934 sta CURSOR ;Return cursor to prior state 935 936 lda saveby 937 sta BLOCKY 938 939 ldx menuindx 940 lda ptrxlist,x 941 sta PTRX 942 943 clc 944 adc ULX 945 sta MATX 946 947 lda #xoffset 948 sta BLOCKX 949 lda #0 950 sta BLOCKX+1 951 952 ldx PTRX 953 954 :loop dex 955 beq :gotit 956 957 lda BLOCKX 958 clc 959 adc #DX 960 sta BLOCKX 961 962 lda BLOCKX+1 963 adc #0 964 sta BLOCKX+1 965 966 bpl :loop 967 968 :gotit lda CURSOR 969 cmp #arrow 970 bne :ok 971 972 lda BLOCKX 973 clc 974 adc #ARPX 975 sta BLOCKX 976 977 lda BLOCKX+1 978 adc #0 979 sta BLOCKX+1 980 981 :ok rts 982 983 *------------------------------- 984 * 985 * C O P Y 986 * 987 *------------------------------- 988 COPY lda CURSOR 989 cmp #arrow 990 beq :ptr 991 :rts rts 992 993 :ptr jsr CALCMAT1 994 ldy #0 995 lda (MATPTR),y 996 beq :rts ;no block here 997 998 jsr bcalcblue 999 lda BlueType 1000 sta ZTEMP 1001 lda BlueType+1 1002 sta ZTEMP+1 ;ZTEMP: source block 1003 1004 lda BlueSpec 1005 sta ZTEMP+2 1006 lda BlueSpec+1 1007 sta ZTEMP+3 1008 1009 jsr NEWBLOK ;clrblock sets BlueType,BlueSpec 1010 bmi :rts ;not OK 1011 1012 jmp copyblok 1013 1014 *------------------------------- 1015 copyblok ldy #29 1016 1017 :loop lda (ZTEMP),y 1018 sta (BlueType),y 1019 1020 lda (ZTEMP+2),y 1021 sta (BlueSpec),y 1022 dey 1023 bpl :loop 1024 rts 1025 1026 *------------------------------- 1027 * 1028 * P U L L / P U S H 1029 * 1030 *------------------------------- 1031 PULLPUSH LDA CURSOR 1032 CMP #arrow 1033 beq :ptr 1034 jmp PUSH ;Push block in 1035 1036 :ptr JSR CALCMAT1 1037 1038 LDY #0 1039 LDA (MATPTR),Y 1040 BEQ :new ;No block here--make a new one 1041 1042 STA BLOCKNUM 1043 sta number 1044 JMP PULL ;Pull out block 1045 1046 :new jsr NEWBLOK 1047 bpl PUSH 1048 rts ;Not OK 1049 1050 *------------------------------- 1051 * 1052 * P U S H 1053 * 1054 * Push block into place 1055 * 1056 *------------------------------- 1057 PUSH JSR CALCMAT1 1058 1059 LDY #0 1060 LDA (MATPTR),Y 1061 BEQ :11 1062 1063 RTS ;There's a block here already 1064 1065 :11 LDA BLOCKNUM 1066 STA (MATPTR),Y 1067 1068 tax 1069 lda MATX 1070 sta INFO,x 1071 lda MATY 1072 sta INFO+MAXBLOX,x 1073 1074 LDA BLOCKX 1075 STA TEMP 1076 CLC 1077 ADC #POPX 1078 STA BLACKX 1079 1080 LDA BLOCKX+1 1081 STA TEMP+1 1082 ADC #0 1083 STA BLACKX+1 1084 1085 LDA BLOCKY 1086 STA TEMP+2 1087 SEC 1088 SBC #POPY 1089 STA BLACKY 1090 1091 LDA #POPY 1092 STA TEMP+3 1093 1094 :1 LDA BLOCKX 1095 CLC 1096 ADC #4 1097 STA BLOCKX 1098 LDA BLOCKX+1 1099 ADC #0 1100 STA BLOCKX+1 1101 1102 LDA BLOCKY 1103 SEC 1104 SBC #1 1105 STA BLOCKY 1106 1107 jsr pushsub 1108 1109 DEC TEMP+3 1110 BNE :1 1111 1112 jsr pushsub 1113 1114 * Change cursor from block to pointer 1115 1116 jsr zeropeels 1117 1118 LDA #arrow 1119 STA CURSOR 1120 1121 LDA TEMP 1122 CLC 1123 ADC #ARPX 1124 STA BLOCKX 1125 1126 LDA TEMP+1 1127 ADC #0 1128 STA BLOCKX+1 1129 1130 LDA TEMP+2 1131 CLC 1132 ADC #ARPY 1133 STA BLOCKY 1134 1135 RTS 1136 1137 *------------------------------- 1138 pushsub 1139 JSR moveblok 1140 JSR RESTORUR 1141 jmp pageflip 1142 1143 *------------------------------- 1144 * 1145 * R E S T O R U R 1146 * 1147 * Restore neighboring blocks to U, R, and UR 1148 * 1149 *------------------------------- 1150 RESTORUR lda menuflg 1151 beq :cont 1152 jmp :rts 1153 1154 * Block above (U)? 1155 1156 :cont LDX #0 1157 LDY #-1 1158 JSR GETNEIGH 1159 BEQ :10 1160 sta number 1161 1162 * AND UMASK / ORA U 1163 1164 LDA #8 1165 STA IMAGE 1166 LDA BLACKX 1167 STA XCO 1168 LDA BLACKX+1 1169 STA OFFSET 1170 LDA BLACKY 1171 STA YCO 1172 LDA #0 1173 STA OPACITY 1174 JSR dbldraw 1175 1176 LDA #5 1177 STA IMAGE 1178 LDA BLACKX 1179 STA XCO 1180 LDA BLACKX+1 1181 STA OFFSET 1182 LDA BLACKY 1183 STA YCO 1184 LDA #1 1185 STA OPACITY 1186 JSR dbldraw 1187 1188 * print block# 1189 1190 LDA BLACKX 1191 STA XCO 1192 LDA BLACKX+1 1193 STA OFFSET 1194 LDA BLACKY 1195 sec 1196 sbc #DY 1197 STA YCO 1198 jsr prblokno 1199 1200 * Block to right (R)? 1201 1202 :10 LDX #1 1203 LDY #0 1204 JSR GETNEIGH 1205 BEQ :11 1206 sta number 1207 1208 * AND RMASK / ORA R 1209 1210 LDA #0 1211 STA OPACITY 1212 LDA #9 1213 JSR XPL5 1214 1215 LDA #1 1216 STA OPACITY 1217 LDA #6 1218 JSR XPL5 1219 1220 * print block# 1221 1222 LDA BLACKX 1223 clc 1224 adc #DX 1225 STA XCO 1226 LDA BLACKX+1 1227 adc #>DX 1228 STA OFFSET 1229 LDA BLACKY 1230 STA YCO 1231 jsr prblokno 1232 1233 * Block to upper right (UR)? 1234 1235 :11 LDX #1 1236 LDY #-1 1237 JSR GETNEIGH 1238 BEQ :12 1239 sta number 1240 1241 * AND URMASK / ORA UR 1242 1243 LDA #0 1244 STA OPACITY 1245 LDA #10 1246 JSR XPL5 1247 1248 LDA #1 1249 STA OPACITY 1250 LDA #7 1251 JSR XPL5 1252 1253 * print block# 1254 1255 LDA BLACKX 1256 clc 1257 adc #DX 1258 STA XCO 1259 LDA BLACKX+1 1260 adc #>DX 1261 STA OFFSET 1262 LDA BLACKY 1263 sec 1264 sbc #DY 1265 STA YCO 1266 jsr prblokno 1267 1268 :12 lda BLOCKNUM 1269 sta number 1270 :rts rts 1271 1272 *------------------------------- 1273 * 1274 * P U L L 1275 * 1276 * Pull block out 1277 * 1278 *------------------------------- 1279 PULL LDA #0 1280 STA (MATPTR),Y 1281 1282 JSR dblpeel 1283 JSR pageflip 1284 JSR dblpeel 1285 1286 jsr zeropeels 1287 1288 LDA #bblock 1289 STA CURSOR 1290 1291 LDA BLOCKX 1292 SEC 1293 SBC #ARPX 1294 STA TEMP 1295 1296 LDA BLOCKX+1 1297 SBC #0 1298 STA TEMP+1 1299 1300 LDA BLOCKY 1301 SEC 1302 SBC #ARPY 1303 STA TEMP+2 ;TEMP is where block's going to end up 1304 1305 LDA TEMP 1306 CLC 1307 ADC #POPX 1308 STA BLOCKX 1309 STA BLACKX 1310 1311 LDA TEMP+1 1312 ADC #0 1313 STA BLOCKX+1 1314 STA BLACKX+1 1315 1316 LDA TEMP+2 1317 SEC 1318 SBC #POPY 1319 STA BLOCKY ;BLOCKX-Y is where block's sitting now 1320 STA BLACKY 1321 1322 jsr animpull 1323 1324 :no rts 1325 1326 *------------------------------- 1327 * 1328 * A N I M P U L L 1329 * 1330 *------------------------------- 1331 animpull JSR ERASEBLOK 1332 1333 jsr moveblok 1334 jsr RESTORUR 1335 jsr pageflip 1336 1337 jsr ERASEBLOK 1338 1339 LDA #POPY 1340 STA TEMP+3 ;Counter 1341 1342 :1 LDA BLOCKX 1343 SEC 1344 SBC #4 1345 STA BLOCKX 1346 1347 LDA BLOCKX+1 1348 SBC #0 1349 STA BLOCKX+1 1350 1351 INC BLOCKY 1352 1353 jsr moveblok 1354 jsr RESTORUR 1355 jsr pageflip 1356 1357 DEC TEMP+3 1358 BNE :1 1359 1360 jsr moveblok 1361 jsr RESTORUR 1362 1363 * Change cursor from pointer to block 1364 1365 LDA TEMP 1366 STA BLOCKX 1367 LDA TEMP+1 1368 STA BLOCKX+1 1369 LDA TEMP+2 1370 STA BLOCKY 1371 1372 RTS 1373 1374 *------------------------------- 1375 * 1376 * E R A S E B L O K 1377 * 1378 *------------------------------- 1379 ERASEBLOK 1380 LDA #2 1381 STA IMAGE 1382 LDA BLOCKX 1383 STA XCO 1384 LDA BLOCKX+1 1385 STA OFFSET 1386 LDA BLOCKY 1387 STA YCO 1388 LDA #0 1389 STA OPACITY 1390 JSR dbldraw ;Erase existing block ("AND" BLOCKMASK) 1391 1392 lda menuflg 1393 bne :1 1394 1395 JSR RESTORDL 1396 1397 JSR RESTORUR 1398 1399 :1 RTS 1400 1401 *------------------------------- 1402 * 1403 * R E S T O R D L 1404 * 1405 *------------------------------- 1406 RESTORDL LDX #-1 1407 LDY #1 1408 JSR GETNEIGH 1409 BEQ :10 1410 1411 * ORA DL 1412 1413 :15 LDA #11 1414 STA IMAGE 1415 LDA BLACKX 1416 STA XCO 1417 LDA BLACKX+1 1418 STA OFFSET 1419 LDA BLACKY 1420 CLC 1421 ADC #12 1422 STA YCO 1423 LDA #1 1424 STA OPACITY 1425 JSR dbldraw 1426 1427 :10 LDX #-1 1428 LDY #0 1429 JSR GETNEIGH 1430 BEQ :11 1431 1432 * AND LMASK / ORA L 1433 1434 LDA #19 1435 STA IMAGE 1436 LDA BLACKX 1437 STA XCO 1438 LDA BLACKX+1 1439 STA OFFSET 1440 LDA BLACKY 1441 STA YCO 1442 LDA #0 1443 STA OPACITY 1444 JSR dbldraw 1445 1446 LDA #12 1447 STA IMAGE 1448 LDA BLACKX 1449 STA XCO 1450 LDA BLACKX+1 1451 STA OFFSET 1452 LDA BLACKY 1453 STA YCO 1454 LDA #1 1455 STA OPACITY 1456 JSR dbldraw 1457 1458 :11 LDX #0 1459 LDY #1 1460 JSR GETNEIGH 1461 BEQ :12 1462 1463 * ORA D 1464 1465 LDA #13 1466 STA IMAGE 1467 LDA BLACKX 1468 STA XCO 1469 LDA BLACKX+1 1470 STA OFFSET 1471 LDA BLACKY 1472 CLC 1473 ADC #12 1474 STA YCO 1475 LDA #1 1476 STA OPACITY 1477 JSR dbldraw 1478 1479 :12 RTS 1480 1481 zerobuf rts 1482 do 0 1483 zerobuf ldx BUFFLAG 1484 inx 1485 lda BUFADL,X 1486 sta IMAGE 1487 lda BUFADH,X 1488 sta IMAGE+1 1489 lda #0 1490 tay 1491 sta (IMAGE),y 1492 rts 1493 fin 1494 1495 *------------------------------- 1496 * 1497 * G E T N E I G H 1498 * 1499 * Given: DX & DY (in X & Y) 1500 * Return: Contents of neighboring space (in A) 1501 * 1502 *------------------------------- 1503 GETNEIGH LDA MATX 1504 PHA 1505 LDA MATY 1506 PHA 1507 1508 TXA 1509 CLC 1510 ADC MATX 1511 STA MATX 1512 bmi :no 1513 cmp #XDIM 1514 bcs :no 1515 1516 TYA 1517 CLC 1518 ADC MATY 1519 STA MATY 1520 bmi :no 1521 cmp #YDIM 1522 bcs :no 1523 1524 JSR CALCMAT 1525 1526 LDY #0 1527 LDA (ZTEMP),Y 1528 tax 1529 1530 :done pla 1531 sta MATY 1532 pla 1533 sta MATX 1534 1535 txa 1536 rts 1537 1538 :no ldx #0 1539 beq :done 1540 1541 *------------------------------- 1542 * 1543 * C L E A R M A T 1544 * 1545 * Clear matrix (32 x 32) 1546 * 1547 *------------------------------- 1548 CLEARMAT LDA #MATBASE 1549 STA ZTEMP 1550 LDA #/MATBASE 1551 STA ZTEMP+1 1552 1553 LDA #0 1554 LDY #0 1555 :1 STA (ZTEMP),Y 1556 INC ZTEMP 1557 BNE :1 1558 INC ZTEMP+1 1559 LDX ZTEMP+1 1560 CPX #/ENDMAT 1561 BCC :1 1562 1563 RTS 1564 1565 *------------------------------- 1566 * 1567 * D R A W M A T 1568 * 1569 * Put a visual depiction of matrix onscreen 1570 * 1571 * Matrix dimensions: XDIM x YDIM 1572 * Grid dimensions: SCANWID x SCANHT 1573 * Matrix coords of grid's upper-leftmost block: (ULX,ULY) 1574 * Screen coords of grid's lower-leftmost block: (LLX,LLY) 1575 * 1576 *------------------------------- 1577 DRAWMAT LDA MATX 1578 PHA 1579 LDA MATY 1580 PHA 1581 LDA BLOCKX 1582 PHA 1583 LDA BLOCKX+1 1584 PHA 1585 LDA BLOCKY 1586 PHA 1587 1588 lda #scrntop 1589 sta TOPCUT ;leave margin for menu bar 1590 1591 * Scan screen L-R, B-T 1592 1593 LDA #SCANHT-1 1594 CLC 1595 ADC ULY 1596 STA MATY 1597 1598 LDA #SCANWID 1599 CLC 1600 ADC ULX 1601 STA RMARGIN 1602 1603 LDA #LLY 1604 STA BLOCKY 1605 1606 * Do a line 1607 1608 :4 LDA #LLX 1609 STA BLOCKX 1610 LDA #/LLX 1611 STA BLOCKX+1 1612 1613 lda #0 1614 sta MATX 1615 jsr CALCMAT 1616 1617 LDA ULX 1618 STA MATX 1619 1620 :3 JSR LAYBLOK ;Lay down block if it's there 1621 1622 LDA BLOCKX 1623 CLC 1624 ADC #DX 1625 STA BLOCKX 1626 1627 LDA BLOCKX+1 1628 ADC #/DX 1629 STA BLOCKX+1 1630 1631 INC MATX 1632 LDA MATX 1633 CMP RMARGIN 1634 BNE :3 1635 1636 * Next line up 1637 1638 LDA BLOCKY 1639 SEC 1640 SBC #DY 1641 STA BLOCKY 1642 1643 DEC MATY 1644 1645 LDA MATY 1646 BMI :done 1647 CMP ULY 1648 BCS :4 1649 LDA ULY 1650 BMI :4 1651 1652 :done PLA 1653 STA BLOCKY 1654 PLA 1655 STA BLOCKX+1 1656 PLA 1657 STA BLOCKX 1658 PLA 1659 STA MATY 1660 PLA 1661 STA MATX 1662 1663 lda #0 1664 sta TOPCUT 1665 1666 lda BLOCKNUM 1667 sta number 1668 RTS 1669 1670 *------------------------------- 1671 * 1672 * L A Y B L O K 1673 * 1674 * Lay down a block (if it's there) 1675 * 1676 *------------------------------- 1677 LAYBLOK ldy MATX 1678 bmi :no 1679 cpy #XDIM 1680 bcs :no 1681 1682 lda MATY 1683 bmi :no 1684 cmp #YDIM 1685 bcs :no 1686 1687 lda (ZTEMP),Y 1688 beq :no 1689 sta number 1690 1691 LDA #2 1692 STA IMAGE 1693 LDA BLOCKX 1694 STA XCO 1695 LDA BLOCKX+1 1696 STA OFFSET 1697 LDA BLOCKY 1698 STA YCO 1699 LDA #0 1700 STA OPACITY 1701 JSR dbldraw 1702 1703 LDA #1 1704 STA IMAGE 1705 LDA BLOCKX 1706 STA XCO 1707 LDA BLOCKX+1 1708 STA OFFSET 1709 LDA BLOCKY 1710 STA YCO 1711 LDA #1 1712 STA OPACITY 1713 jsr dbldraw 1714 1715 LDA BLOCKX 1716 STA XCO 1717 LDA BLOCKX+1 1718 STA OFFSET 1719 LDA BLOCKY 1720 STA YCO 1721 jmp prblokno 1722 1723 :no RTS 1724 1725 *------------------------------- 1726 * 1727 * X P L 5 1728 * 1729 *------------------------------- 1730 XPL5 STA IMAGE 1731 LDA BLACKX 1732 CLC 1733 ADC #35 1734 STA XCO 1735 LDA BLACKX+1 1736 ADC #0 1737 STA OFFSET 1738 LDA BLACKY 1739 STA YCO 1740 JMP dbldraw 1741 1742 *------------------------------- 1743 * 1744 * N E W B L O K 1745 * 1746 *------------------------------- 1747 NEWBLOK LDA NUMNEXT 1748 CMP #MAXBLOX+1 1749 beq :recycle ;out of fresh blocks 1750 1751 sta BLOCKNUM 1752 sta number 1753 CLC 1754 ADC #1 1755 STA NUMNEXT 1756 1757 :cont lda BLOCKX 1758 sec 1759 sbc #ARPX 1760 sta BLOCKX 1761 1762 lda BLOCKX+1 1763 sbc #0 1764 sta BLOCKX+1 1765 1766 lda BLOCKY 1767 sec 1768 sbc #ARPY 1769 sta BLOCKY 1770 1771 lda #bblock 1772 sta CURSOR 1773 1774 lda BLOCKNUM 1775 sta SCRNUM 1776 1777 jsr clrblock 1778 1779 lda #0 ;"OK" 1780 rts 1781 1782 * we're out of fresh blocks -- now go back & look for 1783 * discarded ones we can reuse 1784 1785 :recycle 1786 ldx #1 ;block # 1787 :loop lda INFO,x 1788 bmi :got_one ;255 = discarded-block code 1789 inx 1790 cpx #MAXBLOX+1 1791 bcc :loop 1792 ;all blocks in use 1793 :braap jsr gtone 1794 lda #-1 ;"NO" 1795 rts 1796 1797 :got_one stx BLOCKNUM 1798 stx number 1799 bne :cont 1800 1801 *------------------------------- 1802 * 1803 * Z O O M 1804 * 1805 * Zoom in on this block 1806 * 1807 *------------------------------- 1808 ZOOM JSR CALCMAT1 1809 1810 LDY #0 1811 LDA (MATPTR),Y 1812 BEQ NOBLOK ;No block here 1813 1814 STA SCRNUM 1815 1816 * Cut to large-scale view of block's contents (single hi-res) 1817 1818 lda $c054 1819 lda $c056 ;lores p1 1820 jsr swsingle 1821 jsr storemenu 1822 1823 lda #1 1824 sta ineditor 1825 1826 jmp edstart 1827 1828 *------------------------------- 1829 * R T N B U I L D : return to builder from editor 1830 * or from reboot 1831 1832 RTNBUILD sta $c009 1833 1834 lda #0 1835 sta ineditor 1836 jsr swsingle 1837 lda $c054 1838 lda $c056 ;show lores p. 1 (black) 1839 JSR SETUP 1840 1841 NOBLOK JMP CYCLE 1842 1843 *------------------------------- 1844 * 1845 * S E T U P 1846 * 1847 * Set up builder screen on both pages (double hi-res) 1848 * 1849 *------------------------------- 1850 SETUP jsr zeropeels 1851 1852 lda #0 1853 sta setupflg 1854 1855 jsr dodblcls 1856 jsr DRAWMAT 1857 jsr MENUBAR 1858 1859 lda $c057 1860 jsr swdouble ;set dblhires 1861 jsr pageflip ;draw & show 1 page 1862 1863 jsr copyscrn 1864 jsr copyauxscrn ;copy to other page 1865 1866 jsr moveblok 1867 1868 jsr pageflip 1869 1870 rts 1871 1872 *------------------------------- 1873 * 1874 * M E N U B A R 1875 * 1876 * Draw menu bar across top of screen 1877 * 1878 *------------------------------- 1879 MENUBAR 1880 lda #0 1881 sta TOPCUT 1882 1883 ldx #numbtns 1884 1885 dex ;for now (will be trash) 1886 1887 :loop stx TEMP 1888 1889 lda #ora 1890 jsr drawicon 1891 1892 ldx TEMP 1893 dex 1894 bpl :loop 1895 1896 rts 1897 1898 drawicon 1899 sta OPACITY 1900 1901 lda btnimg,x 1902 sta IMAGE 1903 1904 lda btnxl,x 1905 sta XCO 1906 lda btnxh,x 1907 sta OFFSET 1908 1909 lda btny,x 1910 sta YCO 1911 1912 jmp dbldraw 1913 1914 *------------------------------- 1915 * 1916 * C A L C M A T 1917 * 1918 * Given: MATX & MATY (0-31) 1919 * Return: ZTEMP = 32*MATY + MATX 1920 * 1921 *------------------------------- 1922 CALCMAT LDA MATY 1923 STA ZTEMP 1924 LDA #0 1925 STA ZTEMP+1 1926 1927 ASL ZTEMP 1928 ROL ZTEMP+1 1929 ASL ZTEMP 1930 ROL ZTEMP+1 1931 ASL ZTEMP 1932 ROL ZTEMP+1 1933 ASL ZTEMP 1934 ROL ZTEMP+1 1935 ASL ZTEMP 1936 ROL ZTEMP+1 1937 1938 LDA MATX 1939 CLC 1940 ADC ZTEMP 1941 STA ZTEMP 1942 1943 LDA #/MATBASE 1944 ADC ZTEMP+1 1945 STA ZTEMP+1 1946 1947 RTS 1948 1949 CALCMAT1 JSR CALCMAT 1950 1951 LDA ZTEMP 1952 STA MATPTR 1953 LDA ZTEMP+1 1954 STA MATPTR+1 1955 1956 RTS 1957 1958 *------------------------------- 1959 * 1960 * R E A D B L U E 1961 * 1962 * read blueprint 1963 * 1964 * Use blueprint room loc list (INFO[0-63]) 1965 * to map blocks into 32x32 matrix 1966 * 1967 * In: blank matrix; blueprint just loaded from disk 1968 * 1969 *------------------------------- 1970 readblue lda MATX 1971 pha 1972 lda MATY 1973 pha 1974 1975 lda INFO ;next available block # 1976 sta NUMNEXT 1977 1978 ldx #1 1979 ldy #0 1980 1981 :loop jsr getinfo 1982 bmi :skip ;255 = nonexistent block 1983 jsr CALCMAT 1984 txa 1985 sta (ZTEMP),y 1986 1987 :skip inx 1988 cpx NUMNEXT 1989 bcc :loop 1990 1991 :done pla 1992 sta MATY 1993 pla 1994 sta MATX 1995 rts 1996 1997 getinfo lda INFO,x 1998 sta MATX 1999 lda INFO+MAXBLOX,x 2000 sta MATY 2001 ]rts rts 2002 2003 *------------------------------- 2004 * 2005 * G O P L A Y 2006 * 2007 * Play level 2008 * 2009 *------------------------------- 2010 goplay 2011 jsr setmasterdisk 2012 2013 lda #0 2014 jsr dodialog 2015 2016 cpx #$ff 2017 beq ]rts 2018 2019 jsr makeblue 2020 2021 jsr savebinfo 2022 jsr saveblue ;in aux l.c 2023 2024 jsr gr ;show black lores 2025 jmp gogame 2026 2027 *------------------------------- 2028 * 2029 * D O D I A L O G 2030 * 2031 * do dialog 2032 * 2033 *------------------------------- 2034 dodialog 2035 pha 2036 2037 jsr clrptr 2038 2039 pla 2040 jsr dialog ;(show hidden page, do dialog on it, 2041 ;hide it again) 2042 2043 * Level # is returned in x-reg; ff if failure 2044 2045 cpx #$ff 2046 beq :fix 2047 2048 lda setupflg ;will we be redrawing both screens from scratch? 2049 bne ]rts ;yes 2050 ;no--better fix them now 2051 :fix txa 2052 pha 2053 2054 jsr copyscrn 2055 jsr copyauxscrn ;copy shown page to hidden page 2056 2057 lda #0 2058 sta setupflg 2059 2060 pla 2061 tax 2062 rts 2063 2064 *------------------------------- 2065 * 2066 * C L R L I N K S 2067 * 2068 * Zero bLINK tables 2069 * (no links assigned yet) 2070 * 2071 *------------------------------- 2072 CLRLINKS ldx #0 2073 txa 2074 :loop sta bLINK1,x ;covers bLINK2 2075 sta bLINK3,x ;covers bLINK4 2076 inx 2077 bne :loop 2078 rts 2079 2080 *=============================== 2081 * 2082 * M A K E B L U E P R I N T 2083 * 2084 *------------------------------- 2085 dum locals 2086 2087 glinkptr ds 1 2088 cyindex ds 1 2089 bitmask ds 1 2090 tempscrn ds 1 2091 ctypead ds 2 2092 cGspecad ds 2 2093 cBspecad ds 2 2094 tempby ds 1 2095 ctrlflag ds 1 2096 ctrlindex ds 1 2097 ctrlbyte ds 1 2098 pptimer ds 1 2099 symbtype ds 1 2100 2101 dend 2102 2103 *------------------------------- 2104 makeblue 2105 lda SCRNUM 2106 pha 2107 2108 jsr buildmap 2109 jsr assemblinks 2110 2111 pla 2112 sta SCRNUM 2113 rts 2114 2115 *------------------------------- 2116 * Build map from INFO 2117 2118 buildmap 2119 lda MATX 2120 pha 2121 lda MATY 2122 pha 2123 2124 lda NUMNEXT 2125 sta INFO 2126 2127 ldx #1 ;start w/ block #1 2128 2129 :loop stx TEMP+1 2130 jsr getinfo 2131 bmi :skip ;255 = nonexistent block 2132 2133 txa 2134 asl 2135 asl 2136 sta TEMP 2137 2138 ldx #-1 2139 ldy #0 2140 jsr GETNEIGH 2141 ldy TEMP 2142 sta MAP-4,y ;left 2143 2144 ldx #1 2145 ldy #0 2146 jsr GETNEIGH 2147 ldy TEMP 2148 sta MAP-3,y ;right 2149 2150 ldx #0 2151 ldy #-1 2152 JSR GETNEIGH 2153 ldy TEMP 2154 sta MAP-2,y ;up 2155 2156 ldx #0 2157 ldy #1 2158 JSR GETNEIGH 2159 ldy TEMP 2160 sta MAP-1,y ;down 2161 2162 :skip ldx TEMP+1 2163 inx 2164 cpx NUMNEXT 2165 bcc :loop 2166 2167 :done pla 2168 sta MATY 2169 pla 2170 sta MATX 2171 rts 2172 2173 *------------------------------- 2174 * 2175 * A S S E M B L E L I N K T A B L E S 2176 * 2177 * Use the raw linkage data in BUILDERINFO to 2178 * build the LINKLOC/LINKMAP tables in BLUEPRINT. 2179 * 2180 * BLUESPEC: 2181 * For controllers: pointer (0-255) to first LINKLOC entry 2182 * for this controller 2183 * For gadgets: gadget's current state 2184 * 2185 * LINKLOC: 2186 * Bits 0-4: screen posn (0-29) 2187 * Bits 5-6: low 2 bits of screen # (1-24) 2188 * Bit 7: 1 = this is last entry, 0 = more to come 2189 * 2190 * LINKMAP: 2191 * Bits 0-4 (first entry only): pressplate timer (0-31) 2192 * Bits 5-7: high 3 bits of screen # 2193 * 2194 *------------------------------- 2195 * Assemble link table for this entire level 2196 2197 assemblinks 2198 lda #0 2199 sta glinkptr ;to first free byte in LINKLOC 2200 2201 lda NUMNEXT 2202 sec 2203 sbc #1 2204 sta SCRNUM 2205 2206 :loop jsr assemble1 2207 2208 dec SCRNUM 2209 bne :loop 2210 rts 2211 2212 *------------------------------- 2213 * Assemble link table for every controller on this screen 2214 2215 assemble1 2216 lda SCRNUM 2217 jsr bcalcblue ;returns BLUETYPE in BlueType 2218 ; " BLUESPEC in BlueSpec 2219 ; " bLINDEX in bLinkIndex 2220 lda BlueType 2221 sta ctypead 2222 lda BlueType+1 2223 sta ctypead+1 ;bluetype of controller screen 2224 2225 lda bLinkIndex 2226 sta cBspecad 2227 lda bLinkIndex+1 2228 sta cBspecad+1 ;link index of controller screen 2229 2230 lda BlueSpec 2231 sta cGspecad 2232 lda BlueSpec+1 2233 sta cGspecad+1 ;game bluespec of controller screen 2234 2235 ldy #29 ;block # 2236 :loop sty cyindex 2237 2238 lda (ctypead),y 2239 and #idmask 2240 cmp #pressplate 2241 beq :pp 2242 cmp #upressplate 2243 bne :skip ;not a controller 2244 :pp 2245 lda (cBspecad),y ;link index 2246 sta ctrlindex 2247 bpl :ok 2248 2249 jsr gtone ;braap! 2250 lda ctrlindex 2251 jsr showpage 2252 jmp :skip ;unlinked controller--shouldn't happen 2253 2254 :ok tax ;x = link index 2255 2256 jsr addlist 2257 2258 :skip ldy cyindex 2259 dey 2260 bpl :loop 2261 2262 rts 2263 2264 *------------------------------- 2265 * 2266 * A D D L I S T 2267 * 2268 * Make list of gadgets controlled by this controller 2269 * and add it to LINKLOC/LINKMAP 2270 * (Do one byte at a time) 2271 * 2272 * In: y = cyindex (controller block #) 2273 * 2274 *------------------------------- 2275 addlist 2276 lda glinkptr 2277 sta (cGspecad),y ;y = controller block # 2278 2279 lda #0 2280 sta ctrlflag ;no matches yet 2281 2282 lda #bLINK1 2283 sta sm1+1 2284 sta sm2+1 2285 lda #>bLINK1 2286 sta sm1+2 2287 sta sm2+2 2288 2289 lda #0 ;global 2290 jsr dobyte ;byte 1 2291 2292 lda #bLINK2 2293 sta sm1+1 2294 sta sm2+1 2295 lda #>bLINK2 2296 sta sm1+2 2297 sta sm2+2 2298 2299 lda #0 ;global 2300 jsr dobyte ;byte 2 2301 2302 lda #bLINK3 2303 sta sm1+1 2304 sta sm2+1 2305 lda #>bLINK3 2306 sta sm1+2 2307 sta sm2+2 2308 2309 lda #1 ;local 2310 jsr dobyte ;byte 3 2311 2312 ldx glinkptr ;to next free byte in LINKLOC 2313 2314 lda ctrlflag 2315 beq :nomatches ;still zero... 2316 2317 * There's been at least one match. 2318 * Set hibit of last LINKLOC entry. 2319 2320 :continue 2321 dex 2322 lda LINKLOC,x 2323 ora #$80 ;set hibit 2324 sta LINKLOC,x 2325 rts 2326 2327 * This "controller" controls nothing. Signify this by 2328 * setting LINKLOC to $FF (an otherwise unattainable value) 2329 * and LINKMAP to initial value of pp timer 2330 2331 :nomatches 2332 lda #$ff 2333 sta LINKLOC,x 2334 2335 lda #0 ;initial pptimer value 2336 sta LINKMAP,x 2337 2338 inc glinkptr 2339 rts 2340 2341 *------------------------------- 2342 * In: A = symbol type (0 = global, 1 = local) 2343 2344 dobyte 2345 sta symbtype 2346 2347 ldx ctrlindex 2348 sm2 lda bLINK1,x ;self-modifying code 2349 ;(can be bLINK1,2 or 3) 2350 sta ctrlbyte ;controller bLINKbyte 2351 2352 * Do one bit at a time 2353 2354 lda #1 2355 :loop sta bitmask 2356 and ctrlbyte 2357 beq :skipbit ;this bit is clear 2358 2359 jsr dobit 2360 2361 :skipbit lda bitmask 2362 asl ;next bit 2363 bpl :loop 2364 ;hi bit is unused 2365 rts 2366 2367 *------------------------------- 2368 dobit 2369 lda symbtype 2370 bne :local 2371 2372 * Global symbol -- 2373 * Test every object on every screen in this level 2374 * to see if this bit is set 2375 2376 lda NUMNEXT ;#+1 of screens in this level 2377 sec 2378 sbc #1 2379 sta tempscrn 2380 2381 :nextscrn 2382 jsr doscrn 2383 2384 dec tempscrn 2385 bne :nextscrn ;next screen 2386 rts 2387 2388 * Local symbol -- do this scrn only 2389 2390 :local lda SCRNUM 2391 sta tempscrn 2392 2393 jmp doscrn 2394 2395 *------------------------------- 2396 * do a screen 2397 * In: tempscrn 2398 2399 doscrn 2400 lda tempscrn 2401 jsr bcalcblue ;returns BlueType,Bluespec,bLinkIndex 2402 2403 ldy #29 ;block # 2404 :loop jsr testobj 2405 dey 2406 bpl :loop ;next block 2407 2408 rts 2409 2410 *------------------------------- 2411 * If object is a gadget, test it for this bit; 2412 * if bit is set, add object to list 2413 2414 * In: BlueType, bLinkIndex 2415 * In & out: y = block # 2416 2417 testobj 2418 lda (bLinkIndex),y 2419 bmi :rts ;ff means object is unlinked 2420 2421 tax ;x = link index (0-127) 2422 2423 lda (BlueType),y 2424 and #idmask ;objid 2425 ;is it a controllable gadget? 2426 cmp #gate 2427 beq yes 2428 2429 cmp #exit 2430 beq yes 2431 2432 * NOTE--insert other controllable gadgets here 2433 * as we implement them 2434 2435 :rts rts 2436 2437 yes 2438 sm1 lda bLINK1,x ;self-modifying code 2439 ;(can be BLINK1,2 or 3) 2440 and bitmask 2441 beq :rts ;bit is clear 2442 ;bit is set 2443 2444 * We have a match -- add this gadget to LINKlist 2445 2446 lda #1 2447 sta ctrlflag ;so we know there's at least one 2448 ;gadget in list 2449 2450 ldx glinkptr ;to first free byte in LINKLOC 2451 2452 sty tempby ;gadget block # (0-29) 2453 2454 lda tempscrn ;gadget screen # (1-24) 2455 and #%00000011 ;2 low bits 2456 asl 2457 asl 2458 asl 2459 asl 2460 asl ;bits 5-6: 2 low bits of screen# 2461 ora tempby ;bits 0-4: block# 2462 sta LINKLOC,x ;bit 7 clear (for now) 2463 2464 lda tempscrn 2465 and #%00011100 ;3 high bits 2466 asl 2467 asl 2468 asl ;bits 5-7: 3 high bits of screen# 2469 2470 ora #0 ;bits 0-4: init value of timer 2471 2472 sta LINKMAP,x 2473 2474 inc glinkptr ;but not past 255 2475 2476 :rts rts 2477 2478 *------------------------------- 2479 lst 2480 ds 1 2481 usr $a9,24,$0000,*-org 2482 lst off