Part III
by Robert Gault
This time we are going to look at a method to display BMP files on the Coco. This will not be a completely automatic process. First the graphics files must be converted with a graphics editor on your Windows computer to a 320x225x16 format. That is not too much to ask as there are several good editors that can be obtained from the internet for free.
Converting your files to a constant format greatly simplifies the task of writing a program to display them on the Coco. Other more complex programs are available for both OS-9 and Basic that do not require file pretreatment but these have code too complex to make a good article for a magazine.
Below your will find HLOAD.BAS and HLOAD.ASM. As in Part II, the Basic program is just a short loader for HLOAD.BIN and queries the user for a file name. The flow in HLOAD.BIN is as follows:
1) Set the input path to #1, the disk file initialized by the loader.
2) Skip through the header bytes and read the graphics mode. Test for 1
or 4 bit color and exit with an error if neither.
3) Adjust screen size and line width based on the file mode and inform
Basic.
4) Initiate the correct HSCREEN mode.
5) Read the palette colors from the file and convert them into palette
sets (see text)
6) Initialize the Coco palette with temporary colors to use during loading.
7) Load into memory the pixel data.
8) Initiate palette swaping to increase the color range from 64 to as many
as 1000 possible colors.
Most of the above was discussed going from Coco to Windows in Part II. What will be new here is a technique for displaying a palette range greater than 64 colors. Oldtimers with the Coco will remember that there have been Coco digitizers since the early ‘80s. One unit, RASCAN, had a most unusual option. It displayed pictures in color in a "4096" color mode with the claim that 4096 colors could be on screen at one time. This was achieved with a hardware separation of a color image into red, green, and blue components, which were displayed in dithered gray scale on three separate screens. On command, these screens were flipped through at a rate of 60Hz while changing the palette selection such that you saw alternately red, green, and blue screens. The composite effect was full color with a pronounced flicker.
An OS-9 program, viewgif, uses a two screen flicker and blends two color images which are close to but not the correct colors. The blend looks correct and the flicker is greatly reduced and almost not noticeable.
These methods work because our eyes are RGB devices. We see using light sensitive nerve cells located on the retina, the back surface of the eye. There are two type of optic nerves cones (color vision) and rods (nightime black and white). There are three types of cone cells distinguished by pigmentation which absorbs light of one of three colors, red, green, or blue. Therefore any method of blending red, green, or blue light will permit us to see in full color.
There is one more method that the Coco can use to blend color (excluding dithering which I won’t discuss) which is to have a single picture screen and change only the palette registers. There is an advantage in this method over the two just described in that less memory is used. The disadvantage is minimal consisting of a decrease in palette range but it occurs only because dithering is not used as it is in RASCAN or viewgif. Nevertheless, any 16 colors from a range of 1000 can be used per picture with a three palette flicker.
HLOAD offers two options chosen during the assembly process. You can choose the three palette cycle and get 1000 colors with noticeable flicker or a two palette cycle, 100 colors, and very little flicker. I have found the best choice depends on the picture being viewed. The obvious approach is to assemble both ways and select the method at run time.
Caveats
Note that the code in Part 1 saves a 320 by 192 image while the code here loads a 320 by 225 image. If you should want to reload saved images, you should modify HLOAD.ASM for a 320 by 192 screen.
Both HSAVE.ASM and HLOAD.ASM will attempt both RGB and CMP color sets.
I stand by the picture quality of the RGB option but not the CMP. The translation
table is from Spectral Associates book "Super Extended Basic Unravelled."
I could never get satifactory colors on my composite monitor using this
table. But if you read the explanation of RGB vs CMP colors in Part 1,
you may believe as I do that the task is almost hopeless.
10 DRIVE3:POKE&HE9,0:' 0=RGB 1=CMP
20 LOADM"HLOAD":' TRY COMPILING BOTH 2 & 3 PALETTE FLICKER
30 ONBRK GOTO70
40 PRINT:INPUT"INPUT FILE NAME WITHOUT EXTENSION";NAME$
50 OPEN"I",#1,NAME$+".BMP"
60 EXEC
70 RGB:PRINT"CONTINUE (Y OR N) ";
80 A$=INKEY$:IFA$="Y"THEN40ELSEIFA$=""THEN80
00100 * CONVERT BMP TO HGRAPHICS SCREEN 00110 * SINGLE SCREEN WITH 2 OR 3 PALETTE FLIPS PER CYCLE 00120 * (C) ROBERT GAULT FEB 1999 00130 00140 * SET CYCLE TO 2 OR 3 TO DETERMINE MODE OF ACTION 00150 CYCLE EQU 3 00160 00170 ORG $E00 00180 START LDD #$11D DISK BUFFER #1, COUNT = 29 00190 STA $6F SET CONSOLE OUT 00200 A@ JSR $A176 SKIP 28 BYTES IN HEADER, KEEP 29 00210 DECB 00220 BNE A@ 00230 PSHS A SAVE DATA 00240 * DETERMINE THE BMP MODE 00250 LDD #$10A0 16 COLORS, 160 BYTES PER LINE 00260 STA COLORS,PCR 00270 STB WLINE,PCR 00280 LDB #2 HSCREEN MODE 00290 STB $E6 TELL BASIC 00300 LDA ,S 00310 CMPA #4 IS THIS MODE 2? 00320 LBHI ERROR 00330 BEQ B@ 00340 LDD #$5002 BYTES PER LINE, COLOR COUNT 00350 STB COLORS,PCR 00360 INCB 00370 STB $E6 TELL BASIC THE HSCREEN MODE 00380 STA WLINE,PCR 00390 LDA ,S 00400 CMPA #1 IS THIS MODE 3? 00410 LBNE ERROR 00420 B@ LEAS 1,S 00430 JSR $E6A5 SET HSCREEN 00440 LDA #%1111110 $7E 00450 STA $FF99 SET 320X225X16 00460 LDB #25 SKIP TO PALETTE COLORS 00470 C@ JSR $A176 CONSOLE IN 00480 DECB 00490 BNE C@ 00500 LEAY PALET,PCR 00510 D@ LEAX DECODE,PCR POINT TO DECODER TABLE 00520 LBSR RGB GET BLUE VALUE 00530 LDA ,X+ SET PALETTES 00540 STA ,Y 00550 LDA ,X+ 00560 STA 16,Y 00570 COND CYCLE.EQU.3 00580 LDA ,X 00590 STA 32,Y 00600 LEAX DECODE+30,PCR 00610 ENDC 00620 COND CYCLE.EQU.2 00630 LEAX DECODE+14,PCR 00640 ENDC 00650 LBSR RGB GET GREEN VALUE 00660 LBSR TRANSL COMBINE WITH BLUE 00670 COND CYCLE.EQU.3 00680 LEAX DECODE+60,PCR 00690 ENDC 00700 COND CYCLE.EQU.2 00710 LEAX DECODE+28,PCR 00720 ENDC 00730 LBSR RGB GET RED VALUE 00740 LBSR TRANSL COMBINE WITH BLUE GREEN 00750 JSR $A176 SKIP A BYTE 00760 LEAY 1,Y UPDATE POINTER 00770 DEC COLORS,PCR 00780 BNE D@ 00790 TST $E9 00800 BEQ R@ 00810 LBSR RGBCMP CONVERT THE RGB COLORS TO CMP 00820 R@ LBSR LDSCRN SET INITIAL PALETTE COLORS 00830 * GET FOUR BLOCKS OF HIRES GRAPHICS AND SEND TO SCREEN 00840 LDB WLINE,PCR GET THE SCREEN WIDTH IN BYTES 00850 STB LCOUNT,PCR 00860 LEAU LINE,PCR POINT TO REVERSAL BUFFER 00870 CMPB #160 HSCREEN2 BYTE WIDTH 00880 BNE S@ 00890 LDA #$34 MMU BLOCK NUMBER 00900 STA $FFA2 $4000-$6000 00910 LDX #$4CA0 END OF SCREEN +1 00920 LDY #$CA0 BYTES IN LAST BLOCK 00930 BSR SEND MOVE THE SCREEN DATA 00940 LDA #$33 NEXT BLOCK NUMBER 00950 BSR MMUSET 00960 BSR SEND2 00970 LDA #$32 00980 BSR MMUSET 00990 BSR SEND2 01000 LDA #$31 01010 BSR MMUSET 01020 BSR SEND2 01030 LDA #$30 01040 BSR MMUSET 01050 BSR SEND2 01060 * RESET MMU REGISTER 01070 X@ LDA #$3A 01080 STA $FFA2 01090 CLR $6F SET CONSOLE OUT FOR SCREEN 01100 LBRA FLIP NOW DISPLAY THE PICTURE AND FLIP THE PALETTE 01110 S@ LDX #$4650 POINTERS FOR HSCREEN3 01120 LDY #$650 01130 LDA #$32 01140 STA $FFA2 01150 BSR SEND 01160 LDA #$31 01170 BSR MMUSET 01180 BSR SEND2 01190 LDA #$30 01200 BSR MMUSET 01210 BSR SEND2 01220 BRA X@ 01230 01240 MMUSET STA $FFA2 01250 LDX #$6000 01260 LDY #$2000 01270 RTS 01280 01290 SEND JSR $A176 CONSOLE IN 01300 STA ,U+ STORE IN BUFFER 01310 DEC LCOUNT,PCR 01320 BNE SEND 01330 LDB WLINE,PCR 01340 STB LCOUNT,PCR RESET COUNTER 01350 SEND2 LDA ,-U MOVE BUFFER TO MEMORY 01360 STA ,-X INVERTS SCREEN ABOUT HORIZON 01370 LEAY -1,Y FILLED MMU BLOCK? 01380 BNE C@ 01390 DECB 01400 RTS 01410 C@ DECB 01420 BNE SEND2 01430 LEAU LINE,PCR DO ANOTHER SCREEN LINE 01440 BRA SEND 01450 01460 TRANSL LDA ,X+ FILL PALETTE TRIFOLD 01470 ORA ,Y 01480 STA ,Y 01490 LDA ,X+ 01500 ORA 16,Y 01510 STA 16,Y 01520 COND CYCLE.EQU.3 01530 LDA ,X 01540 ORA 32,Y 01550 STA 32,Y 01560 ENDC 01570 RTS 01580 01590 COLORS RMB 1 01600 01610 ERROR CLR $6F 01620 LEAS 1,S RESET STACK, SEE START OF PROGRAM 01630 LEAX MESG-1,PCR 01640 JMP $B99C PRINT ERROR AND RETURN TO BASIC 01650 MESG FCC /SORRY BUT THERE IS NO MATCHING MODE!/ 01660 FCB 0 01670 01680 RGB JSR $A176 01690 PSHS X,B 01700 LEAX INTENS,PCR 01710 COND CYCLE.EQU.3 01720 LDB #9 01730 ENDC 01740 COND CYCLE.EQU.2 01750 LDB #6 01760 ENDC 01770 CLR ,S 01780 A@ CMPA ,X+ 01790 BLO B@ 01800 INC ,S 01810 DECB 01820 BNE A@ 01830 B@ LDB ,S+ 01840 COND CYCLE.EQU.3 01850 LDA #3 01860 MUL 01870 ENDC 01880 COND CYCLE.EQU.2 01890 LSLB 01900 ENDC 01910 PULS X 01920 ABX 01930 RTS 01940 COND CYCLE.EQU.3 01950 INTENS FCB 14,43,71,100,128,156,185,213,242 01960 ENDC 01970 COND CYCLE.EQU.2 01980 INTENS FCB 21,64,107,149,192,235 01990 ENDC 02000 02010 LDSCRN LEAX PALET,PCR GET TEMPORARY PALETTE COLORS 02020 LDY #$FFB0 02030 LDB #16 02040 A@ LDA ,X 02050 STA ,Y+ 02060 LEAX 1,X 02070 DECB 02080 BNE A@ 02090 RTS 02100 02110 PALET RMB 16 *BLUE 02120 RMB 16 *GREEN 02130 RMB 16 *RED 02140 COND CYCLE.EQU.3 02150 * RGB BLUE 02160 DECODE FCB 00,00,00,01,00,00,01,01,00,01,01,01,08,01,01 02170 FCB 08,08,01,08,08,08,09,08,08,09,09,08,09,09,09 02180 * RGB GREEN 02190 FCB 00,00,00,00,00,02,00,02,02,02,02,02,02,02,16 02200 FCB 16,02,16,16,16,16,16,18,16,16,18,18,18,18,18 02210 * RGB RED 02220 FCB 00,00,00,00,04,00,00,04,04,00,04,04,04,32,04 02230 FCB 04,32,32,32,32,32,36,32,32,36,36,32,36,36,36 02240 ENDC 02250 COND CYCLE.EQU.2 02260 DECODE FCB 00,00,01,00,01,01,08,01 02270 FCB 08,08,09,08,09,09 02280 02290 FCB 00,00,02,00,02,02,02,16 02300 FCB 16,16,16,18,18,18 02310 02320 FCB 00,00,04,00,04,04,32,04 02330 FCB 32,32,36,32,36,36 02340 ENDC 02350 02360 RGBCMP LEAX PALET,PCR 02370 LEAY CMP,PCR 02380 LDB #16 02390 A@ LDA ,X 02400 LDA A,Y 02410 STA ,X 02420 LDA 16,X 02430 LDA A,Y 02440 STA 16,X 02450 COND CYCLE.EQU.3 02460 LDA 32,X 02470 LDA A,Y 02480 STA 32,X 02490 ENDC 02500 LEAX 1,X 02510 DECB 02520 BNE A@ 02530 RTS 02540 02550 CMP FCB 0,12,2,14,7,9,5,16,28,44,13,29,11,27,10,43 02560 FCB 18,17,34,33,3,1,19,50,30,45,31,46,15,60,47 02570 FCB 61,23,8,21,6,39,24,38,54,25,42,26,58,24,41 02580 FCB 40,56,20,4,35,51,37,53,36,52,32,59,49,62,55 02590 FCB 57,63,48 02600 02610 LCOUNT RMB 1 02620 02630 *THREE-COLOR COLOR SYSTEM FOR THE COCO 320 MODE 02640 *SELECTABLE FOR RGB OR CMP COLORS 02650 02660 FLIP ORCC #$50 02670 LDD #$FF 02680 STA $FF40 02690 STS STACK,PCR 02700 BSR CLOCK 02710 STA $FFD9 SET FAST CPU CLOCK 02720 LDA #$7B SETUP FAST KEY TEST 02730 STA $FF02 02740 LOOP BSR PAL1 02750 BSR PAL2 02760 COND CYCLE.EQU.3 02770 BSR PAL3 02780 ENDC 02790 BSR KEYS 02800 BCS A@ 02810 BEQ LOOP NO KEYS 02820 A@ BRA EXIT 02830 02840 STACK RMB 2 02850 SPEED RMB 1 02860 02870 EXIT CLRA 02880 STA $E6 02890 A@ BSR KEYS 02900 BNE A@ 02910 JSR $E019 02920 JSR $173 02930 LDX #$FFD8 02940 LDA SPEED,PCR 02950 STA A,X SET CPU CLOCK SPEED 02960 LDS STACK,PCR 02970 ANDCC #$AF 02980 RTS 02990 03000 * FAST KEY TEST FOR COLOR OR EXIT; SPACEBAR OR BREAK 03010 03020 KEYS LDA $FF00 03030 COMA 03040 LSLA 03050 LSLA 03060 RTS 03070 03080 *$FF9D-$FF9E = VERTICAL OFFSET 03090 03100 PAL1 BSR VSYNC 03110 LEAX PALET,PCR 03120 BRA STORE 03130 03140 PAL2 BSR VSYNC 03150 LEAX PALET+16,PCR 03160 BRA STORE 03170 03180 PAL3 BSR VSYNC 03190 LEAX PALET+32,PCR 03200 BRA STORE 03210 03220 STORE LDB #16 03230 LDY #$FFB0 03240 A@ LDA ,X+ 03250 STA ,Y+ 03260 DECB 03270 BNE A@ 03280 RTS 03290 FLAG RMB 1 03300 03310 VSYNC LDA $FF02 03320 VLOOP LDA $FF03 03330 BPL VLOOP 03340 LDA $FF02 03350 RTS 03360 03370 CLOCK CLRB 03380 BSR VSYNC 03390 LDA $FF00 03400 CKLOOP INCB 03410 LDA $FF01 03420 BPL CKLOOP 03430 CLRA 03440 CMPB #6 03450 BLO SETSPD 03460 INCA 03470 SETSPD STA SPEED,PCR 03480 RTS 03490 03500 WLINE RMB 1 03510 SIZE RMB 2 03520 LINE RMB 160 03530 03540 END START