gs80065xe Posted December 8, 2020 Share Posted December 8, 2020 I'm studying Assembly language and am currently on Display Lists. The author has an exercise to create an Antic mode 14 display list from scratch. Using what I've learned I created a program in FastBasic. The program is on the attached atr file. But it appears when the program is run, the screen goes blank and there are pixelated artifacts flashing on the screen. Almost like the display list and or screen ram are in a location being used by another program. The flashing continues after I stop the program execution. But now there are characters flashing. I have to do a warm reset to get the display back to normal. I tried to keep it simple. So I'm currently being wasteful with RAM. But the exercise is to focus on creating the display list. Any ideas? Thanks. dlist.atr Quote Link to comment Share on other sites More sharing options...
Justin Payne Posted December 8, 2020 Share Posted December 8, 2020 Dumb question but if you're learning Assembly Language why is this in FastBasic? Quote Link to comment Share on other sites More sharing options...
gs80065xe Posted December 8, 2020 Author Share Posted December 8, 2020 Still early in the book. But the author is trying to do some things starting in Basic. He assumes the readers will be familiar with it. And I assume later he will show it in Assembly. But I haven't gotten that far because I'm trying to get my display list working for the last day or two. I know there are Display list methods in FastBasic. But the author wants the reader to manually create the Display List because you'll need to do the same thing in Assembly. Quote Link to comment Share on other sites More sharing options...
Blues76 Posted December 8, 2020 Share Posted December 8, 2020 1 hour ago, gs80065xe said: Still early in the book. But the author is trying to do some things starting in Basic. He assumes the readers will be familiar with it. And I assume later he will show it in Assembly. But I haven't gotten that far because I'm trying to get my display list working for the last day or two. I know there are Display list methods in FastBasic. But the author wants the reader to manually create the Display List because you'll need to do the same thing in Assembly. which book ? 1 Quote Link to comment Share on other sites More sharing options...
gs80065xe Posted December 8, 2020 Author Share Posted December 8, 2020 Atari Assembly Language Programmer's Guide by Allan Moose and Marian Lorenz Publisher is Weber. 1 Quote Link to comment Share on other sites More sharing options...
gs80065xe Posted December 10, 2020 Author Share Posted December 10, 2020 Some more information. This is running on latest Altirra using xl/Xe os and Basic roms. And Rambo 256k to simulate my real hardware. I rewrote the program with Atari basic. Same results. Except reset resulted in losing the program. I noticed the exercise mentions it is more for the 400/800 and basic rev a which lacked an antic mode 14 graphics object. Changed Altirra to mimic an 800 with the Atari rev cart. Loaded the basic program and get a black screen without flickering. But Altirra crashed when I reset to exit the program. Quote Link to comment Share on other sites More sharing options...
TGB1718 Posted December 10, 2020 Share Posted December 10, 2020 A number of things, your start of of screen memory may not be quite right for later calculation of the 4K LMS instruction, I've listed below one that works, but I chose the place in memory for the screen myself, I put the display list in page 6, but you could just reserve a space in front of the screen and put it there, I just did it this way for debugging as the other DL might get corrupted when switching back to Graphics 0. Also I think you only have 191 scan lines in your code. You must always let the OS know what mode your in, that's what the POKE 87,14 does, without this in your code the OS thinks your still in a character mode. I don't use FB, so this is in Atari BASIC, should be easy to translate, hope this helps 10 REM GRAPHICS 0 20 DL=1536:REM PAGE 6 FOR DL 30 FOR I=0 TO 2:POKE DL+I,112:NEXT I 40 DL=DL+3 50 POKE DL,14+64 60 POKE DL+1,80 70 POKE DL+2,129:REM 80 DL=DL+3 90 FOR I=0 TO 92 100 POKE DL+I,14 110 NEXT I 120 DL=DL+93 130 POKE DL,14+64 140 POKE DL+1,0 150 POKE DL+2,144 160 DL=DL+3 170 FOR I=0 TO 96 180 POKE DL+I,14 190 NEXT I 200 DL=DL+97 210 POKE DL,65 220 POKE DL+1,0 230 POKE 88,80:POKE 89,129 240 POKE 560,0:POKE 561,6 250 POKE 87,14 255 A=INT(RND(1)*256) 260 FOR I=33104 TO 33104+7680 STEP 2 270 POKE I,A 280 NEXT I 290 A=INT(RND(1)*256) 300 FOR I=33104+7680 TO 33104 STEP -3 310 POKE I,A 320 NEXT I 330 GOTO 330 Quote Link to comment Share on other sites More sharing options...
gs80065xe Posted December 10, 2020 Author Share Posted December 10, 2020 Thanks. I found out why it was flickering. It only occurs if I have SpartaDOS X with TD ON. I turn it off and it works fine. Quote Link to comment Share on other sites More sharing options...
dmsc Posted December 11, 2020 Share Posted December 11, 2020 Hi! 10 hours ago, gs80065xe said: Thanks. I found out why it was flickering. It only occurs if I have SpartaDOS X with TD ON. I turn it off and it works fine. Your program has various problems: 1) You are setting RAMTOP to an invalid value: The Atari OS can't handle any value in RAMTOP, it needs the ram to be in multiples of 4KB, so RAMTOP must be changed in increments of 16, otherwise the OS will be confused. 2) You don't really need to set RAMTOP. As you are not using the OS to set the graphics mode, you don't really need to set RAMTOP. Just do: DLP=PEEK(106)-33 SRP=PEEK(106)-32 This will initialize both the display-list pointer and the screen pointer to the correct locations. 3) The screen memory that you define crosses a 4KB boundary. This is because SRP is a multiple of 16, meaning that SRP*256 is exactly a multiple of 4096. You are setting line 0 to address "SRP*256", line 1 to "SRP*256+40", etc. up until line 95. Then, at line 96, you set the display memory to "(SRP+15)*256", just after the last line. This is correct, *but* 15*256 = 3840, just short of 4KB. So, line 102 will start at "SRP*256 + 4080" and wrap to "SRP*256 + 24". The correct way to address this is to calculate the starting address of graphics memory so that one line ends exactly at 4095, so the next one starts at 4096. This is easy, you just need to set SRP to one more than the current value. Hope that makes sense. Have Fun! 1 Quote Link to comment Share on other sites More sharing options...
gs80065xe Posted December 11, 2020 Author Share Posted December 11, 2020 Thanks for the help everyone. Quote Link to comment Share on other sites More sharing options...
TGB1718 Posted December 11, 2020 Share Posted December 11, 2020 18 hours ago, dmsc said: The correct way to address this is to calculate the starting address of graphics memory so that one line ends exactly at 4095, so the next one starts at 4096. That's pretty much what my example above does Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.