CP/M ASM86 1.1  SOURCE: TCOPY.A86     TCOPY - Copy Track 0                                                   PAGE   1

     1  
     2                          ;****************************************************************
     3                          ;*                                                              *
     4                          ;*      TCOPY - Example program to write the system track       *
     5                          ;*              for a Concurrent CP/M-86 Boot Disk on the       *
     6                          ;*              IBM Personel Computer                           *
     7                          ;*                                                              *
     8                          ;****************************************************************
     9  
    10                          ;       This program is used to read a binary image file of
    11                          ;       track 0.  This track is used to bootstrap Concurrent
    12                          ;       CP/M-86.  The file TCOPY reads has no CMD header and
    13                          ;       must be the same size as the track we are going
    14                          ;       to write.
    15  
    16                          ;       This program is intended to serve as an example
    17                          ;       to be modified by the OEM for differently sized loaders,
    18                          ;       and differently sized system track(s).
    19  
    20                          ;       Note: TCOPY must be run under CP/M-86 and not Concurrent
    21                          ;       CP/M-86 since TCOPY performs direct BIOS calls.
    22  
    23                          ;       The command
    24                          ;       GENCMD TCOPY
    25                          ;       is used to generate the CMD form of this program. 
    26  
    27                          title 'TCOPY - Copy Track 0'
    28  
    29                          ;CP/M-86, CCP/M-86 function names
    30  
    31                          ;console functions
    32     0001                 c_read          equ     1
    33     0009                 c_writebuf      equ     9
    34  
    35                          ;file functions
    36     000F                 f_open          equ     15
    37     0021                 f_readrand      equ     33
    38     001A                 f_setdma        equ     26
    39     0033                 f_setdmaseg     equ     51
    40  
    41                          ;drive functions
    42     0019                 drv_get         equ     25
    43  
    44                          ;system functions
    45     0000                 s_termcpm       equ     0
    46     0032                 s_dirbios       equ     50
    47  
    48                          ;direct Bios Parameter Block
    49     0000                 bpb_func        equ     byte ptr 0
    50     0001                 bpb_cx          equ     word ptr 1
    51     0003                 bpb_dx          equ     word ptr 3
    52  
    53  
CP/M ASM86 1.1  SOURCE: TCOPY.A86     TCOPY - Copy Track 0                                                   PAGE   2

    54  
    55                          ;ASCII linefeed and carriage return
    56     000A                 lf      equ     10
    57     000D                 cr      equ     13
    58  
    59                          ;how many 128 byte records to read for a loader image
    60     0020                 records_to_read         equ     8 * 4
    61                                                          ;8 = number of physical sectors per track
    62                                                          ;4 = number of 128 sectors per
    63                                                          ;physical sector
    64  
    65                          cseg                            ;use CCP stack
    66   0000 B109                      mov cl,c_writebuf       ;display sign on message
    67   0002 BA0001                    mov dx,offset sign_on_msg
    68   0005 CDE0                      int 224 
    69   0007 B119                      mov cl,drv_get          ;get default drive number
    70   0009 CDE0                      int 224
    71   000B 84C0                      test al,al              ;must run on drive A:
    72   000D 7406         0015         jz drive_ok
    73   000F BAAB01                      mov dx,offset drive_msg
    74   0012 E9D200       00E7           jmp error
    75  
    76                          drive_ok:
    77   0015 B10F                      mov cl,f_open           ;open the file given as
    78   0017 BA5C00                    mov dx,offset fcb       ;the 1st command parameter,
    79   001A CDE0                      int 224                 ;it is put at 05CH by
    80   001C 3CFF                      cmp al,0ffh             ;the program load
    81   001E 7506         0026         jne file_ok
    82   0020 BAC701                      mov dx,offset open_msg
    83   0023 E9C100       00E7           jmp error
    84  
    85                          file_ok:
    86   0026 C7063A123502              mov current_dma,offset track0_buffer
    87   002C C7067D000000              mov r0,0                ;start with sector 0, assume
    88   0032 B92000                    mov cx,records_to_read  ;no CMD header in the file
    89  
    90                          file_read:
    91   0035 51                        push cx                 ;keep the record count
    92   0036 B11A                      mov cl,f_setdma
    93   0038 8B163A12                  mov dx,current_dma
    94   003C CDE0                      int 224
    95   003E B121                      mov cl,f_readrand       ;user r0,r1,r2 for random
    96   0040 BA5C00                    mov dx,offset fcb       ;reads
    97   0043 CDE0                      int 224
    98   0045 59                        pop cx                  ;restore the record count
    99   0046 84C0                      test al,al
   100   0048 7406         0050         jz read_ok
   101   004A BA0402                      mov dx,offset read_msg
   102   004D E99700       00E7           jmp error
   103                          read_ok:
   104   0050 81063A128000              add current_dma,128     ;set the DMA for the next sector 
   105   0056 FF067D00                  inc r0                  ;add one to the random record field
   106   005A E2D9         0035         loop file_read
