;GRAFOS By: Foster Hall include "startup.asm" ;Program Equates. These are defined here rather than in an Include File. This ;makes assembly faster. ;MENU EQUATES* MENUPICK EQU $00000100 ITEMTEXT EQU 2 ITEMENABLED EQU $10 HIGHCOMP EQU $40 HIGHBOX EQU $80 COMMSEQ EQU $4 MENUNULL EQU $0000FFFF mi_SIZEOF EQU $22 Menu1Left EQU 1 Menu1Width EQU 9*8 ItemFlags EQU ITEMTEXT CItemFlags EQU ITEMTEXT!ITEMENABLED!HIGHCOMP MenuOn EQU $0001 JAM1 EQU 0 ;WINDOW EQUATES* wd_UserPort EQU $56 im_class EQU 20 im_Code EQU $18 im_address EQU $1C im_IDCMPWindow EQU $2c wd_RPort EQU 50 wd_MouseY EQU $c wd_MouseX EQU $e wd_MenuStrip EQU $1c wd_IDCMP EQU $52 ACTIVATE EQU $1000 CLOSEWINDOW EQU $0200 MOUSEBUTTONS EQU $8 WINDOWCLOSE EQU $8 WINDOWDEPTH EQU $4 WINDOWSIZING EQU 1 BORDERLESS EQU $0800 WBENCHSCREEN EQU $0001 SYSBASE EQU $4 this is the same as _AbsExecBase MODE_OLDFILE equ $3ed ;library offsets. This replaces the necessity to get the offsets from ;AMIGA-LIB, thus the program assembles faster. It still has to be ;linked though. _AbsExecBase equ $4 GetPrefs EQU $ffffff7c SetPrefs EQU $fffffebc FindTask equ $fffffeda DrawEllipse EQU $ffffff4c OpenLibrary EQU $fffffdd8 OpenWindow EQU $ffffff34 Open equ $ffffffe2 CloseWindow EQU $ffffffb8 CloseLibrary EQU $fffffe62 Move EQU $ffffff10 Draw EQU $ffffff0a SetAPen EQU $fffffeaa SetDrMd EQU $fffffe9e ScrollRaster EQU $fffffe74 Text EQU $ffffffc4 SetMenuStrip EQU $fffffef8 ClearMenuStrip EQU $ffffffca GetMsg EQU $fffffe8c WaitPort equ $fffffe80 ReplyMsg EQU $fffffe86 ItemAddress EQU $ffffff70 ;this macro adds the "(A6)" to the end of all library calls SYS: MACRO JSR \1(A6) ENDM ;THE FOLLOWING MACROS ARE FOR THE MENU STRIP IntuiText MACRO DC.B \1 FrontPen DC.B \2 BackPen DC.B \3 DrawMode DC.B 0 KlugeFill00 DC.W \4 Leftedge DC.W \5 TopEdge DC.L \6 FontStuff DC.L \7 YourText DC.L \8 NextText ENDM Menu MACRO DC.L \1 mu_NextMenu DC.W \2 mu_LeftEdge DC.W \3 mu_TopEdge DC.W \4 mu_Width DC.W \5 mu_Height DC.W \6 mu_Flags DC.L \7 mu_MenuName DC.L \8 mu_FirstItem DC.W 0,0,0,0 ENDM MenuItem MACRO DC.L \1 mi_NextItem DC.W \2 mi_LeftEdge DC.W \3 mi_TopEdge DC.W \4 mi_Width DC.W \5 mi_Height DC.W \6 mi_Flags DC.L \7 mi_MutualExclude DC.L \8 mi_ItemFill DC.L \9 mi_SelectFill ENDM MenuItem2 MACRO DC.B \1 mi_Command DC.B 0 Kluge DC.L \2 mi_SubItem DC.W \3 mi_NextSelect ENDM ;LET'S GO THEN! MAIN MOVE.L SP,SAVESP SAVE THE STACK POINTER FIRST THING OPENINTUITION MOVE.L SYSBASE,A6 GET EXEC POINTER MOVE.L #INTUITIONNAME,A1 GET NAME ADDRESS MOVE.L #0,D0 LIBRARY VERSION (0=DON'T CARE) SYS OpenLibrary OPEN LIBRARY MOVE.L D0,INTUITIONBASE STORE LIBRARY POINTER BEQ ENDWINDOW BRA.S DONEINT INTUITIONNAME DC.B 'intuition.library',0 INTUITIONBASE DS.L 1 DONEINT OPENGRAPHICS MOVE.L SYSBASE,A6 GET EXEC BASE MOVE.L #GFXNAME,A1 GET ADDRESS BASE FOR NAME MOVE.L #0,D0 VERSION SYS OpenLibrary OPEN LIBRARY MOVE.L D0,GFXBASE STORE POINTER BEQ ENDWINDOW BRA.S DONEGFX GFXNAME DC.B 'graphics.library',0 GFXBASE DS.L 1 DONEGFX OPENWINDOW MOVE.L INTUITIONBASE,A6 MOVE.L #MYWINDOW,A0 SYS OpenWindow MOVE.L D0,WINDOWPOINTER BEQ ENDWINDOW MOVE.L D0,A0 MOVE.L wd_RPort(a0),RASTERPORT GET THE RASTERPORT ADDRESS MOVE.L wd_UserPort(a0),USERPORT SETSTRIP MOVE.L WINDOWPOINTER,A0 MOVE.L #MENUSTRIP,A1 MOVE.L INTUITIONBASE,A6 SYS SetMenuStrip BRA.S TEXTPRINT ;THIS IS THE TEXT PRINT ROUTINE FOR THE OPENING PAGE* PRINT BSR.S SETDRMD PRINT2 BSR.S SETAPEN PRINT3 BSR.S MOVE BSR.S TEXT RTS SETDRMD BSR.S GA6RPA1 MOVE DRAWMODE,d0 SYS SetDrMd RTS SETAPEN BSR.S GA6RPA1 MOVE PENCOLOR,D0 SYS SetAPen RTS TEXT BSR.S GA6RPA1 MOVE.L TEXTPOINTER,A0 MOVE NUMCHARS,D0 SYS Text RTS MOVE BSR.S GA6RPA1 MOVE XPOSITION,D0 MOVE YPOSITION,D1 SYS Move RTS DRAW BSR.S GA6RPA1 SYS Draw RTS GA6RPA1 MOVE.L GFXBASE,A6 MOVE.L RASTERPORT,A1 RTS ;THIS ROUTINE POSITIONS THE LINE OF TEXT ON THE SCREEN AND THEN CALLS* ;THE ABOVE PRINT ROUTINE. * TEXTPRINT MOVE #0,DRAWMODE MOVE #2,PENCOLOR MOVE #276,XPOSITION MOVE #20,YPOSITION MOVE.L #DATA1,TEXTPOINTER MOVE #ENDDATA1-DATA1,NUMCHARS BSR PRINT MOVE #266,XPOSITION MOVE #30,YPOSITION MOVE.L #DATA2,TEXTPOINTER MOVE #ENDDATA2-DATA2,NUMCHARS BSR PRINT3 DRAWN ADDI #1,YPOSITION ADDI #1,PENCOLOR CMPI #42,YPOSITION BEQ.S MOVEIT BSR PRINT2 BRA.S DRAWN MOVEIT MOVE #2,PENCOLOR MOVE #260,XPOSITION MOVE #50,YPOSITION MOVE.L #DATA3,TEXTPOINTER MOVE #ENDDATA3-DATA3,NUMCHARS BSR PRINT2 MOVE #2,PENCOLOR MOVE #260,XPOSITION MOVE #60,YPOSITION MOVE.L #DATA3A,TEXTPOINTER MOVE #ENDDATA3A-DATA3A,NUMCHARS BSR PRINT2 MOVE #2,PENCOLOR MOVE #236,XPOSITION MOVE #70,YPOSITION MOVE.L #DATA3B,TEXTPOINTER MOVE #ENDDATA3B-DATA3B,NUMCHARS BSR PRINT2 MOVE #184,XPOSITION MOVE #80,YPOSITION MOVE.L #DATA4,TEXTPOINTER MOVE #ENDDATA4-DATA4,NUMCHARS BSR PRINT3 MOVE #112,XPOSITION MOVE #90,YPOSITION MOVE.L #DATA5,TEXTPOINTER MOVE #ENDDATA5-DATA5,NUMCHARS BSR PRINT3 MOVE #124,XPOSITION MOVE #100,YPOSITION MOVE.L #DATA6,TEXTPOINTER MOVE #ENDDATA6-DATA6,NUMCHARS BSR PRINT3 MOVE #120,XPOSITION MOVE #110,YPOSITION MOVE.L #DATA7,TEXTPOINTER MOVE #ENDDATA7-DATA7,NUMCHARS BSR PRINT3 MOVE #124,XPOSITION MOVE #120,YPOSITION MOVE.L #DATA8,TEXTPOINTER MOVE #ENDDATA8-DATA8,NUMCHARS BSR PRINT3 MOVE #161,BASEX MOVE #160,BASEY MOVE #160,BASEY1 MOVE #0,COUNT ;THIS ROUTINE DRAWS THE CIRCLE GRAPHICS ON THE TITLE SCREEN* BRA.S YPOSIT BLURB BSR GA6RPA1 MOVE BASEX,D0 MOVE #13,D2 MOVE #08,D3 JSR DrawEllipse(a6) ADDI #2,BASEX CMPI #479,BASEX BGT.S TITLESCREEN RTS YPOSIT CMPI #0,COUNT BNE.S UPIT SUBI #1,BASEY MOVE BASEY,D1 BSR.S BLURB ADDI #1,BASEY1 MOVE BASEY1,D1 BSR.S BLURB CMPI #150,BASEY BGT.S YPOSIT MOVE #1,COUNT BRA.S YPOSIT UPIT ADDI #1,BASEY MOVE BASEY,D1 BSR.S BLURB SUBI #1,BASEY1 MOVE BASEY1,D1 BSR BLURB CMPI #180,BASEY BLT.S YPOSIT MOVE #0,COUNT BRA YPOSIT ;THIS CHECKS THE POSITION OF THE MOUSE FOR EACH CORNER TO DETERMINE THE* ;CORRECT ACTION TO PERFORM * TITLESCREEN BSR.S MOUSER BRA.S TITLESCREEN MOUSER BSR.S GRAFOSCOLOR MOUSER2 MOVE.L SYSBASE,A6 MOVE.L USERPORT,A0 SYS GetMsg TST.L D0 BEQ RETURN MOVE.L D0,A0 MOVE.L im_class(a0),IMCLASS CMPI.L #MENUPICK,IMCLASS BNE RETURN MOVE.W im_Code(a0),IMCODE MENUPICKED MOVE.W IMCODE,d0 MOVEA.L #MENUSTRIP,a0 MOVE.L INTUITIONBASE,A6 SYS ItemAddress TST.L D0 BEQ RETURN MOVEA.L D0,A0 MOVE.L #34,D0 MOVEA.L 0(A0,D0),A1 JMP (A1) RESTART BSR.S SCROLL JMP TEXTPRINT CLEAR BSR.S SCROLL CLEARLOOP BSR.S MOUSER2 BRA.S CLEARLOOP GRAFOSCOLOR ADDI #1,PENCOLOR MOVE #294,XPOSITION MOVE #163,YPOSITION MOVE.L #DATA2,TEXTPOINTER MOVE #ENDDATA2-DATA2-8,NUMCHARS BSR PRINT2 RTS ;THIS IS THE SCREEN SCROLL ROUTINE THAT ACTUALLY MOVES EACH SCREEN* SCROLL CLR.l COUNT SCROLLUP BSR GA6RPA1 MOVE #0,D0 MOVE #5,D1 MOVE #0,D2 MOVE #0,D3 MOVE #640,D4 MOVE #200,D5 SYS ScrollRaster ADDI #5,COUNT CMPI #200,COUNT BLT.S SCROLLUP CLR.l COUNT RTS ;THE FOLLOWING ROUTINES DOES THE ACTUAL DRAW ROUTINE FOR THE SPIRALS* DRAWLINE BSR.S SCROLL MOVE #320,XPOSITION MOVE #100,YPOSITION BSR MOVE SPIRAL MOVEM BASEX,XPOSITION MOVEM BASEY,YPOSITION BSR MOVE CIRCLE MOVE DRAWX,D0 MOVE DRAWY,D1 BSR DRAW CMPI #0,COUNT BEQ.S STAGE1 CMPI #1,COUNT BEQ.S STAGE2 CMPI #2,COUNT BEQ.S STAGE3 CMPI #3,COUNT BEQ.S STAGE4 BRA LOOP STAGE1 ADDI #8,DRAWY CMPI #200,DRAWY BLT LOOP ADDI #1,COUNT MOVE #200,DRAWY STAGE2 ADDI #16,DRAWX CMPI #640,DRAWX BLT LOOP ADDI #1,COUNT MOVE #640,DRAWX STAGE3 SUBI #8,DRAWY CMPI #0,DRAWY BGT.S LOOP ADDI #1,COUNT MOVE #0,DRAWY STAGE4 SUBI #16,DRAWX CMPI #0,DRAWX BGT.S LOOP CLR DRAWY CLR DRAWX CLR COUNT MOUSEPOINT MOVE.L WINDOWPOINTER,A0 MOVEM wd_MouseX(A0),BASEX MOVEM wd_MouseY(A0),BASEY TEST MOVE.L WINDOWPOINTER,A0 MOVE wd_MouseX(A0),D0 CMP BASEX,D0 BNE.S COLOR MOVE wd_MouseY(A0),D0 CMP BASEY,D0 BNE.S COLOR BSR MOUSER2 BRA.S TEST COLOR ADDI #1,PENCOLOR BSR SETAPEN LOOP BRA SPIRAL ;THIS IS THE CIRCLE DRAW ROUTINE* SMALLELLIPSE MOVE.W #25,DRAWX MOVE.W #17,DRAWY BRA.S ELLIPSE LARGEELLIPSE MOVE.W #50,DRAWX MOVE.W #40,DRAWY ELLIPSE BSR SCROLL MOVE #2,PENCOLOR BSR.S DOPEN MOVE #320,D0 MOVE #100,D1 BSR MOVE DRAW2 BSR.S DOCIRCLES BSR MOUSER2 BRA.S DRAW2 DOPEN BSR SETAPEN RTS DOCIRCLES MOVE.L WINDOWPOINTER,A0 BSR GA6RPA1 MOVE wd_MouseX(A0),d0 MOVE wd_MouseY(A0),d1 MOVE DRAWX,D2 MOVE DRAWY,D3 JSR DrawEllipse(a6) RETURN RTS SIZEIT SUBI #2,DRAWX SUBI #2,DRAWY BEQ.S RESETXY RTS RESETXY MOVE #75,DRAWX MOVE #50,DRAWY RTS ;AND NOW WE CLOSE EVERYTHING OFF WHEN WE'RE DONE* ENDWINDOW MOVE.L WINDOWPOINTER,A0 MOVE.L INTUITIONBASE,A6 SYS ClearMenuStrip MOVE.L WINDOWPOINTER,A0 MOVE.L INTUITIONBASE,A6 SYS CloseWindow ENDINTUITION MOVE.L INTUITIONBASE,A1 MOVE.L SYSBASE,A6 SYS CloseLibrary EDNGFX MOVE.L GFXBASE,A1 SYS CloseLibrary MOVE.L SAVESP,SP RTS ;THIS SECTION HAS ALL THE DATA AND TEXT* SECTION constants,DATA MYIDCMP EQU MENUPICK MYFLAGS EQU ACTIVATE!BORDERLESS DATA1 DC.B 'Welcome to:' ENDDATA1 DATA2 DC.B 'GRAFOS (V .01)' ENDDATA2 DATA3 DC.B 'By: Foster Hall' ENDDATA3 DATA3A DC.B '12679-99th Ave.' ENDDATA3A DATA3B DC.B 'Surrey, B.C. V3V 2P6' ENDDATA3B DATA4 DC.B 'A simple assembly language program' ENDDATA4 DATA5 DC.B 'utilizing a few of the many AMIGA graphics routines.' ENDDATA5 DATA6 DC.B ' This version is still in the experimental stage,' ENDDATA6 DATA7 DC.B 'used primarily as a learning tool, with the hopes' ENDDATA7 DATA8 DC.B 'that it will someday become a productive utility.' ENDDATA8 CNOP 0,4 MYWINDOW DC.W 0 LEFT EDGE DC.W 0 TOP EDGE DC.W 640 WIDTH DC.W 200 HEIGHT DC.B 2 DETAIL PEN DC.B 0 BLOCK PEN DC.L MYIDCMP IDCMP FLAGS DC.L MYFLAGS WINDOW FLAGS DC.L 0 FIRST GADGET DC.L 0 CHECKMARK DC.L 0 WINDOW TITLE DC.L 0 SCREEN DC.L 0 CUSTOM BITMAP DC.W 300 MIN. WIDTH DC.W 10 MIN. HEIGHT DC.W -1 MAX. WIDTH DC.W -1 MAX HEIGHT DC.W WBENCHSCREEN ;this is the data for the menu strip, calling the macros defined at the ;top of the file. MENUSTRIP CNOP 0,4 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MENU#1 M1 Menu M2,Menu1Left,0,Menu1Width,8,MenuOn,M1T0,M1_1 M2 Menu 0,2+Menu1Width,0,Menu1Width,8,MenuOn,M2T0,M2_1 M1_1 MenuItem M1_2,0,9*0,8*8,8,CItemFlags,0,Menu1Text1,0 MenuItem2 0,0,0 DC.L RESTART M1_2 MenuItem M1_3,0,9*1,8*8,8,CItemFlags,0,Menu1Text2,0 MenuItem2 0,0,0 DC.L CLEAR M1_3 MenuItem 0,0,9*2,8*8,8,CItemFlags,0,Menu1Text3,0 MenuItem2 0,0,0 DC.L ENDWINDOW ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MENU#2 ;;;;; M2_1 MenuItem M2_2,0,9*0,8*8,8,CItemFlags,0,Menu2Text1,0 MenuItem2 0,M2_1A,0 ;;;;; M2_1A MenuItem M2_1B,8*8,9*0,8*8,8,CItemFlags,0,Menu2Text1A,0 MenuItem2 0,0,0 DC.L SMALLELLIPSE ;;;;; M2_1B MenuItem 0,8*8,9*1,8*8,8,CItemFlags,0,Menu2Text1B,0 MenuItem2 0,0,0 DC.L LARGEELLIPSE ;;;;; M2_2 MenuItem 0,0,9*1,8*8,8,CItemFlags,0,Menu2Text2,0 MenuItem2 0,0,0 DC.L DRAWLINE Menu1Text1 IntuiText 2,0,JAM1,0,0,TEXTATTR,M1T1,0 Menu1Text2 Intuitext 2,0,JAM1,0,0,TEXTATTR,M1T2,0 Menu1Text3 Intuitext 2,0,JAM1,0,0,TEXTATTR,M1T3,0 Menu2Text1 Intuitext 2,0,JAM1,0,0,TEXTATTR1,M2T1,0 Menu2Text1A Intuitext 2,0,JAM1,0,0,0,M2T1A,0 Menu2Text1B Intuitext 2,0,JAM1,0,0,0,M2T1B,0 Menu2Text2 IntuiText 2,0,JAM1,0,0,TEXTATTR1,M2T2,0 ;;;;; M1T0 DC.B 'PROJECT',0 M1T1 DC.B 'Restart',0 M1T2 DC.B 'Clear',0 M1T3 DC.B 'Quit',0 M2T0 DC.B 'EFFECTS',0 M2T1 DC.B 'Circles',0 M2T1A DC.B 'Small',0 M2T1B DC.B 'Large',0 M2T2 DC.B 'Spirals',0 TEXTATTR DC.L FONTNAME DC.W 8 DC.B 7 DC.B 0 FONTNAME DC.B 'topaz.font',0 TEXTATTR1 DC.L FONTNAME DC.W 8 DC.B 2 DC.B 0 ;THIS SECTION SETS ASIDE THE STORAGE WE NEED FOR VARIOUS ROUTINES* SECTION variables,BSS SAVESP DS.L 1 WINDOWPOINTER DS.L 1 RASTERPORT DS.L 1 PENCOLOR DS.W 1 DRAWX DS.W 1 DRAWY DS.W 1 BASEX DS.W 1 BASEY DS.W 1 DRAWMODE DS.W 1 COUNT DS.L 1 TEXTPOINTER DS.L 1 IMCODE DS.L 1 IMCLASS DS.L 1 NUMCHARS DS.L 1 XPOSITION DS.L 1 YPOSITION DS.L 1 BASEY1 DS.L 1 USERPORT DS.L 1 _SysBase ds.l 1 END