home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / recreation / a209_1 / s / zip
Text File  |  1991-05-31  |  122KB  |  2,933 lines

  1.  
  2.                         .PAGESIZE 65.
  3.  
  4. ; constants
  5.  
  6. Absolute                .EQU    TRUE
  7. Debug                   .EQU    FALSE
  8. Statistics              .EQU    FALSE
  9.  
  10.                         .IF     Absolute
  11.                         .ABSOLUTE
  12.                         .ENDC
  13.  
  14. NewLineChar             .EQU    10.
  15. EOL                     .EQU    13.
  16. InterpType              .EQU    34.
  17. InterpVersion           .EQU    "A"
  18. bs                      .EQU    08
  19. esc                     .EQU    1B
  20. del                     .EQU    7F
  21. ht                      .EQU    09
  22. MaxMaxNumWords          .EQU    60.
  23. StackSize               .EQU    00800
  24. ZIP_Heap                .EQU    0B000
  25.  
  26.  
  27. ; register allocation:
  28.  
  29. Wrk1                    .EQU    R0
  30. Wrk2                    .EQU    R1
  31. Wrk3                    .EQU    R2
  32. OpCode                  .EQU    R3
  33. OpdCnt                  .EQU    R3
  34. Wrk4                    .EQU    R3
  35.  
  36. Opd0                    .EQU    R4
  37. Opd1                    .EQU    R5
  38. OpdBase                 .EQU    R6
  39. Tmp1                    .EQU    OpdBase
  40. CodeBase                .EQU    R7
  41. Tmp7                    .EQU    CodeBase
  42. RegBase                 .EQU    R8
  43. Tmp2                    .EQU    RegBase
  44. DataBase                .EQU    R9
  45. Tmp3                    .EQU    DataBase
  46. Bit16Mask               .EQU    R10
  47. Tmp4                    .EQU    Bit16Mask
  48. IPC                     .EQU    R11
  49. Tmp5                    .EQU    IPC
  50. PtrJmpTable             .EQU    R12
  51. Tmp6                    .EQU    PtrJmpTable
  52. SP                      .EQU    R13
  53.  
  54. MultiChType             .EQU    Tmp1
  55. SingleChType            .EQU    Tmp2
  56. PkdChCnt                .EQU    Wrk4
  57. TxtIPC                  .EQU    Wrk3
  58. PkdChWord               .EQU    Wrk2
  59. WrkCh                   .EQU    Wrk1
  60. PkdCh                   .EQU    Opd0
  61. ChType                  .EQU    Opd1
  62.  
  63. WordChCnt               .EQU    Wrk4
  64. InpLinePtr              .EQU    Opd0
  65. ParsedPtr               .EQU    Opd1
  66.  
  67. MaxNumWords             .EQU    Tmp1
  68. WordChPtr               .EQU    Tmp2
  69. NumWords                .EQU    Tmp3
  70. VocabPtr                .EQU    Tmp4
  71. NumVocabWords           .EQU    Tmp5
  72. EntryLength             .EQU    Tmp6
  73.  
  74.  
  75.                         .MACRO  ZIPFETCH
  76.                         LDRB    OpCode,[IPC],#1
  77.                         .IF     Statistics
  78.                         BL      CountStatistics
  79.                         .ENDC
  80.                         .IF     Debug
  81.                         BL      DebugCode
  82.                         .ENDC
  83.                         LDR     PC,[PtrJmpTable,OpCode,LSL #2]
  84.                         .ENDM
  85.  
  86.  
  87.                         .PROC   ZIP
  88.  
  89.                         .IF     Absolute
  90.                         B       Init
  91.                         .ELSE
  92.                         .ENTRY  Init
  93.                         .ENDC
  94.  
  95. XIT                     SWI     OS_NewLine
  96.                         SWI     OS_WriteS
  97.                         .STRING "   *** End of session ***"
  98.                         SWI     OS_NewLine
  99.  
  100. ReturnToCaller          LDR     R0,CursorAddress
  101.                         LDRB    R1,[R0,#0]
  102.                         LDRB    R2,[R0,#1]
  103. ;                       MOV     R0,#165.
  104. ;                       SWI     OS_Byte
  105. ;                       SWI     OS_WriteI+26.
  106. ;                       SWI     OS_WriteI+31.
  107. ;                       MOV     R0,R1
  108. ;                       SWI     OS_WriteC
  109. ;                       MOV     R0,R2
  110. ;                       SWI     OS_WriteC
  111.                         SWI     OS_Exit
  112.  
  113. ;TextColour             .BYTE   0
  114. ;                       .BYTE   16.
  115. ;                       .BYTE   0
  116. ;                       .BYTE   0
  117. ;                       .BYTE   0
  118. ;                       .ALIGN
  119. ;
  120. ;BackgroundColour       .BYTE   1
  121. ;                       .BYTE   16.
  122. ;                       .BYTE   240.
  123. ;                       .BYTE   240.
  124. ;                       .BYTE   240.
  125. ;                       .ALIGN
  126. ;
  127. ;BorderColour           .BYTE   0
  128. ;                       .BYTE   24.
  129. ;                       .BYTE   0
  130. ;                       .BYTE   0
  131. ;                       .BYTE   0
  132. ;
  133. ;SetColours             MOV     R0,#12.
  134. ;                       ADR     R1,TextColour
  135. ;                       SWI     OS_Word
  136. ;                       ADR     R1,BackgroundColour
  137. ;                       SWI     OS_Word
  138. ;                       ADR     R1,BorderColour
  139. ;                       SWI     OS_Word
  140. ;                       MOV     PC,R14
  141.  
  142. ClearToEndOfLine        SWI     OS_WriteI+23.
  143.                         SWI     OS_WriteI+8
  144.                         SWI     OS_WriteI+5
  145.                         SWI     OS_WriteI+6
  146.                         SWI     OS_WriteI+0
  147.                         SWI     OS_WriteI+0
  148.                         SWI     OS_WriteI+0
  149.                         SWI     OS_WriteI+0
  150.                         SWI     OS_WriteI+0
  151.                         SWI     OS_WriteI+0
  152.                         MOV     PC,R14
  153.  
  154. ScrollWindow            SWI     OS_WriteI+23.
  155.                         SWI     OS_WriteI+7
  156.                         SWI     OS_WriteI+0
  157.                         SWI     OS_WriteI+7
  158.                         SWI     OS_WriteI+0
  159.                         SWI     OS_WriteI+0
  160.                         SWI     OS_WriteI+0
  161.                         SWI     OS_WriteI+0
  162.                         SWI     OS_WriteI+0
  163.                         SWI     OS_WriteI+0
  164.                         MOV     PC,R14
  165.  
  166. SetNoAutoCrLf           SWI     OS_WriteI+23.
  167.                         SWI     OS_WriteI+16.
  168.                         SWI     OS_WriteI+00000001T
  169.                         SWI     OS_WriteI+00000000T
  170.                         SWI     OS_WriteI+0
  171.                         SWI     OS_WriteI+0
  172.                         SWI     OS_WriteI+0
  173.                         SWI     OS_WriteI+0
  174.                         SWI     OS_WriteI+0
  175.                         SWI     OS_WriteI+0
  176.                         MOV     PC,R14
  177.  
  178. SetInverse              SWI     OS_WriteI+17.
  179.                         LDR     R0,BackgroundColour
  180.                         SWI     OS_WriteC
  181.                         SWI     OS_WriteI+17.
  182.                         LDR     R0,ForegroundColour
  183.                         ADD     R0,R0,#128.
  184.                         SWI     OS_WriteC
  185.                         MOV     PC,R14
  186.  
  187. SetNormal               SWI     OS_WriteI+17.
  188.                         LDR     R0,ForegroundColour
  189.                         SWI     OS_WriteC
  190.                         SWI     OS_WriteI+17.
  191.                         LDR     R0,BackgroundColour
  192.                         ADD     R0,R0,#128.
  193.                         SWI     OS_WriteC
  194.                         MOV     PC,R14
  195.  
  196. SetBold                 MOV     PC,R14
  197.  
  198. MaskLow16               .WORD   0000FFFF
  199. CommandLineAdrs         .WORD   0
  200. HeapBase                .WORD   ZIP_Heap
  201. FileName                .BLOCK  256.," "
  202. ;                       .ALIGN
  203.  
  204. ForegroundColour        .WORD   0
  205. BackgroundColour        .WORD   0
  206. ReadColours             .WORD   155.
  207.                         .WORD   156.
  208.                         .WORD   -1
  209.  
  210. SetWholeScreen          SWI     OS_WriteI+28.
  211.                         SWI     OS_WriteI+0
  212.                         LDR     R0,ScreenHeight
  213.                         SUB     R0,R0,#1
  214.                         SWI     OS_WriteC
  215.                         LDR     R0,ScreenWidth
  216.                         SUB     R0,R0,#1
  217.                         SWI     OS_WriteC
  218.                         SWI     OS_WriteI+0
  219.                         MOV     PC,R14
  220.  
  221. SetScrollWindow         SWI     OS_WriteI+28.
  222.                         SWI     OS_WriteI+0
  223.                         LDR     R0,ScrollBottom
  224.                         SUB     R0,R0,#1
  225.                         SWI     OS_WriteC
  226.                         LDR     R0,ScreenWidth
  227.                         SUB     R0,R0,#1
  228.                         SWI     OS_WriteC
  229.                         LDR     R0,ScrollTop
  230.                         SUB     R0,R0,#1
  231.                         SWI     OS_WriteC
  232.                         MOV     PC,R14
  233.  
  234. CursorAddress           .WORD   CursorX
  235.  
  236. Scroll                  STMEA   SP!, {R14,R0,R1,R2}
  237.                         LDR     R1,CursorAddress
  238.                         LDRB    R2,[R1,#1]
  239. ;                       MOV     R0,#134.
  240. ;                       SWI     OS_Byte
  241.                         LDR     R0,ScrollBottom
  242.                         SUB     R0,R0,#1
  243.                         CMP     R2,R0
  244.                         BLT     \MoveDown
  245.                         BL      SetScrollWindow
  246.                         BL      ScrollWindow
  247.                         BL      SetWholeScreen
  248.                         SWI     OS_WriteI+31.
  249.                         SWI     OS_WriteI+0
  250.                         LDR     R0,ScrollBottom
  251.                         SUB     R0,R0,#1
  252.                         STRB    R0,[R1,#1]
  253.                         SWI     OS_WriteC
  254.                         MOV     R0,#0
  255.                         STRB    R0,[R1,#0]
  256.                         BL      ClearToEndOfLine
  257.                         LDMEA   SP!, {PC,R0,R1,R2}
  258. \MoveDown               SWI     OS_WriteI+31.
  259.                         SWI     OS_WriteI+0
  260.                         ADD     R0,R2,#1
  261.                         STRB    R0,[R1,#1]
  262.                         SWI     OS_WriteC
  263.                         MOV     R0,#0
  264.                         STRB    R0,[R1,#0]
  265.                         LDMEA   SP!, {PC,R0,R1,R2}
  266.  
  267. Init                    MOV     R0,#135.              ; read screen mode
  268.                         SWI     OS_Byte
  269.                         MOV     R0,#160.
  270.                         MOV     R1,#9
  271.                         SWI     OS_Byte
  272. ;                       MOV     R1,#24.
  273. ;                       MOV     R2,#76.
  274.                         ADD     R1,R1,#1
  275.                         STR     R1,ScreenHeight
  276.                         STR     R1,ScrollBottom
  277.                         STR     R2,MaxLineIndex
  278.                         ADD     R2,R2,#1
  279.                         STR     R2,ScreenWidth
  280.                         ADR     R0,ReadColours
  281.                         ADR     R1,ForegroundColour
  282.                         SWI     OS_ReadVduVariables
  283.                         BL      SetNormal
  284.                         BL      SetNoAutoCrLf
  285.                         SWI     OS_GetEnv
  286.                         STR     R0,CommandLineAdrs
  287.                         LDR     R2,HeapBase
  288.                         SUB     R3,R1,R2
  289.                         MOV     R1,R2
  290.                         MOV     R0,#0
  291.                         SWI     OS_Heap
  292.                         LDR     R1,HeapBase
  293.                         MOV     R3,#256.
  294.                         MOV     R0,#2
  295.                         SWI     OS_Heap
  296.                         MOV     CodeBase,R2
  297.                         LDR     R0,CommandLineAdrs
  298.                         ADR     R1,FileName
  299.                         MOV     R2,#1<<29.
  300.                         ADD     R2,R2,#255.
  301.                         SWI     OS_GSTrans
  302.                         LDRB    R3,[R0,#-1]
  303.                         TEQ     R3,#0
  304.                         MOVNE   R2,#1<<29.
  305.                         ADDNE   R2,R2,#20.
  306.                         SWINE   OS_GSTrans
  307.                         TEQNE   R2,#0
  308.                         ADREQ   R0,NoNameError
  309.                         SWIEQ   OS_Write0
  310.                         SWIEQ   OS_Exit
  311. FindStoryFile           MOV     R0,#64.+1100T
  312.                         SWI     XOS_Find
  313.                         BVC     LoadStoryFile
  314.                         SWI     OS_WriteI+12.
  315.                         SWI     OS_WriteI+31.
  316.                         LDR     R0,ScreenWidth
  317.                         SUB     R0,R0,#66.
  318.                         MOV     R0,R0,LSR #1
  319.                         SWI     OS_WriteC
  320.                         LDR     R0,ScreenHeight
  321.                         MOV     R0,R0,LSR #1
  322.                         SWI     OS_WriteC
  323.                         MOV     R0,R1
  324.                         SWI     OS_WriteS
  325.                         .ASCII  "Please insert disk with story file, "
  326.                         .STRING "then type any key to continue."
  327.                         .ALIGN
  328. WaitForKey              SWI     OS_ReadC
  329.                         SWI     OS_WriteI+12.
  330.                         BCC     FindStoryFile
  331.                         MOV     R0,#7C
  332.                         SWI     OS_Byte
  333.                         B       ReturnToCaller
  334. NoNameError             .ASCII  "usage: zip <story file>"
  335.                         .BYTE   0A,0D,00
  336.                         .ALIGN
  337. ZIP_End_Adrs            .WORD   ZIP_End
  338. LoadStoryFile           STR     R0,StoryFileHandle
  339.                         SWI     OS_WriteI+12.
  340.                         LDR     SP,ZIP_End_Adrs
  341.                         BL      CopyRight
  342.                         LDR     R1,StoryFileHandle
  343.                         MOV     R2,CodeBase
  344.                         MOV     R3,#256.
  345.                         MOV     R4,#0
  346.                         MOV     R0,#3
  347.                         SWI     OS_GBPB
  348.                         LDRB    R4,[CodeBase,#0]
  349.                         CMP     R4,#4
  350.                         MOVLT   R4,#1
  351.                         MOVGE   R4,#2
  352.                         STR     R4,AddressShift
  353.                         LDRB    R2,[CodeBase,#26.]
  354.                         LDRB    R3,[CodeBase,#27.]
  355.                         ORR     R3,R3,R2,LSL #8
  356.                         MOV     R3,R3,LSL R4
  357.                         MOV     R4,R3
  358.                         SUB     R3,R3,#256.
  359.                         LDR     R1,HeapBase
  360.                         MOV     R2,CodeBase
  361.                         MOV     R0,#4
  362.                         SWI     OS_Heap
  363.                         MOV     CodeBase,R2
  364.                         LDR     R1,StoryFileHandle
  365.                         MOV     R3,R4
  366.                         MOV     R4,#0
  367.                         MOV     R0,#3
  368.                         SWI     OS_GBPB
  369.                         LDR     R1,HeapBase
  370.                         MOV     R3,#StackSize
  371.                         MOV     R0,#2
  372.                         SWI     OS_Heap
  373.                         STR     R2,StackBase
  374.                         LDR     OpdBase,OpdAddress
  375.                         ADR     RegBase,Registers
  376.                         LDRB    Wrk1,[CodeBase,#8]
  377.                         LDRB    Wrk2,[CodeBase,#9]
  378.                         ORR     Wrk2,Wrk2,Wrk1,LSL #8
  379.                         ADD     Wrk2,Wrk2,CodeBase
  380.                         STR     Wrk2,VocabBase
  381.                         LDRB    Wrk1,[CodeBase,#10.]
  382.                         LDRB    Wrk2,[CodeBase,#11.]
  383.                         ORR     Wrk2,Wrk2,Wrk1,LSL #8
  384.                         ADD     Wrk2,Wrk2,CodeBase
  385.                         STR     Wrk2,ObjBase
  386.                         LDRB    Wrk1,[CodeBase,#12.]
  387.                         LDRB    DataBase,[CodeBase,#13.]
  388.                         ORR     DataBase,DataBase,Wrk1,LSL #8
  389.                         ADD     DataBase,DataBase,CodeBase
  390.                         LDRB    Wrk1,[CodeBase,#24.]
  391.                         LDRB    Wrk2,[CodeBase,#25.]
  392.                         ORR     Wrk2,Wrk2,Wrk1,LSL #8
  393.                         ADD     Wrk2,Wrk2,CodeBase
  394.                         STR     Wrk2,SpecialBase
  395.                         LDR     PtrJmpTable,TableAddress
  396. Restart                 LDR     Bit16Mask,MaskLow16
  397.                         BL      SetWholeScreen
  398.                         LDR     SP,StackBase
  399.                         MOV     Wrk1,#3
  400.                         STR     Wrk1,LineNo
  401.                         SWI     OS_WriteI+4
  402.                         SWI     OS_WriteI+31.
  403.                         SWI     OS_WriteI+0
  404.                         LDR     R0,ScrollBottom
  405.                         SUB     R0,R0,#1
  406.                         STRB    R0,CursorY
  407.                         SWI     OS_WriteC
  408.                         MOV     R0,#0
  409.                         STRB    R0,CursorX
  410.                         LDR     R0,ScreenWidth
  411.                         LDR     R1,ScreenHeight
  412.                         BL      CopyRight
  413.                         MOV     Wrk1,#0
  414.                         STR     SP,MP
  415.                         STR     Wrk1,PrinterEnabled
  416.                         STR     Wrk1,BufferEnabled
  417.                         STR     Wrk1,WindowEnabled
  418.                         STR     Wrk1,WritingInWindow
  419.                         STR     Wrk1,DirectEnabled
  420.                         MOV     Wrk1,#1
  421.                         STR     Wrk1,ScreenEnabled
  422.                         LDRB    Wrk1,[CodeBase,#6]
  423.                         LDRB    IPC,[CodeBase,#7]
  424.                         ORR     IPC,IPC,Wrk1,LSL #8
  425.                         ADD     IPC,IPC,CodeBase
  426.                         LDR     Wrk1,ScreenHeight
  427.                         STRB    Wrk1,[CodeBase,#32.]
  428.                         LDR     Wrk1,ScreenWidth
  429.                         STRB    Wrk1,[CodeBase,#33.]
  430.                         MOV     Wrk1,#InterpType
  431.                         STRB    Wrk1,[CodeBase,#30.]
  432.                         MOV     Wrk1,#InterpVersion
  433.                         STRB    Wrk1,[CodeBase,#31.]
  434.                         LDRB    Wrk1,[CodeBase,#1]
  435.                         ORR     Wrk1,Wrk1,#00110000T
  436.                         STRB    Wrk1,[CodeBase,#1]
  437.                         LDRB    Wrk1,[CodeBase,#0]
  438.                         CMP     Wrk1,#4
  439.                         MOVLT   Wrk1,#2
  440.                         MOVGE   Wrk1,#1
  441.                         STR     Wrk1,ScrollTop
  442.                         MOVLT   Wrk1,#6
  443.                         MOVGE   Wrk1,#9
  444.                         STR     Wrk1,VcbWordLength
  445.                         MOVLT   Wrk1,#9
  446.                         MOVGE   Wrk1,#14.
  447.                         STR     Wrk1,ObjRecSize
  448.                         MOVLT   Wrk1,#53.
  449.                         MOVGE   Wrk1,#112.
  450.                         STR     Wrk1,ObjOffset
  451.                         MOVLT   Wrk1,#7
  452.                         MOVGE   Wrk1,#12.
  453.                         STR     Wrk1,DataPtrOffset
  454.                         MOVLT   Wrk1,#31.
  455.                         MOVGE   Wrk1,#63.
  456.                         STR     Wrk1,DataNoMask
  457.                         B       MainLoop
  458.  
  459. MP                      .WORD   0
  460. NP                      .WORD   0
  461.  
  462. GetWrkChkFromTOS        TEQ     Wrk2,#0
  463.                         BNE     GetWrkNonStack
  464.                         LDR     Wrk1,[SP,#-4]
  465.                         MOV     PC,R14
  466.  
  467. GetWrk                  LDRB    Wrk2,[IPC],#1
  468.                         TEQ     Wrk2,#0
  469.                         BEQ     PullWrk
  470.  
  471. GetWrkNonStack          CMP     Wrk2,#16.
  472.                         BGE     GetDataWord
  473.                         SUB     Wrk2,Wrk2,#1
  474.                         LDR     Wrk1,[RegBase,Wrk2,LSL #2]
  475.                         MOV     PC,R14
  476.  
  477. GetDataWord             SUB     Wrk2,Wrk2,#16.
  478.                         ADD     Wrk2,DataBase,Wrk2,LSL #1
  479.                         LDRB    Wrk3,[Wrk2]
  480.                         LDRB    Wrk1,[Wrk2,#1]
  481.                         ORR     Wrk1,Wrk1,Wrk3,LSL #8
  482.                         MOV     PC,R14
  483.  
  484. PullWrkMain             ADR     R14,MainLoop
  485. PullWrk                 LDR     Wrk1,[SP,#-4]!
  486.                         MOV     PC,R14
  487.  
  488. PushWrk                 STR     Wrk1,[SP],#4
  489.                         MOV     PC,R14
  490.  
  491. PutWrkChkToTOSMain      ADR     R14,MainLoop
  492. PutWrkChkToTOS          TEQ     Wrk2,#0
  493.                         BNE     PutWrkNonStack
  494.                         STR     Wrk1,[SP,#-4]
  495.                         MOV     PC,R14
  496.  
  497. PutZeroMain             MOV     Wrk1,#0
  498. PutWrkMain              ADR     R14,MainLoop
  499. PutWrk                  LDRB    Wrk2,[IPC],#1
  500. PutWrkWrk2              TEQ     Wrk2,#0
  501.                         BEQ     PushWrk
  502.  
  503. PutWrkNonStack          CMP     Wrk2,#16.
  504.                         BGE     PutDataWord
  505.                         SUB     Wrk2,Wrk2,#1
  506.                         STR     Wrk1,[RegBase,Wrk2,LSL #2]
  507.                         MOV     PC,R14
  508.  
  509. PutDataWord             SUB     Wrk2,Wrk2,#16.
  510.                         ADD     Wrk2,DataBase,Wrk2,LSL #1
  511.                         STRB    Wrk1,[Wrk2,#1]
  512.                         MOV     Wrk1,Wrk1,LSR #8
  513.                         STRB    Wrk1,[Wrk2]
  514.                         MOV     PC,R14
  515.  
  516. NWL                     ADR     R14,MainLoop
  517.                         B       NewLine
  518.   
  519. WTXMain                 ADR     R14,MainLoop
  520.                         B       WriteText
  521.  
  522. MainLoop                ZIPFETCH
  523.  
  524. cEQU                    BL      GetTwoOperands
  525.                         SUBS    OpdCnt,OpdCnt,#1
  526.                         BLE     MissingOperand
  527.                         CMP     Opd0,Opd1
  528.                         BEQ     HandleTrue
  529.                         SUBS    OpdCnt,OpdCnt,#1
  530.                         BEQ     HandleFalse
  531.                         LDR     Opd1,sOpd2
  532.                         CMP     Opd0,Opd1
  533.                         BEQ     HandleTrue
  534.                         SUBS    OpdCnt,OpdCnt,#1
  535.                         BEQ     HandleFalse
  536.                         LDR     Opd1,sOpd3
  537.                         CMP     Opd0,Opd1
  538.                         BNE     HandleFalse
  539.                         B       HandleTrue
  540.  
  541. CalcObjAdrs             LDR     Wrk2,ObjRecSize
  542.                         LDR     Wrk3,ObjOffset
  543.                         MLA     Wrk1,Wrk2,Wrk1,Wrk3
  544.                         LDR     Wrk2,ObjBase
  545.                         ADD     Wrk1,Wrk1,Wrk2
  546.                         MOV     PC,R14
  547.  
  548. GetObjDataPtr           STR     R14,Link
  549.                         MOV     Wrk1,Opd0
  550.                         BL      CalcObjAdrs
  551.                         LDR     Wrk2,DataPtrOffset
  552.                         LDRB    Wrk2,[Wrk1,Wrk2]!
  553.                         LDRB    Wrk1,[Wrk1,#1]
  554.                         ORR     Wrk1,Wrk1,Wrk2,LSL #8
  555.                         ADD     Wrk1,Wrk1,CodeBase
  556.                         LDRB    Wrk2,[Wrk1],#1
  557.                         ADD     Wrk1,Wrk1,Wrk2,LSL #1
  558.                         LDR     R14,Link
  559.                         MOV     PC,R14
  560.  
  561. Link                    .WORD   0
  562.  
  563. Registers               .WORD   0
  564.                         .WORD   0
  565.                         .WORD   0
  566.                         .WORD   0
  567.                         .WORD   0
  568.                         .WORD   0
  569.                         .WORD   0
  570.                         .WORD   0
  571.                         .WORD   0
  572.                         .WORD   0
  573.                         .WORD   0
  574.                         .WORD   0
  575.                         .WORD   0
  576.                         .WORD   0
  577.                         .WORD   0
  578.  
  579. LOD                     BL      GetTwoOperands
  580.                         MOV     Wrk1,#1
  581.                         STR     Wrk1,FetchNext
  582.                         BL      GetObjDataPtr
  583.                         LDR     Opd0,DataNoMask
  584. LODFindData             LDRB    Wrk2,[Wrk1]
  585.                         AND     Wrk2,Wrk2,Opd0
  586.                         CMP     Wrk2,Opd1
  587.                         BEQ     LODGetData
  588.                         BLT     LODGlobalData
  589.                         BL      GetDataSize
  590.                         ADD     Wrk1,Wrk1,Wrk2
  591.                         B       LODFindData
  592. LODGetData              BL      GetDataSize
  593.                         TEQ     Wrk2,#1
  594.                         BEQ     LODLoadByte
  595.                         TEQ     Wrk2,#2
  596.                         BNE     DataNotWordOrByte
  597.                         LDRB    Wrk2,[Wrk1],#1
  598.                         LDRB    Wrk1,[Wrk1]
  599.                         ORR     Wrk1,Wrk1,Wrk2,LSL #8
  600.                         B       PutWrkMain
  601. LODLoadByte             LDRB    Wrk1,[Wrk1]
  602.                         B       PutWrkMain
  603. LODGlobalData           LDR     Wrk1,ObjBase
  604.                         SUB     Opd1,Opd1,#1
  605.                         LDRB    Wrk2,[Wrk1,Opd1,LSL #1]!
  606.                         LDRB    Wrk1,[Wrk1,#1]
  607.                         ORR     Wrk1,Wrk1,Wrk2,LSL #8
  608.                         B       PutWrkMain
  609.  
  610. LOA                     BL      GetTwoOperands
  611.                         MOV     Wrk1,#1
  612.                         STR     Wrk1,FetchNext
  613.                         BL      GetObjDataPtr
  614.                         LDR     Opd0,DataNoMask
  615. LOAFindData             LDRB    Wrk2,[Wrk1]
  616.                         AND     Wrk2,Wrk2,Opd0
  617.                         CMP     Wrk2,Opd1
  618.                         BEQ     LOAPutAddress
  619.                         BLT     PutZeroMain
  620.                         BL      GetDataSize
  621.                         ADD     Wrk1,Wrk1,Wrk2
  622.                         B       LOAFindData
  623. LOAPutAddress           BL      GetDataSize
  624.                         SUB     Wrk1,Wrk1,CodeBase
  625.                         B       PutWrkMain
  626.  
  627. cLNN                    BL      GetTwoOperands
  628.                         MOV     Wrk1,#1
  629.                         STR     Wrk1,FetchNext
  630.                         BL      GetObjDataPtr
  631.                         LDR     Opd0,DataNoMask
  632.                         TEQ     Opd1,#0
  633.                         BNE     cLNNFindData
  634.                         LDRB    Wrk1,[Wrk1]
  635.                         AND     Wrk1,Wrk1,Opd0
  636.                         B       PutWrkMain
  637. cLNNFindData            LDRB    Wrk2,[Wrk1]
  638.                         AND     Wrk2,Wrk2,Opd0
  639.                         CMP     Wrk2,Opd1
  640.                         BEQ     cLNNPutNextNo
  641.                         BLT     PutZeroMain
  642.                         BL      GetDataSize
  643.                         ADD     Wrk1,Wrk1,Wrk2
  644.                         B       cLNNFindData
  645. cLNNPutNextNo           BL      GetDataSize
  646.                         ADD     Wrk1,Wrk1,Wrk2
  647.                         LDRB    Wrk1,[Wrk1]
  648.                         AND     Wrk1,Wrk1,Opd0
  649.                         B       PutWrkMain
  650.  
  651. EQN                     BL      GetOneOperand
  652.                         TEQ     Opd0,#0
  653.                         BEQ     HandleTrue
  654.  
  655. HandleFalse             LDRB    Wrk1,[IPC],#1
  656.                         TST     Wrk1,#10000000T
  657.                         BEQ     DoJump
  658. DiscardDistance         TST     Wrk1,#01000000T
  659.                         LDREQB  Wrk1,[IPC],#1
  660.                         ZIPFETCH
  661.  
  662. HandleTrue              LDRB    Wrk1,[IPC],#1
  663.                         TST     Wrk1,#10000000T
  664.                         BEQ     DiscardDistance
  665. DoJump                  TST     Wrk1,#01000000T
  666.                         AND     Wrk1,Wrk1,#00111111T
  667.                         BEQ     HandleLongJump
  668. ChkDistance             TEQ     Wrk1,#0
  669.                         BEQ     RTF
  670.                         TEQ     Wrk1,#1
  671.                         BEQ     RTT
  672.                         SUB     Wrk1,Wrk1,#2
  673.                         ADD     IPC,IPC,Wrk1
  674.                         ZIPFETCH
  675.  
  676. HandleLongJump          TST     Wrk1,#00100000T
  677.                         ORRNE   Wrk1,Wrk1,#11000000T
  678.                         LDRB    Wrk3,[IPC],#1
  679.                         ORR     Wrk1,Wrk3,Wrk1,LSL #8
  680. AddDistance             SUB     Wrk1,Wrk1,#2
  681.                         TST     Wrk1,#1000000000000000T
  682.                         ORRNE   Wrk1,Wrk1,#000FF0000
  683.                         ORRNE   Wrk1,Wrk1,#0FF000000
  684.                         LDR     Wrk3,AddressShift
  685.                         MOV     Wrk4,Wrk1,LSL Wrk3
  686.                         AND     Wrk4,Wrk4,#00FF0000
  687.                         BIC     Wrk1,Wrk1,#00FF0000
  688.                         ORR     Wrk1,Wrk1,Wrk4
  689.                         ADD     IPC,IPC,Wrk1
  690.                         ZIPFETCH
  691.  
  692. NXO                     BL      GetOneOperand
  693.                         MOV     Wrk1,Opd0
  694.                         BL      CalcObjAdrs
  695.                         LDRB    Wrk2,[CodeBase,#0]
  696.                         CMP     Wrk2,#4
  697.                         BGE     PlusNXO
  698.                         LDRB    Wrk1,[Wrk1,#5]
  699.                         B       PutNXO
  700. PlusNXO                 LDRB    Wrk2,[Wrk1,#8]
  701.                         LDRB    Wrk1,[Wrk1,#9]
  702.                         ORR     Wrk1,Wrk1,Wrk2,LSL #8
  703. PutNXO                  TEQ     Wrk1,#0
  704.                         ADREQ   R14,HandleFalse
  705.                         ADRNE   R14,HandleTrue
  706.                         B       PutWrk
  707.  
  708. FSO                     BL      GetOneOperand
  709.                         MOV     Wrk1,Opd0
  710.                         BL      CalcObjAdrs
  711.                         LDRB    Wrk2,[CodeBase,#0]
  712.                         CMP     Wrk2,#4
  713.                         BGE     PlusFSO
  714.                         LDRB    Wrk1,[Wrk1,#6]
  715.                         B       PutFSO
  716. PlusFSO                 LDRB    Wrk2,[Wrk1,#10.]
  717.                         LDRB    Wrk1,[Wrk1,#11.]
  718.                         ORR     Wrk1,Wrk1,Wrk2,LSL #8
  719. PutFSO                  TEQ     Wrk1,#0
  720.                         ADREQ   R14,HandleFalse
  721.                         ADRNE   R14,HandleTrue
  722.                         B       PutWrk
  723.  
  724. PTO                     BL      GetOneOperand
  725.                         MOV     Wrk1,Opd0
  726.                         BL      CalcObjAdrs
  727.                         LDRB    Wrk2,[CodeBase,#0]
  728.                         CMP     Wrk2,#4
  729.                         BGE     PlusPTO
  730.                         LDRB    Wrk1,[Wrk1,#4]
  731.                         B       PutWrkMain
  732. PlusPTO                 LDRB    Wrk2,[Wrk1,#6]
  733.                         LDRB    Wrk1,[Wrk1,#7]
  734.                         ORR     Wrk1,Wrk1,Wrk2,LSL #8
  735.                         B       PutWrkMain
  736.  
  737. LOS                     BL      GetOneOperand
  738.                         MOV     Wrk1,#0
  739.                         STR     Wrk1,FetchNext
  740.                         SUB     Wrk1,Opd0,#1
  741.                         ADD     Wrk1,Wrk1,CodeBase
  742.                         BL      GetDataSize
  743.                         MOV     Wrk1,Wrk2
  744.                         B       PutWrkMain
  745.  
  746. RemoveObj               STMEA   SP!, {R14,Wrk4,Tmp1,Tmp2}
  747.                         MOV     Wrk1,Opd0
  748.                         BL      CalcObjAdrs
  749.                         LDRB    Wrk4,[CodeBase,#0]
  750.                         CMP     Wrk4,#4
  751.                         BGE     PlusParentRMO
  752.                         LDRB    Wrk2,[Wrk1,#4]
  753.                         B       ChkParentRMO
  754. PlusParentRMO           LDRB    Wrk3,[Wrk1,#6]
  755.                         LDRB    Wrk2,[Wrk1,#7]
  756.                         ORR     Wrk2,Wrk2,Wrk3,LSL #8
  757. ChkParentRMO            TEQ     Wrk2,#0
  758.                         BEQ     RemoveReturn
  759.                         MOV     Tmp1,Wrk1
  760.                         MOV     Wrk1,Wrk2
  761.                         BL      CalcObjAdrs
  762.                         CMP     Wrk4,#4
  763.                         BGE     PlusFirstRMO
  764.                         LDRB    Wrk2,[Wrk1,#6]
  765.                         B       ChkFirstRMO
  766. PlusFirstRMO            LDRB    Wrk3,[Wrk1,#10.]
  767.                         LDRB    Wrk2,[Wrk1,#11.]
  768.                         ORR     Wrk2,Wrk2,Wrk3,LSL #8
  769. ChkFirstRMO             CMP     Wrk2,Opd0
  770.                         BNE     FindObjRMO
  771.                         CMP     Wrk4,#4
  772.                         BGE     PlusSetFirstRMO
  773.                         LDRB    Wrk3,[Tmp1,#5]
  774.                         STRB    Wrk3,[Wrk1,#6]
  775.                         B       ClearFieldsRMO
  776. PlusSetFirstRMO         LDRB    Wrk3,[Tmp1,#8]
  777.                         STRB    Wrk3,[Wrk1,#10.]
  778.                         LDRB    Wrk3,[Tmp1,#9]
  779.                         STRB    Wrk3,[Wrk1,#11.]
  780.                         B       ClearFieldsRMO
  781. FindObjRMO              MOV     Tmp2,Wrk2
  782. FindLoopRMO             MOV     Wrk1,Tmp2
  783.                         BL      CalcObjAdrs
  784.                         CMP     Wrk4,#4
  785.                         BGE     PlusGetNextRMO
  786.                         LDRB    Tmp2,[Wrk1,#5]
  787.                         B       ChkNextRMO
  788. PlusGetNextRMO          LDRB    Wrk3,[Wrk1,#8]
  789.                         LDRB    Tmp2,[Wrk1,#9]
  790.                         ORR     Tmp2,Tmp2,Wrk3,LSL #8
  791. ChkNextRMO              CMP     Tmp2,Opd0
  792.                         BNE     FindLoopRMO
  793.                         CMP     Wrk4,#4
  794.                         BGE     PlusSetNextRMO
  795.                         LDRB    Wrk3,[Tmp1,#5]
  796.                         STRB    Wrk3,[Wrk1,#5]
  797.                         B       ClearFieldsRMO
  798. PlusSetNextRMO          LDRB    Wrk3,[Tmp1,#8]
  799.                         STRB    Wrk3,[Wrk1,#8]
  800.                         LDRB    Wrk3,[Tmp1,#9]
  801.                         STRB    Wrk3,[Wrk1,#9]
  802. ClearFieldsRMO          MOV     Wrk3,#0
  803.                         CMP     Wrk4,#4
  804.                         BGE     PlusClearFieldsRMO
  805.                         STRB    Wrk3,[Tmp1,#4]
  806.                         STRB    Wrk3,[Tmp1,#5]
  807.                         B       RemoveReturn
  808. PlusClearFieldsRMO      STRB    Wrk3,[Tmp1,#6]
  809.                         STRB    Wrk3,[Tmp1,#7]
  810.                         STRB    Wrk3,[Tmp1,#8]
  811.                         STRB    Wrk3,[Tmp1,#9]
  812. RemoveReturn            LDMEA   SP!, {PC,Wrk4,Tmp1,Tmp2}
  813.   
  814. WriteObjectName         STMEA   SP!, {R14}
  815.                         BL      CalcObjAdrs
  816.                         LDR     Wrk3,DataPtrOffset
  817.                         LDRB    Wrk2,[Wrk1,Wrk3]!
  818.                         LDRB    TxtIPC,[Wrk1,#1]
  819.                         ORR     TxtIPC,TxtIPC,Wrk2,LSL #8
  820.                         ADD     TxtIPC,TxtIPC,CodeBase
  821.                         ADD     TxtIPC,TxtIPC,#1
  822.                         LDMEA   SP!, {R14}
  823.                         B       WriteText
  824.  
  825. RTN                     BL      GetOneOperand
  826. ReturnOpd0              LDR     SP,MP
  827.                         LDR     Wrk1,[SP,#-4]!
  828.                         LDR     Wrk2,[SP,#-4]!
  829.                         STR     Wrk2,NP
  830.                         TEQ     Wrk1,#0
  831.                         BEQ     PulledRegs
  832. PullRegLoop             SUBS    Wrk1,Wrk1,#1
  833.                         LDR     Wrk3,[SP,#-4]!
  834.                         STR     Wrk3,[RegBase,Wrk1,LSL #2]
  835.                         BNE     PullRegLoop
  836. PulledRegs              LDR     IPC,[SP,#-4]!
  837.                         LDR     Wrk1,[SP,#-4]!
  838.                         STR     Wrk1,MP
  839.                         LDR     Wrk1,[SP,#-4]!
  840.                         TEQ     Wrk1,#0
  841.                         BNE     MainLoop
  842.                         MOV     Wrk1,Opd0
  843.                         B       PutWrkMain
  844.  
  845. WSW                     BL      GetOneOperand
  846.                         LDR     Wrk2,AddressShift
  847.                         ADD     TxtIPC,CodeBase,Opd0,LSL Wrk2
  848.                         B       WTXMain
  849.  
  850. SaveFileName            .BLOCK  80.," "
  851.                         .ALIGN
  852.  
  853. PageBuffer              .WORD   0
  854. SaveFileHandle          .WORD   0
  855.  
  856. SVE                     BL      WriteLineBuffer
  857.                         MOV     Wrk1,#0
  858.                         STR     Wrk1,LineIndex
  859.                         BL      PrintStatusLine
  860.                         BL      SetScrollWindow
  861.                         SWI     OS_WriteS
  862.                         .STRING "Save file name --> "
  863.                         ADR     R0,SaveFileName
  864.                         MOV     R1,#80.
  865.                         MOV     R2,#" "+1
  866.                         MOV     R3,#"~"
  867.                         SWI     OS_ReadLine
  868.                         ADR     R2,SaveFileName
  869.                         MOV     R0,#0
  870.                         STRB    R0,[R2,R1]
  871.                         BL      SetWholeScreen
  872.                         MOV     R1,R2
  873.                         MOV     R0,#128.+1111T
  874.                         SWI     XOS_Find
  875.                         BVS     SVE_Failed_NoRelease
  876.                         STR     R0,SaveFileHandle
  877.                         MOV     R3,#256.
  878.                         LDR     R1,HeapBase
  879.                         MOV     R0,#2
  880.                         SWI     OS_Heap
  881.                         STR     R2,PageBuffer
  882.                         LDRB    R0,[CodeBase,#2]
  883.                         STRB    R0,[R2],#1
  884.                         LDRB    R0,[CodeBase,#3]
  885.                         STRB    R0,[R2],#1
  886.                         MOV     R0,#0
  887.                         STRB    R0,[R2],#1
  888.                         STRB    R0,[R2],#1
  889.                         SUB     R0,IPC,CodeBase
  890.                         STR     R0,[R2],#4
  891.                         LDR     R3,StackBase
  892.                         SUB     R0,SP,R3
  893.                         STR     R0,[R2],#4
  894.                         LDR     R0,MP
  895.                         SUB     R0,R0,R3
  896.                         STR     R0,[R2],#4
  897.                         LDR     R0,NP
  898.                         STR     R0,[R2],#4
  899.                         MOV     R1,#15.
  900.                         MOV     R3,RegBase
  901. SVE_Regs                LDR     R0,[R3],#4
  902.                         STR     R0,[R2],#4
  903.                         SUBS    R1,R1,#1
  904.                         BNE     SVE_Regs
  905.                         LDR     R1,SaveFileHandle
  906.                         LDR     R2,PageBuffer
  907.                         MOV     R3,#256.
  908.                         MOV     R0,#2
  909.                         SWI     XOS_GBPB
  910.                         BVS     SVE_Failed
  911.                         LDR     R2,StackBase
  912.                         MOV     R3,#StackSize
  913.                         MOV     R0,#2
  914.                         SWI     XOS_GBPB
  915.                         BVS     SVE_Failed
  916.                         LDRB    R3,[CodeBase,#14.]
  917.                         ADD     R3,R3,#1
  918.                         MOV     R3,R3,LSL #8
  919.                         MOV     R2,CodeBase
  920.                         MOV     R0,#2
  921.                         SWI     XOS_GBPB
  922.                         BVS     SVE_Failed
  923.                         MOV     R0,#0
  924.                         LDR     R1,SaveFileHandle
  925.                         SWI     XOS_Find
  926.                         BVS     SVE_Failed
  927.                         LDR     R1,HeapBase
  928.                         LDR     R2,PageBuffer
  929.                         MOV     R0,#3
  930.                         SWI     OS_Heap
  931.                         LDRB    R0,[CodeBase,#0]
  932.                         CMP     R0,#4
  933.                         BLT     HandleTrue
  934.                         MOV     Wrk1,#1
  935.                         B       PutWrkMain
  936. SVE_Failed              LDR     R1,HeapBase
  937.                         LDR     R2,PageBuffer
  938.                         MOV     R0,#3
  939.                         SWI     OS_Heap
  940.                         LDR     R1,SaveFileHandle
  941.                         MOV     R0,#0
  942.                         SWI     XOS_Find
  943. SVE_Failed_NoRelease    LDRB    R0,[CodeBase,#0]
  944.                         CMP     R0,#4
  945.                         BLT     HandleFalse
  946.                         MOV     Wrk1,#0
  947.                         B       PutWrkMain
  948.  
  949. RSO                     BL      WriteLineBuffer
  950.                         MOV     Wrk1,#0
  951.                         STR     Wrk1,LineIndex
  952.                         BL      PrintStatusLine
  953.                         BL      SetScrollWindow
  954.                         SWI     OS_WriteS
  955.                         .STRING "Restore file name --> "
  956.                         ADR     R0,SaveFileName
  957.                         MOV     R1,#80.
  958.                         MOV     R2,#" "+1
  959.                         MOV     R3,#"~"
  960.                         SWI     OS_ReadLine
  961.                         ADR     R2,SaveFileName
  962.                         MOV     R0,#0
  963.                         STRB    R0,[R2,R1]
  964.                         BL      SetWholeScreen
  965.                         MOV     R1,R2
  966.                         MOV     R0,#64.+1111T
  967.                         SWI     XOS_Find
  968.                         BVS     SVE_Failed_NoRelease
  969.                         STR     R0,SaveFileHandle
  970.                         MOV     R3,#256.
  971.                         LDR     R1,HeapBase
  972.                         MOV     R0,#2
  973.                         SWI     OS_Heap
  974.                         STR     R2,PageBuffer
  975.                         LDR     R1,SaveFileHandle
  976.                         MOV     R3,#256.
  977.                         MOV     R0,#4
  978.                         SWI     XOS_GBPB
  979.                         BVS     SVE_Failed
  980.                         LDR     R2,PageBuffer
  981.                         LDRB    R0,[R2],#1
  982.                         LDRB    R1,[CodeBase,#2]
  983.                         CMP     R0,R1
  984.                         BNE     SVE_Failed
  985.                         LDRB    R0,[R2],#1
  986.                         LDRB    R1,[CodeBase,#3]
  987.                         CMP     R0,R1
  988.                         BNE     SVE_Failed
  989.                         ADD     R2,R2,#2
  990.                         LDR     R0,[R2],#4
  991.                         ADD     IPC,R0,CodeBase
  992.                         LDR     R3,StackBase
  993.                         LDR     R0,[R2],#4
  994.                         ADD     SP,R0,R3
  995.                         LDR     R0,[R2],#4
  996.                         ADD     R0,R0,R3
  997.                         STR     R0,MP
  998.                         LDR     R0,[R2],#4
  999.                         STR     R0,NP
  1000.                         MOV     R1,#15.
  1001.                         MOV     R3,RegBase
  1002. RSO_Regs                LDR     R0,[R2],#4
  1003.                         STR     R0,[R3],#4
  1004.                         SUBS    R1,R1,#1
  1005.                         BNE     RSO_Regs
  1006.                         LDR     R1,SaveFileHandle
  1007.                         LDR     R2,StackBase
  1008.                         MOV     R3,#StackSize
  1009.                         MOV     R0,#4
  1010.                         SWI     XOS_GBPB
  1011.                         BVS     SVE_Failed
  1012.                         LDRB    R3,[CodeBase,#14.]
  1013.                         ADD     R3,R3,#1
  1014.                         MOV     R3,R3,LSL #8
  1015.                         MOV     R2,CodeBase
  1016.                         MOV     R0,#4
  1017.                         SWI     XOS_GBPB
  1018.                         BVS     SVE_Failed
  1019.                         MOV     R0,#0
  1020.                         LDR     R1,SaveFileHandle
  1021.                         SWI     XOS_Find
  1022.                         BVS     SVE_Failed
  1023.                         LDR     R1,HeapBase
  1024.                         LDR     R2,PageBuffer
  1025.                         MOV     R0,#3
  1026.                         SWI     OS_Heap
  1027.                         LDRB    R0,[CodeBase,#4]
  1028.                         CMP     R0,#4
  1029.                         BLT     HandleTrue
  1030.                         MOV     Wrk1,#2
  1031.                         B       PutWrkMain
  1032.  
  1033. StoryFileHandle         .WORD   0
  1034.  
  1035. RST                     MOV     R0,#3
  1036.                         LDR     R1,StoryFileHandle
  1037.                         MOV     R2,CodeBase
  1038.                         LDRB    R3,[CodeBase,#4]
  1039.                         MOV     R3,R3,LSL #8
  1040.                         MOV     R4,#0
  1041.                         SWI     OS_GBPB
  1042.                         B       Restart
  1043.  
  1044. RPL                     LDR     Opd0,[SP,#-4]!
  1045.                         B       ReturnOpd0
  1046.  
  1047. DSC                     B       PullWrkMain
  1048.  
  1049. PSL                     BL      PrintStatusLine
  1050.                         ZIPFETCH
  1051.  
  1052. InitialDataAdrs         .WORD   0
  1053. NumDataBytes            .WORD   0
  1054.  
  1055. VFY                     LDRB    R3,[CodeBase,#4]
  1056.                         MOV     R3,R3,LSL #8
  1057.                         STR     R3,NumDataBytes
  1058.                         LDR     R1,HeapBase
  1059.                         MOV     R0,#2
  1060.                         SWI     OS_Heap
  1061.                         STR     R2,InitialDataAdrs
  1062.                         LDR     R1,StoryFileHandle
  1063.                         LDR     R3,NumDataBytes
  1064.                         MOV     R4,#0
  1065.                         MOV     R0,#3
  1066.                         SWI     OS_GBPB
  1067.                         LDR     R2,InitialDataAdrs
  1068.                         LDR     R3,NumDataBytes
  1069.                         ADD     R2,R2,#64.
  1070.                         SUB     R3,R3,#64.
  1071.                         MOV     R1,#0
  1072. VFY_DataLoop            LDRB    R0,[R2],#1
  1073.                         ADD     R1,R1,R0
  1074.                         SUBS    R3,R3,#1
  1075.                         BNE     VFY_DataLoop
  1076.                         LDRB    R0,[CodeBase,#26.]
  1077.                         LDRB    R3,[CodeBase,#27.]
  1078.                         ORR     R3,R3,R0,LSL #8
  1079.                         LDR     R0,AddressShift
  1080.                         MOV     R3,R3,LSL R0
  1081.                         LDR     R4,NumDataBytes
  1082.                         ADD     R2,CodeBase,R4
  1083.                         SUB     R3,R3,R4
  1084. VFY_CodeLoop            LDRB    R0,[R2],#1
  1085.                         ADD     R1,R1,R0
  1086.                         SUBS    R3,R3,#1
  1087.                         BNE     VFY_CodeLoop
  1088.                         AND     R4,R1,Bit16Mask
  1089.                         LDR     R1,HeapBase
  1090.                         LDR     R2,InitialDataAdrs
  1091.                         MOV     R0,#3
  1092.                         SWI     OS_Heap
  1093.                         LDRB    R0,[CodeBase,#28.]
  1094.                         LDRB    R2,[CodeBase,#29.]
  1095.                         ORR     R2,R2,R0,LSL #8
  1096.                         CMP     R4,R2
  1097.                         BNE     VFY_Failed
  1098.                         LDRB    R0,[CodeBase,#0]
  1099.                         CMP     R0,#4
  1100.                         BLT     HandleTrue
  1101.                         MOV     Wrk1,#1
  1102.                         B       PutWrkMain
  1103. VFY_Failed              LDRB    R0,[CodeBase,#0]
  1104.                         CMP     R0,#4
  1105.                         BLT     HandleFalse
  1106.                         MOV     Wrk1,#0
  1107.                         B       PutWrkMain
  1108.  
  1109. EXC                     B       NotImplemented
  1110.  
  1111.  
  1112. GetExtendedOperands     LDRB    Wrk2,[IPC],#1
  1113.                         LDRB    Wrk1,[IPC],#1
  1114.                         ORR     Wrk1,Wrk1,Wrk2,LSL #8
  1115.                         B       EnterMultipleLoop
  1116.  
  1117. GetMultipleOperands     LDRB    Wrk1,[IPC],#1
  1118.                         MOV     Wrk1,Wrk1,LSL #8
  1119.                         ORR     Wrk1,Wrk1,#0000000011111111T
  1120.  
  1121. EnterMultipleLoop       MOV     OpdCnt,#0
  1122. GetOneMlt               TST     Wrk1,#1100000000000000T
  1123.                         LDREQB  Wrk2,[IPC],#1
  1124.                         LDREQB  Opd0,[IPC],#1
  1125.                         ORREQ   Opd0,Opd0,Wrk2,LSL #8
  1126.                         BEQ     StoreMltOpd
  1127. MltNotImmWord           TST     Wrk1,#1000000000000000T
  1128.                         LDREQB  Opd0,[IPC],#1
  1129.                         BEQ     StoreMltOpd
  1130. MltNotImmByte           TST     Wrk1,#0100000000000000T
  1131.                         BNE     GetMltReturn
  1132.                         LDRB    Wrk2,[IPC],#1
  1133.                         TEQ     Wrk2,#0
  1134.                         LDREQ   Opd0,[SP,#-4]!
  1135.                         BEQ     StoreMltOpd
  1136.                         CMP     Wrk2,#16.
  1137.                         SUBLT   Wrk2,Wrk2,#1
  1138.                         LDRLT   Opd0,[RegBase,Wrk2,LSL #2]
  1139.                         BLT     StoreMltOpd
  1140. MltDataWord             SBC     Wrk2,Wrk2,#16.
  1141.                         ADD     Wrk2,DataBase,Wrk2,LSL #1
  1142.                         LDRB    Opd0,[Wrk2,#1]
  1143.                         LDRB    Wrk2,[Wrk2]
  1144.                         ORR     Opd0,Opd0,Wrk2,LSL #8
  1145. StoreMltOpd             STR     Opd0,[OpdBase,OpdCnt,LSL #2]
  1146.                         ADD     OpdCnt,OpdCnt,#1
  1147.                         CMP     OpdCnt,#8
  1148.                         MOVLT   Wrk1,Wrk1,LSL #2
  1149.                         BLT     GetOneMlt
  1150. GetMltReturn            LDR     Opd0,sOpd0
  1151.                         LDR     Opd1,sOpd1
  1152.                         MOV     PC,R14
  1153.  
  1154. CFC                     BL      GetMultipleOperands
  1155. CallFunction            MOV     Wrk1,#0
  1156.  
  1157. Call                    TEQ     Opd0,#0
  1158.                         BEQ     NoCall
  1159.                         STR     Wrk1,[SP],#4
  1160.                         LDR     Wrk1,MP
  1161.                         STR     Wrk1,[SP],#4
  1162.                         STR     IPC,[SP],#4
  1163.                         LDR     Wrk2,AddressShift
  1164.                         ADD     IPC,CodeBase,Opd0,LSL Wrk2
  1165.                         LDRB    Wrk1,[IPC],#1
  1166.                         TEQ     Wrk1,#0
  1167.                         BEQ     PushedRegs
  1168.                         LDRB    Wrk2,[CodeBase,#0]
  1169.                         CMP     Wrk2,#5
  1170.                         MOV     Wrk2,#0
  1171.                         MOV     Wrk3,#0
  1172.                         BGE     PushRegLoop5
  1173. PushRegLoop             LDR     Opd0,[RegBase,Wrk2,LSL #2]
  1174.                         STR     Opd0,[SP],#4
  1175.                         LDRB    Wrk3,[IPC],#1
  1176.                         LDRB    Opd0,[IPC],#1
  1177.                         ORR     Opd0,Opd0,Wrk3,LSL #8
  1178.                         STR     Opd0,[RegBase,Wrk2,LSL #2]
  1179.                         ADD     Wrk2,Wrk2,#1
  1180.                         CMP     Wrk2,Wrk1
  1181.                         BLT     PushRegLoop
  1182.                         B       PushedRegs
  1183. PushRegLoop5            LDR     Opd0,[RegBase,Wrk2,LSL #2]
  1184.                         STR     Opd0,[SP],#4
  1185.                         STR     Wrk3,[RegBase,Wrk2,LSL #2]
  1186.                         ADD     Wrk2,Wrk2,#1
  1187.                         CMP     Wrk2,Wrk1
  1188.                         BLT     PushRegLoop5
  1189. PushedRegs              LDR     Wrk2,NP
  1190.                         STR     Wrk2,[SP],#4
  1191.                         STR     Wrk1,[SP],#4
  1192.                         SUB     Wrk1,OpdCnt,#1
  1193.                         STR     Wrk1,NP
  1194.                         TEQ     Wrk1,#0
  1195.                         BEQ     LoadedParams
  1196.                         MOV     Wrk2,#0
  1197.                         ADD     Wrk3,OpdBase,#4
  1198. LoadParam               LDR     Opd0,[Wrk3,Wrk2,LSL #2]
  1199.                         STR     Opd0,[RegBase,Wrk2,LSL #2]
  1200.                         ADD     Wrk2,Wrk2,#1
  1201.                         CMP     Wrk2,Wrk1
  1202.                         BLT     LoadParam
  1203. LoadedParams            STR     SP,MP
  1204.                         ZIPFETCH
  1205.  
  1206. NoCall                  TEQ     Wrk1,#0
  1207.                         BNE     MainLoop
  1208.                         B       PutWrkMain
  1209.  
  1210. STB                     BL      GetMultipleOperands
  1211.                         ADD     Wrk1,Opd0,Opd1
  1212.                         LDR     Wrk2,sOpd2
  1213.                         STRB    Wrk2,[Wrk1,CodeBase]
  1214.                         ZIPFETCH
  1215.  
  1216. Operands
  1217. sOpd0                   .WORD   0
  1218. sOpd1                   .WORD   0
  1219. sOpd2                   .WORD   0
  1220. sOpd3                   .WORD   0
  1221. sOpd4                   .WORD   0
  1222. sOpd5                   .WORD   0
  1223. sOpd6                   .WORD   0
  1224. sOpd7                   .WORD   0
  1225.  
  1226. TableAddress            .WORD   JmpTable
  1227.  
  1228. VocabBase               .WORD   0
  1229. SpecialBase             .WORD   0
  1230. ScreenEnabled           .WORD   0
  1231. PrinterEnabled          .WORD   0
  1232. BufferEnabled           .WORD   0
  1233. DirectEnabled           .WORD   0
  1234. WindowEnabled           .WORD   0
  1235. MaxLineIndex            .WORD   0
  1236. LineNo                  .WORD   0
  1237. BufferBase              .WORD   0
  1238. BufferIndex             .WORD   0
  1239. ScreenHeight            .WORD   0
  1240. ScreenWidth             .WORD   0
  1241. ScrollTop               .WORD   0
  1242. ScrollBottom            .WORD   0
  1243. LineIndex               .WORD   0
  1244. CursorX                 .BYTE   0
  1245. CursorY                 .BYTE   0
  1246.                         .ALIGN
  1247.  
  1248. OpdAddress              .WORD   Operands
  1249.  
  1250. StackBase               .WORD   0
  1251. ObjBase                 .WORD   0
  1252. DataPtrOffset           .WORD   0
  1253. DataNoMask              .WORD   0
  1254. ObjRecSize              .WORD   0
  1255. ObjOffset               .WORD   0
  1256. VcbWordLength           .WORD   0
  1257. AddressShift            .WORD   0
  1258. WritingInWindow         .WORD   0
  1259.  
  1260. STW                     BL      GetMultipleOperands
  1261.                         ADD     Wrk1,Opd0,Opd1,LSL #1
  1262.                         LDR     Wrk2,sOpd2
  1263.                         MOV     Wrk3,Wrk2,LSR #8
  1264.                         STRB    Wrk3,[Wrk1,CodeBase]!
  1265.                         STRB    Wrk2,[Wrk1,#1]
  1266.                         ZIPFETCH
  1267.  
  1268. FetchNext               .WORD   0
  1269.  
  1270. SOD                     BL      GetMultipleOperands
  1271.                         MOV     Wrk1,#1
  1272.                         STR     Wrk1,FetchNext
  1273.                         BL      GetObjDataPtr
  1274.                         LDR     Opd0,DataNoMask
  1275. SODFindData             LDRB    Wrk2,[Wrk1]
  1276.                         AND     Wrk2,Wrk2,Opd0
  1277.                         CMP     Wrk2,Opd1
  1278.                         BEQ     SODSetData
  1279.                         BLT     DataNotFound
  1280.                         BL      GetDataSize
  1281.                         ADD     Wrk1,Wrk1,Wrk2
  1282.                         B       SODFindData
  1283. SODSetData              BL      GetDataSize
  1284.                         LDR     Wrk3,sOpd2
  1285.                         TEQ     Wrk2,#1
  1286.                         BEQ     SODStoreByte
  1287.                         TEQ     Wrk2,#2
  1288.                         BNE     DataNotWordOrByte
  1289.                         MOV     Wrk2,Wrk3,LSR #8
  1290.                         STRB    Wrk2,[Wrk1],#1
  1291. SODStoreByte            STRB    Wrk3,[Wrk1]
  1292.                         ZIPFETCH
  1293.  
  1294. GetDataSize             LDRB    Wrk2,[Wrk1],#1
  1295.                         LDRB    Wrk3,[CodeBase,#0]
  1296.                         CMP     Wrk3,#4
  1297.                         BGE     PlusDataSize
  1298.                         MOV     Wrk2,Wrk2,LSR #5
  1299.                         AND     Wrk2,Wrk2,#7
  1300.                         ADD     Wrk2,Wrk2,#1
  1301.                         MOV     PC,R14
  1302. PlusDataSize            TST     Wrk2,#10000000T
  1303.                         BEQ     TstWordOrByteData
  1304.                         LDR     Wrk3,FetchNext
  1305.                         TEQ     Wrk3,#0
  1306.                         SUBEQ   Wrk1,Wrk1,#1
  1307.                         LDRNE   Wrk2,[Wrk1],#1
  1308.                         AND     Wrk2,Wrk2,#63.
  1309.                         MOV     PC,R14
  1310. TstWordOrByteData       TST     Wrk2,#01000000T
  1311.                         MOVNE   Wrk2,#2
  1312.                         MOVEQ   Wrk2,#1
  1313.                         MOV     PC,R14
  1314.  
  1315. INP                     BL      GetMultipleOperands
  1316.                         BL      WriteLineBuffer
  1317.                         MOV     Wrk1,#0
  1318.                         STR     Wrk1,LineIndex
  1319.                         BL      PrintStatusLine
  1320.                         BL      SetScrollWindow
  1321.                         LDR     Wrk1,ScrollTop
  1322.                         ADD     Wrk1,Wrk1,#1
  1323.                         STR     Wrk1,LineNo
  1324.                         MOV     Wrk1,#0
  1325.                         STR     Wrk1,LineIndex
  1326.                         ADD     InpLinePtr,Opd0,CodeBase
  1327.                         STR     InpLinePtr,InpLineStart
  1328.                         ADD     ParsedPtr,Opd1,CodeBase
  1329.                         ADD     R0,InpLinePtr,#1
  1330.                         LDRB    R1,[InpLinePtr],#1
  1331.                         LDR     R2,MaxLineIndex
  1332.                         CMP     R1,R2
  1333.                         MOVGT   R1,R2
  1334.                         CMP     R1,#0
  1335.                         MOVEQ   R1,R2
  1336.                         MOV     R2,#" "
  1337.                         MOV     R3,#"~"
  1338.                         SWI     OS_ReadLine
  1339.                         TEQ     R1,#0
  1340.                         BEQ     INPDonePrint
  1341.                         LDR     R2,PrinterEnabled
  1342.                         TEQ     R2,#0
  1343.                         LDREQB  R2,[CodeBase,#17.]
  1344.                         ANDEQ   R2,R2,#1
  1345.                         TEQEQ   R2,#0
  1346.                         BEQ     INPDonePrint
  1347.                         SWI     OS_WriteI+2
  1348.                         SWI     OS_WriteI+21.
  1349.                         MOV     R2,#0
  1350.                         MOV     R3,R0
  1351. INPPrintLoop            LDRB    R0,[R3,R2]
  1352.                         SWI     OS_WriteC
  1353.                         ADD     R2,R2,#1
  1354.                         CMP     R2,R1
  1355.                         BNE     INPPrintLoop
  1356.                         SWI     OS_NewLine
  1357.                         SWI     OS_WriteI+6
  1358.                         SWI     OS_WriteI+3
  1359. INPDonePrint            MOV     R0,#0
  1360.                         STRB    R0,[InpLinePtr,R1]
  1361.                         BL      SetWholeScreen
  1362.                         CMP     OpdCnt,#1
  1363.                         BLT     MainLoop
  1364.                         STMEA   SP!, {R4-R12}
  1365.                         LDR     VocabPtr,VocabBase
  1366.                         LDRB    Wrk1,[VocabPtr],#1
  1367.                         ADD     VocabPtr,VocabPtr,Wrk1
  1368.                         LDRB    EntryLength,[VocabPtr],#1
  1369.                         LDRB    Wrk1,[VocabPtr],#1
  1370.                         LDRB    NumVocabWords,[VocabPtr],#1
  1371.                         ORR     NumVocabWords,NumVocabWords,Wrk1,LSL #8
  1372.                         STR     VocabPtr,VocabStart
  1373.                         LDRB    MaxNumWords,[ParsedPtr]
  1374.                         CMP     MaxNumWords,#MaxMaxNumWords
  1375.                         MOVGT   MaxNumWords,#MaxMaxNumWords
  1376.                         TEQ     MaxNumWords,#0
  1377.                         MOVEQ   MaxNumWords,#MaxMaxNumWords
  1378.                         STR     ParsedPtr,ParsedStart
  1379.                         ADD     ParsedPtr,ParsedPtr,#2
  1380.                         MOV     NumWords,#0
  1381.                         LDRB    Wrk1,[InpLinePtr]
  1382. INP_WordLoop            TEQ     Wrk1,#0
  1383.                         BEQ     INP_SetNumWords
  1384.                         ADR     WordChPtr,WordChBuffer
  1385.                         MOV     Wrk2,#0
  1386.                         LDR     Wrk3,VcbWordLength
  1387. INP_InitBuffer          SUBS    Wrk3,Wrk3,#1
  1388.                         STRB    Wrk2,[WordChPtr,Wrk3]
  1389.                         BNE     INP_InitBuffer
  1390.                         STR     InpLinePtr,WordStart
  1391.                         LDRB    Wrk1,[InpLinePtr],#1
  1392.                         TEQ     Wrk1,#0
  1393.                         BEQ     INP_SetNumWords
  1394.                         BL      ChkIfSeparator
  1395.                         BEQ     INP_ChkIfTerminator
  1396.                         STRB    Wrk1,[WordChPtr]
  1397.                         MOV     WordChCnt,#1
  1398.                         B       INP_PackWord
  1399. INP_ChkIfTerminator     BL      ChkIfTerminator
  1400.                         BNE     INP_WordLoop
  1401. INP_StartWord           STRB    Wrk1,[WordChPtr]
  1402.                         MOV     WordChCnt,#1
  1403. INP_WordChLoop          LDRB    Wrk1,[InpLinePtr],#1
  1404.                         TEQ     Wrk1,#0
  1405.                         BEQ     INP_EndOfWord
  1406.                         BL      ChkIfSeparator
  1407.                         BNE     INP_EndOfWord
  1408.                         BL      ChkIfTerminator
  1409.                         BNE     INP_EndOfWord
  1410.                         LDR     Wrk3,VcbWordLength
  1411.                         CMP     WordChCnt,Wrk3
  1412.                         STRLTB  Wrk1,[WordChPtr,WordChCnt]
  1413.                         ADD     WordChCnt,WordChCnt,#1
  1414.                         B       INP_WordChLoop
  1415. INP_EndOfWord           SUB     InpLinePtr,InpLinePtr,#1
  1416. INP_PackWord            BL      PackWord
  1417.                         BL      SearchWord
  1418.                         MOV     Wrk3,Wrk2,LSR #8
  1419.                         STRB    Wrk3,[ParsedPtr],#1
  1420.                         STRB    Wrk2,[ParsedPtr],#1
  1421.                         STRB    WordChCnt,[ParsedPtr],#1
  1422.                         LDR     Wrk2,WordStart
  1423.                         LDR     Wrk3,InpLineStart
  1424.                         SUB     Wrk2,Wrk2,Wrk3
  1425.                         STRB    Wrk2,[ParsedPtr],#1
  1426.                         ADD     NumWords,NumWords,#1
  1427.                         B       INP_WordLoop
  1428. INP_SetNumWords         LDR     ParsedPtr,ParsedStart
  1429.                         STRB    NumWords,[ParsedPtr,#1]
  1430.                         LDMEA   SP!, {R4-R12}
  1431.                         ZIPFETCH
  1432.  
  1433. PkdBuffer               .BLOCK  18.," "
  1434. WordChBuffer            .BLOCK  18.," "
  1435.                         .ALIGN
  1436. ParsedStart             .WORD   0
  1437. InpLineStart            .WORD   0
  1438. WordStart               .WORD   0
  1439.  
  1440. ChkIfSeparator          STMEA   SP!, {Wrk2,Wrk3,R14}
  1441.                         LDR     VocabPtr,VocabBase
  1442.                         LDRB    Wrk2,[VocabPtr],#1
  1443. SearchSeparator         LDRB    Wrk3,[VocabPtr],#1
  1444.                         CMP     Wrk1,Wrk3
  1445.                         BEQ     FoundSeparator
  1446.                         SUBS    Wrk2,Wrk2,#1
  1447.                         BNE     SearchSeparator
  1448.                         LDMEA   SP!, {Wrk2,Wrk3,PC}
  1449. FoundSeparator          MOVS    Wrk2,#1
  1450.                         LDMEA   SP!, {Wrk2,Wrk3,PC}
  1451.  
  1452. VocabStart              .WORD   0
  1453.  
  1454. PackWord                STMEA   SP!, {R14,Wrk1,Wrk2,Wrk3,Wrk4}
  1455.                         ADR     Wrk1,PkdBuffer
  1456.                         LDR     Wrk2,VcbWordLength
  1457. PutPackLoop             LDRB    Wrk3,[WordChPtr],#1
  1458.                         TEQ     Wrk3,#0
  1459.                         BEQ     Put5
  1460.                         CMP     Wrk3,#"a"
  1461.                         BLT     PackChkCapital
  1462.                         CMP     Wrk3,#"z"
  1463.                         BGT     PutNonAlpha
  1464.                         SUB     Wrk3,Wrk3,#"a"-6
  1465.                         STRB    Wrk3,[Wrk1],#1
  1466.                         B       PackNextCh
  1467. PackChkCapital          CMP     Wrk3,#"A"
  1468.                         BLT     PutNonAlpha
  1469.                         CMP     Wrk3,#"Z"
  1470.                         BGT     PutNonAlpha
  1471.                         SUB     Wrk3,Wrk3,#"A"-6
  1472. PutInPackBuffer         STRB    Wrk3,[Wrk1],#1
  1473.                         B       PackNextCh
  1474. PutNonAlpha             MOV     Wrk4,#5
  1475.                         STRB    Wrk4,[Wrk1],#1
  1476.                         BL      SearchSpecialTable
  1477.                         BNE     PutInPackBuffer
  1478.                         MOV     Wrk4,#6
  1479.                         STRB    Wrk4,[Wrk1],#1
  1480.                         MOV     Wrk4,Wrk3,LSR #5
  1481.                         AND     Wrk4,Wrk4,#00000011T
  1482.                         STRB    Wrk4,[Wrk1],#1
  1483.                         AND     Wrk4,Wrk3,#00011111T
  1484.                         STRB    Wrk4,[Wrk1],#1
  1485.                         B       PackNextCh
  1486. Put5                    MOV     Wrk3,#5
  1487.                         STRB    Wrk3,[Wrk1],#1
  1488. PackNextCh              SUBS    Wrk2,Wrk2,#1
  1489.                         BNE     PutPackLoop
  1490.                         ADR     Wrk1,PkdBuffer
  1491.                         LDR     Wrk2,[Wrk1]
  1492.                         MOV     Wrk4,Wrk2,LSR #8
  1493.                         MOV     Wrk2,Wrk2,LSL #26.
  1494.                         AND     Wrk3,Wrk4,#1F
  1495.                         ORR     Wrk2,Wrk2,Wrk3,LSL #21.
  1496.                         MOV     Wrk4,Wrk4,LSR #8
  1497.                         AND     Wrk3,Wrk4,#1F
  1498.                         ORR     Wrk2,Wrk2,Wrk3,LSL #16.
  1499.                         MOV     Wrk4,Wrk4,LSR #8
  1500.                         AND     Wrk3,Wrk4,#1F
  1501.                         ORR     Wrk2,Wrk2,Wrk3,LSL #10.
  1502.                         LDR     Wrk4,[Wrk1,#4]
  1503.                         AND     Wrk3,Wrk4,#1F
  1504.                         ORR     Wrk2,Wrk2,Wrk3,LSL #5
  1505.                         MOV     Wrk4,Wrk4,LSR #8
  1506.                         AND     Wrk3,Wrk4,#1F
  1507.                         ORR     Wrk2,Wrk2,Wrk3
  1508.                         LDRB    Wrk3,[CodeBase,#0]
  1509.                         CMP     Wrk3,#4
  1510.                         ORRLT   Wrk2,Wrk2,#00008000
  1511.                         BICGT   Wrk2,Wrk2,#00008000
  1512.                         STR     Wrk2,[Wrk1,#0]
  1513.                         LDMLTEA SP!, {PC,Wrk1,Wrk2,Wrk3,Wrk4}
  1514.                         LDR     Wrk2,[Wrk1,#4]
  1515.                         LDRB    Wrk3,[Wrk1,#8]
  1516.                         MOV     Wrk4,Wrk2,LSR #24.
  1517.                         MOV     Wrk2,Wrk2,LSR #6
  1518.                         AND     Wrk2,Wrk2,#0111110000000000T
  1519.                         ORR     Wrk2,Wrk2,Wrk4,LSL #5
  1520.                         ORR     Wrk2,Wrk2,Wrk3
  1521.                         ORR     Wrk2,Wrk2,#1000000000000000T
  1522.                         MOV     Wrk3,Wrk2,LSR #8
  1523.                         STRB    Wrk3,[Wrk1,#5]
  1524.                         STRB    Wrk2,[Wrk1,#4]
  1525.                         LDMEA   SP!, {PC,Wrk1,Wrk2,Wrk3,Wrk4}
  1526.  
  1527. SearchWord              STMEA   SP!, {R14,Wrk1,Wrk3,Wrk4,Tmp1}
  1528.                         LDR     VocabPtr,VocabStart
  1529.                         MOV     Wrk4,NumVocabWords
  1530. SearchWordLoop          TEQ     Wrk4,#0
  1531.                         BEQ     WordNotFound
  1532.                         TEQ     Wrk4,#1
  1533.                         BEQ     ChkLastWord
  1534.                         MOV     Wrk3,VocabPtr
  1535.                         MOV     Wrk1,Wrk4,LSR #1
  1536.                         MLA     VocabPtr,Wrk1,EntryLength,VocabPtr
  1537.                         LDR     Wrk1,PkdBuffer
  1538.                         LDRB    Wrk2,[VocabPtr,#3]
  1539.                         LDRB    Tmp1,[VocabPtr,#2]
  1540.                         ORR     Wrk2,Wrk2,Tmp1,LSL #8
  1541.                         LDRB    Tmp1,[VocabPtr,#1]
  1542.                         ORR     Wrk2,Wrk2,Tmp1,LSL #16.
  1543.                         LDRB    Tmp1,[VocabPtr,#0]
  1544.                         ORR     Wrk2,Wrk2,Tmp1,LSL #24.
  1545.                         CMP     Wrk1,Wrk2
  1546.                         BGT     UpperHalf
  1547.                         BLT     LowerHalf
  1548.                         LDRB    Wrk2,[CodeBase,#0]
  1549.                         CMP     Wrk2,#4
  1550.                         BLT     SearchWordFound
  1551.                         ADR     Wrk2,PkdBuffer
  1552.                         LDRB    Wrk1,[Wrk2,#4]
  1553.                         LDRB    Tmp1,[Wrk2,#5]
  1554.                         ORR     Wrk1,Wrk1,Tmp1,LSL #8
  1555.                         LDRB    Wrk2,[VocabPtr,#5]
  1556.                         LDRB    Tmp1,[VocabPtr,#4]
  1557.                         ORR     Wrk2,Wrk2,Tmp1,LSL #8
  1558.                         CMP     Wrk1,Wrk2
  1559.                         BGT     UpperHalf
  1560.                         BLT     LowerHalf
  1561. SearchWordFound         SUB     Wrk2,VocabPtr,CodeBase
  1562.                         LDMEA   SP!, {PC,Wrk1,Wrk3,Wrk4,Tmp1}
  1563.  
  1564. ChkIfTerminator         STMEA   SP!, {R14,Wrk2,Wrk3,Wrk4}
  1565.                         MOV     Wrk2,#5
  1566.                         ADR     Wrk4,Terminators
  1567. SearchTerminator        LDRB    Wrk3,[Wrk4],#1
  1568.                         CMP     Wrk1,Wrk3
  1569.                         BEQ     FoundTerminator
  1570.                         SUBS    Wrk2,Wrk2,#1
  1571.                         BNE     SearchTerminator
  1572.                         LDMEA   SP!, {PC,Wrk2,Wrk3,Wrk4}
  1573. FoundTerminator         MOVS    Wrk2,#1
  1574.                         LDMEA   SP!, {PC,Wrk2,Wrk3,Wrk4}
  1575.  
  1576. Terminators             .ASCII  "!?,. "
  1577.                         .ALIGN
  1578.  
  1579. UpperHalf               TST     Wrk4,#1
  1580.                         MOV     Wrk4,Wrk4,LSR #1
  1581.                         SUBEQ   Wrk4,Wrk4,#1
  1582.                         ADD     VocabPtr,VocabPtr,EntryLength
  1583.                         B       SearchWordLoop
  1584.  
  1585. LowerHalf               MOV     Wrk4,Wrk4,LSR #1
  1586.                         MOV     VocabPtr,Wrk3
  1587.                         B       SearchWordLoop
  1588.  
  1589. ChkLastWord             LDR     Wrk1,PkdBuffer
  1590.                         LDRB    Wrk2,[VocabPtr,#3]
  1591.                         LDRB    Tmp1,[VocabPtr,#2]
  1592.                         ORR     Wrk2,Wrk2,Tmp1,LSL #8
  1593.                         LDRB    Tmp1,[VocabPtr,#1]
  1594.                         ORR     Wrk2,Wrk2,Tmp1,LSL #16.
  1595.                         LDRB    Tmp1,[VocabPtr,#0]
  1596.                         ORR     Wrk2,Wrk2,Tmp1,LSL #24.
  1597.                         CMP     Wrk1,Wrk2
  1598.                         TEQ     Wrk2,Wrk1
  1599.                         BEQ     ChkLastNextTwo
  1600. WordNotFound            MOV     Wrk2,#0
  1601.                         LDMEA   SP!, {PC,Wrk1,Wrk3,Wrk4,Tmp1}
  1602. ChkLastNextTwo          LDRB    Wrk1,[CodeBase,#0]
  1603.                         CMP     Wrk1,#4
  1604.                         BLT     SearchWordFound
  1605.                         LDR     Wrk1,PkdBuffer
  1606.                         LDRB    Wrk2,[VocabPtr,#3]
  1607.                         LDRB    Tmp1,[VocabPtr,#2]
  1608.                         ORR     Wrk2,Wrk2,Tmp1,LSL #8
  1609.                         LDRB    Tmp1,[VocabPtr,#1]
  1610.                         ORR     Wrk2,Wrk2,Tmp1,LSL #16.
  1611.                         LDRB    Tmp1,[VocabPtr,#0]
  1612.                         ORR     Wrk2,Wrk2,Tmp1,LSL #24.
  1613.                         CMP     Wrk2,Wrk1
  1614.                         MOVNE   Wrk2,#0
  1615.                         SUBEQ   Wrk2,VocabPtr,CodeBase
  1616.                         LDMEA   SP!, {PC,Wrk1,Wrk3,Wrk4,Tmp1}
  1617.  
  1618. SearchSpecialTable      STMEA   SP!, {R14,Wrk1,Wrk2,Wrk4}
  1619.                         ADR     Wrk1,RealSpecialChTable
  1620.                         MOV     Wrk2,#0
  1621. SearchTableLoop         LDRB    Wrk4,[Wrk1],#1
  1622.                         CMP     Wrk3,Wrk4
  1623.                         BEQ     FoundChInTable
  1624.                         ADD     Wrk2,Wrk2,#1
  1625.                         CMP     Wrk2,#24.
  1626.                         BNE     SearchTableLoop
  1627.                         LDMEA   SP!, {PC,Wrk1,Wrk2,Wrk4}
  1628. FoundChInTable          ADDS    Wrk3,Wrk2,#8
  1629.                         LDMEA   SP!, {PC,Wrk1,Wrk2,Wrk4}
  1630.  
  1631. SpecialChTable          .BYTE   0
  1632.                         .BYTE   EOL
  1633. RealSpecialChTable      .ASCII  "0123456789.,!?_#'"
  1634.                         .BYTE   22
  1635.                         .ASCII  "/\-:()"
  1636.                         .ALIGN
  1637.  
  1638. SPL                     BL      GetMultipleOperands
  1639.                         TEQ     Opd0,#0
  1640.                         BNE     SPL_EnableWindow
  1641.                         STR     Opd0,WindowEnabled
  1642.                         LDRB    Wrk1,[CodeBase,#0]
  1643.                         CMP     Wrk1,#4
  1644.                         MOVLT   Wrk2,#2
  1645.                         MOVGE   Wrk2,#1
  1646.                         STR     Wrk2,ScrollTop
  1647.                         STR     Wrk2,LineNo
  1648.                         B       MainLoop
  1649. SPL_EnableWindow        LDR     Wrk1,ScreenHeight
  1650.                         CMP     Opd0,Wrk1
  1651.                         BGE     MainLoop
  1652.                         MOV     Wrk1,#1
  1653.                         STR     Wrk1,WindowEnabled
  1654.                         ADD     Opd0,Opd0,#1
  1655.                         LDRB    Wrk1,[CodeBase,#0]
  1656.                         CMP     Wrk1,#4
  1657.                         ADDLT   Opd0,Opd0,#1
  1658.                         STR     Opd0,ScrollTop
  1659.                         MOVLT   Wrk1,#2
  1660.                         SUBLT   Wrk2,Opd0,#1
  1661.                         BLLT    ClearLines
  1662.                         SWI     OS_WriteI+31.
  1663.                         SWI     OS_WriteI+0
  1664.                         LDR     R0,ScreenHeight
  1665.                         SUB     R0,R0,#1
  1666.                         STRB    R0,CursorY
  1667.                         SWI     OS_WriteC
  1668.                         MOV     Wrk1,#0
  1669.                         STRB    Wrk1,CursorX
  1670.                         LDR     Wrk2,LineNo
  1671.                         CMP     Opd0,Wrk2
  1672.                         STRLT   Opd0,LineNo
  1673.                         B       MainLoop
  1674.  
  1675. cPOS                    BL      GetMultipleOperands
  1676.                         LDR     Wrk1,WindowEnabled
  1677.                         BEQ     MainLoop
  1678.                         TEQ     Opd0,#0
  1679.                         BEQ     cPOS_GoWindow
  1680.                         TEQ     Opd0,#1
  1681.                         BNE     MainLoop
  1682.                         TEQ     Opd0,#0
  1683. cPOS_GoWindow           STR     Opd0,WritingInWindow
  1684.                         SWI     OS_WriteI+31.
  1685.                         SWI     OS_WriteI+0
  1686.                         MOV     Wrk1,#0
  1687.                         STRB    Wrk1,CursorX
  1688.                         LDREQ   R0,ScreenHeight
  1689.                         SUBEQ   R0,R0,#1
  1690.                         BEQ     cPOS_SendY
  1691.                         LDRB    Wrk1,[CodeBase,#0]
  1692.                         CMP     Wrk1,#4
  1693.                         MOVLT   R0,#1
  1694.                         MOVGE   R0,#0
  1695. cPOS_SendY              STRB    R0,CursorY
  1696.                         SWI     OS_WriteC
  1697.                         B       MainLoop
  1698.  
  1699. CFCL                    BL      GetExtendedOperands
  1700.                         B       CallFunction
  1701.  
  1702. ERS                     BL      GetMultipleOperands
  1703.                         TEQ     Opd0,#0
  1704.                         BNE     ERS_Test1
  1705.                         LDR     Wrk1,ScrollTop
  1706.                         STR     Wrk1,LineNo
  1707.                         LDR     Wrk2,ScreenHeight
  1708.                         BL      ClearLines
  1709.                         SWI     OS_WriteI+31.
  1710.                         SWI     OS_WriteI+0
  1711.                         LDR     R0,ScreenHeight
  1712.                         SUB     R0,R0,#1
  1713.                         STRB    R0,CursorY
  1714.                         SWI     OS_WriteC
  1715.                         MOV     Wrk1,#0
  1716.                         STRB    Wrk1,CursorX
  1717.                         B       MainLoop
  1718. ERS_Test1               TEQ     Opd0,#1
  1719.                         BNE     ERS_TestMinus1
  1720.                         MOV     Wrk1,#1
  1721.                         LDR     Wrk2,ScrollTop
  1722.                         STR     Wrk2,LineNo
  1723.                         SUB     Wrk2,Wrk2,#1
  1724.                         BL      ClearLines
  1725.                         SWI     OS_WriteI+31.
  1726.                         SWI     OS_WriteI+0
  1727.                         LDR     R0,ScrollTop
  1728.                         SUB     R0,R0,#1
  1729.                         STRB    R0,CursorY
  1730.                         SWI     OS_WriteC
  1731.                         MOV     Wrk1,#0
  1732.                         STRB    Wrk1,CursorX
  1733.                         B       MainLoop
  1734. ERS_TestMinus1          EOR     Opd0,Opd0,Bit16Mask
  1735.                         TEQ     Opd0,#0
  1736.                         BNE     MainLoop
  1737.                         MOV     Wrk1,#0
  1738.                         STR     Wrk1,WindowEnabled
  1739.                         MOV     Wrk1,#1
  1740.                         STR     Wrk1,ScrollTop
  1741.                         STR     Wrk1,LineNo
  1742.                         SWI     OS_WriteI+12.
  1743.                         MOV     Wrk1,#0
  1744.                         STRB    Wrk1,CursorX
  1745.                         STRB    Wrk1,CursorY
  1746.                         B       MainLoop
  1747.  
  1748. cERL                    BL      GetMultipleOperands
  1749.                         TEQ     Opd0,#1
  1750.                         BNE     MainLoop
  1751.                         BL      ClearToEndOfLine
  1752.                         B       MainLoop
  1753.  
  1754. GYX                     BL      GetMultipleOperands
  1755.                         LDR     Wrk1,DirectEnabled
  1756.                         BEQ     MainLoop
  1757.                         LDR     Wrk1,WritingInWindow
  1758.                         BEQ     MainLoop
  1759.                         SWI     OS_WriteI+31.
  1760.                         SUB     R0,Opd1,#1
  1761.                         STRB    R0,CursorX
  1762.                         SWI     OS_WriteC
  1763.                         SUB     R0,Opd0,#1
  1764.                         STRB    R0,CursorY
  1765.                         SWI     OS_WriteC
  1766.                         B       MainLoop
  1767.  
  1768. M16                     B       NotImplemented
  1769.  
  1770. MainLoopAdrs            .WORD   MainLoop
  1771.  
  1772. SCM                     BL      GetMultipleOperands
  1773.                         LDR     R14,MainLoopAdrs
  1774.                         TEQ     Opd0,#0
  1775.                         BEQ     SetNormal
  1776.                         TEQ     Opd0,#1
  1777.                         BEQ     SetInverse
  1778.                         TEQ     Opd0,#2
  1779.                         BEQ     SetBold
  1780.                         B       MainLoop
  1781.  
  1782. FRM                     BL      GetMultipleOperands
  1783.                         TEQ     Opd0,#0
  1784.                         BNE     FRM_Test1
  1785.                         BL      WriteLineBuffer
  1786.                         STR     Opd0,LineIndex
  1787.                         MOV     Wrk1,#1
  1788.                         STR     Wrk1,DirectEnabled
  1789.                         B       MainLoop
  1790. FRM_Test1               TEQ     Opd0,#1
  1791.                         BNE     MainLoop
  1792.                         MOV     Wrk1,#0
  1793.                         STR     Wrk1,DirectEnabled
  1794.                         B       MainLoop
  1795.  
  1796. OUT                     BL      GetMultipleOperands
  1797.                         TST     Opd0,#1000000000000000T
  1798.                         BNE     OUT_ChkDisables
  1799.                         MOV     Wrk1,#1
  1800.                         TEQ     Opd0,#1
  1801.                         BNE     OUT_Test2
  1802.                         STR     Wrk1,ScreenEnabled
  1803.                         B       MainLoop
  1804. OUT_Test2               TEQ     Opd0,#2
  1805.                         BNE     OUT_Test3
  1806.                         STR     Wrk1,PrinterEnabled
  1807.                         LDRB    Wrk1,[CodeBase,#17.]
  1808.                         ORR     Wrk1,Wrk1,#1
  1809.                         STRB    Wrk1,[CodeBase,#17.]
  1810.                         B       MainLoop
  1811. OUT_Test3               TEQ     Opd0,#3
  1812.                         BNE     MainLoop
  1813.                         STR     Wrk1,BufferEnabled
  1814.                         ADD     Opd1,Opd1,CodeBase
  1815.                         STR     Opd1,BufferBase
  1816.                         MOV     Wrk1,#2
  1817.                         STR     Wrk1,BufferIndex
  1818.                         B       MainLoop
  1819. OUT_ChkDisables         MOV     Wrk1,#0
  1820.                         EOR     Opd0,Opd0,Bit16Mask
  1821.                         ADD     Opd0,Opd0,#1
  1822.                         TEQ     Opd0,#1
  1823.                         BNE     OUT_TestMinus2
  1824.                         STR     Wrk1,ScreenEnabled
  1825.                         B       MainLoop
  1826. OUT_TestMinus2          TEQ     Opd0,#2
  1827.                         BNE     OUT_TestMinus3
  1828.                         STR     Wrk1,PrinterEnabled
  1829.                         LDRB    Wrk1,[CodeBase,#17.]
  1830.                         BIC     Wrk1,Wrk1,#1
  1831.                         STRB    Wrk1,[CodeBase,#17.]
  1832.                         B       MainLoop
  1833. OUT_TestMinus3          TEQ     Opd0,#3
  1834.                         BNE     MainLoop
  1835.                         STR     Wrk1,BufferEnabled
  1836.                         LDR     Wrk2,BufferIndex
  1837.                         LDR     Wrk3,BufferBase
  1838.                         STRB    Wrk1,[Wrk3,Wrk2]
  1839.                         SUB     Wrk2,Wrk2,#2
  1840.                         STRB    Wrk2,[Wrk3,#1]
  1841.                         MOV     Wrk2,Wrk2,LSR #8
  1842.                         STRB    Wrk2,[Wrk3,#0]
  1843.                         B       MainLoop
  1844.  
  1845. COM                     B       NotImplemented
  1846.  
  1847. BEL                     BL      GetMultipleOperands
  1848.                         SWI     OS_WriteI+7
  1849.                         B       MainLoop
  1850.  
  1851. INK                     BL      GetMultipleOperands
  1852.                         TEQ     Opd0,#1
  1853.                         MOV     Wrk1,#0
  1854.                         BNE     PutWrkMain
  1855.                         BL      WriteLineBuffer
  1856.                         STR     Wrk1,LineIndex
  1857.                         BL      PrintStatusLine
  1858.                         LDR     Wrk1,ScrollTop
  1859.                         STR     Wrk1,LineNo
  1860.                         SWI     OS_ReadC
  1861.                         B       PutWrkMain
  1862.  
  1863. MEQ                     BL      GetMultipleOperands
  1864.                         ADD     Opd1,Opd1,CodeBase
  1865.                         LDR     Wrk2,sOpd2
  1866.                         TEQ     Wrk2,#0
  1867.                         BEQ     MEQ_NotFound
  1868. MEQ_Loop                LDRB    Wrk1,[Opd1],#1
  1869.                         LDRB    Wrk3,[Opd1],#1
  1870.                         ORR     Wrk3,Wrk3,Wrk1,LSL #8
  1871.                         CMP     Opd0,Wrk3
  1872.                         BEQ     MEQ_Found
  1873.                         SUBS    Wrk2,Wrk2,#1
  1874.                         BNE     MEQ_Loop
  1875. MEQ_NotFound            MOV     Wrk1,#0
  1876.                         BL      PutWrk
  1877.                         B       HandleFalse
  1878. MEQ_Found               SUB     Wrk1,Opd1,CodeBase
  1879.                         SUB     Wrk1,Wrk1,#2
  1880.                         BL      PutWrk
  1881.                         B       HandleTrue
  1882.  
  1883. NEG                     BL      GetMultipleOperands
  1884.                         MVN     Wrk1,Opd0
  1885.                         AND     Wrk1,Wrk1,Bit16Mask
  1886.                         B       PutWrkMain
  1887.  
  1888. CPC                     BL      GetMultipleOperands
  1889.                         B       CallProcedure
  1890.  
  1891. CPCL                    BL      GetExtendedOperands
  1892.                         B       CallProcedure
  1893.  
  1894. M27
  1895. M28
  1896. WDB
  1897. M30
  1898. M31                     B       NotImplemented
  1899.  
  1900. GetOneOperand           TST     OpCode,#00010000T
  1901.                         LDRNEB  Opd0,[IPC],#1
  1902.                         MOVNE   OpdCnt,#1
  1903.                         MOVNE   PC,R14
  1904. TstImmWord              TST     OpCode,#00100000T
  1905.                         BEQ     OneGetImmWord
  1906.                         LDRB    Wrk1,[IPC],#1
  1907.                         TEQ     Wrk1,#0
  1908.                         BEQ     OneFromStack
  1909.                         CMP     Wrk1,#16.
  1910.                         BGE     OneDataWord
  1911.                         SUB     Wrk1,Wrk1,#1
  1912.                         LDR     Opd0,[RegBase,Wrk1,LSL #2]
  1913.                         MOV     OpdCnt,#1
  1914.                         MOV     PC,R14
  1915. OneDataWord             SBC     Wrk1,Wrk1,#16.
  1916.                         ADD     Wrk2,DataBase,Wrk1,LSL #1
  1917.                         LDRB    Wrk1,[Wrk2]
  1918.                         LDRB    Opd0,[Wrk2,#1]
  1919.                         ORR     Opd0,Opd0,Wrk1,LSL #8
  1920.                         MOV     OpdCnt,#1
  1921.                         MOV     PC,R14
  1922. OneFromStack            LDR     Opd0,[SP,#-4]!
  1923.                         MOV     OpdCnt,#1
  1924.                         MOV     PC,R14
  1925. OneGetImmWord           LDRB    Wrk1,[IPC],#1
  1926.                         LDRB    Opd0,[IPC],#1
  1927.                         ORR     Opd0,Opd0,Wrk1,LSL #8
  1928.                         MOV     OpdCnt,#1
  1929.                         MOV     PC,R14
  1930.   
  1931. StackUnderflow          SWI     OS_WriteS
  1932.                         .STRING "Stack underflow"
  1933.                         SWI     OS_NewLine
  1934.                         B       ReturnToCaller
  1935.   
  1936. GetTwoOperands          TST     OpCode,#10000000T
  1937.                         BNE     GetMultipleOperands
  1938.                         TST     OpCode,#01000000T
  1939.                         LDREQB  Opd0,[IPC],#1
  1940.                         BEQ     GetSecondOpd
  1941. Two1NotImmByte          LDRB    Wrk1,[IPC],#1
  1942.                         TEQ     Wrk1,#0
  1943.                         LDREQ   Opd0,[SP,#-4]!
  1944.                         BEQ     GetSecondOpd
  1945. Two1NotFromStack        CMP     Wrk1,#16.
  1946.                         SUBLT   Wrk1,Wrk1,#1
  1947.                         LDRLT   Opd0,[RegBase,Wrk1,LSL #2]
  1948.                         BLT     GetSecondOpd
  1949. Two1DataWord            SUB     Wrk1,Wrk1,#16.
  1950.                         ADD     Wrk2,DataBase,Wrk1,LSL #1
  1951.                         LDRB    Wrk1,[Wrk2]
  1952.                         LDRB    Opd0,[Wrk2,#1]
  1953.                         ORR     Opd0,Opd0,Wrk1,LSL #8
  1954. GetSecondOpd            TST     OpCode,#00100000T
  1955.                         LDREQB  Opd1,[IPC],#1
  1956.                         BEQ     GotTwoOperands
  1957. Two2NotImmByte          LDRB    Wrk1,[IPC],#1
  1958.                         TEQ     Wrk1,#0
  1959.                         LDREQ   Opd1,[SP,#-4]!
  1960.                         BEQ     GotTwoOperands
  1961. Two2NotFromStack        CMP     Wrk1,#16.
  1962.                         SUBLT   Wrk1,Wrk1,#1
  1963.                         LDRLT   Opd1,[RegBase,Wrk1,LSL #2]
  1964.                         BLT     GotTwoOperands
  1965. Two2DataWord            SUB     Wrk1,Wrk1,#16.
  1966.                         ADD     Wrk2,DataBase,Wrk1,LSL #1
  1967.                         LDRB    Wrk1,[Wrk2]
  1968.                         LDRB    Opd1,[Wrk2,#1]
  1969.                         ORR     Opd1,Opd1,Wrk1,LSL #8
  1970. GotTwoOperands          MOV     OpdCnt,#2
  1971.                         MOV     PC,R14
  1972.  
  1973. SpecialChTableAddress   .WORD   SpecialChTable
  1974.  
  1975. WrtTxtReturn            LDMEA   SP!, {PC,MultiChType,SingleChType,PkdChCnt,PkdCh,ChType,PkdChWord,Tmp3}
  1976. WriteText               STMEA   SP!, {R14,MultiChType,SingleChType,PkdChCnt,PkdCh,ChType,PkdChWord,Tmp3}
  1977.                         MOV     MultiChType,#0
  1978.                         MOV     PkdChCnt,#0
  1979.                         MOV     SingleChType,#0FF
  1980. WrtTxtLoop              BL      GetPkdCh
  1981.                         MOVS    WrkCh,PkdCh
  1982.                         BEQ     WrtTxtPutBlank
  1983.                         CMP     WrkCh,#4
  1984.                         BLT     WrtSpecialTxt
  1985.                         CMP     WrkCh,#6
  1986.                         BLT     SetChType
  1987.                         BL      GetChType
  1988.                         BNE     WrtTxtNotSmallLetter
  1989.                         ADD     WrkCh,WrkCh,#"a"-6
  1990. WrtTxtPutCh             BL      SendChToStoryOutput
  1991.                         B       WrtTxtLoop
  1992. WrtTxtNotSmallLetter    TEQ     ChType,#1
  1993.                         BNE     WrtTxtNonAlpha
  1994.                         ADD     WrkCh,WrkCh,#"A"-6
  1995.                         B       WrtTxtPutCh
  1996. WrtTxtNonAlpha          SUBS    WrkCh,WrkCh,#6
  1997.                         BEQ     WrtTxtLongCh
  1998.                         LDR     PkdCh,SpecialChTableAddress
  1999.                         LDRB    WrkCh,[PkdCh,WrkCh]
  2000.                         B       WrtTxtPutCh
  2001. WrtTxtLongCh            BL      GetPkdCh
  2002.                         MOV     WrkCh,PkdCh,LSL #5
  2003.                         BL      GetPkdCh
  2004.                         ORR     WrkCh,WrkCh,PkdCh
  2005.                         B       WrtTxtPutCh
  2006. WrtTxtPutBlank          MOV     WrkCh,#" "
  2007.                         B       WrtTxtPutCh
  2008. SetChType               SUB     WrkCh,WrkCh,#3
  2009.                         BL      GetChType
  2010.                         BNE     SetMultiChType
  2011.                         MOV     SingleChType,WrkCh
  2012.                         B       WrtTxtLoop
  2013. SetMultiChType          MOV     MultiChType,WrkCh
  2014.                         CMP     ChType,MultiChType
  2015.                         BEQ     WrtTxtLoop
  2016.                         MOV     MultiChType,#0
  2017.                         B       WrtTxtLoop
  2018.  
  2019. WrtSpecialTxt           SUB     WrkCh,WrkCh,#1
  2020.                         BL      GetPkdCh
  2021.                         MOV     PkdCh,PkdCh,LSL #1
  2022.                         ADD     PkdCh,PkdCh,WrkCh,LSL #6
  2023.                         STMEA   SP!, {TxtIPC}
  2024.                         LDR     WrkCh,SpecialBase
  2025.                         LDRB    Tmp3,[WrkCh,PkdCh]!
  2026.                         LDRB    PkdCh,[WrkCh,#1]
  2027.                         ORR     PkdCh,PkdCh,Tmp3,LSL #8
  2028.                         ADD     TxtIPC,CodeBase,PkdCh,LSL #1
  2029.                         BL      WriteText
  2030.                         LDMEA   SP!, {TxtIPC}
  2031.                         MOV     SingleChType,#0FF
  2032.                         B       WrtTxtLoop
  2033.  
  2034. GetChType               TEQ     SingleChType,#0FF
  2035.                         BNE     GetSingleChType
  2036.                         MOV     ChType,MultiChType
  2037.                         MOV     PC,R14
  2038. GetSingleChType         MOV     ChType,SingleChType
  2039.                         MOV     SingleChType,#0FF
  2040.                         MOV     PC,R14
  2041.  
  2042. GetPkdCh                TEQ     PkdChCnt,#0FF
  2043.                         BEQ     WrtTxtReturn
  2044.                         TEQ     PkdChCnt,#0
  2045.                         BNE     PkdWordLoaded
  2046.                         ADD     PkdChCnt,PkdChCnt,#1
  2047.                         LDRB    Tmp3,[TxtIPC],#1
  2048.                         LDRB    PkdChWord,[TxtIPC],#1
  2049.                         ORR     PkdChWord,PkdChWord,Tmp3,LSL #8
  2050.                         MOV     PkdCh,PkdChWord,LSR #10.
  2051. MaskPkd                 AND     PkdCh,PkdCh,#00011111T
  2052.                         MOV     PC,R14
  2053. PkdWordLoaded           TEQ     PkdChCnt,#1
  2054.                         BNE     GetLastPkd
  2055.                         ADD     PkdChCnt,PkdChCnt,#1
  2056.                         MOV     PkdCh,PkdChWord,LSR #5
  2057.                         B       MaskPkd
  2058. GetLastPkd              TST     PkdChWord,#1000000000000000T
  2059.                         MOVNE   PkdChCnt,#0FF
  2060.                         MOVEQ   PkdChCnt,#0
  2061.                         AND     PkdCh,PkdChWord,#00011111T
  2062.                         MOV     PC,R14
  2063.  
  2064. ChSave                  .BYTE   0
  2065.                         .ALIGN
  2066.  
  2067. SendChToStoryOutput     STMEA   SP!, {R14,Wrk1,Wrk2,Wrk3,Tmp1,Tmp2}
  2068.                         STR     Wrk1,ChSave
  2069.                         LDR     Wrk1,BufferEnabled
  2070.                         TEQ     Wrk1,#0
  2071.                         BNE     PutChInStoryBuffer
  2072.                         LDR     Wrk1,ScreenEnabled
  2073.                         TEQ     Wrk1,#0
  2074.                         LDR     Wrk2,PrinterEnabled
  2075.                         TEQEQ   Wrk2,#0
  2076.                         LDMEQEA SP!, {PC,Wrk1,Wrk2,Wrk3,Tmp1,Tmp2}
  2077. TestDirectEnabled       LDR     Wrk3,DirectEnabled
  2078.                         TEQ     Wrk3,#0
  2079.                         BEQ     TestNewLine
  2080.                         TEQ     Wrk2,#0
  2081.                         LDRNE   Wrk2,WritingInWindow
  2082.                         TEQNE   Wrk2,#1
  2083.                         SWINE   OS_WriteI+2
  2084.                         TEQ     Wrk1,#0
  2085.                         SWIEQ   OS_WriteI+1
  2086.                         LDR     R0,ChSave
  2087. ;                       TEQ     R0,#EOL
  2088.                         SWI     OS_WriteC
  2089. ;                       SWIEQ   OS_WriteI+10.
  2090.                         SWI     OS_WriteI+3
  2091. SendChReturn            LDMEA   SP!, {PC,Wrk1,Wrk2,Wrk3,Tmp1,Tmp2}
  2092.  
  2093. ;                       TEQ     R0,#EOL
  2094. ;                       SWINE   OS_WriteC
  2095. ;                       BLEQ    Scroll
  2096. ;TestPrinterEnabled     LDR     Wrk2,PrinterEnabled
  2097. ;                       TEQ     Wrk2,#1
  2098. ;                       LDMNEEA SP!, {PC,Wrk1,Wrk2,Wrk3,Tmp1,Tmp2}
  2099. ;                       LDR     R0,ChSave
  2100. ;                       TEQ     R0,#EOL
  2101. ;                       SWINE   OS_WriteC
  2102. ;                       BLEQ    Scroll
  2103.  
  2104.  
  2105. TestNewLine             LDR     Wrk1,ChSave
  2106.                         TEQ     Wrk1,#EOL
  2107.                         ADREQ   R14,SendChReturn
  2108.                         BEQ     NewLine
  2109. PutChInLineBuffer       CMP     Wrk1,#" "
  2110.                         BLT     SendChReturn
  2111.                         LDR     Wrk2,LineIndex
  2112.                         ADR     Wrk3,LineBuffer
  2113.                         STRB    Wrk1,[Wrk3,Wrk2]
  2114.                         LDR     Wrk3,MaxLineIndex
  2115.                         CMP     Wrk2,Wrk3
  2116.                         BGT     CutLine
  2117.                         ADD     Wrk2,Wrk2,#1
  2118.                         STR     Wrk2,LineIndex
  2119.                         LDMEA   SP!, {PC,Wrk1,Wrk2,Wrk3,Tmp1,Tmp2}
  2120.  
  2121. CutLine                 ADR     Wrk3,LineBuffer
  2122.                         LDR     Wrk2,LineIndex
  2123.                         STR     Wrk2,LastIndex
  2124. CutChkSpace             LDRB    Wrk1,[Wrk3,Wrk2]
  2125.                         CMP     Wrk1,#" "
  2126.                         BEQ     CutIt
  2127.                         SUBS    Wrk2,Wrk2,#1
  2128.                         BNE     CutChkSpace
  2129.                         LDR     Wrk2,MaxLineIndex
  2130. CutIt                   STR     Wrk2,LineIndex
  2131.                         BL      NewLine
  2132.                         ADR     Wrk3,LineBuffer
  2133.                         MOV     Tmp1,#0
  2134.                         LDR     Tmp2,LastIndex
  2135. MoveRest                ADD     Wrk2,Wrk2,#1
  2136.                         CMP     Wrk2,Tmp2
  2137.                         BLE     CutMoveCh
  2138.                         STR     Tmp1,LineIndex
  2139.                         LDMEA   SP!, {PC,Wrk1,Wrk2,Wrk3,Tmp1,Tmp2}
  2140. CutMoveCh               LDRB    Wrk1,[Wrk3,Wrk2]
  2141.                         STRB    Wrk1,[Wrk3,Tmp1]
  2142.                         ADD     Tmp1,Tmp1,#1
  2143.                         B       MoveRest
  2144.  
  2145. PutChInStoryBuffer      LDR     Wrk2,BufferIndex
  2146.                         LDR     Wrk3,BufferBase
  2147.                         LDR     Wrk1,ChSave
  2148.                         STRB    Wrk1,[Wrk3,Wrk2]
  2149.                         ADD     Wrk2,Wrk2,#1
  2150.                         STR     Wrk2,BufferIndex
  2151.                         LDMEA   SP!, {PC,Wrk1,Wrk2,Wrk3,Tmp1,Tmp2}
  2152.  
  2153. NewLine                 STMEA   SP!, {R14,Wrk1,Wrk2}
  2154.                         LDR     Wrk1,ScreenEnabled
  2155.                         TEQ     Wrk1,#0
  2156.                         BEQ     NewLineWriteLineBuffer
  2157.                         LDR     Wrk2,LineNo
  2158.                         LDR     Wrk1,WritingInWindow
  2159.                         TEQ     Wrk1,#0
  2160.                         ADDEQ   Wrk2,Wrk2,#1
  2161.                         STREQ   Wrk2,LineNo
  2162.                         LDR     Wrk1,ScrollBottom
  2163.                         CMP     Wrk2,Wrk1
  2164.                         BLE     NewLineWriteLineBuffer
  2165.                         LDR     Wrk1,ScrollTop
  2166.                         ADD     Wrk1,Wrk1,#1
  2167.                         STR     Wrk1,LineNo
  2168.                         SWI     OS_WriteS
  2169.                         .STRING "[MORE]"
  2170.                         SWI     OS_ReadC
  2171.                         SWI     OS_WriteS
  2172.                         .BLOCK  6,del
  2173.                         .BYTE   0
  2174.                         .ALIGN
  2175. NewLineWriteLineBuffer  BL      WriteLineBuffer
  2176.                         LDR     Wrk1,ScreenEnabled
  2177.                         TEQ     Wrk1,#0
  2178.                         BLNE    Scroll
  2179.                         LDR     Wrk1,PrinterEnabled
  2180.                         TEQ     Wrk1,#0
  2181.                         LDREQB  Wrk1,[CodeBase,#17.]
  2182.                         ANDEQ   Wrk1,Wrk1,#1
  2183.                         TEQEQ   Wrk1,#0
  2184.                         SWINE   OS_WriteI+2
  2185.                         SWINE   OS_WriteI+21.
  2186.                         SWINE   OS_NewLine
  2187.                         SWINE   OS_WriteI+6
  2188.                         SWINE   OS_WriteI+3
  2189.                         MOV     Wrk1,#0
  2190.                         STR     Wrk1,LineIndex
  2191. NewLineReturn           LDMEA   SP!, {PC,Wrk1,Wrk2}
  2192.  
  2193. WriteLineBuffer         STMEA   SP!, {R14,Wrk1,Wrk2,Wrk3}
  2194.                         LDR     Wrk2,LineIndex
  2195.                         TEQ     Wrk2,#0
  2196.                         LDMEQEA SP!, {PC,Wrk1,Wrk2,Wrk3}
  2197.                         LDR     Wrk1,WritingInWindow
  2198.                         TEQ     Wrk1,#0
  2199.                         BNE     WLBWriteIt
  2200.                         LDR     Wrk1,PrinterEnabled
  2201.                         TEQ     Wrk1,#0
  2202.                         LDREQB  Wrk1,[CodeBase,#17.]
  2203.                         ANDEQ   Wrk1,Wrk1,#1
  2204.                         TEQEQ   Wrk1,#0
  2205.                         SWINE   OS_WriteI+2
  2206. WLBWriteIt              LDR     Wrk1,ScreenEnabled
  2207.                         TEQ     Wrk1,#0
  2208.                         SWIEQ   OS_WriteI+21.
  2209.                         LDRNEB  Wrk1,CursorX
  2210.                         ADDNE   Wrk1,Wrk1,Wrk2
  2211.                         STRNEB  Wrk1,CursorX
  2212.                         ADR     Wrk3,LineBuffer
  2213. WLBWriteChar            LDRB    Wrk1,[Wrk3],#1
  2214.                         SWI     OS_WriteC
  2215.                         SUBS    Wrk2,Wrk2,#1
  2216.                         BNE     WLBWriteChar
  2217.                         SWI     OS_WriteI+6
  2218.                         SWI     OS_WriteI+3
  2219.                         SWI     OS_WriteI+31.
  2220.                         LDRB    R0,CursorX
  2221.                         SWI     OS_WriteC
  2222.                         LDRB    R0,CursorY
  2223.                         SWI     OS_WriteC
  2224.                         LDMEA   SP!, {PC,Wrk1,Wrk2,Wrk3}
  2225.  
  2226. PrintStatusLine         LDRB    Wrk1,[CodeBase,#0]
  2227.                         CMP     Wrk1,#4
  2228.                         MOVGE   PC,R14
  2229.                         STMEA   SP!, {R14,Tmp1,Tmp2}
  2230.                         BL      WriteLineBuffer
  2231.                         LDRB    R1,CursorX
  2232.                         LDRB    R2,CursorY
  2233. ;                       MOV     R0,#134.
  2234. ;                       SWI     OS_Byte
  2235.                         LDR     R3,WritingInWindow
  2236.                         STMEA   SP!, {R1,R2,R3}
  2237.                         BL      SetInverse
  2238.                         SWI     OS_WriteI+30.
  2239.                         MOV     Wrk1,#1
  2240.                         STR     Wrk1,WritingInWindow
  2241.                         MOV     Wrk1,#" "
  2242.                         LDR     Wrk2,ScreenWidth
  2243.                         ADR     Wrk3,LineBuffer
  2244. FillLineBuffer          STRB    Wrk1,[Wrk3],#1
  2245.                         SUBS    Wrk2,Wrk2,#1
  2246.                         BNE     FillLineBuffer
  2247.                         MOV     Wrk1,#1
  2248.                         STR     Wrk1,LineIndex
  2249.                         LDRB    Wrk2,[DataBase,#0]
  2250.                         LDRB    Wrk1,[DataBase,#1]
  2251.                         ORR     Wrk1,Wrk1,Wrk2,LSL #8
  2252.                         BL      WriteObjectName
  2253.                         LDR     Wrk1,ScreenWidth
  2254.                         SUB     Wrk1,Wrk1,#14.
  2255.                         STR     Wrk1,LineIndex
  2256.                         LDRB    Wrk1,[DataBase,#2]
  2257.                         LDRB    Tmp1,[DataBase,#3]
  2258.                         ORR     Tmp1,Tmp1,Wrk1,LSL #8
  2259.                         LDRB    Wrk1,[DataBase,#4]
  2260.                         LDRB    Tmp2,[DataBase,#5]
  2261.                         ORR     Tmp2,Tmp2,Wrk1,LSL #8
  2262.                         LDRB    Wrk3,[CodeBase,#1]
  2263.                         TST     Wrk3,#2
  2264.                         ADRNE   Wrk2,TimeString
  2265.                         ADREQ   Wrk2,ScoreString
  2266. WriteStatusString       LDRB    Wrk1,[Wrk2],#1
  2267.                         TEQ     Wrk1,#0
  2268.                         BEQ     ContinueStatus
  2269.                         BL      SendChToStoryOutput
  2270.                         B       WriteStatusString
  2271. ContinueStatus          TST     Wrk3,#2
  2272.                         BNE     WriteTime
  2273.                         MOV     R0,Tmp1
  2274.                         BL      WriteInteger
  2275.                         MOV     Wrk1,#"/"
  2276.                         BL      SendChToStoryOutput
  2277.                         MOV     R0,Tmp2
  2278.                         BL      WriteInteger
  2279.                         B       WriteStatusBuffer
  2280. WriteTime               CMP     Tmp1,#12.
  2281.                         SUBGT   R0,Tmp1,#12.
  2282.                         MOVLE   R0,Tmp1
  2283.                         TEQ     Tmp1,#0
  2284.                         MOVEQ   R0,#12.
  2285.                         BL      WriteInteger
  2286.                         MOV     Wrk1,#":"
  2287.                         BL      SendChToStoryOutput
  2288.                         CMP     Tmp2,#10.
  2289.                         MOVLT   R0,#"0"
  2290.                         BLLT    SendChToStoryOutput
  2291.                         MOV     R0,Tmp2
  2292.                         BL      WriteInteger
  2293.                         CMP     Tmp1,#12.
  2294.                         MOVLT   Wrk1,#"a"
  2295.                         MOVGT   Wrk1,#"p"
  2296.                         BL      SendChToStoryOutput
  2297.                         MOV     Wrk1,#"m"
  2298.                         BL      SendChToStoryOutput
  2299. WriteStatusBuffer       LDR     Wrk1,ScreenWidth
  2300.                         STR     Wrk1,LineIndex
  2301.                         BL      WriteLineBuffer
  2302.                         MOV     Wrk1,#0
  2303.                         STR     Wrk1,LineIndex
  2304.                         BL      SetNormal
  2305.                         LDMEA   SP!, {R1,R2,R3}
  2306.                         STR     R3,WritingInWindow
  2307.                         SWI     OS_WriteI+31.
  2308.                         MOV     R0,R1
  2309.                         SWI     OS_WriteC
  2310.                         MOV     R0,R2
  2311.                         SWI     OS_WriteC
  2312.                         LDMEA   SP!, {Tmp1,Tmp2,PC}
  2313.  
  2314. ClearLines              STMEA   SP!, {R14,R0-R2}
  2315.                         SWI     OS_WriteI+28.
  2316.                         SWI     OS_WriteI+0
  2317.                         MOV     R2,Wrk1
  2318.                         SUB     R0,Wrk2,#1
  2319.                         SWI     OS_WriteC
  2320.                         LDR     R0,ScreenWidth
  2321.                         SUB     R0,R0,#1
  2322.                         SWI     OS_WriteC
  2323.                         SUB     R0,R2,#1
  2324.                         SWI     OS_WriteC
  2325.                         SWI     OS_WriteI+12.
  2326.                         BL      SetWholeScreen
  2327.                         LDMEA   SP!, {PC,R0-R2}
  2328.  
  2329. ScoreString             .STRING "Score: "
  2330.                         .ALIGN
  2331. TimeString              .STRING "Time: "
  2332.                         .ALIGN
  2333.  
  2334. LineBuffer              .BLOCK  160.," "
  2335.                         .ALIGN
  2336.  
  2337. LastIndex               .WORD   0
  2338.  
  2339. NotImplemented          SWI     OS_WriteS
  2340.                         .STRING "Instruction not implemented: OpCode=&"
  2341.                         MOV     R0,OpCode
  2342.                         ADR     R1,HexStr
  2343.                         MOV     R2,#10.
  2344.                         SWI     OS_ConvertHex2
  2345.                         SWI     OS_Write0
  2346. WriteIPC                SWI     OS_WriteS
  2347.                         .STRING ", IPC=&"
  2348.                         SUB     R0,IPC,CodeBase
  2349.                         ADR     R1,HexStr
  2350.                         MOV     R2,#10.
  2351.                         SWI     OS_ConvertHex6
  2352.                         SWI     OS_Write0
  2353.                         SWI     OS_NewLine
  2354.                         B       ReturnToCaller
  2355.  
  2356. HexStr                  .BLOCK  24.," "
  2357.                         .ALIGN
  2358.  
  2359. MissingOperand          SWI     OS_WriteS
  2360.                         .STRING "Missing operand"
  2361.                         B       WriteIPC
  2362.  
  2363.                         .IF     Statistics
  2364.  
  2365. OpStatTableAdrs         .WORD   200000
  2366.  
  2367. CountStatistics         LDR     Opd0,OpStatTableAdrs
  2368.                         LDR     Opd1,[Opd0,OpCode,LSL #2]
  2369.                         ADD     Opd1,Opd1,#1
  2370.                         STR     Opd1,[Opd0,OpCode,LSL #2]
  2371.                         MOV     PC,R14
  2372.  
  2373.                         .ENDC
  2374.  
  2375.                         .IF     Debug
  2376.  
  2377. OSP                     .WORD   0
  2378. StackBaseAdrs           .WORD   StackBase
  2379.  
  2380. DebugCode               STR     SP,OSP
  2381.                         STMEA   SP!, {R14,R0,R1,R2,R3,R4}
  2382.                         SWI     OS_WriteS
  2383.                         .STRING "C "
  2384.                         SUB     R0,IPC,CodeBase
  2385.                         SUB     R0,R0,#1
  2386.                         ADR     R1,HexStr
  2387.                         MOV     R2,#10.
  2388.                         SWI     OS_ConvertHex6
  2389.                         SWI     OS_Write0
  2390.                         SWI     OS_WriteS
  2391.                         .STRING ": "
  2392.                         MOV     R0,OpCode
  2393.                         ADR     R1,HexStr
  2394.                         MOV     R2,#10.
  2395.                         SWI     OS_ConvertHex2
  2396.                         SWI     OS_Write0
  2397.                         MOV     R3,#0
  2398.                         SWI     OS_WriteS
  2399.                         .STRING " R:"
  2400.                         .ALIGN
  2401. DebugReg                SWI     OS_WriteI+" "
  2402.                         LDR     R0,[RegBase,R3,LSL #2]
  2403.                         ADR     R1,HexStr
  2404.                         MOV     R2,#10.
  2405.                         SWI     OS_ConvertHex4
  2406.                         SWI     OS_Write0
  2407.                         ADD     R3,R3,#1
  2408.                         CMP     R3,#0F
  2409.                         BLT     DebugReg
  2410.                         SWI     OS_WriteS
  2411.                         .STRING " S: "
  2412.                         LDR     R3,OSP
  2413.                         LDR     R2,StackBaseAdrs
  2414.                         LDR     R2,[R2]
  2415.                         SUB     R0,R3,R2
  2416.                         MOV     R0,R0,LSR #2
  2417.                         ADR     R1,HexStr
  2418.                         MOV     R2,#10.
  2419.                         SWI     OS_ConvertHex2
  2420.                         SWI     OS_Write0
  2421.                         LDR     R4,StackStart
  2422.                         LDR     R5,StackEnd
  2423. DebugStack              SWI     OS_WriteI+" "
  2424.                         LDR     R0,[R3,R4]
  2425.                         ADR     R1,HexStr
  2426.                         MOV     R2,#10.
  2427.                         SWI     OS_ConvertHex4
  2428.                         SWI     OS_Write0
  2429.                         SUB     R4,R4,#4
  2430.                         CMP     R4,R5
  2431.                         BGE     DebugStack
  2432. ;                       SWI     OS_ReadC
  2433.                         BL      SetScrollWindow
  2434.                         SWI     OS_NewLine
  2435.                         BL      SetWholeScreen
  2436.                         LDMEA   SP!, {PC,R0,R1,R2,R3,R4}
  2437.  
  2438. StackStart              .WORD   -4
  2439. StackEnd                .WORD   -24.
  2440.  
  2441.                         .ENDC
  2442.  
  2443. WTC                     BL      GetMultipleOperands
  2444.                         MOV     Wrk1,Opd0
  2445.                         BL      SendChToStoryOutput
  2446.                         B       MainLoop
  2447.  
  2448. MVE                     BL      GetOneOperand
  2449.                         MOV     Wrk2,Opd0
  2450.                         BL      GetWrkChkFromTOS
  2451.                         B       PutWrkMain
  2452.  
  2453. NEG1                    BL      GetOneOperand
  2454.                         MVN     Wrk1,Opd0
  2455.                         AND     Wrk1,Wrk1,Bit16Mask
  2456.                         B       PutWrkMain
  2457.  
  2458. RTT                     MOV     Opd0,#1
  2459.                         B       ReturnOpd0
  2460.  
  2461. RTF                     MOV     Opd0,#0
  2462.                         B       ReturnOpd0
  2463.  
  2464. WTX                     MOV     TxtIPC,IPC
  2465.                         BL      WriteText
  2466.                         MOV     IPC,TxtIPC
  2467.                         B       MainLoop
  2468.  
  2469. WTR                     MOV     TxtIPC,IPC
  2470.                         BL      WriteText
  2471.                         MOV     IPC,TxtIPC
  2472.                         BL      NewLine
  2473.                         B       RTT
  2474.  
  2475. NOP                     B       MainLoop
  2476.  
  2477. WTI                     BL      GetMultipleOperands
  2478.                         MOV     R0,Opd0
  2479.                         BL      WriteInteger
  2480.                         B       MainLoop
  2481.  
  2482. cRND                    BL      GetMultipleOperands
  2483.                         TEQ     Opd0,#0
  2484.                         BNE     CalcRandom
  2485.                         MOV     Wrk1,#0
  2486.                         B       PutWrkMain
  2487. CalcRandom              ADR     R1,TimeBlock
  2488.                         MOV     R0,#3
  2489.                         STR     R0,[R1,#0]
  2490.                         MOV     R0,#14.
  2491.                         SWI     OS_Word
  2492.                         MOV     Opd1,Opd0
  2493.                         TST     Opd1,#1<<15.
  2494.                         EORNE   Opd1,Opd1,Bit16Mask
  2495.                         ADDNE   Opd1,Opd1,#1
  2496.                         LDR     Opd0,[R1,#0]
  2497.                         LDR     R1,OldRandom
  2498.                         ADD     Opd0,Opd0,R1
  2499.                         AND     Opd0,Opd0,Bit16Mask,LSR #1
  2500.                         BL      Divide
  2501.                         ADD     Wrk1,Wrk1,#1
  2502.                         TST     Opd1,#1<<15.
  2503.                         EORNE   Wrk1,Wrk1,Bit16Mask
  2504.                         ADDNE   Wrk1,Wrk1,#1
  2505.                         STR     Wrk1,OldRandom
  2506.                         B       PutWrkMain
  2507.  
  2508. OldRandom               .WORD   0
  2509.  
  2510. TimeBlock               .BYTE   0
  2511.                         .BYTE   0
  2512.                         .BYTE   0
  2513.                         .BYTE   0
  2514.                         .BYTE   0
  2515.                         .ALIGN
  2516.  
  2517. PSH                     BL      GetMultipleOperands
  2518.                         STR     Opd0,[SP],#4
  2519.                         B       MainLoop
  2520.  
  2521. PUL                     BL      GetMultipleOperands
  2522.                         LDR     Wrk1,[SP,#-4]!
  2523.                         MOV     Wrk2,Opd0
  2524.                         B       PutWrkChkToTOSMain
  2525.  
  2526. JMP                     BL      GetOneOperand
  2527.                         MOV     Wrk1,Opd0
  2528.                         B       AddDistance
  2529.  
  2530. WTO                     BL      GetOneOperand
  2531.                         MOV     Wrk1,Opd0
  2532.                         BL      WriteObjectName
  2533.                         B       MainLoop
  2534.  
  2535. INC                     BL      GetOneOperand
  2536.                         MOV     Wrk2,Opd0
  2537.                         BL      GetWrkChkFromTOS
  2538.                         ADD     Wrk1,Wrk1,#1
  2539.                         AND     Wrk1,Wrk1,Bit16Mask
  2540.                         MOV     Wrk2,Opd0
  2541.                         B       PutWrkChkToTOSMain
  2542.  
  2543. DEC                     BL      GetOneOperand
  2544.                         MOV     Wrk2,Opd0
  2545.                         BL      GetWrkChkFromTOS
  2546.                         SUB     Wrk1,Wrk1,#1
  2547.                         AND     Wrk1,Wrk1,Bit16Mask
  2548.                         MOV     Wrk2,Opd0
  2549.                         B       PutWrkChkToTOSMain
  2550.  
  2551. WSB                     BL      GetOneOperand
  2552.                         ADD     TxtIPC,CodeBase,Opd0
  2553.                         B       WTXMain
  2554.  
  2555. CFC1                    BL      GetOneOperand
  2556.                         B       CallFunction
  2557.  
  2558. RMO                     BL      GetOneOperand
  2559.                         BL      RemoveObj
  2560.                         B       MainLoop
  2561.  
  2562. BPT                     SWI     OS_WriteS
  2563.                         .STRING "Breakpoint"
  2564.                         B       WriteIPC
  2565.  
  2566. LES                     BL      GetTwoOperands
  2567.                         TST     Opd0,#8000
  2568.                         ORRNE   Opd0,Opd0,Bit16Mask,LSL #16.
  2569.                         TST     Opd1,#8000
  2570.                         ORRNE   Opd1,Opd1,Bit16Mask,LSL #16.
  2571.                         CMP     Opd0,Opd1
  2572.                         BLT     HandleTrue
  2573.                         B       HandleFalse
  2574.  
  2575. GRT                     BL      GetTwoOperands
  2576.                         TST     Opd0,#8000
  2577.                         ORRNE   Opd0,Opd0,Bit16Mask,LSL #16.
  2578.                         TST     Opd1,#8000
  2579.                         ORRNE   Opd1,Opd1,Bit16Mask,LSL #16.
  2580.                         CMP     Opd0,Opd1
  2581.                         BGT     HandleTrue
  2582.                         B       HandleFalse
  2583.  
  2584. DLS                     BL      GetTwoOperands
  2585.                         TST     Opd0,#8000
  2586.                         ORRNE   Opd0,Opd0,Bit16Mask,LSL #16.
  2587.                         MOV     Wrk2,Opd0
  2588.                         BL      GetWrkChkFromTOS
  2589.                         TST     Wrk1,#8000
  2590.                         ORRNE   Wrk1,Wrk1,Bit16Mask,LSL #16.
  2591.                         SUB     Wrk3,Wrk1,#1
  2592.                         AND     Wrk1,Wrk3,Bit16Mask
  2593.                         MOV     Wrk2,Opd0
  2594.                         BL      PutWrkChkToTOS
  2595.                         CMP     Wrk3,Opd1
  2596.                         BLT     HandleTrue
  2597.                         B       HandleFalse
  2598.  
  2599. IGT                     BL      GetTwoOperands
  2600.                         TST     Opd0,#8000
  2601.                         ORRNE   Opd0,Opd0,Bit16Mask,LSL #16.
  2602.                         MOV     Wrk2,Opd0
  2603.                         BL      GetWrkChkFromTOS
  2604.                         TST     Wrk1,#8000
  2605.                         ORRNE   Wrk1,Wrk1,Bit16Mask,LSL #16.
  2606.                         ADD     Wrk3,Wrk1,#1
  2607.                         AND     Wrk1,Wrk3,Bit16Mask
  2608.                         MOV     Wrk2,Opd0
  2609.                         BL      PutWrkChkToTOS
  2610.                         CMP     Wrk3,Opd1
  2611.                         BGT     HandleTrue
  2612.                         B       HandleFalse
  2613.  
  2614. OIN                     BL      GetTwoOperands
  2615.                         MOV     Wrk1,Opd0
  2616.                         BL      CalcObjAdrs
  2617.                         LDRB    Wrk2,[CodeBase,#0]
  2618.                         CMP     Wrk2,#4
  2619.                         BGE     PlusOIN
  2620.                         LDRB    Wrk2,[Wrk1,#4]
  2621.                         B       OINCmpParent
  2622. PlusOIN                 LDRB    Wrk3,[Wrk1,#6]
  2623.                         LDRB    Wrk2,[Wrk1,#7]
  2624.                         ORR     Wrk2,Wrk2,Wrk3,LSL #8
  2625. OINCmpParent            CMP     Wrk2,Opd1
  2626.                         BNE     HandleFalse
  2627.                         BEQ     HandleTrue
  2628.  
  2629. SPS                     BL      GetTwoOperands
  2630.                         AND     Wrk1,Opd0,Opd1
  2631.                         AND     Wrk1,Wrk1,Bit16Mask
  2632.                         CMP     Wrk1,Opd1
  2633.                         BNE     HandleFalse
  2634.                         B       HandleTrue
  2635.  
  2636. LOR                     BL      GetTwoOperands
  2637.                         ORR     Wrk1,Opd0,Opd1
  2638.                         AND     Wrk1,Wrk1,Bit16Mask
  2639.                         B       PutWrkMain
  2640.  
  2641. cAND                    BL      GetTwoOperands
  2642.                         AND     Wrk1,Opd0,Opd1
  2643.                         AND     Wrk1,Wrk1,Bit16Mask
  2644.                         B       PutWrkMain
  2645.  
  2646. cADD                    BL      GetTwoOperands
  2647.                         ADD     Wrk1,Opd0,Opd1
  2648.                         AND     Wrk1,Wrk1,Bit16Mask
  2649.                         B       PutWrkMain
  2650.  
  2651. cSUB                    BL      GetTwoOperands
  2652.                         SUB     Wrk1,Opd0,Opd1
  2653.                         AND     Wrk1,Wrk1,Bit16Mask
  2654.                         B       PutWrkMain
  2655.  
  2656. cMUL                    BL      GetTwoOperands
  2657.                         MUL     Wrk1,Opd0,Opd1
  2658.                         AND     Wrk1,Wrk1,Bit16Mask
  2659.                         B       PutWrkMain
  2660.  
  2661. cDIV                    BL      GetTwoOperands
  2662.                         BL      Divide
  2663.                         MOV     Wrk1,Opd0
  2664.                         B       PutWrkMain
  2665.  
  2666. cMOD                    BL      GetTwoOperands
  2667.                         BL      Divide
  2668.                         B       PutWrkMain
  2669.  
  2670. Divide                  STMEA   SP!, {Tmp1,R14}
  2671.                         AND     Opd1,Opd1,Bit16Mask
  2672.                         TEQ     Opd1,#0
  2673.                         BEQ     DivideByZero
  2674.                         TST     Opd0,#1<<15.
  2675.                         RSBNE   Opd0,Opd0,#1<<16.
  2676.                         MOVNE   Wrk2,#1
  2677.                         MOVEQ   Wrk2,#0
  2678.                         TST     Opd1,#1<<15.
  2679.                         RSBNE   Opd1,Opd1,#1<<16.
  2680.                         EORNE   Wrk3,Wrk2,#1
  2681.                         EOREQ   Wrk3,Wrk2,#0
  2682.                         MOV     Opd0,Opd0,LSL #16.
  2683.                         MOV     Opd1,Opd1,LSL #16.
  2684.                         MOV     Wrk4,#16.
  2685.                         MOV     Wrk1,#0
  2686. \DivLoop                ADDS    Opd0,Opd0,Opd0
  2687.                         ADD     Wrk1,Wrk1,Wrk1
  2688.                         ORRCS   Wrk1,Wrk1,#1<<16.
  2689.                         CMP     Wrk1,Opd1
  2690.                         SUBHS   Wrk1,Wrk1,Opd1
  2691.                         ADDHS   Opd0,Opd0,#1
  2692.                         SUBS    Wrk4,Wrk4,#1
  2693.                         BNE     \DivLoop
  2694.                         MOV     Wrk1,Wrk1,LSR #16.
  2695.                         TEQ     Wrk3,#0
  2696.                         RSBNE   Opd0,Opd0,#1<<16.
  2697.                         TEQ     Wrk2,#0
  2698.                         RSBNE   Wrk1,Wrk1,#1<<16.
  2699.                         AND     Opd0,Opd0,Bit16Mask
  2700.                         AND     Wrk1,Wrk1,Bit16Mask
  2701.                         LDMEA   SP!, {Tmp1,PC}
  2702.  
  2703. DivideByZero            SWI     OS_WriteS
  2704.                         .STRING "Divide by zero"
  2705.                         B       WriteIPC
  2706.  
  2707. TSF                     BL      GetTwoOperands
  2708.                         MOV     Wrk1,Opd0
  2709.                         BL      CalcObjAdrs
  2710.                         MOV     Wrk2,Opd1,LSR #4
  2711.                         ADD     Wrk1,Wrk1,Wrk2,LSL #1
  2712.                         LDRB    Wrk3,[Wrk1]
  2713.                         LDRB    Wrk2,[Wrk1,#1]
  2714.                         ORR     Wrk2,Wrk2,Wrk3,LSL #8
  2715.                         MOV     Wrk3,#1000000000000000T
  2716.                         AND     Opd1,Opd1,#00001111T
  2717.                         TST     Wrk2,Wrk3,LSR Opd1
  2718.                         BNE     HandleTrue
  2719.                         BEQ     HandleFalse
  2720.  
  2721. SEF                     BL      GetTwoOperands
  2722.                         MOV     Wrk1,Opd0
  2723.                         BL      CalcObjAdrs
  2724.                         MOV     Wrk2,Opd1,LSR #4
  2725.                         ADD     Wrk1,Wrk1,Wrk2,LSL #1
  2726.                         LDRB    Wrk3,[Wrk1]
  2727.                         LDRB    Wrk2,[Wrk1,#1]
  2728.                         ORR     Wrk2,Wrk2,Wrk3,LSL #8
  2729.                         MOV     Wrk3,#1000000000000000T
  2730.                         AND     Opd1,Opd1,#00001111T
  2731.                         ORR     Wrk2,Wrk2,Wrk3,LSR Opd1
  2732.                         STRB    Wrk2,[Wrk1,#1]
  2733.                         MOV     Wrk2,Wrk2,LSR #8
  2734.                         STRB    Wrk2,[Wrk1]
  2735.                         B       MainLoop
  2736.  
  2737. CLF                     BL      GetTwoOperands
  2738.                         MOV     Wrk1,Opd0
  2739.                         BL      CalcObjAdrs
  2740.                         MOV     Wrk2,Opd1,LSR #4
  2741.                         ADD     Wrk1,Wrk1,Wrk2,LSL #1
  2742.                         LDRB    Wrk3,[Wrk1]
  2743.                         LDRB    Wrk2,[Wrk1,#1]
  2744.                         ORR     Wrk2,Wrk2,Wrk3,LSL #8
  2745.                         MOV     Wrk3,#1000000000000000T
  2746.                         AND     Opd1,Opd1,#00001111T
  2747.                         BIC     Wrk2,Wrk2,Wrk3,LSR Opd1
  2748.                         STRB    Wrk2,[Wrk1,#1]
  2749.                         MOV     Wrk2,Wrk2,LSR #8
  2750.                         STRB    Wrk2,[Wrk1]
  2751.                         B       MainLoop
  2752.  
  2753. SEW                     BL      GetTwoOperands
  2754.                         MOV     Wrk1,Opd1
  2755.                         MOV     Wrk2,Opd0
  2756.                         B       PutWrkChkToTOSMain
  2757.  
  2758. INS                     BL      GetTwoOperands
  2759.                         BL      RemoveObj
  2760.                         MOV     Wrk1,Opd0
  2761.                         BL      CalcObjAdrs
  2762.                         LDRB    Wrk2,[CodeBase,#0]
  2763.                         CMP     Wrk2,#4
  2764.                         BGE     PlusINS
  2765.                         STRB    Opd1,[Wrk1,#4]
  2766.                         MOV     Wrk4,Wrk1
  2767.                         MOV     Wrk1,Opd1
  2768.                         BL      CalcObjAdrs
  2769.                         LDRB    Wrk3,[Wrk1,#6]
  2770.                         STRB    Opd0,[Wrk1,#6]
  2771.                         STRB    Wrk3,[Wrk4,#5]
  2772.                         B       MainLoop
  2773. PlusINS                 STRB    Opd1,[Wrk1,#7]
  2774.                         MOV     Wrk3,Opd1,LSR #8
  2775.                         STRB    Wrk3,[Wrk1,#6]
  2776.                         MOV     Wrk4,Wrk1
  2777.                         MOV     Wrk1,Opd1
  2778.                         BL      CalcObjAdrs
  2779.                         LDRB    Wrk3,[Wrk1,#11.]
  2780.                         STRB    Opd0,[Wrk1,#11.]
  2781.                         STRB    Wrk3,[Wrk4,#9]
  2782.                         LDRB    Wrk3,[Wrk1,#10.]
  2783.                         MOV     Opd0,Opd0,LSR #8
  2784.                         STRB    Opd0,[Wrk1,#10.]
  2785.                         STRB    Wrk3,[Wrk4,#8]
  2786.                         B       MainLoop
  2787.  
  2788. LDW                     BL      GetTwoOperands
  2789.                         TST     Opd1,#1000000000000000T
  2790.                         ORRNE   Opd1,Opd1,Bit16Mask,LSL #16.
  2791.                         ADD     Wrk1,Opd0,Opd1,LSL #1
  2792.                         LDRB    Wrk2,[Wrk1,CodeBase]!
  2793.                         LDRB    Wrk1,[Wrk1,#1]
  2794.                         ORR     Wrk1,Wrk1,Wrk2,LSL #8
  2795.                         B       PutWrkMain
  2796.  
  2797. LDB                     BL      GetTwoOperands
  2798.                         ADD     Wrk1,Opd0,Opd1
  2799.                         LDRB    Wrk1,[Wrk1,CodeBase]
  2800.                         B       PutWrkMain
  2801.  
  2802. CFC2                    BL      GetTwoOperands
  2803.                         B       CallFunction
  2804.  
  2805. CPC2                    BL      GetTwoOperands
  2806. CallProcedure           MOV     Wrk1,#1
  2807.                         B       Call
  2808.  
  2809. N1B                     B       NotImplemented
  2810.  
  2811. RTM                     B       NotImplemented
  2812.  
  2813. DataNotFound            SWI     OS_WriteS
  2814.                         .STRING "Object property not found"
  2815.                         B       WriteIPC
  2816.  
  2817. DataNotWordOrByte       SWI     OS_WriteS
  2818.                         .STRING "Object property not word or byte"
  2819.                         B       WriteIPC
  2820.  
  2821. WriteInteger            STMEA   SP!, {R14}
  2822.                         ADR     R1,WTI_Buffer
  2823.                         MOV     R2,#7
  2824.                         SWI     OS_ConvertInteger2
  2825.                         MOV     R2,R0
  2826. WTI_Digit               LDRB    R0,[R2],#1
  2827.                         BL      SendChToStoryOutput
  2828.                         CMP     R2,R1
  2829.                         BNE     WTI_Digit
  2830.                         LDMEA   SP!, {PC}
  2831.  
  2832. WTI_Buffer              .STRING "       "
  2833.                         .ALIGN
  2834.  
  2835. JmpTable                .WORD    BPT, cEQU,  LES,  GRT,  DLS,  IGT,  OIN,  SPS
  2836.                         .WORD    LOR, cAND,  TSF,  SEF,  CLF,  SEW,  INS,  LDW
  2837.                         .WORD    LDB,  LOD,  LOA, cLNN, cADD, cSUB, cMUL, cDIV
  2838.                         .WORD   cMOD, CFC2, CPC2,  N1B,  RTM
  2839.                         .WORD   NotImplemented
  2840.                         .WORD   NotImplemented
  2841.                         .WORD   NotImplemented
  2842.   
  2843.                         .WORD   NotImplemented
  2844.                         .WORD   cEQU,  LES,  GRT,  DLS,  IGT,  OIN,  SPS,  LOR
  2845.                         .WORD   cAND,  TSF,  SEF,  CLF,  SEW,  INS,  LDW,  LDB
  2846.                         .WORD    LOD,  LOA, cLNN, cADD, cSUB, cMUL, cDIV, cMOD
  2847.                         .WORD   CFC2, CPC2,  N1B,  RTM
  2848.                         .WORD   NotImplemented
  2849.                         .WORD   NotImplemented
  2850.                         .WORD   NotImplemented
  2851.  
  2852.                         .WORD   NotImplemented
  2853.                         .WORD   cEQU,  LES,  GRT,  DLS,  IGT,  OIN,  SPS,  LOR
  2854.                         .WORD   cAND,  TSF,  SEF,  CLF,  SEW,  INS,  LDW,  LDB
  2855.                         .WORD    LOD,  LOA, cLNN, cADD, cSUB, cMUL, cDIV, cMOD
  2856.                         .WORD   CFC2, CPC2,  N1B,  RTM
  2857.                         .WORD   NotImplemented
  2858.                         .WORD   NotImplemented
  2859.                         .WORD   NotImplemented
  2860.  
  2861.                         .WORD   NotImplemented
  2862.                         .WORD   cEQU,  LES,  GRT,  DLS,  IGT,  OIN,  SPS,  LOR
  2863.                         .WORD   cAND,  TSF,  SEF,  CLF,  SEW,  INS,  LDW,  LDB
  2864.                         .WORD    LOD,  LOA, cLNN, cADD, cSUB, cMUL, cDIV, cMOD
  2865.                         .WORD   CFC2, CPC2,  N1B,  RTM
  2866.                         .WORD   NotImplemented
  2867.                         .WORD   NotImplemented
  2868.                         .WORD   NotImplemented
  2869.  
  2870.                         .WORD    EQN,  NXO,  FSO,  PTO,  LOS,  INC,  DEC,  WSB
  2871.                         .WORD   CFC1,  RMO,  WTO,  RTN,  JMP,  WSW,  MVE, NEG1
  2872.  
  2873.                         .WORD    EQN,  NXO,  FSO,  PTO,  LOS,  INC,  DEC,  WSB
  2874.                         .WORD   CFC1,  RMO,  WTO,  RTN,  JMP,  WSW,  MVE, NEG1
  2875.  
  2876.                         .WORD    EQN,  NXO,  FSO,  PTO,  LOS,  INC,  DEC,  WSB
  2877.                         .WORD   CFC1,  RMO,  WTO,  RTN,  JMP,  WSW,  MVE, NEG1
  2878.  
  2879.                         .WORD    RTT,  RTF,  WTX,  WTR,  NOP,  SVE,  RSO,  RST
  2880.                         .WORD    RPL,  DSC,  XIT,  NWL,  PSL,  VFY,  EXC
  2881.                         .WORD   NotImplemented
  2882.  
  2883.                         .WORD   NotImplemented
  2884.                         .WORD   cEQU,  LES,  GRT,  DLS,  IGT,  OIN,  SPS,  LOR
  2885.                         .WORD   cAND,  TSF,  SEF,  CLF,  SEW,  INS,  LDW,  LDB
  2886.                         .WORD    LOD,  LOA, cLNN, cADD, cSUB, cMUL, cDIV, cMOD
  2887.                         .WORD   CFC2, CPC2,  N1B,  RTM
  2888.                         .WORD   NotImplemented
  2889.                         .WORD   NotImplemented
  2890.                         .WORD   NotImplemented
  2891.  
  2892.                         .WORD    CFC,  STW,  STB,  SOD,  INP,  WTC,  WTI, cRND
  2893.                         .WORD    PSH,  PUL,  SPL, cPOS, CFCL,  ERS, cERL,  GYX
  2894.                         .WORD    M16,  SCM,  FRM,  OUT,  COM,  BEL,  INK,  MEQ
  2895.                         .WORD    NEG,  CPC, CPCL,  M27,  M28,  WDB,  M30,  M31
  2896.  
  2897. CopyrightText           .BYTE   13,0E5,70,88,51,2A,00,8E,4F,2A,5E,0B7,2B,2A
  2898.                         .BYTE   5C,00
  2899.                         .BYTE   11,14,57,0D7,39,8D,64,04,2E,0E6,4E,00,12,26
  2900.                         .BYTE   4D,06,63,2A,5C,05,24,0B1,16,25,0A0,84
  2901.                         .ALIGN
  2902.  
  2903. CopyRight
  2904.                         STMEA   SP!,{R14}
  2905.                         MOV     R0,#0
  2906.                         LDR     R1,BufferEnabledAdrs
  2907.                         STR     R0,[R1]
  2908.                         LDR     R1,PrinterEnabledAdrs
  2909.                         STR     R0,[R1]
  2910.                         LDR     R1,WritingInWindowAdrs
  2911.                         STR     R0,[R1]
  2912.                         LDR     R1,DirectEnabledAdrs
  2913.                         STR     R0,[R1]
  2914.                         MOV     R0,#1
  2915.                         LDR     R1,ScreenEnabledAdrs
  2916.                         STR     R0,[R1]
  2917.                         ADR     TxtIPC,CopyrightText
  2918.                         BL      WriteText
  2919.                         BL      NewLine
  2920.                         BL      NewLine
  2921.                         LDMEA   SP!,{PC}
  2922.                         
  2923. ScreenEnabledAdrs       .WORD   ScreenEnabled
  2924. BufferEnabledAdrs       .WORD   BufferEnabled
  2925. PrinterEnabledAdrs      .WORD   PrinterEnabled
  2926. DirectEnabledAdrs       .WORD   DirectEnabled
  2927. WritingInWindowAdrs     .WORD   WritingInWindow
  2928.  
  2929. ZIP_End
  2930.  
  2931.                         .END
  2932.  
  2933.