;================================================= ;= MYDOS BOOT CODE == ;================================================= ; ; DISK BOOT SECTORS (3) ; ORG $0700 ;DOS.BOOT LOADS AT 0700 BOOTFL DB 'M' ;INDICATE MYDOS 4.5 OR LATER BOOTL DB 3 ;NUMBER OF SECTORS IN THE BOOT BOOTAD DW BOOTFL ;ADDRESS OF BOOT CODE IN RAM BOOTIN DW INIT JMP INBOOT ;JUMP TO THE BOOT CONTINUATION FILES DB 3 ;NUMBER OF FILES THAT MAY BE OPEN AT ONCE ;DRIVES = * ;USED TO BE BIT PATTERN FOR DRIVES RAMDKU DB $09 ;RAM DISK UNIT # ;BUFALC = * ;USED TO BE BUF. ALLOC. DIR. DEFAULT DB 1 ;DEFAULT UNIT NUMBER DOSEND DW BOOTND ;ADDRESS OF THE FIRST BYTE OF FREE MEM. SECDAT DB 1 ;1=128 BYTE SECTOR/2=256 BYTE SECTOR DOSLOC DW 4 ;SECTOR ADDRESS OF DOS.SYS DLINK DB LK128 ;OFFSET TO THE SECTOR LINK FIELD DOSAD DW BASE ;ADDRESS TO LOAD DOS.SYS INTO ; INBOOT LDY DOSAD ;SET UP START OF DOS AS BUFFER ADDRESS LDA DOSAD+1 JSR BTSET ;LOW ADDR IN Y, HIGH IN A ; LDA DOSLOC+1 LDY DOSLOC ;PUT DOS DISK ADDRESS INTO (A,Y) ; ; DOS.SYS INPUT LOOP ; INITLP CLC ;CLEAR CY, 'DO A READ' LDX SECDAT ;GET CODE FOR SECTOR SIZE BEQ NODOS ;IF ZERO, NO DOS ON DISK! JSR DKIO ;INVOKE DISK I/O ROUTINE BMI NODOS ;IF AN ERROR, RETURN 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 ;IF SO, LOADING IS COMPLETE BEQ BOOTXT LDA (FMSZPG),Y ;ELSE, IT'S THE ADDRESS OF NEXT SECTOR PHA ;SAVE LOWER BYTE ON STACK JSR MVBUFR ;THEN ADJUST THE BUFFER POINTER IN DCB PLA TAY ;RESTORE LOWER BYTE TO Y-REG PLA ;RECOVER UPPER BYTE OF DISK ADDRESS BCC INITLP ;AND CONTINUE LOADING ; NODOS LDA #$C0 ;NO BOOT PROGRAM ERROR CODE DB $A0 ;SKIP SINGLE BYTE (LDY #) ; BOOTXT PLA DOSXIT ASL A ;SET CARRY, CONVER CODE TO FINAL VALUE TAY ;PUT CODE INTO Y-REG RTS ;AND EXIT ; ; MOVE BUFFER POINTERS TO NEXT AREA TO BE LOADED ; MVBUFR LDA DLINK CLC ADC FMSZPG ;ADD DLINK TO THE CURRENT BUFFER ADDRESS TAY ;LOW BYTE TO Y-REG LDA FMSZPG+1 ADC #0 BTSET STY FMSZPG STA FMSZPG+1 BUFSET STY DBUFLO ;STORE LOW BYTE INTO DCB STA DBUFHI ;THEN UPPER BYTE RTS ; ; PERFORM DISK READ(CY=0) OR WRITE (CY=1) ; DKIO STA DAUX2 ;STORE UPPER BYTE OF SECTOR ADDRESS STY DAUX1 ;THEN LOWER BYTE DKIO2 LDY #3 LDA #READ BCC SETRTY ;IF CY=0, READ INTO RAM LDA WRCMDB ; SETRTY STY TMP1 ;SET NUMBER OF TRIES DKFME STA DCOMND CLC LDA #WRITEV ;CLC AND CONSTANT FOR POKERS WRCMDB = *-1 STY DTIMLO LDA #128 ;ASSUME A 128-BYTE SECTOR SIZE DEX BEQ STBUFL LDX DAUX2 ;SECTOR > 256? BNE SET256 LDX DAUX1 CPX #4 ;SECTOR > 3 BCC STBUFL ;IF NOT SET256 ASL A ;MAKE A 256 BYTE SECTOR SIZE STBUFL STA DBYTLO ROL A STA DBYTHI LDY #DKADDR ;PUT DISK DEVICE CODE INTO DCB STY DDEVIC IORTRY DEC TMP1 BMI DIOXIT LDX DCOMND INX TXA LDX #FROMDK ;ASSUME DATA ==> DISK AND #$06 BNE ISREAD ;IF NOT X0,X7,X8 OR XF, OK LDX #TODK ;ELSE, DATA ==> DISK ISREAD STX DSTATS ;RESTORE STATUS TO DCB JSR SIOV ;DO THE I/O OPERATIONS DEY BMI IORTRY ;IF NOT OK, RETRY ; DIOXIT LDX CURFCB ;ELSE, LOAD FCB OFFSET AND STATUS INY TYA RTS ; ; FIXED RAM DEFINITIONS IN BOOT SECTORS ; DIUNIT DS 1 ;UNIT NO. OF CURRENT DIRECTORY CDIREC DS 2 ;SECTOR NO. OF CURRENT DIRECTORY HOLFN DS 1 STATE DB $70 ;DUP loaded, MEM.SAV inactive, Warmstart ; bit 7 -- MEM.SAV in use ; bit 6 -- DUP.SYS loaded ; bit 5 -- AUTORUN.SYS already run ; bit 4 -- Initial BUILD active ; STKPSV DS 1 ;SAVED STACK POINTER ORG $07C0 ;MUST MATCH DUP LOCATION ; TRACKS DB 35,40,80,77 ;TRACKS IN EACH DISK FORMAT ; SECSIZ DB 0,0,0,0 ;BUFFER SIZE TABLE DB 0,0,0,0 ; DRVDEF DB $52,$52 ;DRIVE CONFIGURATION TABLE: DB $D2,$D2 ;BIT 7=1 => NO DRIVE DB $D2,$D2 ;BIT 6=1 => ATARI 810 DRIVE DB $D2,$D2 ;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.SYS PROGRAM FOLLOWS ; DKEPT DW DKOPEN-1 DW DKCLOS-1 DW DKREAD-1 DW DKWRIT-1 DW DKSTAT-1 DW DKXIO-1 ; ORG $07E0 ; ; IDENTIFY DRIVE TYPES ; INIT LDA #LOW[361] STA CDIREC LDA #HIGH[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 DEX ;STEP TO NEXT DRIVE NUMBER BNE IDRVLP ;IF MORE, LOOK AT THEM ; ; 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 CPX FILES ;EMPTY BUFFERS DONE? BCC ALCBUF DEC BUFFLG,X BMI DKBFSQ ALCBUF TYA STA SBTABU,X INY DKBFSQ DEX ;BUMP BUFFER COUNTER BPL DKBFLP ;IF NOT CONTINUE LOOPING STY MEMTOP+1 ;DEFINE TOP OF MEMORY USED ; ; SET UP HANDLER VECTOR ; FNDHND INX INX INX LDA HATABS-2,X ;END OF THE HANDLER TABLE? BEQ NOHAND ;THEN INSTALL IT HERE CMP #$44 ;A 'D' ALREADY PRESENT? BNE FNDHND ;NO, CONTINUE LOOKING, ELSE OVERWRITE IT ; NOHAND LDA #$44 ;WRITE AT END OF TABLE OR CURRENT "D" ENTRY STA HATABS-2,X LDA #LOW[DKEPT] ;STASH MYDOS ENTRY VECTOR STA HATABS-1,X LDA #HIGH[DKEPT] STA HATABS,X ;BUILD HANDLER VECTOR JMP DUPINV ;DONE, INITIALIZE DUP [overwritten by MDUP] ; ; DOS NON-ZERO PAGE RAM ALLOCATIONS ; CHGMAP DS 1 CURMAP DS 1 MAP2 DS 1 MAP2MOD DS 1 LSTSEC DS 2 LSTIOCB DS 1 ; ; MYDOS FCB STRUCTURE (ALMOST THE SAME AS ATARI DOS 2.0) ; FCBFNO DS 1 FCBOTC DS 1 ;OPEN TYPE CODE FCBFLG DS 1 MAXLEN DS 1 CURLEN DS 1 BUFNO DS 1 CURSEC DS 2 LNKSEC DS 2 SECCNT DS 2 DIRBAS DS 2 ;BASE ADDRESS OF CUR. SECTOR SAVSEC DS 2 FCBLEN = 16 DS 7*FCBLEN ;SPACE FOR THE REMAINING 7 IOCBs ; BUFFLG DS 16 ;IF 0, BUFFER NOT IN USE SBTABU DS 16 ;UPPER BYTE OF THE SECTOR BUFFER ADDRESS MAPBUF DS 512 ;SPACE ALLOCATED FOR VTOC DIRBUF = MAPBUF ;SPACE ALLOCATED TO READ DIRECTORIES FNAME DS 12 CURMP DS 1 ; BASE = * HDTAB DW 0,0,0,0 ;8 LOGICAL HARD DRIVES OF DW 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 DB $4E,$40 DW DIRBUF,1 DW 12,4 ; ; THE CONFIGURATION CODE, FORCES A DRIVE INTO THE APPROPRIATE CONFIGURATION ; SETDRV AND #$3F ;EXTRACT CONF. BITS STA TMP1 STY TMP2 JSR SIOV ;READ CURRENT CONFIGURATION BMI JSTRD LDA TMP1 LDY TMP2 LSR A PHA ;SAVE REMAINING BITS AND #3 ;EXTRACT STEP RATE CODE STA DIRBUF+1 LDA #0 STA DIRBUF+2 ROL A STA DIRBUF+4 ;STORE DOUBLE SIDED FLAG TYA ;GET DENSITY LSR A STA DIRBUF+6 ;STORE UPPER BYTE OF SECTOR SIZE ROR A STA DIRBUF+7 ;THEN LOWER BYTE ROL A ASL A ASL A STA DIRBUF+5 PLA LSR A LSR A LSR A ;POSITION TRACK COUNT FIELD TAY LDA TRACKS,Y ;GET NUMBER OF TRACKS STA DIRBUF AND #$04 ;SEE IF 77 TRACK 8 IN. PHA LSR A ORA DIRBUF+5 ;MERGE D/DENSITY WITH 8 IN. FLAG STA DIRBUF+5 PLA ASL A ;CONVERT TO 0 OR 8 ADC #18 ;SECTOR COUNT = 18 OR 26 STA DIRBUF+3 LDY DUNIT LDA HDTAB-1+8,Y BEQ TOSIOV STA DIRBUF+2 ;SIZE = SECTORS/TK LDA HDTAB-1,Y STA DIRBUF+3 ;LOW BYTE OF SIZE LDA #1 STA DIRBUF ;ONE TRACK/DRIVE TOSIOV INC DCOMND ;CHANGE COMMAND TO WRITE LDA #$80 STA DSTATS ;SET DIRECTION -> DISK JSR SIOV ;WRITE OPTION TABLE TO DRIVE ; JSTRD LDA #RDSTAT STA DCOMND JSR DSKINV LDX DUNIT TYA BMI ZERDVS LDA DVSTAT ASL A ;SECTOR SIZE=256? ASL A ASL A LDA #1 ADC #0 SETSIZ STA SECSIZ-1,X RTS ; ZERDVS LDA #0 BEQ SETSIZ ;ALWAYS BRANCHES! ; ; DOS RAMDISK CODE (moved here starting with version 4.5) ; ; RAM DISK I/O HANDLER (POS. IND. CODE) ; MAPAGE DB $E3,$E7,$EB,$EF DB $83,$87,$8B,$8F DB $C3,$C7,$CB,$CF DB $A3,$A7,$AB,$AF ; DB $93,$97,$9B,$9F DB $D3,$D7,$DB,$DF DB $B3,$B7,$BB,$BF DB $F3,$F7,$FB,$FF ; DB $E3,$E7,$EB,$EF DB $83,$87,$8B,$8F DB $C3,$C7,$CB,$CF DB $A3,$A7,$AB,$AF ; DB $93,$97,$9B,$9F DB $D3,$D7,$DB,$DF DB $B3,$B7,$BB,$BF DB $F3,$F7,$FB,$FF ; VALSEC PHA TYA ORA #$80 LSR A STA BUFR+1 SEI ;DISABLE INT-S LDA #0 STA NMIEN ;DISABLE NMI-S ROR A STA BUFR PLA TAY LDA MAPREG ORA #$1C STA CHKSUM ORA #$7C AND MAPAGE,Y STA MAPREG ;SELECT RAMDISK DATA PAGE ; LDA DBUFLO ;USER BUFFER ADDRESS GOES HERE STA BUFR+2 LDA DBUFLO+1 STA BUFR+3 LDY #0 PLP BCC RREADL ;CY=0 IF READ RWRITL LDA (BUFR+2),Y STA (BUFR),Y INY BPL RWRITL BMI RIOX ; RDKIO STY DAUX1 ;*** FOR FORMAT CODE *** CPY #$80 ROL A CMP #4 RDKLMT = *-1 ;NUMBER OF 16K PAGES IN RAMDISK BCC VALSEC ;CALCULATE MEM. ADDR. PLP LDA #139 BMI RERROR ; RREADL LDA (BUFR),Y STA (BUFR+2),Y INY BPL RREADL ; RIOX LDA CHKSUM ;FORCE REAL RAM PAGE STA MAPREG ;BEFORE EXITING LDA #$C0 STA NMIEN ;RE-ENABLE NMI CLI ;ENABLE INTERRUPTS LDA #1 ;RETURN '1' IN Y-REG RERROR STA DSTATS ;AND IN STATUS BYTE LDX CURFCB ;RESTORE FCB ADDR TAY RTS ;THEN EXIT ; STEPBP LDA DBUFLO EOR #$80 STA DBUFLO BMI TSTEOD INC DBUFHI ; TSTEOD LDY DAUX1 RTS