The sample program logoper.cbl, shown below, illustrates the use of bit manipulation routines. It uses three of the logical call-by-name routines, namely, CBL_OR, CBL_AND, and CBL_XOR.
working-storage section.
01 clr-char pic x value space.
01 clr-attr pic x value x"0f".
78 text-start value 29.
78 text-len value 23.
78 text-end value 51.
01 text-scr-pos.
03 text-row pic 9(2) comp-x value 12.
03 text-col pic 9(2) comp-x value text-start.
01 text-char-buffer pic x(text-len)
value "Text-in-various-colours".
01 text-attr-buffer.
03 first-word pic x(4) value all x"0f".
03 second-word pic x(4) value all x"2c".
03 third-word pic x(7) value all x"14".
03 third-space pic x value x"30".
03 fourth-word pic x(7) value all x"59".
01 text-length pic 9(4) comp-x value text-len.
01 char-read pic x.
01 char-length pic 9(9) comp-5 value 1.
01 quit-flag pic 9 comp-x.
88 not-ready-to-quit value 0.
88 ready-to-quit value 1.
01 csr-pos.
03 csr-row pic 9(2) comp-x value 12.
03 csr-col pic 9(2) comp-x value 39.
01 csr-attr pic x.
01 csr-length pic 9(4) comp-x value 1.
01 blink-mask pic x value x"80".
01 steady-mask pic x value x"7f".
01 invert-mask pic x(text-len) value all x"7f".
78 instr-len value 41.
01 instr-length pic 9(4) comp-x value instr-len.
01 instr pic x(instr-len)
value "Press (L)eft, (R)ight, (I)nvert or (Q)uit".
01 instr-pos.
03 instr-row pic 9(2) comp-x value 8.
03 instr-col pic 9(2) comp-x value 19.
procedure division.
main section.
perform init-screen
set not-ready-to-quit to true
perform until ready-to-quit
perform read-keyboard
evaluate char-read
when "L"
perform csr-move-left
when "R"
perform csr-move-right
when "I"
perform invert-text
when "Q"
set ready-to-quit to true
end-evaluate
end-perform
stop run
.
init-screen section.
call "CBL_CLEAR_SCR" using clr-char
clr-attr
call "CBL_WRITE_SCR_CHARS" using instr-pos
instr
instr-length
call "CBL_WRITE_SCR_CHARS" using text-scr-pos
text-char-buffer
text-length
perform put-attrs-on-screen
perform blink-cursor
.
read-keyboard section.
call "CBL_READ_KBD_CHAR" using char-read
call "CBL_TOUPPER" using char-read
by value char-length
.
csr-move-left section.
perform steady-cursor
subtract 1 from csr-col
if csr-col < text-start
move text-end to csr-col
end-if
perform blink-cursor
.
csr-move-right section.
perform steady-cursor
add 1 to csr-col
if csr-col > text-end
move text-start to csr-col
end-if
perform blink-cursor
.
blink-cursor section.
*> Turn on the blink bit at the current attribute.
call "CBL_READ_SCR_ATTRS" using csr-pos
csr-attr
csr-length
call "CBL_OR" using blink-mask
csr-attr
by value 1
call "CBL_WRITE_SCR_ATTRS" using csr-pos
csr-attr
csr-length
.
steady-cursor section.
*> Turn off the blink bit at the current attribute.
call "CBL_READ_SCR_ATTRS" using csr-pos
csr-attr
csr-length
call "CBL_AND" using steady-mask
csr-attr
by value 1
call "CBL_WRITE_SCR_ATTRS" using csr-pos
csr-attr
csr-length
.
invert-text section.
*> invert the bits that set the foreground colour, the background
*> colour, and the intensity bits, but leave the blink bit alone.
call "CBL_READ_SCR_ATTRS" using text-scr-pos
text-attr-buffer
text-length
call "CBL_XOR" using invert-mask
text-attr-buffer
by value text-len
perform put-attrs-on-screen
.
put-attrs-on-screen section.
call "CBL_WRITE_SCR_ATTRS" using text-scr-pos
text-attr-buffer
text-length
.
In the sample program, the section blink-cursor makes the cursor character (the character the cursor is pointing to) blink by its attributes. To see how you would create code to make the cursor blink, first consider the form of the display attribute. The following table shows the structure of the attribute byte for a personal computer with a monochrome display.
| Bit | Attribute |
|---|---|
| 7 | Blink |
| 6-4 | Turns off display or sets reverse video |
| 3 | Intensity |
| 2-0 | Normal or underline select |
Thus, for example, setting bit 7 to 1 turns blinking on. In the Working-Storage Section of the program, the mask for the "blink" attribute is defined as:
01 blink-mask pic x value x"80".
This hex value translates to the following bit pattern:
1 0 0 0 0 0 0 0
The CBL_READ_SCR_ATTRS routine reads the current attributes of the screen into an attribute buffer that in this case is one character long.
call "CBL_READ_SCR_ATTRS" using csr-pos
csr-attr
csr-length
The CBL_OR routine does a logical OR on the current attributes and the blinking mask. This in effect turns on the blinking attribute. Note that the length parameter is 1. This says the OR operation is for one byte.
call "CBL_OR" using blink-mask csr-attr by value 1
The CBL_WRITE_SCR_ATTRS routine writes the updated attributes buffer to the screen causing the character to "blink".
call "CBL_OR" using blink-mask
csr-attr
by value 1