A2osX/BIN/X.CPMVRM.S.txt

711 lines
13 KiB
Plaintext
Raw Normal View History

NEW
2019-09-19 15:22:14 +00:00
AUTO 3,1
.LIST OFF
*--------------------------------------
X.COPY.BUF.SIZE .EQ 4096
*--------------------------------------
2019-10-12 14:20:09 +00:00
.DUMMY
.OR ZPBIN
ZS.START
ZPPtr1 .BS 2
ZPPtr2 .BS 2
ZPFileName .BS 2
ZPFileStat .BS 2
ZS.END .ED
*--------------------------------------
* File Header (16 Bytes)
*--------------------------------------
CS.START cld
jmp (.1,x)
.DA #$61 6502,Level 1 (65c02)
.DA #1 BIN Layout Version 1
.DA 0
.DA CS.END-CS.START CS
.DA DS.END-DS.START DS
2018-08-11 10:57:57 +00:00
.DA #64 SS
2019-10-12 14:20:09 +00:00
.DA #ZS.END-ZS.START Zero Page Size
.DA 0
*--------------------------------------
* Relocation Table
2019-10-03 06:25:27 +00:00
*--------------------------------------
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.DOEVENT
.DA CS.QUIT
L.MSG.USAGE .DA MSG.USAGE
L.MSG.DIR .DA MSG.DIR
2020-02-29 14:06:28 +00:00
L.MSG.REG .DA MSG.REG
.DO X.COPY.TO.DEST=1
L.MSG.OVERWRITE .DA MSG.OVERWRITE
.FIN
L.MSG.OK .DA MSG.OK
L.MSG.ERR .DA MSG.ERR
2019-10-28 06:32:12 +00:00
L.MSG.CRLF .DA MSG.CRLF
L.MSG.DONE .DA MSG.DONE
L.STAT .DA STAT
.DA 0
*--------------------------------------
2019-10-03 06:25:27 +00:00
CS.INIT
.1 >INC.G ArgCount
2018-10-16 15:48:03 +00:00
>SYSCALL ArgV
bcs .7
2019-10-12 14:20:09 +00:00
>STYA ZPPtr1
lda (ZPPtr1)
cmp #'-'
bne .4
2018-08-11 10:57:57 +00:00
ldy #1
lda (ZPPtr1),y
2019-10-28 06:32:12 +00:00
ldx #OptionVars-OptionList-1
.2 cmp OptionList,x
beq .3
dex
2019-10-28 06:32:12 +00:00
bpl .2
2020-02-14 07:21:56 +00:00
.99 >PUSHW L.MSG.USAGE
>PUSHBI 0
2020-02-28 07:21:46 +00:00
>SYSCALL PrintF
2018-10-21 20:54:07 +00:00
lda #E.SYN
sec
rts
2019-10-12 14:20:09 +00:00
2019-10-28 06:32:12 +00:00
.3 ldy OptionVars,x
lda #$80
sta (pData),y
bra .1
2019-10-12 14:20:09 +00:00
2018-08-11 10:57:57 +00:00
.4 >LDA.G index
.DO X.COPY.TO.DEST=1
bne .5 Already have a Src dir...
.ELSE
bne .99
.FIN
2019-10-12 14:20:09 +00:00
>LDYA ZPPtr1
jsr InitSrcDirYA
bcc .1 success, scan for any other args
.9 rts
.DO X.COPY.TO.DEST=1
2019-10-03 06:25:27 +00:00
.5 >LDA.G hDstBasePath
bne .99 we already have a second arg....error!
>LDYA ZPPtr1
jsr InitDstDirYA
bcc .1 success, scan for any other args
rts
.FIN
2017-10-04 15:12:03 +00:00
.7 >LDA.G index processed all args
beq .99 , no src ? ERROR
.DO X.COPY.TO.DEST=1
2019-10-03 06:25:27 +00:00
>LDA.G hDstBasePath
bne .8 we also have a Dst folder
2019-10-12 14:20:09 +00:00
ldy #S.PS.hCWD no dst folder, use actual prefix
2020-02-28 07:21:46 +00:00
lda (pPS),y
2018-07-18 15:30:42 +00:00
>SYSCALL GetMemPtr
jsr InitDstDirYA
bcs .99
.FIN
.8 >LDYAI 256
2020-02-28 07:21:46 +00:00
>SYSCALL GetMem
bcs .9
txa
2017-10-04 15:12:03 +00:00
>STA.G hSrcFullPath
2019-10-12 14:20:09 +00:00
.DO X.COPY.TO.DEST=1
>LDYAI 256
2020-02-28 07:21:46 +00:00
>SYSCALL GetMem
bcs .9
txa
2017-10-04 15:12:03 +00:00
>STA.G hDstFullPath
.FIN
clc
2019-02-21 16:26:21 +00:00
CS.INIT.RTS rts
*--------------------------------------
2019-02-21 16:26:21 +00:00
CS.RUN ldy #S.PS.hStdIn
lda (pPS),y
2020-02-28 07:21:46 +00:00
>SYSCALL FEOF
2019-02-21 16:26:21 +00:00
bcs CS.INIT.RTS I/O error
tay
2019-05-02 09:52:32 +00:00
bne .15
2019-10-12 14:20:09 +00:00
2019-02-21 16:26:21 +00:00
>SYSCALL GetChar
bcs CS.INIT.RTS I/O error
cmp #$03 Ctrl-C
bne .10
sec
rts Abort....
2019-10-12 14:20:09 +00:00
.10 cmp #$13 Ctrl-S
2018-11-17 17:17:13 +00:00
bne .15
2019-10-12 14:20:09 +00:00
>LDA.G bPause
eor #$ff
sta (pData),y
2019-10-12 14:20:09 +00:00
.15 >LDA.G bPause
bpl .1
2019-04-30 16:08:47 +00:00
.8 clc
rts
*--------------------------------------
.1 .DO X.COPY.TO.DEST=1
2019-10-12 14:20:09 +00:00
>LDA.G bCopy
beq .2
2019-10-12 14:20:09 +00:00
jsr CS.RUN.Copy
2019-10-12 14:20:09 +00:00
>LDA.G bCopy Copy completed ?
bne .8 no.....exit
2019-10-12 14:20:09 +00:00
clc
2019-10-12 14:20:09 +00:00
>LDA.G CopyRC
.DO X.DELETE.SOURCE=0
beq .20 no copy error
sec
jsr CS.RUN.CheckErr we have an error....
bcs .9
jmp CS.RUN.NEXT
2019-10-12 14:20:09 +00:00
.20 jsr CS.RUN.CheckErr Success!!
jsr CS.RUN.IncCount
jmp CS.RUN.NEXT
.ELSE
beq .2
sec
jsr CS.RUN.CheckErr we have an error....
bcc .21
rts
2018-08-11 10:57:57 +00:00
.21 >STZ.G hToDelete Cancel delete if any
jmp CS.RUN.NEXT
.FIN
.FIN
.2 .DO X.DELETE.SOURCE=1
2019-10-12 14:20:09 +00:00
>LDA.G hToDelete
beq .3
2019-10-12 14:20:09 +00:00
lda #0
sta (pData),y
ldy #hSrcFullPath
jsr CS.RUN.GetPathY
2020-02-28 07:21:46 +00:00
>SYSCALL Remove
bcs .22
2020-05-20 13:14:28 +00:00
jsr CS.RUN.CheckErr Success!!!
jsr CS.RUN.IncCount
jmp CS.RUN.NEXT
.22 jsr CS.RUN.CheckErr
bcs .9
jmp CS.RUN.NEXT
.FIN
*--------------------------------------
.3 jsr GetEntry
bcs CS.RUN.LEAVE
2019-04-30 16:08:47 +00:00
jsr FilterMatch
2019-10-12 14:20:09 +00:00
bcs CS.RUN.NEXT no match, skip....
2020-02-29 14:06:28 +00:00
.4 ldy #S.STAT.MODE+1
lda (ZPFileStat),y
2020-03-03 16:44:52 +00:00
and #$70
2020-02-29 14:06:28 +00:00
bne .5 REG file ?
jsr CS.RUN.BuildFilePath
jmp CS.RUN.REG
.5 cmp /S.STAT.MODE.DIR DIR ?
bne .7
2017-10-04 15:12:03 +00:00
>LDA.G bRecurse
bpl CS.RUN.NEXT
2018-11-05 16:28:40 +00:00
lda (ZPFileName)
cmp #'.'
beq CS.RUN.NEXT Skip "." & ".."
jsr CS.RUN.BuildFilePath
jmp CS.RUN.DIR
2020-02-29 14:06:28 +00:00
.7 lda #MLI.E.UNSUPST
sec
.9 rts
*--------------------------------------
CS.RUN.CR.NEXT jsr CS.RUN.CR
CS.RUN.NEXT jsr GetNextEntry
bcs CS.RUN.LEAVE
rts
*--------------------------------------
CS.RUN.LEAVE jsr LeaveSubDir exit this sub dir....
bcs .99 base, we are done, exit
jsr BasePath..
.DO X.DELETE.SOURCE=1
2019-05-02 09:52:32 +00:00
* .DO X.COPY.TO.DEST=0
jsr GetEntry
jsr CS.RUN.BuildFilePath
jsr CS.RUN.DIR.MSG
bcs CS.RUN.LEAVE.RTS
2019-02-28 09:55:51 +00:00
ldy #hSrcFullPath
jsr CS.RUN.GetPathY
2020-02-28 07:21:46 +00:00
>SYSCALL Remove
jsr CS.RUN.CheckErr
bcs .99
2019-05-02 09:52:32 +00:00
* .FIN
.FIN
jmp CS.RUN.NEXT
.99 ldy #bQuiet
lda (pData),y
bmi .91
2020-02-14 07:21:56 +00:00
>PUSHW L.MSG.DONE
ldy #Count+1
>PUSHB (pData),y
dey
>PUSHB (pData),y
2018-08-23 15:16:20 +00:00
>PUSHBI 2
2020-02-14 07:21:56 +00:00
2020-02-28 07:21:46 +00:00
>SYSCALL PrintF
2020-02-14 07:21:56 +00:00
.91 ldy #RC
lda (pData),y get global RC in case of bContinue
sec
CS.RUN.LEAVE.RTS
rts
*--------------------------------------
2019-02-28 09:55:51 +00:00
CS.RUN.DIR .DO X.COPY.TO.DEST=1
jsr CS.RUN.DIR.MSG
bcs CS.RUN.LEAVE.RTS
2020-02-14 07:21:56 +00:00
ldy #hDstFullPath
jsr CS.RUN.GetPathY
2020-02-14 07:21:56 +00:00
>PUSHYA
>PUSHW L.STAT
>SYSCALL Stat
bcs .3 File Not exists...go create
2020-02-14 07:21:56 +00:00
ldy #bNoConfirm
lda (pData),y
bmi .21 no prompt, nothing to create, enter subdir
2020-02-29 14:06:28 +00:00
jsr CS.RUN.OVERWRITE.MSG
bcs CS.RUN.DIR.RTS
.1 >SLEEP
>SYSCALL GetChar
bcs .1
cmp #3
beq .99 abort
2019-10-11 13:06:33 +00:00
jsr CS.RUN.ToUpper
cmp #'N'
bne .2
jmp CS.RUN.CR.NEXT no overwrite, nothing to do, no recurse
.2 cmp #'Y'
beq .21 no create, but recurse
cmp #'A'
bne .1
ldy #bNoConfirm
lda #$ff
sta (pData),y
.21 clc
lda #0
bra .4
2020-02-29 14:06:28 +00:00
.3 ldy #hDstFullPath
jsr CS.RUN.GetPathY
2020-02-29 14:06:28 +00:00
>PUSHYA
ldy #S.STAT.MODE+1
lda (ZPFileStat),y
>PUSHA
dey
lda (ZPFileStat),y
>PUSHA
2020-02-28 07:21:46 +00:00
>SYSCALL MKDir
2020-02-29 14:06:28 +00:00
.4 jsr CS.RUN.CheckErr
bcs CS.RUN.DIR.RTS
2019-04-29 15:47:17 +00:00
jsr CS.RUN.IncCount
.FIN
2019-04-29 15:47:17 +00:00
>LDYA ZPFileName
jmp EnterSubDirYA
.99 ldy #RC
lda (pData),y get global RC in case of bContinue
sec
CS.RUN.DIR.RTS rts
*--------------------------------------
2020-02-29 14:06:28 +00:00
CS.RUN.REG jsr CS.RUN.REG.MSG
bcs CS.RUN.DIR.RTS
.DO X.COPY.TO.DEST=1
ldy #hDstFullPath
jsr CS.RUN.GetPathY
2020-02-14 07:21:56 +00:00
>PUSHYA
>PUSHW L.STAT
>SYSCALL Stat
bcs .2 File Not exists...go create
2019-10-12 14:20:09 +00:00
ldy #bNoConfirm
lda (pData),y
bmi .2 no prompt, ovverwrite
2019-10-12 14:20:09 +00:00
jsr CS.RUN.OVERWRITE.MSG
bcs .9
2019-10-12 14:20:09 +00:00
.1 >SLEEP
>SYSCALL GetChar
bcs .1
cmp #3
beq .99 abort
2019-10-11 13:06:33 +00:00
jsr CS.RUN.ToUpper
cmp #'N'
bne .11
jmp CS.RUN.CR.NEXT no overwrite exit
.90 rts
.11 cmp #'Y'
beq .12 copy
cmp #'A'
bne .1
ldy #bNoConfirm
lda #$ff
sta (pData),y
.12 jsr GetEntry get back current entry corrupted by SLEEP
.2 .DO X.DELETE.SOURCE=1 mv file, check if srcbase=dstbase
ldy #hSrcBasePath
jsr CS.RUN.GetPathY
>PUSHYA
ldy #hDstBasePath
jsr CS.RUN.GetPathY
2018-12-17 15:21:32 +00:00
>SYSCALL StrCaseCmp
bcs .3 not same dir, go copy/delete
jsr CS.RUN.Rename
jsr CS.RUN.CheckErr
bcs .9
jmp CS.RUN.NEXT
.FIN
.3 jsr CS.RUN.CopyStart
bcc .4
jsr CS.RUN.CheckErr
2018-11-28 11:39:33 +00:00
bcs .9
jmp CS.RUN.NEXT
.FIN
.4 .DO X.DELETE.SOURCE=1
ldy #hSrcFullPath
lda (pData),y
ldy #hToDelete
sta (pData),y
.FIN
clc
.9 rts
.99 ldy #RC
lda (pData),y get global RC in case of bContinue
sec
rts
*--------------------------------------
CS.RUN.DIR.MSG sec
.HS 90 bcc opcode
2020-02-29 14:06:28 +00:00
CS.RUN.REG.MSG clc
2018-08-11 10:57:57 +00:00
>LDA.G bQuiet
bmi .8
2020-02-14 07:21:56 +00:00
bcc .1
>LDYA L.MSG.DIR
bcs .2
2020-02-29 14:06:28 +00:00
.1 >LDYA L.MSG.REG
2020-02-14 07:21:56 +00:00
.2 >PUSHYA
ldy #hSrcFullPath
jsr CS.RUN.GetPathY
2018-08-23 20:38:32 +00:00
>PUSHYA
2018-08-23 15:16:20 +00:00
.DO X.COPY.TO.DEST=1
2020-02-14 07:21:56 +00:00
ldy #hDstFullPath
jsr CS.RUN.GetPathY
>PUSHYA
2018-08-23 15:16:20 +00:00
>PUSHBI 4
2020-02-14 07:21:56 +00:00
2018-08-23 15:16:20 +00:00
.ELSE
>PUSHBI 2
.FIN
2020-02-14 07:21:56 +00:00
2020-02-28 07:21:46 +00:00
>SYSCALL PrintF
rts
2020-02-14 07:21:56 +00:00
.8 clc
rts
*--------------------------------------
.DO X.COPY.TO.DEST=1
CS.RUN.OVERWRITE.MSG
2018-08-11 10:57:57 +00:00
>LDA.G bQuiet
bmi .1
jsr CS.RUN.CR
2020-02-14 07:21:56 +00:00
.1 >PUSHW L.MSG.OVERWRITE
ldy #hDstFullPath
jsr CS.RUN.GetPathY
>PUSHYA
2018-08-23 15:16:20 +00:00
>PUSHBI 2
2020-02-28 07:21:46 +00:00
>SYSCALL PrintF
rts
.FIN
*--------------------------------------
2020-02-14 07:21:56 +00:00
CS.RUN.CR >PUSHW L.MSG.CRLF
>PUSHBI 0
2020-02-28 07:21:46 +00:00
>SYSCALL PrintF
2019-10-28 06:32:12 +00:00
rts
*--------------------------------------
.DO X.COPY.TO.DEST=1
.DO X.DELETE.SOURCE=1
2020-02-23 20:46:25 +00:00
CS.RUN.Rename ldy #hSrcFullPath
jsr CS.RUN.GetPathY
>PUSHYA
2020-02-23 20:46:25 +00:00
ldy #hDstFullPath
jsr CS.RUN.GetPathY
2020-02-23 20:46:25 +00:00
>PUSHYA
>SYSCALL Rename
bcs .9
jsr CS.RUN.IncCount
.9 rts
.FIN
2017-10-04 15:12:03 +00:00
.FIN
*--------------------------------------
.DO X.COPY.TO.DEST=1
CS.RUN.CopyStart
2020-05-19 13:00:17 +00:00
>STZ.G hSrcFile
>STA.G hDstFile
2020-05-21 12:55:49 +00:00
>STA.G hCopyBuf
>STA.G CopyRC Reset RC
>LDYAI X.COPY.BUF.SIZE
>SYSCALL GetMem
bcs .9
>STYA ZPPtr1
txa
>STA.G hCopyBuf
2020-05-19 13:00:17 +00:00
ldy #hSrcFullPath
2018-10-02 15:52:30 +00:00
lda #O.RDONLY
jsr CS.RUN.Open
2020-05-21 12:55:49 +00:00
bcs CS.RUN.CopyEnd
2018-08-11 10:57:57 +00:00
>STA.G hSrcFile
2019-10-28 06:32:12 +00:00
ldy #hDstFullPath
2018-10-02 15:52:30 +00:00
lda #O.WRONLY+O.CREATE
jsr CS.RUN.Open
2020-05-21 12:55:49 +00:00
.9 bcs CS.RUN.CopyEnd
2019-10-12 14:20:09 +00:00
>STA.G hDstFile
lda #$ff
2019-10-12 14:20:09 +00:00
>STA.G bCopy
2020-05-21 12:55:49 +00:00
* clc
rts
*--------------------------------------
2020-05-21 12:55:49 +00:00
CS.RUN.Copy >PUSHWI X.COPY.BUF.SIZE Bytes To Read
2018-07-25 15:26:14 +00:00
>PUSHW ZPPtr1 Dst Ptr
2018-07-24 16:00:24 +00:00
>LDA.G hSrcFile
>SYSCALL FRead
bcc .1
2020-05-19 13:00:17 +00:00
cmp #MLI.E.EOF
2017-02-22 07:31:16 +00:00
bne .9
2020-05-19 13:00:17 +00:00
2017-02-22 07:31:16 +00:00
lda #0
2020-05-21 12:55:49 +00:00
clc
2017-02-22 07:31:16 +00:00
bra .9
2020-05-19 13:00:17 +00:00
2018-09-05 11:31:49 +00:00
.1 >PUSHYA Bytes To Write
2018-07-25 15:26:14 +00:00
>PUSHW ZPPtr1 Src Ptr
2018-07-24 16:00:24 +00:00
>LDA.G hDstFile
>SYSCALL FWrite
bcs .9
2020-05-19 13:00:17 +00:00
ldy #bQuiet
lda (pData),y
bmi .8
lda #'.'
2018-07-18 15:30:42 +00:00
>SYSCALL PutChar
2020-05-19 13:00:17 +00:00
.8 rts
2020-05-21 12:55:49 +00:00
.9 >STA.G CopyRC
*--------------------------------------
2020-05-19 13:00:17 +00:00
CS.RUN.CopyEnd php
pha
2020-05-21 12:55:49 +00:00
>STA.G CopyRC
>LDA.G hDstFile
beq .1
2020-02-28 07:21:46 +00:00
>SYSCALL FClose
2020-05-21 12:55:49 +00:00
.1 >LDA.G hSrcFile
beq .2
2020-02-28 07:21:46 +00:00
>SYSCALL FClose
2020-05-21 12:55:49 +00:00
.2 >LDA.G hCopyBuf
beq .3
>SYSCALL FreeMem
.3 >STZ.G bCopy
2020-05-19 13:00:17 +00:00
pla
plp
2017-10-04 15:12:03 +00:00
rts
.FIN
*--------------------------------------
2020-05-21 12:55:49 +00:00
CS.RUN.Open pha Save open mode
jsr CS.RUN.GetPathY
>PUSHYA
pla
>PUSHA
ldy #S.STAT.P.TYPE
>PUSHB (ZPFileStat),y
ldy #S.STAT.P.AUXTYPE+1
>PUSHB (ZPFileStat),y
dey
>PUSHB (ZPFileStat),y
>SYSCALL FOpen
rts
*--------------------------------------
CS.RUN.CheckErr bcs .1
2019-10-28 06:32:12 +00:00
>LDA.G bQuiet
bmi .8
2019-10-28 06:32:12 +00:00
>LDYA L.MSG.OK
2020-02-28 07:21:46 +00:00
>SYSCALL PutS
2018-09-05 11:31:49 +00:00
.8 rts
2019-10-28 06:32:12 +00:00
2018-11-28 11:39:33 +00:00
.1 pha
2020-02-14 07:21:56 +00:00
>PUSHW L.MSG.ERR
pla
pha
>PUSHA
2018-08-23 15:16:20 +00:00
>PUSHBI 1
2020-02-28 07:21:46 +00:00
>SYSCALL PrintF
2019-10-28 06:32:12 +00:00
2018-11-28 11:39:33 +00:00
>LDA.G bContinue
eor #$80
asl
pla
rts
*--------------------------------------
CS.RUN.BuildFilePath
ldy #hSrcBasePath
jsr CS.RUN.GetPathY
>PUSHYA
ldy #hSrcFullPath
jsr CS.RUN.GetPathY
>STYA ZPPtr1
>SYSCALL StrCpy
>PUSHW ZPFileName
2018-07-16 05:52:52 +00:00
>LDYA ZPPtr1
>SYSCALL StrCat
.DO X.COPY.TO.DEST=1
ldy #hDstBasePath
jsr CS.RUN.GetPathY
>PUSHYA
ldy #hDstFullPath
jsr CS.RUN.GetPathY
>STYA ZPPtr1
>SYSCALL StrCpy
ldy #hDstFileName
lda (pData),y
beq .1
2018-07-18 15:30:42 +00:00
>SYSCALL GetMemPtr
>PUSHYA
bra .2
.1 >PUSHW ZPFileName
2018-07-16 05:52:52 +00:00
.2 >LDYA ZPPtr1
>SYSCALL StrCat
.FIN
rts
*--------------------------------------
CS.RUN.GetPathY lda (pData),y
2018-07-18 15:30:42 +00:00
>SYSCALL GetMemPtr
rts
*--------------------------------------
CS.RUN.IncCount >INCW.G Count
rts
*--------------------------------------
2019-10-11 13:06:33 +00:00
CS.RUN.ToUpper cmp #'a'
bcc .8
cmp #'z'+1
bcs .8
eor #$20
.8 rts
*--------------------------------------
CS.DOEVENT sec
rts
*--------------------------------------
CS.QUIT jsr LeaveSubDir
bcc CS.QUIT
2019-10-12 14:20:09 +00:00
.DO X.COPY.TO.DEST=1
2018-08-11 10:57:57 +00:00
>LDA.G bCopy
bpl .1
2019-10-28 06:32:12 +00:00
2020-05-19 13:00:17 +00:00
jsr CS.RUN.CopyEnd
2019-10-12 14:20:09 +00:00
.1 ldy #hDstFullPath
2019-06-02 08:58:46 +00:00
jsr .7
2019-10-12 14:20:09 +00:00
2020-03-03 16:44:52 +00:00
ldy #hDstFileName
2019-06-02 08:58:46 +00:00
jsr .7
.FIN
2019-10-12 14:20:09 +00:00
ldy #hSrcFullPath
2019-06-02 08:58:46 +00:00
jsr .7
2019-10-12 14:20:09 +00:00
2018-08-11 10:57:57 +00:00
ldy #hFilter
2019-06-02 08:58:46 +00:00
.7 lda (pData),y
beq .9
2019-10-12 14:20:09 +00:00
2018-07-18 15:30:42 +00:00
>SYSCALL FreeMem
2019-06-04 15:49:58 +00:00
.9 clc
rts
*--------------------------------------
MAN
2020-05-21 12:55:49 +00:00
SAVE usr/src/bin/x.cpmvrm.s
LOAD usr/src/bin/cp.s
2018-08-11 10:57:57 +00:00
ASM