Home » Archimedes archive » Archimedes World » AW-1991-05.adf » May91 » !AWMay91/Goodies/PD/!PrBuffer/ModSrcCode

!AWMay91/Goodies/PD/!PrBuffer/ModSrcCode

This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.

Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.

Tape/disk: Home » Archimedes archive » Archimedes World » AW-1991-05.adf » May91
Filename: !AWMay91/Goodies/PD/!PrBuffer/ModSrcCode
Read OK:
File size: 4C61 bytes
Load address: 0000
Exec address: 0000
File contents
   10REM > src
   20REM Printer Buffer program.
   30REM Anton Carver. 24/9/88 - 28/9/88, 21/9/89 - 25/9/89.
   31REM see also 'ReadMe' and 'CopyRight'.
   40
   50REM define global register names.
   60pc= 15 : ln= 14 : sp= 13
   70rBufferNo= 1 : rWorkSpace= 12
   80
   90REM define useful immediate constants.
  100iCFlag= 1<<29 : iVFlag= 1<<28
  110iPrinter= 3 : iDefaultSize= 8*1024 : iCodeSize= &1000
  120iInsNo= &14 : iRemNo= &15 : iCnpNo= &16 : iErrorBase= &1000
  130
  140REM define workspace offsets.
  150oSpace= 0 : oPlace= 4 : oLook= 8 : oEnd= 12 : oSize= 16 : opc= 20
  160oEscape= 24 : oOldAddress= 28 : oOld12 = 32 : oBuffer= 36
  170
  180DIM lCode iCodeSize
  220FOR pass= 0 TO 2 STEP 2
  230P%= lCode
  240[ OPT pass
  260.lStart
  270FNheader
  280FNfinal                             ; Finalisation code.
  290FNinit                              ; Initialisation code.
  300FNservice                           ; Service Call Handler.
  310FNescape                            ; Handle Escape
  320FNnobuffer                          ; *NoBuffer
  330FNflush                             ; *Flush
  340FNbuffer                            ; *Buffer
  350FNremove                            ; RemV code.
  360FNcount                             ; CnpV code.
  370FNclaim                             ; OS_Claim, OS_Release Vectors.
  380FNinsert                            ; InsV code.
  390.lEnd
  400]
  410NEXT
  420*SET Pbuf$name PrintBuf
  430OSCLI"SAVE <Pbuf$name> "+STR$~lStart+" "+STR$~(lEnd+4)
  440*SetType <Pbuf$name> &ffa
  450END
  451
  460DEF FNheader
  470[ OPT pass
  471; Module Header Block
  480.lHeader
  490EQUD  0  ; no start code
  500EQUD  (lInit-lStart)                ; Initialisation Code
  510EQUD  (lFinal-lStart)               ; Finialistion Code
  520EQUD  (lService-lStart)             ; Service Entry, RESET
  530EQUD  (lModuleTitle-lStart)         ; Module Title
  540EQUD  (lModuleHelp-lStart)          ; Module Help
  550EQUD  (lKeywords-lStart)            ; Keywords block
  560EQUD  0
  570EQUD  0
  580EQUD  0
  590EQUD  0
  600.lModuleTitle
  610EQUS  "PrinterBuffer"
  620EQUD  0
  630ALIGN
  640.lModuleHelp
  650EQUS  "Printer Buffer"+CHR$(9)+"1.00 (01 Oct 1989)  Anton Carver"
  660EQUB  0
  670ALIGN
  680.lKeywords
  690EQUS  "Buffer"
  700EQUB  0
  710ALIGN
  720EQUD  (lBufferCode-lStart)
  730EQUW  0                             ; min parameters
  740EQUW  1                             ; max parameters
  750EQUD  (lBufferSyntax-lStart)
  760EQUD  (lBufferHelp-lStart)
  770
  780EQUS  "NoBuffer"
  790EQUB  0
  800ALIGN
  810EQUD  (lNoBufferCode-lStart)
  820EQUW  0                             ; min parameters
  830EQUW  0                             ; max parameters
  840EQUD  (lNoBufferSyntax-lStart)
  850EQUD  (lNoBufferHelp-lStart)
  860
  870EQUS  "Flush"
  880EQUB  0
  890ALIGN
  900EQUD  (lFlushCode-lStart)
  910EQUW  0                             ; min parameters
  920EQUW  0                             ; max parameters
  930EQUD  (lFlushSyntax-lStart)
  940EQUD  (lFlushHelp-lStart)
  950EQUD  0                             ; keyword table terminator
  960.lBufferSyntax
  970EQUS  "Syntax:"+CHR$(9)+"*Buffer [<size>[k]]"+CHR$(13)
  980EQUB  0
  990ALIGN
 1000.lBufferHelp
 1010EQUS  "*Buffer used to create a printer buffer of specified size. "
 1020EQUS  "The default buffer size is 8k."
 1030EQUS  CHR$(13)+"Syntax:"+CHR$(9)+"*Buffer [<size>[k]]"+CHR$(13)
 1040EQUB 0
 1050ALIGN
 1060.lNoBufferSyntax
 1070EQUS  "Syntax:"+CHR$(9)+"*NoBuffer"+CHR$(13)
 1080EQUB  0
 1090ALIGN
 1100.lNoBufferHelp
 1110EQUS  "*NoBuffer deselects the previously created buffer and frees "
 1120EQUS  "the memory."+CHR$(13)
 1130EQUB  0
 1140ALIGN
 1150.lFlushSyntax
 1160EQUS  "Syntax:"+CHR$(9)+"*Flush"+CHR$(13)
 1170EQUB  0
 1180.lFlushHelp
 1190EQUS  "*Flush clears current contents of the buffer without deselecting "
 1200EQUS  "it. Use this to clear information you no longer want to print. "
 1210EQUS  "It is exactly equivalent to: "
 1220EQUS  "*FX"+CHR$(31)+"21"+CHR$(31)+"3"+CHR$(13)
 1230EQUB  0
 1240ALIGN
 1250]
 1260=""
 1270DEF FNescape
 1280[ OPT pass
 1281; Trap escape flag it, then pass to old handler.
 1282; Used to prevent Escape from clearing the buffer.
 1283; entry - r11 bit 6=1 -> escape
 1284;         r12 - pointer to workspace
 1290.lEscape
 1300STR   r0, [sp, #-4]                 ; forge r0 onto stack.
 1301AND   r0, r11, #(1<<6)              ; r11 bit 6=1 -> escape.
 1302TEQ   r0, #0
 1310MOVNE r0, #1                        ; if escape then flag.
 1320STRNE r0, [r12, #oEscape]
 1330LDR   r0, [r12, #oOldAddress]       ;
 1340STMFD (sp)!, {r0}                   ; forge old address onto stack
 1350SUB   sp, sp, #4                    ;
 1360LDR   r12, [r12, #oOld12]           ; load old value of r12
 1370LDMFD (sp)!, {r0, pc}               ; pass to old handler
 1380]
 1390=""
 1400DEF FNservice
 1410[ OPT pass
 1411; Service call reclaims the vectors after a non-fatal reset.
 1412; entry - r12 - pointer to the private word.
 1420.lService
 1430STMFD (sp)!, {r0, r5, ln}
 1440TEQ   r1, #&27                      ; reset
 1450LDMNEFD  (sp)!, {r0, r5, pc}^
 1460LDR   r5, [r12]
 1470BL    lClaim_Vector
 1480LDMFD (sp)!, {r0, r5, pc}^
 1490]
 1500=""
 1510DEF FNinit
 1520LOCAL rTmp, rWorkSpace
 1530rTmp=3 : rWorkSpace= 2
 1540[ OPT pass
 1550; Entry  - r12 - pointer to private word.
 1560;          r10 - pointer to arg.
 1570; Exit   - V=1 -> error - r0 - error pointer.
 1580; Purpose- Initialise module.
 1590.lInit
 1600STMFD    (sp)!, {r1, r5, r6, ln}    ; store registers.
 1610LDR      r5, [r12]                  ; r12 is a pointer to the private word
 1620TEQ      r5, #0                     ; private word<>0 -> Tidy.
 1630BNE      lTidy
 1640MOV      r1, r10                    ; r10 is pointer to arg.
 1650MOV      r6, #iDefaultSize
 1660LDRB     r0, [r1]                   ; r1 pointers to arg.
 1670CMP      r0, #32                    ; char>=32 -> arg.
 1680BLHS     lEvaluate_Arg
 1690LDMVSFD  (sp)!, {r1, r5, r6, pc}    ; return if error.
 1700TEQ      r6, #0
 1710LDMEQFD  (sp)!, {r1, r5, r6, pc}    ; return if no space required.
 1720BL       lClaim_Space
 1730LDMVSFD  (sp)!, {r1, r5, r6, pc}    ; return if error.
 1740BL       lClaim_Vector
 1750LDMFD    (sp)!, {r1, r5, r6, pc}    ; return.
 1760.lTidy
 1770LDR    r6, [r5, #oSize]
 1780BL     lClaim_Vector
 1790LDMFD  (sp)!, {r1, r5, r6, pc}
 1800
 1801; Find the value of the [<size>[k]] argument default 8k.
 1810; Entry - r1 - pointer to arg.
 1820; Exit  - r6 - size in bytes. or V=1 -> error - r0 - error pointer.
 1830.lEvaluate_Arg
 1840STMFD (sp)!, {r0, r2, ln}
 1850MOV   r0, #10                       ; conversion in base 10.
 1860ORR   r0, r0, #(1<<29)              ; bit 29 indicates limit in r2.
 1870MOV   r2, #4096                     ; values bigger then 4096 are silly.
 1880SWI   "XOS_ReadUnsigned"
 1890ADDVS sp, sp, #4
 1900LDMVSFD (sp)!, {r2, pc}             ; return if error.
 1910MOV   r6, r2, ASL #10               ; r6 in bytes, r2 in kbytes.
 1920LDRB  r0, [r1], #1                  ; r0= char.
 1930CMP   r0, #33
 1940BLO   lCheckTail
 1950TEQ   r0, #ASC("K")
 1960BEQ   lCheckTail
 1970TEQ   r0, #ASC("k")
 1980BNE   lArgError
 1990.lCheckTail
 2000TEQ   r0, #13
 2010LDMEQFD  (sp)!, {r0, r2, pc}        ; found <cr> -> terminate.
 2020LDRB  r0, [r1], #1
 2030CMP   r0, #33
 2040BLO   lCheckTail                    ; okay if char<33, else error.
 2050.lArgError
 2060ADR   r0, lArgErrorBlock            ; set error pointer.
 2070SWI   "XOS_GenerateError"           ; V=1 - indicates error.
 2080ADD   sp, sp, #4
 2090LDMFD (sp)!, {r2, pc}
 2100.lArgErrorBlock
 2110EQUD  iErrorBase+0
 2120EQUS  "Argument Syntax: <size>[k]"
 2130EQUB  0
 2140ALIGN
 2141
 2142; Claim Space for the buffer and initialise values
 2150; Entry - r6 - size of buffer in bytes.
 2160;         r12 - pointer the private word.
 2170; Exit  - V=1, r0 - pointer to error block.
 2171;         r5 - workspace pointer
 2180.lClaim_Space
 2190STMFD (sp)!, {r2, r3, ln}
 2200ADD   r3, r6, #oBuffer              ; workspace= buffersize+other
 2210MOV   r0, #6                        ; claim workspace
 2220SWI   "XOS_Module"
 2230LDMVSFD (sp)!, {r2, r3, pc}         ; return on error.
 2240STR   r2, [r12]                     ; private word = workspace pointer
 2250MOV   r5, r2                        ; r5, is returned value.
 2260MOV   rTmp, #oBuffer                ; Find address of buffer start.
 2270STR   rTmp, [rWorkSpace, #oPlace]   ; Store this in place to insert.
 2280STR   rTmp, [rWorkSpace, #oLook]    ; Store this in place to look.
 2290ADD   rTmp, rTmp, r6                ; End= Start + Size.
 2300STR   rTmp, [rWorkSpace, #oEnd]     ; Store this in end of buffer.
 2310STR   r6, [rWorkSpace, #oSize]      ; Store Size of buffer.
 2320STR   r6, [rWorkSpace, #oSpace]     ; Store this in amount of space.
 2330MOV   rTmp, #0                      ; Reset escape flag.
 2340STR   rTmp, [rWorkSpace, #oEscape]
 2350LDMFD (sp)!, {r2, r3, pc}
 2370]
 2380=""
 2390DEF FNbuffer
 2400[ OPT pass
 2401; Code for the *Buffer [<size>[k]] command.
 2410; Entry - r1 - no. of args
 2420;         r0 - pointer to args.
 2421;         r12 - pointer to workspace
 2430.lBufferCode
 2440STMFD (sp)!, {r1, r6, ln}
 2450BL    lNoBufferCode                 ; deallocate any previous buffer.
 2460LDMVSFD (sp)!, {r1, r6, pc}
 2470MOV   r6, #iDefaultSize
 2480TEQ   r1, #0                        ; r1 is number of args.
 2490MOVNE r1, r0
 2500BLNE  lEvaluate_Arg
 2510LDMVSFD (sp)!, {r1, r6, pc}
 2520TEQ   r6, #0
 2530LDMEQFD (sp)!, {r1, r6, pc}         ; if size=0 do not claim.
 2540BL    lClaim_Space
 2550LDMVSFD (sp)!, {r1, r6, pc}
 2560BL    lClaim_Vector
 2570LDMFD (sp)!, {r1, r6, pc}
 2580]
 2590=""
 2600DEF FNfinal
 2610[ OPT pass
 2611; Finialisation Code, called by *RMKill, *RMClear, *RMTidy. etc.
 2620; Entry - r10 - fatality indicator, r10=0 means non-fatal
 2630;         r12 - pointer to the private word.
 2631; Exit  - r0 = ?
 2640.lFinal
 2650STMFD (sp)!, {r1, r2, r5, ln}
 2660TEQ   r10, #0
 2670BEQ   lNon_Fatal
 2680MOV   r0, #152                      ; examine buffer.
 2690MOV   r1, #3
 2700SWI   "XOS_Byte"
 2710LDMVSFD (sp)!, {r1, r2, r5, pc}
 2720BCC   lInUseError                   ; the buffer is not empty.
 2730.lNon_Fatal
 2740LDR   r5, [r12]                     ; r5 is workspace pointer.
 2750TEQ   r5, #0
 2760BLNE  lRestore_Vector               ; only if workspace exists.
 2770LDMFD (sp)!, {r1, r2, r5, pc}
 2780.lInUseError
 2790SWI   "XOS_GenerateError"
 2800ADR    r0, lInUseErrorBlock
 2810LDMFD (sp)!, {r1, r2, r5, pc}
 2820.lInUseErrorBlock
 2830EQUD  iErrorBase+1
 2840EQUS  "Printer Buffer currently in use (*Flush will clear)."
 2850EQUB  0
 2860ALIGN
 2870;
 2880]
 2890=""
 2900DEF FNnobuffer
 2910[ OPT pass
 2911; Code for the *NoBuffer command
 2912; Entry - r12 - pointer to workspace.
 2920.lNoBufferCode
 2930STMFD (sp)!, {r0, r1, r2, r10, ln}
 2940MOV   r10, #1
 2950BL    lFinal
 2960ADDVS sp, sp, #4                       ; pop r0 so not restored
 2970LDMVSFD (sp)!, {r1, r2, r10, pc}       ; return if error.
 2980LDR   r2, [r12]                        ; get workspace pointer.
 2990TEQ   r2, #0
 3000LDMEQFD (sp)!, {r0, r1, r2, r10, pc}   ; return if no workspace.
 3010.lRestore_Space
 3020MOV   r0, #7                           ; free workspace.
 3030SWI   "XOS_Module"
 3040MOV   r2, #0
 3050STR   r2, [r12]                        ; reset value of private word.
 3060ADDVS sp, sp, #4                       ; pop r0 so not restored.
 3070LDMVSFD (sp)!, {r1, r2, r10, pc}
 3080LDMFD (sp)!, {r0, r1, r2, r10, pc}
 3090]
 3100=""
 3110DEF FNflush
 3120[ OPT pass
 3121; Code for the *Flush command. Equivalent to *FX 21,3.
 3130.lFlushCode
 3140STMFD (sp)!, {r0, r1, ln}
 3150MOV   r0, #21
 3160MOV   r1, #3
 3170SWI   "XOS_Byte"
 3180LDMVCFD (sp)!, {r0, r1, pc}
 3190ADD   sp, sp, #4
 3200LDMFD (sp)!, {r1, pc}
 3210]
 3220=""
 3230DEF FNinsert
 3240LOCAL rChar, rReturn, rPlace, rSpace, rEnd
 3250rChar= 0 : rReturn= 2
 3260rPlace= 3 : rSpace= rPlace : rEnd= 4
 3270[ OPT pass
 3280; InsV  - Insert Vector Code.
 3290; Entry - r0= char to insert, r1= buffer no.
 3300; Exit  - r2= ?, C=1 insertion failed.
 3310.lInsV
 3320 TEQ     rBufferNo, #iPrinter           ; Insert in Printer Buffer?
 3330 MOVNES  pc, ln                         ; No, Pass on.
 3340.lInsert
 3350 LDMFD   (sp)!, {rReturn}               ; Get Return Address.
 3360 STMFD   (sp)!, {rSpace}                ; Push Register.
 3370 LDR     rSpace, [rWorkSpace,#oSpace]   ; Load Space in Buffer.
 3380 TEQ     rSpace, #0                     ; How much space in Buffer?
 3390 LDMFD   (sp)!, {rSpace}                ; Restore Register.
 3400 ORREQS  pc, rReturn, #iCFlag           ; No Space, Return with Carry Set.
 3410 STMFD   (sp)!, {rPlace, rEnd}          ; Push Registers.
 3420 LDR     rPlace, [rWorkSpace, #oPlace]  ; Load Registers, Place.
 3430 LDR     rEnd, [rWorkSpace, #oEnd]      ;                 End.
 3440 BIC     rReturn, rReturn, #iCFlag      ; Clear Carry flag for Return.
 3450 STRB    rChar, [rWorkSpace, rPlace]    ; Store Character in Buffer.
 3460 ADD     rPlace, rPlace, #1             ;
 3470 TEQ     rPlace, rEnd                   ; Are we at end of Buffer.
 3480 MOVEQ   rPlace, #oBuffer               ; Yes, go back to start.
 3490 STR     rPlace, [rWorkSpace, #oPlace]  ; Store new place.
 3500 LDR     rSpace, [rWorkSpace, #oSpace]  ; Load amount of space.
 3510 SUB     rSpace, rSpace, #1             ; Decrement space.
 3520 STR     rSpace, [rWorkSpace, #oSpace]  ; Store new space.
 3530 LDMFD   (sp)!, {rPlace, rEnd}          ; Restore Registers.
 3540 MOVS    pc, rReturn                    ; Return with Carry Clear.
 3550]
 3560=""
 3570DEF FNremove
 3580LOCAL rExamine, rRemoved, rSpace, rLook, rEnd
 3590rExamine= 0 : rRemoved= 2
 3600rSpace= 1 : rLook= rSpace : rEnd= 4
 3610[ OPT pass
 3620; RemV  - Remove/Examine Vector code.
 3630; Entry - r1= buffer no., V=1 means examine, V=0 means remove.
 3640; Exit  - r2= char returned or examined, C=1 buffer was empty.
 3650.lRemV
 3660 STR     pc, [rWorkSpace, #opc]          ; store away PSR.
 3670 TEQ     rBufferNo, #iPrinter            ; Remove from Printer Buffer?
 3680 MOVNES  pc, ln                          ; No, Pass on.
 3690.lRemFunction
 3700 STMFD   (sp)!, {rSpace,rEnd}            ; Push Register.
 3710 LDR     rSpace, [rWorkSpace, #oSpace]   ; Load amount of space.
 3720 LDR     rEnd, [rWorkSpace, #oSize]
 3730 TEQ     rSpace, rEnd                    ; Space=Size -> Empty
 3740 BNE     lnot_empty
 3750 LDR     rSpace, [sp,#8]                 ; forge C set on stack.
 3760 ORR     rSpace, rSpace, #iCFlag
 3770 STR     rSpace, [sp,#8]
 3780 LDMEQFD (sp)!, {rSpace, rEnd, pc}^      ; Return if empty, C=1.
 3790
 3800.lnot_empty
 3810 LDR     rSpace, [sp,#8]                 ; forge C clear on stack.
 3820 BIC     rSpace, rSpace, #iCFlag
 3830 STR     rSpace, [sp,#8]
 3840 LDR     rLook, [rWorkSpace, #opc]       ; get PSR on entry
 3850 TEQP    pc, rLook
 3860 BVC     lRemove                         ; If V=0 then branch to Remove.
 3870 LDR     rLook, [rWorkSpace, #oLook]     ; Load pointer to char to remove.
 3880 LDRB    rExamine, [rWorkSpace, rLook]   ; Load char value.
 3890 MOV     rRemoved, rExamine
 3900 LDMFD   (sp)!, {rSpace, rEnd, pc}^
 3910                                         ; Remove Character.
 3920.lRemove
 3930 LDR     rLook, [rWorkSpace, #oLook]     ; Load pointer to char to remove.
 3940 LDR     rEnd, [rWorkSpace, #oEnd]       ; Load pointer to end of buffer.
 3950 LDRB    rRemoved, [rWorkSpace, rLook]   ; Load char value, and remove.
 3960 ADD     rLook, rLook, #1                ; increment look pointer
 3970 MOV     rExamine, rRemoved
 3980 TEQ     rLook, rEnd                     ; Are we at end of Buffer?
 3990 MOVEQ   rLook, #oBuffer                 ; Yes, go back to start.
 4000 STR     rLook, [rWorkSpace, #oLook]     ; Save new place to look.
 4010 LDR     rSpace, [rWorkSpace, #oSpace]   ; Load amount of space in buffer.
 4020 ADD     rSpace, rSpace, #1              ; Inc. space - one less char.
 4030 STR     rSpace, [rWorkSpace, #oSpace]   ; Save amount of space.
 4040 LDMFD   (sp)!, {rSpace, rEnd, pc}^      ; Restore Registers.
 4050]
 4060=""
 4070DEF FNcount
 4080LOCAL rCountL, rCountH, rSize, rSpace, rTmp, iBot8
 4090rCountL= 1 : rCountH= 2
 4100rSpace= rCountL : rSize= rCountH : rTmp= 0
 4110iBot8= &FF
 4120[ OPT pass
 4130; CnpV  - Count/Purge Vector Code.
 4140; Entry - r1= buffer no., V=0 -> count, C=0 -> entries, C=1 -> space
 4150;                         V=1 -> purge.
 4160; Exit  - r0= ?, if V=0 then r1= count (bottom 8); r2= count (top 24).
 4170.lCnpV
 4180 STR     pc, [rWorkSpace, #opc]
 4190 TEQ     rBufferNo, #iPrinter          ; Count/Purge Printer Buffer?
 4200 MOVNES  pc, ln                        ; No, Pass on.
 4210.lCnpFunction
 4220 LDR     r0, [rWorkSpace, #opc]        ; store PSR
 4230 TEQP    pc, r0
 4240 BVS     lPurge                        ; if V=1 then branch to purge.
 4250
 4260.lCount                                ; Count entries/space.
 4270 LDR     rCountL, [rWorkSpace, #oSpace] ; Load amount of space.
 4280 BLCC    lEntry                        ; if C=0 then subroutine entries.
 4290 MOV     rCountH, rCountL, ASR #8      ; Get top 24 bits of count.
 4300 AND     rCountL, rCountL, #iBot8      ; Get bottom 8 bits of count.
 4310 LDMFD   (sp)!, {pc}^                  ; Get Return Address.
 4320
 4330.lEntry                                ; Count entries.
 4340 LDR     rSize, [rWorkSpace, #oSize]   ; Load size of buffer.
 4350 SUB     rCountL, rSize, rSpace        ; Entries= Size - Space.
 4360 MOV     pc, ln                        ; Return.
 4370
 4380.lPurge                                ; Purge Buffer.
 4390 LDR     rTmp, [rWorkSpace, #oEscape]
 4400 TEQ     rTmp, #0                      ; Do not flush buffer if vector..
 4401 MOV     rTmp, #0                      ; ..called by escape handler!
 4402 STR     rTmp, [rWorkSpace, #oEscape]
 4410 LDMNEFD (sp)!, {pc}^                  ; return if Escape Condition.
 4430 MOV     rTmp, #oBuffer                ; Find address of buffer start.
 4440 STR     rTmp, [rWorkSpace, #oPlace]   ; Store this in place to insert.
 4450 STR     rTmp, [rWorkSpace, #oLook]    ; Store this in place to look.
 4460 LDR     rTmp, [rWorkSpace, #oSize]    ; Find Size of buffer.
 4470 STR     rTmp, [rWorkSpace, #oSpace]   ; Store this in amount of space.
 4480 LDMFD   (sp)!, {pc}^                  ; Return.
 4490]
 4500=""
 4510DEF FNclaim
 4520LOCAL rVector, rAddress, rGive, rWorkSpace
 4530rVector= 0 : rAddress= 1 : rGive= 2
 4540rTmp= rVector : rWorkSpace= 5
 4550[ OPT pass
 4560; Entry - r5 - pointer to workspace
 4570; Claim - Code to Claim the vectors, initialise the buffer.
 4580.lClaim_Vector
 4590 STMFD   (sp)!, {rAddress, rGive, ln}
 4600 MOV     r0, #9
 4610 ADR     r1, lEscape
 4620 MOV     r2, rWorkSpace
 4630 SWI     "XOS_ChangeEnvironment"       ; Claim escape handler.
 4640 LDMVSFD (sp)!, {rAddress, rGive, pc}
 4650 STR     r1, [rWorkSpace, #oOldAddress]
 4660 STR     r2, [rWorkSpace, #oOld12]     ; Store old escape handler.
 4670 MOV     rVector, #iInsNo
 4680 ADR     rAddress, lInsV
 4690 MOV     rGive, rWorkSpace
 4700 SWI     "XOS_Claim"                   ; Claim InsV.
 4710 LDMVSFD (sp)!, {rAddress, rGive, pc}
 4720 MOV     rVector, #iRemNo
 4730 ADR     rAddress, lRemV
 4740 MOV     rGive, rWorkSpace
 4750 SWI     "XOS_Claim"                   ; Claim RemV.
 4760 LDMVSFD (sp)!, {rAddress, rGive, pc}
 4770 MOV     rVector, #iCnpNo
 4780 ADR     rAddress, lCnpV
 4790 MOV     rGive, rWorkSpace
 4800 SWI     "XOS_Claim"                   ; Claim CnpV.
 4810 LDMFD   (sp)!, {rAddress, rGive, pc}
 4820; Restore - Code to restore the vectors to use previous buffer.
 4830.lRestore_Vector
 4840 STMFD   (sp)!, {rAddress, rGive, ln}
 4850 MOV     r0, #9
 4860 LDR     r1, [rWorkSpace, #oOldAddress]
 4870 LDR     r2, [rWorkSpace, #oOld12]
 4880 SWI     "XOS_ChangeEnvironment"       ; Restore escape handler.
 4890 LDMVSFD (sp)!, {rAddress, rGive, pc}
 4900 MOV     rVector, #iInsNo
 4910 ADR     rAddress, lInsV
 4920 MOV     rGive, rWorkSpace
 4930 SWI     "XOS_Release"                 ; Release InsV.
 4940 LDMVSFD (sp)!, {rAddress, rGive, pc}
 4950 MOV     rVector, #iRemNo
 4960 ADR     rAddress, lRemV
 4970 MOV     rGive, rWorkSpace
 4980 SWI     "XOS_Release"                 ; Release RemV.
 4990 LDMVSFD (sp)!, {rAddress, rGive, pc}
 5000 MOV     rVector, #iCnpNo
 5010 ADR     rAddress, lCnpV
 5020 MOV     rGive, rWorkSpace
 5030 SWI     "XOS_Release"                 ; Release CnpV.
 5040 LDMFD   (sp)!, {rAddress, rGive, pc}
 5050]
 5060=""

� > src
� Printer Buffer program.
9� Anton Carver. 24/9/88 - 28/9/88, 21/9/89 - 25/9/89.
(� see also 'ReadMe' and 'CopyRight'.
(
2#� define global register names.
<pc= 15 : ln= 14 : sp= 13
F!rBufferNo= 1 : rWorkSpace= 12
P
Z(� define useful immediate constants.
d!iCFlag= 1<<29 : iVFlag= 1<<28
n9iPrinter= 3 : iDefaultSize= 8*1024 : iCodeSize= &1000
x?iInsNo= &14 : iRemNo= &15 : iCnpNo= &16 : iErrorBase= &1000
�
�� define workspace offsets.
�EoSpace= 0 : oPlace= 4 : oLook= 8 : oEnd= 12 : oSize= 16 : opc= 20
�=oEscape= 24 : oOldAddress= 28 : oOld12 = 32 : oBuffer= 36
�
�� lCode iCodeSize
�� pass= 0 � 2 � 2
�
P%= lCode
�[ OPT pass
.lStart
�header
;�final                             ; Finalisation code.
"=�init                              ; Initialisation code.
,>�service                           ; Service Call Handler.
66�escape                            ; Handle Escape
@2�nobuffer                          ; *NoBuffer
J/�flush                             ; *Flush
T0�buffer                            ; *Buffer
^3�remove                            ; RemV code.
h3�count                             ; CnpV code.
rF�claim                             ; OS_Claim, OS_Release Vectors.
|3�insert                            ; InsV code.
�	.lEnd
�]
��
�*SET Pbuf$name PrintBuf
�0�"SAVE <Pbuf$name> "+�~lStart+" "+�~(lEnd+4)
�*SetType <Pbuf$name> &ffa
��
�
�
� �header
�[ OPT pass
�; Module Header Block
�.lHeader
�EQUD  0  ; no start code
�=EQUD  (lInit-lStart)                ; Initialisation Code
�;EQUD  (lFinal-lStart)               ; Finialistion Code
>EQUD  (lService-lStart)             ; Service Entry, RESET
6EQUD  (lModuleTitle-lStart)         ; Module Title
5EQUD  (lModuleHelp-lStart)          ; Module Help
&8EQUD  (lKeywords-lStart)            ; Keywords block
0EQUD  0
:EQUD  0
DEQUD  0
NEQUD  0
X.lModuleTitle
bEQUS  "PrinterBuffer"
lEQUD  0
v	ALIGN
�.lModuleHelp
�BEQUS  "Printer Buffer"+�(9)+"1.00 (01 Oct 1989)  Anton Carver"
�EQUB  0
�	ALIGN
�.lKeywords
�EQUS  "Buffer"
�EQUB  0
�	ALIGN
�EQUD  (lBufferCode-lStart)
�8EQUW  0                             ; min parameters
�8EQUW  1                             ; max parameters
� EQUD  (lBufferSyntax-lStart)
�EQUD  (lBufferHelp-lStart)

EQUS  "NoBuffer"
EQUB  0
 	ALIGN
* EQUD  (lNoBufferCode-lStart)
48EQUW  0                             ; min parameters
>8EQUW  0                             ; max parameters
H"EQUD  (lNoBufferSyntax-lStart)
R EQUD  (lNoBufferHelp-lStart)
\
fEQUS  "Flush"
pEQUB  0
z	ALIGN
�EQUD  (lFlushCode-lStart)
�8EQUW  0                             ; min parameters
�8EQUW  0                             ; max parameters
�EQUD  (lFlushSyntax-lStart)
�EQUD  (lFlushHelp-lStart)
�BEQUD  0                             ; keyword table terminator
�.lBufferSyntax
�4EQUS  "Syntax:"+�(9)+"*Buffer [<size>[k]]"+�(13)
�EQUB  0
�	ALIGN
�.lBufferHelp
�GEQUS  "*Buffer used to create a printer buffer of specified size. "
�*EQUS  "The default buffer size is 8k."
:EQUS  �(13)+"Syntax:"+�(9)+"*Buffer [<size>[k]]"+�(13)

EQUB 0
	ALIGN
$.lNoBufferSyntax
.*EQUS  "Syntax:"+�(9)+"*NoBuffer"+�(13)
8EQUB  0
B	ALIGN
L.lNoBufferHelp
VHEQUS  "*NoBuffer deselects the previously created buffer and frees "
`EQUS  "the memory."+�(13)
jEQUB  0
t	ALIGN
~.lFlushSyntax
�'EQUS  "Syntax:"+�(9)+"*Flush"+�(13)
�EQUB  0
�.lFlushHelp
�MEQUS  "*Flush clears current contents of the buffer without deselecting "
�KEQUS  "it. Use this to clear information you no longer want to print. "
�)EQUS  "It is exactly equivalent to: "
�*EQUS  "*FX"+�(31)+"21"+�(31)+"3"+�(13)
�EQUB  0
�	ALIGN
�]
�=""
�
� �escape
[ OPT pass
4; Trap escape flag it, then pass to old handler.
6; Used to prevent Escape from clearing the buffer.
#; entry - r11 bit 6=1 -> escape
(;         r12 - pointer to workspace

.lEscape
>STR   r0, [sp, #-4]                 ; forge r0 onto stack.
>�   r0, r11, #(1<<6)              ; r11 bit 6=1 -> escape.
TEQ   r0, #0
>MOVNE r0, #1                        ; if escape then flag.
(STRNE r0, [r12, #oEscape]
2)LDR   r0, [r12, #oOldAddress]       ;
<FSTMFD (sp)!, {r0}                   ; forge old address onto stack
F)SUB   sp, sp, #4                    ;
P?LDR   r12, [r12, #oOld12]           ; load old value of r12
Z=LDMFD (sp)!, {r0, pc}               ; pass to old handler
d]
n=""
x� �service
�[ OPT pass
�@; Service call reclaims the vectors after a non-fatal reset.
�0; entry - r12 - pointer to the private word.
�
.lService
�STMFD (sp)!, {r0, r5, ln}
�/TEQ   r1, #&27                      ; reset
�!LDMNEFD  (sp)!, {r0, r5, pc}^
�LDR   r5, [r12]
�BL    lClaim_Vector
�LDMFD (sp)!, {r0, r5, pc}^
�]
�=""
�� �init
�� rTmp, rWorkSpace
�rTmp=3 : rWorkSpace= 2
[ OPT pass
-; Entry  - r12 - pointer to private word.
$;          r10 - pointer to arg.
"1; Exit   - V=1 -> error - r0 - error pointer.
,!; Purpose- Initialise module.
6
.lInit
@:STMFD    (sp)!, {r1, r5, r6, ln}    ; store registers.
JNLDR      r5, [r12]                  ; r12 is a pointer to the private word
TBTEQ      r5, #0                     ; private word<>0 -> Tidy.
^BNE      lTidy
h@MOV      r1, r10                    ; r10 is pointer to arg.
rMOV      r6, #iDefaultSize
|=LDRB     r0, [r1]                   ; r1 pointers to arg.
�:CMP      r0, #32                    ; char>=32 -> arg.
�BLHS     lEvaluate_Arg
�:LDMVSFD  (sp)!, {r1, r5, r6, pc}    ; return if error.
�TEQ      r6, #0
�FLDMEQFD  (sp)!, {r1, r5, r6, pc}    ; return if no space required.
�BL       lClaim_Space
�:LDMVSFD  (sp)!, {r1, r5, r6, pc}    ; return if error.
�BL       lClaim_Vector
�1LDMFD    (sp)!, {r1, r5, r6, pc}    ; return.
�
.lTidy
�LDR    r6, [r5, #oSize]
�BL     lClaim_Vector
�"LDMFD  (sp)!, {r1, r5, r6, pc}

	<; Find the value of the [<size>[k]] argument default 8k.
"; Entry - r1 - pointer to arg.
G; Exit  - r6 - size in bytes. or V=1 -> error - r0 - error pointer.
&.lEvaluate_Arg
0STMFD (sp)!, {r0, r2, ln}
:@MOV   r0, #10                       ; conversion in base 10.
DF�R   r0, r0, #(1<<29)              ; bit 29 indicates limit in r2.
NLMOV   r2, #4096                     ; values bigger then 4096 are silly.
XSWI   "XOS_ReadUnsigned"
bADDVS sp, sp, #4
l:LDMVSFD (sp)!, {r2, pc}             ; return if error.
vDMOV   r6, r2, ASL #10               ; r6 in bytes, r2 in kbytes.
�3LDRB  r0, [r1], #1                  ; r0= char.
�CMP   r0, #33
�BLO   lCheckTail
�TEQ   r0, #�("K")
�BEQ   lCheckTail
�TEQ   r0, #�("k")
�BNE   lArgError
�.lCheckTail
�TEQ   r0, #13
�BLDMEQFD  (sp)!, {r0, r2, pc}        ; found <cr> -> terminate.
�LDRB  r0, [r1], #1
�CMP   r0, #33
�FBLO   lCheckTail                    ; okay if char<33, else error.
.lArgError
<ADR   r0, lArgErrorBlock            ; set error pointer.
@SWI   "XOS_GenerateError"           ; V=1 - indicates error.
 ADD   sp, sp, #4
*LDMFD (sp)!, {r2, pc}
4.lArgErrorBlock
>EQUD  iErrorBase+0
H&EQUS  "Argument Syntax: <size>[k]"
REQUB  0
\	ALIGN
]
^6; Claim Space for the buffer and initialise values
f+; Entry - r6 - size of buffer in bytes.
p-;         r12 - pointer the private word.
z/; Exit  - V=1, r0 - pointer to error block.
{$;         r5 - workspace pointer
�.lClaim_Space
�STMFD (sp)!, {r2, r3, ln}
�EADD   r3, r6, #oBuffer              ; workspace= buffersize+other
�9MOV   r0, #6                        ; claim workspace
�SWI   "XOS_Module"
�:LDMVSFD (sp)!, {r2, r3, pc}         ; return on error.
�JSTR   r2, [r12]                     ; private word = workspace pointer
�@MOV   r5, r2                        ; r5, is returned value.
�GMOV   rTmp, #oBuffer                ; Find address of buffer start.
�HSTR   rTmp, [rWorkSpace, #oPlace]   ; Store this in place to insert.
�FSTR   rTmp, [rWorkSpace, #oLook]    ; Store this in place to look.
�<ADD   rTmp, rTmp, r6                ; End= Start + Size.
�FSTR   rTmp, [rWorkSpace, #oEnd]     ; Store this in end of buffer.
	?STR   r6, [rWorkSpace, #oSize]      ; Store Size of buffer.
	HSTR   r6, [rWorkSpace, #oSpace]     ; Store this in amount of space.
	<MOV   rTmp, #0                      ; Reset escape flag.
	$&STR   rTmp, [rWorkSpace, #oEscape]
	.LDMFD (sp)!, {r2, r3, pc}
	B]
	L=""
	V
� �buffer
	`[ OPT pass
	a/; Code for the *Buffer [<size>[k]] command.
	j; Entry - r1 - no. of args
	t#;         r0 - pointer to args.
	u(;         r12 - pointer to workspace
	~.lBufferCode
	�STMFD (sp)!, {r1, r6, ln}
	�IBL    lNoBufferCode                 ; deallocate any previous buffer.
	�LDMVSFD (sp)!, {r1, r6, pc}
	�MOV   r6, #iDefaultSize
	�?TEQ   r1, #0                        ; r1 is number of args.
	�MOVNE r1, r0
	�BLNE  lEvaluate_Arg
	�LDMVSFD (sp)!, {r1, r6, pc}
	�TEQ   r6, #0
	�ALDMEQFD (sp)!, {r1, r6, pc}         ; if size=0 do not claim.
	�BL    lClaim_Space
	�LDMVSFD (sp)!, {r1, r6, pc}
BL    lClaim_Vector

LDMFD (sp)!, {r1, r6, pc}
]
=""
(� �final
2[ OPT pass
3D; Finialisation Code, called by *RMKill, *RMClear, *RMTidy. etc.
<=; Entry - r10 - fatality indicator, r10=0 means non-fatal
F0;         r12 - pointer to the private word.
G; Exit  - r0 = ?
P.lFinal
Z!STMFD (sp)!, {r1, r2, r5, ln}
dTEQ   r10, #0
nBEQ   lNon_Fatal
x9MOV   r0, #152                      ; examine buffer.
�MOV   r1, #3
�SWI   "XOS_Byte"
�#LDMVSFD (sp)!, {r1, r2, r5, pc}
�BBCC   lInUseError                   ; the buffer is not empty.
�.lNon_Fatal
�BLDR   r5, [r12]                     ; r5 is workspace pointer.
�TEQ   r5, #0
�CBLNE  lRestore_Vector               ; only if workspace exists.
�!LDMFD (sp)!, {r1, r2, r5, pc}
�.lInUseError
�SWI   "XOS_GenerateError"
�ADR    r0, lInUseErrorBlock
�!LDMFD (sp)!, {r1, r2, r5, pc}
.lInUseErrorBlock
EQUD  iErrorBase+1
@EQUS  "Printer Buffer currently in use (*Flush will clear)."
"EQUB  0
,	ALIGN
6;
@]
J=""
T� �nobuffer
^[ OPT pass
_$; Code for the *NoBuffer command
`); Entry - r12 - pointer to workspace.
h.lNoBufferCode
r&STMFD (sp)!, {r0, r1, r2, r10, ln}
|MOV   r10, #1
�BL    lFinal
�CADDVS sp, sp, #4                       ; pop r0 so not restored
�=LDMVSFD (sp)!, {r1, r2, r10, pc}       ; return if error.
�CLDR   r2, [r12]                        ; get workspace pointer.
�TEQ   r2, #0
�DLDMEQFD (sp)!, {r0, r1, r2, r10, pc}   ; return if no workspace.
�.lRestore_Space
�<MOV   r0, #7                           ; free workspace.
�SWI   "XOS_Module"
�MOV   r2, #0
�ISTR   r2, [r12]                        ; reset value of private word.
�DADDVS sp, sp, #4                       ; pop r0 so not restored.
�$LDMVSFD (sp)!, {r1, r2, r10, pc}
&LDMFD (sp)!, {r0, r1, r2, r10, pc}
]
=""
&� �flush
0[ OPT pass
1:; Code for the *Flush command. Equivalent to *FX 21,3.
:.lFlushCode
DSTMFD (sp)!, {r0, r1, ln}
NMOV   r0, #21
XMOV   r1, #3
bSWI   "XOS_Byte"
lLDMVCFD (sp)!, {r0, r1, pc}
vADD   sp, sp, #4
�LDMFD (sp)!, {r1, pc}
�]
�=""
�
� �insert
�*� rChar, rReturn, rPlace, rSpace, rEnd
�rChar= 0 : rReturn= 2
�(rPlace= 3 : rSpace= rPlace : rEnd= 4
�[ OPT pass
�!; InsV  - Insert Vector Code.
�0; Entry - r0= char to insert, r1= buffer no.
�*; Exit  - r2= ?, C=1 insertion failed.
�
.lInsV
�G TEQ     rBufferNo, #iPrinter           ; Insert in Printer Buffer?

: MOVNES  pc, ln                         ; No, Pass on.

.lInsert

A LDMFD   (sp)!, {rReturn}               ; Get Return Address.

 < STMFD   (sp)!, {rSpace}                ; Push Register.

*C LDR     rSpace, [rWorkSpace,#oSpace]   ; Load Space in Buffer.

4G TEQ     rSpace, #0                     ; How much space in Buffer?

>? LDMFD   (sp)!, {rSpace}                ; Restore Register.

HM �REQS  pc, rReturn, #iCFlag           ; No Space, Return with Carry Set.

R= STMFD   (sp)!, {rPlace, rEnd}          ; Push Registers.

\D LDR     rPlace, [rWorkSpace, #oPlace]  ; Load Registers, Place.

fB LDR     rEnd, [rWorkSpace, #oEnd]      ;                 End.

pJ BIC     rReturn, rReturn, #iCFlag      ; Clear Carry flag for Return.

zH STRB    rChar, [rWorkSpace, rPlace]    ; Store Character in Buffer.

�- ADD     rPlace, rPlace, #1             ;

�F TEQ     rPlace, rEnd                   ; Are we at end of Buffer.

�A �Q   rPlace, #oBuffer               ; Yes, go back to start.

�> STR     rPlace, [rWorkSpace, #oPlace]  ; Store new place.

�C LDR     rSpace, [rWorkSpace, #oSpace]  ; Load amount of space.

�> SUB     rSpace, rSpace, #1             ; Decrement space.

�> STR     rSpace, [rWorkSpace, #oSpace]  ; Store new space.

�@ LDMFD   (sp)!, {rPlace, rEnd}          ; Restore Registers.

�F MOVS    pc, rReturn                    ; Return with Carry Clear.

�]

�=""

�
� �remove

�-� rExamine, rRemoved, rSpace, rLook, rEnd
rExamine= 0 : rRemoved= 2
'rSpace= 1 : rLook= rSpace : rEnd= 4
[ OPT pass
$); RemV  - Remove/Examine Vector code.
.B; Entry - r1= buffer no., V=1 means examine, V=0 means remove.
8B; Exit  - r2= char returned or examined, C=1 buffer was empty.
B
.lRemV
L> STR     pc, [rWorkSpace, #opc]          ; store away PSR.
VJ TEQ     rBufferNo, #iPrinter            ; Remove from Printer Buffer?
`; MOVNES  pc, ln                          ; No, Pass on.
j.lRemFunction
t= STMFD   (sp)!, {rSpace,rEnd}            ; Push Register.
~D LDR     rSpace, [rWorkSpace, #oSpace]   ; Load amount of space.
�' LDR     rEnd, [rWorkSpace, #oSize]
�B TEQ     rSpace, rEnd                    ; Space=Size -> Empty
� BNE     lnot_empty
�D LDR     rSpace, [sp,#8]                 ; forge C set on stack.
�# �R     rSpace, rSpace, #iCFlag
� STR     rSpace, [sp,#8]
�D LDMEQFD (sp)!, {rSpace, rEnd, pc}^      ; Return if empty, C=1.
�
�.lnot_empty
�F LDR     rSpace, [sp,#8]                 ; forge C clear on stack.
�$ BIC     rSpace, rSpace, #iCFlag
� STR     rSpace, [sp,#8]
? LDR     rLook, [rWorkSpace, #opc]       ; get PSR on entry

 TEQP    pc, rLook
L BVC     lRemove                         ; If V=0 then branch to Remove.
N LDR     rLook, [rWorkSpace, #oLook]     ; Load pointer to char to remove.
(? LDRB    rExamine, [rWorkSpace, rLook]   ; Load char value.
2 MOV     rRemoved, rExamine
<' LDMFD   (sp)!, {rSpace, rEnd, pc}^
F@                                         ; Remove Character.
P.lRemove
ZN LDR     rLook, [rWorkSpace, #oLook]     ; Load pointer to char to remove.
dM LDR     rEnd, [rWorkSpace, #oEnd]       ; Load pointer to end of buffer.
nK LDRB    rRemoved, [rWorkSpace, rLook]   ; Load char value, and remove.
xE ADD     rLook, rLook, #1                ; increment look pointer
� MOV     rExamine, rRemoved
�G TEQ     rLook, rEnd                     ; Are we at end of Buffer?
�B �Q   rLook, #oBuffer                 ; Yes, go back to start.
�F STR     rLook, [rWorkSpace, #oLook]     ; Save new place to look.
�N LDR     rSpace, [rWorkSpace, #oSpace]   ; Load amount of space in buffer.
�J ADD     rSpace, rSpace, #1              ; Inc. space - one less char.
�D STR     rSpace, [rWorkSpace, #oSpace]   ; Save amount of space.
�A LDMFD   (sp)!, {rSpace, rEnd, pc}^      ; Restore Registers.
�]
�=""
�� �count
�2� rCountL, rCountH, rSize, rSpace, rTmp, iBot8
�rCountL= 1 : rCountH= 2
.rSpace= rCountL : rSize= rCountH : rTmp= 0
iBot8= &FF
[ OPT pass
"&; CnpV  - Count/Purge Vector Code.
,H; Entry - r1= buffer no., V=0 -> count, C=0 -> entries, C=1 -> space
6+;                         V=1 -> purge.
@J; Exit  - r0= ?, if V=0 then r1= count (bottom 8); r2= count (top 24).
J
.lCnpV
T# STR     pc, [rWorkSpace, #opc]
^H TEQ     rBufferNo, #iPrinter          ; Count/Purge Printer Buffer?
h9 MOVNES  pc, ln                        ; No, Pass on.
r.lCnpFunction
|6 LDR     r0, [rWorkSpace, #opc]        ; store PSR
� TEQP    pc, r0
�I BVS     lPurge                        ; if V=1 then branch to purge.
�
�A.lCount                                ; Count entries/space.
�C LDR     rCountL, [rWorkSpace, #oSpace] ; Load amount of space.
�L BLCC    lEntry                        ; if C=0 then subroutine entries.
�F MOV     rCountH, rCountL, ASR #8      ; Get top 24 bits of count.
�F �     rCountL, rCountL, #iBot8      ; Get bottom 8 bits of count.
�@ LDMFD   (sp)!, {pc}^                  ; Get Return Address.
�
�;.lEntry                                ; Count entries.
�A LDR     rSize, [rWorkSpace, #oSize]   ; Load size of buffer.
�C SUB     rCountL, rSize, rSpace        ; Entries= Size - Space.
4 MOV     pc, ln                        ; Return.

:.lPurge                                ; Purge Buffer.
&) LDR     rTmp, [rWorkSpace, #oEscape]
0L TEQ     rTmp, #0                      ; Do not flush buffer if vector..
1H MOV     rTmp, #0                      ; ..called by escape handler!
2) STR     rTmp, [rWorkSpace, #oEscape]
:H LDMNEFD (sp)!, {pc}^                  ; return if Escape Condition.
NJ MOV     rTmp, #oBuffer                ; Find address of buffer start.
XK STR     rTmp, [rWorkSpace, #oPlace]   ; Store this in place to insert.
bI STR     rTmp, [rWorkSpace, #oLook]    ; Store this in place to look.
lA LDR     rTmp, [rWorkSpace, #oSize]    ; Find Size of buffer.
vK STR     rTmp, [rWorkSpace, #oSpace]   ; Store this in amount of space.
�4 LDMFD   (sp)!, {pc}^                  ; Return.
�]
�=""
�� �claim
�*� rVector, rAddress, rGive, rWorkSpace
�'rVector= 0 : rAddress= 1 : rGive= 2
�!rTmp= rVector : rWorkSpace= 5
�[ OPT pass
�'; Entry - r5 - pointer to workspace
�?; Claim - Code to Claim the vectors, initialise the buffer.
�.lClaim_Vector
�) STMFD   (sp)!, {rAddress, rGive, ln}
� MOV     r0, #9
 ADR     r1, lEscape
 MOV     r2, rWorkSpace
B SWI     "XOS_ChangeEnvironment"       ; Claim escape handler.
 ) LDMVSFD (sp)!, {rAddress, rGive, pc}
*+ STR     r1, [rWorkSpace, #oOldAddress]
4F STR     r2, [rWorkSpace, #oOld12]     ; Store old escape handler.
> MOV     rVector, #iInsNo
H ADR     rAddress, lInsV
R MOV     rGive, rWorkSpace
\8 SWI     "XOS_Claim"                   ; Claim InsV.
f) LDMVSFD (sp)!, {rAddress, rGive, pc}
p MOV     rVector, #iRemNo
z ADR     rAddress, lRemV
� MOV     rGive, rWorkSpace
�8 SWI     "XOS_Claim"                   ; Claim RemV.
�) LDMVSFD (sp)!, {rAddress, rGive, pc}
� MOV     rVector, #iCnpNo
� ADR     rAddress, lCnpV
� MOV     rGive, rWorkSpace
�8 SWI     "XOS_Claim"                   ; Claim CnpV.
�) LDMFD   (sp)!, {rAddress, rGive, pc}
�C; Restore - Code to restore the vectors to use previous buffer.
�.lRestore_Vector
�) STMFD   (sp)!, {rAddress, rGive, ln}
� MOV     r0, #9
�+ LDR     r1, [rWorkSpace, #oOldAddress]
& LDR     r2, [rWorkSpace, #oOld12]
D SWI     "XOS_ChangeEnvironment"       ; Restore escape handler.
) LDMVSFD (sp)!, {rAddress, rGive, pc}
$ MOV     rVector, #iInsNo
. ADR     rAddress, lInsV
8 MOV     rGive, rWorkSpace
B: SWI     "XOS_Release"                 ; Release InsV.
L) LDMVSFD (sp)!, {rAddress, rGive, pc}
V MOV     rVector, #iRemNo
` ADR     rAddress, lRemV
j MOV     rGive, rWorkSpace
t: SWI     "XOS_Release"                 ; Release RemV.
~) LDMVSFD (sp)!, {rAddress, rGive, pc}
� MOV     rVector, #iCnpNo
� ADR     rAddress, lCnpV
� MOV     rGive, rWorkSpace
�: SWI     "XOS_Release"                 ; Release CnpV.
�) LDMFD   (sp)!, {rAddress, rGive, pc}
�]
�=""
�
00000000  0d 00 0a 0b f4 20 3e 20  73 72 63 0d 00 14 1d f4  |..... > src.....|
00000010  20 50 72 69 6e 74 65 72  20 42 75 66 66 65 72 20  | Printer Buffer |
00000020  70 72 6f 67 72 61 6d 2e  0d 00 1e 39 f4 20 41 6e  |program....9. An|
00000030  74 6f 6e 20 43 61 72 76  65 72 2e 20 32 34 2f 39  |ton Carver. 24/9|
00000040  2f 38 38 20 2d 20 32 38  2f 39 2f 38 38 2c 20 32  |/88 - 28/9/88, 2|
00000050  31 2f 39 2f 38 39 20 2d  20 32 35 2f 39 2f 38 39  |1/9/89 - 25/9/89|
00000060  2e 0d 00 1f 28 f4 20 73  65 65 20 61 6c 73 6f 20  |....(. see also |
00000070  27 52 65 61 64 4d 65 27  20 61 6e 64 20 27 43 6f  |'ReadMe' and 'Co|
00000080  70 79 52 69 67 68 74 27  2e 0d 00 28 04 0d 00 32  |pyRight'...(...2|
00000090  23 f4 20 64 65 66 69 6e  65 20 67 6c 6f 62 61 6c  |#. define global|
000000a0  20 72 65 67 69 73 74 65  72 20 6e 61 6d 65 73 2e  | register names.|
000000b0  0d 00 3c 1c 70 63 3d 20  31 35 20 3a 20 6c 6e 3d  |..<.pc= 15 : ln=|
000000c0  20 31 34 20 3a 20 73 70  3d 20 31 33 0d 00 46 21  | 14 : sp= 13..F!|
000000d0  72 42 75 66 66 65 72 4e  6f 3d 20 31 20 3a 20 72  |rBufferNo= 1 : r|
000000e0  57 6f 72 6b 53 70 61 63  65 3d 20 31 32 0d 00 50  |WorkSpace= 12..P|
000000f0  04 0d 00 5a 28 f4 20 64  65 66 69 6e 65 20 75 73  |...Z(. define us|
00000100  65 66 75 6c 20 69 6d 6d  65 64 69 61 74 65 20 63  |eful immediate c|
00000110  6f 6e 73 74 61 6e 74 73  2e 0d 00 64 21 69 43 46  |onstants...d!iCF|
00000120  6c 61 67 3d 20 31 3c 3c  32 39 20 3a 20 69 56 46  |lag= 1<<29 : iVF|
00000130  6c 61 67 3d 20 31 3c 3c  32 38 0d 00 6e 39 69 50  |lag= 1<<28..n9iP|
00000140  72 69 6e 74 65 72 3d 20  33 20 3a 20 69 44 65 66  |rinter= 3 : iDef|
00000150  61 75 6c 74 53 69 7a 65  3d 20 38 2a 31 30 32 34  |aultSize= 8*1024|
00000160  20 3a 20 69 43 6f 64 65  53 69 7a 65 3d 20 26 31  | : iCodeSize= &1|
00000170  30 30 30 0d 00 78 3f 69  49 6e 73 4e 6f 3d 20 26  |000..x?iInsNo= &|
00000180  31 34 20 3a 20 69 52 65  6d 4e 6f 3d 20 26 31 35  |14 : iRemNo= &15|
00000190  20 3a 20 69 43 6e 70 4e  6f 3d 20 26 31 36 20 3a  | : iCnpNo= &16 :|
000001a0  20 69 45 72 72 6f 72 42  61 73 65 3d 20 26 31 30  | iErrorBase= &10|
000001b0  30 30 0d 00 82 04 0d 00  8c 1f f4 20 64 65 66 69  |00......... defi|
000001c0  6e 65 20 77 6f 72 6b 73  70 61 63 65 20 6f 66 66  |ne workspace off|
000001d0  73 65 74 73 2e 0d 00 96  45 6f 53 70 61 63 65 3d  |sets....EoSpace=|
000001e0  20 30 20 3a 20 6f 50 6c  61 63 65 3d 20 34 20 3a  | 0 : oPlace= 4 :|
000001f0  20 6f 4c 6f 6f 6b 3d 20  38 20 3a 20 6f 45 6e 64  | oLook= 8 : oEnd|
00000200  3d 20 31 32 20 3a 20 6f  53 69 7a 65 3d 20 31 36  |= 12 : oSize= 16|
00000210  20 3a 20 6f 70 63 3d 20  32 30 0d 00 a0 3d 6f 45  | : opc= 20...=oE|
00000220  73 63 61 70 65 3d 20 32  34 20 3a 20 6f 4f 6c 64  |scape= 24 : oOld|
00000230  41 64 64 72 65 73 73 3d  20 32 38 20 3a 20 6f 4f  |Address= 28 : oO|
00000240  6c 64 31 32 20 3d 20 33  32 20 3a 20 6f 42 75 66  |ld12 = 32 : oBuf|
00000250  66 65 72 3d 20 33 36 0d  00 aa 04 0d 00 b4 15 de  |fer= 36.........|
00000260  20 6c 43 6f 64 65 20 69  43 6f 64 65 53 69 7a 65  | lCode iCodeSize|
00000270  0d 00 dc 15 e3 20 70 61  73 73 3d 20 30 20 b8 20  |..... pass= 0 . |
00000280  32 20 88 20 32 0d 00 e6  0d 50 25 3d 20 6c 43 6f  |2 . 2....P%= lCo|
00000290  64 65 0d 00 f0 0e 5b 20  4f 50 54 20 70 61 73 73  |de....[ OPT pass|
000002a0  0d 01 04 0b 2e 6c 53 74  61 72 74 0d 01 0e 0b a4  |.....lStart.....|
000002b0  68 65 61 64 65 72 0d 01  18 3b a4 66 69 6e 61 6c  |header...;.final|
000002c0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
000002d0  20 20 20 20 20 20 20 20  20 20 20 20 20 3b 20 46  |             ; F|
000002e0  69 6e 61 6c 69 73 61 74  69 6f 6e 20 63 6f 64 65  |inalisation code|
000002f0  2e 0d 01 22 3d a4 69 6e  69 74 20 20 20 20 20 20  |..."=.init      |
00000300  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000310  20 20 20 20 20 20 20 20  3b 20 49 6e 69 74 69 61  |        ; Initia|
00000320  6c 69 73 61 74 69 6f 6e  20 63 6f 64 65 2e 0d 01  |lisation code...|
00000330  2c 3e a4 73 65 72 76 69  63 65 20 20 20 20 20 20  |,>.service      |
00000340  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000350  20 20 20 20 20 3b 20 53  65 72 76 69 63 65 20 43  |     ; Service C|
00000360  61 6c 6c 20 48 61 6e 64  6c 65 72 2e 0d 01 36 36  |all Handler...66|
00000370  a4 65 73 63 61 70 65 20  20 20 20 20 20 20 20 20  |.escape         |
00000380  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000390  20 20 20 3b 20 48 61 6e  64 6c 65 20 45 73 63 61  |   ; Handle Esca|
000003a0  70 65 0d 01 40 32 a4 6e  6f 62 75 66 66 65 72 20  |pe..@2.nobuffer |
000003b0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
000003c0  20 20 20 20 20 20 20 20  20 3b 20 2a 4e 6f 42 75  |         ; *NoBu|
000003d0  66 66 65 72 0d 01 4a 2f  a4 66 6c 75 73 68 20 20  |ffer..J/.flush  |
000003e0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
000003f0  20 20 20 20 20 20 20 20  20 20 20 3b 20 2a 46 6c  |           ; *Fl|
00000400  75 73 68 0d 01 54 30 a4  62 75 66 66 65 72 20 20  |ush..T0.buffer  |
00000410  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000420  20 20 20 20 20 20 20 20  20 20 3b 20 2a 42 75 66  |          ; *Buf|
00000430  66 65 72 0d 01 5e 33 a4  72 65 6d 6f 76 65 20 20  |fer..^3.remove  |
00000440  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000450  20 20 20 20 20 20 20 20  20 20 3b 20 52 65 6d 56  |          ; RemV|
00000460  20 63 6f 64 65 2e 0d 01  68 33 a4 63 6f 75 6e 74  | code...h3.count|
00000470  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000480  20 20 20 20 20 20 20 20  20 20 20 20 20 3b 20 43  |             ; C|
00000490  6e 70 56 20 63 6f 64 65  2e 0d 01 72 46 a4 63 6c  |npV code...rF.cl|
000004a0  61 69 6d 20 20 20 20 20  20 20 20 20 20 20 20 20  |aim             |
000004b0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
000004c0  3b 20 4f 53 5f 43 6c 61  69 6d 2c 20 4f 53 5f 52  |; OS_Claim, OS_R|
000004d0  65 6c 65 61 73 65 20 56  65 63 74 6f 72 73 2e 0d  |elease Vectors..|
000004e0  01 7c 33 a4 69 6e 73 65  72 74 20 20 20 20 20 20  |.|3.insert      |
000004f0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000500  20 20 20 20 20 20 3b 20  49 6e 73 56 20 63 6f 64  |      ; InsV cod|
00000510  65 2e 0d 01 86 09 2e 6c  45 6e 64 0d 01 90 05 5d  |e......lEnd....]|
00000520  0d 01 9a 05 ed 0d 01 a4  1b 2a 53 45 54 20 50 62  |.........*SET Pb|
00000530  75 66 24 6e 61 6d 65 20  50 72 69 6e 74 42 75 66  |uf$name PrintBuf|
00000540  0d 01 ae 30 ff 22 53 41  56 45 20 3c 50 62 75 66  |...0."SAVE <Pbuf|
00000550  24 6e 61 6d 65 3e 20 22  2b c3 7e 6c 53 74 61 72  |$name> "+.~lStar|
00000560  74 2b 22 20 22 2b c3 7e  28 6c 45 6e 64 2b 34 29  |t+" "+.~(lEnd+4)|
00000570  0d 01 b8 1d 2a 53 65 74  54 79 70 65 20 3c 50 62  |....*SetType <Pb|
00000580  75 66 24 6e 61 6d 65 3e  20 26 66 66 61 0d 01 c2  |uf$name> &ffa...|
00000590  05 e0 0d 01 c3 04 0d 01  cc 0d dd 20 a4 68 65 61  |........... .hea|
000005a0  64 65 72 0d 01 d6 0e 5b  20 4f 50 54 20 70 61 73  |der....[ OPT pas|
000005b0  73 0d 01 d7 19 3b 20 4d  6f 64 75 6c 65 20 48 65  |s....; Module He|
000005c0  61 64 65 72 20 42 6c 6f  63 6b 0d 01 e0 0c 2e 6c  |ader Block.....l|
000005d0  48 65 61 64 65 72 0d 01  ea 1c 45 51 55 44 20 20  |Header....EQUD  |
000005e0  30 20 20 3b 20 6e 6f 20  73 74 61 72 74 20 63 6f  |0  ; no start co|
000005f0  64 65 0d 01 f4 3d 45 51  55 44 20 20 28 6c 49 6e  |de...=EQUD  (lIn|
00000600  69 74 2d 6c 53 74 61 72  74 29 20 20 20 20 20 20  |it-lStart)      |
00000610  20 20 20 20 20 20 20 20  20 20 3b 20 49 6e 69 74  |          ; Init|
00000620  69 61 6c 69 73 61 74 69  6f 6e 20 43 6f 64 65 0d  |ialisation Code.|
00000630  01 fe 3b 45 51 55 44 20  20 28 6c 46 69 6e 61 6c  |..;EQUD  (lFinal|
00000640  2d 6c 53 74 61 72 74 29  20 20 20 20 20 20 20 20  |-lStart)        |
00000650  20 20 20 20 20 20 20 3b  20 46 69 6e 69 61 6c 69  |       ; Finiali|
00000660  73 74 69 6f 6e 20 43 6f  64 65 0d 02 08 3e 45 51  |stion Code...>EQ|
00000670  55 44 20 20 28 6c 53 65  72 76 69 63 65 2d 6c 53  |UD  (lService-lS|
00000680  74 61 72 74 29 20 20 20  20 20 20 20 20 20 20 20  |tart)           |
00000690  20 20 3b 20 53 65 72 76  69 63 65 20 45 6e 74 72  |  ; Service Entr|
000006a0  79 2c 20 52 45 53 45 54  0d 02 12 36 45 51 55 44  |y, RESET...6EQUD|
000006b0  20 20 28 6c 4d 6f 64 75  6c 65 54 69 74 6c 65 2d  |  (lModuleTitle-|
000006c0  6c 53 74 61 72 74 29 20  20 20 20 20 20 20 20 20  |lStart)         |
000006d0  3b 20 4d 6f 64 75 6c 65  20 54 69 74 6c 65 0d 02  |; Module Title..|
000006e0  1c 35 45 51 55 44 20 20  28 6c 4d 6f 64 75 6c 65  |.5EQUD  (lModule|
000006f0  48 65 6c 70 2d 6c 53 74  61 72 74 29 20 20 20 20  |Help-lStart)    |
00000700  20 20 20 20 20 20 3b 20  4d 6f 64 75 6c 65 20 48  |      ; Module H|
00000710  65 6c 70 0d 02 26 38 45  51 55 44 20 20 28 6c 4b  |elp..&8EQUD  (lK|
00000720  65 79 77 6f 72 64 73 2d  6c 53 74 61 72 74 29 20  |eywords-lStart) |
00000730  20 20 20 20 20 20 20 20  20 20 20 3b 20 4b 65 79  |           ; Key|
00000740  77 6f 72 64 73 20 62 6c  6f 63 6b 0d 02 30 0b 45  |words block..0.E|
00000750  51 55 44 20 20 30 0d 02  3a 0b 45 51 55 44 20 20  |QUD  0..:.EQUD  |
00000760  30 0d 02 44 0b 45 51 55  44 20 20 30 0d 02 4e 0b  |0..D.EQUD  0..N.|
00000770  45 51 55 44 20 20 30 0d  02 58 11 2e 6c 4d 6f 64  |EQUD  0..X..lMod|
00000780  75 6c 65 54 69 74 6c 65  0d 02 62 19 45 51 55 53  |uleTitle..b.EQUS|
00000790  20 20 22 50 72 69 6e 74  65 72 42 75 66 66 65 72  |  "PrinterBuffer|
000007a0  22 0d 02 6c 0b 45 51 55  44 20 20 30 0d 02 76 09  |"..l.EQUD  0..v.|
000007b0  41 4c 49 47 4e 0d 02 80  10 2e 6c 4d 6f 64 75 6c  |ALIGN.....lModul|
000007c0  65 48 65 6c 70 0d 02 8a  42 45 51 55 53 20 20 22  |eHelp...BEQUS  "|
000007d0  50 72 69 6e 74 65 72 20  42 75 66 66 65 72 22 2b  |Printer Buffer"+|
000007e0  bd 28 39 29 2b 22 31 2e  30 30 20 28 30 31 20 4f  |.(9)+"1.00 (01 O|
000007f0  63 74 20 31 39 38 39 29  20 20 41 6e 74 6f 6e 20  |ct 1989)  Anton |
00000800  43 61 72 76 65 72 22 0d  02 94 0b 45 51 55 42 20  |Carver"....EQUB |
00000810  20 30 0d 02 9e 09 41 4c  49 47 4e 0d 02 a8 0e 2e  | 0....ALIGN.....|
00000820  6c 4b 65 79 77 6f 72 64  73 0d 02 b2 12 45 51 55  |lKeywords....EQU|
00000830  53 20 20 22 42 75 66 66  65 72 22 0d 02 bc 0b 45  |S  "Buffer"....E|
00000840  51 55 42 20 20 30 0d 02  c6 09 41 4c 49 47 4e 0d  |QUB  0....ALIGN.|
00000850  02 d0 1e 45 51 55 44 20  20 28 6c 42 75 66 66 65  |...EQUD  (lBuffe|
00000860  72 43 6f 64 65 2d 6c 53  74 61 72 74 29 0d 02 da  |rCode-lStart)...|
00000870  38 45 51 55 57 20 20 30  20 20 20 20 20 20 20 20  |8EQUW  0        |
00000880  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000890  20 20 20 20 20 3b 20 6d  69 6e 20 70 61 72 61 6d  |     ; min param|
000008a0  65 74 65 72 73 0d 02 e4  38 45 51 55 57 20 20 31  |eters...8EQUW  1|
000008b0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
000008c0  20 20 20 20 20 20 20 20  20 20 20 20 20 3b 20 6d  |             ; m|
000008d0  61 78 20 70 61 72 61 6d  65 74 65 72 73 0d 02 ee  |ax parameters...|
000008e0  20 45 51 55 44 20 20 28  6c 42 75 66 66 65 72 53  | EQUD  (lBufferS|
000008f0  79 6e 74 61 78 2d 6c 53  74 61 72 74 29 0d 02 f8  |yntax-lStart)...|
00000900  1e 45 51 55 44 20 20 28  6c 42 75 66 66 65 72 48  |.EQUD  (lBufferH|
00000910  65 6c 70 2d 6c 53 74 61  72 74 29 0d 03 02 04 0d  |elp-lStart).....|
00000920  03 0c 14 45 51 55 53 20  20 22 4e 6f 42 75 66 66  |...EQUS  "NoBuff|
00000930  65 72 22 0d 03 16 0b 45  51 55 42 20 20 30 0d 03  |er"....EQUB  0..|
00000940  20 09 41 4c 49 47 4e 0d  03 2a 20 45 51 55 44 20  | .ALIGN..* EQUD |
00000950  20 28 6c 4e 6f 42 75 66  66 65 72 43 6f 64 65 2d  | (lNoBufferCode-|
00000960  6c 53 74 61 72 74 29 0d  03 34 38 45 51 55 57 20  |lStart)..48EQUW |
00000970  20 30 20 20 20 20 20 20  20 20 20 20 20 20 20 20  | 0              |
00000980  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 3b  |               ;|
00000990  20 6d 69 6e 20 70 61 72  61 6d 65 74 65 72 73 0d  | min parameters.|
000009a0  03 3e 38 45 51 55 57 20  20 30 20 20 20 20 20 20  |.>8EQUW  0      |
000009b0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
000009c0  20 20 20 20 20 20 20 3b  20 6d 61 78 20 70 61 72  |       ; max par|
000009d0  61 6d 65 74 65 72 73 0d  03 48 22 45 51 55 44 20  |ameters..H"EQUD |
000009e0  20 28 6c 4e 6f 42 75 66  66 65 72 53 79 6e 74 61  | (lNoBufferSynta|
000009f0  78 2d 6c 53 74 61 72 74  29 0d 03 52 20 45 51 55  |x-lStart)..R EQU|
00000a00  44 20 20 28 6c 4e 6f 42  75 66 66 65 72 48 65 6c  |D  (lNoBufferHel|
00000a10  70 2d 6c 53 74 61 72 74  29 0d 03 5c 04 0d 03 66  |p-lStart)..\...f|
00000a20  11 45 51 55 53 20 20 22  46 6c 75 73 68 22 0d 03  |.EQUS  "Flush"..|
00000a30  70 0b 45 51 55 42 20 20  30 0d 03 7a 09 41 4c 49  |p.EQUB  0..z.ALI|
00000a40  47 4e 0d 03 84 1d 45 51  55 44 20 20 28 6c 46 6c  |GN....EQUD  (lFl|
00000a50  75 73 68 43 6f 64 65 2d  6c 53 74 61 72 74 29 0d  |ushCode-lStart).|
00000a60  03 8e 38 45 51 55 57 20  20 30 20 20 20 20 20 20  |..8EQUW  0      |
00000a70  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000a80  20 20 20 20 20 20 20 3b  20 6d 69 6e 20 70 61 72  |       ; min par|
00000a90  61 6d 65 74 65 72 73 0d  03 98 38 45 51 55 57 20  |ameters...8EQUW |
00000aa0  20 30 20 20 20 20 20 20  20 20 20 20 20 20 20 20  | 0              |
00000ab0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 3b  |               ;|
00000ac0  20 6d 61 78 20 70 61 72  61 6d 65 74 65 72 73 0d  | max parameters.|
00000ad0  03 a2 1f 45 51 55 44 20  20 28 6c 46 6c 75 73 68  |...EQUD  (lFlush|
00000ae0  53 79 6e 74 61 78 2d 6c  53 74 61 72 74 29 0d 03  |Syntax-lStart)..|
00000af0  ac 1d 45 51 55 44 20 20  28 6c 46 6c 75 73 68 48  |..EQUD  (lFlushH|
00000b00  65 6c 70 2d 6c 53 74 61  72 74 29 0d 03 b6 42 45  |elp-lStart)...BE|
00000b10  51 55 44 20 20 30 20 20  20 20 20 20 20 20 20 20  |QUD  0          |
00000b20  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000b30  20 20 20 3b 20 6b 65 79  77 6f 72 64 20 74 61 62  |   ; keyword tab|
00000b40  6c 65 20 74 65 72 6d 69  6e 61 74 6f 72 0d 03 c0  |le terminator...|
00000b50  12 2e 6c 42 75 66 66 65  72 53 79 6e 74 61 78 0d  |..lBufferSyntax.|
00000b60  03 ca 34 45 51 55 53 20  20 22 53 79 6e 74 61 78  |..4EQUS  "Syntax|
00000b70  3a 22 2b bd 28 39 29 2b  22 2a 42 75 66 66 65 72  |:"+.(9)+"*Buffer|
00000b80  20 5b 3c 73 69 7a 65 3e  5b 6b 5d 5d 22 2b bd 28  | [<size>[k]]"+.(|
00000b90  31 33 29 0d 03 d4 0b 45  51 55 42 20 20 30 0d 03  |13)....EQUB  0..|
00000ba0  de 09 41 4c 49 47 4e 0d  03 e8 10 2e 6c 42 75 66  |..ALIGN.....lBuf|
00000bb0  66 65 72 48 65 6c 70 0d  03 f2 47 45 51 55 53 20  |ferHelp...GEQUS |
00000bc0  20 22 2a 42 75 66 66 65  72 20 75 73 65 64 20 74  | "*Buffer used t|
00000bd0  6f 20 63 72 65 61 74 65  20 61 20 70 72 69 6e 74  |o create a print|
00000be0  65 72 20 62 75 66 66 65  72 20 6f 66 20 73 70 65  |er buffer of spe|
00000bf0  63 69 66 69 65 64 20 73  69 7a 65 2e 20 22 0d 03  |cified size. "..|
00000c00  fc 2a 45 51 55 53 20 20  22 54 68 65 20 64 65 66  |.*EQUS  "The def|
00000c10  61 75 6c 74 20 62 75 66  66 65 72 20 73 69 7a 65  |ault buffer size|
00000c20  20 69 73 20 38 6b 2e 22  0d 04 06 3a 45 51 55 53  | is 8k."...:EQUS|
00000c30  20 20 bd 28 31 33 29 2b  22 53 79 6e 74 61 78 3a  |  .(13)+"Syntax:|
00000c40  22 2b bd 28 39 29 2b 22  2a 42 75 66 66 65 72 20  |"+.(9)+"*Buffer |
00000c50  5b 3c 73 69 7a 65 3e 5b  6b 5d 5d 22 2b bd 28 31  |[<size>[k]]"+.(1|
00000c60  33 29 0d 04 10 0a 45 51  55 42 20 30 0d 04 1a 09  |3)....EQUB 0....|
00000c70  41 4c 49 47 4e 0d 04 24  14 2e 6c 4e 6f 42 75 66  |ALIGN..$..lNoBuf|
00000c80  66 65 72 53 79 6e 74 61  78 0d 04 2e 2a 45 51 55  |ferSyntax...*EQU|
00000c90  53 20 20 22 53 79 6e 74  61 78 3a 22 2b bd 28 39  |S  "Syntax:"+.(9|
00000ca0  29 2b 22 2a 4e 6f 42 75  66 66 65 72 22 2b bd 28  |)+"*NoBuffer"+.(|
00000cb0  31 33 29 0d 04 38 0b 45  51 55 42 20 20 30 0d 04  |13)..8.EQUB  0..|
00000cc0  42 09 41 4c 49 47 4e 0d  04 4c 12 2e 6c 4e 6f 42  |B.ALIGN..L..lNoB|
00000cd0  75 66 66 65 72 48 65 6c  70 0d 04 56 48 45 51 55  |ufferHelp..VHEQU|
00000ce0  53 20 20 22 2a 4e 6f 42  75 66 66 65 72 20 64 65  |S  "*NoBuffer de|
00000cf0  73 65 6c 65 63 74 73 20  74 68 65 20 70 72 65 76  |selects the prev|
00000d00  69 6f 75 73 6c 79 20 63  72 65 61 74 65 64 20 62  |iously created b|
00000d10  75 66 66 65 72 20 61 6e  64 20 66 72 65 65 73 20  |uffer and frees |
00000d20  22 0d 04 60 1d 45 51 55  53 20 20 22 74 68 65 20  |"..`.EQUS  "the |
00000d30  6d 65 6d 6f 72 79 2e 22  2b bd 28 31 33 29 0d 04  |memory."+.(13)..|
00000d40  6a 0b 45 51 55 42 20 20  30 0d 04 74 09 41 4c 49  |j.EQUB  0..t.ALI|
00000d50  47 4e 0d 04 7e 11 2e 6c  46 6c 75 73 68 53 79 6e  |GN..~..lFlushSyn|
00000d60  74 61 78 0d 04 88 27 45  51 55 53 20 20 22 53 79  |tax...'EQUS  "Sy|
00000d70  6e 74 61 78 3a 22 2b bd  28 39 29 2b 22 2a 46 6c  |ntax:"+.(9)+"*Fl|
00000d80  75 73 68 22 2b bd 28 31  33 29 0d 04 92 0b 45 51  |ush"+.(13)....EQ|
00000d90  55 42 20 20 30 0d 04 9c  0f 2e 6c 46 6c 75 73 68  |UB  0.....lFlush|
00000da0  48 65 6c 70 0d 04 a6 4d  45 51 55 53 20 20 22 2a  |Help...MEQUS  "*|
00000db0  46 6c 75 73 68 20 63 6c  65 61 72 73 20 63 75 72  |Flush clears cur|
00000dc0  72 65 6e 74 20 63 6f 6e  74 65 6e 74 73 20 6f 66  |rent contents of|
00000dd0  20 74 68 65 20 62 75 66  66 65 72 20 77 69 74 68  | the buffer with|
00000de0  6f 75 74 20 64 65 73 65  6c 65 63 74 69 6e 67 20  |out deselecting |
00000df0  22 0d 04 b0 4b 45 51 55  53 20 20 22 69 74 2e 20  |"...KEQUS  "it. |
00000e00  55 73 65 20 74 68 69 73  20 74 6f 20 63 6c 65 61  |Use this to clea|
00000e10  72 20 69 6e 66 6f 72 6d  61 74 69 6f 6e 20 79 6f  |r information yo|
00000e20  75 20 6e 6f 20 6c 6f 6e  67 65 72 20 77 61 6e 74  |u no longer want|
00000e30  20 74 6f 20 70 72 69 6e  74 2e 20 22 0d 04 ba 29  | to print. "...)|
00000e40  45 51 55 53 20 20 22 49  74 20 69 73 20 65 78 61  |EQUS  "It is exa|
00000e50  63 74 6c 79 20 65 71 75  69 76 61 6c 65 6e 74 20  |ctly equivalent |
00000e60  74 6f 3a 20 22 0d 04 c4  2a 45 51 55 53 20 20 22  |to: "...*EQUS  "|
00000e70  2a 46 58 22 2b bd 28 33  31 29 2b 22 32 31 22 2b  |*FX"+.(31)+"21"+|
00000e80  bd 28 33 31 29 2b 22 33  22 2b bd 28 31 33 29 0d  |.(31)+"3"+.(13).|
00000e90  04 ce 0b 45 51 55 42 20  20 30 0d 04 d8 09 41 4c  |...EQUB  0....AL|
00000ea0  49 47 4e 0d 04 e2 05 5d  0d 04 ec 07 3d 22 22 0d  |IGN....]....="".|
00000eb0  04 f6 0d dd 20 a4 65 73  63 61 70 65 0d 05 00 0e  |.... .escape....|
00000ec0  5b 20 4f 50 54 20 70 61  73 73 0d 05 01 34 3b 20  |[ OPT pass...4; |
00000ed0  54 72 61 70 20 65 73 63  61 70 65 20 66 6c 61 67  |Trap escape flag|
00000ee0  20 69 74 2c 20 74 68 65  6e 20 70 61 73 73 20 74  | it, then pass t|
00000ef0  6f 20 6f 6c 64 20 68 61  6e 64 6c 65 72 2e 0d 05  |o old handler...|
00000f00  02 36 3b 20 55 73 65 64  20 74 6f 20 70 72 65 76  |.6; Used to prev|
00000f10  65 6e 74 20 45 73 63 61  70 65 20 66 72 6f 6d 20  |ent Escape from |
00000f20  63 6c 65 61 72 69 6e 67  20 74 68 65 20 62 75 66  |clearing the buf|
00000f30  66 65 72 2e 0d 05 03 23  3b 20 65 6e 74 72 79 20  |fer....#; entry |
00000f40  2d 20 72 31 31 20 62 69  74 20 36 3d 31 20 2d 3e  |- r11 bit 6=1 ->|
00000f50  20 65 73 63 61 70 65 0d  05 04 28 3b 20 20 20 20  | escape...(;    |
00000f60  20 20 20 20 20 72 31 32  20 2d 20 70 6f 69 6e 74  |     r12 - point|
00000f70  65 72 20 74 6f 20 77 6f  72 6b 73 70 61 63 65 0d  |er to workspace.|
00000f80  05 0a 0c 2e 6c 45 73 63  61 70 65 0d 05 14 3e 53  |....lEscape...>S|
00000f90  54 52 20 20 20 72 30 2c  20 5b 73 70 2c 20 23 2d  |TR   r0, [sp, #-|
00000fa0  34 5d 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |4]              |
00000fb0  20 20 20 3b 20 66 6f 72  67 65 20 72 30 20 6f 6e  |   ; forge r0 on|
00000fc0  74 6f 20 73 74 61 63 6b  2e 0d 05 15 3e 80 20 20  |to stack....>.  |
00000fd0  20 72 30 2c 20 72 31 31  2c 20 23 28 31 3c 3c 36  | r0, r11, #(1<<6|
00000fe0  29 20 20 20 20 20 20 20  20 20 20 20 20 20 20 3b  |)              ;|
00000ff0  20 72 31 31 20 62 69 74  20 36 3d 31 20 2d 3e 20  | r11 bit 6=1 -> |
00001000  65 73 63 61 70 65 2e 0d  05 16 10 54 45 51 20 20  |escape.....TEQ  |
00001010  20 72 30 2c 20 23 30 0d  05 1e 3e 4d 4f 56 4e 45  | r0, #0...>MOVNE|
00001020  20 72 30 2c 20 23 31 20  20 20 20 20 20 20 20 20  | r0, #1         |
00001030  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 3b  |               ;|
00001040  20 69 66 20 65 73 63 61  70 65 20 74 68 65 6e 20  | if escape then |
00001050  66 6c 61 67 2e 0d 05 28  1d 53 54 52 4e 45 20 72  |flag...(.STRNE r|
00001060  30 2c 20 5b 72 31 32 2c  20 23 6f 45 73 63 61 70  |0, [r12, #oEscap|
00001070  65 5d 0d 05 32 29 4c 44  52 20 20 20 72 30 2c 20  |e]..2)LDR   r0, |
00001080  5b 72 31 32 2c 20 23 6f  4f 6c 64 41 64 64 72 65  |[r12, #oOldAddre|
00001090  73 73 5d 20 20 20 20 20  20 20 3b 0d 05 3c 46 53  |ss]       ;..<FS|
000010a0  54 4d 46 44 20 28 73 70  29 21 2c 20 7b 72 30 7d  |TMFD (sp)!, {r0}|
000010b0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
000010c0  20 20 20 3b 20 66 6f 72  67 65 20 6f 6c 64 20 61  |   ; forge old a|
000010d0  64 64 72 65 73 73 20 6f  6e 74 6f 20 73 74 61 63  |ddress onto stac|
000010e0  6b 0d 05 46 29 53 55 42  20 20 20 73 70 2c 20 73  |k..F)SUB   sp, s|
000010f0  70 2c 20 23 34 20 20 20  20 20 20 20 20 20 20 20  |p, #4           |
00001100  20 20 20 20 20 20 20 20  20 3b 0d 05 50 3f 4c 44  |         ;..P?LD|
00001110  52 20 20 20 72 31 32 2c  20 5b 72 31 32 2c 20 23  |R   r12, [r12, #|
00001120  6f 4f 6c 64 31 32 5d 20  20 20 20 20 20 20 20 20  |oOld12]         |
00001130  20 20 3b 20 6c 6f 61 64  20 6f 6c 64 20 76 61 6c  |  ; load old val|
00001140  75 65 20 6f 66 20 72 31  32 0d 05 5a 3d 4c 44 4d  |ue of r12..Z=LDM|
00001150  46 44 20 28 73 70 29 21  2c 20 7b 72 30 2c 20 70  |FD (sp)!, {r0, p|
00001160  63 7d 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |c}              |
00001170  20 3b 20 70 61 73 73 20  74 6f 20 6f 6c 64 20 68  | ; pass to old h|
00001180  61 6e 64 6c 65 72 0d 05  64 05 5d 0d 05 6e 07 3d  |andler..d.]..n.=|
00001190  22 22 0d 05 78 0e dd 20  a4 73 65 72 76 69 63 65  |""..x.. .service|
000011a0  0d 05 82 0e 5b 20 4f 50  54 20 70 61 73 73 0d 05  |....[ OPT pass..|
000011b0  83 40 3b 20 53 65 72 76  69 63 65 20 63 61 6c 6c  |.@; Service call|
000011c0  20 72 65 63 6c 61 69 6d  73 20 74 68 65 20 76 65  | reclaims the ve|
000011d0  63 74 6f 72 73 20 61 66  74 65 72 20 61 20 6e 6f  |ctors after a no|
000011e0  6e 2d 66 61 74 61 6c 20  72 65 73 65 74 2e 0d 05  |n-fatal reset...|
000011f0  84 30 3b 20 65 6e 74 72  79 20 2d 20 72 31 32 20  |.0; entry - r12 |
00001200  2d 20 70 6f 69 6e 74 65  72 20 74 6f 20 74 68 65  |- pointer to the|
00001210  20 70 72 69 76 61 74 65  20 77 6f 72 64 2e 0d 05  | private word...|
00001220  8c 0d 2e 6c 53 65 72 76  69 63 65 0d 05 96 1d 53  |...lService....S|
00001230  54 4d 46 44 20 28 73 70  29 21 2c 20 7b 72 30 2c  |TMFD (sp)!, {r0,|
00001240  20 72 35 2c 20 6c 6e 7d  0d 05 a0 2f 54 45 51 20  | r5, ln}.../TEQ |
00001250  20 20 72 31 2c 20 23 26  32 37 20 20 20 20 20 20  |  r1, #&27      |
00001260  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00001270  3b 20 72 65 73 65 74 0d  05 aa 21 4c 44 4d 4e 45  |; reset...!LDMNE|
00001280  46 44 20 20 28 73 70 29  21 2c 20 7b 72 30 2c 20  |FD  (sp)!, {r0, |
00001290  72 35 2c 20 70 63 7d 5e  0d 05 b4 13 4c 44 52 20  |r5, pc}^....LDR |
000012a0  20 20 72 35 2c 20 5b 72  31 32 5d 0d 05 be 17 42  |  r5, [r12]....B|
000012b0  4c 20 20 20 20 6c 43 6c  61 69 6d 5f 56 65 63 74  |L    lClaim_Vect|
000012c0  6f 72 0d 05 c8 1e 4c 44  4d 46 44 20 28 73 70 29  |or....LDMFD (sp)|
000012d0  21 2c 20 7b 72 30 2c 20  72 35 2c 20 70 63 7d 5e  |!, {r0, r5, pc}^|
000012e0  0d 05 d2 05 5d 0d 05 dc  07 3d 22 22 0d 05 e6 0b  |....]....=""....|
000012f0  dd 20 a4 69 6e 69 74 0d  05 f0 16 ea 20 72 54 6d  |. .init..... rTm|
00001300  70 2c 20 72 57 6f 72 6b  53 70 61 63 65 0d 05 fa  |p, rWorkSpace...|
00001310  1a 72 54 6d 70 3d 33 20  3a 20 72 57 6f 72 6b 53  |.rTmp=3 : rWorkS|
00001320  70 61 63 65 3d 20 32 0d  06 04 0e 5b 20 4f 50 54  |pace= 2....[ OPT|
00001330  20 70 61 73 73 0d 06 0e  2d 3b 20 45 6e 74 72 79  | pass...-; Entry|
00001340  20 20 2d 20 72 31 32 20  2d 20 70 6f 69 6e 74 65  |  - r12 - pointe|
00001350  72 20 74 6f 20 70 72 69  76 61 74 65 20 77 6f 72  |r to private wor|
00001360  64 2e 0d 06 18 24 3b 20  20 20 20 20 20 20 20 20  |d....$;         |
00001370  20 72 31 30 20 2d 20 70  6f 69 6e 74 65 72 20 74  | r10 - pointer t|
00001380  6f 20 61 72 67 2e 0d 06  22 31 3b 20 45 78 69 74  |o arg..."1; Exit|
00001390  20 20 20 2d 20 56 3d 31  20 2d 3e 20 65 72 72 6f  |   - V=1 -> erro|
000013a0  72 20 2d 20 72 30 20 2d  20 65 72 72 6f 72 20 70  |r - r0 - error p|
000013b0  6f 69 6e 74 65 72 2e 0d  06 2c 21 3b 20 50 75 72  |ointer...,!; Pur|
000013c0  70 6f 73 65 2d 20 49 6e  69 74 69 61 6c 69 73 65  |pose- Initialise|
000013d0  20 6d 6f 64 75 6c 65 2e  0d 06 36 0a 2e 6c 49 6e  | module...6..lIn|
000013e0  69 74 0d 06 40 3a 53 54  4d 46 44 20 20 20 20 28  |it..@:STMFD    (|
000013f0  73 70 29 21 2c 20 7b 72  31 2c 20 72 35 2c 20 72  |sp)!, {r1, r5, r|
00001400  36 2c 20 6c 6e 7d 20 20  20 20 3b 20 73 74 6f 72  |6, ln}    ; stor|
00001410  65 20 72 65 67 69 73 74  65 72 73 2e 0d 06 4a 4e  |e registers...JN|
00001420  4c 44 52 20 20 20 20 20  20 72 35 2c 20 5b 72 31  |LDR      r5, [r1|
00001430  32 5d 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |2]              |
00001440  20 20 20 20 3b 20 72 31  32 20 69 73 20 61 20 70  |    ; r12 is a p|
00001450  6f 69 6e 74 65 72 20 74  6f 20 74 68 65 20 70 72  |ointer to the pr|
00001460  69 76 61 74 65 20 77 6f  72 64 0d 06 54 42 54 45  |ivate word..TBTE|
00001470  51 20 20 20 20 20 20 72  35 2c 20 23 30 20 20 20  |Q      r5, #0   |
00001480  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00001490  20 20 3b 20 70 72 69 76  61 74 65 20 77 6f 72 64  |  ; private word|
000014a0  3c 3e 30 20 2d 3e 20 54  69 64 79 2e 0d 06 5e 12  |<>0 -> Tidy...^.|
000014b0  42 4e 45 20 20 20 20 20  20 6c 54 69 64 79 0d 06  |BNE      lTidy..|
000014c0  68 40 4d 4f 56 20 20 20  20 20 20 72 31 2c 20 72  |h@MOV      r1, r|
000014d0  31 30 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |10              |
000014e0  20 20 20 20 20 20 3b 20  72 31 30 20 69 73 20 70  |      ; r10 is p|
000014f0  6f 69 6e 74 65 72 20 74  6f 20 61 72 67 2e 0d 06  |ointer to arg...|
00001500  72 1e 4d 4f 56 20 20 20  20 20 20 72 36 2c 20 23  |r.MOV      r6, #|
00001510  69 44 65 66 61 75 6c 74  53 69 7a 65 0d 06 7c 3d  |iDefaultSize..|=|
00001520  4c 44 52 42 20 20 20 20  20 72 30 2c 20 5b 72 31  |LDRB     r0, [r1|
00001530  5d 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |]               |
00001540  20 20 20 20 3b 20 72 31  20 70 6f 69 6e 74 65 72  |    ; r1 pointer|
00001550  73 20 74 6f 20 61 72 67  2e 0d 06 86 3a 43 4d 50  |s to arg....:CMP|
00001560  20 20 20 20 20 20 72 30  2c 20 23 33 32 20 20 20  |      r0, #32   |
00001570  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00001580  20 3b 20 63 68 61 72 3e  3d 33 32 20 2d 3e 20 61  | ; char>=32 -> a|
00001590  72 67 2e 0d 06 90 1a 42  4c 48 53 20 20 20 20 20  |rg.....BLHS     |
000015a0  6c 45 76 61 6c 75 61 74  65 5f 41 72 67 0d 06 9a  |lEvaluate_Arg...|
000015b0  3a 4c 44 4d 56 53 46 44  20 20 28 73 70 29 21 2c  |:LDMVSFD  (sp)!,|
000015c0  20 7b 72 31 2c 20 72 35  2c 20 72 36 2c 20 70 63  | {r1, r5, r6, pc|
000015d0  7d 20 20 20 20 3b 20 72  65 74 75 72 6e 20 69 66  |}    ; return if|
000015e0  20 65 72 72 6f 72 2e 0d  06 a4 13 54 45 51 20 20  | error.....TEQ  |
000015f0  20 20 20 20 72 36 2c 20  23 30 0d 06 ae 46 4c 44  |    r6, #0...FLD|
00001600  4d 45 51 46 44 20 20 28  73 70 29 21 2c 20 7b 72  |MEQFD  (sp)!, {r|
00001610  31 2c 20 72 35 2c 20 72  36 2c 20 70 63 7d 20 20  |1, r5, r6, pc}  |
00001620  20 20 3b 20 72 65 74 75  72 6e 20 69 66 20 6e 6f  |  ; return if no|
00001630  20 73 70 61 63 65 20 72  65 71 75 69 72 65 64 2e  | space required.|
00001640  0d 06 b8 19 42 4c 20 20  20 20 20 20 20 6c 43 6c  |....BL       lCl|
00001650  61 69 6d 5f 53 70 61 63  65 0d 06 c2 3a 4c 44 4d  |aim_Space...:LDM|
00001660  56 53 46 44 20 20 28 73  70 29 21 2c 20 7b 72 31  |VSFD  (sp)!, {r1|
00001670  2c 20 72 35 2c 20 72 36  2c 20 70 63 7d 20 20 20  |, r5, r6, pc}   |
00001680  20 3b 20 72 65 74 75 72  6e 20 69 66 20 65 72 72  | ; return if err|
00001690  6f 72 2e 0d 06 cc 1a 42  4c 20 20 20 20 20 20 20  |or.....BL       |
000016a0  6c 43 6c 61 69 6d 5f 56  65 63 74 6f 72 0d 06 d6  |lClaim_Vector...|
000016b0  31 4c 44 4d 46 44 20 20  20 20 28 73 70 29 21 2c  |1LDMFD    (sp)!,|
000016c0  20 7b 72 31 2c 20 72 35  2c 20 72 36 2c 20 70 63  | {r1, r5, r6, pc|
000016d0  7d 20 20 20 20 3b 20 72  65 74 75 72 6e 2e 0d 06  |}    ; return...|
000016e0  e0 0a 2e 6c 54 69 64 79  0d 06 ea 1b 4c 44 52 20  |...lTidy....LDR |
000016f0  20 20 20 72 36 2c 20 5b  72 35 2c 20 23 6f 53 69  |   r6, [r5, #oSi|
00001700  7a 65 5d 0d 06 f4 18 42  4c 20 20 20 20 20 6c 43  |ze]....BL     lC|
00001710  6c 61 69 6d 5f 56 65 63  74 6f 72 0d 06 fe 22 4c  |laim_Vector..."L|
00001720  44 4d 46 44 20 20 28 73  70 29 21 2c 20 7b 72 31  |DMFD  (sp)!, {r1|
00001730  2c 20 72 35 2c 20 72 36  2c 20 70 63 7d 0d 07 08  |, r5, r6, pc}...|
00001740  04 0d 07 09 3c 3b 20 46  69 6e 64 20 74 68 65 20  |....<; Find the |
00001750  76 61 6c 75 65 20 6f 66  20 74 68 65 20 5b 3c 73  |value of the [<s|
00001760  69 7a 65 3e 5b 6b 5d 5d  20 61 72 67 75 6d 65 6e  |ize>[k]] argumen|
00001770  74 20 64 65 66 61 75 6c  74 20 38 6b 2e 0d 07 12  |t default 8k....|
00001780  22 3b 20 45 6e 74 72 79  20 2d 20 72 31 20 2d 20  |"; Entry - r1 - |
00001790  70 6f 69 6e 74 65 72 20  74 6f 20 61 72 67 2e 0d  |pointer to arg..|
000017a0  07 1c 47 3b 20 45 78 69  74 20 20 2d 20 72 36 20  |..G; Exit  - r6 |
000017b0  2d 20 73 69 7a 65 20 69  6e 20 62 79 74 65 73 2e  |- size in bytes.|
000017c0  20 6f 72 20 56 3d 31 20  2d 3e 20 65 72 72 6f 72  | or V=1 -> error|
000017d0  20 2d 20 72 30 20 2d 20  65 72 72 6f 72 20 70 6f  | - r0 - error po|
000017e0  69 6e 74 65 72 2e 0d 07  26 12 2e 6c 45 76 61 6c  |inter...&..lEval|
000017f0  75 61 74 65 5f 41 72 67  0d 07 30 1d 53 54 4d 46  |uate_Arg..0.STMF|
00001800  44 20 28 73 70 29 21 2c  20 7b 72 30 2c 20 72 32  |D (sp)!, {r0, r2|
00001810  2c 20 6c 6e 7d 0d 07 3a  40 4d 4f 56 20 20 20 72  |, ln}..:@MOV   r|
00001820  30 2c 20 23 31 30 20 20  20 20 20 20 20 20 20 20  |0, #10          |
00001830  20 20 20 20 20 20 20 20  20 20 20 20 20 3b 20 63  |             ; c|
00001840  6f 6e 76 65 72 73 69 6f  6e 20 69 6e 20 62 61 73  |onversion in bas|
00001850  65 20 31 30 2e 0d 07 44  46 84 52 20 20 20 72 30  |e 10...DF.R   r0|
00001860  2c 20 72 30 2c 20 23 28  31 3c 3c 32 39 29 20 20  |, r0, #(1<<29)  |
00001870  20 20 20 20 20 20 20 20  20 20 20 20 3b 20 62 69  |            ; bi|
00001880  74 20 32 39 20 69 6e 64  69 63 61 74 65 73 20 6c  |t 29 indicates l|
00001890  69 6d 69 74 20 69 6e 20  72 32 2e 0d 07 4e 4c 4d  |imit in r2...NLM|
000018a0  4f 56 20 20 20 72 32 2c  20 23 34 30 39 36 20 20  |OV   r2, #4096  |
000018b0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
000018c0  20 20 20 3b 20 76 61 6c  75 65 73 20 62 69 67 67  |   ; values bigg|
000018d0  65 72 20 74 68 65 6e 20  34 30 39 36 20 61 72 65  |er then 4096 are|
000018e0  20 73 69 6c 6c 79 2e 0d  07 58 1c 53 57 49 20 20  | silly...X.SWI  |
000018f0  20 22 58 4f 53 5f 52 65  61 64 55 6e 73 69 67 6e  | "XOS_ReadUnsign|
00001900  65 64 22 0d 07 62 14 41  44 44 56 53 20 73 70 2c  |ed"..b.ADDVS sp,|
00001910  20 73 70 2c 20 23 34 0d  07 6c 3a 4c 44 4d 56 53  | sp, #4..l:LDMVS|
00001920  46 44 20 28 73 70 29 21  2c 20 7b 72 32 2c 20 70  |FD (sp)!, {r2, p|
00001930  63 7d 20 20 20 20 20 20  20 20 20 20 20 20 20 3b  |c}             ;|
00001940  20 72 65 74 75 72 6e 20  69 66 20 65 72 72 6f 72  | return if error|
00001950  2e 0d 07 76 44 4d 4f 56  20 20 20 72 36 2c 20 72  |...vDMOV   r6, r|
00001960  32 2c 20 41 53 4c 20 23  31 30 20 20 20 20 20 20  |2, ASL #10      |
00001970  20 20 20 20 20 20 20 20  20 3b 20 72 36 20 69 6e  |         ; r6 in|
00001980  20 62 79 74 65 73 2c 20  72 32 20 69 6e 20 6b 62  | bytes, r2 in kb|
00001990  79 74 65 73 2e 0d 07 80  33 4c 44 52 42 20 20 72  |ytes....3LDRB  r|
000019a0  30 2c 20 5b 72 31 5d 2c  20 23 31 20 20 20 20 20  |0, [r1], #1     |
000019b0  20 20 20 20 20 20 20 20  20 20 20 20 20 3b 20 72  |             ; r|
000019c0  30 3d 20 63 68 61 72 2e  0d 07 8a 11 43 4d 50 20  |0= char.....CMP |
000019d0  20 20 72 30 2c 20 23 33  33 0d 07 94 14 42 4c 4f  |  r0, #33....BLO|
000019e0  20 20 20 6c 43 68 65 63  6b 54 61 69 6c 0d 07 9e  |   lCheckTail...|
000019f0  15 54 45 51 20 20 20 72  30 2c 20 23 97 28 22 4b  |.TEQ   r0, #.("K|
00001a00  22 29 0d 07 a8 14 42 45  51 20 20 20 6c 43 68 65  |")....BEQ   lChe|
00001a10  63 6b 54 61 69 6c 0d 07  b2 15 54 45 51 20 20 20  |ckTail....TEQ   |
00001a20  72 30 2c 20 23 97 28 22  6b 22 29 0d 07 bc 13 42  |r0, #.("k")....B|
00001a30  4e 45 20 20 20 6c 41 72  67 45 72 72 6f 72 0d 07  |NE   lArgError..|
00001a40  c6 0f 2e 6c 43 68 65 63  6b 54 61 69 6c 0d 07 d0  |...lCheckTail...|
00001a50  11 54 45 51 20 20 20 72  30 2c 20 23 31 33 0d 07  |.TEQ   r0, #13..|
00001a60  da 42 4c 44 4d 45 51 46  44 20 20 28 73 70 29 21  |.BLDMEQFD  (sp)!|
00001a70  2c 20 7b 72 30 2c 20 72  32 2c 20 70 63 7d 20 20  |, {r0, r2, pc}  |
00001a80  20 20 20 20 20 20 3b 20  66 6f 75 6e 64 20 3c 63  |      ; found <c|
00001a90  72 3e 20 2d 3e 20 74 65  72 6d 69 6e 61 74 65 2e  |r> -> terminate.|
00001aa0  0d 07 e4 16 4c 44 52 42  20 20 72 30 2c 20 5b 72  |....LDRB  r0, [r|
00001ab0  31 5d 2c 20 23 31 0d 07  ee 11 43 4d 50 20 20 20  |1], #1....CMP   |
00001ac0  72 30 2c 20 23 33 33 0d  07 f8 46 42 4c 4f 20 20  |r0, #33...FBLO  |
00001ad0  20 6c 43 68 65 63 6b 54  61 69 6c 20 20 20 20 20  | lCheckTail     |
00001ae0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 3b  |               ;|
00001af0  20 6f 6b 61 79 20 69 66  20 63 68 61 72 3c 33 33  | okay if char<33|
00001b00  2c 20 65 6c 73 65 20 65  72 72 6f 72 2e 0d 08 02  |, else error....|
00001b10  0e 2e 6c 41 72 67 45 72  72 6f 72 0d 08 0c 3c 41  |..lArgError...<A|
00001b20  44 52 20 20 20 72 30 2c  20 6c 41 72 67 45 72 72  |DR   r0, lArgErr|
00001b30  6f 72 42 6c 6f 63 6b 20  20 20 20 20 20 20 20 20  |orBlock         |
00001b40  20 20 20 3b 20 73 65 74  20 65 72 72 6f 72 20 70  |   ; set error p|
00001b50  6f 69 6e 74 65 72 2e 0d  08 16 40 53 57 49 20 20  |ointer....@SWI  |
00001b60  20 22 58 4f 53 5f 47 65  6e 65 72 61 74 65 45 72  | "XOS_GenerateEr|
00001b70  72 6f 72 22 20 20 20 20  20 20 20 20 20 20 20 3b  |ror"           ;|
00001b80  20 56 3d 31 20 2d 20 69  6e 64 69 63 61 74 65 73  | V=1 - indicates|
00001b90  20 65 72 72 6f 72 2e 0d  08 20 14 41 44 44 20 20  | error... .ADD  |
00001ba0  20 73 70 2c 20 73 70 2c  20 23 34 0d 08 2a 19 4c  | sp, sp, #4..*.L|
00001bb0  44 4d 46 44 20 28 73 70  29 21 2c 20 7b 72 32 2c  |DMFD (sp)!, {r2,|
00001bc0  20 70 63 7d 0d 08 34 13  2e 6c 41 72 67 45 72 72  | pc}..4..lArgErr|
00001bd0  6f 72 42 6c 6f 63 6b 0d  08 3e 16 45 51 55 44 20  |orBlock..>.EQUD |
00001be0  20 69 45 72 72 6f 72 42  61 73 65 2b 30 0d 08 48  | iErrorBase+0..H|
00001bf0  26 45 51 55 53 20 20 22  41 72 67 75 6d 65 6e 74  |&EQUS  "Argument|
00001c00  20 53 79 6e 74 61 78 3a  20 3c 73 69 7a 65 3e 5b  | Syntax: <size>[|
00001c10  6b 5d 22 0d 08 52 0b 45  51 55 42 20 20 30 0d 08  |k]"..R.EQUB  0..|
00001c20  5c 09 41 4c 49 47 4e 0d  08 5d 04 0d 08 5e 36 3b  |\.ALIGN..]...^6;|
00001c30  20 43 6c 61 69 6d 20 53  70 61 63 65 20 66 6f 72  | Claim Space for|
00001c40  20 74 68 65 20 62 75 66  66 65 72 20 61 6e 64 20  | the buffer and |
00001c50  69 6e 69 74 69 61 6c 69  73 65 20 76 61 6c 75 65  |initialise value|
00001c60  73 0d 08 66 2b 3b 20 45  6e 74 72 79 20 2d 20 72  |s..f+; Entry - r|
00001c70  36 20 2d 20 73 69 7a 65  20 6f 66 20 62 75 66 66  |6 - size of buff|
00001c80  65 72 20 69 6e 20 62 79  74 65 73 2e 0d 08 70 2d  |er in bytes...p-|
00001c90  3b 20 20 20 20 20 20 20  20 20 72 31 32 20 2d 20  |;         r12 - |
00001ca0  70 6f 69 6e 74 65 72 20  74 68 65 20 70 72 69 76  |pointer the priv|
00001cb0  61 74 65 20 77 6f 72 64  2e 0d 08 7a 2f 3b 20 45  |ate word...z/; E|
00001cc0  78 69 74 20 20 2d 20 56  3d 31 2c 20 72 30 20 2d  |xit  - V=1, r0 -|
00001cd0  20 70 6f 69 6e 74 65 72  20 74 6f 20 65 72 72 6f  | pointer to erro|
00001ce0  72 20 62 6c 6f 63 6b 2e  0d 08 7b 24 3b 20 20 20  |r block...{$;   |
00001cf0  20 20 20 20 20 20 72 35  20 2d 20 77 6f 72 6b 73  |      r5 - works|
00001d00  70 61 63 65 20 70 6f 69  6e 74 65 72 0d 08 84 11  |pace pointer....|
00001d10  2e 6c 43 6c 61 69 6d 5f  53 70 61 63 65 0d 08 8e  |.lClaim_Space...|
00001d20  1d 53 54 4d 46 44 20 28  73 70 29 21 2c 20 7b 72  |.STMFD (sp)!, {r|
00001d30  32 2c 20 72 33 2c 20 6c  6e 7d 0d 08 98 45 41 44  |2, r3, ln}...EAD|
00001d40  44 20 20 20 72 33 2c 20  72 36 2c 20 23 6f 42 75  |D   r3, r6, #oBu|
00001d50  66 66 65 72 20 20 20 20  20 20 20 20 20 20 20 20  |ffer            |
00001d60  20 20 3b 20 77 6f 72 6b  73 70 61 63 65 3d 20 62  |  ; workspace= b|
00001d70  75 66 66 65 72 73 69 7a  65 2b 6f 74 68 65 72 0d  |uffersize+other.|
00001d80  08 a2 39 4d 4f 56 20 20  20 72 30 2c 20 23 36 20  |..9MOV   r0, #6 |
00001d90  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00001da0  20 20 20 20 20 20 20 3b  20 63 6c 61 69 6d 20 77  |       ; claim w|
00001db0  6f 72 6b 73 70 61 63 65  0d 08 ac 16 53 57 49 20  |orkspace....SWI |
00001dc0  20 20 22 58 4f 53 5f 4d  6f 64 75 6c 65 22 0d 08  |  "XOS_Module"..|
00001dd0  b6 3a 4c 44 4d 56 53 46  44 20 28 73 70 29 21 2c  |.:LDMVSFD (sp)!,|
00001de0  20 7b 72 32 2c 20 72 33  2c 20 70 63 7d 20 20 20  | {r2, r3, pc}   |
00001df0  20 20 20 20 20 20 3b 20  72 65 74 75 72 6e 20 6f  |      ; return o|
00001e00  6e 20 65 72 72 6f 72 2e  0d 08 c0 4a 53 54 52 20  |n error....JSTR |
00001e10  20 20 72 32 2c 20 5b 72  31 32 5d 20 20 20 20 20  |  r2, [r12]     |
00001e20  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00001e30  3b 20 70 72 69 76 61 74  65 20 77 6f 72 64 20 3d  |; private word =|
00001e40  20 77 6f 72 6b 73 70 61  63 65 20 70 6f 69 6e 74  | workspace point|
00001e50  65 72 0d 08 ca 40 4d 4f  56 20 20 20 72 35 2c 20  |er...@MOV   r5, |
00001e60  72 32 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |r2              |
00001e70  20 20 20 20 20 20 20 20  20 20 3b 20 72 35 2c 20  |          ; r5, |
00001e80  69 73 20 72 65 74 75 72  6e 65 64 20 76 61 6c 75  |is returned valu|
00001e90  65 2e 0d 08 d4 47 4d 4f  56 20 20 20 72 54 6d 70  |e....GMOV   rTmp|
00001ea0  2c 20 23 6f 42 75 66 66  65 72 20 20 20 20 20 20  |, #oBuffer      |
00001eb0  20 20 20 20 20 20 20 20  20 20 3b 20 46 69 6e 64  |          ; Find|
00001ec0  20 61 64 64 72 65 73 73  20 6f 66 20 62 75 66 66  | address of buff|
00001ed0  65 72 20 73 74 61 72 74  2e 0d 08 de 48 53 54 52  |er start....HSTR|
00001ee0  20 20 20 72 54 6d 70 2c  20 5b 72 57 6f 72 6b 53  |   rTmp, [rWorkS|
00001ef0  70 61 63 65 2c 20 23 6f  50 6c 61 63 65 5d 20 20  |pace, #oPlace]  |
00001f00  20 3b 20 53 74 6f 72 65  20 74 68 69 73 20 69 6e  | ; Store this in|
00001f10  20 70 6c 61 63 65 20 74  6f 20 69 6e 73 65 72 74  | place to insert|
00001f20  2e 0d 08 e8 46 53 54 52  20 20 20 72 54 6d 70 2c  |....FSTR   rTmp,|
00001f30  20 5b 72 57 6f 72 6b 53  70 61 63 65 2c 20 23 6f  | [rWorkSpace, #o|
00001f40  4c 6f 6f 6b 5d 20 20 20  20 3b 20 53 74 6f 72 65  |Look]    ; Store|
00001f50  20 74 68 69 73 20 69 6e  20 70 6c 61 63 65 20 74  | this in place t|
00001f60  6f 20 6c 6f 6f 6b 2e 0d  08 f2 3c 41 44 44 20 20  |o look....<ADD  |
00001f70  20 72 54 6d 70 2c 20 72  54 6d 70 2c 20 72 36 20  | rTmp, rTmp, r6 |
00001f80  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 3b  |               ;|
00001f90  20 45 6e 64 3d 20 53 74  61 72 74 20 2b 20 53 69  | End= Start + Si|
00001fa0  7a 65 2e 0d 08 fc 46 53  54 52 20 20 20 72 54 6d  |ze....FSTR   rTm|
00001fb0  70 2c 20 5b 72 57 6f 72  6b 53 70 61 63 65 2c 20  |p, [rWorkSpace, |
00001fc0  23 6f 45 6e 64 5d 20 20  20 20 20 3b 20 53 74 6f  |#oEnd]     ; Sto|
00001fd0  72 65 20 74 68 69 73 20  69 6e 20 65 6e 64 20 6f  |re this in end o|
00001fe0  66 20 62 75 66 66 65 72  2e 0d 09 06 3f 53 54 52  |f buffer....?STR|
00001ff0  20 20 20 72 36 2c 20 5b  72 57 6f 72 6b 53 70 61  |   r6, [rWorkSpa|
00002000  63 65 2c 20 23 6f 53 69  7a 65 5d 20 20 20 20 20  |ce, #oSize]     |
00002010  20 3b 20 53 74 6f 72 65  20 53 69 7a 65 20 6f 66  | ; Store Size of|
00002020  20 62 75 66 66 65 72 2e  0d 09 10 48 53 54 52 20  | buffer....HSTR |
00002030  20 20 72 36 2c 20 5b 72  57 6f 72 6b 53 70 61 63  |  r6, [rWorkSpac|
00002040  65 2c 20 23 6f 53 70 61  63 65 5d 20 20 20 20 20  |e, #oSpace]     |
00002050  3b 20 53 74 6f 72 65 20  74 68 69 73 20 69 6e 20  |; Store this in |
00002060  61 6d 6f 75 6e 74 20 6f  66 20 73 70 61 63 65 2e  |amount of space.|
00002070  0d 09 1a 3c 4d 4f 56 20  20 20 72 54 6d 70 2c 20  |...<MOV   rTmp, |
00002080  23 30 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |#0              |
00002090  20 20 20 20 20 20 20 20  3b 20 52 65 73 65 74 20  |        ; Reset |
000020a0  65 73 63 61 70 65 20 66  6c 61 67 2e 0d 09 24 26  |escape flag...$&|
000020b0  53 54 52 20 20 20 72 54  6d 70 2c 20 5b 72 57 6f  |STR   rTmp, [rWo|
000020c0  72 6b 53 70 61 63 65 2c  20 23 6f 45 73 63 61 70  |rkSpace, #oEscap|
000020d0  65 5d 0d 09 2e 1d 4c 44  4d 46 44 20 28 73 70 29  |e]....LDMFD (sp)|
000020e0  21 2c 20 7b 72 32 2c 20  72 33 2c 20 70 63 7d 0d  |!, {r2, r3, pc}.|
000020f0  09 42 05 5d 0d 09 4c 07  3d 22 22 0d 09 56 0d dd  |.B.]..L.=""..V..|
00002100  20 a4 62 75 66 66 65 72  0d 09 60 0e 5b 20 4f 50  | .buffer..`.[ OP|
00002110  54 20 70 61 73 73 0d 09  61 2f 3b 20 43 6f 64 65  |T pass..a/; Code|
00002120  20 66 6f 72 20 74 68 65  20 2a 42 75 66 66 65 72  | for the *Buffer|
00002130  20 5b 3c 73 69 7a 65 3e  5b 6b 5d 5d 20 63 6f 6d  | [<size>[k]] com|
00002140  6d 61 6e 64 2e 0d 09 6a  1e 3b 20 45 6e 74 72 79  |mand...j.; Entry|
00002150  20 2d 20 72 31 20 2d 20  6e 6f 2e 20 6f 66 20 61  | - r1 - no. of a|
00002160  72 67 73 0d 09 74 23 3b  20 20 20 20 20 20 20 20  |rgs..t#;        |
00002170  20 72 30 20 2d 20 70 6f  69 6e 74 65 72 20 74 6f  | r0 - pointer to|
00002180  20 61 72 67 73 2e 0d 09  75 28 3b 20 20 20 20 20  | args...u(;     |
00002190  20 20 20 20 72 31 32 20  2d 20 70 6f 69 6e 74 65  |    r12 - pointe|
000021a0  72 20 74 6f 20 77 6f 72  6b 73 70 61 63 65 0d 09  |r to workspace..|
000021b0  7e 10 2e 6c 42 75 66 66  65 72 43 6f 64 65 0d 09  |~..lBufferCode..|
000021c0  88 1d 53 54 4d 46 44 20  28 73 70 29 21 2c 20 7b  |..STMFD (sp)!, {|
000021d0  72 31 2c 20 72 36 2c 20  6c 6e 7d 0d 09 92 49 42  |r1, r6, ln}...IB|
000021e0  4c 20 20 20 20 6c 4e 6f  42 75 66 66 65 72 43 6f  |L    lNoBufferCo|
000021f0  64 65 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |de              |
00002200  20 20 20 3b 20 64 65 61  6c 6c 6f 63 61 74 65 20  |   ; deallocate |
00002210  61 6e 79 20 70 72 65 76  69 6f 75 73 20 62 75 66  |any previous buf|
00002220  66 65 72 2e 0d 09 9c 1f  4c 44 4d 56 53 46 44 20  |fer.....LDMVSFD |
00002230  28 73 70 29 21 2c 20 7b  72 31 2c 20 72 36 2c 20  |(sp)!, {r1, r6, |
00002240  70 63 7d 0d 09 a6 1b 4d  4f 56 20 20 20 72 36 2c  |pc}....MOV   r6,|
00002250  20 23 69 44 65 66 61 75  6c 74 53 69 7a 65 0d 09  | #iDefaultSize..|
00002260  b0 3f 54 45 51 20 20 20  72 31 2c 20 23 30 20 20  |.?TEQ   r1, #0  |
00002270  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00002280  20 20 20 20 20 20 3b 20  72 31 20 69 73 20 6e 75  |      ; r1 is nu|
00002290  6d 62 65 72 20 6f 66 20  61 72 67 73 2e 0d 09 ba  |mber of args....|
000022a0  10 4d 4f 56 4e 45 20 72  31 2c 20 72 30 0d 09 c4  |.MOVNE r1, r0...|
000022b0  17 42 4c 4e 45 20 20 6c  45 76 61 6c 75 61 74 65  |.BLNE  lEvaluate|
000022c0  5f 41 72 67 0d 09 ce 1f  4c 44 4d 56 53 46 44 20  |_Arg....LDMVSFD |
000022d0  28 73 70 29 21 2c 20 7b  72 31 2c 20 72 36 2c 20  |(sp)!, {r1, r6, |
000022e0  70 63 7d 0d 09 d8 10 54  45 51 20 20 20 72 36 2c  |pc}....TEQ   r6,|
000022f0  20 23 30 0d 09 e2 41 4c  44 4d 45 51 46 44 20 28  | #0...ALDMEQFD (|
00002300  73 70 29 21 2c 20 7b 72  31 2c 20 72 36 2c 20 70  |sp)!, {r1, r6, p|
00002310  63 7d 20 20 20 20 20 20  20 20 20 3b 20 69 66 20  |c}         ; if |
00002320  73 69 7a 65 3d 30 20 64  6f 20 6e 6f 74 20 63 6c  |size=0 do not cl|
00002330  61 69 6d 2e 0d 09 ec 16  42 4c 20 20 20 20 6c 43  |aim.....BL    lC|
00002340  6c 61 69 6d 5f 53 70 61  63 65 0d 09 f6 1f 4c 44  |laim_Space....LD|
00002350  4d 56 53 46 44 20 28 73  70 29 21 2c 20 7b 72 31  |MVSFD (sp)!, {r1|
00002360  2c 20 72 36 2c 20 70 63  7d 0d 0a 00 17 42 4c 20  |, r6, pc}....BL |
00002370  20 20 20 6c 43 6c 61 69  6d 5f 56 65 63 74 6f 72  |   lClaim_Vector|
00002380  0d 0a 0a 1d 4c 44 4d 46  44 20 28 73 70 29 21 2c  |....LDMFD (sp)!,|
00002390  20 7b 72 31 2c 20 72 36  2c 20 70 63 7d 0d 0a 14  | {r1, r6, pc}...|
000023a0  05 5d 0d 0a 1e 07 3d 22  22 0d 0a 28 0c dd 20 a4  |.]....=""..(.. .|
000023b0  66 69 6e 61 6c 0d 0a 32  0e 5b 20 4f 50 54 20 70  |final..2.[ OPT p|
000023c0  61 73 73 0d 0a 33 44 3b  20 46 69 6e 69 61 6c 69  |ass..3D; Finiali|
000023d0  73 61 74 69 6f 6e 20 43  6f 64 65 2c 20 63 61 6c  |sation Code, cal|
000023e0  6c 65 64 20 62 79 20 2a  52 4d 4b 69 6c 6c 2c 20  |led by *RMKill, |
000023f0  2a 52 4d 43 6c 65 61 72  2c 20 2a 52 4d 54 69 64  |*RMClear, *RMTid|
00002400  79 2e 20 65 74 63 2e 0d  0a 3c 3d 3b 20 45 6e 74  |y. etc...<=; Ent|
00002410  72 79 20 2d 20 72 31 30  20 2d 20 66 61 74 61 6c  |ry - r10 - fatal|
00002420  69 74 79 20 69 6e 64 69  63 61 74 6f 72 2c 20 72  |ity indicator, r|
00002430  31 30 3d 30 20 6d 65 61  6e 73 20 6e 6f 6e 2d 66  |10=0 means non-f|
00002440  61 74 61 6c 0d 0a 46 30  3b 20 20 20 20 20 20 20  |atal..F0;       |
00002450  20 20 72 31 32 20 2d 20  70 6f 69 6e 74 65 72 20  |  r12 - pointer |
00002460  74 6f 20 74 68 65 20 70  72 69 76 61 74 65 20 77  |to the private w|
00002470  6f 72 64 2e 0d 0a 47 14  3b 20 45 78 69 74 20 20  |ord...G.; Exit  |
00002480  2d 20 72 30 20 3d 20 3f  0d 0a 50 0b 2e 6c 46 69  |- r0 = ?..P..lFi|
00002490  6e 61 6c 0d 0a 5a 21 53  54 4d 46 44 20 28 73 70  |nal..Z!STMFD (sp|
000024a0  29 21 2c 20 7b 72 31 2c  20 72 32 2c 20 72 35 2c  |)!, {r1, r2, r5,|
000024b0  20 6c 6e 7d 0d 0a 64 11  54 45 51 20 20 20 72 31  | ln}..d.TEQ   r1|
000024c0  30 2c 20 23 30 0d 0a 6e  14 42 45 51 20 20 20 6c  |0, #0..n.BEQ   l|
000024d0  4e 6f 6e 5f 46 61 74 61  6c 0d 0a 78 39 4d 4f 56  |Non_Fatal..x9MOV|
000024e0  20 20 20 72 30 2c 20 23  31 35 32 20 20 20 20 20  |   r0, #152     |
000024f0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00002500  20 3b 20 65 78 61 6d 69  6e 65 20 62 75 66 66 65  | ; examine buffe|
00002510  72 2e 0d 0a 82 10 4d 4f  56 20 20 20 72 31 2c 20  |r.....MOV   r1, |
00002520  23 33 0d 0a 8c 14 53 57  49 20 20 20 22 58 4f 53  |#3....SWI   "XOS|
00002530  5f 42 79 74 65 22 0d 0a  96 23 4c 44 4d 56 53 46  |_Byte"...#LDMVSF|
00002540  44 20 28 73 70 29 21 2c  20 7b 72 31 2c 20 72 32  |D (sp)!, {r1, r2|
00002550  2c 20 72 35 2c 20 70 63  7d 0d 0a a0 42 42 43 43  |, r5, pc}...BBCC|
00002560  20 20 20 6c 49 6e 55 73  65 45 72 72 6f 72 20 20  |   lInUseError  |
00002570  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00002580  20 3b 20 74 68 65 20 62  75 66 66 65 72 20 69 73  | ; the buffer is|
00002590  20 6e 6f 74 20 65 6d 70  74 79 2e 0d 0a aa 0f 2e  | not empty......|
000025a0  6c 4e 6f 6e 5f 46 61 74  61 6c 0d 0a b4 42 4c 44  |lNon_Fatal...BLD|
000025b0  52 20 20 20 72 35 2c 20  5b 72 31 32 5d 20 20 20  |R   r5, [r12]   |
000025c0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
000025d0  20 20 3b 20 72 35 20 69  73 20 77 6f 72 6b 73 70  |  ; r5 is worksp|
000025e0  61 63 65 20 70 6f 69 6e  74 65 72 2e 0d 0a be 10  |ace pointer.....|
000025f0  54 45 51 20 20 20 72 35  2c 20 23 30 0d 0a c8 43  |TEQ   r5, #0...C|
00002600  42 4c 4e 45 20 20 6c 52  65 73 74 6f 72 65 5f 56  |BLNE  lRestore_V|
00002610  65 63 74 6f 72 20 20 20  20 20 20 20 20 20 20 20  |ector           |
00002620  20 20 20 20 3b 20 6f 6e  6c 79 20 69 66 20 77 6f  |    ; only if wo|
00002630  72 6b 73 70 61 63 65 20  65 78 69 73 74 73 2e 0d  |rkspace exists..|
00002640  0a d2 21 4c 44 4d 46 44  20 28 73 70 29 21 2c 20  |..!LDMFD (sp)!, |
00002650  7b 72 31 2c 20 72 32 2c  20 72 35 2c 20 70 63 7d  |{r1, r2, r5, pc}|
00002660  0d 0a dc 10 2e 6c 49 6e  55 73 65 45 72 72 6f 72  |.....lInUseError|
00002670  0d 0a e6 1d 53 57 49 20  20 20 22 58 4f 53 5f 47  |....SWI   "XOS_G|
00002680  65 6e 65 72 61 74 65 45  72 72 6f 72 22 0d 0a f0  |enerateError"...|
00002690  1f 41 44 52 20 20 20 20  72 30 2c 20 6c 49 6e 55  |.ADR    r0, lInU|
000026a0  73 65 45 72 72 6f 72 42  6c 6f 63 6b 0d 0a fa 21  |seErrorBlock...!|
000026b0  4c 44 4d 46 44 20 28 73  70 29 21 2c 20 7b 72 31  |LDMFD (sp)!, {r1|
000026c0  2c 20 72 32 2c 20 72 35  2c 20 70 63 7d 0d 0b 04  |, r2, r5, pc}...|
000026d0  15 2e 6c 49 6e 55 73 65  45 72 72 6f 72 42 6c 6f  |..lInUseErrorBlo|
000026e0  63 6b 0d 0b 0e 16 45 51  55 44 20 20 69 45 72 72  |ck....EQUD  iErr|
000026f0  6f 72 42 61 73 65 2b 31  0d 0b 18 40 45 51 55 53  |orBase+1...@EQUS|
00002700  20 20 22 50 72 69 6e 74  65 72 20 42 75 66 66 65  |  "Printer Buffe|
00002710  72 20 63 75 72 72 65 6e  74 6c 79 20 69 6e 20 75  |r currently in u|
00002720  73 65 20 28 2a 46 6c 75  73 68 20 77 69 6c 6c 20  |se (*Flush will |
00002730  63 6c 65 61 72 29 2e 22  0d 0b 22 0b 45 51 55 42  |clear)."..".EQUB|
00002740  20 20 30 0d 0b 2c 09 41  4c 49 47 4e 0d 0b 36 05  |  0..,.ALIGN..6.|
00002750  3b 0d 0b 40 05 5d 0d 0b  4a 07 3d 22 22 0d 0b 54  |;..@.]..J.=""..T|
00002760  0f dd 20 a4 6e 6f 62 75  66 66 65 72 0d 0b 5e 0e  |.. .nobuffer..^.|
00002770  5b 20 4f 50 54 20 70 61  73 73 0d 0b 5f 24 3b 20  |[ OPT pass.._$; |
00002780  43 6f 64 65 20 66 6f 72  20 74 68 65 20 2a 4e 6f  |Code for the *No|
00002790  42 75 66 66 65 72 20 63  6f 6d 6d 61 6e 64 0d 0b  |Buffer command..|
000027a0  60 29 3b 20 45 6e 74 72  79 20 2d 20 72 31 32 20  |`); Entry - r12 |
000027b0  2d 20 70 6f 69 6e 74 65  72 20 74 6f 20 77 6f 72  |- pointer to wor|
000027c0  6b 73 70 61 63 65 2e 0d  0b 68 12 2e 6c 4e 6f 42  |kspace...h..lNoB|
000027d0  75 66 66 65 72 43 6f 64  65 0d 0b 72 26 53 54 4d  |ufferCode..r&STM|
000027e0  46 44 20 28 73 70 29 21  2c 20 7b 72 30 2c 20 72  |FD (sp)!, {r0, r|
000027f0  31 2c 20 72 32 2c 20 72  31 30 2c 20 6c 6e 7d 0d  |1, r2, r10, ln}.|
00002800  0b 7c 11 4d 4f 56 20 20  20 72 31 30 2c 20 23 31  |.|.MOV   r10, #1|
00002810  0d 0b 86 10 42 4c 20 20  20 20 6c 46 69 6e 61 6c  |....BL    lFinal|
00002820  0d 0b 90 43 41 44 44 56  53 20 73 70 2c 20 73 70  |...CADDVS sp, sp|
00002830  2c 20 23 34 20 20 20 20  20 20 20 20 20 20 20 20  |, #4            |
00002840  20 20 20 20 20 20 20 20  20 20 20 3b 20 70 6f 70  |           ; pop|
00002850  20 72 30 20 73 6f 20 6e  6f 74 20 72 65 73 74 6f  | r0 so not resto|
00002860  72 65 64 0d 0b 9a 3d 4c  44 4d 56 53 46 44 20 28  |red...=LDMVSFD (|
00002870  73 70 29 21 2c 20 7b 72  31 2c 20 72 32 2c 20 72  |sp)!, {r1, r2, r|
00002880  31 30 2c 20 70 63 7d 20  20 20 20 20 20 20 3b 20  |10, pc}       ; |
00002890  72 65 74 75 72 6e 20 69  66 20 65 72 72 6f 72 2e  |return if error.|
000028a0  0d 0b a4 43 4c 44 52 20  20 20 72 32 2c 20 5b 72  |...CLDR   r2, [r|
000028b0  31 32 5d 20 20 20 20 20  20 20 20 20 20 20 20 20  |12]             |
000028c0  20 20 20 20 20 20 20 20  20 20 20 3b 20 67 65 74  |           ; get|
000028d0  20 77 6f 72 6b 73 70 61  63 65 20 70 6f 69 6e 74  | workspace point|
000028e0  65 72 2e 0d 0b ae 10 54  45 51 20 20 20 72 32 2c  |er.....TEQ   r2,|
000028f0  20 23 30 0d 0b b8 44 4c  44 4d 45 51 46 44 20 28  | #0...DLDMEQFD (|
00002900  73 70 29 21 2c 20 7b 72  30 2c 20 72 31 2c 20 72  |sp)!, {r0, r1, r|
00002910  32 2c 20 72 31 30 2c 20  70 63 7d 20 20 20 3b 20  |2, r10, pc}   ; |
00002920  72 65 74 75 72 6e 20 69  66 20 6e 6f 20 77 6f 72  |return if no wor|
00002930  6b 73 70 61 63 65 2e 0d  0b c2 13 2e 6c 52 65 73  |kspace......lRes|
00002940  74 6f 72 65 5f 53 70 61  63 65 0d 0b cc 3c 4d 4f  |tore_Space...<MO|
00002950  56 20 20 20 72 30 2c 20  23 37 20 20 20 20 20 20  |V   r0, #7      |
00002960  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00002970  20 20 20 20 20 3b 20 66  72 65 65 20 77 6f 72 6b  |     ; free work|
00002980  73 70 61 63 65 2e 0d 0b  d6 16 53 57 49 20 20 20  |space.....SWI   |
00002990  22 58 4f 53 5f 4d 6f 64  75 6c 65 22 0d 0b e0 10  |"XOS_Module"....|
000029a0  4d 4f 56 20 20 20 72 32  2c 20 23 30 0d 0b ea 49  |MOV   r2, #0...I|
000029b0  53 54 52 20 20 20 72 32  2c 20 5b 72 31 32 5d 20  |STR   r2, [r12] |
000029c0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
000029d0  20 20 20 20 20 20 20 3b  20 72 65 73 65 74 20 76  |       ; reset v|
000029e0  61 6c 75 65 20 6f 66 20  70 72 69 76 61 74 65 20  |alue of private |
000029f0  77 6f 72 64 2e 0d 0b f4  44 41 44 44 56 53 20 73  |word....DADDVS s|
00002a00  70 2c 20 73 70 2c 20 23  34 20 20 20 20 20 20 20  |p, sp, #4       |
00002a10  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00002a20  3b 20 70 6f 70 20 72 30  20 73 6f 20 6e 6f 74 20  |; pop r0 so not |
00002a30  72 65 73 74 6f 72 65 64  2e 0d 0b fe 24 4c 44 4d  |restored....$LDM|
00002a40  56 53 46 44 20 28 73 70  29 21 2c 20 7b 72 31 2c  |VSFD (sp)!, {r1,|
00002a50  20 72 32 2c 20 72 31 30  2c 20 70 63 7d 0d 0c 08  | r2, r10, pc}...|
00002a60  26 4c 44 4d 46 44 20 28  73 70 29 21 2c 20 7b 72  |&LDMFD (sp)!, {r|
00002a70  30 2c 20 72 31 2c 20 72  32 2c 20 72 31 30 2c 20  |0, r1, r2, r10, |
00002a80  70 63 7d 0d 0c 12 05 5d  0d 0c 1c 07 3d 22 22 0d  |pc}....]....="".|
00002a90  0c 26 0c dd 20 a4 66 6c  75 73 68 0d 0c 30 0e 5b  |.&.. .flush..0.[|
00002aa0  20 4f 50 54 20 70 61 73  73 0d 0c 31 3a 3b 20 43  | OPT pass..1:; C|
00002ab0  6f 64 65 20 66 6f 72 20  74 68 65 20 2a 46 6c 75  |ode for the *Flu|
00002ac0  73 68 20 63 6f 6d 6d 61  6e 64 2e 20 45 71 75 69  |sh command. Equi|
00002ad0  76 61 6c 65 6e 74 20 74  6f 20 2a 46 58 20 32 31  |valent to *FX 21|
00002ae0  2c 33 2e 0d 0c 3a 0f 2e  6c 46 6c 75 73 68 43 6f  |,3...:..lFlushCo|
00002af0  64 65 0d 0c 44 1d 53 54  4d 46 44 20 28 73 70 29  |de..D.STMFD (sp)|
00002b00  21 2c 20 7b 72 30 2c 20  72 31 2c 20 6c 6e 7d 0d  |!, {r0, r1, ln}.|
00002b10  0c 4e 11 4d 4f 56 20 20  20 72 30 2c 20 23 32 31  |.N.MOV   r0, #21|
00002b20  0d 0c 58 10 4d 4f 56 20  20 20 72 31 2c 20 23 33  |..X.MOV   r1, #3|
00002b30  0d 0c 62 14 53 57 49 20  20 20 22 58 4f 53 5f 42  |..b.SWI   "XOS_B|
00002b40  79 74 65 22 0d 0c 6c 1f  4c 44 4d 56 43 46 44 20  |yte"..l.LDMVCFD |
00002b50  28 73 70 29 21 2c 20 7b  72 30 2c 20 72 31 2c 20  |(sp)!, {r0, r1, |
00002b60  70 63 7d 0d 0c 76 14 41  44 44 20 20 20 73 70 2c  |pc}..v.ADD   sp,|
00002b70  20 73 70 2c 20 23 34 0d  0c 80 19 4c 44 4d 46 44  | sp, #4....LDMFD|
00002b80  20 28 73 70 29 21 2c 20  7b 72 31 2c 20 70 63 7d  | (sp)!, {r1, pc}|
00002b90  0d 0c 8a 05 5d 0d 0c 94  07 3d 22 22 0d 0c 9e 0d  |....]....=""....|
00002ba0  dd 20 a4 69 6e 73 65 72  74 0d 0c a8 2a ea 20 72  |. .insert...*. r|
00002bb0  43 68 61 72 2c 20 72 52  65 74 75 72 6e 2c 20 72  |Char, rReturn, r|
00002bc0  50 6c 61 63 65 2c 20 72  53 70 61 63 65 2c 20 72  |Place, rSpace, r|
00002bd0  45 6e 64 0d 0c b2 19 72  43 68 61 72 3d 20 30 20  |End....rChar= 0 |
00002be0  3a 20 72 52 65 74 75 72  6e 3d 20 32 0d 0c bc 28  |: rReturn= 2...(|
00002bf0  72 50 6c 61 63 65 3d 20  33 20 3a 20 72 53 70 61  |rPlace= 3 : rSpa|
00002c00  63 65 3d 20 72 50 6c 61  63 65 20 3a 20 72 45 6e  |ce= rPlace : rEn|
00002c10  64 3d 20 34 0d 0c c6 0e  5b 20 4f 50 54 20 70 61  |d= 4....[ OPT pa|
00002c20  73 73 0d 0c d0 21 3b 20  49 6e 73 56 20 20 2d 20  |ss...!; InsV  - |
00002c30  49 6e 73 65 72 74 20 56  65 63 74 6f 72 20 43 6f  |Insert Vector Co|
00002c40  64 65 2e 0d 0c da 30 3b  20 45 6e 74 72 79 20 2d  |de....0; Entry -|
00002c50  20 72 30 3d 20 63 68 61  72 20 74 6f 20 69 6e 73  | r0= char to ins|
00002c60  65 72 74 2c 20 72 31 3d  20 62 75 66 66 65 72 20  |ert, r1= buffer |
00002c70  6e 6f 2e 0d 0c e4 2a 3b  20 45 78 69 74 20 20 2d  |no....*; Exit  -|
00002c80  20 72 32 3d 20 3f 2c 20  43 3d 31 20 69 6e 73 65  | r2= ?, C=1 inse|
00002c90  72 74 69 6f 6e 20 66 61  69 6c 65 64 2e 0d 0c ee  |rtion failed....|
00002ca0  0a 2e 6c 49 6e 73 56 0d  0c f8 47 20 54 45 51 20  |..lInsV...G TEQ |
00002cb0  20 20 20 20 72 42 75 66  66 65 72 4e 6f 2c 20 23  |    rBufferNo, #|
00002cc0  69 50 72 69 6e 74 65 72  20 20 20 20 20 20 20 20  |iPrinter        |
00002cd0  20 20 20 3b 20 49 6e 73  65 72 74 20 69 6e 20 50  |   ; Insert in P|
00002ce0  72 69 6e 74 65 72 20 42  75 66 66 65 72 3f 0d 0d  |rinter Buffer?..|
00002cf0  02 3a 20 4d 4f 56 4e 45  53 20 20 70 63 2c 20 6c  |.: MOVNES  pc, l|
00002d00  6e 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |n               |
00002d10  20 20 20 20 20 20 20 20  20 20 3b 20 4e 6f 2c 20  |          ; No, |
00002d20  50 61 73 73 20 6f 6e 2e  0d 0d 0c 0c 2e 6c 49 6e  |Pass on......lIn|
00002d30  73 65 72 74 0d 0d 16 41  20 4c 44 4d 46 44 20 20  |sert...A LDMFD  |
00002d40  20 28 73 70 29 21 2c 20  7b 72 52 65 74 75 72 6e  | (sp)!, {rReturn|
00002d50  7d 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |}               |
00002d60  3b 20 47 65 74 20 52 65  74 75 72 6e 20 41 64 64  |; Get Return Add|
00002d70  72 65 73 73 2e 0d 0d 20  3c 20 53 54 4d 46 44 20  |ress... < STMFD |
00002d80  20 20 28 73 70 29 21 2c  20 7b 72 53 70 61 63 65  |  (sp)!, {rSpace|
00002d90  7d 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |}               |
00002da0  20 3b 20 50 75 73 68 20  52 65 67 69 73 74 65 72  | ; Push Register|
00002db0  2e 0d 0d 2a 43 20 4c 44  52 20 20 20 20 20 72 53  |...*C LDR     rS|
00002dc0  70 61 63 65 2c 20 5b 72  57 6f 72 6b 53 70 61 63  |pace, [rWorkSpac|
00002dd0  65 2c 23 6f 53 70 61 63  65 5d 20 20 20 3b 20 4c  |e,#oSpace]   ; L|
00002de0  6f 61 64 20 53 70 61 63  65 20 69 6e 20 42 75 66  |oad Space in Buf|
00002df0  66 65 72 2e 0d 0d 34 47  20 54 45 51 20 20 20 20  |fer...4G TEQ    |
00002e00  20 72 53 70 61 63 65 2c  20 23 30 20 20 20 20 20  | rSpace, #0     |
00002e10  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00002e20  3b 20 48 6f 77 20 6d 75  63 68 20 73 70 61 63 65  |; How much space|
00002e30  20 69 6e 20 42 75 66 66  65 72 3f 0d 0d 3e 3f 20  | in Buffer?..>? |
00002e40  4c 44 4d 46 44 20 20 20  28 73 70 29 21 2c 20 7b  |LDMFD   (sp)!, {|
00002e50  72 53 70 61 63 65 7d 20  20 20 20 20 20 20 20 20  |rSpace}         |
00002e60  20 20 20 20 20 20 20 3b  20 52 65 73 74 6f 72 65  |       ; Restore|
00002e70  20 52 65 67 69 73 74 65  72 2e 0d 0d 48 4d 20 84  | Register...HM .|
00002e80  52 45 51 53 20 20 70 63  2c 20 72 52 65 74 75 72  |REQS  pc, rRetur|
00002e90  6e 2c 20 23 69 43 46 6c  61 67 20 20 20 20 20 20  |n, #iCFlag      |
00002ea0  20 20 20 20 20 3b 20 4e  6f 20 53 70 61 63 65 2c  |     ; No Space,|
00002eb0  20 52 65 74 75 72 6e 20  77 69 74 68 20 43 61 72  | Return with Car|
00002ec0  72 79 20 53 65 74 2e 0d  0d 52 3d 20 53 54 4d 46  |ry Set...R= STMF|
00002ed0  44 20 20 20 28 73 70 29  21 2c 20 7b 72 50 6c 61  |D   (sp)!, {rPla|
00002ee0  63 65 2c 20 72 45 6e 64  7d 20 20 20 20 20 20 20  |ce, rEnd}       |
00002ef0  20 20 20 3b 20 50 75 73  68 20 52 65 67 69 73 74  |   ; Push Regist|
00002f00  65 72 73 2e 0d 0d 5c 44  20 4c 44 52 20 20 20 20  |ers...\D LDR    |
00002f10  20 72 50 6c 61 63 65 2c  20 5b 72 57 6f 72 6b 53  | rPlace, [rWorkS|
00002f20  70 61 63 65 2c 20 23 6f  50 6c 61 63 65 5d 20 20  |pace, #oPlace]  |
00002f30  3b 20 4c 6f 61 64 20 52  65 67 69 73 74 65 72 73  |; Load Registers|
00002f40  2c 20 50 6c 61 63 65 2e  0d 0d 66 42 20 4c 44 52  |, Place...fB LDR|
00002f50  20 20 20 20 20 72 45 6e  64 2c 20 5b 72 57 6f 72  |     rEnd, [rWor|
00002f60  6b 53 70 61 63 65 2c 20  23 6f 45 6e 64 5d 20 20  |kSpace, #oEnd]  |
00002f70  20 20 20 20 3b 20 20 20  20 20 20 20 20 20 20 20  |    ;           |
00002f80  20 20 20 20 20 20 45 6e  64 2e 0d 0d 70 4a 20 42  |      End...pJ B|
00002f90  49 43 20 20 20 20 20 72  52 65 74 75 72 6e 2c 20  |IC     rReturn, |
00002fa0  72 52 65 74 75 72 6e 2c  20 23 69 43 46 6c 61 67  |rReturn, #iCFlag|
00002fb0  20 20 20 20 20 20 3b 20  43 6c 65 61 72 20 43 61  |      ; Clear Ca|
00002fc0  72 72 79 20 66 6c 61 67  20 66 6f 72 20 52 65 74  |rry flag for Ret|
00002fd0  75 72 6e 2e 0d 0d 7a 48  20 53 54 52 42 20 20 20  |urn...zH STRB   |
00002fe0  20 72 43 68 61 72 2c 20  5b 72 57 6f 72 6b 53 70  | rChar, [rWorkSp|
00002ff0  61 63 65 2c 20 72 50 6c  61 63 65 5d 20 20 20 20  |ace, rPlace]    |
00003000  3b 20 53 74 6f 72 65 20  43 68 61 72 61 63 74 65  |; Store Characte|
00003010  72 20 69 6e 20 42 75 66  66 65 72 2e 0d 0d 84 2d  |r in Buffer....-|
00003020  20 41 44 44 20 20 20 20  20 72 50 6c 61 63 65 2c  | ADD     rPlace,|
00003030  20 72 50 6c 61 63 65 2c  20 23 31 20 20 20 20 20  | rPlace, #1     |
00003040  20 20 20 20 20 20 20 20  3b 0d 0d 8e 46 20 54 45  |        ;...F TE|
00003050  51 20 20 20 20 20 72 50  6c 61 63 65 2c 20 72 45  |Q     rPlace, rE|
00003060  6e 64 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |nd              |
00003070  20 20 20 20 20 3b 20 41  72 65 20 77 65 20 61 74  |     ; Are we at|
00003080  20 65 6e 64 20 6f 66 20  42 75 66 66 65 72 2e 0d  | end of Buffer..|
00003090  0d 98 41 20 ec 51 20 20  20 72 50 6c 61 63 65 2c  |..A .Q   rPlace,|
000030a0  20 23 6f 42 75 66 66 65  72 20 20 20 20 20 20 20  | #oBuffer       |
000030b0  20 20 20 20 20 20 20 20  3b 20 59 65 73 2c 20 67  |        ; Yes, g|
000030c0  6f 20 62 61 63 6b 20 74  6f 20 73 74 61 72 74 2e  |o back to start.|
000030d0  0d 0d a2 3e 20 53 54 52  20 20 20 20 20 72 50 6c  |...> STR     rPl|
000030e0  61 63 65 2c 20 5b 72 57  6f 72 6b 53 70 61 63 65  |ace, [rWorkSpace|
000030f0  2c 20 23 6f 50 6c 61 63  65 5d 20 20 3b 20 53 74  |, #oPlace]  ; St|
00003100  6f 72 65 20 6e 65 77 20  70 6c 61 63 65 2e 0d 0d  |ore new place...|
00003110  ac 43 20 4c 44 52 20 20  20 20 20 72 53 70 61 63  |.C LDR     rSpac|
00003120  65 2c 20 5b 72 57 6f 72  6b 53 70 61 63 65 2c 20  |e, [rWorkSpace, |
00003130  23 6f 53 70 61 63 65 5d  20 20 3b 20 4c 6f 61 64  |#oSpace]  ; Load|
00003140  20 61 6d 6f 75 6e 74 20  6f 66 20 73 70 61 63 65  | amount of space|
00003150  2e 0d 0d b6 3e 20 53 55  42 20 20 20 20 20 72 53  |....> SUB     rS|
00003160  70 61 63 65 2c 20 72 53  70 61 63 65 2c 20 23 31  |pace, rSpace, #1|
00003170  20 20 20 20 20 20 20 20  20 20 20 20 20 3b 20 44  |             ; D|
00003180  65 63 72 65 6d 65 6e 74  20 73 70 61 63 65 2e 0d  |ecrement space..|
00003190  0d c0 3e 20 53 54 52 20  20 20 20 20 72 53 70 61  |..> STR     rSpa|
000031a0  63 65 2c 20 5b 72 57 6f  72 6b 53 70 61 63 65 2c  |ce, [rWorkSpace,|
000031b0  20 23 6f 53 70 61 63 65  5d 20 20 3b 20 53 74 6f  | #oSpace]  ; Sto|
000031c0  72 65 20 6e 65 77 20 73  70 61 63 65 2e 0d 0d ca  |re new space....|
000031d0  40 20 4c 44 4d 46 44 20  20 20 28 73 70 29 21 2c  |@ LDMFD   (sp)!,|
000031e0  20 7b 72 50 6c 61 63 65  2c 20 72 45 6e 64 7d 20  | {rPlace, rEnd} |
000031f0  20 20 20 20 20 20 20 20  20 3b 20 52 65 73 74 6f  |         ; Resto|
00003200  72 65 20 52 65 67 69 73  74 65 72 73 2e 0d 0d d4  |re Registers....|
00003210  46 20 4d 4f 56 53 20 20  20 20 70 63 2c 20 72 52  |F MOVS    pc, rR|
00003220  65 74 75 72 6e 20 20 20  20 20 20 20 20 20 20 20  |eturn           |
00003230  20 20 20 20 20 20 20 20  20 3b 20 52 65 74 75 72  |         ; Retur|
00003240  6e 20 77 69 74 68 20 43  61 72 72 79 20 43 6c 65  |n with Carry Cle|
00003250  61 72 2e 0d 0d de 05 5d  0d 0d e8 07 3d 22 22 0d  |ar.....]....="".|
00003260  0d f2 0d dd 20 a4 72 65  6d 6f 76 65 0d 0d fc 2d  |.... .remove...-|
00003270  ea 20 72 45 78 61 6d 69  6e 65 2c 20 72 52 65 6d  |. rExamine, rRem|
00003280  6f 76 65 64 2c 20 72 53  70 61 63 65 2c 20 72 4c  |oved, rSpace, rL|
00003290  6f 6f 6b 2c 20 72 45 6e  64 0d 0e 06 1d 72 45 78  |ook, rEnd....rEx|
000032a0  61 6d 69 6e 65 3d 20 30  20 3a 20 72 52 65 6d 6f  |amine= 0 : rRemo|
000032b0  76 65 64 3d 20 32 0d 0e  10 27 72 53 70 61 63 65  |ved= 2...'rSpace|
000032c0  3d 20 31 20 3a 20 72 4c  6f 6f 6b 3d 20 72 53 70  |= 1 : rLook= rSp|
000032d0  61 63 65 20 3a 20 72 45  6e 64 3d 20 34 0d 0e 1a  |ace : rEnd= 4...|
000032e0  0e 5b 20 4f 50 54 20 70  61 73 73 0d 0e 24 29 3b  |.[ OPT pass..$);|
000032f0  20 52 65 6d 56 20 20 2d  20 52 65 6d 6f 76 65 2f  | RemV  - Remove/|
00003300  45 78 61 6d 69 6e 65 20  56 65 63 74 6f 72 20 63  |Examine Vector c|
00003310  6f 64 65 2e 0d 0e 2e 42  3b 20 45 6e 74 72 79 20  |ode....B; Entry |
00003320  2d 20 72 31 3d 20 62 75  66 66 65 72 20 6e 6f 2e  |- r1= buffer no.|
00003330  2c 20 56 3d 31 20 6d 65  61 6e 73 20 65 78 61 6d  |, V=1 means exam|
00003340  69 6e 65 2c 20 56 3d 30  20 6d 65 61 6e 73 20 72  |ine, V=0 means r|
00003350  65 6d 6f 76 65 2e 0d 0e  38 42 3b 20 45 78 69 74  |emove...8B; Exit|
00003360  20 20 2d 20 72 32 3d 20  63 68 61 72 20 72 65 74  |  - r2= char ret|
00003370  75 72 6e 65 64 20 6f 72  20 65 78 61 6d 69 6e 65  |urned or examine|
00003380  64 2c 20 43 3d 31 20 62  75 66 66 65 72 20 77 61  |d, C=1 buffer wa|
00003390  73 20 65 6d 70 74 79 2e  0d 0e 42 0a 2e 6c 52 65  |s empty...B..lRe|
000033a0  6d 56 0d 0e 4c 3e 20 53  54 52 20 20 20 20 20 70  |mV..L> STR     p|
000033b0  63 2c 20 5b 72 57 6f 72  6b 53 70 61 63 65 2c 20  |c, [rWorkSpace, |
000033c0  23 6f 70 63 5d 20 20 20  20 20 20 20 20 20 20 3b  |#opc]          ;|
000033d0  20 73 74 6f 72 65 20 61  77 61 79 20 50 53 52 2e  | store away PSR.|
000033e0  0d 0e 56 4a 20 54 45 51  20 20 20 20 20 72 42 75  |..VJ TEQ     rBu|
000033f0  66 66 65 72 4e 6f 2c 20  23 69 50 72 69 6e 74 65  |fferNo, #iPrinte|
00003400  72 20 20 20 20 20 20 20  20 20 20 20 20 3b 20 52  |r            ; R|
00003410  65 6d 6f 76 65 20 66 72  6f 6d 20 50 72 69 6e 74  |emove from Print|
00003420  65 72 20 42 75 66 66 65  72 3f 0d 0e 60 3b 20 4d  |er Buffer?..`; M|
00003430  4f 56 4e 45 53 20 20 70  63 2c 20 6c 6e 20 20 20  |OVNES  pc, ln   |
00003440  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00003450  20 20 20 20 20 20 20 3b  20 4e 6f 2c 20 50 61 73  |       ; No, Pas|
00003460  73 20 6f 6e 2e 0d 0e 6a  11 2e 6c 52 65 6d 46 75  |s on...j..lRemFu|
00003470  6e 63 74 69 6f 6e 0d 0e  74 3d 20 53 54 4d 46 44  |nction..t= STMFD|
00003480  20 20 20 28 73 70 29 21  2c 20 7b 72 53 70 61 63  |   (sp)!, {rSpac|
00003490  65 2c 72 45 6e 64 7d 20  20 20 20 20 20 20 20 20  |e,rEnd}         |
000034a0  20 20 20 3b 20 50 75 73  68 20 52 65 67 69 73 74  |   ; Push Regist|
000034b0  65 72 2e 0d 0e 7e 44 20  4c 44 52 20 20 20 20 20  |er...~D LDR     |
000034c0  72 53 70 61 63 65 2c 20  5b 72 57 6f 72 6b 53 70  |rSpace, [rWorkSp|
000034d0  61 63 65 2c 20 23 6f 53  70 61 63 65 5d 20 20 20  |ace, #oSpace]   |
000034e0  3b 20 4c 6f 61 64 20 61  6d 6f 75 6e 74 20 6f 66  |; Load amount of|
000034f0  20 73 70 61 63 65 2e 0d  0e 88 27 20 4c 44 52 20  | space....' LDR |
00003500  20 20 20 20 72 45 6e 64  2c 20 5b 72 57 6f 72 6b  |    rEnd, [rWork|
00003510  53 70 61 63 65 2c 20 23  6f 53 69 7a 65 5d 0d 0e  |Space, #oSize]..|
00003520  92 42 20 54 45 51 20 20  20 20 20 72 53 70 61 63  |.B TEQ     rSpac|
00003530  65 2c 20 72 45 6e 64 20  20 20 20 20 20 20 20 20  |e, rEnd         |
00003540  20 20 20 20 20 20 20 20  20 20 20 3b 20 53 70 61  |           ; Spa|
00003550  63 65 3d 53 69 7a 65 20  2d 3e 20 45 6d 70 74 79  |ce=Size -> Empty|
00003560  0d 0e 9c 17 20 42 4e 45  20 20 20 20 20 6c 6e 6f  |.... BNE     lno|
00003570  74 5f 65 6d 70 74 79 0d  0e a6 44 20 4c 44 52 20  |t_empty...D LDR |
00003580  20 20 20 20 72 53 70 61  63 65 2c 20 5b 73 70 2c  |    rSpace, [sp,|
00003590  23 38 5d 20 20 20 20 20  20 20 20 20 20 20 20 20  |#8]             |
000035a0  20 20 20 20 3b 20 66 6f  72 67 65 20 43 20 73 65  |    ; forge C se|
000035b0  74 20 6f 6e 20 73 74 61  63 6b 2e 0d 0e b0 23 20  |t on stack....# |
000035c0  84 52 20 20 20 20 20 72  53 70 61 63 65 2c 20 72  |.R     rSpace, r|
000035d0  53 70 61 63 65 2c 20 23  69 43 46 6c 61 67 0d 0e  |Space, #iCFlag..|
000035e0  ba 1c 20 53 54 52 20 20  20 20 20 72 53 70 61 63  |.. STR     rSpac|
000035f0  65 2c 20 5b 73 70 2c 23  38 5d 0d 0e c4 44 20 4c  |e, [sp,#8]...D L|
00003600  44 4d 45 51 46 44 20 28  73 70 29 21 2c 20 7b 72  |DMEQFD (sp)!, {r|
00003610  53 70 61 63 65 2c 20 72  45 6e 64 2c 20 70 63 7d  |Space, rEnd, pc}|
00003620  5e 20 20 20 20 20 20 3b  20 52 65 74 75 72 6e 20  |^      ; Return |
00003630  69 66 20 65 6d 70 74 79  2c 20 43 3d 31 2e 0d 0e  |if empty, C=1...|
00003640  ce 04 0d 0e d8 0f 2e 6c  6e 6f 74 5f 65 6d 70 74  |.......lnot_empt|
00003650  79 0d 0e e2 46 20 4c 44  52 20 20 20 20 20 72 53  |y...F LDR     rS|
00003660  70 61 63 65 2c 20 5b 73  70 2c 23 38 5d 20 20 20  |pace, [sp,#8]   |
00003670  20 20 20 20 20 20 20 20  20 20 20 20 20 20 3b 20  |              ; |
00003680  66 6f 72 67 65 20 43 20  63 6c 65 61 72 20 6f 6e  |forge C clear on|
00003690  20 73 74 61 63 6b 2e 0d  0e ec 24 20 42 49 43 20  | stack....$ BIC |
000036a0  20 20 20 20 72 53 70 61  63 65 2c 20 72 53 70 61  |    rSpace, rSpa|
000036b0  63 65 2c 20 23 69 43 46  6c 61 67 0d 0e f6 1c 20  |ce, #iCFlag.... |
000036c0  53 54 52 20 20 20 20 20  72 53 70 61 63 65 2c 20  |STR     rSpace, |
000036d0  5b 73 70 2c 23 38 5d 0d  0f 00 3f 20 4c 44 52 20  |[sp,#8]...? LDR |
000036e0  20 20 20 20 72 4c 6f 6f  6b 2c 20 5b 72 57 6f 72  |    rLook, [rWor|
000036f0  6b 53 70 61 63 65 2c 20  23 6f 70 63 5d 20 20 20  |kSpace, #opc]   |
00003700  20 20 20 20 3b 20 67 65  74 20 50 53 52 20 6f 6e  |    ; get PSR on|
00003710  20 65 6e 74 72 79 0d 0f  0a 16 20 54 45 51 50 20  | entry.... TEQP |
00003720  20 20 20 70 63 2c 20 72  4c 6f 6f 6b 0d 0f 14 4c  |   pc, rLook...L|
00003730  20 42 56 43 20 20 20 20  20 6c 52 65 6d 6f 76 65  | BVC     lRemove|
00003740  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00003750  20 20 20 20 20 20 20 20  20 3b 20 49 66 20 56 3d  |         ; If V=|
00003760  30 20 74 68 65 6e 20 62  72 61 6e 63 68 20 74 6f  |0 then branch to|
00003770  20 52 65 6d 6f 76 65 2e  0d 0f 1e 4e 20 4c 44 52  | Remove....N LDR|
00003780  20 20 20 20 20 72 4c 6f  6f 6b 2c 20 5b 72 57 6f  |     rLook, [rWo|
00003790  72 6b 53 70 61 63 65 2c  20 23 6f 4c 6f 6f 6b 5d  |rkSpace, #oLook]|
000037a0  20 20 20 20 20 3b 20 4c  6f 61 64 20 70 6f 69 6e  |     ; Load poin|
000037b0  74 65 72 20 74 6f 20 63  68 61 72 20 74 6f 20 72  |ter to char to r|
000037c0  65 6d 6f 76 65 2e 0d 0f  28 3f 20 4c 44 52 42 20  |emove...(? LDRB |
000037d0  20 20 20 72 45 78 61 6d  69 6e 65 2c 20 5b 72 57  |   rExamine, [rW|
000037e0  6f 72 6b 53 70 61 63 65  2c 20 72 4c 6f 6f 6b 5d  |orkSpace, rLook]|
000037f0  20 20 20 3b 20 4c 6f 61  64 20 63 68 61 72 20 76  |   ; Load char v|
00003800  61 6c 75 65 2e 0d 0f 32  1f 20 4d 4f 56 20 20 20  |alue...2. MOV   |
00003810  20 20 72 52 65 6d 6f 76  65 64 2c 20 72 45 78 61  |  rRemoved, rExa|
00003820  6d 69 6e 65 0d 0f 3c 27  20 4c 44 4d 46 44 20 20  |mine..<' LDMFD  |
00003830  20 28 73 70 29 21 2c 20  7b 72 53 70 61 63 65 2c  | (sp)!, {rSpace,|
00003840  20 72 45 6e 64 2c 20 70  63 7d 5e 0d 0f 46 40 20  | rEnd, pc}^..F@ |
00003850  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
*
00003870  20 20 20 20 20 20 20 20  3b 20 52 65 6d 6f 76 65  |        ; Remove|
00003880  20 43 68 61 72 61 63 74  65 72 2e 0d 0f 50 0c 2e  | Character...P..|
00003890  6c 52 65 6d 6f 76 65 0d  0f 5a 4e 20 4c 44 52 20  |lRemove..ZN LDR |
000038a0  20 20 20 20 72 4c 6f 6f  6b 2c 20 5b 72 57 6f 72  |    rLook, [rWor|
000038b0  6b 53 70 61 63 65 2c 20  23 6f 4c 6f 6f 6b 5d 20  |kSpace, #oLook] |
000038c0  20 20 20 20 3b 20 4c 6f  61 64 20 70 6f 69 6e 74  |    ; Load point|
000038d0  65 72 20 74 6f 20 63 68  61 72 20 74 6f 20 72 65  |er to char to re|
000038e0  6d 6f 76 65 2e 0d 0f 64  4d 20 4c 44 52 20 20 20  |move...dM LDR   |
000038f0  20 20 72 45 6e 64 2c 20  5b 72 57 6f 72 6b 53 70  |  rEnd, [rWorkSp|
00003900  61 63 65 2c 20 23 6f 45  6e 64 5d 20 20 20 20 20  |ace, #oEnd]     |
00003910  20 20 3b 20 4c 6f 61 64  20 70 6f 69 6e 74 65 72  |  ; Load pointer|
00003920  20 74 6f 20 65 6e 64 20  6f 66 20 62 75 66 66 65  | to end of buffe|
00003930  72 2e 0d 0f 6e 4b 20 4c  44 52 42 20 20 20 20 72  |r...nK LDRB    r|
00003940  52 65 6d 6f 76 65 64 2c  20 5b 72 57 6f 72 6b 53  |Removed, [rWorkS|
00003950  70 61 63 65 2c 20 72 4c  6f 6f 6b 5d 20 20 20 3b  |pace, rLook]   ;|
00003960  20 4c 6f 61 64 20 63 68  61 72 20 76 61 6c 75 65  | Load char value|
00003970  2c 20 61 6e 64 20 72 65  6d 6f 76 65 2e 0d 0f 78  |, and remove...x|
00003980  45 20 41 44 44 20 20 20  20 20 72 4c 6f 6f 6b 2c  |E ADD     rLook,|
00003990  20 72 4c 6f 6f 6b 2c 20  23 31 20 20 20 20 20 20  | rLook, #1      |
000039a0  20 20 20 20 20 20 20 20  20 20 3b 20 69 6e 63 72  |          ; incr|
000039b0  65 6d 65 6e 74 20 6c 6f  6f 6b 20 70 6f 69 6e 74  |ement look point|
000039c0  65 72 0d 0f 82 1f 20 4d  4f 56 20 20 20 20 20 72  |er.... MOV     r|
000039d0  45 78 61 6d 69 6e 65 2c  20 72 52 65 6d 6f 76 65  |Examine, rRemove|
000039e0  64 0d 0f 8c 47 20 54 45  51 20 20 20 20 20 72 4c  |d...G TEQ     rL|
000039f0  6f 6f 6b 2c 20 72 45 6e  64 20 20 20 20 20 20 20  |ook, rEnd       |
00003a00  20 20 20 20 20 20 20 20  20 20 20 20 20 20 3b 20  |              ; |
00003a10  41 72 65 20 77 65 20 61  74 20 65 6e 64 20 6f 66  |Are we at end of|
00003a20  20 42 75 66 66 65 72 3f  0d 0f 96 42 20 ec 51 20  | Buffer?...B .Q |
00003a30  20 20 72 4c 6f 6f 6b 2c  20 23 6f 42 75 66 66 65  |  rLook, #oBuffe|
00003a40  72 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |r               |
00003a50  20 20 3b 20 59 65 73 2c  20 67 6f 20 62 61 63 6b  |  ; Yes, go back|
00003a60  20 74 6f 20 73 74 61 72  74 2e 0d 0f a0 46 20 53  | to start....F S|
00003a70  54 52 20 20 20 20 20 72  4c 6f 6f 6b 2c 20 5b 72  |TR     rLook, [r|
00003a80  57 6f 72 6b 53 70 61 63  65 2c 20 23 6f 4c 6f 6f  |WorkSpace, #oLoo|
00003a90  6b 5d 20 20 20 20 20 3b  20 53 61 76 65 20 6e 65  |k]     ; Save ne|
00003aa0  77 20 70 6c 61 63 65 20  74 6f 20 6c 6f 6f 6b 2e  |w place to look.|
00003ab0  0d 0f aa 4e 20 4c 44 52  20 20 20 20 20 72 53 70  |...N LDR     rSp|
00003ac0  61 63 65 2c 20 5b 72 57  6f 72 6b 53 70 61 63 65  |ace, [rWorkSpace|
00003ad0  2c 20 23 6f 53 70 61 63  65 5d 20 20 20 3b 20 4c  |, #oSpace]   ; L|
00003ae0  6f 61 64 20 61 6d 6f 75  6e 74 20 6f 66 20 73 70  |oad amount of sp|
00003af0  61 63 65 20 69 6e 20 62  75 66 66 65 72 2e 0d 0f  |ace in buffer...|
00003b00  b4 4a 20 41 44 44 20 20  20 20 20 72 53 70 61 63  |.J ADD     rSpac|
00003b10  65 2c 20 72 53 70 61 63  65 2c 20 23 31 20 20 20  |e, rSpace, #1   |
00003b20  20 20 20 20 20 20 20 20  20 20 20 3b 20 49 6e 63  |           ; Inc|
00003b30  2e 20 73 70 61 63 65 20  2d 20 6f 6e 65 20 6c 65  |. space - one le|
00003b40  73 73 20 63 68 61 72 2e  0d 0f be 44 20 53 54 52  |ss char....D STR|
00003b50  20 20 20 20 20 72 53 70  61 63 65 2c 20 5b 72 57  |     rSpace, [rW|
00003b60  6f 72 6b 53 70 61 63 65  2c 20 23 6f 53 70 61 63  |orkSpace, #oSpac|
00003b70  65 5d 20 20 20 3b 20 53  61 76 65 20 61 6d 6f 75  |e]   ; Save amou|
00003b80  6e 74 20 6f 66 20 73 70  61 63 65 2e 0d 0f c8 41  |nt of space....A|
00003b90  20 4c 44 4d 46 44 20 20  20 28 73 70 29 21 2c 20  | LDMFD   (sp)!, |
00003ba0  7b 72 53 70 61 63 65 2c  20 72 45 6e 64 2c 20 70  |{rSpace, rEnd, p|
00003bb0  63 7d 5e 20 20 20 20 20  20 3b 20 52 65 73 74 6f  |c}^      ; Resto|
00003bc0  72 65 20 52 65 67 69 73  74 65 72 73 2e 0d 0f d2  |re Registers....|
00003bd0  05 5d 0d 0f dc 07 3d 22  22 0d 0f e6 0c dd 20 a4  |.]....=""..... .|
00003be0  63 6f 75 6e 74 0d 0f f0  32 ea 20 72 43 6f 75 6e  |count...2. rCoun|
00003bf0  74 4c 2c 20 72 43 6f 75  6e 74 48 2c 20 72 53 69  |tL, rCountH, rSi|
00003c00  7a 65 2c 20 72 53 70 61  63 65 2c 20 72 54 6d 70  |ze, rSpace, rTmp|
00003c10  2c 20 69 42 6f 74 38 0d  0f fa 1b 72 43 6f 75 6e  |, iBot8....rCoun|
00003c20  74 4c 3d 20 31 20 3a 20  72 43 6f 75 6e 74 48 3d  |tL= 1 : rCountH=|
00003c30  20 32 0d 10 04 2e 72 53  70 61 63 65 3d 20 72 43  | 2....rSpace= rC|
00003c40  6f 75 6e 74 4c 20 3a 20  72 53 69 7a 65 3d 20 72  |ountL : rSize= r|
00003c50  43 6f 75 6e 74 48 20 3a  20 72 54 6d 70 3d 20 30  |CountH : rTmp= 0|
00003c60  0d 10 0e 0e 69 42 6f 74  38 3d 20 26 46 46 0d 10  |....iBot8= &FF..|
00003c70  18 0e 5b 20 4f 50 54 20  70 61 73 73 0d 10 22 26  |..[ OPT pass.."&|
00003c80  3b 20 43 6e 70 56 20 20  2d 20 43 6f 75 6e 74 2f  |; CnpV  - Count/|
00003c90  50 75 72 67 65 20 56 65  63 74 6f 72 20 43 6f 64  |Purge Vector Cod|
00003ca0  65 2e 0d 10 2c 48 3b 20  45 6e 74 72 79 20 2d 20  |e...,H; Entry - |
00003cb0  72 31 3d 20 62 75 66 66  65 72 20 6e 6f 2e 2c 20  |r1= buffer no., |
00003cc0  56 3d 30 20 2d 3e 20 63  6f 75 6e 74 2c 20 43 3d  |V=0 -> count, C=|
00003cd0  30 20 2d 3e 20 65 6e 74  72 69 65 73 2c 20 43 3d  |0 -> entries, C=|
00003ce0  31 20 2d 3e 20 73 70 61  63 65 0d 10 36 2b 3b 20  |1 -> space..6+; |
00003cf0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00003d00  20 20 20 20 20 20 20 20  56 3d 31 20 2d 3e 20 70  |        V=1 -> p|
00003d10  75 72 67 65 2e 0d 10 40  4a 3b 20 45 78 69 74 20  |urge...@J; Exit |
00003d20  20 2d 20 72 30 3d 20 3f  2c 20 69 66 20 56 3d 30  | - r0= ?, if V=0|
00003d30  20 74 68 65 6e 20 72 31  3d 20 63 6f 75 6e 74 20  | then r1= count |
00003d40  28 62 6f 74 74 6f 6d 20  38 29 3b 20 72 32 3d 20  |(bottom 8); r2= |
00003d50  63 6f 75 6e 74 20 28 74  6f 70 20 32 34 29 2e 0d  |count (top 24)..|
00003d60  10 4a 0a 2e 6c 43 6e 70  56 0d 10 54 23 20 53 54  |.J..lCnpV..T# ST|
00003d70  52 20 20 20 20 20 70 63  2c 20 5b 72 57 6f 72 6b  |R     pc, [rWork|
00003d80  53 70 61 63 65 2c 20 23  6f 70 63 5d 0d 10 5e 48  |Space, #opc]..^H|
00003d90  20 54 45 51 20 20 20 20  20 72 42 75 66 66 65 72  | TEQ     rBuffer|
00003da0  4e 6f 2c 20 23 69 50 72  69 6e 74 65 72 20 20 20  |No, #iPrinter   |
00003db0  20 20 20 20 20 20 20 3b  20 43 6f 75 6e 74 2f 50  |       ; Count/P|
00003dc0  75 72 67 65 20 50 72 69  6e 74 65 72 20 42 75 66  |urge Printer Buf|
00003dd0  66 65 72 3f 0d 10 68 39  20 4d 4f 56 4e 45 53 20  |fer?..h9 MOVNES |
00003de0  20 70 63 2c 20 6c 6e 20  20 20 20 20 20 20 20 20  | pc, ln         |
00003df0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 3b  |               ;|
00003e00  20 4e 6f 2c 20 50 61 73  73 20 6f 6e 2e 0d 10 72  | No, Pass on...r|
00003e10  11 2e 6c 43 6e 70 46 75  6e 63 74 69 6f 6e 0d 10  |..lCnpFunction..|
00003e20  7c 36 20 4c 44 52 20 20  20 20 20 72 30 2c 20 5b  ||6 LDR     r0, [|
00003e30  72 57 6f 72 6b 53 70 61  63 65 2c 20 23 6f 70 63  |rWorkSpace, #opc|
00003e40  5d 20 20 20 20 20 20 20  20 3b 20 73 74 6f 72 65  |]        ; store|
00003e50  20 50 53 52 0d 10 86 13  20 54 45 51 50 20 20 20  | PSR.... TEQP   |
00003e60  20 70 63 2c 20 72 30 0d  10 90 49 20 42 56 53 20  | pc, r0...I BVS |
00003e70  20 20 20 20 6c 50 75 72  67 65 20 20 20 20 20 20  |    lPurge      |
00003e80  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00003e90  20 20 3b 20 69 66 20 56  3d 31 20 74 68 65 6e 20  |  ; if V=1 then |
00003ea0  62 72 61 6e 63 68 20 74  6f 20 70 75 72 67 65 2e  |branch to purge.|
00003eb0  0d 10 9a 04 0d 10 a4 41  2e 6c 43 6f 75 6e 74 20  |.......A.lCount |
00003ec0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00003ed0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 3b  |               ;|
00003ee0  20 43 6f 75 6e 74 20 65  6e 74 72 69 65 73 2f 73  | Count entries/s|
00003ef0  70 61 63 65 2e 0d 10 ae  43 20 4c 44 52 20 20 20  |pace....C LDR   |
00003f00  20 20 72 43 6f 75 6e 74  4c 2c 20 5b 72 57 6f 72  |  rCountL, [rWor|
00003f10  6b 53 70 61 63 65 2c 20  23 6f 53 70 61 63 65 5d  |kSpace, #oSpace]|
00003f20  20 3b 20 4c 6f 61 64 20  61 6d 6f 75 6e 74 20 6f  | ; Load amount o|
00003f30  66 20 73 70 61 63 65 2e  0d 10 b8 4c 20 42 4c 43  |f space....L BLC|
00003f40  43 20 20 20 20 6c 45 6e  74 72 79 20 20 20 20 20  |C    lEntry     |
00003f50  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00003f60  20 20 20 3b 20 69 66 20  43 3d 30 20 74 68 65 6e  |   ; if C=0 then|
00003f70  20 73 75 62 72 6f 75 74  69 6e 65 20 65 6e 74 72  | subroutine entr|
00003f80  69 65 73 2e 0d 10 c2 46  20 4d 4f 56 20 20 20 20  |ies....F MOV    |
00003f90  20 72 43 6f 75 6e 74 48  2c 20 72 43 6f 75 6e 74  | rCountH, rCount|
00003fa0  4c 2c 20 41 53 52 20 23  38 20 20 20 20 20 20 3b  |L, ASR #8      ;|
00003fb0  20 47 65 74 20 74 6f 70  20 32 34 20 62 69 74 73  | Get top 24 bits|
00003fc0  20 6f 66 20 63 6f 75 6e  74 2e 0d 10 cc 46 20 80  | of count....F .|
00003fd0  20 20 20 20 20 72 43 6f  75 6e 74 4c 2c 20 72 43  |     rCountL, rC|
00003fe0  6f 75 6e 74 4c 2c 20 23  69 42 6f 74 38 20 20 20  |ountL, #iBot8   |
00003ff0  20 20 20 3b 20 47 65 74  20 62 6f 74 74 6f 6d 20  |   ; Get bottom |
00004000  38 20 62 69 74 73 20 6f  66 20 63 6f 75 6e 74 2e  |8 bits of count.|
00004010  0d 10 d6 40 20 4c 44 4d  46 44 20 20 20 28 73 70  |...@ LDMFD   (sp|
00004020  29 21 2c 20 7b 70 63 7d  5e 20 20 20 20 20 20 20  |)!, {pc}^       |
00004030  20 20 20 20 20 20 20 20  20 20 20 3b 20 47 65 74  |           ; Get|
00004040  20 52 65 74 75 72 6e 20  41 64 64 72 65 73 73 2e  | Return Address.|
00004050  0d 10 e0 04 0d 10 ea 3b  2e 6c 45 6e 74 72 79 20  |.......;.lEntry |
00004060  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00004070  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 3b  |               ;|
00004080  20 43 6f 75 6e 74 20 65  6e 74 72 69 65 73 2e 0d  | Count entries..|
00004090  10 f4 41 20 4c 44 52 20  20 20 20 20 72 53 69 7a  |..A LDR     rSiz|
000040a0  65 2c 20 5b 72 57 6f 72  6b 53 70 61 63 65 2c 20  |e, [rWorkSpace, |
000040b0  23 6f 53 69 7a 65 5d 20  20 20 3b 20 4c 6f 61 64  |#oSize]   ; Load|
000040c0  20 73 69 7a 65 20 6f 66  20 62 75 66 66 65 72 2e  | size of buffer.|
000040d0  0d 10 fe 43 20 53 55 42  20 20 20 20 20 72 43 6f  |...C SUB     rCo|
000040e0  75 6e 74 4c 2c 20 72 53  69 7a 65 2c 20 72 53 70  |untL, rSize, rSp|
000040f0  61 63 65 20 20 20 20 20  20 20 20 3b 20 45 6e 74  |ace        ; Ent|
00004100  72 69 65 73 3d 20 53 69  7a 65 20 2d 20 53 70 61  |ries= Size - Spa|
00004110  63 65 2e 0d 11 08 34 20  4d 4f 56 20 20 20 20 20  |ce....4 MOV     |
00004120  70 63 2c 20 6c 6e 20 20  20 20 20 20 20 20 20 20  |pc, ln          |
00004130  20 20 20 20 20 20 20 20  20 20 20 20 20 20 3b 20  |              ; |
00004140  52 65 74 75 72 6e 2e 0d  11 12 04 0d 11 1c 3a 2e  |Return........:.|
00004150  6c 50 75 72 67 65 20 20  20 20 20 20 20 20 20 20  |lPurge          |
00004160  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00004170  20 20 20 20 20 20 3b 20  50 75 72 67 65 20 42 75  |      ; Purge Bu|
00004180  66 66 65 72 2e 0d 11 26  29 20 4c 44 52 20 20 20  |ffer...&) LDR   |
00004190  20 20 72 54 6d 70 2c 20  5b 72 57 6f 72 6b 53 70  |  rTmp, [rWorkSp|
000041a0  61 63 65 2c 20 23 6f 45  73 63 61 70 65 5d 0d 11  |ace, #oEscape]..|
000041b0  30 4c 20 54 45 51 20 20  20 20 20 72 54 6d 70 2c  |0L TEQ     rTmp,|
000041c0  20 23 30 20 20 20 20 20  20 20 20 20 20 20 20 20  | #0             |
000041d0  20 20 20 20 20 20 20 20  20 3b 20 44 6f 20 6e 6f  |         ; Do no|
000041e0  74 20 66 6c 75 73 68 20  62 75 66 66 65 72 20 69  |t flush buffer i|
000041f0  66 20 76 65 63 74 6f 72  2e 2e 0d 11 31 48 20 4d  |f vector....1H M|
00004200  4f 56 20 20 20 20 20 72  54 6d 70 2c 20 23 30 20  |OV     rTmp, #0 |
00004210  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00004220  20 20 20 20 20 3b 20 2e  2e 63 61 6c 6c 65 64 20  |     ; ..called |
00004230  62 79 20 65 73 63 61 70  65 20 68 61 6e 64 6c 65  |by escape handle|
00004240  72 21 0d 11 32 29 20 53  54 52 20 20 20 20 20 72  |r!..2) STR     r|
00004250  54 6d 70 2c 20 5b 72 57  6f 72 6b 53 70 61 63 65  |Tmp, [rWorkSpace|
00004260  2c 20 23 6f 45 73 63 61  70 65 5d 0d 11 3a 48 20  |, #oEscape]..:H |
00004270  4c 44 4d 4e 45 46 44 20  28 73 70 29 21 2c 20 7b  |LDMNEFD (sp)!, {|
00004280  70 63 7d 5e 20 20 20 20  20 20 20 20 20 20 20 20  |pc}^            |
00004290  20 20 20 20 20 20 3b 20  72 65 74 75 72 6e 20 69  |      ; return i|
000042a0  66 20 45 73 63 61 70 65  20 43 6f 6e 64 69 74 69  |f Escape Conditi|
000042b0  6f 6e 2e 0d 11 4e 4a 20  4d 4f 56 20 20 20 20 20  |on...NJ MOV     |
000042c0  72 54 6d 70 2c 20 23 6f  42 75 66 66 65 72 20 20  |rTmp, #oBuffer  |
000042d0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 3b 20  |              ; |
000042e0  46 69 6e 64 20 61 64 64  72 65 73 73 20 6f 66 20  |Find address of |
000042f0  62 75 66 66 65 72 20 73  74 61 72 74 2e 0d 11 58  |buffer start...X|
00004300  4b 20 53 54 52 20 20 20  20 20 72 54 6d 70 2c 20  |K STR     rTmp, |
00004310  5b 72 57 6f 72 6b 53 70  61 63 65 2c 20 23 6f 50  |[rWorkSpace, #oP|
00004320  6c 61 63 65 5d 20 20 20  3b 20 53 74 6f 72 65 20  |lace]   ; Store |
00004330  74 68 69 73 20 69 6e 20  70 6c 61 63 65 20 74 6f  |this in place to|
00004340  20 69 6e 73 65 72 74 2e  0d 11 62 49 20 53 54 52  | insert...bI STR|
00004350  20 20 20 20 20 72 54 6d  70 2c 20 5b 72 57 6f 72  |     rTmp, [rWor|
00004360  6b 53 70 61 63 65 2c 20  23 6f 4c 6f 6f 6b 5d 20  |kSpace, #oLook] |
00004370  20 20 20 3b 20 53 74 6f  72 65 20 74 68 69 73 20  |   ; Store this |
00004380  69 6e 20 70 6c 61 63 65  20 74 6f 20 6c 6f 6f 6b  |in place to look|
00004390  2e 0d 11 6c 41 20 4c 44  52 20 20 20 20 20 72 54  |...lA LDR     rT|
000043a0  6d 70 2c 20 5b 72 57 6f  72 6b 53 70 61 63 65 2c  |mp, [rWorkSpace,|
000043b0  20 23 6f 53 69 7a 65 5d  20 20 20 20 3b 20 46 69  | #oSize]    ; Fi|
000043c0  6e 64 20 53 69 7a 65 20  6f 66 20 62 75 66 66 65  |nd Size of buffe|
000043d0  72 2e 0d 11 76 4b 20 53  54 52 20 20 20 20 20 72  |r...vK STR     r|
000043e0  54 6d 70 2c 20 5b 72 57  6f 72 6b 53 70 61 63 65  |Tmp, [rWorkSpace|
000043f0  2c 20 23 6f 53 70 61 63  65 5d 20 20 20 3b 20 53  |, #oSpace]   ; S|
00004400  74 6f 72 65 20 74 68 69  73 20 69 6e 20 61 6d 6f  |tore this in amo|
00004410  75 6e 74 20 6f 66 20 73  70 61 63 65 2e 0d 11 80  |unt of space....|
00004420  34 20 4c 44 4d 46 44 20  20 20 28 73 70 29 21 2c  |4 LDMFD   (sp)!,|
00004430  20 7b 70 63 7d 5e 20 20  20 20 20 20 20 20 20 20  | {pc}^          |
00004440  20 20 20 20 20 20 20 20  3b 20 52 65 74 75 72 6e  |        ; Return|
00004450  2e 0d 11 8a 05 5d 0d 11  94 07 3d 22 22 0d 11 9e  |.....]....=""...|
00004460  0c dd 20 a4 63 6c 61 69  6d 0d 11 a8 2a ea 20 72  |.. .claim...*. r|
00004470  56 65 63 74 6f 72 2c 20  72 41 64 64 72 65 73 73  |Vector, rAddress|
00004480  2c 20 72 47 69 76 65 2c  20 72 57 6f 72 6b 53 70  |, rGive, rWorkSp|
00004490  61 63 65 0d 11 b2 27 72  56 65 63 74 6f 72 3d 20  |ace...'rVector= |
000044a0  30 20 3a 20 72 41 64 64  72 65 73 73 3d 20 31 20  |0 : rAddress= 1 |
000044b0  3a 20 72 47 69 76 65 3d  20 32 0d 11 bc 21 72 54  |: rGive= 2...!rT|
000044c0  6d 70 3d 20 72 56 65 63  74 6f 72 20 3a 20 72 57  |mp= rVector : rW|
000044d0  6f 72 6b 53 70 61 63 65  3d 20 35 0d 11 c6 0e 5b  |orkSpace= 5....[|
000044e0  20 4f 50 54 20 70 61 73  73 0d 11 d0 27 3b 20 45  | OPT pass...'; E|
000044f0  6e 74 72 79 20 2d 20 72  35 20 2d 20 70 6f 69 6e  |ntry - r5 - poin|
00004500  74 65 72 20 74 6f 20 77  6f 72 6b 73 70 61 63 65  |ter to workspace|
00004510  0d 11 da 3f 3b 20 43 6c  61 69 6d 20 2d 20 43 6f  |...?; Claim - Co|
00004520  64 65 20 74 6f 20 43 6c  61 69 6d 20 74 68 65 20  |de to Claim the |
00004530  76 65 63 74 6f 72 73 2c  20 69 6e 69 74 69 61 6c  |vectors, initial|
00004540  69 73 65 20 74 68 65 20  62 75 66 66 65 72 2e 0d  |ise the buffer..|
00004550  11 e4 12 2e 6c 43 6c 61  69 6d 5f 56 65 63 74 6f  |....lClaim_Vecto|
00004560  72 0d 11 ee 29 20 53 54  4d 46 44 20 20 20 28 73  |r...) STMFD   (s|
00004570  70 29 21 2c 20 7b 72 41  64 64 72 65 73 73 2c 20  |p)!, {rAddress, |
00004580  72 47 69 76 65 2c 20 6c  6e 7d 0d 11 f8 13 20 4d  |rGive, ln}.... M|
00004590  4f 56 20 20 20 20 20 72  30 2c 20 23 39 0d 12 02  |OV     r0, #9...|
000045a0  18 20 41 44 52 20 20 20  20 20 72 31 2c 20 6c 45  |. ADR     r1, lE|
000045b0  73 63 61 70 65 0d 12 0c  1b 20 4d 4f 56 20 20 20  |scape.... MOV   |
000045c0  20 20 72 32 2c 20 72 57  6f 72 6b 53 70 61 63 65  |  r2, rWorkSpace|
000045d0  0d 12 16 42 20 53 57 49  20 20 20 20 20 22 58 4f  |...B SWI     "XO|
000045e0  53 5f 43 68 61 6e 67 65  45 6e 76 69 72 6f 6e 6d  |S_ChangeEnvironm|
000045f0  65 6e 74 22 20 20 20 20  20 20 20 3b 20 43 6c 61  |ent"       ; Cla|
00004600  69 6d 20 65 73 63 61 70  65 20 68 61 6e 64 6c 65  |im escape handle|
00004610  72 2e 0d 12 20 29 20 4c  44 4d 56 53 46 44 20 28  |r... ) LDMVSFD (|
00004620  73 70 29 21 2c 20 7b 72  41 64 64 72 65 73 73 2c  |sp)!, {rAddress,|
00004630  20 72 47 69 76 65 2c 20  70 63 7d 0d 12 2a 2b 20  | rGive, pc}..*+ |
00004640  53 54 52 20 20 20 20 20  72 31 2c 20 5b 72 57 6f  |STR     r1, [rWo|
00004650  72 6b 53 70 61 63 65 2c  20 23 6f 4f 6c 64 41 64  |rkSpace, #oOldAd|
00004660  64 72 65 73 73 5d 0d 12  34 46 20 53 54 52 20 20  |dress]..4F STR  |
00004670  20 20 20 72 32 2c 20 5b  72 57 6f 72 6b 53 70 61  |   r2, [rWorkSpa|
00004680  63 65 2c 20 23 6f 4f 6c  64 31 32 5d 20 20 20 20  |ce, #oOld12]    |
00004690  20 3b 20 53 74 6f 72 65  20 6f 6c 64 20 65 73 63  | ; Store old esc|
000046a0  61 70 65 20 68 61 6e 64  6c 65 72 2e 0d 12 3e 1d  |ape handler...>.|
000046b0  20 4d 4f 56 20 20 20 20  20 72 56 65 63 74 6f 72  | MOV     rVector|
000046c0  2c 20 23 69 49 6e 73 4e  6f 0d 12 48 1c 20 41 44  |, #iInsNo..H. AD|
000046d0  52 20 20 20 20 20 72 41  64 64 72 65 73 73 2c 20  |R     rAddress, |
000046e0  6c 49 6e 73 56 0d 12 52  1e 20 4d 4f 56 20 20 20  |lInsV..R. MOV   |
000046f0  20 20 72 47 69 76 65 2c  20 72 57 6f 72 6b 53 70  |  rGive, rWorkSp|
00004700  61 63 65 0d 12 5c 38 20  53 57 49 20 20 20 20 20  |ace..\8 SWI     |
00004710  22 58 4f 53 5f 43 6c 61  69 6d 22 20 20 20 20 20  |"XOS_Claim"     |
00004720  20 20 20 20 20 20 20 20  20 20 20 20 20 20 3b 20  |              ; |
00004730  43 6c 61 69 6d 20 49 6e  73 56 2e 0d 12 66 29 20  |Claim InsV...f) |
00004740  4c 44 4d 56 53 46 44 20  28 73 70 29 21 2c 20 7b  |LDMVSFD (sp)!, {|
00004750  72 41 64 64 72 65 73 73  2c 20 72 47 69 76 65 2c  |rAddress, rGive,|
00004760  20 70 63 7d 0d 12 70 1d  20 4d 4f 56 20 20 20 20  | pc}..p. MOV    |
00004770  20 72 56 65 63 74 6f 72  2c 20 23 69 52 65 6d 4e  | rVector, #iRemN|
00004780  6f 0d 12 7a 1c 20 41 44  52 20 20 20 20 20 72 41  |o..z. ADR     rA|
00004790  64 64 72 65 73 73 2c 20  6c 52 65 6d 56 0d 12 84  |ddress, lRemV...|
000047a0  1e 20 4d 4f 56 20 20 20  20 20 72 47 69 76 65 2c  |. MOV     rGive,|
000047b0  20 72 57 6f 72 6b 53 70  61 63 65 0d 12 8e 38 20  | rWorkSpace...8 |
000047c0  53 57 49 20 20 20 20 20  22 58 4f 53 5f 43 6c 61  |SWI     "XOS_Cla|
000047d0  69 6d 22 20 20 20 20 20  20 20 20 20 20 20 20 20  |im"             |
000047e0  20 20 20 20 20 20 3b 20  43 6c 61 69 6d 20 52 65  |      ; Claim Re|
000047f0  6d 56 2e 0d 12 98 29 20  4c 44 4d 56 53 46 44 20  |mV....) LDMVSFD |
00004800  28 73 70 29 21 2c 20 7b  72 41 64 64 72 65 73 73  |(sp)!, {rAddress|
00004810  2c 20 72 47 69 76 65 2c  20 70 63 7d 0d 12 a2 1d  |, rGive, pc}....|
00004820  20 4d 4f 56 20 20 20 20  20 72 56 65 63 74 6f 72  | MOV     rVector|
00004830  2c 20 23 69 43 6e 70 4e  6f 0d 12 ac 1c 20 41 44  |, #iCnpNo.... AD|
00004840  52 20 20 20 20 20 72 41  64 64 72 65 73 73 2c 20  |R     rAddress, |
00004850  6c 43 6e 70 56 0d 12 b6  1e 20 4d 4f 56 20 20 20  |lCnpV.... MOV   |
00004860  20 20 72 47 69 76 65 2c  20 72 57 6f 72 6b 53 70  |  rGive, rWorkSp|
00004870  61 63 65 0d 12 c0 38 20  53 57 49 20 20 20 20 20  |ace...8 SWI     |
00004880  22 58 4f 53 5f 43 6c 61  69 6d 22 20 20 20 20 20  |"XOS_Claim"     |
00004890  20 20 20 20 20 20 20 20  20 20 20 20 20 20 3b 20  |              ; |
000048a0  43 6c 61 69 6d 20 43 6e  70 56 2e 0d 12 ca 29 20  |Claim CnpV....) |
000048b0  4c 44 4d 46 44 20 20 20  28 73 70 29 21 2c 20 7b  |LDMFD   (sp)!, {|
000048c0  72 41 64 64 72 65 73 73  2c 20 72 47 69 76 65 2c  |rAddress, rGive,|
000048d0  20 70 63 7d 0d 12 d4 43  3b 20 52 65 73 74 6f 72  | pc}...C; Restor|
000048e0  65 20 2d 20 43 6f 64 65  20 74 6f 20 72 65 73 74  |e - Code to rest|
000048f0  6f 72 65 20 74 68 65 20  76 65 63 74 6f 72 73 20  |ore the vectors |
00004900  74 6f 20 75 73 65 20 70  72 65 76 69 6f 75 73 20  |to use previous |
00004910  62 75 66 66 65 72 2e 0d  12 de 14 2e 6c 52 65 73  |buffer......lRes|
00004920  74 6f 72 65 5f 56 65 63  74 6f 72 0d 12 e8 29 20  |tore_Vector...) |
00004930  53 54 4d 46 44 20 20 20  28 73 70 29 21 2c 20 7b  |STMFD   (sp)!, {|
00004940  72 41 64 64 72 65 73 73  2c 20 72 47 69 76 65 2c  |rAddress, rGive,|
00004950  20 6c 6e 7d 0d 12 f2 13  20 4d 4f 56 20 20 20 20  | ln}.... MOV    |
00004960  20 72 30 2c 20 23 39 0d  12 fc 2b 20 4c 44 52 20  | r0, #9...+ LDR |
00004970  20 20 20 20 72 31 2c 20  5b 72 57 6f 72 6b 53 70  |    r1, [rWorkSp|
00004980  61 63 65 2c 20 23 6f 4f  6c 64 41 64 64 72 65 73  |ace, #oOldAddres|
00004990  73 5d 0d 13 06 26 20 4c  44 52 20 20 20 20 20 72  |s]...& LDR     r|
000049a0  32 2c 20 5b 72 57 6f 72  6b 53 70 61 63 65 2c 20  |2, [rWorkSpace, |
000049b0  23 6f 4f 6c 64 31 32 5d  0d 13 10 44 20 53 57 49  |#oOld12]...D SWI|
000049c0  20 20 20 20 20 22 58 4f  53 5f 43 68 61 6e 67 65  |     "XOS_Change|
000049d0  45 6e 76 69 72 6f 6e 6d  65 6e 74 22 20 20 20 20  |Environment"    |
000049e0  20 20 20 3b 20 52 65 73  74 6f 72 65 20 65 73 63  |   ; Restore esc|
000049f0  61 70 65 20 68 61 6e 64  6c 65 72 2e 0d 13 1a 29  |ape handler....)|
00004a00  20 4c 44 4d 56 53 46 44  20 28 73 70 29 21 2c 20  | LDMVSFD (sp)!, |
00004a10  7b 72 41 64 64 72 65 73  73 2c 20 72 47 69 76 65  |{rAddress, rGive|
00004a20  2c 20 70 63 7d 0d 13 24  1d 20 4d 4f 56 20 20 20  |, pc}..$. MOV   |
00004a30  20 20 72 56 65 63 74 6f  72 2c 20 23 69 49 6e 73  |  rVector, #iIns|
00004a40  4e 6f 0d 13 2e 1c 20 41  44 52 20 20 20 20 20 72  |No.... ADR     r|
00004a50  41 64 64 72 65 73 73 2c  20 6c 49 6e 73 56 0d 13  |Address, lInsV..|
00004a60  38 1e 20 4d 4f 56 20 20  20 20 20 72 47 69 76 65  |8. MOV     rGive|
00004a70  2c 20 72 57 6f 72 6b 53  70 61 63 65 0d 13 42 3a  |, rWorkSpace..B:|
00004a80  20 53 57 49 20 20 20 20  20 22 58 4f 53 5f 52 65  | SWI     "XOS_Re|
00004a90  6c 65 61 73 65 22 20 20  20 20 20 20 20 20 20 20  |lease"          |
00004aa0  20 20 20 20 20 20 20 3b  20 52 65 6c 65 61 73 65  |       ; Release|
00004ab0  20 49 6e 73 56 2e 0d 13  4c 29 20 4c 44 4d 56 53  | InsV...L) LDMVS|
00004ac0  46 44 20 28 73 70 29 21  2c 20 7b 72 41 64 64 72  |FD (sp)!, {rAddr|
00004ad0  65 73 73 2c 20 72 47 69  76 65 2c 20 70 63 7d 0d  |ess, rGive, pc}.|
00004ae0  13 56 1d 20 4d 4f 56 20  20 20 20 20 72 56 65 63  |.V. MOV     rVec|
00004af0  74 6f 72 2c 20 23 69 52  65 6d 4e 6f 0d 13 60 1c  |tor, #iRemNo..`.|
00004b00  20 41 44 52 20 20 20 20  20 72 41 64 64 72 65 73  | ADR     rAddres|
00004b10  73 2c 20 6c 52 65 6d 56  0d 13 6a 1e 20 4d 4f 56  |s, lRemV..j. MOV|
00004b20  20 20 20 20 20 72 47 69  76 65 2c 20 72 57 6f 72  |     rGive, rWor|
00004b30  6b 53 70 61 63 65 0d 13  74 3a 20 53 57 49 20 20  |kSpace..t: SWI  |
00004b40  20 20 20 22 58 4f 53 5f  52 65 6c 65 61 73 65 22  |   "XOS_Release"|
00004b50  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00004b60  20 3b 20 52 65 6c 65 61  73 65 20 52 65 6d 56 2e  | ; Release RemV.|
00004b70  0d 13 7e 29 20 4c 44 4d  56 53 46 44 20 28 73 70  |..~) LDMVSFD (sp|
00004b80  29 21 2c 20 7b 72 41 64  64 72 65 73 73 2c 20 72  |)!, {rAddress, r|
00004b90  47 69 76 65 2c 20 70 63  7d 0d 13 88 1d 20 4d 4f  |Give, pc}.... MO|
00004ba0  56 20 20 20 20 20 72 56  65 63 74 6f 72 2c 20 23  |V     rVector, #|
00004bb0  69 43 6e 70 4e 6f 0d 13  92 1c 20 41 44 52 20 20  |iCnpNo.... ADR  |
00004bc0  20 20 20 72 41 64 64 72  65 73 73 2c 20 6c 43 6e  |   rAddress, lCn|
00004bd0  70 56 0d 13 9c 1e 20 4d  4f 56 20 20 20 20 20 72  |pV.... MOV     r|
00004be0  47 69 76 65 2c 20 72 57  6f 72 6b 53 70 61 63 65  |Give, rWorkSpace|
00004bf0  0d 13 a6 3a 20 53 57 49  20 20 20 20 20 22 58 4f  |...: SWI     "XO|
00004c00  53 5f 52 65 6c 65 61 73  65 22 20 20 20 20 20 20  |S_Release"      |
00004c10  20 20 20 20 20 20 20 20  20 20 20 3b 20 52 65 6c  |           ; Rel|
00004c20  65 61 73 65 20 43 6e 70  56 2e 0d 13 b0 29 20 4c  |ease CnpV....) L|
00004c30  44 4d 46 44 20 20 20 28  73 70 29 21 2c 20 7b 72  |DMFD   (sp)!, {r|
00004c40  41 64 64 72 65 73 73 2c  20 72 47 69 76 65 2c 20  |Address, rGive, |
00004c50  70 63 7d 0d 13 ba 05 5d  0d 13 c4 07 3d 22 22 0d  |pc}....]....="".|
00004c60  ff                                                |.|
00004c61