Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Spectranet
#31
Some dirty code.

Code:
paper 0 ink 7 cls start() opensocket() hostip() connect() pause 200 cls sendfirst() mainloop() SUB fastcall start() ASM ld hl, startupMSG ld bc, end1MSG-startupMSG call myPrint64 ld hl, lookingupMSG call myPrint42 END ASM END SUB SUB fastcall opensocket() ASM ld c, 1 ld hl, SOCKET call HLCALL ld (v_sockfd), a ret END ASM END SUB SUB fastcall hostip() ASM ld hl, serverhost ld de, ip_buffer ld ix, GETHOSTBYNAME call IXCALL ret END ASM END SUB SUB fastcall connect() ASM ld hl, connectingMSG call myPrint42 ; now actually connect... ld a, (v_sockfd) ; get back the socket file descriptor ld de, ip_buffer ; point to the dotted ip notation we got previously ld bc, serverport ; the port I want to use to connect on... (22528 as is heh) ld hl, CONNECT call HLCALL ; call the Spectranet CONNECT ROM routine, :D ;jp c, commerror ; carry is set if there is an error (fingers crossed k) ; CONNECTED !!! xor a inc a ld (connected), a ld hl, connectedMSG call myPrint42 END ASM END SUB SUB fastcall sendfirst() ASM ld a, (v_sockfd) ld de, garbage ld bc, garbageend-garbage ld hl, SEND call HLCALL END ASM END SUB SUB fastcall mainloop() ASM ; main receive loop, :/ .tightloop: ; poll the socket to see if data is waiting call pollSocket jr c, .no_data1 ; there is data to be collected .gData2: call clearBuffer ld a, (v_sockfd) ld de, responseBuffer ld bc, responseBufferEnd-responseBuffer ld hl, RECV call HLCALL jp c, commerror ld hl, responseBuffer ; get the address of the buffer add hl, bc ; add on the number of received bytes inc hl ld (hl), msgEND ; mark that point as the end of the text call displayData ; and just display that, :D jr .tightloop .no_data1: xor a .checkkeys: jr nc, .tightloop ; now close the socket, dunno why cos I ain't never ever gonna give you up, err, I mean drop to BASIC ; green indicates complete run through worked ok... ret ;======================================================================== pollSocket: ; returns carry clear if data to be fetched ; or set carry to indicate no data... ld a, (v_sockfd) ld hl, POLLFD CALL HLCALL jr z, .nodata scf ccf ret .nodata: scf ret displayData: ;ld a, 3 ;out ($fe), a ld hl, responseBuffer call myPrint42 ret END ASM END SUB SUB fastcall clearBuffer() ASM clearBuffer: ld hl, responseBuffer ld de, responseBuffer+1 ld bc, responseBufferEnd-responseBuffer-1 ld (hl), 32 ldir ret END ASM END SUB SUB fastcall commerror() ASM commerror: ld a, 2 out ($fe), a ; turn border red to indicate error... :/ ld hl, errorMSG call myPrint42 ; print the error msg ld a, (v_sockfd) and a ; do we have a socket? ret z ; nope, so return ;NOTE: This may cause a ret to BASIC, grr, will sort it later, :p ld hl, CLOSE ; we have a socket, so clean it up call HLCALL ;call end_interrupts ; reset interrupts back to im 1.. ret END ASM END SUB SUB fastcall myPrint42() ASM myPrint42: push af push ix push hl ld ix, PRINT42 CALL IXCALL pop hl pop ix pop af ret END ASM END SUB SUB fastcall myPrint64() ASM myPrint64: push af push ix push hl ; Test string length. If Zero, exit. ld a, c or b jp z, p64_END ;LOCAL examineChar examineChar: ld a, (hl) ; Grab the character cp 128 ; too high to print? jr nc, nextChar ; then we go to next. cp 22 ; Is this an AT? jr nz, newLine ; If not, hop to newLine routine. ex de, hl ; Swap DE and HL and a ; Clear Carry ld hl, 2 ; sbc hl, bc ; Can we Shorten our string length by 2? If not then at (y,x) doesn't make sense. ex de, hl ; Swap DE and HL back jp nc, p64_END ; If we went negative, there wasn't anything to AT to, so we return. inc hl ; Onto our Y co-ordinate ld d, (hl) ; And load it into D dec bc ; Shorten our remaining string counter. inc hl ; Onto the X Co-ordinate ld e, (hl) ; Load it into E dec bc ; Shorten our remaining string counter call p64_test_X ; Make xy legal 60051 205 53 235 jr p64_eaa3 ; Go to save coords 60054 24 11 ;LOCAL newLine newLine: cp 13 ; Is this a newline character? 60056 254 13 jr nz, p64_isPrintable ; If not, hop to testing to see if we can print this 60058 32 13 ld de, (p64_coords) ; Get coords 60060 237 91 68 235 call p64_nxtLine ; Go to next line. ;LOCAL p64_eaa3 p64_eaa3: ld (p64_coords), de jr nextChar ;LOCAL p64_isPrintable p64_isPrintable: cp 31 ; Bigger than 31? 60073 254 31 jr c, nextChar ; If not, get the next one. 60075 56 7 push hl ; Save position 60077 229 push bc ; Save Count 60078 197 call p64_PrintChar ; Call Print SubRoutine 60079 205 189 234 pop bc ; Recover length count 60082 193 pop hl ; Recover Position 60083 225 ; LOCAL nextChar nextChar: inc hl ; Point to next character 60084 35 dec bc ; Count off this character 60085 11 ld a, b ; Did we run out? 60086 120 or c jr nz, examineChar ; If not, examine the next one 60088 32 193 jp p64_END ; Otherwise hop to END. 60090 201 ; LOCAL p64_PrintChar p64_PrintChar: exx push hl ; Save HL' 60094 229 exx sub 32 ; Take out 32 to convert ascii to position in charset 60096 214 32 ld h, 0 rra ; Divide by 2 60100 31 ld l, a ; Put our halved value into HL 60101 111 ld a, 240 ; Set our mask to LEFT side 60102 62 240 jr nc, p64_eacc ; If we didn't have a carry (even #), hop forward. 60104 48 2 ld a, 15 ; If we were ab idd #, set our mask to RIGHT side instead 60106 62 15 ;LOCAL p64_eacc p64_eacc: add hl, hl add hl, hl add hl, hl ; Multiply our char number by 8 60110 41 ld de, p64_charset ; Get our Charset position 60111 17 70 235 add hl, de ; And add our character count, so we're now pointed at the first ; byte of the right character. 60114 25 exx ld de, (p64_coords) ex af, af' call p64_loadAndTest ex af, af' inc e ld (p64_coords), de ; Put position+1 into coords 60126 237 83 68 235 dec e ld b, a rr e ; Divide X position by 2 60132 203 27 ld c, 0 rl c ; Bring carry flag into C (result of odd/even position) 60136 203 17 and 1 ; Mask out lowest bit in A 60138 230 1 xor c ; XOR with C (Matches position RightLeft with Char RightLeft) 60140 169 ld c, a jr z, p64_eaf6 ; If they are both the same, skip rotation. 60142 40 6 ld a, b rrca rrca rrca rrca ld b, a ;LOCAL p64_eaf6 p64_eaf6: ld a, d ; Get Y coord 60150 122 sra a sra a sra a ; Multiply by 8 60155 203 47 add a, 88 ld h, a ; Put high byte value for attribute into H. 60159 103 ld a, d and 7 rrca rrca rrca add a, e ld l, a ; Put low byte for attribute into l 60167 111 ld a, (23693) ; Get permanent Colours from System Variable 60168 58 141 92 ld (hl), a ; Write new attribute 60171 119 ld a, d and 248 add a, 64 ld h, a ld a, b cpl ld e, a exx ld b, 8 ;LOCAL p64_eb18 p64_eb18: ld a, (hl) exx bit 0, c jr z, p64_eb22 rrca rrca rrca rrca ;LOCAL p64_eb22 p64_eb22: and b ld d, a ld a, (hl) and e or d ld (hl), a inc h exx inc hl djnz p64_eb18 exx pop hl exx ret ; LOCAL p64_loadAndTest p64_loadAndTest: ld de, (p64_coords) ; SubRoutine to go to legal character position. (60213) ; LOCAL p64_test_X p64_test_X: ld a, e ; Get column from e cp 64 ; more than 64 ? jr c, p64_test_Y ; If not, then jump over nextline ;LOCAL p64_nxtLine p64_nxtLine: inc d ; Move down 1 ld e, 0 ; reset x co-ord to zero ; LOCAL p64_test_Y p64_test_Y: ld a, d ; get Y co-ord cp 24 ; Past 24? ret c ; Return if not. ld d, 0 ; Rest y co-ord to top of screen. ret ; Return. ; LOCAL p64_coords; p64_coords: defb 64; X Coordinate store 60228 64 defb 23; Y Coordinate Store 60229 23 ;LOCAL p64_charset p64_charset: DEFB 0,2,2,2,2,0,2,0 ; Space ! DEFB 0,80,82,7,2,7,2,0 ; "" # DEFB 0,37,113,66,114,20,117,32 ; $ % DEFB 0,34,84,32,96,80,96,0 ; & ' DEFB 0,36,66,66,66,66,36,0 ; ( ) DEFB 0,0,82,34,119,34,82,0 ; * + DEFB 0,0,0,0,7,32,32,64 ; , - DEFB 0,1,1,2,2,100,100,0 ; . / DEFB 0,34,86,82,82,82,39,0 ; 0 1 DEFB 0,34,85,18,33,69,114,0 ; 2 3 DEFB 0,87,84,118,17,21,18,0 ; 4 5 DEFB 0,55,65,97,82,84,36,0 ; 6 7 DEFB 0,34,85,37,83,85,34,0 ; 8 9 DEFB 0,0,2,32,0,34,2,4 ; : ; DEFB 0,0,16,39,64,39,16,0 ; < = DEFB 0,2,69,33,18,32,66,0 ; > ? DEFB 0,98,149,183,181,133,101,0 ; @ A Changed from ;0,2,37,87,117,85,53,0 DEFB 0,98,85,100,84,85,98,0 ; B C DEFB 0,103,84,86,84,84,103,0 ; D E DEFB 0,114,69,116,71,69,66,0 ; F G DEFB 0,87,82,114,82,82,87,0 ; H I DEFB 0,53,21,22,21,85,37,0 ; J K DEFB 0,69,71,71,69,69,117,0 ; L M DEFB 0,82,85,117,117,85,82,0 ; N O DEFB 0,98,85,85,103,71,67,0 ; P Q DEFB 0,98,85,82,97,85,82,0 ; R S DEFB 0,117,37,37,37,37,34,0 ; T U DEFB 0,85,85,85,87,39,37,0 ; V W DEFB 0,85,85,37,82,82,82,0 ; X Y DEFB 0,119,20,36,36,68,119,0 ; Z [ DEFB 0,71,65,33,33,17,23,0 ; \ ] DEFB 0,32,112,32,32,32,47,0 ; ^ _ DEFB 0,32,86,65,99,69,115,0 ; £ a DEFB 0,64,66,101,84,85,98,0 ; b c DEFB 0,16,18,53,86,84,35,0 ; d e DEFB 0,32,82,69,101,67,69,2 ; f g DEFB 0,66,64,102,82,82,87,0 ; h i DEFB 0,20,4,53,22,21,85,32 ; j k DEFB 0,64,69,71,71,85,37,0 ; l m DEFB 0,0,98,85,85,85,82,0 ; n o DEFB 0,0,99,85,85,99,65,65 ; p q DEFB 0,0,99,84,66,65,70,0 ; r s DEFB 0,64,117,69,69,85,34,0 ; t u DEFB 0,0,85,85,87,39,37,0 ; v w DEFB 0,0,85,85,35,81,85,2 ; x y DEFB 0,0,113,18,38,66,113,0 ; z { DEFB 0,32,36,34,35,34,36,0 ; | { DEFB 0,6,169,86,12,6,9,6 ; ~ (c) ;LOCAL p64_END p64_END: pop hl pop ix pop af ret END ASM END SUB ASM msgEND EQU 0 msgCR EQU 10 RET_OK EQU 0 RET_SOCKERR EQU 1 RET_PORTERR EQU 2 RET_RECEIVEERR EQU 4 RET_UNKNOWN EQU 128 SOCK_STREAM EQU 1 SOCK_DGRAM EQU 2 SOCK_RAW EQU 3 CALLBAS EQU 0x10 STACK_BC EQU $2D2B PRINT_FP EQU $2DE3 MODULECALL equ $3FF8 MODULECALL_NOPAGE equ $28 PAGEIN equ $3FF9 PAGEOUT equ $007C HLCALL equ $3FFA IXCALL equ $3FFD ; Port defines CTRLREG equ $033B CPLDINFO equ $023B ; Jump table entry points SOCKET equ $3E00 ; Allocate a socket CLOSE equ $3E03 ; Close a socket LISTEN equ $3E06 ; Listen for incoming connections ACCEPT equ $3E09 ; Accept an incoming connection BIND equ $3E0C ; Bind a local address to a socket CONNECT equ $3E0F ; Connect to a remote host SEND equ $3E12 ; Send data RECV equ $3E15 ; Receive data SENDTO equ $3E18 ; Send data to an address RECVFROM equ $3E1B ; Receive data from an address POLL equ $3E1E ; Poll a list of sockets POLLALL equ $3E21 ; Poll all open sockets POLLFD equ $3E24 ; Poll a single socket GETHOSTBYNAME equ $3E27 ; Look up a hostname PUTCHAR42 equ $3E2A ; 42 column print write a character PRINT42 equ $3E2D ; 42 column print a null terminated string CLEAR42 equ $3E30 ; Clear the screen and reset 42-col print SETPAGEA equ $3E33 ; Sets page area A SETPAGEB equ $3E36 ; Sets page area B LONG2IPSTRING equ $3E39 ; Convert a 4 byte big endian long to an IP IPSTRING2LONG equ $3E3C ; Convert an IP to a 4 byte big endian long ITOA8 equ $3E3F ; Convert a byte to ascii RAND16 equ $3E42 ; 16 bit PRNG REMOTEADDRESS equ $3E45 ; Fill struct sockaddr_in IFCONFIG_INET equ $3E48 ; Set IPv4 address IFCONFIG_NETMASK equ $3E4B ; Set netmask IFCONFIG_GW equ $3E4E ; Set gateway INITHW equ $3E51 ; Set the MAC address and initial hw registers GETHWADDR equ $3E54 ; Read the MAC address DECONFIG equ $3E57 ; Deconfigure inet, netmask and gateway MAC2STRING equ $3E5A ; Convert 6 byte MAC address to a string STRING2MAC equ $3E5D ; Convert a hex string to a 6 byte MAC address ITOH8 equ $3E60 ; Convert accumulator to hex string HTOI8 equ $3E63 ; Convert hex string to byte in A GETKEY equ $3E66 ; Get a key from the keyboard, and put it in A KEYUP equ $3E69 ; Wait for key release INPUTSTRING equ $3E6C ; Read a string into buffer at DE GET_IFCONFIG_INET equ $3E6F ; Gets the current IPv4 address GET_IFCONFIG_NETMASK equ $3E72 ; Gets the current netmask GET_IFCONFIG_GW equ $3E75 ; Gets the current gateway address SETTRAP equ $3E78 ; Sets the programmable trap DISABLETRAP equ $3E7B ; Disables the programmable trap ENABLETRAP equ $3E7E ; Enables the programmable trap PUSHPAGEA equ $3E81 ; Pages a page into area A, pushing the old one POPPAGEA equ $3E84 ; Restores the previous page in area A PUSHPAGEB equ $3E87 ; Pages into area B pushing the old one POPPAGEB equ $3E8A ; Restores the previous page in area B PAGETRAPRETURN equ $3E8D ; Returns from a trap to page area B TRAPRETURN equ $3E90 ; Returns from a trap that didn't page area B ADDBASICEXT equ $3E93 ; Adds a BASIC command STATEMENT_END equ $3E96 ; Check for statement end, exit at syntax time EXIT_SUCCESS equ $3E99 ; Use this to exit successfully after cmd PARSE_ERROR equ $3E9C ; Use this to exit to BASIC with a parse error RESERVEPAGE equ $3E9F ; Reserve a page of static RAM FREEPAGE equ $3EA2 ; Free a page of static RAM REPORTERR equ $3EA5 ; report an error via BASIC startupMSG: defm "Ardent's Spectranet TCP Client Test" end1MSG: defm 0 lookingupMSG: defm "Looking up hostname - the8bitmud.zapto.org" defm msgCR,msgCR,msgEND connectingMSG: defm "Connecting..." defm msgCR,msgEND allocatingMSG: defm "Allocating resources..." defm msgCR,msgEND connectedMSG: defm "Connected. " defm msgCR,msgEND receivngMSG: defm "Receiving data." defm msgCR, msgEND errorMSG: defm "Failed." defm msgCR,msgEND doneMSG: defm "Done" defm msgCR,msgEND waitingMSG: defm "I iz waitingz k :p" defm msgCR,msgEND crMSG: defm msgCR,msgEND v_sockfd: defb 0 ; storage for socket file descriptor serverport equ 32768 serverhost: defb "the8bitmud.zapto.org" connected: defb 0 ; 0 means not connected, 1 means connected ip_buffer: defb 0, 0, 0, 0 ; leave 4 bytes free for an IP address garbage: defm "ardentcrest" defm 13,10 garbageend: defb 0 garbage2: defm 0 garbageend2: defb 0 responseBuffer: defs 1024 responseBufferEnd: defb msgCR, msgEND END ASM
I'm always on the chat or facebook.
Reply
#32
What does this do??? O_O

