From e5cb65a302e69224e7ef05669b579876d91c87d3 Mon Sep 17 00:00:00 2001 From: John Bintz Date: Mon, 18 Mar 2024 12:34:30 -0400 Subject: [PATCH] Fix string returns --- AMOSPro_BSDSocket.Lib | Bin 6120 -> 6084 bytes README.md | 11 +++- src/BSDSocket.s | 119 +++++++++++++++++++----------------------- 3 files changed, 64 insertions(+), 66 deletions(-) diff --git a/AMOSPro_BSDSocket.Lib b/AMOSPro_BSDSocket.Lib index 70f41a4e6d3b07909caabc799e4e8d0d10d66859..dab21d28b0b75a48b7538d7eb70ca696eac16259 100644 GIT binary patch delta 269 zcmaE%e?)(RxabQ82IiLx46Hz!!4Jq5Vqg%yGEv7`*q)(|L61S6;TppXAZfxN!BDob z%7kA>gJVWlu!|ZClk@+7A|Q>*nCLfISV7-`=eQQrUn delta 322 zcmX@2|3ZI)xada)2IiLx46Hz!!4Jq5Vqg&dHc`h~*oL8oL61S6;TppXAZfxN!O*j@ z%7kA{jbmC@u=78`?+lD(28V;41veQm7%&8${{O>_gUOkJ@xozk54NnyxA+g}=`)rw zm@%k$AQY>4A(WeNFgXF09|9>?kk{wjd`93oi>#JHE)&OvKTNxnoE826-Na~c(L_+- zqXHukGfmzis^$h$pm0FNL7%IPA;{TFDvja)FO_(>%wdF$2>T2;m>hui9RS&<#<^KQ ztdh~zP}j)7$i%?d&|E&iCCoL*O2JSM2;nM$jsgMZ FPXKx(UfTcw diff --git a/README.md b/README.md index e9d6a77..ce3b428 100644 --- a/README.md +++ b/README.md @@ -197,7 +197,16 @@ to contact me. * Fix crash bug in `Socket Inet Ntoa$` if called with the BSD Socket library was not open. -# +### 1.1.2 (2024-03-18) + +* Fix all functions that return strings so that strings work properly + in AMOS. While you could kind of use the immediate return value of the + string, any future manipulation of that string would fail. This fixes + the following functions: + * `Socket Inet Ntoa$` + * `Dns Get Address By Name$` + * `Socket Recv$` + # Development ### Environment diff --git a/src/BSDSocket.s b/src/BSDSocket.s index 5014c87..62f69ec 100644 --- a/src/BSDSocket.s +++ b/src/BSDSocket.s @@ -7,7 +7,7 @@ ; extension number 18 ExtNb equ 18-1 Version MACRO - dc.b "1.1.1-20240317" + dc.b "1.1.2-20240318" ENDM VerNumber equ $1 @@ -1184,12 +1184,12 @@ _SocketSelect_PerformSelect Lib_Par SocketInetNtoA ; - - - - - - - - - - - - - PreserveStackFunction - EnsureBSDSocketLibrary _SocketInetNtoa_LibraryOpen + EnsureBSDSocketLibrary _SocketInetNtoA_LibraryOpen RestoreStackFunction Ret_Int -_SocketInetNtoa_LibraryOpen: +_SocketInetNtoA_LibraryOpen: MOVE.L D3,D0 WithDataStorageToA3 LoadBSDSocketBaseFromA3 @@ -1204,22 +1204,27 @@ _SocketInetNtoA_StringSizeLoop: TST.B (A0)+ BNE _SocketInetNtoA_StringSizeLoop - MOVE.L A0,D3 - SUB.L A2,D3 ; D3 = length - SUBQ #1,D3 ; get rid of the null terminator + MOVE.L A0,D4 + SUB.L A2,D4 ; D4 = length + SUBQ #1,D4 ; get rid of the null terminator + + ; add 2 and even out the space + MOVE.L D4,D3 + AND.W #$FFFE,D3 + ADDQ.W #2,D3 + Rjsr L_Demande ; string base address is in A0/A1 - MOVE.W D3,(A0)+ ; length of string - SUBQ #1,D3 + LEA 2(A0,D3.W),A1 + MOVE.L A1,HiChaine(A5) + MOVE.L A0,A1 + + MOVE.W D4,(A0)+ ; length of string + SUBQ #1,D4 _SocketInetNtoA_StringCopyLoop: - MOVE.B (A2,D3),(A0,D3) - DBRA D3,_SocketInetNtoA_StringCopyLoop - - ; make the address even - EvenOutStringAddress A0,D3 - - MOVE.L A0,HiChaine(A5) ; Does L_Demande nuke A5 too? + MOVE.B (A2,D4),(A0,D4) + DBRA D4,_SocketInetNtoA_StringCopyLoop MOVE.L A1,D3 ; string return @@ -1267,14 +1272,12 @@ _SocketRecvString_NotNegative: _SocketRecvString_NotTooLong: MOVE.L A3,-(SP) ; preserve A3 - MOVE.L D0,-(SP) ; preserve D0 ; reserve memory for recv buffer Rjsr L_RamFast ; D0 now contains memory pointer BNE _SocketRecvString_BufferAllocated ; reserve failed MOVE.L (SP)+,D0 - MOVE.L (SP)+,A3 MOVE.L ChVide(A5),D3 ; empty string @@ -1284,16 +1287,14 @@ _SocketRecvString_NotTooLong: _SocketRecvString_BufferAllocated: MOVE.L D0,A0 ; buffer address MOVE.L D1,D0 ; socket - MOVE.L (SP)+,D1 ; length + MOVE.L (SP)+,D1 ; reserved ram buffer length MOVEQ #0,D2 ; flags MOVEM.L A0-A1/D1,-(SP) - WithDataStorageToA3 LoadBSDSocketBaseFromA3 CALLLIB recv ; D0 has received length or -1 EndDataStorage - MOVEM.L (SP)+,A0-A1/D1 ; did we receive data? if we didn't get a single byte, we're done @@ -1304,7 +1305,6 @@ _SocketRecvString_BufferAllocated: MOVE.L D1,D0 MOVE.L A0,A1 Rjsr L_RamFree - MOVE.L (SP)+,A3 MOVE.L ChVide(A5),D3 @@ -1314,37 +1314,37 @@ _SocketRecvString_BufferAllocated: ; TODO received data is wrong somewhere _SocketRecvString_DataReceived: - ; D0 contains receive length + ; D0 contains socket receive length - MOVE.L D1,-(SP) + ; TODO: handle zero return length + + MOVE.L A0,A2 ; A2 contains read buffer + + MOVE.L D1,-(SP) ; reserved ram buffer length + ; demande/hichaine string setup MOVEQ #0,D3 - MOVE.W D0,D3 ; prep for L_Demande. can we request a zero length string? - MOVE.L A0,A2 ; L_Demande blows away A0 and A1, A2 now contains buffer + MOVE.W D0,D3 + AND.W #$FFFE,D3 + ADDQ #2,D3 Rjsr L_Demande ; A0/A1 contain string address - MOVE.W D3,(A0)+ ; put in string length - SUBQ #1,D3 ; reduce by one for DBRA + LEA 2(A0,D3.W),A1 + MOVE.L A1,HiChaine(A5) + MOVE.L A0,A1 + + MOVE.W D0,(A1)+ ; put in string length + SUBQ #1,D0 ; reduce by one for DBRA MOVE.L A2,A3 ; A3 now contains start of buffer _SocketRecvString_CopyData: - MOVE.B (A2,D3),(A0,D3) - DBRA D3,_SocketRecvString_CopyData + MOVE.B (A2,D0),(A1,D0) + DBRA D0,_SocketRecvString_CopyData + MOVE.L (SP)+,D0 ; reserved ram buffer length - EvenOutStringAddress A0,D2 - - ; add to string manager for garbage collection? - MOVE.L A0,HiChaine(A5) - MOVE.L (SP)+,D0 - - ; free ram - MOVE.L A1,-(SP) ; A1 contains our string addres - - ;MOVE.L D1,D0 + MOVE.L A0,-(SP) MOVE.L A3,A1 Rjsr L_RamFree - - MOVE.L (SP)+,D3 ; string return - + MOVE.L (SP)+,D3 MOVE.L (SP)+,A3 RestoreStackFunction @@ -1735,7 +1735,7 @@ _SocketReuseAddr_LibraryOpen: ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; =Dns Get Host Address By Name$(Name String) +; =Dns Get Address By Name$(Name String) ; ; Get the status of a socket ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1789,14 +1789,6 @@ _SocketReuseAddr_LibraryOpen: TST.L D0 BNE .GetIPAddress - Dlea DebugArea,A0 - MOVE.L D3,A1 - MOVE.L #1,(A0)+ - MOVE.W (A1),(A0)+ - MOVE.W (A1),D2 - MOVE.B 1(A1,D2),(A0)+ - MOVE.B 2(A1,D2),(A0)+ - RestoreStackFunction MOVE.L ChVide(A5),D3 @@ -1813,9 +1805,6 @@ _SocketReuseAddr_LibraryOpen: CALLLIB Inet_NtoA EndDataStorage - Dlea DebugArea,A0 - MOVE.L D0,(A0)+ - MOVE.L D0,A2 MOVE.L A2,-(SP) MOVEQ #0,D3 @@ -1826,21 +1815,21 @@ _SocketReuseAddr_LibraryOpen: BNE .GetIPAddressLength MOVE.L (SP)+,A2 - Dlea DebugArea,A0 - MOVE.L D3,(A0)+ + MOVE.L D3,D4 + AND.W #$FFFE,D3 + ADDQ #2,D3 Rjsr L_Demande ; string is in A0/A1 - MOVE.W D3,(A0)+ - SUBQ #1,D3 + LEA 2(A0,D3.W),A1 + MOVE.L A1,HiChaine(A5) + MOVE.L A0,D3 + + MOVE.W D4,(A0)+ + SUBQ #1,D4 .KeepCopying: - MOVE.B (A2,D3),(A0,D3) - DBRA D3,.KeepCopying - - EvenOutStringAddress A0,D0 - - MOVE.L A0,HiChaine(A5) - MOVE.L A1,D3 + MOVE.B (A2,D4),(A0,D4) + DBRA D4,.KeepCopying RestoreStackFunction