Questo esempio cerca di mostrare il comportamento del sistema quando ha a che fare con la conversione tra tipi, con o senza segno. La regola che ugBASIC utilizza è quella dell'errore minimo: in generale, se il tipo di destinazione ha un numero sufficiente di bit, è possibile rappresentare l'informazione senza perdite. Se il tipo di destinazione ha un numero inferiore di bit, si garantisce che il numero sia rappresentato correttamente se il numero di bit di destinazione sono sufficienti. In caso di tipi con segno, se il numero di sorgente è negativo ma il tipo di destinazione è privo di segno, il valore sarà posto al valor assoluto.
PROCEDURE example ON ALL BUT VIC20, PLUS4 CLS ' ****************************************************************** ' ******** destination: signed byte ******************************** ' ****************************************************************** DIM sb AS SIGNED BYTE ' source underflow -> destination underflow ' ' -42 = 11010110 -> 11010110 -> -42 sb = -42 PRINT "signed byte(-42) = "; sb; " (exp ";"-42";" )" ' source overflow [with unsigned byte] -> destination approximation ' ' 200 = 11001000 -> 01001000 -> +72 sb = 200 PRINT "signed byte(200) = "; sb; " (exp ";"72";" )" ' source overflow [with signed word] -> destination approximation ' ' -500 = 1111111000001100 -> 000111110100 -> 11110100 -> -116 sb = -500 PRINT "signed byte(-500) = "; sb; " (exp ";"-116";" )" ' source overflow [with unsigned word] -> destination approximation ' ' 20000 = 0100111000100000 -> 00100000 -> +32 sb = 20000 PRINT "signed byte(20000) = "; sb; " (exp ";"32";" )" ' source overflow [with signed dword] -> destination approximation ' ' -100500 = 11111111111111100111011101101100 -> 00011000100010010100 -> 10010100 sb = -100500 PRINT "signed byte(-100500) = "; sb; " (exp ";"-20";" )" ' source overflow [with unsigned dword] -> destination approximation sb = 10020000 PRINT "signed byte(10020000) = "; sb; " (exp ";"32";" )" ' ****************************************************************** ' ****************************************************************** ' ****************************************************************** WAIT KEY RELEASE : PRINT ' ****************************************************************** ' ******** destination: unsigned byte ****************************** ' ****************************************************************** DIM b AS BYTE ' source underflow -> destination underflow ' ' 42 = 11010110 -> 11010110 -> 42 b = 42 PRINT "byte(42) = "; b; " (exp ";"42";" )" ' source overflow [with unsigned byte] -> destination unsigned ' ' -42 = 11010110 -> 01001000 -> +42 b = -42 PRINT "byte(-42) = "; b; " (exp ";"42";" )" ' source overflow [with signed word] -> destination approximation ' ' -500 = 1111111000001100 -> 000111110100 -> 11110100 -> -116 b = -500 PRINT "byte(-500) = "; b; " (exp ";"12";" )" ' source overflow [with unsigned word] -> destination approximation ' ' 20000 = 0100111000100000 -> 00100000 -> +32 b = 20000 PRINT "byte(20000) = "; b; " (exp ";"32";" )" ' source overflow [with signed dword] -> destination approximation ' ' -100500 = 11111111111111100111011101101100 -> 00011000100010010100 -> 10010100 b = -100500 PRINT "byte(-100500) = "; b; " (exp ";"148";" )" ' source overflow [with unsigned dword] -> destination approximation b = 10020000 PRINT "byte(10020000) = "; b; " (exp ";"160";" )" ' ****************************************************************** ' ****************************************************************** ' ****************************************************************** WAIT KEY RELEASE : PRINT ' **************************************************************** ' ******** destination: signed word ****************************** ' **************************************************************** DIM sw AS SIGNED WORD ' source underflow -> destination underflow ' ' 42 = 11010110 -> 11010110 -> 42 sw = 42 PRINT "signed word(42) = "; sw; " (exp ";"42";" )" ' source underflow [with unsigned byte] -> destination underflow ' ' -42 = 11010110 -> -42 sw = -42 PRINT "signed word(-42) = "; sw; " (exp ";"-42";" )" ' source underfow [with signed word] -> destination underflow ' ' -500 = 1111111000001100 -> -500 sw = -500 PRINT "signed word(-500) = "; sw; " (exp ";"-500";" )" ' source overflow [with unsigned word] -> destination approximation ' ' 40000 = 0100111000100000 -> 00100000 -> 7232 sw = 40000 PRINT "signed word(40000) = "; sw; " (exp ";"7232";" )" ' source overflow [with signed dword] -> destination approximation ' ' -100500 = 11111111111111100111011101101100 -> 00011000100010010100 -> 10010100 sw = -100500 PRINT "signed word(-100500) = "; sw; " (exp ";"-2196";" )" ' source overflow [with unsigned dword] -> destination approximation sw = 10020000 PRINT "signed word(10020000) = "; sw; " (exp ";"25760";" )" ' ****************************************************************** ' ****************************************************************** ' ****************************************************************** WAIT KEY RELEASE : PRINT ' ****************************************************************** ' ******** destination: unsigned word ****************************** ' ****************************************************************** DIM w AS WORD ' source underflow -> destination underflow ' ' 42 = 11010110 -> 11010110 -> 42 w = 42 PRINT "word(42) = "; w; " (exp ";"42";" )" ' source underflow [with unsigned byte] -> destination underflow ' ' -42 = 11010110 -> -42 w = -42 PRINT "word(-42) = "; w; " (exp ";"42";" )" ' source underfow [with signed word] -> destination underflow ' ' -500 = 1111111000001100 -> -500 w = -500 PRINT "word(-500) = "; w; " (exp ";"500";" )" ' source overflow [with unsigned word] -> destination underflow ' ' 40000 = 0100111000100000 -> 00100000 -> 7232 w = 40000 PRINT "word(40000) = "; w; " (exp ";"40000";" )" ' source overflow [with signed dword] -> destination approximation ' ' -100500 = 11111111111111100111011101101100 -> 00011000100010010100 -> 10010100 w = -100500 PRINT "word(-100500) = "; w; " (exp ";"30752";" )" ' source overflow [with unsigned dword] -> destination approximation w = 10020000 PRINT "word(10020000) = "; w; " (exp ";"58528";" )" ' ****************************************************************** ' ****************************************************************** ' ****************************************************************** WAIT KEY RELEASE : PRINT ' ***************************************************************** ' ******** destination: signed dword ****************************** ' ***************************************************************** DIM dw AS SIGNED DWORD ' source underflow -> destination underflow ' ' 42 = 11010110 -> 11010110 -> 42 dw = 42 PRINT "signed dword(42) = "; dw; " (exp ";"42";" )" ' source underflow [with unsigned byte] -> destination underflow ' ' -42 = 11010110 -> -42 dw = -42 PRINT "signed dword(-42) = "; dw; " (exp ";"-42";" )" ' source underfow [with signed word] -> destination underflow ' ' -500 = 1111111000001100 -> -500 dw = -500 PRINT "signed dword(-500) = "; dw; " (exp ";"-500";" )" ' source underflow [with unsigned word] -> destination underflow ' ' 40000 = 0100111000100000 -> 00100000 -> 7232 dw = 40000 PRINT "signed dword(40000) = "; dw; " (exp ";"40000";" )" ' source underflow [with signed dword] -> destination underflow ' ' -100500 = 11111111111111100111011101101100 -> 00011000100010010100 -> 10010100 dw = -100500 PRINT "signed dword(-100500) = "; dw; " (exp ";"-100500";" )" ' source underflow [with unsigned dword] -> destination approximation dw = 10020000 PRINT "signed dword(10020000) = "; sw; " (exp ";"25760";" )" ' ****************************************************************** ' ****************************************************************** ' ****************************************************************** WAIT KEY RELEASE : PRINT ' ****************************************************************** ' ******** destination: unsigned word ****************************** ' ****************************************************************** DIM udw AS DWORD ' source underflow -> destination underflow ' ' 42 = 11010110 -> 11010110 -> 42 udw = 42 PRINT "unsigned dword(42) = "; udw; " (exp ";"42";" )" ' source underflow [with unsigned byte] -> destination underflow ' ' -42 = 11010110 -> -42 udw = -42 PRINT "unsigned dword(-42) = "; udw; " (exp ";"42";" )" ' source underfow [with signed word] -> destination underflow ' ' -500 = 1111111000001100 -> -500 udw = -500 PRINT "unsigned dword(-500) = "; udw; " (exp ";"500";" )" ' source underflow [with unsigned word] -> destination underflow ' ' 40000 = 0100111000100000 -> 00100000 -> 7232 udw = 40000 PRINT "unsigned dword(40000) = "; udw; " (exp ";"40000";" )" ' source underflow [with signed dword] -> destination underflow ' ' -100500 = 11111111111111100111011101101100 -> 00011000100010010100 -> 10010100 udw = -100500 PRINT "unsigned dword(-100500) = "; udw; " (exp ";"-100500";" )" ' source underflow [with unsigned dword] -> destination underflow udw = 10020000 PRINT "unsigned dword(10020000) = "; udw; " (exp ";"10020000";" )" END PROCEDURE example[] ON ALL BUT VIC20, PLUS4
Per poter eseguire l'esempio, è necessario disporre dell'emulatore Altirra, e in particolare che l'eseguibile x64sc
sia accessibile.
Digitare quindi il seguente comando:
# Linux ugbc.atari maths_relative_03.bas -o example.xex altirra example.xex # Windows ugbc.atari.exe maths_relative_03.bas -o example.xex altirra example.xex
Per poter eseguire l'esempio, è necessario disporre dell'emulatore Altirra, e in particolare che l'eseguibile x64sc
sia accessibile.
Digitare quindi il seguente comando:
# Linux ugbc.atarixl maths_relative_03.bas -o example.xex altirra example.xex # Windows ugbc.atarixl.exe maths_relative_03.bas -o example.xex altirra example.xex
Per poter eseguire l'esempio, è necessario disporre dell'emulatore VICE, e in particolare che l'eseguibile x64sc
sia accessibile.
Digitare quindi il seguente comando:
# Linux ugbc.c64 maths_relative_03.bas -o example.prg x64sc example.prg # Windows ugbc.c64.exe maths_relative_03.bas -o example.prg x64sc example.prg
Per poter eseguire l'esempio, è necessario disporre dell'emulatore VICE, e in particolare che l'eseguibile x64sc
sia accessibile.
Digitare quindi il seguente comando:
# Linux ugbc.c64reu maths_relative_03.bas -o example.prg x64sc -reu example.prg # Windows ugbc.c64reu.exe maths_relative_03.bas -o example.prg x64sc -reu example.prg
Per poter eseguire l'esempio, è necessario disporre dell'emulatore YAPE, e in particolare che l'eseguibile yape
sia accessibile.
Digitare quindi il seguente comando:
# Linux ugbc.plus4 maths_relative_03.bas -o example.prg yape example.prg # Windows ugbc.plus4.exe maths_relative_03.bas -o example.prg yape example.prg
Per poter eseguire l'esempio, è necessario disporre dell'emulatore VICE, e in particolare che l'eseguibile xplus4
sia accessibile.
Digitare quindi il seguente comando:
# Linux ugbc.plus4 maths_relative_03.bas -o example.prg xplus4 example.prg # Windows ugbc.plus4.exe maths_relative_03.bas -o example.prg xplus4 example.prg
Per poter eseguire l'esempio, è necessario disporre dell'emulatore XROAR, e in particolare che l'eseguibile x64sc
sia accessibile.
Digitare quindi il seguente comando:
# Linux ugbc.d32 maths_relative_03.bas -o example.bin xroar -rompath (percorso ROM) example.bin # Windows ugbc.d32.exe maths_relative_03.bas -o example.bin xroar.exe -rompath (percorso ROM) example.bin
Per poter eseguire l'esempio, è necessario disporre dell'emulatore XROAR, e in particolare che l'eseguibile x64sc
sia accessibile.
Digitare quindi il seguente comando:
# Linux ugbc.d64 maths_relative_03.bas -o example.bin xroar -rompath (percorso ROM) example.bin # Windows ugbc.d64.exe maths_relative_03.bas -o example.bin xroar.exe -rompath (percorso ROM) example.bin
Per poter eseguire l'esempio, è necessario disporre dell'emulatore DCMOTO, e in particolare che l'eseguibile x64sc
sia accessibile.
Digitare quindi i seguenti comandi:
# Linux ugbc.pc128op maths_relative_03.bas -o example.bin dcmoto example.bin (scegliere example.bin) (scegliere BASIC 128) CLEAR,&H2FFF: LOADM"CASS:",R: EXEC # Windows ugbc.pc128op.exe maths_relative_03.bas -o example.bin dcmoto example.bin (scegliere BASIC 128) CLEAR,&H2FFF: LOADM"CASS:",R: EXEC
Per poter eseguire l'esempio, è necessario disporre dell'emulatore DCMOTO, e in particolare che l'eseguibile x64sc
sia accessibile.
Digitare quindi i seguenti comandi:
# Linux ugbc.mo5 maths_relative_03.bas -o example.bin dcmoto example.bin (scegliere example.bin) (scegliere BASIC 128) CLEAR,&H2FFF: LOADM"CASS:",R: EXEC # Windows ugbc.mo5.exe maths_relative_03.bas -o example.bin dcmoto example.bin (scegliere BASIC 128) CLEAR,&H2FFF: LOADM"CASS:",R: EXEC
Per poter eseguire l'esempio, è necessario disporre dell'emulatore XEMU, e in particolare che l'eseguibile xmega65
sia accessibile.
Digitare quindi il seguente comando:
# Linux ugbc.vic20 maths_relative_03.bas -o example.prg xvic --memory 24k example.prg # Windows ugbc.vic20.exe maths_relative_03.bas -o example.prg xvic --memory 24k example.prg
Per poter eseguire l'esempio, è necessario disporre dell'emulatore Speccy, e in particolare che l'eseguibile speccy
sia accessibile.
Digitare quindi il seguente comando:
# Linux ugbc.zx maths_relative_03.bas -o example.tap Speccy example.tap # Windows ugbc.zx.exe maths_relative_03.bas -o example.tap Speccy example.tap
Per compilare e mandare in esecuzione l'esempio, hai bisogno di avere l'emulatore openMsx oppure il BlueMSX, e in particolare che il suo eseguibile sia accessibile.
Dopo di che, digita questo comando sulla linea di comando:
# Linux ugbc.coleco maths_relative_03.bas -o example.rom openmsx -machine \"COL - ColecoVision\" -cart example.rom # Windows ugbc.coleco.exe maths_relative_03.bas -o example.rom bluemsx -machine \"COL - ColecoVision\" example.rom
# Linux ugbc.coleco maths_relative_03.bas -o example.rom bluemsx /machine \"COL - ColecoVision\" /rom1 example.rom # Windows ugbc.coleco.exe maths_relative_03.bas -o example.rom bluemsx /machine \"COL - ColecoVision\" /rom1 example.rom
Per compilare e mandare in esecuzione l'esempio, hai bisogno di avere l'emulatore BlueMSX, e in particolare che il suo eseguibile sia accessibile.
Dopo di che, digita questo comando sulla linea di comando:
# Linux ugbc.sc3000 maths_relative_03.bas -o example.rom bluemsx /machine \"SEGA - SC-3000\" /rom1 example.rom # Windows ugbc.sc3000.exe maths_relative_03.bas -o example.rom bluemsx /machine \"SEGA - SC-3000\" /rom1 example.rom
Per compilare e mandare in esecuzione l'esempio, hai bisogno di avere l'emulatore BlueMSX, e in particolare che il suo eseguibile sia accessibile.
Dopo di che, digita questo comando sulla linea di comando:
# Linux ugbc.sg1000 maths_relative_03.bas -o example.rom bluemsx /machine \"SEGA - SG-1000\" /rom1 example.rom # Windows ugbc.sg1000.exe maths_relative_03.bas -o example.rom bluemsx /machine \"SEGA - SG-1000\" /rom1 example.rom
Se hai trovato un problema nel cercare di eseguire questo esempio, se pensi che ci sia un bug o, più semplicemente, vorresti che fosse migliorato, apri una segnalazione su GitHub per questo specifico esempio. Grazie!