When Fig-Forth v2 is executed a wide variety of tests are performed, the most significant of which is the system video card detection. Though it has been recognized that not all cards are properly identified, during this process the screen is changed to a high resolution, palette oriented mode, then returned to a text oriented system. To date, only those cards which utilize their own ROM based BIOS will fail these tests, which becomes immediately apparent when Fig-Forth calls the PC-BIOS routine for selecting the 80 column by 25 line text mode. For these cards to operate with Fig-Forth, a VESA compatible driver extension is recommended.
Fig-Forth v2 has extensive routines in the area of on screen graphics, this goal being the primary focus of all current modification to the kernel code. While most of these changes have been "behind the scenes" in the area of improving the interface, most major versions of VGA and SVGA cards have been supported in the standard color modes mentioned below. Some few cards may "lock up" when Fig-Forth is executing the tests for determining the type of DAC access granted, though the use of a VESA driver should clear up these concerns. (Contact me if your card is one of those with problems.) The use of VESA 1.2 or later is assumed in the event that your card is not supported presently, with the calls made to VESA based upon the 1.0 standard.
Fig-Forth v2 offers 18 possible graphic video modes, primarily designed for the building of Graphical User Interfaces to application programming. Two of the available modes are based upon standard BIOS operational settings, four others are VESA compatible and the last 12 are variations of the mode 13 extended definition. The MGR word sets the screen to a 640 by 480 16 color mode, using BIOS for text output. The four VESA modes are listed below;
word | params | X resolution | Y resolution |
HGR |
-none- |
640 |
480 |
HGR1 |
-- f |
800 |
600 |
HGR2 |
-- f |
1024 |
768 |
HGR3 |
-- f |
1280 |
1024 |
All modes listed above and those variants of the BIOS 13h definition operate in a 256 color, palette oriented method for Fig-Forth v2. For read-write operations the compiler attempts to define a single page of video memory, using a bank offset operation.
Mode 13 variants start with the HGR13 word, which sets the screen into the BIOS 320 by 200 pixel orientation with 256 colors. All other modes are accessed through the word of HGR13?, with the exception of the highest variant which can be achieved by HGR13X. Please note that BIOS is incapable of plotting text on the screen in any of these settings, so the Font Printer described below must be used for these modes. All of these extended modes operate in a Four Bank, 256 color, mixed signal setting possible in standard VGA cards and above, offering multiple pages, hardware scrolling, and palette editing. The full collection of video modes are listed below;
Mode# | Resolution | mode# | resolution |
0 |
320x175 | 6 |
360x175 |
1 |
320x200 | 7 |
360x200 |
2 |
320x240 | 8 |
360x240 |
3 |
320x350 | 9 |
360x350 |
4 |
320x400 | 10 |
360x400 |
5 |
320x480 | 11 |
360x480 (HGR13X) |
To set any variant place the numeric value listed above on the parameter stack and call function HGR13?, which will set up the screen values, switch modes and clear the video RAM buffer. HGR13X does this internally, by selecting the video number of 11 above. For those variants of the HGR process that return a flag value, the flag returned shall be False if the operation succeded upon the given hardware, or True if the VESA driver installed could not select the mode desired.
At the same time that any mode is selected, Fig-Forth will place the video mode class of interface into the system variable VMODE, which carries the following meanings;
High Byte (number) | Low Byte (bit values) |
0=Text 80x25 | 0=normal mode (lowest priority) |
1=320 widths | 1=XOR mode (highest priority) |
2=360 widths | 2=direct mode (next priority) |
3=VESA Mode | 4=mask mode (over-ride priority) |
4=640x480x16 |
The lower byte value of "Normal" screen mode is a direct write of the color given to the graphic function called, overwriting the index that exists on the page. XOR mode performs a logical XOR of the color specified with the index currently in the screen memory, "inverting" the color upon a black screen. Direct mode is used by the Font Printer for cursor functions and un-write characters, so user programs are not expected to call upon this operation. Mask mode is primarily used for the GETPIC and PUTPIC user functions defined below, which copy and paste graphic images to the screen. In mask mode these functions skip any pixel given the value of zero or normally black, to make "cut throughs" and other window effects. See GETPIC and PUTPIC for more information. In all of the above graphic modes Fig-Forth v2 displays the mouse by its own internal routines, due to the use of video modes that many mouse drivers do not comprehend. (See MOUSE, Basic Input and Output.)
Changing the video mode variable directly can be achieved by the appropriate memory access words, however changing the upper byte without specifying a mode word is unpredictable. Programs should access only the lower portion in normal operation, for changing the upper byte switches the driver interface being used by Fig-Forth. All video mode words set this variable's high byte to the proper value when executed, and select the write mode of normal. Note that video mode 1, the 320 wide mode, is selected in the event that Fig-Forth cannot identify the video card being used and no VESA is detected when the HGR word is executed.
Finally, the TEXT word is used to return the screen to the 80 column by 25 line text display, which automatically reverts to Fig-Forth's internal screen handler.
Fig-Forth implements the graphical screen with its own internal drivers, which are somewhat faster than the equivalent BIOS routines. At this time all image management is handled internally by Fig-Forth, not calling upon any card specific speed-up routines or other extensions. Some of these internal routines will produce noticeable delays in the performance of their function, primarily the CLS routine which calls SQUARE to wipe the screen display. Therefore, application programs should avoid "brute force" methods of access to the video area when attempting to achieve higher frame rates, and include the use of coded speed-up routines defined in the user task.
VSYNC
This function is provided as a means of tuning the application program to the video display's retrace cycle, performing a delay until the next frame of display is about to begin. With judicious use of this function user programs can set a system independent speed of operation, using the vertical retrace as a time base delay.
HSYNC
This function is provided as a means of tuning the application program to the video display's horizontal blanking signal, performing a delay until the next line of the display is about to begin. This signal has a finer tuning value than VSYNC above.
VSTART
This function sets the top memory address of the current display screen, in number of bytes from the start of the video RAM buffer. For every screen line in the 13x modes this value is equal to one-fourth the current horizontal resolution in pixels times the numbers of lines to be offset. Using this value multiple graphic pages may be defined, providing vertical and horizontal scrolling operations, split screen and other effects. Programmers should note that this value is an integer in the mode 13 variants, (max offset 65,535) while in the HGR modes this function requires a double word value. In HGR modes the double word selects both a horizontal and vertical offset, each defined as an integer half of the parameter given.
VOFFSET
This word points to a double word integer, the values contained being used for all plotting functions with Fig-Forth's graphic calls. The address returned points to the Y offset in lines and the address plus 2 contains the X offset in pixels. When used as a double number, the Y value is the top of the stack. This variable must be set to zero before any plotting is performed on any defined status display mentioned below. The programmer should note that the combined pixel offset of this variable and the plotting location will wrap around the left and right edges of the defined display page, while vertical offsets will proceed to the next display page or the status screen if these are defined as aligned to each other in the display RAM. Please note that these values plus any plotted location(s) cannot exceed 2048 lines or the current scan line length for any mode selected.
VSPLIT
This function is used to set the Line Compare Register of the CRT Controller chip, defining the number of lines on the current display page before the CRTC jumps to the top of the video RAM segment. Note that this function used alone will bear no meaning to the CRT hardware, so a new value of VSTART must be defined to complete the split operation. This value also must be defined as double the line count in certain modes, following the requirements of the CRTC hardware. Because of the manner in which Fig-Forth accesses the video segment, any desired plotting on the status screen produced by this function must be performed with the double variable VOFFSET set to zero.
VPAN?
This is a one time call function to enable the Horizontal Pixel Pan abilities of the CRTC hardware, such that any defined status display remains in the zero column while the active window shifts by individual pixels. Note that this function cannot be disabled after this routine has been called, short of calling BIOS to set up the CRT Controller hardware into a reset state. (E.g., TEXT mode.)
VPAN
This function is used to pan the current display Horizontally by pixels, selecting Bank 0, Bank 1, 2 or 3 as the starting column for the active display. This word requires a single parameter on the stack which is ANDed by 3 and then sent to the controller, after a wait for a retrace to begin before shifting the value. Programmers should note that the apparent direction of the sequence 0-1-2-3 is panning to the right, while 3-2-1-0 pans the screen to the left. For complete panning beyond the value of 4 pixels the VSTART value should be incremented for right pans and decremented for left pans after using this function and achieving a pixel column of zero.
VTBL
This word returns the system variable address of the current screen video table, comprising a short structure of additional control values. The initial address points to the memory location of the current screen's height in lines, followed by the width in pixels, the offset values, Font Printer cursor flash speed, the scan line length and the X and Y skew correction values. While modifying these values is not outlawed by the compiler the result can be unpredictable, so only through experimentation and advanced techniques should these values be changed. The assembly structure below defines these entries;
maxy | word | 480 | ; maximum Y value allowed |
maxx | word | 640 | ; maximum X value allowed |
scrofs | word | 0 | ; Double Word offset for plot routines Y |
word | 0 | ; X | |
flashr | word | 5000 | ; Font printer flash speed |
scanline | word | 90 | ; The screen width in CRTC bytes |
corr | byte | 1 | ; Skew correction values used. |
byte | 1 |
WR1
This function is used to "fast paste" images from one location in the video segment to that of another, using the four plane write mode available in the video hardware. During this time all CPU data is ignored by the card and the move uses data contained in the memory access latches, four pixels per operation that coincide with each memory address of the four display planes. (See Part 2, Graphics Display Theory.) Note that during this process the system interrupts are disabled, causing potential conflicts with the digitized sound player should a refresh be required by the routine. (See Sound Card.)
Lastly, the value at dictionary location 6 points to the end of the video address table (and to the modem buffer) such that specialized line lengths and user screens may be defined. A complete examination of these functions and operations can be found in Under The Hood and The User's Guide.
Fig-Forth contains many plotting functions available to the user, these functions outlined in the following table. Note that if a function is called and the screen is not currently in a graphics mode, Fig-Forth v2 will automatically select the mode of HGR if possible.
word | stack | function |
BOX | x y h w c -- | draws a box of color c, height h, width w, with upper left corner at x and y |
?BOX | x y h w c -- f | does pixel detect for a box of color c, height h, width w, with upper left corner at x and y |
GETPALETTE | adr n c -- | get n color values from the current palette starting with index c, place into table at the address given. |
GETPIC | adr w h x y -- | get video image from screen to buffer at adr for w width, h height and location x and y |
LINE | x y x1 y1 c -- | draws a line of color c from x and y to x1 and y1 |
?LINE | x y x1 y1 c -- f | does a pixel detect for a line of color c from x and y to x1 and y1 |
MAXX | -- x | returns the maximum X coordinate |
MAXY | -- y | returns the maximum Y coordinate |
PLOT | x y c -- | plot pixel of color c at x, y |
?PLOT | x y -- c | return pixel color of x, y |
PUTPIC | adr w h x y -- | put video image on screen from buffer at adr for w width, h height and location x and y |
SETPALETTE | adr n c -- | set n color values from the table at adr to the current palette starting with index c. |
SQUARE | x y h w c -- | draws a square of color c, height h, width w, with upper left corner at x and y |
?SQUARE | x y h w c -- f | does pixel detect for a square of color c, height h, width w, with upper left corner at x and y |
CIRCLE | x y ro c ri -- | draws a circle of color c, outer radius of ro, inner radius of ri, with center at x and y |
?CIRCLE | x y ro c ri -- f | does pixel detect a circle of color c, outer radius of ro, inner radius of ri, with center at x and y |
The programmer should note that all pixel detection routines "short circuit" upon the first positive collision with the desired color index, and do not make allowances for any sprite located in the area of the detected collision. These detection routines are intended for bounding box operations only.
To meet the needs of producing a text printout in all of the video modes offered by Fig-Forth v2, the Forth kernel has been integrated with a bit map font generator which can be called upon during the use of the graphic modes. This generator contains several values for font scaling, pixel positioning, and file drivers for accessing both fixed and proportional fonts of monographic or color data. Four internal fonts are available as of the date of this manual, and font formats are outlined in Appendix B. At present it is not recommended that user programs attempt to load fonts into the system kernel area, as that space is reserved for system patches and utilities.
To use the Font Printer Fig-Forth extends the definitions of many video control variables, as in the CUR (cursor) is comprised of an X component and Y component in a double word. Unlike the Text cursor which must be located at an evenly divisible value, the graphics cursor can be located anywhere upon the current display page. (Or even off the page in some cases.) When the Font Printer is activated the cursor location appears as a blinking vertical line the height of the current font, using the colors stored in the ATTR and ATTRB variables.
As with the cursor the Attribute variable is interpreted differently when the Font Printer is engaged, ATTR containing the color of the ink used on the screen and ATTRB containing the color of the paper. At this time, any value stored in the Text mode ATTR-1 location is lost when the font printer is engaged, as this value has no meaning to graphical printing. All window control variables are set to the graphics mode selected, the horizontal width in pixels is sent to VWIDTH, the vertical height in lines is sent to VLENGTH, and so on. All screen control values operate in the same manner as that described for Text modes, using the word values stored into them. User programs should take care to select a suitable ink color before switching back to text mode, preferably the values of 14 or 15 upon the standard palette.
The Font Printer is engaged with the >FONT command, which selects the default font unless one has been specified previously. This default font is an 8 pixel wide by 8 line high double dot font, offering the standard 80 or 90 characters across the screen line depending upon the video mode selected. Which font is to be used is selected by the word FONT and value given it, the range of internal fonts and their resolutions being listed in Table 7-4.
value | type | resolution |
-1 | fixed | 8x8 double-dot |
-2 | proportional | Nx8 double-dot |
-3 | mixed | Nx8 single dot/8x8 double dot |
-4 | proportional | Nx7 single dot |
Fonts may be freely intermixed anywhere upon the display page, and no scrolling takes place when printing at the end of the display window. Use the command words of HOME to set the cursor at the top left of the current window (or store a double zero in CUR) and CLS to clear the screen to the color stored in ATTRB. Each character printed is painted via the graphic square function, allowing the font size to be adjusted by setting the values of variables FX* and FY*. Font smoothing is not currently implemented.
Additional font control is available with the variables EFS and EFL, which control the amount of extra font spacing between characters and extra font leading respectively. Note that the font printer is disengaged when returning to the Text mode of operation by executing the word >EMIT.
Because font typefaces may be either fixed pitch or proportional, the font printer allows for "un-write" characters to be sent through EMIT. Such characters are defined as their 16 bit negated ASCII values, which will command the font printer to use the character's width for the purpose of erasure. While not always accurate an ASCII Backspace character can be substituted for an un-write character, in which case the font printer will attempt to erase the character until a solid vertical column of background pixels is located or it has covered the maximum character width as indicated in the font parameter table.
As mentioned in Chapter 3 on Strings, the Video vocabularly also contains the word SIZE$ for determining the size of a text string as the Font Printer will create it upon painting. This allows the setting of window boxes or justification for the contained text, as in flush left, right or center operations. This word is designed to be used with the comma-quote word operation (,") such that the string length is processed minus the last character. (The zero terminator in ,".) The address of the counted string should be on the stack, and the X and Y size will be returned by the function. Note that this operation takes into account the EFS, EFL, FX* and FY* values mentioned above, and uses the currently active font as the base.
Fonts may also be used in the Mask Mode of operation described under the Graphics section, causing the font's background color to appear transparent. For this to take place the ATTRB system variable is defined as the color of the invisible background, with all other pixel colors in the font sent directly to the screen. This includes that of the ink color, ATTR. You should note that backward erasure does not take place while in this mode of operation, and that fonts will appear "heavier" than their normal mode counterparts. (From the surrounding pixels not causing erasure of the points in the characters.) Thus this mode of operation may be called as a BOLD function for some fonts, but others will not increase in weight by the same amount.
Just as a font may be memory based, Fig-Forth v2 also allows fonts to be contained in a file. Such fonts have the same structure as those located in the system kernel area, but are addressed through the file access system. To select such a font the starting block number of the font file is to be located on the stack at the time of the execution of the FONT word, then the >FONT word is executed. As before, EFS, EFL and FX* and FY* control the final manner in which the font is printed, using the colors of ATTR and ATTRB for monographic fonts or their color indexes for color definitions.
Fig-Forth v2 offers 3 distinct methods for the use of files within its operation; Text, Screen or Block and Binary. Each of these modes can be freely mixed without restriction, because Forth treats all disk access as character based devices. Fig-Forth contains 4 disk buffer areas comprised of 1024 bytes each, which are used sequentially to meet disk drive operations. The address of the last accessed buffer is located in the system variable LAST-USED and the next buffer to be accessed is contained in the system variable USE. Once a buffer is accessed it can be marked as changed by the word UPDATE, which sets a bit flag in the LAST-USED buffer. Because the value of LAST-USED can change with each subsequent disk read or write, functions accessing the buffers are expected to retain the address returned by BLOCK or VBLOCK while performing their function, and to mark the used block as updated before they release the buffer or another disk access occurs.
Once a buffer has been filled or assigned a file location, the area can be accessed as any other section of the dictionary space. All memory access words, string acceptance, find or print commands, even executable token lists can be assigned or transferred to this region. Using the BLOCK word will read the associated file from the open file list for the length of the buffer or the length of the file whichever is less. The number of bytes read is stored in the variable BYTES-MOVED. The location of the read is the multiple of 1024 bytes times the single precision value on the parameter stack at the execution of BLOCK. However, all disk writes will convey the full length of the buffer area and extend the assigned file if its length is smaller.
Because BLOCK access is universally a 1024 byte process, Fig-Forth v2 offers the VBLOCK word. Similar to BLOCK in function this word accepts a double word value upon execution, using this number as a byte offset to set the beginning pointer of the read to be performed. When such a buffer area is marked as updated the same rules as BLOCK assigned buffers apply, meaning the file will be extended as necessary to convey the full buffer contents upon writing.
Fig-Forth v2 contains two virtual file pointers in the system variable space, accessed by the words of VPTR1 and VPTR2. These variables are double number type for use with VBLOCK, plus the following virtual file words;
word | stack | does |
VADDR | d -- adr | accepts a double word number and returns the buffer address for the relative location. The buffer is loaded if the targeted block is not in memory. |
VC@ | d -- c | returns the file byte pointed to by the double word number given at execution. |
V2@ | d -- n | returns the single precision number at the given double word address in the file. |
V4@ | d -- d | returns the double precision value in the file at the double word location given at execution. |
VC! | c d -- | stores the byte c in the file at the double word location given in d. |
V2! | n d -- | stores the single precision value in the file at the double word location on the top of the stack. |
V4! | d1 d2 -- | stores the double number d1 in the file at the location of d2 in bytes. |
VC> | adr -- c | returns the byte pointed to by the contents of the double word variable address given it at execution. The buffer is loaded if required and the variable contents are incremented. |
V2> | adr -- n | returns the single precision value pointed to by the contents of the double word variable address given it at execution. The buffer is loaded if required and the variable contents are incremented by 2. |
V4> | adr -- d | returns the double precision value pointed to by the contents of the double word variable address given it at execution. The buffer is loaded if required and the variable contents are incremented by 4. |
>VC | c adr -- | stores the byte in the file at the location pointed to by the contents of the double word variable address given it at execution. The buffer is marked as updated and the variable contents are incremented. |
>V2 | n adr -- | stores the single precision value in the file at the location pointed to by the contents of the double word variable address given it at execution. The buffer is marked as updated and the variable contents are incremented by 2. |
>V4 | d adr -- | stores the double precision value in the file at the location pointed to by the contents of the double word variable address given it at execution. The buffer is marked as updated and the variable contents are incremented by 4. |
VREC> | d adr n -- d | reads n bytes into the memory buffer at adr from file location d. Advances and returns the new double file address. |
>VREC | d adr n -- d | writes n bytes into the file from buffer at adr at location d. Advances and returns the new double file address. |
1KU/MOD | d -- o b | File addressing helper operation; Divide double d by 1024 and return integers of block b, offset o pointing to addressed byte location. Called by VADDR. |
All writes update the associated buffers but do not flush the buffers to the file system unless the buffer is accessed by the kernel for the read of a different location of the file. Use the FLUSH word to ensure that all writes have been sent to the file in question, or EMPTY-BUFFERS to abandon the changes.
In the interest of making programs more distinctive Fig-Forth v2 offers 2 internal drivers for accessing legacy system sound cards, utilizing the DSP player and FM synthesizer. The words that control this function are located in the SOUND vocabulary, and offer 8 bit wave generation and 9/18 channel music. This interface consists of 8 words and functions;
SOUND?
This function intercepts the interrupts required by the sound card, attempting to use the DOS system environment pool for the required values and then making verification tests that a sound card exists. In addition this function also reports the status of the sound card in regard to the following operations, such that user programs can test for the completion of a sound card event. The output from this function is a bit mapped parameter placed upon the Forth stack, with bit 0 being true when a sound card is detected, bit 1 indicating that a wave is being processed, and bit 2 indicating a synthesizer song is running. This function may be called any number of times, and looks for the environment setting of "BLASTER=" or "SOUND=A### I# D#" for address, interrupt and DMA channel respectively.
QUIET
This function stops all sound output, disables Fig-Forth's drivers and removes the interrupt intercepts, so should be called before any user program transfers to BYE.
PLAY"
This function opens the disk file as specified after the command to the next quotation mark and transfers its handle to the Fig-Forth DSP player, adjusting to the saved speed of sample rate for the length of the file. When Forth reaches the end of the file the handle is automatically closed. File handles are not saved as part of the Fig-Forth file space, but names are added to the dictionary space in a format similar to the OPEN word without a block number required. Programmers should note however that Fig-Forth uses two 4096 byte buffers for this basic sound interface, so high sampling rates may sound incorrectly as DOS delays slow file access. Sound files should adhere to the RIFF Wave standard present in Windows or its utilities, comprised of 8 bit samples, monaural generation, and one data block without other headers. Example;
PLAY" CHIMES.WAV" - play the Windows chimes file.
At present, the recommended sampling rate should be 12K/Sec or less for best operation.
<PLAY>
This function performs the same operation as the above but the value handed to the word is the address of the string that defines the file to be played, with the same limitations as listed for PLAY". Sample source line;
: SOUND1 ," CHORD.WAV" <PLAY> ;
Note that if a <PLAY> command is attempted when a sound is already playing it will generate a disk access error. (See -PLAY below.)
-PLAY
This function stops the current sound and disables the DSP connection to the speaker output, closing any active file and resetting the buffers. A common use of this command is in the case of stopping a currently played sound in favor of another;
: SND1 SOUND? 2 AND IF -PLAY THEN ," DING.WAV" <PLAY> ;
Note that in using this definition the sound card output will be initiated if it has not been performed earlier. (Transparent initialization.)
SONG"
This function opens a synthesizer file and transfers its handle to the FM player, providing 9/18 channel music for the length of the file. As with PLAY" the file is closed automatically when its end has been reached, and file names are added to the dictionary space. Note that the format of these files is a specialized one, outlined in Appendix A. Fig-Forth uses a 2K buffer for the purpose of pre-reading the MIDI similar file data, which is automatically scrolled as the song track is played. Example;
SONG" GAME.4FM" - play the sample music track.
<SONG>
This function is used in the same manner as <PLAY> but directs the file handle to the FM player code.
-SONG
This word halts the current FM track playing and closes the associated file, disconnecting the timing interrupt.
Finally, at location 10 in the dictionary space Fig-Forth contains the kernel internal address to the 32 bit Mute variable, which selectively turns off any channel being called by the FM player. While user programs are not expected to access this value during normal operation, it is provided for use by any tracking software created for building song files. The format of this variable is a bit mapped operation; channel 0 in bit 0, channel 1 in bit 1, etc., followed by a second word of the same for the second synthesizer chip in stereo cards. A 1 in any position means the channel is active, a 0 meaning the channel is muted.
The final device in Fig-Forth is the platform operating system or hardware programming, of which five basic commands are provided. These are intended to provide access to other features of DOS or BIOS and these commands are not documented. It is up to the programmer to know all the parameters and register settings required by these interrupts, using a reference such as that listed in the acknowledgments item 4.
DOS
This word makes a call to interrupt 21 hex, using parameters for the DX, CX, BX and AX registers. Upon return the AX register and any carry is returned, while both DS and ES are set to the user space during operation.
INT#
Like the DOS call this word requires the parameters for DX, CX, BX and AX for input, then the interrupt value to be called. Upon return this word returns the same compliment of registers, along with any carry status. (DX, CX, BX, AX and carry.)
GETINT#
This word retrieves the current interrupt vector of the value given it, returning a double word on the stack that represents the vector. This call is recommended before setting any interrupt vector mentioned below, such that the vector can be restored.
SETINT#
This word requires a double value that represents the offset and segment of the new interrupt vector, followed by the interrupt number that is to be changed.
CMD"
Finally, this word will parse out the next quote delimited string and attempt to shell out to the DOS command.com program, sending the string as the parameter. If the memory cannot be allocated or is locked for any reason, this word will generate an error.
Return to Contents. Next Chapter. Previous Chapter.