antoine-source/mdt/gsosdriver.s

3653 lines
49 KiB
ArmAsm

*
* Microdrive Turbo GS/OS driver
*
* (c) 1996-2006, Joachim Lange
* (s) 2019, Brutal Deluxe Software
*
mx %00
rel
typ DRV ; auxtype MUST be $0110
dsk MDT.l
lst off
*----------------------------
* Device driver direct page
deviceNum = $00 ; 00
callNum = deviceNum+2 ; 02
bufferPtr = callNum+2 ; 04
requestCount = bufferPtr+4 ; 06
transferCount = requestCount+4 ; 0A
blockNum = transferCount+4 ; 0E
blockSize = blockNum+4 ; 12
fstID = blockSize+2 ; 16requestCount+2
statusCode = blockSize+2 ; 16
controlCode = blockSize+2 ; 16
volumeID = statusCode+2 ; 18
cachePriority = volumeID+2 ; 1A
cachePointer = cachePriority+2 ; 1C
dibPointer = cachePointer+4 ; 1E
* Device Information Block = DIB
linkPtr = $00 ; 00
entryPtr = linkPtr+4 ; 04
characteristics = entryPointer+4 ; 08
blockCount = characteristics+2 ; 0A
length = blockCount+4 ; 0E
devName = length+1 ; 0F
slotNum = devName+31 ; 2E
unitNum = slotNum+2 ; 30
version = unitNum+2 ; 32
deviceID = version+2 ; 34
headLink = deviceID+2 ; 36
forwardLink = headLink+2 ; 38
extendedDIBPtr = forwardLink+2 ; 3A
DIBDevNum = extendedDIBPtr+4 ; 3E
SPKR EQU $C030
DMAREG EQU $C037
RDBANK2 EQU $C080
RDROM2 EQU $C082
LCBANK2 EQU $C083
RDBANK1 EQU $C088
RDROM1 EQU $C08A
LCBANK1 EQU $C08B
CLRROM EQU $CFFF
CACHE_FIND_BLK EQU $01FC04
CACHE_ADD_BLK EQU $01FC08
*----------------------------
L0000 DW L027A-L0000 ; offset to 1st DIB
DW $0010 ; number of devices
DA L0090-L0000 ; offset to configuration list
DA L0094-L0000 ; offset to configuration list
DA L0098-L0000 ; offset to configuration list
DA L009C-L0000 ; offset to configuration list
DA L00A0-L0000 ; offset to configuration list
DA L00A4-L0000 ; offset to configuration list
DA L00A8-L0000 ; offset to configuration list
DA L00AC-L0000 ; offset to configuration list
DA L00B0-L0000 ; offset to configuration list
DA L00B4-L0000 ; offset to configuration list
DA L00B8-L0000 ; offset to configuration list
DA L00BC-L0000 ; offset to configuration list
DA L00C0-L0000 ; offset to configuration list
DA L00C4-L0000 ; offset to configuration list
DA L00C8-L0000 ; offset to configuration list
DA L00CC-L0000 ; offset to configuration list
*--- Copyright check (see Driver_Startup)
L0024 ASC " MicroDrv/Turbo GS/OS - HD Driver v1.00 "
L0061 ASC "Copyright 1996 by "
L0073 ASC "Joachim "
L007B ASC "Lange "
* Table for SetConfigParameters
L0090 ADRL $00000000
L0094 ADRL $00000000
L0098 ADRL $00000000
L009C ADRL $00000000
L00A0 ADRL $00000000
L00A4 ADRL $00000000
L00A8 ADRL $00000000
L00AC ADRL $00000000
L00B0 ADRL $00000000
L00B4 ADRL $00000000
L00B8 ADRL $00000000
L00BC ADRL $00000000
L00C0 ADRL $00000000
L00C4 ADRL $00000000
L00C8 ADRL $00000000
L00CC ADRL $00000000
* Driver_Status / GetFormatOptions
L00D0 DA $0000
DA L00F2 ; device 1
DA L010A
DA L0122
DA L013A
DA L0152
DA L016A
DA L0182
DA L019A
DA L01B2
DA L01CA
DA L01E2
DA L01FA
DA L0212
DA L022A
DA L0242 ; device F
DA L025A ; device 10
* See GS/OS Driver Reference, page 236+
L00F2 DW $0001 ; numOptions
DW $0001 ; numDisplayed
DW $0001 ; recommendedOption
DW $0001 ; currentOption
DW $0001 ; formatOptionNum
DW $0000 ; linkRefNum
DW $0000 ; flags (mediaSize in bytes, Universal Format)
ADRL $00000000 ; blockCount
DW $0200 ; blockSize
DW $0001 ; interleaveFactor (1:1)
DW $0000 ; mediaSize ($0000 blocks)
L010A HEX 01000100010001000100000000000000
HEX 0000000201000000
L0122 HEX 01000100010001000100000000000000
HEX 0000000201000000
L013A HEX 01000100010001000100000000000000
HEX 0000000201000000
L0152 HEX 01000100010001000100000000000000
HEX 0000000201000000
L016A HEX 01000100010001000100000000000000
HEX 0000000201000000
L0182 HEX 01000100010001000100000000000000
HEX 0000000201000000
L019A HEX 01000100010001000100000000000000
HEX 0000000201000000
L01B2 HEX 01000100010001000100000000000000
HEX 0000000201000000
L01CA HEX 01000100010001000100000000000000
HEX 0000000201000000
L01E2 HEX 01000100010001000100000000000000
HEX 0000000201000000
L01FA HEX 01000100010001000100000000000000
HEX 0000000201000000
L0212 HEX 01000100010001000100000000000000
HEX 0000000201000000
L022A HEX 01000100010001000100000000000000
HEX 0000000201000000
L0242 HEX 01000100010001000100000000000000
HEX 0000000201000000
L025A HEX 01000100010001000100000000000000
HEX 0000000201000000
DB $FF
DB $FF
DB $FF
DB $FF
DB $FF
DB $FF
DB $FF
DB $FF
*----------------------------
* DIBs
*----------------------------
L027A ADRL L02BE ; pointer to the next DIB
ADRL entryPoint ; driver entry point
DW $23E8 ; characteristics
ADRL $00000000 ; block count
STR 'MICRODRIVE.TURBO.1' ; device name
ASC ' '
DW $0000 ; slot number
DW $0001 ; unit number
DW $1000 ; version
DW $0013 ; device ID
DW $0000 ; first linked device
DW $0000 ; next linked device
ADRL $00000000 ; extended DIB ptr
DW $0000 ; device number
DW $0001
DW $0000
L02BE ADRL L0302 ; pointer to the next DIB
ADRL entryPoint ; driver entry point
DW $23E8 ; characteristics
ADRL $00000000 ; block count
STR 'MICRODRIVE.TURBO.2' ; device name
ASC ' '
DW $0000 ; slot number
DW $0002 ; unit number
DW $1000 ; version
DW $0013 ; device ID
DW $0000 ; first linked device
DW $0000 ; next linked device
ADRL $00000000 ; extended DIB ptr
DW $0000 ; device number
DW $0002
DW $0000
L0302 ADRL L0346 ; pointer to the next DIB
ADRL entryPoint ; driver entry point
DW $23E8 ; characteristics
ADRL $00000000 ; block count
STR 'MICRODRIVE.TURBO.3' ; device name
ASC ' '
DW $0000 ; slot number
DW $0002 ; unit number
DW $1000 ; version
DW $0013 ; device ID
DW $0000 ; first linked device
DW $0000 ; next linked device
ADRL $00000000 ; extended DIB ptr
DW $0000 ; device number
DW $0002
DW $0000
L0346 ADRL L038A ; pointer to the next DIB
ADRL entryPoint ; driver entry point
DW $23E8 ; characteristics
ADRL $00000000 ; block count
STR 'MICRODRIVE.TURBO.4' ; device name
ASC ' '
DW $0000 ; slot number
DW $0002 ; unit number
DW $1000 ; version
DW $0013 ; device ID
DW $0000 ; first linked device
DW $0000 ; next linked device
ADRL $00000000 ; extended DIB ptr
DW $0000 ; device number
DW $0002
DW $0000
L038A ADRL L03CE ; pointer to the next DIB
ADRL entryPoint ; driver entry point
DW $23E8 ; characteristics
ADRL $00000000 ; block count
STR 'MICRODRIVE.TURBO.5' ; device name
ASC ' '
DW $0000 ; slot number
DW $0002 ; unit number
DW $1000 ; version
DW $0013 ; device ID
DW $0000 ; first linked device
DW $0000 ; next linked device
ADRL $00000000 ; extended DIB ptr
DW $0000 ; device number
DW $0002
DW $0000
L03CE ADRL L0412 ; pointer to the next DIB
ADRL entryPoint ; driver entry point
DW $23E8 ; characteristics
ADRL $00000000 ; block count
STR 'MICRODRIVE.TURBO.6' ; device name
ASC ' '
DW $0000 ; slot number
DW $0002 ; unit number
DW $1000 ; version
DW $0013 ; device ID
DW $0000 ; first linked device
DW $0000 ; next linked device
ADRL $00000000 ; extended DIB ptr
DW $0000 ; device number
DW $0002
DW $0000
L0412 ADRL L0456 ; pointer to the next DIB
ADRL entryPoint ; driver entry point
DW $23E8 ; characteristics
ADRL $00000000 ; block count
STR 'MICRODRIVE.TURBO.7' ; device name
ASC ' '
DW $0000 ; slot number
DW $0002 ; unit number
DW $1000 ; version
DW $0013 ; device ID
DW $0000 ; first linked device
DW $0000 ; next linked device
ADRL $00000000 ; extended DIB ptr
DW $0000 ; device number
DW $0002
DW $0000
L0456 ADRL L049A ; pointer to the next DIB
ADRL entryPoint ; driver entry point
DW $23E8 ; characteristics
ADRL $00000000 ; block count
STR 'MICRODRIVE.TURBO.8' ; device name
ASC ' '
DW $0000 ; slot number
DW $0002 ; unit number
DW $1000 ; version
DW $0013 ; device ID
DW $0000 ; first linked device
DW $0000 ; next linked device
ADRL $00000000 ; extended DIB ptr
DW $0000 ; device number
DW $0002
DW $0000
L049A ADRL L04DE ; pointer to the next DIB
ADRL entryPoint ; driver entry point
DW $23E8 ; characteristics
ADRL $00000000 ; block count
STR 'MICRODRIVE.TURBO.9' ; device name
ASC ' '
DW $0000 ; slot number
DW $0002 ; unit number
DW $1000 ; version
DW $0013 ; device ID
DW $0000 ; first linked device
DW $0000 ; next linked device
ADRL $00000000 ; extended DIB ptr
DW $0000 ; device number
DW $0002
DW $0000
L04DE ADRL L0522 ; pointer to the next DIB
ADRL entryPoint ; driver entry point
DW $23E8 ; characteristics
ADRL $00000000 ; block count
STR 'MICRODRIVE.TURBO.A' ; device name
ASC ' '
DW $0000 ; slot number
DW $0002 ; unit number
DW $1000 ; version
DW $0013 ; device ID
DW $0000 ; first linked device
DW $0000 ; next linked device
ADRL $00000000 ; extended DIB ptr
DW $0000 ; device number
DW $0002
DW $0000
L0522 ADRL L0566 ; pointer to the next DIB
ADRL entryPoint ; driver entry point
DW $23E8 ; characteristics
ADRL $00000000 ; block count
STR 'MICRODRIVE.TURBO.B' ; device name
ASC ' '
DW $0000 ; slot number
DW $0002 ; unit number
DW $1000 ; version
DW $0013 ; device ID
DW $0000 ; first linked device
DW $0000 ; next linked device
ADRL $00000000 ; extended DIB ptr
DW $0000 ; device number
DW $0002
DW $0000
L0566 ADRL L05AA ; pointer to the next DIB
ADRL entryPoint ; driver entry point
DW $23E8 ; characteristics
ADRL $00000000 ; block count
STR 'MICRODRIVE.TURBO.C' ; device name
ASC ' '
DW $0000 ; slot number
DW $0002 ; unit number
DW $1000 ; version
DW $0013 ; device ID
DW $0000 ; first linked device
DW $0000 ; next linked device
ADRL $00000000 ; extended DIB ptr
DW $0000 ; device number
DW $0002
DW $0000
L05AA ADRL L05EE ; pointer to the next DIB
ADRL entryPoint ; driver entry point
DW $23E8 ; characteristics
ADRL $00000000 ; block count
STR 'MICRODRIVE.TURBO.D' ; device name
ASC ' '
DW $0000 ; slot number
DW $0002 ; unit number
DW $1000 ; version
DW $0013 ; device ID
DW $0000 ; first linked device
DW $0000 ; next linked device
ADRL $00000000 ; extended DIB ptr
DW $0000 ; device number
DW $0002
DW $0000
L05EE ADRL L0632 ; pointer to the next DIB
ADRL entryPoint ; driver entry point
DW $23E8 ; characteristics
ADRL $00000000 ; block count
STR 'MICRODRIVE.TURBO.E' ; device name
ASC ' '
DW $0000 ; slot number
DW $0002 ; unit number
DW $1000 ; version
DW $0013 ; device ID
DW $0000 ; first linked device
DW $0000 ; next linked device
ADRL $00000000 ; extended DIB ptr
DW $0000 ; device number
DW $0002
DW $0000
L0632 ADRL L0676 ; pointer to the next DIB
ADRL entryPoint ; driver entry point
DW $23E8 ; characteristics
ADRL $00000000 ; block count
STR 'MICRODRIVE.TURBO.F' ; device name
ASC ' '
DW $0000 ; slot number
DW $0002 ; unit number
DW $1000 ; version
DW $0013 ; device ID
DW $0000 ; first linked device
DW $0000 ; next linked device
ADRL $00000000 ; extended DIB ptr
DW $0000 ; device number
DW $0002
DW $0000
* The pointer to the next DIB should be 0
L0676 ADRL tblDRIVER ; pointer to the next DIB
ADRL entryPoint ; driver entry point
DW $23E8 ; characteristics
ADRL $00000000 ; block count
STR 'MICRODRIVE.TURBO.G' ; device name
ASC ' '
DW $0000 ; slot number
DW $0002 ; unit number
DW $1000 ; version
DW $0013 ; device ID
DW $0000 ; first linked device
DW $0000 ; next linked device
ADRL $00000000 ; extended DIB ptr
DW $0000 ; device number
DW $0002
DW $0000
*----------------------------
* GS/OS driver entry points
*----------------------------
tblDRIVER
DA Driver_Startup
DA Driver_Open
DA Driver_Read
DA Driver_Write
DA Driver_Close
DA Driver_Status
DA Driver_Control
DA Driver_Flush
DA Driver_Shutdown
* Driver_Status entry points
tblSTATUS
DA GetDeviceStatus-1
DA GetConfigParameters-1
DA GetWaitStatus-1
DA GetFormatOptions-1
DA GetPartitionMap-1
tblCONTROL
DA ResetDevice-1
DA FormatDevice-1
DA EjectMedium-1
DA SetConfigParameters-1
DA SetWaitStatus-1
DA SetFormatOptions-1
DA AssignPartitionOwner-1
DA ArmSignal-1
DA DisarmSignal-1
DA SetPartitionMap-1
DB $A9 ; LDA
DB $00 ; #$00
DB $38 ; SEC
DB $60 ; RTS
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
*--- Table for GetDeviceStatus
L072E DA $0000
DA L0750 ; device 1
DA L0756
DA L075C
DA L0762
DA L0768
DA L076E
DA L0774
DA L077A
DA L0780
DA L0786
DA L078C
DA L0792
DA L0798
DA L079E
DA L07A4 ; device F
DA L07AA ; device 10
* $4010 means: linked device + diskInDrive
L0750 HEX 104000000000 ; statusWord (word) + numBlocks (long)
L0756 HEX 104000000000
L075C HEX 104000000000
L0762 HEX 104000000000
L0768 HEX 104000000000
L076E HEX 104000000000
L0774 HEX 104000000000
L077A HEX 104000000000
L0780 HEX 104000000000
L0786 HEX 104000000000
L078C HEX 104000000000
L0792 HEX 104000000000
L0798 HEX 104000000000
L079E HEX 104000000000
L07A4 HEX 104000000000
L07AA HEX 104000000000
* Driver_Control / SetConfigParameters pointers
L07B0 DA L0090
DA L0094
DA L0098
DA L009C
DA L00A0
DA L00A4
DA L00A8
DA L00AC
DA L00B0
DA L00B4
DA L00B8
DA L00BC
DA L00C0
DA L00C4
DA L00C8
DA L00CC
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
* Driver_Control / SetFormatOptions table
L07F0 DW $0001 ; format option table is always 1
DW $0001
DW $0001
DW $0001
DW $0001
DW $0001
DW $0001
DW $0001
DW $0001
DW $0001
DW $0001
DW $0001
DW $0001
DW $0001
DW $0001
DW $0001
DW $000F
DW $0001
DW $0000
theUNIT DW $0000
DB $00 ; useless?
DB $00
DB $30
DB $31
DB $32
DB $37
DB $FF
DB $FF
DB $A0
DB $A0
DB $A0
DB $A0
DB $A0
DB $A0
DB $A0
DB $A0
DB $A0
DB $A0
DB $A0
DB $AD ; =
DB $AD ; =
DB $AD ; =
DB $AD ; =
DB $BE ; >
*----------------------------
* Driver
*----------------------------
MX %00
entryPoint
PHB ; Dispatch
PHK
PLB
CMP #$0009
BCC L083B
BRL L0849
L083B ASL
TAX
JSR (tblDRIVER,X)
TAY
PLB
BCS L0847
LDY #$0000
L0847 TYA
RTL
L0849 PLB
LDA #$0001
SEC
RTL
L084F JMP L0932
*----------------------------
Driver_Startup
* Check unmodified GS/OS driver
STZ L1478
LDA L0073 ; Jo (achim) = EFCA 1110_1111_1100_1010
EOR #$D3C8 ; D3C8 1101_0011_1100_1000
CMP #$3C02 ; 3C02 0011_1100_0000_0010
BNE L084F
LDA L007B ; La (nge) = E1CC 1110_0001_1100_1100
EOR #$D3C8 ; D3C8 1101_0011_1100_1000
CMP #$3204 ; 3204 0011_0010_0000_0100
BNE L084F
LDA L0061 ; Co (pyright) = EFC3 1110_1111_1100_0011
EOR #$D3C8 ; D3C8 1101_0011_1100_1000
CMP #$3C0B ; 3C0B 0011_1100_0000_1011
BNE L084F
* Find card
LDA #$C7F2
STA theCARD
L087C LDX theCARD
LDAL $000000,X
CMP #$C4C9 ; ID
BNE L08B4
LDAL $000001,X
CMP #$D5C4 ; DU
BNE L08B4
LDAL $000005,X
CMP #$D4CD ; MT
BNE L08B4
LDAL $000007,X
CMP #$CCCA ; JL
BNE L08B4
LDAL $000003,X
AND #$00FF
CMP #$0010
BEQ L08C6
CMP #$0011
BEQ L08C6
L08B4 LDA theCARD
SEC
SBC #$0100
STA theCARD
CMP #$C100
BCS L087C
JMP L0932
L08C6 LDA theCARD ; We have the card in slot X
AND #$0F00
LSR
LSR
LSR
LSR
STA theSLOT16
LSR
LSR
LSR
LSR
STA theSLOT
JSR initPointers ; patch all addresses
LDA theUNIT ; is driver busy?
BNE L0920
SEI ; no, copy ROM
SEP #$30
LDA #$00
L08E7 STAL RDROM2
LDAL CLRROM
REP #$30
LDX theCARD ; make the card active
LDAL $000000,X
PHK
PLB
LDX #$00FE ; Copy the $C800 page
L08FD LDAL $00C800,X
STA L1340,X
DEX
DEX
BPL L08FD
LDAL $00C980 ; seems to be 0000 when ROM is on (but code must be moved one page down)
STA L1474
CLI
LDA L1340
CMP #$CCCA ; JL
BNE L0932
LDA L1474
CMP #$48CA ;
BNE L0932
L0920 SEP #$30
INC theUNIT ; which unit?
LDA L135A
CMP theUNIT
BCS L093D ; we can continue
REP #$30
DEC theUNIT ; I would have voted for the busy flag
L0932 REP #$30
LDAL CLRROM ; bye bye card
LDA #$0027 ; I/O error
SEC
RTS
L093D REP #$30
LDA theUNIT ; my unit
ASL
ASL
TAX
LDA L13BC,X ; get number of blocks
LDY #$000A ; blockCount
STA [dibPointer],Y
LDY #$000C ; blockCount+2
LDA L13BE,X
AND #$00FF
STA [dibPointer],Y
LDY #$002E ; the slot
LDA theSLOT
ORA #$0008 ; external slot set on bit 3
STA [dibPointer],Y
LDY #$0030 ; unitNum (thought it was busy flag)
LDA theUNIT
STA [dibPointer],Y
LDAL CLRROM ; bye bye card
LDA #$0000 ; return OK
CLC
RTS
*----------------------------
Driver_Open
LDA #$0000
CLC
RTS
*----------------------------
Driver_Read
LDY #$0030 ; unitNum
LDA [dibPointer],Y
ASL
ASL
STA L146C
STZ L1468
LDA requestCount ; requestCount
STA theRequest
LDA requestCount+2
STA theRequest+2
L0990 LDAL $00C087
L0994 LDA L1468
BNE L09E2
BIT fstID ; fstID
BMI L09BF ; bit 15 = 1 means force read, do not use cache
CLC
JSL CACHE_FIND_BLK
BCC L09BC
LDA cachePriority
BEQ L09BF ; do not read from the cache
JSL CACHE_ADD_BLK ; add in the cache
BCS L09BF
JSR L0EB7 ; calc all
JMP L0A9B
L09B4 BCS L09B9
JMP L0A2F
L09B9 JMP L0A7F
L09BC JMP L0C33
L09BF LDA L1468 ; already entered?
BNE L09E2
JSR L0EB7 ; nope, calc all
LDA theRequest+1
AND #$01FF
LSR
SEP #$30
L09D0 STAL RDROM1
STA L1466
LDA #$20
L09D9 STAL $00C08F
STA L1468
REP #$30
L09E2 LDA bufferPtr ; BUG? I would have put requestCount instead
CMP #$FE01
BCC L09EC
L09E9 JMP readFROMCARD ; read 512 bytes from card
L09EC STAL $00C084
SEP #$30 ; check slow RAM request
LDA bufferPtr+2
CMP #$E0
BEQ L09E9
CMP #$E1
BEQ L09E9
CMP #$90 ; or memory bank over 5MB
BCS L0A05
CMP L1366
BCS L09E9
L0A05 STAL DMAREG
L0A09 LDAL RDBANK1
BPL L0A09
L0A0F LDAL $00C08F
BMI L0A0F
AND #$F9
CMP #$58
BEQ L0A21
LSR
BCC L0A0F
JMP L0A7F
L0A21 STAL LCBANK2
L0A25 DEC L1466
BNE L0A2D
STZ L1468
L0A2D REP #$30 ; how many bytes left to read?
L0A2F LDA theRequest
SEC
SBC blockSize
STA theRequest
BCS L0A3D
DEC theRequest+2
L0A3D LDA theRequest
BNE L0A54
LDA theRequest+2
BNE L0A54
LDA requestCount
STA transferCount
LDA requestCount+2
STA transferCount+2
LDA #$0000 ; we're done!
CLC
RTS
* We still have data to read from disk
L0A54 CLC ; next pointer in RAM
LDA blockSize ; and next block
ADC bufferPtr
STA bufferPtr
BCC L0A5F
INC bufferPtr+2
L0A5F INC blockNum
BNE L0A65
INC blockNum+2
L0A65 LDY #$000C ; did we reach the end of disk?
LDA [dibPointer],Y
CMP blockNum+2
BCS L0A7C
LDY #$000A
LDA [dibPointer],Y
CMP blockNum
BCS L0A7C
SEC
LDA #$0027 ; I/O err
RTS
L0A7C JMP L0994 ; loop
*----------------------------
L0A7F SEP #$30
PHK
PLB
JSR L11B9 ; beep
JSR L0EA6
REP #$30
LDA #$0027 ; I/O err
SEC
RTS
L0A90 PHK
PLB
JSR L0EA6
REP #$30
SEC
JMP L09B4
L0A9B SEP #$30
LDA #$01
L0A9F STAL RDROM1
LDA #$20
L0AA5 STAL $00C08F
LDA #$00 ; we want bank 0
PHA
PLB
L0AAD LDAL RDBANK1 ; so it could have been LDA RDBANK1
BPL L0AAD
L0AB3 LDAL $00C08F
BMI L0AB3
AND #$F9 ; 1111_1001
CMP #$58 ; 0101_1000
BEQ L0AC4
LSR ; 2C means 0010_1100
BCS L0A90 ; not ready?
BRA L0AB3 ; busy
L0AC4 REP #$30 ; A 16-bit pseudo-bus or what?
LDY #$0000
L0AC9 LDA RDBANK2
STA [bufferPtr],Y
STA [cachePointer],Y
INY
INY
L0AD2 LDA RDBANK2
STA [bufferPtr],Y
STA [cachePointer],Y
INY
INY
L0ADB LDA RDBANK2
STA [bufferPtr],Y
STA [cachePointer],Y
INY
INY
L0AE4 LDA RDBANK2
STA [bufferPtr],Y
STA [cachePointer],Y
INY
INY
L0AED LDA RDBANK2
STA [bufferPtr],Y
STA [cachePointer],Y
INY
INY
L0AF6 LDA RDBANK2
STA [bufferPtr],Y
STA [cachePointer],Y
INY
INY
L0AFF LDA RDBANK2
STA [bufferPtr],Y
STA [cachePointer],Y
INY
INY
L0B08 LDA RDBANK2
STA [bufferPtr],Y
STA [cachePointer],Y
INY
INY
CPY #$0200 ; copy 512 bytes even if the blocksize is 256 ;-)
BCC L0AC9
PHK
PLB
CLC
JMP L09B4
*----------------------------
Driver_Write
LDY #$0030
LDA [dibPointer],Y
ASL
ASL
STA L146C
STZ L1468
LDA requestCount
STA theRequest
LDA requestCount+2
STA theRequest+2
L0B33 LDA L1468
BNE L0B76
CLC
JSL CACHE_FIND_BLK
BCC L0B49
LDA cachePriority
BEQ L0B53
JSL CACHE_ADD_BLK
BCS L0B53
L0B49 JMP L0C9B
L0B4C BIT cachePriority
BPL L0B53
JMP L0BD5
L0B53 LDA L1468
BNE L0B76
JSR L0EB7
REP #$30
LDA theRequest+1
AND #$01FF
LSR
SEP #$30
L0B66 STAL RDROM1
STA L1466
LDA #$30
L0B6F STAL $00C08F
STA L1468
L0B76 REP #$30
LDA bufferPtr ; BUG? I would have put requestCount instead
CMP #$FE01
BCC L0B82
L0B7F JMP writeTOCARD ; write 512 bytes onto card
L0B82 STAL $00C084
SEP #$30
LDA bufferPtr+2
CMP #$E0
BEQ L0B7F
CMP #$E1
BEQ L0B7F
CMP #$90
BCS L0B9B
CMP L1366
BCS L0B7F
L0B9B STAL DMAREG
L0B9F LDAL $00C086
L0BA3 LDAL $00C08F
BMI L0BA3
AND #$FD
CMP #$58
BEQ L0BB6
AND #$21
BEQ L0BA3
JMP L0C27
L0BB6 STAL LCBANK2
L0BBA LDAL $00C08F
BMI L0BBA
AND #$F5
CMP #$50
BEQ L0BCD
AND #$21
BEQ L0BBA
JMP L0C27
L0BCD DEC L1466
BNE L0BD5
STZ L1468
L0BD5 REP #$30
LDA theRequest
SEC
SBC blockSize
STA theRequest
BCS L0BE5
DEC theRequest+2
L0BE5 LDA theRequest
BNE L0BFC
LDA theRequest+2
BNE L0BFC
LDA requestCount
STA transferCount
LDA requestCount+2
STA transferCount+2
LDA #$0000
CLC
RTS
L0BFC CLC
LDA blockSize
ADC bufferPtr
STA bufferPtr
BCC L0C07
INC bufferPtr+2
L0C07 INC blockNum
BNE L0C0D
INC blockNum+2
L0C0D LDY #$000C
LDA [dibPointer],Y
CMP blockNum+2
BCS L0C24
LDY #$000A
LDA [dibPointer],Y
CMP blockNum
BCS L0C24
LDA #$0027 ; I/O err
SEC
RTS
L0C24 JMP L0B33
L0C27 SEP #$30
JSR L11B9
REP #$30
LDA #$0027
SEC
RTS
L0C33 LDY #$01FE
L0C36 LDA [cachePointer],Y
STA [bufferPtr],Y
DEY
DEY
LDA [cachePointer],Y
STA [bufferPtr],Y
DEY
DEY
LDA [cachePointer],Y
STA [bufferPtr],Y
DEY
DEY
LDA [cachePointer],Y
STA [bufferPtr],Y
DEY
DEY
LDA [cachePointer],Y
STA [bufferPtr],Y
DEY
DEY
LDA [cachePointer],Y
STA [bufferPtr],Y
DEY
DEY
LDA [cachePointer],Y
STA [bufferPtr],Y
DEY
DEY
LDA [cachePointer],Y
STA [bufferPtr],Y
DEY
DEY
LDA [cachePointer],Y
STA [bufferPtr],Y
DEY
DEY
LDA [cachePointer],Y
STA [bufferPtr],Y
DEY
DEY
LDA [cachePointer],Y
STA [bufferPtr],Y
DEY
DEY
LDA [cachePointer],Y
STA [bufferPtr],Y
DEY
DEY
LDA [cachePointer],Y
STA [bufferPtr],Y
DEY
DEY
LDA [cachePointer],Y
STA [bufferPtr],Y
DEY
DEY
LDA [cachePointer],Y
STA [bufferPtr],Y
DEY
DEY
LDA [cachePointer],Y
STA [bufferPtr],Y
DEY
DEY
BPL L0C36
JMP L0A2F
L0C9B LDY #$01FE
L0C9E LDA [bufferPtr],Y
STA [cachePointer],Y
DEY
DEY
LDA [bufferPtr],Y
STA [cachePointer],Y
DEY
DEY
LDA [bufferPtr],Y
STA [cachePointer],Y
DEY
DEY
LDA [bufferPtr],Y
STA [cachePointer],Y
DEY
DEY
LDA [bufferPtr],Y
STA [cachePointer],Y
DEY
DEY
LDA [bufferPtr],Y
STA [cachePointer],Y
DEY
DEY
LDA [bufferPtr],Y
STA [cachePointer],Y
DEY
DEY
LDA [bufferPtr],Y
STA [cachePointer],Y
DEY
DEY
LDA [bufferPtr],Y
STA [cachePointer],Y
DEY
DEY
LDA [bufferPtr],Y
STA [cachePointer],Y
DEY
DEY
LDA [bufferPtr],Y
STA [cachePointer],Y
DEY
DEY
LDA [bufferPtr],Y
STA [cachePointer],Y
DEY
DEY
LDA [bufferPtr],Y
STA [cachePointer],Y
DEY
DEY
LDA [bufferPtr],Y
STA [cachePointer],Y
DEY
DEY
LDA [bufferPtr],Y
STA [cachePointer],Y
DEY
DEY
LDA [bufferPtr],Y
STA [cachePointer],Y
DEY
DEY
BPL L0C9E
JMP L0B4C
*----------------------------
Driver_Close
LDA #$0000
CLC
RTS
*----------------------------
Driver_Status
LDA L1478
BNE L0D10
JSR L1228
L0D10 LDA statusCode
CMP #$0004
BCC L0D1C
LDA #$0021
SEC
RTS
L0D1C ASL
TAX
LDA tblSTATUS,X
PHA
RTS
*----------------------------
* Driver_Status subcall
*----------------------------
GetDeviceStatus
LDX requestCount+2
BNE L0D33
LDX requestCount
CPX #$0002
BCC L0D33
CPX #$0007
BCC L0D38
L0D33 LDA #$0022 ; drvrBadParm
SEC
RTS
L0D38 LDY #$0030 ; unitNum
LDA [dibPointer],Y
ASL
ASL
TAX
LDA L13BE,X ; get number of blocks
AND #$00FF
PHA
LDA L13BC,X
PHA
LDY #$0030 ; unitNum
LDA [dibPointer],Y
ASL
TAX
LDA L072E,X ; get table for device X
TAX
PLA
STA |$0002,X
PLA
STA |$0004,X
LDY #$0000 ; copy device status info
SEP #$20 ; statusWord (see GS/OS driver call reference page 231+)
L0D63 LDA |$0000,X ; numBlocks
STA [bufferPtr],Y
INX
INY
CPY requestCount
BNE L0D63
REP #$20
LDA requestCount ; transferCount = requestCount
STA transferCount
STZ transferCount+2
LDA #$0000 ; return OK
CLC
RTS
*----------------------------
* Driver_Status subcall
*----------------------------
GetConfigParameters
GetWaitStatus
LDA #$0026
SEC
RTS
*----------------------------
* Driver_Status subcall
*----------------------------
GetFormatOptions
LDA #$0022 ; drvrBadParm
LDX requestCount+2
BNE L0D8E
LDX requestCount
CPX #$0002
BCS L0D90
L0D8E SEC
RTS
L0D90 LDY #$0030 ; unitNum
LDA [dibPointer],Y
ASL
ASL
TAX
LDA L13BE,X ; number of blocks
AND #$00FF
PHA
LDA L13BC,X
PHA
LDA [dibPointer],Y
ASL
TAX
LDA L00D0,X
TAX
PLA ; save to blockCount
STA |$000E,X
PLA
STA |$0010,X
LDA #$0001 ; interleaveFactor is 1:1
AND #$00FF
STA |$0014,X
LDY #$0030 ; unitNum
LDA [dibPointer],Y
ASL
TAX
LDA L00D0,X ; table to formatOptions list
TAX
LDA |$0000,X
ASL
ASL
ASL
ASL
CLC
ADC #$0008
CMP requestCount
BCS L0DD8
STA requestCount
L0DD8 LDY #$0000 ; copy table
SEP #$20
L0DDD LDA |$0000,X
STA [bufferPtr],Y
INX
INY
CPY requestCount
BNE L0DDD
REP #$20 ; transferCount = requestCount
LDA requestCount
STA transferCount
LDA requestCount+2
STA transferCount+2
LDA #$0000
CLC
RTS
*----------------------------
Driver_Control
LDA controlCode
CMP #$000A
BCC L0E03
LDA #$0021
SEC
RTS
L0E03 ASL
TAX
LDA tblCONTROL,X
PHA
RTS
*----------------------------
GetPartitionMap ; Driver_Status subcall
LDA #$0026 ; drvrNoResrc
SEC
RTS
*----------------------------
* Driver_Control subcall
*----------------------------
ResetDevice
LDA #$0000
CLC
RTS
*----------------------------
* Driver_Control subcall
*----------------------------
FormatDevice
LDA #$0000
CLC
RTS
*----------------------------
* Driver_Control subcall
*----------------------------
EjectMedium
LDA #$0000
CLC
RTS
*----------------------------
* Driver_Control subcall
*----------------------------
SetConfigParameters
LDA #$0022 ; drvrBadParm
LDX requestCount+2
BNE L0E2C
LDX requestCount
CPX #$0002
BCS L0E2E
L0E2C SEC
RTS
L0E2E LDY #$0030 ; unitNum
LDA [dibPointer],Y
ASL
TAX
LDA L07B0,X ; table for SetConfigParameters
TAX
LDA |$0000,X ; lengths must be equal
CMP [bufferPtr]
BEQ L0E45
LDA #$0022 ; drvrBadParm
SEC
RTS
L0E45 LDY #$0000 ; copy configuration list
SEP #$20
L0E4A LDA [bufferPtr],Y
STA |$0000,X
INX
INY
TYA
CMP [bufferPtr],Y
BNE L0E4A
REP #$20 ; transferCount = requestCount
LDA requestCount
STA transferCount
LDA requestCount+2
STA transferCount+2
LDA #$0000
CLC
RTS
*----------------------------
* Driver_Control subcall
*----------------------------
SetFormatOptions
LDA #$0022 ; drvrBadParm
LDX requestCount+2
BNE L0E73
LDX requestCount
CPX #$0002
BEQ L0E75
L0E73 SEC
RTS
L0E75 LDY #$0030 ; unitNum
LDA [dibPointer],Y
TAX
LDA [bufferPtr] ; get formatOptionNum
STA L07F0,X ; save it in list
LDA requestCount ; transferCount = requestCount
STA transferCount
LDA requestCount+2
STA transferCount+2
LDA #$0000
CLC
RTS
*----------------------------
* Driver_Control subcall
*----------------------------
SetWaitStatus
AssignPartitionOwner
ArmSignal
DisarmSignal
SetPartitionMap
LDA #$0026 ; drvrNoResrc
SEC
RTS
*----------------------------
Driver_Flush
LDA #$0020 ; drvrBadReq
SEC
RTS
*----------------------------
Driver_Shutdown
DEC theUNIT ; hum, should really be fgBUSY instead
BNE L0EA1
LDA #$0000
CLC
RTS
L0EA1 LDA #$0029 ; drvrBusy
SEC
RTS
*----------------------------
* Wait for card to finish its work?
MX %11
L0EA6 PHP
L0EA7 LDAL $00C08F
AND #$08 ; 0000_1000
BEQ L0EB5
L0EAF LDAL RDBANK2
BRA L0EA7
L0EB5 PLP
RTS
*----------------------------
* Calculate offsets and friends?
L0EB7 SEP #$30
L0EB9 LDAL $00C08F
BMI L0EB9
LDX L146C
CLC
REP #$20
LDA blockNum
ADC L137C,X
STA L145E
SEP #$20
LDA blockNum+2
ADC L137E,X
STA L1460
LDA L137F,X
STA L1476
LDA L13BF,X
TAX
REP #$20
CLC
LDA L1460
AND #$003F
BEQ L0EEF
JMP L0F75
L0EEF ASL L145E
BCC L0EF7
JMP L0F78
L0EF7 ASL L145E
BCC L0EFF
JMP L0F84
L0EFF ASL L145E
BCC L0F07
JMP L0F90
L0F07 ASL L145E
BCC L0F0F
JMP L0F9C
L0F0F ASL L145E
BCC L0F17
JMP L0FA8
L0F17 ASL L145E
BCC L0F1F
JMP L0FB4
L0F1F ASL L145E
BCC L0F27
JMP L0FC0
L0F27 ASL L145E
BCC L0F2F
JMP L0FCC
L0F2F ASL L145E
BCC L0F37
JMP L0FD8
L0F37 ASL L145E
BCC L0F3F
JMP L0FE4
L0F3F ASL L145E
BCC L0F47
JMP L0FF0
L0F47 ASL L145E
BCC L0F4F
JMP L0FFC
L0F4F ASL L145E
BCC L0F57
JMP L1008
L0F57 ASL L145E
BCC L0F5F
JMP L1014
L0F5F ASL L145E
BCC L0F67
JMP L1020
L0F67 ASL L145E
BCC L0F6F
JMP L102C
L0F6F ASL L145E
JMP L1038
L0F75 ASL L145E
L0F78 ROL
CMP L134E,X
BCC L0F81
SBC L134E,X
L0F81 ROL L145E
L0F84 ROL
CMP L134E,X
BCC L0F8D
SBC L134E,X
L0F8D ROL L145E
L0F90 ROL
CMP L134E,X
BCC L0F99
SBC L134E,X
L0F99 ROL L145E
L0F9C ROL
CMP L134E,X
BCC L0FA5
SBC L134E,X
L0FA5 ROL L145E
L0FA8 ROL
CMP L134E,X
BCC L0FB1
SBC L134E,X
L0FB1 ROL L145E
L0FB4 ROL
CMP L134E,X
BCC L0FBD
SBC L134E,X
L0FBD ROL L145E
L0FC0 ROL
CMP L134E,X
BCC L0FC9
SBC L134E,X
L0FC9 ROL L145E
L0FCC ROL
CMP L134E,X
BCC L0FD5
SBC L134E,X
L0FD5 ROL L145E
L0FD8 ROL
CMP L134E,X
BCC L0FE1
SBC L134E,X
L0FE1 ROL L145E
L0FE4 ROL
CMP L134E,X
BCC L0FED
SBC L134E,X
L0FED ROL L145E
L0FF0 ROL
CMP L134E,X
BCC L0FF9
SBC L134E,X
L0FF9 ROL L145E
L0FFC ROL
CMP L134E,X
BCC L1005
SBC L134E,X
L1005 ROL L145E
L1008 ROL
CMP L134E,X
BCC L1011
SBC L134E,X
L1011 ROL L145E
L1014 ROL
CMP L134E,X
BCC L101D
SBC L134E,X
L101D ROL L145E
L1020 ROL
CMP L134E,X
BCC L1029
SBC L134E,X
L1029 ROL L145E
L102C ROL
CMP L134E,X
BCC L1035
SBC L134E,X
L1035 ROL L145E
L1038 SEP #$20
INC
L103B STAL LCBANK1
REP #$20
LDA L145E
STA L1450
LDA #$0000
ASL L1450
BCC L1052
JMP L10D0
L1052 ASL L1450
BCC L105A
JMP L10DC
L105A ASL L1450
BCC L1062
JMP L10E8
L1062 ASL L1450
BCC L106A
JMP L10F4
L106A ASL L1450
BCC L1072
JMP L1100
L1072 ASL L1450
BCC L107A
JMP L110C
L107A ASL L1450
BCC L1082
JMP L1118
L1082 ASL L1450
BCC L108A
JMP L1124
L108A ASL L1450
BCC L1092
JMP L1130
L1092 ASL L1450
BCC L109A
JMP L113C
L109A ASL L1450
BCC L10A2
JMP L1148
L10A2 ASL L1450
BCC L10AA
JMP L1154
L10AA ASL L1450
BCC L10B2
JMP L1160
L10B2 ASL L1450
BCC L10BA
JMP L116C
L10BA ASL L1450
BCC L10C2
JMP L1178
L10C2 ASL L1450
BCC L10CA
JMP L1184
L10CA ASL L1450
JMP L1190
L10D0 ROL
CMP L134A,X
BCC L10D9
SBC L134A,X
L10D9 ROL L1450
L10DC ROL
CMP L134A,X
BCC L10E5
SBC L134A,X
L10E5 ROL L1450
L10E8 ROL
CMP L134A,X
BCC L10F1
SBC L134A,X
L10F1 ROL L1450
L10F4 ROL
CMP L134A,X
BCC L10FD
SBC L134A,X
L10FD ROL L1450
L1100 ROL
CMP L134A,X
BCC L1109
SBC L134A,X
L1109 ROL L1450
L110C ROL
CMP L134A,X
BCC L1115
SBC L134A,X
L1115 ROL L1450
L1118 ROL
CMP L134A,X
BCC L1121
SBC L134A,X
L1121 ROL L1450
L1124 ROL
CMP L134A,X
BCC L112D
SBC L134A,X
L112D ROL L1450
L1130 ROL
CMP L134A,X
BCC L1139
SBC L134A,X
L1139 ROL L1450
L113C ROL
CMP L134A,X
BCC L1145
SBC L134A,X
L1145 ROL L1450
L1148 ROL
CMP L134A,X
BCC L1151
SBC L134A,X
L1151 ROL L1450
L1154 ROL
CMP L134A,X
BCC L115D
SBC L134A,X
L115D ROL L1450
L1160 ROL
CMP L134A,X
BCC L1169
SBC L134A,X
L1169 ROL L1450
L116C ROL
CMP L134A,X
BCC L1175
SBC L134A,X
L1175 ROL L1450
L1178 ROL
CMP L134A,X
BCC L1181
SBC L134A,X
L1181 ROL L1450
L1184 ROL
CMP L134A,X
BCC L118D
SBC L134A,X
L118D ROL L1450
L1190 SEP #$20
ORA L1476
L1195 STAL $00C08E
REP #$20
LDA L1450
L119E STAL $00C08C
REP #$30
RTS
*----------------------------
MX %11
LDX #$FF
BNE L11C9
LDX #$E0
BNE L11C9
LDX #$C0
BNE L11C9
LDX #$A0
BNE L11C9
LDX #$80
BNE L11C9
L11B9 LDX #$60
BNE L11C9
LDX #$50
BNE L11C9
LDX #$40
BNE L11C9
LDX #$20
BNE L11C9
L11C9 STX L1470
LDY #$60
L11CE LDAL SPKR
LDX L1470
L11D5 DEX
BNE L11D5
DEY
BNE L11CE
LDX #$FF
L11DD DEY
BNE L11DD
DEX
BNE L11DD
RTS
LDA #$14
STA L1480
STZ L147F
STZ L147E
L11EF LDAL RDBANK1
BPL L11F7
CLC
RTS
L11F7 INC L147E
BNE L11EF
INC L147F
BNE L11EF
DEC L1480
BNE L11EF
L1206 SEC
RTS
*----------------------------
L1208 DA L027A
DA L02BE
DA L0302
DA L0346
DA L038A
DA L03CE
DA L0412
DA L0456
DA L049A
DA L04DE
DA L0522
DA L0566
DA L05AA
DA L05EE
DA L0632
DA L0676
*----------------------------
MX %00
L1228 LDY L1208
LDA |$003E,Y
STA L147A
LDA #$0001
STA L147C
L1237 LDA L147C
CMP L135A
BCC L1243
BEQ L1243
BRA L1254
L1243 ASL
TAY
LDA L1206,Y
TAY
LDA L147A
STA |$0036,Y
INC L147C
BNE L1237
L1254 LDA #$0001
STA L147C
L125A LDA L147C
CMP L135A
BCC L1264
BRA L127D
L1264 ASL
TAY
TAX
LDA L1208,Y
TAY
LDA |$003E,Y
PHA
TXY
LDA L1206,Y
TAY
PLA
STA |$0038,Y
INC L147C
BNE L125A
L127D INC L1478
RTS
*----------------------------
* Init s/w addresses
*----------------------------
initPointers
REP #$30
LDA fgINIT ; was it init'ed?
BNE L12E6 ; yes, exit
INC fgINIT
LDY #$0000 ; patch s/w addresses
L128E LDX L12EB,Y
LDA |$0000,X
AND #$FF00
CMP #$C000
BNE L12E7 ; crash on error
LDA |$0000,X
CLC
ADC theSLOT16
STA |$0000,X
INY
INY
CPY #$004E
BCC L128E
SEP #$30 ; patch fast read/write from direct page
REP #$10
LDX #$0100
LDY #$0000
L12B7 LDA L19E5+1,Y
AND #$F0
CMP #$80
BNE L12E9 ; crash on error
CLC
ADC theSLOT16
STA L19E5+1,Y
LDA L14B7+1,Y
AND #$F0
CMP #$80
BNE L12E9
CLC
ADC theSLOT16
STA L14B7+1,Y
REP #$20
TYA
CLC
ADC #$0005
TAY
SEP #$20
DEX
BNE L12B7
REP #$30
L12E6 RTS
L12E7 BRK $01 ; Hum, a BNE goes here
L12E9 DRK $02 ; Hum, a BNE goes here
*----------------------------
* Patch $C0xy table
*----------------------------
L12EB DA L0A0F+1
DA L0AB3+1
DA L0BA3+1
DA L0BBA+1
DA L0EA7+1
DA L0EB9+1
DA L1498+1
DA L19C1+1
DA L1EEC+1
DA L0A09+1
DA L0AAD+1
DA L11EF+1
DA L1492+1
DA L1EE6+1
DA L09D0+1
DA L0A9F+1
DA L0B66+1
DA L103B+1
DA L119E+1
DA L1195+1
DA L0AC9+1
DA L0AD2+1
DA L0ADB+1
DA L0AE4+1
DA L0EAF+1
DA L0AED+1
DA L0AF6+1
DA L0AFF+1
DA L0B08+1
DA L08E7+1
DA L09EC+1
DA L0B82+1
DA L0B9F+1
DA L0990+1
DA L0A21+1
DA L0BB6+1
DA L09D9+1
DA L0AA5+1
DA L0B6F+1
*----------------------------
DB $AA
DB $AA
DB $AA
DB $AA
DB $AA
DB $AA
DB $AA
*--- This is a copy of the $C800..$C8FF page (the real one)
L1340 DB $CA
DB $CC
DB $64
DB $02
DB $64
DB $02
DB $00
DB $00
DB $00
DB $00
L134A DB $05
DB $00
DB $05
DB $00
L134E DB $00
DB $00
DB $00
DB $00
DB $01
DB $00
DB $01
DB $00
DB $05
DB $00
DB $03
DB $00
L135A DB $08
DB $00
DB $01
DB $00
DB $03
DB $00
DB $04
DB $00
DB $00
DB $00
DB $01
DB $00
L1366 DB $40
DB $00
DB $01
DB $00
DB $01
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
L137C DW $0000
L137E DB $00
L137F DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
L13BC DW $0000 ; number of blocks per device (16*4 bytes)
L13BE DB $00
L13BF DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
L1450 DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
DB $00
L145E DW $0000
L1460 DW $0000
theRequest ADRL $00000000
L1466 DW $0000
L1468 DW $0000
DB $00
DB $00
L146C DW $0000
DB $00
DB $00
L1470 DW $0000
DB $00
DB $00
L1474 DW $0000
L1476 DW $0000
L1478 DW $0000
L147A DW $0000
L147C DW $0000
L147E DB $00
L147F DB $00
L1480 DW $0000
theCARD DW $0000
DB $00
DB $00
theSLOT DW $0000
theSLOT16 DW $0000
fgINIT DW $0000
DB $EE
DB $EE
DB $EE
DB $EE
*----------------------------
* Read data from card
*----------------------------
readFROMCARD
SEP #$30
L1492 LDAL RDBANK1
BPL L1492
L1498 LDAL $00C08F
BMI L1498
AND #$F9
CMP #$58
BEQ L14AA
LSR
BCC L1498
JMP L0A7F
L14AA LDA bufferPtr+2
PHA
PLB
REP #$30
LDY bufferPtr
PHD
LDA #$C000
TCD
L14B7 LDA $80 ; $C0s0 returns a 16-bit value from the disk
STA |$0000,Y
LDA $80
STA |$0002,Y
LDA $80
STA |$0004,Y
LDA $80
STA |$0006,Y
LDA $80
STA |$0008,Y
LDA $80
STA |$000A,Y
LDA $80
STA |$000C,Y
LDA $80
STA |$000E,Y
LDA $80
STA |$0010,Y
LDA $80
STA |$0012,Y
LDA $80
STA |$0014,Y
LDA $80
STA |$0016,Y
LDA $80
STA |$0018,Y
LDA $80
STA |$001A,Y
LDA $80
STA |$001C,Y
LDA $80
STA |$001E,Y
LDA $80
STA |$0020,Y
LDA $80
STA |$0022,Y
LDA $80
STA |$0024,Y
LDA $80
STA |$0026,Y
LDA $80
STA |$0028,Y
LDA $80
STA |$002A,Y
LDA $80
STA |$002C,Y
LDA $80
STA |$002E,Y
LDA $80
STA |$0030,Y
LDA $80
STA |$0032,Y
LDA $80
STA |$0034,Y
LDA $80
STA |$0036,Y
LDA $80
STA |$0038,Y
LDA $80
STA |$003A,Y
LDA $80
STA |$003C,Y
LDA $80
STA |$003E,Y
LDA $80
STA |$0040,Y
LDA $80
STA |$0042,Y
LDA $80
STA |$0044,Y
LDA $80
STA |$0046,Y
LDA $80
STA |$0048,Y
LDA $80
STA |$004A,Y
LDA $80
STA |$004C,Y
LDA $80
STA |$004E,Y
LDA $80
STA |$0050,Y
LDA $80
STA |$0052,Y
LDA $80
STA |$0054,Y
LDA $80
STA |$0056,Y
LDA $80
STA |$0058,Y
LDA $80
STA |$005A,Y
LDA $80
STA |$005C,Y
LDA $80
STA |$005E,Y
LDA $80
STA |$0060,Y
LDA $80
STA |$0062,Y
LDA $80
STA |$0064,Y
LDA $80
STA |$0066,Y
LDA $80
STA |$0068,Y
LDA $80
STA |$006A,Y
LDA $80
STA |$006C,Y
LDA $80
STA |$006E,Y
LDA $80
STA |$0070,Y
LDA $80
STA |$0072,Y
LDA $80
STA |$0074,Y
LDA $80
STA |$0076,Y
LDA $80
STA |$0078,Y
LDA $80
STA |$007A,Y
LDA $80
STA |$007C,Y
LDA $80
STA |$007E,Y
LDA $80
STA |$0080,Y
LDA $80
STA |$0082,Y
LDA $80
STA |$0084,Y
LDA $80
STA |$0086,Y
LDA $80
STA |$0088,Y
LDA $80
STA |$008A,Y
LDA $80
STA |$008C,Y
LDA $80
STA |$008E,Y
LDA $80
STA |$0090,Y
LDA $80
STA |$0092,Y
LDA $80
STA |$0094,Y
LDA $80
STA |$0096,Y
LDA $80
STA |$0098,Y
LDA $80
STA |$009A,Y
LDA $80
STA |$009C,Y
LDA $80
STA |$009E,Y
LDA $80
STA |$00A0,Y
LDA $80
STA |$00A2,Y
LDA $80
STA |$00A4,Y
LDA $80
STA |$00A6,Y
LDA $80
STA |$00A8,Y
LDA $80
STA |$00AA,Y
LDA $80
STA |$00AC,Y
LDA $80
STA |$00AE,Y
LDA $80
STA |$00B0,Y
LDA $80
STA |$00B2,Y
LDA $80
STA |$00B4,Y
LDA $80
STA |$00B6,Y
LDA $80
STA |$00B8,Y
LDA $80
STA |$00BA,Y
LDA $80
STA |$00BC,Y
LDA $80
STA |$00BE,Y
LDA $80
STA |$00C0,Y
LDA $80
STA |$00C2,Y
LDA $80
STA |$00C4,Y
LDA $80
STA |$00C6,Y
LDA $80
STA |$00C8,Y
LDA $80
STA |$00CA,Y
LDA $80
STA |$00CC,Y
LDA $80
STA |$00CE,Y
LDA $80
STA |$00D0,Y
LDA $80
STA |$00D2,Y
LDA $80
STA |$00D4,Y
LDA $80
STA |$00D6,Y
LDA $80
STA |$00D8,Y
LDA $80
STA |$00DA,Y
LDA $80
STA |$00DC,Y
LDA $80
STA |$00DE,Y
LDA $80
STA |$00E0,Y
LDA $80
STA |$00E2,Y
LDA $80
STA |$00E4,Y
LDA $80
STA |$00E6,Y
LDA $80
STA |$00E8,Y
LDA $80
STA |$00EA,Y
LDA $80
STA |$00EC,Y
LDA $80
STA |$00EE,Y
LDA $80
STA |$00F0,Y
LDA $80
STA |$00F2,Y
LDA $80
STA |$00F4,Y
LDA $80
STA |$00F6,Y
LDA $80
STA |$00F8,Y
LDA $80
STA |$00FA,Y
LDA $80
STA |$00FC,Y
LDA $80
STA |$00FE,Y
LDA $80
STA $0100,Y
LDA $80
STA $0102,Y
LDA $80
STA $0104,Y
LDA $80
STA $0106,Y
LDA $80
STA $0108,Y
LDA $80
STA $010A,Y
LDA $80
STA $010C,Y
LDA $80
STA $010E,Y
LDA $80
STA $0110,Y
LDA $80
STA $0112,Y
LDA $80
STA $0114,Y
LDA $80
STA $0116,Y
LDA $80
STA $0118,Y
LDA $80
STA $011A,Y
LDA $80
STA $011C,Y
LDA $80
STA $011E,Y
LDA $80
STA $0120,Y
LDA $80
STA $0122,Y
LDA $80
STA $0124,Y
LDA $80
STA $0126,Y
LDA $80
STA $0128,Y
LDA $80
STA $012A,Y
LDA $80
STA $012C,Y
LDA $80
STA $012E,Y
LDA $80
STA $0130,Y
LDA $80
STA $0132,Y
LDA $80
STA $0134,Y
LDA $80
STA $0136,Y
LDA $80
STA $0138,Y
LDA $80
STA $013A,Y
LDA $80
STA $013C,Y
LDA $80
STA $013E,Y
LDA $80
STA $0140,Y
LDA $80
STA $0142,Y
LDA $80
STA $0144,Y
LDA $80
STA $0146,Y
LDA $80
STA $0148,Y
LDA $80
STA $014A,Y
LDA $80
STA $014C,Y
LDA $80
STA $014E,Y
LDA $80
STA $0150,Y
LDA $80
STA $0152,Y
LDA $80
STA $0154,Y
LDA $80
STA $0156,Y
LDA $80
STA $0158,Y
LDA $80
STA $015A,Y
LDA $80
STA $015C,Y
LDA $80
STA $015E,Y
LDA $80
STA $0160,Y
LDA $80
STA $0162,Y
LDA $80
STA $0164,Y
LDA $80
STA $0166,Y
LDA $80
STA $0168,Y
LDA $80
STA $016A,Y
LDA $80
STA $016C,Y
LDA $80
STA $016E,Y
LDA $80
STA $0170,Y
LDA $80
STA $0172,Y
LDA $80
STA $0174,Y
LDA $80
STA $0176,Y
LDA $80
STA $0178,Y
LDA $80
STA $017A,Y
LDA $80
STA $017C,Y
LDA $80
STA $017E,Y
LDA $80
STA $0180,Y
LDA $80
STA $0182,Y
LDA $80
STA $0184,Y
LDA $80
STA $0186,Y
LDA $80
STA $0188,Y
LDA $80
STA $018A,Y
LDA $80
STA $018C,Y
LDA $80
STA $018E,Y
LDA $80
STA $0190,Y
LDA $80
STA $0192,Y
LDA $80
STA $0194,Y
LDA $80
STA $0196,Y
LDA $80
STA $0198,Y
LDA $80
STA $019A,Y
LDA $80
STA $019C,Y
LDA $80
STA $019E,Y
LDA $80
STA $01A0,Y
LDA $80
STA $01A2,Y
LDA $80
STA $01A4,Y
LDA $80
STA $01A6,Y
LDA $80
STA $01A8,Y
LDA $80
STA $01AA,Y
LDA $80
STA $01AC,Y
LDA $80
STA $01AE,Y
LDA $80
STA $01B0,Y
LDA $80
STA $01B2,Y
LDA $80
STA $01B4,Y
LDA $80
STA $01B6,Y
LDA $80
STA $01B8,Y
LDA $80
STA $01BA,Y
LDA $80
STA $01BC,Y
LDA $80
STA $01BE,Y
LDA $80
STA $01C0,Y
LDA $80
STA $01C2,Y
LDA $80
STA $01C4,Y
LDA $80
STA $01C6,Y
LDA $80
STA $01C8,Y
LDA $80
STA $01CA,Y
LDA $80
STA $01CC,Y
LDA $80
STA $01CE,Y
LDA $80
STA $01D0,Y
LDA $80
STA $01D2,Y
LDA $80
STA $01D4,Y
LDA $80
STA $01D6,Y
LDA $80
STA $01D8,Y
LDA $80
STA $01DA,Y
LDA $80
STA $01DC,Y
LDA $80
STA $01DE,Y
LDA $80
STA $01E0,Y
LDA $80
STA $01E2,Y
LDA $80
STA $01E4,Y
LDA $80
STA $01E6,Y
LDA $80
STA $01E8,Y
LDA $80
STA $01EA,Y
LDA $80
STA $01EC,Y
LDA $80
STA $01EE,Y
LDA $80
STA $01F0,Y
LDA $80
STA $01F2,Y
LDA $80
STA $01F4,Y
LDA $80
STA $01F6,Y
LDA $80
STA $01F8,Y
LDA $80
STA $01FA,Y
LDA $80
STA $01FC,Y
LDA $80
STA $01FE,Y
PLD
SEP #$30
PHK
PLB
JMP L0A25
*----------------------------
* Write data to card
*----------------------------
writeTOCARD
SEP #$30
L19C1 LDAL $00C08F
BMI L19C1
AND #$FD ; 1111_1101
CMP #$58 ; 0101_1000
BEQ L19D4
AND #$21 ; 0010_0001
BEQ L19C1
JMP L0C27
L19D4 PHB
LDA bufferPtr+2
PHA
PLB
REP #$30
LDY bufferPtr
PHD
LDA #$C000
TCD
LDA |$0000,Y
L19E5 STA $80
LDA |$0002,Y
STA $80
LDA |$0004,Y
STA $80
LDA |$0006,Y
STA $80
LDA |$0008,Y
STA $80
LDA |$000A,Y
STA $80
LDA |$000C,Y
STA $80
LDA |$000E,Y
STA $80
LDA |$0010,Y
STA $80
LDA |$0012,Y
STA $80
LDA |$0014,Y
STA $80
LDA |$0016,Y
STA $80
LDA |$0018,Y
STA $80
LDA |$001A,Y
STA $80
LDA |$001C,Y
STA $80
LDA |$001E,Y
STA $80
LDA |$0020,Y
STA $80
LDA |$0022,Y
STA $80
LDA |$0024,Y
STA $80
LDA |$0026,Y
STA $80
LDA |$0028,Y
STA $80
LDA |$002A,Y
STA $80
LDA |$002C,Y
STA $80
LDA |$002E,Y
STA $80
LDA |$0030,Y
STA $80
LDA |$0032,Y
STA $80
LDA |$0034,Y
STA $80
LDA |$0036,Y
STA $80
LDA |$0038,Y
STA $80
LDA |$003A,Y
STA $80
LDA |$003C,Y
STA $80
LDA |$003E,Y
STA $80
LDA |$0040,Y
STA $80
LDA |$0042,Y
STA $80
LDA |$0044,Y
STA $80
LDA |$0046,Y
STA $80
LDA |$0048,Y
STA $80
LDA |$004A,Y
STA $80
LDA |$004C,Y
STA $80
LDA |$004E,Y
STA $80
LDA |$0050,Y
STA $80
LDA |$0052,Y
STA $80
LDA |$0054,Y
STA $80
LDA |$0056,Y
STA $80
LDA |$0058,Y
STA $80
LDA |$005A,Y
STA $80
LDA |$005C,Y
STA $80
LDA |$005E,Y
STA $80
LDA |$0060,Y
STA $80
LDA |$0062,Y
STA $80
LDA |$0064,Y
STA $80
LDA |$0066,Y
STA $80
LDA |$0068,Y
STA $80
LDA |$006A,Y
STA $80
LDA |$006C,Y
STA $80
LDA |$006E,Y
STA $80
LDA |$0070,Y
STA $80
LDA |$0072,Y
STA $80
LDA |$0074,Y
STA $80
LDA |$0076,Y
STA $80
LDA |$0078,Y
STA $80
LDA |$007A,Y
STA $80
LDA |$007C,Y
STA $80
LDA |$007E,Y
STA $80
LDA |$0080,Y
STA $80
LDA |$0082,Y
STA $80
LDA |$0084,Y
STA $80
LDA |$0086,Y
STA $80
LDA |$0088,Y
STA $80
LDA |$008A,Y
STA $80
LDA |$008C,Y
STA $80
LDA |$008E,Y
STA $80
LDA |$0090,Y
STA $80
LDA |$0092,Y
STA $80
LDA |$0094,Y
STA $80
LDA |$0096,Y
STA $80
LDA |$0098,Y
STA $80
LDA |$009A,Y
STA $80
LDA |$009C,Y
STA $80
LDA |$009E,Y
STA $80
LDA |$00A0,Y
STA $80
LDA |$00A2,Y
STA $80
LDA |$00A4,Y
STA $80
LDA |$00A6,Y
STA $80
LDA |$00A8,Y
STA $80
LDA |$00AA,Y
STA $80
LDA |$00AC,Y
STA $80
LDA |$00AE,Y
STA $80
LDA |$00B0,Y
STA $80
LDA |$00B2,Y
STA $80
LDA |$00B4,Y
STA $80
LDA |$00B6,Y
STA $80
LDA |$00B8,Y
STA $80
LDA |$00BA,Y
STA $80
LDA |$00BC,Y
STA $80
LDA |$00BE,Y
STA $80
LDA |$00C0,Y
STA $80
LDA |$00C2,Y
STA $80
LDA |$00C4,Y
STA $80
LDA |$00C6,Y
STA $80
LDA |$00C8,Y
STA $80
LDA |$00CA,Y
STA $80
LDA |$00CC,Y
STA $80
LDA |$00CE,Y
STA $80
LDA |$00D0,Y
STA $80
LDA |$00D2,Y
STA $80
LDA |$00D4,Y
STA $80
LDA |$00D6,Y
STA $80
LDA |$00D8,Y
STA $80
LDA |$00DA,Y
STA $80
LDA |$00DC,Y
STA $80
LDA |$00DE,Y
STA $80
LDA |$00E0,Y
STA $80
LDA |$00E2,Y
STA $80
LDA |$00E4,Y
STA $80
LDA |$00E6,Y
STA $80
LDA |$00E8,Y
STA $80
LDA |$00EA,Y
STA $80
LDA |$00EC,Y
STA $80
LDA |$00EE,Y
STA $80
LDA |$00F0,Y
STA $80
LDA |$00F2,Y
STA $80
LDA |$00F4,Y
STA $80
LDA |$00F6,Y
STA $80
LDA |$00F8,Y
STA $80
LDA |$00FA,Y
STA $80
LDA |$00FC,Y
STA $80
LDA |$00FE,Y
STA $80
LDA $0100,Y
STA $80
LDA $0102,Y
STA $80
LDA $0104,Y
STA $80
LDA $0106,Y
STA $80
LDA $0108,Y
STA $80
LDA $010A,Y
STA $80
LDA $010C,Y
STA $80
LDA $010E,Y
STA $80
LDA $0110,Y
STA $80
LDA $0112,Y
STA $80
LDA $0114,Y
STA $80
LDA $0116,Y
STA $80
LDA $0118,Y
STA $80
LDA $011A,Y
STA $80
LDA $011C,Y
STA $80
LDA $011E,Y
STA $80
LDA $0120,Y
STA $80
LDA $0122,Y
STA $80
LDA $0124,Y
STA $80
LDA $0126,Y
STA $80
LDA $0128,Y
STA $80
LDA $012A,Y
STA $80
LDA $012C,Y
STA $80
LDA $012E,Y
STA $80
LDA $0130,Y
STA $80
LDA $0132,Y
STA $80
LDA $0134,Y
STA $80
LDA $0136,Y
STA $80
LDA $0138,Y
STA $80
LDA $013A,Y
STA $80
LDA $013C,Y
STA $80
LDA $013E,Y
STA $80
LDA $0140,Y
STA $80
LDA $0142,Y
STA $80
LDA $0144,Y
STA $80
LDA $0146,Y
STA $80
LDA $0148,Y
STA $80
LDA $014A,Y
STA $80
LDA $014C,Y
STA $80
LDA $014E,Y
STA $80
LDA $0150,Y
STA $80
LDA $0152,Y
STA $80
LDA $0154,Y
STA $80
LDA $0156,Y
STA $80
LDA $0158,Y
STA $80
LDA $015A,Y
STA $80
LDA $015C,Y
STA $80
LDA $015E,Y
STA $80
LDA $0160,Y
STA $80
LDA $0162,Y
STA $80
LDA $0164,Y
STA $80
LDA $0166,Y
STA $80
LDA $0168,Y
STA $80
LDA $016A,Y
STA $80
LDA $016C,Y
STA $80
LDA $016E,Y
STA $80
LDA $0170,Y
STA $80
LDA $0172,Y
STA $80
LDA $0174,Y
STA $80
LDA $0176,Y
STA $80
LDA $0178,Y
STA $80
LDA $017A,Y
STA $80
LDA $017C,Y
STA $80
LDA $017E,Y
STA $80
LDA $0180,Y
STA $80
LDA $0182,Y
STA $80
LDA $0184,Y
STA $80
LDA $0186,Y
STA $80
LDA $0188,Y
STA $80
LDA $018A,Y
STA $80
LDA $018C,Y
STA $80
LDA $018E,Y
STA $80
LDA $0190,Y
STA $80
LDA $0192,Y
STA $80
LDA $0194,Y
STA $80
LDA $0196,Y
STA $80
LDA $0198,Y
STA $80
LDA $019A,Y
STA $80
LDA $019C,Y
STA $80
LDA $019E,Y
STA $80
LDA $01A0,Y
STA $80
LDA $01A2,Y
STA $80
LDA $01A4,Y
STA $80
LDA $01A6,Y
STA $80
LDA $01A8,Y
STA $80
LDA $01AA,Y
STA $80
LDA $01AC,Y
STA $80
LDA $01AE,Y
STA $80
LDA $01B0,Y
STA $80
LDA $01B2,Y
STA $80
LDA $01B4,Y
STA $80
LDA $01B6,Y
STA $80
LDA $01B8,Y
STA $80
LDA $01BA,Y
STA $80
LDA $01BC,Y
STA $80
LDA $01BE,Y
STA $80
LDA $01C0,Y
STA $80
LDA $01C2,Y
STA $80
LDA $01C4,Y
STA $80
LDA $01C6,Y
STA $80
LDA $01C8,Y
STA $80
LDA $01CA,Y
STA $80
LDA $01CC,Y
STA $80
LDA $01CE,Y
STA $80
LDA $01D0,Y
STA $80
LDA $01D2,Y
STA $80
LDA $01D4,Y
STA $80
LDA $01D6,Y
STA $80
LDA $01D8,Y
STA $80
LDA $01DA,Y
STA $80
LDA $01DC,Y
STA $80
LDA $01DE,Y
STA $80
LDA $01E0,Y
STA $80
LDA $01E2,Y
STA $80
LDA $01E4,Y
STA $80
LDA $01E6,Y
STA $80
LDA $01E8,Y
STA $80
LDA $01EA,Y
STA $80
LDA $01EC,Y
STA $80
LDA $01EE,Y
STA $80
LDA $01F0,Y
STA $80
LDA $01F2,Y
STA $80
LDA $01F4,Y
STA $80
LDA $01F6,Y
STA $80
LDA $01F8,Y
STA $80
LDA $01FA,Y
STA $80
LDA $01FC,Y
STA $80
LDA $01FE,Y
STA $80
PLD
SEP #$30
PLB
L1EE6 LDAL RDBANK1
BPL L1EE6
L1EEC LDAL $00C08F
BMI L1EEC
JMP L0BBA