.SBTTL OFFSET MACROS ; ; ;================================================================= ;......................OFFSET MACROS.............................. ;================================================================= ; ; These MACRO's are meant to be used ; by experienced programmers only. They allow you to ; create your own relocatable instruction set/labels ; but don't try to be too clever with them or both you ; and the MACRO assembler are gonna get lost. ; The SYMBOL $LDEF$ is the value for the next LABEL. ; ; Label creater macros ; .MACRO $$LAB NUMBER .IIF EQ LST$$ .LIST NUMBER'$: ;CREATE LABLE .IIF EQ LST$$ .NLIST $LDEF$ = $LDEF$ + 1 ;INCREMENT TO NEXT LABLE .ENDM $$LAB .MACRO $LAB .MCALL $$LAB $$LAB \$LDEF$ .ENDM $LAB ; ; Word offset creater macros ; .MACRO $$WOFFSET NUMBER ;WORD OFFSET MACRO .IIF EQ LST$$ .LIST .WORD NUMBER'$-.-2 .IIF EQ LST$$ .NLIST .ENDM $$WOFFSET .MACRO $WOFFSET RELOC .MCALL $$WOFFSET NARG = $LDEF$ .IF NB RELOC NARG = $LDEF$+RELOC .ENDC $$WOFFSET \NARG .ENDM $WOFFSET ; ; Instructions using the labels ; ; Offset at the end of the TEXT ; .MACRO $$EOFFSET TEXT,NUMBER ;TEXT USING OFFSET MACRO .IIF EQ LST$$ .LIST TEXT'NUMBER'$ .IIF EQ LST$$ .NLIST .ENDM $$EOFFSET .MACRO $EOFFSET TEXT,RELOC .MCALL $$EOFFSET NARG = $LDEF$-1 ;HOLD LABLE NUMBER .IF NB RELOC NARG = $LDEF$+RELOC-1 ;CALCULATE NEW VALUE .ENDC $$EOFFSET ,\NARG .ENDM $EOFFSET ; ; Offset in the middle of TEXT ; .MACRO $$MOFFSET TXT1,TXT2,NUMBER ;TEXT USING OFFSET MACRO .IIF EQ LST$$ .LIST TXT1'NUMBER'$'TXT2 .IIF EQ LST$$ .NLIST .ENDM $$MOFFSET .MACRO $MOFFSET TXT1,TXT2,RELOC .MCALL $$MOFFSET NARG = $LDEF$-1 ;HOLD LABLE NUMBER .IF NB RELOC NARG = $LDEF$+RELOC-1 ;CALCULATE NEW VALUE .ENDC $$MOFFSET ,,\NARG .ENDM $MOFFSET ; .PAGE .SBTTL STRING ; ; ;================================================================= ;.........................STRING MACROS........................... ;================================================================= ; ; ; ; ; ; .MACRO STRING TEXT,LAB,CONTROL ; .MCALL $WOFFSET,$LAB ; .NARG NARG ;GET NUMBER OF ARGUMENTS ; ; NORMAL MODE ; .IF EQ NARG-2 .IIF EQ LST$$ .LIST .WORD 0 ;NO SIZE SO WRITE ACCESS DENIED LAB: .IIF EQ LST$$ .NLIST $WOFFSET ;CALCULATE LENGTH OF STRING ;STORE STRING .IIF EQ LST$$ .LIST .ASCII TEXT .IIF EQ LST$$ .NLIST $LAB ;CREATE A STRING TERMINATING LABEL .EVEN ;STOP STRING ON WORD BOUNDARY .MEXIT ;DO NOT CONTINUE DO NO COLLECT 200 POUNDS ETC .ENDC ; ; NOW FOR THE CLEVER STUFF ; .IF EQ NARG-3 ;ONLY PROCESS IF WE HAVE THREE FIELDS ; ; THE SMARTY TRYS A LONG REPLY ; .IF IDN CONTROL,FIRST ;IS THIS THE START ENTRY .IIF EQ LST$$ .LIST .WORD 0 ;NO SIZE SO WRITE ACCESS DENIED LAB: .IIF EQ LST$$ .NLIST $WOFFSET ;CALCULATE LENGTH OF STRING ;STORE THE FIRST STRING .IIF EQ LST$$ .LIST .ASCII TEXT .IIF EQ LST$$ .NLIST .ENDC ; ; NOW A CONTINUATION LINE TEST ; .IF IDN CONTROL,CONT ;IS THIS A CONTINUATION LINE .IIF EQ LST$$ .LIST .ASCII TEXT .IIF EQ LST$$ .NLIST .ENDC ; ; AT LAST THE FINAL LINE ; .IF IDN CONTROL,LAST ;IS THIS THE TERMINATION LINE .IIF EQ LST$$ .LIST .ASCII TEXT .IIF EQ LST$$ .NLIST $LAB ;CREATE A LABLE .EVEN ;STOP ON A WORD BOUNDRY .ENDC .ENDC .ENDM STRING ; ; .PAGE .SBTTL MOVE TEXT ; ; ; .MACRO MOVTEXT TEXT,REG,CONTROL .MCALL $LAB,$EOFFSET,$WOFFSET .NARG NARG ;HOLD NUMBER OF PARAMETERS .IF EQ NARG-2 .IF IDN REG,- .IIF EQ LST$$ .LIST MOV #.+10.,CD.SRC ;HOLD STRING ADDRESS. .IIF EQ LST$$ .NLIST .IFF .NTYPE NTYPE,REG .IF EQ NTYPE&7-7 ;IF A PC MODE .IIF EQ LST$$ .LIST MOV #.+10.,REG ;HOLD ADDRESS IN LOCATION. .IIF EQ LST$$ .NLIST .IFF .IIF EQ LST$$ .LIST MOV #.+8.,REG ;HOLD ADDRESS IN LOCATION. .IIF EQ LST$$ .NLIST .ENDC .ENDC $EOFFSET
,+2 ;BYPASS STRING .IIF EQ LST$$ .LIST .WORD 0 ;WRITE PROTECT CONTROL WORD .IIF EQ LST$$ .NLIST $WOFFSET ;NUMBER OF CHARACTERS IN STRING .IIF EQ LST$$ .LIST ;STORE CHARACTERS .ASCII TEXT .IIF EQ LST$$ .NLIST $LAB ;LAB MARKING STRING END .EVEN ;SET PC TO EVEN BYTE ADDRESS $LAB ;LAB MARKING BYPASS ADDRESS .MEXIT ;ESCAPE VERY QUICKLY .ENDC .IF EQ NARG-3 ; WE ARE IN THE LONG TEXT STRING OPTION .IF IDN CONTROL,FIRST .IF IDN REG,- .IIF EQ LST$$ .LIST MOV #.+10.,CD.SRC ;HOLD STRING ADDRESS. .IIF EQ LST$$ .NLIST .IFF .NTYPE NTYPE,REG .IF EQ NTYPE&7-7 ;IF A PC MODE .IIF EQ LST$$ .LIST MOV #.+10.,REG ;HOLD ADDRESS IN LOCATION. .IIF EQ LST$$ .NLIST .IFF .IIF EQ LST$$ .LIST MOV #.+8.,REG ;HOLD ADDRESS IN LOCATION. .IIF EQ LST$$ .NLIST .ENDC .ENDC $EOFFSET
,+2 ;BYPASS STRING .IIF EQ LST$$ .LIST .WORD 0 ;WRITE PROTECT CONTROL WORD .IIF EQ LST$$ .NLIST $WOFFSET ;NUMBER OF CHARACTERS IN STRING .IIF EQ LST$$ .LIST ;STORE CHARACTERS .ASCII TEXT .IIF EQ LST$$ .NLIST .ENDC ; .IF IDN CONTROL,CONT .IIF EQ LST$$ .LIST ;STORE CHARACTERS .ASCII TEXT .IIF EQ LST$$ .NLIST .ENDC ; .IF IDN CONTROL,LAST .IIF EQ LST$$ .LIST ;STORE CHARACTERS .ASCII TEXT .IIF EQ LST$$ .NLIST $LAB ;END OF STRING MARKER LABEL .EVEN ;SET PC TO EVEN BYTE ADDRESS $LAB ;BYPASS ADDRESS MARKER LABEL .ENDC ; .ENDC .ENDM MOVTEXT ; .PAGE .SBTTL RESERVE ; ; ; .MACRO RESERVE SIZE,LAB .IIF EQ LST$$ .LIST .WORD SIZE ;MAXIMUM LENGTH (SIZE) BYTES ALLOCATED ;TO THIS STRING BASED ARRAY LAB: .WORD 0 ;PRESET BUFFER LENGTH WORD EMPTY .BLKB SIZE ;SIZE CHARACTERS AREA RESERVED .EVEN ;SET END OF ARRAY ON EVEN BOUNDRY .IIF EQ LST$$ .NLIST .ENDM RESERVE ; ; .PAGE .SBTTL PRESET ; ; .MACRO PRESET MAXSIZE,NAME,STRING,REPEAT,INCREMENT ; .NARG NARG ;GET NUMBER OF PARAMETER ARGUMENTS .ENABL LSB .IF GE NARG-3 .IIF LT MAXSIZE-27716$+NAME+2 .EMIT <.WORD 27716$-NAME+2> .IIF GE MAXSIZE-27716$+NAME+2 .EMIT <.WORD MAXSIZE> .IIF EQ LST$$ .LIST NAME: .WORD 27715$-NAME+2 ;HOLD STRG LENGTH .IIF EQ LST$$ .NLIST .ENDC ; ; .IIF EQ NARG-3 .EMIT <.ASCII STRING ;BASIC PRESET> ; .IF EQ NARG-4 ;BASIC STRG REPEATED .REPT REPEAT .EMIT <.ASCII STRING> .ENDR .ENDC ; .IF EQ NARG-5 ;REPEAT VALUE AND INCREMENT VALUE CNT = STRING .REPT REPEAT .BYTE CNT CNT=CNT+INCREMENT .ENDR .ENDC ; .IF GE NARG-3 .IIF EQ LST$$ .LIST 27715$: .EVEN ;FORCE TO EVEN BOUNDRY 27716$: .IIF EQ LST$$ .NLIST CNT = MAXSIZE-27716$+NAME+2 .IIF GT CNT .EMIT <.BLKB CNT ;RESERVE REMAINING REQUIRED SPACE> .EVEN ;FORCE TO EVEN BOUNDRY .ENDC ; .DSABL LSB .ENDM PRESET ; ; .PAGE .SBTTL QUEBUF ; ; .MACRO QUEBUF SIZE,LABEL ; .IIF EQ LST$$ .LIST .WORD SIZE ;LENGTH OF QUEUE BUFFER .WORD LABEL+SIZE ;QUEUE END ADDRESS .WORD LABEL ;LOAD POINTER ADDRESS .WORD LABEL ;GET POINTER ADDRESS .WORD 0 ;NUMBER OF CHARACTERS ON QUEUE LABEL: .BLKB SIZE ;RESERVE SPACE FOR QUEUE ELEMENTS .EVEN ;SET BUFFER TO WORD BOUNDARY .WORD 0 ;BUFFER TWO BYTE SPLASH AREA .IIF EQ LST$$ .NLIST ; .ENDM QUEBUF ; ; .END ; ;