ardentcrest Wrote:Some dirty code.

Code:
paper 0 ink 7 cls start() opensocket() hostip() connect() pause 200 cls sendfirst() mainloop() SUB fastcall start() ASM ld hl, startupMSG ld bc, end1MSG-startupMSG call myPrint64 ld hl, lookingupMSG call myPrint42 END ASM END SUB SUB fastcall opensocket() ASM ld c, 1 ld hl, SOCKET call HLCALL ld (v_sockfd), a ret END ASM END SUB SUB fastcall hostip() ASM ld hl, serverhost ld de, ip_buffer ld ix, GETHOSTBYNAME call IXCALL ret END ASM END SUB SUB fastcall connect() ASM ld hl, connectingMSG call myPrint42 ; now actually connect... ld a, (v_sockfd) ; get back the socket file descriptor ld de, ip_buffer ; point to the dotted ip notation we got previously ld bc, serverport ; the port I want to use to connect on... (22528 as is heh) ld hl, CONNECT call HLCALL ; call the Spectranet CONNECT ROM routine, :D ;jp c, commerror ; carry is set if there is an error (fingers crossed k) ; CONNECTED !!! xor a inc a ld (connected), a ld hl, connectedMSG call myPrint42 END ASM END SUB SUB fastcall sendfirst() ASM ld a, (v_sockfd) ld de, garbage ld bc, garbageend-garbage ld hl, SEND call HLCALL END ASM END SUB SUB fastcall mainloop() ASM ; main receive loop, :/ .tightloop: ; poll the socket to see if data is waiting call pollSocket jr c, .no_data1 ; there is data to be collected .gData2: call clearBuffer ld a, (v_sockfd) ld de, responseBuffer ld bc, responseBufferEnd-responseBuffer ld hl, RECV call HLCALL jp c, commerror ld hl, responseBuffer ; get the address of the buffer add hl, bc ; add on the number of received bytes inc hl ld (hl), msgEND ; mark that point as the end of the text call displayData ; and just display that, :D jr .tightloop .no_data1: xor a .checkkeys: jr nc, .tightloop ; now close the socket, dunno why cos I ain't never ever gonna give you up, err, I mean drop to BASIC ; green indicates complete run through worked ok... ret ;======================================================================== pollSocket: ; returns carry clear if data to be fetched ; or set carry to indicate no data... ld a, (v_sockfd) ld hl, POLLFD CALL HLCALL jr z, .nodata scf ccf ret .nodata: scf ret displayData: ;ld a, 3 ;out ($fe), a ld hl, responseBuffer call myPrint42 ret END ASM END SUB SUB fastcall clearBuffer() ASM clearBuffer: ld hl, responseBuffer ld de, responseBuffer+1 ld bc, responseBufferEnd-responseBuffer-1 ld (hl), 32 ldir ret END ASM END SUB SUB fastcall commerror() ASM commerror: ld a, 2 out ($fe), a ; turn border red to indicate error... :/ ld hl, errorMSG call myPrint42 ; print the error msg ld a, (v_sockfd) and a ; do we have a socket? ret z ; nope, so return ;NOTE: This may cause a ret to BASIC, grr, will sort it later, :p ld hl, CLOSE ; we have a socket, so clean it up call HLCALL ;call end_interrupts ; reset interrupts back to im 1.. ret END ASM END SUB SUB fastcall myPrint42() ASM myPrint42: push af push ix push hl ld ix, PRINT42 CALL IXCALL pop hl pop ix pop af ret END ASM END SUB SUB fastcall myPrint64() ASM myPrint64: push af push ix push hl ; Test string length. If Zero, exit. ld a, c or b jp z, p64_END ;LOCAL examineChar examineChar: ld a, (hl) ; Grab the character cp 128 ; too high to print? jr nc, nextChar ; then we go to next. cp 22 ; Is this an AT? jr nz, newLine ; If not, hop to newLine routine. ex de, hl ; Swap DE and HL and a ; Clear Carry ld hl, 2 ; sbc hl, bc ; Can we Shorten our string length by 2? If not then at (y,x) doesn't make sense. ex de, hl ; Swap DE and HL back jp nc, p64_END ; If we went negative, there wasn't anything to AT to, so we return. inc hl ; Onto our Y co-ordinate ld d, (hl) ; And load it into D dec bc ; Shorten our remaining string counter. inc hl ; Onto the X Co-ordinate ld e, (hl) ; Load it into E dec bc ; Shorten our remaining string counter call p64_test_X ; Make xy legal 60051 205 53 235 jr p64_eaa3 ; Go to save coords 60054 24 11 ;LOCAL newLine newLine: cp 13 ; Is this a newline character? 60056 254 13 jr nz, p64_isPrintable ; If not, hop to testing to see if we can print this 60058 32 13 ld de, (p64_coords) ; Get coords 60060 237 91 68 235 call p64_nxtLine ; Go to next line. ;LOCAL p64_eaa3 p64_eaa3: ld (p64_coords), de jr nextChar ;LOCAL p64_isPrintable p64_isPrintable: cp 31 ; Bigger than 31? 60073 254 31 jr c, nextChar ; If not, get the next one. 60075 56 7 push hl ; Save position 60077 229 push bc ; Save Count 60078 197 call p64_PrintChar ; Call Print SubRoutine 60079 205 189 234 pop bc ; Recover length count 60082 193 pop hl ; Recover Position 60083 225 ; LOCAL nextChar nextChar: inc hl ; Point to next character 60084 35 dec bc ; Count off this character 60085 11 ld a, b ; Did we run out? 60086 120 or c jr nz, examineChar ; If not, examine the next one 60088 32 193 jp p64_END ; Otherwise hop to END. 60090 201 ; LOCAL p64_PrintChar p64_PrintChar: exx push hl ; Save HL' 60094 229 exx sub 32 ; Take out 32 to convert ascii to position in charset 60096 214 32 ld h, 0 rra ; Divide by 2 60100 31 ld l, a ; Put our halved value into HL 60101 111 ld a, 240 ; Set our mask to LEFT side 60102 62 240 jr nc, p64_eacc ; If we didn't have a carry (even #), hop forward. 60104 48 2 ld a, 15 ; If we were ab idd #, set our mask to RIGHT side instead 60106 62 15 ;LOCAL p64_eacc p64_eacc: add hl, hl add hl, hl add hl, hl ; Multiply our char number by 8 60110 41 ld de, p64_charset ; Get our Charset position 60111 17 70 235 add hl, de ; And add our character count, so we're now pointed at the first ; byte of the right character. 60114 25 exx ld de, (p64_coords) ex af, af' call p64_loadAndTest ex af, af' inc e ld (p64_coords), de ; Put position+1 into coords 60126 237 83 68 235 dec e ld b, a rr e ; Divide X position by 2 60132 203 27 ld c, 0 rl c ; Bring carry flag into C (result of odd/even position) 60136 203 17 and 1 ; Mask out lowest bit in A 60138 230 1 xor c ; XOR with C (Matches position RightLeft with Char RightLeft) 60140 169 ld c, a jr z, p64_eaf6 ; If they are both the same, skip rotation. 60142 40 6 ld a, b rrca rrca rrca rrca ld b, a ;LOCAL p64_eaf6 p64_eaf6: ld a, d ; Get Y coord 60150 122 sra a sra a sra a ; Multiply by 8 60155 203 47 add a, 88 ld h, a ; Put high byte value for attribute into H. 60159 103 ld a, d and 7 rrca rrca rrca add a, e ld l, a ; Put low byte for attribute into l 60167 111 ld a, (23693) ; Get permanent Colours from System Variable 60168 58 141 92 ld (hl), a ; Write new attribute 60171 119 ld a, d and 248 add a, 64 ld h, a ld a, b cpl ld e, a exx ld b, 8 ;LOCAL p64_eb18 p64_eb18: ld a, (hl) exx bit 0, c jr z, p64_eb22 rrca rrca rrca rrca ;LOCAL p64_eb22 p64_eb22: and b ld d, a ld a, (hl) and e or d ld (hl), a inc h exx inc hl djnz p64_eb18 exx pop hl exx ret ; LOCAL p64_loadAndTest p64_loadAndTest: ld de, (p64_coords) ; SubRoutine to go to legal character position. (60213) ; LOCAL p64_test_X p64_test_X: ld a, e ; Get column from e cp 64 ; more than 64 ? jr c, p64_test_Y ; If not, then jump over nextline ;LOCAL p64_nxtLine p64_nxtLine: inc d ; Move down 1 ld e, 0 ; reset x co-ord to zero ; LOCAL p64_test_Y p64_test_Y: ld a, d ; get Y co-ord cp 24 ; Past 24? ret c ; Return if not. ld d, 0 ; Rest y co-ord to top of screen. ret ; Return. ; LOCAL p64_coords; p64_coords: defb 64; X Coordinate store 60228 64 defb 23; Y Coordinate Store 60229 23 ;LOCAL p64_charset p64_charset: DEFB 0,2,2,2,2,0,2,0 ; Space ! DEFB 0,80,82,7,2,7,2,0 ; "" # DEFB 0,37,113,66,114,20,117,32 ; $ % DEFB 0,34,84,32,96,80,96,0 ; & ' DEFB 0,36,66,66,66,66,36,0 ; ( ) DEFB 0,0,82,34,119,34,82,0 ; * + DEFB 0,0,0,0,7,32,32,64 ; , - DEFB 0,1,1,2,2,100,100,0 ; . / DEFB 0,34,86,82,82,82,39,0 ; 0 1 DEFB 0,34,85,18,33,69,114,0 ; 2 3 DEFB 0,87,84,118,17,21,18,0 ; 4 5 DEFB 0,55,65,97,82,84,36,0 ; 6 7 DEFB 0,34,85,37,83,85,34,0 ; 8 9 DEFB 0,0,2,32,0,34,2,4 ; : ; DEFB 0,0,16,39,64,39,16,0 ; < = DEFB 0,2,69,33,18,32,66,0 ; > ? DEFB 0,98,149,183,181,133,101,0 ; @ A Changed from ;0,2,37,87,117,85,53,0 DEFB 0,98,85,100,84,85,98,0 ; B C DEFB 0,103,84,86,84,84,103,0 ; D E DEFB 0,114,69,116,71,69,66,0 ; F G DEFB 0,87,82,114,82,82,87,0 ; H I DEFB 0,53,21,22,21,85,37,0 ; J K DEFB 0,69,71,71,69,69,117,0 ; L M DEFB 0,82,85,117,117,85,82,0 ; N O DEFB 0,98,85,85,103,71,67,0 ; P Q DEFB 0,98,85,82,97,85,82,0 ; R S DEFB 0,117,37,37,37,37,34,0 ; T U DEFB 0,85,85,85,87,39,37,0 ; V W DEFB 0,85,85,37,82,82,82,0 ; X Y DEFB 0,119,20,36,36,68,119,0 ; Z [ DEFB 0,71,65,33,33,17,23,0 ; \ ] DEFB 0,32,112,32,32,32,47,0 ; ^ _ DEFB 0,32,86,65,99,69,115,0 ; £ a DEFB 0,64,66,101,84,85,98,0 ; b c DEFB 0,16,18,53,86,84,35,0 ; d e DEFB 0,32,82,69,101,67,69,2 ; f g DEFB 0,66,64,102,82,82,87,0 ; h i DEFB 0,20,4,53,22,21,85,32 ; j k DEFB 0,64,69,71,71,85,37,0 ; l m DEFB 0,0,98,85,85,85,82,0 ; n o DEFB 0,0,99,85,85,99,65,65 ; p q DEFB 0,0,99,84,66,65,70,0 ; r s DEFB 0,64,117,69,69,85,34,0 ; t u DEFB 0,0,85,85,87,39,37,0 ; v w DEFB 0,0,85,85,35,81,85,2 ; x y DEFB 0,0,113,18,38,66,113,0 ; z { DEFB 0,32,36,34,35,34,36,0 ; | { DEFB 0,6,169,86,12,6,9,6 ; ~ (c) ;LOCAL p64_END p64_END: pop hl pop ix pop af ret END ASM END SUB ASM msgEND EQU 0 msgCR EQU 10 RET_OK EQU 0 RET_SOCKERR EQU 1 RET_PORTERR EQU 2 RET_RECEIVEERR EQU 4 RET_UNKNOWN EQU 128 SOCK_STREAM EQU 1 SOCK_DGRAM EQU 2 SOCK_RAW EQU 3 CALLBAS EQU 0x10 STACK_BC EQU $2D2B PRINT_FP EQU $2DE3 MODULECALL equ $3FF8 MODULECALL_NOPAGE equ $28 PAGEIN equ $3FF9 PAGEOUT equ $007C HLCALL equ $3FFA IXCALL equ $3FFD ; Port defines CTRLREG equ $033B CPLDINFO equ $023B ; Jump table entry points SOCKET equ $3E00 ; Allocate a socket CLOSE equ $3E03 ; Close a socket LISTEN equ $3E06 ; Listen for incoming connections ACCEPT equ $3E09 ; Accept an incoming connection BIND equ $3E0C ; Bind a local address to a socket CONNECT equ $3E0F ; Connect to a remote host SEND equ $3E12 ; Send data RECV equ $3E15 ; Receive data SENDTO equ $3E18 ; Send data to an address RECVFROM equ $3E1B ; Receive data from an address POLL equ $3E1E ; Poll a list of sockets POLLALL equ $3E21 ; Poll all open sockets POLLFD equ $3E24 ; Poll a single socket GETHOSTBYNAME equ $3E27 ; Look up a hostname PUTCHAR42 equ $3E2A ; 42 column print write a character PRINT42 equ $3E2D ; 42 column print a null terminated string CLEAR42 equ $3E30 ; Clear the screen and reset 42-col print SETPAGEA equ $3E33 ; Sets page area A SETPAGEB equ $3E36 ; Sets page area B LONG2IPSTRING equ $3E39 ; Convert a 4 byte big endian long to an IP IPSTRING2LONG equ $3E3C ; Convert an IP to a 4 byte big endian long ITOA8 equ $3E3F ; Convert a byte to ascii RAND16 equ $3E42 ; 16 bit PRNG REMOTEADDRESS equ $3E45 ; Fill struct sockaddr_in IFCONFIG_INET equ $3E48 ; Set IPv4 address IFCONFIG_NETMASK equ $3E4B ; Set netmask IFCONFIG_GW equ $3E4E ; Set gateway INITHW equ $3E51 ; Set the MAC address and initial hw registers GETHWADDR equ $3E54 ; Read the MAC address DECONFIG equ $3E57 ; Deconfigure inet, netmask and gateway MAC2STRING equ $3E5A ; Convert 6 byte MAC address to a string STRING2MAC equ $3E5D ; Convert a hex string to a 6 byte MAC address ITOH8 equ $3E60 ; Convert accumulator to hex string HTOI8 equ $3E63 ; Convert hex string to byte in A GETKEY equ $3E66 ; Get a key from the keyboard, and put it in A KEYUP equ $3E69 ; Wait for key release INPUTSTRING equ $3E6C ; Read a string into buffer at DE GET_IFCONFIG_INET equ $3E6F ; Gets the current IPv4 address GET_IFCONFIG_NETMASK equ $3E72 ; Gets the current netmask GET_IFCONFIG_GW equ $3E75 ; Gets the current gateway address SETTRAP equ $3E78 ; Sets the programmable trap DISABLETRAP equ $3E7B ; Disables the programmable trap ENABLETRAP equ $3E7E ; Enables the programmable trap PUSHPAGEA equ $3E81 ; Pages a page into area A, pushing the old one POPPAGEA equ $3E84 ; Restores the previous page in area A PUSHPAGEB equ $3E87 ; Pages into area B pushing the old one POPPAGEB equ $3E8A ; Restores the previous page in area B PAGETRAPRETURN equ $3E8D ; Returns from a trap to page area B TRAPRETURN equ $3E90 ; Returns from a trap that didn't page area B ADDBASICEXT equ $3E93 ; Adds a BASIC command STATEMENT_END equ $3E96 ; Check for statement end, exit at syntax time EXIT_SUCCESS equ $3E99 ; Use this to exit successfully after cmd PARSE_ERROR equ $3E9C ; Use this to exit to BASIC with a parse error RESERVEPAGE equ $3E9F ; Reserve a page of static RAM FREEPAGE equ $3EA2 ; Free a page of static RAM REPORTERR equ $3EA5 ; report an error via BASIC startupMSG: defm "Ardent's Spectranet TCP Client Test" end1MSG: defm 0 lookingupMSG: defm "Looking up hostname - the8bitmud.zapto.org" defm msgCR,msgCR,msgEND connectingMSG: defm "Connecting..." defm msgCR,msgEND allocatingMSG: defm "Allocating resources..." defm msgCR,msgEND connectedMSG: defm "Connected. " defm msgCR,msgEND receivngMSG: defm "Receiving data." defm msgCR, msgEND errorMSG: defm "Failed." defm msgCR,msgEND doneMSG: defm "Done" defm msgCR,msgEND waitingMSG: defm "I iz waitingz k :p" defm msgCR,msgEND crMSG: defm msgCR,msgEND v_sockfd: defb 0 ; storage for socket file descriptor serverport equ 32768 serverhost: defb "the8bitmud.zapto.org" connected: defb 0 ; 0 means not connected, 1 means connected ip_buffer: defb 0, 0, 0, 0 ; leave 4 bytes free for an IP address garbage: defm "ardentcrest" defm 13,10 garbageend: defb 0 garbage2: defm 0 garbageend2: defb 0 responseBuffer: defs 1024 responseBufferEnd: defb msgCR, msgEND END ASM
Reply
#33
No matter what I did I could nor get your code to work

