;ONELINER COPYRIGHT 1987, 1988, 1989 BY DANIEL WOLF
;ALL MAGAZINE PUBLICATION RIGHTS
;ARE THE PROPERTY OF ANTIC PUBLICATIONS/AMIGA PLUS
;10/19/89

;Aztec users: as -CD oneliner.asm  ln oneliner.o
;and change DATA to DSEG down below!


 BRA _START

LVO.OPENLIBRARY         EQU $FFFFFDD8
LVO.CLOSELIBRARY        EQU $FFFFFE62
LVO.FINDTASK            EQU $FFFFFEDA
LVO.FORBID              EQU $FFFFFF7C
LVO.GETMSG              EQU $FFFFFE8C
LVO.REPLYMSG            EQU $FFFFFE86
LVO.WAITPORT            EQU $FFFFFE80

MEMF_CHIP       EQU 2
MEMF_CLEAR      EQU $10000
MEMF_PUBLIC     EQU 1

SYSBASE         EQU 4

CANTINITSYSTEM  EQU 20
CANTOPENWINDOW  EQU 21

;******** DOSEQUATES

LVO.CLOSE               EQU $FFFFFFDC
LVO.CURRENTDIR          EQU $FFFFFF82
LVO.INPUT               EQU $FFFFFFCA
LVO.OPEN                EQU $FFFFFFE2
LVO.OUTPUT              EQU $FFFFFFC4
LVO.WRITE               EQU $FFFFFFD0
LVO.EXECUTE             EQU $FFFFFF22

MODE_NEWFILE            EQU $3EE
ACCESS_WRITE            EQU -1
FH.TYPE                 EQU 8

;*** PROCESS STRUCTURE OFFSETS

PROC.CLI                EQU $AC
PROC.CONSOLETASK        EQU $A4
PROC.MSGPORT            EQU $5C

;******** INTUITION EQUATES

ACTIVATE        EQU $1000
BOOLGADGET      EQU $1
CLOSEWINDOW     EQU $200

;*** GADGET STRUCTURE OFFSETS

GADG.ACTIVATION EQU $E
GADG.FLAGS      EQU $C
GADG.HEIGHT     EQU $A
GADG.LEFTEDGE   EQU $4
GADG.RENDER     EQU $12
GADG.SPECIALINFO  EQU $22
GADG.TEXT       EQU $1A
GADG.TOPEDGE    EQU $6
GADG.TYPE       EQU $10
GADG.WIDTH      EQU $8

GADGETUP        EQU $40
GADGHCOMP       EQU $0
GADGIMMEDIATE   EQU $2

;*** INTUIMESSAGE STRUCTURE OFFSETS

IM.CLASS        EQU $14
IM.MOUSEX       EQU $20

;*** INTUITION ROUTINES

LVO.ADDGADGET           EQU $FFFFFFD6
LVO.ALLOCREMEMBER       EQU $FFFFFE74
LVO.AUTOREQUEST         EQU $FFFFFEA4
LVO.CLOSEWINDOW         EQU $FFFFFFB8
LVO.FREEREMEMBER        EQU $FFFFFE68
LVO.INTUITEXTLENGTH     EQU $FFFFFEB6
LVO.OPENWINDOW          EQU $FFFFFF34
LVO.PRINTITEXT          EQU $FFFFFF28
LVO.REFRESHGADGETS      EQU $FFFFFF22
LVO.WINDOWTOBACK        EQU $FFFFFECE
LVO.WINDOWTOFRONT       EQU $FFFFFEC8

RELVERIFY       EQU $1

;*** VARIOUS STRUCTURE SIZES
SIZE.GADG       EQU $2C

;*** STARTUP MESSAGE OFFSETS

SM.ARGLIST      EQU $24

SMART_REFRESH   EQU $0
STRGADGET       EQU $4
STRINGCENTER    EQU $200

WW.USERPORT     EQU $56
WW.RPORT        EQU $32
WINDOWCLOSE     EQU $8
WINDOWDRAG      EQU $2
WINDOWDEPTH     EQU $4
WBENCHSCREEN    EQU $1

RBPEN   EQU 0
RFPEN   EQU 1
REQXMAX EQU 260
REQYMAX EQU 40
STRSIZ  EQU 96

;*** MACROS

ZERO MACRO
 MOVEQ #0,\1
 ENDM

