mirror of https://github.com/GnoConsortium/gno.git
1898 lines
33 KiB
NASM
1898 lines
33 KiB
NASM
* $Id: shellcall.asm,v 1.1 1998/02/02 08:19:48 taubert Exp $
|
|
**************************************************************************
|
|
*
|
|
* The GNO Shell Project
|
|
*
|
|
* Developed by:
|
|
* Jawaid Bazyar
|
|
* Tim Meekins
|
|
* Derek Taubert
|
|
*
|
|
**************************************************************************
|
|
*
|
|
* SHELLCALL.ASM
|
|
* By Tim Meekins
|
|
*
|
|
* This file contains routines for patching GS/OS to intercept Shell
|
|
* calls and do special things with certain GS/OS calls.
|
|
*
|
|
* Phase 1 Modifications to Orca 2.0 compat: (11/18/91)
|
|
* removal of old c-style calls, and fixing all routines to work
|
|
* directly from pBlock rather than a copy.
|
|
* Phase 2: (11/19-20/91)
|
|
* Addition of most pCount checking, and addition of routines
|
|
* that don't take strings as parameters
|
|
* Phase 3: (11/20/91)
|
|
* String manipulation changes/additions
|
|
* Phase 4: (11/21/91)
|
|
* The variable pCount calls (FastFile, etc) and calls that differ
|
|
* greatly from Orca 1.x.
|
|
**************************************************************************
|
|
|
|
case on
|
|
copy global.equates
|
|
mcopy m/shellcall.mac
|
|
|
|
shellLoc gequ 12
|
|
|
|
;
|
|
; Table of commands
|
|
;
|
|
ShellCallTbl DATA
|
|
dc a2'_Get_L_Info' ;$101 - GetLInfo
|
|
dc a2'_Set_L_Info' ;$102 - SetLInfo
|
|
dc a2'_GetLang' ;$103
|
|
dc a2'_SetLang' ;$104
|
|
dc a2'_Error' ;* $105 - Error
|
|
dc a2'_Set' ;* $106 - Set
|
|
dc a2'_Version' ;* $107 - Version
|
|
dc a2'_Read_Indexed' ;* $108 - ReadIndexed
|
|
dc a2'_Init_Wildcard' ;$109 - InitWildcard
|
|
dc a2'_Next_Wildcard' ;$10A - NextWildcard
|
|
dc a2'_Read_Variable' ;* $10B - ReadVariable
|
|
dc a2'NotImp' ;$10C
|
|
dc a2'_Execute' ;* $10D - Execute
|
|
dc a2'_FastFile' ;$10E - FastFile
|
|
dc a2'_Direction' ;* $10F - Direction
|
|
dc a2'_Redirect' ;* $110 - Redirect
|
|
dc a2'NotImp' ;$111
|
|
dc a2'NotImp' ;$112
|
|
dc a2'_Stop' ;* $113 - Stop
|
|
dc a2'_ExpandDevices' ;* $114 - ExpandDevices
|
|
dc a2'_UnsetVariable' ;* $115 - UnsetVariable
|
|
dc a2'_Export' ;* $116 - Export
|
|
dc a2'_PopVariables' ;* $117 - PopVariables
|
|
dc a2'_PushVariables' ;* $118 - PushVariables
|
|
dc a2'_SetStopFlag' ;* $119 - SetStopFlag
|
|
dc a2'_ConsoleOut' ;* $11A - ConsoleOut
|
|
dc a2'NotImp' ;$11B
|
|
dc a2'NotImp' ;$11C
|
|
dc a2'NotImp' ;$11D
|
|
dc a2'_KeyPress' ;$11E
|
|
dc a2'_ReadKey' ;$11F
|
|
END
|
|
|
|
;=========================================================================
|
|
;
|
|
; ($101) GetLInfo
|
|
;
|
|
;=========================================================================
|
|
|
|
_Get_L_Info START
|
|
_Get_L_Info name
|
|
|
|
ph2 cmdNum
|
|
ph4 pBlock
|
|
jsl cGetLInfo
|
|
jmp GSOSReturn
|
|
END
|
|
|
|
;=========================================================================
|
|
;
|
|
; ($102) SetLInfo
|
|
;
|
|
;=========================================================================
|
|
|
|
_Set_L_Info START
|
|
_Set_L_Info name
|
|
|
|
ph2 cmdNum
|
|
ph4 pBlock
|
|
jsl cSetLInfo
|
|
jmp GSOSReturn
|
|
END
|
|
|
|
;=========================================================================
|
|
;
|
|
; ($103) GetLang
|
|
;
|
|
;=========================================================================
|
|
|
|
_GetLang START
|
|
_GetLang name
|
|
PBLang equ 0
|
|
|
|
lda curLangNum
|
|
ldy #PBLang
|
|
sta [pBlock],y
|
|
lda #0
|
|
jmp GSOSReturn
|
|
|
|
;=========================================================================
|
|
;
|
|
; ($104) SetLang
|
|
;
|
|
;=========================================================================
|
|
|
|
_SetLang ENTRY
|
|
|
|
ldy #PBLang
|
|
lda [pBlock],y
|
|
sta curLangNum
|
|
lda #0
|
|
jmp GSOSReturn
|
|
curLangNum dc i2'1'
|
|
END
|
|
|
|
|
|
;=========================================================================
|
|
;
|
|
; ($105) Error
|
|
;
|
|
;=========================================================================
|
|
|
|
_Error START
|
|
_Error name
|
|
|
|
lda cmdNum
|
|
and #$40
|
|
beq orca_1
|
|
lda pCount
|
|
cmp #1
|
|
beq orca_1
|
|
lda #4
|
|
jmp GSOSReturn
|
|
|
|
orca_1 lda [pBlock]
|
|
jsl printError
|
|
|
|
lda #0
|
|
jmp GSOSReturn
|
|
|
|
END
|
|
|
|
;=========================================================================
|
|
;
|
|
; ($106) Set
|
|
;
|
|
;=========================================================================
|
|
|
|
_Set START
|
|
_Set name
|
|
PBexport equ 8
|
|
|
|
varC equ shellLoc+0
|
|
valC equ shellLoc+4
|
|
|
|
lda cmdNum
|
|
and #$40 ;If bit $40 then c strings
|
|
beq orca_1
|
|
|
|
lda pCount
|
|
cmp #3
|
|
beq orca_2
|
|
lda #4
|
|
jmp GSOSReturn
|
|
|
|
orca_2 anop
|
|
ldy #2 ;$
|
|
lda [pBlock],y ;$
|
|
pha ;$
|
|
lda [pBlock] ;$
|
|
pha ;$
|
|
jsl gs2cstr
|
|
phx
|
|
pha
|
|
sta varC
|
|
stx varC+2
|
|
|
|
ldy #6 ;$
|
|
lda [pBlock],y ;$
|
|
pha ;$
|
|
ldy #4 ;$
|
|
lda [pBlock],y ;$
|
|
pha ;$
|
|
|
|
jsl gs2cstr
|
|
phx
|
|
pha
|
|
sta valC
|
|
stx valC+2
|
|
jsl setvar
|
|
|
|
pei (varC+2) ; set the export flag according
|
|
pei (varC)
|
|
ldy #PBexport ; to the new parm in Orca 2.0
|
|
lda [pBlock],y
|
|
pha
|
|
jsl exportvar
|
|
bra orca_com
|
|
|
|
orca_1 ldy #2 ;$
|
|
lda [pBlock],y ;$
|
|
pha ;$
|
|
lda [pBlock] ;$
|
|
pha ;$
|
|
jsl p2cstr
|
|
phx
|
|
pha
|
|
sta varC
|
|
stx varC+2
|
|
|
|
ldy #6 ;$
|
|
lda [pBlock],y ;$
|
|
pha ;$
|
|
ldy #4 ;$
|
|
lda [pBlock],y ;$
|
|
pha ;$
|
|
|
|
jsl p2cstr
|
|
phx
|
|
pha
|
|
sta valC
|
|
stx valC+2
|
|
|
|
jsl setvar
|
|
|
|
orca_com pei (varC+2)
|
|
pei (varC)
|
|
jsl ~NDISPOSE
|
|
pei (valC+2)
|
|
pei (valC)
|
|
jsl ~NDISPOSE
|
|
|
|
lda #0
|
|
jmp GSOSReturn
|
|
|
|
END
|
|
|
|
;=========================================================================
|
|
;
|
|
; ($107) Version
|
|
;
|
|
;=========================================================================
|
|
|
|
_Version START
|
|
_Version name
|
|
|
|
lda cmdNum
|
|
and #$40
|
|
beq orca_1
|
|
lda pCount
|
|
cmp #1
|
|
beq orca_1
|
|
lda #4
|
|
jmp GSOSReturn
|
|
|
|
orca_1 ldy #2
|
|
lda #$2020
|
|
sta [pBlock],y
|
|
lda #$3032 ;version (3031 = 1.0) (3032 = 2.0)
|
|
sta [pBlock]
|
|
lda #0
|
|
jmp GSOSReturn
|
|
|
|
END
|
|
|
|
;=========================================================================
|
|
;
|
|
; ($108) Read_Indexed
|
|
;
|
|
;=========================================================================
|
|
|
|
_Read_Indexed START
|
|
_Read_Indexed name
|
|
|
|
var_name equ 0
|
|
value equ 4
|
|
index equ 8
|
|
PBexport equ $A
|
|
|
|
var equ shellLoc+0
|
|
vn_tmp equ shellLoc+4
|
|
|
|
ldy #index ;$
|
|
lda [pBlock],y ;$
|
|
pha ;$
|
|
jsl indexvar
|
|
stx var+2
|
|
sta var
|
|
|
|
lda cmdNum
|
|
and #$40
|
|
beq orca_1
|
|
lda pCount
|
|
cmp #4
|
|
beq orca_2
|
|
lda #4
|
|
jmp GSOSReturn
|
|
orca_2 anop
|
|
ldy #2
|
|
lda var
|
|
ora var+2
|
|
bne orca21
|
|
jmp nomore
|
|
orca21 anop
|
|
ldy #12 ; copy the export flag
|
|
lda [var],y ; to the parameter block
|
|
ldy #PBexport
|
|
sta [pBlock],y
|
|
|
|
ldy #4+2
|
|
lda [var],y
|
|
pha
|
|
dey2
|
|
lda [var],y
|
|
pha
|
|
ldy #var_name+2 ;$
|
|
lda [pBlock],y ;$
|
|
pha ;$
|
|
lda [pBlock] ;$
|
|
pha ;$
|
|
jsl copyc2res
|
|
ldy #8+2
|
|
lda [var],y
|
|
pha
|
|
dey2
|
|
lda [var],y
|
|
pha
|
|
ldy #value+2 ;$
|
|
lda [pBlock],y ;$
|
|
pha ;$
|
|
ldy #value ;$
|
|
lda [pBlock],y ;$
|
|
pha ;$
|
|
jsl copyc2res
|
|
lda #0
|
|
jmp GSOSReturn
|
|
|
|
orca_1 anop
|
|
ldy #0
|
|
lda var
|
|
ora var+2
|
|
beq nomore
|
|
|
|
ldy #4+2
|
|
lda [var],y
|
|
pha
|
|
dey2
|
|
lda [var],y
|
|
pha
|
|
ldy #var_name+2 ;$
|
|
lda [pBlock],y ;$
|
|
pha ;$
|
|
lda [pBlock] ;$
|
|
pha ;$
|
|
jsl c2pstr
|
|
ldy #8+2
|
|
lda [var],y
|
|
pha
|
|
dey2
|
|
lda [var],y
|
|
pha
|
|
ldy #value+2 ;$
|
|
lda [pBlock],y ;$
|
|
pha ;$
|
|
ldy #value ;$
|
|
lda [pBlock],y ;$
|
|
pha ;$
|
|
jsl c2pstr
|
|
lda #0
|
|
jmp GSOSReturn
|
|
|
|
nomore phy
|
|
ldy #var_name+2 ;$
|
|
lda [pBlock],y ;$
|
|
sta vn_tmp+2 ;$
|
|
lda [pBlock] ;$
|
|
sta vn_tmp ;$
|
|
ldy #value+2
|
|
lda [pBlock],y
|
|
sta var+2
|
|
ldy #value
|
|
lda [pBlock],y
|
|
sta var
|
|
ply
|
|
lda #0
|
|
sta [vn_tmp],y
|
|
sta [var],y
|
|
jmp GSOSReturn
|
|
|
|
END
|
|
|
|
;=========================================================================
|
|
;
|
|
; ($109) Init_Wildcard
|
|
;
|
|
;=========================================================================
|
|
|
|
_Init_Wildcard START
|
|
_Init_Wildcard name
|
|
using globals
|
|
using KernelStruct
|
|
|
|
wildcard equ 0
|
|
iw_flags equ 4 ;I'm ignoring the flags (no prompting)
|
|
|
|
tbl equ shellLoc
|
|
ptr equ shellLoc+4
|
|
w_file equ shellLoc+8
|
|
w_dirpath equ shellLoc+12
|
|
w_pfx equ shellLoc+16
|
|
|
|
; DebugStr #debug
|
|
|
|
lda cmdNum
|
|
and #$40
|
|
beq orca_1
|
|
lda pCount
|
|
cmp #2
|
|
beq orca_2
|
|
lda #4
|
|
jmp GSOSReturn
|
|
orca_2 anop
|
|
ldy #wildcard+2
|
|
lda [pBlock],y
|
|
sta w_file+2
|
|
lda [pBlock]
|
|
sta w_file
|
|
lda [w_file]
|
|
inc a
|
|
inc a ; add two to get length of ds
|
|
pea 0
|
|
pha ; make a copy of the gs string
|
|
jsl ~NEW
|
|
pei (w_file+2)
|
|
pei (w_file)
|
|
stx w_file+2
|
|
sta w_file
|
|
phx
|
|
pha
|
|
jsl copygsstr
|
|
bra common
|
|
orca_1 anop
|
|
ldy #wildcard+2
|
|
lda [pBlock],y
|
|
sta w_file+2
|
|
pha ; push addr of p string for
|
|
lda [pBlock]
|
|
sta w_file
|
|
pha ; use later (by copy)
|
|
pea 0
|
|
lda [w_file] ; get length
|
|
and #$ff
|
|
inc a
|
|
inc a ; add two to get length of gs string
|
|
pha
|
|
jsl ~NEW
|
|
stx w_file+2
|
|
sta w_file
|
|
phx
|
|
pha
|
|
jsl copyp2gs ; convert to a GS string
|
|
|
|
common anop
|
|
stz WC_PathBuf
|
|
stz WC_Patt
|
|
lda [w_file]
|
|
; and #$FF
|
|
jeq done
|
|
;
|
|
; Find last separator and separate the file pattern from the path
|
|
;
|
|
tay
|
|
iny
|
|
strippat lda [w_file],y
|
|
and #$FF
|
|
cmp #':'
|
|
beq gotpat
|
|
cmp #'/'
|
|
beq gotpat
|
|
dey
|
|
cpy #1
|
|
bne strippat
|
|
;
|
|
; No path, so grab the current prefix
|
|
;
|
|
; Copy the pointer to prefix 0 straight out of the process structure
|
|
|
|
phy
|
|
ldx curProcInd
|
|
lda prefixh,x
|
|
sta w_pfx
|
|
lda prefixh+2,x
|
|
sta w_pfx+2
|
|
ldy #4
|
|
lda [w_pfx],y
|
|
sta WC_PathPtr
|
|
sta w_dirpath
|
|
ldy #6
|
|
lda [w_pfx],y
|
|
sta WC_PathPtr+2
|
|
sta w_dirpath+2
|
|
ply
|
|
bra gotpat2
|
|
;
|
|
; Copy the path and pattern
|
|
;
|
|
gotpat ld4 WC_PathBuf,(WC_PathPtr,w_dirpath)
|
|
gotpat2 sty tmp
|
|
ldx #0
|
|
iny
|
|
lda [w_file]
|
|
beq copiedpat
|
|
inc a ; +1, because y is postindexed
|
|
sta chk+1
|
|
short m
|
|
copypat anop
|
|
lda [w_file],y
|
|
cmp #'='
|
|
bne putpat
|
|
lda #'*'
|
|
putpat sta WC_Patt,x
|
|
inx
|
|
iny
|
|
chk cpy #0
|
|
bcc copypat
|
|
beq copypat
|
|
copiedpat lda #0
|
|
sta WC_Patt,x
|
|
ldx tmp
|
|
dex ; argh! this is nasty!
|
|
beq copiedpath
|
|
ldy #2
|
|
copypath lda [w_file],y
|
|
sta WC_PathBuf,y
|
|
iny
|
|
dex
|
|
bne copypath
|
|
copiedpath dey
|
|
dey
|
|
sty WC_PathBuf
|
|
long ai
|
|
|
|
;
|
|
; Expand the device
|
|
;
|
|
; lda tmp ;skip this
|
|
; beq fixGSOS
|
|
; ExpandDevices ExpParm
|
|
; jcs err
|
|
|
|
;fixGSOS lda WC_PathBuf
|
|
; xba
|
|
; sta WC_PathBuf
|
|
|
|
Open WC_OpenParms
|
|
jcs err
|
|
mv2 WC_OpenRef,(GDERef,CloseRef)
|
|
stz GDEbase
|
|
stz GDEdisp
|
|
ld2 6,GDEParm
|
|
GetDirEntry GDEParm
|
|
jcs err
|
|
pea 0
|
|
lda GDEentry
|
|
inc a
|
|
asl2 a
|
|
pha
|
|
jsl ~NEW
|
|
sta tbl
|
|
stx tbl+2
|
|
|
|
stz tbloff ; initialize offset to zero
|
|
ldx GDEentry
|
|
bne itsAlright
|
|
jmp nofiles ; there are no files in this directory!
|
|
|
|
itsAlright ldy #0
|
|
tya
|
|
clrtbl sta [tbl],y
|
|
iny2
|
|
sta [tbl],y
|
|
iny2
|
|
dex
|
|
bne clrtbl
|
|
|
|
ld2 5,GDEParm
|
|
ld2 1,(GDEbase,GDEdisp)
|
|
searchloop GetDirEntry GDEParm
|
|
jcs GDEerr
|
|
ldy buf
|
|
lda #0
|
|
sta buf+2,y
|
|
; WriteCString #buf+2
|
|
; WriteChar #13
|
|
; WriteChar #10
|
|
; WriteCString #WC_Patt
|
|
; WriteChar #13
|
|
; WriteChar #10
|
|
ph4 #WC_Patt
|
|
ph4 #buf+2
|
|
ph2 #0 ; case insensitive
|
|
jsl RegExp
|
|
cmp #0
|
|
beq searchloop
|
|
; WriteChar #10
|
|
|
|
* allocate space for the file/pathname. If bit 0 of flags is set, only
|
|
* use the filename, otherwise include the whole pathname.
|
|
|
|
ldy #iw_flags
|
|
lda [pBlock],y
|
|
and #1
|
|
bne fnameonly
|
|
pea 0
|
|
lda buf
|
|
inc a
|
|
inc a
|
|
clc
|
|
adc [w_dirpath] ; pointer to directory entry
|
|
pha
|
|
jsl ~NEW
|
|
sta ptr
|
|
stx ptr+2
|
|
ph4 WC_PathPtr
|
|
ph4 ptr
|
|
jsl copygsstr
|
|
ph4 #buf
|
|
ph4 ptr
|
|
jsl gsstrcat
|
|
bra commonptr
|
|
|
|
fnameonly pea 0
|
|
lda buf
|
|
inc a
|
|
inc a
|
|
pha
|
|
|
|
jsl ~NEW
|
|
sta ptr
|
|
stx ptr+2
|
|
ph4 #buf
|
|
ph4 ptr
|
|
jsl copygsstr
|
|
|
|
commonptr ldy tbloff
|
|
lda ptr
|
|
sta [tbl],y
|
|
iny2
|
|
lda ptr+2
|
|
sta [tbl],y
|
|
iny2
|
|
sty tbloff
|
|
|
|
jmp searchloop
|
|
|
|
GDEerr cmp #$61 ;End of directory?
|
|
bne err
|
|
nofiles ldy tbloff
|
|
lda #0
|
|
sta [tbl],y
|
|
iny2
|
|
sta [tbl],y
|
|
Close CloseParm
|
|
;
|
|
; do we need to delete the old table
|
|
;
|
|
lda truepid
|
|
asl2 a
|
|
tax
|
|
lda WCtbl,x
|
|
ora WCtbl+2,x
|
|
beq settbl
|
|
;
|
|
; delete old table
|
|
;
|
|
lda WCtbl,x
|
|
sta ptr
|
|
lda WCtbl+2,x
|
|
sta ptr+2
|
|
ldy #0
|
|
clrit lda [ptr],y
|
|
tax
|
|
iny2
|
|
lda [ptr],y
|
|
iny2
|
|
cmp #0
|
|
bne disp
|
|
cpx #0
|
|
beq nodisp
|
|
disp phy
|
|
pha
|
|
phx
|
|
jsl ~NDISPOSE
|
|
ply
|
|
bra clrit
|
|
nodisp pei (ptr+2)
|
|
pei (ptr)
|
|
jsl ~NDISPOSE
|
|
|
|
settbl lda truepid
|
|
asl a
|
|
tax
|
|
asl a
|
|
tay
|
|
lda #0
|
|
sta WCidx,x
|
|
lda tbl
|
|
sta WCtbl,y
|
|
lda tbl+2
|
|
sta WCtbl+2,y
|
|
|
|
done lda #0
|
|
err pha
|
|
pei (w_file+2)
|
|
pei (w_file)
|
|
jsl ~NDISPOSE
|
|
pla
|
|
jmp GSOSReturn
|
|
|
|
tmp ds 2
|
|
|
|
tbloff ds 2
|
|
|
|
CloseParm dc i'1'
|
|
CloseRef ds 2
|
|
|
|
GDEParm dc i'6'
|
|
GDERef ds 2
|
|
ds 2
|
|
GDEbase dc i'1'
|
|
GDEdisp dc i'1'
|
|
dc a4'GDBuf'
|
|
GDEentry ds 2
|
|
|
|
GDBuf dc i'67'
|
|
buf ds 65
|
|
|
|
WC_PathBuf ds 129
|
|
WC_Patt ds 40
|
|
|
|
|
|
WC_OpenParms dc i'2'
|
|
WC_OpenRef ds 2
|
|
WC_PathPtr ds 4
|
|
|
|
;debug str 'init_wilcard'
|
|
|
|
END
|
|
|
|
globals DATA
|
|
|
|
WCidx dc 32i2'0'
|
|
WCtbl dc 32i4'0'
|
|
|
|
END
|
|
|
|
;=========================================================================
|
|
;
|
|
; ($10A) Next_Wildcard
|
|
;
|
|
;=========================================================================
|
|
|
|
_Next_Wildcard START
|
|
_Next_Wildcard name
|
|
using globals
|
|
using KernelStruct
|
|
|
|
PBnextfile equ 0
|
|
|
|
tbl equ shellLoc
|
|
ptr equ shellLoc+4
|
|
nextfile equ shellLoc+8
|
|
|
|
ldy #PBnextfile+2 ;$
|
|
lda [pBlock],y ;$
|
|
sta nextfile+2 ;$
|
|
lda [pBlock] ;$
|
|
sta nextfile ;$
|
|
lda truepid
|
|
asl a
|
|
tay
|
|
asl a
|
|
tax
|
|
lda WCtbl,x
|
|
sta tbl
|
|
lda WCtbl+2,x
|
|
sta tbl+2
|
|
ora tbl
|
|
bne alloced
|
|
jmp erruer
|
|
alloced tyx
|
|
lda WCidx,x
|
|
tay
|
|
lda [tbl],y
|
|
iny2
|
|
ora [tbl],y
|
|
bne stillmore
|
|
jmp erruer
|
|
stillmore anop
|
|
iny2
|
|
tya
|
|
sta WCidx,x
|
|
dey2
|
|
dey2
|
|
lda [tbl],y
|
|
sta ptr
|
|
iny2
|
|
lda [tbl],y
|
|
sta ptr+2
|
|
|
|
* insert nextfile/nextfileGS check here
|
|
lda cmdNum
|
|
and #$40
|
|
beq orca_1
|
|
lda pCount
|
|
cmp #13
|
|
bcs badpcount
|
|
cmp #0
|
|
bne orca_2
|
|
badpcount lda #4
|
|
jmp GSOSReturn
|
|
orca_2 anop
|
|
ph4 ptr
|
|
ph4 nextfile
|
|
jsl copygs2res
|
|
lda ptr
|
|
ldy #PBnextfile
|
|
sta [pBlock],y
|
|
lda ptr+2
|
|
ldy #PBnextfile+2
|
|
sta [pBlock],y
|
|
lda pCount
|
|
cmp #1
|
|
bne doGFI
|
|
lda #0
|
|
bra doneNW
|
|
doGFI lda pBlock
|
|
sec
|
|
sbc #2
|
|
tax
|
|
lda pBlock+2
|
|
sbc #0
|
|
pha
|
|
phx
|
|
pea $2006 ; GetFileInfoGS
|
|
jsl $E100B0 ; GS/OS stack entry point
|
|
doneNW pha
|
|
lda nextfile
|
|
ldy #PBnextfile
|
|
sta [pBlock],y
|
|
lda nextfile+2
|
|
ldy #PBnextfile+2
|
|
sta [pBlock],y
|
|
pla
|
|
jmp GSOSReturn
|
|
|
|
* Copy the GSString to a PString in the form required by Next_Wildcard
|
|
* (the old P16 version), converting :'s to /'s along the way
|
|
|
|
orca_1 lda [ptr] ; copy a GS string
|
|
sta [nextfile] ; to the P-string output buffer
|
|
tay
|
|
iny
|
|
short a
|
|
copy lda [ptr],y
|
|
dey
|
|
cmp #':'
|
|
bne nocolon
|
|
lda #'/'
|
|
nocolon sta [nextfile],y
|
|
cpy #1
|
|
bne copy
|
|
long a
|
|
lda #0
|
|
jmp GSOSReturn
|
|
|
|
erruer anop
|
|
lda cmdNum
|
|
and #$40
|
|
beq orca_1a
|
|
ldy #2
|
|
lda #0
|
|
sta [nextfile],y
|
|
jmp GSOSReturn
|
|
orca_1a lda #0
|
|
short m
|
|
sta [nextfile]
|
|
long m
|
|
jmp GSOSReturn
|
|
|
|
END
|
|
|
|
;=========================================================================
|
|
;
|
|
; ($10B) Read_Variable
|
|
;
|
|
;=========================================================================
|
|
|
|
_Read_Variable START
|
|
_Read_Variable name
|
|
PBvar_name equ 0
|
|
PBvalue equ 4
|
|
PBexport equ 8
|
|
|
|
var_name equ shellLoc+0
|
|
value equ shellLoc+4
|
|
var equ shellLoc+8
|
|
|
|
lda cmdNum
|
|
and #$40 ;If bit $40 then c strings
|
|
beq orca_1
|
|
lda pCount
|
|
cmp #3
|
|
beq orca_2
|
|
lda #4
|
|
jmp GSOSReturn
|
|
|
|
orca_2 anop
|
|
ldy #PBvar_name+2 ;$
|
|
lda [pBlock],y ;$
|
|
pha ;$
|
|
lda [pBlock] ;$
|
|
pha ;$
|
|
jsl gs2cstr
|
|
phx
|
|
pha
|
|
phx
|
|
pha
|
|
jsl readvarrec
|
|
sta var
|
|
stx var+2
|
|
jsl ~NDISPOSE ; get rid of the temp C string
|
|
|
|
ldy #PBvalue+2 ;$
|
|
lda [pBlock],y ;$
|
|
sta value+2 ;$
|
|
ldy #PBvalue ;$
|
|
lda [pBlock],y ;$
|
|
sta value ;$
|
|
|
|
lda var
|
|
ora var+2
|
|
beq novar2
|
|
|
|
ldy #8
|
|
lda [var],y
|
|
sta var_name
|
|
ldy #10
|
|
lda [var],y
|
|
sta var_name+2
|
|
|
|
pei (var_name+2)
|
|
pei (var_name)
|
|
ph4 value
|
|
jsl copyc2res
|
|
ldy #12
|
|
lda [var],y
|
|
ldy #PBexport
|
|
sta [pBlock],y
|
|
lda #0
|
|
jmp GSOSReturn
|
|
novar2 anop
|
|
ldy #2
|
|
lda #0
|
|
sta [value],y
|
|
jmp GSOSReturn
|
|
|
|
orca_1 anop
|
|
; pei (var_name+2)
|
|
; pei (var_name)
|
|
ldy #PBvalue+2 ;$
|
|
lda [pBlock],y ;$
|
|
sta value+2 ;$
|
|
ldy #PBvalue ;$
|
|
lda [pBlock],y ;$
|
|
sta value ;$
|
|
|
|
ldy #PBvar_name+2 ;$
|
|
lda [pBlock],y ;$
|
|
pha ;$
|
|
lda [pBlock] ;$
|
|
pha ;$
|
|
jsl p2cstr
|
|
phx
|
|
pha
|
|
phx
|
|
pha
|
|
jsl readvar
|
|
sta var_name
|
|
stx var_name+2
|
|
jsl ~NDISPOSE
|
|
lda var_name
|
|
ora var_name+2
|
|
beq novar
|
|
|
|
pei (var_name+2)
|
|
pei (var_name)
|
|
pei (value+2)
|
|
pei (value)
|
|
jsl c2pstr
|
|
|
|
lda #0
|
|
jmp GSOSReturn
|
|
|
|
novar anop
|
|
lda #0
|
|
sta [value]
|
|
jmp GSOSReturn
|
|
|
|
END
|
|
|
|
;=========================================================================
|
|
;
|
|
; ($10D) Execute
|
|
;
|
|
;=========================================================================
|
|
|
|
_Execute START
|
|
_Execute name
|
|
using KernelStruct
|
|
|
|
lda cmdNum
|
|
and #$40
|
|
beq orca_1
|
|
lda pCount
|
|
cmp #2
|
|
beq orca_1
|
|
lda #4
|
|
jmp GSOSReturn
|
|
|
|
orca_1 jsl decBusy
|
|
; jsr decMutex
|
|
|
|
ldx curProcInd
|
|
lda executeHook,x
|
|
ora executeHook+2,x
|
|
bne validHook
|
|
lda #26
|
|
jsl incBusy
|
|
; jsr incMutex
|
|
jmp GSOSReturn
|
|
validHook anop
|
|
lda [pBlock]
|
|
bne nonewvar
|
|
PushVariables 0
|
|
nonewvar ldy #4
|
|
lda [pBlock],y
|
|
pha
|
|
dey2
|
|
lda [pBlock],y
|
|
pha
|
|
push3 #returnadr-1
|
|
ldx curProcInd
|
|
lda executeHook+2,x
|
|
short m
|
|
pha
|
|
long m
|
|
lda executeHook,x
|
|
dec a
|
|
pha
|
|
rtl ; jump to the routine
|
|
returnadr anop
|
|
pha
|
|
lda [pBlock]
|
|
bne nokillvar
|
|
PopVariables 0
|
|
nokillvar anop
|
|
jsl incBusy
|
|
pla
|
|
jmp GSOSReturn
|
|
|
|
END
|
|
|
|
;=========================================================================
|
|
;
|
|
; ($10E) FastFile
|
|
;
|
|
;=========================================================================
|
|
; fastfile.c does all the work
|
|
|
|
_FastFile START
|
|
_FastFile name
|
|
|
|
ph2 pCount
|
|
lda cmdNum
|
|
and #$40
|
|
pha ; osFlag (0 = P16, !0 = GSOS)
|
|
ph4 pBlock ; pointer to pBlock
|
|
jsl fastEntry ; har!
|
|
jmp GSOSReturn
|
|
END
|
|
|
|
;=========================================================================
|
|
;
|
|
; ($10F) Direction
|
|
;
|
|
;=========================================================================
|
|
|
|
_Direction START
|
|
_Direction name
|
|
using KernelStruct
|
|
using TextToolsInfo
|
|
|
|
lda cmdNum
|
|
and #$40
|
|
beq orca_1
|
|
lda pCount
|
|
cmp #2
|
|
beq orca_1
|
|
lda #4
|
|
jmp GSOSReturn
|
|
|
|
* redirection mapping
|
|
* 0,1 = none 0
|
|
* unless xxSlot != kernelStruct.ttyID, which is 1 (.printer)
|
|
* 2 = none 0 (no Orca-based redirection)
|
|
* 3 = disk 2
|
|
* 4 = pipe 2
|
|
* any others are 1 (generalized communication)
|
|
|
|
orca_1 lda [pBlock]
|
|
cmp #3
|
|
bcc noerr
|
|
lda #$53
|
|
jmp GSOSReturn ; Parameter out of range
|
|
noerr anop
|
|
lda truepid
|
|
asl a
|
|
asl a
|
|
asl a
|
|
asl a
|
|
asl a
|
|
asl a
|
|
pha
|
|
lda [pBlock]
|
|
asl a
|
|
clc
|
|
adc 1,s
|
|
tax
|
|
lda InDeviceType,x
|
|
cmp #2
|
|
bcc Rconsole
|
|
beq Rram
|
|
cmp #3
|
|
beq Rdisk
|
|
cmp #4
|
|
beq Rdisk
|
|
Rcomm ldy #2
|
|
lda #1
|
|
sta [pBlock],y
|
|
pla
|
|
lda #0
|
|
jmp GSOSReturn
|
|
Rram ldy #2
|
|
lda #0
|
|
sta [pBlock],y
|
|
pla
|
|
lda #0
|
|
jmp GSOSReturn
|
|
Rdisk ldy #2
|
|
lda #2
|
|
sta [pBlock],y
|
|
pla
|
|
lda #0
|
|
jmp GSOSReturn
|
|
Rconsole lda [pBlock]
|
|
asl a
|
|
asl a
|
|
clc
|
|
adc 1,s
|
|
tax
|
|
lda InSlot,x
|
|
ldx curProcInd
|
|
cmp ttyID,x
|
|
beq Rram ; no redirection
|
|
bra Rcomm
|
|
END
|
|
|
|
;=========================================================================
|
|
;
|
|
; ($110) Redirect
|
|
;
|
|
;=========================================================================
|
|
|
|
_Redirect START
|
|
_Redirect name
|
|
|
|
using KernelStruct
|
|
using TextToolsInfo
|
|
PBdevice equ 0
|
|
PBappend equ 2
|
|
PBfile equ 4
|
|
|
|
file equ shellLoc+0
|
|
|
|
lda cmdNum
|
|
and #$40
|
|
beq orca_1
|
|
lda pCount
|
|
cmp #3
|
|
beq orca_2
|
|
lda #4
|
|
jmp GSOSReturn
|
|
orca_2 ldy #PBfile+2
|
|
lda [pBlock],y
|
|
sta CRpathname+2
|
|
ldy #PBfile
|
|
lda [pBlock],y
|
|
sta CRpathname
|
|
mv4 CRpathname,(OPENpathname,destPathname)
|
|
bra redirectCom
|
|
|
|
orca_1 ldy #PBfile+2 ;$
|
|
lda [pBlock],y ;$
|
|
sta file+2 ;$
|
|
ldy #PBfile ;$
|
|
lda [pBlock],y ;$
|
|
sta file ;$
|
|
|
|
lda [file]
|
|
and #$00ff
|
|
cmp #65
|
|
bcc strokay
|
|
lda #$0053 ; oops- decimal error #s are boo-boo
|
|
jmp GSOSReturn
|
|
strokay ph4 file ; convert thingy to a GS string
|
|
ph4 #gspath+1
|
|
jsl copypstr
|
|
lda gspath+1
|
|
and #$00FF
|
|
sta gspath
|
|
ld4 gspath,(CRpathname,OPENpathname,destPathname)
|
|
redirectCom anop
|
|
; lda device
|
|
lda [pBlock] ;$
|
|
beq doOpen
|
|
; lda append
|
|
ldy #PBappend
|
|
lda [pBlock],y ;$
|
|
bne doOpen
|
|
doCreate anop
|
|
Create CRparm
|
|
bcc doOpen
|
|
cmp #$47 ; duplicate pathname?
|
|
beq delFile
|
|
cmp #$58
|
|
beq doOpen ; not a block device- Char device
|
|
jmp GSOSReturn
|
|
delFile Destroy destParm
|
|
bcc doCreate
|
|
jmp GSOSReturn
|
|
doOpen anop
|
|
ldx #1 ;$
|
|
; lda device
|
|
lda [pBlock] ;$
|
|
beq storeAccess
|
|
ldx #2 ;$
|
|
storeAccess stx OPENreqAccess ;$
|
|
lda [pBlock] ; get 'device' parameter
|
|
inc a ; I/O channel before we open
|
|
sta CLOSEparm+2
|
|
Close CLOSEparm ; the new one.
|
|
bcs openError1
|
|
Open OPENParm
|
|
bcc okay
|
|
openError1 jmp GSOSReturn ; error if >> on nonexistent file
|
|
okay anop
|
|
; lda append ; move mark to eof?
|
|
ldy #PBappend ;$ move mark to eof?
|
|
lda [pBlock],y ;$
|
|
beq noAppend
|
|
lda OPENrefNum
|
|
sta EOFref
|
|
sta MARKref
|
|
GetEOF EOFpb
|
|
bcs nonOkey
|
|
movelong EOFeof,MARKdisp
|
|
SetMark MARKpb
|
|
bcs nonOkey
|
|
bra noAppend
|
|
EOFpb dc i2'2'
|
|
EOFref dc i2'0'
|
|
EOFeof dc i4'0'
|
|
MARKpb dc i2'3'
|
|
MARKref dc i2'0'
|
|
MARKbase dc i2'0'
|
|
MARKdisp dc i4'0'
|
|
|
|
noAppend anop
|
|
pea $3 ; file redirection
|
|
pea $0
|
|
ph2 OPENrefNum
|
|
lda #$0F
|
|
clc
|
|
; adc device
|
|
adc [pBlock] ;$
|
|
xba
|
|
ora #$0C
|
|
tax
|
|
jsl $E10000 ; make the tool call
|
|
lda #0
|
|
nonOkey jmp GSOSReturn
|
|
|
|
gspath ds 66
|
|
CRparm dc i2'4'
|
|
CRpathname dc i4'gspath'
|
|
dc i2'$C3'
|
|
dc i2'$04'
|
|
dc i4'0'
|
|
destParm dc i2'1'
|
|
destPathname dc i4'gspath'
|
|
OPENParm dc i2'3'
|
|
OPENrefNum dc i2'0'
|
|
OPENpathname dc i4'gspath'
|
|
OPENreqAccess dc i2'0'
|
|
CLOSEparm dc i2'1'
|
|
dc i2'0'
|
|
END
|
|
|
|
;=========================================================================
|
|
;
|
|
; ($113) Stop
|
|
;
|
|
;=========================================================================
|
|
|
|
|
|
_Stop START
|
|
_Stop name
|
|
using KernelStruct
|
|
|
|
lda cmdNum
|
|
and #$40
|
|
beq orca_1
|
|
lda pCount
|
|
cmp #1
|
|
beq orca_1
|
|
lda #4
|
|
jmp GSOSReturn
|
|
|
|
orca_1 lda >truepid
|
|
asl a
|
|
tax
|
|
lda StopFlags,x
|
|
sta [pBlock]
|
|
jmp GSOSReturn
|
|
StopFlags ENTRY
|
|
dc 32i2'0'
|
|
END
|
|
|
|
;=========================================================================
|
|
;
|
|
; ($114) ExpandDevices
|
|
;
|
|
;=========================================================================
|
|
|
|
_ExpandDevices START
|
|
_ExpandDevices name
|
|
PBpathname equ 0
|
|
PBoutname equ 4
|
|
|
|
pathname equ shellLoc+0
|
|
|
|
lda cmdNum
|
|
and #$40
|
|
beq orca_1
|
|
ldy #PBpathname+2
|
|
lda [pBlock],y
|
|
sta inputPath+2
|
|
lda [pBlock]
|
|
sta inputPath
|
|
ldy #PBoutname+2
|
|
lda [pBlock],y
|
|
sta outputPath+2
|
|
ldy #PBoutname
|
|
lda [pBlock],y
|
|
sta outputPath
|
|
ExpandPath epParm
|
|
jmp GSOSReturn
|
|
|
|
orca_1 anop
|
|
ldy #PBpathname+2 ;$
|
|
lda [pBlock],y ;$
|
|
sta pathname+2 ;$
|
|
lda [pBlock] ;$
|
|
sta pathname ;$
|
|
|
|
lda [pathname]
|
|
and #$00FF
|
|
tay
|
|
sta inputbuf
|
|
beq nocopy1
|
|
short m
|
|
loop1 lda [pathname],y
|
|
sta inputbuf+1,y
|
|
dey
|
|
bne loop1
|
|
nocopy1 long m
|
|
ld4 inputbuf,inputPath
|
|
ld4 outputbuf,outputPath
|
|
|
|
ExpandPath epParm
|
|
bcs error
|
|
|
|
lda outputbuf+2
|
|
and #$00ff
|
|
tay
|
|
sta [pathname]
|
|
beq nocopy2
|
|
short a
|
|
loop2 lda outputbuf+3,y
|
|
sta [pathname],y
|
|
dey
|
|
bne loop2
|
|
nocopy2 long a
|
|
lda #0
|
|
error anop
|
|
jmp GSOSReturn
|
|
|
|
|
|
epParm anop
|
|
dc i2'3'
|
|
inputPath dc i4'inputbuf'
|
|
outputPath dc i4'outputbuf'
|
|
ed_flags dc i2'0'
|
|
inputbuf ds 66
|
|
outputbuf dc i2'68'
|
|
ds 66
|
|
END
|
|
|
|
;=========================================================================
|
|
;
|
|
; ($115) UnsetVariable
|
|
;
|
|
;=========================================================================
|
|
|
|
_UnsetVariable START
|
|
_UnsetVariable name
|
|
|
|
PBname equ 0
|
|
name equ shellLoc+0
|
|
|
|
lda cmdNum
|
|
and #$40
|
|
beq orca_1
|
|
|
|
orca_2 anop
|
|
ldy #PBname+2 ;$
|
|
lda [pBlock],y ;$
|
|
pha ;$
|
|
lda [pBlock] ;$
|
|
pha ;$
|
|
jsl gs2cstr
|
|
sta name
|
|
stx name+2
|
|
bra orca_com
|
|
|
|
orca_1 anop
|
|
ldy #PBname+2 ;$
|
|
lda [pBlock],y ;$
|
|
pha ;$
|
|
lda [pBlock] ;$
|
|
pha ;$
|
|
|
|
jsl p2cstr
|
|
sta name
|
|
stx name+2
|
|
orca_com anop
|
|
pei (name+2)
|
|
pei (name)
|
|
jsl unsetvar
|
|
pei (name+2)
|
|
pei (name)
|
|
jsl ~NDISPOSE
|
|
lda #0
|
|
jmp GSOSReturn
|
|
|
|
END
|
|
|
|
;=========================================================================
|
|
;
|
|
; ($116) Export
|
|
;
|
|
;=========================================================================
|
|
|
|
_Export START
|
|
_Export name
|
|
|
|
PBname equ 0
|
|
PBflags equ 4
|
|
|
|
name equ shellLoc+0
|
|
|
|
lda cmdNum
|
|
and #$40 ;If bit $40 then c strings
|
|
beq orca_1
|
|
lda pCount
|
|
cmp #2
|
|
beq orca_2
|
|
lda #4
|
|
jmp GSOSReturn
|
|
|
|
orca_2 anop
|
|
ldy #PBname+2 ;$
|
|
lda [pBlock],y ;$
|
|
pha ;$
|
|
lda [pBlock] ;$
|
|
pha ;$
|
|
jsl gs2cstr
|
|
sta name
|
|
stx name+2
|
|
bra orca_com
|
|
orca_1 anop
|
|
; pei (name+2)
|
|
; pei (name)
|
|
ldy #PBname+2 ;$
|
|
lda [pBlock],y ;$
|
|
pha ;$
|
|
lda [pBlock] ;$
|
|
pha ;$
|
|
jsl p2cstr
|
|
sta name
|
|
stx name+2
|
|
orca_com anop
|
|
pei (name+2)
|
|
pei (name)
|
|
; pei (flags)
|
|
ldy #PBflags ;$
|
|
lda [pBlock],y ;$
|
|
pha ;$
|
|
jsl exportvar
|
|
pei (name+2)
|
|
pei (name)
|
|
jsl ~NDISPOSE
|
|
lda #0
|
|
jmp GSOSReturn
|
|
|
|
END
|
|
|
|
;=========================================================================
|
|
;
|
|
; ($117) PopVariables
|
|
;
|
|
;=========================================================================
|
|
|
|
_PopVariables START
|
|
_PopVariables name
|
|
using KernelStruct
|
|
|
|
lda cmdNum
|
|
and #$40
|
|
beq orca_1
|
|
lda pCount
|
|
cmp #0
|
|
beq orca_1
|
|
lda #4
|
|
jmp GSOSReturn
|
|
|
|
orca_1 lda truepid
|
|
jsl popvartbl
|
|
|
|
lda #0
|
|
jmp GSOSReturn
|
|
|
|
END
|
|
|
|
;=========================================================================
|
|
;
|
|
; ($118) PushVariables
|
|
;
|
|
;=========================================================================
|
|
|
|
_PushVariables START
|
|
_PushVariables name
|
|
|
|
lda cmdNum
|
|
and #$40
|
|
beq orca_1
|
|
lda pCount
|
|
cmp #0
|
|
beq orca_1
|
|
lda #4
|
|
jmp GSOSReturn
|
|
|
|
orca_1 jsl initvar
|
|
|
|
lda #0
|
|
jmp GSOSReturn
|
|
|
|
END
|
|
|
|
;=========================================================================
|
|
;
|
|
; ($119) SetStopFlag
|
|
;
|
|
;=========================================================================
|
|
|
|
_SetStopFlag START
|
|
_SetStopFlag name
|
|
using KernelStruct
|
|
|
|
lda cmdNum
|
|
and #$40
|
|
beq orca_1
|
|
lda pCount
|
|
cmp #1
|
|
beq orca_1
|
|
lda #4
|
|
jmp GSOSReturn
|
|
|
|
orca_1 lda >truepid
|
|
asl a
|
|
tax
|
|
lda [pBlock]
|
|
sta StopFlags,x
|
|
jmp GSOSReturn
|
|
END
|
|
|
|
;=========================================================================
|
|
;
|
|
; ($11A) ConsoleOut
|
|
;
|
|
;=========================================================================
|
|
; does nothing if process is in the background (1/21/93 jb)
|
|
|
|
_ConsoleOut START
|
|
_ConsoleOut name
|
|
using KernelStruct
|
|
|
|
char equ 0
|
|
|
|
lda cmdNum
|
|
and #$40
|
|
beq orca_1
|
|
lda pCount
|
|
cmp #1
|
|
beq orca_1
|
|
lda #4
|
|
jmp GSOSReturn
|
|
|
|
orca_1 anop
|
|
jsr isBGProcess
|
|
bcs goaway
|
|
|
|
* Instead of calling the console's COUT, call down to the character device
|
|
* dispatcher with a write request.
|
|
|
|
jsl decBusy
|
|
pea 1
|
|
ph4 pBlock
|
|
ldx curProcInd
|
|
lda ttyID,x
|
|
; dec a don't need this since this is the actual
|
|
pha
|
|
jsl ttwrite value
|
|
jsl incBusy
|
|
|
|
goaway lda #0
|
|
jmp GSOSReturn
|
|
|
|
END
|
|
|
|
;=========================================================================
|
|
;
|
|
; ($11E) KeyPress
|
|
; New ORCA/Shell (2.0.1) call to see if input is pending, and if so
|
|
; what the input is.
|
|
; This routine is the compromise Mike W. and I worked out regarding
|
|
; directly accessing the keyboard from his compilers.
|
|
;
|
|
;=========================================================================
|
|
; Due to the fact that there's no way to 'unget' a character from
|
|
; a tty and that the only way to get the data this call wants is to
|
|
; read it via ioctl(FIONREAD) & read (which removes the char, making
|
|
; a subsequent _KeyRead work improperly), we have to peek at the
|
|
; console's input buffer directly to get our data. This is really icky,
|
|
; but we have sufficient checks to prevent the routine from snagging
|
|
; a foreground process' input.
|
|
|
|
_KeyPress START
|
|
_KeyPress name
|
|
using ADBData
|
|
using KernelStruct
|
|
|
|
key equ 0 key & mod. reg of keypress. Not valid
|
|
modifiers equ 2 if available == 0
|
|
available equ 4 == 1 if key avail, == 0 if not
|
|
|
|
lda cmdNum
|
|
and #$40
|
|
beq orca_1
|
|
lda pCount
|
|
cmp #3
|
|
beq orca_1
|
|
lda #4
|
|
jmp GSOSReturn
|
|
|
|
orca_1 anop
|
|
ldx curProcInd
|
|
lda ttyID,x
|
|
cmp #3 ; is controlling tty the console?
|
|
bne goaway ; leave w/o doing anything
|
|
|
|
jsr isBGProcess
|
|
bcs goaway ; ignore progs in the bg
|
|
|
|
php
|
|
sei ; temporarily shut off interrupts
|
|
lda >head ; if head == tail then there
|
|
cmp >tail ; is no data in the input buffer
|
|
beq noKeyWaiting
|
|
|
|
lda >tail ; get the character & modifiers
|
|
tax ; from the buffer, indexed by
|
|
lda keybuf,x
|
|
and #$00FF ; tail.
|
|
ldy #key ; store them in the parameter
|
|
sta [pBlock],y ; block after masking unneeded
|
|
lda modbuf,x ; portions out
|
|
and #$00FF
|
|
jsl ConvKMR2EM
|
|
ldy #modifiers
|
|
sta [pBlock],y
|
|
lda #1
|
|
ldy #available
|
|
sta [pBlock],y
|
|
|
|
plp ; restore interrupts
|
|
lda #0
|
|
jmp GSOSReturn
|
|
|
|
noKeyWaiting plp
|
|
goaway lda #0
|
|
ldy #available
|
|
sta [pBlock],y
|
|
lda #0
|
|
jmp GSOSReturn
|
|
|
|
END
|
|
|
|
;=========================================================================
|
|
;
|
|
; ($11F) ReadKey
|
|
; New ORCA/Shell (2.0.1) call to wait for an input character and
|
|
; return the key and modifiers in Event Manager format.
|
|
;
|
|
;=========================================================================
|
|
; ReadKey does a number of checks to maintain sanity. Currently, if the
|
|
; caller is in the BG no action occurs. If the process' controlling TTY
|
|
; is not the console, we do a ReadChar to get pause keys, at least (we
|
|
; can't get modifiers from a serial port!). If the tty is the console,
|
|
; we make a direct (fast) call to KEYIN in inout.asm
|
|
|
|
_ReadKey START
|
|
_ReadKey name
|
|
using KernelStruct
|
|
|
|
key equ 0 key & mod. reg of keypress. Not valid
|
|
modifiers equ 2 if available == 0
|
|
|
|
lda cmdNum
|
|
and #$40
|
|
beq orca_1
|
|
lda pCount
|
|
cmp #2 ; check the pCount
|
|
beq orca_1
|
|
lda #4
|
|
jmp GSOSReturn
|
|
|
|
orca_1 anop
|
|
jsr isBGProcess
|
|
bcs isbg
|
|
|
|
ldx curProcInd
|
|
lda ttyID,x
|
|
* cmp #3
|
|
* beq isConsole ; it's the console
|
|
|
|
pha ; do something sensible for non-console
|
|
pea 0
|
|
ldx #$220C ; TextTools/ReadChar
|
|
jsl $E10000
|
|
pla
|
|
and #$00FF
|
|
bra setKey
|
|
|
|
*isConsole anop
|
|
; phd
|
|
; lda InOutDP
|
|
; tcd
|
|
* jsl KEYIN
|
|
; pld
|
|
setKey pha
|
|
and #$00FF
|
|
|
|
ldy #key
|
|
sta [pBlock],y
|
|
pla
|
|
xba
|
|
and #$00FF
|
|
jsl ConvKMR2EM
|
|
ldy #modifiers
|
|
sta [pBlock],y
|
|
|
|
lda #0
|
|
jmp GSOSReturn
|
|
|
|
* We eventually might want to go ahead and suspend the background
|
|
* process for trying to read; this could be useful if some dork
|
|
* ever writes a program that uses these routines for input (God help
|
|
* us).
|
|
|
|
isbg lda #0
|
|
ldy #key
|
|
sta [pBlock],y
|
|
ldy #modifiers
|
|
sta [pBlock],y
|
|
|
|
* Convert the keyboard modifier reg. format to the Event Manager modifiers
|
|
* format.
|
|
|
|
ConvKMR2EM ENTRY
|
|
tay ; store the old value
|
|
ldx #0 ; initial modifier value
|
|
bit #%10000000 ; open apple?
|
|
beq x1
|
|
txa
|
|
ora #%0000000100000000
|
|
tax
|
|
x1 tya
|
|
bit #%01000000
|
|
beq x2
|
|
txa
|
|
ora #%0000100000000000
|
|
tax
|
|
x2 tya
|
|
bit #%00010000
|
|
beq x3
|
|
txa
|
|
ora #%0010000000000000
|
|
tax
|
|
x3 tya
|
|
bit #%00000100
|
|
beq x4
|
|
txa
|
|
ora #%0000010000000000
|
|
tax
|
|
x4 tya
|
|
bit #%00000010
|
|
beq x5
|
|
txa
|
|
ora #%0001000000000000
|
|
tax
|
|
x5 tya
|
|
bit #%00000001
|
|
beq xdone
|
|
txa
|
|
ora #%0000001000000000
|
|
tax
|
|
xdone txa
|
|
rtl
|
|
|
|
isBGProcess ENTRY
|
|
ldx curProcInd
|
|
lda ttyID,x
|
|
asl a
|
|
tax
|
|
lda ttyStruct,x
|
|
beq nopgrp
|
|
ldx curProcInd
|
|
cmp pgrp,x
|
|
beq nopgrp ; it's the foreground process
|
|
sec
|
|
rts
|
|
nopgrp clc
|
|
rts
|
|
END
|