;CFutil0
          .TITLE    "APPLE /// CF/IDE DRIVE UTILITY  Ver 1.01"

                    ;Equates:
                    ;Print message index Equates
MSGWIND   .EQU      000        ;Message window
TITLE     .EQU      001        ;Program title
CLRMSG    .EQU      002        ;Clear message
VIEWPORT  .EQU      003        ;Display viewport window
VERSION   .EQU      004        ;Version number display
MENU0     .EQU      005        ;Main Menu
ESC0      .EQU      006        ;Escape Message for Main Menu
DATE      .EQU      007        ;Date Display
CLRVPORT  .EQU      008        ;Clear viewport screen
BORDER    .EQU      009        ;Viewport border
DRVHEDR   .EQU      00A        ;drive header display
DWINDMSG  .EQU      00B        ;drive select window
NODRIVE   .EQU      00C        ;no drives message
CmpltMsg  .EQU      00D        ;Complete message
CMDLINE   .EQU      00E        ;command line window
DLEADER   .EQU      00F        ;Display prefix for driver name list
ESC2      .EQU      010        ;escape message for drivename select
PROMPT0   .EQU      011        ;Lower display window
LFMTCMD   .EQU      012        ;Lowlevel format command display
VRFYCMD   .EQU      013        ;Verify drive command display
PARTCMD   .EQU      014        ;Partition drive command display
TESTCMD   .EQU      015        ;Test IFC command display
SELECCMD  .EQU      016        ;Select drive command display
GASGAUGE  .EQU      017        ;Gas gage display
PROGBAR   .EQU      018        ;Progress bar for gas gage
No_LBA    .EQU      019        ;No LBA support message
BLKBAD2   .EQU      01A        ;Trailer for bad block message
VFYHLTD   .EQU      01B        ;Verification Aborted message
FMTHLTD   .EQU      01C        ;Lowlevel Format Aborted message
NUMERRS   .EQU      01D        ;Number of Errors
BeepNclr  .EQU      01E        ;Beep and clear line
FWARNING  .EQU      01F        ;format warning message
ESC3      .EQU      020        ;escape message for format routine
FMTMSG    .EQU      021        ;format message
CURSER    .EQU      022        ;move curser to x,y location
PTBLMSG   .EQU      023        ;partition table update prompt
UPDATMSG  .EQU      024        ;updating drive message
UPDATERR  .EQU      025        ;error message updating drive
CREADATE  .EQU      026        ;display created date
LMODDATE  .EQU      027        ;display modified date
TestER00  .EQU      028        ;Diagnostic error $00 message
TestER01  .EQU      029        ;Diagnostic error $01 message
TestER02  .EQU      02A        ;Diagnostic error $02 message
TestER03  .EQU      02B        ;Diagnostic error $03 message
TestER04  .EQU      02C        ;Diagnostic error $04 message
TestER05  .EQU      02D        ;Diagnostic error $05 message
TestER8x  .EQU      02E        ;Diagnostic error $8x message
FMTDONE   .EQU      02F        ;format complete message
OCCUR     .EQU      030        ;errors occurred message
ESC5      .EQU      031        ;escape message to interupt verifying
VFYHALT   .EQU      032        ;verification halted message
BLOCKBAD  .EQU      033        ;current verify block is bad message
VFYCOMP   .EQU      034        ;drive verification complete message
TESTLST   .EQU      035        ;test IFC list of parameters
TESTCOMP  .EQU      036        ;diagnostic testing complete message
PARTHDR   .EQU      037        ;Primary Partition display header
PTMENU1   .EQU      038        ;Partition information display = Part 1
BLOCKS    .EQU      039        ;blocks trailing message for rem cap
ESC6      .EQU      03A        ;escape message for partition editor
HFMT0MSG  .EQU      03B        ;format partition prompt message
HFMT1MSG  .EQU      03C        ;format partition default curser
DIRERR    .EQU      03D        ;error formatting vol message
HFMTCMP   .EQU      03E        ;format successfull message
PRANYKEY  .EQU      03F        ;press any key addon message
DASH      .EQU      040        ;space dash space text
DRVNCONT  .EQU      041        ;drive not connected message
VIEWPOS   .EQU      042        ;display viewport with vert positioning
PTWARN1   .EQU      043        ;partition change warning msg leader
PTWARN2   .EQU      044        ;partition change warning msg trailer
PTOVLAP   .EQU      045        ;warning about partition overlaps
RE_EDIT   .EQU      046        ;prompt to re edit partitions
ERASMSG1  .EQU      047        ;erase volume message - part 1
ERASMSG2  .EQU      048        ;erase volume message - part 2
ESC6A     .EQU      049        ;escape/restore message for part editor
COPYRITE  .EQU      04A        ;copyright notice message
FESC6     .EQU      04B        ;high level format keystroke message
CLRMSGW   .EQU      04C        ;clear message window
ESC1B     .EQU      04D        ;press any key message
SLOTPOS   .EQU      04E        ;Slot display position leader
RBLKS     .EQU      04F        ;Remaining capacity header
SEARCH    .EQU      050        ;Scan system message
OUTRANG1  .EQU      051        ;Input greater than 65535 - out of range message
MAXBLOCK  .EQU      052        ;Maximum block value message
VRFYMSG   .EQU      053        ;Prompt to proceed with drive verification
NOFRMAT   .EQU      054        ;Low level format not supported
ERASEPT   .EQU      055        ;Initialize new partition prompt
PTMENU2   .EQU      056        ;Partition information display - Part 2
ESC4      .EQU      057        ;escape message to interupt formatting
CLRPMPT   .EQU      058        ;Clear Prompt area & restore previous window settings
TCapBlks  .EQU      059        ;Total Capacity Display
DEVHDR1   .EQU      05A        ;Device information display header #1
DEVHDR2   .EQU      05B        ;Device information display header #2
DEVHDR3   .EQU      05C        ;Device information display header #3
DEVHDR4   .EQU      05D        ;Device information display header #4
DEVHDR5   .EQU      05E        ;Device information display header #5
DEVHDR6   .EQU      05F        ;Device information display header #6
DEVHDR7   .EQU      060        ;Device information display header #7
Model_nx  .EQU      061        ;Device model # ascii
Devic_nx  .EQU      062        ;Device device # ascii
Seria_nx  .EQU      063        ;Device serial # ascii
FirmW_nx  .EQU      064        ;Device firmware version ascii
AnsYes    .EQU      065        ;Yes message
AnsNo     .EQU      066        ;No message
ClrLower  .EQU      067        ;Clear viewport below VTPOS
ERASEDRV  .EQU      068        ;2nd prompt for lowlevel format
PTReadER  .EQU      069        ;Error message can't access partition table
PTNUPD    .EQU      06A        ;Partition needs update prior to vol initialization

                    ;Zero Page Pointer Equates
ZPGTEMP0  .EQU      000
ZPGTEMP1  .EQU      001
MLPLIER   .EQU      002
PRODUCT   .EQU      003   ;3 bytes
MLPCND    .EQU      006   ;3 bytes
MENU0SEL  .EQU      009
DECPLACE  .EQU      00A
TEMPVAL   .EQU      00B
TEMPVAL1  .EQU      00C
TEMPVAL2  .EQU      00D
TEMPVAL3  .EQU      00E
TEMPVAL4  .EQU      00F
TEMPVAL5  .EQU      010
TEMPVAL6  .EQU      011
LOCSTAT   .EQU      012
BEGTRK    .EQU      013   ;3 bytes
ENDTRK    .EQU      016   ;3 bytes
BUFFPG0   .EQU      019   ;2 bytes
BUFFPG1   .EQU      01B   ;2 bytes
STATBUF1  .EQU      01D   ;2 bytes
STATBUF2  .EQU      01F   ;2 bytes
SCRBUF    .EQU      021   ;2 bytes
DNAMEPTR  .EQU      023   ;2 bytes
INDEX     .EQU      025   ;2 bytes
PARTTBL   .EQU      027   ;2 bytes

POSITION  .EQU      02A
BPERCTR   .EQU      02B   ;2 bytes
BCTR      .EQU      02D   ;2 bytes
BUFFCALL  .EQU      02F   ;2 bytes
PartNum   .EQU      031   ;PartNum=current partition number $0 to $7
CurVcol   .EQU      032   ;CurVcol=current vertical column in table TRK0($0),
                    ;BLEN0($1), or VOL0($2)
NUMERROR  .EQU      033
HALTFLAG  .EQU      034
CURDRIVE  .EQU      035
STACK     .EQU      036
ERRCODE   .EQU      037
TOTSECT   .EQU      038   ;3 bytes  LB,MB,HB
Divisor   .EQU      03B
NUMDNAME  .EQU      03C
DevIDpg0  .EQU      03D   ;2 bytes
IBuffHB   .EQU      03F   ;1 bytes

                    ;internal program array tables
DNUMLST   .EQU      060      ;8 bytes
SLOTLST   .EQU      068      ;8 bytes
UNUMLST   .EQU      070      ;8 bytes
DRVNLST   .EQU      078      ;8 bytes

PTVALID   .EQU      080      ;8 bytes
EXISTVOL  .EQU      088      ;8 bytes

DfltSzLB  .EQU      090      ;LB default starting partition size
P0sizeLB  .EQU      091      ;8 bytes LB of partition size

DfltSzHB  .EQU      099      ;HB default starting partition size
P0sizeHB  .EQU      09A      ;8 bytes HB of partition size

DfltSTlb  .EQU      0A2      ;Default Starting Block $01
BegBlkLB  .EQU      0A3      ;8 bytes

DfltSTmb  .EQU      0AB      ;default starting block for partition
BegBlkMB  .EQU      0AC      ;8 bytes

DfltSThb  .EQU      0B4      ;default starting block for partition
BegBlkHB  .EQU      0B5      ;8 bytes

EndBlkLB  .EQU      0C0      ;8 bytes
EndBlkMB  .EQU      0C8      ;8 bytes
EndBlkHB  .EQU      0D0      ;8 bytes

                    ;Reference address Equates
EXTPG     .EQU      1601
EReg      .EQU      0FFDF    ;enviornment register
BANKREG   .EQU      0FFEF

                    ; ATA Command Codes
ATA_XErr  .EQU      003
ATACRead  .EQU      020
ATACWrit  .EQU      030
ATA_Vrfy  .EQU      040
ATA_Frmt  .EQU      050
ATA_Diag  .EQU      090
ATAIdent  .EQU      0EC

                    ;Partition Table Equates
PtChkSum  .EQU      000   ;Checksum of partition table bytes $01 thru $FF
PtSIdx    .EQU      010   ;Device serial number (20 ascii characters)
PtRevIdx  .EQU      024   ;Device firmware revision number (8 ascii characters)
PtModIdx  .EQU      02C   ;Device model information (40 ascii characters)
ORIGDATE  .EQU      064
MODDATE   .EQU      06C

                    ;Keystroke Equates
LFARROW   .EQU      008
TAB       .EQU      009
DNARROW   .EQU      00A
UPARROW   .EQU      00B
RETURN    .EQU      00D
RTARROW   .EQU      015
ESCAPE    .EQU      01B
SPACE     .EQU      020
OAPL_QM   .EQU      0BF
OAPPLE_F  .EQU      0C6
OAPPLE_P  .EQU      0D0
OAPPLE_S  .EQU      0D3

                    ;Console control/status code equates
FLSHTYPE  .EQU      005

                    ;Partition variable index equates
TRK0      .EQU      000  ;Beginning block # for this partition
BLEN0     .EQU      001  ;Size of partition in blocks
VOL0      .EQU      002  ;Volume name of this partition

                    ;Parameter block specific to current SOS request
ATA_Cmd   .EQU      000
Sect_HB   .EQU      001
Sect_MB   .EQU      002
Sect_LB   .EQU      003
Num_Blks  .EQU      004

                    ;Device Identification Data Index Equates
SerIdx    .EQU      014
RevisIdx  .EQU      02E
ModelIdx  .EQU      036
LBAidx    .EQU      063
CapacIdx  .EQU      072
SerLen    .EQU      013
RevisLen  .EQU      007
ModelLen  .EQU      027
LBAlen    .EQU      001
CapacLen  .EQU      002


CODELOAD  .EQU      08200    ;loading address for this interpreter

                    ;Entry point of interpreter
          .ABSOLUTE
          .PROC     SOSNTRP
          .ORG      CODELOAD-14.
          .ASCII    "SOS NTRP"
          .WORD     0000
          .WORD     CODELOAD
          .WORD     CODELEN

          JMP       BEGIN
                    ;Data Buffers
CHR       .BYTE     000
INPUT     .BYTE     000
DRIVNUM   .BYTE     000

DINFO     .BYTE     004
DNUM      .BYTE     000
DNAME     .WORD     DNAMEPTR
DINFOLST  .WORD     SLOTNUM
          .BYTE     009
SLOTNUM   .BYTE     000
UNITNUM   .BYTE     000
DEVTYPE   .BYTE     0D1
SUBTYPE   .BLOCK    004,000
MANUFID   .BYTE     04A,044

TIMEDATE  .BYTE     001
          .WORD     YEAR

YEAR      .BLOCK    004,000
MONTH     .WORD     000
DAY       .WORD     000
WEEK      .BYTE     000
HOUR      .WORD     000
MIN       .WORD     000
SECOND    .BLOCK    005,000

MMONTHS   .ASCII    "JanFebMarAprMayJunJulAugSepOctNovDec"

DATEDISP  .BYTE     001,01A,042,001
          .ASCII    "Jan 31, 2003"
          .BYTE     004

MODE_ID   .BYTE     000
                    ;$01=this device does not support either CFA feature set or LBA mode
                    ;$02=this device supports LBA mode and CFA feature set
                    ;$03=this device supports LBA mode but does not support CFA feature set

MULTPCND  .BYTE     00A,000,000  ;10
          .BYTE     064,000,000  ;100
          .BYTE     0E8,003,000  ;1000
          .BYTE     010,027,000  ;10000
          .BYTE     0A0,086,001  ;100000
          .BYTE     040,042,00F  ;1000000  LSB,MSB,HSB

UNFMTTXT  .ASCII    "UNFORMATTED"
UFTXTLEN  .EQU      *-UNFMTTXT

BLANK01   .ASCII    "PARTITIONX"
BLTXTLEN  .EQU      *-BLANK01

BITINDEX  .BYTE     0FF,07F,03F,01F,00F,007,003,001
          .BYTE     000

DEV_ID    .BYTE     0D1,010,04A,044    ;Device ID for CF/Ide driver

Err_Data  .BLOCK    005,000
                    ;Err_Data - byte $0 = error code
                    ;   Bit 7 = BBK bad block has been detected
                    ;   Bit 6 = UNC uncorrectable error was encountered
                    ;   Bit 5 = 0 (undefined)
                    ;   Bit 4 = IDNF requested block ID is in error or cannot be found
                    ;   Bit 3 = 0 (undefined)
                    ;   Bit 2 = ABRT command was aborted or an invalid command
                    ;   Bit 1 = 0 (undefined)
                    ;   Bit 0 = AMNF general error
                    ;Err_Data - byte $1 thru $3 = block # (LB, MB, & HB)
                    ;Err_Data - byte $4 = # of blocks left to complete command

                    ;SOS Call Blocks
CONSOLE   .BYTE     008
          .ASCII    ".CONSOLE"

READCON   .BYTE     004
CONREF    .BYTE     000
          .WORD     INPUT
          .WORD     0001
          .WORD     000

RELSEG    .BYTE     001
RELNUM    .BYTE     000

RESCR     .BYTE     003
CTRLREF3  .BYTE     000,012
          .WORD     SCRBUF

CLOSLIST  .BYTE     001
CLOSREF   .BYTE     000

SETFONT1  .BYTE     003
SREF1     .BYTE     000,011
          .WORD     FONT1

SETFONT2  .BYTE     003
SREF2     .BYTE     000,011
          .WORD     FONT2

FINDSEG   .BYTE     006,000,011
PAGES     .WORD     0017
BASE      .BLOCK    004,000
SEGNUM    .BYTE     000

WRITCHR   .BYTE     003
PRTREF1   .BYTE     000
          .WORD     CHR
          .WORD     001

WRITINDX  .BYTE     003
PRTREF2   .BYTE     000
          .WORD     INDEX
PRTLEN1   .WORD     000

WRITDNAM  .BYTE     003
PRTREF3   .BYTE     000
          .WORD     DNAMEPTR
PRTLEN2   .WORD     000

PTBLSTAT  .BYTE     003
CALLREF0  .BYTE     000,003     ;Return Device Partition Map
          .WORD     PARTTBL

DevStat0  .BYTE     003
SDNUM1    .BYTE     000,000     ;Device Drive #
          .WORD     DRIVNUM

DevIdent  .BYTE     003
SDNUM2    .BYTE     000,001     ;Device Indentification
          .WORD     DevIDpg0

BUFFCTRL  .BYTE     003
CALLREF1  .BYTE     000,001     ;Device UserIO Call
          .WORD     BUFFCALL

ERRSTAT   .BYTE     003
CALLREF2  .BYTE     000,002     ;Device Error Information
          .WORD     Err_Data

DFMTCALL  .BYTE     003
DFmtRef   .BYTE     000,0FE
          .WORD     SCRBUF

DEVCALL   .BYTE     002
          .WORD     CONSOLE
DEVNUM    .BYTE     000

CONSTAT   .BYTE     003
STATREF1  .BYTE     000,001
          .WORD     STATBUF1

RESETCON  .BYTE     003
CTRLREF2  .BYTE     000,001
          .WORD     STATBUF2

CTRLCALL  .BYTE     003
CTRLREF1  .BYTE     000
CTRLCODE  .BYTE     000
          .WORD     SCRBUF

VPOSCALL  .BYTE     003
CTRLREF4  .BYTE     000
          .BYTE     010
          .WORD     SCRBUF

ATTNEVNT  .BYTE     003
STATREF2  .BYTE     000,006
          .WORD     ATTNBUFF

OPENCON   .BYTE     004
          .WORD     CONSOLE
CONREFN   .BLOCK    004,000

ATTNBUFF  .BYTE     080             ;Priority
          .BYTE     002             ;Event ID
          .WORD     ESCHDLR         ;Event handler address
EVHDLRXB  .BYTE     000             ;Event handler bank
          .BYTE     01B             ;Attention character - ESCAPE

                    ;Screen output windows & display messages
MWINDOW   .BYTE     006,001,01A,04D,014,003,018,001
          .BYTE     002
MWINDEND  .EQU      *

CLRMSGS   .BYTE     01E,004
CLRMSEND  .EQU      *

PPROMPT0  .BYTE     006,001,01A,000,016,01D
PRMP0END  .EQU      *
          .BYTE     004
CPMPEND   .EQU      *

CNOTICE   .BYTE     006,001,01A,018,001
          .ASCII    "Copyright 2003 Dale S. Jackson"
          .BYTE     004
CNOTEND   .EQU      *

DRVHDR    .BYTE     001,01A,037,001,01F
          .ASCII    "DRIVE: "
DRVHDEND  .EQU      *

DWINDOW0  .BYTE     01A,01E,000
          .ASCII    " DRIVES ONLINE"
          .BYTE     01A,016
DWINDULC  .BYTE     002,002
          .ASCII    "Drive Name        Slot  Drive"
          .BYTE     00A,00D
          .ASCII    "==========        ====  ====="
          .BYTE     00A,00D,002
DWINDEND  .EQU      *

SLOTLDR   .BYTE     018,014
SLOTVAL   .BYTE     000,018,01A
DRVNVAL   .BYTE     000
SLDREND   .EQU      *

