; COLOR.ASM ; BY: MIKE GALLANT ; THIS PROGRAM IS A ASSEMBLER VERSION OF AN ETCH-A-SKETCH ; THIS PROGRAM IS WRITTEN TO RUN IN 320*200 MEDIUM RESOLUTION MODE ; RUN CGA.EXE FILE INCLUDED WITH THIS PROGRAM TO SET YOUR ; SCREEN TO THIS MODE DATA_HERE SEGMENT CURRCOLOR DB 01H ; STORES CURRENT COLOR SELECTED UPARROW DB 48H ; DRAW UP ON SCREEN DOWNARROW DB 50H ; DRAW DOWN ON SCREEN RIGHTARROW DB 4DH ; DRAW RIGHT ON SCREEN LEFTARROW DB 4BH ; DRAW LEFT ON SCREEN ESCKEY DB 01H ; TO EXIT PROGRAM ZEROKEY DB 30H ; TO CHANGE DOT COLOR TO BLACK ONEKEY DB 31H ; TO CHANGE DOT COLOR TO BLUE TWOKEY DB 32H ; TO CHANGE DOT COLOR TO MAGNENTA THREEKEY DB 33H ; TO CHANGE DOT COLOR TO WHITE CLEARKEY DB 53H ; TO CLEAR SCREEN FOURKEY DB 34H ; TO CHANGE BACKGROUND COLOR FIVEKEY DB 35H ; TO CHANGE COLOR PALETTE BGCOLOR DB 00H ; STORES CURRENT BACKGROUND COLOR PALETTE DB 00H ; STORES CURRENT PALETTE CHOSEN DATA_HERE ENDS TEXT_HERE SEGMENT COPYRIGHT DB 'Etch-A-Sketch (c)1997 MikeSoft Corp. ' INSTRUCTION DB '0-3 Dot Color 4-Change BG 5-Palette ' INSTRUCTIO2 DB 'ESC-Exit DEL-Clear Screen Arrows-Move ' TEXT_HERE ENDS STACK_HERE SEGMENT PARA STACK 'STACK' THESTACK DB 100 DUP('STACK') STACK_HERE ENDS CODE_HERE SEGMENT ASSUME CS:CODE_HERE, DS:DATA_HERE, SS:STACK_HERE, ES:TEXT_HERE INIT_SEGMENTS: MOV AX,DATA_HERE MOV DS,AX MOV AX,TEXT_HERE MOV ES,AX MOV AX,STACK_HERE MOV SS,AX CLEAR_SCREEN: MOV AH,6 ; SCROLL UP MOV AL,0 ; BLANKING CODE MOV CX,0 ; SCREEN COORDINATES 0,0 MOV DL,79 ; SCREEN COORDINATES MOV DH,23 ; 79,24 INT 10H SHOW_COPYRIGHT: MOV AX,1301H ; FOR USE WITH INT 10H CALL MOV BL,07 MOV BH,0 MOV CX,40 ; NUMBER OF CHARS TO DISPLAY MOV DH,22 ; ROW TO DISPLAY AT MOV DL,00 ; COLUMN TO DISPLAY AT MOV BP,OFFSET COPYRIGHT ; OFFSET OF STRING MOV SI,SEG COPYRIGHT ; GET THE SEGMENT ADDRESS MOV ES,SI ; ES=SEGMENT OF STRING INT 10H SHOW_INSTRUCT1: MOV AX,1301H ; FOR USE WITH INT 10H CALL MOV BL,07 MOV BH,0 MOV CX,40 ; NUMBER OF CHARS TO DISPLAY MOV DH,23 ; ROW TO DISPLAY AT MOV DL,00 ; COLUMN TO DISPLAY AT MOV BP,OFFSET INSTRUCTION ; OFFSET OF STRING MOV SI,SEG INSTRUCTION ; GET THE SEGMENT ADDRESS MOV ES,SI ; ES=SEGMENT OF STRING INT 10H SHOW_INSTRUCT2: MOV AX,1301H ; FOR USE WITH INT 10H CALL MOV BL,07 MOV BH,0 MOV CX,40 ; NUMBER OF CHARS TO DISPLAY MOV DH,24 ; ROW TO DISPLAY AT MOV DL,00 ; COLUMN TO DISPLAY AT MOV BP,OFFSET INSTRUCTIO2 ; OFFSET OF STRING MOV SI,SEG INSTRUCTIO2 ; GET THE SEGMENT ADDRESS MOV ES,SI ; ES=SEGMENT OF STRING INT 10H INITIALIZATION: MOV DX,0066H ; STARTING ROW MOV CX,0070H ; STARTING COLUMN MOV AX,0000H MOV BX,0000H MOV AL,01H ; LOAD INITIAL LINE COLOR MOV CURRCOLOR,AL GET_USER_INPUT: MOV AL,CURRCOLOR ; GET CURRENT COLOR MOV BH,00H MOV AH,00H INT 16H ; GET CHARACTER FROM USER MOV BH,ZEROKEY ; IF ZERO KEY PRESSED SUB BH,AL JZ COLORSCREEN ; CHANGE LINE COLOR TO BLACK MOV BH,ONEKEY ; IF ONE KEY PRESSED SUB BH,AL JZ COLORBLUE ; CHANGE LINE COLOR TO BLUE MOV BH,TWOKEY ; IF TWO KEY PRESSED SUB BH,AL JZ COLORTHREE ; CHANGE LINE COLOR TO MAGNENTA MOV BH,THREEKEY ; IF THREE KEY PRESSED SUB BH,AL JZ COLORFOUR ; CHANGE LINE COLOR TO WHITE MOV BH,FOURKEY ; IF FOUR KEY PRESSED SUB BH,AL JZ CHANGEBG ; CHANGE BACKGOUND COLOR MOV BH,FIVEKEY ; IF FIVE KEY PRESSED SUB BH,AL JZ CHANGEPALETTE ; CHANGE COLOR PALETTE MOV BH,UPARROW ; IF UP ARROW PRESSED SUB BH,AH JNZ NEXT5 JMP MOVEUP ; DRAW UP NEXT5: MOV BH,DOWNARROW ; IF DOWN ARROW PRESSED SUB BH,AH JNZ NEXT4 JMP MOVEDOWN ; DRAW DOWN NEXT4: MOV BH,RIGHTARROW ; IF RIGHT ARROW PRESSED SUB BH,AH JNZ NEXT2 JMP MOVERIGHT ; DRAW TO THE RIGHT NEXT2: MOV BH,LEFTARROW ; IF LEFT ARROW PRESSED SUB BH,AH JNZ NEXT3 JMP MOVELEFT ; DRAW TO THE LEFT NEXT3: MOV BH,CLEARKEY ; IF PRESSED SUB BH,AH JNZ NEXT1 JMP CLEAR_AGAIN ; CLEAR THE SCREEN NEXT1: MOV BH,ESCKEY ; IF PRESSED SUB BH,AH JNZ GET_USER_INPUT ; IF NONE OF THE ABOVE, ; GET ANOTHER CHARACTER FROM KEYBOARD JMP BACK_TO_DOS ; GO BACK TO DOS COLORSCREEN: MOV AL,00H MOV CURRCOLOR,AL ; CHANGE COLOR TO BLACK JMP GET_USER_INPUT COLORBLUE: MOV AL,01H MOV CURRCOLOR,AL ; CHANGE COLOR TO BLUE JMP GET_USER_INPUT COLORTHREE: MOV AL,02H MOV CURRCOLOR,AL ; CHANGE COLOR TO MAGNENTA JMP GET_USER_INPUT COLORFOUR: MOV AL,03H MOV CURRCOLOR,AL ; CHANGE COLOR TO WHITE JMP GET_USER_INPUT CHANGEBG: MOV AH,0BH ; TO CALL WRITE DOT PROCEDURE MOV BH,00H MOV BL,BGCOLOR ; GET CURRENT BACKGROUND COLOR ADD BL,01H ; GOTO NEXT COLOR MOV BGCOLOR,BL INT 10H ; DISPLAY NEW BACKGROUND COLOR JMP GET_USER_INPUT CHANGEPALETTE: MOV AH,0BH ; TO CALL WRITE DO PROCEDURE MOV BH,01H ; TO CHANGE PALETTE MOV BL,PALETTE ; GET CURRENT PALETTE ADD BL,01H ; GOTO NEXT PALETTE MOV PALETTE,BL INT 10H ; CHANGE TO OTHER PALETTE JMP GET_USER_INPUT MOVEUP: MOV AH,0CH ; TO CALL WRITE DOT PROCEDURE MOV AL,CURRCOLOR ; GET CURRENT COLOR SUB DX,0001H ; MOVE UP A ROW ON SCREEN JS ROWBOTTOM ; IF OFF SCREEN GOTO BOTTOM MOVEBOTTOM: INT 10H ; DRAW DOT JMP GET_USER_INPUT MOVEDOWN: MOV AH,0CH ; TO CALL WRITE DOT PROCEDURE MOV AL,CURRCOLOR ; GET CURRENT COLOR ADD DX,0001H ; MOVE DOWN A ROW ON SCREEN MOV BX,00A8H SUB BX,DX ; CHECK FOR BOTTOM OF SCREEN JZ ROWTOP ; IF AT BOTTOM, GOTO TOP MOVETOP: INT 10H ; DRAW DOT JMP GET_USER_INPUT MOVERIGHT: MOV AH,0CH ; TO CALL WRITE DOT PROCEDURE MOV AL,CURRCOLOR ; GET CURRENT COLOR ADD CX,0001H ; MOVE RIGHT A COLUMN ON SCREEN MOV BX,013AH SUB BX,CX ; CHECK FOR END OF SCREEN JZ COLUMNLEFT ; IF OFF SCREEN, GOTO LEFT SIDE MOVESMALL: INT 10H ; DRAW DOT JMP GET_USER_INPUT MOVELEFT: MOV AH,0CH ; TO CALL WRITE DOT PROCEDURE MOV AL,CURRCOLOR ; GET CURRENT COLOR SUB CX,0001H ; MOVE LEFT A COLUMN ON SCREEN JS COLUMNRIGHT ; IF OFF SCREEN, GOTO RIGHT SIDE MOVELARGE: INT 10H ; DRAW DOT JMP GET_USER_INPUT CLEAR_AGAIN: MOV AH,6 ; SCROLL UP MOV AL,0 ; BLANKING CODE MOV CX,0 ; SCREEN COORDINATES 0,0 MOV DL,79 ; SCREEN COORDINATES MOV DH,20 ; 79,24 INT 10H MOV DX,0066H ; STARTING ROW MOV CX,0070H ; STARTING COLUMN JMP GET_USER_INPUT BACK_TO_DOS: MOV AX,4C00H ; RETURN TO DOS INT 21H ROWBOTTOM: MOV DX,00A7H ; MOVE ROW TO BOTTOM OF SCREEN JMP MOVEBOTTOM ROWTOP: MOV DX,0000H ; MOVE ROW TO TOP OF SCREEN JMP MOVETOP COLUMNLEFT: MOV CX,0000H ; MOVE COLUMN TO LEFT OF SCREEN JMP MOVESMALL COLUMNRIGHT: MOV CX,0139H ; MOVE COLUMN TO RIGHT OF SCREEN JMP MOVELARGE CODE_HERE ENDS END