Code:
#include <spectranet.bas> 30 conn1 = SNETconnect(4 , "the8bitmud.zapto.org", 16384)

So I used bits of polomints code.

As you see my code is all over the place but works.
I'm always on the chat or facebook.
Reply
#34
Still can not get it to work. I must be just stuped...
I'm always on the chat or facebook.
Reply
#35
Code:
#include <spectranet.bas> open = SNETsocket(1) print open conn = SNETconnect(open,"192.168.1.1",16384)

that does not work nor conn = SNETconnect(open,"the8bitmud.zapto.org",16384)
I'm always on the chat or facebook.
Reply
#36
A bit confused on how to use the ip$ here

Code:
Function FASTCALL SNETconnect(socket As ubyte, ip$, port As uinteger) As byte Asm pop hl ; ret address pop de ; string containing the IP in CODE format. e.g. 10.0.0.1 = chr$(10, 0, 0, 1)
I'm always on the chat or facebook.
Reply
#37
Time for me to give up on this.....
I'm always on the chat or facebook.
Reply
#38
ardentcrest Wrote:Time for me to give up on this.....
If you read the comment above (in the ASM source code) the IP must be constructed with CHR$(), like:
Code:
REM 192.158.1.4 IP$ = CHR$(192, 158, 1, 4) REM also... IP$ = CHR$(192) + CHR$(158) + CHR$(1) + CHR$(4) ' This is equivalent but slower
Reply
#39
I'm still having problems with your code Sad But I do now have some code that works.