NODRVS    .BYTE     01A,013,007
          .ASCII    "There are no drivers present in the system"
NODRVEND  .EQU      *

DRVLEADR  .BYTE     01A,000
DRVPOS    .BYTE     000,011
DLDREND   .EQU      *

FMTCOMP   .ASCII    "Lowlevel Format Complete - "
FMTCMEND  .EQU      *

FMTHALTD  .ASCII    "Lowlevel Format Aborted - "
FMTHMEND  .EQU      *

BTRKHDR   .ASCII    "Block "
BADSECT   .BLOCK    008,020
BTRKTLR   .ASCII    " is bad"
BTRKHEND  .EQU      *

VFYCMPLT  .BYTE     00A,00D
          .ASCII    "Drive Media Verification Complete - "
VFYCMEND  .EQU      *

NVFYERR   .BLOCK    004,000

VFYHALTD  .BYTE     00A,00D
          .ASCII    "Drive Media Verification Aborted - "
VFYHMEND  .EQU      *

EESC0     .BYTE     01E,018,00D,012
          .ASCII    "Press:"
          .BYTE     011
          .ASCII    " Up/Down Arrows, Letter or RETURN to Select"
          .BYTE     004
EESC0END  .EQU      *

EESC1B    .BYTE     01E,018,018
EESC1A    .BYTE     012
          .ASCII    "Press:"
          .BYTE     011
          .ASCII    " ANY KEY to continue"
          .BYTE     004
EESC1END  .EQU      *

EESC2     .BYTE     01E,012
          .ASCII    "Press:"
          .BYTE     011
          .ASCII    " Up/Down Arrows, RETURN to select, ESCAPE"
          .ASCII    " to exit to Main Menu"
          .BYTE     004
EESC2END  .EQU      *

EESC3     .BYTE     01E,012
          .ASCII    "Press:"
          .BYTE     011,020,07F
          .ASCII    "-F to lowlevel format, "
          .BYTE     07F
          .ASCII    "-P to initialize new partition, ESC to exit"
          .BYTE     004
EESC3END  .EQU      *

EESC4     .BYTE     01E,018,013,012
          .ASCII    "Press:"
          .BYTE     011
          .ASCII    " ESCAPE to Halt Lowlevel Format"
          .BYTE     004
EESC4END  .EQU      *

EESC5     .BYTE     01E,018,014,012
          .ASCII    "Press:"
          .BYTE     011
          .ASCII    " ESCAPE to Halt Verification"
          .BYTE     004
EESC5END  .EQU      *

FEESC6    .BYTE     018,002,07F
          .ASCII    "-S to Save the partition table, "
          .BYTE     07F
          .ASCII    "-F to Initialize the partition volume"
          .BYTE     004
FESC6END  .EQU      *

EESC6     .BYTE     01E,012
          .ASCII    "Press:"
          .BYTE     011
          .ASCII    " Up/Down Arrows, RETURN/TAB to select,"
          .ASCII    " ESCAPE to exit to Main Menu"
          .BYTE     004
EESC6END  .EQU      *

EESC6A    .BYTE     01E,012
          .ASCII    "Press:"
          .BYTE     011
          .ASCII    " Up/Down arrows, RETURN/TAB to select,"
          .ASCII    " ESCAPE to restore entry"
          .BYTE     004
ESC6AEND  .EQU      *

VFYSTOP   .BYTE     01E
          .ASCII    "Program Execution Halted    "
          .BYTE     012
          .ASCII    "Press:"
          .BYTE     011
          .ASCII    " SPACE to resume, ESCAPE to abort"
VFYSTEND  .EQU      *

ERROCCUR  .ASCII    " errors occurred"
          .BYTE     00A,00D
OCCUREND  .EQU      *

ERASVOL1  .BYTE     01E,007,012
          .ASCII    "WARNING:"
          .BYTE     011
          .ASCII    " Contents of the volume "
ERASEND1  .EQU      *
PNAME2    .BLOCK    00F,000

ERASVOL2  .ASCII    " will be erased"
ERASEND2  .EQU      *

UDATERR   .BYTE     007,012
          .ASCII    "ERROR:"
          .BYTE     011
          .ASCII    " writing partition table parameters to drive"
UDATEREN  .EQU      *

PTRDERR   .BYTE     007,012
          .ASCII    "ERROR:"
          .BYTE     011
          .ASCII    " Unable to access partition table on this drive"
PTRDEREN  .EQU      *

CURSEPOS  .BYTE     006,01A
SCRHPVP   .BYTE     000,000,005
CURSEND   .EQU      *

                    ;Main Menu Display
MENU0WVP  .BYTE     006,001,01A,04D,014,003,01A,001,003,002
          .BYTE     01C,01A,01B,005,002
          .ASCII    "(S) "
MENU0S2   .BYTE     01A,004,000,011
SSELCMD   .ASCII    "Select Drive"
          .BYTE     011
SSELEND   .EQU      *
MENU0I1   .BYTE     00D,00A
          .ASCII    "(T) "
MENU0I2   .BYTE     01A,004,001,011
TTESTCMD  .ASCII    "Test Interface Card"
          .BYTE     011
TTESTEND  .EQU      *-6
MENU0V1   .BYTE     00D,00A
          .ASCII    "(V) "
MENU0V2   .BYTE     01A,004,002,011
VVRFYCMD  .ASCII    "Verify Drive"
          .BYTE     011
VVRFYEND  .EQU      *-7
MENU0L1   .BYTE     00D,00A
          .ASCII    "(F) "
MENU0L2   .BYTE     01A,004,003,011
LLFMTCMD  .ASCII    "Format Drive"
          .BYTE     011
LLFMTEND  .EQU      *-7
MENU0P1   .BYTE     00D,00A
          .ASCII    "(P) "
MENU0P2   .BYTE     01A,004,004,011
PPARTCMD  .ASCII    "Partition Drive"
          .BYTE     011
PPARTEND  .EQU      *-7
MENU0Q1   .BYTE     00D,00A
          .ASCII    "(Q) "
MENU0Q2   .BYTE     01A,004,005,011
          .ASCII    "Quit"
          .BYTE     011
MENU0END  .EQU      *


TESTLIST  .BYTE     00A
          .ASCII    "INTERNAL DIAGNOSTIC TEST: "
TSTLSEND  .EQU      *

TESTDONE  .BYTE     00A,00A,018,016
          .ASCII    "Diagnostic Testing "
Cmplete   .ASCII    "Complete"
TESTDEND  .EQU      *

YesAns    .ASCII    "Yes"
YesEnd    .EQU      *

NoAns     .ASCII    "No"
NoEnd     .EQU      *

DiagEr00  .BYTE     007
          .ASCII    "Master Failed"
DERend00  .EQU      *

DiagEr01  .ASCII    "No Error Detected"
DERend01  .EQU      *

DiagEr02  .BYTE     007,012
          .ASCII    "Formatter Device Error"
          .BYTE     011
DERend02  .EQU      *

DiagEr03  .BYTE     007,012
          .ASCII    "Sector Buffer Error"
          .BYTE     011
DERend03  .EQU      *

DiagEr04  .BYTE     007,012
          .ASCII    "ECC Circuitry Error"
          .BYTE     011
DERend04  .EQU      *

DiagEr05  .BYTE     007,012
          .ASCII    "Controlling Microprocessor Error"
          .BYTE     011
DERend05  .EQU      *

DiagEr8x  .ASCII    "Slave Failed"
DERend8x  .EQU      *

FWARN     .BYTE     00A,00A,01E,012
          .ASCII    "WARNING:"
          .BYTE     011
          .ASCII    " LowLevel formatting will destroy all data on the drive"
FWARNEND  .EQU      *

NOTFMT    .BYTE     007,01E,018,00C
          .ASCII    "This device does not support low level formatting"
NOFMTEND  .EQU      *

RANG1ERR  .BYTE     007
          .ASCII    "Maximum allowable partition size is 65535"
          .BYTE     004
RANG1END  .EQU      *

MAXBLK    .BYTE     007
          .ASCII    "Block value cannot exceed drive capacity"
          .BYTE     004
MXBLKEND  .EQU      *

PPTWARN1  .BYTE     01E
          .ASCII    "Partition #"
PPTW1END  .EQU      *
PPTNUM    .ASCII    " ,  ,  ,  ,  ,  ,  ,  "
PPTWARN2  .ASCII    " have changed and the drive needs updating"
PPTW2END  .EQU      *

REDITPT   .ASCII    "Do you wish to edit the conflicting partitions? "
          .BYTE     012,059,011
          .ASCII    "es/No"
REDITEND  .EQU      *


PTUPD2    .BYTE     007
          .ASCII    "Partition table on drive needs updating prior"
          .ASCII    " to initializing this volume"
PTUPDEND  .EQU      *

PTLAP     .BYTE     007,012
          .ASCII    "WARNING:"
          .BYTE     011
          .ASCII    " Partitions #"
PTCNFLT1  .BYTE     000
          .ASCII    " & "
PTCNFLT2  .BYTE     000
          .ASCII    " are overlaying the same region of the disk"
          .BYTE     004
PTLAPEND  .EQU      *

UDATPTBL  .ASCII    "Save changes to the drive partition table? "
          .BYTE     012,059,011
          .ASCII    "es/No"
UDATEND   .EQU      *

UPDATDRV  .BYTE     00A,01E,018,009
          .ASCII    "Updating the partition table information ..... "
UPDATEND  .EQU      *

ASKVFRY   .ASCII    "Verify blocks on the drive listed above? "
          .BYTE     012,059,011
          .ASCII    "es/No"
ASKVEND   .EQU      *

ORGDATE0  .BYTE     01A,03A,007
ORGDATE1  .BLOCK    008,020
ORGDEND   .EQU      *

NEWDATE0  .BYTE     01A,03A,00B
NEWDATE1  .BLOCK    008,020
NEWDEND   .EQU      *

ERASMSG0  .ASCII    "Initialize a new partition table? "
          .BYTE     012,059,011
          .ASCII    "es/No"
ERAS0END  .EQU      *

ERASMSG3  .ASCII    "OK to destroy the existing contents of this drive? "
          .BYTE     012,059,011
          .ASCII    "es/No"
ERAS3END  .EQU      *

HLMSG0    .ASCII    "Initialize this volume with the name "
PNAME1    .BLOCK    00F,020
HLMSG1    .ASCII    "? "
          .BYTE     012,059,011
          .ASCII    "es/No"
HLMSGEND  .EQU      *

HFMTCOMP  .BYTE     018,013
          .ASCII    "Volume Initialization Successful"
HFMTCEND  .EQU      *

WDIRERR   .BYTE     007
          .ASCII    "Error initializing volume directory"
WDIRREND  .EQU      *

DASHTXT   .ASCII    " - "
DASHEND   .EQU      *

                    ;Program Version Display
CMDWIND   .BYTE     001,01A,001,001,01E
CMDWEND   .EQU      *
VERMSG    .ASCII    "Version 1.01"
VEREND    .EQU      *

                    ;Viewport and Borders
INITSCRN  .BYTE     006,001,01C,018,018
          .ASCII    "CF/IDE DRIVE MANAGEMENT UTILITY"
INSCREND  .EQU      *
BORDERX   .BYTE     01A,04E,016,003,01A,000,002,002
                    ;Border Top Line
          .BYTE     080,085,086,084,085,086,084,085
          .BYTE     086,084,085,086,084,085,086,084
          .BYTE     085,086,084,085,086,084,085,086
          .BYTE     084,085,086,084,085,086,084,085
          .BYTE     086,084,085,086,084,085,086,084
          .BYTE     085,086,084,085,086,084,085,086
          .BYTE     084,085,086,084,085,086,084,085
          .BYTE     086,084,085,086,084,085,086,084
          .BYTE     085,086,084,085,086,084,085,086
          .BYTE     084,085,086,084,085,086,081
                    ;Border Side Lines
          .BYTE     088,018,04E,087,088,018,04E,087
          .BYTE     088,018,04E,087,088,018,04E,087
          .BYTE     088,018,04E,087,088,018,04E,087
          .BYTE     088,018,04E,087,088,018,04E,087
          .BYTE     088,018,04E,087,088,018,04E,087
          .BYTE     088,018,04E,087,088,018,04E,087
          .BYTE     088,018,04E,087,088,018,04E,087
          .BYTE     088,018,04E,087,088,018,04E,087
          .BYTE     088,018,04E,087,088,018,04E,087
                    ;Border Bottom Line
          .BYTE     082,085,086,084,085,086,084,085
          .BYTE     086,084,085,086,084,085,086,084
          .BYTE     085,086,084,085,086,084,085,086
          .BYTE     084,085,086,084,085,086,084,085
          .BYTE     086,084,085,086,084,085,086,084
          .BYTE     085,086,084,085,086,084,085,086
          .BYTE     084,085,086,084,085,086,084,085
          .BYTE     086,084,085,086,084,085,086,084
          .BYTE     085,086,084,085,086,084,085,086
          .BYTE     084,085,086,084,085,086,083
BDREND    .EQU      *

                    ;Inner Display Window
CLRSCRN   .BYTE     006,001,01A,04D,014,003,01A,001
          .BYTE     003,002,01C
VPORT     .BYTE     006,001,01A,04D,013,003,01A,001
          .BYTE     003,002
VPORTEND  .EQU      *

INVPORT   .BYTE     006,001,01A,04D,011,003,01A,001
          .BYTE     003,002
NEWPOS    .BYTE     019
VTPOS     .BYTE     000
VTEND     .EQU      *
          .BYTE     01D
NPOSEND   .EQU      *

          .INCLUDE  CFutil1
          .INCLUDE  CFutil2
          .INCLUDE  CFutil3
          .INCLUDE  CFutil4
          .END

;CFutil1
SRCH      .BYTE     01A,014,009
          .ASCII    "Scanning system for IDE devices"
SRCHEND   .EQU      *

DRV0MSTR  .ASCII    "0 (master)1 (slave) "

FMDIALOG  .BYTE     018,00E
          .ASCII    "Device Media Formatting.....please standby"
          .BYTE     004
FMTDEND   .EQU      *

SerialNo  .BLOCK    014,020
SERLend   .EQU      *
FirmWare  .BLOCK    008,020
FIRMWend  .EQU      *

PPARTHDR  .BYTE     01A,017,000
          .ASCII    "DRIVE PARTITION INFORMATION"
          .BYTE     00A,00A,00D
          .ASCII    "MODEL NO: "
Model     .BLOCK    028,020
MODELend  .EQU      *
          .BYTE     00A,00D
          .ASCII    "SLOT: "
SlotVal2  .ASCII    "    DEVICE: "
DEVICE    .ASCII    "0 (master)"
DEVNOend  .EQU      *
          .BYTE     018,034
          .ASCII    "CAPACITY: "
PTHDREND  .EQU      *

TOTCAP    .BLOCK    008,020

PPTMENU1  .ASCII    " Blocks"
          .BYTE     01F
PBLKEND   .EQU      *
          .BYTE     01A,013,005
          .ASCII    "START   SEGMENT"
          .BYTE     018,038
          .ASCII    "CREATED DATE"
          .BYTE     01A,006,006
          .ASCII    "PARTITION    BLOCK   LENGTH   VOLUME NAME"
          .BYTE     018,038
          .BLOCK    00C,03D
          .BYTE     01A,006,007
          .BLOCK    009,03D
          .BYTE     018,012
          .BLOCK    007,03D
          .BYTE     018,01C
          .BLOCK    005,03D
          .BYTE     018,024
          .BLOCK    00F,03D
PPTMENU2  .BYTE     01A,009,008
          .ASCII    "#0:"
          .BYTE     01A,009,009
          .ASCII    "#1:"
          .BYTE     018,038
          .ASCII    "MODIFIED DATE"
          .BYTE     01A,009,00A
          .ASCII    "#2:"
          .BYTE     018,038
          .BLOCK    00C,03D
          .BYTE     01A,009,00B
          .ASCII    "#3:"
          .BYTE     01A,009,00C
          .ASCII    "#4:"
          .BYTE     01A,009,00D
          .ASCII    "#5:"
          .BYTE     018,038
          .ASCII    "UNUSED CAPACITY"
          .BYTE     01A,009,00E
          .ASCII    "#6:"
          .BYTE     018,038
          .BLOCK    00F,03D
          .BYTE     01A,009,00F
          .ASCII    "#7:"
PPTMEND   .EQU      *

REMCAP    .BYTE     01A,038,00F
NREMCAP   .BLOCK    008,020

TooLrg    .ASCII    "> 9728K"

DEV1HDR   .BYTE     00A,00A,018,01C
          .ASCII    "DEVICE INFORMATION"
          .BYTE     00A,018,008
          .ASCII    "SLOT: "
SlotVal3  .BYTE     000,00A,018,006
          .ASCII    "DEVICE: "
DEV2HDR   .BYTE     00A,018,004
          .ASCII    "MODEL NO: "
DEV3HDR   .BYTE     00A,018,003
          .ASCII    "SERIAL NO: "
DEV4HDR   .BYTE     00A,018,004
          .ASCII    "FIRMWARE: "
DEV5HDR   .BYTE     00A,00D
          .ASCII    " LBA SUPPORT: "
DEV6HDR   .BYTE     00A,00D
          .ASCII    " CFA FEATURE: "
DEV7HDR   .BYTE     00A,018,004
          .ASCII    "CAPACITY: "
DEV7END   .EQU      *

LBA_NO    .BYTE     012
          .ASCII    "Warning"
          .BYTE     011
          .ASCII    " - LBA mode not supported"
LBAnoEnd  .EQU      *

GASGAGE   .BYTE     001,01A,005,012
          .ASCII    "  0% Complete "
          .BYTE     089,08A,089,08A,089,08A,089,08A
          .BYTE     089,08A,089,08A,089,08A,089,08A   ;50 chrs long
          .BYTE     089,08A,089,08A,089,08A,089,08A
          .BYTE     089,08A,089,08A,089,08A,089,08A
          .BYTE     089,08A,089,08A,089,08A,089,08A
          .BYTE     089,08A,089,08A,089,08A,089,08A
          .BYTE     089,08A
          .BYTE     004
GASGAEND  .EQU      *

PROGRESS  .BYTE     001,01A,005,012
PCENT     .BYTE     020,020,030,018
GAS_HPOS  .BYTE     013,012,020,011,004
PROGREND  .EQU      *
                    ;End of Screen Messages

                    ;File Call Error Descriptions
ERRDESC   .ASCII    "SOS/Device Error $"
GENERR    .WORD     000
          .ASCII    " has occurred"
ENDERR00  .EQU      *
                    ;Device Call Error Descriptions
DNFERR    .ASCII    "Device not Found"
ENDERR10  .EQU      *
BADCTL    .ASCII    "Invalid status/control code"
ENDERR21  .EQU      *
BADCTLPM  .ASCII    "Invalid control parameter list"
ENDERR22  .EQU      *
NORESRC   .ASCII    "Resource not available"
ENDERR25  .EQU      *
BADOP     .ASCII    "Call not supported by device"
ENDERR26  .EQU      *
IOERR     .ASCII    "I/O error"
ENDERR27  .EQU      *
DRNOTCON  .ASCII    "Drive not connected"
ENDERR28  .EQU      *

                    ;Memory Call Error Descriptions