ZERA MACRO
 SUBA.L \1,\1
 ENDM

PUSHREG MACRO    ;REGISTERS
 MOVEM.L \1,-(SP)
 ENDM

PULLREG MACRO    ;REGISTERS
 MOVEM.L (SP)+,\1
 ENDM

LIBCALL MACRO    ;LIBRARY,ROUTINE
 MOVE.L \1,A6
 JSR LVO.\2(A6)
 ENDM

SYSLIB MACRO     ;ROUTINE
 LIBCALL SYSBASE,\1
 ENDM

DOSLIB MACRO     ;ROUTINE
 LIBCALL _DOSBASE,\1
 ENDM

INTLIB MACRO     ;ROUTINE
 LIBCALL _INTBASE,\1
 ENDM

;*** DOS MACRO DEFINITIONS ***

DOSPRINT MACRO   ;*FILEHANDLE (D1),*BUFF (D2), [LEN (D3)]
 PUSHREG D1-D3/A0-A1
 MOVE.L \1,D1
 MOVE.L \2,D2
 IFC '\3',''
 BSR DOSTEXTLEN  ;IF NO LENGTH SPECIFIED, GO CALCULATE IT
 ENDC
 IFNC '\3',''
 MOVE.L \3,D3
 ENDC
 DOSLIB WRITE
 PULLREG D1-D3/A0-A1
 ENDM

DOSTEXTLEN       ;CALC LENGTH OF STRING INTO D3 FOR DOS
 MOVE.L D2,A0
1$
 TST.B (A0)+
 BNE.S 1$
 MOVE.L A0,D3
 SUB.L D2,D3
 SUBQ.L #1,D3
 RTS

DOSEXEC MACRO
 MOVE.L #EXECBUF,D1
 ZERO D2
 MOVE.L STDOUT,D3
 DOSLIB EXECUTE
 ENDM

;**** MEMORY ALLOCATION MACRO ***

REMEMBERCHIPMEM MACRO ;*REMEMBERKEY,SIZE  (A0,D0)
 LEA \1,A0
 MOVEQ.L #0,D0
 MOVE \2,D0
 MOVE.L #MEMF_CLEAR!MEMF_CHIP,D1
 INTLIB ALLOCREMEMBER
 IFNC '\3',''
 TST.L D0
 BEQ \3
 ENDC
 ENDM

_OPENLIB
 ZERO D0
 SYSLIB OPENLIBRARY
 RTS

_CLOSELIB
 MOVE.L D0,A1
 SYSLIB CLOSELIBRARY
 RTS

;*** GADGETS

NEWBGADG MACRO
 LEA \1,A0
 MOVE.W #BOOLGADGET,D3
 MOVE.W #\2,D4
 MOVE.W #\3,D5
 BSR MAKEAGADGET
 IFNC '\4',''
 BSR ADDNEWGADG
 ENDC
 ENDM

ADDNEWGADG
 BEQ NOADDGAD
 MOVE.L A0,A1
 MOVE.W #-1,D0
 MOVE.L WINDOW,A0
 INTLIB ADDGADGET
NOADDGAD
 RTS

MAKEAGADGET ;ENTER D4=LEFT,D5=TOP,A0=INTUITEXT PTR
 PUSHREG D6-D7
 MOVE.L A0,D7                            ;ITEXT PTR
 INTLIB INTUITEXTLENGTH
 MOVE.W D0,D6                            ;ITEXT LEN
 REMEMBERCHIPMEM REMEMBERKEY,#SIZE.GADG  ;REMEMBER MEM FOR GADGET STRUCT
 TST.L D0
 BEQ ERR_GADGETMEM
 MOVE.L D0,A0                            ;PTR TO GADGET IN A0
 MOVE.W #10,GADG.HEIGHT(A0)              ;FILL GADGET STRUCTURE
 MOVE.W D3,GADG.TYPE(A0)                 ;SET GADGET TYPE
 MOVE.W _THISGACTIV,GADG.ACTIVATION(A0)  ;SET ACTIVATION FLAGS
 MOVE.W #GADGHCOMP,GADG.FLAGS(A0)
 MOVE.L D7,GADG.TEXT(A0)                 ;PTR GADGET ITEXT
 MOVE.W D6,GADG.WIDTH(A0)
 MOVE.W D4,GADG.LEFTEDGE(A0)
 MOVE.W D5,GADG.TOPEDGE(A0)
 PULLREG D6-D7
 MOVE.L A0,D0
 RTS
