         .TITLE "SPY 1.0"
;
; SPY 1.0
; -------
; Look at label USERCONTROL
; where you can customize
; this spy program.
; -------------------------
; SAVE #D:SPY.M65
; ASM ,,#D:SPY9000.COM
;
         *=  $9000
;
DOSINI   =   $0C
ZTMP     =   $F5
;
SDLSTL   =   $0230
SDLSTH   =   $0231
BOOTAD   =   $0242
COLOR0   =   $02C4
;
DDEVIC   =   $0300
DCOMND   =   $0302
DSTATS   =   $0303
DBUFLO   =   $0304
DBUFHI   =   $0305
DAUX1    =   $030A
DAUX2    =   $030B
;
CONSOL   =   $D01F
COL0     =   $D016
DLISTL   =   $D402
DLISTH   =   $D403
VCOUNT   =   $D40B
SIOV     =   $E459
;
PATCHSEC =   364
ADDRSEC  =   365
ADDRSEC2 =   366
SECTSEC  =   367
SECTSEC2 =   368
LASTSEC  =   369
;
; SPYCORE.M65 contains all
; code that loads spy datas,
; runs boot program, installs
; patches and save memory on
; spy disk.
;
MAIN
         .OPT NO LIST
         .INCLUDE #D:SPYCORE.M65
         .OPT LIST
;
; User patch.
; -----------
; This part of code is
; executed when a patch
; address is 0. It means
; either that there is no
; more patch or the user
; has put a 0 address to
; do a special task
; between several patches.
;
; At this time, we have
; restored program code
; (no patch), saved
; program registers into
; SAVEREGS and CURPATCH
; points to a 0 address.
;
; We can modify this
; patch so it will do
; something, then JMP to
; USERPATCH or just INC
; twice CURPATCH to get
; to the next patch and
; JMP to USERPATCH.
;
; If nothing has to be
; done, then a JMP to
; USEREND will continue
; the normal operations.
; It will ask for the
; SPY disk to save datas.
;
; LASTPATCH is the address
; where we left off the
; program execution.
;
USERCONTROL
         JMP USEREND
;
; Title colors
;
SETCOL
         .BYTE $18,$0A,$00,$68,$00
;
; Save screen params
;
SAVCOL
         .BYTE 0,0,0,0,0
SAVDL
         .WORD 0
CURINDEX
         .BYTE 0
CURPATCH
         .BYTE 0
SAVPATCH
         .WORD 0,0
LASTPATCH
         .WORD 0
SAVEREGS
         .BYTE 0,0,0,0
;
; Display list to prompt user
; to insert program disk
;
DLISTSPY
         .BYTE $70,$70,$70,$47
         .WORD SPYTITLE
         .BYTE $70,$46
TITLE
         .WORD PRGSTATUS
         .BYTE $70,$70,$70,$70
         .BYTE $70,$70,$70,$42
PROMPT
         .WORD SPYPROMPT
         .BYTE $70,$46
         .WORD PRGSTATUS
         .BYTE $41
         .WORD DLISTSPY
;
SPYTITLE
         .SBYTE "σπω δισλ V1.0"
         .SBYTE " (C) BE"
;
PRGPROMPT
         .SBYTE "Insert boot disk in"
         .SBYTE " D1: and press"
         .SBYTE " START."
;
SPYPROMPT
         .SBYTE "Insert ΣΠΩ δισλ in"
         .SBYTE " D1: and press"
         .SBYTE " START. "
;
PRGSTATUS
         .SBYTE "          "
         .SBYTE "          "
;
PATCHNUM
         .SBYTE "  PATCH "
PATCHDIGIT
         .SBYTE "00"
         .SBYTE " APPLIED  "
;
WRONGDISK
         .SBYTE "     WRONG"
         .SBYTE " DISK     "
;
ERRORMSG
         .SBYTE "ERROR WHIL"
         .SBYTE "E WRITTING"
;
FINISHED
         .SBYTE "     FINIS"
         .SBYTE "HED !     "
;
; Get sector command
;
GETDATA
         .BYTE $31,$01,$52,$40
         .WORD PATCHDATA,$0A,$80
         .WORD PATCHSEC
GETLEN   =   *-GETDATA
;
; Put sector command
;
PUTDATA
         .BYTE $31,$01,$57,$80
         .WORD MEMADDR,$40,$80
PUTLEN   =   *-PUTDATA
;
; Boot sector from prg disk
;
BOOTSEC
         *=  *+128
;
; Parameters read from spy disk
;
CHKPATCH
         *=  *+128
PATCHDATA
         *=  *+1
SPYMAGIC
         *=  *+3
PRGNAME
         *=  *+20
PATCHADDR
         *=  *+104
MEMADDR
         *=  *+256
MEMSECTOR
         *=  *+256
ENDSPY
;
; The prg starts at label MAIN
;
         *=  $02E0
;
         .WORD MAIN
;
; End of external references
;
         .END 
