home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / mbug / mbug097.arc / CD.MAC < prev    next >
Text File  |  1979-12-31  |  6KB  |  459 lines

  1. ;
  2. ;
  3. ;    CHDISK : Disk type select program for 512k O/S
  4. ;
  5. ;
  6.  
  7. bdos        equ    5
  8. cr        equ    13
  9. lf        equ    10
  10. tab        equ    9
  11. bell        equ    7
  12. rst_00h        equ    0C7h
  13.  
  14. command_line    equ    80h
  15. bios_start    equ    0E700h
  16. id        equ    218h
  17. id_val        equ    0AA55h
  18. xltc        equ    54
  19. xltd        equ    64
  20. num_drives    equ    12Bh
  21. dpbase        equ    44h
  22. dpb_ptr        equ    0Ah
  23. spare_dpb    equ    0CFh
  24. dpb_base    equ    087h
  25.  
  26.     aseg
  27.  
  28.     org    100h
  29.  
  30.     ld    de,start_mesg
  31.     ld    c,9
  32.     call    bdos
  33.  
  34.     ld    hl,(bios_start+id)
  35.     ld    de,id_val
  36.     or    a
  37.     sbc    hl,de
  38.     jp    nz,get_lost
  39.  
  40.     ld    hl,command_line
  41.     ld    a,(hl)
  42.     or    a
  43.     jp    z,show_use
  44.     ld    b,a
  45. parse_disk:
  46.     inc    hl
  47.     ld    a,(hl)
  48.     cp    '?'
  49.     jp    z,display_types
  50.     cp    'L'
  51.     jr    z,got_disk
  52.     cp    'A'
  53.     jr    c,pd_1
  54.     cp    'D'+1
  55.     jr    c,got_disk
  56. pd_1:
  57.     cp    ' '
  58.     jp    nz,show_use
  59.     djnz    parse_disk
  60.     jp    show_use
  61.  
  62. got_disk:
  63.     ld    e,a
  64.     ld    a,(bios_start+num_drives)
  65.     ld    d,a
  66.     ld    a,e
  67.     ld    (disk),a
  68.     cp    'L'
  69.     jr    z,gd_1
  70.     sub    'A'
  71.     cp    d
  72.     jr    c,gd_2
  73. gd_3:
  74.     ld    de,no_drive_mesg
  75.     jp    prt_ret
  76. gd_1:
  77.     ld    a,d
  78.     cp    4
  79.     jr    z,gd_3
  80.     ld    a,'D'-'A'
  81. gd_2:
  82.     ld    (disk_num),a
  83.     dec    b
  84.     jp    z,show_use
  85.     dec    b
  86.     jp    z,show_use
  87.     inc    hl
  88. skip_space:
  89.     inc    hl
  90.     ld    a,(hl)
  91.     cp    ' '
  92.     jr    nz,check_type
  93.     djnz    skip_space
  94.     jp    show_use
  95.  
  96. check_type:
  97.     ld    ix,fmt_table
  98.     ld    c,b
  99.     ld    a,num_types
  100. ct_1:
  101.     push    hl
  102.     push    af
  103.     ld    e,(ix)
  104.     ld    d,(ix+1)
  105. ct_2:
  106.     ld    a,(de)
  107.     cp    'a'-1
  108.     jr    c,ct_3
  109.     res    5,a
  110. ct_3:
  111.     cp    (hl)
  112.     jr    nz,ct_no_match
  113.     inc    hl
  114.     inc    de
  115.     djnz    ct_2
  116. ; matches
  117.     pop    af
  118.     pop    hl
  119.     jr    got_match
  120. ct_no_match:
  121.     ld    b,c
  122.     pop    af
  123.     pop    hl
  124.     ld    de,5
  125.     add    ix,de
  126.     dec    a
  127.     jr    nz,ct_1
  128.     jp    show_use
  129.  
  130. got_match:
  131.     ld    a,(disk_num)
  132.     ld    l,a
  133.     ld    h,0
  134.     add    hl,hl
  135.     add    hl,hl
  136.     add    hl,hl
  137.     add    hl,hl        ; disk num * 16
  138.     add    a,a        ; disk num * 2
  139.     add    a,l        ; disk num * 18
  140.     ld    c,a
  141.     ld    b,h        ; h=0
  142.     ld    de,bios_start+dpbase+dpb_ptr
  143.     add    hl,de        ; --> dpb ptr in appropriate dph
  144.     ex    de,hl
  145.     ld    hl,bios_start+dpb_base    ; --> appropriate dpb
  146.     add    hl,bc
  147.     ex    de,hl    ; hl --> dpb ptr, de --> dpb
  148.     ld    (hl),e
  149.     inc    hl
  150.     ld    (hl),d
  151.     dec    de
  152.     dec    de
  153.     dec    de
  154.     ld    l,(ix+3)
  155.     ld    h,(ix+4)    ; hl --> new dpb
  156.     ld    c,18        ; b=0
  157.     ldir
  158.     ld    a,rst_00h
  159.     ld    (ret_inst),a
  160.  
  161. display_types:
  162.     ld    ix,fmt_table
  163.     ld    b,num_types
  164.     ld    d,0
  165. dt_1:
  166.     ld    l,(ix)
  167.     ld    h,(ix+1)
  168.     ld    e,(ix+2)
  169.     add    hl,de
  170.     ld    (hl),'$'
  171.     ld    e,5
  172.     add    ix,de
  173.     djnz    dt_1
  174.  
  175.     ld    iy,bios_start+dpbase
  176.     ld    a,0
  177. dt_2:
  178.     push    af
  179.     add    a,'A'
  180.     ld    (drive_name),a
  181.     ld    de,drive_mesg
  182.     ld    c,9
  183.     call    bdos
  184.     ld    l,(iy+dpb_ptr)
  185.     ld    h,(iy+dpb_ptr+1)
  186.     ld    a,l
  187.     cp    low (bios_start+spare_dpb)
  188.     jr    nz,dt_3
  189. dt_7:
  190. ; Disk set up by SETDISK etc.
  191.     ld    de,custom_mesg
  192.     ld    c,9
  193.     call    bdos
  194.     jr    dt_4
  195. dt_3:
  196. ; Try to find matching format
  197.     ld    ix,fmt_table
  198.     ld    b,num_types
  199.     dec    hl
  200.     dec    hl
  201.     dec    hl
  202. dt_5:
  203.     ld    e,(ix+3)
  204.     ld    d,(ix+4)
  205.     push    hl
  206.     push    bc
  207.     ld    b,18
  208. dt_6:
  209.     ld    a,(de)
  210.     cp    (hl)
  211.     jr    nz,dt_no_match
  212.     inc    hl
  213.     inc    de
  214.     djnz    dt_6
  215. ; everything matched so found type
  216.     pop    bc
  217.     pop    hl
  218.     jr    dt_match
  219. dt_no_match:
  220.     pop    bc
  221.     pop    hl
  222.     ld    de,5
  223.     add    ix,de
  224.     djnz    dt_5
  225. ; Nothing matched so print custom message
  226.     jr    dt_7
  227. dt_match:
  228. ; Have found matching type so print it's name
  229.     ld    e,(ix)
  230.     ld    d,(ix+1)
  231.     ld    c,9
  232.     call    bdos
  233.  
  234. dt_4:
  235.     ld    de,16
  236.     add    iy,de
  237.     pop    af
  238.     inc    a
  239.     ld    hl,bios_start+num_drives
  240.     cp    (hl)
  241.     jr    c,dt_2
  242.     cp    4
  243.     jr    nc,dt_8
  244.     ld    a,'L'-'A'
  245.     ld    iy,bios_start+dpbase+(16*3)
  246.     jr    dt_2
  247. dt_8:
  248.     ld    de,lf_mesg
  249.     jr    prt_ret
  250.  
  251. show_use:
  252.     ld    de,use_mesg
  253.     jr    prt_ret
  254.  
  255. get_lost:
  256.     ld    de,wb_mesg
  257. prt_ret:
  258.     ld    c,9
  259.     call    bdos
  260. ret_inst:
  261.     ret
  262.  
  263. fmt_table:
  264. ; ss80
  265.     dw    f1n
  266.     db    f1l
  267.     dw    f1d
  268. ; ds80
  269.     dw    f2n
  270.     db    f2l
  271.     dw    f2d
  272. ; ds40
  273.     dw    f3n
  274.     db    f3l
  275.     dw    f3d
  276. ; ds82
  277.     dw    f4n
  278.     db    f4l
  279.     dw    f4d
  280. ; ds84
  281.     dw    f5n
  282.     db    f5l
  283.     dw    f5d
  284. ; ds8b
  285.     dw    f6n
  286.     db    f6l
  287.     dw    f6d
  288.  
  289. num_types    equ    ($-fmt_table) / 5
  290.  
  291. ; Format data
  292.  
  293. ; ss80
  294. f1d    equ    $
  295.     db    xltd
  296.     db    2
  297.     db    3
  298. ;
  299.     dw    40
  300.     db    4
  301.     db    15
  302.     db    1
  303.     dw    194
  304.     dw    127
  305.     db    192,0
  306.     dw    32
  307.     dw    2
  308.  
  309.  
  310. ; ds80
  311. f2d    equ    $
  312.     db    xltc
  313.     db    5
  314.     db    3
  315. ;
  316.     dw    40
  317.     db    5
  318.     db    31
  319.     db    3
  320.     dw    0C2h
  321.     dw    127
  322.     db    80h,0
  323.     dw    32
  324.     dw    4
  325.  
  326.  
  327. ; ds40
  328. f3d    equ    $
  329.     db    xltd
  330.     db    1
  331.     db    3
  332. ;
  333.     dw    40
  334.     db    4
  335.     db    15
  336.     db    1
  337.     dw    194
  338.     dw    127
  339.     db    192,0
  340.     dw    32
  341.     dw    2
  342.  
  343.  
  344. ; ds82
  345. f4d    equ    $
  346.     db    xltd
  347.     db    1
  348.     db    3
  349. ;
  350.     dw    40
  351.     db    4
  352.     db    15
  353.     db    0
  354.     dw    391
  355.     dw    255
  356.     db    0F0h,0
  357.     dw    64
  358.     dw    2
  359.  
  360.  
  361. ; ds84
  362. f5d    equ    $
  363.     db    xltd
  364.     db    1
  365.     db    3
  366. ;
  367.     dw    40
  368.     db    5
  369.     db    31
  370.     db    3
  371.     dw    196
  372.     dw    127
  373.     db    128,0
  374.     dw    32
  375.     dw    2
  376.  
  377.  
  378. ; ds8b
  379. f6d    equ    $
  380.     db    xltd
  381.     db    1
  382.     db    3
  383. ;
  384.     dw    40
  385.     db    4
  386.     db    15
  387.     db    0
  388.     dw    389
  389.     dw    127
  390.     db    0C0h,0
  391.     dw    32
  392.     dw    4
  393.  
  394.  
  395. start_mesg:
  396.     db    cr,lf,'Microbee 512k Enhanced Operating System v2.2,'
  397.     db    ' (c) 1987 Peter Broughton.',cr,lf
  398.     db    'CD : Disk type selection.',cr,lf,lf,'$'
  399.  
  400. wb_mesg:
  401.     db    bell,'Wrong operating system !!',cr,lf,lf,'$'
  402.  
  403. use_mesg:
  404.     db    'Use : CD d: type',cr,lf
  405.     db    tab,'d:   - drive to change, A: B: C: D: or L:,',cr,lf
  406.     db    tab,'type - new disk type for that drive, one of :',cr,lf
  407.     db    tab,tab
  408. f1n    equ    $
  409.     db    'ss80 : 3.5" single sided, 80 track, 386k.',cr,lf
  410. f1l    equ    $-f1n
  411.     db    tab,tab
  412. f2n    equ    $
  413.     db    'ds80 : 3.5" double sided, 80 track, 776k.',cr,lf
  414. f2l    equ    $-f2n
  415.     db    tab,tab
  416. f3n    equ    $
  417.     db    'ds40 : 5.25" double sided, 40 track, 386k.',cr,lf
  418. f3l    equ    $-f3n
  419.     db    tab,tab
  420. f4n    equ    $
  421.     db    'ds82 : Dreamdisk, double sided, 80 track, 782k.',cr,lf
  422. f4l    equ    $-f4n
  423.     db    tab,tab
  424. f5n    equ    $
  425.     db    'ds84 : PJB''s format, double sided, 80 track, 784k.',cr,lf
  426. f5l    equ    $-f5n
  427.     db    tab,tab
  428. f6n    equ    $
  429.     db    'ds8b : Beeboard, double sided, 80 track, 776k.',cr,lf
  430. f6l    equ    $-f6n
  431.     db    tab,'Note that the change only remains in effect'
  432.     db    ' until next RESET.',cr,lf
  433.     db    'Use : CD ?',cr,lf
  434.     db    tab,'Displays current selection.',cr,lf
  435.     db    lf,'$'
  436.  
  437. no_drive_mesg:
  438.     db    'Drive '
  439. disk:
  440.     db    'A: not connected to system.',cr,lf,lf,'$'
  441.  
  442. drive_mesg:
  443.     db    'Drive '
  444. drive_name:
  445.     db    'A: - $'
  446.  
  447. custom_mesg:
  448.     db    '???? : Custom format.',cr
  449. lf_mesg:
  450.     db    lf,'$'
  451.  
  452. disk_num    equ    $
  453.  
  454.     if    ($ and 7Fh) ne 0
  455.      ds    80h-($ and 7Fh)
  456.     endif
  457.  
  458.     end
  459.