SEGRQDN   .ASCII    "Segment request denied"
ENDERRE1  .EQU      *
SEGTBLFL  .ASCII    "Segment table full"
ENDERRE2  .EQU      *

                    ;Device Specific Errors
                    ;Err_Data - byte $0 = error code
                    ;   Bit 7 = BBK bad block has been detected
                    ;   Bit 6 = UNC uncorrectable error was encountered
                    ;   Bit 5 = 0 (undefined)
                    ;   Bit 4 = IDNF requested block ID is in error or cannot be found
                    ;   Bit 3 = 0 (undefined)
                    ;   Bit 2 = ABRT command was aborted or an invalid command
                    ;   Bit 1 = 0 (undefined)
                    ;   Bit 0 = AMNF general error
                    ;Err_Data - byte $1 thru $3 = block # (LB, MB, & HB)
                    ;Err_Data - byte $4 = # of blocks left to complete command

UNCerr    .ASCII    "Uncorrectable I/O error has occurred"
UNCend    .EQU      *
IDNFerr   .ASCII    "Invalid block number or block cannot be found"
IDNFend   .EQU      *
ABRTerr   .ASCII    "Invalid Command"
ABRTend   .EQU      *
AMNFerr   .ASCII    "General device error"
AMNFend   .EQU      *

                    ;CF Extended Error Descriptions
                    ;Extended Error Code Request
                    ; Returns 1 byte of exteded error code in Buffer
                    ; $00 = No Error Detected
                    ; $01 = Self test OK (No error)
                    ; $09 = Miscellaneous Error
                    ; $20 = Invalid Command
                    ; $21 = Invalid address (requested head or sector invalid)
                    ; $2F = Address Overflow (address too large)
                    ; $35,$36 = Supply voltage out of tolerance
                    ; $11 = Uncorrectable ECC error
                    ; $18 = Corrected ECC Error
                    ; $05,$30-34,$37,$3E = Self test or diagnostic failed
                    ; $10,$14 = ID not found
                    ; $3A = Spare sectors exhausted
                    ; $1F = Data transfer error/Aborted command
                    ; $0C,$38,$3B,$3C,$3F = Corrupted Media Format
                    ; $03 = Write/Erase failed

Xerr01    .ASCII    "Self test OK"
Xer01end  .EQU      *
Xerr02    .ASCII    "Miscellaneous Error"
Xer02end  .EQU      *
Xerr03    .ASCII    "Invalid Command"
Xer03end  .EQU      *
Xerr04    .ASCII    "Invalid head or sector invalid"
Xer04end  .EQU      *
Xerr05    .ASCII    "Address Overflow"
Xer05end  .EQU      *
Xerr06    .ASCII    "Supply voltage out of tolerance"
Xer06end  .EQU      *
Xerr07    .ASCII    "Uncorrectable ECC error"
Xer07end  .EQU      *
Xerr08    .ASCII    "Corrected ECC Error"
Xer08end  .EQU      *
Xerr09    .ASCII    "Self test failed"
Xer09end  .EQU      *
Xerr10    .ASCII    "ID not found"
Xer10end  .EQU      *
Xerr11    .ASCII    "Spare sectors exhausted"
Xer11end  .EQU      *
Xerr12    .ASCII    "Data transfer error/Aborted command"
Xer12end  .EQU      *
Xerr13    .ASCII    "Corrupted Media Format"
Xer13end  .EQU      *
Xerr14    .ASCII    "Write/Erase failed"
Xer14end  .EQU      *

                    ;Screen Display Pointers & Lengths
MSGADR    .WORD     MWINDOW     ;MSGWIND
          .WORD     INITSCRN    ;TITLE
          .WORD     CLRMSGS     ;CLRMSG
          .WORD     VPORT       ;VIEWPORT
          .WORD     VERMSG      ;VERSION
          .WORD     MENU0WVP    ;MENU0
          .WORD     EESC0       ;ESC0
          .WORD     DATEDISP    ;DATE
          .WORD     CLRSCRN     ;CLRVPORT
          .WORD     BORDERX     ;BORDER
          .WORD     DRVHDR      ;DRVHEDR
          .WORD     DWINDOW0    ;DWINDMSG
          .WORD     NODRVS      ;NODRIVE
          .WORD     Cmplete     ;CmpltMsg
          .WORD     CMDWIND     ;CMDLINE
          .WORD     DRVLEADR    ;DLEADER
          .WORD     EESC2       ;ESC2
          .WORD     PPROMPT0    ;PROMPT0
          .WORD     LLFMTCMD    ;LFMTCMD
          .WORD     VVRFYCMD    ;VRFYCMD
          .WORD     PPARTCMD    ;PARTCMD
          .WORD     TTESTCMD    ;TESTCMD
          .WORD     SSELCMD     ;SELECCMD
          .WORD     GASGAGE     ;GASGAUGE
          .WORD     PROGRESS    ;PROGBAR
          .WORD     LBA_NO      ;NO_LBA
          .WORD     BTRKTLR     ;BLKBAD2
          .WORD     VFYHALTD    ;VFYHLTD
          .WORD     FMTHALTD    ;FMTHLTD
          .WORD     NVFYERR     ;NUMERRS
          .WORD     ERASVOL1    ;BeepNclr
          .WORD     FWARN       ;FWARNING
          .WORD     EESC3       ;ESC3
          .WORD     FMDIALOG    ;FMTMSG
          .WORD     CURSEPOS    ;CURSER
          .WORD     UDATPTBL    ;PTBLMSG
          .WORD     UPDATDRV    ;UPDATMSG
          .WORD     UDATERR     ;UPDATERR
          .WORD     ORGDATE0    ;CREADATE
          .WORD     NEWDATE0    ;LMODDATE
          .WORD     DiagEr00    ;TestER00
          .WORD     DiagEr01    ;TestER01
          .WORD     DiagEr02    ;TestER02
          .WORD     DiagEr03    ;TestER03
          .WORD     DiagEr04    ;TestER04
          .WORD     DiagEr05    ;TestER05
          .WORD     DiagEr8x    ;TestER8x
          .WORD     FMTCOMP     ;FMTDONE
          .WORD     ERROCCUR    ;OCCUR
          .WORD     EESC5       ;ESC5
          .WORD     VFYSTOP     ;VFYHALT
          .WORD     BTRKHDR     ;BLOCKBAD
          .WORD     VFYCMPLT    ;VFYCOMP
          .WORD     TESTLIST    ;TESTLST
          .WORD     TESTDONE    ;TESTCOMP
          .WORD     PPARTHDR    ;PARTHDR
          .WORD     PPTMENU1    ;PTMENU1
          .WORD     PPTMENU1    ;BLOCKS
          .WORD     EESC6       ;ESC6
          .WORD     HLMSG0      ;HFMT0MSG
          .WORD     HLMSG1      ;HFMT1MSG
          .WORD     WDIRERR     ;DIRERR
          .WORD     HFMTCOMP    ;HFMTCMP
          .WORD     EESC1A      ;PRANYKEY
          .WORD     DASHTXT     ;DASH
          .WORD     DRNOTCON    ;DRVNCONT
          .WORD     INVPORT     ;VIEWPOS
          .WORD     PPTWARN1    ;PTWARN1
          .WORD     PPTWARN2    ;PTWARN2
          .WORD     PTLAP       ;PTOVLAP
          .WORD     REDITPT     ;RE_EDIT
          .WORD     ERASVOL1    ;ERASMSG1
          .WORD     ERASVOL2    ;ERASMSG2
          .WORD     EESC6A      ;ESC6A
          .WORD     CNOTICE     ;COPYRITE
          .WORD     FEESC6      ;FESC6
          .WORD     MWINDOW     ;CLRMSGW
          .WORD     EESC1B      ;ESC1B
          .WORD     SLOTLDR     ;SLOTPOS
          .WORD     REMCAP      ;RBLKS
          .WORD     SRCH        ;SEARCH
          .WORD     RANG1ERR    ;OUTRANG1
          .WORD     MAXBLK      ;MAXBLOCK
          .WORD     ASKVFRY     ;VRFYMSG
          .WORD     NOTFMT      ;NOFRMAT
          .WORD     ERASMSG0    ;ERASEPT
          .WORD     PPTMENU2    ;PTMENU2
          .WORD     EESC4       ;ESC4
          .WORD     PPROMPT0    ;CLRPMPT
          .WORD     TOTCAP      ;TCapBlks
          .WORD     DEV1HDR     ;DEVHDR1
          .WORD     DEV2HDR     ;DEVHDR2
          .WORD     DEV3HDR     ;DEVHDR3
          .WORD     DEV4HDR     ;DEVHDR4
          .WORD     DEV5HDR     ;DEVHDR5
          .WORD     DEV6HDR     ;DEVHDR6
          .WORD     DEV7HDR     ;DEVHDR7
          .WORD     Model       ;Model_nx
          .WORD     Device      ;Devic_nx
          .WORD     SerialNo    ;Seria_nx
          .WORD     FirmWare    ;FirmW_nx
          .WORD     YesAns      ;AnsYes
          .WORD     NoAns       ;AnsNo
          .WORD     NEWPOS      ;ClrLower
          .WORD     ERASMSG3    ;ERASEDRV
          .WORD     PTRDERR     ;PTReadER
          .WORD     PTUPD2      ;PTNUPD

MSGLEN    .BYTE     MWINDEND-MWINDOW  ;MSGWIND
          .BYTE     INSCREND-INITSCRN ;TITLE
          .BYTE     CLRMSEND-CLRMSGS  ;CLRMSG
          .BYTE     VPORTEND-VPORT    ;VIEWPORT
          .BYTE     VEREND-VERMSG     ;VERSION
          .BYTE     MENU0END-MENU0WVP ;MENU0
          .BYTE     EESC0END-EESC0    ;ESC0
DATELEN   .BYTE     000               ;DATE
          .BYTE     VPORTEND-CLRSCRN  ;CLRVPORT
          .BYTE     BDREND-BORDERX    ;BORDER
          .BYTE     DRVHDEND-DRVHDR   ;DRVHEDR
          .BYTE     DWINDEND-DWINDOW0 ;DWINDMSG
          .BYTE     NODRVEND-NODRVS   ;NODRIVE
          .BYTE     TESTDEND-Cmplete  ;CmpltMsg
          .BYTE     CMDWEND-CMDWIND   ;CMDLINE
          .BYTE     DLDREND-DRVLEADR  ;DLEADER
          .BYTE     EESC2END-EESC2    ;ESC2
          .BYTE     PRMP0END-PPROMPT0 ;PROMPT0
          .BYTE     LLFMTEND-LLFMTCMD ;LFMTCMD
          .BYTE     VVRFYEND-VVRFYCMD ;VRFYCMD
          .BYTE     PPARTEND-PPARTCMD ;PARTCMD
          .BYTE     TTESTEND-TTESTCMD ;TESTCMD
          .BYTE     SSELEND-SSELCMD   ;SELECCMD
          .BYTE     GASGAEND-GASGAGE  ;GASGAUGE
          .BYTE     PROGREND-PROGRESS ;PROGBAR
          .BYTE     LBAnoEnd-LBA_NO   ;NO_LBA
          .BYTE     BTRKHEND-BTRKTLR  ;BLKBAD2
          .BYTE     VFYHMEND-VFYHALTD ;VFYHLTD
          .BYTE     FMTHMEND-FMTHALTD ;FMTHLTD
NUMVLEN   .BYTE     000               ;NUMERRS
          .BYTE     002               ;BeepNclr
          .BYTE     FWARNEND-FWARN    ;FWARNING
          .BYTE     EESC3END-EESC3    ;ESC3
          .BYTE     FMTDEND-FMDIALOG  ;FMTMSG
          .BYTE     CURSEND-CURSEPOS  ;CURSER
          .BYTE     UDATEND-UDATPTBL  ;PTBLMSG
          .BYTE     UPDATEND-UPDATDRV ;UPDATMSG
          .BYTE     UDATEREN-UDATERR  ;UPDATERR
          .BYTE     ORGDEND-ORGDATE0  ;CREADATE
          .BYTE     NEWDEND-NEWDATE0  ;LMODDATE
          .BYTE     DERend00-DiagEr00 ;TestER00
          .BYTE     DERend01-DiagEr01 ;TestER01
          .BYTE     DERend02-DiagEr02 ;TestER02
          .BYTE     DERend03-DiagEr03 ;TestER03
          .BYTE     DERend04-DiagEr04 ;TestER04
          .BYTE     DERend05-DiagEr05 ;TestER05
          .BYTE     DERend8x-DiagEr8x ;TestER8x
          .BYTE     FMTCMEND-FMTCOMP  ;FMTDONE
          .BYTE     OCCUREND-ERROCCUR ;OCCUR
          .BYTE     EESC5END-EESC5    ;ESC5
          .BYTE     VFYSTEND-VFYSTOP  ;VFYHALT
          .BYTE     BADSECT-BTRKHDR   ;BLOCKBAD
          .BYTE     VFYCMEND-VFYCMPLT ;VFYCOMP
          .BYTE     TSTLSEND-TESTLIST ;TESTLST
          .BYTE     TESTDEND-TESTDONE ;TESTCOMP
          .BYTE     PTHDREND-PPARTHDR ;PARTHDR
          .BYTE     PPTMENU2-PPTMENU1 ;PTMENU1
          .BYTE     PBLKEND-PPTMENU1  ;BLOCKS
          .BYTE     EESC6END-EESC6    ;ESC6
          .BYTE     PNAME1-HLMSG0      ;HFMT0MSG
          .BYTE     HLMSGEND-HLMSG1   ;HFMT1MSG
          .BYTE     WDIRREND-WDIRERR  ;DIRERR
          .BYTE     HFMTCEND-HFMTCOMP ;HFMTCMP
          .BYTE     EESC1END-EESC1A   ;PRANYKEY
          .BYTE     DASHEND-DASHTXT   ;DASH
          .BYTE     ENDERR28-DRNOTCON ;DRVNCONT
          .BYTE     VTEND-INVPORT     ;VIEWPOS
          .BYTE     PPTW1END-PPTWARN1 ;PTWARN1
          .BYTE     PPTW2END-PPTWARN2 ;PTWARN2
          .BYTE     PTLAPEND-PTLAP    ;PTOVLAP
          .BYTE     REDITEND-REDITPT  ;RE_EDIT
          .BYTE     ERASEND1-ERASVOL1 ;ERASMSG1
          .BYTE     ERASEND2-ERASVOL2 ;ERASMSG2
          .BYTE     ESC6AEND-EESC6A   ;ESC6A
          .BYTE     CNOTEND-CNOTICE   ;COPYRITE
          .BYTE     FESC6END-FEESC6   ;FESC6
          .BYTE     CLRMSEND-MWINDOW  ;CLRMSGW
          .BYTE     EESC1END-EESC1B   ;ESC1B
          .BYTE     SLDREND-SLOTLDR   ;SLOTPOS
          .BYTE     NREMCAP-REMCAP    ;RBLKS
          .BYTE     SRCHEND-SRCH      ;SEARCH
          .BYTE     RANG1END-RANG1ERR ;OUTRANG1
          .BYTE     MXBLKEND-MAXBLK   ;MAXBLOCK
          .BYTE     ASKVEND-ASKVFRY   ;VFRYMSG
          .BYTE     NOFMTEND-NOTFMT   ;NOFRMAT
          .BYTE     ERAS0END-ERASMSG0  ;ERASEPT
          .BYTE     PPTMEND-PPTMENU2  ;PTMENU2
          .BYTE     EESC4END-EESC4    ;ESC4
          .BYTE     CPMPEND-PPROMPT0  ;CLRPMPT
TCAPLEN   .BYTE     000               ;TCapBlks
          .BYTE     DEV2HDR-DEV1HDR   ;DEVHDR1
          .BYTE     DEV3HDR-DEV2HDR   ;DEVHDR2
          .BYTE     DEV4HDR-DEV3HDR   ;DEVHDR3
          .BYTE     DEV5HDR-DEV4HDR   ;DEVHDR4
          .BYTE     DEV6HDR-DEV5HDR   ;DEVHDR5
          .BYTE     DEV7HDR-DEV6HDR   ;DEVHDR6
          .BYTE     DEV7END-DEV7HDR   ;DEVHDR7
          .BYTE     MODELend-Model    ;Model_nx
          .BYTE     DEVNOend-Device   ;Devic_nx
          .BYTE     SERLend-SerialNo  ;Seria_nx
          .BYTE     FIRMWend-FirmWare ;FirmW_nx
          .BYTE     YesEnd-YesAns     ;AnsYes
          .BYTE     NoEnd-NoAns       ;AnsNo
          .BYTE     NPOSEND-NEWPOS    ;ClrLower
          .BYTE     ERAS3END-ERASMSG3 ;ERASEDRV
          .BYTE     PTRDEREN-PTRDERR ;PTReadER
          .BYTE     PTUPDEND-PTUPD2   ;PTNUPD

                    ;Main Menu Pointers & Lengths
MENU0LST  .ASCII    "STVFPQ"

MENU0ADR  .WORD     MENU0S2
          .WORD     MENU0I2
          .WORD     MENU0V2
          .WORD     MENU0L2
          .WORD     MENU0P2
          .WORD     MENU0Q2

MENU0LEN  .BYTE     MENU0I1-MENU0S2
          .BYTE     MENU0V1-MENU0I2
          .BYTE     MENU0L1-MENU0V2
          .BYTE     MENU0P1-MENU0L2
          .BYTE     MENU0Q1-MENU0P2
          .BYTE     MENU0END-MENU0Q2

FUNCADR   .WORD     SELDRV-1
          .WORD     TESTIFC-1
          .WORD     VERIFY-1
          .WORD     FORMAT-1
          .WORD     PARTITIO-1
          .WORD     QUIT-1

                    ;Partition Display Variables
COL_HPOS  .BYTE     012
          .BYTE     01C
          .BYTE     024

ITEM_LEN  .BYTE     007   ;Starting Block
          .BYTE     005   ;Partition Length
          .BYTE     00F   ;Volume Name

TRACK0    .BYTE     01A,012,008
TRKVAL0   .BLOCK    008,000
TRACK1    .BYTE     01A,012,009
TRKVAL1   .BLOCK    008,000
TRACK2    .BYTE     01A,012,00A
TRKVAL2   .BLOCK    008,000
TRACK3    .BYTE     01A,012,00B
TRKVAL3   .BLOCK    008,000
TRACK4    .BYTE     01A,012,00C
TRKVAL4   .BLOCK    008,000
TRACK5    .BYTE     01A,012,00D
TRKVAL5   .BLOCK    008,000
TRACK6    .BYTE     01A,012,00E
TRKVAL6   .BLOCK    008,000
TRACK7    .BYTE     01A,012,00F
TRKVAL7   .BLOCK    008,000

BLKLEN0   .BYTE     01A,01C,008
BLENVAL0  .BLOCK    006,000
BLKLEN1   .BYTE     01A,01C,009
BLENVAL1  .BLOCK    006,000
BLKLEN2   .BYTE     01A,01C,00A
BLENVAL2  .BLOCK    006,000
BLKLEN3   .BYTE     01A,01C,00B
BLENVAL3  .BLOCK    006,000
BLKLEN4   .BYTE     01A,01C,00C
BLENVAL4  .BLOCK    006,000
BLKLEN5   .BYTE     01A,01C,00D
BLENVAL5  .BLOCK    006,000
BLKLEN6   .BYTE     01A,01C,00E
BLENVAL6  .BLOCK    006,000
BLKLEN7   .BYTE     01A,01C,00F
BLENVAL7  .BLOCK    006,000

