; MACRO LIBRARY FOR BASIC INTERSECTION ; ; GLOBAL DEFINITIONS FOR DEBUG PROCESSING TRUE EQU 0FFFFH ;VALUE OF TRUE FALSE EQU NOT TRUE;VALUE OF FALSE DEBUG SET FALSE ;INITIALLY FALSE BDOS EQU 5 ;ENTRY TO CP/M BDOS RCHAR EQU 1 ;READ CHARACTER FUNCTION WBUFF EQU 9 ;WRITE BUFFER FUNCTION CR EQU 0DH ;CARRIAGE RETURN LF EQU 0AH ;LINE FEED ; ; INPUT/OUTPUT PORTS FOR LIGHT AND CLOCK LIGHT EQU 00H ;TRAFFIC LIGHT CONTROL CLOCK EQU 03H ;24 HOUR CLOCK (0,1,...,23) ; ; BIT POSITIONS FOR TRAFFIC LIGHT CONTROL NSBITS EQU 4 ;NORTH SOUUTH BITS EWBITS EQU 0 ;EAST WEST BITS ; ; CONSTANT VALUES FOR THE LIGHT CONTROL OFF EQU 0 ;TURN LIGHT OFF RED EQU 1 ;VALUE FOR RED LIGHT YELLOW EQU 2 ;VALUE FOR YELLOW LIGHT GREEN EQU 3 ;GREEN LIGHT ; SETLITE MACRO DIR,COLOR ;; SET LIGHT GIVEN BY "DIR" TO COLOR GIVEN BY "COLOR" IF DEBUG ;;PRINT INFO AT CONSOLE LOCAL SETMSG,PASTMSG MVI C,WBUFF ;;WRITE BUFFER FUNCTION LXI D,SETMSG CALL BDOS ;;WRITE THE TRACE INFO JMP PASTMSG SETMSG: DB CR,LF DB '&DIR CHANGING TO &COLOR$' PASTMSG: EXITM ENDIF MVI A,COLOR SHL DIR&BITS ;;READIED OUT LIGHT ;;SENT IN PROPER BIT POSITION ENDM ; TIMER MACRO SECONDS ;; CONSTRUCT INLINE TIME-OUT LOOP LOCAL T1,T2,T3 ;;LOOP ENTRIES MVI D,4*SECONDS ;;BASIC LOOP CONTROL T1: MVI B,250 ;;250MSEC *4 = 1 SEC T2: MVI C,182 ;;182*5.5USEC = 1MSEC T3: DCR C ;;1 CY = .5 USEC JNZ T3 ;;+10 CY = 5.5 USEC DCR B ;;COUNT 250,249... JNZ T2 ;;LOOP ON B REGISTER DCR D ;;BASIC LOOP CONTROL JNZ T1 ;;LOOP ON D REGISTER ;; ARRIVE HERE WITH APPROXIMATELY "SECONDS" ;; TIMEOUT, CONTINUE PROCESSING. ENDM ; CLOCK? MACRO LOW,HIGH,IFTRUE ;; CHECK FOR REAL-TIME CLOCK GREATER THAN OR ;; EQUAL TO "LOW." AND LESS THAN "HIGH." ;; CONTINUE AT "IFTRUE" WHEN BETWEEN THESE ;; TIMES. LOCAL IFFALSE ;;ALTERNATE TO TRUE CASE IN CLOCK ;;READ REAL-TIME CLOCK IF NOT NUL HIGH ;;CHECK HIGH CLOCK CPI HIGH ;;EQUAL OR GREATER? JNC IFFALSE ;;SKIP TO END IF SO ENDIF CPI LOW ;;LESS THAN LOW VALUE? JNC IFTRUE ;;SKIP TO LABEL IF NOT IFFALSE: ENDM ; RETRY MACRO GOLABEL ;; CONTINUE EXECUTION AT "GOLABEL" JMP GOLABEL ENDM