
                     * PAG
                     ************************************************************
                     * FORMAT - FORMAT UTILTY FOR 40 TRACKS                     *
                     *                 AND 5,25 INCH FLOPPY                     *
                     ************************************************************
                     * OPT PAG
                     *
                     * 'FORMAT' UTILITY COPYRIGHT (C). 1979 BY
                     *
                     *   TECHNICAL SYSTEMS CONSULTANTS? INC.
                     *   BOX 2570
                     *   WEST LAFAYETTE, INDIAMA 47906
                     *   USA
                     
                     * BY FLD ON 15-10-2011 FOR VEGAS
                     * DISASSEMBLY BY DYNAMITE OF 1.FORMAT.CMD
                     
                     * STANDARD PRE-NAMED LABEL EQUATES
                     
               CC0E  SYSMTH  EQU    $CC0E
               CC10  SYSYR   EQU    $CC10
               CC34  FBFLAG  EQU    $CC34
               CD03  WARMS   EQU    $CD03
               CD15  GETCHR  EQU    $CD15
               CD18  TCHR    EQU    $CD18
               CD1B  INBUFF  EQU    $CD1B
               CD1E  PSTRNG  EQU    $CD1E
               CD24  PCRLF   EQU    $CD24
               CD2D  GETFIL  EQU    $CD2D
               CD39  OUTDEC  EQU    $CD39
               CD3C  OUTHEX  EQU    $CD3C
               CD42  GETHEX  EQU    $CD42
               CD48  INDEC   EQU    $CD48
               D403  FMSCLS  EQU    $D403
               D406  FMS     EQU    $D406
               DE03  DWRITE  EQU    $DE03
               DE09  RESTOR  EQU    $DE09
               DE1B  DSEEK   EQU    $DE1B
               F600  STRCR   EQU    $F600
               F680  PIA1DA  EQU    $F680
               F812  LECSE   EQU    $F812
                     
                     * GENERAL EQUATES
                     
               0101  FIRST   EQU    $0101     FIRST USER SECTOR 
               C07F  STACK   EQU    $C07F     STACK INITIALISATION
               C300  SCTBUF  EQU    $C300     DATA SECTOR BUFFER
                     
                     * EXTERNAL LABEL EQUATES
                     
               0000  L0000   EQU    $0000
               0002  L0002   EQU    $0002
               0003  L0003   EQU    $0003
               0005  L0005   EQU    $0005
               0006  L0006   EQU    $0006
               0007  L0007   EQU    $0007
               0008  L0008   EQU    $0008
               0009  L0009   EQU    $0009
               000A  L000A   EQU    $000A
               000D  L000D   EQU    $000D
               000E  L000E   EQU    $000E
               000F  L000F   EQU    $000F
               0010  L0010   EQU    $0010
               0012  L0012   EQU    $0012
               0020  TRACK   EQU    $0020
               0021  SECTOR  EQU    $0021
               0022  BADCNT  EQU    $0022
               0023  DRN     EQU    $0023
               0024  SIDE    EQU    $0024
               0025  DBSDF   EQU    $0025
               0026  DENSE   EQU    $0026
               0027  DNSITY  EQU    $0027
               002A  SECCNT  EQU    $002A
               002C  FSTAVL  EQU    $002C
               002E  LSTAVL  EQU    $002E
               0030  MAXS0   EQU    $0030
               0031  MAXS1   EQU    $0031
               0032  MAX     EQU    $0032
               0033  FKFCB   EQU    $0033
               0037  VOLNAM  EQU    $0037
               0042  VOLNUM  EQU    $0042
               0044  L0044   EQU    $0044
               004D  L004D   EQU    $004D
               004E  L004E   EQU    $004E
               0800  WORK    EQU    $0800
               0802  L0802   EQU    $0802
               0803  L0803   EQU    $0803
               0810  L0810   EQU    $0810
               0815  L0815   EQU    $0815
               0820  L0820   EQU    $0820
               17A0  L17A0   EQU    $17A0
               1FAF  L1FAF   EQU    $1FAF
               2740  L2740   EQU    $2740
               C07F  LC07F   EQU    $C07F
               C300  LC300   EQU    $C300
               C304  LC304   EQU    $C304
               C400  LC400   EQU    $C400
               EFB1  LEFB1   EQU    $EFB1
               FFFF  LFFFF   EQU    $FFFF
                     
                     
  0100                       ORG    $0100
                     
                     ***********************************************
                     * MAIN PROGRAM STARTS HERE
                     ***********************************************
                     
  0100 20   0C       L0100   BRA    L010E
               0101  L0101   EQU    *-1
  0102 02                    FCB    $02       VERSION NUMBER
  0103 BD   CD1E     L0103   JSR    PSTRNG    OUTPUT STRING
  0106 BD   CD15     L0106   JSR    GETCHR    GET RESPONSE
  0109 84   5F               ANDA   #$5F      MAKE IT UPPER CASE
  010B 81   4F               CMPA   #$4F      SEE IF "O"
  010D 39                    RTS
  010E 86   0A       L010E   LDA    #$0A      INITIALISE SECTOR MAX TRACK 0
  0110 97   30               STA    <MAXS0
  0112 97   32               STA    <MAX
  0114 86   14               LDA    #$14      INITIALISE SECTOR MAX TRACK 1
  0116 97   31               STA    <MAXS1
  0118 BD   CD42             JSR    GETHEX    GET DRIVE NUMBER
  011B 1025 0086             LBCS   EXIT      EXIT ON ERROR
  011F C1   00               CMPB   #0
  0121 1027 0080             LBEQ   EXIT      EXIT ON ERROR
  0125 1F   10               TFR    X,D
  0127 1083 0003             CMPD   #$0003    ENSURE 0 TO 3
  012B 22   78               BHI    EXIT      EXIT ON ERROR
  012D 8E   0800             LDX    #WORK
  0130 E7   03               STB    3,X
  0132 D7   23               STB    <DRN      DRIVE NUMBER
  0134 8E   049E             LDX    #SURES    ASK ETES VOUS SUR ,
  0137 8D   CA               BSR    L0103     PRINT & GET RESPONSE
  0139 26   6A               BNE    EXIT      EXIT IF NO
  013B 8E   04C0             LDX    #SCRDS    ASK DISQUE VIERGE DANS LECTEUR N
  013E BD   CD1E             JSR    PSTRNG    OUTPUT IT
  0141 8E   0802             LDX    #WORK+2
  0144 6F   84               CLR    0,X
  0146 5F                    CLRB
  0147 BD   CD39             JSR    OUTDEC
  014A 86   3F               LDA    #$3F      PRINT QUESTION MARK ?
  014C BD   CD18             JSR    TCHR
  014F 86   20               LDA    #$20
  0151 BD   CD18             JSR    TCHR
  0154 8D   B0               BSR    L0106     GET RESPONSE
  0156 26   4D               BNE    EXIT      EXIT IF NO
  0158 0F   25               CLR    <DBSDF    CLEAR FLAG
  015A 8E   0542             LDX    #DBST     ASK DOUBLE FACE ?
  015D 8D   A4               BSR    L0103     PRINT & GET RESPONSE
  015F 26   06               BNE    L0167     SKIP IF NO
  0161 0C   25               INC    <DBSDF    SET FLAG FOR DOUBLE SIDED
  0163 86   14               LDA    #$14      SET MAX SECTOR
  0165 97   32               STA    <MAX
  0167 0F   26       L0167   CLR    <DENSE    INITIALIZE SINGLE DENSITY
  0169 0F   27               CLR    <DNSITY
  016B 8E   0558             LDX    #DDSTR    ASK DOUBLE DENSITE ?
  016E 8D   93               BSR    L0103     PRINT & GET RESPONSE
  0170 26   02               BNE    L0174     SKIP IF NO
  0172 0C   26               INC    <DENSE    SET FLAG FOR DOUBLE DENSITY
  0174 8E   0571     L0174   LDX    #NMSTR    ASK NOM DU DISQUE ?
  0177 BD   CD1E             JSR    PSTRNG    PRINT IT
  017A BD   CD1B             JSR    INBUFF    GET LINE
  017D 8E   0033             LDX    #FKFCB    POINT TO FAKE FCB
  0180 BD   CD2D             JSR    GETFIL
  0183 8E   0582     L0183   LDX    #NUMSTR   ASK NUMERO DU DISQUE ,
  0186 BD   CD1E             JSR    PSTRNG    PRINT IT
  0189 BD   CD1B             JSR    INBUFF    GET LINE
  018C BD   CD48             JSR    INDEC     GET NUMBER
  018F 25   F2               BCS    L0183     ERROR?
  0191 9F   42               STX    <VOLNUM   SAVE NUMBER 
  0193 BD   CD24             JSR    PCRLF     PRINT CR & LF
  0196 8E   0800             LDX    #WORK
  0199 BD   DE09             JSR    RESTOR    RESTORE DISK
  019C 27   15               BEQ    L01B3     SKIP IF NO ERROR
  019E 8E   04AF             LDX    #WPST
  01A1 C5   40               BITB   #$40      WRITE PROTECT ERROR ?
  01A3 26   03               BNE    EXIT2     SKIP IF SO
                     
                     * EXIT ROUTINES
                             
  01A5 8E   04F1     EXIT    LDX    #ABORTS   REPORT ABORTING
  01A8 BD   CD1E     EXIT2   JSR    PSTRNG    OUTPUT IT
  01AB BD   D403     EXIT3   JSR    FMSCLS
  01AE 1C   EF               ANDCC  #$EF
  01B0 7E   CD03             JMP    WARMS
                     
                     * PREPARE FOR FORMAT
                     
  01B3 1A   10       L01B3   ORCC   #$10
  01B5 7D   CC34             TST    FBFLAG
  01B8 27   03               BEQ    L01BD
  01BA 113F                  SWI3
  01BC 12                    NOP
  01BD B6   F680     L01BD   LDA    PIA1DA    DATA REGISTER OF DISK PIA
  01C0 85   08               BITA   #8        CHECK BIT 8 FOR MOTOR
  01C2 26   10               BNE    L01D4     SKIP IF SET
  01C4 8A   08               ORA    #8
  01C6 B7   F680             STA    PIA1DA    START MOTOR
  01C9 34   10               PSHS   X
  01CB 8E   FFFF             LDX    #LFFFF    WAITING LOOP
  01CE 30   1F       L01CE   LEAX   -1,X
  01D0 26   FC               BNE    L01CE
  01D2 35   10               PULS   X
                     
                     * MAIN FORMATING LOOP
                     
  01D4 86   02       L01D4   LDA    #2
  01D6 B7   EFB1             STA    LEFB1
  01D9 0F   20               CLR    <TRACK    SET TRACK 0
  01DB 0F   24       L01DB   CLR    <SIDE     SET SIDE 0
  01DD 0F   21               CLR    <SECTOR   SET SECTOR 0
  01DF 8D   40               BSR    L0221     SETUP TRACK HEADER
  01E1 8E   0810     L01E1   LDX    #L0810    POINT TO SECTOR START 
  01E4 0D   27               TST    <DNSITY   DOUBLE DENSITY ?
  01E6 27   03               BEQ    L01EB     SKIP IF NOT
  01E8 8E   0820             LDX    #L0820    POINT TO SECTOR START 
  01EB 8D   56       L01EB   BSR    L0243     PROCESS RAM WITH INFO
  01ED 0C   21               INC    <SECTOR   ADVANCE TO NEXT
  01EF 96   21               LDA    <SECTOR   CHECK VALUE
  01F1 0D   24               TST    <SIDE     CHECK SIDE
  01F3 26   04               BNE    L01F9
  01F5 91   30               CMPA   <MAXS0
  01F7 20   02               BRA    L01FB
  01F9 91   31       L01F9   CMPA   <MAXS1
  01FB 26   EE       L01FB   BNE    L01EB     REPEAT ?
  01FD 96   20               LDA    <TRACK    GET TRACK NUMBER
  01FF D6   24               LDB    <SIDE     FAKE SECTOR FOR PROPRER SIDE
  0201 BD   DE1B             JSR    DSEEK     SEEK TRACK & SIDE
  0204 BD   0596             JSR    L0595     WRITE TRACK
  0207 0D   25               TST    <DBSDF    TEST IF ONE SIDED
  0209 27   08               BEQ    L0213     SKIP IF YES
  020B 0D   24               TST    <SIDE
  020D 26   04               BNE    L0213
  020F 03   24               COM    <SIDE     SET SIDE 1
  0211 20   CE               BRA    L01E1     AGAIN FOR SIDE 1
  0213 0C   20       L0213   INC    <TRACK    BUMP TRACK
  0215 BD   030F             JSR    L030F     SWITCH TO DD IF NECESSARY
  0218 96   20               LDA    <TRACK    CHECK VALUE
  021A 81   28               CMPA   #$28      MAX TRACK ?
  021C 26   BD               BNE    L01DB     LOOP IF NOT
  021E 16   00A4             LBRA   SETUP     DONE, JUMP TO SETUP
                     
                     * SETUP TRACK HEADER INFORMATION
                     
  0221 8E   0800     L0221   LDX    #WORK     POINT TO BUFFER
  0224 0D   27               TST    <DNSITY   DOUBLE DENSITY ?
  0226 26   0B               BNE    L0233     SKIP IF SO
  0228 C6   FF               LDB    #$FF
  022A E7   80       L022A   STB    0,X+      INITIALIZE WITH $FF
  022C 8C   17A0             CMPX   #L17A0    UNTIL FMS END FOR SD
  022F 26   F9               BNE    L022A     LOOP
  0231 20   09               BRA    L023C     DONE
  0233 C6   4E       L0233   LDB    #$4E
  0235 E7   80       L0235   STB    0,X+      INITIALIZE WITH $4E
  0237 8C   2740             CMPX   #L2740    UNTIL FMS END FOR DD
  023A 26   F9               BNE    L0235     LOOP
  023C 39            L023C   RTS              DONE
                     
                     * SET (B) BYTES OF MEMORY TO (A) STARTING AT (X)
                     
  023D A7   80       L023D   STA    0,X+
  023F 5A                    DECB
  0240 26   FB               BNE    L023D
  0242 39                    RTS
                     
                     * PROCESS SECTOR IN RAM
                     
  0243 4F            L0243   CLRA
  0244 0D   27               TST    <DNSITY   DOUBLE DENSITY ?
  0246 26   04               BNE    L024C     SKIP IF SO
  0248 C6   06               LDB    #6        CLEAR 6 BYTES
  024A 20   08               BRA    L0254
  024C C6   0C       L024C   LDB    #$0C      CLEAR 12 BYTES
  024E 8D   ED               BSR    L023D
  0250 86   F5               LDA    #$F5      SET IN 3 $F5'S
  0252 C6   03               LDB    #3
  0254 8D   E7       L0254   BSR    L023D
  0256 86   FE               LDA    #$FE      ID ADRESS MARK
  0258 A7   80               STA    0,X+
  025A 96   20               LDA    <TRACK    GET TRACK NO
  025C A7   80               STA    0,X+
  025E D6   27               LDB    <DNSITY   DOUBLE DENSITY ?
  0260 27   04               BEQ    L0266     SKIP IF NOT
  0262 D6   24               LDB    <SIDE     GET SIDE INDICATOR
  0264 C4   01               ANDB   #1        MAKE IT 0 OR 1
  0266 E7   80       L0266   STB    0,X+
  0268 D6   21               LDB    <SECTOR   GET SECTOR NO
  026A 108E 0466             LDY    #SSCMAP   POINT TO CORRECT MAP
  026E 0D   27               TST    <DNSITY
  0270 27   04               BEQ    L0276
  0272 108E 047A             LDY    #DSCMAP
  0276 E6   A5       L0276   LDB    B,Y       GET ACTUAL SECTOR
  0278 E7   80               STB    0,X+
  027A D1   32               CMPB   <MAX      END OF TRACK ?
  027C 26   09               BNE    L0287     SKIP IF NOT
  027E 4C                    INCA             BUMP TRACK NO
  027F 5F                    CLRB             RESET SECTOR NO
  0280 81   28               CMPA   #$28      END OF DISK ?
  0282 26   03               BNE    L0287     SKIP IF NOT
  0284 4F                    CLRA             SET ZERO FORWARD LINK
  0285 C6   FF               LDB    #$FF
  0287 5C            L0287   INCB             BUMP SECTOR NO
  0288 34   06               PSHS   A,B       SAVE FORWARD LINK
  028A 86   01               LDA    #1        SECTOR LENTH = 256
  028C A7   80               STA    0,X+
  028E 86   F7               LDA    #$F7      SET CRC CODE
  0290 A7   80               STA    0,X+
  0292 0D   27               TST    <DNSITY   DOUBLE DENSITY ?
  0294 26   07               BNE    L029D     SKIP IF SO
  0296 30   0B               LEAX   11,X      LEAVE $FF'S
  0298 4F                    CLRA             PUT IN 6 ZEROS
  0299 C6   06               LDB    #6
  029B 20   0C               BRA    L02A9
  029D 30   88 16    L029D   LEAX   22,X      LEAVE $4E'S
  02A0 4F                    CLRA             PUT IN 12 ZEROS
  02A1 C6   0C               LDB    #$0C
  02A3 8D   98               BSR    L023D
  02A5 86   F5               LDA    #$F5      PUT IN 3 $F5'S
  02A7 C6   03               LDB    #3
  02A9 8D   92       L02A9   BSR    L023D
  02AB 86   FB               LDA    #$FB      DATA ADRESS MARK
  02AD A7   80               STA    0,X+
  02AF 35   06               PULS   A,B       RESTORE FORWARD LINK
  02B1 ED   81               STD    0,X++     PUT IN SECTOR BUFFER
  02B3 4F                    CLRA
  02B4 C6   FE               LDB    #$FE
  02B6 8D   85               BSR    L023D
  02B8 86   F7               LDA    #$F7      SET CRC CODE
  02BA A7   80               STA    0,X+
  02BC 30   0C               LEAX   12,X      LEAVE GAP (12)
  02BE 0D   27               TST    <DNSITY   DOUBLE DENSITY ?
  02C0 27   02               BEQ    L02C4     SKIP IF NOT
  02C2 30   0C               LEAX   12,X      DD NEEDS MORE GAPS
  02C4 39            L02C4   RTS
                     
                     * READ ALL SECTORS FOR ERROR
                     
  02C5 D6   32       SETUP   LDB    <MAX
  02C7 86   27               LDA    #$27
  02C9 DD   2E               STD    <LSTAVL   SET LAST AVAIL
  02CB 3D                    MUL              FIND TOTAL SECTORS
  02CC DD   2A               STD    <SECCNT   SAVE IT
  02CE 8E   0101             LDX    #FIRST    SET FIRST AVAIL 
  02D1 9F   2C               STX    <FSTAVL
  02D3 96   23               LDA    <DRN
  02D5 B7   0803             STA    WORK+3
  02D8 4F                    CLRA             CLEAR COUNTER
  02D9 97   22               STA    <BADCNT
  02DB 97   20               STA    <TRACK    SET TRACK
  02DD 97   27               STA    <DNSITY   SINGLE DENSITY FOR TRACK 0
  02DF 4C                    INCA
  02E0 97   21               STA    <SECTOR   SET SECTOR
  02E2 86   0A               LDA    #$0A      RESET MAXIMUM
  02E4 97   30               STA    <MAXS0    SECTOR COUNTS
  02E6 86   14               LDA    #$14
  02E8 97   31               STA    <MAXS1
  02EA 0D   25               TST    <DBSDF    DOUBLE SIDED ?
  02EC 26   02               BNE    L02F0     SKIP IF SO
  02EE 86   0A               LDA    #$0A
  02F0 97   32       L02F0   STA    <MAX      SET MAXIMUM SECTORS
  02F2 8D   10       L02F2   BSR    L0304     GO CHECK SECTORS
  02F4 26   3C               BNE    L0332     ERROR ?
  02F6 0F   22               CLR    <BADCNT   CLEAR COUNTER
  02F8 DC   20       L02F8   LDD    <TRACK    GET TRACK AND SECTOR
  02FA 8D   2A               BSR    L0326     GET TO NEXT ADR
  02FC 1027 00B3             LBEQ   L03B3     SKIP IF FINISHED
  0300 DD   20               STD    <TRACK    SET TRACK AND SECTOR
  0302 20   EE               BRA    L02F2     REPEAT
  0304 8E   0800     L0304   LDX    #WORK     POINT TO FCB
  0307 DC   20               LDD    <TRACK    GET TRACK AND SECTOR
  0309 ED   88 1E            STD    30,X      SET CURRENT TRACK AND SECTOR
  030C 7E   039C             JMP    L039C     GO DO READ
                     
                     * SWITCH TO DOUBLE DENSITY IF NECESSARY
                     
  030F D6   26       L030F   LDB    <DENSE    DOUBLE DENSITY DISK ?
  0311 27   12               BEQ    L0325     SKIP IF NOT
  0313 D7   27               STB    <DNSITY   SET FLAG
  0315 C6   12               LDB    #$12      RESET SECTOR COUNTS
  0317 D7   30               STB    <MAXS0
  0319 C6   24               LDB    #$24
  031B D7   31               STB    <MAXS1
  031D 0D   25               TST    <DBSDF    DOUBLE SIDED
  031F 26   02               BNE    L0323     SKIP IF SO
  0321 C6   12               LDB    #$12
  0323 D7   32       L0323   STB    <MAX      SET MAX SECTOR
  0325 39            L0325   RTS
                     
                     * SET TRK AND SEC TO NEXT
                     
  0326 D1   32       L0326   CMPB   <MAX      END OF TRACK ?
  0328 26   04               BNE    L032E     SKIP IF NOT
  032A 4C                    INCA             BUMP TRACK
  032B 8D   E2               BSR    L030F     SWITCH TO DD IF NECESSARY
  032D 5F                    CLRB             RESET SECTOR NUMBER
  032E 5C            L032E   INCB             BUMP SECTOR NUMBER
  032F 81   28               CMPA   #$28      END OF DISK ?
  0331 39                    RTS
                     
                     * REMOVE BAD SECTOR FROM FREE CHAIN
                     
  0332 0C   22       L0332   INC    <BADCNT   UPDATE COUNTER
  0334 27   0A               BEQ    L0340     COUNT OVERFLOW
  0336 96   20               LDA    <TRACK    GET TRACK
  0338 26   0C               BNE    L0346     TRACK 0 ?
  033A D6   21               LDB    <SECTOR   GET SECTOR
  033C C1   05               CMPB   #5        PAST DIRECTORY ?
  033E 22   06               BHI    L0346
  0340 8E   04DF     L0340   LDX    #FATERS   REPORT FATAL ERROR
  0343 7E   01A8             JMP    EXIT2     REPORT IT
  0346 8E   0800     L0346   LDX    #WORK     POINT TO FCB
  0349 DC   2C               LDD    <FSTAVL   GET FIRST TRACK AND SECTOR
  034B 1093 20               CMPD   <TRACK    CHECK TRACK AND SECTOR
  034E 26   06               BNE    L0356
  0350 8D   D4               BSR    L0326     SET TO NEXT
  0352 DD   2C               STD    <FSTAVL   GO DO NEXT
  0354 20   27               BRA    L037D     SET NEW ADR
  0356 DC   20       L0356   LDD    <TRACK    GET TRACK AND SECTOR
  0358 D0   22               SUBB   <BADCNT
  035A 27   02               BEQ    L035E     UNDERFLOW ?
  035C 2A   03               BPL    L0361
  035E 4A            L035E   DECA             DEC TRACK
  035F D6   32               LDB    <MAX      RESET SECTOR
  0361 ED   88 1E    L0361   STD    30,X      SET CURRENT AD
  0364 8D   36               BSR    L039C     GO DO READ
  0366 26   D8               BNE    L0340     ERROR ?
  0368 EC   88 40            LDD    64,X      SET LINK ADR
  036B 8D   B9               BSR    L0326     POINT TO NEXT
  036D 26   07               BNE    L0376     OVERFLOW ?
  036F EC   88 1E            LDD    30,X      GET CURRENT ADR
  0372 DD   2E               STD    <LSTAVL   SET NEW LAST AVAIL
  0374 4F                    CLRA             SET END LINK
  0375 5F                    CLRB
  0376 ED   88 40    L0376   STD    64,X      SET NEW LINK
  0379 8D   2B               BSR    L03A6     GO DO WRITE
  037B 26   C3               BNE    L0340     ERROR ?
  037D 9E   2A       L037D   LDX    <SECCNT   GET SEC COUNT
  037F 30   1F               LEAX   -1,X      DEC IT ONCE
  0381 9F   2A               STX    <SECCNT   SAVE NEW COUNT
  0383 8E   0506             LDX    #BADSS    REPORT BAD SECTOR
  0386 BD   CD1E             JSR    PSTRNG    OUTPUT IT
  0389 8E   0020             LDX    #TRACK    POINT TO ADDRESS
  038C BD   CD3C             JSR    OUTHEX    OUTPUT IT
  038F 86   20               LDA    #$20
  0391 BD   CD18             JSR    TCHR
  0394 30   01               LEAX   1,X       BUMP TO NEXT
  0396 BD   CD3C             JSR    OUTHEX
  0399 7E   02F8             JMP    L02F8     CONTINUE
                     
                     * READ A SECTOR
                     
  039C 8E   0800     L039C   LDX    #WORK     POINT TO FCB
  039F 86   09               LDA    #9        SET UP COMMAND
  03A1 A7   84               STA    0,X
  03A3 7E   D406             JMP    FMS       GO DO IT
                     
                     * WRITE A SECTOR
                     
  03A6 8E   0800     L03A6   LDX    #WORK     POINT TO FCB
  03A9 86   0A               LDA    #$0A      SETUP COMMAND
  03AB A7   84               STA    0,X
  03AD BD   D406             JSR    FMS       GO DO IT
  03B0 27   EA               BEQ    L039C     ERRORS ?
  03B2 39                    RTS              ERROR RETURN
                     
                     * SETUP SYSTEM INFORMATION RECORD
                     
  03B3 0F   27       L03B3   CLR    <DNSITY   BACK TO SINGLE DENSITY
  03B5 8E   0800             LDX    #WORK     POINT TO SPACE
  03B8 6F   88 1E            CLR    30,X      SET TO DIS
  03BB 86   03               LDA    #3        SECTOR 3
  03BD A7   88 1F            STA    31,X
  03C0 8D   DA               BSR    L039C     READ IN SIR SECTOR
  03C2 26   48               BNE    L040C     ERRORS ?
  03C4 8E   0800             LDX    #WORK     FIX POINTER
  03C7 6F   88 40            CLR    64,X      CLEAR FORWARD LINK
  03CA 6F   88 41            CLR    65,X
  03CD DC   2C               LDD    <FSTAVL   ADDR OF FIRST FREE SECTOR
  03CF ED   88 5D            STD    93,X      SET IN SIR
  03D2 DC   2E               LDD    <LSTAVL   ADDR OF LAST FREE SECTOR
  03D4 ED   88 5F            STD    95,X      SET IN SIR
  03D7 DC   2A               LDD    <SECCNT   GET TOTAL SECTOR COUNT
  03D9 ED   88 61            STD    97,X      PUT IN SIR
  03DC 86   27               LDA    #$27      GET MAX TRACK NO
  03DE D6   30               LDB    <MAXS0    PUT IN SIR
  03E0 0D   25               TST    <DBSDF    DOUBLE SIDED ?
  03E2 27   02               BEQ    L03E6
  03E4 D6   31               LDB    <MAXS1    CHANGE FOR DOUBLE SIDED
  03E6 ED   88 66    L03E6   STD    102,X     SAVE MAX TRACK AND SECTOR
  03E9 FC   CC0E             LDD    SYSMTH    SET MONTH INTO SIR
  03EC ED   88 63            STD    99,X
  03EF B6   CC10             LDA    SYSYR     SET YEAR INTO SIR
  03F2 A7   88 65            STA    101,X
  03F5 C6   0D               LDB    #$0D
  03F7 108E 0037             LDY    #VOLNAM   POINT TO VOLUME NAME
  03FB 8E   0800             LDX    #WORK
  03FE A6   A0       L03FE   LDA    0,Y+      COPY NAME TO SIR
  0400 A7   88 50            STA    80,X
  0403 30   01               LEAX   1,X
  0405 5A                    DECB             DEC THE COUNT
  0406 26   F6               BNE    L03FE
  0408 8D   9C               BSR    L03A6     WRITE SIR BACK OUT
  040A 27   03               BEQ    L040F     SKIP IF NO ERROR
  040C 7E   0340     L040C   JMP    L0340     GO REPORT ERROR
                     
                     * INITIALIZE DIRECTORY
                     
  040F 8E   0800     L040F   LDX    #WORK     SET POINTER 
  0412 86   0A               LDA    #$0A      GET MAX FOR TRACK 0
  0414 0D   25               TST    <DBSDF    SINGLE SIDED ?
  0416 27   02               BEQ    L041A     SKIP IF SO
  0418 86   14               LDA    #$14      SET MAX FOR DS
  041A A7   88 1F    L041A   STA    31,X      SET UP
  041D BD   039C             JSR    L039C     READ IN SECTOR
  0420 26   EA               BNE    L040C     ERRORS ?
  0422 8E   0800             LDX    #WORK     RESTORE POINTER
  0425 6F   88 40            CLR    64,X      CLEAR LINK
  0428 6F   88 41            CLR    65,X
  042B BD   03A6             JSR    L03A6     WRITE BACK OUT
  042E 26   DC               BNE    L040C     ERRORS ?
                     
                     * SAVE BOOT IN TRACK 0 SECTOR 1
  0430 8E   C100             LDX    #CMDADR   POINT TO LOADER CODE
  0433 4F                    CLRA             TRACK #0
  0434 C6   01               LDB    #1        SECTOR #1
  0436 BD   DE03             JSR    DWRITE    WRITE THE SECTOR
  0439 26   D1               BNE    L040C     ERRORS ?
                     
                     * REPORT TOTAL SECTORS AND EXIT
                     
  043B 8E   0800             LDX    #WORK     SET UP AN FCB
  043E 86   10               LDA    #$10      OPEN SIR FUNCTION
  0440 A7   84               STA    0,X
  0442 BD   D406             JSR    FMS       OPEN THE SIR
  0445 26   C5               BNE    L040C     ERRORS ?
  0447 86   07               LDA    #7        GET INFO RECORD FUNCTION
  0449 A7   84               STA    0,X
  044B BD   D406             JSR    FMS       GET FIRST INFO RECORD
  044E 26   BC               BNE    L040C     ERRORS ?
  0450 8E   051A             LDX    #CMPLTE   REPORT FORMATTING COMPLETE
  0453 BD   CD1E             JSR    PSTRNG    OUTPUT IT
  0456 8E   052C             LDX    #SECST    PRINT TOTAL SECTOR STRING
  0459 BD   CD1E             JSR    PSTRNG    OUTPUT IT
  045C 8E   0815             LDX    #WORK+21  TOTAL IS IN INFO RECORD
  045F 5F                    CLRB
  0460 BD   CD39             JSR    OUTDEC    PRINT NUMBER
  0463 7E   01AB             JMP    EXIT3     ALL FINISHED
                     
                     *****************************************
                     * SECTOR MAP
                     *****************************************
  0466 01 03 05 07   SSCMAP  FCB    $01,$03,$05,$07,$09
  046A 09            
  046B 02 04 06 08           FCB    $02,$04,$06,$08,$0A
  046F 0A            
  0470 0B 0D 0F 11           FCB    $0B,$0D,$0F,$11,$13
  0474 13            
  0475 0C 0E 10 12           FCB    $0C,$0E,$10,$12,$14
  0479 14            
                     
  047A 01 05 09 0D   DSCMAP  FCB    $01,$05,$09,$0D
  047E 11 03 07 0B           FCB    $11,$03,$07,$0B,$0F
  0482 0F            
  0483 02 06 0A 0E           FCB    $02,$06,$0A,$0E,$12
  0487 12            
  0488 04 08 0C 10           FCB    $04,$08,$0C,$10,$13
  048C 13            
  048D 17 1B 1F 23           FCB    $17,$1B,$1F,$23,$15
  0491 15            
  0492 19 1D 21 14           FCB    $19,$1D,$21,$14,$18
  0496 18            
  0497 1C 20 24 16           FCB    $1C,$20,$24,$16,$1A
  049B 1A            
  049C 1E 22                 FCB    $1E,$22
  049E 45 54 45 53   SURES   FCC    'ETES VOUS SUR ? '
  04A2 20 56 4F 55   
  04A6 53 20 53 55   
  04AA 52 20 3F 20   
  04AE 04                    FCB    $04
  04AF 44 49 53 51   WPST    FCC    'DISQUE PROTEGE !'
  04B3 55 45 20 50   
  04B7 52 4F 54 45   
  04BB 47 45 20 21   
  04BF 04                    FCB    $04
  04C0 44 49 53 51   SCRDS   FCC    'DISQUE VIERGE DANS LE LECTEUR '
  04C4 55 45 20 56   
  04C8 49 45 52 47   
  04CC 45 20 44 41   
  04D0 4E 53 20 4C   
  04D4 45 20 4C 45   
  04D8 43 54 45 55   
  04DC 52 20         
  04DE 04                    FCB    $04
  04DF 45 52 52 45   FATERS  FCC    'ERREUR FATALE --- '
  04E3 55 52 20 46   
  04E7 41 54 41 4C   
  04EB 45 20 2D 2D   
  04EF 2D 20         
  04F1 46 4F 52 4D   ABORTS  FCC    'FORMATAGE INTERROMPU'
  04F5 41 54 41 47   
  04F9 45 20 49 4E   
  04FD 54 45 52 52   
  0501 4F 4D 50 55   
  0505 04                    FCB    $04
  0506 4D 41 55 56   BADSS   FCC    'MAUVAIS SECTEUR EN '
  050A 41 49 53 20   
  050E 53 45 43 54   
  0512 45 55 52 20   
  0516 45 4E 20      
  0519 04                    FCB    $04
  051A 46 4F 52 4D   CMPLTE  FCC    'FORMATAGE TERMINE'
  051E 41 54 41 47   
  0522 45 20 54 45   
  0526 52 4D 49 4E   
  052A 45            
  052B 04                    FCB    $04
  052C 4E 4F 4D 42   SECST   FCC    'NOMBRE DE SECTEURS = '
  0530 52 45 20 44   
  0534 45 20 53 45   
  0538 43 54 45 55   
  053C 52 53 20 3D   
  0540 20            
  0541 04                    FCB    $04
  0542 44 49 53 51   DBST    FCC    'DISQUE DOUBLE FACE ? '
  0546 55 45 20 44   
  054A 4F 55 42 4C   
  054E 45 20 46 41   
  0552 43 45 20 3F   
  0556 20            
  0557 04                    FCB    $04
  0558 44 49 53 51   DDSTR   FCC    'DISQUE DOUBLE DENSITE ? '
  055C 55 45 20 44   
  0560 4F 55 42 4C   
  0564 45 20 44 45   
  0568 4E 53 49 54   
  056C 45 20 3F 20   
  0570 04                    FCB    $04
  0571 4E 4F 4D 20   NMSTR   FCC    'NOM DU DISQUE ? '
  0575 44 55 20 44   
  0579 49 53 51 55   
  057D 45 20 3F 20   
  0581 04                    FCB    $04
  0582 4E 55 4D 45   NUMSTR  FCC    'NUMERO DU DISQUE ? '
  0586 52 4F 20 44   
  058A 55 20 44 49   
  058E 53 51 55 45   
  0592 20 3F 20      
  0595 04                    FCB    $04
                     
                     ********************************************
                     * WRITE TRACK ROUTINE
                     *******************************************
  0596 96   27       L0595   LDA    <DNSITY
  0598 26   07       L0597   BNE    L05A0
  059A B6   F680     L0599   LDA    PIA1DA
  059D 8A   10               ORA    #$10
  059F 20   05               BRA    L05A5
  05A1 B6   F680     L05A0   LDA    PIA1DA
  05A4 84   EF       L05A3   ANDA   #$EF
  05A6 B7   F680     L05A5   STA    PIA1DA
  05A9 8E   0800             LDX    #WORK
               05AB  L05AA   EQU    *-1
  05AC 86   F4               LDA    #$F4
  05AE B7   F600     L05AD   STA    STRCR
 >05B1 BD   05F9             JSR    L05F8
  05B4 1F   B9               TFR    DP,B
  05B6 C6   F6               LDB    #$F6
  05B8 1F   9B               TFR    B,DP
  05BA A6   80       L05B9   LDA    0,X+
  05BC D6   00       L05BB   LDB    <L0000
               05BD  L05BC   EQU    *-1
  05BE C5   12               BITB   #$12
               05BF  L05BE   EQU    *-1
  05C0 27   FA               BEQ    L05BB
  05C2 97   03       L05C1   STA    <L0003
  05C4 A6   80               LDA    0,X+
  05C6 D6   00       L05C5   LDB    <L0000
  05C8 C5   02               BITB   #2
  05CA 26   F6               BNE    L05C1
  05CC D6   00               LDB    <L0000
  05CE C5   02       L05CD   BITB   #2
  05D0 26   F0               BNE    L05C1
               05D1  L05D0   EQU    *-1
  05D2 D6   00               LDB    <L0000
               05D3  L05D2   EQU    *-1
  05D4 C5   02               BITB   #2
  05D6 26   EA               BNE    L05C1
  05D8 D6   00               LDB    <L0000
  05DA C5   02               BITB   #2
  05DC 26   E4               BNE    L05C1
  05DE D6   00               LDB    <L0000
  05E0 C5   02               BITB   #2
  05E2 26   DE               BNE    L05C1
  05E4 D6   00               LDB    <L0000
  05E6 C5   02               BITB   #2
  05E8 26   D8               BNE    L05C1
  05EA D6   00               LDB    <L0000
  05EC C5   02               BITB   #2
  05EE 26   D2               BNE    L05C1
  05F0 C5   01               BITB   #1
  05F2 26   D2               BNE    L05C5
  05F4 C6   00               LDB    #0
  05F6 1F   9B               TFR    B,DP
  05F8 39                    RTS
  05F9 F6   F680     L05F8   LDB    PIA1DA
  05FC C5   10               BITB   #$10
  05FE 26   04               BNE    L0603
  0600 C6   02               LDB    #2
  0602 20   02               BRA    L0605
  0604 C6   06       L0603   LDB    #6
  0606 5A            L0605   DECB
  0607 26   FD               BNE    L0605
  0609 39                    RTS
                     
  C100                       ORG    $C100
                     
  C100 20   0A       CMDADR  BRA    START0
  C102 00            LC102   FCB    $00
  C103 0000          LC103   FDB    $0000
  C105 0000          TRKSCT  FDB    $0000     FILE START TRK AND SEC
                     
  C107 00            LC107   FCB    $00
  C108 C100          LADRES  FDB    $C100
  C10A 0000          LADRE1  FDB    $0000
                     
  C10C 10CE C07F     START0  LDS    #STACK    SETUP STACK
  C110 FC   C105             LDD    TRKSCT    LOAD TRK AND SEC
  C113 FD   C300             STD    SCTBUF    POINT TO FCB
  C116 108E C400             LDY    #SCTBUF+256
  C11A 8D   35       START1  BSR    GETCH     GET A CHARACTER
  C11C 81   02               CMPA   #2        DATA RECORD HEADER ?
  C11E 27   10               BEQ    START2    SKIP IF SO
  C120 81   16               CMPA   #$16      XFR ADDRESS HEADER ?
  C122 26   F6               BNE    START1    LOOP IF NEITHER
  C124 8D   2B               BSR    GETCH     GET TRANSFER ADDRESS
  C126 B7   C108             STA    LADRES
  C129 8D   26               BSR    GETCH
  C12B B7   C109             STA    LADRES+1
  C12E 20   EA               BRA    START1
  C130 8D   1F       START2  BSR    GETCH
  C132 B7   C10A             STA    LADRE1
  C135 8D   1A               BSR    GETCH
  C137 B7   C10B             STA    LADRE1+1
  C13A 8D   15               BSR    GETCH
  C13C 1F   89               TFR    A,B       GET BYTE COUNT
  C13E 4D                    TSTA
  C13F 27   D9               BEQ    START1    LOOP IF COUNT=0
  C141 BE   C10A             LDX    LADRE1
  C144 34   14       START3  PSHS   B,X
  C146 8D   09               BSR    GETCH     GET A DATA CHARACTER
  C148 35   14               PULS   B,X
  C14A A7   80               STA    0,X+      PUT CHARACTER
  C14C 5A                    DECB             LAST CHARACTER ?
  C14D 26   F5               BNE    START3    LOOP IF NOT
  C14F 20   C9               BRA    START1
                     
                     * GET CHARACTER ROUTINE
                     
  C151 108C C400     GETCH   CMPY   #SCTBUF+256 OUT OF DATA ?
  C155 26   0F               BNE    GETCH2    GO READ CHARACTER IF NOT
  C157 8E   C300             LDX    #SCTBUF   POINT TO BUFFER
  C15A EC   84               LDD    0,X
  C15C 27   0B               BEQ    GETCH3    IF ZERO FILE IS LOADED
  C15E 8D   0D               BSR    GETCH4    READ NEXT SECTOR
  C160 26   9E               BNE    CMDADR    START OVER I ERROR
  C162 108E C304             LDY    #LC304    POINT PAST LINK
  C166 A6   A0       GETCH2  LDA    0,Y+      GET A CHARACTER
  C168 39                    RTS
                     
                     * FILE IS LOADED JUMP TO START ADDRESS
                     
  C169 6E   9F C108  GETCH3  JMP    [LADRES]
                     
                     * JUMP TO READ SECTOR
                     
  C16D 7E   F812     GETCH4  JMP    LECSE
                     
                             END    CMDADR