VOLNAME0  .BYTE     01A,024,008
VNAME0    .BLOCK    010,020
VOLNAME1  .BYTE     01A,024,009
VNAME1    .BLOCK    010,020
VOLNAME2  .BYTE     01A,024,00A
VNAME2    .BLOCK    010,020
VOLNAME3  .BYTE     01A,024,00B
VNAME3    .BLOCK    010,020
VOLNAME4  .BYTE     01A,024,00C
VNAME4    .BLOCK    010,020
VOLNAME5  .BYTE     01A,024,00D
VNAME5    .BLOCK    010,020
VOLNAME6  .BYTE     01A,024,00E
VNAME6    .BLOCK    010,020
VOLNAME7  .BYTE     01A,024,00F
VNAME7    .BLOCK    010,020

TRKADR    .WORD     TRKVAL0
          .WORD     TRKVAL1
          .WORD     TRKVAL2
          .WORD     TRKVAL3
          .WORD     TRKVAL4
          .WORD     TRKVAL5
          .WORD     TRKVAL6
          .WORD     TRKVAL7

BLENADR   .WORD     BLENVAL0
          .WORD     BLENVAL1
          .WORD     BLENVAL2
          .WORD     BLENVAL3
          .WORD     BLENVAL4
          .WORD     BLENVAL5
          .WORD     BLENVAL6
          .WORD     BLENVAL7

PNAMEADR  .WORD     VNAME0
          .WORD     VNAME1
          .WORD     VNAME2
          .WORD     VNAME3
          .WORD     VNAME4
          .WORD     VNAME5
          .WORD     VNAME6
          .WORD     VNAME7

VOLADR    .WORD     VNAME0-5
          .WORD     VNAME1-5
          .WORD     VNAME2-5
          .WORD     VNAME3-5
          .WORD     VNAME4-5
          .WORD     VNAME5-5
          .WORD     VNAME6-5
          .WORD     VNAME7-5

                    ;Partition table indexes for starting block & partition length
STBindex  .BYTE     0A3,0A8,0B3,0B8,0C3,0C8,0D3,0D8
VSZindex  .BYTE     0A6,0AB,0B6,0BB,0C6,0CB,0D6,0DB

PMSGADR   .WORD     TRACK0          ;#TRK0
          .WORD     TRACK1
          .WORD     TRACK2
          .WORD     TRACK3
          .WORD     TRACK4
          .WORD     TRACK5
          .WORD     TRACK6
          .WORD     TRACK7
          .WORD     BLKLEN0         ;#BLEN0
          .WORD     BLKLEN1
          .WORD     BLKLEN2
          .WORD     BLKLEN3
          .WORD     BLKLEN4
          .WORD     BLKLEN5
          .WORD     BLKLEN6
          .WORD     BLKLEN7
          .WORD     VOLNAME0        ;#VOL0
          .WORD     VOLNAME1
          .WORD     VOLNAME2
          .WORD     VOLNAME3
          .WORD     VOLNAME4
          .WORD     VOLNAME5
          .WORD     VOLNAME6
          .WORD     VOLNAME7

                    ;Misc Variables Address List
VFYERADR  .WORD     NVFYERR
PTHDRADR  .WORD     TOTCAP
PTLRADR   .WORD     NREMCAP
BSECTADR  .WORD     BADSECT

                    ;General SOS Call Error Codes
SOSERR    .BYTE     000
                    ;Device Call Error Codes
          .BYTE     010,021,022,025,026
          .BYTE     027,028
                    ;Memory Call Error Codes
          .BYTE     0E1,0E2
SERRLEN   .EQU      *-SOSERR
                    ;CF Extended Error Codes & index
XerrCode  .BYTE     001,009,020,021,02F,035,036,011
          .BYTE     018,005,030,031,032,033,034,037
          .BYTE     03E,010,014,03A,01F,00C,038,03B
          .BYTE     03C,03F,003
XerrIndx  .BYTE     00B,00D,00F,011,012,013,013,014
          .BYTE     015,016,016,016,016,016,016,016
          .BYTE     016,017,017,018,019,01A,01A,01A
          .BYTE     01A,01A,01B

                    ;General SOS Call Error Description Address
ERMSGADR  .WORD     ERRDESC
                    ;Device Call Error Description Address
          .WORD     DNFERR
          .WORD     BADCTL
          .WORD     BADCTLPM
          .WORD     NORESRC
          .WORD     BADOP
          .WORD     IOERR
          .WORD     DRNOTCON
                    ;Memory Call Error Description Address
          .WORD     SEGRQDN
          .WORD     SEGTBLFL
                    ;Device Specific Errors
          .WORD     AMNFerr     ;$00
          .WORD     Xerr01   ;CF Extended Error $01 Description Address
          .WORD     ABRTerr     ;$04
          .WORD     Xerr02   ;CF Extended Error $09 Description Address
          .WORD     IDNFerr     ;$10
          .WORD     Xerr03   ;CF Extended Error $20 Description Address
          .WORD     UNCerr      ;$40
                    ;CF Extended Error Description Address
          .WORD     Xerr04
          .WORD     Xerr05
          .WORD     Xerr06
          .WORD     Xerr07
          .WORD     Xerr08
          .WORD     Xerr09
          .WORD     Xerr10
          .WORD     Xerr11
          .WORD     Xerr12
          .WORD     Xerr13
          .WORD     Xerr14

                    ;General SOS Call Error Description Len
ERMSGLEN  .BYTE     ENDERR00-ERRDESC
                    ;Device Call Error Description Len
          .BYTE     ENDERR10-DNFERR
          .BYTE     ENDERR21-BADCTL
          .BYTE     ENDERR22-BADCTLPM
          .BYTE     ENDERR25-NORESRC
          .BYTE     ENDERR26-BADOP
          .BYTE     ENDERR27-IOERR
          .BYTE     ENDERR28-DRNOTCON
                    ;Memory Call Error Description Len
          .BYTE     ENDERRE1-SEGRQDN
          .BYTE     ENDERRE2-SEGTBLFL
                    ;Device Specific Errors
          .BYTE     AMNFend-AMNFerr
          .BYTE     Xer01end-Xerr01  ;CF Extended Error $01 Description Len
          .BYTE     ABRTend-ABRTerr
          .BYTE     Xer02end-Xerr02  ;CF Extended Error $09 Description Len
          .BYTE     IDNFend-IDNFerr
          .BYTE     Xer03end-Xerr03  ;CF Extended Error $20 Description Len
          .BYTE     UNCend-UNCerr
                    ;CF Extended Error Description Len
          .BYTE     Xer04end-Xerr04
          .BYTE     Xer05end-Xerr05
          .BYTE     Xer06end-Xerr06
          .BYTE     Xer07end-Xerr07
          .BYTE     Xer08end-Xerr08
          .BYTE     Xer09end-Xerr09
          .BYTE     Xer10end-Xerr10
          .BYTE     Xer11end-Xerr11
          .BYTE     Xer12end-Xerr12
          .BYTE     Xer13end-Xerr13
          .BYTE     Xer14end-Xerr14

                    ;FONT CODE
FONT1     .BYTE     008
          .BYTE     000
          .BYTE     000,000,000,000,040,008,002,001
          .BYTE     001
          .BYTE     000,000,000,000,001,008,020,040
          .BYTE     002
          .BYTE     001,001,002,008,040,000,000,000
          .BYTE     003
          .BYTE     040,040,020,008,001,000,000,000
          .BYTE     004
          .BYTE     000,000,000,000,049,000,000,000
          .BYTE     005
          .BYTE     000,000,000,000,024,000,000,000
          .BYTE     006
          .BYTE     000,000,000,000,012,000,000,000
          .BYTE     007
          .BYTE     040,040,040,040,040,040,040,040
FONT2     .BYTE     003
          .BYTE     008
          .BYTE     001,001,001,001,001,001,001,001
          .BYTE     009                            ;Gas Gage character 1
          .BYTE     055,02A,055,02A,055,02A,055,02A
          .BYTE     00A                            ;Gas Gage character 2
          .BYTE     02A,055,02A,055,02A,055,02A,055

                    ;Wait - Copy of Apple's wait routine.
                    ;Areg=desired delay time, where Delay(us) = (5Areg^2 + 27Areg + 26)/2
                    ;or more usefully: Areg =  (Delay[in uS]/2.5 + 2.09)^.5 - 2.7
Wait1sec  PHP       ;Set1Mhz
          SEI
          LDA       EReg
          ORA       #080
          STA       EReg
          PLP

          LDY       #003
$1        LDA       #0FF
          SEC
$2        PHA
$3        SBC       #001
          BNE       $3
          PLA
          SBC       #001
          BNE       $2
          DEY
          BNE       $1

          PHP       ;Set2Mhz
          SEI
          LDA       EReg
          AND       #07F
          STA       EReg
          PLP
          RTS

                    ;Get & Display CF extended error code
XtendErr  LDY       #ATA_Cmd
          LDA       #ATA_Xerr
          STA       @BUFFCALL,Y
          JSR       CALLDRVR
          BCS       StdError
          LDY       #000
          LDA       @BUFFPG0,Y   ;Get extended error code
          LDX       #XerrIndx-XerrCode-1
$1        CMP       XerrCode,X
          BEQ       $2
          DEX
          BPL       $1
          JMP       GenError
$2        LDY       XerrIndx,X
          JMP       PrtError

;CFutil2
                    ;Device Specific Error Handler
ErrHndlr  LDA       Err_Data
          BEQ       NoError
          LDY       MODE_ID
          CPY       #002
          BEQ       XtendErr
StdError  ASL       A
          BCC       $1
          LDX       #MSGWIND
          JSR       PRTMSG
          LDX       #BeepNclr
          JSR       PRTMSG
          JSR       PrtBdBlk
          JMP       PrtLast
$1        LDY       #010
$2        ASL       A
          BCS       PrtError
          DEY
          CPY       #00B
          BCS       $2
          LDY       #000
          LDA       Err_Data
          JMP       GenError

                    ;Error handler for SOS errors
ERRORCK   BNE       ERROR
NoError   RTS
ERROR     STA       ERRCODE
          LDY       #SERRLEN
          LDA       ERRCODE
$1        CMP       SOSERR,Y
          BEQ       PrtError
          DEY
          BNE       $1
GenError  JSR       BINHEX
PrtError  LDX       #MSGWIND
          JSR       PRTMSG
          LDX       #BeepNclr
          JSR       PRTMSG
          LDA       ERMSGLEN,Y
          STA       PRTLEN1
          TYA
          ASL       A
          TAX
          LDA       ERMSGADR,X
          STA       INDEX
          LDA       ERMSGADR+1,X
          STA       INDEX+1
          BRK
          .BYTE     0CB
          .WORD     WRITINDX
          JSR       ERRORCK
PrtLast   LDX       #DASH
          JSR       PRTMSG
          LDX       #PRANYKEY
          JSR       PRTMSG
          BRK
          .BYTE     0CA
          .WORD     READCON
          LDX       #CLRMSG
          JSR       PRTMSG
          JMP       MAINMENU

PRTMSG    LDA       MSGLEN,X
PRTMSG1   STA       PRTLEN1
          TXA
          ASL       A
          TAX
          LDA       MSGADR,X
          STA       INDEX
          LDA       MSGADR+1,X
          STA       INDEX+1
PRTMSG2   BRK
          .BYTE     0CB
          .WORD     WRITINDX
          JMP       ERRORCK

PRTDNAME  TXA
          ASL       A
          ASL       A
          ASL       A
          ASL       A
          ADC       #080
          STA       DNAMEPTR
          LDY       #000
          LDA       @DNAMEPTR,Y
          STA       PRTLEN2
          INC       DNAMEPTR
PRTDNAM2  BRK
          .BYTE     0CB
          .WORD     WRITDNAM
          JMP       ERRORCK

PRTBYTE   STA       CHR
          BRK
          .BYTE     0CB
          .WORD     WRITCHR
          JMP       ERRORCK

PrtBdBlk  LDX       #002
$1        LDA       Err_Data+1,X
          STA       PRODUCT,X
          DEX
          BPL       $1
          LDA       BSECTADR
          STA       INDEX
          LDA       BSECTADR+1
          STA       INDEX+1
          JSR       DECIMAL7
          CLC
          LDX       #BLOCKBAD
          ADC       MSGLEN,X
          JSR       PRTMSG1
          LDX       #BLKBAD2
          JMP       PRTMSG

FATALERR  BNE       $1
          RTS
$1        STA       ERRCODE
          PLA
          STA       INDEX+1
          PLA
          STA       INDEX
$2        JMP       $2

CLOSE     BEQ       $1
          STA       CLOSREF
          BRK
          .BYTE     0CC
          .WORD     CLOSLIST
$1        JMP       ERRORCK

QUIT      LDA       #001
          JSR       PRTBYTE
          LDA       #01C
          JSR       PRTBYTE
          LDA       SEGNUM
          STA       RELNUM
          BRK
          .BYTE     045
          .WORD     RELSEG
BYE       BRK
          .BYTE     065
          .WORD     BYE

                    ;event handler for escape keystroke
ESCHDLR   SEC
          ROR       HALTFLAG
          LDA       #FLSHTYPE
          STA       CTRLCODE
          BRK
          .BYTE     083
          .WORD     CTRLCALL
          JMP       ERRORCK

HALTPRG   PHP
          LDX       #MSGWIND
          JSR       PRTMSG
          BRK
          .BYTE     082
          .WORD     RESCR
          JSR       ERRORCK
          LDX       #VFYHALT
          JSR       PRTMSG
$1        BRK
          .BYTE     0CA
          .WORD     READCON
          JSR       ERRORCK
          LDA       INPUT
          CMP       #01B
          BNE       $2
          LDX       #CLRMSG
          JSR       PRTMSG
          PLP
          JMP       GRPDONE
$2        CMP       #020
          BNE       $1
          BRK
          .BYTE     083
          .WORD     RESCR
          JSR       ERRORCK
          LDA       #004
          JSR       PRTBYTE
          BRK
          .BYTE     083
          .WORD     ATTNEVNT
          JSR       ERRORCK
          STA       HALTFLAG
          PLP
          RTS

BEGIN     TSX
          STX       STACK
          LDA       #000
          STA       ERRCODE
          STA       MENU0SEL
          LDY       #077    ;# of zero page data buffer locations
$1        STA       DNUMLST,Y
          DEY
          BPL       $1
          LDA       #001
          STA       DfltSTlb
          JSR       ALLOCMEM

          BRK
          .BYTE     084
          .WORD     DEVCALL
          JSR       FATALERR
          LDA       DEVNUM
          STA       CTRLREF1
          STA       CTRLREF2
          STA       CTRLREF3
          STA       CTRLREF4
          STA       STATREF1
          STA       STATREF2
          STA       SREF1
          STA       SREF2

          BRK
          .BYTE     0C8
          .WORD     OPENCON
          JSR       FATALERR
          LDA       CONREFN
          STA       PRTREF1
          STA       PRTREF2
          STA       PRTREF3
          STA       CONREF

          LDY       #000            ;Initialize console status buffers
          LDA       #05A
          STA       @STATBUF1,Y
          STA       @STATBUF2,Y
          TYA
          STA       @SCRBUF,Y       ;initialize screen buffer
          BRK       ;save initial console status
          .BYTE     082
          .WORD     CONSTAT
          JSR       FATALERR
          LDA       #00B
          STA       CTRLCODE
          BRK       ;turn off screen echo
          .BYTE     083
          .WORD     CTRLCALL
          BRK       ;save current console status
          .BYTE     082
          .WORD     RESETCON
          JSR       FATALERR
          LDY       #001
          STA       @STATBUF2,Y
          LDY       #006
          STA       @STATBUF2,Y
          BRK
          .BYTE     083
          .WORD     RESETCON
          JSR       FATALERR
          BRK
          .BYTE     083
          .WORD     SETFONT1
          JSR       ERRORCK
          BRK
          .BYTE     083
          .WORD     SETFONT2
          JSR       ERRORCK
          LDX       #TITLE
          JSR       PRTMSG
          LDX       #BORDER
          JSR       PRTMSG
          LDX       #SEARCH
          JSR       PRTMSG
          JSR       PREPDATE
          JSR       GETDNAME
          JSR       Wait1sec
          JMP       MENUINIT

                    ;Main Menu and home origin for program routines
MAINMENU  LDX       STACK
          TXS
          BRK       ;RESET CONSOLE
          .BYTE     083
          .WORD     RESETCON
          JSR       ERRORCK
MENUINIT  LDX       #CLRPMPT
          JSR       PRTMSG
          LDX       #CMDLINE
          JSR       PRTMSG
          LDX       #VERSION
          JSR       PRTMSG
          LDX       #DATE
          JSR       PRTMSG
          LDX       #MENU0
          JSR       PRTMSG
          LDX       #MSGWIND
          JSR       PRTMSG
          LDX       #ESC0
          JSR       PRTMSG
          LDX       MENU0SEL
          JMP       MENU0HL

                    ;Print non highlighted menu item
MENU0STD  STX       MENU0SEL
          JSR       PRTMSG2

                    ;Print highligted menu item
MENU0HL   LDA       MENU0LEN,X
          STA       PRTLEN1
          TXA
          ASL       A
          TAX
          LDA       MENU0ADR,X
          STA       INDEX
          LDA       MENU0ADR+1,X
          STA       INDEX+1
          LDY       #003
          LDA       #012
          STA       @INDEX,Y
          JSR       PRTMSG2
          LDA       #011
          STA       @INDEX,Y
GETCHR1   BRK
          .BYTE     0CA
          .WORD     READCON
          JSR       ERRORCK
          LDA       INPUT
          CMP       #UPARROW
          BEQ       UP0
          CMP       #DNARROW
          BEQ       DN0
          CMP       #RETURN
          BEQ       CRET0
          CMP       #OAPL_QM
          BEQ       $2
          LDX       #005     ;Number of menu items
          AND       #0DF
$1        CMP       MENU0LST,X
          BEQ       SELECT0
          DEX
          BPL       $1
          JMP       GETCHR1
$2        LDX       #COPYRITE
          JSR       PRTMSG
          LDX       MENU0SEL
          JMP       MENU0HL

                    ;Up arrow for main menu
UP0       LDX       MENU0SEL
          BNE       $1
          LDX       #005     ;Number of menu items
          BNE       MENU0STD
$1        DEX
          BPL       MENU0STD

                    ;Down arrow for main menu
DN0       LDX       MENU0SEL
          CPX       #005     ;Number of menu items
          BNE       $1
          LDX       #000
          BEQ       MENU0STD
$1        INX
          BNE       MENU0STD

                    ;Return for main menu
CRET0     LDX       MENU0SEL
SELECT0   TXA
          STA       MENU0SEL
          ASL       A
          TAX
          LDA       FUNCADR+1,X
          PHA
          LDA       FUNCADR,X
          PHA
          LDX       #CLRVPORT
          JMP       PRTMSG

                    ;Routine to display device info
DispInfo  LDX       #DEVHDR1      ;Display device info
          JSR       PRTMSG
          LDX       #Devic_nx
          JSR       PRTMSG
          LDX       #DEVHDR2      ;Display model # info
          JSR       PRTMSG
          LDX       #Model_nx
          JSR       PRTMSG
          LDX       #DEVHDR3      ;Display serial # info
          JSR       PRTMSG
          LDX       #Seria_nx
          JSR       PRTMSG
          LDX       #DEVHDR4      ;Display firmware version info
          JSR       PRTMSG
          LDX       #FirmW_nx
          JSR       PRTMSG
          LDX       #DEVHDR5      ;Display LBA support info
          JSR       PRTMSG
          LDX       #AnsYes
          LDA       MODE_ID
          AND       #002
          BNE       $1
          LDX       #No_LBA
