10 ;  SAVE #D1:DISKOPS.M65
20 ;
30 ;
40 ;  LOAD #D1:PARALLEL.M65
50 ;
60 ;
70 ;    *= $C58B
79       .PAGE "Disk Handler and Boot"
80        LIST  
90       .LOCAL 
050571 INITDOS LDA WARMST If a 0 here
050573   BEQ ?READD  then try to boot
050575   LDA BOOT?   Else on reset &
050577   AND #1      if no disk boot
050579   BEQ ?NODISK just rts; else
050581   JMP ?XPROG  goto booted pgm
050584 ?READD LDA #1 Check status
050586   STA DUNIT   on D1:
050589   LDA #'S
050591   STA DCOMND  Change to
050594   JSR DSKINV  check all
050597   BMI ?NODISK
050599 ?READ1 LDA #0 Read sector 1
050601   STA DAUX2
050604   LDA #1
050606   STA DAUX1
050609   LDA #0      into page 4
050611   STA DBUFLO
050614   LDA #4
050616   STA DBUFHI
050619 ?XREAD1 JSR ?GET1 Go read 1st
050622   BPL ?GOT1ST and exit if ok
050624 ?ERROR JSR ?NOBOOT
050627   LDA CASSBT  If cassette go
050630   BEQ ?READ1  try it
050632 ?NODISK RTS 
050633 ?GOT1ST LDX #3
050635 ?COPY4 LDA $0400,X Copy first
050638   STA DFLAGS,X four bytes to
050641   DEX         DFlags & Bootad
050642   BPL ?COPY4
050644   LDA BOOTAD  Copy Bootad to
050647   STA RAMLO   Ramlo/hi
050649   LDA BOOTAD+1
050652   STA RAMHI
050654   LDA $0404   Bytes 5 and 6
050657   STA DOSINI  to Dosini
050659   LDA $0405
050662   STA DOSINI+1
050664 ?SAVBUF LDY #127 Boot secs SD
050666 ?SLOOP LDA $0400,Y ; Copy from
050669   STA (RAMLO),Y ;    page4 to
050671   DEY         ;    address in
050672   BPL ?SLOOP  ;     Ramlo/hi
050674   CLC         Bump pointer
050675   LDA RAMLO   by 128
050677   ADC #$80
050679   STA RAMLO
050681   LDA RAMHI
050683   ADC #0
050685   STA RAMHI
050687   DEC DBSECT  Dec sectors to
050690   BEQ ?DONE   do and
050692   INC DAUX1   point to next
050695 ?NEXT JSR ?GET1 Get it and if
050698   BPL ?SAVBUF ok, move to Ram
050700   JSR ?NOBOOT Oops
050703   LDA CASSBT
050706   BNE ?ERROR
050708   BEQ ?NEXT   Go always
050710 ?DONE LDA CASSBT
050713   BEQ ?NOTAPE
050715   JSR ?GET1
050718 ?NOTAPE JSR ?XBOOT
050721   BCS ?ERROR
050723   JSR ?XPROG
050726   INC BOOT?
050728   RTS 
050729 ?XBOOT CLC    Exec boot loader
050730   LDA BOOTAD
050733   ADC #6
050735   STA RAMLO
050737   LDA BOOTAD+1
050740   ADC #0
050742   STA RAMHI
050744   JMP (RAMLO)
050747 ?XPROG JMP (DOSINI)
050750 ?NOBOOT LDX # <MSGBERR Display
050752   LDY # >MSGBERR boot error
050754   TXA         message
050755   LDX #0
050757   STA ICBAL,X
050760   TYA 
050761   STA ICBAH,X
050764   LDA #9
050766   STA ICCOM,X
050769   LDA #$FF
050771   STA ICBLL,X
050774   JMP CIOV
050777 ?GET1 LDA CASSBT Get next
050780   BEQ ?GETSEC block or sector
050782   JMP RBLOKV
050785 ?GETSEC LDA #'R
050787   STA DCOMND
050790   LDA #1
050792   STA DUNIT
050795   JMP DSKINV
050798 BOOTTAPE LDA WARMST Attempt
050800   BEQ ?READC  cassette boot
050802   LDA BOOT?   If no tape
050804   AND #2      boot flagged
050806   BEQ ?CQUIT  then exit
050808   JMP ?XTAPE
050811 ?READC LDA CKEY Start pressed?
050814   BEQ ?CQUIT  No
050816   LDA #$80    Continuous
050818   STA FTYPE   records
050820   INC CASSBT  Flag tape boot
050823   JSR CSOPIV  Open cassette
050826   JSR ?XREAD1 Read first block
050829   LDA #0
050831   STA CASSBT  Clear
050834   STA CKEY    these
050837   ASL BOOT?   Make Boot?=2
050839   LDA DOSINI  Set
050841   STA CASINI  reset
050843   LDA DOSINI+1 vector
050845   STA CASINI+1
050847 ?CQUIT RTS 
050848 ?XTAPE JMP (CASINI)
050851 DSKINI LDA #160 Init Disk i/o
050853   STA DSKTIM
050856   LDA #$80    Single density
050858   STA DSCTLN  sector size
050861   LDA #0
050863   STA DSCTLN+1
050866   RTS 
050867 DODISK LDA #$31 Disk i/o
050869   STA DDEVIC
050872   LDA DSKTIM
050875   LDX DCOMND  This is why you
050878   CPX #'!     can't use Dskinv
050880   BEQ ?TIME   to format ED
050882   LDA #7      Read/Write time
050884 ?TIME STA DTIMLO
050887   LDX #$40    From disk
050889   LDA DCOMND
050892   CMP #'P
050894   BEQ ?ISPUT
050896   CMP #'W
050898   BNE ?STAT?
050900 ?ISPUT LDX #$80 To disk
050902 ?STAT? CMP #'S
050904   BNE ?NOTS
050906   LDA # <DVSTAT Read status
050908   STA DBUFLO
050911   LDA # >DVSTAT
050913   STA DBUFHI
050916   LDY #4
050918   LDA #0
050920   BEQ ?XSIO   go always
050922 ?NOTS LDY DSCTLN
050925   LDA DSCTLN+1
050928 ?XSIO STX DSTATS
050931   STY DBYTLO
050934   STA DBYTHI
050937   JSR SIOV
050940   BPL ?CONT
050942   RTS         exit on error
050943 ?CONT LDA DCOMND
050946   CMP #'S
050948   BNE ?REPORT
050950   JSR ?SETBUF
050953   LDY #2      Get disk format
050955   LDA (BUFADR),Y time from
050957   STA DSKTIM  status frame
050960 ?REPORT LDA DCOMND
050963   CMP #'!
050965   BNE ?ENDREP
050967   JSR ?SETBUF Format report,
050970   LDY #$FE    Want zero so
050972 ?BUMP2 INY    allow for pre-
050973   INY         increment here.
050974 ?FF? LDA (BUFADR),Y Look for
050976   CMP #$FF    two bytes of $FF
050978   BNE ?BUMP2
050980   INY         Code designed
050981   LDA (BUFADR),Y for 810 drive
050983   INY         which returns
050984   CMP #$FF    bad sector list
050986   BNE ?FF?    into buffer.
050988   DEY         Point to byte
050989   DEY         before the $FF's
050990   STY DBYTLO  and report as
050993   LDA #0      sector size
050995   STA DBYTHI
050998 ?ENDREP LDY DSTATS
051001   RTS 
051002 ?SETBUF LDA DBUFLO Set buffer
051005   STA BUFADR  address
051007   LDA DBUFHI
051010   STA BUFADR+1
051012   RTS 
