.pl 51
.nf
.bp 1
.ft                                                       D-%
                                             Appendix D

                              The Microcomputer Development System-800 Cold Start Loader for CP/M 2



  1                                title   mds cold start loader at 3000h'
  2                       ;
  3                       ;        mds-800 cold start loader for cp/m 2.0
  4                       ;
  5                       ;        version 2.0 august, 1979
  6                       ;
  7      0000 =           false    equ     0
  8      ffff             true     equ     not false
  9      0000 =           testing  equ     false    if true, then go to mon80 on errors
 10                       ;
 11                                if      testing
 12                       bias     equ     03400h
 13                                endif
 14                                if      not testing
 15      0000 =           bias     equ     0000h
 16                                endif
 17      0000 =           cpmb     equ     bias          ;base of dos load
 18      0806 =           bdos     equ     806h+bias     ;entry to dos for calls
 19      1880 =           bdose    equ     1880h+bias    ;end of dos load
 20      1600 =           boot     equ     1600h+bias    ;cold start entry point
 21      1603 =           rboot    equ     boot+3        ;warm start entry point
 22                       ;
 23      3000                      org     03000h        ;loaded down from hardware boot at 3000H
 24                       ;
 25      1880 =           bdosl    equ     bdose-cpmb
 26      0002 =           ntrks    equ     2             ;number of tracks to read
 27      0031 =           bdoss    equ     bdosl/128     ;number of sectors in dos
 28      0019 =           bdoso    equ     25            ;number of bdos sectors on track 0
 29      0018 =           bdos1    equ     bdoss-bdoso   ;number of sectors on track 1
 30                       ;
 31      f800 =           mon80    equ     0f800h        ;intel monitor base
 32      ff0f =           rmon80   equ     0ff0fh        ;restart location for mon80
 33      0078 =           base     equ     078h          ;'base' used by controller
 34      0079 =           rtype    equ     base+1        ;result type
 35      007b =           rbyte    equ     base+3        ;result byte
 36      007f =           reset    equ     base+7        ;reset controller
 37                       ;
 38      0078 =           dstat    equ     base          ;disk status port
 39      0079 =           ilow     equ     base+1        ;low iopb address
 40      007a =           ihigh    equ     base+2        ;high iopb address
 41      00ff =           bsw      equ     0ffh          ;boot switch
 42      0003 =           recal    equ     3h            ;recalibrate selected drive
 43      0004 =           readf    equ     4h            ;disk read function
 44      0100 =           stack    equ     100h          ;use end of boot for stack
 45                       ;
 46                       rstart:
 47      3000 310001               lxi     sp,stack;     ;in case of call to mon80
 48                       ;        clear disk status
 49      3003 db79                 in      rtype
 50      3005 db7b                 in      rbyte
 51                       ;        check if boot switch if off
 52                       coldstart:
 53      3007 dbff                 in      bsw
 54      3009 e602                 ani     02h           ;switch on?
 55      300b c20730               jnz     coldstart
 56                       ;        clear the controller
 57      300e d37f                 out     reset         ;logic cleared
 58                       ;
 59                       ;
 60      3010 0602                 mvi     b,ntrks       ;number of tracks to read
 61      3012 214230               lxi     h,iopbo
 62                       ;
 63                       start:
 64                       ;
 65                       ;        read first/next track into cpmb
 66      3015 7d                   mov     a,l
 67      3016 d379                 out     ilow
 68      3018 7c                   mov     a,h
 69      3019 d37a                 out     ihigh
 70      301b db78        waito:   in      dstat
 71      301d e604                 ani     4
 72      301f ca1b30               jz      waito
 73                       ;
 74                       ;        check disk status
 75      3022 db79                 in      rtype
 76      3024 e603                 ani     11b
 77      3026 fe02                 cpi     2
 78                       ;
 79                                if      testing
 80                                cnc     rmon80    ;go to monitor if 11 or 10
 81                                endif
 82                                if      not testing
 83      3028 d20030               jnc     rstart    ;retry the load
 84                                endif
 85                       ;
 86      302b db7b                 in      rbyte     ;i/o complete, check status
 87                       ;        if not ready, then go to mon80
 88      302d 17                   ral
 89      302e dc0fff               cc      rmon80    ;not ready bit set
 90      3031 1f                   rar               ;restore
 91      3032 e61e                 ani     11110b    ;overrun/addr err/seek/crc/xxxx
 92                       ;
 93                                if      testing
 94                                cnz     rmon80    ;go to monitor
 95                                endif
 96                                if      not testing
 97      3034 c20030               jnz     rstart    ;retry the load
 98                                endif
 99                       ;
100                       ;
101      3037 110700               lxi     d,iopbl   ;length of iopb
102      303a 19                   dad     d         ;addressing next iopb
103      303b 05                   dcr     b         ;count down tracks
104      303c c21530               jnz     start
105                       ;
106                       ;
107                       ;        jmp to boot to print initial message, and set up jmps
108      303f c30016               jmp     boot
109                       ;
110                       ;        parameter blocks
111      3042 80          iopbo:   db      80h       ;iocw, no update
112      3043 04                   db      readf     ;read function
113      3044 19                   db      bdoso     ;#sectors to read on track 0
114      3045 00                   db      0         ;track 0
115      3046 02                   db      2         ;start with sector 2 on track 0
116      3047 0000                 dw      cpmb      ;start at base of bdos
117      0007 =           iopbl    equ     $-iopbo
118                       ;
119      3049 80          iopb1:   db      80h
120      304a 04                   db      readf
121      304b 18                   db      bdos1     ;sectors to read on track 1
122      304c 01                   db      1         ;track 1
123      304d 01                   db      1         ;sector 1
124      304e 800c                 dw      cmpb+bdos0*128;base of second read
125                       ;
126      3050                      end


base              0078           33#     34      35      36      38   39   40
bdos              0806           18#
bdoso             0019           28#     29     113     124
bdos1             0018           29#    121
bdose             1880           19#     25
bdosl             1880           25#     27
bdoss             0031           27#     29
bias              0000           12#     15#     17      18      19   20
boot              1600           20#     21     108
bsw               00ff           41#     53
coldstart         3007           52#     55
cpmb              0000           17#     25     116     124
dstat             0078           38#     70
false             0000            7#      8       9
ihigh             007a           40#     69
ilow              0079           39#     67
iopbo             3042           61     111#    117
iopb1             3049          119#
iopbl             0007          101     117#
mon80             f800           31#
ntrks             0002           26#     60
rboot             1603           21#
rbyte             007b           35#     50      86
readf             0004           43#    112     120
recal             0003           42#
reset             007f           36#     57
rmon80            ff0f           32#     80      89      94
rstart            3000           46#     83      97
rtype             0079           34#     49      75
stack             0100           44#     47
start             3015           63#    104
testing           0000            9#     11      14      79      82   93   96
true              ffff            8#
waito             301b           70#     72

.nx appe
