Jump to content

Search the Community

Showing results for tags 'dsr'.

More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


  • Atari Systems
    • Atari 2600
    • Atari 5200
    • Atari 7800
    • Atari Lynx
    • Atari Jaguar
    • Dedicated Systems
    • Atari 8-Bit Computers
    • Atari ST/TT/Falcon Computers
  • Gaming General
    • Classic Gaming General
    • Classic Computing
    • Modern Gaming
    • Prototypes
    • Arcade and Pinball
    • Emulation
    • Hardware
    • Gaming Publications and Websites
    • International
  • Marketplace
  • Community
  • Game Programming
  • Site
  • Classic Gaming News
  • The Club of Clubs's Discussion
  • I Hate Sauron's Topics
  • 1088 XEL/XLD Owners and Builders's Topics
  • Atari BBS Gurus's Community Chat
  • Atari BBS Gurus's BBS Callers
  • Atari BBS Gurus's BBS SysOps
  • Atari BBS Gurus's Resources
  • Atari Lynx Programmer Club's CC65
  • Atari Lynx Programmer Club's ASM
  • Atari Lynx Programmer Club's Lynx Programming
  • Atari Lynx Programmer Club's Music/Sound
  • Atari Lynx Programmer Club's Graphics
  • The Official AtariAge Shitpost Club's Shitty meme repository
  • The Official AtariAge Shitpost Club's Read this before you enter too deep
  • Tesla's Vehicles
  • Tesla's Solar
  • Tesla's PowerWall
  • Tesla's General
  • Harmony/Melody's General
  • ZeroPage Homebrew's Discussion
  • Furry Club's Chat/RP
  • PSPMinis.com's General PSP Minis Discussion and Questions
  • PSPMinis.com's Reviews
  • Atari Lynx 30th Birthday's 30th Birthday Programming Competition Games
  • 3D Printing Club's Chat
  • Drivers' Club's Members' Vehicles
  • Drivers' Club's Drives & Events
  • Drivers' Club's Wrenching
  • Drivers' Club's Found in the Wild
  • Drivers' Club's General Discussion
  • Dirtarians's General Discussion
  • Dirtarians's Members' Rigs
  • Dirtarians's Trail Runs & Reports
  • Dirtarians's Wrenching


There are no results to display.

There are no results to display.


  • AtariAge Calendar
  • The Club of Clubs's Events
  • Atari BBS Gurus's Calendar
  • ZeroPage Homebrew's Schedule

Find results in...

Find results that contain...

Date Created

  • Start


Last Updated

  • Start


Filter by number of...


  • Start










Custom Status



Currently Playing

Playing Next

