.TITLE"VGP][ PASCAL SUPPORT 16-APR-84 AJC" ; .MACRO pop PLA STA %1 PLA STA %1+1 .ENDM .MACRO push LDA %1+1 PHA LDA %1 PHA .ENDM ; SLOT .EQU 4 ; CHANGE THIS FOR DIFFERENT SLOTS BASE .EQU SLOT*10+0C080 ; CALCULATE VGP ADDRESS FROM SOLT BASE1 .EQU SLOT*100+0C000 ; AND SPECIAL REGISTERS NOT IN VGP BASE2 .EQU BASE+10 ; FOR COLOUR EXPANDER CARD (IF FITTED) STATUS .EQU BASE ; VGP REGISTERS CMD .EQU BASE ; CMD IS WRITE ONLY CTRL1 .EQU BASE+1 ; REST OF THE REGISTERS CTRL2 .EQU BASE+2 ; CONTROL 2 REG CSIZE .EQU BASE+3 ; CHARACTER SIZE DELTAX .EQU BASE+5 ; X PROJECTION DELTAY .EQU BASE+7 ; Y PROJECTION XMSB .EQU BASE+8 ; X POSITION MSB XLSB .EQU BASE+9 ; X POSITION LSB YMSB .EQU BASE+10. ; Y POSITION MSB YLSB .EQU BASE+11. ; Y POSITION LSB CTRL3 .EQU BASE1 ; VGP][ FORMAT REGISTER CTRL4 .EQU BASE1+1 ; WRITE MODE (MONO / RED PLANE) SCROLL .EQU BASE1+2 ; SCROLL POSITION PAN .EQU BASE1+3 ; PAN POSITION COLRR .EQU BASE1+4 ; READ COLOUR (MONO / RED PLANE) COLRB .EQU BASE2 ; READ COLOUR - BLUE PLANE COLRG .EQU BASE2+1 ; READ COLOUR - GREEN PLANE COLREG .EQU BASE2+2 ; WRITE MODE - BLUE / GREEN ; ; TEMP STORAGE IN ZERO PAGE ; RETURN .EQU 0 ; STORES RETURN ADDRESS VALLSB .EQU 13. ; VARIABLE GET RETURN REGISTER LSB VALMSB .EQU 14. ; VARIABLE GET RETURN REGISTER MSB TEMP1 .EQU 15. ; TEMP STORE IN ZERO PAGE TEMP2 .EQU 16. ; SOME MORE TEMP3 .EQU 17. XTLSB .EQU 18. ; TEMP X COORD LSB XTMSB .EQU 19. ; TEMP X COORD MSB YTLSB .EQU 20. ; TEMP Y COORD LSB YTMSB .EQU 21. ; TEMP Y COORD MSB DXTLSB .EQU 22. ; TEMP DELTAX LSB DXTMSB .EQU 23. ; TEMP DELATX MSB DYTLSB .EQU 24. ; TEMP DELATY LSB DYTMSB .EQU 25. ; TEMP DELATY MSB ACMDT .EQU 26. ; CONSOLIDATED COMMAND TEMP TXL .EQU 27. TXM .EQU 28. ; FOUR BYTES FOR TYL .EQU 29. ; STORAGE OF SCREEN POSITION TYM .EQU 30. PXNLSB .EQU 31. ; PREVIOUS LINE LEFT X PT. PXNMSB .EQU 32. PXPLSB .EQU 33. ; PREVIOUS LINE RIGHT X PT PXPMSB .EQU 34. STACKO .EQU 35. ; SAVE FOR STACKC STACKC .EQU 36. ; AREA FILL STACK COUNTER JUMPL .EQU 37. ; AREA FILL JUMP JUMPM .EQU 38. DLSB .EQU 39. ; CIRCLE ERROR TERM DMSB .EQU 40. XCLSB .EQU 41. ; CIRCLE CENTRE XCMSB .EQU 42. YCLSB .EQU 43. YCMSB .EQU 44. DXCLSB .EQU 45. ; CIRCLE WORKING STORES DXCMSB .EQU 46. DYCLSB .EQU 47. DYCMSB .EQU 48. TXCLSB .EQU 49. ; CIRCLE TEMP STORES TXCMSB .EQU 50. TYCLSB .EQU 51. TYCMSB .EQU 52. ; .proc zzzzz0 ; DUMMY PROCEDURE TO HOLD PRIVATE VARIABLES + GENERAL ROUTINES ; .DEF BITDL,BITDM,BITX,BITY,BITM .DEF C3COPY,C4COPY,COLCOP,COLOR .DEF WCMD,READY,WCTRL1,RESCOL .DEF SAVVGP,SAVCRD,SVXCRD,RESVGP,RESCRD,RSXCRD ; BITDL .BYTE 0 ; BIT MAP PERMANENT STORAGE BITDM .BYTE 0 BITX .BYTE 0 BITY .BYTE 0 BITM .BYTE 0 C3COPY .BYTE 0 ; VGP STATUS PERMANENT STORAGE C4COPY .BYTE 0 COLCOP .BYTE 0 COLOR .BYTE 0 ; ; RESET COLOUR ROUTINE RESCOL: JSR READY LDA C4COPY ; GET RED PLANE COPY STA CTRL4 ; RESTORE VGP REGISTER BIT COLOR ; MONO / COLOUR ? BPL RESDON LDA COLCOP ; RESTORE BLUE & GREEN PLANES IF COLOUR STA COLREG RESDON: RTS ; ; WRITE COMMAND ROUTINE, CHECKS STATUS WCMD JSR READY STA CMD ; CHECK STATUS AND WRITE COMMAND RTS ; THE JOB IS COMPLETE ; WCTRL1: JSR READY ; WAIT FOR COMPLETION STA CTRL1 ; AND PUT BACK INTO REGISTER RTS ; DONE IT ; ; READY ROUTINE DOES STATUS CHECK READY PHA ; SAVE WORK REGISTER RWAIT LDA STATUS ; READ STATUS AND #04 ; MASK READY BIT BEQ RWAIT ; NOT DONE, LOOP PLA ; GET VALUE BACK TO A RTS ; AND CONTINUE ; RESCRD: LDA TYL ; RESTORE SCREEN POSITION STA YLSB LDA TYM STA YMSB RSXCRD: LDA TXL ; RESTORE X CO-ORD STA XLSB ; WRITE BACK TO VGP LDA TXM STA XMSB ; FOR ALL REGISTERS RTS ; DONE IT ; RESVGP: LDX #2 ; RESTORE VGP STATUS RESVLP: LDA TEMP1,X STA CTRL1,X DEX BPL RESVLP RTS ; SAVVGP: LDX #2 ; SAVE VGP STATUS SAVLP: LDA CTRL1,X STA TEMP1,X DEX BPL SAVLP ; SAVCRD LDA YLSB ; SAVE SCREEN POSITION STA TYL ; AND SAVE LDA YMSB ; FOR ALL REGISTERS STA TYM SVXCRD: LDA XLSB STA TXL LDA XMSB STA TXM RTS ; DONE IT ; ; INITIALISE VGP .proc init ; .REF C4COPY,COLCOP,RESCOL,C3COPY,READY LDA #88 ; CLEAR BORDER STA C4COPY STA COLCOP JSR RESCOL ; RESET COLOUR LDA #0 STA PAN STA SCROLL LDA C3COPY AND #3 STA C3COPY LDA #1 ; UK , INTERLACED FOR CLEAR STA CTRL3 ASL A ; A=2 STA XMSB ; SET WRITE TO PAGE 2 ASL A ; A=4 FOR CLEAR SCREEN STA CMD ; CLEAR PAGE 2 JSR READY LDA #0 STA XMSB LDA #7 STA CMD ; CLEAR PAGE 1, VGP REGS JSR READY LDA C3COPY STA CTRL3 ; RESTORE FORMAT LDA #3 STA CTRL1 ; PEN ON, PEN DOWN RTS ; ; ****** PRIMITIVE OPERATIONS **************************************** ; .proc down ; .REF WCMD LDA #02 ; SELECT DOWN COMMAND JMP WCMD ; AND WRITE IT ; .proc up ; .REF WCMD LDA #03 ; SELECT PEN UP COMMAND JMP WCMD ; AND WRITE IT ; ; .proc pen ; .REF WCMD LDA #00 ; SELECT PEN COMMAND JMP WCMD ; AND WRITE IT ; .proc eraser ; .REF WCMD LDA #01 ; SELECT ERASER JMP WCMD ; AND WRITE IT ; .proc home ; .REF WCMD LDA #05 ; X=0,Y=0 JMP WCMD ; ; SELECT HIGH SPEED WRITE .proc high ; .REF WCTRL1 LDA CTRL1 AND #0F ORA #4 ; SET HIGH SPEED BIT JMP WCTRL1 ; ; SELECT NORMAL SPEED WRITE .proc low ; .REF WCTRL1 LDA CTRL1 AND #0B ; RESET HIGH SPEED BIT JMP WCTRL1 ; ; SELECT CYCLIC SCREEN MODE .proc cyclic ; .REF WCTRL1 LDA CTRL1 ; GET EXISTING VALUE AND #0F ; MASK OFF BOTTOM BITS ORA #08 ; AND SET CYCLIC BIT JMP WCTRL1 ; AND WRITE BACK ; ; SELECT CLIPING MODE .proc clip ; .REF WCTRL1 LDA CTRL1 ; READ EXISTING VALUE AND #07 ; CLEAR THE BIT JMP WCTRL1 ; AND WRITE BACK ; ; ****** SCREEN OPERATIONS ******************************************* ; ; CLEAR CURRENT SCREEN .proc clear ; .REF WCMD,C4COPY,COLCOP,COLOR,SCREEN,PEN LDA C4COPY ; CHECK FOR BAD WRITE MODES AND #5 BNE LONGC BIT COLOR BPL CLEAR0 LDA COLCOP AND #55 BEQ CLEAR0 LONGC LDY #1 ; IF BAD WRITE MODE, CLEAR SCREEN BY PIXEL LDA #0 JSR SCREEN JMP PEN CLEAR0 LDA #4 JSR WCMD ;THEN MAKE SURE PEN IS SELECTED JMP PEN ; ; FILL THE SCREEN IN THE CURRENT WRITE MODE .proc fill ; .REF SCREEN LDY #0 LDA #2 JMP SCREEN ; ; INVERT THE STATE OF EACH PIXEL ON THE SCREEN BY INVERTING BLOCKS ; ROUTINE HONOURS PROTECTED PLANES IN COLOUR MODES .proc invert_screen ; .REF C3COPY,SETRMW,READY,SAVVGP,RESPOS,RESVGP,RESCRD,RESCOL .DEF SCREEN JSR READY JSR SETRMW ; SET INVERT LDY #0 LDA #3 ; PEN ON AND DOWN ; SCREEN: PHA JSR SAVVGP ; SAVE POSITION,CTRL1,CTRL2,CSIZE PLA ; SET PEN/ERASER ORA CTRL1 DEY ; IF Y 1 THEN SET ERASER BNE SCRN2 AND #0FD SCRN2: STA CTRL1 LDA #00 ; NOW SET TO WHAT WE WANT STA CTRL2 ; MODE ETC LDA XMSB ; SAVE PAGE TO WRITE AND #2 STA XTMSB LDA #3 AND C3COPY ; GET SCREEN SIZE TAX LDY LOOPCT,X ; SET LOOP COUNT LDA #0D ; RESET X POSITION STA CMD ; WRITE COMMAND LDA LASTSZ,X ; GET 1ST SIZE INLOP JSR READY ; WAIT FOR VGP STA CSIZE ; SET BLOCK SIZE LDA ILSBT,Y ; GET LSB ADDRESS STA YLSB ; WRITE IT LDA IMSBT,Y ; GET MSB STA YMSB ; WRITE TO VGP LDA XTMSB ; SET PAGE TO WRITE STA XMSB LDX #8 ; COUNT BLOCKS PER LINE LDA #0B ; SET BLOCK DRAW CMD ; INLOP1 JSR READY ; WAIT FOR VGP STA CMD ; AND INVERT BLOCK DEX ; COUNT BNE INLOP1 ; 8 BLOCKS PER LINE TXA DEY ; 8LINES PER SCREEN BPL INLOP ; AND LOOP JSR RESCOL ; RESTORE COLOUR REGISTERS JSR RESVGP ; RESTORE CTRL1,CTRL2,CSIZE JMP RESCRD ; ; SCREEN ADDRESS TABLES FOR FILL ; ILSBT .BYTE 00,40,80,0C0,00,40,80,0C0 IMSBT .BYTE 00,00,00,00,01,01,01,01 LOOPCT: .BYTE 6 ; USA INTERLACED .BYTE 7 ; UK INTERLACED .BYTE 3 ; USA NON-INTERLACED .BYTE 3 ; UK NON-INTERLACED ; LASTSZ: .BYTE 8 .BYTE 0 .BYTE 4 .BYTE 0 ; ; ****** TEXT OPERATIONS ********************************************* ; ; SELECT TEXT TYPE, SIZE ETC .proc text,4 ; text(type,orient,xs,ys :integer); ; .REF READY pop RETURN PLA AND #0F ; AND MASK RELEVANT BITS STA TEMP1 ; AND SAVE PLA PLA ASL A ; SHIFT TO MS NIBBLE ASL A ASL A ASL A ORA TEMP1 ; OR IN PREVIOUS VALUE JSR READY STA CSIZE ; WRITE TO CHARACTER SIZE REGISTER PLA PLA AND #01 ; MASK OFF 0 OR 1 ONLY ASL A ; MOVE TO RIGHT BIT POSITION ASL A ASL A STA TEMP1 ; SAVE IN TEMP STORAGE PLA PLA ; AND GET ORIENT AND #01 ; AND MASK 0 OR 1 ONLY ASL A ; SHIFT TO RIGHT POSITION ASL A ORA TEMP1 ; OR IN PREVIOUS BIT STA TEMP1 ; AND SAVE AGAIN LDA CTRL2 ; GET REGISTER AND #0F3 ; MASK BITS FROM REGISTER ORA TEMP1 ; SET NEW BITS STA CTRL2 ; AND WRITE BACK PLA push RETURN RTS ; DONE IT ; ; DRAW A 4*4 BLOCK SCALED BY THE CHARACTER SIZE & STYLE .proc block4 ; .REF WCMD LDA #0B JMP WCMD ; ; DRAW A 5*8 BLOCK SCALED BY THE CHARACTER SIZE & STYLE .proc block5 ; .REF WCMD LDA #0A JMP WCMD ; ; PRINT A CHARACTER STRING IN THE SPECIFIED STYLE .proc vprint,1 ; vprint(var text :string); ; .REF WCMD pop RETURN pop TEMP2 ; GET ADDRESS OF STRING push RETURN LDY #0 LDA @TEMP2,Y STA TEMP1 ; SAVE STRING LENGTH ; PLOOP CPY TEMP1 ; END OF STRING ? BEQ PDONE INY LDA @TEMP2,Y ; GET CHARACTER JSR WCMD ; CHECK STATUS & WRITE CHARACTER JMP PLOOP ; AND DO THE REST PDONE RTS ; DONE IT ; ; ****** ROUTINES WHICH RETURN VALUE(S) ****************************** ; ; FIND OUT THE CURRENT SCREEN POSITION .proc where,2 ; where(var x,y :integer) ; WHEREX .EQU 2 WHEREY .EQU 4 .REF READY pop RETURN pop WHEREY ; GET ADDRESS OF Y STORE pop WHEREX ; AND OF X STORE push RETURN JSR READY LDY #0 LDA XLSB ; GET LSB OF X POSITION STA @WHEREX,Y LDA YLSB ; GET LSB OF Y STA @WHEREY,Y INY LDA XMSB ; GET MSB OF X STA @WHEREX,Y LDA YMSB ; GET MSB OF Y STA @WHEREY,Y RTS ; ; RETURN THE COLOUR OF THE CURRENT POINT .proc test,1 ; test(var colour :integer); ; TESTV .EQU 2 .REF WCMD,READY,COLOR .DEF GSETUP,GETCOL pop RETURN pop TESTV ; GET POINTER TO STORE COLOUR push RETURN JSR READY JSR GSETUP ; READ COLOUR FROM SCREEN JSR GETCOL ; GET COLOUR INTO ACC LDY #0 ; WRITE LSB STA @TESTV,Y ; AND WRITE TO INTEGER TYA INY STA @TESTV,Y ; CLEAR MSB RTS ; GSETUP: LDA XLSB ; GET MASK AND #7 TAY ; Y IS SUBSCRIPT INTO MASK ARRAY LDA #0F ; DIRECT IMAGE ACCESS REQUEST JSR WCMD ; SEND THE COMMAND JMP READY ; WAIT UNTIL COMPLETED ; CMASK .BYTE 1,2,4,8,10,20,40,80 ; GETCOL: BIT COLOR ; COLOUR ? BPL GTMONO LDA COLRB ; LOAD BLUE COLOUR AND CMASK,Y CMP #1 ; CS IF Z ROL TEMP1 ; SAVE BLUE STATE LDA COLRG ; LOAD GREEN AND CMASK,Y CMP #1 ROL TEMP1 LDA COLRR ; LOAD RED AND CMASK,Y CMP #1 LDA TEMP1 ROL A AND #7 RTS GTMONO: LDA COLRR ; LOAD COLOUR AND CMASK,Y ; MASK OFF UNWANTED BEQ XGTM ; IF Z THEN COLOUR = 0 LDA #1 ; ELSE COLOUR = 1 XGTM: RTS ; ; ****** PAGE & WRITE MODE (COLOUR) SETTING ************************** ; ; SELECT PAGE TO DISPLAY .proc pagdis,1 ; PARAMETER 0:DISPLAY PAGE 0, 1:PAGE 1 ; .REF HGRSET pop RETURN PLA AND #1 TAX PLA push RETURN JMP HGRSET ; ; SELECT PAGE 1 .proc page1 ; .REF HGRSET LDX #0 JMP HGRSET ; ; SELECT PAGE 2 .proc page2 ; .DEF HGRSET .REF C3COPY,READY LDX #1 HGRSET: LDA C3COPY ; GET REGISTER COPY AND #1F DEX BNE HGRSAV ORA #20 HGRSAV: STA C3COPY ; UPDATE COPY JSR READY STA CTRL3 ; UPDATE REGISTER RTS ; ; SELECT INVERSE MODE .proc inverse ; .REF WINVER LDA #44 ; SET ALLINVERTED JMP WINVER ; UPDATE INVER ; ; SELECT NORMAL MODE .proc normal ; .DEF WINVER .REF COLOR,COLCOP,C4COPY,READY LDA #00 ; RESET COLOUR WINVER: STA TEMP1 ; SAVE LDA C4COPY AND #18 ORA TEMP1 STA C4COPY JSR READY STA CTRL4 ; WRITE NEW COLOUR BIT COLOR BPL XNORM LDA COLCOP ; IF COLOUR THEN AND #88 ; CHANGE ALSO ORA TEMP1 STA COLCOP STA COLREG XNORM: RTS ; ; SET WRITE PROTECT COLOUR .proc protect,1 ; .REF PUTW LDY #0 JMP PUTW ; ; SET INVERTING COLOUR .proc invert,1 ; .REF PUTW LDY #1 JMP PUTW ; ; SET ABSOLUTE COLOUR .proc colour,1 ; .DEF PUTW,PUTCOL .REF READY,C4COPY,COLCOP,COLOR LDY #2 PUTW: pop RETURN PLA STA TEMP1 PLA push RETURN PUTW2: JSR READY JSR PUTCOL ; SET REGISTERS STA C4COPY ; SET COPY BIT COLOR ; COLOUR MODE ? BPL XPUTWD STY COLCOP ; SAVE COLOUR COPY XPUTWD: RTS ; ; PUTCOL - SET WRITE MODE / COLOUR ; LSCON: .BYTE 1,4,2 MSCON: .BYTE 10,40,20 ; ;COLOUR IN TEMP1, MODE IN Y ; PUTCOL: LDA C4COPY AND #18 ROR TEMP1 BCC PDATA1 ORA LSCON,Y ; THEN OTHER MODE PDATA1: STA CTRL4 ; SET REGISTER BIT COLOR BPL XPUT ; THATS IT IF MONOCHROME PHA ; SAVE NEW SETTING LDA COLCOP AND #88 ROR TEMP1 BCC PDATA2 AND #88 ORA LSCON,Y PDATA2: ROR TEMP1 BCC PDATA3 ORA MSCON,Y PDATA3: STA COLREG ; SET REGISTER TAY ; SAVE SETTING IN Y PLA ; RESTORE CTRL4 COPY XPUT: RTS ; ;CTRL4 COPY RETURNED IN A, ;COLREG COPY IN Y ; ; ****** EXTRA ROUTINES FOR VGP][ ************************************ ; ; SET A WRITE MODE IN A GIVEN WRITE PLANE .proc mode,2 ; mode(write_mode,plane :integer); ; WRITE_MODE IS NO. FROM 0-7 ; PLANE 0:RED, 1:GREEN, 2:BLUE ; .REF READY,C4COPY,COLCOP,COLOR pop RETURN JSR READY PLA TAY ; GET PLANE NO. PLA PLA AND #7 STA TEMP1 ; GET WRITE_MODE PLA push RETURN BIT COLOR ; COLOUR FITTED ? BPL RPLANE ; IF NOT, DO RED PLANE TYA BNE CPLANE RPLANE: LDA C4COPY ; DO RED PLANE AND #18 ORA TEMP1 STA C4COPY STA CTRL4 RTS CPLANE: AND #2 BNE BPLANE LDA COLCOP ; DO GREEN PLANE AND #0F8 JMP MSTORE BPLANE: LDA TEMP1 ; DO BLUE PLANE ASL A ASL A ASL A ASL A STA TEMP1 LDA COLCOP AND #8F MSTORE: ORA TEMP1 STA COLCOP STA COLREG RTS ; ; SELECT POSITION OF VIDEO SWITCH .proc video,1 ; PARAMETER 0:APPLE VIDEO, 1:VGP VIDEO .DEF RVIDEO .REF C3COPY,READY pop RETURN PLA ROL A ROL A AND #4 STA TEMP1 LDA C3COPY AND #0FB ; MASK OUT VIDEO BIT ORA TEMP1 ; ADD NEW VIDEO BIT RVIDEO: JSR READY STA C3COPY STA CTRL3 PLA push RETURN RTS ; ; SELECT INTERLACED OR NON-INTERLACED OPERATION .proc interlace,1 ; PARAMETER 0:NON-INTERLACED, 1:INTERLACED ; .REF RVIDEO,C3COPY pop RETURN PLA ROL A AND #2 STA TEMP1 LDA C3COPY ORA #2 EOR TEMP1 ; SET INTERLACE BIT JMP RVIDEO ; ; SUBPAG - SELECT SUBPAGE USE IN NON-INTERLACED MODE .proc subpg,1 ; PARAMETER 0:SUBPAGE 0, 1:SUBPAGE 1 ; .REF RVIDEO,C3COPY pop RETURN PLA ROL A ROL A ROL A ROL A AND #10 STA TEMP1 LDA C3COPY AND #2F ; MASK OUT OLD SUBPAGE ORA TEMP1 ; OR IN NEW SUBPAGE JMP RVIDEO ; ; BORDER - SET BORDER COLOUR .proc border,1 ; MONOCHROME: PARAMETER 0:WHITE, 1:BLACK ; COLOUR: PARAMETER 0:WHITE, 3:BLUE, 5:GREEN, 6:RED, 7:BLACK ; .REF C4COPY,COLCOP,COLOR,READY pop RETURN PLA STA TEMP1 PLA push RETURN LDA C4COPY ; GET SAVED COPY AND #17 ; MASK OUT BORDER ROR TEMP1 BCC BOR1 ORA #8 ; OR IN BLACK BOR1: STA C4COPY ; SET NEW BORDER JSR READY STA CTRL4 BIT COLOR ; COLOUR ? BPL XBOR ; EXIT IF NOT LDA TEMP1 AND #3 TAY LDA COLCOP AND #77 ; MASK OUT OLD BORDER ORA BORMSK,Y ; OR IN NEW VALUE STA COLCOP STA COLREG ; SET COLOUR BORDER XBOR: RTS ; BORMSK: .BYTE 0,8,80,88 ; ; SET PAN POSITION .proc xoffset,1 ; PARAMETER VALUE 0-63 ; .REF READY pop RETURN JSR READY BLNKX: LDA STATUS ; WAIT FOR BLANKING AND #2 BEQ BLNKX PLA AND #3F STA PAN ; SAVE IN PAN REGISTER PLA push RETURN RTS ; ; SET SCROLL POSITION .proc yoffset,1 ; PARAMETER VALUE 0-63 ; .REF READY pop RETURN JSR READY BLNKX: LDA STATUS ; WAIT FOR BLANKING AND #2 BEQ BLNKX PLA AND #3F STA SCROLL ; SAVE IN SCROLL REGISTER PLA push RETURN RTS ; ; SELECT DISPLAY FORMAT + COLOUR OPERATION .proc format,1 ; PARAMETER BIT | ON/OFF ; 0 UK MODE / US MODE ; 1 NON-INTERLACED / INTERLACED ; 2 COLOUR / MONOCHROME ; .REF init,READY,C3COPY,COLOR pop RETURN JSR READY PLA TAX ROR A ROR A ROR A ; ROTATE COLOUR BIT INTO CARRY ROR COLOR ; AND INTO COLOUR STATUS BYTE TXA AND #3 ; MASK OFF FOR DISPLAY FORMAT BITS STA TEMP1 PLA push RETURN LDA C3COPY ; PRESENT FORMAT AND #3C ; MASK OFF ORA TEMP1 STA CTRL3 ; SET NEW FORMAT STA C3COPY RTS ; .INCLUDE #5:VGP2.B.TEXT .INCLUDE #5:VGP2.C.TEXT .INCLUDE #5:VGP2.D.TEXT .end