mirror of
https://github.com/tjboldt/Serial-Virtual-Drive.git
synced 2024-06-02 00:41:30 +00:00
233 lines
3.8 KiB
NASM
233 lines
3.8 KiB
NASM
* VIRTUAL HARD DRIVE VIA SERIAL PORT TO PC
|
|
* (C)2001 TERENCE J. BOLDT
|
|
* You may copy and modify this code if you give me credit for it.
|
|
|
|
* PRODOS GLOBAL PAGE VALUES
|
|
DEV2S1 EQU $BF14 ;POINTER FOR SLOT 2 DRIVE 1 DRIVER
|
|
DEVCNT EQU $BF31 ;DEVICE COUNT -1
|
|
DEVLST EQU $BF32 ;DEVICE LIST
|
|
|
|
* PRODOS ZERO PAGE VALUES
|
|
COMMAND EQU $42 ;PRODOS COMMAND
|
|
UNIT EQU $43 ;PRODOS SLOT/DRIVE
|
|
BUFLO EQU $44 ;LOW BUFFER
|
|
BUFHI EQU $45 ;HI BUFFER
|
|
BLKLO EQU $46 ;LOW BLOCK
|
|
BLKHI EQU $47 ;HI BLOCK
|
|
|
|
* PRODOS ERROR CODES
|
|
IOERR EQU $27
|
|
NODEV EQU $28
|
|
WPERR EQU $2B
|
|
|
|
* GS SPECIFIC SERIAL PORT
|
|
SSCINIT EQU $C245
|
|
SSCREAD EQU $C246
|
|
SSCWRITE EQU $C247
|
|
SSCSTAT EQU $C248
|
|
|
|
* ROM LOCATIONS
|
|
RESETC8 EQU $CFFF
|
|
|
|
ORG $1800
|
|
|
|
|
|
* INITIALISE DRIVER
|
|
INIT EQU *
|
|
* ADD POINTER TO DRIVER
|
|
LDA #<DRIVER
|
|
STA DEV2S1
|
|
LDA #>DRIVER
|
|
STA DEV2S1+1
|
|
* ADD TO DEVICE LIST
|
|
INC DEVCNT
|
|
LDY DEVCNT
|
|
LDA #$20 ;SLOT 2 DRIVE 1
|
|
STA DEVLST,Y
|
|
|
|
RTS
|
|
|
|
* DRIVER CODE
|
|
DRIVER EQU *
|
|
* CHECK THAT WE HAVE THE RIGHT DRIVE
|
|
LDA UNIT
|
|
CMP #$20 ;SLOT 2 DRIVE 1
|
|
BEQ DOCMD ;YEP, DO COMMAND
|
|
SEC ;NOPE, FAIL
|
|
LDA #NODEV
|
|
RTS
|
|
|
|
* CHECK WHICH COMMAND IS REQUESTED
|
|
DOCMD EQU *
|
|
LDA COMMAND
|
|
BNE NOTSTAT ;0 IS STATUS
|
|
JMP GETSTAT
|
|
NOTSTAT CMP #$01
|
|
BNE NOREAD ;1 IS READ
|
|
JMP READBLK
|
|
NOREAD CMP #$02
|
|
BNE NOWRITE ;2 IS WRITE
|
|
JMP WRITEBLK
|
|
NOWRITE LDA #$00 ; CLEAR ERROR
|
|
CLC
|
|
RTS
|
|
|
|
|
|
* STATUS
|
|
GETSTAT EQU *
|
|
LDA #$00
|
|
LDX #$FF
|
|
LDY #$FF
|
|
CLC
|
|
RTS
|
|
|
|
* READ
|
|
READBLK EQU *
|
|
* SEND COMMAND TO PC
|
|
LDA RESETC8 ; RESET C8 PAGE
|
|
LDX #$C2 ; SET X AND Y FOR SSC CALLS
|
|
LDY #$20
|
|
JSR SSCINIT ; INIT SERIAL CARD
|
|
LDA #$01 ; SEND ^A Z TO SERIAL DRIVER TO ZAP CONTROL CHARS
|
|
LDX #$C2 ; SET X AND Y FOR SSC CALLS
|
|
LDY #$20
|
|
JSR SSCWRITE
|
|
LDA #$5A
|
|
LDX #$C2 ; SET X AND Y FOR SSC CALLS
|
|
LDY #$20
|
|
JSR SSCWRITE
|
|
LDA #$01 ; READ COMMAND
|
|
LDX #$C2 ; SET X AND Y FOR SSC CALLS
|
|
LDY #$20
|
|
JSR SSCWRITE
|
|
LDA BLKLO
|
|
LDX #$C2 ; SET X AND Y FOR SSC CALLS
|
|
LDY #$20
|
|
JSR SSCWRITE
|
|
LDA BLKHI
|
|
LDX #$C2 ; SET X AND Y FOR SSC CALLS
|
|
LDY #$20
|
|
JSR SSCWRITE
|
|
LDA #$00 ; CHECKSUM
|
|
LDX #$C2 ; SET X AND Y FOR SSC CALLS
|
|
LDY #$20
|
|
JSR SSCWRITE
|
|
* READ ECHO'D COMMAND AND VERIFY
|
|
LDX #$C2 ; SET X AND Y FOR SSC CALLS
|
|
LDY #$20
|
|
JSR SSCREAD
|
|
LDX #$C2 ; SET X AND Y FOR SSC CALLS
|
|
LDY #$20
|
|
JSR SSCREAD
|
|
LDX #$C2 ; SET X AND Y FOR SSC CALLS
|
|
LDY #$20
|
|
JSR SSCREAD
|
|
LDX #$C2 ; SET X AND Y FOR SSC CALLS
|
|
LDY #$20
|
|
JSR SSCREAD
|
|
* READ BLOCK AND VERIFY
|
|
LDX #$00
|
|
RDBKLOOP LDY #$00
|
|
RDLOOP EQU *
|
|
PHX
|
|
PHY
|
|
LDX #$C2 ; SET X AND Y FOR SSC CALLS
|
|
LDY #$20
|
|
JSR SSCREAD
|
|
PLY
|
|
PLX
|
|
STA (BUFLO),Y
|
|
INY
|
|
BNE RDLOOP
|
|
|
|
INC BUFHI
|
|
INX
|
|
CPX #$02
|
|
BNE RDBKLOOP
|
|
|
|
DEC BUFHI
|
|
|
|
LDX #$C2 ; SET X AND Y FOR SSC CALLS
|
|
LDY #$20
|
|
JSR SSCREAD
|
|
|
|
LDA #$00
|
|
CLC
|
|
RTS
|
|
|
|
* WRITE
|
|
WRITEBLK EQU *
|
|
* SEND COMMAND TO PC
|
|
LDA RESETC8
|
|
LDX #$C2 ; SET X AND Y FOR SSC CALLS
|
|
LDY #$20
|
|
JSR SSCINIT ; INIT SERIAL CARD
|
|
LDA #$01 ; SEND ^A Z TO SERIAL DRIVER TO ZAP CONTROL CHARS
|
|
LDX #$C2 ; SET X AND Y FOR SSC CALLS
|
|
LDY #$20
|
|
JSR SSCWRITE
|
|
LDA #$5A
|
|
LDX #$C2 ; SET X AND Y FOR SSC CALLS
|
|
LDY #$20
|
|
JSR SSCWRITE
|
|
LDA #$02 ; WRITE COMMAND
|
|
LDX #$C2 ; SET X AND Y FOR SSC CALLS
|
|
LDY #$20
|
|
JSR SSCWRITE
|
|
LDA BLKLO
|
|
LDX #$C2 ; SET X AND Y FOR SSC CALLS
|
|
LDY #$20
|
|
JSR SSCWRITE
|
|
LDA BLKHI
|
|
LDX #$C2 ; SET X AND Y FOR SSC CALLS
|
|
LDY #$20
|
|
JSR SSCWRITE
|
|
LDA #$00 ; CHECKSUM
|
|
LDX #$C2 ; SET X AND Y FOR SSC CALLS
|
|
LDY #$20
|
|
JSR SSCWRITE
|
|
|
|
* WRITE BLOCK AND CHECKSUM
|
|
LDX #$00
|
|
WRBKLOOP LDY #$00
|
|
WRLOOP EQU *
|
|
PHX
|
|
PHY
|
|
LDA (BUFLO),Y
|
|
LDX #$C2 ; SET X AND Y FOR SSC CALLS
|
|
LDY #$20
|
|
JSR SSCWRITE
|
|
PLY
|
|
PLX
|
|
INY
|
|
BNE WRLOOP
|
|
|
|
INC BUFHI
|
|
INX
|
|
CPX #$02
|
|
BNE WRBKLOOP
|
|
|
|
DEC BUFHI
|
|
|
|
LDA #$00
|
|
LDX #$C2 ; SET X AND Y FOR SSC CALLS
|
|
LDY #$20
|
|
JSR SSCWRITE
|
|
|
|
* READ ECHO'D COMMAND AND VERIFY
|
|
LDX #$C2 ; SET X AND Y FOR SSC CALLS
|
|
LDY #$20
|
|
JSR SSCREAD
|
|
LDX #$C2 ; SET X AND Y FOR SSC CALLS
|
|
LDY #$20
|
|
JSR SSCREAD
|
|
LDX #$C2 ; SET X AND Y FOR SSC CALLS
|
|
LDY #$20
|
|
JSR SSCREAD
|
|
LDX #$C2 ; SET X AND Y FOR SSC CALLS
|
|
LDY #$20
|
|
JSR SSCREAD
|
|
|
|
LDA #$00
|
|
CLC
|
|
RTS |