; Equates file for Module METHOD # 2 ; FUNCTION CALLS from MVG v1.3 only! ; output gridbig.prg *************************************************************************** * * * ------------------------ First, some legalese ------------------------- * * * * Source code Copyright (C) 1989,90 W. David Parks. All rights reserved. * * No part of this SOURCE CODE may be reproduced, transmitted, transcribed * * stored in a retrieval system, or translated in any form or by any means * * without the prior written permission of the author, W.D.Parks * * * * * * We make no representations or warranties with respect to the contents * * of this document and specifically disclaim any implied warranties or * * merchantability, or fitness for any particular purpose. * * * * ----------------------------------------------------------------------- * * * * Written permission is granted to registered owners to use * * any or all of this source code in their own modules for * * private use. Please contact Dr. Bobware for details for * * any commercial use. * * * * * * * *************************************************************************** * last changed: 04/19/90 * this source code is intended for HiSoft's Assembler, GENST2. * other assemblers can be used with little modification. * the biggest requirement is it's MACRO capability. * after having Macros, I find it quite hard to live without them. * although I'm sure I remember a time when I did... * or was that just a nightmare I once had... I dunno... ;source code is copyright w.david parks, all rights reserved ; ; ;MOD_EQU: Standard equates for Module setup ***************************************************************************** ************************** MACROS for EASY Functions *********************** ***************************************************************************** ******************************* Call a routine that's inside MVG. ******************************* Use inline. ******************************* sample: callmvg ANYKEY callmvg macro function_number push.l #\1 move.l mvg_func,a6 jsr (a6) addq.l #4,sp endm ******************************* Call a routine that's inside MVG. ******************************* Use for stand-alone routine in MODULE ******************************* (places an RTS at the end... that's all) callmvgr macro function_number callmvg \1 rts endm ******************************* Lazy_Typer's MOVE.? _whatever_,-(sp) ******************************* ******************************* ie Push something on the stack ******************************* ******************************* HISOFT option "\0" automatically ******************************* appends any entered size, default=W ******************************* sample: PUSH.L #4 = move.l #4,-(sp) push macro move.\0 \1,-(sp) endm ******************************* Lazy_Typer's MOVE.? (sp)+,_whatever_ ******************************* ******************************* ie Pop something off the stack ******************************* ******************************* HISOFT option "\0" automatically ******************************* appends any entered size, default=W ******************************* sample: POP.L D7 = move.l (sp)+,D7 pop macro move.\0 (sp)+,\1 endm ******************************* Lazy_Typer's MOVEM.L A0-A6/D0-D7,-(sp) ******************************* ******************************* ie push everything on the stack! pha macro movem.l a0-a6/d0-d7,-(sp) endm ******************************* Lazy_Typer's MOVEM.L (sp)+,A0-A6/D0-D7 ******************************* ******************************* ie pop everything back off the stack! pla macro movem.l (sp)+,a0-a6/d0-d7 endm ;-------------------------------------------------------------------- ; MVG Packet #2 equates ;-------------------------------------------------------------------- ; ;equates used as Function Number for calling MVG via "callmvg" ; ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ; ; REMEMBER! MVG 1.2 owners CANNOT use this method of packet access ; ; !!!!!!!!!!SO BE SURE TO CHECK THE VERSION NUMBER!!!!!!!!! ; ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! GETVARS equ 0 ;A1--> Varlist GETBUFS equ 1 ;A0->Main, D0=W,H D1=MAXLEN, A1->CB GETCBUF equ 2 ;A0->CB C_VID2CB equ 3 ;COPY video to CB C_VID2MAIN equ 4 ;copy video to main (0-3) C_CB2MAIN equ 5 ;copy CB to main (0-3) C_MAIN2CB equ 6 ;copy main (0-3) to CB ANYKEY equ 8 ;wait for key, returnds D0.L WHEREM equ 9 SETXY equ 10 GDISPLAY equ 11 DISPLAY_CB equ 12 TOPTITLE equ 13 HI_CHAR equ 14 HI_STRING equ 15 PHEX1 equ 16 HEXIT equ 17 HEXITL equ 18 BDEC2 equ 19 BDEC3 equ 20 BDEC4 equ 21 GET_MISC equ 22 ASKMISC equ 23 COPYTOZ equ 26 APPENDTO equ 27 ADDEXT equ 28 SETMOUSEXY equ 31 SETSIZE equ 35 ATOG_NRM equ 36 ATOG_XOR equ 37 MAKEBOX equ 38 MAKEXBOX equ 39 SET_LINE equ 40 MAKELINE equ 41 RECTANG_Q equ 42 EALERT equ 45 ;------------------------- equates for index into VAR_LIST V_WID equ 0 V_HGT equ 4 V_PIX equ 8 V_REZ equ 12 V_CBF equ 24 V_INTI equ 32 V_ADRI equ 36 V_INTO equ 40 V_ADRO equ 44 V_MDIR equ 48 V_MFIL equ 52 V_FILN equ 56 V_RFIL equ 60 ******************************************************************* ;================================================================= ; MOD_INI: Initialization routines for Module setup ;================================================================= ; ; the program proper ; ; section text PRG_INIT: bra begin siggy dc.b 'MVG Module: xxxxxx xxxxxx xxx',0 ;30 bytes even begin move.l 4(a7),a3 base page move.l a3,basepage save it for later move.l #ustack,a7 use local stack move.l $c(a3),d0 text len add.l $14(a3),d0 data len add.l $1c(a3),d0 BSS len add.l #$100,d0 basepage move.l d0,-(sp) move.l a3,-(sp) clr.w -(sp) move.w #$4a,-(sp) trap #1 shrink memory lea 12(sp),sp ;================================================================= ; ---------------- start test for MVG signature ---------------- ;================================================================= move.b #$30,ernum start error text number at "0" move.l $24(a3),a0 parent's basepage adrs move.l a0,parent save temp add.l #$80,a0 point A0--> parent's command_line move.l (a0)+,a6 move.l a6,mvg_packet adrs of packet move.l (a0)+,d0 move.l (a0)+,d1 cmp.l MVG_SIG,d0 ;0,"MVG" bne badbye ;MVG is not the caller... no packet move.b #$31,ernum ;up the ernum to "1" cmp.l MVG_VER,d1 ;match version number string "1.30" blt badver ;MVG is older version than required. bgt .2a ;additional checking can be made on ;word following version number in ;parent's basepage, if necessary. move.b (a0),d0 ;fetch character (version extension) ; clr.w oldver cmp.b min_ver,d0 ;1.20 "h" is earliest version usable blt badver ; bgt .2a ; move.w #1,oldver .2a cmp.w MVG_MAX,d1 bgt badver ***************************************************************************** ************* Set up generic variables and other packet items ************** read_packet: move.l a6,a5 sub.l #4,a5 ;(Packet - 4) ---> Function dispatcher in MVG move.l (a5),mvg_func sub.l #4,a5 move.l (a5),mvg_vars ;(Packet - 8) ---> Var_List lea packet,a1 move.l a6,a0 move.l #4,d0 .0 move.l (a0)+,(a1)+ ;copy first 5 items from PACKET dbf d0,.0 ;easy way to get adrs of buffers & misc move.l _wid,a0 ;read width from MVG and store locally move.w (a0),wid move.l _hgt,a0 ;read height from MVG and store locally move.w (a0),hgt jmp Main_Action ; JUMP TO USER'S CODE ************************************************************************* ;======================================================================== ;============= Some subroutines with labels for local calling ========== anykey: push.l #ANYKEY move.l mvg_func,a6 jsr (a6) addq.l #4,sp rts bell move.w #7,d0 hi_char: push.l #HI_CHAR move.l mvg_func,a6 jsr (a6) addq.l #4,sp rts prin: hi_string: push.l #HI_STRING move.l mvg_func,a6 jsr (a6) addq.l #4,sp rts ;-------------------------- Copy a string A0--->A1 copytoz: push.l #COPYTOZ move.l mvg_func,a6 jsr (a6) addq.l #4,sp rts ;------------------------- Poll the mouse position and button status ;-------------------------- Store the position in local variable wherem: callmvg WHEREM move.l d1,mouse_xy rts mouse_xy mouse_x dc.w 0 mouse_y dc.w 0 ;---------------------------------- if you need these routines ;---------------------------------- then this'll make 'em ;---------------------------------- easily accessible as local labels ;---------------------------------- rather than using "callmvg" each ;---------------------------------- time you access addext callmvgr ADDEXT appendto callmvgr APPENDTO bdec2 callmvgr BDEC2 bdec3 callmvgr BDEC3 bdec4 callmvgr BDEC4 phex1 callmvgr PHEX1 hexit callmvgr HEXIT hexitl callmvgr HEXITL drawbox callmvgr MAKEBOX drawxbox callmvgr MAKEXBOX askmisc callmvgr ASKMISC setsize callmvgr SETSIZE alerter callmvgr EALERT setmousexy callmvgr SETMOUSEXY atognrm callmvgr ATOG_NRM atogxor callmvgr ATOG_XOR rectang_q callmvgr RECTANG_Q setline callmvgr SET_LINE makeline callmvgr MAKELINE toptitle callmvgr TOPTITLE gdisplay callmvgr GDISPLAY ************************************************************************ ************************************************************************ ;-------------------------------------------------------------------- ;Routines for exiting if not run as a module or from a version of MVG ;that is too early............ ; ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ; ; This method of Packet access is only available in ; MVG version 1.3...... CHECK FOR THE PROPER VERSION! ; ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ************************************************************************ ************************************************************************ badver lea ermsg2,a0 ;print error msg bsr sysprin lea MVG_VER,a0 bsr sysprin bra byex ;exit back to... caller (MVG) badbye lea ermsg,a0 ;No Packet Provided (MVG not parent of module) bsr sysprin byex push.w #7 ;wait for keypress via GEMDOS trap #1 addq.l #2,sp gbye: gbyeoops: push.w #2 ;at this time, MVG does not inquire push.w #$4c ;for an error return number. This trap #1 ; #2 is arbitrarily selected here. sysprin ;print a string using GEMDOS push.l a0 push.w #9 trap #1 addq.l #6,sp rts good_bye ;exit without error code push.w #0 push.w #$4c trap #1 ermsg dc.b 27,'Y',32,32,27,'K Err# ' ernum dc.b '0 Cannot Find MVG Packet',7,0 even ermsg2 dc.b 27,'Y',32,32,27,'K Requires MVG version # ',0 even MVG dc.w 0,0 MODULE_ID dc.w 0,0 MVG_SIG dc.b 0,'MVG' MVG_VER dc.b '1.30' ;minimum version MVG to use this module MVG_SUBVER dc.b ' ',0 ;a sub version is always 1-byte long. basepage dc.l 0 parent dc.l 0 mvg_vars dc.l 0 mvg_func dc.l 0 mvg_packet dc.l 0 min_ver dc.b 0,0 ;SET REQUIRED MINIMUM CHAR HERE MVG_MAX dc.b '39',0,0 ;required MAX packet: bgraph dc.l 0 ;pointer to main image buffer buflen dc.l 0 ;length of main image buffer _wid dc.l 0 ;pointer to MVG's var: WID _hgt dc.l 0 ;pointer to MVG's var: HGT clipboard dc.l 0 ;pointer to clipboard buffer wid dc.w 0 ;local label, loaded with image width (via MVG's WID) hgt dc.w 0 ;local label, loaded with image height (via MVG's HGT) cb_flag dc.w 0 ;oldver dc.w 0 *************************************************************************** *************************************************************************** *************************************************************************** *************************************************************************** Main_Action ; Your code goes here........ exit with P_TERM * #############################################################* * ######### SAMPLE CODE: COPY VIDEO TO CLIPBOARD ##########* * ######### ##########* * ######### Three different samples, all the same ##########* * #############################################################* ;---------------------------- standard 68000 syntax ; move.l #C_V2CB,-(sp) ;push the function number on the stack ; movea.l mvg_func,a6 ;get func_dispatcher into address register ; jsr (a6) ;JSR indirect via register ; addq.l #4,(sp) ;restore stack ; bra go_byebye ;exit via p_term ; ;---------------------------- same code, using push macro ; push.l #C_V2CB ; move.l mvg_func,a6 ; jsr (a6) ; addq.l #4,sp ; bra go_byebye ; ;--------------------------- same, again, using "callmvg" macro ; callmvg #C_V2CB ; bra go_byebye ; ; nop ;go_byebye: ; push.w #0 ;return error code of zero: no-error ; push.w #$4c ;GEMDOS p_term (exit back to whatever caller) ; trap #1 ; * #############################################################* * ######### ##########* * ######### SAMPLE CODE: WRITE A GRID to IMAGE ##########* * ######### ##########* * #############################################################* bsr gdisplay ;display the current image lea first_lert,a0 moveq #1,d0 bsr alerter cmp.w #2,d0 beq goombye grid_rows: move.l bgraph,a3 clr.l d7 clr.l d6 clr.l d5 move.w hgt,d7 move.w wid,d6 move.l d6,d5 lsl.l #4,d5 ;every 16 rows .0 move.b #$ff,d0 move.l a3,a2 move.l d6,d1 subq.w #1,d1 .1 move.b d0,(a2)+ dbf d1,.1 add.l d5,a3 sub.w #8,d7 bpl .0 grid_columns: move.l bgraph,a3 clr.l d7 clr.l d6 clr.l d5 move.w hgt,d7 move.w wid,d6 move.l d6,d5 asr.w #1,d5 subq.w #1,d5 .0 move.b #$80,d0 move.l a3,a2 move.l d7,d1 subq.w #1,d1 .1 move.b (a2),d2 or.b d0,d2 move.b d2,(a2) add.l d6,a2 dbf d1,.1 addq.l #2,a3 dbf d5,.0 ; bsr anykey bra goombye nop goombye push.w #0 push.w #$4c P_TERM, this is the way we exit a module trap #1 (but you knew that) ******************************************************************** ******************************************************************** ******************************************************************** section data even ;for sample module first_lert dc.b '[0][' dc.b ' Draw a Grid on |' dc.b ' the current |' dc.b ' Image? ]' dc.b '[Yes|No]' even *************************************************************************** *************************************************************************** *************************************************************************** *************************************************************************** section bss even ds.l 300 ustack ds.l 1 end