-
Content Count
849 -
Joined
-
Last visited
Posts posted by kenjennings
-
-
6 hours ago, PixelCrunch said:Hi, Pixel Here, i’m new here, so forgive me if my writing and grammar is crap.
I was wondering about the Atari 8-Bit Series of Computers graphical and color capabilities.
There's tons of information about the hardware here on the Altirra site:
http://www.virtualdub.org/altirra.html
And the Altirra hardware reference manual:
www.virtualdub.org/downloads/Altirra%20Hardware%20Reference%20Manual.pdf
And wikipedia has pretty much the same info...
https://en.wikipedia.org/wiki/CTIA_and_GTIA
https://en.wikipedia.org/wiki/ANTIC
-
6 hours ago, Gunstar said:a combined 16 graphic and text (character graphics) modes (11 and 5 respectively*)
Six text modes (ANTIC 2 through 7)
Eight Map modes (ANTIC 8 through F)
So, 14 graphics modes.
Then there are four possible color interpretations by GTIA. 14 * 4 == 56 graphics modes.
Though many of these combinations may not have a practical use. So, so somewhere in the ballpark of 17 "easy to use modes" (the base 14 modes plus 3 GTIA color interpretations on mode F ) up to around 20 to 26 usable configurations depending on your creativity.
Not including DLI gymnastics that game vertical scrolling to cut down text mode heights or to stretch map modes.
-
1
-
-
Mine seems to be superglued or outright melted closed. If I had extra copies of this cart and was curious I'd try carefully scoring the side seams with a boxcutter, hopefully without stabbing myself or removing useful fingers.
-
1
-
-
11 hours ago, Faicuai said:WOW!!!
What a f-great little piece of work!!!
I looked at it yesterday night, and then did a little research on the original title... Boy! Your current version renders the original CBM title a joke!
What a GREAT use of color, sprites and animation you made, here! Looks REALLY nice on NTSC! Overall, your color scheme of choice explodes with vibrancy and vividness on my end, in a way that cannot be faithfully captured with my iPad camera / color-space. The samples below look BAD compared to how GOOD they really looked to the naked eye.
KUDOS, and BRING IT ON !!!
You're far too generous with your praise. Thanks.
There is only one lousy sprite in the game.
I don't think it will get much better than it is right now in the sound department. I'm not much for programming audio.
The original game was written in 1983 for the CBM Pet by someone in high school with not a lot of programming experience and he did an altogether stand up job on it considering the limitations.
-
18 hours ago, Philsan said:800XL PAL with U1MB (64KB and 320KB) and double Pokey.
Loaded from SIO2PC-USB or AVG Cart.
No problems at all.
THANKS!
Weeeell. Learned something new... Between Altirra, Atari800, and PAL equipment out of the five possible blues looks like there's only two that do appear as blue for everyone. huh. Shame. I was rather attached to Aqua.
Also, I forgot I was using artifact colors to make green labels for the score lines. (Residue left over from Version 2 of the game based on ANTIC text mode 2.) Now that I think about it the way I set up the characters I should be using ANTIC text mode 4 for those lines, too, and get the color result I was looking for. (Derp. Head slap.)
THANKS AGAIN!
-
Hi lo. Would someone with real equipment like to playtest something for me? My Ataris are at the bottom of the keep the wife or keep the Atari closet.Run the Frogger03.xex.Let me know if the Title and Game displays are stable on real hardware, and no goofy flickering or dancing DLIs. It seems to be working OK on Atari800 and Altirra emulators.The game is only set for one life to make it faster to trigger the game over display.Yes, I know the graphic on the Game Over display is incomplete. Yes, the sound is very lame.Thanks.-
7
-
3
-
-
I'm having a problem with GTIA artifacts. Running 4.1.0 on linux, opensuse 15.0.
After setup and configuration for GTIA I'm getting the blue/red artifacts from a program I wrote.
Same program on atari800 3.x on linux does the green/purple artifacts.
Same program on Altirra in Windows is getting green/purple artifacts.
Is there some hidden voodoo in the config file to coerce this?
-
Ranger03:
Some simple utilities in assembly language for Atari BASIC:
-
I would much rather have good sound effects. If music is not intrinsic to the gameplay it does not belong. At the most there can be a short musical theme for finishing levels, completing achievements, etc.
Mountain King is the only thing I can think of that handles music correctly. The music changes volume as the player gets closer to the goal. Not that this is the only game that uses music as an integral part of game play -- there may be more, but this is the only one I can think of.
A continuously running techno rock score is an annoyance. If the option is there to turn it off, it gets turned off.
-
3
-
-
I rolled up a quick-n-dirty simple retro birthday card for a friend. (No music. Maybe for next year's card.) (And, No, FillInTheBlank is not their actual name.
)Assembly code. Redefined character sets do the animated flames. Display kernel updating colors on every scan line. lots of laziness in evidence. Too lazy to actually do a VBI or DLI.
Assembly code is here if anyone is interested: https://github.com/kenjennings/WIP-HBFITB
Video is on youTube: https://youtu.be/WLELDFDT3uM
-
7
-
-
In terms of stupendously awesome 8-bittlyness 1979 to 2029, perhaps longer.
-
2
-
-
I thought "Fastchip" was just the floating point package replacement chip for the 800.
-
Just added the ATARI 8-Bit conversion details to the Stunt Car Racer Wikipedia page (so far it only showed the ATARI 8-bit platform but no details).
https://en.wikipedia.org/wiki/Stunt_Car_Racer
This is a truly amazing port and it deserves major recognition.