CP/M ASM86 1.1  SOURCE: TCOPY.A86     TCOPY - Copy Track 0                                                   PAGE   3

   107  
   108  
   109                          ;       We have the Track 0 image in RAM
   110                          ;       Ask for destination diskette
   111  
   112                          next_diskette:
   113  
   114   005C B109                      mov cl,c_writebuf
   115   005E BA4A01                    mov dx,offset new_disk_msg
   116   0061 CDE0                      int 224
   117  
   118   0063 B101                      mov cl,c_read           ;wait for a keystroke
   119   0065 CDE0                      int 224
   120  
   121                          ;       Using CP/M-86 function 50, Direct bios call,
   122                          ;       write the track image in TRACK0_BUFFER to
   123                          ;       track 0, on drive A:.
   124  
   125   0067 E82F00       0099         call select_disk        ;select A:
   126   006A E83400       00A1         call set_track          ;set track to 0
   127   006D E83700       00A7         call set_dmaseg         ;set DMA segment = DS
   128                                  
   129   0070 C7063C120000              mov current_sector,0    ;sectors are relative to 0 in BIOS
   130   0076 C7063A123502              mov current_dma,offset track0_buffer
   131   007C B92000                    mov cx,32               ;number of 128 byte sectors to write
   132                          next_sector:
   133   007F 51                        push cx                 ;save sector count
   134   0080 E82A00       00AD         call set_dmaoff
   135   0083 E82F00       00B5         call set_sector
   136   0086 E83400       00BD         call write_sector
   137   0089 81063A128000              add current_dma,128     ;next area of memory to write
   138   008F FF063C12                  inc current_sector      ;next sector number
   139   0093 59                        pop cx                  ;restore sector count
   140   0094 E2E9         007F         loop next_sector 
   141   0096 E93A00       00D3           jmp track_ok
   142  
   143                          select_disk:
   144   0099 B009                      mov al,9                ;BIOS function number of seldsk
   145   009B 33C9                      xor cx,cx               ;always drive A:
   146   009D 8BD1                      mov dx,cx
   147   009F EB20         00C1         jmps bios
   148                          set_track:
   149   00A1 B00A                      mov al,10               ;BIOS function number of settrk
   150   00A3 33C9                      xor cx,cx               ;go to track 0
   151   00A5 EB1A         00C1         jmps bios
   152                          set_dmaseg:
   153   00A7 B011                      mov al,17               ;BIOS function number of setdmab
   154   00A9 8CD9                      mov cx,ds               ;dma segment we want to use
   155   00AB EB14         00C1         jmps bios
   156                          set_dmaoff:
   157   00AD B00C                      mov al,12               ;BIOS function number of setdma
   158   00AF 8B0E3A12                  mov cx,current_dma
   159   00B3 EB0C         00C1         jmps bios
