; Car Parking Meter Program for EMU8086
; Author: Usama
; Description: Simulates a parking meter with RED background blinking when time expires
.MODEL SMALL
.STACK 100H
.DATA
MSG1 DB 10,13,'==== CAR PARKING METER ====',10,13,'$'
MSG2 DB 10,13,'Price List:',10,13
DB '1 - 1 Pound -> 5 seconds',10,13
DB '2 - 5 Pounds -> 30 seconds',10,13
DB '3 - 10 Pounds -> 60 seconds',10,13,'$'
MSG3 DB 10,13,'Enter your choice (1/2/3): $'
MSG4 DB 13,'Time Remaining: $'
MSG5 DB ' TIME EXPIRED!!! $'
SPACES DB ' $'
SECONDS DW 0
CHOICE DB ?
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
START:
; Clear screen
MOV AX, 0003H
INT 10H
; Display title
LEA DX, MSG1
MOV AH, 09H
INT 21H
; Display price list
LEA DX, MSG2
MOV AH, 09H
INT 21H
; Get user input
LEA DX, MSG3
MOV AH, 09H
INT 21H
MOV AH, 01H
INT 21H
MOV CHOICE, AL
; Determine time based on choice
CMP CHOICE, '1'
JE SET_5_SEC
CMP CHOICE, '2'
JE SET_30_SEC
CMP CHOICE, '3'
JE SET_60_SEC
; Invalid input - restart
JMP START
SET_5_SEC:
MOV SECONDS, 6
JMP START_TIMER
SET_30_SEC:
MOV SECONDS, 31
JMP START_TIMER
SET_60_SEC:
MOV SECONDS, 61
JMP START_TIMER
START_TIMER:
MOV AH, 02H
MOV DL, 10
INT 21H
COUNTDOWN_LOOP:
DEC SECONDS
; Display time
LEA DX, MSG4
MOV AH, 09H
INT 21H
MOV AX, SECONDS
CALL PRINT_NUMBER
MOV AH, 02H
MOV DL, 's'
INT 21H
MOV DL, ' '
INT 21H
MOV DL, ' '
INT 21H
; Check if expired
CMP SECONDS, 0
JE TIME_EXPIRED
; Wait 1 second
CALL DELAY_1_SEC
JMP COUNTDOWN_LOOP
TIME_EXPIRED:
; Clear screen
MOV AX, 0003H
INT 10H
; === SHOW RED BACKGROUND ===
MOV AH, 02H
MOV BH, 0
MOV DH, 12
MOV DL, 25
INT 10H
; Print with red background
MOV AH, 09H
LEA DX, MSG5
INT 21H
; Change text color to white on red for the printed text
MOV AH, 02H
MOV BH, 0
MOV DH, 12
MOV DL, 25
INT 10H
MOV CX, 21 ; Number of characters to colorize
COLOR_LOOP:
PUSH CX
; Write attribute only (change background to red)
MOV AH, 08H ; Read char and attribute
MOV BH, 0
INT 10H
MOV AH, 09H ; Write char with new attribute
MOV BH, 0
MOV BL, 4FH ; White on Red
MOV CX, 1
INT 10H
; Move cursor
MOV AH, 03H
MOV BH, 0
INT 10H
INC DL
MOV AH, 02H
INT 10H
POP CX
LOOP COLOR_LOOP
; Beep
MOV AH, 02H
MOV DL, 07H
INT 21H
; *** RESTART IMMEDIATELY AFTER BEEP ***
JMP START
MAIN ENDP
PRINT_NUMBER PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV CX, 0
MOV BX, 10
CMP AX, 0
JNE DIV_LOOP
MOV AH, 02H
MOV DL, '0'
INT 21H
JMP DONE_NUM
DIV_LOOP:
XOR DX, DX
DIV BX
PUSH DX
INC CX
CMP AX, 0
JNE DIV_LOOP
PRINT_DIGITS:
POP DX
ADD DL, '0'
MOV AH, 02H
INT 21H
LOOP PRINT_DIGITS
DONE_NUM:
POP DX
POP CX
POP BX
POP AX
RET
PRINT_NUMBER ENDP
DELAY_1_SEC PROC
PUSH AX
PUSH CX
PUSH DX
MOV AH, 00H
INT 1AH
MOV BX, DX
WAIT_LOOP:
MOV AH, 00H
INT 1AH
SUB DX, BX
CMP DX, 18
JB WAIT_LOOP
POP DX
POP CX
POP AX
RET
DELAY_1_SEC ENDP
DELAY_HALF_SEC PROC
PUSH AX
PUSH CX
PUSH DX
MOV AH, 00H
INT 1AH
MOV BX, DX
WAIT_HALF:
MOV AH, 00H
INT 1AH
SUB DX, BX
CMP DX, 9
JB WAIT_HALF
POP DX
POP CX
POP AX
RET
DELAY_HALF_SEC ENDP
END MAIN