home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
kermit.columbia.edu
/
kermit.columbia.edu.tar
/
kermit.columbia.edu
/
archives
/
ucsdmagiscan2.zip
/
handle.text
< prev
next >
Wrap
Text File
|
2011-08-11
|
4KB
|
98 lines
.TITL HANDLER
.PROC GETBUF < FUNCTION GETBUF( SOH, EOP, TIMEOUT : INTEGER;
VAR S : STRING ):BOOLEAN; >
;-----------------------------------------------------------;
; ;
; written by H Balen March 1986 ;
; ;
; This is a microcode routine to receive a packet for the ;
; Magiscans KERMIT program. ;
; ;
; SOH = 'my_soh' start of packet ;
; EOP = 'my_eop' end of the packet ;
; TIMEOUT = number of loops before giving up ;
; S = the buffer in which to store the data ;
; ;
; ;
;-----------------------------------------------------------;
.REG EOP
.REG SOH
.REG STRPTR
.REG INDPSN
.REG WPSN
.REG CBYTE
.REG VALUE
.REG WRDPTR
.REG TCOUNT
.REG TIMOUT
GETBUF: NOP :JSR DUMP2 ; Zero the count
ZER TCOUNT :JSR ACPOP ; and the posn
MOV AC,STRPTR :JSR ACPOP ; Set the string and word pointers
MOV AC,TIMOUT :JSR ACPOP ; get wait
MOV AC,EOP :JSR ACPOP ; get special characters
MOV AC,SOH
LAB1: ZER INDPSN
MOV STRPTR,AC
MOV AC,WRDPTR
LOOP: INC TCOUNT ; check the time out
MOV TIMOUT,AC
SUB AC,COUNT,#
MOV %0004,AC :JMP LEAVE ZR
SUB AC,C16,RMSK ; check the status register
MOV C255,AC :JSR STATSET
AND IO(RS),C1,AC
NOP :JMP LOOP NZ
MOV %0038,IOA ; read the port
MOV IO,AC
AND AC,%7F,AC
SUB AC,SOH,# ; check the special chars
SUB AC,EOP,# :JMP LAB1 ZR
MOV AC,CBYTE :JMP PEND ZR
NOP :JSR STORUP ; store the byte
NOP :JMP LOOP ; continue to loop
PEND: MOV STRPTR,MAF ; routine to leave the microcode procedure
MOV MM,AC ; store the length of the string
AND AC,%FF00,AC
MOV AC,VALUE
MOV INDPSN,AC
AND AC,%00FF,AC
OR AC,VALUE,AC
MOV AC,MM
MOV C1,AC
FEND: NOP :JSR ACPUSH
NOP :JMP ENDIPC
LEAVE: ZER AC :JMP FEND
STORUP: INC INDPSN ; find the index
MOV INDPSN,AC
MOV WRDPTR,MAF
AND AC,C1,# ; if the index is odd then store in high byte of word
MOV MM,AC :JMP ODD NZ
AND AC,%FF00,AC ; else store in the low byte
MOV AC,VALUE
MOV CBYTE,AC
AND AC,%00FF,AC
OR AC,VALUE,AC
MOV AC,MM :RET
ODD: AND AC,%00FF,AC ; store in high byte
MOV AC,VALUE
MOV CBYTE,AC
AND AC(8L),%FF00,AC
OR AC,VALUE,AC
MOV AC,MM
INC WRDPTR :RET