From c0886320eeebbd47e6f29218f04f24b952c5fc39 Mon Sep 17 00:00:00 2001 From: Subhajit Sahu Date: Thu, 20 Jun 2013 09:39:18 +0800 Subject: [PATCH] Added --- ASM.ALS | Bin 0 -> 680 bytes BUFFERS.INC | 128 ++++++++++++ DBF.INC | 43 +++++ ERR | 33 ++++ GEN.INC | 107 ++++++++++ INSTALL.BAT | 34 ++++ IO.INC | 106 ++++++++++ MEM.INC | 40 ++++ PROC.INC | 57 ++++++ READ.ME | 32 +++ README.DOC | 548 ++++++++++++++++++++++++++++++++++++++++++++++++++++ S3ASM.OPA | Bin 0 -> 41295 bytes S3OBJ.OPL | 94 +++++++++ S3OBJ.OPO | Bin 0 -> 776 bytes WIN.ASM | 86 +++++++++ WIN.INC | 132 +++++++++++++ WIN.OPL | 22 +++ WINIMG.ASM | 90 +++++++++ 18 files changed, 1552 insertions(+) create mode 100644 ASM.ALS create mode 100644 BUFFERS.INC create mode 100644 DBF.INC create mode 100644 ERR create mode 100644 GEN.INC create mode 100644 INSTALL.BAT create mode 100644 IO.INC create mode 100644 MEM.INC create mode 100644 PROC.INC create mode 100644 READ.ME create mode 100644 README.DOC create mode 100644 S3ASM.OPA create mode 100644 S3OBJ.OPL create mode 100644 S3OBJ.OPO create mode 100644 WIN.ASM create mode 100644 WIN.INC create mode 100644 WIN.OPL create mode 100644 WINIMG.ASM diff --git a/ASM.ALS b/ASM.ALS new file mode 100644 index 0000000000000000000000000000000000000000..94df40a2744b767615420a74baefd6480f645ddb GIT binary patch literal 680 zcmZ9Iu}Z^G6o$`jgg6Mz>XbV;b&$M48Wh1n6ct=L=-^POP$)Qw3HSiw8{|#m=GYf- z2spS#x^zf-J?FpaO=yNMU;gvod&5oU^JF%CSe#8~kE79uhC#A;I!_-ETq|)skX-Mv zdwL%pu#?vCu`quZmW6O!3h5Kfq)7y4*2Z`}4?9<`!*$#AyJ_mCyhCr*(B*DbH}$%6 z?X=H&cZ%EaGr5zN?tUtxa^yQKjL%7Ixq;W<8mz!lSS*F60MX}Da+86vFpM`Y|4M7; zKk&vhoczHnkne$$b>Fd1n=fVBptD+u`#jj5{%denD#;=K;kE3hyvQ|s&JE7F?f4H= CRT?4y literal 0 HcmV?d00001 diff --git a/BUFFERS.INC b/BUFFERS.INC new file mode 100644 index 0000000..81721b6 --- /dev/null +++ b/BUFFERS.INC @@ -0,0 +1,128 @@ +; +; !File! +; buffers.inc +; +; !Desc! +; Epoc Services for Psion Series 3/3a +; +; !Authors! +; Krister Wombell +; +; !Date! +; 23:09-25/09/93 +; + +; TimManager +TimSleepForTenths EPOC $00,$89,cx,dx +TimSleepForTicks EPOC $01,$89,cx,dx +TimGetSystemTime EPOC $02,$89 +TimSetSystemTime EPOC $03,$89,cx,dx +TimSystemTimeToDaySeconds EPOC $04,$89,cx,dx,si +TimDaySecondsToSystemTime EPOC $05,$89,si +TimDaySecondsToDate EPOC $06,$89,si,di +TimDateToDaySeconds EPOC $07,$89,si,di +TimDaysInMonth EPOC $08,$89,ch,cl +TimDayOfWeek EPOC $09,$89,cx,dx +TimNameOfDay EPOC $0A,$89,al,bx +TimNameOfMonth EPOC $0B,$89,al,bx +TimWaitAbsolute EPOC $0C,$89,cx,dx +TimWeekNumber EPOC $0D,$89,cx,dx + +; ConvManager +ConvUnsignedIntToBuffer EPOC $00,$8A,bx,cx,di +ConvUnsignedLongIntToBuffer EPOC $01,$8A,dx,bx,cx,di +ConvIntToBuffer EPOC $02,$8A,bx,di +ConvLongIntToBuffer EPOC $03,$8A,dx,bx,di +ConvArgumentsToBuffer EPOC $04,$8A,bx,di,si +ConvStringToUnsignedInt EPOC $05,$8A,cx,si +ConvStringToUnsignedLongInt EPOC $06,$8A,cx,si +ConvStringToInt EPOC $07,$8A,si +ConvStringToLongInt EPOC $08,$8A,si +ConvFloatToBuffer EPOC $09,$8A,si,dx,di +ConvStringToFloat EPOC $0A,$8A,si,dx,di + +LongIntCompare EPOC -1,$BB,ax,bx,cx,dx +LongIntMultiply EPOC -1,$BC,ax,bx,cx,dx +LongIntDivide EPOC -1,$BD,ax,bx,cx,dx +LongUnsignedIntCompare EPOC -1,$BE,ax,bx,cx,dx +LongUnsignedIntMultiply EPOC -1,$BF,ax,bx,cx,dx +LongUnsignedIntDivide EPOC -1,$C0,ax,bx,cx,dx +LongUnsignedIntRandom EPOC $04,$8B,bx + +; FloatManager +FloatAdd EPOC -1,$C1,di,si +FloatSubtract EPOC -1,$C2,di,si +FloatMultiply EPOC -1,$C3,di,si +FloatDivide EPOC -1,$C4,di,si +FloatCompare EPOC -1,$C5,di,si +FloatNegate EPOC -1,$C6,di +FloatToInt EPOC -1,$C7,si +FloatToUnsignedInt EPOC -1,$C8,si +FloatToLong EPOC -1,$C9,si +FloatToUnsignedLong EPOC -1,$CA,si +IntToFloat EPOC -1,$CB,ax,di +UnsignedIntToFloat EPOC -1,$CC,ax,di +LongToFloat EPOC -1,$CD,ax,bx,di +UnsignedLongToFloat EPOC -1,$CE,di,ax,bx + +FloatSin EPOC $00,$8C,di,si +FloatCos EPOC $01,$8C,di,si +FloatTan EPOC $02,$8C,di,si +FloatASin EPOC $03,$8C,di,si +FloatACos EPOC $04,$8C,di,si +FloatATan EPOC $05,$8C,di,si +FloatExp EPOC $06,$8C,di,si +FloatLn EPOC $07,$8C,di,si +FloatLog EPOC $08,$8C,di,si +FloatSqrt EPOC $09,$8C,di,si +FloatPow EPOC $0A,$8C,di,si,dx +FloatRand EPOC $0B,$8C,di,si +FloatMod EPOC $0C,$8C,di,si,dx +FloatInt EPOC $0D,$8C,di,si + +; Buffer/String Manager +CharIsDigit EPOC -1,$93,al +CharIsHexDigit EPOC -1,$94,al +CharIsPrintable EPOC -1,$95,al +CharIsAlphabetic EPOC -1,$96,al +CharIsAlphaNumeric EPOC -1,$97,al +CharIsUpperCase EPOC -1,$98,al +CharIsLowerCase EPOC -1,$99,al +CharIsSpace EPOC -1,$9A,al +CharIsPunctuation EPOC -1,$9B,al +CharIsGraphic EPOC -1,$9C,al +CharIsControl EPOC -1,$9D,al +CharToUpperChar EPOC -1,$9E,al,ah +CharToLowerChar EPOC -1,$9F,al,ah +CharToFoldedChar EPOC -1,$A0,al,ah + +BufferCopy EPOC -1,$A1,si,di,cx +BufferSwap EPOC -1,$A2,si,di,cx +BufferCompare EPOC -1,$A3,si,di,cx,bx +BufferCompareFolded EPOC -1,$A4,si,di,cx,bx +BufferMatch EPOC -1,$A5,si,cx,di,dx +BufferMatchFolded EPOC -1,$A6,si,cx,di,dx +BufferLocate EPOC -1,$A7,ah,si,cx +BufferLocateFolded EPOC -1,$A8,ah,si,cx +BufferSubBuffer EPOC -1,$A9,si,di,cx,bx +BufferSubBufferFolded EPOC -1,$AA,si,di,cx,bx +BufferJustify EPOC -1,$AB,si,cx,di,bx,dl,dh + +StringCopy EPOC -1,$AC,si,di +StringCopyFolded EPOC -1,$AD,si,di +StringConvertToFolded EPOC -1,$AE,si +StringCompare EPOC -1,$AF,si,di +StringCompareFolded EPOC -1,$B0,si,di +StringMatch EPOC -1,$B1,si,di +StringMatchFolded EPOC -1,$B2,si,di +StringLocate EPOC -1,$B3,ah,si +StringLocateFolded EPOC -1,$B4,ah,si +StringLocateInReverse EPOC -1,$B5,ah,si +StringLocateInReverseFolded EPOC -1,$B6,ah,si +StringSubString EPOC -1,$B7,si,di +StringSubStringFolded EPOC -1,$B8,si,di +StringLength EPOC -1,$B9,di +StringValidateName EPOC -1,$BA,al,ah +StringCapitalise EPOC -1,$DB,si + + diff --git a/DBF.INC b/DBF.INC new file mode 100644 index 0000000..6ac6cb0 --- /dev/null +++ b/DBF.INC @@ -0,0 +1,43 @@ +; +; !File! +; dbf.inc +; +; !Desc! +; Epoc Services for Psion Series 3/3a +; +; !Authors! +; Krister Wombell +; +; !Date! +; 13:11-25/09/93 +; + +; DBFManager +DbfOpen EPOC $00,$D8,cl,si,di,dx,bx +DbfClose EPOC $01,$D8,bx +DbfFlush EPOC $02,$D8,bx +DbfTrash EPOC $03,$D8,bx +DbfCopyDown EPOC $04,$D8,bx,si +DbfCompress EPOC $05,$D8,bx,di +DbfCopyFile EPOC $06,$D8,bx,cl,ch,dx,di,si +DbfFileSize EPOC $07,$D8,bx +DbfExtHeaderRead EPOC $08,$D8,al,bx,cx,si +DbfExtHeaderWrite EPOC $09,$D8,al,bx,cx,si +DbfVersion EPOC $0A,$D8 +DbfAbsReadSense EPOC $0B,$D8,bx,cx +DbfAbsRead EPOC $0C,$D8,bx,cx +DbfNextRead EPOC $0D,$D8,bx +DbfBackRead EPOC $0E,$D8,bx +DbfFirstRead EPOC $0F,$D8,bx +DbfLastRead EPOC $10,$D8,bx +DbfAppend EPOC $11,$D8,bx,cx +DbfEraseRead EPOC $12,$D8,bx,di +DbfUpdate EPOC $13,$D8,bx,cx,di +DbfFindRead EPOC $14,$D8,al,bx,cx,dl,dh,di,si +DbfSense EPOC $15,$D8,bx +DbfCount EPOC $16,$D8,bx +DbfDescRecordRead EPOC $17,$D8,bx +DbfDescRecordWrite EPOC $18,$D8,bx,cx + + + diff --git a/ERR b/ERR new file mode 100644 index 0000000..339ebf4 --- /dev/null +++ b/ERR @@ -0,0 +1,33 @@ + +PKUNZIP (R) FAST! Extract Utility Version 2.04g 02-01-93 +Copr. 1989-1993 PKWARE Inc. All Rights Reserved. Shareware Version +PKUNZIP Reg. U.S. Pat. and Tm. Off. + +þ 80486 CPU detected. +þ EMS version 4.00 detected. +þ XMS version 3.00 detected. + +Searching ZIP: S3ASM2.ZIP + + Length Method Size Ratio Date Time CRC-32 Attr Name + ------ ------ ----- ----- ---- ---- -------- ---- ---- + 41295 DeflatN 20956 50% 06-02-94 17:38 6323ace6 --w- S3ASM.OPA + 680 DeflatN 284 59% 02-07-06 02:44 fc402fd7 --w- ASM.ALS + 1014 DeflatN 402 61% 09-30-93 11:00 dbea67db --w- DBF.INC + 1506 DeflatN 545 64% 06-02-94 16:38 34df6b27 --w- S3OBJ.OPL + 1478 DeflatN 531 65% 09-30-93 11:00 2cad3d48 --w- PROC.INC + 880 DeflatN 380 57% 09-30-93 11:00 6372b24e --w- MEM.INC + 3200 DeflatN 995 69% 09-30-93 11:00 3cf9fd9c --w- IO.INC + 3150 DeflatN 1011 68% 09-30-93 11:00 8186a8c7 --w- GEN.INC + 3937 DeflatN 1099 73% 09-30-93 11:00 d638a846 --w- BUFFERS.INC + 3971 DeflatN 1286 68% 06-02-94 16:32 cfe75f4c --w- WIN.INC + 1136 DeflatN 478 58% 06-02-94 16:33 8c3d1a36 --w- WINIMG.ASM + 363 DeflatN 247 32% 06-02-94 16:34 8c5bd3a2 --w- WIN.OPL + 269 DeflatN 153 44% 06-02-94 17:59 d4fe5bc6 --w- STATE.RST + 776 DeflatN 480 39% 06-02-94 16:38 a4eccbac --w- S3OBJ.OPO + 13071 DeflatN 5166 61% 06-02-94 17:37 0cc166ad --w- S3ASM.DOC + 1113 DeflatN 498 56% 06-02-94 17:46 0143ab59 --w- WIN.ASM + 549 DeflatN 275 50% 06-02-94 17:52 81f0d9b5 --w- INSTALL.BAT + 938 DeflatN 357 62% 06-02-94 17:59 5ed71cc1 --w- READ.ME + ------ ------ --- ------- + 79326 35143 56% 18 diff --git a/GEN.INC b/GEN.INC new file mode 100644 index 0000000..f6b6af6 --- /dev/null +++ b/GEN.INC @@ -0,0 +1,107 @@ +; +; !File! +; gen.inc +; +; !Desc! +; Epoc Services for Psion Series 3/3a +; +; !Authors! +; Krister Wombell +; +; !Date! +; 00:01-26/09/93 +; + +; GenManager +GenVersion EPOC $00,$8B +GenLcdType EPOC $01,$8B +GenStartReason EPOC $02,$8B +GenParse EPOC $03,$8B,bx +GenGetCountryData EPOC $05,$8B,bx +GenGetErrorText EPOC $06,$8B,al,bx +GenGetOsData EPOC $07,$8B,di,si,cx +GenDeferredMode EPOC $08,$8B,al +GenNotify EPOC $09,$8B,bx,cx,dx,di,si +GenNotifyError EPOC $0A,$8B,al,bx,dx,di,si +GenNotifyHook EPOC $0B,$8B,bx +GenNotifyUnHook EPOC $0C,$8B +GenGetRamSizeInParas EPOC $0D,$8B +GenGetCommandLine EPOC $0E,$8B +GenGetSoundFlags EPOC $0F,$8B +GenSetSoundFlags EPOC $10,$8B,ax +GenSound EPOC $11,$8B,bx,cx +GenMarkActive EPOC $12,$8B +GenMarkNonActive EPOC $13,$8B +GenGetText EPOC $14,$8B,al,bx +GenGetNotifyState EPOC $15,$8B +GenSetNotifyState EPOC $16,$8B,al +GenGetAutoSwitchOffValue EPOC $17,$8B,ax +GenSetAutoSwitchOffValue EPOC $18,$8B +GenSetRevector EPOC $19,$8B,al,cx,bx +GenResetRevector EPOC $1A,$8B,al +GenGetLanguageCode EPOC $1B,$8B +GenGetSuffixes EPOC $1C,$8B,al,bx +GenGetAmPmText EPOC $1D,$8B,bx +GenSetCountryData EPOC $1E,$8B,bx +GenGetBatteryType EPOC $1F,$8B +GenSetBatteryType EPOC $20,$8B,al +GenEnvBufferGet EPOC $21,$8B,di,dl,si +GenEnvBufferSet EPOC $22,$8B,di,dl,si,cl +GenEnvBufferDelete EPOC $23,$8B,di,dl +GenEnvBufferFind EPOC $24,$8B,bx,di,dl,si +GenEnvStringGet EPOC $25,$8B,di,si +GenEnvStringSet EPOC $26,$8B,di,si +GenEnvStringDelete EPOC $27,$8B,di +GenEnvStringFind EPOC $28,$8B,bx,di,si,cx +GenCrc EPOC $29,$8B,cx,dx,si +GenRomVersion EPOC $2A,$8B +GenAlarmHook EPOC $2B,$8B,bx +GenAlarmUnHook EPOC $2C,$8B +GenAlarmId EPOC $2D,$8B +GenPasswordSet EPOC $2E,$8B +GenPasswordTest EPOC $2F,$8B +GenPasswordControl EPOC $30,$8B +GenPasswordQuery EPOC $31,$8B +GenTickle EPOC $32,$8B +GenSetConfig EPOC $33,$8B +GenMaskInit EPOC $34,$8B +GenMaskEncrypt EPOC $35,$8B +GenMaskDecrypt EPOC $36,$8B +GenSetOnEvents EPOC $37,$8B,al +GenDataSegment EPOC -1,$8F +Dummy EPOC -1,$D4 +GenIntByNumber EPOC -1,$D5,al,si,di +HwComboOn EPOC $00,$8E +HwComboOff EPOC $01,$8E +HwPacksOn EPOC $02,$8E +HwPacksOff EPOC $03,$8E +HwSetA2Control1Bits EPOC $04,$8E,al +HwClearA2Control1Bits EPOC $05,$8E,al +HwReadA2Control1 EPOC $06,$8E +HwWriteA2Control1 EPOC $07,$8E,al +HwSetA2Control2Bits EPOC $08,$8E,al +HwClearA2Control2Bits EPOC $09,$8E,al +HwReadA2Control2 EPOC $0A,$8E +HwWriteA2Control2 EPOC $0B,$8E,al +HwSetA2Control3Bits EPOC $0C,$8E,al +HwClearA2Control3Bits EPOC $0D,$8E,al +HwReadA2Control3 EPOC $0E,$8E +HwWriteA2Control3 EPOC $0F,$8E,al +HwSelectChannel EPOC $10,$8E,al +HwGetSupplyStatus EPOC $11,$8E,bx +HwLcdContrastDelta EPOC $12,$8E,al +HwReadLcdContrast EPOC $13,$8E +HwSwitchOff EPOC $14,$8E,cx +HwNullFrame EPOC $15,$8E +HwExit EPOC $16,$8E +HwGetCombo EPOC $17,$8E +HwFreeCombo EPOC $18,$8E +HwGetChannel EPOC $19,$8E,al +HwFreeChannel EPOC $1A,$8E,al +HwGetPsuType EPOC $1B,$8E +HwSupplyWarnings EPOC $1C,$8E +HwForceSupplyReading EPOC $1D,$8E +HwGetBackLight EPOC $1E,$8E +HwSetBackLight EPOC $1F,$8E,bx +HwBackLight EPOC $20,$8E,al + diff --git a/INSTALL.BAT b/INSTALL.BAT new file mode 100644 index 0000000..b1679fa --- /dev/null +++ b/INSTALL.BAT @@ -0,0 +1,34 @@ +@echo off +if !%1==! goto error + +echo This will install S3Asm on your S3a, connected as %1: +echo Press CTRL-C to terminate the installation, or press +echo any other key to continue. +pause +echo ÿ + +:install + +copy s3asm.opa %1:\app\ +copy asm.als %1:\app\ + +mkdir %1:\asm >&nil +copy *.asm %1:\asm\ + +mkdir %1:\inc >&nil +copy *.inc %1:\inc\ + +mkdir %1:\opl >&nil +copy *.opl %1:\opl\ +mkdir %1:\opo >&nil +copy *.opo %1:\opo\ + +goto end + +:error +echo Usage: Install drive + +echo ÿ +echo eg. install m +echo install l +:end diff --git a/IO.INC b/IO.INC new file mode 100644 index 0000000..22c91b3 --- /dev/null +++ b/IO.INC @@ -0,0 +1,106 @@ +; +; !File! +; io.inc +; +; !Desc! +; Epoc Services for Psion Series 3/3a +; +; !Authors! +; Krister Wombell +; +; !Date! +; 21:31-25/09/93 +; + +; LibManager +LibLoad EPOC $00,$84,bx,cl +LibUnLoad EPOC $01,$84,bx +LibLink EPOC $02,$84,bx +LibFind EPOC $03,$84,bx +LibHandle EPOC $04,$84,bx +LibCreate EPOC $05,$84,bx,cx +LibCreateByHandle EPOC $06,$84,bx,cx +LibDestroy EPOC $07,$84,bx +LibCopy EPOC $08,$84,bx,cx,di,si +LibOpen EPOC $09,$84,bx +LibLoadFile EPOC $0A,$84,bx,ch,cl +LibReClass EPOC $0B,$84,bx,cx,di +LibReClassByHandle EPOC $0C,$84,bx,cx,di +LibSend EPOC -1,$CF,bx,cl,dx,si,di +LibSendSuper EPOC -1,$D0,bx,cl,dx,si,di +LibEnter EPOC -1,$D2,ax,bx,cx,dx,si,di +LibLeave EPOC -1,$D3,ax +LibSendExit EPOC -1,$D7,ax + +; DevManager +IoOpen EPOC $00,$85,bx,cx,dx +DevOpenPDD EPOC $01,$85,bx +DevGetPDDAddress EPOC $02,$85,bx +DevInstall EPOC $03,$85,bx,cx,dx +DevHold EPOC $04,$85,cl +DevResume EPOC $05,$85 +DevLoadLDD EPOC $06,$85,bx +DevLoadPDD EPOC $07,$85,bx +DevDelete EPOC $08,$85,bx,dx +DevQueryUnits EPOC $09,$85,bx +DevFind EPOC $0A,$85,bx,dx,di,si +DevRemove EPOC $0B,$85,bx,dx +DevVector EPOC $0C,$85,cl,ch,di,bx,dx,si + +; IOManager +IoAsynchronous EPOC $00,$86,al,bx,cx,dx,di +IoAsynchronousNoError EPOC $01,$86,al,bx,cx,dx,di +IoWithWait EPOC $02,$86,al,bx,cx,dx +IoRoot EPOC $03,$86,bx,si +IoSuper EPOC $04,$86,bx,si +IoWaitForSignal EPOC $05,$86 +IoWaitForStatus EPOC $06,$86,di +IoYield EPOC $07,$86 +IoSignal EPOC $08,$86 +IoSignalByPid EPOC $09,$86,bx +IoSignalByPidNoReSched EPOC $0A,$86,bx +IoAddHandler EPOC $0B,$86,al,bx,es +IoRemoveHandler EPOC $0C,$86,bx +IoEnableHandler EPOC $0D,$86,bx,cl +IoRequestReset EPOC $0E,$86,bx +IoRequestResetCancel EPOC $0F,$86,bx,cx +IoClose EPOC $10,$86,bx +IoRead EPOC $11,$86,bx,cx,dx +IoWrite EPOC $12,$86,bx,cx,dx +IoSeek EPOC $13,$86,bx,cx,dx +IoKeyAndMouseWithWait EPOC $14,$86,bx +IoAddApplicationHandler EPOC $15,$86,bx,cx,dx +IoRemoveApplicationHandler EPOC $16,$86,bx +IoEnableApplicationHandler EPOC $17,$86,bx,cl +IoShiftStates EPOC $18,$86 +IoWaitForSignalNoHandler EPOC $19,$86 +IoSignalKillAsynchronous EPOC $1A,$86,bx,di +IoSignalKillCancel EPOC $1B,$86,bx +IoKeyAndMouseAsynchronous EPOC $1C,$86,bx +IoNextHalfSecond EPOC $1D,$86 +IoKeyAndMouseStatus EPOC -1,$DA +IoNextHalfSecondStatus EPOC -1,$DD + +; FilManager +FilConnect EPOC $00,$87,al,dx +FilExecute EPOC $01,$87,al,dx,bx,cx,di +FilParse EPOC $02,$87,al,dx,bx,cx,di,si +FilPathGet EPOC $03,$87,al,dx,bx +FilPathSet EPOC $04,$87,al,dx,bx +FilPathTest EPOC $05,$87,al,dx,bx +FilDelete EPOC $06,$87,al,dx,bx +FilRename EPOC $07,$87,al,dx,bx,cx +FilStatusGet EPOC $08,$87,al,dx,bx,cx +FilStatusSet EPOC $09,$87,al,dx,bx,cx,di +FilStatusDevice EPOC $0A,$87,al,dx,bx,cx +FilStatusSystem EPOC $0B,$87,al,dx,bx,cx +FilMakeDirectory EPOC $0C,$87,al,dx,bx +FilOpenUnique EPOC $0D,$87,al,dx,bx,cx +FilSystemAttach EPOC $0E,$87,al,dx,bx +FilSystemDetach EPOC $0F,$87,al,dx,bx +FilPathGetById EPOC $10,$87,al,dx,bx,cx +FilChangeDirectory EPOC $11,$87,al,dx,bx,cx,di,si +FilSetInitialPath EPOC $12,$87,al,dx,bx +FilSetFileDate EPOC $13,$87,al,dx,bx +FilLocChanged EPOC $14,$87,bx + diff --git a/MEM.INC b/MEM.INC new file mode 100644 index 0000000..3d7c193 --- /dev/null +++ b/MEM.INC @@ -0,0 +1,40 @@ +; +; !File! +; mem.inc +; +; !Desc! +; Epoc Services for Psion Series 3/3a +; +; !Authors! +; Krister Wombell +; +; !Date! +; 22:03-25/09/93 +; + +; SegManager +SegFreeMemory EPOC $00,$80 +SegCreate EPOC $01,$80,al,bx,cx +SegDelete EPOC $02,$80,bx +SegOpen EPOC $03,$80,bx +SegClose EPOC $04,$80,bx +SegSize EPOC $05,$80,bx +SegAdjustSize EPOC $06,$80,bx,cx +SegFind EPOC $07,$80,bx,di,si +SegCopyTo EPOC $08,$80,bx,cx,si,dx,di +SegCopyFrom EPOC $09,$80,bx,cx,si,dx,di +SegLock EPOC $0A,$80,bx +SegUnLock EPOC $0B,$80,bx +SegRamDiskUsed EPOC $0C,$80 +SegCloseLockedOrDevice EPOC $0D,$80,bx + +; HeapManager +HeapAllocateCell EPOC $00,$81,cx +HeapReAllocateCell EPOC $01,$81,bx,cx +HeapAdjustCellSize EPOC $02,$81,bx,cx,dx +HeapFreeCell EPOC $03,$81,bx +HeapCellSize EPOC $04,$81,bx +HeapSetGranularity EPOC $05,$81,bx +HeapFreeMemory EPOC $06,$81 + + diff --git a/PROC.INC b/PROC.INC new file mode 100644 index 0000000..6be7a1b --- /dev/null +++ b/PROC.INC @@ -0,0 +1,57 @@ +; +; !File! +; proc.inc +; +; !Desc! +; Epoc Services for Psion Series 3/3a +; +; !Authors! +; Krister Wombell +; +; !Date! +; 21:00-25/09/93 +; + +; SemManager +SemCreate EPOC $00,$82,bx +SemDelete EPOC $01,$82,bx +SemWait EPOC $02,$82,bx +SemSignalOnce EPOC $03,$82,bx +SemSignalMany EPOC $04,$82,bx,cx +SemSignalOnceNoReSched EPOC $05,$82,bx + +; MessManager +MessInit EPOC $00,$83,bl,bh +MessReceiveAsynchronous EPOC $01,$83,bx,di +MessReceiveWithWait EPOC $02,$83,bx +MessReceiveCancel EPOC $03,$83 +MessSend EPOC $04,$83,bx,cx,si +MessSendReceiveAsynchronous EPOC $05,$83,bx,cx,di +MessSendReceiveWithWait EPOC $06,$83,bx,cx,si +MessFree EPOC $07,$83,bx,cx +MessSignal EPOC $08,$83,bx,cx +MessSignalCancel EPOC $09,$83,bx,cx + +; ProcManager +ProcId EPOC $00,$88 +ProcIdByName EPOC $01,$88,bx +ProcGetPriority EPOC $02,$88,bx +ProcSetPriority EPOC $03,$88,bx,al +ProcCreate EPOC $04,$88,bx +ProcCreateTask EPOC $05,$88,bx,cl,di,si +ProcResume EPOC $06,$88,bx +ProcSuspend EPOC $07,$88,bx +ProcKill EPOC $08,$88,al,bx +ProcPanicById EPOC $09,$88,al,bx +ProcNameById EPOC $0A,$88,bx,di +ProcFind EPOC $0B,$88,bx,di,si +ProcRename EPOC $0C,$88,bx,di +ProcTerminate EPOC $0D,$88,al,bx +ProcOnTerminate EPOC $0E,$88,bx +ProcWatchAllExits EPOC $0F,$88,bx +ProcGetOwner EPOC $10,$88,bx +ProcPanic EPOC -1,$90,al +ProcCopyFromById EPOC -1,$91,bx,cx,di +ProcCopyToById EPOC -1,$92,bx,cx,di +ProcIndStringCopyFromById EPOC -1,$DC,bx,cx,di,si + diff --git a/READ.ME b/READ.ME new file mode 100644 index 0000000..37fa1dc --- /dev/null +++ b/READ.ME @@ -0,0 +1,32 @@ +Included in this zip file: + +read.me - 937 bytes - This file + +s3asm.doc - 13071 bytes - S3Asm manual +s3asm.opa - 41295 bytes - S3Asm + +asm.als - 680 bytes - Alias file for Program +s3obj.opl - 1506 bytes - Object file procedures, OPL source +s3obj.opo - 776 bytes - Object file procedures, translated + +buffers.inc - 3937 bytes - Include file +dbf.inc - 1014 bytes - Include file +gen.inc - 3150 bytes - Include file +io.inc - 3200 bytes - Include file +mem.inc - 880 bytes - Include file +proc.inc - 1478 bytes - Include file +win.inc - 3971 bytes - Include file + +win.asm - 1113 bytes - Example S3Asm source file +winimg.asm - 1136 bytes - Example S3Asm source file +win.opl - 363 bytes - Example OPL source + +install.bat - 474 bytes - S3Asm installation batch file + +This zip file should be 37453 bytes long. + + + + + + diff --git a/README.DOC b/README.DOC new file mode 100644 index 0000000..f25891c --- /dev/null +++ b/README.DOC @@ -0,0 +1,548 @@ + S3Asm + + Version 2.00C + + + Copyright Giles Goddard and Krister Wombell 1994 + + +Introduction: +------------ + + S3Asm is an 8086 machine code assembler for Psion Series3a pocket +computer. The bulk of the program is written in 8086, so its capable +of very high assembly speeds. + + Machine code compiled using S3Asm can be incorporated into OPL +programs or can be translated into an image file ready for running +from the System screen. + + + +WARNING: + + Extreme caution should be taken when using this program, if the code +you have just assembled has a bug, it could and most often does, crash +the machine. Also, S3Asm holds NO WARRANTY. If the bug is caused by S3Asm +itself not assembling correctly, then neither us (the authors) or Psion +can be held responsible for any loss of data or damaged caused to you, your +machine or anything else in near proximity. + + +Registration: +------------- + + This version of S3Asm is fully functional, the only limitation is +the size of the output object code. This is set 256 bytes, which is +more than enough for most small programs. If you would like to +assemble larger programs or if you just want to show your appreciation +for this software please register it by either, + +Sending 10 UK pounds to: + + Giles Goddard, + 6, Court Royal Mews, + Northlands Road, + Southampton. SO3 + England. + +Or, + + Typing GO SWREG on Compuserve and following the prompts. S3Asm's +registration code is 2703 and it costs 20.00 dollars. + + +Installation: +------------ + +If you have RFM installed you may prefer to use the PC batch file +Install.bat to setup S3Asm. It assumes you have the s3a connected and +ready. Otherwise just follow these simple steps: + +Copy S3Asm.opa into an \APP directory on your Series3a, any drive will +do, and install it by pressing Psion-I from the system screen. + +If everything is well you should have the S3Asm icon with S3Asm +written underneath. + +Next, make a directory on any drive called \ASM which holds the +source files for any machine code you write. + +copy s3obj.opl to \OPL +copy s3obj.opo to \OPO + +These files are used to load object code into your OPL programs. + + +If you would like to use the example source and EPOC service include +files then please: + +Make another directory called \INC which holds the include files. +copy *.inc to \INC +copy *.asm to \ASM +copy win.opl to \OPL + +Selecting one of the example files that should appear under the S3Asm +icon by pressing enter will run S3Asm using that file. + + + +Usage: +----- + + When you run S3Asm you should be presented with a menu of commands, +these are: + + +Open file - Change the current source file. + +Setup - Change the intialisation file for S3Asm. +Reset - Reset intialisation file to default settings. + +Assemble - Start assembling the current source file. + +Register - Register S3Asm to assemble larger files and to the remove + nag screen. +About - Show information about S3Asm. +Exit - Exit S3Asm + + + +Setup: +----- + +The setup file for S3Asm is 'M:\OPD\s3asm.ini' it is created +automagically and reset to the default settings when you first run S3Asm. +You can change these settings using the Setup menu command. + +Memory: + +Amount of memory allocated for source block. S3Asm loads your source +file in small chunks or blocks. If you dont have enough memory on +your machine for the default setting, you can reduce the amount +allocated. + +Amount of memory allocated for object block. This is the maximum size +of you object code output. For non-registered users this is limited +to 256 bytes. + +Amount of memory allocated for symbols. Everytime you define a label, +equate or variable the name gets added to the symbol list. This is +the total memory available for all your symbols names. + +Amount of memory allocated for Forward References. If you reference a +label or variable which has been defined later on in the source file, +S3Asm stores this reference in the FR block and then later adjusts +the object code. + +Amount of memory allocated for relocations. If you use non-relative +addresses, such as referencing a variable or address of a variable +then S3Asm stores this information into the relocation block. When you +use the object file in your OPL program, the relocation is automatically +done for you. + +Amount of memory for macros. Macros take up memory whenever they are +defined, this lets adjust the maximum amount of memory for all the +macros. + + +Directories: + +S3Asm normally writes all of its output files back into the directory +from where the source file came from. You can override this for each +output file type. + +Binary files, .BIN files that use loaded into your OPL programs. + +Image file, .IMG files that can be run from the system screen. + +OPL files, .OPL files that can be included into your OPL programs and +compiled. +(Warning: It can be dangerous to set this to your main \OPL +directory, where S3Asm may write over an existing OPL file of the +same name.) + + +Image files: +The intitial stack size and priority used when creating image files +may be changed. + + + + + +Creating source files: +---------------------- + +Source files may be created using the built in Program application. +The easiest way of doing this is by installing the Asm.als file included +with S3Asm, which makes a 'virtual' copy of Program and tells it to use +the directory \ASM and files with the .ASM extension. Copy the file +Asm.als into a \APP and install it using Psion-I. You can then create +and edit files the same way as you would OPL files. + + + +Assembling source files: +------------------------ + +When you assemble a source file S3asm asks you which type of output +you would like, this can be Binary, OPL or Image. This can be made +automatic by placing the word BINARY, OPL or IMAGE at the top of your +source file, eg. + + BINARY + + mov ax,0 + + retf + +or, + + OPL + + mov ax,0 + + retf + +or, + + IMAGE + +somedata + dw 1234 + + CODE + mov ax,0 + retf + + +Notice the CODE line in the last example. This tells S3Asm where your +actual program starts. Image files are split into 2 parts, the Data +segment and Code segment. All variables and other data should be +placed before the CODE statment. + +If you select OPL output then S3Asm will ask you to give it a +variable name. This variable is used to put object code into, see +below for more details. + + + +Note: The option to write out Image file types at the end of assembly +is just included for completeness. If you select this option you will +be warned that you have no IMAGE statement in your code. + + +Assembler syntax: +---------------- + +S3Asm tries to keep to standard 8086 assembler syntax where possible. + +Comments must start with a ';' unless they come after the end of +the instruction ie. + +; This is ok + + mov ax,0 ; so is this + mov ax,1 and this + +but this is not + + + + + +Instruction format: + +Instructions and data declarations must be preceeded by at least one +space or tab, ie. + + mov ax,1 ; is ok +mov ax,1 ; is bad + +Labels and equates: + +Labels and equates must start a line, ie. no spaces or tabs before +them, ie. + + mylabel mov ax,0 ; is bad + +mylabel mov ax,0 ; is ok + + +Labels and equates must start with a non digit and can be upto 255 +bytes long. ie. + +6label dw 0 ; is bad + +label6 dw 0 ; is ok + +datapp1 equ $28 ; is ok + + +Also, for future versions please dont use labels with these +characters: + + - * , / + = % ! & > < $ " + + + +References to labels must be enclosed in square brackets, eg. + + mov ax,[a_label] + + + +Addresses of labels use the OFFSET syntax, eg. + + mov bx, offset a_label + + mov ax,[bx] + + + +Absolute addresses use the ABS syntax, eg. + + mov ax, ABS [datapp1] + + + + + +Data: + + There are 3 types of data statement: + + db 0 + dw 0 + db "A string",0 + + + + +Numbers: + + ASCII, Decimal, Hex and Binary numbers are supported, they have the +following syntax: + + + + mov ax,1234 ; a decimal number + + mov ax,$5678 ; a hex number + + mov ax,%0101 ; a binary number + + mov al,"a" ; an ASCII character must be surrounded by quotes + + + +Macros: + + Macros can be defined as such; + +Name MACRO + mov ax,!0 ; move 1st parameter into ax + mov ax,!1 ; move 2nd parameter into ax + ENDM + +!0 to !9 are used to reference parameters, !0 being the 1st, !9 the 10th. + +To envoke the macro use; + name parameter1,parameter2.... + +eg. + +increg MACRO + inc !0 + ENDM + + increg ax + +Macros cannot be nested. + + + + + +Include files: + +Include files can contain machine code, data, macros, equates or indeed +anything that you would use normaly in a source file. They must be +placed at the top of your main source file and cannot be nested. ig. + + include "m:\inc\win.inc" + + +The standard convention for include filenames is to have a .INC +extension and to be placed in a \INC directory. + + + +Epoc functions: + +S3Asm has a special instruction for defining EPOC service interupts. +Its syntax is such: + +Name EPOC Function number, Int number, register1, register2.... + +eg. + +HeapAllocateCell EPOC $00,$81,cx + + HeapAllocateCell 1000 + + +And would expand out to be; + + mov cx,1000 + mov ah,$81 + int $81 + + + + +How to use your assembled file: +------------------------------ + + As mentioned earlier, S3Asm can output 3 types of file; Binary, OPL +and Image. + +Binary files (with extensions .BIN) can be loaded into your OPL +programs using the Procedure LoadO: (fname$), which is included in +the S3Obj.opl file. A typical example would be; + + + Global ass% + + LoadM ("m:\opo\s3obj.opo") + + ass%=LoadO:("m:\asm\win.bin") + if ass%=0 : Alert ("Unable to load binary file") : endif + + usr(ass%,0,0,0,0) + + +LoadO: attempts to load the file, allocate enough memory to hold it +and then relocate any references that need to be. It returns a +pointer to the start of the machine code, which you then use to USR +to. +LoadO: returns a 0 if it cannot load the file for any reason. It also +Raises an error if there are any file errors. You could trap these +errors using the OPL command ONERR, to jump to your own error +handler. + + +S3Asm's OPL output files can be included into your OPL source code. + + Global ass% + Global a&(6) + + a&(1)=&73413353 + a&(2)=&4C504F6D + a&(3)=&00000010 + a&(4)=&201B0000 + a&(5)=&00CB0001 + a&(6)=&00000000 + + LoadM ("a:\opo\s3obj.opo") + + ass%=Reloc:(addr(a&())) + if ass%=0 : Alert ("Cannot relocate") : endif + + usr(ass%,0,0,0,0) + + +Reloc: attempts to relocate any references that need to be. It +returns a pointer to the start of the machine code, which you then +use in the USR function. +Like LoadO: you can use ONERR to trap any errors produced by Reloc: + +Both the above procedures may be be copied and used in your OPL +source code freely. The original OPL source file for these procedures +can be found in S3Obj.opl + + +Image files should be copied into a \IMG directory and can be run +using the RunImg standard application. + +Note: There will be a utility available soon to registered users that +allows .APP files to be created from these .IMG files. + + +Example files: +------------- + +S3Asm comes with some example files to help you get the jist of whats +going on. They are: + +win.asm - Open a window and bitmap, and draw directly using 8086. +win.opl - After you have assembled the above file, you can load it + using this OPL program. + +winimg.asm - This is the same as the above, except it is a stand + alone Image file version. Use RunImg to run it. + (Note: At the time of writing, this only works in + series3 compatability mode) + + +Please take a look at what they do and how they work. + + +Using the Epoc include files: +----------------------------- + +Most if not all of the EPOC service interrupts are included in the +following files: + +buffers.inc +dbf.inc +gen.inc +io.inc +mem.inc +proc.inc +win.inc + +Please read the relevent SDK documentation for full details. + + + +Bugs and Contact: +---------------- + +Please send any bugs, suggestions or hellos to: + +Giles Goddard at + +gsg@cix.compulink.co.uk +Compuserve - 71125,532 +giles@twics.co.jp + +or + +Krister Wombell at + +kristerw@cix.compulink.co.uk + + +(thanks to dw2@Psion for his help and advice) + + + + +Disclaimer +---------- +Neither us (the authors) or Psion can be held responsible for any loss +of data or damaged caused to you, your machine or anything else in +near proximity caused directly or indirectly by S3Asm or its +associated programs. + +S3Asm is copyright Giles Goddard and Krister Wombell 1994 + +This zip file may be distributed freely as long as all files +are kept together in their original form. + + + +END OF FILE + diff --git a/S3ASM.OPA b/S3ASM.OPA new file mode 100644 index 0000000000000000000000000000000000000000..4458c5d02a5fa1b3c86a29956d321eec2cf7e006 GIT binary patch literal 41295 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 I0K9Ag0A%DszyJUM literal 0 HcmV?d00001 diff --git a/S3OBJ.OPL b/S3OBJ.OPL new file mode 100644 index 0000000..7ee3ff3 --- /dev/null +++ b/S3OBJ.OPL @@ -0,0 +1,94 @@ + +PROC reloc:(ptr%) + local rel%,relc%,s% + local d%,sptr%,id$(8) + local hlen% + + sptr%=addr(id$) + relc%=ptr% + + pokeb sptr%,8 + s%=0 + while s%<8 + sptr%=uadd(sptr%,1) + pokeb sptr%,peekb(relc%) + relc%=uadd(relc%,1) + s%=s%+1 + endwh + + if id$<>"S3AsmOPL" : raise -69 : endif + + hlen%=peekw(relc%) + sptr%=uadd(ptr%,hlen%+2) + + s%=peekw(uadd(ptr%,hlen%)) + relc%=uadd(sptr%,s%) + rel%=peekw(relc%) + relc%=uadd(relc%,2) + + + while rel% + d%=uadd(sptr%,peekw(relc%)) + relc%=uadd(relc%,2) + pokew d%,uadd(peekw(d%),sptr%) + rel%=rel%-1 + endwh + + return sptr% +ENDP + +PROC loado:(f$) + local r%,h%,cell%,size%,pos& + local relc%,rel%,d%,id$(8) + + r%=IOOPEN(h%,f$,$0400+$0200) + if r%>=0 + pokeb addr(id$),8 + r%=IOREAD(h%,addr(id$)+1,8) + if id$<>"S3AsmObj" + raise -69 + endif + r%=IOREAD(h%,addr(d%),2) + pos&=d% + r%=IOSEEK(h%,1,pos&) + r%=IOREAD(h%,addr(size%),2) + + cell%=alloc:(size%) + if cell%=0 + IOCLOSE(h%) + raise -10 + endif + r%=IOREAD(h%,cell%,size%) + r%=IOREAD(h%,addr(rel%),2) + if rel% + relc%=alloc:(rel%*2) + if relc%=0 + IOCLOSE(h%) + raise -10 + endif + + r%=IOREAD(h%,relc%,rel%*2) + while rel%<>0 + d%=uadd(cell%,peekw(relc%)) + relc%=uadd(relc%,2) + pokew d%,uadd(peekw(d%),cell%) + rel%=rel%-1 + endwh + endif + IOCLOSE(h%) + if r%>0 + return cell% + endif + endif + raise r% +ENDP + +PROC alloc:(size%) + local ret% + ret%=alloc(size%) + if ret%=0 + raise -10 + endif + return(ret%) +ENDP + diff --git a/S3OBJ.OPO b/S3OBJ.OPO new file mode 100644 index 0000000000000000000000000000000000000000..b247542d4fb881a8a4e5bdc7ec770c2ba2768cc7 GIT binary patch literal 776 zcmZ`%v2GJV5Pf%E%O@Zrj!u!Ci&u^JecZqQR2wnVt9E%)T9yrRL!H@b&x0Z{8jb1_*EuIyKwl z@%DIsc6TD**|UA~@&zOF=*h@rX;cGrQ#XHyK#T$Y;0AgAa|@CDt5q~KtafS{(Gnb1 zVWKnDf?>?xXd}NPAUO|gCUq>sw$6xW;LnH_XfSmbzveZKVZ>2R-m(8)-hkOXI#+9+ z)pk^37p%dAQ>u|!q&BlGQj+p5NF}ZqMW0Z5$H+IKRy>MBv<3H1nS~XeQp0B7L?Gr+ zsk`_&=h5k9f=#>%77@^t2I`ZP<^@u(;mla2%K8EjT2!;bDG1XpCr)_>uq} z6j?Aek-h0^qpSNK9ADkn