$1        JSR       PRTMSG
          LDX       #DEVHDR6      ;Display CFA features support info
          JSR       PRTMSG
          LDX       #AnsYes
          LDA       MODE_ID
          AND       #001
          BEQ       $2
          LDX       #AnsNo
$2        JSR       PRTMSG
          LDX       #DEVHDR7      ;Display Total device capacity info
          JSR       PRTMSG
          LDX       #TCapblks
          JSR       PRTMSG
          LDX       #BLOCKS
          JMP       PRTMSG

                    ;LowLevel Format Routine
FORMAT    LDX       #CMDLINE
          JSR       PRTMSG
          LDX       #LFMTCMD
          JSR       PRTMSG
          JSR       DISPDRV
          LDX       #CLRVPORT
          JSR       PRTMSG
          JSR       DispInfo

          LDA       #00A
          STA       VTPOS
          JSR       INCVPOS
          LDX       #FWARNING
          JSR       PRTMSG
$2        LDX       #MSGWIND
          JSR       PRTMSG
          LDX       #ESC3
          JSR       PRTMSG
          BRK
          .BYTE     0CA
          .WORD     READCON
          JSR       ERRORCK
          LDX       #CLRMSGW
          JSR       PRTMSG
          LDA       INPUT
          AND       #0DF
          CMP       #OAPPLE_F
          BEQ       FMTBEGIN
          CMP       #OAPPLE_P
          BEQ       FMTPTBL
          CMP       #ESCAPE
          BNE       $2
          JMP       MAINMENU

FMTBEGIN  LDA       MODE_ID   ;check if device supports CFA feature set
          AND       #001
          BEQ       NXTCHNCE
          LDX       #NOFRMAT
          JSR       PRTMSG
FMTPTBL   LDX       #PROMPT0
          JSR       PRTMSG
          LDX       #ERASEPT
          JSR       PRTMSG
          JSR       QUERY_YN
          BCC       PTBLWRIT     ;Write a blank partition table
          JMP       MAINMENU

NXTCHNCE  LDX       #PROMPT0
          JSR       PRTMSG
          LDX       #ERASEDRV
          JSR       PRTMSG
          JSR       QUERY_YN
          BCC       StartFmt
          JMP       MAINMENU

StartFmt  LDA       #01E
          JSR       PRTBYTE
          LDX       #PROMPT0
          JSR       PRTMSG
          LDX       #FMTMSG
          JSR       PRTMSG
          JSR       CLRCALL
          LDY       #ATA_Cmd     ;Setup low level format call
          LDA       #ATA_Frmt
          STA       @BUFFCALL,Y
          LDX       #ESC4        ;Halt option message for format routine
          STX       ZPGTEMP0
          JSR       STRTOPER
          LDA       VFYERADR
          STA       INDEX
          LDA       VFYERADR+1
          STA       INDEX+1
          LDA       NUMERROR
          STA       PRODUCT
          LDA       #000
          STA       PRODUCT+1
          JSR       DECIMAL3
          STA       NUMVLEN
          LDX       #FMTDONE       ;display format complete message
          BIT       HALTFLAG
          BPL       $1
          LDX       #FMTHLTD
$1        JSR       PRTMSG
          LDX       #NUMERRS
          JSR       PRTMSG
          LDX       #OCCUR
          JSR       PRTMSG
          BIT       HALTFLAG
          BPL       PTBLWRIT
          JMP       FMTPTBL

PTBLWRIT  JSR       InitPTbl
          JSR       INCVPOS
          JSR       UDATDRV
          JMP       PAUSE

                    ;Verify Drive Media Routine
VERIFY    LDX       #CMDLINE
          JSR       PRTMSG
          LDX       #VRFYCMD
          JSR       PRTMSG
          JSR       DISPDRV
          LDX       #CLRVPORT
          JSR       PRTMSG
          JSR       DispInfo
          LDA       #00A
          STA       VTPOS
          LDX       #PROMPT0
          JSR       PRTMSG
          LDX       #VRFYMSG
          JSR       PRTMSG
          JSR       QUERY_YN
          BCC       $1
          JMP       MAINMENU
$1        LDX       #CLRMSG
          JSR       PRTMSG
          JSR       CLRCALL
          LDY       #ATA_Cmd    ;Setup read-verify call
          LDA       #ATA_Vrfy
          STA       @BUFFCALL,Y
          LDX       #ESC5        ;Halt option message for verify routine
          STX       ZPGTEMP0
          JSR       STRTOPER
          LDA       VFYERADR
          STA       INDEX
          LDA       VFYERADR+1
          STA       INDEX+1
          LDA       NUMERROR
          STA       PRODUCT
          LDA       #000
          STA       PRODUCT+1
          JSR       DECIMAL3
          STA       NUMVLEN
          LDX       #VFYCOMP
          BIT       HALTFLAG
          BPL       $2
          LDX       #VFYHLTD
$2        JSR       PRTMSG
          LDX       #NUMERRS
          JSR       PRTMSG
          LDX       #OCCUR
          JSR       PRTMSG
          JMP       PAUSE

                    ;Subroutine to perform a function over the entire capacity
                    ;of the device, display a gas gage progress indicator, and handle
                    ;user interupt of function
STRTOPER  TSX
          STX       LOCSTAT
          LDA       #000
          STA       HALTFLAG
          STA       NUMERROR
          STA       POSITION    ;percentage counter
          LDA       #032
          STA       Divisor     ;Initialize number of gas gage increments
          LDA       #013
          STA       GAS_HPOS    ;Initialize gas gage starting horizontal position
          JSR       InitBPER     ;Setup counter for gas gage display
          LDX       #MSGWIND
          JSR       PRTMSG
          LDX       ZPGTEMP0
          JSR       PRTMSG
          LDX       #GASGAUGE   ;gas gage progess display
          JSR       PRTMSG
          LDA       #080        ;Turn on attention event
          STA       ATTNBUFF
          BRK
          .BYTE     083
          .WORD     ATTNEVNT
          JSR       ERRORCK
          JSR       CALLDRVR
          BCS       BLKVFERR

NEXTRK    LDY       #Num_Blks
          LDA       @BUFFCALL,Y
          BEQ       $1            ;If Num_Blks=$0 then increment BCTR $0100
          CLC
          ADC       BCTR
          STA       BCTR
          BCC       $2
$1        INC       BCTR+1
$2        JSR       INCRSECT
          BIT       HALTFLAG
          BPL       $3
          JSR       HALTPRG
$3        JSR       PRT_GAGE
NXTBLK2   BIT       HALTFLAG
          BPL       $1
          JSR       HALTPRG
$1        JSR       CALLDRVR   ;Verify Num_Blks
          BIT       HALTFLAG
          BPL       $2
          JSR       HALTPRG
$2        BCC       NEXTRK

                    ;Bad block error routine for verify or format device routines
BLKVFERR  LDA       Err_Data
          BMI       $1
          JSR       ATTNOFF    ;if not bad block error then report error and exit to menu
          JMP       ErrHndlr
$1        LDA       NUMERROR   ;If first error then clear viewport
          BNE       $2
          LDX       #VIEWPOS
          JSR       PRTMSG
          LDA       #01C
          JSR       PRTBYTE
          LDA       #002
          STA       VTPOS
$2        JSR       INCVPOS
          INC       NUMERROR
          JSR       PrtBdBlk
          CLC
          LDY       #Sect_LB
          LDA       Err_Data+1   ;update call address with next block after error
          ADC       #001
          STA       @BUFFCALL,Y
          DEY
          LDA       Err_Data+2
          ADC       #000
          STA       @BUFFCALL,Y
          DEY
          LDA       Err_Data+3
          ADC       #000
          STA       @BUFFCALL,Y
          JSR       InitBPER
          JMP       NXTBLK2

INCVPOS   LDA       VTPOS     ;increment viewport vertical position
          CMP       #00E
          BCS       $1
          INC       VTPOS
$1        LDX       #VIEWPOS
          JMP       PRTMSG

                    ;Subroutine to print progress & gas gage indicator
PRT_GAGE  LDA       BPERCTR+1
          BEQ       $0
          CMP       BCTR+1
          BCC       $2
          BNE       $1
          LDA       BPERCTR
          CMP       BCTR
          BEQ       $2
          LDY       Divisor  ;if divisor = 1 then load Num_Blks with final amount
          DEY
          BNE       $1
          LDY       #Num_blks
          STA       @BUFFCALL,Y
$1        RTS
$0        LDA       BCTR
          CMP       BPERCTR
          BCC       $1

$2        INC       POSITION
          INC       POSITION
          LDX       POSITION   ;percentage counter
          LDY       #002
$3        LDA       #000       ;Initialize remainder
          JSR       DIVx10
          ORA       #030
          STA       PCENT,Y
          TXA
          BEQ       $5
          DEY
          BNE       $3
          TXA
          ORA       #030
          STA       PCENT,Y
          BNE       $6
$4        LDA       #020
          STA       PCENT,Y
$5        DEY
          BPL       $4
$6        LDX       #PROGBAR
          JSR       PRTMSG
          INC       GAS_HPOS
          DEC       Divisor
          BNE       InitBPER
GRPDONE   JSR       ATTNOFF           ;If divisor is zero then we are done
          LDX       #CLRMSGW
          JSR       PRTMSG
          LDX       LOCSTAT
          TXS
          INC       VTPOS
          LDX       #VIEWPORT
          JSR       PRTMSG
          LDX       #ClrLower
          JMP       PRTMSG

InitBPER  SEC       ;determine how many sectors are left to verify
          LDY       #Sect_LB
          LDA       TOTSECT
          SBC       @BUFFCALL,Y
          STA       BPERCTR
          DEY
          LDA       TOTSECT+1
          SBC       @BUFFCALL,Y
          STA       BPERCTR+1
          DEY
          LDA       TOTSECT+2
          SBC       @BUFFCALL,Y

DIV24x8   LDX       #010        ;24bit divide by 8bit routine where quotient won't
          CLC       ;exceed 16bits.  @Entry BPERCTR=LSB Dividend, Dividend
$1        ROL       BPERCTR     ;BPERCTR+1=MSB, Areg=HSB Dividend, Divisor=Divisor
          ROL       BPERCTR+1
          ROL       A
          CMP       Divisor
          BCC       $2
          SBC       Divisor
$2        DEX
          BNE       $1
          STX       BCTR       ;re-initialize block counter to zero
          STX       BCTR+1
          ROL       BPERCTR
          ROL       BPERCTR+1  ;@Exit: Areg & BPERCTR=Quotient LB, BPERCTR+1=Quotient HB
          BNE       $3
          LDX       BPERCTR    ;with BPERCTR
$3        LDY       #Num_Blks   ;Update drive call for next read quantity
          TXA
          STA       @BUFFCALL,Y
          RTS

ATTNOFF   LDA       #000
          STA       ATTNBUFF     ;Turn off attention event
          BRK
          .BYTE     083
          .WORD     ATTNEVNT
          JMP       ERRORCK

INCRSECT  SEC       ;Increment block address by Num_Blks
          LDY       #Num_Blks
          LDA       @BUFFCALL,Y
          BEQ       $1    ;If Num_Blks = $0 then increment sector address by $0100
          CLC
          LDY       #Sect_Lb
          ADC       @BUFFCALL,Y
          STA       @BUFFCALL,Y
$1        LDY       #Sect_Mb
          LDA       @BUFFCALL,Y
          ADC       #000
          STA       @BUFFCALL,Y
          DEY
          LDA       @BUFFCALL,Y
          ADC       #000
          STA       @BUFFCALL,Y
          RTS

                    ;Test IFC Routine
TESTIFC   LDX       #CMDLINE
          JSR       PRTMSG
          LDX       #TESTCMD
          JSR       PRTMSG
          BIT       CURDRIVE   ;check if a drive has been selected
          BPL       $0
          JSR       SELECDRV
$0        LDX       #CLRVPORT
          JSR       PRTMSG
          LDY       NUMDNAME
          BNE       $1
          JMP       No_Drvrs
$1        ldx       CURDRIVE
$2        lda       SLOTLST,x
$3        DEY
          BMI       $4
          CMP       SLOTLST,Y
          bne       $3
          lda       DRVNLST,x
          cmp       DRVNLST,y
          beq       $2
$4        STY       ZPGTEMP1  ;if = $FF then only 1 drive exists on this IFC
                    ;else 2 drives exist and the value is index of 2nd drive.
          BMI       $5
          LDA       DRVNLST,x
          beq       $5
          stx       ZPGTEMP1
          STY       CURDRIVE    ;Swap drives to put drive $0 first
          LDX       CURDRIVE
$5        LDA       DNUMLST,X
          STA       CALLREF1
          STA       CALLREF2
          JSR       CLRCALL
          LDY       #ATA_Cmd
          LDA       #ATA_Diag
          STA       @BUFFCALL,Y
          JSR       CALLDRVR
          JSR       ErrHndlr
          LDX       #TESTLST
          JSR       PRTMSG
          LDY       #000
          LDA       @BUFFPG0,Y
          BPL       $6
          STA       ERRCODE
          LDX       #TestER8x
          JSR       PRTMSG
          LDX       #DASH
          JSR       PRTMSG
          LDA       ERRCODE
$6        AND       #007
          CLC
          ADC       #TestER00
          TAX
          JSR       PRTMSG

FIRSTDRV  BIT       ZPGTEMP1  ;if minus then only 1 drive exists, else 2 drives
          BMI       NXTDRV
          JSR       GETDDATA
          JSR       DispInfo    ;Display device info list
          JSR       G_ANYKEY
          LDX       #CLRVPORT
          JSR       PRTMSG
          LDA       #00A
          JSR       PRTBYTE
          LDA       ZPGTEMP1
          STA       CURDRIVE
NXTDRV    JSR       GETDDATA
          JSR       DispInfo    ;Display device info list
          LDA       #080
          STA       CURDRIVE    ;Invalidate drive selection
          LDX       #TESTCOMP
          JSR       PRTMSG
          JMP       PAUSE

                    ;Display current driver on header command line
DISPDRV   BIT       CURDRIVE   ;check if a drive has been selected
          BPL       DISPDRV2
          JSR       SELECDRV
DISPDRV2  LDX       #DRVHEDR
          JSR       PRTMSG
          LDX       CURDRIVE
          JSR       PRTDNAME
          LDA       #004
          JSR       PRTBYTE
          RTS

                    ;routine to display created & modified dates for partition table
PTDATES   LDY       #ORIGDATE+7
          LDX       #007
$1        LDA       @PARTTBL,Y
          AND       #07F
          CMP       #02F
          BCC       $3
          CMP       #03A
          BCS       $3
          STA       ORGDATE1,X
          DEY
          DEX
          BPL       $1
          LDX       #CREADATE
          JSR       PRTMSG
          LDY       #MODDATE+7
          LDX       #007
$2        LDA       @PARTTBL,Y
          AND       #07F
          CMP       #02F
          BCC       $3
          CMP       #03A
          BCS       $3
          STA       NEWDATE1,X
          DEY
          DEX
          BPL       $2
          LDX       #LMODDATE
          JSR       PRTMSG
$3        RTS

                    ;Compute partition table checksum
GETCKSUM  CLC
          LDY       #002
          LDA       #0A5
$1        EOR       @PARTTBL,Y
          INY
          ADC       @PARTTBL,Y
          INY
          BNE       $1
          RTS

                    ;Select Drive program function
SELDRV    LDX       #CMDLINE
          JSR       PRTMSG
          LDX       #SELECCMD
          JSR       PRTMSG
          JSR       SELECDRV
          JMP       MAINMENU

                    ;Select Driver to perform program functions
SELECDRV  LDX       #VIEWPORT
          JSR       PRTMSG
          LDA       CURDRIVE
          STA       ZPGTEMP0
          BPL       LISTDRVS
          CMP       #0FF
          BEQ       No_Drvrs
          LDA       #000
          STA       CURDRIVE
          BEQ       LISTDRVS
No_Drvrs  LDX       #NODRIVE
          JSR       PRTMSG
          JMP       PAUSE

LISTDRVS  SEC
          LDA       #00C
          SBC       NUMDNAME
          LSR       A
          STA       DWINDULC
          LDX       #DWINDMSG
          JSR       PRTMSG
          LDX       #000
$1        STX       DRVPOS
          LDX       #DLEADER
          JSR       PRTMSG
          LDX       DRVPOS

          LDA       SLOTLST,X
          ORA       #030
          STA       SLOTVAL
          LDA       DRVNLST,X
          ORA       #030
          STA       DRVNVAL
          JSR       PRTDNAME
          LDX       #SLOTPOS
          JSR       PRTMSG
          LDX       DRVPOS

          INX
          CPX       NUMDNAME
          BCC       $1
          LDX       #MSGWIND
          JSR       PRTMSG
          LDX       #ESC2
          JSR       PRTMSG
          LDX       #DLEADER
          LDA       MSGLEN,X
          STA       PRTLEN1
          TXA
          ASL       A
          TAX
          LDA       MSGADR,X
          STA       INDEX
          LDA       MSGADR+1,X
          STA       INDEX+1
          LDX       CURDRIVE
          JMP       SMENUHL

                    ;Select drive menu
SMENUSTD  STX       CURDRIVE
          JSR       PRTMSG2
          JSR       PRTDNAM2
SMENUHL   STX       DRVPOS
          LDA       #012
          STA       DRVPOS+1
          JSR       PRTMSG2
          JSR       PRTDNAME
          LDA       #011
          STA       DRVPOS+1
          JSR       PRTBYTE
$1        BRK
          .BYTE     0CA
          .WORD     READCON
          JSR       ERRORCK
          LDA       INPUT
          CMP       #UPARROW
          BEQ       UP1
          CMP       #DNARROW
          BEQ       DN1
          CMP       #RETURN
          BEQ       CRET1
          CMP       #ESCAPE
          BEQ       GOBACK1
          BNE       $1
CRET1     JSR       GETDDATA
          JSR       GETPTBL
          LDX       #CLRPMPT
          JSR       PRTMSG
          LDX       #CLRVPORT
          JMP       PRTMSG

;CFutil3
                    ;Up arrow for select drive menu
UP1       LDX       CURDRIVE
          DEX
          BPL       SMENUSTD
          LDX       NUMDNAME
          DEX
          JMP       SMENUSTD

                    ;Down arrow for select drive menu
DN1       LDX       CURDRIVE
          INX
          CPX       NUMDNAME
          BCC       SMENUSTD
          LDX       #000
          JMP       SMENUSTD

GOBACK1   LDA       ZPGTEMP0
          STA       CURDRIVE
          JMP       MAINMENU

                    ;Get list of CF/Ide drivers online
GETDNAME  LDX       #000
          STX       NUMDNAME
GETDINFO  STX       DNUM
          STX       SDNUM1
          LDA       NUMDNAME
          ASL       A
          ASL       A
          ASL       A
          ASL       A
          ADC       #080
          STA       DNAMEPTR
          BRK
          .BYTE     085
          .WORD     DINFO
          BNE       NextDev

          LDY       #001
$1        LDA       DEVTYPE,Y
          CMP       DEV_ID,Y
          BNE       NEXTDEV
          LDA       MANUFID,Y
          CMP       DEV_ID+2,Y
          BNE       NEXTDEV
          DEY
          BPL       $1

          BRK
          .BYTE     082
          .WORD     DevStat0
          BNE       NextDev
          LDX       NUMDNAME
          BPL       IncDevCt    ;Branch always taken

