antoine-source/scsi2/SCANNERSCSICOLOR.S

2283 lines
48 KiB
ArmAsm
Raw Normal View History

2024-08-15 21:27:35 +02:00
*
* SCANNER SCSI
* A test app for SCSI scanner commands
*
* (c) 2024, Brutal Deluxe Software
* Visit brutaldeluxe.fr
*
2024-08-15 22:51:34 +02:00
xc
xc
mx %00
2024-08-15 21:27:35 +02:00
2024-08-15 22:51:34 +02:00
rel
lst off
2024-08-15 21:27:35 +02:00
*----------
2024-08-15 22:51:34 +02:00
use 4/Int.Macs
use 4/Locator.Macs
use 4/Mem.Macs
use 4/Misc.Macs
use 4/Text.Macs
use 4/Util.Macs
2024-08-15 21:27:35 +02:00
2024-08-15 22:51:34 +02:00
Debut = $00
GSOS = $e100a8
2024-08-15 21:27:35 +02:00
*----------
2024-08-19 22:19:22 +02:00
windowID = 0
2024-08-15 22:51:34 +02:00
devSCANNER = $001a
2024-08-15 21:27:35 +02:00
2024-08-15 22:51:34 +02:00
maxDEVICES = 8
2024-08-15 21:27:35 +02:00
2024-08-15 22:51:34 +02:00
dcEXPLORE = $800e ; status
dcINQUIRY = $8012 ; status
dcMODESELECT = $8015
dcMODESENSE6 = $801a
dcSTARTSTOP = $801b ; also eject/insert
dcSETWINDOWPARAMETERS = $8024 ; for scanner (control)
dcGETWINDOWPARAMETERS = $8025 ; for scanner (status)
stEXPLORE = $0e ; status
stINQUIRY = $12 ; status
stMODESELECT = $15
stMODESENSE6 = $1a
stSTARTSTOP = $1b ; also eject/insert
stSETWINDOWPARAMETERS = $24 ; for scanner (control)
stGETWINDOWPARAMETERS = $25 ; for scanner (status)
DInfo = $202c
DStatus = $202d
DControl = $202e
2024-08-15 21:27:35 +02:00
*----------
phk
plb
tdc
sta myDP
_TLStartUp
pha
_MMStartUp
pla
sta appID
ora #$0100
sta myID
_MTStartUp
_TextStartUp
_IMStartUp
pha
pha
PushLong #$010000
PushWord myID
PushWord #%11000000_00011100
PushLong #0
_NewHandle
phd
tsc
tcd
lda [3]
sta ptrBUFFER
ldy #2
lda [3],y
sta ptrBUFFER+2
pld
ply
sty haBUFFER
plx
stx haBUFFER+2
*----------
PushWord #$00FF
PushWord #$0080
_SetInGlobals
PushWord #$00FF
PushWord #$0080
_SetOutGlobals
PushWord #$00FF
PushWord #$0080
_SetErrGlobals
PushWord #0
PushLong #3
_SetInputDevice
PushWord #0
PushLong #3
_SetOutputDevice
PushWord #0
PushLong #3
_SetErrorDevice
PushWord #0
_InitTextDev
PushWord #1
_InitTextDev
PushWord #2
_InitTextDev
2024-08-19 22:19:22 +02:00
PushWord #$0c ; home
2024-08-15 21:27:35 +02:00
_WriteChar
2024-08-18 22:25:57 +02:00
lda #previewPAGE
stal $300
lda #^previewPAGE
stal $302
lda #statusCALL
stal $310
lda #^statusCALL
stal $312
2024-08-15 21:27:35 +02:00
*----------------------------
* MAIN MENU
*----------------------------
mainMENU = *
PushLong #strMAINMENU
_WriteCString
jsr waitFORKEY
cmp #"Q"
beq doQUIT
cmp #"q"
beq doQUIT
cmp #"1"
bne mainMENU
jmp searchMENU
*--- Data
strMAINMENU asc 0d'SCANNER SCSI'0d
asc '(c) 2024, Brutal Deluxe Software'0d
asc ' 1. Search for SCSI Scanners'0d
asc ' Q. Quit'0d00
*----------------------------
* QUIT PROGRAM
*----------------------------
doQUIT = *
_IMShutDown
_TextShutDown
_MTShutDown
PushWord myID
_DisposeAll
PushWord appID
_MMShutDown
_TLShutDown
jsl GSOS
dw $2029
adrl proQUIT
brk $bd
*----------------------------
* SEARCH MENU
*----------------------------
searchMENU = *
PushLong #strSEARCHMENU
_WriteCString
jsr pollCDSCSI ; show CD-ROM devices
]lp jsr waitFORKEY ; is it 0-9
cmp #"0"
bcc ]lp
bne searchMENU2
jmp mainMENU ; or even 0 to exit
searchMENU2 cmp #"9"+1
bcs ]lp
sec ; we have our device ID
sbc #"0"
cmp nbDEVICES ; in the 1-nbDEVICES range
bcc searchMENU3
bne ]lp
searchMENU3 dec
asl
tax
lda tblDEVICES,x
sta theDEVICE ; we have our device now
jmp deviceMENU
*---------- Routines
pollCDSCSI stz nbDEVICES ; number of SCSI CD-ROM found
lda #1 ; start with device 1
sta proDINFO+2
]lp jsl GSOS ; do a DInfo
dw $202c
adrl proDINFO
bcc found
cmp #$0011 ; no more devices
bne loop
rts
loop inc proDINFO+2
bra ]lp
*---------- Check it is a scanner
found lda proDINFO+20 ; not SCANNER
cmp #devSCANNER
bne loop
*--- We have a scanner
lda nbDEVICES
asl
tax
lda proDINFO+2
sta tblDEVICES,x
jsr showDEVICEINFO
inc nbDEVICES
lda nbDEVICES
cmp #maxDEVICES
bcc loop ; loop again
rts
*--- Sub routines
*
* x - $xxxx - .NAMEOFDEVICE
showDEVICEINFO
2024-08-17 22:26:51 +02:00
pha ; from a word to a string
pha
pha
_HexIt
PullLong strDEVID
PushWord #$20 ; space
_WriteChar
lda nbDEVICES ; write device index
inc
ora #"0"
pha
_WriteChar
PushLong #strDEV ; show the string
_WriteCString
2024-08-19 22:19:22 +02:00
ldx #$32-2 ; copy the original
2024-08-18 22:25:57 +02:00
]lp lda devINFO1,x ; devname for open/close
sta devNAME,x ; calls
2024-08-17 22:26:51 +02:00
dex
dex
2024-08-18 22:25:57 +02:00
bpl ]lp
2024-08-17 22:26:51 +02:00
lda devINFO1 ; from a STRL to a STR
xba
sta devINFO1
PushLong #devINFO2
_WriteString
PushWord #$0d
_WriteChar
rts
2024-08-15 21:27:35 +02:00
*---------- Data
strDEV asc ' - $'
strDEVID asc '0000 - '00
nbDEVICES ds 2 ; number of devices
theDEVICE ds 2 ; the device to play with
tblDEVICES ds 16*2 ; we authorize 16 devices
strSEARCHMENU
2024-08-17 22:26:51 +02:00
asc 0d'Searching for SCSI Scanners...'0d
asc ' 0. Go back to previous menu'0d00
2024-08-15 21:27:35 +02:00
*----------------------------
* DEVICE MENU
*----------------------------
deviceMENU = *
lda theDEVICE ; get our ID
sta proSTATUS+2
sta proCONTROL+2
pha ; from a word to a string
pha
pha
_HexIt
PullLong strDEVMENU
PushLong #strDEVICEMENU
_WriteCString
*---
]lp jsr waitFORKEY ; is it 0-9
cmp #"0"
bcc ]lp
bne deviceMENU2
jmp searchMENU ; or even 0 to exit
2024-08-17 22:26:51 +02:00
deviceMENU2 cmp #"2"+1
2024-08-15 21:27:35 +02:00
bcs ]lp
sec ; call the routines
sbc #"1"
asl
tax
lda ptrCOMMANDS,x
sta deviceMENU3+1
deviceMENU3 jsr $bdbd
jmp deviceMENU
2024-08-15 22:51:34 +02:00
ptrCOMMANDS
da doINQUIRY
2024-08-17 22:26:51 +02:00
da previewPAGE
* da doMODESENSE6
* da doEXPLORE
* da doGETMODE
* da doGETWINDOWPARAMETERS
2024-08-15 21:27:35 +02:00
*--- Data
2024-08-15 22:51:34 +02:00
strDEVICEMENU
asc 0d'Using SCSI Scanner device $'
strDEVMENU
asc '0000'0d
asc ' 0. Go back to previous menu'0d
2024-08-17 22:26:51 +02:00
asc ' 1. Inquiry'0d
asc ' 2. Preview page'0d
2024-08-15 22:51:34 +02:00
asc 00
*----------------
* APPLE SCANNERS
*
* Scanner (300dpi 4-bit grey)
* 06 00 02 02 2C 00 00 00 'APPLE SCANNER A9M0337 '
* 06 00 02 02 28 00 00 00 'CPC INC Smart Scan(FW) '
*
* OneScanner (300dpi 8-bit grey)
* 06 00 02 02 2C 20 04 08 'APPLE SCANNER II 2.02'
* 00 20 00 90 00 27 34 01 08 A0 48 00 FF FF
*
* Color OneScanner (300dpi 24-bit color)
*
*
2024-08-19 22:19:22 +02:00
* Color OneScanner 600/27 (600dpi 27-bit color) - CANOSCAN 300 (CS300)
2024-08-15 22:51:34 +02:00
* 06 00 02 02 1F 00 00 10 'CANON IX-03035B 1.01' FF
*
2024-08-19 22:19:22 +02:00
* Color OneScanner 1200/30 (1200dpi 30-bit color) - CANOSCAN 600 (CS600)
2024-08-15 22:51:34 +02:00
* 06 00 02 02 1F 00 00 10 'CANON IX-06015C 1.07' FF
*
* ---End of list
2024-08-15 21:27:35 +02:00
*----------------
* SCSI COMMANDS
*----------------
2024-08-15 22:51:34 +02:00
*-----------------------
* STATUS $8012 - INQUIRY
*-----------------------
2024-08-15 21:27:35 +02:00
2024-08-15 22:51:34 +02:00
doINQUIRY
2024-08-17 22:26:51 +02:00
jsr initSTATUSDATA
2024-08-15 21:27:35 +02:00
2024-08-17 22:26:51 +02:00
ldx #6-2 ; put the inquiry data
]lp lda scsiINQUIRY,x
sta statusDATA,x
dex
dex
bpl ]lp
2024-08-15 21:27:35 +02:00
2024-08-17 22:26:51 +02:00
lda #dcINQUIRY
jsr statusCALL
bcc doINQUIRY1
rts
2024-08-15 21:27:35 +02:00
doINQUIRY1
*--- Display data
* Byte 0
PushLong #strPQ
_WriteCString
lda statusBUFF
and #%11100000
xba
ldx #3
jsr showBITS
PushLong #strPDT
_WriteCString
lda statusBUFF
and #%00011111
asl
asl
asl
xba
ldx #5
jsr showBITS
* Byte 1
PushLong #strRMB
_WriteCString
lda statusBUFF+1
and #%10000000
xba
ldx #1
jsr showBITS
PushLong #strDTM
_WriteCString
lda statusBUFF+1
and #%01111111
asl
xba
ldx #7
jsr showBITS
* Byte 2
PushLong #strISO
_WriteCString
lda statusBUFF+2
and #%11000000
xba
ldx #2
jsr showBITS
PushLong #strECMA
_WriteCString
lda statusBUFF+2
and #%00111000
asl
asl
xba
ldx #3
jsr showBITS
PushLong #strANSI
_WriteCString
lda statusBUFF+2
and #%00000111
asl
asl
asl
asl
asl
xba
ldx #3
jsr showBITS
* Byte 3
PushLong #strAENC
_WriteCString
lda statusBUFF+3
and #%10000000
xba
ldx #1
jsr showBITS
PushLong #strTRMIOP
_WriteCString
lda statusBUFF+3
and #%01000000
asl
xba
ldx #1
jsr showBITS
PushLong #strRDF
_WriteCString
lda statusBUFF+3
and #%00001111
asl
asl
asl
asl
xba
ldx #4
jsr showBITS
* Bytes 4..6 not used
* Byte 7
PushLong #strRELADR
_WriteCString
lda statusBUFF+7
and #%10000000
xba
ldx #1
jsr showBITS
PushLong #strWBUS32
_WriteCString
lda statusBUFF+7
and #%01000000
asl
xba
ldx #1
jsr showBITS
PushLong #strWBUS16
_WriteCString
lda statusBUFF+7
and #%00100000
asl
asl
xba
ldx #1
jsr showBITS
PushLong #strSYNC
_WriteCString
lda statusBUFF+7
and #%00010000
asl
asl
asl
xba
ldx #1
jsr showBITS
PushLong #strLINKED
_WriteCString
lda statusBUFF+7
and #%00001000
asl
asl
asl
asl
xba
ldx #1
jsr showBITS
PushLong #strCMDQUE
_WriteCString
lda statusBUFF+7
and #%00000010
asl
asl
asl
asl
asl
asl
xba
ldx #1
jsr showBITS
PushLong #strSFTRE
_WriteCString
lda statusBUFF+7
and #%00000001
asl
asl
asl
asl
asl
asl
asl
xba
ldx #1
jsr showBITS
* Bytes 8
PushLong #strVI
_WriteCString
lda #8 ; offset is 8
tax ; length is 8
jsr showTEXT
* Bytes 16
PushLong #strPI
_WriteCString
lda #16
tax
jsr showTEXT
* Bytes 32
PushLong #strPRL
_WriteCString
lda #32
ldx #4
jsr showTEXT
jmp waitKEY
*--- Data
2024-08-18 22:25:57 +02:00
scsiINQUIRY hex 12,00,00,00,F0,00
2024-08-15 21:27:35 +02:00
strPQ asc 0d' Peripheral qualifier: '00
strPDT asc ' - Peripheral device type : '00
strRMB asc 0d' RMB: '00
strDTM asc ' - Device-type modifier: '00
strISO asc 0d' ISO version: '00
strECMA asc ' - ECMA version: '00
strANSI asc ' - ANSI-approved version: '00
strAENC asc 0d' AENC: '00
strTRMIOP asc ' - TrmIOP: '00
strRDF asc ' - Response data format: '00
strRELADR asc 0d' RelAdr: '00
strWBUS32 asc ' - WBus32: '00
strWBUS16 asc ' - WBus16: '00
strSYNC asc ' - Sync: '00
strLINKED asc 0d' Linked: '00
strCMDQUE asc ' - CmdQue: '00
strSFTRE asc ' - SftRe: '00
strVI asc 0d' Vendor identification: '00
strPI asc 0d' Product identification: '00
strPRL asc 0d' Product revision level: '00
2024-08-17 22:26:51 +02:00
*-----------------------
* PREVIEW PAGE
*-----------------------
previewPAGE
2024-08-18 22:25:57 +02:00
jsr openSCANNER
bit setMODE
bit setHALFTONES
jsr setWINDOW
jsr askforMEM
jsr scanSCANNER
jsr readSCANNER
jsr closeSCANNER
jmp saveFILE
2024-08-17 22:26:51 +02:00
*-----------------------
* OPEN THE SCANNER
*-----------------------
openSCANNER
2024-08-18 22:25:57 +02:00
PushLong #startOS
_WriteCString
2024-08-19 22:19:22 +02:00
lda #^openSCANNER
jsr showWORD
lda #openSCANNER
jsr showWORD
PushLong #startOS2
_WriteCString
2024-08-17 22:26:51 +02:00
jsl GSOS
dw $2010
adrl proOPEN
2024-08-18 22:25:57 +02:00
bcc os_ok
PushLong #openOS
_WriteCString
os_ok lda proOPEN+2
sta proREAD+2
sta proCLOSE+2
2024-08-19 22:19:22 +02:00
* lda theDEVICE
* sta proWAIT+2
*
* jsl GSOS
* dw DControl
* adrl proWAIT
* bcc os_ok2
*
* PushLong #waitOS
* _WriteCString
2024-08-18 22:25:57 +02:00
os_ok2 PushLong #endOS
_WriteCString
2024-08-17 22:26:51 +02:00
rts
*---
2024-08-19 22:19:22 +02:00
startOS asc 0d'Start openSCANNER ($'00
startOS2 asc ')'00
2024-08-18 22:25:57 +02:00
openOS asc ' (open not OK) '00
waitOS asc ' (wait not OK) '00
2024-08-19 22:19:22 +02:00
endOS asc '...End'00
2024-08-18 22:25:57 +02:00
2024-08-17 22:26:51 +02:00
proOPEN dw 2 ; 00 pcount
ds 2 ; 02 ref num
adrl devNAME ; 04 path name
proWAIT dw 5 ; 00 pcount
ds 2 ; 02 device ID
dw 4 ; 04 control code (setwaitstatus)
adrl waitDATA ; 06 control list pointer
adrl 2 ; 0A request length
ds 4 ; 0E transfer length
waitDATA dw 0 ; activate wait mode
*-----------------------
* SET THE MODE
*-----------------------
setMODE
2024-08-18 22:25:57 +02:00
PushLong #startSM
2024-08-19 22:19:22 +02:00
_WriteCString
lda #^setMODE
jsr showWORD
lda #setMODE
jsr showWORD
PushLong #startSM2
2024-08-18 22:25:57 +02:00
_WriteCString
2024-08-17 22:26:51 +02:00
lda theDEVICE
sta proSETMODE+2
jsl GSOS
dw DControl
adrl proSETMODE
2024-08-18 22:25:57 +02:00
bcc st_ok
PushLong #controlSM
_WriteCString
st_ok PushLong #endSM
_WriteCString
2024-08-17 22:26:51 +02:00
rts
*---
2024-08-19 22:19:22 +02:00
startSM asc 0d'Start setMODE ($'00
startSM2 asc ')'00
controlSM asc ' (control not OK) '00
endSM asc '...End'00
2024-08-18 22:25:57 +02:00
2024-08-17 22:26:51 +02:00
proSETMODE
dw 5
ds 2
dw $8015
adrl setmodeBUFF
adrl 12
ds 4
setmodeBUFF
dw $0000
2024-08-19 22:19:22 +02:00
hex 15 ; 00
hex 10 ; 01 PF (bit is 1) for SCSI-2
hex 00,00 ; 02 reserved
dfb 12 ; 04 parameter list length
2024-08-17 22:26:51 +02:00
hex 00,00,00,00,00,00,00
2024-08-19 22:19:22 +02:00
adrl setmodeonescannerDATA
2024-08-17 22:26:51 +02:00
2024-08-19 22:19:22 +02:00
*--- for Scanner
2024-08-18 22:25:57 +02:00
2024-08-19 22:19:22 +02:00
setmodeDATA
hex 00,00 ; 00 mode parameter header (8.3.3, table 91)
hex 00,00
hex 01 ; 04 page code - Apple-specific parameter page
hex 08 ; 05 page length - Apple-specific page
dfb 01 ; 06 graymap - 1 = no alteration to data (Apple Scanner)
; 0: dark
; 1: normal
; 2: light
dfb 64 ; 07 auto background adjustment threshold
; Default threshold value is 64 (Apple Scanner)
; bit 0 - 0: do not use custom CCT / 1: use custom CCT (3*3 Color Correction Table)
; bit 1 - 0: do not use custom gamma / 1: use custom gamma
; bit 2 - 0: setting of the ambler LED off / 1: setting on (OneScanner)
dfb 01 ; 08 lamp - 0 = turn off (during scans)
; bit 0 - 0: turn off / 1: turn on
; bit 1 - power of the CCD array on / 1: power off
; bits 2/3 - 00: normal / 01: fast / 10: high speed (OneScanner)
; bit 2 - 0: do not reverse B&W / 1: reverse B&W (Color OneScanner)
; bit 3 - 0: no ICP / 1: ICP on (Color OneScanner)
; bit 4 - 0: no MTF / 1: MTF on (Color OneScanner)
dfb 00 ; 09 color sensor (color onescanner)
; 0: all
; 1: red
; 2: green
; 3: blue
hex 00,00 ; 10 reserved - 2 bytes
*--- For OneScanner
setmodeonescannerDATA
hex 00,00 ; 00 mode parameter header (8.3.3, table 91)
hex 00,00
dfb 1 ; 04 page code - Apple-specific parameter page
dfb 8 ; 05 page length - Apple-specific page
dfb 0 ; 06 graymap (Apple Scanner)
; 0: dark
; 1: normal
; 2: light
dfb %00000000 ; 07 auto background adjustment threshold
; Default threshold value is 64 (Apple Scanner)
; bit 0 - 0: do not use custom CCT / 1: use custom CCT (3*3 Color Correction Table)
; bit 1 - 0: do not use custom gamma / 1: use custom gamma
; bit 2 - 0: setting of the ambler LED off / 1: setting on (OneScanner)
dfb %00000000 ; 08 parameters setting 1
; bit 0 - 0: turn lamp off / 1: turn lamp on
; bit 1 - power of the CCD array on / 1: power off
; bits 2/3 - 00: normal / 01: fast / 10: high speed (OneScanner)
; bit 2 - 0: do not reverse B&W / 1: reverse B&W (Color OneScanner)
; bit 3 - 0: no ICP / 1: ICP on (Color OneScanner)
; bit 4 - 0: no MTF / 1: MTF on (Color OneScanner)
dfb 0 ; 09 color sensor (color onescanner)
; 0: all
; 1: red
; 2: green
; 3: blue
hex 00,00 ; 10 reserved - 2 bytes
hex 00,00 ; for testing purposes
2024-08-18 22:25:57 +02:00
*-----------------------
* SET HALFTONES
*-----------------------
setHALFTONES
PushLong #startSHT
2024-08-19 22:19:22 +02:00
_WriteCString
lda #^setHALFTONES
jsr showWORD
lda #setHALFTONES
jsr showWORD
PushLong #startSHT2
2024-08-18 22:25:57 +02:00
_WriteCString
lda theDEVICE
sta proSETHALFTONES+2
jsl GSOS
dw DControl
adrl proSETHALFTONES
bcc sht_ok
PushLong #controlSHT
_WriteCString
sht_ok PushLong #endSHT
_WriteCString
rts
*---
2024-08-19 22:19:22 +02:00
startSHT asc 0d'Start setHALFTONES ($'00
startSHT2 asc ')'00
2024-08-18 22:25:57 +02:00
controlSHT asc ' (control not OK) '00
2024-08-19 22:19:22 +02:00
endSHT asc '...End'00
2024-08-18 22:25:57 +02:00
proSETHALFTONES
dw 5
ds 2
dw $802A
adrl sethalftonesBUFF
adrl 17
ds 4
sethalftonesBUFF
dw $0000
hex 2A ; operation code
hex 00 ; logical unit / reserved
hex 02 ; data type code (halftone mask)
hex 00 ; reserved
hex 00,02 ; data type qualifier (halftone mask)
dfb 00,00,17 ; transfer length
hex 00 ; control
hex 00,00
adrl sethalftonesDATA
2024-08-19 22:19:22 +02:00
* Halftone patterns
* 0: spiral 4*4
* 1: Bayer 4*4
* 3: spiral 8*8
* 4: Bayer 8*8
2024-08-18 22:25:57 +02:00
sethalftonesDATA
2024-08-19 22:19:22 +02:00
* 4x4 Bayer ordered dither matrix (ID = 1) (from Dev.CD Mar 92 / Dev.Sample.aii)
hex 44
hex 08,88,28,A8
hex C8,48,E8,68
hex 38,B8,18,98
hex F8,78,D8,58
hex 44
dfb 00,08,02,10
dfb 12,04,14,06
dfb 03,11,01,09
dfb 15,07,13,05
* Weird Apple dither matrix
hex 44 ; 4x4 matrix size + pel 0 to 15
hex F0,40,80,C0
hex B0,00,10,50
hex 70,30,20,90
hex E0,A0,60,D0
hex 44
dfb 15,04,08,12
dfb 11,00,01,05
dfb 07,03,02,09
dfb 14,10,06,13
* Exemple de spirale
* 01,02,03,04
* 12,13,14,05
* 11,16,15,06
* 10,09,08,07
* 8*8 Bayer ordered dither matrix (ID = 4)
hex 88
dfb 00,32,08,40,02,34,10,42
dfb 48,16,56,24,50,18,58,26
dfb 12,44,04,36,14,46,06,38
dfb 60,28,52,20,62,30,54,22
dfb 03,35,11,43,01,33,09,41
dfb 51,19,59,27,49,17,57,25
dfb 15,47,07,39,13,45,05,37
dfb 63,31,55,23,61,29,53,21
* 2x2 Bayer ordered dither matrix
hex 22
hex 08,20
hex 30,10
hex 22
dfb 0,2
dfb 3,1
2024-08-17 22:26:51 +02:00
*-----------------------
* SET THE WINDOW
*-----------------------
setWINDOW
2024-08-18 22:25:57 +02:00
PushLong #startSW
2024-08-19 22:19:22 +02:00
_WriteCString
lda #^setWINDOW
jsr showWORD
lda #setWINDOW
jsr showWORD
PushLong #startSW2
2024-08-18 22:25:57 +02:00
_WriteCString
2024-08-17 22:26:51 +02:00
lda theDEVICE
sta proSETWINDOW+2
jsl GSOS
dw DControl
adrl proSETWINDOW
2024-08-18 22:25:57 +02:00
bcc sw_ok
PushLong #controlSW
_WriteCString
2024-08-19 22:19:22 +02:00
sw_ok PushLong #endSW
2024-08-18 22:25:57 +02:00
_WriteCString
rts
2024-08-17 22:26:51 +02:00
*---
2024-08-19 22:19:22 +02:00
startSW asc 0d'Start setWINDOW ($'00
startSW2 asc ')'00
2024-08-18 22:25:57 +02:00
controlSW asc ' (control not OK) '00
endSW asc '...End'00
2024-08-17 22:26:51 +02:00
proSETWINDOW
dw 5
ds 2
dw $8024
2024-08-19 22:19:22 +02:00
* adrl setwindowBUFF ; for Apple Scanner
* adrl 48
adrl coloronescannerBUFF ; for OneScanner and above
adrl 50
ds 4
*--- For Apple Scanner
2024-08-17 22:26:51 +02:00
setwindowBUFF
dw $0000
hex 24
2024-08-18 22:25:57 +02:00
hex 00
hex 00,00,00,00
dfb 00,00,48 ; length is 48 bytes
2024-08-19 22:19:22 +02:00
hex 00 ; control ($80: the Apple bit)
2024-08-18 22:25:57 +02:00
hex 00,00
2024-08-17 22:26:51 +02:00
adrl setwindowDATA
setwindowDATA
2024-08-19 22:19:22 +02:00
hex 00,00,00,00,00,00 ;
dfb 00,40 ; window length (first scanners)
dfb windowID ; 00 window identifier
hex 00 ; 01 reserved
dfb 00,75 ; 02 x-axis resolution
dfb 00,75 ; 04 y-axis resolution
hex 00,00,00,00 ; 06 x-upper left
hex 00,00,00,00 ; 10 y-upper left
hex 00,00,12,C0 ; 14 x-width (27D8 for 10200)
hex 00,00,11,30 ; 18 y-height (3390 for 13200)
hex 80 ; 22 brightness
hex 80 ; 23 threshold
hex 80 ; 24 contrast
dfb 2 ; 25 imageComposition (see table 283)
dfb 8 ; 26 bitsPerPixel (8)
hex 00,00 ; 27 halftone (2)
dfb 3 ; 29 paddingType (byte boundary)
hex 00,00 ; 30 bit ordering
hex 00 ; 32 compression type
hex 00 ; 33 compression argument
hex 00,00,00,00,00,00 ; 34 reserved
hex 00
hex 00
*--- For Apple Color OneScanner
coloronescannerBUFF
dw $0000
hex 24
hex 00
hex 00,00,00,00
dfb 00,00,50 ; length is 50 bytes for OneScanner
hex 00 ; control ($80: the Apple bit)
hex 00,00
adrl coloronescannerDATA
coloronescannerDATA
hex 00,00,00,00,00,00 ;
dfb 00,42 ; window length (coloronescanners)
dfb windowID ; 00 window identifier
hex 00 ; 01 reserved
dfb 00,75 ; 02 x-axis resolution
dfb 00,75 ; 04 y-axis resolution
hex 00,00,00,00 ; 06 x-upper left
hex 00,00,00,00 ; 10 y-upper left
hex 00,00,12,C0 ; 14 4 pouces (27D8 for 10200)
hex 00,00,11,30 ; 18 y-height (3390 for 13200)
dfb 0 ; 22 brightness
dfb 0 ; 23 threshold
dfb 0 ; 24 contrast
dfb 5 ; 25 imageComposition (see table 283)
dfb 24 ; 26 bitsPerPixel (8)
hex 00,00 ; 27 halftone (2)
dfb 3 ; 29 paddingType (byte boundary)
hex 00,00 ; 30 bit ordering
hex 00 ; 32 compression type
hex 00 ; 33 compression argument
hex 00,00,00,00,00,00 ; 34
dfb 255 ; 40 OPT_VOLT_REF_TOP = 255
dfb 1 ; 41 OPT_VOLT_REF_BOTTOM = 1
hex 00,00
2024-08-17 22:26:51 +02:00
*-----------------------
* ASK FOR MEMORY
*-----------------------
askforMEM
2024-08-18 22:25:57 +02:00
PushLong #startMEM
_WriteCString
2024-08-19 22:19:22 +02:00
lda #^askforMEM
jsr showWORD
lda #askforMEM
jsr showWORD
PushLong #startMEM2
_WriteCString
2024-08-18 22:25:57 +02:00
lda haMEM
ora haMEM+2
beq noMEM
PushLong haMEM
_DisposeHandle
noMEM
2024-08-17 22:26:51 +02:00
pha
pha
PushLong #526350 ; 638 bytes-w * 825 bytes-h
PushWord myID
2024-08-18 22:25:57 +02:00
PushWord #%01000000_00001100 ; fixed + aligned + no spec mem
2024-08-17 22:26:51 +02:00
PushLong #0
_NewHandle
phd
tsc
tcd
lda [3]
sta proREAD+4
ldy #2
lda [3],y
sta proREAD+6
pld
pla
2024-08-18 22:25:57 +02:00
sta haMEM
2024-08-17 22:26:51 +02:00
pla
2024-08-18 22:25:57 +02:00
sta haMEM+2
2024-08-17 22:26:51 +02:00
bcs am_err
2024-08-18 22:25:57 +02:00
PushLong #adrMEM
_WriteCString
lda proREAD+6
jsr showWORD
lda proREAD+4
jsr showWORD
PushLong #endMEM
_WriteCString
2024-08-17 22:26:51 +02:00
rts
am_err brk $b6
2024-08-18 22:25:57 +02:00
*---
2024-08-19 22:19:22 +02:00
startMEM asc 0d'Start askforMEM ($'00
startMEM2 asc ')'00
2024-08-18 22:25:57 +02:00
adrMEM asc ' Adr=$'00
endMEM asc '...End'00
haMEM ds 4
2024-08-17 22:26:51 +02:00
*-----------------------
* START THE SCANNING
*-----------------------
scanSCANNER
2024-08-18 22:25:57 +02:00
PushLong #startSS
2024-08-19 22:19:22 +02:00
_WriteCString
lda #^scanSCANNER
jsr showWORD
lda #scanSCANNER
jsr showWORD
PushLong #startSS2
2024-08-18 22:25:57 +02:00
_WriteCString
2024-08-17 22:26:51 +02:00
lda theDEVICE
sta proSCAN+2
jsl GSOS
dw DControl
adrl proSCAN
2024-08-18 22:25:57 +02:00
bcc ss_ok
PushLong #controlSS
_WriteCString
ss_ok PushLong #endSS
_WriteCString
clc
2024-08-17 22:26:51 +02:00
rts
*---
2024-08-19 22:19:22 +02:00
startSS asc 0d'Start scanSCANNER ($'00
startSS2 asc ')'00
2024-08-18 22:25:57 +02:00
controlSS asc ' (control not OK) '00
2024-08-19 22:19:22 +02:00
endSS asc '...End'00
2024-08-18 22:25:57 +02:00
2024-08-17 22:26:51 +02:00
proSCAN dw 5
ds 2
dw $801b
adrl scanBUFF
adrl 1
ds 4
scanBUFF
dw $0000
2024-08-19 22:19:22 +02:00
hex 1b ; 0
hex 00 ; 1
hex 00,00 ; 2
hex 01 ; 4 length is 1
hex 00 ; 5 (data?)
; bit 7 - 1: stop wait mode (Apple Scanner)
; bit 5 - 0: no calibrate / 1: calibrate (OneScanner)
2024-08-17 22:26:51 +02:00
hex 00,00,00,00,00,00
adrl scanDATA
scanDATA
2024-08-19 22:19:22 +02:00
dfb windowID ; the window identifier we want to scan
2024-08-17 22:26:51 +02:00
*-----------------------
* READ THE PAGE
*-----------------------
readSCANNER
2024-08-18 22:25:57 +02:00
PushLong #startRS
2024-08-19 22:19:22 +02:00
_WriteCString
lda #^readSCANNER
jsr showWORD
lda #readSCANNER
jsr showWORD
PushLong #startRS2
2024-08-18 22:25:57 +02:00
_WriteCString
2024-08-17 22:26:51 +02:00
jsl GSOS
dw $2012
adrl proREAD
2024-08-18 22:25:57 +02:00
bcc rs_ok
PushLong #controlRS
_WriteCString
rs_ok PushLong #lengthRS
_WriteCString
lda proREAD+14
jsr showWORD
lda proREAD+12
jsr showWORD
PushLong #endRS
_WriteCString
2024-08-17 22:26:51 +02:00
rts
*---
2024-08-19 22:19:22 +02:00
startRS asc 0d'Start readSCANNER ($'00
startRS2 asc ')'00
2024-08-18 22:25:57 +02:00
controlRS asc ' (read not OK) '00
lengthRS asc ' Len=$'00
endRS asc '...End'00
2024-08-17 22:26:51 +02:00
proREAD dw 4 ; 00 pcount
ds 2 ; 02 ref num
ds 4 ; 04 buffer ptr
adrl 526350 ; 08 requested length
ds 4 ; 0C transfer length
*-----------------------
* CLOSE THE SCANNER
*-----------------------
closeSCANNER
2024-08-18 22:25:57 +02:00
PushLong #startCS
2024-08-19 22:19:22 +02:00
_WriteCString
lda #^closeSCANNER
jsr showWORD
lda #closeSCANNER
jsr showWORD
PushLong #startCS2
2024-08-18 22:25:57 +02:00
_WriteCString
2024-08-17 22:26:51 +02:00
jsl GSOS
dw $2014
adrl proCLOSE
2024-08-18 22:25:57 +02:00
bcc cs_ok
PushLong #closeCS
_WriteCString
cs_ok PushLong #endCS
_WriteCString
2024-08-17 22:26:51 +02:00
rts
*---
2024-08-19 22:19:22 +02:00
startCS asc 0d'Start closeSCANNER ($'00
startCS2 asc ')'00
2024-08-18 22:25:57 +02:00
closeCS asc ' (close not OK) '00
2024-08-19 22:19:22 +02:00
endCS asc '...End'00
2024-08-18 22:25:57 +02:00
2024-08-17 22:26:51 +02:00
proCLOSE dw 1 ; 00 pcount
ds 2 ; 02 ref num
2024-08-18 22:25:57 +02:00
*-----------------------
* SAVE FILE
*-----------------------
saveFILE
PushLong #startFILE
_WriteCString
2024-08-19 22:19:22 +02:00
lda #^saveFILE
jsr showWORD
lda #saveFILE
jsr showWORD
PushLong #startFILE2
_WriteCString
2024-08-18 22:25:57 +02:00
lda proREAD+4
sta fileWRITE+4
lda proREAD+6
sta fileWRITE+6
lda proREAD+12
sta fileWRITE+8
lda proREAD+14
sta fileWRITE+10
jsl GSOS
dw $2002
adrl fileDESTROY
jsl GSOS
dw $2001
adrl fileCREATE
jsl GSOS
dw $2010
adrl fileOPEN
lda fileOPEN+2
* sta fileHEADER+2
sta fileWRITE+2
sta fileCLOSE+2
* jsl GSOS
* dw $2013
* adrl fileHEADER
jsl GSOS
dw $2013
adrl fileWRITE
jsl GSOS
dw $2014
adrl fileCLOSE
PushLong #endFILE
_WriteCString
rts
*--- Data
2024-08-19 22:19:22 +02:00
startFILE asc 0d'Write file ($'00
startFILE2 asc ')'00
endFILE asc '...End'0d00
2024-08-18 22:25:57 +02:00
fileDESTROY
dw 1 ; pcount
adrl pFILE ; pathname
fileCREATE
dw 7 ; 00 pcount
adrl pFILE ; 02 pathname
dw $c3 ; 06 access_code
dw $06 ; 08 file_type
ds 4 ; 0A aux_type
ds 2 ; 0E storage_type
ds 4 ; 10 eof
ds 4 ; 14 resource_eof
fileOPEN
dw 2
ds 2
adrl pFILE
fileHEADER
dw 5
ds 2
adrl headerDATA
adrl 4
ds 4
dw 1
fileWRITE dw 5
ds 2
ds 4
ds 4
ds 4
dw 1
fileCLOSE dw 1
ds 2
headerDATA
dw 500
dw 800
pFILE strl '1/Scan.BIN'
2024-08-19 22:19:22 +02:00
2024-08-15 22:51:34 +02:00
*-----------------------
* STATUS $801A - MODE SENSE (6)
*-----------------------
doMODESENSE6
jsr initSTATUSDATA
ldx #6-2 ; put the inquiry data
]lp lda scsiMODESENSE6,x
sta statusDATA,x
dex
dex
bpl ]lp
lda #dcMODESENSE6
jsr statusCALL
jmp waitKEY
*--- Data
scsiMODESENSE6
2024-08-17 22:26:51 +02:00
hex 1A,00,00,00,00,00
2024-08-15 22:51:34 +02:00
* 00_11_1111
*-----------------------
* BLINK BORDER
*-----------------------
blinkBORDER
sep #$20
ldal $c034
inc
stal $c034
rep #$20
rts
*-----------------------
* STATUS $800E - EXPLORE (NOT DESCRIBED BY APPLE)
*-----------------------
doEXPLORE
jsr getDEVICEID
sta proEXPLORE+2
jsl GSOS
dw DStatus
adrl proEXPLORE
bcc doEXPLORE1
jsr blinkBORDER
doEXPLORE1
*--- Display status
PushLong #strXSTATUS
_WriteCString
lda expBUFF
jsr showBYTE
*--- Display rate
PushLong #strTRATE
_WriteCString
lda expBUFF+1
xba
jsr showWORD
jmp waitKEY
*--- Data
2024-08-17 22:26:51 +02:00
proEXPLORE
dw 5
2024-08-15 22:51:34 +02:00
ds 2
dw $800E
adrl exploreBUFF
adrl 12
ds 4
2024-08-15 21:27:35 +02:00
2024-08-17 22:26:51 +02:00
exploreBUFF
dw 0
2024-08-15 22:51:34 +02:00
hex 0e
hex 00,00,00
dfb 12
hex 00,00,00,00,00,00,00
adrl expBUFF
2024-08-15 21:27:35 +02:00
2024-08-15 22:51:34 +02:00
expBUFF ds 12
2024-08-15 21:27:35 +02:00
2024-08-17 22:26:51 +02:00
strXSTATUS
asc 0d' Status: '00
strTRATE
asc 0d' Rate: '00
2024-08-15 21:27:35 +02:00
2024-08-15 22:51:34 +02:00
*-----------------------
* STATUS $801A - MODE SENSE 6
*-----------------------
2024-08-15 21:27:35 +02:00
2024-08-15 22:51:34 +02:00
doGETMODE jsr getDEVICEID
sta proGETMODE+2
2024-08-15 21:27:35 +02:00
2024-08-15 22:51:34 +02:00
jsl GSOS
dw DStatus
adrl proGETMODE
bcc doGETMODE1
jsr blinkBORDER
doGETMODE1
*--- Display Type
PushLong #strTYPE
_WriteCString
lda gmBUFF+4
and #$ff
cmp #$80
bcs doPAGETYPE
PushLong #strTYPEH
_WriteCString
bra doGETMODE2
doPAGETYPE PushLong #strTYPEP
_WriteCString
*--- Display Page control
doGETMODE2 PushLong #strPAGECTL
_WriteCString
lda gmBUFF+6
jsr showBYTE
*--- Display Hand control
PushLong #strHANDCTL
_WriteCString
lda gmBUFF+7
jsr showBYTE
*--- Display Bytes per line
PushLong #strSCANLEN
_WriteCString
lda gmBUFF+8
xba
jsr showWORD
*--- Display Shutoff timer
PushLong #strTIMER
_WriteCString
lda gmBUFF+10
xba
jsr showWORD
jmp waitKEY
*--- Data
proGETMODE dw 5
ds 2
dw $801A
adrl getmodeBUFF
adrl 12
ds 4
getmodeBUFF dw 0
hex 1A
hex 00,00,00
dfb 12
hex 00,00,00,00,00,00,00
adrl gmBUFF
gmBUFF ds 12
strTYPE asc 0d'Scanner type: '00
strTYPEP asc 'Page'00
strTYPEH asc 'Hand'00
strPAGECTL asc 0d'Page control: '00
strHANDCTL asc 0d'Hand control: '00
strSCANLEN asc 0d'Byter per line: '00
strTIMER asc 0d'Shutoff timer: '00
*-----------------------
* STATUS $8025 - GET WINDOW PARAMETERS
*-----------------------
doGETWINDOWPARAMETERS
2024-08-15 21:27:35 +02:00
jsr initSTATUSDATA
ldx #10-2 ; put the getwindow data
]lp lda scsiGETWIN,x
sta statusDATA,x
dex
dex
bpl ]lp
2024-08-15 22:51:34 +02:00
lda #dcGETWINDOWPARAMETERS
2024-08-15 21:27:35 +02:00
jsr statusCALL
bcc doGETWINDOW1
rts
doGETWINDOW1
2024-08-15 22:51:34 +02:00
PushLong #strGWXRES
_WriteCString
ldy #2
lda [Debut],y
xba
jsr showWORD
2024-08-15 21:27:35 +02:00
*--- Check response length
lda #statusBUFF
clc
adc #8
sta Debut
lda #^statusBUFF
adc #0
sta Debut+2
*--- Display Window identifier
PushLong #strGWID
_WriteCString
ldy #0
lda [Debut],y
xba
jsr showBYTE
*--- Display X-Axis resolution
PushLong #strGWXRES
_WriteCString
ldy #2
lda [Debut],y
xba
jsr showWORD
*--- Display Y-Axis resolution
PushLong #strGWYRES
_WriteCString
ldy #4
lda [Debut],y
xba
jsr showWORD
*--- Display X-Axis upper left
PushLong #strGWXUL
_WriteCString
ldy #6
lda [Debut],y
xba
jsr showWORD
ldy #8
lda [Debut],y
xba
jsr showWORD
*--- Display Y-Axis upper left
PushLong #strGWYUL
_WriteCString
ldy #10
lda [Debut],y
xba
jsr showWORD
ldy #12
lda [Debut],y
xba
jsr showWORD
*--- Display Window width
PushLong #strGWWW
_WriteCString
ldy #14
lda [Debut],y
xba
jsr showWORD
ldy #16
lda [Debut],y
xba
jsr showWORD
*--- Display Window length
PushLong #strGWWL
_WriteCString
ldy #18
lda [Debut],y
xba
jsr showWORD
ldy #20
lda [Debut],y
xba
jsr showWORD
*--- Display Brightness
PushLong #strGWBR
_WriteCString
ldy #22
lda [Debut],y
jsr showBYTE
*--- Display Threshold
PushLong #strGWTH
_WriteCString
ldy #23
lda [Debut],y
jsr showBYTE
*--- Display Contrast
PushLong #strGWCO
_WriteCString
ldy #24
lda [Debut],y
jsr showBYTE
*--- Display Image composition
PushLong #strGWIC
_WriteCString
ldy #25
lda [Debut],y
and #$ff
pha
jsr showBYTE
pla
cmp #6+1
bcc okGWIC
lda #6
okGWIC asl
tax
lda #^strGWIC00
pha
lda ptrGWIC,x
pha
_WriteCString
*--- Display Bits per pixel
PushLong #strGWBPP
_WriteCString
ldy #26
lda [Debut],y
jsr showBYTE
*--- Display Halftone pattern
PushLong #strGWHP
_WriteCString
ldy #27
lda [Debut],y
xba
jsr showWORD
*--- Display Padding type
PushLong #strGWPT
_WriteCString
ldy #29
lda [Debut],y
and #%00000111
cmp #4+1
bcc okGWPT
lda #4
okGWPT asl
tax
lda #^strGWPT00
pha
lda ptrGWPT,x
pha
_WriteCString
*--- Display Bit ordering
PushLong #strGWBO
_WriteCString
ldy #30
lda [Debut],y
xba
jsr showWORD
*--- Display Compression type
PushLong #strGWCT
_WriteCString
ldy #32
lda [Debut],y
and #$ff
cmp #$10+1
bcc okGWCT
lda #$10
okGWCT asl
tax
lda #^strGWCT00
pha
lda ptrGWCT,x
pha
_WriteCString
*--- Display Compression argument
PushLong #strGWCA
_WriteCString
ldy #33
lda [Debut],y
jsr showBYTE
*--- We're done
jmp waitKEY
*--- Data
2024-08-15 22:51:34 +02:00
scsiGETWIN hex 25,00,00,00,F0,00,00,00,00,00
2024-08-15 21:27:35 +02:00
strGWID asc 0d'Window identifier: $'00
strGWXRES asc 0d'X-Axis resolution: $'00
strGWYRES asc 0d'Y-axis resolution: $'00
strGWXUL asc 0d'X-Axis upper left: $'00
strGWYUL asc 0d'Y-Axis upper left: $'00
strGWWW asc 0d'Window width: $'00
strGWWL asc 0d'Window length: $'00
strGWBR asc 0d'Brightness: $'00
strGWTH asc 0d'Threshold: $'00
strGWCO asc 0d'Contrast: $'00
strGWIC asc 0d'Image composition: $'00
strGWBPP asc 0d'Bits per pixel: $'00
strGWHP asc 0d'Halftone pattern: $'00
strGWPT asc 0d'Padding type: $'00
strGWBO asc 0d'Bit ordering: $'00
strGWCT asc 0d'Compression type: $'00
strGWCA asc 0d'Compression argument: $'00
ptrGWIC da strGWIC00
da strGWIC01
da strGWIC02
da strGWIC03
da strGWIC04
da strGWIC05
da strGWIC06
strGWIC00 asc ' (Bi-level black & white)'00
strGWIC01 asc ' (Dithered/halftone black & white)'00
strGWIC02 asc ' (Multi-level black & white (gray scale))'00
strGWIC03 asc ' (Bi-level RGB colour)'00
strGWIC04 asc ' (Dithered/halftone RGB colour)'00
strGWIC05 asc ' (Multi-level RGB colour)'00
strGWIC06 asc ' (Reserved)'00
ptrGWPT da strGWPT00
da strGWPT01
da strGWPT02
da strGWPT03
da strGWPT04
strGWPT00 asc ' (No boundary)'00
strGWPT01 asc ' (Pad with 0s to byte boundary)'00
strGWPT02 asc ' (Pad with 1s to byte boundary)'00
strGWPT03 asc ' (Truncate by byte boundary)'00
strGWPT04 asc ' (Reserved)'00
ptrGWCT da strGWCT00
da strGWCT01
da strGWCT02
da strGWCT03
da strGWCT04
da strGWCT04
da strGWCT04
da strGWCT04
da strGWCT04
da strGWCT04
da strGWCT04
da strGWCT04
da strGWCT04
da strGWCT04
da strGWCT04
da strGWCT04
da strGWCT10
strGWCT00 asc ' (No compression)'00
strGWCT01 asc ' (CCITT group III, 1 dimensional)'00
strGWCT02 asc ' (CCITT group III, 2 dimensional)'00
strGWCT03 asc ' (CCITT group IV, 2 dimensional)'00
strGWCT04 asc ' (Reserved)'00
strGWCT10 asc ' (Optical character recognition)'00
*--- SCSI routines
initSTATUSDATA ; clear SCSI command buffer
2024-08-15 22:51:34 +02:00
ldx #12-2
]lp stz statusDATA,x
2024-08-15 21:27:35 +02:00
dex
dex
2024-08-15 22:51:34 +02:00
bpl ]lp
2024-08-15 21:27:35 +02:00
rts
initCOMMANDDATA ; clear SCSI command buffer
2024-08-15 22:51:34 +02:00
ldx #12-2
]lp stz commandDATA,x
2024-08-15 21:27:35 +02:00
dex
dex
2024-08-15 22:51:34 +02:00
bpl ]lp
2024-08-15 21:27:35 +02:00
rts
*--- DStatus
* Uses the DStatus parm buffer
statusCALL sta proSTATUS+4 ; SCSI driver command
sep #$20 ; SCSI commands are 8-bit
sta statusDATA ; SCSI command
rep #$20
jsl GSOS ; call it
dw $202d
adrl proSTATUS
bra showERR
*--- DControl
controlCALL sta proCONTROL+4 ; SCSI driver command
sep #$20 ; SCSI commands are 8-bit
sta commandDATA ; SCSI command
rep #$20
jsl GSOS ; call it
dw $202e
adrl proCONTROL
*--- Show GS/OS error code
showERR bcc showNOERR
sta errCODE ; save error code
PushLong #strERROR
_WriteCString
lda errCODE
jsr showWORD ; display it
PushWord #$0d
_WriteChar
sec ; force carry
showNOERR rts
2024-08-15 22:51:34 +02:00
*--- Get my Device ID
getDEVICEID lda theDEVICE ; get our ID
rts
2024-08-15 21:27:35 +02:00
*----------------------------
* TEXT ROUTINES
*----------------------------
*---------- Display in string offset
* A: offset in
* X: nb of chars to print
* offset from commandBUFF
2024-08-15 22:51:34 +02:00
showTEXT ldy #^statusBUFF
2024-08-15 21:27:35 +02:00
phy
clc
2024-08-15 22:51:34 +02:00
adc #statusBUFF
2024-08-15 21:27:35 +02:00
pha
PushWord #0
phx
_TextWriteBlock
rts
*---------- Display decimal
* A: word
showDECIMAL and #$ff
pha
lda #' ' ; space by default
sta strDECIMAL
PushLong #strDECIMAL
PushWord #2
PushWord #0
_Int2Dec
PushLong #strDECIMAL
_WriteCString
rts
*--- Data
strDECIMAL asc '00'00
*---------- Display bits
* A: word
* X: nb of bits to display (1-8)
showBITS cpx #16
bcc showBITS0
rts
showBITS0 ldy #0 ; index
]lp pha
asl ; bit in carry
bcs showBITS1
lda #'00' ; output 0
bra showBITS2
showBITS1 lda #'11' ; output 1
showBITS2 sta strBITS,y
pla
asl
iny
dex
bne ]lp
lda #0 ; end C string
sta strBITS,y
PushLong #strBITS ; show the string
_WriteCString
rts
*--- Data
strBITS ds 18 ; 16 bits + 2 zeros
*---------- Display a byte
showBYTE pha ; from a byte to a string
pha
pha ; <= here, really
_HexIt
lda #' ' ; empty string by default
sta strBYTE
pla ; we don't use
pla
sta strBYTE
PushLong #strBYTEP ; show the string
_WriteString
rts
*--- Data
strBYTEP dfb 2 ; for a Pascal string
strBYTE asc ' '
*---------- Display a word
showWORD pha ; from a word to a string
pha
pha ; <= here, really
_HexIt
PullLong strHEX
PushLong #strHEX ; show the string
_WriteCString
rts
*--- Data
strHEX asc '0000'00
*---------- Wait for a key in a range 0-Acc
* A: high key
* X: high ptr to C string
* Y: low ptr to C string
keyINRANGE sta keyHIGH
sty strKEY
stx strKEY+2
]lp PushLong strKEY
_WriteCString
PushWord #0
PushWord #1 ; echo char
_ReadChar
pla
and #$ff
cmp #"0"
bcc ]lp
cmp keyHIGH
bcc keyINRANGE9
beq keyINRANGE9
bra ]lp
keyINRANGE9 sec
sbc #"0"
pha
bra waitKEY8
*--- Data
strKEY ds 4 ; pointer to string
keyHIGH ds 2
*---------- Wait for a key
waitKEY PushWord #$0d
_WriteChar
PushWord #0
PushWord #0 ; don't echo char
_ReadChar
bra waitKEY1 ; go below
*---------- Wait for a key
waitFORKEY PushLong #strINPUT
_WriteCString
PushWord #0 ; wait for key
PushWord #1 ; echo char
_ReadChar
waitKEY1 lda 1,s ; check CR
and #$ff ; of typed
sta 1,s ; in char
cmp #$8d
beq waitKEY9
waitKEY8 PushWord #$0d ; return
_WriteChar
waitKEY9 pla ; restore entered char
rts
*--- Data
strINPUT asc 'Select an entry: '00
*----------------------------
* DATA
*----------------------------
2024-08-15 22:51:34 +02:00
errCODE ds 2 ; GS/OS error code
2024-08-15 21:27:35 +02:00
strERROR asc 0d'<!> GS/OS error code $'00
*---
2024-08-15 22:51:34 +02:00
proQUIT dw 2 ; pcount
ds 4 ; pathname
ds 2 ; flags
proDINFO dw 8 ; Parms for DInfo
ds 2 ; 02 device num
2024-08-17 22:26:51 +02:00
adrl devINFO ; 04 device name
2024-08-15 22:51:34 +02:00
ds 2 ; 08 characteristics
ds 4 ; 0A total blocks
ds 2 ; 0E slot number
ds 2 ; 10 unit number
ds 2 ; 12 version
ds 2 ; 14 device id
2024-08-17 22:26:51 +02:00
devINFO dw $0034 ; buffer size
devINFO1 db $00 ; length from a GS/OS string
devINFO2 db $00 ; to a Pascal string
devINFO3 ds $30 ; data
devNAME ds $32 ; GS/OS string containing the device name
2024-08-15 22:51:34 +02:00
proSTATUS dw 5 ; 00 pcount
ds 2 ; 02 device num
2024-08-17 22:26:51 +02:00
dw $8000 ; 04 status/control code
2024-08-15 22:51:34 +02:00
adrl statusLIST ; 06 status list
2024-08-18 22:25:57 +02:00
adrl 240 ; 0A request count (AVI was 1024/32)
2024-08-15 22:51:34 +02:00
ds 4 ; 0E transfer count
statusLIST ds 2 ; always 0000
2024-08-17 22:26:51 +02:00
statusDATA hex 00 ; 00
hex 00 ; 01
hex 00 ; 02
hex 00 ; 03
2024-08-18 22:25:57 +02:00
dfb 240 ; 04 - (240 AVI was $00)
2024-08-17 22:26:51 +02:00
hex 00 ; 05
hex 00 ; 06
hex 00 ; 07
hex 00 ; 08
hex 00 ; 09
hex 00 ; 10
hex 00 ; 11
2024-08-15 21:27:35 +02:00
adrl statusBUFF
2024-08-17 22:26:51 +02:00
statusBUFF ds 256 ; more than 240
2024-08-15 22:51:34 +02:00
proCONTROL dw 5 ; 00 pcount
ds 2 ; 02 device num
2024-08-17 22:26:51 +02:00
dw $8000 ; 04 status/control code
2024-08-15 22:51:34 +02:00
adrl controlLIST ; 06 status list
2024-08-17 22:26:51 +02:00
adrl 240 ; 0A request count
2024-08-15 22:51:34 +02:00
ds 4 ; 0E transfer count
controlLIST ds 2 ; always 0000
2024-08-17 22:26:51 +02:00
commandDATA hex 00 ; 00
hex 00 ; 01
hex 00 ; 02
hex 00 ; 03
2024-08-18 22:25:57 +02:00
dfb 240 ; 04 - (240 AVI was $00)
2024-08-17 22:26:51 +02:00
hex 00 ; 05
hex 00 ; 06
hex 00 ; 07
hex 00 ; 08
hex 00 ; 09
hex 00 ; 10
hex 00 ; 11
2024-08-15 21:27:35 +02:00
commandPTR adrl commandBUFF
2024-08-17 22:26:51 +02:00
commandBUFF ds 256 ; more than 240
2024-08-15 21:27:35 +02:00
*----------
appID ds 2
myID ds 2
myDP ds 2
ptrBUFFER ds 4
haBUFFER ds 4