goapple2/source/applesoft/S.F3D8
2014-05-09 17:59:16 -07:00

154 lines
6.3 KiB
Plaintext

1010 *--------------------------------
1020 * "HGR" AND "HGR2" STATEMENTS
1030 *--------------------------------
1040 HGR2 BIT SW.HISCR SELECT PAGE 2 ($4000-5FFF)
1050 BIT SW.MIXCLR DEFAULT TO FULL SCREEN
1060 LDA /$4000 SET STARTING PAGE FOR HIRES
1070 BNE SETHPG ...ALWAYS
1080 HGR LDA /$2000 SET STARTING PAGE FOR HIRES
1090 BIT SW.LOWSCR SELECT PAGE 1 ($2000-3FFF)
1100 BIT SW.MIXSET DEFAULT TO MIXED SCREEN
1110 SETHPG STA HGR.PAGE BASE PAGE OF HIRES BUFFER
1120 LDA SW.HIRES TURN ON HIRES
1130 LDA SW.TXTCLR TURN ON GRAPHICS
1140 *--------------------------------
1150 * CLEAR SCREEN
1160 *--------------------------------
1170 HCLR LDA #0 SET FOR BLACK BACKGROUND
1180 STA HGR.BITS
1190 *--------------------------------
1200 * FILL SCREEN WITH (HGR.BITS)
1210 *--------------------------------
1220 BKGND LDA HGR.PAGE PUT BUFFER ADDRESS IN HGR.SHAPE
1230 STA HGR.SHAPE+1
1240 LDY #0
1250 STY HGR.SHAPE
1260 .1 LDA HGR.BITS COLOR BYTE
1270 STA (HGR.SHAPE),Y CLEAR HIRES TO HGR.BITS
1280 JSR COLOR.SHIFT CORRECT FOR COLOR SHIFT
1290 INY (SLOWS CLEAR BY FACTOR OF 2)
1300 BNE .1
1310 INC HGR.SHAPE+1
1320 LDA HGR.SHAPE+1
1330 AND #$1F DONE? ($40 OR$60)
1340 BNE .1 NO
1350 RTS YES, RETURN
1360 *--------------------------------
1370 * SET THE HIRES CURSOR POSITION
1380 *
1390 * (Y,X) = HORIZONTAL COORDINATE (0-279)
1400 * (A) = VERTICAL COORDINATE (0-191)
1410 *--------------------------------
1420 HPOSN STA HGR.Y SAVE Y- AND X-POSITIONS
1430 STX HGR.X
1440 STY HGR.X+1
1450 PHA Y-POS ALSO ON STACK
1460 AND #$C0 CALCULATE BASE ADDRESS FOR Y-POS
1470 STA MON.GBASL FOR Y=ABCDEFGH
1480 LSR GBASL=ABAB0000
1490 LSR
1500 ORA MON.GBASL
1510 STA MON.GBASL
1520 PLA (A) (GBASH) (GBASL)
1530 STA MON.GBASH ?-ABCDEFGH ABCDEFGH ABAB0000
1540 ASL A-BCDEFGH0 ABCDEFGH ABAB0000
1550 ASL B-CDEFGH00 ABCDEFGH ABAB0000
1560 ASL C-DEFGH000 ABCDEFGH ABAB0000
1570 ROL MON.GBASH A-DEFGH000 BCDEFGHC ABAB0000
1580 ASL D-EFGH0000 BCDEFGHC ABAB0000
1590 ROL MON.GBASH B-EFGH0000 CDEFGHCD ABAB0000
1600 ASL E-FGH00000 CDEFGHCD ABAB0000
1610 ROR MON.GBASL 0-FGH00000 CDEFGHCD EABAB000
1620 LDA MON.GBASH 0-CDEFGHCD CDEFGHCD EABAB000
1630 AND #$1F 0-000FGHCD CDEFGHCD EABAB000
1640 ORA HGR.PAGE 0-PPPFGHCD CDEFGHCD EABAB000
1650 STA MON.GBASH 0-PPPFGHCD PPPFGHCD EABAB000
1660 TXA DIVIDE X-POS BY 7 FOR INDEX FROM BASE
1670 CPY #0 IS X-POS < 256?
1680 BEQ .2 YES
1690 LDY #35 NO: 256/7 = 36 REM 4
1700 * CARRY=1, SO ADC #4 IS TOO LARGE;
1710 * HOWEVER, ADC #4 CLEARS CARRY
1720 * WHICH MAKES SBC #7 ONLY -6
1730 * BALANCING IT OUT.
1740 ADC #4 FOLLOWING INY MAKES Y=36
1750 .1 INY
1760 .2 SBC #7
1770 BCS .1
1780 STY HGR.HORIZ HORIZONTAL INDEX
1790 TAX USE REMAINDER-7 TO LOOK UP THE
1800 LDA MSKTBL-$100+7,X BIT MASK
1810 STA MON.HMASK
1820 TYA QUOTIENT GIVES BYTE INDEX
1830 LSR ODD OR EVEN COLUMN?
1840 LDA HGR.COLOR IF ON ODD BYTE (CARRY SET)
1850 STA HGR.BITS THEN ROTATE BITS
1860 BCS COLOR.SHIFT ODD COLUMN
1870 RTS EVEN COLUMN
1880 *--------------------------------
1890 * PLOT A DOT
1900 *
1910 * (Y,X) = HORIZONTAL POSITION
1920 * (A) = VERTICAL POSITION
1930 *--------------------------------
1940 HPLOT0 JSR HPOSN
1950 LDA HGR.BITS CALCULATE BIT POSN IN GBAS,
1960 EOR (MON.GBASL),Y HGR.HORIZ, AND HMASK FROM
1970 AND MON.HMASK Y-COOR IN A-REG,
1980 EOR (MON.GBASL),Y X-COOR IN X,Y REGS.
1990 STA (MON.GBASL),Y FOR ANY 1-BITS, SUBSTITUTE
2000 RTS CORRESPONDING BIT OF HGR.BITS
2010 *--------------------------------
2020 * MOVE LEFT OR RIGHT ONE PIXEL
2030 *
2040 * IF STATUS IS +, MOVE RIGHT; IF -, MOVE LEFT
2050 * IF ALREADY AT LEFT OR RIGHT EDGE, WRAP AROUND
2060 *
2070 * REMEMBER BITS IN HI-RES BYTE ARE BACKWARDS ORDER:
2080 * BYTE N BYTE N+1
2090 * S7654321 SEDCBA98
2100 *--------------------------------
2110 MOVE.LEFT.OR.RIGHT
2120 BPL MOVE.RIGHT + MOVE RIGHT, - MOVE LEFT
2130 LDA MON.HMASK MOVE LEFT ONE PIXEL
2140 LSR SHIFT MASK RIGHT, MOVES DOT LEFT
2150 BCS LR.2 ...DOT MOVED TO NEXT BYTE
2160 EOR #$C0 MOVE SIGN BIT BACK WHERE IT WAS
2170 LR.1 STA MON.HMASK NEW MASK VALUE
2180 RTS
2190 LR.2 DEY MOVED TO NEXT BYTE, SO DECR INDEX
2200 BPL LR.3 STILL NOT PAST EDGE
2210 LDY #39 OFF LEFT EDGE, SO WRAP AROUND SCREEN
2220 LR.3 LDA #$C0 NEW HMASK, RIGHTMOST BIT ON SCREEN
2230 LR.4 STA MON.HMASK NEW MASK AND INDEX
2240 STY HGR.HORIZ
2250 LDA HGR.BITS ALSO NEED TO ROTATE COLOR
2260 *--------------------------------
2270 COLOR.SHIFT
2280 ASL ROTATE LOW-ORDER 7 BITS
2290 CMP #$C0 OF HGR.BITS ONE BIT POSN.
2300 BPL .1
2310 LDA HGR.BITS
2320 EOR #$7F
2330 STA HGR.BITS
2340 .1 RTS
2350 *--------------------------------
2360 * MOVE RIGHT ONE PIXEL
2370 * IF ALREADY AT RIGHT EDGE, WRAP AROUND
2380 *--------------------------------
2390 MOVE.RIGHT
2400 LDA MON.HMASK
2410 ASL SHIFTING BYTE LEFT MOVES PIXEL RIGHT
2420 EOR #$80
2430 * ORIGINAL: C0 A0 90 88 84 82 81
2440 * SHIFTED: 80 40 20 10 08 02 01
2450 * EOR #$80: 00 C0 A0 90 88 84 82
2460 BMI LR.1 FINISHED
2470 LDA #$81 NEW MASK VALUE
2480 INY MOVE TO NEXT BYTE RIGHT
2490 CPY #40 UNLESS THAT IS TOO FAR
2500 BCC LR.4 NOT TOO FAR
2510 LDY #0 TOO FAR, SO WRAP AROUND
2520 BCS LR.4 ...ALWAYS
2530 *--------------------------------