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 *