home *** CD-ROM | disk | FTP | other *** search
- ;idir.asm
- ;===================================================================
- ; Directory for IBM disk (C)1988 - Ampere Metal
- ;===================================================================
- ; idir d:
-
- poker = $0016
- serial = $0a1c
- fstmod = $ff47
- primm = $ff7d
- readst = $ffb7
- talk = $ffb4
- listen = $ffb1
- untlk = $ffab
- unlsn = $ffae
- tksa = $ff96
- second = $ff93
- ciout = $ffa8
- acptr = $ffa5
- chkin = $ffc6
- chkout = $ffc9
- clrchn = $ffcc
- chrin = $ffcf
- chrout = $ffd2
-
- int01 = $1701
- int03 = $1703
- int04 = $1704
- int0e = $170e
-
- * = $070b
-
- byps *=*+2 ;Bytes/Sector (redundant)
- clsz *=*+1 ;Cluster size in sectors (2)
- resvd *=*+2 ;Number of reserved sectors (1)
- cofat *=*+1 ;Number of copies of FAT (2)
- root *=*+2 ;Number of root directory entries ($40 or $70)
- tsec *=*+2 ;Total sectors on disk, including reserved ones (720)
- id *=*+1 ;Format ID ($FD=DS 9)
- fatsiz *=*+2 ;Number of sectors per FAT
- trksiz *=*+2 ;Number of sectors per track
- dsksiz *=*+2 ;Number of sides per disk
- res2 *=*+2 ;Number of special reserved sectors
-
- star = $0b00
- dw star
- * = star
-
-
- idir ldx #1 ;Check for d:
- jsr int04
- sta drive
- bcs id0 ;Not there use default
- jsr int03 ;Legal drive?
- bcs id0 ;No. use default
- lda drive
- jmp id1
-
- id0 jsr int01
- id1 sta letter
- jsr query ;Query disk format
- bmi ibm ;MFM
- exit1 lda #1
- jmp int0e
-
- ibm lda spt ;Make sure 9 sectors/track
- cmp #9
- beq ibm1
- cmp #10
- bne exit1
- ibm1 lda bps ;Make sure 512 bytes/sector
- cmp #<512
- bne exit1
- lda bps+1
- cmp #>512
- bne exit1
- ; jsr bpb ;Get bios parameter block
- jsr primm
- db 13,"Directory of "
- letter db "a:\",13,13,0
- lda #0 ;Get dir. (0,0,6)
- ldx #0
- ldy #6
- jsr getsec ;Get sector
- jsr dosec ;List it
- bcs exit0
- lda #0 ;Repeat for (0,0,7)
- ldx #0
- ldy #7
- jsr getsec
- jsr dosec
- bcs exit0
- lda #0 ;Repeat for (0,0,8)
- ldx #0
- ldy #8
- jsr getsec
- jsr dosec
- bcs exit0
- lda #0 ;Repeat for (0,0,9)
- ldx #0
- ldy #9
- jsr getsec
- jsr dosec
- exit0 ldy #2
- psum lda bytes,y
- sta len,y
- dey
- bne psum
- lda #13
- jsr chrout
- jsr h2a
- lda #" "
- jsr chrout
- jsr primm
- db "Bytes in ",0
- ldx files
- lda files+1
- jsr $8e32
- jsr primm
- db " Files",13,0
- lda #0
- jmp int0e
-
- files dw 0
- bytes dw 0,0
-
- ;--------------------------------
- ; Subroutine: List IBM directory
- ;--------------------------------
-
- dosec lda #<$0400 ;Sector at $0400
- sta poker
- lda #>$0400
- sta poker+1
- lda #16 ;16 entries per sector
- sta entry
- lda #13
- jsr chrout
- dos0 ldy #0
- lda (poker),y
- bne dos1 ;End of dir if null
- sec
- rts
-
- dos1 cmp #$e5
- bne dos2
- jmp dos6
-
- dos2 jsr chrout
- iny
- lda (poker),y
- cpy #8
- bne dos2
- lda #" "
- jsr chrout
- dos3 lda (poker),y
- jsr chrout
- iny
- cpy #11
- bne dos3
- lda #" "
- jsr chrout
- ldx #0
- lda (poker,x)
- cmp #"."
- bne dos4
- dos5 jsr primm
- db "<DIR> ",0
- jmp dos9
-
- dos4 lda (poker),y
- and #$10
- bne dos5
- ldy #28
- clc
- lda (poker),y
- sta len
- adc bytes
- sta bytes
- iny
- lda (poker),y
- sta len+1
- adc bytes+1
- sta bytes+1
- iny
- lda (poker),y
- sta len+2
- adc bytes+2
- sta bytes+2
- jsr h2a
- lda #" "
- jsr chrout
- jsr chrout
- inc files
- bne dos9
- inc files+1
- dos9 ldy #24
- lda (poker),y
- tax
- iny
- lda (poker),y
- tay
- jsr $1715
- lda #" "
- jsr chrout
- ldy #22
- lda (poker),y
- tax
- iny
- lda (poker),y
- tay
- jsr ptime
- lda #13
- jsr chrout
- dos6 clc
- lda poker
- adc #32
- sta poker
- bcc dos7
- inc poker+1
- dos7 dec entry
- bne dos8
- clc
- rts
-
- dos8 jmp dos0
-
-
- ;-------------------------------
- ;output a hex # in ascii decimal
- ;-------------------------------
-
-
- h2a ldx #0 ;initialize indexes
- ldy #0
- sty $02
- loop lda #"0" ;initialize digit
- sta ascii,x
- loop2 sec
- lda len
- sbc table,y
- pha ;increment the digit?
- lda len+1
- sbc table+1,y
- pha
- lda len+2
- sbc table+2,y
- bcc nxdigt ;branch if 'no'
- sta len+2
- pla
- sta len+1
- pla ;adjust the hex value
- sta len ;and increment the digit
- lda #$ff
- sta $02
- inc ascii,x
- bne loop2
-
- nxdigt pla
- pla
- iny ;prepare for next digit
- iny
- iny
- iny
- inx
- bit $02
- bmi nadj
- lda #" "
- sta ascii-1,x
- nadj cpx #8
- bcc loop
- npr nop
- ldy #0 ;prepare to send number
- loop3 cpy #2
- beq pcom
- cpy #5
- bne nocom
- pcom lda ascii-1,y
- cmp #" "
- beq ppcom
- lda #","
- ppcom jsr chrout
- nocom lda ascii,y
- jsr chrout
- iny
- cpy #8
- bcc loop3
- rts ;done, return
-
-
- table dw 38528, 152
- dw 16960, 15
- dw 34464, 1
- dw 10000, 0
- dw 1000, 0
- dw 100, 0
- dw 10, 0
- dw 1, 0
-
- ;----------------------------------------------------
- ; Subroutine: Query disk format. Returns table below
- ;----------------------------------------------------
- ; Call with drive letter in .a
- ; Returns dtype in .a
-
- drive db 0 ;Drive ('0','1',...)
- unit db 0 ;Unit (8,9,...)
- fstat db 0 ;Save fast serial status
- dtype db 0 ;Disk type. Bit 7=1 if MFM, Bit 6=1 if Fast serial
- trk db 0 ;Current track
- bps dw 0 ;Bytes per sector
- spt db 0 ;Sectors per track
- sec0 db 0 ;First sector number
- secf db 0 ;Last sector number
- seci db 0 ;Hard sector interleave
- dummy db 0 ;Don't know what this is
-
- ss dw 0,256,512,1024
- u08a0 db 0,$8a,"0u"
-
- query stx qsx+1 ;Preserve .x and .y
- sty qsy+1
- jsr int03 ;Get unit, drive
- bcc q0 ;Drive letter was OK.
- rts ;Else return SEC=error
-
- q0 sta drive ;Save drive
- stx unit ;And device
- lda serial ;Save fast serial flag
- and #%01000000
- sta dtype
- lda unit ;Send 'query disk format' command
- jsr listen
- lda #$6f
- jsr second
- ldy #3
- q1 lda u08a0,y
- jsr ciout
- dey
- bpl q1
- jsr unlsn
- sei
- bit serial
- bvs q2
- qx jsr clrchn ;Done if not fast serial
- cli
- clc
- qsx ldx #0
- qsy ldy #0
- lda dtype
- rts
-
- q2 lda $dd00 ;ATN low
- and #$ef
- sta $dd00
- clc ;Fast serial for input
- jsr fstmod
- bit $dc0d ;Clear flags
- lda $dd00 ;Toggle clock
- eor #$10
- sta $dd00
- jsr getbyt ;Get status
- sta fstat ;Save it
- bpl qx ;Done if GCR disk
- pha
- lda dtype
- ora #$80
- sta dtype
- pla
- and #%00110000 ;Else calculate bytes/sector
- lsr a
- lsr a
- lsr a
- tay
- lda ss,y
- sta bps
- lda ss+1,y
- sta bps+1
- lda fstat
- and #$0f
- sta fstat
- jsr getbyt ;Don't know what this is
- sta dummy
- jsr getbyt
- sta spt
- jsr getbyt
- sta trk
- jsr getbyt
- sta sec0
- jsr getbyt
- sta secf
- jsr getbyt
- sta seci
- jmp qx
-
- getbyt lda #8
- gb0 bit $dc0d
- beq gb0
- gb1 lda $dd00
- eor #$10
- sta $dd00
- lda $dc0c
- rts
-
- ;-------------------------------------------------------
- ; Subroutine: Read MFM (side,track,sector) (.a, .x, .y)
- ;-------------------------------------------------------
-
- u064 db 0,1,0,0,64,"0u"
-
- getsec asl a ;Convert side (0,1) to (0 or 64)
- asl a
- asl a
- asl a
- asl a
- asl a
- sta u064+4
- stx u064+3 ;Track
- stx u064 ;Next track
- sty u064+2 ;Sector
- lda unit
- jsr listen
- lda #$6f
- jsr second
- ldy #6
- gs0 lda u064,y ;Send READ command
- jsr ciout
- dey
- bpl gs0
- jsr unlsn
- sei
- bit $dc0d
- jsr gb1 ;Dummy read to toggle clock
- jsr getbyt ;Get status
- and #15 ;Mask out all except controller status
- cmp #2 ;2 or higher is an error
- bcs gsx ;Error. Don't do anything
- ldy #0
- gs2 jsr getbyt ;Read loop
- sta $0400,y
- iny
- bne gs2
- gs3 jsr getbyt
- sta $0500,y
- iny
- bne gs3
- clc
- gsx cli
- rts
-
- ;------------------------------------------------------------------
- ; Subroutine: Fetch Bios parameter block and set variables from it
- ;------------------------------------------------------------------
-
- dirsec db 0 ;First logical sector for the directory
- drsize db 0 ;Number of directory sectors
- dtasec db 0 ;First data sector
- secpt db 0 ;Sectors/Track (both sides)
-
- bpb lda #0 ;Fetch (side 0, track 0, sector 1)
- ldx #0
- ldy #1
- jsr getsec
- bcc bpb0 ;OK, continue
- rts
-
- bpb0 ldy #30 ;Copy Bios parameter block to a safe place
- bpb1 lda $0400,y
- sta $1b40,y
- dey
- bne bpb1
- lda root ;Number of dir entries
- lsr a ;/16=number of dir sectors
- lsr a
- lsr a
- lsr a
- sta drsize
- lda resvd ;1st dir=resvd+cofat*fatziz+1
- sta dirsec
- inc dirsec
- ldx cofat
- bpb2 clc
- lda dirsec
- adc fatsiz
- sta dirsec
- dex
- bne bpb2
- clc ;1st data sector=1st dir+dirsize
- adc drsize
- sta dtasec
- lda trksiz ;Sector/Track=sectors/track*number of sides
- sta secpt
- lda dsksiz
- cmp #1
- beq bpb3
- asl secpt
- bpb3 clc
- rts
-
- ;-----------------------------------------------------
- ; Subroutine: Convert logical sector into bios sector
- ;-----------------------------------------------------
-
- t db 0
- s db 0
- z db 0
- l dw 0
-
- csec stx l ;Save logical sector
- sty l+1
- lda #0 ;t=0
- sta t ;t=logical sector/secpt
- sta s ;s=side=0
- tya
- ldy #8
- sec
- sbc secpt
- csec0 php
- rol t
- asl l
- rol a
- plp
- bcc csec1
- sbc secpt
- jmp csec2
-
- csec1 adc secpt
- csec2 dey
- bne csec0
- bcs csec3
- adc secpt
- clc
- csec3 rol t
- cmp trksiz ;Remainder > sectors/track?
- bcc csec4 ;on side 1
- beq csec4
- inc s
- sec
- sbc trksiz
- csec4 sta z
- lda s
- ldx t
- ldy z
- rts
-
-
-
- ascii db 0,0,0,0,0,0,0,0
- len db 0,0,0
- entry db 0
-
- ;------------------------
- ; Subroutine: Print time
- ;------------------------
-
- time dw 0
-
- ptime stx time
- sty time+1
- tya
- lsr a
- lsr a
- lsr a
- cmp #12
- php
- sec
- sbc #12
- tax
- cmp #10
- bcs nsp
- lda #" "
- jsr chrout
- nsp lda #0
- jsr $8e32
- lda #":"
- jsr chrout
- asl time
- lda time+1
- rol a
- asl time
- rol a
- asl time
- rol a
- and #%00111111
- tax
- cmp #10
- bcs nnsp
- lda #"0"
- jsr chrout
- nnsp lda #0
- jsr $8e32
- lda #"p"
- plp
- bcc pp
- lda #"a"
- pp jsr chrout
- lda #" "
- jmp chrout
-
- .end
-