; SAVE#D:MDOS1.M65 ; ;================================ ;= MYDOS BOOT CODE == ;================================ ; ;*DISK BOOT SECTORS (3) ; ; ; *= $0700 ; ; DOS BOOTS TO ; ; (LOADS AT) 0700 ; ; BOOTFL ; ; INDICATE MYDOS .BYTE 'M ; 4.50 OR LATER ; ;*BEGIN OS REQUIRED DATA FOR ; BOOTING ANY DISK ; BOOTL ; ; # OF SECTORS .BYTE 3 ; TO BOOT IN ; BOOTAD ; ; ADDRESS TO .WORD BOOTFL ; LOAD BOOT ; ; CODE TO IN RAM BOOTIN .WORD INIT ; DOSINI ; JMP INBOOT ; JUMP TO BOOT ; ; CONTINUATION CODE AFTER OS ; ; BOOTUP ROUTINES RUN ; ;*END OF OS REQUIRED BOOT DATA ; ; FILES ; ; NUMBER OF .BYTE 3 ; FILES THAT MAY ; ; BE OPEN AT ONCE ; RAMDKU ; ; RAM DISK #, IT .BYTE $09 ; USED TO BE BIT ; ; PATTERN FOR DRIVES ; ; AS USED BY DOS 2.0 ; DEFAULT ; ; DEFAULT DRIVE .BYTE 1 ; NUMBER, USED ; ; TO BE BUFFER ; ; ALLOCATION DIR. ; DOSEND ; ; ADDRESS OF THE .WORD BOOTND ; FIRST BYTE ; ; OF FREE MEMORY ; ; eg - FILE BUFFERS ; SECDAT ; ; 1=128 BYTE .BYTE 1 ; 2=256 BYTE ; ; SECTORS ; DOSLOC ; ; SECTOR # OF .WORD 4 ; DOS.SYS FILE ; DLINK ; ; OFFSET TO .BYTE LK128 ; SECTOR LINK ; ; FIELD ; DOSAD ; ; ADDRESS TO .WORD BASE ; LOAD DOS.SYS ; ; FILE TO ; ;*BOOT CONTINUATION CODE ; INBOOT ; ; SET UP START LDY DOSAD ; OF DOS AS ; ; BUFFER ADDRESS LDA DOSAD+1 ; LOW ADDR IN Y, JSR BTSET ; HIGH IN A ; LDA DOSLOC+1 ; PUT DOS DISK LDY DOSLOC ; ADDR INTO A,Y ; ;*DOS.SYS INPUT LOOP ; INITLP CLC ; CY=0=READ LDX SECDAT ; GET SEC SIZE BEQ NODOS ; ZERO=NO DOS JSR DKIO ; DOS'S DISK I/O BMI NODOS ; ERROR=RETURN/W ; ; NO-DOS ERROR LDY DLINK ; POINT TO LINK LDA (FMSZPG),Y ; CHECK FOR ; ; NEXT LINK (10-BITS) ANDCD AND #$03 ; BEING ZERO PHA ; SAVE UPPER ; ; BYTE OF ADDRESS INY ORA (FMSZPG),Y ; 0=LOADING BEQ BOOTXT ; IS COMPLETE LDA (FMSZPG),Y ; ELSE, IT'S ; ; THE ADDRESS OF ; ; NEXT SECTOR PHA ; LOWER BYTE JSR MVBUFR ; INC DCB BUFF PLA TAY ; LOW BYTE IN Y PLA ; HI BYTE ADDR BCC INITLP ; CLEAR CY=READ ; NODOS LDA #$C0 ; NO DOS TO BOOT ; ; ERROR CODE .BYTE $A0 ; TRICKY LDY $68 ; ; INSTEAD OF PLA ; BOOTXT PLA DOSXIT ; ; SET CARRY AND ASL A ; CONVERT CODE ; ; TO FINAL VALUE ; ; AT SAME TIME ; ; CY SET=SIO ERROR ; TAY ; Y IS SIO ERROR ; ; # RETURN ; ; REGISTER RTS ; AND EXIT ; ;*MOVE BUFFER POINTERS TO NEXT ; AREA TO BE LOADED ; MVBUFR LDA DLINK ; DATA BYTES CLC ; IN EACH SECTOR ADC FMSZPG ; ADDED TO THE ; CURRENT BUFFER ADDRESS TAY ; SAVE LO BYTE LDA FMSZPG+1 ADC #0 ; NOW ADD HI BTSET STY FMSZPG ; SAVE IT TO STA FMSZPG+1 ; ZPAGE DCB BUFSET STY DBUFLO ; SAVE IT TO STA DBUFHI ; SIO DCB RTS ; ; ;*PERFORM DISK ; READ(CY=0) OR ; WRITE (CY=1) ; ; ; DKIO ; ; STORE HI-LO STA DAUX2 ; BYTES OF SEC # STY DAUX1 ; TO SIO DCB DKIO2 LDY #3 ; 3 RETRIES LDA #READ BCC SETRTY ; CY=0=READ LDA WRCMDB ; CY=1=WRITE ; SETRTY STY TMP1 ; # OF RETRIES DKFME STA DCOMND CLC LDA #WRITEV ; ADDRESS 0779 = ; DOS 2.0 WRITE OR WRITE WITH ; VERIFY ADDRESS - SOME APPS ; MAY POKE ON THEIR OWN WRCMDB = *-1 ; STY DTIMLO LDA #128 ; ASSUME SD DEX BEQ STBUFL LDX DAUX2 ; 1=256SEC=DD BNE SET256 LDX DAUX1 CPX #4 ; SEC<=3 R/W BCC STBUFL ; SD ONLY SET256 ASL A ; MAKE IT DD STBUFL STA DBYTLO ; STORE SEC SIZE ROL A ; INTO SIO DCB STA DBYTHI LDY #DKADDR ; D1:# INTO SIO STY DDEVIC ; DCB IORTRY DEC TMP1 ; # OF RETRIES BMI DIOXIT ; ALL USED UP LDX DCOMND INX TXA LDX #FROMDK ; ASSUME READ AND #$06 ; 00000110 BNE ISREAD ; IF NOT X0,X7, ; ; X8 OR XF, OK LDX #TODK ; ELSE, WRITE ISREAD ; ; RESTORE STATUS STX DSTATS ; TO DCB JSR SIOV ; DO I/O THRU OS DEY BMI IORTRY ; IF BAD, RETRY ; DIOXIT ; ; ELSE, LOAD FCB LDX CURFCB ; OFFSET INY ; SIO ERROR # TYA ; DO CY FLAG RTS ; ; ;*FIXED RAM DEFINITIONS IN BOOT ; SECTORS ; DIUNIT ; ; UNIT # OF *= *+1 ; CURRENT DIR CDIREC ; ; SEC # OF *= *+2 ; CURRENT DIR HOLFN ; *= *+1 STATE .BYTE $70 ; 01110000 ; DUP loaded, MEM.SAV inactive ; Warmstart ; ; bit 7 -- MEM.SAV in use ; bit 6 -- DUP.SYS loaded ; bit 5 -- AUTORUN.SYS ran ; bit 4 -- Initial BUILD active ; STKPSV ; ; SAVED STACK *= *+1 ; POINTER ; *= $07C0 ; MUST MATCH DUP ; ; LOCATION ; TRACKS ; ; TRACKS IN EACH .BYTE 35,40,80,77 ; DISK ; ; FORMAT ; SECSIZ ; ; BUFFER SIZE .BYTE 0,0,0,0 ; TABLE .BYTE 0,0,0,0 ; ; ;*DRIVE CONFIGURATION TABLE ; ; DRVDEF .BYTE $52,$52,$D2,$D2 .BYTE $D2,$D2,$D2,$D2 ; ; BIT 7=1 => NO DRIVE ; BIT 6=1 => ATARI 810 DRIVE ; BIT 5-4 IS (0=35, 1=40, ; 2=80, 3=77 TRACKS(8") ; BIT 3=1 => DOUBLE DENSITY ; BIT 2-1 IS DRIVE STEP RATE ; BIT 0=1 => DOUBLE SIDED ; ; ;*DOS HATAB VECTOR TABLE ; ; DKEPT .WORD DKOPEN-1 .WORD DKCLOS-1 .WORD DKREAD-1 .WORD DKWRIT-1 .WORD DKSTAT-1 .WORD DKXIO-1 ; ; *= $07E0 ; DOSINI ; ;*INIT DRIVE TYPES ; INIT LDA # <361 STA CDIREC LDA # >361 STA CDIREC+1 ; ;*IDENTIFY DRIVE TYPES ; LDX #8 IDRVLP STX DUNIT JSR ZERDVS ; ASSUME THE ; ; DRIVE IS NOT PRESENT LDA DRVDEF-1,X BMI NXTDRV ; IF NOT ; ; DECLARED, WE ARE DONE ; JSR JSTRD ; ELSE, READ ITS ; ; STATUS BEQ NXTDRV ; IF ABSENT, GO ; ; ON TO THE NEXT ONE LDY #9 WOTCPY LDA WOTDCB,Y STA DDEVIC+2,Y DEY BPL WOTCPY LDA DRVDEF-1,X CMP #$40 BCS NXTDRV ; IF NOT ; ; CONFIGURABLE, CONTINUE LDY SECSIZ-1,X JSR SETDRV ; TELL IT ABOUT ; ; MY CONFIGURATION ; NXTDRV ; ; STEP TO NEXT DEX ; DRIVE NUMBER BNE IDRVLP ; DO 'EM ALL ; ;*ZERO INITIALIZED MEMORY ; LDY #MAPBUF+7-CHGMAP TXA ; NOTE X=0 HERE ZERLP1 STA CHGMAP-1,Y DEY BNE ZERLP1 INC MAP2MOD ; ;*DEFINE TOP OF FMS FOR USER ; PROGRAM ; LDA DOSEND STA MEMTOP LDY DOSEND+1 ; ;*ALLOCATE FILE SECTOR BUFFERS ; LDX #15 ; MAX OF 16 ; ; SECTOR BUFFERS DKBFLP ; ; EMPTY BUFFERS CPX FILES ; DONE? BCC ALCBUF DEC BUFFLG,X BMI DKBFSQ ALCBUF TYA STA SBTABU,X INY DKBFSQ ; ; BUMP BUFFER DEX ; COUNTER BPL DKBFLP ; DO 'EM ALL STY MEMTOP+1 ; SAVE MEMTOP ; ;*SET UP HANDLER VECTOR ; FNDHND ; ; LOOK FOR 'D' INX ; IN HANDLER INX ; TABLE INX LDA HATABS-2,X BEQ NOHAND ; FOUND EOT - SO ; ; INSTALL 'D' CMP #$44 ; 'D' ALREADY ; ; PRESENT? BNE FNDHND ; NO, GET NEXT ; ; ENTRY ; NOHAND ; ; WRITE OVER 'D' LDA #$44 ; OR AT END OF ; ; TABLE STA HATABS-2,X LDA # DKEPT ; THIS MAKES STA HATABS,X ; IT ALL WORK JMP DUPINV ; GO DUP INIT ; ; [overwritten by MDUP] ; ;*DOS NON-ZERO PAGE RAM ; ALLOCATIONS ; CHGMAP *= *+1 CURMAP *= *+1 MAP2 *= *+1 MAP2MOD *= *+1 LSTSEC *= *+2 LSTIOCB *= *+1 ; ;*MYDOS FCB STRUCTURE (ALMOST ; THE SAME AS ATARI DOS 2.0) ; FCBFNO *= *+1 FCBOTC *= *+1 ; ;OPEN TYPE CODE FCBFLG *= *+1 MAXLEN *= *+1 CURLEN *= *+1 BUFNO *= *+1 CURSEC *= *+2 LNKSEC *= *+2 SECCNT *= *+2 DIRBAS *= *+2 ; ; BASE ADDRESS ; ; OF CUR. SECTOR SAVSEC *= *+2 FCBLEN = 16 *= *+7*FCBLEN ; SPACE FOR ; ; THE REMAINING 7 IOCBs ; BUFFLG ; ; IF 0, BUFFER *= *+16 ; NOT IN USE ; SBTABU ; ; UPPER BYTE OF *= *+16 ; THE SECTOR ; ; BUFFER ADDRESS ; MAPBUF ; ; SPACE FOR *= *+512 ; VTOCs AND DIRs DIRBUF = MAPBUF ; FNAME *= *+12 CURMP *= *+1 ; BASE = * ; HDTAB ; ; 8 LOGICAL HARD .WORD 0,0,0,0 ; DRIVES OF .WORD 0,0,0,0 ; UP TO 65535 ; ; SECTORS EACH ; ;***** ;NOTE: this table is referenced ; by DUP.SYS, and should not be ; moved! ; ;*DOS CONFIGURATION CODE ; ;*CONTROL BLOCK TO BE WRITTEN TO ; A DRIVE TO CONFIGURE IT ; WOTDCB .BYTE $4E,$40 .WORD DIRBUF,1 .WORD 12,4 ; ;*THE CONFIGURATION CODE, FORCES ; A DRIVE INTO THE APPROPRIATE ; CONFIGURATION ; SETDRV AND #$3F ; EXTRACT CONFIG ; ; BITS STA TMP1 STY TMP2 JSR SIOV ; READ CURRENT ; ; CONFIGURATION BMI JSTRD LDA TMP1 LDY TMP2 LSR A PHA ; SAVE FOR LATER AND #3 ; GET STEP RATE STA DIRBUF+1 LDA #0 STA DIRBUF+2 ROL A STA DIRBUF+4 ; 2 SIDED FLAG TYA ; GET DENSITY LSR A STA DIRBUF+6 ; HI SEC SIZE ROR A STA DIRBUF+7 ; LO SEC SIZE ROL A ASL A ASL A STA DIRBUF+5 PLA ; BEATS REREAD LSR A LSR A LSR A TAY LDA TRACKS,Y ; GET NUMBER OF STA DIRBUF ; TRACKS AND #$04 ; 77 TRACK=8" PHA LSR A ORA DIRBUF+5 ; MERGE DD & 8" STA DIRBUF+5 ; FLAGS PLA ASL A ; MAKE 0 OR 8 ADC #18 ; SECs=18 OR 26 STA DIRBUF+3 LDY DUNIT LDA HDTAB-1+8,Y BEQ TOSIOV STA DIRBUF+2 ; SIZE=SECs/TK LDA HDTAB-1,Y STA DIRBUF+3 ; LO SIZE LDA #1 STA DIRBUF ; 1 TRACK/DRIVE TOSIOV ; ; CHANGE COMMAND INC DCOMND ; TO WRITE LDA #$80 STA DSTATS ; WRITE CONFIG JSR SIOV ; TO DRIVE ; JSTRD LDA #RDSTAT STA DCOMND JSR DSKINV LDX DUNIT TYA BMI ZERDVS LDA DVSTAT ASL A ASL A ASL A ; SEC SIZE INTO LDA #1 ; CY ADC #0 SETSIZ STA SECSIZ-1,X ; STORE IT RTS ; ZERDVS LDA #0 BEQ SETSIZ ; BR ALWAYS ; ;*DOS RAMDISK CODE (moved here ; starting with version 4.5) ; ;*RAM DISK I/O HANDLER ; MAPAGE .BYTE $E3,$E7,$EB,$EF .BYTE $83,$87,$8B,$8F .BYTE $C3,$C7,$CB,$CF .BYTE $A3,$A7,$AB,$AF ; .BYTE $93,$97,$9B,$9F .BYTE $D3,$D7,$DB,$DF .BYTE $B3,$B7,$BB,$BF .BYTE $F3,$F7,$FB,$FF ; .BYTE $E3,$E7,$EB,$EF .BYTE $83,$87,$8B,$8F .BYTE $C3,$C7,$CB,$CF .BYTE $A3,$A7,$AB,$AF ; .BYTE $93,$97,$9B,$9F .BYTE $D3,$D7,$DB,$DF .BYTE $B3,$B7,$BB,$BF .BYTE $F3,$F7,$FB,$FF ; VALSEC PHA ; CALC OFFSET TYA ; INTO 16K ORA #$80 ; BANK LSR A STA BUFR+1 SEI ; DISABLE INT-S LDA #0 STA NMIEN ; DISABLE NMI-S ROR A STA BUFR PLA TAY LDA MAPREG ;*L ORA #$1C ; applied Basic NOP ; patch to work NOP ; with large & STA CHKSUM ;*L ORA #$7C ; unique RD NOP ; add filler nop NOP ; to remain ;*L AND MAPAGE,Y ; usable... LDA MAPAGE,Y ; Lee STA MAPREG ; SELECT RAMDISK ; ; BANK ; LDA DBUFLO ; US SIO ADD IN STA BUFR+2 ; ZPAGE LDA DBUFLO+1 STA BUFR+3 LDY #0 PLP ; CY=0=READ BCC RREADL ; CY=1=WRITE RWRITL LDA (BUFR+2),Y STA (BUFR),Y INY BPL RWRITL BMI RIOX ; RDKIO ; ; ENTRY POINT STY DAUX1 ; DAUX2 IN A CPY #$80 ; SET CY TO TEST ROL A ; SHIFT FOR TEST CMP #4 RDKLMT = *-1 ; ; NUMBER OF 16K ; ; BANKS IN RAMDISK BCC VALSEC ; PASSED >MAX PLP LDA #139 ; ALL RD ERRORS BMI RERROR ; RREADL LDA (BUFR),Y STA (BUFR+2),Y INY BPL RREADL ; RIOX ; ; GET HOME BANK LDA CHKSUM ; BACK BEFORE STA MAPREG ; EXITING LDA #$C0 STA NMIEN ; ALLOW NMI CLI ; ALLOW INTs LDA #1 ; SIO 'GOOD' RERROR ; ; PUT A IN STA DSTATS ; SIO STATUS LDX CURFCB ; GET FCB # TAY ; DO FLAGS REG RTS ; THEN EXIT ; ; STEPBP LDA DBUFLO EOR #$80 STA DBUFLO BMI TSTEOD INC DBUFHI ; TSTEOD LDY DAUX1 RTS