ERR_GADGETMEM
 PULLREG D6-D7
 ZERO D0
 RTS

MAKESTRINGADGET                           ;STRING GADGET ROUTINE
 LEA ITEXTSTR,A0                          ;USE SIZE STRING ITEXT
 MOVE.W #STRGADGET,D3
 MOVEQ #4,D4
 MOVEQ #13,D5
 BSR MAKEAGADGET                          ;MAKE THE GADGET
 BEQ ENDSGADG
 MOVE.L #SINFO,GADG.SPECIALINFO(A0)       ;ATTACH STRINGINFO TO GADG
 BSR ADDNEWGADG
ENDSGADG
 RTS

REFRESHEM MACRO         ;MACRO - REFRESH GADGETS
 MOVE.L _FIRSTGADGET,A0
 MOVE.L WINDOW,A1
 ZERA A2
 INTLIB REFRESHGADGETS
 ENDM

AUTOREQ MACRO           ;WINDOW,BODY ITEXT, NEG ITEXT, POS ITEXT
 PUSHREG A0-A3/D0-D3
 MOVE.L \1,A0
 MOVE.L #\2,A1
 MOVE.L #\3,A2
 MOVE.L #\4,A3
 ZERO D0                ;TOP
 ZERO D1                ;LEFT
 MOVE.L #REQXMAX,D2     ;WIDTH
 MOVE.L #REQYMAX,D3     ;HEIGHT
 INTLIB AUTOREQUEST
 PULLREG A0-A3/D0-D3
 ENDM

                        ;MACRO TO PRINT INTUITEXT @ XY
PRINTAT MACRO           ;WINDOW,TEXT,LEFT,TOP
 MOVE.L \1,A0           ;PTR TO WINDOW
 LEA \2,A1              ;PTR TO INTUITEXT
 MOVE.W #\3,D0          ;LEFT POS
 MOVE.W #\4,D1          ;TOP POS
 MOVE.L WW.RPORT(A0),A0
 INTLIB PRINTITEXT      ;PRINT!
 ENDM

;*** STRING MACROS

MAKOPY MACRO
        LEA \1,A0
        LEA \2,A1
        STRCPY A0,A1
        ENDM

MAKCAT MACRO
        LEA \1,A0
        LEA \2,A1
        STRCAT A0,A1
        ENDM

                                ;SIMPLE STRING COPY MACRO
STRCPY  MACRO
        RSTRCPY \1,\2,\@
        ENDM

RSTRCPY MACRO
\3:
        MOVE.B  (\1)+,(\2)+
        BNE     \3
        ENDM

                                ;SIMPLE STRING APPEND MACRO
STRCAT  MACRO
        RSTRCAT \1,\2,\@
        ENDM

RSTRCAT MACRO
\3:
        MOVE.B  (\2)+,D0
        BNE     \3
        SUBQ.L  #1,\2
        STRCPY  \1,\2
        ENDM


;*** STARTUP CODE - BEGIN HERE!

_START
 MOVE.L SP,_STACK          ;STACK POINTER
 ZERA A1
 SYSLIB FINDTASK           ;FIND PTR TO TASK'S STRUCTURE
 MOVE.L D0,_TASK           ;SAVE PTR TO TASK STRUCTURE

OPENAMIGADOS
 LEA _DOSNAME,A1
 BSR _OPENLIB
 MOVE.L D0,_DOSBASE
 BEQ _STARTERROR

FROMWHERE
 MOVE.L _TASK,A2           ;A2 = TASK STRUCTURE ADDRESS
 TST.L PROC.CLI(A2)        ;IS TASK A CLI PROCESS?
 BEQ.S FROM_WB             ;NO, ITS FROM WORKBENCH

FROM_CLI                   ;IF FROM CLI
 DOSLIB OUTPUT
 MOVE.L D0,STDOUT          ;AND OUTPUT FILE
 BRA MAIN                  ;SKIP WORKBENCH STUFF

