FAQ  •  Register  •  Login

Spectranet

<<

ardentcrest

Posts: 94

Joined: Fri Oct 11, 2013 5:19 pm

Post Tue Jan 20, 2015 4:26 pm

Re: Spectranet

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.
<<

boriel

Site Admin

Posts: 1463

Joined: Wed Nov 01, 2006 6:18 pm

Location: Santa Cruz de Tenerife, Spain

Post Tue Jan 20, 2015 4:40 pm

Re: Spectranet

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
<<

ardentcrest

Posts: 94

Joined: Fri Oct 11, 2013 5:19 pm

Post Tue Jan 20, 2015 4:47 pm

Re: Spectranet

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.
<<

ardentcrest

Posts: 94

Joined: Fri Oct 11, 2013 5:19 pm

Post Tue Jan 20, 2015 10:06 pm

Re: Spectranet

Still can not get it to work. I must be just stuped...
I'm always on the chat or facebook.
<<

ardentcrest

Posts: 94

Joined: Fri Oct 11, 2013 5:19 pm

Post Tue Jan 20, 2015 10:19 pm

Re: Spectranet

  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.
<<

ardentcrest

Posts: 94

Joined: Fri Oct 11, 2013 5:19 pm

Post Wed Jan 21, 2015 10:02 pm

Re: Spectranet

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.
<<

ardentcrest

Posts: 94

Joined: Fri Oct 11, 2013 5:19 pm

Post Wed Feb 11, 2015 12:15 pm

Re: Spectranet

Time for me to give up on this.....
I'm always on the chat or facebook.
<<

boriel

Site Admin

Posts: 1463

Joined: Wed Nov 01, 2006 6:18 pm

Location: Santa Cruz de Tenerife, Spain

Post Wed Feb 11, 2015 1:48 pm

Re: Spectranet

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
<<

ardentcrest

Posts: 94

Joined: Fri Oct 11, 2013 5:19 pm

Post Thu Feb 12, 2015 2:33 pm

Re: Spectranet

I'm still having problems with your code :( 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.
<<

boriel

Site Admin

Posts: 1463

Joined: Wed Nov 01, 2006 6:18 pm

Location: Santa Cruz de Tenerife, Spain

Post Thu Feb 12, 2015 4:08 pm

Re: Spectranet

ardentcrest wrote:I'm still having problems with your code :( 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

<<

ardentcrest

Posts: 94

Joined: Fri Oct 11, 2013 5:19 pm

Post Thu Feb 12, 2015 5:57 pm

Re: Spectranet

check my post. above its the dirty code :)

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 :)


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.
<<

boriel

Site Admin

Posts: 1463

Joined: Wed Nov 01, 2006 6:18 pm

Location: Santa Cruz de Tenerife, Spain

Post Sat Feb 14, 2015 1:28 pm

Re: Spectranet

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
<<

ardentcrest

Posts: 94

Joined: Fri Oct 11, 2013 5:19 pm

Post Sat Feb 14, 2015 1:30 pm

Re: Spectranet

I had an idea it was

@MyLabel + i

TY for the help.
I'm always on the chat or facebook.
<<

ardentcrest

Posts: 94

Joined: Fri Oct 11, 2013 5:19 pm

Post Sun Feb 15, 2015 10:35 pm

Re: Spectranet

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.
<<

ardentcrest

Posts: 94

Joined: Fri Oct 11, 2013 5:19 pm

Post Mon Feb 16, 2015 12:08 pm

Re: Spectranet

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.
Previous

Return to Wishlist

Who is online

Users browsing this forum: No registered users and 1 guest

cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by Vjacheslav Trushkin for Free Forums/DivisionCore.

phpBB SEO