I am not a robot. I promise.

  • 31 Posts
  • 1.66K Comments
Joined 3 years ago
cake
Cake day: July 9th, 2023

help-circle




  • Sure, have at it!

    Sorry it’s not a full complete dump with examples, but it’s programmed in QBasic 1.1 and converts raw RGB pixel data into equivalent closest matching color halftone onscreen characters. I designed it in mind with DOS text modes of either 80x25, 80x43, or 80x50 text modes, but I’m sure the technique can work with any text mode that can properly render the old DOS block characters. But, I’m betting that whatever device you’re using right now is almost certainly not configured to display the old DOS block characters as they were back in the day.

    Good luck!

    REM TEXTPSET.BAS
    REM over_clox - February 26, 2008
    
    DECLARE SUB DisplayRAW (FileName$, W%, H%)
    DECLARE SUB TextPSet (X%, Y%, R%, G%, B%)
    DECLARE SUB TextPixel (Red%, Green%, Blue%, Char$, FGround%, BGround%)
    DECLARE SUB HTMtoRGB (HTMColor$, Red%, Green%, Blue%)
    
    TYPE PaletteType
        R AS INTEGER
        G AS INTEGER
        B AS INTEGER
    END TYPE
    
    REDIM SHARED DOSPalette(15) AS PaletteType
    REDIM SHARED FakePalette(15, 7, 1 TO 3) AS PaletteType
    
    RESTORE
    FOR I% = 0 TO 15
        READ HTMColor$
        HTMtoRGB HTMColor$, R%, G%, B%
        DOSPalette(I%).R = R%
        DOSPalette(I%).G = G%
        DOSPalette(I%).B = B%
    NEXT
    
    FOR C% = 1 TO 3
        C2% = 4 - C%
        FOR B% = 0 TO 7
            FOR F% = 0 TO 15
                R1% = DOSPalette(F%).R: R2% = DOSPalette(B%).R
                G1% = DOSPalette(F%).G: G2% = DOSPalette(B%).G
                B1% = DOSPalette(F%).B: B2% = DOSPalette(B%).B
                FakePalette(F%, B%, C%).R = (R1% * C% + R2% * C2%) \ 4
                FakePalette(F%, B%, C%).G = (G1% * C% + G2% * C2%) \ 4
                FakePalette(F%, B%, C%).B = (B1% * C% + B2% * C2%) \ 4
            NEXT
        NEXT
    NEXT
    
    'MS-DOS Text Mode 16 Color Palette
    DATA 000000,0000AA,00AA00,00AAAA,AA0000,AA00AA,AA5500,AAAAAA
    DATA 555555,5555FF,55FF55,55FFFF,FF5555,FF55FF,FFFF55,FFFFFF
    
    CMD$ = COMMAND$
    IF CMD$ <> "" THEN
        DisplayRAW CMD$, 80, 25
    ELSE
        DisplayRAW "LOGO.RAW", 80, 25
    END IF
    
    'DEF SEG = &HB800: BSAVE "LOGO.BSV", 0, 4000
    
    COLOR 7, 0
    
    DO: Hit$ = UCASE$(INKEY$): LOOP WHILE Hit$ = ""
    
    SUB DisplayRAW (FileName$, W%, H%)
    
        FileNum% = FREEFILE
        OPEN FileName$ FOR BINARY AS FileNum%
        CLS : WIDTH W%, H%
        ScanLine$ = SPACE$(W% * 3)
        FOR Y% = 0 TO H% - 1
            GET #1, , ScanLine$
            FOR X% = 0 TO W% - 1
                R% = ASC(MID$(ScanLine$, X% * 3 + 1, 1))
                G% = ASC(MID$(ScanLine$, X% * 3 + 2, 1))
                B% = ASC(MID$(ScanLine$, X% * 3 + 3, 1))
                TextPSet X%, Y%, R%, G%, B%
            NEXT
        NEXT
        CLOSE FileNum%
    
    END SUB
    
    SUB HTMtoRGB (HTMColor$, Red%, Green%, Blue%)
        Red% = VAL("&H" + MID$(HTMColor$, 1, 2))
        Green% = VAL("&H" + MID$(HTMColor$, 3, 2))
        Blue% = VAL("&H" + MID$(HTMColor$, 5, 2))
    END SUB
    
    SUB TextPixel (Red%, Green%, Blue%, Char$, FGround%, BGround%)
        ' °±²Û (32,176,177,178,219)
       
        Diff% = 768: BGround% = 0
        FOR F% = 0 TO 15
            RDiff% = ABS(DOSPalette(F%).R - Red%)
            GDiff% = ABS(DOSPalette(F%).G - Green%)
            BDiff% = ABS(DOSPalette(F%).B - Blue%)
            NewDiff% = RDiff% + GDiff% + BDiff%
            IF NewDiff% < Diff% THEN
                Diff% = NewDiff%: Char$ = "Û": FGround% = F%
            END IF
        NEXT
    
        FOR C% = 1 TO 3
            C2% = 4 - C%
            FOR B% = 0 TO 7
                FOR F% = 0 TO 15
                    RDiff% = ABS(FakePalette(F%, B%, C%).R - Red%)
                    GDiff% = ABS(FakePalette(F%, B%, C%).G - Green%)
                    BDiff% = ABS(FakePalette(F%, B%, C%).B - Blue%)
                    NewDiff% = RDiff% + GDiff% + BDiff%
                    IF NewDiff% < Diff% THEN
                        Diff% = NewDiff%: Char$ = CHR$(175 + C%)
                        FGround% = F%: BGround% = B%
                    END IF
                NEXT
            NEXT
        NEXT
    
    END SUB
    
    SUB TextPSet (X%, Y%, Red%, Green%, Blue%)
        TextPixel Red%, Green%, Blue%, Char$, FGround%, BGround%
        LOCATE Y% + 1, X% + 1: COLOR FGround%, BGround%: PRINT Char$;
    END SUB
    

  • Yeah, I don’t think that’s particularly feasible with my prime directives in coding things meant to render on a potato. If I’m ever gonna revisit that old code again, I want it to continue to be able to run on old-school 286 CPUs, real raw hardware.

    Like sure I don’t mind writing old QBasic/QuickBasic code under an emulator, but if I’m writing on such an antiquated language for legacy hardware, I wanna be able to transfer it to a floppy disk and run it on actual hardware from the era.

    Other than that, going back to the good old days, I don’t see much reason to do such coding on modern systems. Though I will say this much, neofetch and the newer fastfetch are pretty awesome character based sysinfo utilities!

    I just don’t see myself trying to jump through conversion hoops such as ASCII to ANSI for such a project to even keep me awake…


  • I’m not exactly sure how I’d incorporate both techniques into the same rendering system though.

    My method doesn’t use letters, numbers or punctuation characters, mine uses the DOS mode block characters, blank space, 25%, 50%, 75% halftone characters, and the 100% solid block character.

    I could probably get a little closer to sharper shape edges with my method if I add in the upper half block and lower half block characters, but when using those characters I’m no longer able to use the halftone dithering and would be limited to 8 background and 16 foreground colors…

    I dunno where I’d really even start (over) again to use alphanumeric characters with my text rendering method…










  • Extreme case story here…

    I had a fella bring his computer into our shop for diagnostics and hopefully repair after a house fire. The case was originally light grey, but it was covered outside and even inside with nasty stinking black soot and the front panel was mostly melted.

    We checked it out though, the PSU had failed. So we pulled out our test PSU and tried that, and the nasty stinking computer actually booted up!

    Well, the boss didn’t want to be responsible for this mess, so he told me I could take it as a side job if the customer really wanted it fixed. He already knew that I’ve successfully salvaged flood damage computers, so why not?

    Anyways, I took the motherboard and expansion cards out and took them to our local car wash. I soaked the boards with tire/engine cleaner, then pressure washed the crud away with plain water. Then I used an air compressor to dry it as best as I could, and then left it on the roof of my car in the hot sun for like 4 hours.

    Everything worked fine after all that, so I hooked him up with a spare computer case I had laying around to replace his nasty half melted case.

    You can actually pressure wash the circuit boards as long as there’s no power (do NOT pressure wash the PSU at all!), as long as the boards are completely dry and clean before reassembling and powering it back up. Just, be careful around any sensitive parts, and do not pressure wash the CPU socket, unless you like all your precious pins bent. Also, don’t pressure wash the fans or mechanical drives or such.

    This technique isn’t for the faint of heart though, and I usually only reserve such drastic measures for boards that have already failed due to spill damage, corrosion, or other extremes where the board would otherwise end up in the scrap pile.