Now I need help with this

I have this

Code:
ASM garbage2: defm 0 END ASM

How would I put a text string into garbage2 from basic. Would I have to poke each CHR code one by one, and how would I find the address if garbage2
I'm always on the chat or facebook.
Reply
#40
ardentcrest Wrote:I'm still having problems with your code Sad But I do now have some code that works.

Now I need help with this

I have this

Code:
ASM garbage2: defm 0 END ASM

How would I put a text string into garbage2 from basic. Would I have to poke each CHR code one by one, and how would I find the address if garbage2
If you have code that works, then it would be very useful to me to check if my routines are failing and why (no information last year, just reverse engineering, and little time...).
For the 2nd question, you can:
Code:
LET a$ = "Hello World" FOR i = 0 TO LEN(a$) - 1: POKE @MyLabel, CODE a$(i) DoSomething(...) NEXT i END : REM Prevents the program entering MyLabel zone MyLabel: ASM: garbage2: END ASM
Reply
#41
check my post. above its the dirty code Smile

so with that code if garbage2: was address 60000, would all the text go in just 60000 because I would like the code to do

H=60000
e=60001
l=60002

and so on....

PS I'm really getting in to the compiler in a big way. Must do a game with it Smile


On a side note. this client will have to be like an IRC client with two boxes. one for the incoming text and one for the input, as there will be incoming text as you are typing, and that will start to get messy, and then incoming text box will have to scroll while the input box stays static. :?
I'm always on the chat or facebook.
Reply
#42
To do that, you have to *ensure* there's enough room for the string you're allocating in the ASM space:
Code:
LET a$ = "Hello World" REM Poke all the string chars starting at address @MyLabel FOR i = 0 TO LEN(a$) - 1: POKE @MyLabel + i, CODE a$(i) NEXT i DoSomething(...) : REM OK, now this is OUT OF THE LOOP END : REM Prevents the program entering MyLabel zone MyLabel: ASM: garbage2: ds 32 ; 32 bytes of space MAX!! END ASM
Reply
#43
I had an idea it was

