SHARE
TWEET

NETServ v1.0

Comatose-1990 Nov 3rd, 2013 169 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. REM ================================
  2. REM * NETLIB v1.1
  3. REM The base library for NET code
  4. REM ================================
  5. NETLIB:
  6.  
  7. REM # Init
  8. SET A, 0
  9. SET B, [@ScreenStart]
  10. HWI 0
  11. JSR ClearScreen
  12. IAS HardwareIterrupt
  13.  
  14. SET PC, [@CodeStart]
  15.  
  16. REM ##############
  17. REM NETLIB Vars
  18. REM ##############
  19. @CodeStart:      DAT NETServ
  20.  
  21. @ScreenStart:    DAT 0x8000
  22. @NextPrint:      DAT 0x7FE0
  23. @ScreenEnd:      DAT 0x817F
  24. @PacketHandler:  DAT 0x0000
  25. @KeyHandler:     DAT 0x0000
  26. @TimeoutAddress: DAT 0x0000
  27. @TimeoutTicks:   DAT 0x0000
  28. @HandlerReg:     DAT 0x0000
  29. @IP:             DAT 0x0000
  30. @ClearPC:        DAT 0x0000
  31.  
  32. @Input:
  33. DAT 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  34.  
  35. $InvalidInput:
  36. DAT "Invalid input", 0x0
  37.  
  38. REM ###############################
  39. REM Wait until you get an IP
  40. REM ###############################
  41. WaitForIP:
  42. SET A, 9
  43. SET B, 0xffff
  44. WaitForIP_hang:
  45. HWI 4
  46. IFE B, 0xffff
  47.   MOV WaitForIP_hang
  48.  
  49. REM # Store IP
  50. SET [@IP], B
  51.  
  52. SET PC, POP
  53.  
  54. REM ###############################
  55. REM Print null-str at [A] on a
  56. REM new line
  57. REM ###############################
  58. PrintLn:
  59. SET PUSH, B
  60.  
  61. REM # Load line to B
  62. JSR LoadNextLine
  63. JSR PrintStr
  64.  
  65. SET B, POP
  66. SET PC, POP
  67.  
  68. REM #################################
  69. REM Loads the address of the next
  70. REM line into B
  71. REM #################################
  72. LoadNextLine:
  73. ADD [@NextPrint], 0x20
  74. IFG [@NextPrint], [@ScreenEnd]
  75.   JSR ScrollUp
  76. SET B, [@NextPrint]
  77.  
  78. SET PC, POP
  79.  
  80. REM ###############################
  81. REM Print null-str at [A]
  82. REM ###############################
  83. PrintStr:
  84. SET PUSH, C
  85.  
  86. PrintStr_loop:
  87. IFE [A], 0
  88.   MOV PrintStr_exit
  89.  
  90. SET C, [A]
  91. BOR C, 0x1900
  92. SET [B], C
  93.  
  94. ADD A, 1
  95. ADD B, 1
  96. MOV PrintStr_loop
  97.  
  98. PrintStr_exit:
  99. SET C, POP
  100. SET PC, POP
  101.  
  102. REM ###############################
  103. REM Print a hex number A to [B]
  104. REM ###############################
  105. PrintHex:
  106. PUSHA
  107.  
  108. REM # "0x"
  109. SET [B], 0x1930
  110. ADD B, 1
  111. SET [B], 0x1978
  112. ADD B, 1
  113.  
  114. SET I, 12
  115. PrintHex_loop:
  116. SET C, A
  117. SHR C, I
  118. AND C, 0xf
  119. IFG C, 0x9
  120.   ADD C, 0x37
  121. IFL C, 0xa
  122.   ADD C, 0x30
  123.  
  124. BOR C, 0x1900
  125. SET [B], C
  126. ADD B, 1
  127. SUB I, 4
  128. IFA I, 0xffff
  129.   SET PC, PrintHex_loop
  130.  
  131. POPA
  132. SET PC, POP
  133.  
  134. REM #################################
  135. REM Print a character C to [B++]
  136. REM #################################
  137. PrintChar:
  138. SET PUSH, A
  139.  
  140. REM # Check for end of line
  141. SET A, [@NextPrint]
  142. ADD A, 0x1E
  143. IFG B, A
  144.   MOV PrintChar_skip
  145.  
  146. SET [B], C
  147. BOR [B], 0x1900
  148. ADD B, 1
  149.  
  150. PrintChar_skip:
  151. SET [B], 0x199D
  152.  
  153. SET A, POP
  154. SET PC, POP
  155.  
  156. REM ##################################
  157. REM Clears screen at [--B]
  158. REM ##################################
  159. PrintBackspace:
  160. SET PUSH, A
  161.  
  162. SET [B], 0x1920
  163.  
  164. REM # Check for start of line
  165. SET A, [@NextPrint]
  166. ADD A, 3
  167. IFL B, A
  168.   MOV PrintBackspace_skip
  169.  
  170. SUB B, 1
  171. SET [B], 0x1920
  172.  
  173. PrintBackspace_skip:
  174. SET [B], 0x199D
  175.  
  176. SET A, POP
  177. SET PC, POP
  178.  
  179. REM #################################
  180. REM Clears the screen to 0x1920
  181. REM #################################
  182. ClearScreen:
  183. SET PUSH, A
  184. SET PUSH, B
  185. SET A, [@ScreenStart]
  186. SET B, [@ScreenEnd]
  187. ADD B, 1
  188.  
  189. ClearScreen_loop:
  190. SET [A], 0x1920
  191. ADD A, 1
  192. IFL A, B
  193.   MOV ClearScreen_loop
  194.  
  195. SET B, POP
  196. SET A, POP
  197. SET PC, POP
  198.  
  199. REM #################################
  200. REM Scroll the screen up a line
  201. REM #################################
  202. ScrollUp:
  203. SET PUSH, C
  204. SET PUSH, I
  205. SET I, [@ScreenStart]
  206.  
  207. SET C, [@ScreenEnd]
  208. SUB C, 0x1F
  209. SET [@NextPrint], C
  210.  
  211. ScrollUp_loop:
  212. SET [I], [I + 0x20]
  213. SET [I + 0x20], 0x1920
  214. ADD I, 1
  215. IFL I, C
  216.   SET PC, ScrollUp_loop
  217.  
  218. SET I, POP
  219. SET C, POP
  220. SET PC, POP
  221.  
  222. REM #################################
  223. REM If string [A] == string [B] then
  224. REM   JSR to C and then
  225. REM   return to I if I != 0
  226. REM else do nothing
  227. REM #################################
  228. StrEquals:
  229. PUSHA
  230.  
  231. StrEquals_loop:
  232. IFN [A], [B]
  233.   MOV StrEquals_nomatch
  234.  
  235. IFE [A], 0
  236.   IFE [B], 0
  237.     MOV StrEquals_match
  238.  
  239. ADD A, 1
  240. ADD B, 1
  241. MOV StrEquals_loop
  242.  
  243. StrEquals_match:
  244. JSR C
  245.  
  246. IFE I, 0
  247.   MOV StrEquals_nomatch
  248.  
  249. POPA
  250. REM # Clear PC from stack
  251. SET [@ClearPC], POP
  252.  
  253. SET PC, I
  254.        
  255. REM # No match found
  256. StrEquals_nomatch:
  257. POPA
  258. SET PC, POP
  259.  
  260.  
  261. REM ##################################
  262. REM Wait for a hex number with then
  263. REM   format #### to be entered
  264. REM ##################################
  265. WaitForNumber:
  266. SET PUSH, B
  267. SET PUSH, C
  268.  
  269. REM # Load line to B
  270. JSR LoadNextLine
  271.  
  272. REM # >
  273. SET [B], 0x193E
  274. ADD B, 2
  275. SET [B], 0x199D
  276.  
  277. SET C, &InputNumber
  278. JSR SetKeyCallback
  279.  
  280. SET C, POP
  281. SET B, POP
  282. SET PC, POP
  283.  
  284. REM # Input line Callback
  285. &InputNumber:
  286. SET PUSH, A
  287. SET PUSH, C
  288.  
  289. SET A, 1
  290. HWI 1
  291. IFE C, 0x10
  292.   JSR PrintBackspace
  293. IFE C, 0x11
  294.   MOV &InputNumber_done
  295.  
  296. REM # Shorter char range check
  297. SET A, [@NextPrint]
  298. ADD A, 0x5
  299. IFG B, A
  300.   MOV &InputNumber_exit
  301.  
  302. REM # 0-9
  303. IFG C, 0x2F
  304.   IFL C, 0x3A
  305.     JSR PrintChar
  306.  
  307. REM # a-f
  308. IFG C, 0x60
  309.   IFL C, 0x67
  310.     JSR PrintChar
  311.  
  312. REM # Not done yet
  313. MOV &InputNumber_exit
  314.  
  315. &InputNumber_done:
  316. SET [B], 0x1920
  317. JSR ClearKeyCallback
  318.  
  319. &InputNumber_exit:
  320. SET C, POP
  321. SET A, POP
  322. SET PC, POP
  323.  
  324. REM #################################
  325. REM Parses a number stored in @Input
  326. REM and stores the result in C
  327. REM If error I == 0xffff
  328. REM #################################
  329. ParseNumber:
  330. SET PUSH, A
  331. SET PUSH, B
  332.  
  333. SET C, 0
  334. SET I, 12
  335.  
  336. SET A, @Input
  337. ParseNumber_loop:
  338. SET B, [A]
  339.  
  340. REM # 0-9
  341. IFL B, 0x3A
  342.   SUB B, 0x30
  343.  
  344. REM # a-f
  345. IFG B, 0x60
  346.   IFL B, 0x67
  347.    SUB B, 0x57
  348.    
  349. IFG B, 0xF
  350.   MOV ParseNumber_bad
  351.  
  352. REM # Add to number
  353. SHL B, I
  354. ADD C, B
  355.  
  356. ADD A, 1
  357. SUB I, 4
  358.  
  359. REM # IF > -1
  360. IFA I, 0xffff
  361.   MOV ParseNumber_loop
  362.  
  363. REM # Is a 4 char number
  364. IFE [A], 0x20
  365.   MOV ParseNumber_done
  366. IFE [A], 0x00
  367.   MOV ParseNumber_done
  368.  
  369. REM # Bad input
  370. ParseNumber_bad:
  371. SET I, 0xffff
  372. SET A, $InvalidInput
  373. JSR PrintLn
  374.  
  375. ParseNumber_done:
  376. SET B, POP
  377. SET A, POP
  378. SET PC, POP
  379.  
  380. REM ##################################
  381. REM Wait for a command to be entered
  382. REM ##################################
  383. WaitForString:
  384. SET PUSH, B
  385. SET PUSH, C
  386.  
  387. REM # Load line to B
  388. JSR LoadNextLine
  389.  
  390. REM # >
  391. SET [B], 0x193E
  392. ADD B, 2
  393. SET [B], 0x199D
  394.  
  395. SET C, &InputLine
  396. JSR SetKeyCallback
  397.  
  398. SET C, POP
  399. SET B, POP
  400. SET PC, POP
  401.  
  402. REM # Input line Callback
  403. &InputLine:
  404. SET PUSH, A
  405. SET PUSH, C
  406.  
  407. SET A, 1
  408. HWI 1
  409. IFE C, 0x10
  410.   JSR PrintBackspace
  411. IFE C, 0x11
  412.   MOV &InputLine_done
  413. IFG C, 0x1F
  414.   IFL C, 0x80
  415.     JSR PrintChar
  416.  
  417. REM # Not done
  418. MOV &InputLine_exit
  419.  
  420. &InputLine_done:
  421. SET [B], 0x1920
  422. JSR ClearKeyCallback
  423. JSR ParseLineInput
  424.  
  425. &InputLine_exit:
  426. SET C, POP
  427. SET A, POP
  428. SET PC, POP
  429.  
  430. REM #################################
  431. REM Parses the input out of this line
  432. REM #################################
  433. ParseLineInput:
  434. SET PUSH, A
  435. SET PUSH, B
  436.  
  437. SET A, @Input
  438. SET B, [@NextPrint]
  439. ADD B, 2
  440.  
  441. ParseLineInput_loop:
  442. IFE [B], 0x1920
  443.   MOV ParseLineInput_end
  444.  
  445. SET [A], [B]
  446. AND [A], 0x00ff
  447. ADD A, 1
  448. ADD B, 1
  449. MOV ParseLineInput_loop
  450.  
  451. ParseLineInput_end:
  452. REM # End with null
  453. SET [A], 0
  454.  
  455. SET B, POP
  456. SET A, POP
  457. SET PC, POP
  458.  
  459. REM ##################################
  460. REM Set an event for a keyboard event
  461. REM Will MOV to C when event triggers
  462. REM Hangs until @KeyHandler == 0
  463. REM ##################################
  464. SetKeyCallback:
  465. SET PUSH, A
  466. SET PUSH, B
  467.  
  468. SET A, 3
  469. SET B, C
  470. SET [@KeyHandler], B
  471. HWI 1
  472.  
  473. SET B, POP
  474. SET A, POP
  475.  
  476. REM # Wait for the state to update
  477. SetKeyCallback_wait:
  478. IFN [@KeyHandler], 0
  479.   MOV SetKeyCallback_wait
  480.  
  481. SET PC, POP
  482.  
  483. REM ##################################
  484. REM Clears a KeyCallback
  485. REM ##################################
  486. ClearKeyCallback:
  487. SET PUSH, A
  488. SET PUSH, B
  489. SET [@KeyHandler], 0x0000
  490.  
  491. SET A, 0
  492. HWI 1
  493.  
  494. SET A, 3
  495. SET B, 0
  496. HWI 1
  497.  
  498. SET A, POP
  499. SET B, POP
  500. SET PC, POP
  501.  
  502. REM ##################################
  503. REM Set event for receiving a packet
  504. REM Will MOV to C when event triggers
  505. REM ##################################
  506. SetPacketCallback:
  507. SET PUSH, A
  508. SET PUSH, B
  509.  
  510. SET A, 0xC
  511. SET B, C
  512. SET [@PacketHandler], B
  513. HWI 4
  514.  
  515. SET B, POP
  516. SET A, POP
  517. SET PC, POP
  518.  
  519. REM ##################################
  520. REM Clears a PacketCallback
  521. REM ##################################
  522. ClearPacketCallback:
  523. SET PUSH, A
  524. SET PUSH, B
  525. SET [@PacketHandler], 0x0000
  526.  
  527. REM # Clear packet buffer
  528. SET A, 0xB
  529. HWI 4
  530.  
  531. REM # Clear message
  532. SET A, 0xC
  533. SET B, 0
  534. HWI 4
  535.  
  536. SET A, POP
  537. SET B, POP
  538. SET PC, POP
  539.  
  540. REM ##################################
  541. REM Starts a timeout which will MOV
  542. REM to B after A seconds
  543. REM * NOTE:
  544. REM    Timeout is not a handler,
  545. REM    will permanently move to the
  546. REM    timeout address  
  547. REM ##################################
  548. SetTimeout:
  549. SET PUSH, A
  550. SET PUSH, B
  551.  
  552. SET [@TimeoutTicks], A
  553. SET [@TimeoutAddress], B
  554.  
  555. REM # Int with message B
  556. SET A, 2
  557. HWI 2
  558.  
  559. REM # Start timer
  560. SET A, 0
  561. SET B, 60
  562. HWI 2
  563.  
  564. SET B, POP
  565. SET A, POP
  566. SET PC, POP
  567.  
  568. REM ##################################
  569. REM Checks for timeout completion, if
  570. REM done moves to the timeout address
  571. REM ##################################
  572. DoTimeout:
  573. SET PUSH, C
  574.  
  575. REM # Get ticks
  576. SET A, 1
  577. HWI 2
  578.  
  579. REM # If less than timeout ticks skip
  580. IFL C, [@TimeoutTicks]
  581.   MOV DoTimeout_notyet
  582. SET C, POP
  583.  
  584. REM # Clear the timeout
  585. SET [@HandlerReg], [@TimeoutAddress]
  586. JSR ClearTimeout
  587.  
  588. REM # Reset from JSR
  589. SET [@ClearPC], POP
  590.  
  591. REM # Reset from interrupt
  592. SET A, POP
  593. SET [@ClearPC], POP
  594. IAQ 0
  595.  
  596. REM # Move to the handler
  597. SET PC, [@HandlerReg]
  598.  
  599. DoTimeout_notyet:
  600. SET C, POP
  601. SET PC, POP
  602.  
  603. REM ##################################
  604. REM Clears the current timeout
  605. REM ##################################
  606. ClearTimeout:
  607. SET PUSH, A
  608. SET PUSH, B
  609. SET [@TimeoutAddress], 0
  610.  
  611. REM # Stop timer
  612. SET A, 0
  613. SET B, 0
  614. HWI 2
  615.  
  616. REM # Clear message
  617. SET A, 2
  618. SET B, 0
  619. HWI 2
  620.  
  621. SET B, POP
  622. SET A, POP
  623. SET PC, POP
  624.  
  625. REM ##################################
  626. REM The hardware interrupt handler
  627. REM ##################################
  628. HardwareIterrupt:
  629. IFE A, 0
  630.   RFI 0x0
  631.  
  632. REM # Event handlers
  633. IFE A, [@KeyHandler]
  634.   JSR [@KeyHandler]
  635.  
  636. IFE A, [@PacketHandler]
  637.   JSR [@PacketHandler]
  638.  
  639. REM # Insertion handlers
  640. IFE A, [@TimeoutAddress]
  641.   JSR DoTimeout
  642.  
  643. RFI 0x0
  644.  
  645. FILL NETLIB, 512
  646.  
  647. REM ===================================
  648. REM * NETServ v1.0
  649. REM Host a dedicated server
  650. REM ===================================
  651. NETServ:
  652. SET A, $NetServ
  653. JSR PrintLn
  654.  
  655. SET A, $Connecting
  656. JSR PrintLn
  657.  
  658. JSR WaitForIP
  659.  
  660. REM # Print "Connected IP: #"
  661. SET B, [@NextPrint]
  662. SET A, $Connected
  663. JSR PrintStr
  664.  
  665. SET A, [@IP]
  666. JSR PrintHex
  667.  
  668. REM # Open ping port
  669. SET A, 0
  670. SET B, 64
  671. HWI 4
  672.  
  673. REM # Listen for packet
  674. SET C, &ServerPacket
  675. JSR SetPacketCallback
  676.  
  677. SET A, $ServerStarted
  678. JSR PrintLn
  679.  
  680. Server_loop:
  681. SET PC, Server_loop
  682.  
  683. NETServ_exit:
  684. HNG
  685.  
  686. REM ##########################
  687. REM # Server packet handler
  688. REM ##########################
  689. &ServerPacket:
  690. REM # Prepare to read
  691. SET A, 6
  692. HWI 4
  693.  
  694. REM # Check for ping packet
  695. SET A, 8
  696.   REM # First word 0x0001
  697.   HWI 4
  698.   IFN B, 1
  699.     MOV &ServerPacket_exit
  700.  
  701.   REM # Reached end
  702.   HWI 4
  703.   IFN B, 0
  704.     MOV &ServerPacket_exit
  705.  
  706. REM # Get sender IP
  707. SET A, 7
  708. HWI 4
  709. SET I, B
  710.  
  711. REM # Set target
  712. SET B, I
  713. SET A, 3
  714. SET C, 64
  715. HWI 4
  716.  
  717. REM # Append 2
  718. SET A, 4
  719. SET B, 2
  720. HWI 4
  721.  
  722. REM # Send packet
  723. SET A, 5
  724. HWI 4
  725.  
  726. REM # Print sender IP
  727. SET A, I
  728. JSR LoadNextLine
  729. JSR PrintHex
  730.  
  731. &ServerPacket_exit:
  732. SET PC, POP
  733.  
  734. REM ##############
  735. REM Strings
  736. REM  < 32 chars
  737. REM ##############
  738. $NetServ:
  739. DAT "NETServ v1.0", 0x0
  740.  
  741. $Connecting:
  742. DAT "Connecting...", 0x0
  743.  
  744. $Connected:
  745. DAT "Connected IP: ", 0x0
  746.  
  747. $ServerStarted:
  748. DAT "Server started", 0x0
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top