; *** STRUCTURED PROGRAMMING AND OTHER NICE MACROS *** ; ; NOTE: USE NO NON-LOCAL SYMBOLS WITHIN STRUCTURED ; PROGRAMMING CONSTRUCTS. ALSO RESTRICT LOCAL ; SYMBOLS TO 77$ OR LESS. ; WRITTEN BY: ; BOB DENNY ; CREATIVE SYSTEM DESIGN CO. ; (213) 355-6836 ; VERSION 1.0 JUNE 1978 ; ;------------------------------------------------------------------------ ; MACRO TO CALL ALL OF THE OTHERS. .MACRO SMACS .MCALL .IF. .ELSE. .END. .LOOP. .UNTL. .MCALL .FCBR. .BYBR. .ENLB. .BGLB. .BGBR. .MCALL PUSH POP CALL RETURN SAVREG RSTREG .MCALL BASE OFFSET BSS .IFLVL = -1 .IFRPT = -1 .BGLVL = -1 .BGRPT = -1 .ENDM SMACS ; .IF. (CC) {TRUE CLAUSE} .ELSE. {FALSE CLAUSE} .END. { ... } .MACRO .IF. CC ;CC IS COND. CODE .IF LT .IFLVL ;FORCE LSB IF INACTIVE .IF LT .BGLVL .ENABL LSB .DSABL LSB .IFRPT=-1 .ENDC .IFRPT=.IFRPT+1 ;REPEAT AT LEVEL 0 .ENDC .IFLVL=.IFLVL+1 ;INCR NESTING LEVEL .IFLAB=<10*.IFRPT>+.IFLVL+100 ;CALC LABEL NUMBER B'CC .+4 ;COND BR TO TRUE CLAUSE .FCBR. \.IFLAB ;OR BR TO FALSE CLAUSE .ENDM .MACRO .FCBR. A BR A'$ .ENDM .MACRO .ELSE. .ELLAB=<10*.IFRPT>+.IFLVL+200 ;CALC LABEL NUMBERS .IFLAB=.ELLAB-100 .BYBR. \.IFLAB,\.ELLAB ;BR BY FALSE CLAUSE ;AND TARGET FOR BR TO F.C. .ENDM .MACRO .BYBR. A,B BR B'$ A'$: .ENDM .MACRO .END. .ELLAB=<10*.IFRPT>+.IFLVL+200 ;RECALC THIS LABEL $ .ENLB. \.ELLAB ;MAKE TARGET FOR BR BY F.C. .IFLVL=.IFLVL-1 ;DECREASE NESTING LEVEL .ENDM .MACRO .ENLB. A A'$: .ENDM ; ; .LOOP. {REPEATED INSTRUCTIONS} .UNTL. (CC) { ... } ; .MACRO .LOOP. .IF LT .BGLVL ;FORCE LSB AND RESET AT .IF LT .IFLVL ;INACTIVE .ENABL LSB .BGRPT=-1 .ENDC .BGRPT=.BGRPT+1 .ENDC .BGLVL=.BGLVL+1 ;INCR NEST LEVEL .BGLAB=<10*.BGRPT>+.BGLVL+300 .BGLB. \.BGLAB ;MAKE LOOP BACK TARGET .ENDM .MACRO .BGLB. A A'$: .ENDM .MACRO .UNTL. CC ;EXIT ON COND CODE CC B'CC .+4 ;COND BR OUT .BGLAB=<10*.BGRPT>+.BGLVL+300 ;CALC PROPER LABEL # .BGBR. \.BGLAB ;LOOP BACK .BGLVL=.BGLVL-1 ;REDUCE NEST LEVEL .ENDM .MACRO .BGBR. A BR A'$ .ENDM ; ; OTHER NIFTY MACROS THAT MAKE THE PROGRAM LISTING CLEAN ; .MACRO PUSH ARG MOV ARG,-(SP) .ENDM .MACRO POP ARG MOV (SP)+,ARG .ENDM .MACRO CALL ADDR JSR PC,ADDR .ENDM .MACRO RETURN RTS PC .ENDM ; ; SAVE REGISTERS AND RESTORE -- USE HARDWARE STACK ; .MACRO SAVREG PUSH R0 PUSH R1 PUSH R2 PUSH R3 .ENDM .MACRO RSTREG POP R0 POP R1 POP R2 POP R3 .ENDM ; OTHER STUFF .MACRO BASE VALUE ...OFS = VALUE .ENDM BASE .MACRO OFFSET NAME,SIZE .LIST ME NAME = ...OFS .NLIST ME ...OFS =...OFS+SIZE .ENDM OFFSET .MACRO BSS BYTES .REPT BYTES .BYTE 0 .ENDR .ENDM BSS