FYI, the page shows a link instead of a picture for the Atari 8-bit version.
The link is asking for/expecting an upload.
-
Yeah, but your changes have been quickly withdrawn by another user?
Because wikipedia sucks. The delete-or dominates edits for the past two years on this tiny page and probably thinks it is their own private empire. I just now put the edit back up simply to make them frustrated. We should all take turns at this.
-
8
-
-
Mac/65 says I am not insane. The 30 years added to the brain cells have not yet turned them to mush.
This is the simple program version...
ASM shows the forward reference is recognized by the .REF during assembly...
And, the macro version...
And it works too. The forward ref from macro invocation is recognized by .REF...
Just to be sure Mac/65's doesn't assume the macro declaration itself causes the .REF, this is assembly with MFUNC commented out in MAIN. It does not see the reference to FUNC and so does not assemble that code.
-
3
-
-
Actually I found that its not specific to macros. Any forward reference does not count as a reference for conditional assembly.
MAIN jsr FUNC1 jmp MAIN .IF .REF FUNC1 FUNC1 ; something rts .ENDIFThis fails to find FUNC1. Shouldn't it keep a placeholder for "memory address FUNC1 referenced" in pass 1, and then pass 2 fills in the address? It makes me wonder what .def and .ref can do.
-
I was trying to do something that my feeble memory thought worked 30 years ago in Mac/65 and not getting any joy in atasm.
I'm making macros to act as wrappers to function calls in a library of routines. Then I'm conditionally assembling routines in the library, so if they are not referenced, they don't get included and waste space. I was figuring this would work.... (only important parts included)
.macro mFunc ; other stuff happens jsr libFunc .endm ; Later in the main code.... mFunc ; Later.... .if .ref libFunc libFunc ; fun stuff ensues rts .endifThis does not work. The .ref does not see the libFunc referenced, so it does not build libFunc. Should this work? Or am I insane?
If the forward referenced label doesn't work, how about a declared value in the macro like this?...
.macro mFunc DO_FUNC .= 1 ; other stuff happens jsr libFunc .endm ; Later in the main code.... mFunc ; Later.... .if .ref DO_FUNC ; and .def does not work either. libFunc ; fun stuff ensues rts .endifDO_FUNC set in the macro is also not seen. neither .ref or .def sees it.
Next fallback plan...
DO_FUNC .= 0 ; Later on.... .macro mFunc DO_FUNC .= 1 ; other stuff happens jsr libFunc .endm ; Later in the main code.... mFunc ; Later.... .if DO_FUNC>0 libFunc ; fun stuff ensues rts .endifThis (annoyingly) does work. DO_FUNC defined outside the scope of a macro can have its value changed in a macro, and THAT value change is seen by the conditional assembly.
Rather not have to throw in a bunch of flags in a header file separate from the library file which is included in the end of the assembly.
-
My original XL (upgraded with 256K and Newell OS in the 80s) sits here in a place of honor only occasionally turned on.
Everything else is easier on emulation (openSuse Tumbleweed on a Lenovo Z710, Atari800 emulator. Development with eclipse/uwudsn/atasm.)
I have also have two of the Dell Mini 12 laptops (openSuse 32-bit) whose only purpose is to run the Atari800 emulator, so, technically portable 8-bit Ataris.
I also use emulators for the Amiga.
-
I remember that listing as well! Used it in a few graphing programs that I wrote, mainly for labelling the axes.
That is pretty close to the behavior of the machine language routine at the start of the post.
(The ML routine allows flexibility in the column number being greater than the number of columns on the screen. This wraps the write location around the screen to subsequent scan lines which permits rendering subscripts. )
-
1
-
-
"Atari" all the way. 2600, 800 and XLs, Amigas.
Like the .sig says:
-
2
-
-
I did a disassembly on the USR code, and tried to figure out what it is doing, applying comments along the way...
Though, I'm a bit fuzzy on how the ATASCII string is getting converted into screen codes for lookup in the character set.
This is atasm syntax. It built OK. I ran a few tests in the Atari 800 emulator and text actually came out.
(The code tag doesn't like apostrophes.)
; Computes First Book of Atari Graphics ; Original program by Douglas Crockford ; "Mixing Graphics Modes 0 And 8" ; Disassembly, comments by Ken Jennings ; ; mlprint... ; Given a string of text, write the corresponding ; character set bitmaps for the text characters ; into screen memory on Graphics mode 8. It uses ; the value of CHBAS for the character set, so ; any custom character set can be used. ; ; This does not shift bitmaps to write text at any ; pixel position. The X and Y coordinates correspond ; to column and row positions for Graphics 0. ; But, it does allow the X column to exceed screen ; width which permits the write position to "wrap ; around" to a position in the following high- ; resolution graphics line(s) which can be used to ; create super/subscript text. ; BASIC USR() Arguments: ; x text column. ; y text row ; string address ; string length ; Assembly syntax for atasm. ; All the joy of Mac/65 with none of the line numbers. ; OS pointer to screen memory SAVMSC=$58 ; Antic charset page pointer CHBAS=$02F4 ; Borrowing the OS Floating Point page zero ; memory for the work. FR0=$D4 FRE=$DA STRINGLEN = FR0 ; $D4 Text string length INVERSEFLAG = FR0+1 ; $D5 Flags inverse video character SCREENMEM = FR0+2 ; $D6/$D7 screen memory address STRINGADDR = FR0+4 ; $D8/$D9 Text string address CHARBITMAP = FR0+6 ; $DA/$DB Address of charset bitmap STRINDEX = FRE+2 ; $DC Current index into text string LINECOUNT = FRE+3 ; $DD Current graphics line (0 to 7) *=$4000 pla ; argument count cmp #$04 ; must be 4 beq b_entry ; Yes! ($400e) tax ; no. cleanup and escape. beq b_exit ; bye ($400d) b_dispose_arguments ; ($4008) pla ; pull arg high byte pla ; and arg low byte dex ; minus one argument bne b_dispose_arguments ; dispose of next argument ($4008) b_exit ; good bye ($400d) rts ; abandon ship b_entry ; ($400e) pla ; X column high byte sta SCREENMEM+1 ; FR0+3/$D7 pla ; X column low byte sta SCREENMEM ; FR0+2/$D6 pla ; Y row high byte (do not need) pla ; Y row low byte tay ; save Y row in Y pla ; Text string address high byte sta STRINGADDR+1 ; FR0+5/$D9 pla ; Text string address low byte sta STRINGADDR ; FR0+4/$D8 pla ; string length high byte (do not need) pla ; string length low byte beq b_exit ; length is 0 so exit ($400d) sta STRINGLEN ; FR0/$D4 ; SCREENMEM currently holds X COLUMN for text. ; Add the OS screen memory pointer. clc lda SCREENMEM ; FR0+2/$D6 x column low byte adc SAVMSC ; $58. Add to low byte of address of screen memory. sta SCREENMEM ; FR0+2/$D6 x column low byte lda SAVMSC+1 ; $59. High byte of address of screen memory adc SCREENMEM+1 ; FR0+3/$D7 Add to x column high byte sta SCREENMEM+1 ; FR0+3/$D7 x column high byte tya ; Get Y row back. If this is zero then beq b_skip_Y_multiplication ; ($4042) skip the row multiplication ; Row multiplication. ; Adjust the starting address by adding 320 bytes ; for each logical text row on the screen. ; 40 bytes per high resolution line times 8 lines ; in each text line is 320 bytes. ; Low Byte + 64, and high byte + 1 is the same as ; 64 + 256 which is 320 ; b_loop_Y_times_320 ; ($4033) FYI: 64 + 256 = 320 lda SCREENMEM ; FR0+2/$D6 adc #$40 ; Add 64 to low byte sta SCREENMEM ; FR0+2/$D6 lda SCREENMEM+1 ; FR0+3/$D7 adc #$01 ; Add 1 (aka 256) to high byte sta SCREENMEM+1 ; FR0+3/$D7 dey bne b_loop_Y_times_320 ; ($4033) Not zero, go back b_skip_Y_multiplication ; ($4042) Zero graphics line counter sty LINECOUNT ; FRE+3/$DD b_init_string_index ; start at beginning of string ($4044) ldy #$00 ; zero string index sty STRINDEX ; FRE+2/$DC b_next_character ; ($4048) lda (STRINGADDR),y ; FR0+4/$D8/$D9 read character from text string ldy #$00 ; zero Y. tax ; save character in X bpl b_convert_ATASCII_to_screencode ; ($4050) not inverse, skip dey ; inverse char (Y = -1 aka $FF) b_convert_ATASCII_to_screencode ; ($4050) sty INVERSEFLAG ; FR0+1 ; $D5 txa and #$60 ; AND character with 96, ~01100000 bne b_skip_set_64 ; ($405b) One of 32, 64, or 96? Yes, then skip setting 64 and check for 32 lda #$40 ; A was not 32, 64, or 96. Reset A = 64 bpl b_screencode_address ; ($4069) b_skip_set_64 ; ($405b) cmp #$20 ; Is A 32? bne b_skip_set_0 ; ($4063) No. Keep whatever it is. lda #$00 ; Yes, A is 32. Reset A = 0 bpl b_screencode_address ; ($4069) b_skip_set_0 ; ($4063) cmp #$40 ; Is A 64? bne b_screencode_address ; ($4069) No. Keep whatever it is. lda #$20 ; Reset A = 32 ; Determine address of character set bitmap ; from the character internal screen code. ; Address == (CHBAS * 256) + (screencode * b_screencode_address ; ($4069) sta CHARBITMAP ; FR0+6/$DA Low Byte of charset bitmap (0, $20, $40, $60?) txa and #$1F ; AND character 31, ~00011111 ora CHARBITMAP ; FR0+6/$DA OR A 31, ~00011111 sta CHARBITMAP ; FR0+6/$DA lda #$00 ; A is high bits after multiplication ldx #$03 ; X counts multiplication 3 times (2 ^ 3 = b_screencode_times_8 ; ($4076) asl CHARBITMAP ; FR0+6/$DA times 2 rol A ; times 2 and collect high bit from ASL dex ; loop three times 2, 1, 0 bne b_screencode_times_8 ; ($4076) loop 3 times. adc CHBAS ; $02F4 A = A + Antic charset page pointer sta CHARBITMAP+1 ; FR0+7/$DB Save in high byte of char address ldy LINECOUNT ; FRE+3/$DD counts lines 0 to 7 lda (CHARBITMAP),y ; FR0+6/$DA Char bitmap address + line eor INVERSEFLAG ; FR0+1/$D5 EOR $00 or $FF ldy STRINDEX ; FRE+2/$DC Get current char index sta (SCREENMEM),y ; FR0+2/$D6 Save into screen mem + index iny sty STRINDEX ; FRE+2/$DC Go to next character in text cpy STRINGLEN ; FR0/$D4 Did we reach the end of the text? bne b_next_character ; ($4048) No. Do the next character. ; End of the text string. ; Setup for the next line of graphics. ; Update screen memory pointer + 40 bytes for next line clc lda SCREENMEM ; FR0+2/$D6 adc #$28 ; Add 40 for next line sta SCREENMEM ; FR0+2/$D6 bcc b_skip_screenmem_high_byte ; ($409d) Is carry set? inc SCREENMEM+1 ; FR0+3/$D7 increment high byte b_skip_screenmem_high_byte ; ($409d) inc LINECOUNT ; FRE+3/$DD increment line counter (0 to 7) lda #$08 cmp LINECOUNT ; FRE+3/$DD Is the graphics line counter 8? bne b_init_string_index ; ($4044) No. Do next line. rts ; ($40a5) ; The DATA in the BASIC program has two more bytes. ; It appears this is just junk to make the machine ; language routine fit an even multiple of six bytes ; per line of DATA. ; 40a6 = $CF? ; 40a7 = $60 RTS ; .byte $CF,$60-
6
-
-
Did the original creators of this thing figure out how to create new files? I see under "XBIOS Limitations" It cannot create new file names. I would like to set up a save game progress thing. I wonder if this is something that be added along with all the other functions.
It appears to support writing to files. So, in this case you could designate game save files (SAVE001, SAVE002, SAVE003) and pre-populate them on disk, then overwrite them when the user chooses the save file.
-
Those forest pic look awesome...
Right, they do look spectacular. They must be Amiga pics. :-) Too bad they were not on a demo disk, say in 1982.
-
2
-
-
Mac/65 on real hardware.
Do learn about cross-compiling/cross-assembling. Building on a modern computer is blindingly fast and testing on an emulator is so much more convenient.
I like atasm on a modern PC. All the joy of Mac/65 with none of the line numbers.
-
1
-







Atari 8-Bit Graphics Capabilities
in Atari 8-Bit Computers
Posted
Right, the marketing stuff was never very accurate about what the machine could actually do. In the marketing war with Commodore they let Commodore get away with saying the Atari could only display 192 scan lines. Atari never weaponized the fact of the built-in horizontal/vertical overscan capability :-).