beneath-apple-dos/src/INIT.s

173 lines
4.5 KiB
ArmAsm

SBTL 'I N I T -- REFORMAT A SINGLE TRACK'
ORG $800
SKP 1
***********************************************************
* *
* INIT: THIS PROGRAM WILL ALLOW ITS USER TO INITIALIZE A *
* SINGLE TRACK WITH ANY VOLUME NUMBER DESIRED. *
* *
* INPUT: $02 = TRACK TO BE INITIALIZED *
* *
* $03 = VOLUME NUMBER *
* *
* ENTRY POINT: $800 *
* *
* PROGRAMMER: PIETER LECHNER 2/19/81 *
* *
***********************************************************
SKP 1
* ZPAGE DEFINITIONS
SKP 1
PTR EQU $0 WORK POINTER
TRACK EQU $2 TRACK TO BE READ/WRITTEN
VOLUME EQU $3 VOLUME NUMBER
SECFND EQU $2D SECTOR FOUND BY RDADR16
AA EQU $3E ZPAGE CONSTANT FOR TIMING
VOL EQU $41 VOLUME USED BY WRADR16
TRK EQU $44 TRACK USED BY WRADR16
SYNCNT EQU $45 SYNC COUNT USED BY DSKF2
PREG EQU $48 MONITOR P REGISTER SAVEAREA
BELL EQU $87 ASCII BELL
SKP 1
* OTHER ADDRESSES
SKP 1
LOCRPL EQU $3E3 LOCATE RWTS PARMLIST SUBRTN
RWTS EQU $3D9 RWTS SUBROUTINE
RTRYCNT EQU $578 RETRY COUNT FOR DSKF2
NBUF1 EQU $BB00 PRIMARY SECTOR BUFFER
NBUF2 EQU $BC00 SECONDARY SECTOR BUFFER
READ16 EQU $B8DC READ DATA FIELD ROUTINE
RDADR16 EQU $B944 READ ADDRESS FIELD ROUTINE
DSKF2 EQU $BF0D FORMAT ONE TRACK ROUTINE
COUT EQU $FDED MONITOR CHARACTER OUTPUT
PRBYTE EQU $FDDA MONITOR HEX OUTPUT
SKP 1
* DISK I/O SELECTS
SKP 1
DRVSM0 EQU $C080 STEP MOTOR POSITIONS
DRVSM1 EQU $C081
DRVSM2 EQU $C082
DRVSM3 EQU $C083
DRVSM4 EQU $C084
DRVSM5 EQU $C085
DRVSM6 EQU $C086
DRVSM7 EQU $C087
DRVOFF EQU $C088 TURN DRIVE OFF AFTER 6 REVS
DRVON EQU $C089 TURN DRIVE ON
DRVSL1 EQU $C08A SELECT DRIVE 1
DRVSL2 EQU $C08B SELECT DRIVE 2
DRVRD EQU $C08C READ DATA LATCH
DRVWR EQU $C08D WRITE DATA LATCH
DRVRDM EQU $C08E SET READ MODE
DRVWRM EQU $C08F SET WRITE MODE
SKP 1
* RWTS PARMLIST DEFINITION
SKP 1
DSECT
RPLIOB DS 1 IOB TYPE ($01)
RPLSLT DS 1 SLOT*16
RPLDRV DS 1 DRIVE
RPLVOL DS 1 VOLUME
RPLTRK DS 1 TRACK
RPLSEC DS 1 SECTOR
RPLDCT DS 2 ADDRESS OF DCT
RPLBUF DS 2 ADDRESS OF BUFFER
RPLSIZ DS 2 SECTOR SIZE
RPLCMD DS 1 COMMAND CODE
RPLCNL EQU $00 NULL COMMAND
RPLCRD EQU $01 READ COMMAND
RPLCWR EQU $02 WRITE COMMAND
RPLCFM EQU $04 FORMAT COMMAND
RPLRCD DS 1 RETURN CODE
RPLRWP EQU $10 WRITE PROTECTED
RPLRVM EQU $20 VOLUME MISMATCH
RPLRDE EQU $40 DRIVE ERROR
RPLRRE EQU $80 READ ERROR
RPLTVL DS 1 TRUE VOLUME
RPLPSL DS 1 PREVIOUS SLOT
RPLPDR DS 1 PREVIOUS DRIVE
DEND
SKP 2
* USE RWTS TO POSITION THE ARM TO THE DESIRED TRACK
SKP 1
DUMP JSR LOCRPL LOCATE RWTS PARMLIST
STY PTR AND SAVE POINTER
STA PTR+1
SKP 1
LDA TRACK GET TRACK TO READ/WRITE
LDY #RPLTRK STORE IN RWTS LIST
STA (PTR),Y
SKP 1
LDA #RPLCNL NULL OPERATION
LDY #RPLCMD AND STORE IN LIST
STA (PTR),Y
SKP 1
LDA #0 ANY VOLUME WILL DO
LDY #RPLVOL
STA (PTR),Y
JSR LOCRPL RELOAD POINTER TO PARMS
JSR RWTS CALL RWTS
LDA DRVON,X LEAVE DRIVE ON
SKP 1
* ESTABLISH ENVIRONMENT FOR DSKF2 ROUTINE
SKP 1
LDA TRACK PASS TRACK TO DSKF2
STA TRK
LDA VOLUME AND VOLUME
STA VOL
LDA #$AA STORE CONSTANT FOR ZPAGE..
STA AA TIMING
LDA #$28 START WITH 40 SYNCS..
STA SYNCNT BETWEEN SECTORS
LDY #$56
LDA #$00
ZNBUF2 STA NBUF2-1,Y ZERO SECONDARY BUFFER
DEY
BNE ZNBUF2
ZNBUF1 STA NBUF1,Y AND PRIMARY BUFFER
DEY
BNE ZNBUF1
SKP 1
* INITIALIZE TRACK
SKP 1
JSR DSKF2 FORMAT TRACK AND VERIFY
LDA #$08 IN CASE OF ERROR...
BCS HNDERR ERROR?
SKP 1
* READ SECTOR ZERO TO VERIFY FORMATTING
SKP 1
LDA #$30 NO, DOUBLE CHECK TRACK
STA RTRYCNT ALLOW 48 RETRIES
NOGOOD SEC
DEC RTRYCNT COUNT RETRIES
BEQ HNDERR
JSR RDADR16 READ AN ADDRESS FIELD
BCS NOGOOD ERROR, TRY AGAIN
LDA SECFND IS THIS SECTOR ZERO?
BNE NOGOOD NO, TRY AGAIN
JSR READ16 YES, READ DATA FIELD
BCC DONETRK ALL IS WELL, DONE.
HNDERR LDY #RPLRCD ELSE, PHONEY UP A RC
STA (PTR),Y
SKP 1
* ERROR OCCURED, PRINT "RC=XX"
SKP 1
LDA #BELL BEEP THE SPEAKER
JSR COUT
LDA #'R PRINT THE "RC="
JSR COUT
LDA #'C
JSR COUT
LDA #'=
JSR COUT
LDY #RPLRCD
LDA (PTR),Y GET RWTS RETURN CODE
JSR PRBYTE PRINT RETURN CODE IN HEX
SKP 1
* WHEN DONE, EXIT TO CALLER
SKP 1
DONETRK LDA DRVOFF,X TURN DRIVE OFF
LDA #$00
STA PREG CLEAR P REGISTER FOR DOS
RTS ; RETURN TO CALLER