%';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %' ; %' INTEL CORPORATION PROPRIETARY INFORMATION ; %' ; %' This software is supplied under the terms of a license agreement ; %' or non disclosure agreement with Intel Corporation and may not be ; %' copied nor disclosed except in accordance with the terms of that ; %' agreement. ; %' ; %';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %' %' Title: afa configuration macros %' %' Date: March 13, 1983 %' %' Abstract: Generates configuration time data structures %' %' Revisions: %' %';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %' %' Define the groups according to the PLM86 compact model with subsystem = afa %' %';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %If (%Asm286) Then ( assume ds:afa_data afa_code segment Er public ) Else ( afa_cgroup group afa_code, afa_jump_code afa_dgroup group afa_data assume cs:afa_cgroup assume ds:afa_dgroup afa_code segment byte public 'code' )FI public max_public_dir_name_len max_public_dir_name_len dw 14 afa_code ends %';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %' Utility macro cleanup to cleanup parameters %';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %' %' Define strings for strip. %' %define(cr) ( ) %define(lf) ( ) %define(tab) ( ) %define(space) ( ) %' %' Strip: %' strip all occurances of "char" string from "arg" string. %' %*define(strip(char,arg)) local str head tail (%' %' '%define(str) (%0)%' %' '%define(tail) (%arg)%' %' '%while(%nes(%tail,%0)) (%' %' '%match(head%(%char)tail) (%tail)%' %' '%define(str) (%str%head)%' %' ')%' %' '%str%' )%' %' %' Cleanup: %' strip spaces, tabs and CRLFs from string. %' %*define(cleanup(str)) (%strip(%space,%strip(%tab,%strip(%cr,%strip(%lf,%str))))) %' %';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %' defines the max number of devices on which public dirs can reside %';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %*define(max_public_devs( num_p ))(%' %define(num)(%cleanup(%num_p))%' %' %If (%Asm286) Then ( afa_data segment RW public ) Else ( afa_data segment byte public 'data' )FI public num_devices, dev_cid, dev_names num_devices dw ? dev_cid dw %num dup (?) dev_names db (%num*14) dup (?) afa_data ends %If (%Asm286) Then ( afa_code segment Er public ) Else ( afa_code segment byte public 'code' )FI public max_devices max_devices dw %num afa_code ends ) %';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %' This macro specifies which devices can contain public files. %' There are 2 possibilities. %' 1. afa does the physical attachdevice and catalogs it in the root dir. %' 2. EIOS attaches the device and afa makes a dummy EIOS call. %' The routine afa_cnfg_init generates code to do this. Apart %' from attaching the devices, no info is stored about the public devices. %';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %set(num_ina_ad_calls,0)%'init number of ad calls to bemade by ina %set(num_eios_ad_calls,0)%'number of ad calls to be made by eios %*define(public_device(log_name_p, dev_name_p, file_driver_p, who_attach_p))(%' %' %define(log_name)(%cleanup(%log_name_p))%' %define(dev_name)(%cleanup(%dev_name_p))%' %define(file_driver)(%cleanup(%file_driver_p))%' %define(who_attach)(%cleanup(%who_attach_p))%' %' %if ( (%eqs(%who_attach,EIOS)) or (%eqs(%who_attach,eios)) ) then(%' %set(num_eios_ad_calls, %num_eios_ad_calls+1)%' %If (%Asm286) Then ( afa_code segment Er public ) Else ( afa_code segment byte public 'code' )FI pathname_%num_eios_ad_calls db (%len(%log_name)+2), ':', '%log_name', ':' log_name_%num_eios_ad_calls db %len(%log_name), '%log_name' afa_code ends )%' else( %if ( (%eqs(%who_attach,rmxnet)) or (%eqs(%who_attach,RMXNET)) or %' (%eqs(%who_attach,iNA)) ) then(%' %set(num_ina_ad_calls, %num_ina_ad_calls+1)%' %if ( (%eqs(%file_driver,NAMED)) or (%eqs(%file_driver,named)) ) then(%' %set(file_driver, 4) ) else( %if ( (%eqs(%file_driver,STREAM)) or (%eqs(%file_driver,stream)) ) then(%' %set(file_driver, 2) ) else( %if ( (%eqs(%file_driver,PHYSICAL)) or (%eqs(%file_driver,physical)) ) then(%' %set(file_driver, 1) ) else( ERROR, Invalid file driver ) fi)fi)fi %If (%Asm286) Then ( afa_code segment Er public ) Else ( afa_code segment byte public 'code' )FI log_name_%num_ina_ad_calls db %len(%log_name), '%log_name' dev_name_%num_ina_ad_calls db %len(%dev_name), '%dev_name' file_driver_%num_ina_ad_calls db %file_driver afa_code ends )%' else (%' ERROR - device attachment has to be done either by iRMX-NET or by EIOS )fi%' )fi%' ) %';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %' This macro specifies the maximum number of public dirs allowed %';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %*define(max_public_dirs( max_public_dirs_p ))(%' %' %define(max_public_dirs_a)(%cleanup(%max_public_dirs_p))%' %If (%Asm286) Then ( afa_code segment Er public ) Else ( afa_code segment byte public 'code' )FI public max_num_public_dirs max_num_public_dirs dw %max_public_dirs_a afa_code ends %If (%Asm286) Then ( afa_data segment RW public ) Else ( afa_data segment byte public 'data' )FI public num_public_dirs num_public_dirs dw ? public public_cid_table public_cid_table dw %max_public_dirs_a dup (?) public public_name_buf public_name_buf db %max_public_dirs_a*16 dup (?) afa_data ends )%' %';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %' This macro specifies the public directories %' This macro must not conflict with the earlier 3 macro calls %';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %set(num_public_dir_calls,0)%'init number of public dir calls %' %*define(public_directory( actual_prefix_p, actual_name_p, public_name_p))(%' %' %set(num_public_dir_calls, %num_public_dir_calls+1)%' %' %define(actual_prefix)(%cleanup(%actual_prefix_p))%' %define(actual_name)(%cleanup(%actual_name_p))%' %define(public_name)(%cleanup(%public_name_p))%' %' %if (%len(%public_name) gt 14) then (%' Error. Length of public name too big )fi%' %if (%num_public_dir_calls gt %max_public_dirs_a) then (%' Too many public directories )fi%' %If (%Asm286) Then ( afa_code segment Er public ) Else ( afa_code segment byte public 'code' )FI actual_prefix_%num_public_dir_calls db %len(%actual_prefix), '%actual_prefix' actual_name_%num_public_dir_calls db %len(%actual_name), '%actual_name' public_name_%num_public_dir_calls db %len(%public_name), '%public_name' afa_code ends )%' %';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %' This macros define the max number of binds %';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %*define(num_binds( num_p ))(%' %' %define(num)(%cleanup(%num_p))%' %' %If (%Asm286) Then ( afa_code segment Er public ) Else ( afa_code segment byte public 'code' )FI public max_bids max_bids dw %num afa_code ends %If (%Asm286) Then ( afa_data segment RW public ) Else ( afa_data segment byte public 'data' )FI public bid_table, bid_index_to_public_dirs, bid_depth bid_table dw %num dup (?) bid_index_to_public_dirs db %num dup (?) bid_depth db %num dup (?) afa_data ends )%' %';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %' Define the number of afa tasks. Associated with each task is 1 mailbox %' and 1 afa request block. The tasks, mailboxes and rbs are created at %' initialization time in init.p86. %' User token, 1 per each task are also created at init time. For consumer %' based protection, these user tokens are cludged up to reflect %' the proper ids. %';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %*define(number_afa_tasks( number_p))(%' %define(number)(%cleanup(%number_p))%' %If (%Asm286) Then ( afa_code segment Er public ) Else ( afa_code segment byte public 'code' )FI public num_afa_tasks num_afa_tasks dw %number afa_code ends ) %';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %' This macro specifies whether any of the afa users have %' additional attributes. If the additional attribs are supported, the %' byte of the extension data is specified in the afa_user %' macro. If they are not, get and set %' extension data are made dummy routines and the actual ones will not get %' linked in from afa.lib at cnfg time. %';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %*define(attribs( yn_p ))(%' %define(yn)(%cleanup(%yn_p))%' %' %if ((%eqs(%yn,N)) or (%eqs(%yn,n))) then( %If (%Asm286) Then ( afa_code segment Er public ) Else ( afa_code segment byte public 'code' )FI public get_extension_data, set_extension_data get_extension_data: pop di ; the return address pop bx ; the exception pop es ; pointer pop cx ; the mbox pop cx ; the connection pop cx ; the subsystem xor ax, ax ; ax = 0, extension data = 0 mov es:[bx], ax; no exception jmp di ; return set_extension_data: pop di ; the return address pop bx ; the exception pop es ; pointer pop cx ; the mbox pop ax ; the value pop cx ; the conn pop cx ; the subsystem mov word ptr es:[bx], 0 ; init excep to 0 and ax, 0ffefh ; see if any of the attribs are set ; ignore the dir bit jz L1 ; they are not, ret ok mov word ptr es:[bx], 8 ; they are, ret enot configured L1: jmp di afa_code ends )fi ) %';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %' This macro specifies whether we have an engine or a puter. In a commputer %' rbs have pointers in them and no conversions are necessary. In a comm %' engine rbs have dwords in them which have to be converted to pointers. In %' the former case, the conversion routines are dummy, and the actual %' conversion routines in afa.lib will not get linked in. %';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %*define(comm_engine( type_p ))(%' %define(type)(%cleanup(%type_p))%' %' %if ( (%eqs(%type,Y)) or (%eqs(%type,y)) ) then(%' ) else( %If (%Asm286) Then ( afa_code segment Er public ) Else ( afa_code segment byte public 'code' )FI public convert_init_rb, convert_before_send, convert_after_receive convert_init_rb: convert_before_send: convert_after_receive: ret 4 afa_code ends )fi ) %';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %' defines the max number of devices on which public dirs can reside %';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %*define(wildcards( num_p, delta_t_p ))(%' %define(num)(%cleanup(%num_p))%' %define(delta_t)(%cleanup(%delta_t_p))%' %' %If (%Asm286) Then ( afa_data segment RW public ) Else ( afa_data segment byte public 'data' )FI public num_wc_cids, wc_cids, wc_cids_acc_time num_wc_cids dw ? wc_cids dw %num dup(?) wc_cids_acc_time dd %num dup (?) afa_data ends %If (%Asm286) Then ( afa_code segment Er public ) Else ( afa_code segment byte public 'code' )FI public max_wc_cids, wc_cids_delta_t max_wc_cids dw %num wc_cids_delta_t dd %delta_t afa_code ends ) %';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %If (%Asm286) Then ( afa_code segment Er public ) Else ( afa_code segment byte public 'code' )FI extrn not_configured_proc:near afa_code ends %If (%Asm286) Then ( afa_jump_code segment Er public ) Else ( afa_jump_code segment byte public 'code' )FI public proc_jump_table proc_jump_table: ; UA calls %If (%Asm286) Then ( dw offset not_configured_proc ; 00 logon_proc dw offset not_configured_proc ; 01 logoff_proc dw offset not_configured_proc ; 02 change_password_proc dw offset not_configured_proc ; 03 get_user_info_proc dw offset not_configured_proc ; 04 get_group_info_proc dw offset not_configured_proc ; 05 change_group_proc dw offset not_configured_proc ; 06 get_server_attrib_proc ; File Management System Calls dw offset not_configured_proc ; 07 create_proc dw offset not_configured_proc ; 08 create_and_bind_proc dw offset not_configured_proc ; 09 delete_file_proc dw offset not_configured_proc ; 10 bind_proc dw offset not_configured_proc ; 11 unbind_proc dw offset not_configured_proc ; 12 rename_proc dw offset not_configured_proc ; 13 get_file_info_proc dw offset not_configured_proc ; 14 set_file_info_proc dw offset not_configured_proc ; 15 check_path_proc dw offset not_configured_proc ; 16 get_access_rights_proc ; File Access System Calls dw offset not_configured_proc ; 17 open_proc dw offset not_configured_proc ; 18 read_proc dw offset not_configured_proc ; 19 write_proc dw offset not_configured_proc ; 20 close_proc dw offset not_configured_proc ; 21 seek_proc dw offset not_configured_proc ; 22 file_search_proc dw offset not_configured_proc ; 23 commit_proc dw offset not_configured_proc ; 24 get_path_proc ;spooler interface procedures dw offset not_configured_proc ; 25 open_prt_proc dw offset not_configured_proc ; 26 close_prt_proc dw offset not_configured_proc ; 27 write_prt_proc dw offset not_configured_proc ; 28 get_prt_queue_proc ) Else ( dw offset afa_cgroup:not_configured_proc ; 00 logon_proc dw offset afa_cgroup:not_configured_proc ; 01 logoff_proc dw offset afa_cgroup:not_configured_proc ; 02 change_password_proc dw offset afa_cgroup:not_configured_proc ; 03 get_user_info_proc dw offset afa_cgroup:not_configured_proc ; 04 get_group_info_proc dw offset afa_cgroup:not_configured_proc ; 05 change_group_proc dw offset afa_cgroup:not_configured_proc ; 06 get_server_attrib_proc ; File Management System Calls dw offset afa_cgroup:not_configured_proc ; 07 create_proc dw offset afa_cgroup:not_configured_proc ; 08 create_and_bind_proc dw offset afa_cgroup:not_configured_proc ; 09 delete_file_proc dw offset afa_cgroup:not_configured_proc ; 10 bind_proc dw offset afa_cgroup:not_configured_proc ; 11 unbind_proc dw offset afa_cgroup:not_configured_proc ; 12 rename_proc dw offset afa_cgroup:not_configured_proc ; 13 get_file_info_proc dw offset afa_cgroup:not_configured_proc ; 14 set_file_info_proc dw offset afa_cgroup:not_configured_proc ; 15 check_path_proc dw offset afa_cgroup:not_configured_proc ; 16 get_access_rights_proc ; File Access System Calls dw offset afa_cgroup:not_configured_proc ; 17 open_proc dw offset afa_cgroup:not_configured_proc ; 18 read_proc dw offset afa_cgroup:not_configured_proc ; 19 write_proc dw offset afa_cgroup:not_configured_proc ; 20 close_proc dw offset afa_cgroup:not_configured_proc ; 21 seek_proc dw offset afa_cgroup:not_configured_proc ; 22 file_search_proc dw offset afa_cgroup:not_configured_proc ; 23 commit_proc dw offset afa_cgroup:not_configured_proc ; 24 get_path_proc ;spooler interface procedures dw offset afa_cgroup:not_configured_proc ; 25 open_prt_proc dw offset afa_cgroup:not_configured_proc ; 26 close_prt_proc dw offset afa_cgroup:not_configured_proc ; 27 write_prt_proc dw offset afa_cgroup:not_configured_proc ; 28 get_prt_queue_proc )FI public afa_user afa_user: afa_jump_code ends %*define(xyz(yn_p, name, ofst))(%' %define(yn)(%cleanup(%yn_p))%' %if ((%eqs(%yn,Y)) or (%eqs(%yn,y))) then( %If (%Asm286) Then ( afa_code segment Er public ) Else ( afa_code segment byte public 'code' )FI extrn %name:near afa_code ends %If (%Asm286) Then ( afa_jump_code segment Er public ) Else ( afa_jump_code segment byte public 'code' )FI org %ofst %If (%Asm286) Then ( dw offset %name ) Else ( dw offset afa_cgroup:%name )FI org 58 afa_jump_code ends )fi ) %*define(abc(yn_p, name))(%' %define(yn)(%cleanup(%yn_p))%' %if ((%eqs(%yn,N)) or (%eqs(%yn,n))) then( %If (%Asm286) Then ( afa_code segment Er public ) Else ( afa_code segment byte public 'code' )FI public %name %name: jmp not_configured_proc afa_code ends )fi ) %*define(logon(yn_p)) ( %xyz(%yn_p,logon_proc,0) ) %*define(logoff(yn_p)) ( %xyz(%yn_p,logoff_proc,2) ) %*define(get_server_attrib(yn_p)) ( %xyz(%yn_p,get_server_attrib_proc,12) ) %*define(create(yn_p)) ( %xyz(%yn_p,create_proc,14) ) %*define(create_and_bind(yn_p)) ( %xyz(%yn_p,create_and_bind_proc,16) ) %*define(delete(yn_p)) ( %xyz(%yn_p,delete_proc,18) ) %*define(bind(yn_p)) ( %xyz(%yn_p,bind_proc,20) ) %*define(unbind(yn_p)) ( %xyz(%yn_p,unbind_proc,22) ) %*define(rename(yn_p)) ( %xyz(%yn_p,rename_proc,24) ) %*define(get_file_info(yn_p)) ( %xyz(%yn_p,get_file_info_proc,26) ) %*define(set_file_info(yn_p)) ( %xyz(%yn_p,set_file_info_proc,28) ) %*define(check_path(yn_p)) ( %xyz(%yn_p,check_path_proc,30) ) %*define(get_access_rights(yn_p)) ( %xyz(%yn_p,get_access_rights_proc,32) ) %*define(open(yn_p)) ( %xyz(%yn_p,open_proc,34) ) %*define(read(yn_p)) ( %xyz(%yn_p,read_proc,36) ) %*define(write(yn_p)) ( %xyz(%yn_p,write_proc,38) ) %*define(close(yn_p)) ( %xyz(%yn_p,close_proc,40) ) %*define(seek(yn_p)) ( %xyz(%yn_p,seek_proc,42) ) %*define(file_search(yn_p)) ( %xyz(%yn_p,file_search_proc,44) %abc(%yn_p,wc_cleanup) ) %*define(commit(yn_p)) ( %xyz(%yn_p,commit_proc,46) ) %*define(get_path(yn_p)) ( %xyz(%yn_p,get_path_proc,48) ) %*define(open_print_file(yn_p)) ( %xyz(%yn_p,open_prt_proc,50) ) %*define(close_print_file(yn_p)) ( %xyz(%yn_p,close_prt_proc,52) ) %*define(write_print_file(yn_p)) ( %xyz(%yn_p,write_prt_proc,54) ) %*define(get_print_queue(yn_p)) ( %xyz(%yn_p,get_prt_queue_proc,56) ) %*define(dynamic_public_dirs(yn_p)) ( %abc(%yn_p,cusp_rb) ) %*define(wildcard_delete(yn_p)) ( %abc(%yn_p,delete_wc_proc) ) %';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %set(num_afa_users,0)%'number of afa users %*define(afa_user(layer_p, num_rbs_p, comm_engine_p, ed_num_p, small_buf_num_p, small_buf_len_p, big_buf_num_p, big_buf_len_p, cmd_buf_num_p, cmd_buf_len_p ))(%' %define(layer)(%cleanup(%layer_p))%' %define(num_rbs)(%cleanup(%num_rbs_p))%' %define(comm_engine)(%cleanup(%comm_engine_p))%' %define(ed_num)(%cleanup(%ed_num_p))%' %define(small_buf_num)(%cleanup(%small_buf_num_p))%' %define(small_buf_len)(%cleanup(%small_buf_len_p))%' %define(big_buf_num)(%cleanup(%big_buf_num_p))%' %define(big_buf_len)(%cleanup(%big_buf_len_p))%' %define(cmd_buf_num)(%cleanup(%cmd_buf_num_p))%' %define(cmd_buf_len)(%cleanup(%cmd_buf_len_p))%' %If (%Asm286) Then ( afa_data segment RW public ) Else ( afa_data segment byte public 'data' )FI cmd_bufs_%num_afa_users db %cmd_buf_num dup (%cmd_buf_len dup(?)) tcl_addr_buf_%num_afa_users db 30h dup(?) afa_data ends %If (%Asm286) Then ( afa_jump_code segment Er public ) Else ( afa_jump_code segment byte public 'code' )FI db %layer db %num_rbs %if ( (%eqs(%comm_engine,Y)) or (%eqs(%comm_engine,y)) ) then(%' db 0ffh ) else ( db 0h )fi db %ed_num %' small buffer info dw %small_buf_num dw 0 dw 0 dw %small_buf_len %' big buffer info dw %big_buf_num dw 0 dw 0 dw %big_buf_len %' cmd buffer info dw %cmd_buf_num %If (%Asm286) Then ( dw offset cmd_bufs_%num_afa_users dw afa_data ) Else ( dw offset afa_dgroup:cmd_bufs_%num_afa_users dw afa_dgroup )FI dw %cmd_buf_len %' tcl addr buffer info %If (%Asm286) Then ( dw offset tcl_addr_buf_%num_afa_users dw afa_data ) Else ( dw offset afa_dgroup:tcl_addr_buf_%num_afa_users dw afa_dgroup )FI dw 30h afa_jump_code ends %set(num_afa_users, %num_afa_users+1)%' ) %';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %' This macro must be the last macro in the configuration calls. It %' 1. generates code to attach the devices %' 2. generates code to ensure that other public devices are indeed attached %' 3. generates code to attach the public dirs %' 4. moves some vars from rom to ram %';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %*define(end_afa_cnfg)(%' %If (%Asm286) Then ( afa_code segment Er public ) Else ( afa_code segment byte public 'code' )FI extrn my_attach_device:near extrn my_attach_file:near extrn eios_attach_device:near public num_afa_users num_afa_users dw %num_afa_users public afa_cnfg_init afa_cnfg_init: %set(counter,%num_ina_ad_calls) %while(%counter ne 0 )(%' %If (%Asm286) Then ( mov ax, offset log_name_%counter ) Else ( mov ax, offset afa_cgroup:log_name_%counter )FI push cs push ax %If (%Asm286) Then ( mov ax, offset dev_name_%counter ) Else ( mov ax, offset afa_cgroup:dev_name_%counter )FI push cs push ax mov al, file_driver_%counter push ax call my_attach_device %set(counter, %counter-1) ) %set(counter,%num_eios_ad_calls) %while(%counter ne 0 )(%' %If (%Asm286) Then ( mov ax, offset pathname_%counter ) Else ( mov ax, offset afa_cgroup:pathname_%counter )FI push cs push ax %If (%Asm286) Then ( mov ax, offset log_name_%counter ) Else ( mov ax, offset afa_cgroup:log_name_%counter )FI push cs push ax call eios_attach_device %set(counter, %counter-1) ) %set(counter,1) %while(%counter le %num_public_dir_calls )(%' %If (%Asm286) Then ( mov ax, offset actual_prefix_%counter ) Else ( mov ax, offset afa_cgroup:actual_prefix_%counter )FI push cs push ax %If (%Asm286) Then ( mov ax, offset actual_name_%counter ) Else ( mov ax, offset afa_cgroup:actual_name_%counter )FI push cs push ax %If (%Asm286) Then ( mov ax, offset public_name_%counter ) Else ( mov ax, offset afa_cgroup:public_name_%counter )FI push cs push ax call my_attach_file %set(counter, %counter+1) ) ret afa_code ends )