CkNxtDev  LDA       SLOTLST,X
          CMP       SLOTNUM
          BNE       IncDevCt
          LDA       DRVNLST,X
          CMP       DRIVNUM
          BNE       IncDevCt
          LDA       UNITNUM
          CMP       UNUMLST,X
          BCS       NextDev
          STA       UNUMLST,X
          TXA
          ASL       A
          ASL       A
          ASL       A
          ASL       A
          ADC       #080
          STA       DNAMEPTR
          BRK
          .BYTE     085
          .WORD     DINFO
NextDev   LDX       DNUM
          CPX       #018
          BCS       DONE
          INX
          JMP       GETDINFO
IncDevCt  DEX
          BPL       CkNxtDev

          LDX       NUMDNAME
          LDA       DNUM
          STA       DNUMLST,X
          STA       SDNUM2
          LDA       SLOTNUM
          STA       SLOTLST,X
          LDA       UNITNUM
          STA       UNUMLST,X
          LDA       DRIVNUM
          STA       DRVNLST,X

          TXA
          ASL       A
          CLC                   ;Get the device identification data for this device
          ADC       IBuffHB
          STA       DevIDpg0+1
          BRK
          .BYTE     082
          .WORD     DevIdent
          BNE       NextDev
          INC       NUMDNAME
          CPX       #007
          BCC       NextDev
DONE      LDX       NUMDNAME        ;CURDRIVE Values
          CPX       #002            ;highbit off: current drive valid
          BCC       $1              ;highbit set: current drive not selected
          LDX       #081            ;CURDRIVE=$FF: no drives present
$1        DEX       ;CURDRIVE=$80: drive not selected
          STX       CURDRIVE
          BEQ       $2
          RTS
$2        JSR       GETDDATA
          JMP       GETPTBL         ;Only 1 drive so get its data

                    ;Allocate memory and setup pointers
                    ;Extended Memory Map - $0607 bytes long

                    ;$0000    STATBUF1  .BLOCK    05B,000
                    ;$005B    STATBUF2  .BLOCK    05B,000
                    ;$00B6    SCRBUF    .BLOCK    01CA,000
                    ;$0280    DNAMEPTR  .BLOCK    080,000
                    ;            Device $0 thru $7  $010 bytes each

                    ;$0300    PARTTBL   .BLOCK    0100,000

                    ;Device Indentification Block for up to 8 devices online
                    ;$0400    DevIDpg0  .BLOCK    0200,000
                    ;$0600    DevIDpg1  .BLOCK    0200,000
                    ;$0800    DevIDpg2  .BLOCK    0200,000
                    ;$0A00    DevIDpg3  .BLOCK    0200,000
                    ;$0C00    DevIDpg4  .BLOCK    0200,000
                    ;$0E00    DevIDpg5  .BLOCK    0200,000
                    ;$1000    DevIDpg6  .BLOCK    0200,000
                    ;$1200    DevIDpg7  .BLOCK    0200,000

                    ;Call Block Organization:
                    ;$1400    ATA Command Code  .BYTE     000
                    ;         Sector HB         .BYTE     000
                    ;         Sector MB         .BYTE     000
                    ;         Sector LB         .BYTE     000
                    ;         # of sectors      .BYTE     000
                    ;         Bytes returned    .WORD     000
                    ;$1407    BUFFPG0   .BLOCK    0100,000
                    ;$1507    BUFFPG1   .BLOCK    0100,000

ALLOCMEM  LDA       #000
          TAY
$1        STA       EXTPG-1,Y       ;Initalize extended address page
          INY
          BNE       $1
          BRK
          .BYTE     041
          .WORD     FINDSEG
          JSR       FATALERR
          LDA       BASE
          BEQ       $2
          CMP       #00F
          BCC       $3
$2        LDA       #08F
          STA       BASE            ;Extended address bank
          JMP       $6
$3        ORA       #080
          STA       BASE            ;Extended address bank
          LDA       BASE+1
          SBC       #020
          CMP       #082
          BCC       $4
          SBC       #080
          INC       BASE
          JMP       $5
$4        CMP       #002
          BCS       $5
          ADC       #080
          DEC       BASE
$5        STA       BASE+1
$6        LDA       BASE+1
          STA       STATBUF1+1
          STA       STATBUF2+1
          STA       SCRBUF+1
          CLC
          ADC       #002
          STA       DNAMEPTR+1
          ADC       #001
          STA       PARTTBL+1
          ADC       #001
          STA       IbuffHB     ;Address page for DevIDpg0
          ADC       #010
          STA       BUFFPG0+1
          STA       BUFFCALL+1
          ADC       #001
          STA       BUFFPG1+1

          LDA       BASE
          STA       BUFFPG0+EXTPG
          STA       BUFFPG1+EXTPG
          STA       BUFFCALL+EXTPG
          STA       STATBUF1+EXTPG
          STA       STATBUF2+EXTPG
          STA       SCRBUF+EXTPG
          STA       DNAMEPTR+EXTPG
          STA       PARTTBL+EXTPG
          STA       DevIDpg0+EXTPG

                    ;Insert additional extended bank locations above here

          LDA       #000
          STA       BUFFCALL
          STA       PARTTBL
          STA       STATBUF1
          STA       DevIDpg0
          LDA       #007
          STA       BUFFPG0
          STA       BUFFPG1
          LDA       #05B
          STA       STATBUF2
          LDA       #0B6
          STA       SCRBUF
          LDA       #080
          STA       DNAMEPTR

                    ;Insert additional address lsb above here.
          LDA       BANKREG
          STA       EVHDLRXB
          RTS

                    ;Partition Drive Routines
PARTITIO  LDX       #CMDLINE
          JSR       PRTMSG
          LDX       #PARTCMD
          JSR       PRTMSG
          JSR       DISPDRV
          LDX       #CLRVPORT
          JSR       PRTMSG
          LDX       #PARTHDR
          JSR       PRTMSG
          LDX       #TCapBlks
          JSR       PRTMSG
          LDX       #PTMENU1
          JSR       PRTMSG
          LDX       #PTMENU2
          JSR       PRTMSG
          JSR       DISPLYPT
          JSR       EDITPART
          JMP       MAINMENU

                    ;Subroutine to get start block & partition size from partition table
                    ;         @Entry, PartNum = partition number
CONVTRK   LDX       PartNum
          LDA       BegBlkLB,X
          STA       PRODUCT
          LDA       BegBlkMB,X
          STA       PRODUCT+1
          LDA       BegBlkHB,X
          STA       PRODUCT+2
          TXA
          ASL       A
          TAX
          LDA       TRKADR,X
          STA       INDEX
          LDA       TRKADR+1,X
          STA       INDEX+1
          JSR       DECIMAL7
          JMP       PRTTRK

CONVSIZE  LDX       PartNum
          LDA       P0sizeLB,X
          STA       PRODUCT
          LDA       P0sizeHB,X
          STA       PRODUCT+1
          TXA
          ASL       A
          TAX
          LDA       BLENADR,X
          STA       INDEX
          LDA       BLENADR+1,X
          STA       INDEX+1
          JSR       DECIMAL5
          JMP       PRTSIZE

                    ;Subroutine to display partition info
DISPLYPT  JSR       GTRKPLEN
          JSR       PTDATES
          LDX       #000
          STX       PartNum
$1        LDA       BegBlkLB,X
          CMP       #0FF
          BNE       $2
          CMP       BegBlkMB,X
          BNE       $2
          CMP       BegBlkHB,X
          BNE       $2
          LDA       #000
          STA       P0sizeLB,X
          STA       P0sizeHB,X
          CLC
          LDA       BegBlkLB-1,X
          ADC       P0sizeLB-1,X
          STA       BegBlkLB,X
          LDA       BegBlkMB-1,X
          ADC       P0sizeHB-1,X
          STA       BegBlkMB,X
          LDA       BegBlkHB-1,X
          ADC       #000
          STA       BegBlkHB,X
$2        JSR       CONVSIZE
          JSR       CONVTRK
          JSR       GETVNAME
          INC       PartNum
          LDX       PartNum
          CPX       #008
          BCC       $1

CREMCAP   JSR       COMPEND
          LDA       #000
          STA       PRODUCT
          STA       PRODUCT+1
          STA       PRODUCT+2
          LDX       #007
CKPTX     LDA       P0sizeLB,X
          ORA       P0sizeHB,X
          BEQ       NEXTPT
          JSR       INITPTCK
          STX       ZPGTEMP0
          LDY       #007
CKPTY     CPY       ZPGTEMP0
          BEQ       NXTY
          LDA       P0sizeLB,Y
          ORA       P0sizeHB,Y
          BEQ       NXTY
          JSR       CMPENDS
          BCS       $1
          JSR       CMPBEGS
          BCS       NEXTPT
          CPY       ZPGTEMP0
          BCS       NXTY
          JSR       BEG_ENDS
          BCS       NXTY
          LDA       BegBlkMB,Y
          STA       ENDTRK+1
          LDA       BegBlkLB,Y
          STA       ENDTRK
          JMP       NXTY
$1        CPY       ZPGTEMP0
          BCS       NXTY
          JSR       CMPBEGS
          BCC       NXTY
          JSR       ENDS_BEG
          BCS       NXTY
          LDA       EndBlkHB,Y
          STA       BEGTRK+2
          LDA       EndBlkMB,Y
          STA       BEGTRK+1
          LDA       EndBlkLB,Y
          STA       BEGTRK
NXTY      DEY
          BPL       CKPTY
          JSR       CMPDIFF
NEXTPT    DEX
          BPL       CKPTX

          CLC       ;routine to compute remaining capacity
          LDA       TOTSECT
          SBC       PRODUCT
          STA       PRODUCT
          LDA       TOTSECT+1
          SBC       PRODUCT+1
          STA       PRODUCT+1
          LDA       TOTSECT+2
          SBC       PRODUCT+2
          STA       PRODUCT+2
          LDA       PTLRADR
          STA       INDEX
          LDA       PTLRADR+1
          STA       INDEX+1
          JSR       DECIMAL7
          CLC
          ADC       #003
          LDX       #RBLKS
          JSR       PRTMSG1
          LDX       #BLOCKS
          JMP       PRTMSG

INITPTCK  LDA       BegBlkLB,X    ;Xreg = partition number
          STA       BEGTRK
          LDA       BegBlkMB,X
          STA       BEGTRK+1
          LDA       BegBlkHB,X
          STA       BEGTRK+2
          LDA       EndBlkLB,X
          STA       ENDTRK
          LDA       EndBlkMB,X
          STA       ENDTRK+1
          LDA       EndBlkHB,X
          STA       ENDTRK+2
          RTS

CMPENDS   LDA       ENDTRK+2     ;Yreg = partition number
          CMP       EndBlkHB,Y
          BCC       $1
          BNE       $1
          LDA       ENDTRK+1     ;Yreg = partition number
          CMP       EndBlkMB,Y
          BCC       $1
          BNE       $1
          LDA       ENDTRK
          CMP       EndBlkLB,Y
$1        RTS

CMPBEGS   LDA       BEGTRK+2     ;Yreg = partition number
          CMP       BegBlkHB,Y
          BCC       $1
          BNE       $1
          LDA       BEGTRK+1     ;Yreg = partition number
          CMP       BegBlkMB,Y
          BCC       $1
          BNE       $1
          LDA       BEGTRK
          CMP       BegBlkLB,Y
$1        RTS

BEG_ENDS  LDA       BegBlkHB,Y
          CMP       ENDTRK+2
          BCC       $1
          BNE       $1
          LDA       BegBlkMB,Y
          CMP       ENDTRK+1
          BCC       $1
          BNE       $1
          LDA       BegBlkLB,Y
          CMP       ENDTRK
$1        RTS

ENDS_BEG  LDA       BEGTRK+2
          CMP       EndBlkHB,Y
          BCC       $1
          BNE       $1
          LDA       BEGTRK+1
          CMP       EndBlkMB,Y
          BCC       $1
          BNE       $1
          LDA       BEGTRK
          CMP       EndBlkLB,Y
$1        RTS

CMPDIFF   SEC
          LDA       ENDTRK
          SBC       BEGTRK
          STA       TEMPVAL
          LDA       ENDTRK+1
          SBC       BEGTRK+1
          STA       TEMPVAL1
          LDA       ENDTRK+2
          SBC       BEGTRK+2
          STA       TEMPVAL2
          CLC
          LDA       PRODUCT
          ADC       TEMPVAL
          STA       PRODUCT
          LDA       PRODUCT+1
          ADC       TEMPVAL1
          STA       PRODUCT+1
          LDA       PRODUCT+2
          ADC       TEMPVAL2
          STA       PRODUCT+2
          RTS

                    ;Subroutine to get partition info from table
GTRKPLEN  LDX       #007
$1        LDY       STBindex,X
          LDA       @PARTTBL,Y
          STA       BegBlkLB,X
          INY
          LDA       @PARTTBL,Y
          STA       BegBlkMB,X
          INY
          LDA       @PARTTBL,Y
          STA       BegBlkHB,X
          LDY       VSZindex,X
          LDA       @PARTTBL,Y
          STA       P0sizeLB,X
          INY
          LDA       @PARTTBL,Y
          STA       P0sizeHB,X
          JSR       VALIDPT
          DEX
          BPL       $1
          RTS

                    ;Subroutine to print partition values
PRTVOL    LDA       #020
          LDY       #012
          BNE       PRTSTUF1
PRTSIZE   LDA       #010
          LDY       #008
          BNE       PRTSTUF1
PRTTRK    LDA       #000
          LDY       #00A
PRTSTUF1  CLC
          ADC       PartNum
          ADC       PartNum
          TAX
PRTSTUF2  LDA       PMSGADR,X
          STA       INDEX
          LDA       PMSGADR+1,X
          STA       INDEX+1
          STY       PRTLEN1
          LDA       @INDEX,Y
          CLC
          ADC       #003
          TAY
          LDA       #SPACE
          BNE       $2
$1        STA       @INDEX,Y
          INY
$2        CPY       PRTLEN1
          BCC       $1
          JMP       PRTMSG2

VOLABEL   LDX       PartNum
          LDY       #Num_Blks
          LDA       #001         ;read 1 block
          STA       @BUFFCALL,Y
          DEY
          CLC
          LDA       BegBlkLB,X
          ADC       #002         ;1st block of volume directory
          STA       @BUFFCALL,Y
          DEY
          LDA       BegBlkMB,X
          ADC       #000
          STA       @BUFFCALL,Y
          DEY
          LDA       BegBlkHB,X
          ADC       #000
          STA       @BUFFCALL,Y
          LDY       #ATA_Cmd
          LDA       #ATACRead
          STA       @BUFFCALL,Y
          JSR       CALLDRVR
          JMP       ErrHndlr

                    ;Subroutine to get volume name
GETVNAME  LDX       PartNum
          TXA
          ASL       A
          TAY
          LDA       #000
          STA       EXISTVOL,X
          LDA       VOLADR,Y
          STA       INDEX
          LDA       VOLADR+1,Y
          STA       INDEX+1
          LDA       P0sizeLB,X
          ORA       P0sizeHB,X
          BNE       $1
          JMP       NOVOLUME
$1        JSR       VOLABEL
          LDY       #000
          TYA
$2        ORA       @BUFFPG0,Y
          INY
          CPY       #004
          BCC       $2
          CMP       #003
          BNE       NOVOLUME
          LDA       @BUFFPG0,Y
          CMP       #0F1
          BCC       NOVOLUME
          AND       #00F
          LDY       #014
          STA       @INDEX,Y
          CLC
          ADC       #004
          TAY
$3        LDA       @BUFFPG0,Y

          CMP       #02E
          BEQ       $4
          CMP       #030
          BCC       NOVOLUME
          CMP       #07B
          BCS       NOVOLUME
          CMP       #03A
          BCC       $4
          CMP       #041
          BCC       NOVOLUME
          CMP       #05B
          BCC       $4
          CMP       #061
          BCC       NOVOLUME

$4        STA       @INDEX,Y
          DEY
          CPY       #005
          BCS       $3
          JMP       PRTVOL

NOVOLUME  LDY       #014
          LDA       #UFTXTLEN
          STA       @INDEX,Y
          CLC
          ADC       #005
          TAY
          DEY
$1        LDA       UNFMTTXT-5,Y
          STA       @INDEX,Y
          DEY
          CPY       #005
          BCS       $1
          LDY       PartNum
          LDA       #080
          STA       EXISTVOL,Y
          JMP       PRTVOL

                    ;Subroutine - Partition Editor
                    ;PartNum=current partition number $0 to $7
                    ;CurVcol=current vertical column in table TRK0($0), BLEN0($1),
                    ;or VOL0 ($2)
EDITPART  LDA       #080
          STA       LOCSTAT
          LDA       #000
          STA       CurVcol
NEXTPART  STA       PartNum
          CLC
          ADC       #008        ;initial vertical position in window
          STA       SCRHPVP+1   ;vertical position in window
RETRY3    BIT       LOCSTAT
          BPL       $1
          LDX       #PROMPT0
          JSR       PRTMSG
          LDX       #FESC6
          JSR       PRTMSG
          LDX       #MSGWIND
          JSR       PRTMSG
          LDX       #ESC6
          JSR       PRTMSG
          LDX       #VIEWPORT
          JSR       PRTMSG
$1        LDA       #000
          STA       POSITION
          STA       LOCSTAT
REPOS3    LDX       CurVcol
          LDA       COL_HPOS,X
          CLC
          ADC       POSITION
          STA       SCRHPVP   ;horizontal position in window
          LDX       #CURSER
          JSR       PRTMSG
GETCHR3A  LDA       curVcol
          ASL       A
          ASL       A
          ASL       A
          ORA       PartNum
          ASL       A
          TAX
          LDA       TRKADR,X
          STA       INDEX
          LDA       TRKADR+1,X
          STA       INDEX+1
GETCHR3   BRK
          .BYTE     0CA
          .WORD     READCON
          JSR       ERRORCK
          LDA       INPUT
          BPL       CKDN
          BIT       LOCSTAT
          BMI       GETCHR3
          AND       #0DF
          CMP       #OAPPLE_S
          BNE       $2
          JSR       COMPEND
          JSR       CKPTLAPS
          BCS       $1
          LDX       #VIEWPORT
          JSR       PRTMSG
          LDA       PartNum
          JMP       NEXTPART
$1        LDX       #PROMPT0
          JSR       PRTMSG
          JSR       SAVEPTBL
          JMP       EDITPART
$2        CMP       #OAPPLE_F
          BNE       GETCHR3
          JSR       HLFMT
          LDA       #080
          STA       LOCSTAT
          JMP       RETRY3

CKDN      CMP       #DNARROW
          BNE       CKRT
          JSR       SAVEPART
          BCC       $1
          JMP       RETRY3
$1        LDX       PartNum
          INX
          TXA
          AND       #007
$2        JMP       NEXTPART

CKRT      CMP       #RTARROW
          BNE       CKLF
          LDX       CurVcol
          LDY       ITEM_LEN,X
          LDA       POSITION
          CMP       @INDEX,Y
          BCS       $2
          INC       POSITION
          LDA       #009
          JSR       PRTBYTE
$2        JMP       GETCHR3

CKLF      CMP       #LFARROW
          BNE       CKUP
          LDA       POSITION
          BEQ       $1
          DEC       POSITION
          LDA       #008
          JSR       PRTBYTE
$1        JMP       GETCHR3

CKUP      CMP       #UPARROW
          BNE       CKRET
          JSR       SAVEPART
          BCC       $1
          JMP       RETRY3
