home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_progs
/
txttools
/
pemacs.lzh
/
PEMACS
/
PORT-HANDLER.ASM
< prev
next >
Wrap
Assembly Source File
|
1991-11-01
|
16KB
|
532 lines
StartModule DC.L (EndModule-StartModule)/4
EntryPoint EQU *
#
# // "Include files containing useful constants"
#
# GET "LIBHDR"
# GET "IOHDR"
# GET "MANHDR"
# GET "EXECHDR"
#
# // This is a handler for the port tasks
#
# // When the task is creates, the parameter packet contains
# // parm.pkt!pkt.arg1 = BPTR to BCPL string of device name, i.e. ("SKEL:")
# // parm.pkt!pkt.arg2 = extra info (if needed)
# // parm.pkt!pkt.arg3 = BPTR to device info node
#
# MANIFEST
# $(
# IO.blocksize = 30 // size of devices IO block
# $)
#
# LET start(parm.pkt) BE
# $(
310044: MOVE.L D1,D2
# LET extrainfo = parm.pkt!pkt.arg2
310046: LSL.L #2,D2
310048: MOVE.L 18(A0,D2.L),4(A1)
# LET read.pkt = 0
31004E: CLR.L 8(A1)
# LET write.pkt = 0
310052: CLR.L C(A1)
#
# LET openstring = parm.pkt!pkt.arg1
310056: MOVE.L 14(A0,D2.L),10(A1)
#
# LET inpkt = VEC pkt.res1
31005C: MOVE.L #18,D3
31005E: ADD.L A1,D3
310060: LSR.L #2,D3
310062: MOVE.L D3,14(A1)
# LET outpkt = VEC pkt.res1
310066: MOVE.L #2C,D4
310068: ADD.L A1,D4
31006A: LSR.L #2,D4
31006C: MOVE.L D4,28(A1)
# LET IOB = VEC IO.blocksize
310070: MOVE.L #40,D5
310072: ADD.L A1,D5
310074: LSR.L #2,D5
310076: MOVE.L D5,3C(A1)
# LET IOIBO = VEC IO.blocksize
31007A: MOVE.L #C0,D6
310080: ADD.L A1,D6
310082: LSR.L #2,D6
310084: MOVE.L D6,BC(A1)
# LET error = FALSE
310088: CLR.L 13C(A1)
#
# TEST extrainfo = 0 THEN // is it a open on SER:
31008C: TST.L 4(A1)
310090: BNE 3100A0
# LET devname = "serial.device*X00"
310094: LEA 464(A4),A3
310098: MOVE.L A3,D1
31009A: LSR.L #2,D1
# ELSE
31009C: BRA 3100BE
# TEST extrainfo = 1 THEN // is it an open on PAR:
3100A0: MOVE.L #1,D1
3100A2: CMP.L 4(A1),D1
3100A6: BNE 3100B6
# LET devname = "parallel.device*X00"
3100AA: LEA 474(A4),A3
3100AE: MOVE.L A3,D1
3100B0: LSR.L #2,D1
# ELSE
3100B2: BRA 3100BE
# LET devname = "printer.device*X00"
3100B6: LEA 488(A4),A3
3100BA: MOVE.L A3,D1
3100BC: LSR.L #2,D1
#
3100BE: MOVE.L D1,140(A1)
#
# LET ?? = TRUE
3100C2: MOVE.L #FFFFFFFF,D2
3100C4: MOVE.L D2,144(A1)
#
#
3100C8: LEA 498(A4),A3
3100CC: MOVE.L A3,D3
3100CE: LSR.L #2,D3
3100D0: MOVE.L D3,148(A1)
#
# LET ?? = 0
3100D4: CLR.L 14C(A1)
#
# LET ?? = 0
3100D8: CLR.L 150(A1)
#
# LET ?? = node = parm.pkt!pkt.arg3
3100DC: MOVE.L (A1),D4
3100DE: LSL.L #2,D4
3100E0: MOVE.L 1C(A0,D4.L),154(A1)
#
# FOR i=0 to IO.blocksize DO IOB!i := 0
3100E6: CLR.L 158(A1)
3100EA: MOVE.L #1E,D5
3100EC: MOVE.L D5,15C(A1)
3100F0: BRA 310106
3100F4: MOVE.L 3C(A1),D1
3100F8: ADD.L 158(A1),D1
3100FC: LSL.L #2,D1
3100FE: CLR.L 0(A0,D1.L)
310102: ADD.L #1,158(A1)
310106: MOVE.L 15C(A1),D1
31010A: CMP.L 158(A1),D1
31010E: BGE 3100F4
# IF OpenDevice( IOB, devname, 0, 0) = 0
310110: MOVE.L #0,D4
310112: MOVE.L D4,D3
310114: MOVE.L 140(A1),D2
310118: MOVE.L 3C(A1),D1
31011C: MOVE.L #164,D0
310122: MOVE.L 7C(A2),A4
310126: JSR (A5)
310128: TST.L D1
31012A: BNE 310134
# error := TRUE
31012E: MOVE.L #FFFFFFFF,D1
310130: MOVE.L D1,13C(A1)
#
# IF error THEN
310134: TST.L 13C(A1)
310138: BEQ 310154
# $( returnpkt(parm.pkt, FALSE, error, objectinuse)
31013C: MOVE.L #CA,D3
310142: MOVE.L #0,D2
310144: MOVE.L (A1),D1
310146: MOVE.L #164,D0
31014C: MOVE.L C4(A2),A4
310150: JSR (A5)
# return
310152: JMP (A6)
# $)
#
# // Copy all the necessary info to the Output buffer too.
#
# FOR i=0 TO IO.blocksize DO IOBO!i := IOB!
310154: CLR.L 158(A1)
310158: MOVE.L #1E,D1
31015A: MOVE.L D1,15C(A1)
31015E: BRA 310180
310162: MOVE.L 3C(A1),D1
310166: ADD.L 158(A1),D1
31016A: LSL.L #2,D1
31016C: MOVE.L BC(A1),D2
310170: ADD.L 158(A1),D2
310174: LSL.L #2,D2
310176: MOVE.L 0(A0,D1.L),0(A0,D2.L)
31017C: ADD.L #1,158(A1)
310180: MOVE.L 15C(A1),D1
310184: CMP.L 158(A1),D1
310188: BGE 310162
#
# TEST extrainfo = 2 && // did they ask for the printer
31018A: MOVE.L #2,D2
31018C: CMP.L 4(A1),D2
310190: BNE 3101F8
# LEN(openstring < 4) THEN // with a name longer than PRT:?
310194: MOVE.L 10(A1),D3
310198: LSL.L #2,D3
31019A: MOVE.L #0,D4
31019C: MOVE.B 0(A0,D3.L),D4
3101A0: MOVE.L #4,D5
3101A2: CMP.L D5,D4
3101A4: BLE 3101F8
# $(
3101A8: MOVE.L 148(A1),D4
3101AC: LSL.L #2,D4
3101AE: MOVE.L #0,D6
3101B0: MOVE.B 0(A0,D4.L),D6
3101B4: MOVE.L D6,D4
3101B6: MOVE.L 16C(A1),D3
3101BA: MOVE.L #3,D2
3101BC: MOVE.L BC(A1),D1
3101C0: MOVE.L #164,D0
3101C6: MOVE.L 18(A2),A4
3101CA: JSR (A5)
3101CC: MOVE.L 148(A1),D1
3101D0: LSL.L #2,D1
3101D2: ADD.L #1,D1
3101D4: MOVE.L D1,D3
3101D6: MOVE.L #28,D2
3101D8: MOVE.L BC(A1),D1
3101DC: MOVE.L #164,D0
3101E2: MOVE.L 1BC(A2),A4
3101E6: JSR (A5)
3101E8: MOVE.L BC(A1),D1
3101EC: MOVE.L #164,D0
3101F2: MOVE.L 54(A2),A4
3101F6: JSR (A5)
# $)
#
# outpkt!pkt.type := act.write
3101F8: MOVE.L 28(A1),D1
3101FC: LSL.L #2,D1
3101FE: MOVE.L #3EA,8(A0,D1.L)
# inpkt!pkt.type := act.read
310206: MOVE.L 14(A1),D1
31020A: LSL.L #2,D1
31020C: MOVE.L #3E9,8(A0,D1.L)
# node!dev.task := taskid()
310214: MOVE.L #164,D0
31021A: MOVE.L 38(A2),A4 ;tadkid()
31021E: JSR (A5)
310220: MOVE.L 154(A1),D2
310224: LSL.L #2,D2
310226: MOVE.L D1,8(A0,D2.L)
#
# // Finished with parameter packer...send back...
#
# returnpkt( park.pkt, TRUE )
31022A: MOVE.L #FFFFFFFF,D2
31022C: MOVE.L (A1),D1
31022E: MOVE.L #164,D0
310234: MOVE.L C4(A2),A4
310238: JSR (A5)
#
# // This is the main repeat loop waiting for an event
#
# $( LET p = taskwait()
31023A: MOVE.L #164,D0
310240: MOVE.L A4(A2),A4
310244: JSR (A5)
310246: MOVE.L D1,158(A1)
#
# SWITCHON p!pkt.type INTO
31024A: BRA 310426
# CASE ????:
31024E: MOVE.L 158(A1),D1
310252: LSL.L #2,D1
310254: MOVE.L 14(A0,D1.L),15C(A1)
31025A: TST.L 14C(A1)
31025E: BEQ 31027E
310262: MOVE.L #CA,D3
310268: MOVE.L #0,D2
31026A: MOVE.L 158(A1),D1
31026E: MOVE.L #16C,D0
310274: MOVE.L C4(A2),A4
310278: JSR (A5)
31027A: BRA 310474
#
# CASE ????:
31027E: MOVE.L #FFFFFFFF,D1
310280: MOVE.L D1,14C(A1)
310284: MOVE.L 15C(A1),D2
310288: LSL.L #2,D2
31028A: MOVE.L D1,4(A0,D2.L)
31028E: MOVE.L 15C(A1),D2
310292: LSL.L #2,D2
310294: MOVE.L #3ED,24(A0,D2.L)
31029C: MOVE.L D1,D2
31029E: MOVE.L 158(A1),D1
3102A2: MOVE.L #16C,D0
3102A8: MOVE.L C4(A2),A4
3102AC: JSR (A5)
3102AE: BRA 310474
#
# CASE ????:
3102B2: MOVE.L 158(A1),D1
3102B6: LSL.L #2,D1
3102B8: MOVE.L 14(A0,D1.L),15C(A1)
3102BE: TST.L 150(A1)
3102C2: BEQ 3102E2
3102C6: MOVE.L #CA,D3
3102CC: MOVE.L #0,D2
3102CE: MOVE.L 158(A1),D1
3102D2: MOVE.L #16C,D0
3102D8: MOVE.L C4(A2),A4
3102DC: JSR (A5)
3102DE: BRA 310474
#
# CASE ????:
3102E2: MOVE.L #FFFFFFFF,D1
3102E4: MOVE.L D1,150(A1)
3102E8: MOVE.L 15C(A1),D2
3102EC: LSL.L #2,D2
3102EE: MOVE.L D1,4(A0,D2.L)
3102F2: MOVE.L 15C(A1),D2
3102F6: LSL.L #2,D2
3102F8: MOVE.L #3EE,24(A0,D2.L)
310300: MOVE.L D1,D2
310302: MOVE.L 158(A1),D1
310306: MOVE.L #16C,D0
31030C: MOVE.L C4(A2),A4
310310: JSR (A5)
310312: BRA 310474
#
# CASE ????:
310316: MOVE.L 158(A1),D1
31031A: LSL.L #2,D1
31031C: CMP.L #3ED,14(A0,D1.L)
310324: BNE 310330
310328: CLR.L 14C(A1)
31032C: BRA 310334
310330: CLR.L 150(A1)
310334: TST.L 14C(A1)
310338: BNE 31034E
31033C: TST.L 150(A1)
310340: BNE 31034E
310344: MOVE.L 154(A1),D1
310348: LSL.L #2,D1
31034A: CLR.L 8(A0,D1.L)
31034E: MOVE.L #FFFFFFFF,D2
310350: MOVE.L 158(A1),D1
310354: MOVE.L #168,D0
31035A: MOVE.L C4(A2),A4
31035E: JSR (A5)
310360: BRA 310474
#
# CASE ????:
310364: MOVE.L 158(A1),14(A1)
31036A: MOVE.L 8(A1),D2
31036E: MOVE.L 3C(A1),D1
310372: MOVE.L #168,D0
310378: LEA 4E4(A4),A4
31037C: JSR (A5)
31037E: BRA 310474
#
# CASE ????:
310382: MOVE.L 158(A1),28(A1)
310388: MOVE.L C(A1),D2
31038C: MOVE.L BC(A1),D1
310390: MOVE.L #168,D0
310396: LEA 4E4(A4),A4
31039A: JSR (A5)
31039C: BRA 310474
#
# CASE ????:
3103A0: MOVE.L 158(A1),8(A1)
3103A6: MOVE.L 14(A1),D4
3103AA: MOVE.L 158(A1),D3
3103AE: MOVE.L #2,D2
3103B0: MOVE.L 3C(A1),D1
3103B4: MOVE.L #168,D0
3103BA: LEA 4A0(A4),A4
3103BE: JSR (A5)
3103C0: CLR.L 14(A1)
3103C4: BRA 310474
#
# CASE ????:
3103C8: MOVE.L 158(A1),C(A1)
3103CE: MOVE.L 28(A1),D4
3103D2: MOVE.L 158(A1),D3
3103D6: MOVE.L #3,D2
3103D8: MOVE.L BC(A1),D1
3103DC: MOVE.L #168,D0
3103E2: LEA 4A0(A4),A4
3103E6: JSR (A5)
3103E8: CLR.L 28(A1)
3103EC: BRA 310474
#
# DEFAULT:
3103F0: TST.L 14C(A1)
3103F4: BNE 31040A
3103F8: TST.L 150(A1)
3103FC: BNE 31040A
310400: MOVE.L 154(A1),D1
310404: LSL.L #2,D1
310406: CLR.L 8(A0,D1.L)
31040A: MOVE.L #D1,D3
310410: MOVE.L #0,D2
310412: MOVE.L 158(A1),D1
310416: MOVE.L #168,D0
31041C: MOVE.L C4(A2),A4
310420: JSR (A5)
310422: BRA 310474
#
# // SWITCHON p!pkt.type INTO
310426: MOVE.L 158(A1),D1
31042A: LSL.L #2,D1
31042C: MOVE.L 8(A0,D1.L),D1
310430: MOVE.L #52,D2
310432: CMP.L D2,D1
310434: BEQ 3103A0
310438: MOVE.L #57,D3
31043A: CMP.L D3,D1
31043C: BEQ 3103C8
31043E: CMP.L #3E9,D1
310444: BEQ 310364
310448: CMP.L #3EA,D1
31044E: BEQ 310382
310452: CMP.L #3ED,D1
310458: BEQ 31024E
31045C: CMP.L #3EE,D1
310462: BEQ 3102B2
310466: CMP.L #3EF,D1
31046C: BEQ 310316
310470: BRA 3103F0
# $) REPEATWHILE open |
310474: TST.L 14C(A1)
310478: BNE 31023A
# ??? = 0
31047C: TST.L 150(A1)
310480: BNE 31023A
# outpkt = 0 |
310484: TST.L 28(A1)
310488: BEQ 31023A
# inpkt = 0
31048C: TST.L 14(A1)
310490: BEQ 31023A
#
# // Termination
#
# CloseDevice( IOB )
310494: MOVE.L 3C(A1),D1
310498: MOVE.L #164,D0
31049E: MOVE.L 80(A2),A4
3104A2: JSR (A5)
3104A4: JMP (A6)
#
# $)
3104A6: NOP
CNOP 0,4
3104A8: DC.B 14, 'serial.device',0
CNOP 0,4
3104B8: DC.B 16, 'parallel.device',0
CNOP 0,4
3104C8: DC.B 15, 'printer.device',0
3104DC: ADD.B #[2,(A3)+
#
# // Handle an IO request. Passed command, transmission packet (tp)
# // and request packet (rp). rp contains buffer and length in arg2/3
# AND handle.request(IOB, command, rp, tp ) BE
# $(
# LET buff = rp!pkt.arg2
3104E0: MOVE.W 0(A4),A0
3104E4: MOVE.L D3,D5
3104E6: LSL.L #2,D5
3104E8: MOVE.L 18(A0,D5.L),10(A1)
# LET len = rp!pkt.arg3
3104EE: MOVE.L 1C(A0,D5.L),14(A1)
3104F4: CLR.L 34(A1)
# SetIO( IOB, IO.data, buff )
3104F8: MOVE.L 1C(A0,D5.L),D4
3104FC: MOVE.L 2C(A1),D3
310500: MOVE.L #$,D0
310502: MOVE.L 18(A2),A4
310506: JSR (A5)
# putlong( IOB, IO.data, buff )
310508: MOVE.L 10(A1),D3
31050C: MOVE.L #(,D2
31050E: MOVE.L (A1),D1
310510: MOVE.L #$,D0
310512: MOVE.L 1BC(A2),A4
310516: JSR (A5)
# SendIO(IOB, tp)
310518: MOVE.L C(A1),D2
31051C: MOVE.L (A1),D1
31051E: MOVE.L #$,D0
310520: MOVE.L 58(A2),A4
310524: JSR (A5)
# $)
310526: JMP (A6)
#
# // Handle a returning IO request. The user request packet is
# // passed as p, and must be returned with success/failure message.
# AND handle.return(IOB, p ) BE
# $(
# LET errcode = IOB O.error
310528: MOVE.L D1,D3
31052A: LSL.L #@,D3
31052C: MOVE.L #@,D4
31052E: MOVE.B 1F(A0,D3.L),D4
310532: MOVE.L D4,8(A1)
# LET len = getlong( IOB, IO.actual )
310536: MOVE.L # ,D2
310538: MOVE.L #@,D0
31053A: MOVE.L 1B8(A2),A4
31053E: JSR (A5)
#
# TEST errcode = 0 THEN // no error
310540: MOVE.L D1,C(A1)
310544: TST.L 8(A1)
310548: BNE 31055E
# returnpkt(p, len )
31054C: MOVE.L D1,D2
31054E: MOVE.L 4(A1),D1
310552: MOVE.L #@,D0
310554: MOVE.L C4(A2),A4
310558: JSR (A5)
# ELSE
31055A: BRA 310570
# returnpkt(p, -1, errcode )
31055E: MOVE.L 8(A1),D3
310562: MOVE.L #@@@@,D2
310564: MOVE.L 4(A1),D1
310568: MOVE.L #@,D0
31056A: MOVE.L C4(A2),A4
31056E: JSR (A5)
310570: JMP (A6)
# $)
#
310572: NOP
310574: CNOP 0,4
DC.L 0
DC.L 1
DC.L Entry-Module
DC.L $6f 111
ModEnd EQU *