Files
Digital-Research-Source-Code/CPM OPERATING SYSTEMS/CPM.Z80.DE/PERSONAL/PCPM-86/BDOS 3.1/entry.a86
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

526 lines
12 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

include equates.a86
include system.a86
dseg
cseg
extrn rtm_sysflag:near
extrn cio_keyboard:near
extrn rtm_timeslice:near
public bdos_start
public bdos_rsx
public bdos_callback
public far_ret_1
public bdos_dseg
jmp bdos_start
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
jmp bdos_int_E0
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
bdos_dseg dw seg time_slice
; ...
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
bdos_start: ; CODE XREF: bdos:0000j
cli
xor ax, ax
mov ds, ax
mov word ptr INT_E0, offset bdos_int_E0
mov word ptr INT_E0+2, cs
mov bx, cs:bdos_dseg
mov ds, bx
mov ax, rlr
mov cl, 4
shr ax, cl
add ax, bx
mov rlr, ax
mov process_table, ax
mov bdos_conowner, ax
mov ss, ax
mov sp, 160h
init_proctab: ; CODE XREF: bdos:0054j
mov es, ax
mov es:word ptr proc_onblock, offset far_ret_1
g003f: ; DATA XREF: P_TERMCPM+16r
mov es:word ptr proc_onblock+2, cs
mov ax, es:proc_nextseg
test ax, ax
jz procs_inited
shr ax, cl
add ax, bx
mov es:proc_nextseg, ax
jmps init_proctab
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
procs_inited: ; CODE XREF: bdos:004Aj
mov es, rlr
mov es:proc_bdos_seg, cs
cld
mov cx, 7
mov bx, offset function_tables + 2 ;Call all init funcs
call_inits: push bx
push cx
call word ptr [bx]
pop cx
pop bx
add bx, 4
loop call_inits
callf dword ptr lp_xios_init
sti
mov al, boot_drive
mov es:proc_drive, al
push es
xor si, si
push ds
mov ds, si
mov word ptr INT_E0, offset bdos_int_E0
mov word ptr INT_E0+2, cs
mov di, offset proc_int0
mov cx, 4
rep movsw
mov cl, 4
add si, cx
rep movsw
mov si, offset INT_E0
mov cl, 4
rep movsw
pop es
pop ds
mov di, offset cpu_vectors
mov si, offset proc_int0
mov cl, 0Ch
rep movsw
xor cx, cx
mov dx, cx
int 0E0h ; used by BASIC while in interpreter
;
entry_init: ret
;
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
bdos_functions db 20h ; DATA XREF: bdos:01F2o
; P_TERMCPM
db 60h ; C_READ
db 61h ; C_WRITE
db 62h ; A_READ
db 63h ; A_WRITE
db 64h ; L_WRITE
db 65h ; C_RAWIO
db 66h ; A_STATIN
db 67h ; A_STATOUT
db 68h ; C_WRITESTR
db 69h ; C_READSTR
db 6Ah ; C_STAT
db 0A1h ; S_BDOSVER
db 0C0h ; DRV_ALLRESET
db 0C1h ; DRV_SET
db 0C2h ; F_OPEN
db 0C3h ; F_CLOSE
db 0C4h ; F_SFIRST
db 0C5h ; F_SNEXT
db 0C6h ; F_DELETE
db 0C7h ; F_READ
db 0C8h ; F_WRITE
db 0C9h ; F_MAKE
db 0CAh ; F_RENAME
db 0A2h ; DRV_LOGINVEC
db 0A3h ; DRV_GET
db 0A4h ; F_DMAOFF
db 0CBh ; DRV_ALLOCVEC
db 0CCh ; DRV_SETRO
db 0A5h ; DRV_ROVEC
db 0CDh ; F_ATTRIB
db 0CEh ; DRV_DPB
db 0A6h ; F_USERNUM
db 0CFh ; F_READRAND
db 0D0h ; F_WRITERAND
db 0D1h ; F_SIZE
db 0D2h ; F_RANDREC
db 0D3h ; DRV_RESET
db 0A0h ; (access drives)
db 0D5h ; DRV_FREE
db 0D6h ; F_WRITEZF
db 0A0h, 0A0h, 0A0h ; MP/M file lock functions
db 0A7h ; F_MULTISEC
db 0A8h ; F_ERRMODE
db 0D9h ; DRV_SPACE
db 0 ; P_CHAIN
db 0DAh ; DRV_FLUSH
db 0A9h ; S_SYSVAR
db 6Bh ; S_BIOS
db 0AAh ; F_DMASEG
db 0ABh ; F_DMAGET
db 40h ; MC_MAX
db 41h ; MC_ABSMAX
db 42h ; MC_ALLOC
db 43h ; MC_ABSALLOC
db 44h ; MC_FREE
db 45h ; MC_ALLFREE
db 1 ; P_LOAD
db 0A0h ; P_RSX
db 0DBh ; Clean up disc
db 0DCh ; F_TRUNCATE
db 0DDh ; DRV_SETLABEL
db 0DEh ; DRV_GETLABEL
db 0DFh ; F_TIMEDATE
db 0E0h ; F_WRITEXFCB
db 0ACh ; T_SET
db 0ADh ; T_GET
db 0E1h ; F_PASSWD
db 0AEh ; S_SERIAL
db 0AFh ; P_CODE
db 6Ch ; C_MODE
db 6Dh ; C_DELIMIT
db 6Eh ; C_WRITEBLK
db 6Fh ; L_WRITEBLK
db 0A0h ; PCP/M direct screen access
db 0A0h ; Unused in all versions
db 0A0h ; GSX
db 0E2h ; Set file timestamp
db 21h ; Wait on system flag
db 0A0h ; Set system flag
db 0A0h ; Create message queue
db 0A0h ; Open message queue
db 0A0h ; Delete message queue
db 0A0h ; Read message queue
db 0A0h ; Conditional read queue
db 0A0h ; Write to message queue
db 0A0h ; Conditional write message queue
db 22h ; P_DELAY
db 23h ; P_DISPATCH
db 20h ; P_TERM
db 0A0h, 0A0h, 0A0h
db 70h ; C_DETACH
db 0A0h, 0A0h, 0A0h, 0A0h
db 2 ; F_PARSE
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
bdos_int_E0: ; CODE XREF: bdos:0003j
; DATA XREF: bdos:000Eo ...
push ds
mov ds, cs:bdos_dseg
mov ax, es
mov es, rlr
pop ds
cmp es:proc_incpm, 0
jnz already_in_cpm
mov es:word ptr userStack+2, ss
mov es:word ptr userStack, sp
push es
pop ss
mov sp, offset proc_cpm_stack
already_in_cpm: ; CODE XREF: bdos:0155j
inc es:proc_incpm
sti
cld
mov es:userES, ax
mov es:proc_fx, cl
push si
push di
push bp
callf es:dword ptr proc_bdos_offs
pop bp
pop di
pop si
mov ax, bx
dec es:proc_incpm
jnz still_in_cpm
cli
mov ss, es:word ptr userStack+2
mov sp, es:word ptr userStack
still_in_cpm: ; CODE XREF: bdos:0188j
mov es, es:userES
cmp ax, 0FFFFh
jz check_result
xor cx, cx
check_result: ; CODE XREF: bdos:019Dj
iret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
bdos_rsx: ; DATA XREF: proc1:0052o
jmp bdos_rsx_main
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
rs 5
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
bdos_rsx_main: ; CODE XREF: bdos:01A2j
push es:userDS
mov es:userDS, ds
mov ds, cs:bdos_dseg
callf dword ptr lp_bdos_entry
mov ds, es:userDS
pop es:userDS
far_ret_1: ; DATA XREF: bdos:0038o P_CHAIN+71o
; ...
retf
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
bdos_entry: ; CODE XREF: x_dev_waitflag+2u
; x_p_delay+2u
; DATA XREF: ...
jmp bdos_func
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
rs 5
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
bdos_func: ; CODE XREF: bdos:01C8j
cld
mov al, cl
cmp al, 3Ch
jbe bdos_gotfunc
sub al, 25h
cmp al, 3Dh
jb bdos_badfunc
cmp al, 4Fh
jbe bdos_gotfunc
sub al, 0Fh
cmp al, 50h
jb bdos_badfunc
cmp al, 64h
jbe bdos_gotfunc
bdos_badfunc: ; CODE XREF: bdos:01DBj bdos:01E5j
mov bx, 0FFFFh
mov cx, 2
retf
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
bdos_gotfunc: ; CODE XREF: bdos:01D5j bdos:01DFj
; ...
mov bx, offset bdos_functions
xlat cs:byte ptr [bx]
mov cl, al
rol al, 1
rol al, 1
rol al, 1
and al, 7
mov ah, 1Fh
cmp al, 6
jb mask_fxn
mov ah, 3Fh
and al, 6
mask_fxn: ; CODE XREF: bdos:0205j
and cl, ah
entry_bdos: ; DATA XREF: dseg:0010o
call inner_callback
retf
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
inner_callback: ; CODE XREF: bdos:020Dp bdos_callback+8p
mov es:proc_intfunc, cl
mov es:proc_intmod, al
xor ah, ah
mov ch, ah
mov di, ax ; AL = function class
shl di, 1 ; CL = function number within class
shl di, 1
mov si, cx
shl si, 1
jmp function_tables[di]
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; S u b r o u t i n e
bdos_callback: ; CODE XREF: get_proc_dskdat+Bp
; release+3p ...
test ch, ch
jz callback_00
dec ch
mov al, ch
call inner_callback
jmps bdos_cbk_end
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
callback_00: ; CODE XREF: bdos_callback+2j
callf es:dword ptr proc_bdos_offs
bdos_cbk_end: ; CODE XREF: bdos_callback+Bj
mov ax, bx
retn
extrn sup_main:near
extrn sup_init:near
extrn rtm_main:near
extrn rtm_init:near
extrn mem_main:near
extrn mem_init:near
extrn cio_main:near
extrn cio_init:near
extrn misc_main:near
extrn misc_init:near
extrn bdos_main:near
extrn bdos_init:near
dseg
extrn freemem:byte
extrn proc1:word
extrn dirname_1:word
extrn dirdata_0:word
public function_tables
public bdos_8087_inuse
public rlr
public drl
public pq_disk
public pq_loader
public pq_memmgr
public pq_error
public pq_filesystem
public search_path
public temp_drive
public cpu_vectors
public lp_xios_entry
public lp_dos_module
public lp_sysflag_chg
public lp_kbd_callback
public time_slice
public proc_count
public bdos_conowner
public bdos_sysflags
public ccp_dseg
public cur_x
public max_x
public max_y
public sysvar_131
public sysvar_132
public echo_backspaced
public echo_deleted
public boot_drive
public ccp_user
public bdos_ver
public date_days
public date_secs
public page_mode
function_tables dw offset sup_main ; DATA XREF: inner_callback+Eo
dw offset sup_init
dw offset rtm_main
dw offset rtm_init
dw offset mem_main
dw offset mem_init
dw offset cio_main
dw offset cio_init
dw offset entry_init
dw offset entry_init
off_A15_14 dw offset misc_main
dw offset misc_init
off_A15_18 dw offset bdos_main
off_A15_1A dw offset bdos_init
a080586 db '* 11/16/83 *'
lp_xios_entry dw 3 ; Offset of XIOS entry
seg_A15_2A dw seg lp_xios_entry ; -> XIOS segment
lp_xios_init dw 0 ; Offset of XIOS init function
dw seg lp_xios_entry ; -> XIOS segment
lp_bdos_entry dw offset bdos_entry ; DATA XREF: bdos:01B9r x_dev_waitflag+2r
; ...
dw seg bdos_start
lp_timeslice dw offset rtm_timeslice
dw seg rtm_timeslice
lp_sysflag_chg dw offset rtm_sysflag
dw seg rtm_sysflag
lp_kbd_callback dw offset cio_keyboard
dw seg cio_keyboard
lp_dos_module dw 0,0 ; DATA XREF: bdos:007Dr P_CHAIN+A9r
; ...
ccp_dseg dw 0 ; DATA XREF: mc_temp_untempr
; get_mcb_pars+38r ...
; 0 if no temporary memory blocks allocated
dw seg bdos_start
dw seg freemem
bdos_conowner dw offset proc1 ; DATA XREF: bdos:002Ew bdos_sysflag+Ar
; ...
bdos_sysflags dw SYSFLAGS ; This should get set by GENCPM
rlr dw offset proc1 ; DATA XREF: bdos:001Fr bdos:0028w
; ...
; Current process
process_table dw 0 ; DATA XREF: bdos:002Bw
drl dw 0 ; DATA XREF: P_0207+5r P_0209+7o
; ...
; Processes that have just become
; ready to run
dw 0
proc_count db 1 ; DATA XREF: get_new_process+1Dw
; P_TERMCPM+5Ew ...
bdos_ver dw 1031h ; DATA XREF: S_BDOSVERr
bdos_8087_inuse db 0 ; DATA XREF: call_p_load+10w
; retake_8087+Br ...
search_path db 0, 0FFh, 0FFh, 0FFh
; ...
temp_drive db 0 ; DATA XREF: rsx_find+53o bdos:23AEo
date_days dw 0862h ; DATA XREF: bdos:23B2o bdos:2540o
; ...
date_hours db 12h ; DATA XREF: xios_hook_timer+85w
; xios_int08+5Dr ...
date_mins db 0 ; DATA XREF: xios_hook_timer+7Dw
; xios_int08+4Br ...
date_secs db 0 ; DATA XREF: bdos:2551w bdos:2566r
; ...
cur_x db 0 ; DATA XREF: bdos_char_out+44r
; bdos_char_out+70w ...
max_x db SCR_MAXX ; DATA XREF: input_putchar+12r
; expand_tabs+14r ...
max_y db SCR_MAXY ; DATA XREF: bdos:23A2o
page_mode db 0 ; DATA XREF: bdos:23A6o
echo_backspaced db 0 ; DATA XREF: input_ctlH+9r
echo_deleted db SCR_ECHODEL ; DATA XREF: input_delete+9r
;
; Process queues for single-threaded parts of the system.
;
; Format of process queue:
; DW offset of next queue, 0 for none
; DW segment of process currently in that section, 0 for none
; DW linked list of processes waiting for that section, 0 for none
; DW 0
;
pq_disk dw offset pq_loader ; DATA XREF: get_proc_dskdat+5o
; release_DMAo ...
rw 3
pq_loader dw offset pq_filesystem
rw 3
pq_filesystem dw offset pq_error ; DATA XREF: funcs_F_main+8o
; funcs_F_main+124o ...
rw 3
pq_error dw 8Ah ; DATA XREF: funcs_F_main+136o
; funcs_F_main+1C7o ...
rw 3
pq_memmgr rw 4 ; DATA XREF: funcs_MC+2o funcs_MC+24o
; ...
boot_drive db 0 ; DATA XREF: bdos:006Cr bdos:23CEo
; ...
ccp_user db 0
rb 0FEh
sysvar_131 db 0 ; DATA XREF: copy_to_history+14w
; bdos:1CFFr ...
sysvar_132 rb 100h ; DATA XREF: copy_to_history+Do
; bdos:1CFAo ...
time_slice db 10h ; DATA XREF: delay_dispatch+A2r
; bdos:23DEo
cpu_vectors rw 12
end