@MyLabel + i

TY for the help.
I'm always on the chat or facebook.
Reply
#44
Its slowly coming together. still need help.

In my print routine

Code:
ld a, (v_sockfd) ld de, **address of text** ld bc, **length of text string** ld hl, SEND call HLCALL

How can I make this a function.
I'm always on the chat or facebook.
Reply
#45
Can you take a look and tell me what I'm doing wrong

TEST
Code:
#include <keys.bas> #include <net.bas> paper 0 ink 7 cls start() pause 50 opensocket() pause 50 hostip() pause 50 connect() pause 50 sendfirst() pause 100 cls print at 0,0; LET a$ = "ardentcrest" let t=LEN(a$) - 1 REM Poke all the string chars starting at address @MyLabel FOR i = 0 TO LEN(a$) - 1: POKE @MyLabel + i, CODE a$(i) NEXT i POKE @MyLabel + (t+1),13 POKE @MyLabel + (t+2),10 poke @MyLabel2, (t+2) mainloop() send() mainloop()



NET
Code:
SUB fastcall start() ASM ld hl, startupMSG ld bc, end1-startupMSG call myPrint64 ld hl, lookingupMSG ld bc, end2-lookingupMSG call myPrint64 END ASM END SUB SUB fastcall opensocket() ASM ld c, 1 ld hl, SOCKET call HLCALL ld (v_sockfd), a ret END ASM END SUB SUB fastcall hostip() ASM ld hl, serverhost ld de, ip_buffer ld ix, GETHOSTBYNAME call IXCALL ret END ASM END SUB SUB fastcall connect() ASM ld hl, connectingMSG ld bc, end3-connectingMSG call myPrint64 ; now actually connect... ld a, (v_sockfd) ; get back the socket file descriptor ld de, ip_buffer ; point to the dotted ip notation we got previously ld bc, serverport ; the port I want to use to connect on... (22528 as is heh) ld hl, CONNECT call HLCALL ; call the Spectranet CONNECT ROM routine, :D ;jp c, commerror ; carry is set if there is an error (fingers crossed k) ; CONNECTED !!! xor a inc a ld (connected), a ld hl, connectedMSG ld bc, end5-connectedMSG call myPrint64 END ASM END SUB SUB fastcall sendfirst() ASM ld a, (v_sockfd) ld de, garbage ld bc, garbageend-garbage ld hl, SEND call HLCALL END ASM END SUB SUB fastcall send() ASM ld a, (v_sockfd) ld de, text1 ld bc, lenth1 ld hl, SEND call HLCALL END ASM END SUB SUB fastcall mainloop() ASM ; main receive loop, :/ .tightloop: ; poll the socket to see if data is waiting call pollSocket jr c, .no_data1 ; there is data to be collected .gData2: call clearBuffer ld a, (v_sockfd) ld de, responseBuffer ld bc, responseBufferEnd-responseBuffer ld hl, RECV call HLCALL jp c, commerror ld hl, responseBuffer ; get the address of the buffer add hl, bc ; add on the number of received bytes inc hl ld (hl), msgEND ; mark that point as the end of the text call displayData ; and just display that, :D jr .tightloop .no_data1: xor a ; .checkkeys: ; jr nc, .tightloop ; now close the socket, dunno why cos I ain't never ever gonna give you up, err, I mean drop to BASIC ; green indicates complete run through worked ok... ret ;======================================================================== pollSocket: ; returns carry clear if data to be fetched ; or set carry to indicate no data... ld a, (v_sockfd) ld hl, POLLFD CALL HLCALL jr z, .nodata scf ccf ret .nodata: scf ret displayData: ;ld a, 3 ;out ($fe), a ld hl, responseBuffer call myPrint64 ret END ASM END SUB SUB fastcall clearBuffer() ASM clearBuffer: ld hl, responseBuffer ld de, responseBuffer+1 ld bc, responseBufferEnd-responseBuffer-1 ld (hl), 32 ldir ret END ASM END SUB SUB fastcall commerror() ASM commerror: ld a, 2 out ($fe), a ; turn border red to indicate error... :/ ld hl, errorMSG call myPrint64 ; print the error msg ld a, (v_sockfd) and a ; do we have a socket? ret z ; nope, so return ;NOTE: This may cause a ret to BASIC, grr, will sort it later, :p ld hl, CLOSE ; we have a socket, so clean it up call HLCALL ;call end_interrupts ; reset interrupts back to im 1.. ret END ASM END SUB SUB fastcall myPrint42() ASM myPrint42: push af push ix push hl ld ix, PRINT42 CALL IXCALL pop hl pop ix pop af ret END ASM END SUB SUB fastcall myPrint64() ASM myPrint64: push af push ix push hl ; Test string length. If Zero, exit. ld a, c or b jp z, p64_END ;LOCAL examineChar examineChar: ld a, (hl) ; Grab the character cp 128 ; too high to print? jr nc, nextChar ; then we go to next. cp 22 ; Is this an AT? jr nz, newLine ; If not, hop to newLine routine. ex de, hl ; Swap DE and HL and a ; Clear Carry ld hl, 2 ; sbc hl, bc ; Can we Shorten our string length by 2? If not then at (y,x) doesn't make sense. ex de, hl ; Swap DE and HL back jp nc, p64_END ; If we went negative, there wasn't anything to AT to, so we return. inc hl ; Onto our Y co-ordinate ld d, (hl) ; And load it into D dec bc ; Shorten our remaining string counter. inc hl ; Onto the X Co-ordinate ld e, (hl) ; Load it into E dec bc ; Shorten our remaining string counter call p64_test_X ; Make xy legal 60051 205 53 235 jr p64_eaa3 ; Go to save coords 60054 24 11 ;LOCAL newLine newLine: cp 13 ; Is this a newline character? 60056 254 13 jr nz, p64_isPrintable ; If not, hop to testing to see if we can print this 60058 32 13 ld de, (p64_coords) ; Get coords 60060 237 91 68 235 call p64_nxtLine ; Go to next line. ;LOCAL p64_eaa3 p64_eaa3: ld (p64_coords), de jr nextChar ;LOCAL p64_isPrintable p64_isPrintable: cp 31 ; Bigger than 31? 60073 254 31 jr c, nextChar ; If not, get the next one. 60075 56 7 push hl ; Save position 60077 229 push bc ; Save Count 60078 197 call p64_PrintChar ; Call Print SubRoutine 60079 205 189 234 pop bc ; Recover length count 60082 193 pop hl ; Recover Position 60083 225 ; LOCAL nextChar nextChar: inc hl ; Point to next character 60084 35 dec bc ; Count off this character 60085 11 ld a, b ; Did we run out? 60086 120 or c jr nz, examineChar ; If not, examine the next one 60088 32 193 jp p64_END ; Otherwise hop to END. 60090 201 ; LOCAL p64_PrintChar p64_PrintChar: exx push hl ; Save HL' 60094 229 exx sub 32 ; Take out 32 to convert ascii to position in charset 60096 214 32 ld h, 0 rra ; Divide by 2 60100 31 ld l, a ; Put our halved value into HL 60101 111 ld a, 240 ; Set our mask to LEFT side 60102 62 240 jr nc, p64_eacc ; If we didn't have a carry (even #), hop forward. 60104 48 2 ld a, 15 ; If we were ab idd #, set our mask to RIGHT side instead 60106 62 15 ;LOCAL p64_eacc p64_eacc: add hl, hl add hl, hl add hl, hl ; Multiply our char number by 8 60110 41 ld de, p64_charset ; Get our Charset position 60111 17 70 235 add hl, de ; And add our character count, so we're now pointed at the first ; byte of the right character. 60114 25 exx ld de, (p64_coords) ex af, af' call p64_loadAndTest ex af, af' inc e ld (p64_coords), de ; Put position+1 into coords 60126 237 83 68 235 dec e ld b, a rr e ; Divide X position by 2 60132 203 27 ld c, 0 rl c ; Bring carry flag into C (result of odd/even position) 60136 203 17 and 1 ; Mask out lowest bit in A 60138 230 1 xor c ; XOR with C (Matches position RightLeft with Char RightLeft) 60140 169 ld c, a jr z, p64_eaf6 ; If they are both the same, skip rotation. 60142 40 6 ld a, b rrca rrca rrca rrca ld b, a ;LOCAL p64_eaf6 p64_eaf6: ld a, d ; Get Y coord 60150 122 sra a sra a sra a ; Multiply by 8 60155 203 47 add a, 88 ld h, a ; Put high byte value for attribute into H. 60159 103 ld a, d and 7 rrca rrca rrca add a, e ld l, a ; Put low byte for attribute into l 60167 111 ld a, (23693) ; Get permanent Colours from System Variable 60168 58 141 92 ld (hl), a ; Write new attribute 60171 119 ld a, d and 248 add a, 64 ld h, a ld a, b cpl ld e, a exx ld b, 8 ;LOCAL p64_eb18 p64_eb18: ld a, (hl) exx bit 0, c jr z, p64_eb22 rrca rrca rrca rrca ;LOCAL p64_eb22 p64_eb22: and b ld d, a ld a, (hl) and e or d ld (hl), a inc h exx inc hl djnz p64_eb18 exx pop hl exx ret ; LOCAL p64_loadAndTest p64_loadAndTest: ld de, (p64_coords) ; SubRoutine to go to legal character position. (60213) ; LOCAL p64_test_X p64_test_X: ld a, e ; Get column from e cp 64 ; more than 64 ? jr c, p64_test_Y ; If not, then jump over nextline ;LOCAL p64_nxtLine p64_nxtLine: inc d ; Move down 1 ld e, 0 ; reset x co-ord to zero ; LOCAL p64_test_Y p64_test_Y: ld a, d ; get Y co-ord cp 24 ; Past 24? ret c ; Return if not. ld d, 0 ; Rest y co-ord to top of screen. ret ; Return. ; LOCAL p64_coords; p64_coords: defb 64; X Coordinate store 60228 64 defb 23; Y Coordinate Store 60229 23 ;LOCAL p64_charset p64_charset: DEFB 0,2,2,2,2,0,2,0 ; Space ! DEFB 0,80,82,7,2,7,2,0 ; "" # DEFB 0,37,113,66,114,20,117,32 ; $ % DEFB 0,34,84,32,96,80,96,0 ; & ' DEFB 0,36,66,66,66,66,36,0 ; ( ) DEFB 0,0,82,34,119,34,82,0 ; * + DEFB 0,0,0,0,7,32,32,64 ; , - DEFB 0,1,1,2,2,100,100,0 ; . / DEFB 0,34,86,82,82,82,39,0 ; 0 1 DEFB 0,34,85,18,33,69,114,0 ; 2 3 DEFB 0,87,84,118,17,21,18,0 ; 4 5 DEFB 0,55,65,97,82,84,36,0 ; 6 7 DEFB 0,34,85,37,83,85,34,0 ; 8 9 DEFB 0,0,2,32,0,34,2,4 ; : ; DEFB 0,0,16,39,64,39,16,0 ; < = DEFB 0,2,69,33,18,32,66,0 ; > ? DEFB 0,98,149,183,181,133,101,0 ; @ A Changed from ;0,2,37,87,117,85,53,0 DEFB 0,98,85,100,84,85,98,0 ; B C DEFB 0,103,84,86,84,84,103,0 ; D E DEFB 0,114,69,116,71,69,66,0 ; F G DEFB 0,87,82,114,82,82,87,0 ; H I DEFB 0,53,21,22,21,85,37,0 ; J K DEFB 0,69,71,71,69,69,117,0 ; L M DEFB 0,82,85,117,117,85,82,0 ; N O DEFB 0,98,85,85,103,71,67,0 ; P Q DEFB 0,98,85,82,97,85,82,0 ; R S DEFB 0,117,37,37,37,37,34,0 ; T U DEFB 0,85,85,85,87,39,37,0 ; V W DEFB 0,85,85,37,82,82,82,0 ; X Y DEFB 0,119,20,36,36,68,119,0 ; Z [ DEFB 0,71,65,33,33,17,23,0 ; \ ] DEFB 0,32,112,32,32,32,47,0 ; ^ _ DEFB 0,32,86,65,99,69,115,0 ; £ a DEFB 0,64,66,101,84,85,98,0 ; b c DEFB 0,16,18,53,86,84,35,0 ; d e DEFB 0,32,82,69,101,67,69,2 ; f g DEFB 0,66,64,102,82,82,87,0 ; h i DEFB 0,20,4,53,22,21,85,32 ; j k DEFB 0,64,69,71,71,85,37,0 ; l m DEFB 0,0,98,85,85,85,82,0 ; n o DEFB 0,0,99,85,85,99,65,65 ; p q DEFB 0,0,99,84,66,65,70,0 ; r s DEFB 0,64,117,69,69,85,34,0 ; t u DEFB 0,0,85,85,87,39,37,0 ; v w DEFB 0,0,85,85,35,81,85,2 ; x y DEFB 0,0,113,18,38,66,113,0 ; z { DEFB 0,32,36,34,35,34,36,0 ; | { DEFB 0,6,169,86,12,6,9,6 ; ~ (c) ;LOCAL p64_END p64_END: pop hl pop ix pop af ret END ASM END SUB ASM msgEND EQU 0 msgCR EQU 10 RET_OK EQU 0 RET_SOCKERR EQU 1 RET_PORTERR EQU 2 RET_RECEIVEERR EQU 4 RET_UNKNOWN EQU 128 SOCK_STREAM EQU 1 SOCK_DGRAM EQU 2 SOCK_RAW EQU 3 CALLBAS EQU 0x10 STACK_BC EQU $2D2B PRINT_FP EQU $2DE3 MODULECALL equ $3FF8 MODULECALL_NOPAGE equ $28 PAGEIN equ $3FF9 PAGEOUT equ $007C HLCALL equ $3FFA IXCALL equ $3FFD ; Port defines CTRLREG equ $033B CPLDINFO equ $023B ; Jump table entry points SOCKET equ $3E00 ; Allocate a socket CLOSE equ $3E03 ; Close a socket LISTEN equ $3E06 ; Listen for incoming connections ACCEPT equ $3E09 ; Accept an incoming connection BIND equ $3E0C ; Bind a local address to a socket CONNECT equ $3E0F ; Connect to a remote host SEND equ $3E12 ; Send data RECV equ $3E15 ; Receive data SENDTO equ $3E18 ; Send data to an address RECVFROM equ $3E1B ; Receive data from an address POLL equ $3E1E ; Poll a list of sockets POLLALL equ $3E21 ; Poll all open sockets POLLFD equ $3E24 ; Poll a single socket GETHOSTBYNAME equ $3E27 ; Look up a hostname PUTCHAR42 equ $3E2A ; 42 column print write a character PRINT42 equ $3E2D ; 42 column print a null terminated string CLEAR42 equ $3E30 ; Clear the screen and reset 42-col print SETPAGEA equ $3E33 ; Sets page area A SETPAGEB equ $3E36 ; Sets page area B LONG2IPSTRING equ $3E39 ; Convert a 4 byte big endian long to an IP IPSTRING2LONG equ $3E3C ; Convert an IP to a 4 byte big endian long ITOA8 equ $3E3F ; Convert a byte to ascii RAND16 equ $3E42 ; 16 bit PRNG REMOTEADDRESS equ $3E45 ; Fill struct sockaddr_in IFCONFIG_INET equ $3E48 ; Set IPv4 address IFCONFIG_NETMASK equ $3E4B ; Set netmask IFCONFIG_GW equ $3E4E ; Set gateway INITHW equ $3E51 ; Set the MAC address and initial hw registers GETHWADDR equ $3E54 ; Read the MAC address DECONFIG equ $3E57 ; Deconfigure inet, netmask and gateway MAC2STRING equ $3E5A ; Convert 6 byte MAC address to a string STRING2MAC equ $3E5D ; Convert a hex string to a 6 byte MAC address ITOH8 equ $3E60 ; Convert accumulator to hex string HTOI8 equ $3E63 ; Convert hex string to byte in A GETKEY equ $3E66 ; Get a key from the keyboard, and put it in A KEYUP equ $3E69 ; Wait for key release INPUTSTRING equ $3E6C ; Read a string into buffer at DE GET_IFCONFIG_INET equ $3E6F ; Gets the current IPv4 address GET_IFCONFIG_NETMASK equ $3E72 ; Gets the current netmask GET_IFCONFIG_GW equ $3E75 ; Gets the current gateway address SETTRAP equ $3E78 ; Sets the programmable trap DISABLETRAP equ $3E7B ; Disables the programmable trap ENABLETRAP equ $3E7E ; Enables the programmable trap PUSHPAGEA equ $3E81 ; Pages a page into area A, pushing the old one POPPAGEA equ $3E84 ; Restores the previous page in area A PUSHPAGEB equ $3E87 ; Pages into area B pushing the old one POPPAGEB equ $3E8A ; Restores the previous page in area B PAGETRAPRETURN equ $3E8D ; Returns from a trap to page area B TRAPRETURN equ $3E90 ; Returns from a trap that didn't page area B ADDBASICEXT equ $3E93 ; Adds a BASIC command STATEMENT_END equ $3E96 ; Check for statement end, exit at syntax time EXIT_SUCCESS equ $3E99 ; Use this to exit successfully after cmd PARSE_ERROR equ $3E9C ; Use this to exit to BASIC with a parse error RESERVEPAGE equ $3E9F ; Reserve a page of static RAM FREEPAGE equ $3EA2 ; Free a page of static RAM REPORTERR equ $3EA5 ; report an error via BASIC startupMSG: defm "Ardent's Spectranet TCP Client Test" defm 13 end1: defm 0 lookingupMSG: defm "Looking up hostname" defm 13,13,13 end2: defm 0 connectingMSG: defm "Connecting..." defm 13 end3: defm 0 allocatingMSG: defm "Allocating resources..." defm 13 end4: defm 0 connectedMSG: defm "Connected. " defm 13 end5: defm 0 receivngMSG: defm "Receiving data." defm 13 end6: defm 0 errorMSG: defm "Failed." defm 13 end7: defm 0 doneMSG: defm "Done" defm 13 end8: defm 0 waitingMSG: defm "I iz waitingz k :p" defm 13 end9: defm 0 crMSG: defm 13 end10: defm 0 v_sockfd: defb 0 ; storage for socket file descriptor serverport equ 16384 serverhost: defb "the8bitmud.zapto.org" connected: defb 0 ; 0 means not connected, 1 means connected ip_buffer: defb 0, 0, 0, 0 ; leave 4 bytes free for an IP address garbage: defm " " defm 13,10 garbageend: defb 0 responseBuffer: ds 1024 responseBufferEnd: defm 0 END ASM MyLabel: ASM text1: ds 1024 ; 1024 bytes of space MAX!! END ASM MyLabel2: ASM lenth1: ds 1 ; 1024 bytes of space MAX!! END ASM


Also the screen does not scroll buts prints from the top of the screen when it gets to the bottom.
I'm always on the chat or facebook.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)