$1        LDX       PartNum
          DEX
          TXA
          AND       #007
          JMP       NEXTPART

CKRET     CMP       #RETURN
          BNE       CKTAB
          JSR       SAVEPART
          BCC       IncColmn
          JMP       RETRY3
IncColmn  LDY       CurVcol
          INY
          CPY       #003
          BCC       $1
          LDY       #000
$1        STY       CurVcol
          LDA       PartNum
          JMP       NEXTPART

CKTAB     CMP       #TAB
          BNE       CKSPC
TAB3      JSR       SAVEPART
          BCC       IncColmn
          JMP       RETRY3

CKSPC     CMP       #SPACE
          BNE       CKASCI
          JSR       FILLSPC
          JMP       REPOS3

CKASCI    CMP       #ESCAPE
          BEQ       CKESC
          LDX       CurVcol
          CPX       #VOL0
          BCC       $2
          CMP       #02E
          BEQ       $3
          CMP       #041
          BCC       $1
          CMP       #05B
          BCC       $3
          CMP       #061
          BCC       $1
          CMP       #07B
          BCS       $4
          AND       #0DF       ;Convert to uppercase
          BCC       $3
$1        LDY       POSITION
          BEQ       $4
$2        CMP       #030
          BCC       $4
          CMP       #03A
          BCS       $4
$3        LDY       POSITION
          CPX       #VOL0
          BNE       $5
          CPY       #00F
          BCC       $7
$4        JMP       GETCHR3
$5        CPX       #BLEN0
          BNE       $6
          CPY       #005
          BCC       $7
          BCS       $4
$6        CPY       #007
          BCS       $4
$7        STA       @INDEX,Y
          JSR       PRTBYTE
          INC       POSITION
          LDA       POSITION
          LDY       ITEM_LEN,X
          CMP       @INDEX,Y
          BCC       $8
          STA       @INDEX,Y
$8        BIT       LOCSTAT
          BMI       $4
          LDX       #CLRPMPT
          JSR       PRTMSG
          LDX       #MSGWIND
          JSR       PRTMSG
          LDX       #ESC6A
          JSR       PRTMSG
          LDA       #005
          JSR       PRTBYTE
          LDA       #080
          STA       LOCSTAT
          JMP       GETCHR3A

CKESC     BIT       LOCSTAT
          BPL       ESCRETN
          LDA       #006
          JSR       PRTBYTE
          LDX       CurVcol
          BEQ       $1        ;TRK0
          CPX       #VOL0
          BNE       $2
          JSR       GETVNAME
          JMP       RETRY3
$1        JSR       CONVTRK
          JMP       RETRY3
$2        JSR       CONVSIZE
          JMP       RETRY3

ESCRETN   LDX       #CLRMSGW
          JSR       PRTMSG
          LDX       #CLRPMPT
          JSR       PRTMSG

          JSR       COMPEND
          JSR       CKPTLAPS
          BCS       $1
          LDX       #VIEWPORT
          JSR       PRTMSG
          LDA       PartNum
          JMP       NEXTPART

$1        LDX       #MSGWIND
          JSR       PRTMSG
          LDY       #0FE
          LDX       #000
$2        LDA       PTVALID,X
          BEQ       $3
          TXA
          ORA       #030
          INY
          INY
          STA       PPTNUM,Y
          INY
$3        INX
          CPX       #008
          BCC       $2
          TYA
          BPL       $4
          RTS
$4        LDX       #PTWARN1
          CLC
          ADC       MSGLEN,X
          JSR       PRTMSG1
          LDX       #PTWARN2
          JSR       PRTMSG
PtChange  LDX       #PROMPT0
          JSR       PRTMSG
          LDX       #PTBLMSG
          JSR       PRTMSG
          JSR       QUERY_YN
          BCC       SAVEPTBL
          RTS
SAVEPTBL  LDX       #007
$1        LDA       PTVALID,X
          BEQ       $3
          STX       PartNum
          JSR       XFERPART
          LDA       EXISTVOL,X
          BPL       $3
          JSR       VOLABEL        ;Get root directory block
          LDA       #ATACWrit
          STA       @BUFFCALL,Y
          LDY       #004
          LDA       #000
$2        STA       @BUFFPG0,Y     ;Invalidate current directory
          DEY
          BPL       $2
          JSR       CALLDRVR
          JSR       ErrHndlr
          LDX       PartNum
$3        DEX
          BPL       $1
          JMP       UDATDRV

BEGPARTN  LDA       PartNum
          STA       ZPGTEMP1
          JMP       $2
$1        LDA       P0sizeLB,X   ;Xreg = partition number
          ORA       P0sizeHB,X
          BNE       $2
          CLC
          LDA       BegBlkLB-1,X
          ADC       P0sizeLB-1,X
          STA       BegBlkLB,X
          LDA       BegBlkMB-1,X
          ADC       P0sizeHB-1,X
          STA       BegBlkMB,X
          LDA       BegBlkHB-1,X
          ADC       #000
          STA       BegBlkHB,X
          JSR       CONVSIZE
          JSR       CONVTRK
          JSR       GETVNAME
$2        INC       PartNum
          LDX       PartNum
          CPX       #008
          BCC       $1
          LDA       ZPGTEMP1
          STA       PartNum
          RTS

FILLSPC   LDX       CurVcol
          LDY       ITEM_LEN,X
$1        STY       ZPGTEMP0
          LDA       POSITION
          STA       @INDEX,Y
          TAY
          LDA       #006
          JSR       PRTBYTE
$2        LDA       #SPACE
          JSR       PRTBYTE
          INY
          CPY       ZPGTEMP0
          BCC       $2
          BIT       LOCSTAT
          BMI       $3
          LDX       #MSGWIND
          JSR       PRTMSG
          LDX       #ESC6A
          JSR       PRTMSG
          LDA       #080
          STA       LOCSTAT
$3        RTS

CKPTLAPS  LDX       #000
CKPT1     TXA
          TAY
          INY
CKPT2     LDA       P0sizeLB,Y
          ORA       P0sizeHB,Y
          BEQ       NEXTY
          LDA       BegBlkHB,X
          CMP       EndBlkHB,Y
          BCC       $1
          BNE       NEXTY
          LDA       BegBlkMB,X
          CMP       EndBlkMB,Y
          BCC       $1
          BNE       NEXTY
          LDA       BegBlkLB,X
          CMP       EndBlkLB,Y
          BCS       NEXTY
$1        LDA       BegBlkHB,X
          CMP       BegBlkHB,Y
          BCC       $2
          BNE       ERRORPT
          LDA       BegBlkMB,X
          CMP       BegBlkMB,Y
          BCC       $2
          BNE       ERRORPT
          LDA       BegBlkLB,Y
          CMP       BegBlkLB,X
          BCC       ERRORPT
$2        LDA       EndBlkHB,X
          CMP       BegBlkHB,Y
          BCC       NEXTY
          BNE       ERRORPT
          LDA       EndBlkMB,X
          CMP       BegBlkMB,Y
          BCC       NEXTY
          BNE       ERRORPT
          LDA       BegBlkLB,Y
          CMP       EndBlkLB,X
          BCS       NEXTY
NoEdit    LDX       #CLRMSGW
          JSR       PRTMSG
          LDX       PartNum
NEXTY     INY
          CPY       #008
          BCC       CKPT2
          INX
          CPX       #007
          BCC       CKPT1
          RTS

ERRORPT   TXA
          ORA       #030
          STA       PTCNFLT1
          TYA
          ORA       #030
          STA       PTCNFLT2
          STX       PartNum
          LDX       #MSGWIND
          JSR       PRTMSG
          LDX       #PTOVLAP
          JSR       PRTMSG
          LDX       #PROMPT0
          JSR       PRTMSG
          LDX       #RE_EDIT
          JSR       PRTMSG
          JSR       QUERY_YN
          BCS       NoEdit
          LDA       #000
          STA       CurVcol
          RTS

COMPEND   LDX       #007
$1        CLC
          LDA       P0sizeLB,X
          ADC       BegBlkLB,X
          STA       EndBlkLB,X
          LDA       P0sizeHB,X
          ADC       BegBlkMB,X
          STA       EndBlkMB,X
          LDA       #000
          ADC       BegBlkHB,X
          STA       EndBlkHB,X
          DEX
          BPL       $1
          RTS

RESETPT   LDA       #000
          STA       TEMPVAL
          STA       TEMPVAL1
          LDX       PartNum
          JMP       NEWSIZE

SAVEPART  CLC
          BIT       LOCSTAT
          BMI       $1
          RTS
$1        LDA       #006
          JSR       PRTBYTE
          LDX       CurVcol
          BEQ       CkTrk    ;TRK0
          CPX       #BLEN0
          BEQ       CKPTSIZE
          JMP       HLFMT

;CFutil4
CKPTSIZE  JSR       BINARY
          LDA       TEMPVAL2
          BEQ       $1
          LDX       #PROMPT0
          JSR       PRTMSG
          LDX       #OUTRANG1
          JSR       PRTMSG
          JSR       G_ANYKEY
          JSR       CONVSIZE
          SEC
          RTS
$1        ORA       TEMPVAL1
          ORA       TEMPVAL
          BNE       $2
          LDY       #005
          LDA       #001
          STA       @INDEX,Y
          LDY       #000
          LDA       #030
          STA       @INDEX,Y
          JSR       PRTBYTE
$2        JMP       CkSize

G_ANYKEY  LDX       #MSGWIND
          JSR       PRTMSG
          LDX       #ESC1B
          JSR       PRTMSG
          BRK
          .BYTE     0CA
          .WORD     READCON
          RTS

CkTrk     JSR       BINARY
          BEQ       RESETPT
          LDA       TEMPVAL
          ORA       TEMPVAL1
          ORA       TEMPVAL2
          BNE       $1
          LDY       #007
          LDA       #001
          STA       TEMPVAL
          STA       @INDEX,Y
          LDY       #000
          LDA       #031
          STA       @INDEX,Y
          JSR       PRTTRK

$1        LDA       TEMPVAL2        ;Check beginning track limits
          CMP       TOTSECT+2
          BCC       CkLimits
          BNE       $2
          LDA       TEMPVAL1
          CMP       TOTSECT+1
          BCC       CkLimits
          BNE       $2
          LDA       TEMPVAL
          CMP       TOTSECT
          BCC       CkLimits
$2        LDX       #PROMPT0
          JSR       PRTMSG
          LDX       #MAXBLOCK
          JSR       PRTMSG
          JSR       G_ANYKEY
          JSR       CONVTRK
          SEC
          RTS

CkLimits  LDX       PartNum   ;transfer start block to table
          LDA       TEMPVAL2
          CMP       BegBlkHB,X  ;check if track value was changed
          BNE       $1
          LDA       TEMPVAL1
          CMP       BegBlkMB,X
          BNE       $1
          LDA       TEMPVAL
          CMP       BegBlkLB,X
          BEQ       $2
$1        LDA       #080      ;Invalidate partition status
          STA       PTVALID,X
          LDA       TEMPVAL2
          STA       BegBlkHB,X
          LDA       TEMPVAL1
          STA       BegBlkMB,X
          LDA       TEMPVAL
          STA       BegBlkLB,X
$2        LDA       P0sizeLB,X  ;transfer partition size to temporary
          STA       TEMPVAL
          LDA       P0sizeHB,X
          STA       TEMPVAL1

CkSize    LDX       PartNum        ;Check partition size limits
          SEC
          LDA       TEMPVAL
          ADC       BegBlkLB,X
          STA       TEMPVAL2
          LDA       TEMPVAL1
          ADC       BegBlkMB,X
          STA       TEMPVAL3
          LDA       #000
          ADC       BegBlkHB,X
          CMP       TOTSECT+2
          BCC       STORSIZE
          BNE       $2
          LDA       TEMPVAL3
          CMP       TOTSECT+1
          BCC       STORSIZE
          BNE       $2
          LDA       TEMPVAL2
          CMP       TOTSECT
          BCC       STORSIZE
          BEQ       STORSIZE
$2        LDA       TOTSECT
          SBC       BegBlkLB,X
          STA       TEMPVAL
          LDA       TOTSECT+1
          SBC       BegBlkMB,X
          STA       TEMPVAL1

STORSIZE  LDA       TEMPVAL1    ;check if partition size has changed
          CMP       P0sizeHB,X
          BNE       NEWSIZE
          LDA       TEMPVAL
          CMP       P0sizeLB,X
          BEQ       REFRESH
NEWSIZE   LDA       #080      ;Invalidate partition status
          STA       PTVALID,X
          LDA       TEMPVAL1
          STA       P0sizeHB,X
          LDA       TEMPVAL
          STA       P0sizeLB,X
REFRESH   lda       PTVALID,X
          bpl       $1
          LDA       EXISTVOL,X
          bmi       $1
          txa
          ASL       A
          TAY
          LDA       VOLADR,Y
          STA       INDEX
          LDA       VOLADR+1,Y
          STA       INDEX+1
          JSR       NOVOLUME
$1        JSR       CONVSIZE
          JSR       BEGPARTN
          LDX       #CLRPMPT
          JSR       PRTMSG
          JMP       CREMCAP

                    ;Subroutine - High level format routine
HLFMT     LDX       #PROMPT0
          JSR       PRTMSG
          LDX       #CLRMSGW
          JSR       PRTMSG
          LDX       PartNum
          LDA       EXISTVOL,X
          BMI       CkVname
          JSR       VOLABEL
          LDY       #000
          TYA
$1        ORA       @BUFFPG0,Y
          INY
          CPY       #004
          BCC       $1
          CMP       #003
          BNE       CkVname
          LDA       @BUFFPG0,Y
          CMP       #0F1
          BCC       CkVname
          AND       #00F
          STA       ZPGTEMP0
          LDX       #MSGWIND
          JSR       PRTMSG
          LDX       #ERASMSG1
          LDA       MSGLEN,X
          CLC
          ADC       ZPGTEMP0
          PHA
          LDA       ZPGTEMP0
          CLC
          ADC       #004
          TAY
$2        LDA       @BUFFPG0,Y
          STA       PNAME2-5,Y
          DEY
          CPY       #005
          BCS       $2
          PLA
          JSR       PRTMSG1
          LDX       #ERASMSG2
          JSR       PRTMSG

CkVname   LDA       PartNum
          ASL       A
          TAX
          LDA       PNAMEADR,X
          STA       INDEX
          LDA       PNAMEADR+1,X
          STA       INDEX+1
          LDY       #00F
          LDA       @INDEX,Y
          BNE       NewVname

          LDA       #BLTXTLEN
          STA       @INDEX,Y
          TAY
          DEY
          LDA       PartNum
          ORA       #030
          STA       @INDEX,Y
          DEY
$1        LDA       BLANK01,Y
          STA       @INDEX,Y
          DEY
          BPL       $1
          LDX       #VIEWPORT
          JSR       PRTMSG
          JSR       PRTVOL
          JMP       CkVname

NewVname  TAY
          CLC
          LDX       #HFMT0MSG
          ADC       MSGLEN,X
          STA       ZPGTEMP0
          DEY
$1        LDA       @INDEX,Y
          STA       PNAME1,Y
          DEY
          BPL       $1
          LDX       #PROMPT0
          JSR       PRTMSG
          LDX       #HFMT0MSG
          LDA       ZPGTEMP0
          JSR       PRTMSG1
          LDX       #HFMT1MSG
          JSR       PRTMSG
          JSR       QUERY_YN
          BCS       NoHLFmt
          LDX       PartNum
          LDA       PTVALID,X   ;Check for modified partition
          BEQ       InitVol
          LDX       #MSGWIND
          JSR       PRTMSG
          LDX       #PTNUPD
          JSR       PRTMSG
          JSR       PtChange
          LDX       #PROMPT0
          JSR       PRTMSG
          LDX       #CLRMSGW
          JSR       PRTMSG
          LDX       PartNum
          LDA       PTVALID,X
          BEQ       InitVol
NoHLFmt   LDX       #VIEWPORT
          JSR       PRTMSG
          JMP       GETVNAME

InitVol   LDY       #000
          TYA
$1        STA       @BUFFPG0,Y
          STA       @BUFFPG1,Y
          INY
          BNE       $1
          LDA       PartNum
          ASL       A
          TAX
          LDA       VOLADR,X
          STA       INDEX
          LDA       VOLADR+1,X
          STA       INDEX+1
          LDY       #014
          LDA       @INDEX,Y
          PHA
          CLC
          ADC       #004
          TAY
$2        LDA       @INDEX,Y
          STA       @BUFFPG0,Y
          DEY
          CPY       #005
          BCS       $2
          PLA
          ORA       #0F0
          STA       @BUFFPG0,Y
          LDY       #002
          LDA       #003
          STA       @BUFFPG0,Y
          JSR       CNVTDATE
          LDX       #003
          LDY       #01F
$3        LDA       TEMPVAL,X
          STA       @BUFFPG0,Y
          DEY
          DEX
          BPL       $3
          LDY       #022
          LDA       #0C3
          STA       @BUFFPG0,Y
          INY
          LDA       #027
          STA       @BUFFPG0,Y
          INY
          LDA       #00D
          STA       @BUFFPG0,Y
          LDY       #027
          LDA       #006
          STA       @BUFFPG0,Y
          LDX       PartNum
          LDA       P0sizeLB,X
          LDY       #029
          STA       @BUFFPG0,Y
          STA       TEMPVAL
          AND       #007
          STA       TEMPVAL2
          INY
          LDA       P0sizeHB,X
          STA       @BUFFPG0,Y
          AND       #008
          STA       TEMPVAL3
          LDA       P0sizeHB,X
          LDY       #003
$4        LSR       A
          ROR       TEMPVAL
          DEY
          BNE       $4
          CLC
          LDA       P0sizeLB,X
          ADC       #0FF
          LDA       P0sizeHB,X
          ADC       #00F
          ROR       A
          LSR       A
          LSR       A
          LSR       A
          STA       PRODUCT         ;VOLUME SIZE TOO SMALL IF PRODUCT=0

WBLOCK2   LDY       #ATA_Cmd
          LDA       #ATACWrit
          STA       @BUFFCALL,Y
          LDY       #Sect_LB
          CLC
          LDA       BegBlkLB,X
          ADC       #002
          STA       @BUFFCALL,Y
          DEY
          LDA       BegBlkMB,X
          ADC       #000
          STA       @BUFFCALL,Y
          DEY
          LDA       BegBlkHB,X
          ADC       #000
          STA       @BUFFCALL,Y
          LDY       #Num_Blks
          LDA       #001     ;One block at a time
          STA       @BUFFCALL,Y
          JSR       WBLOCK
NDIRBLK   LDA       #000
          LDY       #004
$1        STA       @BUFFPG0,Y
          INY
          BNE       $1
          LDA       #002
          STA       @BUFFPG0,Y
          LDY       #002
          JSR       INCBUFPG
          JSR       WBLOCK
          LDY       #000
          JSR       INCBUFPG
          LDY       #002
          JSR       INCBUFPG
          JSR       WBLOCK
          LDY       #000
          JSR       INCBUFPG
          LDA       #000
          LDY       #002
          STA       @BUFFPG0,Y
          JSR       WBLOCK
BITMAP    LDA       #0FF
          LDY       #000
$1        STA       @BUFFPG0,Y
          STA       @BUFFPG1,Y
          INY
          BNE       $1
          CLC
          LDA       PRODUCT
          ADC       #006
          PHA
$2        PLA
          CMP       #008
          BCC       $3
          SBC       #008
          PHA
          LDA       #008