Found 4 results

  1. Consider these PABs for reading a DIS/VAR 40 file with the TI floppy controller: pab_open_read: data >0014, pab_buf, >2800, >0000, >000d text 'DSK1.OVERRIDE' pab_read1: data >0214, pab_buf, >2828, >0000, >000d text 'DSK1.OVERRIDE' pab_read2: data >0214, pab_buf, >2828, >0001, >000d text 'DSK1.OVERRIDE' pab_read3: data >0214, pab_buf, >2801, >0002, >000d text 'DSK1.OVERRIDE' pab_close_read: data >0115, pab_buf, >2800, >0000, >000d text 'DSK1.OVERRIDE' Executed one by one with some additional glue code, the read operations return (without error): record 0 record 0 the first char of record 0 Why does the program read record 0 three times in a row, instead of advancing to record 1? (It should be noted that I do not update single bytes in the PAB from one operation to the next, but overwrite the entire PAB according to the list above. But I don't know which secret information should be lost this way.)
  2. Hello, Since PLATOTERM is licensed under the GNU Public License, I have written a piece of accessory software that opens, and displays a copy of the GNU Public License 3.0 from a file. The TIPI version loads this from the web, courtesy of the PI.HTTP level 3 interface, which is very nifty. I do think that the dsr_xxxx functions here should be folded into libti99, but this is something that @tursillion may want to think about... Thanks to jedimatt42 for these functions, which I pulled from TIPICFG's source code. I have uploaded it to github, if you want to use it: https://github.com/tschak909/platoterm99-gpl You can run the program if you have a TIPI: CALL TIPI("PI.HTTP://TI99.IRATA.ONLINE/COPYING") And for the purposes of discussion, I am posting the code here, as well: #include <files.h> #include <string.h> #include <system.h> #include <conio.h> #define VPAB 0x3000 #define FBUF 0x3200 int force_quit=0; unsigned char dsr_openDV(struct PAB* pab, char* fname, int vdpbuffer, unsigned char flags); unsigned char dsr_close(struct PAB* pab); unsigned char dsr_read(struct PAB* pab, int recordNumber); void initPab(struct PAB* pab) { pab->OpCode = DSR_OPEN; pab->Status = DSR_TYPE_DISPLAY | DSR_TYPE_VARIABLE | DSR_TYPE_SEQUENTIAL | DSR_TYPE_INPUT; pab->RecordLength = 80; pab->RecordNumber = 0; pab->ScreenOffset = 0; pab->NameLength = 0; pab->CharCount = 0; } // Configures a PAB for filename and DV80, and opens the file unsigned char dsr_openDV(struct PAB* pab, char* fname, int vdpbuffer, unsigned char flags) { initPab(pab); pab->OpCode = DSR_OPEN; pab->Status = DSR_TYPE_DISPLAY | DSR_TYPE_VARIABLE | DSR_TYPE_SEQUENTIAL | flags; pab->RecordLength = 80; pab->pName = fname; pab->VDPBuffer = vdpbuffer; return dsrlnk(pab, VPAB); } unsigned char dsr_close(struct PAB* pab) { pab->OpCode = DSR_CLOSE; return dsrlnk(pab, VPAB); } // the data read is in FBUF, the length read in pab->CharCount // typically passing 0 in for record number will let the controller // auto-increment it. unsigned char dsr_read(struct PAB* pab, int recordNumber) { pab->OpCode = DSR_READ; pab->RecordNumber = recordNumber; pab->CharCount = 0; unsigned char result = dsrlnk(pab, VPAB); vdpmemread(VPAB + 5, (&pab->CharCount), 1); return result; } void main(void) { struct PAB pab; set_text(); charsetlc(); clrscr(); bgcolor(COLOR_CYAN); textcolor(COLOR_BLACK); gotoxy(0,0); unsigned char ferr = dsr_openDV(&pab,"PI.HTTP://TI99.IRATA.ONLINE/COPYING.TXT",FBUF,DSR_TYPE_INPUT); if (ferr) { cprintf("Could not open License from web."); for (; {} } int i=0; unsigned char ch; while (ferr == DSR_ERR_NONE) { unsigned char cbuf[81]; ferr = dsr_read(&pab,0); if (ferr == DSR_ERR_NONE) { vdpmemread(FBUF,cbuf,pab.CharCount); cbuf[pab.CharCount]=0; cprintf("%s",cbuf); } if (i>4) { i=0; cprintf(" \r\n"); cprintf(" -- PRESS ANY KEY TO CONTINUE -- "); ch=cgetc(); clrscr(); } else { i++; // Get next record. } } cprintf(" \r\n"); cprintf(" END OF LICENSE. PRESS ANY KEY TO QUIT. "); ch=cgetc(); ferr = dsr_close(&pab); } Hope it is useful. -Thom
  3. Hi everybody, I'm looking for some good working examples of doing disk file I/O operations in assembly language. Already looked at section 3 DSR (Device Service Routine) / Disk & File Management in the development resources thread. Lots of good stuff there, but seeing some working code definitely would help. What I want to accomplish is to create, read, update text files and load binary files. Basically I'd like to write a small programmer's editor for running on the TI-99/4a. For keeping things simple and compatible with as many disk devices as possible I would only focus on level 3 I/O calls. Now here's where things get tricky. I want to use my spectra2 library for most of the stuff. I learned that scratchpad memory and VDP memory must be setup in a certain way for DSR calls to work successfully. Currently I'm exclusively using scratchpad memory for all my stuff, so will have to reallocate that to somewhere else. That should be possible easily enough. Now here are my questions: 1. Does a scratchpad memory map exist, with the minimal requirements for calling DSR routines ? 2. How do I need to setup VDP memory so that file I/O is possible. I understand that a PAB must always reside in VDP memory. But the disk controller DSR also uses VDP memory for work buffers during file I/O. Does the disk controller DSR always loads files from disk to VDP or is it possible to directly load to RAM ? 3. Is it possible to do file I/O calls in pure assembly language or do I have to involve GPL in some way? The documentation being focussed on Monitor, Basic, etc. seems to imply that GPL is always involved. Is that a necessity? 4. What is the easiest way to "interface" with DSR memory setup. I mean would have to switch between my "application workspace" outside of scratch-pad memory, into the "DSR workspace" in scratch-pad memory and return safely. 5. Any good examples out there? On a sidenote, I remember a discussion with InsaneMultitasker many moons ago where it was mentioned that a file operations document was in the works. My memory is a bit blurry on that, can't recall if this was finished or not. Cheers Filip
  4. Looking at my cf7+ I have over 2000 volumes. I'll never fill all that. But it gave me an idea (forgive me if someone else came up with a similar idea). What if I could get the TI to look at those extra volumes like sectors of a disk. Maybe set aside, say, volume 500-1000 as one unit with one of the volumes as a File Table for the VHD. You just do a 'SAVE CFH.FILENAME' and it will save to that area. But, wouldn't you need to create a DSR for that to happen? Is that possible? I could see where you might be able to create a CALL LINK("savecfh","filename") program that opens up DRV3 to a FAT volume, finds a place in one of the volumes to save your file to then opens that volume in DRV3 and save your file. but not as elegant. Doable?
  • Create New...