CP/M ASM86 1.1  SOURCE: TCOPY.A86     TCOPY - Copy Track 0                                                   PAGE   4

   160  
   161                          set_sector:
   162   00B5 B00B                      mov al,11               ;BIOS function number of setsec
   163   00B7 8B0E3C12                  mov cx,current_sector
   164   00BB EB04         00C1         jmps bios
   165                          write_sector:
   166   00BD B00E                      mov al,14               ;BIOS function number of write sector
   167   00BF EB00         00C1         jmps bios               ;error checking can be added here
   168                          bios:
   169   00C1 BB3512                    mov bx,offset bpb       ;fill in BIOS Paramenter Block
   170   00C4 8807                      mov bpb_func[bx],al
   171   00C6 894F01                    mov bpb_cx[bx],cx
   172   00C9 895703                    mov bpb_dx[bx],dx
   173   00CC B132                      mov cl,s_dirbios
   174   00CE 8BD3                      mov dx,bx
   175   00D0 CDE0                      int 224
   176   00D2 C3                        ret
   177  
   178  
   179                          track_ok:
   180   00D3 B109                      mov cl,c_writebuf       ;does the user want to write
   181   00D5 BA8701                    mov dx,offset continue_msg      ;to another diskette ?
   182   00D8 CDE0                      int 224
   183   00DA B101                      mov cl,c_read           ;get response
   184   00DC CDE0                      int 224
   185   00DE 245F                      and al,05FH             ;make upper case
   186   00E0 3C59                      cmp al,'Y'
   187   00E2 750C         00F0         jne done
   188   00E4 E975FF       005C           jmp next_diskette
   189  
   190                          error:
   191   00E7 52                        push dx
   192   00E8 E80C00       00F7         call crlf
   193   00EB 5A                        pop dx
   194   00EC B109                      mov cl,c_writebuf
   195   00EE CDE0                      int 224
   196  
   197                          done:
   198   00F0 B90000                    mov cx,s_termcpm
   199   00F3 8BD1                      mov dx,cx
   200   00F5 CDE0                      int 224
   201  
   202                          crlf:
   203   00F7 BAA801                    mov dx,offset crlf_msg
   204   00FA B109                      mov cl,c_writebuf
   205   00FC CDE0                      int 224
   206   00FE C3                        ret
   207  
   208                                  
   209  
   210                          dseg
   211  
   212                          org     5ch
CP/M ASM86 1.1  SOURCE: TCOPY.A86     TCOPY - Copy Track 0                                                   PAGE   5

   213  
   214   005C                   fcb     rb      33
   215   007D 0000              r0      dw      0
   216   007F 00                r3      db      0
   217                                  
   218                          org     100h
   219   0100 4578616D706C      sign_on_msg     db      'Example TCOPY for IBM PC', cr, lf
   220        652054434F50
   221        5920666F7220
   222        49424D205043
   223        0D0A
   224   011A 526561647320                      db      'Reads track image file and writes '
   225        747261636B20
   226        696D61676520
   227        66696C652061
   228        6E6420777269
   229        74657320
   230   013C 6974206F6E20                      db      'it on track 0$'
   231        747261636B20
   232        3024
   233   014A 0D0A50757420      new_disk_msg    db      cr,lf,'Put destination diskette in A:'
   234        64657374696E
   235        6174696F6E20
   236        6469736B6574
   237        746520696E20
   238        413A
   239   016A 0D0A                              db      cr,lf
   240   016C 537472696B65                      db      'Strike any key when ready $'
   241        20616E79206B
   242        657920776865
   243        6E2072656164
   244        792024
   245   0187 0D0A57726974      continue_msg    db      cr,lf,'Write another Track 0 (Y/N) ? $'
   246        6520616E6F74
   247        686572205472
   248        61636B203020
   249        28592F4E2920
   250        3F2024
   251  
   252   01A8 0D0A24            crlf_msg        db      cr,lf,'$'
   253  
   254  
   255   01AB 54434F505920      drive_msg       db      'TCOPY runs only on drive A:$'
   256        72756E73206F
   257        6E6C79206F6E
   258        206472697665
   259        20413A24
   260   01C7 476976652066      open_msg        db      'Give file name containing track 0 '
   261        696C65206E61
   262        6D6520636F6E
   263        7461696E696E
   264        672074726163
   265        6B203020