FROM_WB                    ;IF FROM WORKBENCH
 LEA PROC.MSGPORT(A2),A0   ;WAIT FOR WORKBENCH MESSAGE
 SYSLIB WAITPORT
 LEA PROC.MSGPORT(A2),A0
 JSR LVO.GETMSG(A6)
 MOVE.L D0,WBMSG           ;SAVE PTR TO WBMESSAGE

 MOVE.L #CONSTR,D1         ;GIVE IT A CONSOLE WINDOW IF FROM WB
 MOVE.W #MODE_NEWFILE,D2
 DOSLIB OPEN
 TST.L D0
 BEQ ERROR
 MOVE.L D0,STDOUT
 LSL.L #2,D0               ;THIS IS A BCPL POINTER SO MULTIPLY BY 4
 MOVE.L D0,A0
 MOVE.L _TASK,A2
 MOVE.L FH.TYPE(A0),PROC.CONSOLETASK(A2)

 DOSEXEC                   ;ASSIGN OL: TO SYS: IF FROM WB


MAIN
 LEA _INTNAME,A1
 BSR _OPENLIB
 MOVE.L D0,_INTBASE
 BEQ _STARTERROR

_BUILDAWINDOW
 LEA NEWWINDOW,A0
 INTLIB OPENWINDOW
 TST.L D0
 BEQ ERROR
 MOVE.L D0,WINDOW
 MOVE.L D0,A0
 MOVE.L WW.USERPORT(A0),USERPORT

_BUILDGADGETS
 NEWBGADG ITEXT0,420,11
 MOVE.L D0,_FIRSTGADGET
 BSR ADDNEWGADG
 NEWBGADG ITEXT1,460,11,ADD
 BSR MAKESTRINGADGET
 PRINTAT WINDOW,ITEXT4,320,11
 REFRESHEM


LOOP
 MOVE.L USERPORT,A0         ;LISTEN TO IDCMP FOR USER INTERACTION
 SYSLIB WAITPORT
 MOVE.L WINDOW,A0
 MOVE.L USERPORT,A0
 JSR LVO.GETMSG(A6)
 TST.L D0                   ;PTR TO INTUIMESSAGE IN D0
 BEQ LOOP                   ;ERROR CHECK

 MOVE.L D0,A1
 MOVE.L IM.CLASS(A1),D7
 MOVE.W IM.MOUSEX(A1),D6
 JSR LVO.REPLYMSG(A6)       ;QUICK - RETURN THE MESSAGE!
 CMP.L #CLOSEWINDOW,D7      ;USER WANTS TO EXIT?
 BEQ DONE

CHKGADGET
        CMP.L #GADGETUP,D7
        BNE LOOP                ;NOT A GADGET
        CMP.W #420,D6           ;WHICH GADGET WAS IT ?
        BLE LOOP                ;NOT A COMMAND BUTTON - X TOO SMALL
WHICHCOMMAND
        CMP.W #460,D6           ;IS IT THE -EXEC- COMMAND
        BGE DOGADG2             ;NOPE, MUST BE THE -NEW- COMMAND
PEXEC
        TST.B SGBUF1                    ;STRING BUFFER EMPTY ?
        BEQ LOOP
        CMP.B #$2A,SGBUF1               ;FIRST CHAR A * ?
        BEQ LOOP                        ;DONT USE * SINCE IT MIGHT BE DF0
        TST.L WBMSG
        BEQ SIMPLE
        MAKOPY CDOLSTRING,EXECBUF       ;IF FROM WB FIRST CD TO OL
        BRA PCOMMON
SIMPLE
        MAKOPY CDSTRING,EXECBUF
PCOMMON
        MAKCAT SGBUF1,EXECBUF
        MOVE.L WINDOW,A0
        INTLIB WINDOWTOBACK             ;HIDE WINDOW
        DOSPRINT STDOUT,#SGBUF1         ;PRINT COMMAND
        DOSPRINT STDOUT,#LINE
        DOSEXEC                         ;EXECUTE COMMAND
        AUTOREQ WINDOW,ITEXT2,0,ITEXT3  ;SHOW REQUESTER
        MOVE.L WINDOW,A0
        INTLIB WINDOWTOFRONT            ;SHOW WINDOW
        BRA LOOP                        ;CARRY ON

DOGADG2
PNEW                            ;CLEAR STRING BUFFERS
        MOVEQ #(STRSIZ/2)-1,D0
        LEA SGBUF1,A0
        LEA UBUF,A1
        LEA EXECBUF,A2
