home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Columbia Kermit
/
kermit.zip
/
archives
/
archimedes.tar.gz
/
archimedes.tar
/
arrs423.s
< prev
next >
Wrap
Text File
|
1993-05-01
|
7KB
|
328 lines
; (c) D.R.McAuley 1987
r0 RN 0
r1 RN 1
r2 RN 2
r3 RN 3
r4 RN 4
r5 RN 5
r6 RN 6
r7 RN 7
r8 RN 8
r9 RN 9
r10 RN 10
r11 RN 11
r12 RN 12
r13 RN 13
r14 RN 14
pc RN 15
ON * 1
OFF * 0
OutputToo * OFF ; ON means buffer output also OFF means ...
C_bit * &20000000
V_bit * &10000000
; Useful SWI numbers
OS_IntOn * 19
OS_IntOff * 20
OS_Claim * 31
OS_Release * 32
; Useful Vector numbers
ErrorV * &01
IrqV * &02
WrchV * &03
Rdch * &04
CliV * &05
ByteV * &06
WordV * &07
FileV * &08
ArgsV * &09
BGetV * &0A
BputV * &0B
GBPBV * &0C
OpenV * &0D
ReadlineV * &0E
FSCV * &0F
EventV * &10
INSV * &14
REMV * &15
CNPV * &16
UKVDU23V * &17
UKSWIV * &18
UKPLOTV * &19
MouveV * &1A
VDUXV * &1B
TickerV * &1C
UpcallV * &1D
; Buffer numbers
Keyboard * 0
RS423_In * 1
RS243_Out * 2
IMPORT |_rsinsertinn|
IMPORT |_rsremoveinn|
IMPORT |_rscountnpinn|
IMPORT |_rsinsertout|
IMPORT |_rsremoveout|
IMPORT |_rscountnpout|
IMPORT |_kbinsertinn|
IMPORT |_kbremoveinn|
IMPORT |_kbcountnpinn|
AREA |C$$code|, CODE, READONLY
|v$codeseg|
; intercept the appropriate system vectors
; r2 is a dummy work space pointer
rsintercept
SWI OS_IntOff ; Disable Interrupts
MOV r2, #0
MOV r0, #INSV
ADR r1, vecinsert
SWI OS_Claim ; Claim vector
MOV r0, #REMV
ADR r1, vecremove
SWI OS_Claim ; Claim vector
MOV r0, #CNPV
ADR r1, veccountnp
SWI OS_Claim ; Claim vector
SWI OS_IntOn ; Enable Interrupts
MOV pc, r14
; release the claims we have on system interrupts
; r2 is a dummy work space pointer
rsrelease
SWI OS_IntOff ; Disable Interrupts
MOV r2,#0
MOV r0, #INSV
ADR r1, vecinsert
SWI OS_Release ; Release vector
MOV r0, #REMV
ADR r1, vecremove
SWI OS_Release ; Release vector
MOV r0, #CNPV
ADR r1, veccountnp
SWI OS_Release ; Release vector
SWI OS_IntOn ; Enable Interrupts
MOV pc, r14
; intercept the appropriate system vectors
; r2 is a dummy work space pointer
kbintercept
SWI OS_IntOff ; Disable Interrupts
MOV r2, #0
MOV r0, #INSV
ADR r1, kbvecinsert
SWI OS_Claim ; Claim vector
MOV r0, #REMV
ADR r1, kbvecremove
SWI OS_Claim ; Claim vector
MOV r0, #CNPV
ADR r1, kbveccountnp
SWI OS_Claim ; Claim vector
SWI OS_IntOn ; Enable Interrupts
MOV pc, r14
; release the claims we have on system interrupts
; r2 is a dummy work space pointer
kbrelease
SWI OS_IntOff ; Disable Interrupts
MOV r2,#0
MOV r0, #INSV
ADR r1, kbvecinsert
SWI OS_Release ; Release vector
MOV r0, #REMV
ADR r1, kbvecremove
SWI OS_Release ; Release vector
MOV r0, #CNPV
ADR r1, kbveccountnp
SWI OS_Release ; Release vector
SWI OS_IntOn ; Enable Interrupts
MOV pc, r14
; insert a charater into a buffer either a character from the receiver
; or a character to be transmitted
vecinsert
CMP r1, #RS423_In
[ OutputToo = ON
CMPNE r1, #RS423_Out
]
MOVNE pc, r14
STMFD r13!,{r0-r12}
[ OutputToo = ON
CMP r1, #RS423_In
BLEQ |_rsinsertinn|
BLNE |_rsinsertout|
|
BL |_rsinsertinn|
]
CMP r0, #1
LDMFD r13!, {r0-r12,r14}
BIC r14, r14, #C_bit
ORREQ r14, r14, #C_bit
MOVS pc, r14
; remove a character from a buffer, either fetch a receoved character
; or transmit the next character
vecremove
CMP r1, #RS423_In
[ OutputToo = ON
CMPNE r1, #RS423_Out
]
MOVNE pc, r14
STMFD r13!,{r1,r3-r12}
AND r0, r14, #V_bit
[ OutputToo = ON
CMP r1, #RS423_In
BLEQ |_rsremoveinn|
BLNE |_rsremoveout|
|
BL |_rsremoveinn|
]
LDMFD r13!, {r1,r3-r12,r14}
BIC r14, r14, #C_bit
CMP r0, #256
ORRGE r14, r14, #C_bit
MOV r2, r0
MOVS pc, r14
; either examine the buffers or purge there contents
veccountnp
BVS veccountp
CMP r1, #RS423_In
[ OutputToo = ON
CMPNE r1, #RS423_Out
]
MOVNE pc, r14
[ OutputToo = ON
CMP r1, #RS423_In
]
STMFD r13!,{r3-r12}
AND r0, r14, #V_bit
AND r1, r14, #C_bit
[ OutputToo = ON
BLEQ |_rscountnpinn|
BLNE |_rscountnpout|
|
BL |_rscountnpinn|
]
LDMFD r13!, {r3-r12,pc}
veccountp
CMP r1, #RS423_In
[ OutputToo = ON
CMPNE r1, #RS423_Out
]
MOVNE pc, r14
[ OutputToo = ON
CMP r1, #RS423_In
]
STMFD r13!,{r1-r12}
AND r0, r14, #V_bit
AND r1, r14, #C_bit
[ OutputToo = ON
BLEQ |_rscountnpinn|
BLNE |_rscountnpout|
|
BL |_rscountnpinn|
]
LDMFD r13!, {r1-r12,pc}
kbvecinsert
CMP r1, #Keyboard
MOVNE pc, r14
STMFD r13!, {r0-r12}
BL |_kbinsertinn|
CMP r0, #1
LDMFD r13!, {r0-r12,r14}
BIC r14, r14, #C_bit
ORREQ r14, r14, #C_bit
MOVS pc, r14
kbvecremove
CMP r1, #Keyboard
MOVNE pc, r14
STMFD r13!,{r1,r3-r12}
AND r0, r14, #V_bit
BL |_kbremoveinn|
LDMFD r13!, {r1,r3-r12,r14}
BIC r14, r14, #C_bit
CMP r0, #256
ORRGE r14, r14, #C_bit
MOV r2, r0
MOVS pc, r14
kbveccountnp
BVS kbveccountp
CMP r1, #Keyboard
MOVNE pc, r14
STMFD r13!,{r3-r12}
AND r0, r14, #V_bit
AND r1, r14, #C_bit
BL |_kbcountnpinn|
LDMFD r13!, {r3-r12,pc}
kbveccountp
CMP r1, #Keyboard
MOVNE pc, r14
STMFD r13!,{r1-r12}
AND r0, r14, #V_bit
AND r1, r14, #C_bit
BL |_kbcountnpinn|
LDMFD r13!, {r1-r12,pc}
; Need at least 64 bytes of Data to stop objasm hanging!!!!
AREA |C$$data|
|v$dataseg|
DCD &0
ALIGN 64
EXPORT |rsintercept|
EXPORT |rsrelease|
EXPORT |kbintercept|
EXPORT |kbrelease|
END