home *** CD-ROM | disk | FTP | other *** search
- ; THIS IS A PROGRAM TO FORMAT CPM DISKS USEING A VERSAFLOPPY II DISK
- ; CONTROLLER. NOTE IT IS SELF A CONTAINED PROGRAM (EXCEPT FOR CONSOLE I/O)
- ; IT DOES NOT REQUIRE THE ROM BIOS TO FORMAT A DISK.
- ;
- ; JOHN MONAHAN 5/21/81 VERSION 0.0
- ;
- ;
- ;
- NBYTES EQU 128 ;BYTES PER SECTOR (*2 FOR 256 BYTE SECTORS)
- LF EQU 0AH
- CR EQU 0DH
- BELL EQU 07H
- CLEAR EQU 1AH
- TAB EQU 09H
- ;
- CI EQU 0F003H ;CONSOLE INPUT
- CO EQU 0F009H ;CONSOLE OUTPUT
- ;
- TADDR EQU 40H ;STORE FOR DMA ADDRESS
- UNIT EQU 42H ;NEW UNIT BYTE
- SCTR EQU 43H ;SECTOR
- TRK EQU 44H ;TRACK
- ERMASK EQU 46H ;ERROR MASK
- ERSTAT EQU 47H ;PRESENT ERROR STORE
- CMDSV EQU 4EH ;COMMAND SAVE
- SPSV EQU 4FH ;SP SAVE
- TEMP2 EQU 51H ;2 BYTE TEMP RECORD
- UNITCK EQU 55H ;OLD UNIT BYTE
- SSTACK EQU 80H ;SYSTEM STACK
- COLD EQU 80H ;COLD START ADDRESS
- ;
- ; PORTS FOR 1791
- RSET EQU 60H ;CONTROLLER RESET ADDRESS
- SELECT EQU 63H ;DRIVE SELECT PORT
- STATUS EQU 64H ;STATUS PORT
- TRACK EQU 65H ;TRACK PORT
- SECTOR EQU 66H ;SECTOR PORT
- DATA EQU 67H ;DATA PORT
- CMD EQU 64H ;COMMAND PORT
- ;
- RDACMD EQU 0C0H ;READ ADDRESS CODE
- RDCMD EQU 088H ;READ SECTOR CODE
- WRCMD EQU 0A8H ;WRITE SECTOR CODE
- WRTCMD EQU 0F4H ;WRITE TRACK CODE
- ;
- ;
- ; EQUATES FOR [IX] REGISTRAR
- ;
- NSCTRS EQU 0
- HEADR EQU 1
- GAP1 EQU 2
- GAP2 EQU 3
- GAP3 EQU 4
- RSCMD EQU 5
- SKNCMD EQU 6
- SKCMD EQU 7
- ;
- ;------------------------------------------------------------------------------
- ORG 100H
- ;
- START: LD SP,STACK
- LD A,(UNIT) ;GET TYPE OF CURRENT A: DRIVE
- LD (TEMP),A
- AGAIN: LD HL,OMSG
- CALL PMSG
- LD A,77 ;DEFALT OF 77 TRACKS /DISK
- LD (TRKNO),A
- CALL TABLEX ;FIND OUT WHAT IS WANTED
- JP NZ,DONE
- LD A,B
- LD (UNIT),A
- CALL FMAT
- JR NZ,ERROR
- LD HL,ENDMSG
- CALL PMSG
- JP AGAIN
- DONE: LD A,(TEMP)
- LD (UNIT),A
- JP 0 ;RETURN TO CPM
- ;
- ERROR: LD HL,ERRMSG
- CALL PMSG
- JR DONE
- ;
- PMSG LD A,(HL) ;PRINT MESSAGE STRING
- OR A
- RET Z
- LD C,A
- CALL CO
- INC HL
- JP PMSG
- ;
- TABLEX: CALL CI ;GET FIRST CHARACTER
- PUSH AF
- LD C,A
- CALL CO
- POP AF
- CP 'D' ;MUST WANT DD 8"
- LD B,41H
- RET Z
- CP 'S' ;MUST WANT SD 8"
- LD B,01H
- RET Z
- CP 'X' ;IS SYSTEM TRACK FORMAT REQ
- LD A,0
- RET NZ ;RETURN IF NONE OF THE ABOVE
- LD A,2 ;SET TO FORMAT ONLY TWO TRACKS
- LD (TRKNO),A
- JP TABLEX
- ;
- ;
- ;
- ;**************** DISK FORMAT ROUTINE *****************************************
- ;
- FMAT: CALL UNITFX
- LD (TEMP2),SP
- PUSH IY
- PUSH IX
- PUSH HL
- LD HL,800H
- LD (TADDR),HL
- LD (SPSV),SP
- POP HL
- CALL DRVSET
- PUSH AF ;SWITCH ON DRIVE & LET IT GET UP TO SPEED
- LD A,00001001B ;SEND A HEAD LOAD SIGNAL
- OUT (CMD),A
- LD A,0FFH
- CALL DELAY1
- POP AF
- CALL Z,HOME1
- JR NZ,ERXIT
- CALL SCTRIM
- CALL TRCKIM
- XOR A
- IDSET: CALL SETID
- PUSH BC
- CALL FMAT1
- CALL NXTRK
- POP BC
- JR NZ,FINISH
- PUSH DE ;---
- LD D,A ;---
- LD A,(TRKNO) ;---
- CP D ;---
- LD A,D ;---
- POP DE ;---
- ; CP (IX+NTRKS)
- JR NZ,IDSET
- FINISH: POP IX
- POP IY
- RET
- ;
- ERXIT: POP IX
- LD SP,(TEMP2)
- RET
- ;
- ;*********** SECTOR IMAGE ROUTINE *******************
- SCTRIM: LD HL,(TADDR)
- LD A,(IX+GAP2)
- RRCA
- LD A,4EH
- JP NC,HEADER
- LD A,0FFH
- HEADER: LD E,A
- LD B,(IX+HEADR)
- CALL IMBLD
- LD B,(IX+GAP3)
- CALL IMBLD
- XOR A
- LD B,(IX+GAP1)
- CALL IMBLD
- CALL MRKCHK
- IDMARK: LD A,0FEH
- LD (HL),A
- INC HL
- PUSH HL
- EXX
- POP DE
- EXX
- XOR A
- LD B,4
- CALL IMBLD
- LD A,0F7H
- LD (HL),A
- INC HL
- LD B,(IX+GAP2)
- LD A,B
- SRL A
- INC A
- LD C,A
- LD A,E
- CALL IMBLD
- LD B,C
- XOR A
- CALL IMBLD
- CALL MRKCHK
- LD A,0FBH
- LD (HL),A
- INC HL
- LD B,128
- LD A,(UNIT)
- RLCA
- JR NC,IDM
- LD B,0
- IDM: LD A,0E5H
- CALL IMBLD
- LD A,0F7H
- LD (HL),A
- INC HL
- RET
- ;
- MRKCHK: LD A,E
- OR A
- RET M
- LD A,0F5H
- LD B,3
- ;
- IMBLD: LD (HL),A
- INC HL
- DJNZ IMBLD
- RET
- ;
- ;********* TRACK IMAGE ROUTINE ******************
- TRCKIM: EXX
- LD B,(IX+NSCTRS)
- DEC B
- EXX
- LD DE,(TADDR)
- PUSH HL
- OR A
- LD C,(IX+HEADR)
- LD B,0
- EX DE,HL
- ADD HL,BC
- EX DE,HL
- SBC HL,DE
- PUSH HL
- POP BC
- POP HL
- PUSH BC
- EX DE,HL
- EXX
- BLDTRK: EXX
- LDIR
- POP BC
- PUSH BC
- EXX
- DJNZ BLDTRK
- EXX
- POP BC
- EX DE,HL ;NOTE SIDECK: HAS BEEN REMOVED
- XOR A
- SCHK1: LD L,A ;(NOT NEEDED WILL DO ONLY SINGLE SIDE)
- LD H,L ;[H]=0 FOR SIDE NO
- RET
- ;
- ;******* SECTOR ID ROUTINE **************
- SETID: PUSH HL
- PUSH BC
- EXX
- POP BC
- POP HL
- PUSH DE
- POP IY
- PUSH DE
- EX AF,AF'
- LD D,1
- LD A,(IX+NSCTRS)
- CP 26
- LD A,1
- JR Z,ID1
- LD A,(IX+NSCTRS)
- SRL A
- INC A
- JR NC,ID2
- ID1: EX AF,AF'
- LD (IY),A ;PUT TRACK # @ [IY]
- LD (IY+1),H ;SIDE NO @ [IY+2]
- ID1A: EX AF,AF'
- LD (IY+2),A
- PUSH AF
- LD A,(UNIT)
- RLCA
- JR NC,ID4
- LD A,1
- LD (IY+3),A
- ID4: POP AF
- CP (IX+NSCTRS)
- JR Z,ID3
- ADD IY,BC
- INC A
- ID2: LD E,A ;TEMPORLY STORE SECTOR COUNT
- LD A,26
- CP (IX+NSCTRS)
- LD A,E ;GET SECTOR COUNT BACK
- JR Z,ID1
- LD A,D
- LD D,E
- JR ID1
- ID3: EX AF,AF'
- POP DE
- EXX
- RET
- ;
- ; ********** DISK FORMAT WRITE ************
- FMAT1: PUSH DE
- PUSH BC
- EXX
- EX AF,AF'
- POP BC
- PUSH DE
- LD E,A
- LD D,C
- LD B,(IX+HEADR)
- LD C,DATA
- LD HL,(TADDR)
- LD A,80H
- LD (ERMASK),A
- CALL SWEB
- LD A,(UNIT)
- RLCA
- LD A,0
- JR NC,FMAT3
- LD A,1
- FMAT3: LD (TEMP1),A
- LD A,WRTCMD
- LD (CMDSV),A
- DI
- OUT (CMD),A
- LD A,(TEMP1)
- OTIR
- LD B,D
- FMAT5: OTIR
- OR A
- JR Z,FMAT4
- OTIR
- FMAT4: LD B,D
- DEC E
- JR NZ,FMAT5
- POP DE
- POP HL
- LD A,(HL)
- OY2: OUT (C),A
- DJNZ OY2
- EI
- EXX
- EX AF,AF'
- RET
- ;
- ;
- NXTRK: EX AF,AF'
- LD A,47
- DEL1: DJNZ DEL1
- DEC A
- JR NZ,DEL1
- IN A,(SELECT)
- OR 80H
- OUT (SELECT),A
- EX AF,AF'
- INC A
- PUSH DE ;---
- LD D,A ;---
- LD A,(TRKNO) ;---
- CP D ;---
- LD A,D ;---
- POP DE ;---
- RET Z
- LD (TRK),A
- PUSH HL
- LD (SPSV),SP
- POP HL
- E0: DJNZ E0
- EXX
- EX DE,HL
- LD A,(IX+SKNCMD)
- CALL SEEK4
- EX DE,HL
- EXX
- IN A,(TRACK)
- LD B,A
- LD A,(TRK)
- CP B
- LD B,0
- RET
- ;
- ;
- ;
- ; SEND A RESTORE TO DISK
- HOME1: LD (SPSV),SP
- LD A,(IX+RSCMD)
- CALL SEEK4
- XOR A
- RET
- ;
- ; CHECK DRIVE SELECT & CHANGE IF DIFFERENT
- DRVSET:LD DE,UNIT
- LD A,(DE)
- AND 0E0H
- LD C,A
- LD A,(DE)
- AND 03
- LD B,A
- LD A,1
- JR Z,DRVSEL
- CKDRV1: RLCA
- DJNZ CKDRV1
- DRVSEL: OR C
- AND 7FH
- LD B,A
- LD A,C
- LD IX,STDSDT
- CP 0
- JR Z,CKDRV
- LD IX,STDDDT
- CP 40H
- JR Z,CKDRV
- LD IX,DDT256
- CKDRV: LD (IXSAV),IX
- PUSH BC
- DRVST: POP AF
- CPL
- OUT (SELECT),A
- LD A,(DE)
- LD (UNITCK),A
- CALL DELAY
- RDYCK: IN A,(STATUS)
- AND 80H
- JP NZ,END2
- RET
- ;
- ;
- DELAY: LD A,(UNIT)
- BIT 5,A
- LD A,39
- JR Z,DELAY1
- LD A,60
- DELAY1: LD B,0
- M0: DJNZ M0
- DEC A
- JR NZ,DELAY1
- RET
- ;
- ;
- END: CALL WAIT
- IN A,(STATUS)
- LD D,A
- LD A,(ERMASK)
- AND D
- RET Z
- END1: LD A,D
- END2: LD (ERSTAT),A
- CALL DELAY
- OR 1
- LD SP,(SPSV)
- CALL UNITFX
- RET
- ;
- ;
- ; SEEK TRACK
- SEEK4: LD (CMDSV),A
- LD B,210
- S0: DJNZ S0
- CALL WAIT
- LD A,(TRK)
- OUT (DATA),A
- LD A,80H
- LD (ERMASK),A
- LD A,(CMDSV)
- OUT (CMD),A
- LD B,10
- D0: DJNZ D0
- CALL END
- CALL DELAY
- LD A,(CMDSV)
- CP (IX+RSCMD)
- RET Z
- IN A,(STATUS)
- AND 10H
- JR NZ,SEEK2
- IN A,(TRACK)
- CP C
- RET Z
- SEEK2: LD A,20H
- END2JP: JR END2
- ;
- WAIT: LD E,0
- PUSH BC
- LD C,2
- WAIT2: IN A,(STATUS)
- AND 1
- JR Z,DWAIT
- DJNZ WAIT2
- DEC E
- JR NZ,WAIT2
- DEC C
- JR NZ,WAIT2
- POP BC
- IN A,(SELECT)
- OR 80H
- OUT (RSET),A
- F0: DJNZ F0
- IN A,(RSET)
- CALL FRCINT
- LD A,(IX+RSCMD)
- CALL SEEK4
- LD A,0FEH
- JP END2JP
- ;
- ; DISABLE WAIT STATES
- DWAIT: POP BC
- IN A,(SELECT)
- OR 80H
- OUT (SELECT),A
- RET
- ;
- ; ENABLE WAIT STATES
- SWEB: IN A,(SELECT)
- AND 7FH
- OUT (SELECT),A
- RET
- ;
- ;
- ; FORCE CHIP INTERUPT
- FRCINT: LD A,0D0H
- OUT (CMD),A
- LD A,10
- FRC1: DEC A
- JR NZ,FRC1
- IN A,(STATUS)
- RET
- ;
- ;
- UNITFX: LD A,0FFH
- LD (UNITCK),A
- RET
- ;
- ;
- ;------ NOTE 15H & 11H TURN ON UNDERLINE ON SD VIDIO BOARD MAY WANT TO CHANGE--
- ;
- OMSG DB CR,LF,LF
- DB 'Enter a one letter code indicating drive density',CR,LF
- DB 'Note a prefix of X before D or S means format system '
- db 'tracks only.',CR,LF
- DB 'Enter CR when finished',CR,LF,LF
- DB 'S = ',15H,'SINGLE',11H,' DENSITY D = '
- DB 15H,'DOUBLE',11H,' DENSITY',CR,LF,0
- ENDMSG: DB CR,LF,BELL,'Disk has been formatted ',CR,LF,0
- ERRMSG: DB CR,LF,BELL,'SORRY COULD NOT SEEK NEXT TRACK',CR,LF,0
- ;
- ;
- ; LOOKUP TABLES OF DISK PARAMETERS
- ;
- ; 8" SINGLE DENSITY DRIVE VARIABLES
- STDSDT: DEFB 26 ;SECTORS PER TRACK
- ; DEFB 77 ;TRACKS PER SIDE
- DEFB 100-27 ;INDEX HEADER GAP
- DEFB 6 ;GAP 1
- DEFB 11 ;GAP 2
- DEFB 27 ;GAP 3
- DEFB 9 ;RESTORE CODE
- DEFB 19H ;SEEK NO VERIFY CODE
- DEFB 1DH ;SEEK WITH VERIFY
- ;
- ; 8" DOUBLE DENSITY (128 BYTE SECTORS)
- STDDDT: DEFB 50 ;SECTORS PER TRACK
- ; DEFB 77 ;TRACKS PER SIDE
- DEFB 100-16 ;HEADER GAP
- DEFB 8 ;GAP 1
- DEFB 22 ;GAP 2
- DEFB 16 ;GAP 3
- DEFB 9 ;RESTORE CODE
- DEFB 19H ;SEEK NO VERIFY
- DEFB 1DH ;SEEK WITH VERIFY
- ;
- ; 8" DOUBLE DENSITY (256 BYTE SECTORS) ----NOTE THIS FORMAT IS UNTESTED
- DDT256: DEFB 26 ;NBR SECTORS PER TRACK
- ; DEFB 77 ;NBR TRACKS PER SIDE
- DEFB 100-54 ;INDEX HEADER GAP
- DEFB 8 ;NBR GAP 1
- DEFB 22 ;NBR GAP 2
- DEFB 54 ;NBR GAP 3
- DEFB 9 ;RESTORE CODE
- DEFB 19H ;SEEK NO VERIFY
- DEFB 1DH ;SEEK WITH VERIFY
- ;
- ;
- ;
- ; THE FOLLOWING RAM LOCATIONS ARE REQ
- ;
- TRKNO DB 0H
- TEMP DB 0H
- TEMP1 DB 0H
- IXSAV DW 0000H
- DS 30H
- STACK EQU $
- ;END
-
-