0 ERROR(S) DETECTED

SYMBOL TABLE:

ABORTS 04F1   BADCNT 0022   BADSS  0506   CMDADR C100   CMPLTE 051A   
DBSDF  0025   DBST   0542   DDSTR  0558   DENSE  0026   DNSITY 0027   
DRN    0023   DSCMAP 047A   DSEEK  DE1B   DWRITE DE03   EXIT   01A5   
EXIT2  01A8   EXIT3  01AB   FATERS 04DF   FBFLAG CC34   FIRST  0101   
FKFCB  0033   FMS    D406   FMSCLS D403   FSTAVL 002C   GETCH  C151   
GETCH2 C166   GETCH3 C169   GETCH4 C16D   GETCHR CD15   GETFIL CD2D   
GETHEX CD42   INBUFF CD1B   INDEC  CD48   L0000  0000   L0002  0002   
L0003  0003   L0005  0005   L0006  0006   L0007  0007   L0008  0008   
L0009  0009   L000A  000A   L000D  000D   L000E  000E   L000F  000F   
L0010  0010   L0012  0012   L0044  0044   L004D  004D   L004E  004E   
L0100  0100   L0101  0101   L0103  0103   L0106  0106   L010E  010E   
L0167  0167   L0174  0174   L0183  0183   L01B3  01B3   L01BD  01BD   
L01CE  01CE   L01D4  01D4   L01DB  01DB   L01E1  01E1   L01EB  01EB   
L01F9  01F9   L01FB  01FB   L0213  0213   L0221  0221   L022A  022A   
L0233  0233   L0235  0235   L023C  023C   L023D  023D   L0243  0243   
L024C  024C   L0254  0254   L0266  0266   L0276  0276   L0287  0287   
L029D  029D   L02A9  02A9   L02C4  02C4   L02F0  02F0   L02F2  02F2   
L02F8  02F8   L0304  0304   L030F  030F   L0323  0323   L0325  0325   
L0326  0326   L032E  032E   L0332  0332   L0340  0340   L0346  0346   
L0356  0356   L035E  035E   L0361  0361   L0376  0376   L037D  037D   
L039C  039C   L03A6  03A6   L03B3  03B3   L03E6  03E6   L03FE  03FE   
L040C  040C   L040F  040F   L041A  041A   L0595  0596   L0597  0598   
L0599  059A   L05A0  05A1   L05A3  05A4   L05A5  05A6   L05AA  05AB   
L05AD  05AE   L05B9  05BA   L05BB  05BC   L05BC  05BD   L05BE  05BF   
L05C1  05C2   L05C5  05C6   L05CD  05CE   L05D0  05D1   L05D2  05D3   
L05F8  05F9   L0603  0604   L0605  0606   L0802  0802   L0803  0803   
L0810  0810   L0815  0815   L0820  0820   L17A0  17A0   L1FAF  1FAF   
L2740  2740   LADRE1 C10A   LADRES C108   LC07F  C07F   LC102  C102   
LC103  C103   LC107  C107   LC300  C300   LC304  C304   LC400  C400   
LECSE  F812   LEFB1  EFB1   LFFFF  FFFF   LSTAVL 002E   MAX    0032   
MAXS0  0030   MAXS1  0031   NMSTR  0571   NUMSTR 0582   OUTDEC CD39   
OUTHEX CD3C   PCRLF  CD24   PIA1DA F680   PSTRNG CD1E   RESTOR DE09   
SCRDS  04C0   SCTBUF C300   SECCNT 002A   SECST  052C   SECTOR 0021   
SETUP  02C5   SIDE   0024   SSCMAP 0466   STACK  C07F   START0 C10C   
START1 C11A   START2 C130   START3 C144   STRCR  F600   SURES  049E   
SYSMTH CC0E   SYSYR  CC10   TCHR   CD18   TRACK  0020   TRKSCT C105   
VOLNAM 0037   VOLNUM 0042   WARMS  CD03   WORK   0800   WPST   04AF   