CP/M ASM86 1.1  SOURCE: TCOPY.A86     TCOPY - Copy Track 0                                                   PAGE   6

   266  
   267   01E9 696D6167652C                      db      'image, after TCOPY command$'
   268        206166746572
   269        2054434F5059
   270        20636F6D6D61
   271        6E6424
   272   0204 46696C652069      read_msg        db      'File is not long enough$'
   273        73206E6F7420
   274        6C6F6E672065
   275        6E6F75676824
   276   021C 4572726F7220      write_msg       db      'Error writing on track 0$'
   277        77726974696E
   278        67206F6E2074
   279        7261636B2030
   280        24
   281  
   282   0235                   track0_buffer   rb      1000H           ;4K tracks
   283  
   284   1235                   bpb             rb      5               ;direct Bios Parameter Block
   285  
   286   123A 0000              current_dma     dw      0
   287   123C 0000              current_sector  dw      0
   288  
   289  
   290  END OF ASSEMBLY.  NUMBER OF ERRORS:   0.  USE FACTOR:  3%
CP/M ASM86 1.1  SOURCE: TCOPY.A86     TCOPY - Copy Track 0                                                   PAGE 007

BIOS             00C1 L   147   151   155   159   164   167   168#
BPB              1235 V   169   284#
BPBCX            0001 N    50#  171 
BPBDX            0003 N    51#  172 
BPBFUNC          0000 N    49#  170 
CONTINUEMSG      0187 V   181   245#
CR               000D N    57#  219   233   239   245   252 
CREAD            0001 N    32#  118   183 
CRLF             00F7 L   192   202#
CRLFMSG          01A8 V   203   252#
CS               SREG V 
CURRENTDMA       123A V    86    93   104   130   137   158   286#
CURRENTSECTOR    123C V   129   138   163   287#
CWRITEBUF        0009 N    33#   66   114   180   194   204 
DONE             00F0 L   187   197#
DRIVEMSG         01AB V    73   255#
DRIVEOK          0015 L    72    76#
DRVGET           0019 N    42#   69 
DS               SREG V   154 
ERROR            00E7 L    74    83   102   190#
ES               SREG V 
FCB              005C V    78    96   214#
FILEOK           0026 L    81    85#
FILEREAD         0035 L    90#  106 
FOPEN            000F N    36#   77 
FREADRAND        0021 N    37#   95 
FSETDMA          001A N    38#   92 
FSETDMASEG       0033 N    39#
LF               000A N    56#  219   233   239   245   252 
NEWDISKMSG       014A V   115   233#
NEXTDISKETTE     005C L   112#  188 
NEXTSECTOR       007F L   132#  140 
OPENMSG          01C7 V    82   260#
R0               007D V    87   105   215#
R3               007F V   216#
READMSG          0204 V   101   272#
READOK           0050 L   100   103#
RECORDSTOREAD    0020 N    60#   88 
SDIRBIOS         0032 N    46#  173 
SELECTDISK       0099 L   125   143#
SETDMAOFF        00AD L   134   156#
SETDMASEG        00A7 L   127   152#
SETSECTOR        00B5 L   135   161#
SETTRACK         00A1 L   126   148#
SIGNONMSG        0100 V    67   219#
SS               SREG V 
STERMCPM         0000 N    45#  198 
TRACK0BUFFER     0235 V    86   130   282#
TRACKOK          00D3 L   141   179#
WRITEMSG         021C V   276#
WRITESECTOR      00BD L   136   165#