1$
        CLR.W (A0)+             ;SGBUF
        CLR.W (A1)+             ;UBUF
        CLR.W (A2)+             ;EXEC BUF, TOO!
        DBF D0,1$
        REFRESHEM
        BRA LOOP

DONE
 MOVE.L WINDOW,A0               ;ONLY GET HERE IF WINDOW OPEN AND
 INTLIB CLOSEWINDOW             ;USER ASKED TO CLOSE IT
 ZERO D0
QUITNOW
 PUSHREG D0

;*** CLEAN UP AND EXIT ***

_ERROR                  ;CLEAR THINGS UP AND EXIT
 MOVE.L REMEMBERKEY,D0  ;GIVE BACK ANY 'REMEMBER' MEMORY
 BEQ.S 1$
 LEA REMEMBERKEY,A0
 MOVEQ #1,D0
 INTLIB FREEREMEMBER
1$
 MOVE.L _INTBASE,D0     ;CLOSE INTUITION IF OPEN
 BEQ.S 2$
 BSR _CLOSELIB
2$
 TST.L WBMSG            ;WAS THERE A WBMESSAGE?
 BEQ.S CLOSEDOS         ;NO - SKIP OVER WORKBENCH CLEANUP
 MAKOPY ENDASSIGN,EXECBUF
 DOSEXEC                ;UN-ASSIGN OL:
 MOVE.L STDOUT,D1       ;IF CON: NEVER OPENED, SKIP IT!
 BEQ SHUTDOWNWB
 DOSLIB CLOSE
SHUTDOWNWB
 SYSLIB FORBID          ;NO TASK SWITCHING 'TIL WE RETURN IT AND QUIT
 MOVE.L WBMSG,A1
 SYSLIB REPLYMSG        ;REPLY THE WBMESSAGE
CLOSEDOS
 MOVE.L _DOSBASE,D0     ;CLOSE DOS IF OPEN
 BEQ.S BYEBYE
 BSR _CLOSELIB
BYEBYE
 PULLREG D0             ;D0 FROM STACK
 MOVE.L _STACK,SP       ;RESTORE STACK POINTER
 RTS                    ;BACK WHERE PROGRAM CAME FROM!


ERROR
 DOSPRINT STDOUT,#ERRORTEXT
 MOVEQ #CANTOPENWINDOW,D0
 BRA QUITNOW

_STARTERROR
 MOVEQ #CANTINITSYSTEM,D0
 BRA QUITNOW

 DATA   ; comment this line and ...
; DSEG   ; uncomment this line for the Aztec assembler


;*** STARTUP DATA

_STACK DC.L 0                         ;temporary stack pointer storage
_TASK DC.L 0                          ;pointer to this task structure
_DOSBASE DC.L 0                       ;pointer to DOS      library jump table
_INTBASE DC.L 0                       ;           INTUITION
WBMSG DC.L 0                          ;address of WORKBENCH message, if any
STDOUT DC.L 0                         ;address of OUTPUT file

_DOSNAME DC.B 'dos.library',0         ;these names are required by OPENLIBRARY
 EVEN
_INTNAME DC.B 'intuition.library',0
 EVEN


;*** MAIN PROGRAM DATA

WINDOW DC.L 0
USERPORT DC.L 0
_FIRSTGADGET DC.L 0     ;POINTER TO TOP OF GADGET LIST
REMEMBERKEY DC.L 0      ;ALLOCREMEMBER HOOK

ERRORTEXT
 DC.B 10,'Sorry, cannot open window ',10,0
 EVEN

OLTITLE
 DC.B ' OneLiner  ©1989 by Daniel Wolf Ph.D. ',0
 EVEN

CONSTR
 DC.B 'CON:0/10/504/24/OneLiner',0
 EVEN

CDOLSTRING
 DC.B 'CD OL:',10               ;CD TO OL AND SHOW CD
CDSTRING                        ;JUST SHOW CD
 DC.B 'CD',10,0
 EVEN

LINE
 DC.B 13,10,0
 EVEN

NEWWINDOW
 DC.W 0,10,490,24
 DC.B -1,-1
 DC.L CLOSEWINDOW!GADGETUP
 DC.L ACTIVATE!WINDOWDRAG!WINDOWDEPTH!WINDOWCLOSE!SMART_REFRESH
 DC.L 0,0
 DC.L OLTITLE
 DC.L 0,0
 DC.W 140,140,640,400
 DC.W WBENCHSCREEN

