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

  1. ;
  2. ;
  3. ;    FKEY : Function key load/save 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.  
  13. rst_00h        equ    0C7h
  14. move_stuff_dest    equ    8000h
  15. command_line    equ    80h
  16. fcb        equ    5Ch
  17. curr_r        equ    fcb+32
  18. fcb_2        equ    6Ch
  19. bios_start    equ    0E700h
  20. id        equ    218h
  21. id_val        equ    0AA55h
  22. swap_a_m    equ    21Bh
  23. cursor_key_tab    equ    26Bh
  24.  
  25. num_fkeys    equ    12
  26. fkey_spot    equ    8000h-(num_fkeys*128)
  27. fkey_buffer    equ    0A000h
  28.  
  29. sys_page    equ    5
  30. normal_map    equ    4
  31. map_port    equ    50h
  32.  
  33.     aseg
  34.  
  35.     org    100h
  36.  
  37.     ld    de,start_mesg
  38.     ld    c,9
  39.     call    bdos
  40.  
  41.     ld    hl,(bios_start+id)
  42.     ld    de,id_val
  43.     or    a
  44.     sbc    hl,de
  45.     jp    nz,get_lost
  46.  
  47.     ld    hl,move_stuff_src
  48.     ld    de,move_stuff_dest
  49.     ld    bc,move_stuff_len
  50.     ldir
  51.  
  52.     ld    hl,command_line
  53.     ld    a,(hl)
  54.     or    a
  55.     jr    z,save_def
  56.     ld    b,a
  57. parse:
  58.     inc    hl
  59.     ld    a,(hl)
  60.     cp    'S'
  61.     jr    z,save
  62.     cp    'L'
  63.     jp    z,load
  64.     cp    ' '
  65.     jp    nz,show_use
  66.     djnz    parse
  67.  
  68. save_def:
  69.     ld    hl,fcb_def+1
  70.     ld    de,fcb+1
  71.     ld    bc,16-1
  72.     ldir
  73.     ld    a,(bios_start+swap_a_m)
  74.     and    'M'-'A'
  75.     add    a,1
  76.     ld    (fcb),a
  77.     jr    save_1
  78.  
  79. save:
  80.     call    check_file_name
  81.     jr    z,save_def
  82.     call    set_up_fcb
  83. save_1:
  84.     ld    de,save_drive
  85.     call    print_f_name
  86.     ld    de,save_mesg
  87.     ld    c,9
  88.     call    bdos
  89. ;    ld    a,rst_00h
  90. ;    ld    (ret_inst),a
  91.     call    zero_fcb_stuff
  92. ; See if file is already there
  93.     ld    de,fcb
  94.     ld    c,15
  95.     call    bdos
  96.     cp    0FFh
  97.     jr    z,s_not_there
  98. ; Was so delete it
  99.     ld    de,fcb
  100.     ld    c,19
  101.     call    bdos
  102. s_not_there:
  103.     call    zero_fcb_stuff
  104. ; Open new file
  105.     ld    de,fcb
  106.     ld    c,22
  107.     call    bdos
  108.     cp    0FFh
  109.     jp    z,prt_err
  110. ; Get function keys out of system page
  111.     call     get_f_keys
  112. ; Set up file header
  113.     ld    hl,header+6
  114.     ld    b,128-6
  115. s_1:
  116.     ld    (hl),0
  117.     inc    hl
  118.     djnz    s_1
  119. ; Copy in cursor keys
  120.     ld    hl,bios_start+cursor_key_tab
  121.     ld    de,header+40h
  122.     ld    bc,16
  123.     ldir
  124. ; Write header to file
  125.     ld    de,header
  126.     ld    c,26
  127.     call    bdos
  128.     ld    de,fcb
  129.     ld    c,21
  130.     call    bdos
  131.     or    a
  132.     jp    nz,prt_err
  133. ; Write buffer out to file, 1 record at a time
  134.     ld    b,num_fkeys    ; = number of records
  135.     ld    de,fkey_buffer
  136. save_loop:
  137.     push    bc
  138.     push    de
  139. ; Set buffer address
  140.     ld    c,26
  141.     call    bdos
  142. ; Write record
  143.     ld    de,fcb
  144.     ld    c,21
  145.     call    bdos
  146.     pop    de
  147.     pop    bc
  148.     or    a
  149.     jp    nz,prt_err
  150.     ld    hl,128
  151.     add    hl,de
  152.     ex    de,hl
  153.     djnz    save_loop
  154. ; Close file
  155.     ld    de,fcb
  156.     ld    c,16
  157.     call    bdos
  158.     cp    0FFh
  159.     jp    z,prt_err
  160.     ret
  161.  
  162. load_def:
  163.     ld    hl,fcb_def
  164.     ld    de,fcb
  165.     ld    bc,16
  166.     ldir
  167.     ld    a,(bios_start+swap_a_m)
  168.     and    'M'-'A'
  169.     add    a,1
  170.     ld    (fcb),a
  171.     jr    load_1
  172.  
  173. load:
  174.     call    check_file_name
  175.     jr    z,load_def
  176.     call    set_up_fcb
  177. load_1:
  178.     ld    de,load_drive
  179.     call    print_f_name
  180.     ld    de,load_mesg
  181.     ld    c,9
  182.     call    bdos
  183. ;    ld    a,rst_00h
  184. ;    ld    (ret_inst),a
  185.     call    zero_fcb_stuff
  186. ; See if file is there
  187.     ld    de,fcb
  188.     ld    c,15
  189.     call    bdos
  190.     cp    0FFh
  191.     jr    z,prt_err
  192. ; Read header from file
  193.     ld    de,header
  194.     ld    c,26
  195.     call    bdos
  196.     ld    de,fcb
  197.     ld    c,20
  198.     call    bdos
  199.     or    a
  200.     jr    nz,prt_err
  201. ; Read buffer from file, 1 record at a time
  202.     ld    b,num_fkeys    ; = number of records
  203.     ld    de,fkey_buffer
  204. load_loop:
  205.     push    bc
  206.     push    de
  207. ; Set buffer address
  208.     ld    c,26
  209.     call    bdos
  210. ; Read record
  211.     ld    de,fcb
  212.     ld    c,20
  213.     call    bdos
  214.     pop    de
  215.     pop    bc
  216.     or    a
  217.     jr    nz,prt_err
  218.     ld    hl,128
  219.     add    hl,de
  220.     ex    de,hl
  221.     djnz    load_loop
  222. ; Copy function keys to system page
  223.     call    put_f_keys
  224. ; Copy cursor keys to table
  225.     ld    hl,header+40h
  226.     ld    de,bios_start+cursor_key_tab
  227.     ld    bc,16
  228.     ldir
  229. ; Close file
  230.     ld    de,fcb
  231.     ld    c,16
  232.     call    bdos
  233.     cp    0FFh
  234.     jr    z,prt_err
  235.     ret
  236.  
  237. err_qm:
  238.     pop    hl    ; return address
  239. prt_err:
  240.     ld    de,err_mesg
  241.     jr    prt_ret
  242.  
  243. show_use:
  244.     ld    de,use_mesg
  245. prt_ret:
  246.     ld    c,9
  247.     call    bdos
  248. ret_inst:
  249.     ret
  250.  
  251. get_lost:
  252.     ld    de,wb_mesg
  253.     jr    prt_ret
  254.  
  255. zero_fcb_stuff:
  256.     ld    hl,fcb+16
  257.     ld    b,20
  258. zf_1:
  259.     ld    (hl),0
  260.     inc    hl
  261.     djnz    zf_1
  262.     ret
  263.  
  264. set_up_fcb:
  265.     ld    hl,fcb_2
  266.     ld    de,fcb
  267.     ld    bc,9
  268.     ldir
  269.     ld    hl,fcb_def_tail
  270.     ld    c,7
  271.     ldir
  272. ; Check for ?'s in fcb
  273.     ld    hl,fcb
  274.     ld    b,9
  275. sf_1:
  276.     ld    a,(hl)
  277.     cp    '?'
  278.     jr    z,err_qm
  279.     inc    hl
  280.     djnz    sf_1
  281.     ret
  282.  
  283. ; Check if there seems to be a file name on command line (following S/L)
  284. ; Return : NZ if there is, Z if not
  285. check_file_name:
  286.     dec    b
  287.     ret    z
  288. ; Skip past any non space characters
  289. cf_2:
  290.     inc    hl
  291.     ld    a,(hl)
  292.     cp    ' '
  293.     jr    z,cf_3
  294.     djnz    cf_2
  295.     xor    a
  296.     ret
  297. cf_3:
  298.     dec    b
  299.     ret    z
  300. cf_1:
  301.     inc    hl
  302.     ld    a,(hl)
  303.     cp    ' '
  304.     ret    nz
  305.     djnz    cf_1
  306.     xor    a
  307.     ret
  308.  
  309. ; Put file drive and name into print line
  310. print_f_name:
  311.     ld    hl,fcb
  312.     ld    a,(hl)
  313.     or    a
  314.     jr    nz,pf_4
  315.     ld    (de),a
  316.     inc    de
  317.     ld    (de),a
  318.     jr    pf_5
  319. pf_4:
  320.     add    a,'A'-1
  321.     ld    (de),a
  322.     inc    de
  323. pf_5:
  324.     inc    de
  325.     inc    hl
  326.     ld    b,8
  327. pf_1:
  328.     ld    a,(hl)
  329.     cp    ' '
  330.     jr    z,pf_2
  331.     ld    (de),a
  332.     inc    hl
  333.     inc    de
  334.     djnz    pf_1
  335.     ret
  336. pf_2:
  337.     ld    a,0
  338. pf_3:
  339.     ld    (de),a
  340.     inc    de
  341.     djnz    pf_3
  342.     ret
  343.  
  344. move_stuff_src    equ    $
  345.  
  346.     .phase    move_stuff_dest
  347.  
  348. get_f_keys:
  349.     ld    a,sys_page
  350.     out    (map_port),a
  351.     ld    hl,fkey_spot
  352.     ld    de,fkey_buffer
  353.     ld    bc,num_fkeys*128
  354.     ldir
  355.     ld    a,normal_map
  356.     out    (map_port),a
  357.     ret
  358.  
  359. put_f_keys:
  360.     ld    a,sys_page
  361.     out    (map_port),a
  362.     ld    hl,fkey_buffer
  363.     ld    de,fkey_spot
  364.     ld    bc,num_fkeys*128
  365.     ldir
  366.     ld    a,normal_map
  367.     out    (map_port),a
  368.     ret
  369.  
  370. move_stuff_len    equ    $-move_stuff_dest
  371.  
  372.     .dephase
  373.  
  374. start_mesg:
  375.     db    cr,lf,'Microbee 512k Enhanced Operating System v2.2,'
  376.     db    ' (c) 1987 Peter Broughton.',cr,lf
  377.     db    'FKEY : Save/load function and cursor keys.',cr,lf,lf,'$'
  378.  
  379. wb_mesg:
  380.     db    bell,'Wrong operating system !!',cr,lf,lf,'$'
  381.  
  382. use_mesg:
  383.     db    'Use : FKEY',cr,lf
  384.     db    tab,'- Save function keys to A:DEFAULT.FK',cr,lf
  385.     db    'Use : FKEY S/L [[d:]filename] (no extension)',cr,lf
  386.     db    tab,'S - Save function keys to d:filename.FK,',cr,lf
  387.     db    tab,'L - Load function keys from d:filename.FK,',cr,lf
  388.     db    tab,'If no filename is supplied then A:DEFAULT.FK'
  389.     db    ' is assumed.',cr,lf,lf,'$'
  390.  
  391. err_mesg:
  392.     db    bell,'File error !!',cr,lf,lf,'$'
  393.  
  394. save_mesg:
  395.     db    'Saving function keys to '
  396. save_drive:
  397.     db    'A:'
  398. save_name:
  399.     db    'DEFAULT',0,'.FK',cr,lf,lf,'$'
  400.  
  401. load_mesg:
  402.     db    'Loading function keys from '
  403. load_drive:
  404.     db    'A:'
  405. load_name:
  406.     db    'DEFAULT',0,'.FK',cr,lf,lf,'$'
  407.  
  408. fcb_def:
  409.     db    1,'DEFAULT '
  410. fcb_def_tail:
  411.     db    'FK ',0,0,0,0
  412.  
  413. ; This MUST be the last thing in the file
  414. header:
  415.     dw    8000h,8000h-(num_fkeys*128),num_fkeys*128
  416.  
  417.     if    ($ and 7Fh) ne 0
  418.      ds    80h-($ and 7Fh)
  419.     endif
  420.  
  421.     end
  422.