0100     .OPT NO LIST›0110 ;›0120 ; **************›0130 ; SYSTEM EQUATES›0140 ; **************›0150 ;›0160 POKMSK = $10    ;POKEY INTERRUPT›0170 SDLSTL = $0230  ;DLIST POINTER›0180 STICK0 = $0278  ;JOYSTICK PORT›0190 IRQEN = $D20E   ;INTER. REQUEST›0200 HSCROL = $D404  ;SCROLL REGISTER›0210 VSCROL = $D405  ;SCROLL REGISTER›0220 SETVBV = $E45C  ;SET TIMERS›0230 XITVBV = $E462  ;EXIT DEF VBLANK›0240 ;›0250 ; **********************›0260 ; MEMORY USAGE & EQUATES›0270 ; **********************›0280 ;›0290 LISTLO = $0600  ;DLIST LO-BYTE›0300 LISTHI = $0601  ;DLIST HI-BYTE›0310 MINX =  $0602   ;LEFTMOST LIMIT›0320 MINY =  $0603   ;UPPER LIMIT›0330 MAXX =  $0604   ;RIGHTMOST LIMIT›0340 MAXY =  $0605   ;LOWER LIMIT›0350 HMAX =  $0606   ;LARGEST HSCROL›0360 VMAX =  $0607   ;LARGEST VSCROL›0370 ALINES = $0608  ;# OF D-LINES›0380 STICK = $0609   ;JOYSTICK #›0390 HSPEED = $060A  ;HOR. SPEED›0400 VSPEED = $060B  ;VER. SPEED›0410 HINVERT = $060C ;INVERSION FLAG›0420 VINVERT = $060D ;INVERSION FLAG›0430 PAGES = $CB     ;SCREEN PAGES›0440 ZPAGE = $CD     ;ZERO PAGE INDEX›0450 ;›0460 ; **************************›0470 ; MISCELLANEOUS MEMORY USAGE›0480 ; **************************›0490 ;›0500 HBIT =  $060E   ;'HSCROL' COPY›0510 VBIT =  $060F   ;'VSCROL' COPY›0520 HTIME = $0610   ;'HSPEED' COPY›0530 VTIME = $0611   ;'VSPEED' COPY›0540 HPOINT = $0612  ;SHIFT COUNTER›0550 VPOINT = $0613  ;SHIFT COUNTER›0560 DLINES = $0614  ;LMS OPCODES CNT›0570 COUNT = $0615   ;'DLINES' COPY›0580 TEMP =  $0616   ;TEMP STORAGE›0590 TEMP1 = $0617   ;TEMP STORAGE›0600 XHOLD1 = $0618  ;TEMP STORAGE›0610 XHOLD2 = $0619  ;TEMP STORAGE›0620 OPCODE = $061A  ;DLIST OPCODE›0630 VBLANK = $061B  ;VBLANK VECTOR›0640 OFFSETS = $061D ;OFFSETS TO LMS›0650 STOPALL = $06FF ;HOLD EVERYTHING›1000     .INCLUDE #D:VAR.ASM›1010 ;›1020 ;**********************›1030 ;INITIALIZATION ROUTINE›1040 ;**********************›1050 ;INITIALIZATION ROUTINE›1060     *=  $4000›1070     LDA POKMSK  ;GET IRQ. INT.›1080     AND #$7F    ;NO BREAK KEY›1090     STA POKMSK  ;THE BREAK KEY›1100     STA IRQEN   ;NO LONGER WORKS›1110     CLD         ;CLEAR DECIMAL›1120     PLA         ;# OF ARGUEMENTS›1130     PLA         ;VBLANK HI/BYTE›1140     STA VBLANK+1›1150     PLA         ;VBLANK LO/BYTE›1160     STA VBLANK›1170     PLA         ;DLIST HI/BYTE›1180     STA LISTHI›1190     PLA         ;DLIST LO/BYTE›1200     STA LISTLO›1210     PLA         ;DISCARD›1220     PLA         ;GET 'LINES'›1230     STA ALINES›1240     PLA         ;DISCARD›1250     PLA         ;GET 'MINX'›1260     STA MINX›1270     STA HPOINT  ;RESET TO START›1280     PLA         ;DISCARD›1290     PLA         ;GET 'MAXX'›1300     STA MAXX›1310     PLA         ;DISCARD›1320     PLA         ;GET 'MINY'›1330     STA MINY›1340     STA VPOINT  ;RESET TO START›1350     PLA         ;DISCARD›1360     PLA         ;GET 'MAXY'›1370     STA MAXY›1380     PLA         ;DISCARD›1390     PLA         ;GET 'HMAX'›1400     STA HMAX›1410     PLA         ;DISCARD›1420     PLA         ;GET 'VMAX'›1430     STA VMAX›1440     PLA         ;DISCARD›1450     PLA         ;GET 'HSPEED'›1460     STA HSPEED›1470     PLA         ;DISCARD›1480     PLA         ;GET 'VSPEED'›1490     STA VSPEED›1500     PLA         ;DISCARD›1510     PLA         ;GET 'STICK'›1520     STA STICK›1530     PLA         ;DISCARD›1540     PLA         ;GET 'HINVERT'›1550     STA HINVERT›1560     PLA         ;DISCARD›1570     PLA         ;GET 'VINVERT'›1580     STA VINVERT›1590     PLA         ;PAGE USAGE HI›1600     STA PAGES+1 ;STORE IT›1610     PLA         ;PAGE USAGE LO›1620     STA PAGES   ;STORE IT›1630     LDA #$01    ;INITIALIZE RAM›1640     STA HTIME   ;COPY OF SPEED›1650     STA VTIME   ;TIMERS.›1660 ;›1670 ;*******************************›1680 ;EXAMINE DLIST, NOTE LMS OPCODES›1690 ;*******************************›1700 ;›1710     LDA ZPAGE   ;SAVE WHATEVER›1720     PHA         ;IS IN MEM. LOC.›1730     LDA ZPAGE+1 ;SAVE WHATEVER›1740     PHA         ;IS IN MEM. LOC.›1750     LDA LISTLO  ;GET DLIST/LO &›1760     STA ZPAGE   ;PUT IN WORKAREA›1770     LDA LISTHI  ;GET DLIST/HI &›1780     STA ZPAGE+1 ;PUT IN WORKAREA›1790     LDY #$00    ;SET UP COUNTER›1800     LDX #$00    ;SET UP COUNTER›1810     STX VBIT    ;SET UP SCROLL›1820     STX VBIT    ;BITS TO ZERO›1830 DLOOK LDA (ZPAGE),Y ;GET DISPLAY›1840     STA OPCODE  ;LIST OPCODE›1850     AND #$0F    ;IS IT A BLANK›1860     BEQ NEXT    ;LINE OPCODE?›1870     LDA OPCODE  ;IS IT AN LMS›1880     AND #$40    ;OPCODE?›1890     BEQ NEXT›1900     INY         ;IF SO, SKIP›1910     INY         ;LMS OPERANDS›1920     LDA OPCODE›1930     AND #$0F    ;IS IT A JVB›1940     CMP #$01    ;OPCODE?›1950     BEQ DONE    ;IF SO, STOP.›1960     LDA OPCODE  ;ARE SCROLL BITS›1970     AND #$30    ;OF OPCODE SET?›1980     BEQ NEXT›1990     TYA         ;THIS IS AN LMS›2000     SEC         ;OPCODE W/SROLL›2010     SBC #$02    ;BITS SET. SAVE›2020     STA OFFSETS,X ;THE OFFSET.›2030     INX ›2040 NEXT INY        ;MOVE TO NEXT›2050     BNE DLOOK   ;DLIST OPCODE.›2060 DONE STX DLINES ;SAVE # OF LINES›2070     PLA         ;RESTORE MEM.›2080     STA ZPAGE+1 ;LOCATION.›2090     PLA         ;RESTORE MEM.›2100     STA ZPAGE   ;LOCATION.›2110     LDA #$07    ;TELL SYSTEM TO›2120     LDX VBLANK+1 ;SET UP DEF.›2130     LDY VBLANK  ;VERTICAL BLANK›2140     JSR SETVBV  ;ROUTINE.›2150     RTS         ;ALL DONE. BYE!›7000     .INCLUDE #D:VAR.ASM›7010 ;›7020 ;**************************›7030 ;TIME TO HORIZONTAL SCROLL?›7040 ;**************************›7050 ;›7060     *=  $5000›7070     LDA STOPALL ;IS IT OKAY TO›7080     BEQ PLUNGE  ;EXECUTE?›7090     JMP XITVBV  ;NO! BYE!›7100 PLUNGE CLD      ;YES, CLEAR DEC.›7110     LDA LISTLO  ;TELL ANTIC›7120     STA SDLSTL  ;WHERE YOUR NEW›7130     LDA LISTHI  ;DISPLAY LIST IS›7140     STA SDLSTL+1›7150     DEC HTIME   ;DECREMENT TIMER›7160     BNE ENDIT   ;IF <> 0, STOP!›7170     LDA HSPEED  ;RESET TIMER›7180     STA HTIME›7190     BEQ ENDIT   ;IF = 0, STOP!›7200 ;›7210 ; NOW READ CORRECT JOYSTICK›7220 ;›7230     LDX STICK   ;GET POSITION OF›7240     LDA STICK0,X ;RIGHT JOYSTICK›7250     LDY HINVERT ;SHOULD WE IN-›7260     BNE HOPP    ;VERT HOR. MOVE›7270 ;›7280 ;SCROLL DIRECTION ISN'T INVERTED›7290 ;›7300     AND #$0C    ;SCAN SELECT›7310     CMP #$08    ;JOYSTICK BITS›7320     BEQ HLEFT   ;MOVE LEFT›7330     CMP #$04›7340     BEQ HRIGHT  ;MOVE RIGHT›7350     BNE ENDIT›7360 ;›7370 ;SCROLL DIRECTION IS INVERTED›7380 ;›7390 HOPP AND #$0C   ;SCAN SELECT›7400     CMP #$04    ;JOYSTICK BITS›7410     BEQ HLEFT   ;MOVE LEFT›7420     CMP #$08›7430     BNE ENDH    ;MOVE RIGHT›7440 ;›7450 ; SCROLL RIGHT›7460 ;›7470 HRIGHT INC HBIT ;INCREMENT RAM›7480     LDA HBIT    ;'HSCROL' COPY›7490     CMP HMAX    ;IS IT ABOVE›7500     BEQ ENDH    ;VALID SCROLL›7510     BCC ENDH    ;LIMIT?›7520     LDA HPOINT  ;YES! ARE WE AT›7530     CMP MINX    ;LEFTMOST BOUND?›7540     BNE HOR5    ;NO, CONTINUE›7550     DEC HBIT    ;YES! HALT›7560     BEQ ENDH    ;SCROLL & QUIT›7570     BNE ENDH›7580 HOR5 DEC HPOINT ;CONTINUE.›7590     LDA #$FF    ;PERFORM BYTE›7600     PHA         ;SHIFTING W/HFIX›7610     BMI HFIX    ;ROUTINE›7620 HOR55 LDA #$00  ;RESET 'HSCROL'›7630     STA HBIT    ;RAM COPY.›7640     BEQ ENDH    ;ALL DONE.›7650 ;›7660 ;INC/DEC LMS LO/BYTE OPERANDS›7670 ;›7680 HFIX STA TEMP   ;GET BYTES TO›7690     PLA         ;INC/DEC LO-BYTE›7700     STA TEMP1   ;OF LMS OPERANDS›7710     LDX ALINES  ;GET # OF LINES›7720     DEX         ;MINUS ONE›7730     LDY #$00    ;SET INDEX TO 0›7740 HFIX5 LDA (PAGES),Y ;GET OPERAND›7750     CLC ›7760     ADC TEMP    ;INC/DEC IT›7770     STA (PAGES),Y ;PUT IT BACK›7780     INY         ;CHECK FOR WRAP›7790     LDA (PAGES),Y ;AROUND OF LO›7800     ADC TEMP1   ;BYTE INTO HI›7810     STA (PAGES),Y ;BYTE. FIXITUP›7820     INY         ;ADJUST POINTER›7830     DEX         ;DID WE DO ALL?›7840     BPL HFIX5   ;NO! CONTINUE›7850     LDA TEMP    ;YES! DECIDE›7860     BMI HOR55   ;WHO CALLED THIS›7870     BPL HOR66   ;ROUTINE. RETURN›7880 ;›7890 ;INTERMEDIATE BRANCH›7900 ;›7910 ENDIT BEQ ENDH  ;NO MATTER WHAT›7920     BNE ENDH    ;BRANCH TO END.›7930 ;›7940 ; SCROLL LEFT›7950 ;›7960 HLEFT DEC HBIT  ;DEC HSCROL COPY›7970     BPL ENDH    ;OUT OF RANGE?›7980     LDA HPOINT  ;YES! ARE WE AT›7990     CMP MAXX    ;RIGHT BOUND?›8000     BNE HOR6    ;NO! CONTINUE›8010     INC HBIT    ;YES! HALT›8020     BEQ ENDH    ;SCROLL & QUIT›8030     BNE ENDH›8040 HOR6 INC HPOINT ;NO! PERFORM›8050     LDA #$00    ;BYTE SHIFTING›8060     PHA         ;W/HFIX ROUTINE›8070     LDA #$01›8080     BPL HFIX›8090 HOR66 LDA HMAX  ;RESET 'HSCROL'›8100     STA HBIT    ;RAM COPY›8110 ;›8120 ; TIME TO VERTICAL SCROLL?›8130 ;›8140 ENDH DEC VTIME  ;DEC. TIMER›8150     BNE ENDV    ;IF <> 0, QUIT›8160     LDA VSPEED  ;RESTORE TIMER›8170     STA VTIME   ;FOR NEXT TIME›8180     BEQ ENDV    ;IF = 0, QUIT›8190 ;›8200 ; READ CORRECT JOYSTICK›8210 ;›8220     LDX STICK   ;GET JOYSTICK #›8230     LDA STICK0,X ;GET READING›8240     LDY VINVERT ;IS VER. SCROLL›8250     BNE VOPP    ;INVERTED?›8260 ;›8270 ;VERTICAL SCROLL ISN'T INVERTED›8280 ;›8290     AND #$03    ;SCAN SELECT›8300     CMP #$02    ;BITS›8310     BEQ VUP     ;SCROLL UP›8320     CMP #$01›8330     BEQ VDOWN   ;SCROLL DOWN›8340     BNE ENDV›8350 ;›8360 ;VERTICAL SCROLL IS INVERTED›8370 ;›8380 VOPP AND #$03   ;SCAN SELECT›8390     CMP #$01    ;BITS›8400     BEQ VUP     ;SCROLL UP›8410     CMP #$02    ;SCROLL DOWN›8420     BNE ENDV    ;DO NADA!›8430 ;›8440 ;SCROLL DOWN›8450 ;›8460 VDOWN DEC VBIT  ;DEC VSCROL COPY›8470     BPL ENDV    ;IN VALID RANGE?›8480     LDA VPOINT  ;NO! ARE WE AT›8490     CMP MINY    ;UPPER BOUND?›8500     BNE VER5    ;NO! CONTINUE›8510     INC VBIT    ;YES! STOP›8520     BEQ ENDV    ;SCROLL & QUIT›8530     BNE ENDV›8540 VER5 DEC VPOINT ;ADJUST VERTICAL›8550     LDA VMAX    ;RESET RAM COPY›8560     STA VBIT    ;OF 'VSCROL'›8570     BEQ ENDV    ;ALL DONE!›8580     BNE ENDV›8590 ;›8600 ;SCROLL UP›8610 ;›8620 VUP INC VBIT    ;INC RAM COPY›8630     LDA VBIT    ;OF 'VSCROL'›8640     CMP VMAX    ;IS IT IN VALID›8650     BEQ ENDV    ;RANGE?›8660     BCC ENDV›8670     LDA VPOINT  ;NO! ARE WE AT›8680     CMP MAXY    ;LOWER BOUND?›8690     BNE VER6    ;NO! CONTINUE›8700     DEC VBIT    ;YES! HALT›8710     BEQ ENDV    ;SCROLL & QUIT›8720     BNE ENDV›8730 VER6 INC VPOINT ;ADJUST VERTICAL›8740     LDA #$00    ;RESET RAM COPY›8750     STA VBIT    ;OF 'VSCROL'›8760 ENDV LDA HBIT   ;INSTALL COPY›8770     STA HSCROL  ;INTO 'HSCROL'›8780     LDA VBIT    ;INSTALL COPY›8790     STA VSCROL  ;INTO 'VSCROL'›8800 ;›8810 ;INSTALL PAGE DATA INTO DLIST›8820 ;›8830 FIX LDA DLINES  ;GET # OF LMS›8840     BEQ RTS     ;OPCODES›8850     STA COUNT   ;HOLD ON TO IT›8860     LDA ZPAGE   ;SAVE WHATEVER›8870     PHA         ;IS IN MEM. LOC.›8880     LDA ZPAGE+1 ;SAVE WHATEVER›8890     PHA         ;IS IN MEM. LOC.›8900     LDX #$00    ;SET INDEX TO 0›8910     STX XHOLD1›8920     LDA VPOINT  ;VERTICAL POINT›8930     ASL A       ;MULTIPLY BY 2›8940     STA XHOLD2  ;HOLD ON TO IT›8950     LDA SDLSTL  ;GET LO/DLIST &›8960     STA ZPAGE   ;PUT IN WORKAREA›8970     LDA SDLSTL+1 ;GET HI/DLIST &›8980     STA ZPAGE+1 ;PUT IN WORKAREA›8990 HSTUFF LDY XHOLD2 ;PAGE INDEX›9000     LDA (PAGES),Y ;PAGE DATA›9010     PHA         ;SAVE IT›9020     LDX XHOLD1  ;OFFSET INDEX›9030     LDA OFFSETS,X ;OFFSET TO LMS›9040     TAY         ;HOLD IT›9050     INY         ;PLUS ONE›9060     PLA         ;GET PAGE DATA›9070     STA (ZPAGE),Y ;PUT IN DLIST›9080     INC XHOLD2  ;INC PAGE INDEX›9090     LDY XHOLD2  ;GET IT AGAIN›9100     LDA (PAGES),Y ;PAGE DATA›9110     PHA         ;SAVE IT›9120     LDA OFFSETS,X ;OFFSET TO LMS›9130     TAY         ;HOLD IT›9140     INY         ;PLUS ONE›9150     INY         ;PLUS TWO›9160     PLA         ;GET PAGE DATA›9170     STA (ZPAGE),Y ;PUT IN DLIST›9180     INC XHOLD1  ;INC OFFSET INDEX›9190     INC XHOLD2  ;INC PAGE INDEX›9200     DEC COUNT   ;ARE WE DONE?›9210     BNE HSTUFF  ;NO! KEEP GOING.›9220     PLA         ;RESTORE MEMORY›9230     STA ZPAGE+1 ;LOCATION›9240     PLA         ;RESTORE MEMORY›9250     STA ZPAGE   ;LOCATION›9260 RTS JMP XITVBV  ;ALL DONE. LATER!›