antoine-source/fishhead/BM.GSOS.s
Antoine Vignau 4d4fb6a665 Let's free the code!!
Some old (WIP) disassemblies and my own source code now available online.
2024-07-23 23:38:22 +02:00

828 lines
12 KiB
ArmAsm

*
* BatchMan : GS/OS Module
*
* (c) 2011, Brutal Deluxe Software
GSOSversion jsl proDOS
dw $202a
adrl proVERS
lda proVERS+2
and #%01111111_11111111
cmp #$0402
rts
*----------------------------------------
GSOSgetPFXopen = *
jsl proDOS
dw $200a
adrl pgetPFXopen
rts
*-----------
GSOSsetPFXopen = *
jsl proDOS
dw $2009
adrl psetPFXopen
rts
*-----------
GSOSpopPFXopen = *
jsr GSOSgetPFXopen
sep #$20
ldx pfxOPEN2
]lp dex
cpx #1
beq popPFXopen1
lda pfxOPEN2+1,x
cmp #':'
bne ]lp
popPFXopen1 stx pfxOPEN2
rep #$20
jsr GSOSsetPFXopen
rts
*----------------------------------------
GSOSgetPFXsave = *
jsl proDOS
dw $200a
adrl pgetPFXsave
rts
*-----------
GSOSsetPFXsave = *
jsl proDOS
dw $2009
adrl psetPFXsave
rts
*-----------
GSOSpopPFXsave = *
jsr GSOSgetPFXsave
sep #$20
ldx pfxSAVE2
]lp dex
cpx #1
beq popPFXsave1
lda pfxSAVE2+1,x
cmp #':'
bne ]lp
popPFXsave1 stx pfxSAVE2
rep #$20
jsr GSOSsetPFXsave
rts
*----------------------------------------
GSOSgetVOLopen = *
jsl proDOS
dw $2008
adrl proVOLopen
cmp #$4a ; bad file format
bne GSOSgvo1
sec
rts
GSOSgvo1 clc
rts
*-----------
GSOSgetVOLsave = *
jsl proDOS
dw $2008
adrl proVOLsave
rts
*----------------------------------------
GSOSsetPATHopen = *
jsl proDOS
dw $2009
adrl psetPATHopen
rts
*-----------
GSOSsetPATHsave = *
jsl proDOS
dw $2009
adrl psetPATHsave
rts
*----------------------------------------
*GSOSgetName lda replyPTR+$10
* sta Debut
* lda replyPTR+$12
* sta Debut+2
*
* lda [Debut]
* clc
* adc #2
* sta proCRsave+2
* sta proDESTROY+2
* sta proSETINFO+2
* sta proOPEN+4
*
* ldy #2
* lda [Debut],y
* adc #0
* sta proCRsave+4
* sta proDESTROY+4
* sta proSETINFO+4
* sta proOPEN+6
* rts
*GSOSgetName lda #pathPTR1
* sta proCRsave+2
* sta proDESTROY+2
* sta proSETINFO+2
* sta proOPEN+4
*
* lda #^pathPTR1
* sta proCRsave+4
* sta proDESTROY+4
* sta proSETINFO+4
* sta proOPEN+6
*
* rts
*----------------------------------------
* v1.0b6 - All calls dealing with sessions
GSOSbeginSession = *
jsl proDOS
dw $201d
adrl proBEGSESS
rts
*-----------
GSOSendSession = *
jsl proDOS
dw $201e
adrl proENDSESS
rts
*-----------
GSOSsessionStatus = *
jsl proDOS
dw $201f
adrl proSESSSTAT
rts
*-----------
GSOSrestartSession = *
php
pha
cmp #$54 ; memory error
bne GSOSrese99
stz proSESSSTAT+2
jsr GSOSsessionStatus
lda proSESSSTAT+2
beq GSOSrese99
jsr GSOSendSession
jsr GSOSbeginSession
GSOSrese99 pla
plp
rts
*----------------------------------------
GSOSopen jsl proDOS
dw $2010
adrl proOPEN
bcs GSOSopen1
lda proOPEN+2
sta proSETMARK+2
sta proREAD+2
sta proCLOSE+2
lda proEOF
sta proREAD+8
lda proEOF+2
sta proREAD+10
clc
rts
GSOSopen1 sta proERR
sec
rts
*----------------------------------------
GSOSsetread sty proREAD+4
stx proREAD+6
rts
GSOSread sty proREAD+8
stx proREAD+10
jsl proDOS
dw $2012
adrl proREAD
rts
*----------------------------------------
GSOSsetwrite sty proWRITE+4
stx proWRITE+6
rts
GSOSwrite sty proWRITE+8
stx proWRITE+10
jsl proDOS
dw $2013
adrl proWRITE
rts
*----------------------------------------
GSOSclose jsl proDOS
dw $2014
adrl proCLOSE
rts
*----------------------------------------
GSOSappend sty proSETMARK+6
stx proSETMARK+8
jsl proDOS
dw $2016
adrl proSETMARK
rts
*----------------------------------------
GSOScreate stx proCRsave+18
sty proCRsave+16
sta proCRsave+8
* sta proSETINFO+8
* jsl proDOS
* dw $2005
* adrl proSETINFO
jsl proDOS
dw $2002
adrl proDESTROY
jsl proDOS
dw $2001
adrl proCRsave
bcs GSOSsave1
jsl proDOS
dw $2010
adrl proOPEN
bcs GSOSsave1
lda proOPEN+2
sta proSETMARK+2
sta proWRITE+2
sta proCLOSE+2
clc
rts
GSOSsave1 sta proERR
sec
rts
*----------------------------------------
* Check whether the device contains
* removable media, if not, set the carry
GSOScheckejectOPEN = *
* v1.0b3 - if MountIt disk image, do not eject the disk
sep #$20
ldx #0
]lp lda mountitSTR,x
beq ceo1 ; same device name
cmp devNAMEopen2,x
bne ceo0 ; different device name
inx
bne ]lp
* v1.0b3 - end of code
ceo0 rep #$20
lda proDIopen+8
and #%00000000_00000100
bne ceo2
ceo1 rep #$20 ; do not eject
sec
rts
ceo2 rep #$20 ; eject
clc
rts
mountitSTR asc '.DISKIMAGE'00
*----------------------------------------
GSOSejectOPEN = *
lda proDIopen+2
cmp #1 ; the boot device
beq ejectOPENko
sta proDCopen+2
jsl proDOS
dw $202E
adrl proDCopen
* v1.0b4 - Eject 3"5 disks only
* and ask for others...
lda proDIopen+$14
cmp #$3 ; Apple 3"5 drive
beq ejectOPENok
PushWord #0 ; Eject and replace
PushWord #5 ; flags
PushLong #0
PushLong #alertEJECT ; reference of alert
_AlertWindow
pla
beq ejectOPENko
ejectOPENok clc
rts
ejectOPENko sec
rts
*----------------------------------------
proDCopen dw 5 ;
ds 2 ; dev_num
dw 2 ; control_code (eject medium)
ds 4 ; control_list
ds 4 ; request_count
ds 4 ; transfer_count
*----------------------------------------
GSOSwaitOPEN = *
lda proDIopen+2
sta proDSopen+2
]lp jsl proDOS ; DeviceStatus
dw $202D
adrl proDSopen
jsr checkCANCEL ; Escape pressed?
bcs waitOPENko
lda proDSLopen ; Disk in drive?
and #%00000000_00010000
beq ]lp ; waitOPENok
clc
rts
waitOPENko sec
rts
*----------------------------------------
* Compare the open and destination prefixes
*
* Condition of error:
* - same string
GSOScomparePATH = *
sep #$20
ldx #0 ; first compare
]lp lda pfxOPEN3,x ; :RAM5
cmp pfxSAVE3,x ; :RAM5:TOTO
bne comparePATH7
inx
cpx pfxOPEN2
bne ]lp
* Here, we have the same beginning
* Now, check the next char in destination
* is ':', if so, same volume
lda pfxSAVE3,x ; :TOTO
cmp #':'
beq comparePATH9
* Last check, string lengths are the same
ldx pfxOPEN2
cpx pfxSAVE2
beq comparePATH9
comparePATH7 rep #$20 ; different
clc
rts
comparePATH9 rep #$20 ; same
sec
rts
*----------------------------------------
* Check that the destination pathname is correct
* which means it exists
* and is of type FOLDER or VOLUME
GSOScheckPFXsave = *
jsl proDOS
dw $2006
adrl pcheckPFXsave
bcs checkPFXsave1
lda pcheckPFXsave+8
cmp #$000f
beq checkPFXsave2
cmp #$000d
beq checkPFXsave2
checkPFXsave1 = *
sec
rts
checkPFXsave2 = *
clc
rts
*--------------
* Check destination device
* devicename must be different
* device must be write enabled
*
* Alert windows:
* 1- source = destination device
* 4- destination device is read-only
*
*checkDEVOUT = *
* stz proDIsave+2
*
* LOGO
* clc
* rts
*
*checkDOUT1 inc proDIsave+2
*
* jsl proDOS ; get device info
* dw $202C
* adrl proDIsave
* bcc checkDOUT2
* cmp #$0011 ; no more devices
* bne checkDOUT1 ; next device
* rts
*
* Get the volume name of the device
*checkDOUT2 jsr GSOSgetVOLsave
*
* Compare the name
* sep #$20
* ldx #1 ; skip the first :
*]lp lda volNAMEsave2,x
* cmp #':' ; end of destination volume name
* beq checkDOUT6 ; compare lengths
* cmp pfxSAVE3,x
*
*checkDOUT6 rep #$20
* dex
* cpx pfxSAVE2 ; same length?
* beq checkDOUT8 ; yes, we have our volume
*
* clc
* rts
*
*checkDOUT8 clc ; check, it is read-only!
* rts
*----------------------------------------
proERR ds 2 ; GS/OS error on source
proWERR ds 2 ; GS/OS error on destination
*----------------------------------------
* v1.0b6 - Add session management
proBEGSESS dw 0 ; 0 pcount
proENDSESS dw 0 ; 0 pcount
proSESSSTAT dw 1 ; 0 pcount
ds 2 ; 2 status
*----------------------------------------
proGETDIR dw 17 ; 0 pcount
ds 2 ; 2 ref_num
ds 2 ; 4 flags
dw 0 ; 6 base
dw 1 ; 8 displacement
adrl gsosPATH ; A name_buffer
ds 2 ; E entry_num
ds 2 ; 10 file_type
ds 4 ; 12 eof
ds 4 ; 16 block_count
ds 8 ; 1A create_td
ds 8 ; 22 modify_td
ds 2 ; 2A access
ds 4 ; 2C aux_type
ds 2 ; 30 file_sys_id
ds 4 ; 32 option_list
ds 4 ; 36 res_eof
ds 4 ; 3A res_block_count
proCRopen dw 7 ; pcount
adrl pathOPEN ; pathname
dw $c3 ; access_code
ds 2 ; file_type
ds 4 ; aux_type
ds 2 ; storage_type
ds 4 ; eof
ds 4 ; resource_eof
proCRsave dw 7 ; pcount
adrl pathSAVE ; pathname
dw $c3 ; access_code
ds 2 ; file_type
ds 4 ; aux_type
ds 2 ; storage_type
ds 4 ; eof
ds 4 ; resource_eof
proDESTROY dw 1 ; pcount
ds 4 ; pathname
proGIopen dw 12 ; pcount
adrl pathOPEN ; pathname
dw $c3 ; access_code
ds 2 ; file_type
ds 4 ; aux_type
ds 2 ; reserved
ds 8 ; create_td
ds 8 ; modify_td
ds 4 ; option_list
ds 4 ; reserved
ds 4 ; reserved
ds 4 ; reserved
ds 4 ; reserved
proGIpopen dw 12 ; pcount
adrl pfxOPEN2 ; pathname
dw $c3 ; access_code
ds 2 ; file_type
ds 4 ; aux_type
ds 2 ; reserved
ds 8 ; create_td
ds 8 ; modify_td
ds 4 ; option_list
ds 4 ; reserved
ds 4 ; reserved
ds 4 ; reserved
ds 4 ; reserved
proSIsave dw 7 ; pcount
adrl pathSAVE ; pathname
dw $c3 ; access_code
ds 2 ; file_type
ds 4 ; aux_type
ds 2 ; reserved
ds 8 ; create_td
ds 8 ; modify_td
proSIpsave dw 7 ; pcount
adrl pfxSAVE2 ; pathname
dw $c3 ; access_code
ds 2 ; file_type
ds 4 ; aux_type
ds 2 ; reserved
ds 8 ; create_td
ds 8 ; modify_td
proOPEN dw 15 ; pcount
ds 2 ; ref_num
adrl pfxOPEN2 ; pathname
ds 2 ; request_access
ds 2 ; resource_num
ds 2 ; access
ds 2 ; file_type
ds 4 ; aux_type
ds 2 ; storage_type
ds 8 ; create_td
ds 8 ; modify_td
ds 4 ; option_list
proEOF ds 4 ; eof
ds 4 ; blocks_used
ds 4 ; resource_eof
ds 4 ; resource_blocks
proREAD dw 5 ; +00 pcount
ds 2 ; +02 ref_num
ds 4 ; +04 data_buffer
ds 4 ; +08 request_count
ds 4 ; +12 transfer_count
dw 1 ; +16 cache_priority
proWRITE dw 5 ; pcount
ds 2 ; ref_num
ds 4 ; data_buffer
ds 4 ; request_count
ds 4 ; transfer_count
dw 1 ; cache_priority
proCLOSE dw 1 ; pcount
ds 2 ; ref_num
proSETMARK dw 3 ; pcount
ds 2 ; ref_num
ds 2 ; base
ds 4 ; displacement
proQUIT dw 2 ; pcount
ds 4 ; pathname
ds 2 ; flags
proVERS dw 1 ; pcount
ds 2 ; version
*-----------
proDRopen dw 6 ; Parms for DRead
ds 2 ; 02 devNum
ds 4 ; 04 buffer
ds 4 ; 08 requestCount
ds 4 ; 0C startingBlock
ds 2 ; 10 blockSize
ds 4 ; 12 transferCount
proDIopen dw 8 ; Parms for DInfo
ds 2 ; 02 device num
adrl devOPEN ; 04 device name
ds 2 ; 08 characteristics
ds 4 ; 0A total blocks
ds 2 ; 0E slot
ds 2 ; 10 unit
ds 2 ; 12 version number
ds 2 ; 14 device id
proDSopen dw 5 ; Parms for DStatus
ds 2 ; device num
dw 0 ; device status
adrl proDSLopen ; list
adrl 6 ; requestCount
ds 4 ; transferCount
proDSLopen ds 2 ; statusWord
ds 4 ; numBlocks
proVOLopen dw 8 ; Parms for Volume
adrl devNAMEopen ; device name
adrl volOPEN ; volume name
ds 4 ; total blocks
ds 4 ; free blocks
ds 2 ; file_sys_id
ds 2 ; block_size
ds 2 ; characteristics
ds 2 ; deviceId
devOPEN dw $0023 ; buffer size
devNAMEopen db $00 ; length
devNAMEopen1 db $00
devNAMEopen2 ds $21 ; data
volOPEN dw $0023 ; buffer size
volNAMEopen db $00 ; length
volNAMEopen1 db $00
volNAMEopen2 ds $21 ; data
*-----------
proDIsave dw 8 ; Parms for DInfo
ds 2 ; device num
adrl devSAVE ; device name
ds 2 ; characteristics
ds 4 ; total blocks
ds 2 ; slot
ds 2 ; unit
ds 2 ; version number
ds 2 ; device id
proDSsave dw 5 ; Parms for DStatus
ds 2 ; device num
dw 0 ; device status
adrl proDSLsave ; list
adrl 6 ; requestCount
ds 4 ; transferCount
proDSLsave ds 2 ; statusWord
ds 4 ; numBlocks
proVOLsave dw 8 ; Parms for Volume
adrl devNAMEsave ; device name
adrl volSAVE ; volume name
ds 4 ; total blocks
ds 4 ; free blocks
ds 2 ; file_sys_id
ds 2 ; block_size
ds 2 ; characteristics
ds 2 ; deviceId
devSAVE dw $0023 ; buffer size
devNAMEsave db $00 ; length
devNAMEsave1 db $00
devNAMEsave2 ds $21 ; data
volSAVE dw $0023 ; buffer size
volNAMEsave db $00 ; length
volNAMEsave1 db $00
volNAMEsave2 ds $21 ; data
*----------------------------------------
pgetPFXopen dw 2
dw 9 ; 8
adrl pfxOPEN
psetPFXopen dw 2
dw 9 ; 8
adrl pfxOPEN2
pfxOPEN dw 516
pfxOPEN2 ds 2
pfxOPEN3 ds 514
*-----------
pgetPFXsave dw 2
dw 8
adrl pfxSAVE
psetPFXsave dw 2
dw 8
adrl pfxSAVE2
pcheckPFXsave dw 3
adrl pfxSAVE2
ds 2
ds 2
pfxSAVE dw 516
pfxSAVE2 ds 2
pfxSAVE3 ds 514
*-----------
gsosPATH dw 516
gsosPATH2 ds 1
gsosPATH3 ds 515
*-----------
psetPATHopen dw 2
dw 9
adrl pathOPEN
pathOPEN dw 516
pathOPEN1 asc '9:'
pathOPEN2 ds 514
*-----------
psetPATHsave dw 2
dw 8
adrl pathSAVE
pathSAVE dw 516
pathSAVE1 asc '8:'
pathSAVE2 ds 514