SGBUF1                          ;96 BYTE STRING GADGET BUFFER
 DC.B 'Your Wish Is My '
 DCB.B 80,0
 EVEN

ENDASSIGN
 DC.B 'ASSIGN OL:',0
 EVEN

EXECBUF DC.B 'ASSIGN OL: SYS:'  ;96 BYTE EXECUTE BUFFER
 DCB.B 81,0
 EVEN

_THISGACTIV
 DC.W STRINGCENTER!RELVERIFY!GADGIMMEDIATE  ;TELL IF GADGET HIT

SINFO              ;STRINGINFO STRUCTURE FOR STRING GADGET
 DC.L SGBUF1       ;SGBUF1 IS STRING BUFFER
 DC.L UBUF         ;UBUF IS THE UNDO BUFFER
 DC.W 1            ;POSITION AT 1ST CHARACTER
 DC.W 80           ;MAX OF EIGHTY CHARACTERS
 DC.W 1
 DC.W 1
 DC.W 0
 DC.W 0
 DC.W 0
 DC.W 0
 DC.L 0
 DC.L 0
 DC.L 0

;*** STRING GADGET INTUITEXT

ITEXTSTR
 DC.B 1         ;FRONTPEN
 DC.B 0         ;BACKPEN
 DC.W 0         ;DRAWMODE
 DC.W 2         ;LEFTEDGE
 DC.W 2         ;TOPEDGE
 DC.L 0         ;FONT
 DC.L SIZESTR   ;TEXT
 DC.L 0         ;NEXT

SIZESTR
 DC.B '                                        ',0  ;TEMPLATE FOR SIZE
 EVEN                                               ;OF STRING GADGET

;*** BUTTON GADGET INTUITEXTS

ITEXT0
 DC.B 1         ;FRONTPEN
 DC.B 0         ;BACKPEN
 DC.W 0         ;DRAWMODE
 DC.W 2         ;LEFTEDGE
 DC.W 2         ;TOPEDGE
 DC.L 0         ;FONT
 DC.L GTEXT0    ;TEXT
 DC.L 0         ;NEXT

GTEXT0
 DC.B 'EXEC',0
 EVEN

ITEXT1
 DC.B 1         ;FRONTPEN
 DC.B 0         ;BACKPEN
 DC.W 0         ;DRAWMODE
 DC.W 2         ;LEFTEDGE
 DC.W 2         ;TOPEDGE
 DC.L 0         ;FONT
 DC.L GTEXT1    ;TEXT
 DC.L 0         ;NEXT

GTEXT1
 DC.B 'NEW',0
 EVEN

;*** REQUESTER INTUITEXTS

ITEXT2
 DC.B 2         ;FRONTPEN
 DC.B 3         ;BACKPEN
 DC.W 0         ;DRAWMODE
 DC.W 12        ;LEFTEDGE
 DC.W 12        ;TOPEDGE
 DC.L 0         ;FONT
 DC.L GTEXT2    ;TEXT
 DC.L 0         ;NEXT

GTEXT2
 DC.B 'OneLiner DONE!',0
 EVEN

ITEXT3
 DC.B 3         ;FRONTPEN
 DC.B 0         ;BACKPEN
 DC.W 0         ;DRAWMODE
 DC.W 6         ;LEFTEDGE
 DC.W 3         ;TOPEDGE
 DC.L 0         ;FONT
 DC.L GTEXT3    ;TEXT
 DC.L 0         ;NEXT

GTEXT3
 DC.B 'Continue',0
 EVEN

;*** PRINTED INTUITEXT

ITEXT4
 DC.B 3         ;FRONTPEN
 DC.B 2         ;BACKPEN
 DC.W 1         ;DRAWMODE
 DC.W 2         ;LEFTEDGE
 DC.W 2         ;TOPEDGE
 DC.L 0         ;FONT
 DC.L GTEXT4    ;TEXT
 DC.L 0         ;NEXT

GTEXT4
 DC.B '<-- Command:',0
 EVEN
                                ; Aztec users could just comment out BSS
 BSS                            ;SEPARATE BLOCK STORAGE FOR SCATTER LOADING
UBUF DCB.B 96,0                 ;96 BYTE UNDO BUFFER

 END
