.PAGESIZE 65. ; constants Absolute .EQU TRUE Debug .EQU FALSE Statistics .EQU FALSE .IF Absolute .ABSOLUTE .ENDC NewLineChar .EQU 10. EOL .EQU 13. InterpType .EQU 34. InterpVersion .EQU "A" bs .EQU 08 esc .EQU 1B del .EQU 7F ht .EQU 09 MaxMaxNumWords .EQU 60. StackSize .EQU 00800 ZIP_Heap .EQU 0B000 ; register allocation: Wrk1 .EQU R0 Wrk2 .EQU R1 Wrk3 .EQU R2 OpCode .EQU R3 OpdCnt .EQU R3 Wrk4 .EQU R3 Opd0 .EQU R4 Opd1 .EQU R5 OpdBase .EQU R6 Tmp1 .EQU OpdBase CodeBase .EQU R7 Tmp7 .EQU CodeBase RegBase .EQU R8 Tmp2 .EQU RegBase DataBase .EQU R9 Tmp3 .EQU DataBase Bit16Mask .EQU R10 Tmp4 .EQU Bit16Mask IPC .EQU R11 Tmp5 .EQU IPC PtrJmpTable .EQU R12 Tmp6 .EQU PtrJmpTable SP .EQU R13 MultiChType .EQU Tmp1 SingleChType .EQU Tmp2 PkdChCnt .EQU Wrk4 TxtIPC .EQU Wrk3 PkdChWord .EQU Wrk2 WrkCh .EQU Wrk1 PkdCh .EQU Opd0 ChType .EQU Opd1 WordChCnt .EQU Wrk4 InpLinePtr .EQU Opd0 ParsedPtr .EQU Opd1 MaxNumWords .EQU Tmp1 WordChPtr .EQU Tmp2 NumWords .EQU Tmp3 VocabPtr .EQU Tmp4 NumVocabWords .EQU Tmp5 EntryLength .EQU Tmp6 .MACRO ZIPFETCH LDRB OpCode,[IPC],#1 .IF Statistics BL CountStatistics .ENDC .IF Debug BL DebugCode .ENDC LDR PC,[PtrJmpTable,OpCode,LSL #2] .ENDM .PROC ZIP .IF Absolute B Init .ELSE .ENTRY Init .ENDC XIT SWI OS_NewLine SWI OS_WriteS .STRING " *** End of session ***" SWI OS_NewLine ReturnToCaller LDR R0,CursorAddress LDRB R1,[R0,#0] LDRB R2,[R0,#1] ; MOV R0,#165. ; SWI OS_Byte ; SWI OS_WriteI+26. ; SWI OS_WriteI+31. ; MOV R0,R1 ; SWI OS_WriteC ; MOV R0,R2 ; SWI OS_WriteC SWI OS_Exit ;TextColour .BYTE 0 ; .BYTE 16. ; .BYTE 0 ; .BYTE 0 ; .BYTE 0 ; .ALIGN ; ;BackgroundColour .BYTE 1 ; .BYTE 16. ; .BYTE 240. ; .BYTE 240. ; .BYTE 240. ; .ALIGN ; ;BorderColour .BYTE 0 ; .BYTE 24. ; .BYTE 0 ; .BYTE 0 ; .BYTE 0 ; ;SetColours MOV R0,#12. ; ADR R1,TextColour ; SWI OS_Word ; ADR R1,BackgroundColour ; SWI OS_Word ; ADR R1,BorderColour ; SWI OS_Word ; MOV PC,R14 ClearToEndOfLine SWI OS_WriteI+23. SWI OS_WriteI+8 SWI OS_WriteI+5 SWI OS_WriteI+6 SWI OS_WriteI+0 SWI OS_WriteI+0 SWI OS_WriteI+0 SWI OS_WriteI+0 SWI OS_WriteI+0 SWI OS_WriteI+0 MOV PC,R14 ScrollWindow SWI OS_WriteI+23. SWI OS_WriteI+7 SWI OS_WriteI+0 SWI OS_WriteI+7 SWI OS_WriteI+0 SWI OS_WriteI+0 SWI OS_WriteI+0 SWI OS_WriteI+0 SWI OS_WriteI+0 SWI OS_WriteI+0 MOV PC,R14 SetNoAutoCrLf SWI OS_WriteI+23. SWI OS_WriteI+16. SWI OS_WriteI+00000001T SWI OS_WriteI+00000000T SWI OS_WriteI+0 SWI OS_WriteI+0 SWI OS_WriteI+0 SWI OS_WriteI+0 SWI OS_WriteI+0 SWI OS_WriteI+0 MOV PC,R14 SetInverse SWI OS_WriteI+17. LDR R0,BackgroundColour SWI OS_WriteC SWI OS_WriteI+17. LDR R0,ForegroundColour ADD R0,R0,#128. SWI OS_WriteC MOV PC,R14 SetNormal SWI OS_WriteI+17. LDR R0,ForegroundColour SWI OS_WriteC SWI OS_WriteI+17. LDR R0,BackgroundColour ADD R0,R0,#128. SWI OS_WriteC MOV PC,R14 SetBold MOV PC,R14 MaskLow16 .WORD 0000FFFF CommandLineAdrs .WORD 0 HeapBase .WORD ZIP_Heap FileName .BLOCK 256.," " ; .ALIGN ForegroundColour .WORD 0 BackgroundColour .WORD 0 ReadColours .WORD 155. .WORD 156. .WORD -1 SetWholeScreen SWI OS_WriteI+28. SWI OS_WriteI+0 LDR R0,ScreenHeight SUB R0,R0,#1 SWI OS_WriteC LDR R0,ScreenWidth SUB R0,R0,#1 SWI OS_WriteC SWI OS_WriteI+0 MOV PC,R14 SetScrollWindow SWI OS_WriteI+28. SWI OS_WriteI+0 LDR R0,ScrollBottom SUB R0,R0,#1 SWI OS_WriteC LDR R0,ScreenWidth SUB R0,R0,#1 SWI OS_WriteC LDR R0,ScrollTop SUB R0,R0,#1 SWI OS_WriteC MOV PC,R14 CursorAddress .WORD CursorX Scroll STMEA SP!, {R14,R0,R1,R2} LDR R1,CursorAddress LDRB R2,[R1,#1] ; MOV R0,#134. ; SWI OS_Byte LDR R0,ScrollBottom SUB R0,R0,#1 CMP R2,R0 BLT \MoveDown BL SetScrollWindow BL ScrollWindow BL SetWholeScreen SWI OS_WriteI+31. SWI OS_WriteI+0 LDR R0,ScrollBottom SUB R0,R0,#1 STRB R0,[R1,#1] SWI OS_WriteC MOV R0,#0 STRB R0,[R1,#0] BL ClearToEndOfLine LDMEA SP!, {PC,R0,R1,R2} \MoveDown SWI OS_WriteI+31. SWI OS_WriteI+0 ADD R0,R2,#1 STRB R0,[R1,#1] SWI OS_WriteC MOV R0,#0 STRB R0,[R1,#0] LDMEA SP!, {PC,R0,R1,R2} Init MOV R0,#135. ; read screen mode SWI OS_Byte MOV R0,#160. MOV R1,#9 SWI OS_Byte ; MOV R1,#24. ; MOV R2,#76. ADD R1,R1,#1 STR R1,ScreenHeight STR R1,ScrollBottom STR R2,MaxLineIndex ADD R2,R2,#1 STR R2,ScreenWidth ADR R0,ReadColours ADR R1,ForegroundColour SWI OS_ReadVduVariables BL SetNormal BL SetNoAutoCrLf SWI OS_GetEnv STR R0,CommandLineAdrs LDR R2,HeapBase SUB R3,R1,R2 MOV R1,R2 MOV R0,#0 SWI OS_Heap LDR R1,HeapBase MOV R3,#256. MOV R0,#2 SWI OS_Heap MOV CodeBase,R2 LDR R0,CommandLineAdrs ADR R1,FileName MOV R2,#1<<29. ADD R2,R2,#255. SWI OS_GSTrans LDRB R3,[R0,#-1] TEQ R3,#0 MOVNE R2,#1<<29. ADDNE R2,R2,#20. SWINE OS_GSTrans TEQNE R2,#0 ADREQ R0,NoNameError SWIEQ OS_Write0 SWIEQ OS_Exit FindStoryFile MOV R0,#64.+1100T SWI XOS_Find BVC LoadStoryFile SWI OS_WriteI+12. SWI OS_WriteI+31. LDR R0,ScreenWidth SUB R0,R0,#66. MOV R0,R0,LSR #1 SWI OS_WriteC LDR R0,ScreenHeight MOV R0,R0,LSR #1 SWI OS_WriteC MOV R0,R1 SWI OS_WriteS .ASCII "Please insert disk with story file, " .STRING "then type any key to continue." .ALIGN WaitForKey SWI OS_ReadC SWI OS_WriteI+12. BCC FindStoryFile MOV R0,#7C SWI OS_Byte B ReturnToCaller NoNameError .ASCII "usage: zip " .BYTE 0A,0D,00 .ALIGN ZIP_End_Adrs .WORD ZIP_End LoadStoryFile STR R0,StoryFileHandle SWI OS_WriteI+12. LDR SP,ZIP_End_Adrs BL CopyRight LDR R1,StoryFileHandle MOV R2,CodeBase MOV R3,#256. MOV R4,#0 MOV R0,#3 SWI OS_GBPB LDRB R4,[CodeBase,#0] CMP R4,#4 MOVLT R4,#1 MOVGE R4,#2 STR R4,AddressShift LDRB R2,[CodeBase,#26.] LDRB R3,[CodeBase,#27.] ORR R3,R3,R2,LSL #8 MOV R3,R3,LSL R4 MOV R4,R3 SUB R3,R3,#256. LDR R1,HeapBase MOV R2,CodeBase MOV R0,#4 SWI OS_Heap MOV CodeBase,R2 LDR R1,StoryFileHandle MOV R3,R4 MOV R4,#0 MOV R0,#3 SWI OS_GBPB LDR R1,HeapBase MOV R3,#StackSize MOV R0,#2 SWI OS_Heap STR R2,StackBase LDR OpdBase,OpdAddress ADR RegBase,Registers LDRB Wrk1,[CodeBase,#8] LDRB Wrk2,[CodeBase,#9] ORR Wrk2,Wrk2,Wrk1,LSL #8 ADD Wrk2,Wrk2,CodeBase STR Wrk2,VocabBase LDRB Wrk1,[CodeBase,#10.] LDRB Wrk2,[CodeBase,#11.] ORR Wrk2,Wrk2,Wrk1,LSL #8 ADD Wrk2,Wrk2,CodeBase STR Wrk2,ObjBase LDRB Wrk1,[CodeBase,#12.] LDRB DataBase,[CodeBase,#13.] ORR DataBase,DataBase,Wrk1,LSL #8 ADD DataBase,DataBase,CodeBase LDRB Wrk1,[CodeBase,#24.] LDRB Wrk2,[CodeBase,#25.] ORR Wrk2,Wrk2,Wrk1,LSL #8 ADD Wrk2,Wrk2,CodeBase STR Wrk2,SpecialBase LDR PtrJmpTable,TableAddress Restart LDR Bit16Mask,MaskLow16 BL SetWholeScreen LDR SP,StackBase MOV Wrk1,#3 STR Wrk1,LineNo SWI OS_WriteI+4 SWI OS_WriteI+31. SWI OS_WriteI+0 LDR R0,ScrollBottom SUB R0,R0,#1 STRB R0,CursorY SWI OS_WriteC MOV R0,#0 STRB R0,CursorX LDR R0,ScreenWidth LDR R1,ScreenHeight BL CopyRight MOV Wrk1,#0 STR SP,MP STR Wrk1,PrinterEnabled STR Wrk1,BufferEnabled STR Wrk1,WindowEnabled STR Wrk1,WritingInWindow STR Wrk1,DirectEnabled MOV Wrk1,#1 STR Wrk1,ScreenEnabled LDRB Wrk1,[CodeBase,#6] LDRB IPC,[CodeBase,#7] ORR IPC,IPC,Wrk1,LSL #8 ADD IPC,IPC,CodeBase LDR Wrk1,ScreenHeight STRB Wrk1,[CodeBase,#32.] LDR Wrk1,ScreenWidth STRB Wrk1,[CodeBase,#33.] MOV Wrk1,#InterpType STRB Wrk1,[CodeBase,#30.] MOV Wrk1,#InterpVersion STRB Wrk1,[CodeBase,#31.] LDRB Wrk1,[CodeBase,#1] ORR Wrk1,Wrk1,#00110000T STRB Wrk1,[CodeBase,#1] LDRB Wrk1,[CodeBase,#0] CMP Wrk1,#4 MOVLT Wrk1,#2 MOVGE Wrk1,#1 STR Wrk1,ScrollTop MOVLT Wrk1,#6 MOVGE Wrk1,#9 STR Wrk1,VcbWordLength MOVLT Wrk1,#9 MOVGE Wrk1,#14. STR Wrk1,ObjRecSize MOVLT Wrk1,#53. MOVGE Wrk1,#112. STR Wrk1,ObjOffset MOVLT Wrk1,#7 MOVGE Wrk1,#12. STR Wrk1,DataPtrOffset MOVLT Wrk1,#31. MOVGE Wrk1,#63. STR Wrk1,DataNoMask B MainLoop MP .WORD 0 NP .WORD 0 GetWrkChkFromTOS TEQ Wrk2,#0 BNE GetWrkNonStack LDR Wrk1,[SP,#-4] MOV PC,R14 GetWrk LDRB Wrk2,[IPC],#1 TEQ Wrk2,#0 BEQ PullWrk GetWrkNonStack CMP Wrk2,#16. BGE GetDataWord SUB Wrk2,Wrk2,#1 LDR Wrk1,[RegBase,Wrk2,LSL #2] MOV PC,R14 GetDataWord SUB Wrk2,Wrk2,#16. ADD Wrk2,DataBase,Wrk2,LSL #1 LDRB Wrk3,[Wrk2] LDRB Wrk1,[Wrk2,#1] ORR Wrk1,Wrk1,Wrk3,LSL #8 MOV PC,R14 PullWrkMain ADR R14,MainLoop PullWrk LDR Wrk1,[SP,#-4]! MOV PC,R14 PushWrk STR Wrk1,[SP],#4 MOV PC,R14 PutWrkChkToTOSMain ADR R14,MainLoop PutWrkChkToTOS TEQ Wrk2,#0 BNE PutWrkNonStack STR Wrk1,[SP,#-4] MOV PC,R14 PutZeroMain MOV Wrk1,#0 PutWrkMain ADR R14,MainLoop PutWrk LDRB Wrk2,[IPC],#1 PutWrkWrk2 TEQ Wrk2,#0 BEQ PushWrk PutWrkNonStack CMP Wrk2,#16. BGE PutDataWord SUB Wrk2,Wrk2,#1 STR Wrk1,[RegBase,Wrk2,LSL #2] MOV PC,R14 PutDataWord SUB Wrk2,Wrk2,#16. ADD Wrk2,DataBase,Wrk2,LSL #1 STRB Wrk1,[Wrk2,#1] MOV Wrk1,Wrk1,LSR #8 STRB Wrk1,[Wrk2] MOV PC,R14 NWL ADR R14,MainLoop B NewLine WTXMain ADR R14,MainLoop B WriteText MainLoop ZIPFETCH cEQU BL GetTwoOperands SUBS OpdCnt,OpdCnt,#1 BLE MissingOperand CMP Opd0,Opd1 BEQ HandleTrue SUBS OpdCnt,OpdCnt,#1 BEQ HandleFalse LDR Opd1,sOpd2 CMP Opd0,Opd1 BEQ HandleTrue SUBS OpdCnt,OpdCnt,#1 BEQ HandleFalse LDR Opd1,sOpd3 CMP Opd0,Opd1 BNE HandleFalse B HandleTrue CalcObjAdrs LDR Wrk2,ObjRecSize LDR Wrk3,ObjOffset MLA Wrk1,Wrk2,Wrk1,Wrk3 LDR Wrk2,ObjBase ADD Wrk1,Wrk1,Wrk2 MOV PC,R14 GetObjDataPtr STR R14,Link MOV Wrk1,Opd0 BL CalcObjAdrs LDR Wrk2,DataPtrOffset LDRB Wrk2,[Wrk1,Wrk2]! LDRB Wrk1,[Wrk1,#1] ORR Wrk1,Wrk1,Wrk2,LSL #8 ADD Wrk1,Wrk1,CodeBase LDRB Wrk2,[Wrk1],#1 ADD Wrk1,Wrk1,Wrk2,LSL #1 LDR R14,Link MOV PC,R14 Link .WORD 0 Registers .WORD 0 .WORD 0 .WORD 0 .WORD 0 .WORD 0 .WORD 0 .WORD 0 .WORD 0 .WORD 0 .WORD 0 .WORD 0 .WORD 0 .WORD 0 .WORD 0 .WORD 0 LOD BL GetTwoOperands MOV Wrk1,#1 STR Wrk1,FetchNext BL GetObjDataPtr LDR Opd0,DataNoMask LODFindData LDRB Wrk2,[Wrk1] AND Wrk2,Wrk2,Opd0 CMP Wrk2,Opd1 BEQ LODGetData BLT LODGlobalData BL GetDataSize ADD Wrk1,Wrk1,Wrk2 B LODFindData LODGetData BL GetDataSize TEQ Wrk2,#1 BEQ LODLoadByte TEQ Wrk2,#2 BNE DataNotWordOrByte LDRB Wrk2,[Wrk1],#1 LDRB Wrk1,[Wrk1] ORR Wrk1,Wrk1,Wrk2,LSL #8 B PutWrkMain LODLoadByte LDRB Wrk1,[Wrk1] B PutWrkMain LODGlobalData LDR Wrk1,ObjBase SUB Opd1,Opd1,#1 LDRB Wrk2,[Wrk1,Opd1,LSL #1]! LDRB Wrk1,[Wrk1,#1] ORR Wrk1,Wrk1,Wrk2,LSL #8 B PutWrkMain LOA BL GetTwoOperands MOV Wrk1,#1 STR Wrk1,FetchNext BL GetObjDataPtr LDR Opd0,DataNoMask LOAFindData LDRB Wrk2,[Wrk1] AND Wrk2,Wrk2,Opd0 CMP Wrk2,Opd1 BEQ LOAPutAddress BLT PutZeroMain BL GetDataSize ADD Wrk1,Wrk1,Wrk2 B LOAFindData LOAPutAddress BL GetDataSize SUB Wrk1,Wrk1,CodeBase B PutWrkMain cLNN BL GetTwoOperands MOV Wrk1,#1 STR Wrk1,FetchNext BL GetObjDataPtr LDR Opd0,DataNoMask TEQ Opd1,#0 BNE cLNNFindData LDRB Wrk1,[Wrk1] AND Wrk1,Wrk1,Opd0 B PutWrkMain cLNNFindData LDRB Wrk2,[Wrk1] AND Wrk2,Wrk2,Opd0 CMP Wrk2,Opd1 BEQ cLNNPutNextNo BLT PutZeroMain BL GetDataSize ADD Wrk1,Wrk1,Wrk2 B cLNNFindData cLNNPutNextNo BL GetDataSize ADD Wrk1,Wrk1,Wrk2 LDRB Wrk1,[Wrk1] AND Wrk1,Wrk1,Opd0 B PutWrkMain EQN BL GetOneOperand TEQ Opd0,#0 BEQ HandleTrue HandleFalse LDRB Wrk1,[IPC],#1 TST Wrk1,#10000000T BEQ DoJump DiscardDistance TST Wrk1,#01000000T LDREQB Wrk1,[IPC],#1 ZIPFETCH HandleTrue LDRB Wrk1,[IPC],#1 TST Wrk1,#10000000T BEQ DiscardDistance DoJump TST Wrk1,#01000000T AND Wrk1,Wrk1,#00111111T BEQ HandleLongJump ChkDistance TEQ Wrk1,#0 BEQ RTF TEQ Wrk1,#1 BEQ RTT SUB Wrk1,Wrk1,#2 ADD IPC,IPC,Wrk1 ZIPFETCH HandleLongJump TST Wrk1,#00100000T ORRNE Wrk1,Wrk1,#11000000T LDRB Wrk3,[IPC],#1 ORR Wrk1,Wrk3,Wrk1,LSL #8 AddDistance SUB Wrk1,Wrk1,#2 TST Wrk1,#1000000000000000T ORRNE Wrk1,Wrk1,#000FF0000 ORRNE Wrk1,Wrk1,#0FF000000 LDR Wrk3,AddressShift MOV Wrk4,Wrk1,LSL Wrk3 AND Wrk4,Wrk4,#00FF0000 BIC Wrk1,Wrk1,#00FF0000 ORR Wrk1,Wrk1,Wrk4 ADD IPC,IPC,Wrk1 ZIPFETCH NXO BL GetOneOperand MOV Wrk1,Opd0 BL CalcObjAdrs LDRB Wrk2,[CodeBase,#0] CMP Wrk2,#4 BGE PlusNXO LDRB Wrk1,[Wrk1,#5] B PutNXO PlusNXO LDRB Wrk2,[Wrk1,#8] LDRB Wrk1,[Wrk1,#9] ORR Wrk1,Wrk1,Wrk2,LSL #8 PutNXO TEQ Wrk1,#0 ADREQ R14,HandleFalse ADRNE R14,HandleTrue B PutWrk FSO BL GetOneOperand MOV Wrk1,Opd0 BL CalcObjAdrs LDRB Wrk2,[CodeBase,#0] CMP Wrk2,#4 BGE PlusFSO LDRB Wrk1,[Wrk1,#6] B PutFSO PlusFSO LDRB Wrk2,[Wrk1,#10.] LDRB Wrk1,[Wrk1,#11.] ORR Wrk1,Wrk1,Wrk2,LSL #8 PutFSO TEQ Wrk1,#0 ADREQ R14,HandleFalse ADRNE R14,HandleTrue B PutWrk PTO BL GetOneOperand MOV Wrk1,Opd0 BL CalcObjAdrs LDRB Wrk2,[CodeBase,#0] CMP Wrk2,#4 BGE PlusPTO LDRB Wrk1,[Wrk1,#4] B PutWrkMain PlusPTO LDRB Wrk2,[Wrk1,#6] LDRB Wrk1,[Wrk1,#7] ORR Wrk1,Wrk1,Wrk2,LSL #8 B PutWrkMain LOS BL GetOneOperand MOV Wrk1,#0 STR Wrk1,FetchNext SUB Wrk1,Opd0,#1 ADD Wrk1,Wrk1,CodeBase BL GetDataSize MOV Wrk1,Wrk2 B PutWrkMain RemoveObj STMEA SP!, {R14,Wrk4,Tmp1,Tmp2} MOV Wrk1,Opd0 BL CalcObjAdrs LDRB Wrk4,[CodeBase,#0] CMP Wrk4,#4 BGE PlusParentRMO LDRB Wrk2,[Wrk1,#4] B ChkParentRMO PlusParentRMO LDRB Wrk3,[Wrk1,#6] LDRB Wrk2,[Wrk1,#7] ORR Wrk2,Wrk2,Wrk3,LSL #8 ChkParentRMO TEQ Wrk2,#0 BEQ RemoveReturn MOV Tmp1,Wrk1 MOV Wrk1,Wrk2 BL CalcObjAdrs CMP Wrk4,#4 BGE PlusFirstRMO LDRB Wrk2,[Wrk1,#6] B ChkFirstRMO PlusFirstRMO LDRB Wrk3,[Wrk1,#10.] LDRB Wrk2,[Wrk1,#11.] ORR Wrk2,Wrk2,Wrk3,LSL #8 ChkFirstRMO CMP Wrk2,Opd0 BNE FindObjRMO CMP Wrk4,#4 BGE PlusSetFirstRMO LDRB Wrk3,[Tmp1,#5] STRB Wrk3,[Wrk1,#6] B ClearFieldsRMO PlusSetFirstRMO LDRB Wrk3,[Tmp1,#8] STRB Wrk3,[Wrk1,#10.] LDRB Wrk3,[Tmp1,#9] STRB Wrk3,[Wrk1,#11.] B ClearFieldsRMO FindObjRMO MOV Tmp2,Wrk2 FindLoopRMO MOV Wrk1,Tmp2 BL CalcObjAdrs CMP Wrk4,#4 BGE PlusGetNextRMO LDRB Tmp2,[Wrk1,#5] B ChkNextRMO PlusGetNextRMO LDRB Wrk3,[Wrk1,#8] LDRB Tmp2,[Wrk1,#9] ORR Tmp2,Tmp2,Wrk3,LSL #8 ChkNextRMO CMP Tmp2,Opd0 BNE FindLoopRMO CMP Wrk4,#4 BGE PlusSetNextRMO LDRB Wrk3,[Tmp1,#5] STRB Wrk3,[Wrk1,#5] B ClearFieldsRMO PlusSetNextRMO LDRB Wrk3,[Tmp1,#8] STRB Wrk3,[Wrk1,#8] LDRB Wrk3,[Tmp1,#9] STRB Wrk3,[Wrk1,#9] ClearFieldsRMO MOV Wrk3,#0 CMP Wrk4,#4 BGE PlusClearFieldsRMO STRB Wrk3,[Tmp1,#4] STRB Wrk3,[Tmp1,#5] B RemoveReturn PlusClearFieldsRMO STRB Wrk3,[Tmp1,#6] STRB Wrk3,[Tmp1,#7] STRB Wrk3,[Tmp1,#8] STRB Wrk3,[Tmp1,#9] RemoveReturn LDMEA SP!, {PC,Wrk4,Tmp1,Tmp2} WriteObjectName STMEA SP!, {R14} BL CalcObjAdrs LDR Wrk3,DataPtrOffset LDRB Wrk2,[Wrk1,Wrk3]! LDRB TxtIPC,[Wrk1,#1] ORR TxtIPC,TxtIPC,Wrk2,LSL #8 ADD TxtIPC,TxtIPC,CodeBase ADD TxtIPC,TxtIPC,#1 LDMEA SP!, {R14} B WriteText RTN BL GetOneOperand ReturnOpd0 LDR SP,MP LDR Wrk1,[SP,#-4]! LDR Wrk2,[SP,#-4]! STR Wrk2,NP TEQ Wrk1,#0 BEQ PulledRegs PullRegLoop SUBS Wrk1,Wrk1,#1 LDR Wrk3,[SP,#-4]! STR Wrk3,[RegBase,Wrk1,LSL #2] BNE PullRegLoop PulledRegs LDR IPC,[SP,#-4]! LDR Wrk1,[SP,#-4]! STR Wrk1,MP LDR Wrk1,[SP,#-4]! TEQ Wrk1,#0 BNE MainLoop MOV Wrk1,Opd0 B PutWrkMain WSW BL GetOneOperand LDR Wrk2,AddressShift ADD TxtIPC,CodeBase,Opd0,LSL Wrk2 B WTXMain SaveFileName .BLOCK 80.," " .ALIGN PageBuffer .WORD 0 SaveFileHandle .WORD 0 SVE BL WriteLineBuffer MOV Wrk1,#0 STR Wrk1,LineIndex BL PrintStatusLine BL SetScrollWindow SWI OS_WriteS .STRING "Save file name --> " ADR R0,SaveFileName MOV R1,#80. MOV R2,#" "+1 MOV R3,#"~" SWI OS_ReadLine ADR R2,SaveFileName MOV R0,#0 STRB R0,[R2,R1] BL SetWholeScreen MOV R1,R2 MOV R0,#128.+1111T SWI XOS_Find BVS SVE_Failed_NoRelease STR R0,SaveFileHandle MOV R3,#256. LDR R1,HeapBase MOV R0,#2 SWI OS_Heap STR R2,PageBuffer LDRB R0,[CodeBase,#2] STRB R0,[R2],#1 LDRB R0,[CodeBase,#3] STRB R0,[R2],#1 MOV R0,#0 STRB R0,[R2],#1 STRB R0,[R2],#1 SUB R0,IPC,CodeBase STR R0,[R2],#4 LDR R3,StackBase SUB R0,SP,R3 STR R0,[R2],#4 LDR R0,MP SUB R0,R0,R3 STR R0,[R2],#4 LDR R0,NP STR R0,[R2],#4 MOV R1,#15. MOV R3,RegBase SVE_Regs LDR R0,[R3],#4 STR R0,[R2],#4 SUBS R1,R1,#1 BNE SVE_Regs LDR R1,SaveFileHandle LDR R2,PageBuffer MOV R3,#256. MOV R0,#2 SWI XOS_GBPB BVS SVE_Failed LDR R2,StackBase MOV R3,#StackSize MOV R0,#2 SWI XOS_GBPB BVS SVE_Failed LDRB R3,[CodeBase,#14.] ADD R3,R3,#1 MOV R3,R3,LSL #8 MOV R2,CodeBase MOV R0,#2 SWI XOS_GBPB BVS SVE_Failed MOV R0,#0 LDR R1,SaveFileHandle SWI XOS_Find BVS SVE_Failed LDR R1,HeapBase LDR R2,PageBuffer MOV R0,#3 SWI OS_Heap LDRB R0,[CodeBase,#0] CMP R0,#4 BLT HandleTrue MOV Wrk1,#1 B PutWrkMain SVE_Failed LDR R1,HeapBase LDR R2,PageBuffer MOV R0,#3 SWI OS_Heap LDR R1,SaveFileHandle MOV R0,#0 SWI XOS_Find SVE_Failed_NoRelease LDRB R0,[CodeBase,#0] CMP R0,#4 BLT HandleFalse MOV Wrk1,#0 B PutWrkMain RSO BL WriteLineBuffer MOV Wrk1,#0 STR Wrk1,LineIndex BL PrintStatusLine BL SetScrollWindow SWI OS_WriteS .STRING "Restore file name --> " ADR R0,SaveFileName MOV R1,#80. MOV R2,#" "+1 MOV R3,#"~" SWI OS_ReadLine ADR R2,SaveFileName MOV R0,#0 STRB R0,[R2,R1] BL SetWholeScreen MOV R1,R2 MOV R0,#64.+1111T SWI XOS_Find BVS SVE_Failed_NoRelease STR R0,SaveFileHandle MOV R3,#256. LDR R1,HeapBase MOV R0,#2 SWI OS_Heap STR R2,PageBuffer LDR R1,SaveFileHandle MOV R3,#256. MOV R0,#4 SWI XOS_GBPB BVS SVE_Failed LDR R2,PageBuffer LDRB R0,[R2],#1 LDRB R1,[CodeBase,#2] CMP R0,R1 BNE SVE_Failed LDRB R0,[R2],#1 LDRB R1,[CodeBase,#3] CMP R0,R1 BNE SVE_Failed ADD R2,R2,#2 LDR R0,[R2],#4 ADD IPC,R0,CodeBase LDR R3,StackBase LDR R0,[R2],#4 ADD SP,R0,R3 LDR R0,[R2],#4 ADD R0,R0,R3 STR R0,MP LDR R0,[R2],#4 STR R0,NP MOV R1,#15. MOV R3,RegBase RSO_Regs LDR R0,[R2],#4 STR R0,[R3],#4 SUBS R1,R1,#1 BNE RSO_Regs LDR R1,SaveFileHandle LDR R2,StackBase MOV R3,#StackSize MOV R0,#4 SWI XOS_GBPB BVS SVE_Failed LDRB R3,[CodeBase,#14.] ADD R3,R3,#1 MOV R3,R3,LSL #8 MOV R2,CodeBase MOV R0,#4 SWI XOS_GBPB BVS SVE_Failed MOV R0,#0 LDR R1,SaveFileHandle SWI XOS_Find BVS SVE_Failed LDR R1,HeapBase LDR R2,PageBuffer MOV R0,#3 SWI OS_Heap LDRB R0,[CodeBase,#4] CMP R0,#4 BLT HandleTrue MOV Wrk1,#2 B PutWrkMain StoryFileHandle .WORD 0 RST MOV R0,#3 LDR R1,StoryFileHandle MOV R2,CodeBase LDRB R3,[CodeBase,#4] MOV R3,R3,LSL #8 MOV R4,#0 SWI OS_GBPB B Restart RPL LDR Opd0,[SP,#-4]! B ReturnOpd0 DSC B PullWrkMain PSL BL PrintStatusLine ZIPFETCH InitialDataAdrs .WORD 0 NumDataBytes .WORD 0 VFY LDRB R3,[CodeBase,#4] MOV R3,R3,LSL #8 STR R3,NumDataBytes LDR R1,HeapBase MOV R0,#2 SWI OS_Heap STR R2,InitialDataAdrs LDR R1,StoryFileHandle LDR R3,NumDataBytes MOV R4,#0 MOV R0,#3 SWI OS_GBPB LDR R2,InitialDataAdrs LDR R3,NumDataBytes ADD R2,R2,#64. SUB R3,R3,#64. MOV R1,#0 VFY_DataLoop LDRB R0,[R2],#1 ADD R1,R1,R0 SUBS R3,R3,#1 BNE VFY_DataLoop LDRB R0,[CodeBase,#26.] LDRB R3,[CodeBase,#27.] ORR R3,R3,R0,LSL #8 LDR R0,AddressShift MOV R3,R3,LSL R0 LDR R4,NumDataBytes ADD R2,CodeBase,R4 SUB R3,R3,R4 VFY_CodeLoop LDRB R0,[R2],#1 ADD R1,R1,R0 SUBS R3,R3,#1 BNE VFY_CodeLoop AND R4,R1,Bit16Mask LDR R1,HeapBase LDR R2,InitialDataAdrs MOV R0,#3 SWI OS_Heap LDRB R0,[CodeBase,#28.] LDRB R2,[CodeBase,#29.] ORR R2,R2,R0,LSL #8 CMP R4,R2 BNE VFY_Failed LDRB R0,[CodeBase,#0] CMP R0,#4 BLT HandleTrue MOV Wrk1,#1 B PutWrkMain VFY_Failed LDRB R0,[CodeBase,#0] CMP R0,#4 BLT HandleFalse MOV Wrk1,#0 B PutWrkMain EXC B NotImplemented GetExtendedOperands LDRB Wrk2,[IPC],#1 LDRB Wrk1,[IPC],#1 ORR Wrk1,Wrk1,Wrk2,LSL #8 B EnterMultipleLoop GetMultipleOperands LDRB Wrk1,[IPC],#1 MOV Wrk1,Wrk1,LSL #8 ORR Wrk1,Wrk1,#0000000011111111T EnterMultipleLoop MOV OpdCnt,#0 GetOneMlt TST Wrk1,#1100000000000000T LDREQB Wrk2,[IPC],#1 LDREQB Opd0,[IPC],#1 ORREQ Opd0,Opd0,Wrk2,LSL #8 BEQ StoreMltOpd MltNotImmWord TST Wrk1,#1000000000000000T LDREQB Opd0,[IPC],#1 BEQ StoreMltOpd MltNotImmByte TST Wrk1,#0100000000000000T BNE GetMltReturn LDRB Wrk2,[IPC],#1 TEQ Wrk2,#0 LDREQ Opd0,[SP,#-4]! BEQ StoreMltOpd CMP Wrk2,#16. SUBLT Wrk2,Wrk2,#1 LDRLT Opd0,[RegBase,Wrk2,LSL #2] BLT StoreMltOpd MltDataWord SBC Wrk2,Wrk2,#16. ADD Wrk2,DataBase,Wrk2,LSL #1 LDRB Opd0,[Wrk2,#1] LDRB Wrk2,[Wrk2] ORR Opd0,Opd0,Wrk2,LSL #8 StoreMltOpd STR Opd0,[OpdBase,OpdCnt,LSL #2] ADD OpdCnt,OpdCnt,#1 CMP OpdCnt,#8 MOVLT Wrk1,Wrk1,LSL #2 BLT GetOneMlt GetMltReturn LDR Opd0,sOpd0 LDR Opd1,sOpd1 MOV PC,R14 CFC BL GetMultipleOperands CallFunction MOV Wrk1,#0 Call TEQ Opd0,#0 BEQ NoCall STR Wrk1,[SP],#4 LDR Wrk1,MP STR Wrk1,[SP],#4 STR IPC,[SP],#4 LDR Wrk2,AddressShift ADD IPC,CodeBase,Opd0,LSL Wrk2 LDRB Wrk1,[IPC],#1 TEQ Wrk1,#0 BEQ PushedRegs LDRB Wrk2,[CodeBase,#0] CMP Wrk2,#5 MOV Wrk2,#0 MOV Wrk3,#0 BGE PushRegLoop5 PushRegLoop LDR Opd0,[RegBase,Wrk2,LSL #2] STR Opd0,[SP],#4 LDRB Wrk3,[IPC],#1 LDRB Opd0,[IPC],#1 ORR Opd0,Opd0,Wrk3,LSL #8 STR Opd0,[RegBase,Wrk2,LSL #2] ADD Wrk2,Wrk2,#1 CMP Wrk2,Wrk1 BLT PushRegLoop B PushedRegs PushRegLoop5 LDR Opd0,[RegBase,Wrk2,LSL #2] STR Opd0,[SP],#4 STR Wrk3,[RegBase,Wrk2,LSL #2] ADD Wrk2,Wrk2,#1 CMP Wrk2,Wrk1 BLT PushRegLoop5 PushedRegs LDR Wrk2,NP STR Wrk2,[SP],#4 STR Wrk1,[SP],#4 SUB Wrk1,OpdCnt,#1 STR Wrk1,NP TEQ Wrk1,#0 BEQ LoadedParams MOV Wrk2,#0 ADD Wrk3,OpdBase,#4 LoadParam LDR Opd0,[Wrk3,Wrk2,LSL #2] STR Opd0,[RegBase,Wrk2,LSL #2] ADD Wrk2,Wrk2,#1 CMP Wrk2,Wrk1 BLT LoadParam LoadedParams STR SP,MP ZIPFETCH NoCall TEQ Wrk1,#0 BNE MainLoop B PutWrkMain STB BL GetMultipleOperands ADD Wrk1,Opd0,Opd1 LDR Wrk2,sOpd2 STRB Wrk2,[Wrk1,CodeBase] ZIPFETCH Operands sOpd0 .WORD 0 sOpd1 .WORD 0 sOpd2 .WORD 0 sOpd3 .WORD 0 sOpd4 .WORD 0 sOpd5 .WORD 0 sOpd6 .WORD 0 sOpd7 .WORD 0 TableAddress .WORD JmpTable VocabBase .WORD 0 SpecialBase .WORD 0 ScreenEnabled .WORD 0 PrinterEnabled .WORD 0 BufferEnabled .WORD 0 DirectEnabled .WORD 0 WindowEnabled .WORD 0 MaxLineIndex .WORD 0 LineNo .WORD 0 BufferBase .WORD 0 BufferIndex .WORD 0 ScreenHeight .WORD 0 ScreenWidth .WORD 0 ScrollTop .WORD 0 ScrollBottom .WORD 0 LineIndex .WORD 0 CursorX .BYTE 0 CursorY .BYTE 0 .ALIGN OpdAddress .WORD Operands StackBase .WORD 0 ObjBase .WORD 0 DataPtrOffset .WORD 0 DataNoMask .WORD 0 ObjRecSize .WORD 0 ObjOffset .WORD 0 VcbWordLength .WORD 0 AddressShift .WORD 0 WritingInWindow .WORD 0 STW BL GetMultipleOperands ADD Wrk1,Opd0,Opd1,LSL #1 LDR Wrk2,sOpd2 MOV Wrk3,Wrk2,LSR #8 STRB Wrk3,[Wrk1,CodeBase]! STRB Wrk2,[Wrk1,#1] ZIPFETCH FetchNext .WORD 0 SOD BL GetMultipleOperands MOV Wrk1,#1 STR Wrk1,FetchNext BL GetObjDataPtr LDR Opd0,DataNoMask SODFindData LDRB Wrk2,[Wrk1] AND Wrk2,Wrk2,Opd0 CMP Wrk2,Opd1 BEQ SODSetData BLT DataNotFound BL GetDataSize ADD Wrk1,Wrk1,Wrk2 B SODFindData SODSetData BL GetDataSize LDR Wrk3,sOpd2 TEQ Wrk2,#1 BEQ SODStoreByte TEQ Wrk2,#2 BNE DataNotWordOrByte MOV Wrk2,Wrk3,LSR #8 STRB Wrk2,[Wrk1],#1 SODStoreByte STRB Wrk3,[Wrk1] ZIPFETCH GetDataSize LDRB Wrk2,[Wrk1],#1 LDRB Wrk3,[CodeBase,#0] CMP Wrk3,#4 BGE PlusDataSize MOV Wrk2,Wrk2,LSR #5 AND Wrk2,Wrk2,#7 ADD Wrk2,Wrk2,#1 MOV PC,R14 PlusDataSize TST Wrk2,#10000000T BEQ TstWordOrByteData LDR Wrk3,FetchNext TEQ Wrk3,#0 SUBEQ Wrk1,Wrk1,#1 LDRNE Wrk2,[Wrk1],#1 AND Wrk2,Wrk2,#63. MOV PC,R14 TstWordOrByteData TST Wrk2,#01000000T MOVNE Wrk2,#2 MOVEQ Wrk2,#1 MOV PC,R14 INP BL GetMultipleOperands BL WriteLineBuffer MOV Wrk1,#0 STR Wrk1,LineIndex BL PrintStatusLine BL SetScrollWindow LDR Wrk1,ScrollTop ADD Wrk1,Wrk1,#1 STR Wrk1,LineNo MOV Wrk1,#0 STR Wrk1,LineIndex ADD InpLinePtr,Opd0,CodeBase STR InpLinePtr,InpLineStart ADD ParsedPtr,Opd1,CodeBase ADD R0,InpLinePtr,#1 LDRB R1,[InpLinePtr],#1 LDR R2,MaxLineIndex CMP R1,R2 MOVGT R1,R2 CMP R1,#0 MOVEQ R1,R2 MOV R2,#" " MOV R3,#"~" SWI OS_ReadLine TEQ R1,#0 BEQ INPDonePrint LDR R2,PrinterEnabled TEQ R2,#0 LDREQB R2,[CodeBase,#17.] ANDEQ R2,R2,#1 TEQEQ R2,#0 BEQ INPDonePrint SWI OS_WriteI+2 SWI OS_WriteI+21. MOV R2,#0 MOV R3,R0 INPPrintLoop LDRB R0,[R3,R2] SWI OS_WriteC ADD R2,R2,#1 CMP R2,R1 BNE INPPrintLoop SWI OS_NewLine SWI OS_WriteI+6 SWI OS_WriteI+3 INPDonePrint MOV R0,#0 STRB R0,[InpLinePtr,R1] BL SetWholeScreen CMP OpdCnt,#1 BLT MainLoop STMEA SP!, {R4-R12} LDR VocabPtr,VocabBase LDRB Wrk1,[VocabPtr],#1 ADD VocabPtr,VocabPtr,Wrk1 LDRB EntryLength,[VocabPtr],#1 LDRB Wrk1,[VocabPtr],#1 LDRB NumVocabWords,[VocabPtr],#1 ORR NumVocabWords,NumVocabWords,Wrk1,LSL #8 STR VocabPtr,VocabStart LDRB MaxNumWords,[ParsedPtr] CMP MaxNumWords,#MaxMaxNumWords MOVGT MaxNumWords,#MaxMaxNumWords TEQ MaxNumWords,#0 MOVEQ MaxNumWords,#MaxMaxNumWords STR ParsedPtr,ParsedStart ADD ParsedPtr,ParsedPtr,#2 MOV NumWords,#0 LDRB Wrk1,[InpLinePtr] INP_WordLoop TEQ Wrk1,#0 BEQ INP_SetNumWords ADR WordChPtr,WordChBuffer MOV Wrk2,#0 LDR Wrk3,VcbWordLength INP_InitBuffer SUBS Wrk3,Wrk3,#1 STRB Wrk2,[WordChPtr,Wrk3] BNE INP_InitBuffer STR InpLinePtr,WordStart LDRB Wrk1,[InpLinePtr],#1 TEQ Wrk1,#0 BEQ INP_SetNumWords BL ChkIfSeparator BEQ INP_ChkIfTerminator STRB Wrk1,[WordChPtr] MOV WordChCnt,#1 B INP_PackWord INP_ChkIfTerminator BL ChkIfTerminator BNE INP_WordLoop INP_StartWord STRB Wrk1,[WordChPtr] MOV WordChCnt,#1 INP_WordChLoop LDRB Wrk1,[InpLinePtr],#1 TEQ Wrk1,#0 BEQ INP_EndOfWord BL ChkIfSeparator BNE INP_EndOfWord BL ChkIfTerminator BNE INP_EndOfWord LDR Wrk3,VcbWordLength CMP WordChCnt,Wrk3 STRLTB Wrk1,[WordChPtr,WordChCnt] ADD WordChCnt,WordChCnt,#1 B INP_WordChLoop INP_EndOfWord SUB InpLinePtr,InpLinePtr,#1 INP_PackWord BL PackWord BL SearchWord MOV Wrk3,Wrk2,LSR #8 STRB Wrk3,[ParsedPtr],#1 STRB Wrk2,[ParsedPtr],#1 STRB WordChCnt,[ParsedPtr],#1 LDR Wrk2,WordStart LDR Wrk3,InpLineStart SUB Wrk2,Wrk2,Wrk3 STRB Wrk2,[ParsedPtr],#1 ADD NumWords,NumWords,#1 B INP_WordLoop INP_SetNumWords LDR ParsedPtr,ParsedStart STRB NumWords,[ParsedPtr,#1] LDMEA SP!, {R4-R12} ZIPFETCH PkdBuffer .BLOCK 18.," " WordChBuffer .BLOCK 18.," " .ALIGN ParsedStart .WORD 0 InpLineStart .WORD 0 WordStart .WORD 0 ChkIfSeparator STMEA SP!, {Wrk2,Wrk3,R14} LDR VocabPtr,VocabBase LDRB Wrk2,[VocabPtr],#1 SearchSeparator LDRB Wrk3,[VocabPtr],#1 CMP Wrk1,Wrk3 BEQ FoundSeparator SUBS Wrk2,Wrk2,#1 BNE SearchSeparator LDMEA SP!, {Wrk2,Wrk3,PC} FoundSeparator MOVS Wrk2,#1 LDMEA SP!, {Wrk2,Wrk3,PC} VocabStart .WORD 0 PackWord STMEA SP!, {R14,Wrk1,Wrk2,Wrk3,Wrk4} ADR Wrk1,PkdBuffer LDR Wrk2,VcbWordLength PutPackLoop LDRB Wrk3,[WordChPtr],#1 TEQ Wrk3,#0 BEQ Put5 CMP Wrk3,#"a" BLT PackChkCapital CMP Wrk3,#"z" BGT PutNonAlpha SUB Wrk3,Wrk3,#"a"-6 STRB Wrk3,[Wrk1],#1 B PackNextCh PackChkCapital CMP Wrk3,#"A" BLT PutNonAlpha CMP Wrk3,#"Z" BGT PutNonAlpha SUB Wrk3,Wrk3,#"A"-6 PutInPackBuffer STRB Wrk3,[Wrk1],#1 B PackNextCh PutNonAlpha MOV Wrk4,#5 STRB Wrk4,[Wrk1],#1 BL SearchSpecialTable BNE PutInPackBuffer MOV Wrk4,#6 STRB Wrk4,[Wrk1],#1 MOV Wrk4,Wrk3,LSR #5 AND Wrk4,Wrk4,#00000011T STRB Wrk4,[Wrk1],#1 AND Wrk4,Wrk3,#00011111T STRB Wrk4,[Wrk1],#1 B PackNextCh Put5 MOV Wrk3,#5 STRB Wrk3,[Wrk1],#1 PackNextCh SUBS Wrk2,Wrk2,#1 BNE PutPackLoop ADR Wrk1,PkdBuffer LDR Wrk2,[Wrk1] MOV Wrk4,Wrk2,LSR #8 MOV Wrk2,Wrk2,LSL #26. AND Wrk3,Wrk4,#1F ORR Wrk2,Wrk2,Wrk3,LSL #21. MOV Wrk4,Wrk4,LSR #8 AND Wrk3,Wrk4,#1F ORR Wrk2,Wrk2,Wrk3,LSL #16. MOV Wrk4,Wrk4,LSR #8 AND Wrk3,Wrk4,#1F ORR Wrk2,Wrk2,Wrk3,LSL #10. LDR Wrk4,[Wrk1,#4] AND Wrk3,Wrk4,#1F ORR Wrk2,Wrk2,Wrk3,LSL #5 MOV Wrk4,Wrk4,LSR #8 AND Wrk3,Wrk4,#1F ORR Wrk2,Wrk2,Wrk3 LDRB Wrk3,[CodeBase,#0] CMP Wrk3,#4 ORRLT Wrk2,Wrk2,#00008000 BICGT Wrk2,Wrk2,#00008000 STR Wrk2,[Wrk1,#0] LDMLTEA SP!, {PC,Wrk1,Wrk2,Wrk3,Wrk4} LDR Wrk2,[Wrk1,#4] LDRB Wrk3,[Wrk1,#8] MOV Wrk4,Wrk2,LSR #24. MOV Wrk2,Wrk2,LSR #6 AND Wrk2,Wrk2,#0111110000000000T ORR Wrk2,Wrk2,Wrk4,LSL #5 ORR Wrk2,Wrk2,Wrk3 ORR Wrk2,Wrk2,#1000000000000000T MOV Wrk3,Wrk2,LSR #8 STRB Wrk3,[Wrk1,#5] STRB Wrk2,[Wrk1,#4] LDMEA SP!, {PC,Wrk1,Wrk2,Wrk3,Wrk4} SearchWord STMEA SP!, {R14,Wrk1,Wrk3,Wrk4,Tmp1} LDR VocabPtr,VocabStart MOV Wrk4,NumVocabWords SearchWordLoop TEQ Wrk4,#0 BEQ WordNotFound TEQ Wrk4,#1 BEQ ChkLastWord MOV Wrk3,VocabPtr MOV Wrk1,Wrk4,LSR #1 MLA VocabPtr,Wrk1,EntryLength,VocabPtr LDR Wrk1,PkdBuffer LDRB Wrk2,[VocabPtr,#3] LDRB Tmp1,[VocabPtr,#2] ORR Wrk2,Wrk2,Tmp1,LSL #8 LDRB Tmp1,[VocabPtr,#1] ORR Wrk2,Wrk2,Tmp1,LSL #16. LDRB Tmp1,[VocabPtr,#0] ORR Wrk2,Wrk2,Tmp1,LSL #24. CMP Wrk1,Wrk2 BGT UpperHalf BLT LowerHalf LDRB Wrk2,[CodeBase,#0] CMP Wrk2,#4 BLT SearchWordFound ADR Wrk2,PkdBuffer LDRB Wrk1,[Wrk2,#4] LDRB Tmp1,[Wrk2,#5] ORR Wrk1,Wrk1,Tmp1,LSL #8 LDRB Wrk2,[VocabPtr,#5] LDRB Tmp1,[VocabPtr,#4] ORR Wrk2,Wrk2,Tmp1,LSL #8 CMP Wrk1,Wrk2 BGT UpperHalf BLT LowerHalf SearchWordFound SUB Wrk2,VocabPtr,CodeBase LDMEA SP!, {PC,Wrk1,Wrk3,Wrk4,Tmp1} ChkIfTerminator STMEA SP!, {R14,Wrk2,Wrk3,Wrk4} MOV Wrk2,#5 ADR Wrk4,Terminators SearchTerminator LDRB Wrk3,[Wrk4],#1 CMP Wrk1,Wrk3 BEQ FoundTerminator SUBS Wrk2,Wrk2,#1 BNE SearchTerminator LDMEA SP!, {PC,Wrk2,Wrk3,Wrk4} FoundTerminator MOVS Wrk2,#1 LDMEA SP!, {PC,Wrk2,Wrk3,Wrk4} Terminators .ASCII "!?,. " .ALIGN UpperHalf TST Wrk4,#1 MOV Wrk4,Wrk4,LSR #1 SUBEQ Wrk4,Wrk4,#1 ADD VocabPtr,VocabPtr,EntryLength B SearchWordLoop LowerHalf MOV Wrk4,Wrk4,LSR #1 MOV VocabPtr,Wrk3 B SearchWordLoop ChkLastWord LDR Wrk1,PkdBuffer LDRB Wrk2,[VocabPtr,#3] LDRB Tmp1,[VocabPtr,#2] ORR Wrk2,Wrk2,Tmp1,LSL #8 LDRB Tmp1,[VocabPtr,#1] ORR Wrk2,Wrk2,Tmp1,LSL #16. LDRB Tmp1,[VocabPtr,#0] ORR Wrk2,Wrk2,Tmp1,LSL #24. CMP Wrk1,Wrk2 TEQ Wrk2,Wrk1 BEQ ChkLastNextTwo WordNotFound MOV Wrk2,#0 LDMEA SP!, {PC,Wrk1,Wrk3,Wrk4,Tmp1} ChkLastNextTwo LDRB Wrk1,[CodeBase,#0] CMP Wrk1,#4 BLT SearchWordFound LDR Wrk1,PkdBuffer LDRB Wrk2,[VocabPtr,#3] LDRB Tmp1,[VocabPtr,#2] ORR Wrk2,Wrk2,Tmp1,LSL #8 LDRB Tmp1,[VocabPtr,#1] ORR Wrk2,Wrk2,Tmp1,LSL #16. LDRB Tmp1,[VocabPtr,#0] ORR Wrk2,Wrk2,Tmp1,LSL #24. CMP Wrk2,Wrk1 MOVNE Wrk2,#0 SUBEQ Wrk2,VocabPtr,CodeBase LDMEA SP!, {PC,Wrk1,Wrk3,Wrk4,Tmp1} SearchSpecialTable STMEA SP!, {R14,Wrk1,Wrk2,Wrk4} ADR Wrk1,RealSpecialChTable MOV Wrk2,#0 SearchTableLoop LDRB Wrk4,[Wrk1],#1 CMP Wrk3,Wrk4 BEQ FoundChInTable ADD Wrk2,Wrk2,#1 CMP Wrk2,#24. BNE SearchTableLoop LDMEA SP!, {PC,Wrk1,Wrk2,Wrk4} FoundChInTable ADDS Wrk3,Wrk2,#8 LDMEA SP!, {PC,Wrk1,Wrk2,Wrk4} SpecialChTable .BYTE 0 .BYTE EOL RealSpecialChTable .ASCII "0123456789.,!?_#'" .BYTE 22 .ASCII "/\-:()" .ALIGN SPL BL GetMultipleOperands TEQ Opd0,#0 BNE SPL_EnableWindow STR Opd0,WindowEnabled LDRB Wrk1,[CodeBase,#0] CMP Wrk1,#4 MOVLT Wrk2,#2 MOVGE Wrk2,#1 STR Wrk2,ScrollTop STR Wrk2,LineNo B MainLoop SPL_EnableWindow LDR Wrk1,ScreenHeight CMP Opd0,Wrk1 BGE MainLoop MOV Wrk1,#1 STR Wrk1,WindowEnabled ADD Opd0,Opd0,#1 LDRB Wrk1,[CodeBase,#0] CMP Wrk1,#4 ADDLT Opd0,Opd0,#1 STR Opd0,ScrollTop MOVLT Wrk1,#2 SUBLT Wrk2,Opd0,#1 BLLT ClearLines SWI OS_WriteI+31. SWI OS_WriteI+0 LDR R0,ScreenHeight SUB R0,R0,#1 STRB R0,CursorY SWI OS_WriteC MOV Wrk1,#0 STRB Wrk1,CursorX LDR Wrk2,LineNo CMP Opd0,Wrk2 STRLT Opd0,LineNo B MainLoop cPOS BL GetMultipleOperands LDR Wrk1,WindowEnabled BEQ MainLoop TEQ Opd0,#0 BEQ cPOS_GoWindow TEQ Opd0,#1 BNE MainLoop TEQ Opd0,#0 cPOS_GoWindow STR Opd0,WritingInWindow SWI OS_WriteI+31. SWI OS_WriteI+0 MOV Wrk1,#0 STRB Wrk1,CursorX LDREQ R0,ScreenHeight SUBEQ R0,R0,#1 BEQ cPOS_SendY LDRB Wrk1,[CodeBase,#0] CMP Wrk1,#4 MOVLT R0,#1 MOVGE R0,#0 cPOS_SendY STRB R0,CursorY SWI OS_WriteC B MainLoop CFCL BL GetExtendedOperands B CallFunction ERS BL GetMultipleOperands TEQ Opd0,#0 BNE ERS_Test1 LDR Wrk1,ScrollTop STR Wrk1,LineNo LDR Wrk2,ScreenHeight BL ClearLines SWI OS_WriteI+31. SWI OS_WriteI+0 LDR R0,ScreenHeight SUB R0,R0,#1 STRB R0,CursorY SWI OS_WriteC MOV Wrk1,#0 STRB Wrk1,CursorX B MainLoop ERS_Test1 TEQ Opd0,#1 BNE ERS_TestMinus1 MOV Wrk1,#1 LDR Wrk2,ScrollTop STR Wrk2,LineNo SUB Wrk2,Wrk2,#1 BL ClearLines SWI OS_WriteI+31. SWI OS_WriteI+0 LDR R0,ScrollTop SUB R0,R0,#1 STRB R0,CursorY SWI OS_WriteC MOV Wrk1,#0 STRB Wrk1,CursorX B MainLoop ERS_TestMinus1 EOR Opd0,Opd0,Bit16Mask TEQ Opd0,#0 BNE MainLoop MOV Wrk1,#0 STR Wrk1,WindowEnabled MOV Wrk1,#1 STR Wrk1,ScrollTop STR Wrk1,LineNo SWI OS_WriteI+12. MOV Wrk1,#0 STRB Wrk1,CursorX STRB Wrk1,CursorY B MainLoop cERL BL GetMultipleOperands TEQ Opd0,#1 BNE MainLoop BL ClearToEndOfLine B MainLoop GYX BL GetMultipleOperands LDR Wrk1,DirectEnabled BEQ MainLoop LDR Wrk1,WritingInWindow BEQ MainLoop SWI OS_WriteI+31. SUB R0,Opd1,#1 STRB R0,CursorX SWI OS_WriteC SUB R0,Opd0,#1 STRB R0,CursorY SWI OS_WriteC B MainLoop M16 B NotImplemented MainLoopAdrs .WORD MainLoop SCM BL GetMultipleOperands LDR R14,MainLoopAdrs TEQ Opd0,#0 BEQ SetNormal TEQ Opd0,#1 BEQ SetInverse TEQ Opd0,#2 BEQ SetBold B MainLoop FRM BL GetMultipleOperands TEQ Opd0,#0 BNE FRM_Test1 BL WriteLineBuffer STR Opd0,LineIndex MOV Wrk1,#1 STR Wrk1,DirectEnabled B MainLoop FRM_Test1 TEQ Opd0,#1 BNE MainLoop MOV Wrk1,#0 STR Wrk1,DirectEnabled B MainLoop OUT BL GetMultipleOperands TST Opd0,#1000000000000000T BNE OUT_ChkDisables MOV Wrk1,#1 TEQ Opd0,#1 BNE OUT_Test2 STR Wrk1,ScreenEnabled B MainLoop OUT_Test2 TEQ Opd0,#2 BNE OUT_Test3 STR Wrk1,PrinterEnabled LDRB Wrk1,[CodeBase,#17.] ORR Wrk1,Wrk1,#1 STRB Wrk1,[CodeBase,#17.] B MainLoop OUT_Test3 TEQ Opd0,#3 BNE MainLoop STR Wrk1,BufferEnabled ADD Opd1,Opd1,CodeBase STR Opd1,BufferBase MOV Wrk1,#2 STR Wrk1,BufferIndex B MainLoop OUT_ChkDisables MOV Wrk1,#0 EOR Opd0,Opd0,Bit16Mask ADD Opd0,Opd0,#1 TEQ Opd0,#1 BNE OUT_TestMinus2 STR Wrk1,ScreenEnabled B MainLoop OUT_TestMinus2 TEQ Opd0,#2 BNE OUT_TestMinus3 STR Wrk1,PrinterEnabled LDRB Wrk1,[CodeBase,#17.] BIC Wrk1,Wrk1,#1 STRB Wrk1,[CodeBase,#17.] B MainLoop OUT_TestMinus3 TEQ Opd0,#3 BNE MainLoop STR Wrk1,BufferEnabled LDR Wrk2,BufferIndex LDR Wrk3,BufferBase STRB Wrk1,[Wrk3,Wrk2] SUB Wrk2,Wrk2,#2 STRB Wrk2,[Wrk3,#1] MOV Wrk2,Wrk2,LSR #8 STRB Wrk2,[Wrk3,#0] B MainLoop COM B NotImplemented BEL BL GetMultipleOperands SWI OS_WriteI+7 B MainLoop INK BL GetMultipleOperands TEQ Opd0,#1 MOV Wrk1,#0 BNE PutWrkMain BL WriteLineBuffer STR Wrk1,LineIndex BL PrintStatusLine LDR Wrk1,ScrollTop STR Wrk1,LineNo SWI OS_ReadC B PutWrkMain MEQ BL GetMultipleOperands ADD Opd1,Opd1,CodeBase LDR Wrk2,sOpd2 TEQ Wrk2,#0 BEQ MEQ_NotFound MEQ_Loop LDRB Wrk1,[Opd1],#1 LDRB Wrk3,[Opd1],#1 ORR Wrk3,Wrk3,Wrk1,LSL #8 CMP Opd0,Wrk3 BEQ MEQ_Found SUBS Wrk2,Wrk2,#1 BNE MEQ_Loop MEQ_NotFound MOV Wrk1,#0 BL PutWrk B HandleFalse MEQ_Found SUB Wrk1,Opd1,CodeBase SUB Wrk1,Wrk1,#2 BL PutWrk B HandleTrue NEG BL GetMultipleOperands MVN Wrk1,Opd0 AND Wrk1,Wrk1,Bit16Mask B PutWrkMain CPC BL GetMultipleOperands B CallProcedure CPCL BL GetExtendedOperands B CallProcedure M27 M28 WDB M30 M31 B NotImplemented GetOneOperand TST OpCode,#00010000T LDRNEB Opd0,[IPC],#1 MOVNE OpdCnt,#1 MOVNE PC,R14 TstImmWord TST OpCode,#00100000T BEQ OneGetImmWord LDRB Wrk1,[IPC],#1 TEQ Wrk1,#0 BEQ OneFromStack CMP Wrk1,#16. BGE OneDataWord SUB Wrk1,Wrk1,#1 LDR Opd0,[RegBase,Wrk1,LSL #2] MOV OpdCnt,#1 MOV PC,R14 OneDataWord SBC Wrk1,Wrk1,#16. ADD Wrk2,DataBase,Wrk1,LSL #1 LDRB Wrk1,[Wrk2] LDRB Opd0,[Wrk2,#1] ORR Opd0,Opd0,Wrk1,LSL #8 MOV OpdCnt,#1 MOV PC,R14 OneFromStack LDR Opd0,[SP,#-4]! MOV OpdCnt,#1 MOV PC,R14 OneGetImmWord LDRB Wrk1,[IPC],#1 LDRB Opd0,[IPC],#1 ORR Opd0,Opd0,Wrk1,LSL #8 MOV OpdCnt,#1 MOV PC,R14 StackUnderflow SWI OS_WriteS .STRING "Stack underflow" SWI OS_NewLine B ReturnToCaller GetTwoOperands TST OpCode,#10000000T BNE GetMultipleOperands TST OpCode,#01000000T LDREQB Opd0,[IPC],#1 BEQ GetSecondOpd Two1NotImmByte LDRB Wrk1,[IPC],#1 TEQ Wrk1,#0 LDREQ Opd0,[SP,#-4]! BEQ GetSecondOpd Two1NotFromStack CMP Wrk1,#16. SUBLT Wrk1,Wrk1,#1 LDRLT Opd0,[RegBase,Wrk1,LSL #2] BLT GetSecondOpd Two1DataWord SUB Wrk1,Wrk1,#16. ADD Wrk2,DataBase,Wrk1,LSL #1 LDRB Wrk1,[Wrk2] LDRB Opd0,[Wrk2,#1] ORR Opd0,Opd0,Wrk1,LSL #8 GetSecondOpd TST OpCode,#00100000T LDREQB Opd1,[IPC],#1 BEQ GotTwoOperands Two2NotImmByte LDRB Wrk1,[IPC],#1 TEQ Wrk1,#0 LDREQ Opd1,[SP,#-4]! BEQ GotTwoOperands Two2NotFromStack CMP Wrk1,#16. SUBLT Wrk1,Wrk1,#1 LDRLT Opd1,[RegBase,Wrk1,LSL #2] BLT GotTwoOperands Two2DataWord SUB Wrk1,Wrk1,#16. ADD Wrk2,DataBase,Wrk1,LSL #1 LDRB Wrk1,[Wrk2] LDRB Opd1,[Wrk2,#1] ORR Opd1,Opd1,Wrk1,LSL #8 GotTwoOperands MOV OpdCnt,#2 MOV PC,R14 SpecialChTableAddress .WORD SpecialChTable WrtTxtReturn LDMEA SP!, {PC,MultiChType,SingleChType,PkdChCnt,PkdCh,ChType,PkdChWord,Tmp3} WriteText STMEA SP!, {R14,MultiChType,SingleChType,PkdChCnt,PkdCh,ChType,PkdChWord,Tmp3} MOV MultiChType,#0 MOV PkdChCnt,#0 MOV SingleChType,#0FF WrtTxtLoop BL GetPkdCh MOVS WrkCh,PkdCh BEQ WrtTxtPutBlank CMP WrkCh,#4 BLT WrtSpecialTxt CMP WrkCh,#6 BLT SetChType BL GetChType BNE WrtTxtNotSmallLetter ADD WrkCh,WrkCh,#"a"-6 WrtTxtPutCh BL SendChToStoryOutput B WrtTxtLoop WrtTxtNotSmallLetter TEQ ChType,#1 BNE WrtTxtNonAlpha ADD WrkCh,WrkCh,#"A"-6 B WrtTxtPutCh WrtTxtNonAlpha SUBS WrkCh,WrkCh,#6 BEQ WrtTxtLongCh LDR PkdCh,SpecialChTableAddress LDRB WrkCh,[PkdCh,WrkCh] B WrtTxtPutCh WrtTxtLongCh BL GetPkdCh MOV WrkCh,PkdCh,LSL #5 BL GetPkdCh ORR WrkCh,WrkCh,PkdCh B WrtTxtPutCh WrtTxtPutBlank MOV WrkCh,#" " B WrtTxtPutCh SetChType SUB WrkCh,WrkCh,#3 BL GetChType BNE SetMultiChType MOV SingleChType,WrkCh B WrtTxtLoop SetMultiChType MOV MultiChType,WrkCh CMP ChType,MultiChType BEQ WrtTxtLoop MOV MultiChType,#0 B WrtTxtLoop WrtSpecialTxt SUB WrkCh,WrkCh,#1 BL GetPkdCh MOV PkdCh,PkdCh,LSL #1 ADD PkdCh,PkdCh,WrkCh,LSL #6 STMEA SP!, {TxtIPC} LDR WrkCh,SpecialBase LDRB Tmp3,[WrkCh,PkdCh]! LDRB PkdCh,[WrkCh,#1] ORR PkdCh,PkdCh,Tmp3,LSL #8 ADD TxtIPC,CodeBase,PkdCh,LSL #1 BL WriteText LDMEA SP!, {TxtIPC} MOV SingleChType,#0FF B WrtTxtLoop GetChType TEQ SingleChType,#0FF BNE GetSingleChType MOV ChType,MultiChType MOV PC,R14 GetSingleChType MOV ChType,SingleChType MOV SingleChType,#0FF MOV PC,R14 GetPkdCh TEQ PkdChCnt,#0FF BEQ WrtTxtReturn TEQ PkdChCnt,#0 BNE PkdWordLoaded ADD PkdChCnt,PkdChCnt,#1 LDRB Tmp3,[TxtIPC],#1 LDRB PkdChWord,[TxtIPC],#1 ORR PkdChWord,PkdChWord,Tmp3,LSL #8 MOV PkdCh,PkdChWord,LSR #10. MaskPkd AND PkdCh,PkdCh,#00011111T MOV PC,R14 PkdWordLoaded TEQ PkdChCnt,#1 BNE GetLastPkd ADD PkdChCnt,PkdChCnt,#1 MOV PkdCh,PkdChWord,LSR #5 B MaskPkd GetLastPkd TST PkdChWord,#1000000000000000T MOVNE PkdChCnt,#0FF MOVEQ PkdChCnt,#0 AND PkdCh,PkdChWord,#00011111T MOV PC,R14 ChSave .BYTE 0 .ALIGN SendChToStoryOutput STMEA SP!, {R14,Wrk1,Wrk2,Wrk3,Tmp1,Tmp2} STR Wrk1,ChSave LDR Wrk1,BufferEnabled TEQ Wrk1,#0 BNE PutChInStoryBuffer LDR Wrk1,ScreenEnabled TEQ Wrk1,#0 LDR Wrk2,PrinterEnabled TEQEQ Wrk2,#0 LDMEQEA SP!, {PC,Wrk1,Wrk2,Wrk3,Tmp1,Tmp2} TestDirectEnabled LDR Wrk3,DirectEnabled TEQ Wrk3,#0 BEQ TestNewLine TEQ Wrk2,#0 LDRNE Wrk2,WritingInWindow TEQNE Wrk2,#1 SWINE OS_WriteI+2 TEQ Wrk1,#0 SWIEQ OS_WriteI+1 LDR R0,ChSave ; TEQ R0,#EOL SWI OS_WriteC ; SWIEQ OS_WriteI+10. SWI OS_WriteI+3 SendChReturn LDMEA SP!, {PC,Wrk1,Wrk2,Wrk3,Tmp1,Tmp2} ; TEQ R0,#EOL ; SWINE OS_WriteC ; BLEQ Scroll ;TestPrinterEnabled LDR Wrk2,PrinterEnabled ; TEQ Wrk2,#1 ; LDMNEEA SP!, {PC,Wrk1,Wrk2,Wrk3,Tmp1,Tmp2} ; LDR R0,ChSave ; TEQ R0,#EOL ; SWINE OS_WriteC ; BLEQ Scroll TestNewLine LDR Wrk1,ChSave TEQ Wrk1,#EOL ADREQ R14,SendChReturn BEQ NewLine PutChInLineBuffer CMP Wrk1,#" " BLT SendChReturn LDR Wrk2,LineIndex ADR Wrk3,LineBuffer STRB Wrk1,[Wrk3,Wrk2] LDR Wrk3,MaxLineIndex CMP Wrk2,Wrk3 BGT CutLine ADD Wrk2,Wrk2,#1 STR Wrk2,LineIndex LDMEA SP!, {PC,Wrk1,Wrk2,Wrk3,Tmp1,Tmp2} CutLine ADR Wrk3,LineBuffer LDR Wrk2,LineIndex STR Wrk2,LastIndex CutChkSpace LDRB Wrk1,[Wrk3,Wrk2] CMP Wrk1,#" " BEQ CutIt SUBS Wrk2,Wrk2,#1 BNE CutChkSpace LDR Wrk2,MaxLineIndex CutIt STR Wrk2,LineIndex BL NewLine ADR Wrk3,LineBuffer MOV Tmp1,#0 LDR Tmp2,LastIndex MoveRest ADD Wrk2,Wrk2,#1 CMP Wrk2,Tmp2 BLE CutMoveCh STR Tmp1,LineIndex LDMEA SP!, {PC,Wrk1,Wrk2,Wrk3,Tmp1,Tmp2} CutMoveCh LDRB Wrk1,[Wrk3,Wrk2] STRB Wrk1,[Wrk3,Tmp1] ADD Tmp1,Tmp1,#1 B MoveRest PutChInStoryBuffer LDR Wrk2,BufferIndex LDR Wrk3,BufferBase LDR Wrk1,ChSave STRB Wrk1,[Wrk3,Wrk2] ADD Wrk2,Wrk2,#1 STR Wrk2,BufferIndex LDMEA SP!, {PC,Wrk1,Wrk2,Wrk3,Tmp1,Tmp2} NewLine STMEA SP!, {R14,Wrk1,Wrk2} LDR Wrk1,ScreenEnabled TEQ Wrk1,#0 BEQ NewLineWriteLineBuffer LDR Wrk2,LineNo LDR Wrk1,WritingInWindow TEQ Wrk1,#0 ADDEQ Wrk2,Wrk2,#1 STREQ Wrk2,LineNo LDR Wrk1,ScrollBottom CMP Wrk2,Wrk1 BLE NewLineWriteLineBuffer LDR Wrk1,ScrollTop ADD Wrk1,Wrk1,#1 STR Wrk1,LineNo SWI OS_WriteS .STRING "[MORE]" SWI OS_ReadC SWI OS_WriteS .BLOCK 6,del .BYTE 0 .ALIGN NewLineWriteLineBuffer BL WriteLineBuffer LDR Wrk1,ScreenEnabled TEQ Wrk1,#0 BLNE Scroll LDR Wrk1,PrinterEnabled TEQ Wrk1,#0 LDREQB Wrk1,[CodeBase,#17.] ANDEQ Wrk1,Wrk1,#1 TEQEQ Wrk1,#0 SWINE OS_WriteI+2 SWINE OS_WriteI+21. SWINE OS_NewLine SWINE OS_WriteI+6 SWINE OS_WriteI+3 MOV Wrk1,#0 STR Wrk1,LineIndex NewLineReturn LDMEA SP!, {PC,Wrk1,Wrk2} WriteLineBuffer STMEA SP!, {R14,Wrk1,Wrk2,Wrk3} LDR Wrk2,LineIndex TEQ Wrk2,#0 LDMEQEA SP!, {PC,Wrk1,Wrk2,Wrk3} LDR Wrk1,WritingInWindow TEQ Wrk1,#0 BNE WLBWriteIt LDR Wrk1,PrinterEnabled TEQ Wrk1,#0 LDREQB Wrk1,[CodeBase,#17.] ANDEQ Wrk1,Wrk1,#1 TEQEQ Wrk1,#0 SWINE OS_WriteI+2 WLBWriteIt LDR Wrk1,ScreenEnabled TEQ Wrk1,#0 SWIEQ OS_WriteI+21. LDRNEB Wrk1,CursorX ADDNE Wrk1,Wrk1,Wrk2 STRNEB Wrk1,CursorX ADR Wrk3,LineBuffer WLBWriteChar LDRB Wrk1,[Wrk3],#1 SWI OS_WriteC SUBS Wrk2,Wrk2,#1 BNE WLBWriteChar SWI OS_WriteI+6 SWI OS_WriteI+3 SWI OS_WriteI+31. LDRB R0,CursorX SWI OS_WriteC LDRB R0,CursorY SWI OS_WriteC LDMEA SP!, {PC,Wrk1,Wrk2,Wrk3} PrintStatusLine LDRB Wrk1,[CodeBase,#0] CMP Wrk1,#4 MOVGE PC,R14 STMEA SP!, {R14,Tmp1,Tmp2} BL WriteLineBuffer LDRB R1,CursorX LDRB R2,CursorY ; MOV R0,#134. ; SWI OS_Byte LDR R3,WritingInWindow STMEA SP!, {R1,R2,R3} BL SetInverse SWI OS_WriteI+30. MOV Wrk1,#1 STR Wrk1,WritingInWindow MOV Wrk1,#" " LDR Wrk2,ScreenWidth ADR Wrk3,LineBuffer FillLineBuffer STRB Wrk1,[Wrk3],#1 SUBS Wrk2,Wrk2,#1 BNE FillLineBuffer MOV Wrk1,#1 STR Wrk1,LineIndex LDRB Wrk2,[DataBase,#0] LDRB Wrk1,[DataBase,#1] ORR Wrk1,Wrk1,Wrk2,LSL #8 BL WriteObjectName LDR Wrk1,ScreenWidth SUB Wrk1,Wrk1,#14. STR Wrk1,LineIndex LDRB Wrk1,[DataBase,#2] LDRB Tmp1,[DataBase,#3] ORR Tmp1,Tmp1,Wrk1,LSL #8 LDRB Wrk1,[DataBase,#4] LDRB Tmp2,[DataBase,#5] ORR Tmp2,Tmp2,Wrk1,LSL #8 LDRB Wrk3,[CodeBase,#1] TST Wrk3,#2 ADRNE Wrk2,TimeString ADREQ Wrk2,ScoreString WriteStatusString LDRB Wrk1,[Wrk2],#1 TEQ Wrk1,#0 BEQ ContinueStatus BL SendChToStoryOutput B WriteStatusString ContinueStatus TST Wrk3,#2 BNE WriteTime MOV R0,Tmp1 BL WriteInteger MOV Wrk1,#"/" BL SendChToStoryOutput MOV R0,Tmp2 BL WriteInteger B WriteStatusBuffer WriteTime CMP Tmp1,#12. SUBGT R0,Tmp1,#12. MOVLE R0,Tmp1 TEQ Tmp1,#0 MOVEQ R0,#12. BL WriteInteger MOV Wrk1,#":" BL SendChToStoryOutput CMP Tmp2,#10. MOVLT R0,#"0" BLLT SendChToStoryOutput MOV R0,Tmp2 BL WriteInteger CMP Tmp1,#12. MOVLT Wrk1,#"a" MOVGT Wrk1,#"p" BL SendChToStoryOutput MOV Wrk1,#"m" BL SendChToStoryOutput WriteStatusBuffer LDR Wrk1,ScreenWidth STR Wrk1,LineIndex BL WriteLineBuffer MOV Wrk1,#0 STR Wrk1,LineIndex BL SetNormal LDMEA SP!, {R1,R2,R3} STR R3,WritingInWindow SWI OS_WriteI+31. MOV R0,R1 SWI OS_WriteC MOV R0,R2 SWI OS_WriteC LDMEA SP!, {Tmp1,Tmp2,PC} ClearLines STMEA SP!, {R14,R0-R2} SWI OS_WriteI+28. SWI OS_WriteI+0 MOV R2,Wrk1 SUB R0,Wrk2,#1 SWI OS_WriteC LDR R0,ScreenWidth SUB R0,R0,#1 SWI OS_WriteC SUB R0,R2,#1 SWI OS_WriteC SWI OS_WriteI+12. BL SetWholeScreen LDMEA SP!, {PC,R0-R2} ScoreString .STRING "Score: " .ALIGN TimeString .STRING "Time: " .ALIGN LineBuffer .BLOCK 160.," " .ALIGN LastIndex .WORD 0 NotImplemented SWI OS_WriteS .STRING "Instruction not implemented: OpCode=&" MOV R0,OpCode ADR R1,HexStr MOV R2,#10. SWI OS_ConvertHex2 SWI OS_Write0 WriteIPC SWI OS_WriteS .STRING ", IPC=&" SUB R0,IPC,CodeBase ADR R1,HexStr MOV R2,#10. SWI OS_ConvertHex6 SWI OS_Write0 SWI OS_NewLine B ReturnToCaller HexStr .BLOCK 24.," " .ALIGN MissingOperand SWI OS_WriteS .STRING "Missing operand" B WriteIPC .IF Statistics OpStatTableAdrs .WORD 200000 CountStatistics LDR Opd0,OpStatTableAdrs LDR Opd1,[Opd0,OpCode,LSL #2] ADD Opd1,Opd1,#1 STR Opd1,[Opd0,OpCode,LSL #2] MOV PC,R14 .ENDC .IF Debug OSP .WORD 0 StackBaseAdrs .WORD StackBase DebugCode STR SP,OSP STMEA SP!, {R14,R0,R1,R2,R3,R4} SWI OS_WriteS .STRING "C " SUB R0,IPC,CodeBase SUB R0,R0,#1 ADR R1,HexStr MOV R2,#10. SWI OS_ConvertHex6 SWI OS_Write0 SWI OS_WriteS .STRING ": " MOV R0,OpCode ADR R1,HexStr MOV R2,#10. SWI OS_ConvertHex2 SWI OS_Write0 MOV R3,#0 SWI OS_WriteS .STRING " R:" .ALIGN DebugReg SWI OS_WriteI+" " LDR R0,[RegBase,R3,LSL #2] ADR R1,HexStr MOV R2,#10. SWI OS_ConvertHex4 SWI OS_Write0 ADD R3,R3,#1 CMP R3,#0F BLT DebugReg SWI OS_WriteS .STRING " S: " LDR R3,OSP LDR R2,StackBaseAdrs LDR R2,[R2] SUB R0,R3,R2 MOV R0,R0,LSR #2 ADR R1,HexStr MOV R2,#10. SWI OS_ConvertHex2 SWI OS_Write0 LDR R4,StackStart LDR R5,StackEnd DebugStack SWI OS_WriteI+" " LDR R0,[R3,R4] ADR R1,HexStr MOV R2,#10. SWI OS_ConvertHex4 SWI OS_Write0 SUB R4,R4,#4 CMP R4,R5 BGE DebugStack ; SWI OS_ReadC BL SetScrollWindow SWI OS_NewLine BL SetWholeScreen LDMEA SP!, {PC,R0,R1,R2,R3,R4} StackStart .WORD -4 StackEnd .WORD -24. .ENDC WTC BL GetMultipleOperands MOV Wrk1,Opd0 BL SendChToStoryOutput B MainLoop MVE BL GetOneOperand MOV Wrk2,Opd0 BL GetWrkChkFromTOS B PutWrkMain NEG1 BL GetOneOperand MVN Wrk1,Opd0 AND Wrk1,Wrk1,Bit16Mask B PutWrkMain RTT MOV Opd0,#1 B ReturnOpd0 RTF MOV Opd0,#0 B ReturnOpd0 WTX MOV TxtIPC,IPC BL WriteText MOV IPC,TxtIPC B MainLoop WTR MOV TxtIPC,IPC BL WriteText MOV IPC,TxtIPC BL NewLine B RTT NOP B MainLoop WTI BL GetMultipleOperands MOV R0,Opd0 BL WriteInteger B MainLoop cRND BL GetMultipleOperands TEQ Opd0,#0 BNE CalcRandom MOV Wrk1,#0 B PutWrkMain CalcRandom ADR R1,TimeBlock MOV R0,#3 STR R0,[R1,#0] MOV R0,#14. SWI OS_Word MOV Opd1,Opd0 TST Opd1,#1<<15. EORNE Opd1,Opd1,Bit16Mask ADDNE Opd1,Opd1,#1 LDR Opd0,[R1,#0] LDR R1,OldRandom ADD Opd0,Opd0,R1 AND Opd0,Opd0,Bit16Mask,LSR #1 BL Divide ADD Wrk1,Wrk1,#1 TST Opd1,#1<<15. EORNE Wrk1,Wrk1,Bit16Mask ADDNE Wrk1,Wrk1,#1 STR Wrk1,OldRandom B PutWrkMain OldRandom .WORD 0 TimeBlock .BYTE 0 .BYTE 0 .BYTE 0 .BYTE 0 .BYTE 0 .ALIGN PSH BL GetMultipleOperands STR Opd0,[SP],#4 B MainLoop PUL BL GetMultipleOperands LDR Wrk1,[SP,#-4]! MOV Wrk2,Opd0 B PutWrkChkToTOSMain JMP BL GetOneOperand MOV Wrk1,Opd0 B AddDistance WTO BL GetOneOperand MOV Wrk1,Opd0 BL WriteObjectName B MainLoop INC BL GetOneOperand MOV Wrk2,Opd0 BL GetWrkChkFromTOS ADD Wrk1,Wrk1,#1 AND Wrk1,Wrk1,Bit16Mask MOV Wrk2,Opd0 B PutWrkChkToTOSMain DEC BL GetOneOperand MOV Wrk2,Opd0 BL GetWrkChkFromTOS SUB Wrk1,Wrk1,#1 AND Wrk1,Wrk1,Bit16Mask MOV Wrk2,Opd0 B PutWrkChkToTOSMain WSB BL GetOneOperand ADD TxtIPC,CodeBase,Opd0 B WTXMain CFC1 BL GetOneOperand B CallFunction RMO BL GetOneOperand BL RemoveObj B MainLoop BPT SWI OS_WriteS .STRING "Breakpoint" B WriteIPC LES BL GetTwoOperands TST Opd0,#8000 ORRNE Opd0,Opd0,Bit16Mask,LSL #16. TST Opd1,#8000 ORRNE Opd1,Opd1,Bit16Mask,LSL #16. CMP Opd0,Opd1 BLT HandleTrue B HandleFalse GRT BL GetTwoOperands TST Opd0,#8000 ORRNE Opd0,Opd0,Bit16Mask,LSL #16. TST Opd1,#8000 ORRNE Opd1,Opd1,Bit16Mask,LSL #16. CMP Opd0,Opd1 BGT HandleTrue B HandleFalse DLS BL GetTwoOperands TST Opd0,#8000 ORRNE Opd0,Opd0,Bit16Mask,LSL #16. MOV Wrk2,Opd0 BL GetWrkChkFromTOS TST Wrk1,#8000 ORRNE Wrk1,Wrk1,Bit16Mask,LSL #16. SUB Wrk3,Wrk1,#1 AND Wrk1,Wrk3,Bit16Mask MOV Wrk2,Opd0 BL PutWrkChkToTOS CMP Wrk3,Opd1 BLT HandleTrue B HandleFalse IGT BL GetTwoOperands TST Opd0,#8000 ORRNE Opd0,Opd0,Bit16Mask,LSL #16. MOV Wrk2,Opd0 BL GetWrkChkFromTOS TST Wrk1,#8000 ORRNE Wrk1,Wrk1,Bit16Mask,LSL #16. ADD Wrk3,Wrk1,#1 AND Wrk1,Wrk3,Bit16Mask MOV Wrk2,Opd0 BL PutWrkChkToTOS CMP Wrk3,Opd1 BGT HandleTrue B HandleFalse OIN BL GetTwoOperands MOV Wrk1,Opd0 BL CalcObjAdrs LDRB Wrk2,[CodeBase,#0] CMP Wrk2,#4 BGE PlusOIN LDRB Wrk2,[Wrk1,#4] B OINCmpParent PlusOIN LDRB Wrk3,[Wrk1,#6] LDRB Wrk2,[Wrk1,#7] ORR Wrk2,Wrk2,Wrk3,LSL #8 OINCmpParent CMP Wrk2,Opd1 BNE HandleFalse BEQ HandleTrue SPS BL GetTwoOperands AND Wrk1,Opd0,Opd1 AND Wrk1,Wrk1,Bit16Mask CMP Wrk1,Opd1 BNE HandleFalse B HandleTrue LOR BL GetTwoOperands ORR Wrk1,Opd0,Opd1 AND Wrk1,Wrk1,Bit16Mask B PutWrkMain cAND BL GetTwoOperands AND Wrk1,Opd0,Opd1 AND Wrk1,Wrk1,Bit16Mask B PutWrkMain cADD BL GetTwoOperands ADD Wrk1,Opd0,Opd1 AND Wrk1,Wrk1,Bit16Mask B PutWrkMain cSUB BL GetTwoOperands SUB Wrk1,Opd0,Opd1 AND Wrk1,Wrk1,Bit16Mask B PutWrkMain cMUL BL GetTwoOperands MUL Wrk1,Opd0,Opd1 AND Wrk1,Wrk1,Bit16Mask B PutWrkMain cDIV BL GetTwoOperands BL Divide MOV Wrk1,Opd0 B PutWrkMain cMOD BL GetTwoOperands BL Divide B PutWrkMain Divide STMEA SP!, {Tmp1,R14} AND Opd1,Opd1,Bit16Mask TEQ Opd1,#0 BEQ DivideByZero TST Opd0,#1<<15. RSBNE Opd0,Opd0,#1<<16. MOVNE Wrk2,#1 MOVEQ Wrk2,#0 TST Opd1,#1<<15. RSBNE Opd1,Opd1,#1<<16. EORNE Wrk3,Wrk2,#1 EOREQ Wrk3,Wrk2,#0 MOV Opd0,Opd0,LSL #16. MOV Opd1,Opd1,LSL #16. MOV Wrk4,#16. MOV Wrk1,#0 \DivLoop ADDS Opd0,Opd0,Opd0 ADD Wrk1,Wrk1,Wrk1 ORRCS Wrk1,Wrk1,#1<<16. CMP Wrk1,Opd1 SUBHS Wrk1,Wrk1,Opd1 ADDHS Opd0,Opd0,#1 SUBS Wrk4,Wrk4,#1 BNE \DivLoop MOV Wrk1,Wrk1,LSR #16. TEQ Wrk3,#0 RSBNE Opd0,Opd0,#1<<16. TEQ Wrk2,#0 RSBNE Wrk1,Wrk1,#1<<16. AND Opd0,Opd0,Bit16Mask AND Wrk1,Wrk1,Bit16Mask LDMEA SP!, {Tmp1,PC} DivideByZero SWI OS_WriteS .STRING "Divide by zero" B WriteIPC TSF BL GetTwoOperands MOV Wrk1,Opd0 BL CalcObjAdrs MOV Wrk2,Opd1,LSR #4 ADD Wrk1,Wrk1,Wrk2,LSL #1 LDRB Wrk3,[Wrk1] LDRB Wrk2,[Wrk1,#1] ORR Wrk2,Wrk2,Wrk3,LSL #8 MOV Wrk3,#1000000000000000T AND Opd1,Opd1,#00001111T TST Wrk2,Wrk3,LSR Opd1 BNE HandleTrue BEQ HandleFalse SEF BL GetTwoOperands MOV Wrk1,Opd0 BL CalcObjAdrs MOV Wrk2,Opd1,LSR #4 ADD Wrk1,Wrk1,Wrk2,LSL #1 LDRB Wrk3,[Wrk1] LDRB Wrk2,[Wrk1,#1] ORR Wrk2,Wrk2,Wrk3,LSL #8 MOV Wrk3,#1000000000000000T AND Opd1,Opd1,#00001111T ORR Wrk2,Wrk2,Wrk3,LSR Opd1 STRB Wrk2,[Wrk1,#1] MOV Wrk2,Wrk2,LSR #8 STRB Wrk2,[Wrk1] B MainLoop CLF BL GetTwoOperands MOV Wrk1,Opd0 BL CalcObjAdrs MOV Wrk2,Opd1,LSR #4 ADD Wrk1,Wrk1,Wrk2,LSL #1 LDRB Wrk3,[Wrk1] LDRB Wrk2,[Wrk1,#1] ORR Wrk2,Wrk2,Wrk3,LSL #8 MOV Wrk3,#1000000000000000T AND Opd1,Opd1,#00001111T BIC Wrk2,Wrk2,Wrk3,LSR Opd1 STRB Wrk2,[Wrk1,#1] MOV Wrk2,Wrk2,LSR #8 STRB Wrk2,[Wrk1] B MainLoop SEW BL GetTwoOperands MOV Wrk1,Opd1 MOV Wrk2,Opd0 B PutWrkChkToTOSMain INS BL GetTwoOperands BL RemoveObj MOV Wrk1,Opd0 BL CalcObjAdrs LDRB Wrk2,[CodeBase,#0] CMP Wrk2,#4 BGE PlusINS STRB Opd1,[Wrk1,#4] MOV Wrk4,Wrk1 MOV Wrk1,Opd1 BL CalcObjAdrs LDRB Wrk3,[Wrk1,#6] STRB Opd0,[Wrk1,#6] STRB Wrk3,[Wrk4,#5] B MainLoop PlusINS STRB Opd1,[Wrk1,#7] MOV Wrk3,Opd1,LSR #8 STRB Wrk3,[Wrk1,#6] MOV Wrk4,Wrk1 MOV Wrk1,Opd1 BL CalcObjAdrs LDRB Wrk3,[Wrk1,#11.] STRB Opd0,[Wrk1,#11.] STRB Wrk3,[Wrk4,#9] LDRB Wrk3,[Wrk1,#10.] MOV Opd0,Opd0,LSR #8 STRB Opd0,[Wrk1,#10.] STRB Wrk3,[Wrk4,#8] B MainLoop LDW BL GetTwoOperands TST Opd1,#1000000000000000T ORRNE Opd1,Opd1,Bit16Mask,LSL #16. ADD Wrk1,Opd0,Opd1,LSL #1 LDRB Wrk2,[Wrk1,CodeBase]! LDRB Wrk1,[Wrk1,#1] ORR Wrk1,Wrk1,Wrk2,LSL #8 B PutWrkMain LDB BL GetTwoOperands ADD Wrk1,Opd0,Opd1 LDRB Wrk1,[Wrk1,CodeBase] B PutWrkMain CFC2 BL GetTwoOperands B CallFunction CPC2 BL GetTwoOperands CallProcedure MOV Wrk1,#1 B Call N1B B NotImplemented RTM B NotImplemented DataNotFound SWI OS_WriteS .STRING "Object property not found" B WriteIPC DataNotWordOrByte SWI OS_WriteS .STRING "Object property not word or byte" B WriteIPC WriteInteger STMEA SP!, {R14} ADR R1,WTI_Buffer MOV R2,#7 SWI OS_ConvertInteger2 MOV R2,R0 WTI_Digit LDRB R0,[R2],#1 BL SendChToStoryOutput CMP R2,R1 BNE WTI_Digit LDMEA SP!, {PC} WTI_Buffer .STRING " " .ALIGN JmpTable .WORD BPT, cEQU, LES, GRT, DLS, IGT, OIN, SPS .WORD LOR, cAND, TSF, SEF, CLF, SEW, INS, LDW .WORD LDB, LOD, LOA, cLNN, cADD, cSUB, cMUL, cDIV .WORD cMOD, CFC2, CPC2, N1B, RTM .WORD NotImplemented .WORD NotImplemented .WORD NotImplemented .WORD NotImplemented .WORD cEQU, LES, GRT, DLS, IGT, OIN, SPS, LOR .WORD cAND, TSF, SEF, CLF, SEW, INS, LDW, LDB .WORD LOD, LOA, cLNN, cADD, cSUB, cMUL, cDIV, cMOD .WORD CFC2, CPC2, N1B, RTM .WORD NotImplemented .WORD NotImplemented .WORD NotImplemented .WORD NotImplemented .WORD cEQU, LES, GRT, DLS, IGT, OIN, SPS, LOR .WORD cAND, TSF, SEF, CLF, SEW, INS, LDW, LDB .WORD LOD, LOA, cLNN, cADD, cSUB, cMUL, cDIV, cMOD .WORD CFC2, CPC2, N1B, RTM .WORD NotImplemented .WORD NotImplemented .WORD NotImplemented .WORD NotImplemented .WORD cEQU, LES, GRT, DLS, IGT, OIN, SPS, LOR .WORD cAND, TSF, SEF, CLF, SEW, INS, LDW, LDB .WORD LOD, LOA, cLNN, cADD, cSUB, cMUL, cDIV, cMOD .WORD CFC2, CPC2, N1B, RTM .WORD NotImplemented .WORD NotImplemented .WORD NotImplemented .WORD EQN, NXO, FSO, PTO, LOS, INC, DEC, WSB .WORD CFC1, RMO, WTO, RTN, JMP, WSW, MVE, NEG1 .WORD EQN, NXO, FSO, PTO, LOS, INC, DEC, WSB .WORD CFC1, RMO, WTO, RTN, JMP, WSW, MVE, NEG1 .WORD EQN, NXO, FSO, PTO, LOS, INC, DEC, WSB .WORD CFC1, RMO, WTO, RTN, JMP, WSW, MVE, NEG1 .WORD RTT, RTF, WTX, WTR, NOP, SVE, RSO, RST .WORD RPL, DSC, XIT, NWL, PSL, VFY, EXC .WORD NotImplemented .WORD NotImplemented .WORD cEQU, LES, GRT, DLS, IGT, OIN, SPS, LOR .WORD cAND, TSF, SEF, CLF, SEW, INS, LDW, LDB .WORD LOD, LOA, cLNN, cADD, cSUB, cMUL, cDIV, cMOD .WORD CFC2, CPC2, N1B, RTM .WORD NotImplemented .WORD NotImplemented .WORD NotImplemented .WORD CFC, STW, STB, SOD, INP, WTC, WTI, cRND .WORD PSH, PUL, SPL, cPOS, CFCL, ERS, cERL, GYX .WORD M16, SCM, FRM, OUT, COM, BEL, INK, MEQ .WORD NEG, CPC, CPCL, M27, M28, WDB, M30, M31 CopyrightText .BYTE 13,0E5,70,88,51,2A,00,8E,4F,2A,5E,0B7,2B,2A .BYTE 5C,00 .BYTE 11,14,57,0D7,39,8D,64,04,2E,0E6,4E,00,12,26 .BYTE 4D,06,63,2A,5C,05,24,0B1,16,25,0A0,84 .ALIGN CopyRight STMEA SP!,{R14} MOV R0,#0 LDR R1,BufferEnabledAdrs STR R0,[R1] LDR R1,PrinterEnabledAdrs STR R0,[R1] LDR R1,WritingInWindowAdrs STR R0,[R1] LDR R1,DirectEnabledAdrs STR R0,[R1] MOV R0,#1 LDR R1,ScreenEnabledAdrs STR R0,[R1] ADR TxtIPC,CopyrightText BL WriteText BL NewLine BL NewLine LDMEA SP!,{PC} ScreenEnabledAdrs .WORD ScreenEnabled BufferEnabledAdrs .WORD BufferEnabled PrinterEnabledAdrs .WORD PrinterEnabled DirectEnabledAdrs .WORD DirectEnabled WritingInWindowAdrs .WORD WritingInWindow ZIP_End .END