!3SDOS - 3Sector Read-Only DOS * Assembler: BiboAssembler 1.21 * License: GNU Public License, http://www.gnu.org * Author: Carsten Strotmann * Version: 0.8 * Description: Mini-Read-Only DOS 2.x compatible !! Why? Why I've written this DOS? I had a BASIC Cassette program. The program consists of two files, ==part1.bas== and ==part2.bas== . The first part initializes a new character-set and the starts the second part via the CLOAD command. The second part was really large. Because the cassette load take some time, I would like to have a disk version. But with a normal DOS loaded (MyDOS, ATARI DOS 2.x, 3, DOS XL, Turbo DOS, I tried almost all), there was only some byte free memory left. Too less to run the programm. So I tested serveral game-dos. (btw, thanks to Matthias Reichl for the new GPL Release of MyPicoDos, http://www.horus.com/~hias/atari/ ). But the game-dos I own don't install a "D:" CIO Handler, they just load the file and start it. That is ok for one-part files, but it didn't work with my two-part file. So I wrote 3SDOS. It's 384 Bytes long and fits into the first 3 bootsectors. With this, the basic-cassette program works! And it has 4k free space. !! Limitations: * only read operations * "open file" and "get byte" CIO commands * only finds files in the first directory sector ($169), so only the first 8 directory entries work * no checks * slower that normal dos load, but dos starts very fast! * maybe buggy !! Future development * Autoload and Start Basic program in the first Directory entry, for real Basic-Boot-Disks * keep it in 3 sectors (SD) !! Download * See attachments for an empty DOS DISK (SD) !! FAQ * How to write the DOS to a new Disk? * copy sector 1-3 from a 3SDOS Disk to the new Disk * or, take the source and write a setup program :-) {{{ 00010 .LI OFF 00020 ************************* 00030 * * 00040 * 3SECTOR DOS 3SDOS * 00050 * A LOW MEMORY DOS 2.X * 00060 * * 00070 * READ ONLY VERSION * 00080 * * 00090 * (C) 2003 C. STROTMANN * 00100 * LICENSED UNDER GPL * 00110 * * 00120 ************************* 00130 ; 00140 ; SIO CONTROL BLOCK 00150 ; 00160 DDEVIC = $0300 00170 DUNIT = $0301 00180 DCMND = $0302 00190 DSTATS = $0303 00200 DBUF = $0304 00210 DTIMLO = $0306 00220 DBYT = $0308 00230 DAUX1 = $030A 00240 DAUX2 = $030B 00250 ; 00260 ; ZERO PAGE REGISTERS 00270 ; 00280 ICHIDZ = $20 00290 ICDNOZ = $21 00300 ICCOMZ = $22 00310 ICSTAZ = $23 00320 ICBADZ = $24 00330 ICBPLZ = $26 00340 ICBBLZ = $28 00350 ICAX1Z = $2A 00360 ICAX2Z = $2B 00370 ICSPRZ = $2C 00380 ICHIDNOZ = $2E 00390 ; 00400 ; FLOPPY SIO COMMANDS 00410 ; 00420 RDSEC = $52 00430 ; 00440 ; SECTOR SIZE 00450 ; 00460 SECSIZ = $80 00470 ; 00480 ; SIO STATUSBYTE 00490 ; 00500 DREAD = $40 00510 ; 00520 ; OS VECTORS 00530 ; 00540 DOSVEC = $0A 00550 DOSINI = $0C 00560 SIO = $E459 00570 CIO = $E456 00580 PHENTV = $E486 00590 BIBOMON = $E471 00600 ; 00610 ; START OF USER MEM 00620 ; 00630 MEMLO = $02E7 00640 ; 00650 ; SCREEN MEM 00660 SAVMSC = $58 00670 ; 00680 ; INIT VECTOR 00690 ; 00700 RUNAD = $02E0 00710 INITAD = $02E2 00720 ; 00730 ; HANDLER TABLE 00740 ; 00750 HATABS = $031A 00760 ; 00770 ; ERROR CODES 00780 ; 00790 ERR_OK = $01 ; NO ERROR 00800 ERR_BRK = $80 ; BREAK KEY 00810 ERR_EOF = $88 ; END OF FILE 00820 ERR_NFND = $AA ; NOT FOUND 00830 ERR_JOPN = $A1 ; JUST OPEN 00840 ; 00850 ; HANDLER CHAR "D:" 00860 HNDCHAR = 'D 00870 ; 00880 ; SECTORS 00890 ; 00900 VTOC = $0168 00910 DIR = $0169 00920 ; 00930 ; BUFFER 128 BYTE 00940 ; 00950 SECBUF = $600 00960 ; 00970 ; FILENAME BUFFER 11 BYTE 00980 ; 00990 FNAME = $100 01000 ; 01010 ORG .OR $700 01020 .OF D:SDOS.COM 01030 ; 01040 DATA 01050 SECCNT = $D4 01060 BUFCNT = $D6 01070 BUFEOF = $D7 01080 DIRCNT = $D7 01090 CURSEC = $D8 01100 DIRP = $DA 01110 ; 01120 ; BOOT HEADER 01130 ; 01140 BOOTH .HX 00 01150 .HX 03 ; 3 SEC DOS 01160 .DA BOOTH ; STORE ADDR 01170 .DA DOSIN 01180 ; 01190 ; SET MEMLO 01200 LDA #PGMEND 01210 STA MEMLO 01220 LDA /PGMEND 01230 STA MEMLO+1 01240 ; 01250 ; SET RESTART VECTOR 01260 LDA #FHINIT 01270 STA DOSVEC 01280 LDA /FHINIT 01290 STA DOSVEC+1 01300 ; 01310 ; BOOTMESSAGE 01320 JSR PMSG 01330 ; 01340 CLC 01350 RTS 01360 ; 01370 ; 01380 ; DOS INI ROUTINE 01390 ; 01400 DOSIN 01410 JSR FHINIT ; INIT HANDLER 01420 RTS 01430 ; 01440 ------------------------------ 01450 INIT 01460 FHINIT 01470 LDX #0 01480 .1 01490 LDA HATABS,X 01500 BEQ INSTALL 01510 CMP #HNDCHAR 01520 BEQ INSTALL 01530 INX 01540 INX 01550 INX 01560 CPX #$20 01570 BMI .1 01580 ; 01590 RTS 01600 ------------------------------ 01610 ; INSTALL HANDLER 01620 ; 01630 INSTALL 01640 LDA #HNDCHAR 01650 STA HATABS,X 01660 LDA #FHTAB 01670 STA HATABS+1,X 01680 LDA /FHTAB 01690 STA HATABS+2,X 01700 RESETS 01710 LDA #DOSIN 01720 STA DOSINI 01730 LDA /DOSIN 01740 STA DOSINI+1 01750 RTS 01760 ------------------------------ 01770 SECRD 01780 LDA #$01 ; DISK 1 01790 STA DUNIT 01800 LDA #$31 ; FLOPPY 01810 STA DDEVIC 01820 LDA #RDSEC ; READ 01830 STA DCMND 01840 LDA #DREAD 01850 STA DSTATS 01860 LDA #SECSIZ 01870 STA DBYT 01880 LDA #0 01890 STA DBYT+1 01900 LDA #SECBUF 01910 STA DBUF 01920 LDA /SECBUF 01930 STA DBUF+1 01940 LDA CURSEC 01950 STA DAUX1 01960 LDA CURSEC+1 01970 STA DAUX2 01980 ; 01990 JSR SIO 02000 ; 02010 LDA SECBUF+$7F 02020 STA BUFEOF 02030 DEC SECCNT 02040 LDA SECBUF+$7D 02050 AND #$03 02060 STA CURSEC+1 02070 LDA SECBUF+$7E 02080 STA CURSEC 02090 LDA #$FF 02100 STA BUFCNT 02110 RTS 02120 ------------------------------ 02130 FSPECIAL 02140 FSTATUS 02150 SDOSINIT 02160 FCLOSE 02170 OK LDY ERR_OK 02180 FPUTBYT 02190 RTS 02200 ------------------------------ 02210 FOPEN 02220 LDA ICAX1Z ; AUX1 02230 AND #$04 ; READ? 02240 BEQ FCLOSE ;NO WRITE! 02250 LDA #DIR 02260 STA CURSEC 02270 LDA /DIR 02280 STA CURSEC+1 02290 JSR SECRD 02300 LDA #SECBUF 02310 STA DIRP 02320 LDA /SECBUF 02330 STA DIRP+1 02340 LDA #7 02350 STA DIRCNT 02360 ; 02370 ; SEARCH DIR ENTRY 02380 ; 02390 SDIR 02400 LDY #$0F 02410 LDA #$20 02420 .1 STA FNAME,Y 02430 DEY 02440 BPL .1 02450 ; 02460 LDY #0 02470 .2 02480 INY 02490 LDA (ICBADZ),Y 02500 CMP #': 02510 BNE .2 02520 ; 02530 INY 02540 TYA 02550 CLC 02560 ADC ICBADZ 02570 STA ICBADZ 02580 BCC .3 02590 INC ICBADZ+1 02600 .3 02610 LDY #0 02620 LDX #5 02630 .4 02640 LDA (ICBADZ),Y 02650 CMP #'. 02660 BNE .5 02670 LDX #$D 02680 INY 02690 .5 02700 LDA (ICBADZ),Y 02710 STA FNAME,X 02720 INY 02730 INX 02740 CPX #$10 02750 BNE .4 02760 .6 02770 LDY #$F 02780 .7 LDA (DIRP),Y 02790 CMP FNAME,Y 02800 BNE .10 02810 DEY 02820 CPY #4 02830 BNE .7 02840 LDA (DIRP),Y 02850 STA CURSEC+1 02860 DEY 02870 LDA (DIRP),Y 02880 STA CURSEC 02890 DEY 02900 LDA (DIRP),Y 02910 STA SECCNT+1 02920 DEY 02930 LDA (DIRP),Y 02940 STA SECCNT 02950 ; 02960 JSR SECRD 02970 LDY #ERR_OK 02980 RTS 02990 .10 03000 LDA #$10 03010 CLC 03020 ADC DIRP 03030 STA DIRP 03040 BCC .11 03050 INC DIRP+1 03060 .11 03070 DEC DIRCNT 03080 BNE .6 03090 LDY #ERR_NFND 03100 RTS 03110 ; 03120 JMP BIBOMON 03130 ; 03140 ------------------------------ 03150 FGETBYT 03160 ; JMP BIBOMON 03170 LDX BUFEOF 03180 BNE .10 03190 JSR SECRD 03200 .10 03210 LDX SECCNT 03220 CPX #$FF 03230 BNE .20 03240 LDY #ERR_EOF 03250 RTS 03260 .20 03270 INC BUFCNT 03280 DEC BUFEOF 03290 LDX BUFCNT 03300 LDA SECBUF,X 03310 JMP OK 03320 ------------------------------ 03330 FHTAB 03340 .DA FOPEN-1 03350 .DA FCLOSE-1 03360 .DA FGETBYT-1 03370 .DA FPUTBYT-1 03380 .DA FSTATUS-1 03390 .DA FSPECIAL 03400 JMP SDOSINIT 03410 .DA #0 03420 PGMEND 03430 ------------------------------ 03440 MSG 03450 .AT " 3SDOS (c)2003 CST/PSC " 03460 MSGEND .HX 00 03470 ------------------------------ 03480 PMSG 03490 LDY #$FF 03500 .1 INY 03510 LDA MSG,Y 03520 STA (SAVMSC),Y 03530 CPY #MSGEND-MSG 03540 BNE .1 03550 RTS 03560 ------------------------------ 03570 .OR RUNAD 03580 .DA INIT 03590 ------------------------------ }}}