Write a program which will be used to view maps. Name the program xxmview (where xx is your starting number). The program will have one argument which specifies name of file with map definition. Format of the definition file is described bellow.
Map is a set of regions in our task. Each region has unique color. Each region is defined as unification of rectangular areas.
Your program should read definition file, parse it and show appropriate map on a screen. Then it will be possible to use mouse to select individual regions. Selection is done by clicking inside an area which belongs to the region. Selected region will then have highlighted border.
Interaction with the program can be canceled by pressing Esc key.
Each definition file is text file. The first line contains information about format level:
MDF/level
level can take one of the four following values: 1, 2, 3 and 4.
Subsequent lines contain definition of areas. Each line can contain only one definition in following format:
index X1 Y1 X2 Y2
index is used to specify region to which defined area belongs. index can take value from 1 to 239. Following four integers are coordinates of upper-left and bottom-right corner of rectangle which defines border of area.
X-coordinates can take value from 0 to 319; theirs Y counterparts are from 0 to 199.
Areas in definition file are non-overlapping.
For displaying you should use graphics mode 320 x 200 x 256 (VGA mode 13h).
Index of the region in the definition file should be used as index to palette when choosing color for displaying that region. In following table you can examine how individual entries are defined in the palette:
| Index (I) | Red | Green | Blue |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 1-239 | ((I shr 5) * 255) div 7((I >> 5) * 255) / 7 |
(((I shr 2) and 7) * 255) div 7(((I >> 2) & 7) * 255) / 7 |
(I and 3) * 255) div 3(I & 3) * 255) / 3 |
| 240-254 | Free for you personal use | ||
| 255 | 255 | 255 | 255 |
Your program and all its modules should be stored in the
directory C:\ICP. Name the modules in such way that
the two first letters of its name are your starting number.
Write your starting number, a list of all used modules and a list of levels which are supported in your program as a comment at the beginning of the program.
There are several
files with extension mdf in the directory C:\ICP.
These files contain definitions of several maps and you can use
them for testing purposes. There is also mapview
program which presents simple sample solution of the task.
Permitted aid is English vocabulary, books which describe programming language, its environment (IDE) and standard libraries. You can not use books with description of various methods, algorithms and data structures.
You can get total of 100 points. 60 out of them are used for evaluating functionality, 30 for evaluating efficiency (smart and fast algorithms, sophisticated data structures). Last ten points are used for documentation (description of algorithm, comments, naming convention, neat way of writing code).
| Part | Maximal no. of points assigned for functionality |
|---|---|
| Support for level 1 files | 5 |
| Support for level 2 files | 15 |
| Support for level 3 files | 10 |
| Support for level 4 files | 15 |
| Smoothness of border scrolling and overall graphics design | 15 |
Following are an excerpts from Ralph Brown's Interrupt list:
------------------------------------------------------------------------
INT 10 - VIDEO - SET VIDEO MODE
AH = 00h
AL = mode
Desc: specify the display mode for the currently active display adapter
------------------------------------------------------------------------
INT 10 - VIDEO - GET CURRENT VIDEO MODE
AH = 0Fh
Return: AH = number of character columns
AL = display mode
------------------------------------------------------------------------
INT 10 - VIDEO - SET INDIVIDUAL DAC REGISTER (VGA/MCGA)
AX = 1010h
BX = register number
CH = new value for green (0-63)
CL = new value for blue (0-63)
DH = new value for red (0-63)
------------------------------------------------------------------------
INT 10 - VIDEO - SET BLOCK OF DAC REGISTERS (VGA/MCGA)
AX = 1012h
BX = starting color register
CX = number of registers to set
ES:DX -> table of 3*CX bytes where each 3 byte group represents one
byte each of red, green and blue (0-63)
------------------------------------------------------------------------
INT 33 - MS MOUSE - RESET DRIVER AND READ STATUS
AX = 0000h
Return: AX = status
0000h hardware/driver not installed
FFFFh hardware/driver installed
BX = number of buttons
0000h other than two
0002h two buttons (many drivers)
0003h Mouse Systems/Logitech three-button mouse
FFFFh two buttons
------------------------------------------------------------------------
INT 33 - MS MOUSE v1.0+ - SHOW MOUSE CURSOR
AX = 0001h
------------------------------------------------------------------------
INT 33 - MS MOUSE v1.0+ - HIDE MOUSE CURSOR
AX = 0002h
Note: multiple calls to hide the cursor will require multiple calls to
function 01h to unhide it.
------------------------------------------------------------------------
INT 33 - MS MOUSE v1.0+ - RETURN POSITION AND BUTTON STATUS
AX = 0003h
Return: BX = button status (see #1699)
CX = column
DX = row
Note: in text modes, all coordinates are specified as multiples of the cell
size, typically 8x8 pixels
Bitfields for mouse button status:
Bit(s) Description (Table 1699)
0 left button pressed if 1
1 right button pressed if 1
2 middle button pressed if 1 (Mouse Systems/Logitech/Genius)
------------------------------------------------------------------------
INT 33 - MS MOUSE v1.0+ - DEFINE INTERRUPT SUBROUTINE PARAMETERS
AX = 000Ch
CX = call mask (see #1702)
ES:DX -> FAR routine (see #1703)
SeeAlso: AX=0018h
Bitfields for mouse call mask:
Bit(s) Description (Table 1702)
0 call if mouse moves
1 call if left button pressed
2 call if left button released
3 call if right button pressed
4 call if right button released
5 call if middle button pressed (Mouse Systems/Logitech/Genius mouse)
6 call if middle button released (Mouse Systems/Logitech/Genius mouse)
7-15 unused
(Table 1703)
Values interrupt routine is called with:
AX = condition mask (same bit assignments as call mask)
BX = button state
CX = cursor column
DX = cursor row
SI = horizontal mickey count
DI = vertical mickey count
------------------------------------------------------------------------