; ****** BIT MAP DEFINE AND DRAW ROUTINES **************************** ; ; define_map (MEM,XSIZE,YSIZE,MODE); ; WHERE MEM IS 16 BIT ADDRESS OF START OF BIT MAP ; XSIZE,YSIZE ARE THE SIZE OF THE BIT MAP ; MODE IS EVEN FOR BIT MAP, ODD FOR BYTE MAP ; ; BIT MAP CONTENTS: ; ONE POINT IS DRAWN PER BIT IN THE DATA STRING ; L.S. BIT IS PLOTTED TO THE LEFT ; L.S. BYTE IS TO THE LEFT ; IF BIT IS ON THEN POINT IS DRAWN ; EACH LINE STARTS WITH NEW BYTE OF DATA ; ; BYTE MAP CONTENTS: ; ONE BYTE PER POINT TO BE DISPLAYED ; 2 M.S.BITS SPECIFY OPERATION ; 00 - DONT PLOT POINT ; 01 - SET WRITR TO 6 L.S.BITS THEN PLOT POINT ; 10 - SET INVER THEN PLOT POINT ; 11 - SET DATAR THEN PLOT POINT ; LOWEST ADDRESS OF BIT MAP IS WRITTEN TO THE ; PRESENT POSITION. SUCCESSIVE BYTES ARE PLOTTED ; IN THE X DIRECTION. ; .proc define_map,4 ; ; procedure define_map (var mem; xsize,ysize,mode :integer); ; .REF BITDL,BITDM,BITX,BITY,BITM ; pop RETURN PLA STA BITM ; STORE MODE PLA PLA STA BITY PLA PLA STA BITX PLA pop BITDL push RETURN RTS ; ; BIT MAP DRAW ; WRITES BIT MAP TO PRESENT POSITION ; POSITION IS RESTORED ON RETURN TO BASIC ; OUTPUT TO SCREEN IS CLIPPED TO X MARGIN OF SCREEN ; .proc draw_map ; .REF BITDL,BITDM,BITX,BITY,BITM .REF STACK1,DSTACK,STXLSB,STXMSB .REF PLOTB,WCMD,READY,SVXCRD .REF RESCOL,PUTCOL ; .DEF CAFRSY,BTPLOT,BITDRW,BITDLP,BYTDRW,GTDATA ; SAVEXM .EQU 8 SAVEXL .EQU 9 ; LDA BITX ; CHECK XSIZE BEQ BITRTS ;RETURN IF 0 LDA BITY BEQ BITRTS STA VALLSB ; TEMP STORE FOR YSIZE LDA BITDL ; TRANSFER DATA POINTER TO 0 PAGE STA TEMP2 LDA BITDM STA TEMP2+1 JSR READY ; SAVE VGP POSITION LDY #3 BSVLP: LDA XMSB,Y STA SAVEXM,Y DEY BPL BSVLP LDA BITM ; CHECK MODE ROR A BCC BITVLP ; PLOT BITS ; BYTVLP: LDX BITX ; LOAD XSIZE STX VALMSB ; TEMP SAVE JSR BYTDRW ; DO ONE LINES WORTH DEC VALLSB BEQ BITRSY ; EXIT IF NO MORE LINES JSR NEWLIN JMP BYTVLP ; BITVLP: LDA BITX STA VALMSB ; TEMP SAVE LDA #0 STA TEMP1 ; RESET PLOT FLAG JSR BITDRW ; DO ONE LINES WORTH JSR BTPLOT ; FINISH OFF PLOT DEC VALLSB BEQ BITRSY JSR NEWLIN JMP BITVLP ; BITRSY: JSR READY ; RESTORE POSITION LDY #3 BRSTR: LDA SAVEXM,Y STA XMSB,Y DEY BPL BRSTR CAFRSY: LDA BITM ROR A BCC BITRTS ; RETURN IF BIT MODE JSR RESCOL BITRTS: RTS ; BTPLOT: BIT TEMP1 ; IS PLOT FLAG SET ? BPL BTPLNO LDA XLSB BNE BTMNNO DEC XMSB BTMNNO: DEC XLSB JSR PLOTB ; PLOT TO POSITION - 1 INC XLSB BNE BTPLNO INC XMSB BTPLNO: RTS ; NEWLIN: JSR READY ; RESET X, INC Y LDA SAVEXL ; GET SAVED X POS STA XLSB LDA SAVEXM STA XMSB INC YLSB ; INCREMENT Y BNE YRTS INC YMSB YRTS: RTS ; GTDATA: LDY #0 ; GET DATA BYTE LDA @TEMP2,Y INC TEMP2 BNE INCD INC TEMP2+1 ; INCREMENT DATA POINTER INCD: RTS ; BYTDRW: LDA VALMSB ; BYTE MODE: DRAW ONE LINES WORTH BEQ BYTHND ; RETURN IF NO. OF POINTS = 0 JSR GTDATA ; GET DATA BYTE CMP #40 ; DO NOTHING ? BCC JINC ; IF YES, JUST INC VGP ADDRESS ; STA TEMP1 ; SAVE FOR ROTATE ROL A ROL A ROL A AND #3 TAY DEY JSR PUTCOL LDA #88 JSR WCMD ; PLOT THE POINT JSR READY ; WAIT FOR VGP ; JINC: INC XLSB ; INC X POSITION BNE JINC2 INC XMSB JINC2: DEC VALMSB ; DEC NO. OF POINTS BNE BYTDRW ; LOOP X BYTHND: RTS ; BITDRW: LDA VALMSB ; PLOT WHILE VALMSB <> 0 BEQ BYTHND TAX LDY #0 STY VALMSB ; FOR BORROW CONDITION SEC SBC #8 ; AT LEAST 8 POINTS LEFT ? BCC BITLT8 ; IF NOT THEN JUST DO NO. IN X STA VALMSB ; PUT BACK FOR NEXT TIME LDX #8 BITLT8: JSR GTDATA ; GET DATA BYTE BITDLP: ROR A ; ROTATE DATA FROM LS BITR INTO CARRY PHA ; SAVE ROTATION TXA PHA ; SAVE X BIT TEMP1 ; IS PLOT FLAG ON ? BMI BPLTON BCC BITMVX JSR SVXCRD ; 1ST POINT OF PLOT, SAVE IN TX DEC TEMP1 ; SET PLOT FLAG BMI BITMVX ; ALWAYS BRANCH ; BPLTON: BCS BITMVX JSR BTPLOT ; PLOT BIT LINE INC TEMP1 ; RESET PLOT FLAG ; BITMVX: INC XLSB ; MOVE TO NEXT POINT BNE BXINCT INC XMSB BXINCT: PLA TAX PLA DEX ; LOOP UNTIL BIT COUNT = 0 BNE BITDLP BEQ BITDRW ; BRANCH ALWAYS ; ; ****** COMPLEX AREA FILL ******************************************* ; ; MODE 0: FILL WHILE SCREEN COLOUR = INITIAL POINT COLOUR ; MODE 1: FILL WHILE SCREEN COLOUR .NOR. COLOUR = 0 ; MODE 2: FILL WHILE SCREEN COLOUR = COLOUR ; MODE 3: FILL WHILE SCREEN COLOUR <> COLOUR ; COLOUR IS A NUMBER FROM 0 TO 7 ; TO FILL WITH DEFINED BITMAP, ADD 4 TO MODE ; RETURNS WITH POSITION SET TO POSITION ON ENTRY ; .proc cafill,2 ; ; cafill (mode,colour); ; .DEF STYLSB,STYMSB,STXLSB,STXMSB,SOXLSB,SOXMSB ; .REF CAFRSY,SAVCRD,RSXCRD,DSMATH,READY,WCMD .REF GETCOL,GSETUP,DPLOTB,COLOR .REF BITDL,BITDM,BITX,BITY,BITM .REF C3COPY,GTDATA,PLOTB,BITDLP,BITDRW,BYTDRW .REF SPLOTB,BTPLOT ; FCOLOR .EQU 2 FMODE .EQU 3 BSTAT .EQU 4 CSTAT .EQU 5 STKSIZ .EQU 255. ; pop RETURN PLA STA FCOLOR PLA PLA STA FMODE ; SAVE FOR BIT MAP TEST AND #3 ; MASK OFF UNWANTED ASL A ; SET JUMP ADDRESS FOR TESTP TAX PLA push RETURN LDA CAFTAB,X ; LSB STA JUMPL LDA CAFTAB+1,X ; MSB STA JUMPM TXA ; MODE 0 ? BEQ INTCOL LDA FCOLOR AND #7 ; MASK OFF BIT COLOR ; COLOUR VGP ? BMI STACOL AND #1 ; IF MONO THEN LS BIT ONLY BPL STACOL ; BRANCH ALWAYS ; INTCOL: JSR GSETUP ; GET SCREEN COLOUR JSR GETCOL ; STACOL: STA FCOLOR ; AND SAVE FOR TESTP LDA FMODE AND #4 ; BIT MAP FILL ? BEQ CANBIT LDA BITX ; IF SO , CHECK BIT MAP OK BEQ CAFRTS ; RETURN IF EITHER SIZE IS 0 LDA BITY BEQ CAFRTS CANBIT: JSR STACK1 ; SAVE INITIAL POSITION LDA #0FF ; INITIALISE OLD LINE STATUS STA PXNMSB ; SET INITIAL CONDS FOR PREVIOUS LINE STA PXPMSB CAFMLP: JSR TESTL ; PLOT LINES BNE CAFMLP ; LOOP WHILE STACK NOT EMPTY JMP CAFRSY ; RESTORE COLOUR REGISTERS IF BYTE MAP FILL CAFRTS: RTS ; ; "POINTS STACK" STYLSB .BLOCK STKSIZ STYMSB .BLOCK STKSIZ STXLSB .BLOCK STKSIZ STXMSB .BLOCK STKSIZ SOXLSB .BLOCK STKSIZ SOXMSB .BLOCK STKSIZ ; TESTL: JSR GSETUP JSR TESTP ; FILL ANOTHER LINES WORTH BNE DSTACK ; UNLESS ON BOUNDARY NSTACK: LDA STACKC STA STACKO ; SAVE STACK COUNTER JSR SAVCRD ; SAVE PRESENT POSITION JSR GSETUP ; PERFORM SCREEN READ TL1: JSR XDEC ; MOVE TO LEFT UNTIL BOUNDARY BCS TL2 LDA XLSB AND #7 TAY CMP #7 ; IF 7 THEN SCREEN READ JSR TESTMN BEQ TL1 TL2: JSR XINC ; BACK ONTO NON-BOUNDARY JSR SPLOTB ; SAVE POSITION FOR PLOTB JSR GSETUP ; SCREEN READ TL21: JSR XINC BCS TL3 ; MOVE RIGHT UNTIL BOUND JSR TESTPL BEQ TL21 TL3: JSR XDEC ; BACK OFF BOUND JSR CHKLIN ; CHECK LINES ABOVE AND BELOW LDA STACKC ; IS STACK FULL ? CMP #STKSIZ BCC STMPTY LDA #1 ; IF SO, FINISH STA STACKC BNE DSTACK STMPTY: JSR CHKSTK ; CHECK STACKED POINTS JSR CAPLOT ; PLOT THE LINE ; DSTACK: DEC STACKC ; PULL NEXT POINT FROM "STACK" LDX STACKC LDA STYMSB,X ; IF M.S. BIT SET, DSTACK AGAIN BMI DSTACK JSR READY LDA STXLSB,X STA XLSB STA PXNLSB LDA STXMSB,X STA PXNMSB STA XMSB LDA STYLSB,X STA YLSB LDA STYMSB,X STA YMSB LDA SOXLSB,X STA PXPLSB LDA SOXMSB,X STA PXPMSB TXA RTS ; CONSET: LDA #80 ; SET BOUNDARY STA BSTAT CONCLR: RTS ; CSTACK: JSR TESTPL ; CHECK BOUND BNE CONSET ; IF ON, SET BOUNDARY ASL BSTAT ; CHECK FOR BOUND TO NO BOUND BCC CONCLR ZSTACK: LDX STACKO ; NOW CHECK THRO' STACK FOR CONFLICTS ZSTKLP: DEX BEQ PSTACK ; STACK IF OK LDA STYMSB,X ; POINT DELETED ? BMI ZSTKLP LDA CSTAT ; GET DIRECTION EOR SOXMSB,X ; CHECK DIRECTIONS BPL ZSTKLP ; IF SAME THEN OK LDA STYLSB,X ; CHECK IF SAME Y CMP TYL BNE ZSTKLP LDA STYMSB,X CMP TYM BNE ZSTKLP ; ; Y VALUE IS THE SAME ; NOW CHECK IF WITHIN LINE LIMITS ; SEC LDA XLSB SBC STXLSB,X ; LEFT OF LINE ? LDA XMSB SBC STXMSB,X BCC ZSTKLP ; POINT OK IF LT LINE LDA SOXLSB,X SBC XLSB ; POINT TO RIGHT OF LINE ? LDA SOXMSB,X AND #0F SBC XMSB BCC ZSTKLP DONTST: RTS ; DISCARD POINT IF ALREADY PLOTTED ; STACK1: LDA #0 ; SET STACKC TO 0 TO STORE VGP POSITION STA STACKC ; ON BOTTOM OF "STACK" JSR READY ; PSTACK: LDX STACKC CPX #STKSIZ BCC PSTKOK ; IF NOT FULL , STACK LDX #1 ; FULL , LOOK THROUGH STACK PSNEXT: LDA STYMSB,X ; ANY DISCARDED POINTS ? BMI PSDUFF INX CPX #STKSIZ BCC PSNEXT RTS ; STACK FAULT PSDUFF: TXA ; YES, MAKE ROOM FOR NEW TAY PSDUF2: DEC STACKC ; ADJUST TOP OF STACK POINTER DEC STACKO INY ; GET NEXT POINT CPY #STKSIZ BCS PSTKOK ; ROOM MADE , STACK POINT LDA STYMSB,Y BMI PSDUF2 ; IF THIS POINT DISCARDED STA STYMSB,X ; ELSE MOVE POINT DETAILS LDA STYLSB,Y ; DOWN THE STACK STA STYLSB,X LDA STXMSB,Y STA STXMSB,X LDA STXLSB,Y STA STXLSB,X LDA SOXMSB,Y STA SOXMSB,X LDA SOXLSB,Y STA SOXLSB,X INX BNE PSDUF2 ; AND DO NEXT ONE ; PSTKOK: LDA XLSB STA STXLSB,X LDA XMSB STA STXMSB,X LDA YLSB STA STYLSB,X LDA YMSB STA STYMSB,X LDA DLSB STA SOXLSB,X LDA CSTAT ; GET DIRECTION ORA DMSB STA SOXMSB,X INC STACKC RTS ; ; ; THE NEXT SECTION TESTS POINTS ON THE STACK ; IF ONE DOES LIE ON THE LINE ABOUT TO BE PLOTTED ; THEN THE POINT IS REMOVED ; CHKSTK: DEC STACKO BEQ CHKDON ; TEST ALL POINTS EXCEPT INITIAL LDX STACKO LDA STYMSB,X CMP TYM ; SAME Y ? BNE CHKSTK LDA STYLSB,X CMP TYL BNE CHKSTK SEC LDA XLSB ; YES, IS IT ON LINE ? SBC STXLSB,X LDA XMSB SBC STXMSB,X BCC CHKSTK ; BRANCH IF PT RIGHT OF LINE LDA STXLSB,X SBC TXL LDA STXMSB,X SBC TXM BCC CHKSTK ; BRANCH IF PT LEFT OF LINE LDA STYMSB,X ; REMOVE PT BY SETTING MS OF Y ORA #80 STA STYMSB,X CHKDON: RTS ; ; CHKLIN LOOKS AT THE LINES ABOVE ; AND BELOW THE PRESENT LINE ; IT STACKS POINTS ON BOUNDARY ; TO NO BOUNDARY TRANSITIONS ; CMPD: SEC ; COMPARE POSITION WITH LDA DLSB ; SAVED RIGHT LIMIT SBC XLSB ; IF PAST , RETURN CC LDA DMSB SBC XMSB RTS ; CHKLIN: LDA XLSB ; SAVE X POS STA DLSB LDA XMSB STA DMSB LDA PXPMSB BPL CONDEC ; CHECK PREVIOUS LINE JSR YINC BCS CONCHK BCC NOCON ; IF BOUND THEN SKIP CONDEC: JSR YDEC BEQ NOCON2 ; IF BOUND THEN SKIP CONCHK: LDA PXPMSB EOR #80 ; INVERT DIRECTION BIT AND #80 STA CSTAT ; AND SAVE FOR CSTACK LDA #80 STA BSTAT ; SET BOUNDARY FLAG JSR RSXCRD ; SET X POS TO START JSR GSETUP ; SCREEN COLOUR READ CONL1: JSR CMPD ; CHECK FOR END BCC NOCON ; IF END THEN FINISH LDA XLSB ; LOOP WHILE POS < PREVIOUS LEFT SBC PXNLSB LDA XMSB SBC PXNMSB BCS XGEPXN JSR CSTACK ; STACK POINT IF WANTED JSR XINC BCC CONL1 ; XGEPXN: LDA PXPLSB ; SET TO RIGHT OF PREVIOUS LINE STA XLSB LDA PXPMSB STA XMSB JSR XINC ; + 1 BCS NOCON ; END IF BOUND LDA #80 STA BSTAT ; JSR GSETUP CONL2: JSR CMPD BCC NOCON ; EXIT IF END OF LINE JSR CSTACK ; STACK POINT IF WANTED JSR XINC BCC CONL2 ; NOCON: LDA PXPMSB ; NOW CHECK THE OTHER LINE BPL PROINC JSR YDEC2 BNE PROCHK BEQ XPRO PROINC: INC YLSB BNE NOCON2 INC YMSB NOCON2: JSR YINC BCC XPRO PROCHK: LDA PXPMSB AND #80 STA CSTAT ; SAVE DIRECTION LDA #80 STA BSTAT JSR RSXCRD JSR GSETUP PROL1: JSR CMPD BCC XPRO ; EXIT AT END JSR CSTACK JSR XINC BCC PROL1 XPRO: LDA TYL ; RESTORE POSITION STA YLSB LDA TYM STA YMSB LDA DLSB ; RESTORE X POS STA XLSB LDA DMSB STA XMSB RTS ; ; TESTP TESTS SCREEN COLOUR AT PRESENT POSITION ; RETURNS NE IF BOUNDARY ; TESTPL: LDA XLSB AND #7 TAY TESTMN: BNE TESTP LDA #0F JSR WCMD ; READ SCREEN COLOUR JSR READY ; WAIT FOR IT TESTP: JSR GETCOL ; GET SCREEN COLOUR JMP @JUMPL ; GO TO CAF0 - CAF3 CAFTAB: .WORD CAF0 ; MODE 0 .WORD CAF1 ; MODE 1 .WORD CAF0 ; MODE 2 .WORD CAF3 ; MODE 3 ; CAF0: CMP FCOLOR ; BOUNDARY IF SCREEN <> SAVED COLOUR RTS CAF1: AND FCOLOR ; BOUNDARY IF SCREEN .AND. COLOUR PARAMETER <> 0 RTS CAF3: CMP FCOLOR ; BOUNDARY IF SCREEN = COLOUR PARAMETER BEQ CAF30 LDA #0 ; SET EQ RTS CAF30: ROL A ; SET NE RTS ; XINC: INC XLSB ; CS IF BOUNDARY BNE XNM LDA XMSB INC XMSB EOR XMSB ; CHECK FOR BOUND CMP #3 RTS ; XDEC: LDA XLSB BNE XDEC1 DEC XLSB ; CS IF BOUNDARY LDA XMSB DEC XMSB EOR XMSB ; CHECK FOR BOUND CMP #3 RTS XDEC1: DEC XLSB XNM: CLC RTS ; YINC: LDA C3COPY ; CHECK SCREEN FORMAT ROR A ; UK / US ? BCC USTEST INC YLSB BNE YNINC INC YMSB EOR YMSB ; EOR INTERLACED BIT WITH MS POSITION ROR A ; CC IF BOUNDARY RTS ; USTEST: INC YLSB BNE TESTYU INC YMSB TESTYU: ROR A ; TEST INTERLACED BCS NOTINT LDA YMSB BEQ YNINC LDA #159. CMP YLSB RTS ; YNINC: SEC RTS ; CC IF GREATER ; NOTINT: LDA #207. CMP YLSB RTS ; CC IF GREATER ; YDEC2: JSR YDEC YDEC: LDA YLSB BNE YSDEC ORA YMSB BEQ YNDEC ; EQ IF BOUNDARY DEC YMSB YSDEC: DEC YLSB ORA #1 ; SET NE YNDEC: RTS ; ; CAPLOT FILLS FROM PRESENT POSITION TO XT,YT ; CAPLOT: LDA FMODE ; CHECK FOR BIT MAP MODE AND #4 BNE CAPBIT JMP PLOTB ; CAPBIT: JSR SPLOTB ; BIT MAP MODE INY BNE CAIXY ; INC DESTINATION INX CAIXY: STY XCLSB STX XCMSB ; AND SAVE IN XC ; LDA STXLSB ; COPY INITIAL POINT TO XT,YT FOR MATHS STA XTLSB LDA STXMSB STA XTMSB LDA STYLSB STA YTLSB LDA STYMSB STA YTMSB ; ; GET DISPLACEMENT FROM INITIAL POINT ; THEN DIVIDE THAT BY THE SIZE OF THE BIT MAP ; THE REMAINDERS WILL GIVE THE START POSITION WITHIN THE BIT MAP ; JSR DSMATH ; SETS DXC,DYC TO DISPLACEMENT FROM INITIAL DIVYLP: SEC ; DIVIDE DYC BY BITY LDA DYTLSB TAY ; REMAINDER IS IN Y SBC BITY STA DYTLSB BCS DIVYLP DEC DYTMSB BPL DIVYLP DIVXLP: SEC ; SAME FOR X LDA DXTLSB TAX ; WE ONLY NEED REMAINDER SBC BITX STA DXTLSB BCS DIVXLP DEC DXTMSB BPL DIVXLP ; ; IF DISPLACEMENT IS NEGATIVE THEN SUBTRACT ; REMAINDER FROM BIT MAP SIZE ; TYA BEQ TDIVX ; IF OFFSET 0, THEN OK LDA ACMDT ; PLOT COMMAND AND #4 ; NEQ IF Y NEGATIVE BNE TDIVX SEC LDA BITY STY TEMP2 SBC TEMP2 TAY TDIVX: TXA BEQ TDIVXN LDA ACMDT AND #2 ; NEQ IF X NEGATIVE BNE TDIVXN SEC LDA BITX STX TEMP2 SBC TEMP2 TAX ; ; REGS X,Y HOLD START PT RELATIVE TO START OF BIT MAP ; TDIVXN: STX TEMP1 ; SAVE X VALUE FOR LATER LDA BITX ; GET XSIZE OF BIT MAP STA VALMSB ; TEMP SAVE LDA BITM ; BIT MAP MODE ? ROR A BCS TDBYT ; ; BIT MODE, CALCULATE START POSITION WITHIN BYTE ; TXA AND #7 STA VALLSB ; SAVE BIT START TXA LSR A ; DIVIDE BY 8 FOR BYTE START LSR A LSR A TAX LDA BITX ; GET NO. OF BYTES PER LINE OF BIT MAP LSR A LSR A ; DIVIDE BY 8 LSR A STA VALMSB LDA BITX AND #7 ; PLUS ONE BYTE IF PART USED BEQ TDBYT INC VALMSB ; ; NOW CALCULATE START POSITION WITHIN BIT MAP DATA ; TDBYT: LDA #0 ; CLEAR TEMP2 STA TEMP2 STA TEMP2+1 TDBYLP: CLC ; TEMP2 = ((BYTES/LINE) * Y POSITION TYA BEQ TDBYEX DEY LDA TEMP2 ADC VALMSB STA TEMP2 BCC TDBYLP INC TEMP2+1 BCS TDBYLP ; TDBYEX: LDA TEMP2 ADC BITDL ; ADD IN DATA POINTER STA TEMP2 STA DLSB LDA TEMP2+1 ADC BITDM STA TEMP2+1 STA DMSB ; D = START OF LINE ADDRESS TXA ; TEMP2 = TEMP2 + X REMAINDER ADC TEMP2 STA TEMP2 BCC TDBYEN INC TEMP2+1 ; ; NOW PLOT FROM PRESENT POSITION TO XC-1,YC ; TDBYEN: LDA BITX SEC SBC TEMP1 ; GET NO. OF POINTS LEFT IN THIS LINE OF BIT MAP JSR BITVAL ; CHECK WITH NO. OF POINTS REQUIRED AND ADJUST IF NEEDED LDA BITM ; BIT OR BYTE MODE ? ROR A BCC TDDBIT ; ; BYTE MAP FILL ; TDDBYT: LDA VALMSB BEQ TDDEXT ; EXIT IF NO. OF POINTS = 0 JSR BYTDRW ; DRAW PART OF LINE JSR BITLIN ; SET UP NO. OF POINTS REQD. JMP TDDBYT ; AND SO ON... ; ; BIT MAP FILL ; TDDBIT: SEC ; SET UP FIRST CALL FOR PLOT LDA #8 SBC VALLSB ; SUB NO. OF BITS TO SKIP STA TEMP1 ; TO GET NO. OF BITS THIS BYTE TO PLOT LDA VALMSB ; LOAD MAX BITS TO PLOT TAY ; SAVE IN CASE OF BORROW SBC TEMP1 ; SUB NO. OF BITS THIS BYTE BCS BVALOK STY TEMP1 ; UPDATE NO OF BITS WANTED LDA #0 BVALOK: STA VALMSB ; UPDATE NO. OF BITS TO DO JSR GTDATA ; GET DATA BYTE LDX VALLSB ; GET NO. OF BITS TO SKIP BROTLP: DEX ; ROTATE DATA TO SKIP UNWANTED BITS BMI BROTEX LSR A BPL BROTLP ; BRANCH ALWAYS BROTEX: LDX TEMP1 ; GET NUMBER OF BITS TO PLOT 1ST TIME STY TEMP1 ; RESET PLOT FLAG JSR BITDLP ; JUMP INTO BIT DRAW ROUTINE ; TDBITL: JSR BITLIN ; LOOP UNTIL END OF PLOT LDA VALMSB ; WHEN VALMSB IS 0 BEQ TDIEXT JSR BITDRW JMP TDBITL TDIEXT: JMP BTPLOT ; CHECK PLOT FLAG, IF SET FINISH PLOT TDDEXT: RTS ; BITLIN: LDA DLSB ; INITIALISE FOR A BIT MAP LINE STA TEMP2 LDA DMSB ; RESET DATA POINTER TO START OF X LINE STA TEMP2+1 LDA BITX ; GET BIT MAP X SIZE BITVAL: STA VALMSB ; TEMP STORE JSR READY SEC LDA XCLSB ; DESTINATION + 1 SBC XLSB ; SUBTRACT FROM PRESENT POSITION TAX LDA XCMSB SBC XMSB BCS TDSOME LDX #0 ; NONE LEFT IF OVER THE END TDSOME: BNE TDALL ; PLOT FULL BIT MAP LINE IF > 255 TXA ; MAX REQUIRED CMP VALMSB ; COMPARE WITH BIT MAP SIZE BCS TDALL STA VALMSB ; ADJUST NO. OF POINTS TO PLOT TDALL: RTS ; ; PLOTB PLOTS FROM TX TO VGP X .proc zzzzz1 ; DUMMY PROCEDURE ; .DEF PLOTB,SPLOTB,DPLOTB .REF WCMD,READY,RSXCRD PLOTB: JSR SPLOTB ; SWAP TX FOR VGP X PLOTBL: SEC ; GET DISPLACEMENT LDA TXL SBC XLSB TAY ; TEMP STORE FOR < 256 LDA TXM SBC XMSB AND #0F ; VGP ONLY 12 BITS WIDE BEQ EPLOTB ; LAST PLOT IF < 256 LDY #255. JSR DPLOTB LDA #88 JSR WCMD JSR READY JMP PLOTBL EPLOTB: JSR DPLOTB JSR READY JMP RSXCRD ; RESTORE POSITION AT END ; SPLOTB: JSR READY ; SWAP TX FOR VGP X LDX XMSB LDY XLSB JSR RSXCRD ; TXL -> VGP X STY TXL ; SAVE DESTINATION STX TXM RTS ; DPLOTB: STY DELTAX ; SET X DISPLACEMENT LDA #10 ; PLOT COMMAND STA CMD ; TELL VGP TO DO IT RTS