$3        TAX
          LDA       BITINDEX,X
          STA       @BUFFPG0,Y
          INY
          CPX       #008
          BEQ       $2
          DEC       PRODUCT
          JSR       WBLOCK
LASTBIT   LDA       #0FF
          LDY       #002
$1        STA       @BUFFPG0,Y
          DEY
          BPL      $1
          BMI       $3
$2        JSR       WBLOCK
$3        DEC       PRODUCT
          BNE       $2
          LDX       TEMPVAL2
          LDA       BITINDEX,X
          EOR       #0FF
          LDY       TEMPVAL
          LDX       TEMPVAL3
          BNE       $6
$4        STA       @BUFFPG0,Y
          LDA       #000
          INY
          BNE       $4
$5        STA       @BUFFPG1,Y
          INY
          BNE       $5
          BEQ       $7
$6        STA       @BUFFPG1,Y
          LDA       #000
          INY
          BNE       $6
$7        JSR       WBLOCK
          LDX       PartNum
          LDA       #000
          STA       EXISTVOL,X
          LDX       #PROMPT0
          JSR       PRTMSG
          LDX       #HFMTCMP
          JSR       PRTMSG
          JSR       G_ANYKEY
          LDX       #VIEWPORT
          JMP       PRTMSG

INCBUFPG  CLC
          LDA       @BUFFPG0,Y
          ADC       #001
          STA       @BUFFPG0,Y
          RTS

WBLOCK    JSR       CALLDRVR
          BCC       BUMPSECT
          LDX       #PROMPT0
          JSR       PRTMSG
          LDX       #DIRERR
          JSR       PRTMSG
          JMP       ErrHndlr       ;PAUSE

BUMPSECT  LDY       #Sect_LB
          CLC
          LDA       @BUFFCALL,Y
          ADC       #001     ;One block at a time
          STA       @BUFFCALL,Y
          DEY
$1        LDA       @BUFFCALL,Y
          ADC       #000
          STA       @BUFFCALL,Y
          DEY
          BNE       $1
          RTS

XFERPART  LDX       PartNum
          LDY       STBindex,X
          LDA       P0sizeLB,X
          ORA       P0sizeHB,X
          BNE       $1
          LDA       #0FF
          STA       @PARTTBL,Y
          INY
          STA       @PARTTBL,Y
          INY
          STA       @PARTTBL,Y
          LDY       VSZindex,X
          STA       @PARTTBL,Y
          INY
          STA       @PARTTBL,Y
          JMP       VALIDPT
$1        LDA       BegBlkLB,X
          STA       @PARTTBL,Y
          INY
          LDA       BegBlkMB,X
          STA       @PARTTBL,Y
          INY
          LDA       BegBlkHB,X
          STA       @PARTTBL,Y
          LDY       VSZindex,X
          LDA       P0sizeLB,X
          STA       @PARTTBL,Y
          INY
          LDA       P0sizeHB,X
          STA       @PARTTBL,Y
VALIDPT   LDA       #000
          STA       PTVALID,X
          RTS

                    ;Subroutine to Display Date
PREPDATE  BRK
          .BYTE     063
          .WORD     TIMEDATE
          LDY       #004
          LDA       YEAR,Y
          AND       #001
          STA       MLPLIER
          JSR       MULTx10
          INY
          LDA       YEAR,Y
          AND       #00F
          CLC
          ADC       PRODUCT
          STA       PRODUCT
          ASL       A
          ADC       PRODUCT
          TAX
          LDY       #004
$1        LDA       MMONTHS-3,X
          STA       DATEDISP,Y
          INY
          INX
          CPY       #007
          BCC       $1
          LDA       #SPACE
          STA       DATEDISP,Y
          INY
          LDX       #006
          LDA       YEAR,X
          CMP       #030
          BEQ       $2
          STA       DATEDISP,Y
          INY
$2        INX
          LDA       YEAR,X
          STA       DATEDISP,Y
          INY
          LDA       #02C
          STA       DATEDISP,Y
          INY
          LDA       #SPACE
          STA       DATEDISP,Y
          INY
          LDX       #000
$3        LDA       YEAR,X
          STA       DATEDISP,Y
          INY
          INX
          CPX       #004
          BCC       $3
          LDA       #004
          STA       DATEDISP,Y
          INY
          STY       DATELEN
          RTS

                    ;Convert SOS ascii date to SOS binary packed format
CNVTDATE  BRK
          .BYTE     063
          .WORD     TIMEDATE
          LDY       #002
          LDA       YEAR,Y
          AND       #00F
          STA       MLPLIER
          JSR       MULTx10
          INY
          LDA       YEAR,Y
          AND       #00F
          ADC       PRODUCT
          STA       TEMPVAL1
          INY
          LDA       YEAR,Y
          AND       #00F
          STA       MLPLIER
          JSR       MULTIPLY
          INY
          LDA       YEAR,Y
          AND       #00F
          ADC       PRODUCT
          ASL       A
          ASL       A
          ASL       A
          ASL       A
          ASL       A
          STA       TEMPVAL
          ROL       TEMPVAL1
          INY
          LDA       YEAR,Y
          AND       #00F
          STA       MLPLIER
          JSR       MULTIPLY
          INY
          LDA       YEAR,Y
          AND       #00F
          ADC       PRODUCT
          AND       #01F
          ORA       TEMPVAL
          STA       TEMPVAL

                    ;Convert SOS ascii time to SOS binary packed format
          LDY       #009
          LDA       YEAR,Y
          AND       #00F
          STA       MLPLIER
          JSR       MULTIPLY
          INY
          LDA       YEAR,Y
          AND       #00F
          ADC       PRODUCT
          STA       TEMPVAL3
          INY
          LDA       YEAR,Y
          AND       #00F
          STA       MLPLIER
          JSR       MULTIPLY
          INY
          LDA       YEAR,Y
          AND       #00F
          ADC       PRODUCT
          STA       TEMPVAL2
          RTS

MULTx10   LDA       #00A    ;Multiply by 10
          STA       MLPCND
MULT8bit  LDA       #000
          STA       MLPCND+1
          STA       MLPCND+2
                    ;24 bit multiplicand by 8 bit multiplier
MULTIPLY  LDA       #000
          STA       PRODUCT
          STA       PRODUCT+1
          STA       PRODUCT+2
          LDX       #008
$1        ASL       PRODUCT
          ROL       PRODUCT+1
          ROL       PRODUCT+2
          BCS       $3
          ASL       MLPLIER
          BCC       $2
          CLC
          LDA       PRODUCT
          ADC       MLPCND
          STA       PRODUCT
          LDA       PRODUCT+1
          ADC       MLPCND+1
          STA       PRODUCT+1
          LDA       PRODUCT+2
          ADC       MLPCND+2
          STA       PRODUCT+2
          BCS       $3
$2        DEX
          BNE       $1
$3        RTS
                    ;@Exit - result in PRODUCT (LB), PRODUCT+1 (MB), PRODUCT+2 (HB)

                    ; @Entry: HSB in PRODUCT+2, MSB in PRODUCT+1, LSB in PRODUCT,
                    ;         address for results in INDEX
DECIMAL3  LDY       #003
          BNE       CLRHSB
DECIMAL5  LDY       #005
CLRHSB    LDA       #000
          STA       PRODUCT+2
          BEQ       DECIMAL
DECIMAL7  LDY       #007
DECIMAL   STY       DECPLACE
          DEY
$1        LDA       PRODUCT+2
          BEQ       $3
          LDX       #000
          CMP       #00A
          BCC       $2
          TAX
          LDA       #000
          JSR       DIVx10
$2        STX       PRODUCT+2
$3        LDX       PRODUCT+1
          JSR       DIVx10
          STX       PRODUCT+1
          LDX       PRODUCT
          JSR       DIVx10
          STX       PRODUCT
          ORA       #030
          STA       TEMPVAL,Y
          DEY
          BNE       $1
          TXA
          ORA       #030
          STA       TEMPVAL,Y
          LDX       #000
$4        LDA       TEMPVAL,X
          CMP       #030
          BNE       $6
          INX
          CPX       DECPLACE
          BCC       $4
          BEQ       $6
$5        LDA       TEMPVAL,X
$6        STA       @INDEX,Y
          INY
          INX
          CPX       DECPLACE
          BCC       $5
          TYA
          LDY       DECPLACE
          STA       @INDEX,Y
          RTS

                    ;@Entry Xreg=LSB Dividend, Areg=MSB Dividend
DIVx10    STX       ZPGTEMP0
          LDX       #008
          CLC
$1        ROL       ZPGTEMP0
          ROL       A
          CMP       #00A    ;Divisor = $0A
          BCC       $2
          SBC       #00A
$2        DEX
          BNE       $1
          ROL       ZPGTEMP0
          LDX       ZPGTEMP0
          RTS       ;@Exit: Xreg=Quotient, Areg=Remainder

                    ;Get device identification info
GETDDATA  LDY       CURDRIVE
          LDA       SLOTLST,Y
          ORA       #030
          STA       SlotVal2
          STA       SlotVal3
          TYA
          ASL       A
          CLC
          ADC       IBuffHB
          STA       DevIDpg0+1
          LDX       #013
          LDA       DRVNLST,Y
          BNE       $1
          LDX       #009
$1        LDY       #009
$2        LDA       DRV0MSTR,X
          STA       DEVICE,Y
          DEX
          DEY
          BPL       $2

          LDY       #SerIdx+SerLen    ;$14+$13
          LDX       #SerLen           ;20 bytes long
$3        LDA       @DevIdpg0,y
          PHA
          DEY
          LDA       @DevIDpg0,y
          STA       SerialNo,x
          PLA
          DEX
          STA       SerialNo,x
          DEY
          DEX
          BPL       $3
          LDY       #RevisIdx+RevisLen    ;$2E+$07
          LDX       #RevisLen             ;8 bytes long
$4        LDA       @DevIDpg0,y
          PHA
          DEY
          LDA       @DevIDpg0,y
          STA       FirmWare,x
          PLA
          DEX
          STA       FirmWare,x
          DEY
          DEX
          BPL       $4
          LDY       #ModelIdx+ModelLen      ;$36+017
          LDX       #ModelLen               ;24 bytes long
$5        LDA       @DevIDpg0,y
          PHA
          DEY
          LDA       @DevIDpg0,y
          STA       Model,x
          PLA
          DEX
          STA       Model,x
          DEY
          DEX
          BPL       $5

          LDY       #LBAidx                 ;$63
          LDA       @DevIDpg0,y
          AND       #003
          STA       MODE_ID

GetCapcy  LDY       #CapacIdx+CapacLen+1    ;$72+$02+$01
          LDX       #CapacLen               ;3 bytes long
          LDA       @DevIDpg0,y
          BNE       $1
          DEY
          LDA       @DevIDpg0,y
          CMP       #098           ;check for capacity too large to display
          BCC       $3
$1        LDA       #097         ;Set maximum drive size of 9961471 blocks
          STA       TOTSECT,x
          DEX
          LDA       #0FF
          STA       TOTSECT,x
          DEX
          STA       TOTSECT,x
          LDX       #006
$2        LDA       TooLrg,x
          STA       TOTCAP,x
          DEX
          BPL       $2
          LDA       #007
          BNE       $4

$3        LDA       @DevIDpg0,y
          STA       PRODUCT,x
          STA       TOTSECT,x
          DEY
          DEX
          BPL       $3
          LDA       PTHDRADR
          STA       INDEX
          LDA       PTHDRADR+1
          STA       INDEX+1
          JSR       DECIMAL7
$4        STA       TCAPLEN
          RTS

                    ;Get Partition Table Block
GETPTBL   JSR       ClrDates    ;Clear partition table date display values
          LDX       CURDRIVE
          LDA       DNUMLST,X
          STA       CALLREF0
          STA       CALLREF1
          STA       CALLREF2
          BRK
          .BYTE     082
          .WORD     PTBLSTAT
          BEQ       $1
          CMP       #028     ;Drive not Connected Error
          BEQ       InitPTbl
          LDX       #PROMPT0
          JSR       PRTMSG
          LDX       #PTReadER
          JSR       PRTMSG
          JSR       InitPTbl
          LDA       #000
          STA       CURDRIVE     ;invalidate current drive selected
          JMP       G_ANYKEY

$1        JSR       GETCKSUM
          EOR       @PARTTBL,Y   ;Yreg=$00
          BNE       InitPTbl
          RTS

InitPTbl  LDY       #000
          LDA       #0FF
$1        STA       @PARTTBL,Y
          INY
          BNE       $1
          LDY       #ORIGDATE
          JSR       REVDATE
          RTS

                    ;Clear the partition table dates display values
ClrDates  LDX       #007
$1        STA       ORGDATE1,X
          STA       NEWDATE1,X
          DEX
          BPL       $1
          RTS

                    ;Routine to pause before returning to main menu
PAUSE     LDX       #MSGWIND
          JSR       PRTMSG
          LDX       #ESC1B
          JSR       PRTMSG
          BRK
          .BYTE     0CA
          .WORD     READCON
          JMP       MAINMENU

                    ;Initialize call block with zeros
CLRCALL   LDY       #006
          LDA       #000
$1        STA       @BUFFCALL,Y
          DEY
          BPL       $1
          RTS

                    ;Call Driver Routine
CALLDRVR  BRK
          .BYTE     083
          .WORD     BUFFCTRL
          BNE       GDevErr
          STA       Err_Data    ;$0
          CLC
          RTS

GDevErr   BRK       ;Get error data from driver
          .BYTE     082
          .WORD     ERRSTAT
          BNE       $1
                    ;Err_Data - byte $0 = error code
                    ;   Bit 7 = BBK bad block has been detected
                    ;   Bit 6 = UNC uncorrectable error was encountered
                    ;   Bit 5 = 0 (undefined)
                    ;   Bit 4 = IDNF requested block ID is in error or cannot be found
                    ;   Bit 3 = 0 (undefined)
                    ;   Bit 2 = ABRT command was aborted or an invalid command
                    ;   Bit 1 = 0 (undefined)
                    ;   Bit 0 = AMNF general error
                    ;Err_Data - byte $1 thru $3 = block # (LB, MB, & HB)
                    ;Err_Data - byte $4 = # of blocks left to complete command
          LDA       Err_Data
          SEC
          RTS
$1        JMP       ERROR


                    ;Convert binary value to hexidecimal ascii bytes routine
                    ;@ entry Areg contains binary value to convert
BINHEX    PHA
          AND       #00F
          ORA       #030
          CMP       #03A
          BCC       $1
          ADC       #006
$1        STA       GENERR
          PLA
          LSR       A
          LSR       A
          LSR       A
          LSR       A
          ORA       #030
          CMP       #03A
          BCC       $2
          ADC       #006
$2        STA       GENERR+1
          RTS       ;@ exit hex ascii values are in GENERR+1=HB, GENERR=LB

                    ;Update partition table parameters on drive
UDATDRV   LDX       #UPDATMSG
          JSR       PRTMSG
          LDY       #MODDATE
          JSR       REVDATE
                    ;Transfer device information to partition table
          LDY       #PtSIdx+SerLen    ;$10+$13
          LDX       #SerLen           ;20 bytes long
$1        LDA       SerialNo,x
          STA       @PARTTBL,Y
          DEY
          DEX
          BPL       $1
          LDY       #PtRevIdx+RevisLen    ;$24+$07
          LDX       #RevisLen             ;8 bytes long
$2        LDA       FirmWare,x
          STA       @PARTTBL,Y
          DEY
          DEX
          BPL       $2
          LDY       #PtModIdx+ModelLen      ;$2C+027
          LDX       #ModelLen               ;40 bytes long
$3        LDA       Model,x
          STA       @PARTTBL,Y
          DEY
          DEX
          BPL       $3

$5        JSR       GETCKSUM
          STA       @PARTTBL,Y
$6        LDA       @PARTTBL,Y
          STA       @BUFFPG0,Y
          INY
          BNE       $6
          JSR       CLRCALL
          LDY       #ATA_Cmd
          LDA       #ATACWrit
          STA       @BUFFCALL,Y
          LDA       #001
          LDY       #Num_Blks
          STA       @BUFFCALL,Y
          JSR       CALLDRVR
          BCC       $7
          LDX       #PROMPT0
          JSR       PRTMSG
          LDX       #UPDATERR
          JSR       PRTMSG
          JMP       ErrHndlr       ;PAUSE
$7        LDX       CURDRIVE
          LDA       DNUMLST,X
          STA       DFmtRef
          BRK                    ;format call to initialize driver
          .BYTE     083
          .WORD     DFMTCALL
          JSR       ERRORCK
          LDX       #VIEWPORT
          JSR       PRTMSG
          JSR       PTDATES
          LDA       #004
          JSR       PRTBYTE
          LDX       #CmpltMsg
          JSR       PRTMSG
          JMP       Wait1sec

                    ;routine to revise partition table dates
                    ;@entry Yreg=location in partition to place current date
REVDATE   LDX       #004
$1        LDA       YEAR,X
          STA       @PARTTBL,Y
          INY
          INX
          CPX       #008
          BEQ       $2
          CPX       #004
          BEQ       $4
          CPX       #006
          BEQ       $3
          BNE       $1
$2        LDX       #002
$3        LDA       #02F
          STA       @PARTTBL,Y
          INY
          BNE       $1
$4        RTS

                    ;@ entry address to decimal values in INDEX
                    ;Xreg=index for length of decimal  ie: $07 & $05
BINARY    LDA       #000
          STA       TEMPVAL
          STA       TEMPVAL1
          STA       TEMPVAL2
          STA       TEMPVAL3
          CLC
          LDY       ITEM_LEN,X
          LDA       @INDEX,Y
          BEQ       $3
          TAY
          DEY
          LDA       @INDEX,Y
          AND       #00F
          STA       TEMPVAL
          DEY
          BMI       $3
$1        LDA       @INDEX,Y
          AND       #00F
          BEQ       $2
          STA       MLPLIER
          LDX       TEMPVAL3
          LDA       MULTPCND,X
          STA       MLPCND
          LDA       MULTPCND+1,X
          STA       MLPCND+1
          LDA       MULTPCND+2,X
          STA       MLPCND+2
          JSR       MULTIPLY
          BCS       $3
          LDA       TEMPVAL
          ADC       PRODUCT
          STA       TEMPVAL
          LDA       TEMPVAL1
          ADC       PRODUCT+1
          STA       TEMPVAL1
          LDA       TEMPVAL2
          ADC       PRODUCT+2
          STA       TEMPVAL2
          BCS       $3              ;Range overflow
$2        INC       TEMPVAL3
          INC       TEMPVAL3
          INC       TEMPVAL3
          DEY
          BPL       $1
$3        RTS       ;@ exit - binary value is in TEMPVAL=LB, TEMPVAL1=MB, TEMPVAL2=HB

QUERY_YN  BRK       ;Query user for Yes/No response
          .BYTE     0CA
          .WORD     READCON
          JSR       ERRORCK
          LDA       INPUT
          AND       #0DF
          CMP       #04E     ;Ascii "N"
          BEQ       $2
          CMP       #01B     ;Escape
          BEQ       $2
          CMP       #059     ;Ascii "Y"
          BEQ       $1
          CMP       #00D     ;Return
          BNE       QUERY_YN
$1        CLC
$2        PHP
          LDA       #01E
          JSR       PRTBYTE
          PLP
          RTS       ;@ exit - carry is clear if response was yes
                    ;carry set if response is no

PROCEND   .EQU      *
CODELEN   .EQU      *-CODELOAD
