home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ARM Club 3
/
TheARMClub_PDCD3.iso
/
hensa
/
recreation
/
a209_1
/
s
/
zip
Wrap
Text File
|
1991-05-31
|
122KB
|
2,933 lines
.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 <story file>"
.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