Mercurial > hg > Members > kono > nitros9-code
view 3rdparty/roms/dos/SuperDos/superdos-e6-02.asm @ 2262:6ce1eeaa029e
Fixed makefiles that I messed up.
author | boisy |
---|---|
date | Sun, 27 Dec 2009 19:21:27 +0000 |
parents | 4037b23c848d |
children |
line wrap: on
line source
; ; SuperDos E6, Copyright (C) 1986 ???, Compusense. ; ; Disassembled 2004-11-05, P.Harvey-Smith. ; ; Fixed for assembly with "mamou" cross-assembler, ; from NitrOS9 cocotools. ; ; Ported to the Dragon Alpha/Professional hardware, ; 2004-11-21 P.Harvey-Smith. ; ;DragonAlpha EQU 1 ; Define this if compiling for Dragon Alpha. ifp1 use dgndefs.asm use romdefs.asm use dosdefs.asm endc IFNE DragonAlpha * Dragon Alpha has a third PIA at FF24, this is used for * Drive select / motor control, and provides FIRQ from the * disk controler. DPPIADA EQU DPPIA2DA DPPIACRA EQU DPPIA2CRA DPPIADB EQU DPPIA2DB DPPIACRB EQU DPPIA2CRB PIADA EQU DPPIADA+IO ; Side A Data/DDR PIACRA EQU DPPIACRA+IO ; Side A Control. PIADB EQU DPPIADB+IO ; Side A Data/DDR PIACRB EQU DPPIACRB+IO ; Side A Control. ;WD2797 Floppy disk controler, used in Alpha Note registers in reverse order ! DPCMDREG EQU DPCmdRegA ; command/status DPTRKREG EQU DPTrkRegA ; Track register DPSECREG EQU DPSecRegA ; Sector register DPDATAREG EQU DPDataRegA ; Data register CMDREG EQU DPCMDREG+IO ; command/status TRKREG EQU DPTRKREG+IO ; Track register SECREG EQU DPSECREG+IO ; Sector register DATAREG EQU DPDATAREG+IO ; Data register ; Disk IO bitmasks NMIEn EQU NMIEnA ; Enable/disable NMI WPCEn EQU WPCEnA ; Write precomp enable SDensEn EQU SDensEnA ; Write precomp enable MotorOn EQU MotorOnA ; Motor on enable Drive0 EQU Drive0A Drive1 EQU Drive1A Drive2 EQU Drive2A Drive3 EQU Drive3A KnownBits EQU Drive0+Drive1+Drive2+Drive3+MotorOn+WPCEn ELSE DPPIADA EQU DPPIA1DA DPPIACRA EQU DPPIA1CRA DPPIADB EQU DPPIA1DB DPPIACRB EQU DPPIA1CRB PIADA EQU DPPIADA+IO ; Side A Data/DDR PIACRA EQU DPPIACRA+IO ; Side A Control. PIADB EQU DPPIADB+IO ; Side A Data/DDR PIACRB EQU DPPIACRB+IO ; Side A Control. ;WD2797 Floppy disk controler, used in DragonDos. DPCMDREG EQU DPCmdRegD ; command/status DPTRKREG EQU DPTrkRegD ; Track register DPSECREG EQU DPSecRegD ; Sector register DPDATAREG EQU DPDataRegD ; Data register CMDREG EQU DPCMDREG+IO ; command/status TRKREG EQU DPTRKREG+IO ; Track register SECREG EQU DPSECREG+IO ; Sector register DATAREG EQU DPDATAREG+IO ; Data register ; Disk IO bitmasks NMIEn EQU NMIEnD ; Enable/disable NMI WPCEn EQU WPCEnD ; Write precomp enable SDensEn EQU SDensEnD ; Write precomp enable MotorOn EQU MotorOnD ; Motor on enable ENDC ORG $C000 ; Disk controler ID, if a cartrage starts with the chars 'DK', then the basic rom routines ; will do a JMP to $C002 to init the cartrage. DC000 FCC /DK/ LC002 BRA DosInit ; ; Jump table containing the addresses of the various dos routines, these should be called by : ; JSR [JumpAddr] rather than jumping directly to the routine. ; FDB SuperDosLowLevel ; Low Level disk IO routine FDB DosHWByte ; Address of data table for low level command FDB SuperDosValidFilename ; Validate filename & copy to disk block. FDB SuperDosOpenFile ; Open A file. FDB SuperDosCreateFile ; Create file (make backup) FDB SuperDosGetFLen ; Get file length FDB SuperDosCloseAll ; Close all open files FDB SuperDosCloseFile ; Close file FDB SuperDosFRead ; Read data from file FDB SuperDosFWrite ; Write data to file FDB SuperDosGetFree ; Get free space on a disk FDB SuperDosDeleteFile ; Delete a file FDB SuperDosProtect ; Protect/unprotect file FDB SuperDosRename ; Rename a file FDB SuperDosGetDirEntry ; Get a directory entry FDB SuperDosFindAndRead ; Find free buffer and read sector FDB SuperDosSyncDir ; Copy updated sectors from track 20 to 16 (sync direcories) FDB SuperDosReadAbsSector ; Read absolute sector FDB SuperDosWriteAbsSector ; Write absolute sector (no verify) ; ; Init Dos ; DosInit LDX #DosAreaStart ; Point to bottom of dos vars area TFR X,Y LC02F CLR ,X+ ; Clear a byte, increment X LEAY -1,Y ; decrement counter BNE LC02F ; loop again if more to do ; X now points to the top of the dos variable area TFR X,D TFR A,B ADDB #$18 STB <BasTextPtr ; Setup new begining of basic JSR >$AA87 LDA <GrfBasePtr ; Adjust graphics ram pages ADDA #$06 STA <GrfTopPtr ; ; Init various low ram stuff, inturrupt vectors, basic stub etc ; LDX #DDE24 ; Point to rom copy of data to copy LC049 LDB ,X+ ; Get byte count byte BEQ LC054 ; zero= end of table, exit copy LDU ,X++ ; Get destination address JSR >UtilCopyBXtoU ; do copy BRA LC049 ; do next LC054 CLR DosHWMaskFF48 ; clear hardware mask COM $0608 ; function unknown LDX #$0683 ; Adjust usr vector base STX <BasUsrBasePtr LDU #BasFCError ; Setup the 10 usr vectors to point to BasFCError LDB #$0A ; do 10 LC064 STU ,X++ ; setup vector DECB ; decrement count BNE LC064 ; loop again if more to do INC DosDefDriveNo BSR LC09D LDX #RamHooks ; Point to ram hooks LDY #RamHookTable ; Point to ram hook table in rom LDD #$137E ; load A with number of vectors B with opcode for JMP LC078 STB ,X+ ; setup jump LDU ,Y++ ; setup vector STU ,X++ DECA ; decrement counter BNE LC078 ; Loop again if more to do LDX #ResetVector ; Setup new reset vector STX <ResetVecAddr ANDCC #$AF ; reenable inturrupts LDX #BasSignonMess ; Print staandard Basic signon message JSR >BasPrintStr JSR >DosDoRestore LDX #DosSignonMess JSR >BasPrintStr JSR >LDC08 JMP >CmdMode ; Jump to normal basic command mode LC09D LDA #WDCmdForceInt ; Force WD2797 to inturrupt & reset STA cmdreg LDX #DosD0Online ; Clear drive online flags LDD <Zero16Bit ; load D with 16 bit zero !!!! STD ,X STD 2,X LDX #Drv0Details+5 ; last byte of drive details for each drive CLR ,X CLR 6,X CLR 12,X CLR $12,X CLR <DosIOInProgress ; Flag to check for timeout LDX #DosDirSecStatus ; Clear Dirctory status, FCBs etc LC0BC CLR ,X+ CMPX #$07F3 BNE LC0BC LDB #$04 ; Count of buffers to process LDX #Buff1Details ; Setup disk buffer initial values LDU #$0800 ; addr of buffer LC0CB CLR 2,X STB 4,X STU 5,X LEAU $0100,U ; Increment addr for next buffer LEAX 7,X ; do next buffer DECB ; done all ? BNE LC0CB ; no : do next RTS FCB $2A FCB $20 LC0DD LDB DosTimeout ; Get timeout STA DosTimeout TSTB ; Timeout ? BNE LC0ED ; no : return LDX #SpinUpDelay ; wait some time for drive to spin up LC0E9 LEAX -1,X BNE LC0E9 LC0ED RTS FCC / / ; ; The following code is quite clever, there are actually multiple code paths. ; This involves having a 2 byte instruction encoded as the oprand to a 3 ; byte instruction eg :- ; ; L00FA CMPX #$C605 ; ; CMPX is one byte long, so a jump to L00DB, will execute the oprand to the ; CMPX, which decodes as LDB #$05 this saves a few bytes by not having LDB #xx, ; BRA label. ; ; There are several examples of this in the Dos ROM ! ; LC0F8 LDB #DosFnReadAddr FCB $8C ; CMPX DosDoWriteTrack LDB #DosFnWriteTrack FCB $8C ; CMPX DosDoWriteSec2 LDB #DosFnWriteSec2 FCB $8C ; CMPX DosDoWriteSec LDB #DosFnWriteSec FCB $8C ; CMPX DosDoReadSec LDB #DosFnReadSec DosDoFuncinB PSHS A LEAS -2,S ; Make room on stack CLR $0600 LC10D LDA #$03 ; retry count ? STD ,S ; save on stack LC111 BSR DosDoSeek ; Try to seek to track BCS LC11D ; Error ? LDB 1,S ; No error, get dos op code STB <DosHWByte ; Save operation to perform BSR SuperDosLowLevel BCC LC159 ; No error LC11D CMPB #$84 BEQ LC148 DEC ,S ; Dec retry count BEQ LC13A ; Any retries left ? LDB ,S ; get retry count LSRB ; gety lsbit BCC LC132 ; on even numbered retry, do recal INC <DskTrackNo ; step out a track BSR DosDoSeek DEC <DskTrackNo ; step back in when retrying BRA LC111 LC132 LDA <DskTrackNo ; Save Track no whilst doing restore BSR DosDoRestore ; Restore & Recalibrate STA <DskTrackNo ; Put track no back BRA LC111 ; Try again LC13A CMPB #$80 BNE LC156 TST $0600 BNE LC156 COM $0600 BRA LC152 ; Something to do with dir track ? LC148 LDA <DskTrackNo ; Get track number CMPA #$14 ; Track 20 ? BNE LC156 ; no : error LDA #$10 ; set track to 16 STA <DskTrackNo LC152 LDB 1,S ; Get Dos op code BRA LC10D ; So same to track 16 LC156 ORCC #$01 ; Flag error FCB $21 ; opcocode for BRN LC159 CLRB ; Flag no error LEAS 2,S ; Drop bytes from stack PULS A,PC ; restore & return ; ; Another LDB, enbeded in CMPX sequence.... ; DosDoReadSec2 LDB #DosFnReadSec2 FCB $8C ; CMPX DosDoSeek LDB #DosFnSeek FCB $8C ; CMPX DosDoRestore LDB #DosFnRestore STB <DosHWByte ; save in hardware byte ; ; Low level hardware command, operation is in $00E8 ; SuperDosLowLevel PSHS CC,A,DP,X,Y,U ORCC #$50 ; Disable inturrupts ROR ,S CLR <DosDiskError ; Flag no disk error LDA <DosHWByte ; get HW byte CMPA #$07 ; Valid op BLS LC178 ; yes : do it ! BRA LC180 ; No: error LC178 JSR >ResetAndStartDrive BCC LC18B ; Error ? LDB #$FD ; yes flag error FCB $8C ; Andothe CMPX saving..... LC180 LDB #$FC ; Set error code ORCC #$01 ; and carry bit ROL ,S STB <DosDiskError ; Flag disk error JMP >LC24D ; Disable IRQ LC18B LDX #PIA0CRA ; Point to PIA CR A LC18E LDA ,X ; Get old value PSHS A ; save on stack ANDA #$FC ; Turn off inturrupt STA ,X++ ; Save it and point to CR B LDA ,X ; Get old CRB value PSHS A ; save it on stack ANDA #$FC ; Disable Inturrupt STA ,X LEAX $1E,X ; Point to next PIA CMPX #PIA1CRB ; PIA1 ? BCS LC18E ; No : do disable LDA PIACRB ; Enable FIRQ from FDC ORA #$37 STA PIACRB LDA #$03 PSHS A LDA <DskSectorNo ; Get disk sector no CMPA #$12 ; >$12, therefore on second side BLS LC1C2 ; no: don't adjust SUBA #$12 ; Calculate sector number on second side LDB #$02 ; Flag as side 2 ORB DosHWMaskFF40 STB DosHWMaskFF40 LC1C2 STA secreg ; Save in sector register STA <DosSectorSeek ; Save sector we are looking for LC1C7 LDY <Zero16Bit LDX <DiskBuffPtr ; Point to buffer LDB <DosHWByte ; Get hardware byte (function code) ASLB ; Calculate offset in table LDU #DosFunctionTable ; Point to function dispatch table LDA <DosSectorSeek ; Get sector we are seeking to CMPA secreg ; Found it yet ? BNE LC1C2 LDA #$FF ; Set DP=$FF, to make IO quicker TFR A,DP LC1DD JSR [B,U] ; Jump to function handler STA <DosDiskError ; Save error code BCC LC1E5 ; No error : check verify BRA LC213 LC1E5 ANDA DosErrorMask ; Mask out error bits we are not interested in STA <DosDiskError ; save errors for later use BEQ LC1FA ; No error : jump ahead LDA <DosHWByte ; Get operation code CMPA #DosFnReadSec2 ; ReadSec2 command ? BEQ LC1F6 DEC ,S ; Dec retry count BNE LC1C7 ; retry LC1F6 ORCC #$01 ; Flag error BRA LC213 LC1FA TST DosErrorMask ; is this write sector ? BPL LC213 ; no : jump ahead LDA <DskTrackNo ; Get track number CMPA #$14 ; Primary Dir track ? BEQ LC210 CMPA #$10 ; Secondary dir track ? BEQ LC210 TST $0608 ANDCC #$FE ; re-enable inturrupts BPL LC213 LC210 LBSR DosDoReadSec2 LC213 LEAS 1,S ROL 4,S LDX #DosD0Track-1 ; Point to drive track table LDB <LastActiveDrv ; Get last used drive ABX ; get pointer to track for current drive LDA trkreg ; Get current track number from WD CMPA <DskTrackNo ; Same as current track no ? BEQ LC235 ; yes : update table LDB DosErrorMask ; is this a seek ? CMPB #$19 BNE LC235 LDB #$FF STB <DosDiskError ROR 4,S ORCC #$01 ; flag error ROL 4,S LC235 STA ,X ; Update current track for current drive LDX #PIA1CRB ; Restore state of PIA from stack LC23A PULS A STA ,X PULS A STA ,--X LEAX -$1E,X ; Do PIA0 CMPX #PIA0CRA BHI LC23A CLR DosHWMaskFF40 ; Clear hardware mask LC24D CLRB ; Flag no error PULS CC,A,DP,X,Y,U ; Restore regs BCC LC289 LDB <DosDiskError ; get last error code BEQ LC289 ; no error : exit BPL LC278 ; ; Work out the dragon error code that coresponds to the hardware ; error reported by WD. ; CMPB #$FC BNE LC260 LDB #$A4 BRA LC287 LC260 CMPB #$FD BNE LC268 LDB #$28 BRA LC287 LC268 CMPB #$FE BNE LC270 LDB #$80 BRA LC287 LC270 CMPB #$FF BNE LC285 LDB #$82 BRA LC287 LC278 TFR B,A LDB #$82 ROLA LC27D ADDB #$02 ROLA TSTA BCS LC287 BNE LC27D LC285 LDB #$A6 LC287 ORCC #$01 LC289 RTS ; ; Reset controler chip, and spin up drive. ; ResetAndStartDrive LDA #WDCmdForceInt ; Force inturrupt STA cmdreg LDA <DosLastDrive ; Get last active drive no BMI LC29A ; invalid, flag error & exit BEQ StartDrive ; Zero ? : yes branch on DECA ; Make drive number 0..3 from 1..4 CMPA #$03 ; Drive valid ? BLS StartDrive2 ; yes : continue LC29A ORCC #$01 ; flag error DosHookRetDevParam RTS ; return ; ; Select drive, and start motor & load track reg. ; StartDrive INC <DosLastDrive ; Flag drive 1 StartDrive2 ORA #NMIEn+MotorOn ; Mask in nmi enable & Motor on bits PSHS A LDA DosHWMaskFF48 ; Get HW byte mask ANDA #$FC ; Mask out drive bits ORA ,S+ ; Mask in drive bits ifne DragonAlpha LBSR AlphaDskCtl ; Write to control reg else STA DskCtl ; Write to control reg endc STA DosHWMaskFF48 ; Resave hardware mask LDX #DosD0Track-1 ; Point to current track table LDA <LastActiveDrv ; Get active drive LDA A,X ; Get drive current track STA trkreg ; Write to controler LDA #$D2 JSR >LC0DD CLRB ; no error ? RTS ; ; Dos function 0 comes here ; DosFunctionRestore CLRA STA >DskTrackNo ; Save Track number BRA LC2D9 ; ; Dos function 1 ; DosFunctionSeek LDA >DskTrackNo ; Get current track no CMPA dptrkreg ; Are we over it ? BNE SeekTrackinA ; no : seek to it CLRA STA DosErrorMask ; Turn off verify TFR A,DP ; Reset DP RTS ; ; Seek to a track, routine will exit either with an error, or via NMI. ; On entry A contains track to seek to. ; SeekTrackinA STA dpdatareg LDA #WDCmdSeek ; Seek command LC2D9 LDB #$19 STB DosErrorMask LDX #DosD0StepRate-1 ; Point to step rate table LDB >LastActiveDrv ; Get active drive ORA B,X ; Mask in that drive's step rate STA dpcmdreg ; save in command reg LC2E8 MUL ; burn up CPU time waiting.... MUL ; NMI will exit this loop LEAY -1,Y ; decrement timeout counter BNE LC2E8 ; count exhausted ? : no keep going BRA LC337 ; yes : error ; ; Dos function 6 : Read address mark ; DosFunctionReadAddr LDA #WDCmdReadAddr ; Read address mark FCB $8C ; CMPX again :) ; ; Dos function 2 : Read sector ; DosFunctionReadSec LDA #WDCmdReadSec ; Read a sector LDB #$3F STB DosErrorMask LDB #$05 ; try 5x$FFFF for timeout ORA DosHWMaskFF40 ; Mask in side etc STA dpcmdreg LC301 LDA dppiacrb ; Check for INT from WD BMI LC311 ; yes : start reading bytes LEAY -1,Y ; decrement timeout count BNE LC301 ; check for int again, if no timeout LDA dppiadb DECB ; decrement retry wait count BNE LC301 ; count=0 ?, no continue waiting BRA LC337 ; yes : error and exit ; ; Read sector/address mark loop, exits with NMI. ; LC310 SYNC ; Syncronise to FIRQ (INT from WD) LC311 LDB dppiadb ; clear iunturrupt LDA dpdatareg ; read byte from WD STA ,X+ ; save in buffer BRA LC310 ; do next byte ; ; Dos function 7 read first two bytes of a sector, used by BOOT command. ; DosFunctionReadSec2 LDX #$004F LDA #$3F STA DosErrorMask LDB #$05 ; Wait 5x$FFFF LDA #WDCmdReadSec ; Read sector command ORA DosHWMaskFF40 ; mask in heads etc STA dpcmdreg ; write it to WD LC32A LDA dppiacrb ; Check for Int from WD BMI LC343 ; yes : start reading LEAY -1,Y ; decrement timeout BNE LC32A ; check again LDA dppiadb ; try clearing int DECB ; decrement outer count BNE LC32A ; keep going ? LC337 LDA #WDCmdForceInt ; Force the WD to abort STA dpcmdreg CLRA ; Reset DP to page 0 TFR A,DP LDA #$FE ; return error ORCC #$01 RTS ; Read data from WD, as normal exited with NMI LC343 LDA dpdatareg ; read byte from WD TST dppiadb ; clear inturrupt STA ,X+ ; save in memory SYNC ; wait for next LDA dpdatareg ; get next byte TST dppiadb ; clear inturrupt STA ,X ; save byte LC350 SYNC ; wait for next TST dppiadb ; clear inturrupt LDA dpdatareg ; read byte BRA LC350 ; do next ; ; Dos function 4 ; DosFunctionWriteSec2 LDA #$5F FCB $8C ; ; Dos function 3 ; DosFunctionWriteSec LDA #$DF STA DosErrorMask BSR DosSetPrecomp ; Setup write precomp LC361 LDA #WDCmdWriteSec ; Write sector ORA DosHWMaskFF40 ; Mask in side etc STA dpcmdreg ; write to WD LDA ,X+ ; fetch first byte to write LC36A LDB dppiacrb ; Int from WD ? BMI LC377 ; yes : start writing LEAY -1,Y ; decrement timeout BNE LC36A ; if not timed out continue waiting BRA LC337 ; timout, abort, and return error ; Write sector loop, NMI breaks out of here LC374 LDA ,X+ ; get byte to write SYNC ; wait for WD LC377 STA dpdatareg ; write byte to WD LDA dppiadb ; clear inturrupt BRA LC374 ; Do next byte ; ; Dos function 5 : Write (format) track ; DosFunctionWriteTrack LDA #$47 STA DosErrorMask BSR DosSetPrecomp ; Set write precomp LDA #WDCmdWriteTrack ; Write (format) track ORA DosHWMaskFF40 ; Mask in head etc STA dpcmdreg LC38B LDD ,X++ ; Get bytes to write A=count, B=byte LC38D SYNC ; Wait for WD CMPA dppiadb ; Clear inturrupt STB dpdatareg ; Write a byte on track DECA ; decrement byte count BNE LC38D ; continue until count=0 LDA ,X+ ; get next SYNC CMPA dppiadb ; Clear int STA dpdatareg ; write to wd BRA LC38B ; do next block ; ; Set write precompensation based on track ; DosSetPrecomp LDA dptrkreg ; Get track CMPA #TrackPrecomp ; track < 16 BLS LC3AB ; no : no write precomp LDA DosHWMaskFF48 ; Enable precomp ORA #WPCEn BRA LC3B0 ; Write to controler LC3AB LDA DosHWMaskFF48 ; Turn off precomp ANDA #~WPCEn ;#$EF LC3B0 ifne DragonAlpha LBSR AlphaDskCtl ; Write control reg else STA DskCtl ; Write control reg endc RTS ; ; Dskinit dispatch routine ; ; Syntax : ; DSKINIT drive,sides,tracks ; CmdDskInit BEQ LC3D9 JSR >GetDriveNoInB STB <$EB JSR >GetCommaThen8Bit BEQ LC3DE DECB CMPB #$01 BHI LC3D6 STB <$F4 JSR >GetCommaThen8Bit BEQ LC3E0 CMPB #$28 BEQ LC3E2 NEG <$F4 CMPB #$50 BEQ LC3E2 LC3D6 JMP >DosPRError LC3D9 LDB $060A STB <$EB LC3DE CLR <$F4 LC3E0 LDB #$28 LC3E2 STB <$F2 JSR >DosHookCloseSingle LBNE LC471 LDX #$0800 STX <$EE JSR DosDoRestore BNE LC471 LDA #$01 STA <$ED JSR >DosDoReadSec2 CMPB #$80 BEQ LC471 LC400 CLR <$F3 CLR <$ED JSR >LC509 JSR >DosDoWriteTrack BCS LC471 TST <$F4 BEQ LC41F LDA #$01 STA <$F3 NEGA STA <$ED JSR >LC509 JSR >DosDoWriteTrack BCS LC471 LC41F INC <$EC LDA <$EC CMPA <$F2 BCS LC400 JSR >DosDoRestore BCS LC471 LC42C JSR >DosDoSeek BCS LC471 CLRA JSR >LC4F2 INC <$EC LDA <$EC CMPA <$F2 BCS LC42C LDX <$EE LDD <Zero16Bit LC441 STD ,X++ CMPX #$0B00 BNE LC441 LDA #$01 STA <$ED LDA #$14 BSR LC45A DEC <$ED DEC <$EE LDA #$10 BSR LC460 BRA LC474 LC45A PSHS A BSR LC49B PULS A LC460 STA <$EC JSR >DosDoWriteSec BCS LC471 INC <$ED INC <$EE JSR >DosDoWriteSec BCS LC471 RTS LC471 JMP >DosHookSysError LC474 INC <$EE LDX <$EE LDD #$890A LC47B STA ,X LEAX $19,X DECB BNE LC47B BSR LC489 LDA #$14 STA <$EC LC489 LDD #$1003 STB <$ED LC48E JSR >DosDoWriteSec BCS LC471 INC <$ED DECA BNE LC48E JMP >LC09D LC49B STA <$EC LDA #$12 LDB #$5A TST <$F4 BEQ LC4A7 ASLB ASLA LC4A7 STA $08FD COMA STA $08FF LDA <$F2 STA $08FC TST <$F4 BNE LC4BC CMPA #$50 BNE LC4BC ASLB LC4BC COMA STA $08FE LDX <$EE LDU #$0900 LDA #$FF LC4C7 STA ,X+ DECB BNE LC4C7 LDD #$242D TST <$F4 BEQ LC4E0 BPL LC4DD LDD #$B4FF LC4D8 STB ,U+ DECA BNE LC4D8 LC4DD LDD #$485A LC4E0 LDU <Zero16Bit PSHS A BSR LC4E8 PULS B LC4E8 LDX <$EE ABX LDA #$FC STU ,X++ STA ,X RTS LC4F2 CLR <$ED TST <$F4 BEQ LC4FA BSR LC4FA LC4FA LDA #$12 LC4FC INC <$ED JSR >DosDoReadSec2 LBCS LC471 DECA BNE LC4FC LC508 RTS LC509 LDU <$EE LDX #DDDFD LDY #DDDEA LDB #$0C BSR LC537 LC516 LDX #DDE09 LDB #$06 BSR LC537 LDA #$01 LDB <$EC STD ,U++ LDB <$F3 STB ,U+ LDB ,Y+ STD ,U++ STA ,U+ LDB #$12 BSR LC537 TST ,Y BNE LC516 LDB #$03 LC537 JMP >UtilCopyBXtoU ; ; GetCommaThen8Bit, scan for comma, error if not found, then fetch 8 bit that follows (or error). ; GetCommaThen8Bit JSR <BasChrGetCurr ; Get current basic char BEQ LC508 ; Any left no: return JSR >VarCKComma ; check for comma JMP >Get8BitorError ; go get it ; ; Backup command dispatch routine ; ; Syntax :- ; BACKUP SrcDrive TO Destdrive,heads,tracks ; ; Stack frame as follows : ; 16 bytes cleared on stack, U points to base of this area as with OS-9. ; ; 0,U Drive number of source ? ; 1,U $00 Source track ; 2,U $01 Source sector ; 3,U $DF5A ??? ; 5,U Source buffer addr ; 7,U Drive number of dest ? ; 8,U $00 Dest track ; 9,U $01 Dest sector ???? ; 10,U $DF6D ??? ; 12,U dest buff addr ; 14,U $12 Sector count per track to copy ? ; 15,U Page number of top of usable RAM CmdBackup LEAS -16,S ; Make tempory space on stack TFR S,U ; Point U at base of tempory space (Like OS-9 !) TFR U,D SUBD #$0040 ; reserve room for working stack SUBD <BasEndInUse ; Check that we have suficient memory available LBMI BasOMError ; NO: report ?OM error CMPA #$01 ; At least 1 sector's worth of ram (256 bytes) available LBLT BasOMError ; NO: report ?OM error STA BupAvailPages,U ; Store memory page count of avaiable RAM LDA #$12 ; Sectors per track, initially 18 for SS disk STA BupSecTrk,U LDD <BasEndInUse ; Get end of RAM in use by basic STD BupSrcBuff,U ; save in buffer pointers for source and dest STD BupDestBuff,U LDD #$DF5A ; Error masks ? STD 3,U LDD #$DF6D STD 10,U LDD #$0001 ; Set source and dest track and sector to 0 & 1 STD BupSrcTrk,U STD BupDestTrk,U LDA DosDefDriveNo ; Get default drive no STA BupSrcDrive,U ; save in source drive STA BupDestDrive,U ; and dest LDY #$02D0 ; sector count 720 sectors=ss40 disk JSR <BasChrGetCurr BEQ DoCmdBackup ; No params backup from default drive to default JSR >Get8BitorError CMPB #$04 ; greater than Max drive (4)? LBHI DosDNError STB BupSrcDrive,U ; Save source drive STB BupDestDrive,U ; and default dest to same drive JSR <BasChrGetCurr ; Get current character from basic BEQ DoCmdBackup ; end of line : yes do backup CMPA #$BC ; is this the "TO" token ? BNE CmdBackupErrorExit ; no : error, exit JSR <BasChrGet ; Get next char, skip over "TO" JSR >Get8BitorError ; Get dest drive in B CMPB #$04 ; Invalid drive no ? LBHI DosDNError ; yes : error, exit STB BupDestDrive,U ; Save in Dest driveno BSR GetCommaThen8Bit ; Skip comma, and get next param BEQ DoCmdBackup ; nothing : do backup CMPB #$02 ; 2 sided disk specified ? BEQ BackupDS ; yes backup double sided CMPB #$01 ; 1 sided disk specified ? BEQ BackupSS ; yes backup single sided CmdBackupErrorExit JMP >BasSNError ; error : exit BackupDS TFR Y,D ; Double sector count if double sided LEAY D,Y ASL BupSecTrk,U ; Set sectors per track for DS disk BackupSS JSR >GetCommaThen8Bit ; Get next param (if any) BEQ DoCmdBackup ; none: continue CMPB #$50 ; Is this an 80 track backup ? BEQ Backup80 CMPB #$28 ; Or a 40 track backup ? BEQ DoCmdBackup BRA CmdBackupErrorExit ; neither error and exit Backup80 TFR Y,D ; Double sector count if 80 track LEAY D,Y DoCmdBackup CLRA BupReadFromSrc LEAY 1,Y ; Get sector count LEAX BupSrcDrive,U ; point to source drive on stack frame BSR LC643 ; read 1 sector LC5D6 LEAY -1,Y ; decrement sector count BNE LC5E0 ; if more sectors, do next BSR BupWriteToDest ; no : write final sectors to destination LEAS $10,U ; Clear stack frame LC5DF RTS ; return to caller LC5E0 CMPA BupAvailPages,U ; Filled all available RAM pages ? BNE LC5F2 ; no : do next sector BSR BupWriteToDest ; Yes : write to destination PSHS D LDD <BasEndInUse ; Get end of basic storage STD BupDestBuff,U ; Save in source and dest buffer pointers STD BupSrcBuff,U PULS D BRA BupReadFromSrc ; Do next sector LC5F2 LDB #$02 BSR LC608 INCA BRA LC5D6 BupWriteToDest TSTA BEQ LC5DF LEAX BupDestDrive,U ; Point to dest drive vars BSR LC643 DC600 LDB #$03 LC602 BSR LC608 DC604 DECA BNE LC602 LC607 RTS LC608 PSHS D LDA BupDrive,X ; Get drive STA <LastActiveDrv ; Set last active drive LDD BupBuff,X STD <DiskBuffPtr ; Setup disk buffer pointer LDD BupTrk,X STD <DskTrackNo ; and disk track no LDB 1,S ; Get function, read or write JSR >DosDoFuncinB BCC LC631 ; no error continue STB $0603 ; Temp storage (error code from dos) LDA 1,S ; Get function, read or write CMPA #DosFnReadSec ; Read ? BRA LC62B PULS D,X ; FCB $35 ; FCB $16 JSR BupWriteToDest ; FCB $BD ; FCB $C5 ; FCB $F9 LC62B LDB $0603 ; Retrieve error code JMP >DosHookSysError LC631 INC 2,X ; Increment sector number LDA 2,X ; check sector number CMPA 14,U ; Done all sectors on track ? BLS LC63F ; No: do next sector LDA #$01 ; Reset sector count to 1 STA 2,X INC 1,X ; Increment track count LC63F INC 5,X ; Move to next page of buffer PULS D,PC ; restore and return LC643 LDB ,U ; get source drive CMPB 7,U ; same as dest drive ? BNE LC607 ; no : continue PSHS A,X,Y,U JSR >TextCls ; clear screen LDX 1,S ; get message pointer LDX 3,X JSR >BasPrintStr ; Print message (insert source/insert dest) LDX #MessPressAnyKey JSR >BasPrintStr ; Print press any key JSR >TextWaitKey ; Wait for a kepress JSR >TextCls PULS A,X,Y,U,PC ; ; Get8BitorError, get non zero 8 bit value in B, or generate error ; Get8BitorError PSHS Y,U JSR >VarGet8Bit ; Get 8 bit value into B TSTB ; B non zero ? BNE LC66E JMP >BasFCError ; No : error LC66E PULS Y,U,PC ; Restore and return LC670 CMPA #$FF LBEQ BasSNError SUBA #$CE BPL LC67D LC67A JMP >BasSNError LC67D CMPA #$1A BCC LC687 LDX #CommandDispatchTable JMP >$84ED LC687 JMP [>$0137] LC68B SUBB #$44 BPL LC691 BRA LC67A LC691 CMPB #$0E BCC LC69D LDX #FunctionDipatchTable JSR [B,X] JMP >$8874 LC69D JMP [>$013C] LC6A1 LDX #$0634 LC6A4 JSR >LD2E2 BNE DosHookSysError CLR 2,X LEAX 7,X CMPX #$0650 BCS LC6A4 LC6B2 RTS ; ; Get drive no in B, returns drive no (from command) in B, ; or causes error if (drive < 0 ) or (drive > 4) ; GetDriveNoInB JSR >VarGet8Bit ; Get 8 bit var TSTB BMI DosDNError ; Minus, invalid drive BNE LC6BC ; greater than 0, check < 4 INCB ; =0 increment so drive 0 = drive 1 LC6BC CMPB #$04 ; Drive in range BLS LC6B2 ; Yes : return it in B DosDNError LDB #$28 FCB $8C ; CMPX DosPRError LDB #$A4 DosHookSysError STB DosErrLast ; save last error code LDX <BasCurrentLine ; Get current line no STX DosErrLineNo ; save for ERR routine JSR >BasResetStack ; reset basic stack CLR <DosIOInProgress ; Flag no IO in progress CLR <BasDeviceNo ; Set device no back to console TST DosErrGotoFlag ; Do we have an error handler ? BPL LC6DF ; Yes, handle errors LDX <BasCurrentLine ; Get current line no LEAX 1,X BNE LC6F9 LC6DF JSR >TextOutCRLF ; Output a return JSR >CasMotorOff ; turn off cassette motor JSR >SndDisable ; disable cassette sound JSR >TextOutQuestion ; output '?' LDX #$82A9 LDB DosErrLast ; Get last error code BPL LC6F6 LDX #DDF2A LC6F6 JMP >$835E LC6F9 LDX #$84DA DC6FC PSHS X LDD $0615 STD <$2B JMP >$85E7 ; ; New reset vector ; ResetVector NOP ; Main ROM checks for reset->NOP CLRA ; Reset DP=0 TFR A,DP JSR >LC09D ; Reset WD, and various Dos vars. CLR DosErrorMask ; reset various flags CLR DosTimeout CLR DosAutoFlag LDA #$35 ; Re-enable NMI STA PIA0CRB JMP >$B44F ; Jump back to Main ROM reset routine ; ; NMI vector, called to break out of read & write loops between 6809 & WD ; This allows the IO routines to handle sectors of all lengths. ; NMISrv LDA dpcmdreg ; Read status register. CLRB ; Reset DP=0 TFR B,DP LEAS 12,S ; Drop registers from stack TSTA ; Setup CC LC726 RTS ; Return to caller ; ; New IRQ vector, used to count down and shut off drives. ; IRQSrv CLRA ; Reset DP=0 TFR A,DP TST <DosIOInProgress ; Doing IO ? BNE LC748 ; Yes: don't time out LDA DosTimeout ; Get timeout byte BEQ LC748 ; Already timed out : exit DECA ; Decrement timeout count STA DosTimeout BNE LC748 ; not zero, don't timeout yet BSR SuperDosSyncDir ; syncronsise directory BNE LC74B ; Error : report it LDA DosHWMaskFF48 ; turn off motor in hw byte ANDA #~MotorOn STA DosHWMaskFF48 ifne DragonAlpha LBSR AlphaDskCtl ; Actually turn off motor else STA DskCtl ; Actually turn off motor endc LC748 JMP >$9D3D ; Jump to BASIC IRQ LC74B JMP >DosHookSysError ; Jump to system error trap LC74E TFR S,D SUBD #$0100 SUBD <$1F BMI LC75B CLRB TSTA BNE LC726 LC75B JMP >$8342 ; ; Copy directory from track 20 to track 16. ; SuperDosSyncDir JSR >LC6A1 LEAS -8,S LEAU ,S LEAY 4,U LDX #$0800 STX <$EE CLR 2,U LDB <$EB STB 1,U LDB #$01 STB ,U CLR <$EB LDX #$06AA LC77B LDB #$12 STB 3,U INC <$EB LC781 LDB 3,U LDA B,X BITA ,U BEQ LC7A7 COMA ANDA B,X STA B,X INC 2,U STB <$ED STB ,Y+ LDB #$14 STB <$EC JSR >DosDoReadSec BNE LC7BE INC <$EE LDB 2,U CMPB #$04 BCS LC7A7 BSR LC7C1 LC7A7 DEC 3,U BNE LC781 TST 2,U BEQ LC7B1 BSR LC7C1 LC7B1 ASL ,U LDA ,U CMPA #$08 BLS LC77B LDA 1,U STA <$EB CLRB LC7BE LEAS 8,U RTS LC7C1 LDA #$10 STA <$EC LC7C5 DEC <$EE LEAY -1,Y LDA ,Y STA <$ED JSR >DosDoWriteSec BEQ LC7D5 LEAS 8,U RTS LC7D5 DEC 2,U BNE LC7C5 RTS FIRQSrv TST PIACRA ; Clear Inturrupt conditions TST PIACRB RTI ; and return LC7E1 BSR SuperDosValidFilename ; Validate filename BNE LC857 ; Error : exit JMP >SuperDosOpenFile ; Open file if valid ; ; Validate filename and copy to current drive block ; SuperDosValidFilename LDA $060A STA $065B CLR $0660 LDU #$0650 LDA #$07 LC7F6 CLR A,U DECA BPL LC7F6 LDA 2,Y STA $065A LDA 1,Y STA $0659 LDA ,Y STA $0658 CMPB #$0E BHI LC855 TSTB BEQ LC855 CMPB #$03 BCS LC83D SUBB #$02 LDA B,X CMPA #$3A BNE LC823 INCB LDA B,X INCB BRA LC82D LC823 ADDB #$02 LDA 1,X CMPA #$3A BNE LC83D LDA ,X++ LC82D SUBA #$30 BLS LC835 CMPA #$04 BLS LC838 LC835 LDB #$1C RTS LC838 STA $065B SUBB #$02 LC83D LDA ,X+ DECB BMI LC8A6 CMPA #$2F BEQ LC84A CMPA #$2E BNE LC866 LC84A CMPU #$0650 BEQ LC855 TST $0660 BEQ LC858 LC855 LDB #$96 LC857 RTS LC858 INC $0660 LDU #$0658 CLR ,U CLR 1,U CLR 2,U BRA LC83D LC866 CMPA #$41 BCS LC87A CMPA #$5A BLS LC886 SUBA #$20 CMPA #$41 BCS LC855 CMPA #$5A BLS LC886 BRA LC855 LC87A CMPA #$2D BEQ LC886 CMPA #$30 BCS LC855 CMPA #$39 BHI LC855 LC886 STA ,U+ CMPU #$065B BNE LC893 TSTB BNE LC855 BRA LC8A6 LC893 CMPU #$0658 BNE LC83D LDA ,X+ DECB BMI LC8A6 CMPA #$2E BEQ LC84A CMPA #$2F BEQ LC84A LC8A6 CLRB RTS ; ; Open a file and copy dir entry into FCB. ; SuperDosOpenFile LDX #$06BD CLR <$F1 LDD $0650 LC8B0 CMPD ,X BNE LC8CB LDU #$0652 LEAY 2,X LDB #$0A LC8BC LDA ,U+ CMPA ,Y+ BNE LC8C8 DECB BNE LC8BC JMP >LC973 LC8C8 LDD $0650 LC8CB LEAX $1F,X INC <$F1 CMPX #$07F3 BCS LC8B0 CLR <$F1 LDX #$06BD LC8DA TST ,X BEQ LC8EB LEAX $1F,X INC <$F1 CMPX #$07F3 BCS LC8DA LDB #$A2 LC8EA RTS LC8EB LDB #$0C TFR X,Y LDU #$0650 LC8F2 LDA ,U+ STA ,Y+ DECB BNE LC8F2 STA <$EB LDU #$0616 LDB #$06 MUL LEAU D,U INC 5,U LDB #$13 LC907 CLR ,Y+ DECB BNE LC907 LDA #$80 STA 15,X CLR $0681 JSR >LD1A3 BNE LC8EA LDY ,X LEAY 2,Y LDA #$10 STA $0660 LC922 STY $065C JSR >SuperDosFindAndRead BNE LC8EA LDX 5,X LEAU $00FA,X STU $065E LC934 LDA ,X BITA #$81 BNE LC954 LDD $0650 CMPD 1,X BNE LC954 LDU #$0652 LEAY 3,X LDB #$09 LC949 LDA ,U+ CMPA ,Y+ BNE LC954 DECB BNE LC949 BRA LC980 LC954 LDA ,X BITA #$08 BNE LC970 INC $0681 LEAX $19,X CMPX $065E BCS LC934 LDY $065C LEAY 1,Y DEC $0660 BNE LC922 LC970 JSR >DosFCBNoToAddr LC973 CLRB TST 15,X BPL LC97A LDB #$A0 LC97A LEAX 12,X LDA <$F1 TSTB RTS LC980 PSHS X JSR >DosFCBNoToAddr PULS Y LDA $0681 STA $1D,X LDA ,Y STA 15,X LDD 12,Y STD $15,X LDA 14,Y STA $17,X STA $19,X CLR $18,X CLR $13,X CLR $14,X LDD 15,Y STD $1A,X LDA $11,Y STA $1C,X LDD #$FFFF STD $10,X STA $12,X BRA LC973 ; ; Read some data from a file into memory ; SuperDosFRead CLR <$F5 STA <$F1 BRA LC9CA LC9C3 LDA #$01 FCB $8C LC9C6 LDA #$FF STA <$F5 LC9CA STY $0661 LBEQ LCAB0 STU $0669 STB $0663 PSHS X JSR >DosFCBNoToAddr LDA 11,X STA <$EB TST <$F5 BNE LC9F0 LDD $0661 ADDD 13,X BCC LC9EE INC 12,X LC9EE STD 13,X LC9F0 PULS X LDB $0663 LC9F5 CLRA NEGB BNE LC9FA INCA LC9FA CMPD $0661 BLS LCA03 LDD $0661 LCA03 PSHS D,X LDU $0669 JSR >LCAB2 BNE LCA1B TFR D,Y LDA 15,X BITA #$02 BEQ LCA1E TST <$F5 BEQ LCA1E LDB #$98 LCA1B LEAS 4,S RTS LCA1E LDX 2,S TST 1,S BNE LCA4E TST <$F5 BEQ LCA2F BPL LCA34 JSR >LD330 BRA LCA37 LCA2F JSR >SuperDosReadAbsSector BRA LCA37 LCA34 JSR >SuperDosWriteAbsSector LCA37 BNE LCA1B INC 2,S LDX $0669 LEAX 1,X STX $0669 DEC $0661 LDD $0661 PULS D,X BNE LC9F5 RTS LCA4E TST <$F5 BMI LCA93 JSR >SuperDosFindAndRead BNE LCA1B STX $0667 LDY 2,S LDB $0663 TST <$F5 BEQ LCA87 LDA #$FF STA 2,X LDX 5,X ABX LDB 1,S LCA6D LDA ,Y+ STA ,X+ DECB BNE LCA6D TFR X,D TSTB BNE LCA93 LDX $0667 PSHS Y JSR >LD2E2 PULS Y BNE LCA1B BRA LCA93 LCA87 LDX 5,X ABX LDB 1,S LCA8C LDA ,X+ STA ,Y+ DECB BNE LCA8C LCA93 LDX $0669 LEAX 1,X STX $0669 TFR Y,X LDD $0661 SUBD ,S++ STD $0661 LEAS 2,S BEQ LCAB0 CLR $0663 CLRB JMP >LC9F5 LCAB0 CLRB RTS LCAB2 JSR >DosFCBNoToAddr LCAB5 TFR U,D SUBD $13,X BCS LCAC9 TSTA BNE LCAC9 CMPB $17,X BCC LCAC9 ADDD $15,X BRA LCADB LCAC9 TFR U,D SUBD $18,X BCS LCADE TSTA BNE LCADE CMPB $1C,X BCC LCADE ADDD $1A,X LCADB ORCC #$04 RTS LCADE PSHS U BSR LCB20 BNE LCAEF LDD $066B CMPD $066D BHI LCAF1 LDB #$9A LCAEF PULS U,PC LCAF1 SUBB 2,Y SBCA #$00 STD $13,X LDA 2,Y STA $17,X LDD ,Y STD $15,X TFR Y,D PSHS U SUBD ,S++ PULS U CMPB #$13 BCC LCB1E LDA 5,Y STA $1C,X LDD 3,Y STD $1A,X LDD $066B STD $18,X LCB1E BRA LCAB5 LCB20 PSHS X CLR $066C CLR $066B STU $066D LDB $1D,X STB $0682 JSR >SuperDosGetDirEntry BNE LCB7C TFR X,U PULS X LEAY 12,U LDB #$04 LCB3E LDA ,U ANDA #$20 BEQ LCB47 LDA $18,U LCB47 PSHS D LCB49 LDD $066B ADDB 2,Y ADCA #$00 STD $066B CMPD $066D BHI LCB7B LEAY 3,Y DEC 1,S BNE LCB49 LDB ,S BEQ LCB79 LEAS 2,S STB $0682 PSHS X JSR >SuperDosGetDirEntry TFR X,U PULS X BNE LCB7E LEAY 1,U LDB #$07 BRA LCB3E LCB79 LEAY -3,Y LCB7B CLRB LCB7C LEAS 2,S LCB7E RTS ; ; Write data from memory to file, verify if verify on. ; SuperDosFWrite STA <$F1 STX $0671 STU $0673 STY $0675 STB $0677 JSR >DosFCBNoToAddr LDB 11,X STB <$EB LCB95 JSR >SuperDosGetFLen BEQ LCBA8 CMPB #$9C BEQ LCB9F RTS LCB9F LDA <$F1 JSR >SuperDosCreateFile BNE LCB7E BRA LCB95 LCBA8 CMPU $0675 BHI LCBB8 BCS LCBB5 CMPA $0677 BCC LCBB8 LCBB5 LDB #$9A LCBB7 RTS LCBB8 PSHS A LDD $0673 ADDB $0677 ADCA $0676 PSHS B TFR A,B LDA $0675 ADCA #$00 PSHS U SUBD ,S++ TFR B,A PULS B BHI LCBDE BCS LCBE6 SUBB ,S BCC LCBE2 BRA LCBE6 LCBDE SUBB ,S SBCA #$00 LCBE2 BSR LCC12 BNE LCC0F LCBE6 LEAS 1,S LDB $0677 LDX $0671 LDY $0673 LDU $0675 JSR >LC9C3 BNE LCBB7 TST $0608 BEQ LCBB7 LDB $0677 LDX $0671 LDY $0673 LDU $0675 JMP >LC9C6 LCC0F LEAS 1,S RTS LCC12 LEAS -12,S STD ,S STD 10,S LDA #$01 STA <$F6 JSR >LD1A3 LBNE LCD08 STX 8,S JSR >DosFCBNoToAddr LDB $1E,X JSR >SuperDosGetDirEntry LBNE LCD08 STX 4,S LDU $067F LDA #$FF STA 2,U CLRA LDB $18,X BNE LCC42 INCA LCC42 ADDD ,S TSTB BNE LCC48 DECA LCC48 STD ,S TSTA LBEQ LCCF0 LDB #$04 LEAY 12,X LDA ,X BITA #$01 BEQ LCC5D LEAY 1,X LDB #$07 LCC5D TST 2,Y BNE LCC75 LDD #$FFFF STD 6,S LEAY -3,Y STY 2,S LDX 8,S TST 2,X LBNE LCD0E BRA LCCB3 LCC75 TST 2,Y BEQ LCC7E LEAY 3,Y DECB BNE LCC75 LCC7E LEAY -3,Y LDD ,Y ADDB 2,Y ADCA #$00 STD 6,S STY 2,S LDX 8,S TST 2,X BEQ LCCB3 LDD 6,S SUBD 3,X BEQ LCCC3 JSR >LCD57 BEQ LCCA2 CMPB #$94 BNE LCD08 BRA LCD0E LCCA2 LDX 8,S PSHS A,U LDB 2,X LDX 3,X JSR >LD03B PULS A,U BNE LCD08 BRA LCCB8 LCCB3 JSR >LCD57 BNE LCD08 LCCB8 LDX 8,S STU 3,X STA 2,X CMPU 6,S BNE LCD0E LCCC3 LDA ,S CMPA 2,X BCS LCCCB LDA 2,X LCCCB LDY 2,S PSHS A ADDA 2,Y BCC LCCD8 PULS A BRA LCD0E LCCD8 STA 2,Y LDA 2,X SUBA ,S STA 2,X LDD 3,X ADDB ,S ADCA #$00 STD 3,X LDA 1,S SUBA ,S+ STA ,S BNE LCCB3 LCCF0 LDX 4,S TFR X,U JSR >DosFCBNoToAddr LDD 10,S ADDD $11,X BCC LCD01 INC $10,X LCD01 STD $11,X STB $18,U CLRB LCD08 LEAS 12,S CLR <$F6 TSTB RTS LCD0E LDD 2,S TFR D,Y SUBD 4,S CMPB #$13 BCC LCD23 LEAY 3,Y STY 2,S LCD1D LDD 3,X STD ,Y BRA LCCC3 LCD23 LDA #$01 JSR >LD123 BNE LCD08 LDY 4,S STA $18,Y LDB ,Y ORB #$20 STB ,Y LDB #$FF STB 2,X LDB #$01 STB ,U STU 4,S JSR >DosFCBNoToAddr STA $1E,X LEAY $19,U LDB #$18 LCD4B CLR ,-Y DECB BNE LCD4B STY 2,S LDX 8,S BRA LCD1D LCD57 STS $0601 LEAS -9,S CLR 4,S JSR >LD1A3 LBNE LCE5A LDY ,X LDU $11,S STU 5,S LEAX 1,U BEQ LCD81 BSR LCDB2 BNE LCDAF CMPU #$05A0 BCS LCD81 LDU #$058E BRA LCDA2 LCD81 LEAU ,Y LCD83 LDA #$FF STA ,S LCD87 LEAU -$12,U STU -2,S BMI LCD9A BSR LCDB2 BEQ LCD83 TST ,S BPL LCDAF STU ,S BRA LCD87 LCD9A LDU ,S STU -2,S BPL LCDAF LEAU ,Y LCDA2 LEAU $12,U CMPU #$0B40 BHI LCDB5 BSR LCDB2 BEQ LCDA2 LCDAF JMP >LCE34 LCDB2 JMP >LCE60 LCDB5 LDA #$FF STA 7,S LDA 4,S LCDBB LDU <Zero16Bit LSRA BCS LCDC3 LDU #$05A0 LCDC3 BSR LCDB2 LDB #$B4 LCDC7 LDA ,X+ BNE LCDD2 LEAU 8,U DECB BNE LCDC7 BRA LCE13 LCDD2 CLRB STB 8,S PSHS U LCDD7 INCB LDA ,X+ INCA BEQ LCDD7 CMPB 10,S BLS LCDE5 STB 10,S STU ,S LCDE5 LEAX -1,X LDA #$08 MUL LEAU D,U LCDEC CLRB LDA ,X+ BNE LCDD7 LEAU 8,U TFR X,D CMPB #$B4 BCS LCDEC PULS U BSR LCE60 LEAU 8,U LDA ,X LDB 8,S CMPB #$01 BHI LCE0C LCE07 LEAU -1,U ASLA BCC LCE07 LCE0C ASLA BCC LCE13 LEAU -1,U BRA LCE0C LCE13 CMPB #$02 BCC LCE34 CMPB 7,S BHI LCE34 LDA 7,S INCA BNE LCE2A STB 7,S STU 5,S LDA 4,S EORA #$03 BRA LCDBB LCE2A LDU 5,S BSR LCE60 BNE LCE34 LDB #$94 BRA LCE5A LCE34 BSR LCE60 CLRB LCE37 INCB BEQ LCE51 PSHS A COMA ANDA ,X STA ,X PULS A ASLA BCC LCE4A LDA #$01 LEAX 1,X LCE4A BITA ,X BNE LCE37 TFR B,A LCE51 EQU *+1 CMPX #$86FF LDX 2,S LDB #$FF STB 2,X CLRB LCE5A LDS $0601 TSTB RTS LCE60 PSHS Y,U LDA #$01 CMPU #$05A0 BCS LCE71 LEAY 1,Y LEAU $FA60,U ASLA LCE71 PSHS U BITA 12,S BNE LCE84 STA 12,S JSR >SuperDosFindAndRead BNE LCE5A STX 10,S LDA #$FF STA 2,X LCE84 LDX 10,S LDX 5,X PULS D LSRA RORB LSRA RORB LSRA RORB LDA 3,S ANDA #$07 LDU #$A672 NEGA LDA A,U ABX BITA ,X PULS Y,U,PC ; ; Get length of a file ; SuperDosGetFLen STA <$F1 BSR DosFCBNoToAddr TST 15,X BPL LCEAA LDB #$9C LCEA9 RTS LCEAA LDA $12,X LDU $10,X LEAY 1,U BNE LCED0 JSR >LCB20 BNE LCEA9 LDB $0682 STB $1E,X LCEBF LDA $18,U STA $12,X LDU $066B TSTA BEQ LCECD LEAU -1,U LCECD STU $10,X LCED0 CLRB RTS ; ; Converts current FCB number in DosCurrCtrlBlk to the FCB's address ; Exits with : ; X=FCB address ; DosFCBNoToAddr PSHS D LDA <DosCurrCtrlBlk ; Get current FCB no LDB #DosFCBLength ; FCB len ? MUL ; Work out offset to FCB TFR D,X LEAX DosFCB0Addr,X ; Get offset of FCB PULS D,PC ; ; Close all open files. ; SuperDosCloseAll LDA #$09 STA <$F1 LCEE5 BSR DosFCBNoToAddr LDA 11,X CMPA <$EB BNE LCEF1 BSR LCEF9 BNE LCEA9 LCEF1 DEC <$F1 BPL LCEE5 LCEF5 CLRB RTS ; ; Close a single file ; SuperDosCloseFile STA <$F1 LCEF9 BSR DosFCBNoToAddr TST ,X BEQ LCEF5 LDA <$EB PSHS A LDA 11,X STA <$EB CLR ,X JSR >LD1A3 BNE LCF34 TST 5,X BEQ LCF19 DEC 5,X BEQ LCF19 CLRB BRA LCF34 LCF19 LDB 2,X BEQ LCF2A PSHS X LDX 3,X JSR >LD03B PULS X BNE LCF34 CLR 2,X LCF2A JSR >SuperDosSyncDir LDU #$0696 LDA <$EB CLR A,U LCF34 PULS A STA <$EB TSTB LCF39 RTS ; ; Create a file, with backup. ; SuperDosCreateFile STA $067D JSR >DosFCBNoToAddr STX $0678 LDB #$0C LDU #$0650 LCF48 LDA ,X+ STA ,U+ DECB BNE LCF48 LDD -4,U STD $067A LDA -2,U STA $067C LDD #$4241 STD -4,U LDA #$4B STA -2,U TST 3,X BMI LCF92 JSR >SuperDosOpenFile CMPB #$A0 BEQ LCF74 TSTB BNE LCF39 BSR SuperDosDeleteFile BNE LCF39 LCF74 JSR >LCEF9 NOP LDA $067D TST [$0678] BEQ LCF92 JSR >SuperDosRename BEQ LCF8A CMPB #$9C BNE LCF39 LCF8A LDA $067D JSR >SuperDosCloseFile BNE LCF39 LCF92 LDD $067A STD $0658 LDA $067C STA $065A JSR >SuperDosOpenFile BEQ LCFA7 CMPB #$A0 BNE LCF39 LCFA7 STA <$F1 JSR >DosFCBNoToAddr TST 15,X BMI LCFB3 LDB #$9E LCFB2 RTS LCFB3 CLRA JSR >LD123 BNE LCFB2 JSR >DosFCBNoToAddr STA $1D,X STA $1E,X LDB #$1C LCFC4 CLR B,X DECB CMPB #$0C BCC LCFC4 LDB #$18 LCFCD CLR B,U DECB BPL LCFCD LEAU 1,U LDB #$0B LCFD6 LDA ,X+ STA ,U+ DECB BNE LCFD6 CLRB RTS ; ; Delete a file from disk. ; SuperDosDeleteFile JSR >LD0E4 BNE LCFB2 PSHS X LDB $1D,X JSR >LD237 BNE LD035 TFR X,U PULS X LEAY 12,U LDB #$04 LCFF6 LDA ,U ANDA #$20 BEQ LCFFF LDA $18,U LCFFF PSHS D LDB #$81 STB ,U PSHS X LD007 LDX ,Y++ LDB ,Y+ BEQ LD017 PSHS Y BSR LD03B PULS Y LBNE LCA1B LD017 DEC 3,S BNE LD007 PULS X LDB ,S BEQ LD034 LEAS 2,S PSHS X JSR >LD237 TFR X,U PULS X BNE LCFB2 LEAY 1,U LDB #$07 BRA LCFF6 LD034 CLRB LD035 CLR <$F6 LEAS 2,S TSTB RTS LD03B CLRA PSHS A PSHS D,X JSR >LD1A3 BNE LD0C2 LDY ,X LDD 2,S SUBD #$05A0 BCS LD05A LEAY 1,Y STD 2,S ADDD ,S SUBD #$05A0 BCC LD0C0 LD05A LDD 2,S ADDD ,S SUBD #$05A0 BCS LD06A STB 4,S NEGB ADDB 1,S STB 1,S LD06A JSR >SuperDosFindAndRead BNE LD0C2 LDA #$FF STA 2,X LDD 2,S LSRA RORB ROR ,S LSRA RORB ROR ,S LSRA RORB ROR ,S LDX 5,X ABX LDB #$01 LDA ,S BEQ LD08F LD08A ASLB SUBA #$20 BNE LD08A LD08F STB ,S LDB 1,S LD093 LDA ,S ORA ,X STA ,X DECB BEQ LD0B4 ASL ,S BCC LD093 LDA #$01 STA ,S LEAX 1,X LD0A6 CMPB #$10 BCS LD093 LDA #$FF STA ,X+ STA ,X+ SUBB #$10 BNE LD0A6 LD0B4 LDX #$05A0 LEAS 4,S LDB ,S+ BEQ LD0C4 JMP >LD03B LD0C0 LDB #$90 LD0C2 LEAS 5,S LD0C4 RTS ; ; Protect/unprotect a file. ; SuperDosProtect STA <$F1 JSR >DosFCBNoToAddr LDA 15,X BMI LD0F4 TSTB BEQ LD0D4 ORA #$02 LD0D4 EQU *+1 CMPX #$84FD STA 15,X LDB $1D,X JSR >LD237 BNE LD0C4 STA ,X CLRB RTS LD0E4 STA <$F1 JSR >DosFCBNoToAddr LDA 15,X BMI LD0F4 BITA #$02 BEQ LD122 LDB #$98 RTS LD0F4 LDB #$9C RTS ; ; Rename a file. ; SuperDosRename BSR LD0E4 BNE LD122 LDB #$0B LDU #$0650 LD100 LDA ,U+ STA ,X+ DECB BNE LD100 LEAX -11,X LDB $1D,X JSR >LD237 BNE LD122 LDU #$0650 LDB #$0B LEAX 1,X LD118 LDA ,U+ STA ,X+ DECB BNE LD118 CLR <$F6 CLRB LD122 RTS LD123 CLRB STD $067D BSR LD1A3 BNE LD122 LDX ,X PSHS X LEAX 2,X LD131 STX $066F TFR X,Y JSR >SuperDosFindAndRead BNE LD170 LDU 5,X LDB #$0A TST $067D BEQ LD149 CLR $067D BRA LD14D LD149 LDA ,U BMI LD168 LD14D INC $067E LEAU $19,U DECB BNE LD149 JSR >LDFF3 LEAX 1,X TFR X,D SUBD ,S CMPB #$12 BCS LD131 LEAS 2,S LDB #$92 RTS LD168 LDA #$FF STA 2,X LDA $067E CLRB LD170 LEAS 2,S RTS ; ; Get free space on disk ; SuperDosGetFree BSR LD1A3 BNE LD187 LDY ,X LDX <Zero16Bit BSR LD188 BNE LD187 LEAY 1,Y BSR LD188 BNE LD187 CLRB LD187 RTS LD188 PSHS X JSR >SuperDosFindAndRead BNE LD170 LDU 5,X PULS X LDB #$B4 LD195 LDA ,U+ LD197 LSRA BCC LD19C LEAX 1,X LD19C TSTA BNE LD197 DECB BNE LD195 RTS LD1A3 LDX #$061C LDU #$0696 LDB #$06 LDA <$EB LEAU A,U DECA MUL LEAX D,X TST ,U BNE LD1FF LDY #$0168 LDA #$12 STA $10,U TST 12,U BNE LD1CA JSR >DosDoRestore BCC LD1CA RTS LD1CA PSHS X JSR >SuperDosFindAndRead BNE LD170 CLR 2,X LDX 5,X LDD $00FE,X COMA COMB CMPD $00FC,X PULS X BNE LD201 STB $10,U STA 12,U DEC ,U CMPB #$12 BEQ LD1F0 CLRB LD1F0 PSHS B CLR 2,X LDD #$0168 TST ,S+ BNE LD1FD ASLB ROLA LD1FD STD ,X LD1FF CLRB RTS LD201 LDB #$90 RTS ; ; Get directory entry. ; SuperDosGetDirEntry LDA #$FF LD206 INCA SUBB #$0A BCC LD206 ADDB #$0A PSHS D BSR LD1A3 LBNE LCB7C LDD ,X ADDD #$0002 ADDB ,S+ ADCA #$00 STD $066F TFR D,Y BSR SuperDosFindAndRead PULS A BNE LD236 TFR X,U LDB #$19 MUL STX $067F LDX 5,X LEAX D,X CLRB LD236 RTS LD237 PSHS D BSR SuperDosGetDirEntry LBNE LCB7C LDY $067F LDA #$FE STA 2,Y CLRB PULS D,PC LD24A LDX #$0634 LDU <Zero16Bit LDB #$04 LD251 LDA 2,X BEQ LD26C CMPA #$55 BEQ LD26E CMPY ,X BNE LD268 LDA <$EB CMPA 3,X BNE LD268 BSR LD2CB CLRB RTS LD268 TST 2,X BNE LD26E LD26C TFR X,U LD26E LEAX 7,X DECB BNE LD251 LDB #$FF RTS ; ; Find a free buffer and read sector. ; SuperDosFindAndRead PSHS U BSR LD24A LBEQ LCB7C LEAX ,U PULS U BNE LD288 BSR LD2A2 BNE LD2A1 LD288 CLR 2,X STY ,X LDA <$EB STA 3,X PSHS X LDX 5,X JSR >SuperDosReadAbsSector PULS X BNE LD2A1 LDA #$01 STA 2,X CLRB LD2A1 RTS LD2A2 PSHS D,Y,U LD2A4 LDX #$0634 LDB #$04 LD2A9 LDA 4,X CMPA #$01 BEQ LD2B4 LEAX 7,X DECB BNE LD2A9 LD2B4 BSR LD2CB LDA 2,X CMPA #$55 BEQ LD2A4 INCA BNE LD2C3 DEC 2,X BRA LD2A4 LD2C3 BSR LD2E2 BEQ LD2C9 STB 1,S LD2C9 PULS D,Y,U,PC LD2CB LDB #$04 LDA 4,X LDU #$0634 LD2D2 CMPA 4,U BHI LD2D8 DEC 4,U LD2D8 LEAU 7,U DECB BNE LD2D2 LDA #$04 STA 4,X RTS LD2E2 TST 2,X BMI LD2E8 CLRB RTS LD2E8 LDA <$EB PSHS A PSHS X LDA #$FF STA <$F6 CLR 2,X LDA 3,X STA <$EB LDY ,X LDX 5,X BSR SuperDosWriteAbsSector PULS X BNE LD31F LDA <$EC CMPA #$14 BNE LD31A LDU #$A673 LDA <$EB NEGA LDA A,U LDU #$06AA LDB <$ED ORA B,U STA B,U LD31A LDA #$01 STA 2,X CLRB LD31F PULS A STA <$EB CLR <$F6 TSTB RTS ; ; Write absolute sector. ; SuperDosWriteAbsSector BSR LD33E JSR >DosDoWriteSec2 LD32C LDX <$EE TSTB RTS LD330 BSR LD33E JSR >DosDoReadSec2 BRA LD32C ; ; Read absolute sector. ; SuperDosReadAbsSector BSR LD33E JSR >DosDoReadSec BRA LD32C LD33E STX <$EE LDX #$06A6 LDB <$EB LDB B,X CLRA PSHS D CLR ,-S TFR Y,D LD34E INC ,S SUBD 1,S BPL LD34E ADDB 2,S LDA ,S DECA INCB LEAS 3,S STD <$EC RTS ; ; Copy command dispatch routine ; ; Syntax : ; COPY filespec TO filespec ; ; Stack setup as follows ; ; offset size purpose ; 0 1 Source FCB number ; 1 1 Destination FCB number ; 2 2 Buffer pointer ? ; 4 3 File pointer pos ; CmdCopy JSR >SuperDosCloseAll ; Close all files & devices BNE LD39F ; Error : exit LEAS -7,S ; Make room on stack ; ; Make a buffer for copying the file. ; TFR S,D ; move to D SUBD #$0100 ; Make room for 1 sector SUBD <BasEndInUse ; Will we overwrite basic ? LBMI BasOMError ; yes : error, exit CLRB TSTA ; overwrite zero page ? LBEQ BasOMError ; yes : error, exit STD 2,S ; IO buffer pointer JSR >DosGetFilenameAndOpen ; Get source filename FCB number in A BNE LD39F ; Error : exit STA ,S ; save FCB no of source JSR >SuperDosGetFLen ; Get file length BNE LD39F ; Error : exit JSR <BasChrGetCurr ; scan current char from params CMPA #$BC ; "TO" token LBNE BasSNError ; no : Error JSR <BasChrGet ; Get next character JSR >DosGetFilenameAndOpen ; Get dest filename FCB number in A BEQ LD398 ; No error : continue CMPB #$A0 BNE LD39F ; Error : exit LD398 STA 1,S ; Save destination FCB number JSR >SuperDosCreateFile ; re-write destination file BEQ LD3A2 ; no error : continue LD39F JMP >DosHookSysError ; Error : exit LD3A2 LDA ,S ; Get source FCB no STA <DosCurrCtrlBlk ; Save current FCB JSR >DosFCBNoToAddr ; Get FCB address ; Compare file pointer position with file length for source file LDD 12,X CMPD $10,X BCS LD3B8 LDA 14,X CMPA $12,X BEQ LD408 LD3B8 LDU 12,X LDA 14,X STA 6,S STU 4,S LDD 2,S ADDD 5,S STD 5,S BCC LD3CA INC 4,S LD3CA LDA 4,S SUBA $10,X BCS LD3DF LDD 5,S SUBD $11,X BLS LD3DF LDD $11,X SUBD 13,X STD 2,S LD3DF LDA ,S ; Get source FCB no LDU 12,X ; Get number of bytes to read LDB 14,X ; Y:B=position to read from LDY 2,S LDX <BasEndInUse ; Point to end of basic memory JSR >SuperDosFRead ; Read from source file BNE LD39F ; error : exit LDA 1,S ; Get destination FCB No STA <DosCurrCtrlBlk ; Save in current ctrl block no JSR >DosFCBNoToAddr ; Get addres of Dest FCB LDY $10,X LDB $12,X LDU 2,S LDX <BasEndInUse ; Point to end of basic memory JSR >SuperDosFWrite ; Write to destination BNE LD39F ; Error : exit BRA LD3A2 ; continue copying LD408 JSR >SuperDosCloseAll ; Close all files, finished copy BNE LD39F ; Error ! LEAS 7,S ; drop stack frame RTS ; ; Merge command dispatch routine. ; ; Syntax : ; MERGE filespec ; CmdMerge JSR >LD6CB BNE LD39F BSR LD494 BNE LD39F CMPA #$01 BNE LD45B LDU <$1B LDY <$19 PSHS Y,U LEAU 1,U STU <$19 JSR >LD507 PULS X,U STU <$1B STX <$19 LEAU 1,U LD433 LDD ,U++ BEQ LD455 LDD ,U++ STD $02DA STD <$2B CLRB LDX #$02DC LD442 INCB LDA ,U+ STA ,X+ BNE LD442 ADDB #$04 STB <$03 PSHS U BSR LD45E PULS U BRA LD433 LD455 CLR $0611 JMP >LD4E4 LD45B JMP >$B848 LD45E JSR >$83FF BCS LD475 LDD <$47 SUBD ,X ADDD <$1B STD <$1B LDU ,X LD46D LDA ,U+ STA ,X+ CMPX <$1B BNE LD46D LD475 LDD <$1B STD <$43 ADDB <$03 ADCA #$00 STD <$41 JSR >$831C LDU #$02D8 LD485 LDA ,U+ STA ,X+ CMPX <$45 BNE LD485 LDX <$41 STX <$1B JMP >$83ED LD494 LDX #$0650 LDY #$0009 LDU <Zero16Bit CLRB LDA <$F1 JSR >SuperDosFRead BNE LD4B6 LDA #$55 LDX #$0650 CMPA ,X BNE LD45B COMA CMPA 8,X BNE LD45B LDA 1,X CLRB LD4B6 RTS DosHookRun CLR $0614 CLR $0619 CLR $0617 CLR $0618 CMPA #$22 BEQ LD4C9 TSTA RTS LD4C9 LEAS 2,S LDB #$01 FCB $21 ; ; Load command dispatch routine ; ; Syntax : ; LOAD filespec ; LOAD filespec,offset ; CmdLoad CLRB STB $0611 JSR >LD6CB BNE LD4DB BSR LD494 BEQ LD4DE LD4DB JMP >DosHookSysError LD4DE CMPA #$01 BNE LD529 BSR LD507 LD4E4 CLR <$F6 LDX <$19 JSR >$85EE LDX <$27 STX <$23 LDX <$1B STX <$1D STX <$1F LD4F5 JSR >$8514 JSR >$8434 TST $0611 BEQ LD503 JMP >$849F LD503 CLRA JMP >$8371 LD507 LDD 4,X TFR D,Y ADDD <$19 STD <$1F LDB #$40 JSR >$8331 LD514 LDA <$F1 LDB #$09 LDX <$19 LDU <Zero16Bit JSR >SuperDosFRead BNE LD4DB JSR >$83ED LEAX 2,X STX <$1B RTS LD529 CMPA #$02 DD52E EQU *+3 LBNE LD45B LDU 6,X STU <$9D JSR <$A5 BEQ LD549 PSHS X BSR LD5AA TFR X,U PULS X LDD 6,X SUBD 2,X STU 2,X ADDD 2,X STD <$9D LD549 LDY 4,X LDA <$F1 LDB #$09 LDU <Zero16Bit LDX 2,X JSR >SuperDosFRead BNE LD5A1 TST $0611 BEQ LD5A9 JMP [>$009D] ; ; Save command dispatch routine. ; ; Syntax : ; SAVE filespec ; SAVE filespec,start_addr,end_addr,entry_addr ; CmdSave JSR >$8887 JSR >$8877 JSR <$A5 BEQ LD5B0 LDY #DosExtBin BSR LD598 BSR LD5AA STX $0652 BSR LD5AA TFR X,D CMPX $0652 LBCS DosPRError SUBD $0652 LBMI BasFCError ADDD #$0001 STD $0654 BSR LD5AA STX $0656 LDB #$02 BRA LD5CA LD598 JSR >LD6DF BEQ LD5A4 CMPB #$A0 BEQ LD5A4 LD5A1 JMP >DosHookSysError LD5A4 JSR >SuperDosCreateFile BNE LD5A1 LD5A9 RTS LD5AA JSR >$89AA JMP >$8E83 LD5B0 LDY #DosExtBas BSR LD598 LDX <$19 STX $0652 LDD <$1B SUBD <$19 STD $0654 LDX #BasFCError STX $0656 LDB #$01 LD5CA LDX #$0650 LDA #$55 STA ,X COMA STA 8,X STB 1,X LDA <$F1 CLRB LDY <Zero16Bit LDU #$0009 JSR >SuperDosFWrite BNE LD5A1 LDA <$F1 LDB #$09 LDX $0652 LDU $0654 LDY <Zero16Bit JSR >SuperDosFWrite BNE LD5A1 CLR <$F6 RTS ; ; Chain command dispatch routine. ; ; Syntax : ; CHAIN filespec ; CmdChain BSR LD670 JSR >LD6CB BNE LD5A1 JSR >LD494 BNE LD5A1 CMPA #$01 LBNE LD45B JSR <$A5 BEQ LD61E JSR >$89AA JSR >$869A BSR LD629 LDD <$2B JSR >$85E7 BRA LD626 LD61E BSR LD629 LDU <$19 LEAU -1,U STU <$A6 LD626 JMP >LD4F5 LD629 LDD $0654 TFR D,Y ADDD <$19 SUBD <$1B PSHS D ADDD <$1F STD <$1F LDB #$40 STB $0611 JSR >$8331 LDD ,S BPL LD653 LDX <$1B LEAU D,X LD648 LDA ,X+ STA ,U+ CMPU <$1F BLS LD648 BRA LD661 LD653 LDX <$1F LEAX 1,X LEAU D,X LD659 LDA ,-X STA ,-U CMPX <$1B BCC LD659 LD661 LDD ,S ADDD <$1B STD <$1B PULS D ADDD <$1D STD <$1D JMP >LD514 LD670 LDX <BasVarsPtr ; Get pointer to start of vars LEAX 2,X LD674 CMPX <BasArrayPtr ; More than 2 bytes of vars ? BCC LD682 TST -1,X BPL LD67E BSR LD6AA LD67E LEAX 7,X BRA LD674 LD682 LDU <BasArrayPtr ; Array pointer LD684 CMPU <BasEndInUse ; any arrays in use ? BCC LD6A7 LDD 2,U LEAX D,U PSHS X TST 1,U BPL LD6A3 LDB 4,U CLRA ASLB LEAX D,U LEAX 5,X LD69B BSR LD6AA LEAX 5,X CMPX ,S BCS LD69B LD6A3 PULS U BRA LD684 LD6A7 JMP >$8CD7 LD6AA PSHS X,U CMPX <$21 BCC LD6C3 LDB ,X BEQ LD6C3 JSR >$8CB3 TFR X,U LDY ,S LDX 2,Y STU 2,Y JSR >UtilCopyBXtoU LD6C3 PULS X,U,PC LD6C5 LDY #DosExtDat BRA LD6D5 LD6CB LDY #DosExtBas BRA LD6D5 ; ; Get a filename from Dos and open it ; Takes a string supplied on command name, fetches it and ; tries to open the file of that name. ; ; ; Exits with :- ; A=FCB number for opened file ; B= Error code ? ; Y=ptr to error code table ! ; DosGetFilenameAndOpen LDY #DosErrorCodeTable ; Point to error messages LD6D5 PSHS Y JSR >VarGetStr ; get string into temp variable JSR >VarGetExpr ; Get address of string in FAC PULS Y LD6DF LDX <BasStrAddr ; Get string address PSHS X LDB ,X ; Get string length LDX 2,X ; Get pointer to actual string data JSR >LC7E1 ; Validate & open file (if valid) PULS X PSHS D JSR >VarDelVar ; Delete tempory variable PULS D TSTB ; Get error? RTS DosHookCloseSingle LDA #$09 STA <$F1 LD6F9 JSR >LCEF9 BNE LD717 DEC <$F1 BPL LD6F9 LD702 CLR <$F6 CMPX #$39FD LD707 CLRA CLRB STD $0697 STD $0699 RTS LD710 BSR LD707 JMP >$BA77 LD715 BEQ LD702 LD717 JMP >DosHookSysError LD71A JSR >LCEF9 BRA LD715 ; ; Create command dispatch routine. ; ; Syntax : ; CREATE filespec,length ; CmdCreate BSR LD6C5 BEQ LD72B CMPB #$9E BEQ LD72B CMPB #$A0 BNE LD717 LD72B LDA <$F1 JSR >SuperDosCreateFile BNE LD717 JSR <$A5 BEQ LD76C JSR >$89AA JSR >$8887 JSR >LD879 LD73F TST <$51 BEQ LD755 LDD #$FF00 BSR LD767 LDD <$52 SUBD #$FF00 STD <$52 BCC LD73F DEC <$51 BNE LD73F LD755 LDD <$52 BEQ LD76C CMPD #$FF00 BLS LD767 SUBD #$FF00 BSR LD767 LDD #$FF00 LD767 JSR >LCC12 BNE LD717 LD76C RTS ; ; Kill command dispatch routine ; ; Syntax : ; KILL filespec ; CmdKill JSR >DosGetFilenameAndOpen BNE LD777 JSR >SuperDosDeleteFile LD775 BEQ LD71A LD777 JMP >DosHookSysError ; ; Protect command dispatch routine. ; ; Syntax : ; PROTECT ON filespec ; PROTECT OFF filespec ; CmdProtect TSTA BPL LD787 CMPA #$C2 BEQ LD798 CMPA #$88 LBNE BasSNError LD787 BSR LD790 LDB #$01 LD78B JSR >SuperDosProtect BRA LD775 LD790 JSR <$9F JSR >DosGetFilenameAndOpen BNE LD7BB RTS LD798 BSR LD790 CLRB BRA LD78B ; ; Rename command dispatch routine ; ; Syntax : ; RENAME filespec TO filespec ; CmdRename JSR >DosGetFilenameAndOpen BNE LD7BB PSHS A LDB #$BC JSR >$89AC JSR >DosGetFilenameAndOpen BEQ LD7B9 CMPB #$A0 BNE LD7BB PULS A JSR >SuperDosRename BRA LD775 LD7B9 LDB #$9E LD7BB JMP >DosHookSysError ; ; FLread command dispatch routine ; ; Syntax : ; FLREAD filespec;string ; FLREAD filespec, FROM first_byte,FOR count;string ; CmdFLRead BSR LD7CD LDA #$FF STA $0612 JSR >LD95D BSR LD7F8 JMP >$9DD9 LD7CD JSR >LD6C5 BNE LD822 BSR LD825 JSR >DosFCBNoToAddr TST $067E BEQ LD7E6 LDU $0664 LDB $0666 STU 12,X STB 14,X LD7E6 JSR >LD9CF LDX #$02DC CLR ,X JMP <$9F ; ; Fread command dispatch routine ; ; Syntax : ; FREAD filespec;variable list ; FREAD filespec,FROM startpos,FOR numbytes;variable list ; CmdFRead BSR LD7CD CLR $0612 JSR >$877A LD7F8 JSR >DosFCBNoToAddr LDB $0604 BEQ LD80E CLR $0603 LDD 13,X SUBD $0603 STD 13,X BCC LD80E DEC 12,X LD80E TST <$F4 BEQ LD81F LDB <$F3 BEQ LD81F CLRA ADDD 13,X STD 13,X BCC LD81F INC 12,X LD81F CLR <$6F RTS LD822 JMP >DosHookSysError LD825 JSR >$9C76 LDA <$F1 JSR >SuperDosGetFLen BNE LD822 STU $0664 STA $0666 CLR <$F4 CLR $067E LDA #$01 STA <$6F LD83E JSR <$A5 CMPA #$3B BEQ LD896 JSR >$89AA CMPA #$E5 BNE LD85F JSR <$9F JSR >$8887 BSR LD879 STU $0664 STA $0666 LDA #$FF STA $067E BRA LD83E LD85F CMPA #$80 BNE LD870 JSR <$9F JSR >Get8BitorError STB <$F3 LDB #$FF STB <$F4 BRA LD83E LD870 JMP >BasSNError LD873 JMP >BasFCError LD876 JMP >$8882 LD879 TST <$54 BMI LD873 TST <$06 BNE LD876 LDA #$A0 SUBA <$4F BEQ LD892 LD887 LSR <$50 ROR <$51 ROR <$52 ROR <$53 DECA BNE LD887 LD892 LDU <$51 LDA <$53 LD896 RTS ; ; FWrite command dispatch routine. ; ; Syntax : ; FWRITE filespec;variable list ; FWRITE filespec,FROM startpos,FOR numbytes;variable list ; CmdFWrite JSR >LD6C5 BEQ LD8A5 CMPB #$A0 BNE LD908 JSR >SuperDosCreateFile BNE LD908 LD8A5 JSR >LD825 JSR >LD2A2 BNE LD908 STX $060B LDA #$55 STA 2,X CLR <$F2 JSR <$9F JSR >$903D TST <$F4 BEQ LD8CA LDB <$F3 BEQ LD8CA LDA #$20 LD8C5 BSR LD911 DECB BNE LD8C5 LD8CA TST <$F2 BEQ LD8E6 LDX $060B LDX 5,X CLRA LDB <$F2 TFR D,U LDA <$F1 LDY $0664 LDB $0666 JSR >SuperDosFWrite BNE LD908 LD8E6 LDX $060B CLR 2,X LD8EB RTS DosHookCheckIONum BLE LD8EB CMPB #$04 BHI LD906 PULS X,PC DosHookOpenDev LEAS 2,S JSR >$8887 JSR >$8DEA PSHS B JSR >$B7D4 TSTB LBLE $B835 LD906 LDB #$28 LD908 JMP >DosHookSysError DosHookCharOut TST <$6F BLE LD8EB LEAS 2,S LD911 PSHS D,X,Y,U LDB <$F4 BEQ LD91B LDB <$F3 BEQ LD952 LD91B LDX $060B LDX 5,X LDB <$F2 ABX STA ,X DEC <$F3 INC <$F2 BNE LD952 LDA <$F1 LDX $060B LDX 5,X LDU #$0100 LDY $0664 LDB $0666 JSR >SuperDosFWrite BEQ LD944 JMP >DosHookSysError LD944 LDD $0665 ADDD #$0100 BCC LD94F INC $0664 LD94F STD $0665 LD952 PULS D,X,Y,U,PC DosHookDiskItem TST <$6F BLE LD9BB LDX #$879A STX ,S LD95D LDA <$F4 BEQ LD965 LDA <$F3 BEQ LD9B2 LD965 LDX #$02DD LDB <$F2 STB $0603 ABX LDB $0604 STB $0611 CLRB STB -1,X STB <$00 LD979 DEC <$F3 DEC $0604 INC <$F2 LDA ,X+ BEQ LD9B2 CMPA #$0D BEQ LD9B2 TST $0612 BNE LD995 CMPA #$2C BEQ LD9B2 CMPA #$3A BEQ LD9B2 LD995 LDA <$F4 BEQ LD99D LDA <$F3 BEQ LD9B2 LD99D INCB CMPB #$FF BEQ LD9B0 LDA $0604 BNE LD979 LDB <$00 BNE LD9B0 BSR LD9BC CLRB BRA LD979 LD9B0 LEAX 1,X LD9B2 LDB $0603 CLR -1,X LDX #$02DC ABX LD9BB RTS LD9BC JSR >DosFCBNoToAddr CLRA LDB $0611 PSHS D LDD 13,X SUBD ,S++ STD 13,X BCC LD9CF DEC 12,X LD9CF PSHS Y,U LDU #$00FF BSR LD9EF LDU #$02DD CLR D,U LDA <$F1 LDB 14,X LDX 12,X EXG X,U JSR >SuperDosFRead BNE LDA25 LDX #$02DD CLR -1,X PULS Y,U,PC LD9EF PSHS U LDD 13,X ADDD ,S PSHS D LDA 12,X ADCA #$00 SUBA $10,X PULS D BCS LDA14 BHI LDA23 SUBD $11,X BLS LDA14 LDD $11,X SUBD 13,X BEQ LDA23 STD ,S COM <$00 LDA14 LDD ,S STB $0604 STB $0611 CLR $0603 CLR <$F2 PULS Y,PC LDA23 LDB #$9A LDA25 JMP >DosHookSysError ; ; Dir command dispatch routine ; ; Syntax : ; DIR drivenum ; CmdDir BEQ LDA2F JSR >GetDriveNoInB BRA LDA32 LDA2F LDB $060A LDA32 STB <$EB CLR ,-S JSR >LD710 CLRB LDA3A JSR >$851B JSR >SuperDosGetDirEntry BNE LDA25 LDA ,X BITA #$08 BNE LDAA2 BITA #$81 BNE LDA9A LEAX 1,X LDB #$08 BSR LDAB2 LDB #$04 LDA #$2E BSR LDAB8 LDA -12,X BITA #$02 BEQ LDA61 LDA #$70 LDA61 EQU *+1 CMPX #$8620 JSR >$B54A JSR >$90F5 LDU #$FFFF LDX #$06BD LDB ,S STB $1D,X JSR >LCB20 BNE LDA25 JSR >LCEBF BSR LDABF LDD <$88 CMPD #$05A0 BLS LDA97 PSHS D,X,Y,U LDX #DDFE0 JSR >BasPrintStr JSR >$852B JSR >$BA77 PULS D,X,Y,U LDA97 EQU *+1 LDA #$BD SUBA <$A1 LDA9A INC ,S LDB ,S CMPB #$A0 BCS LDA3A LDAA2 PULS A JSR >SuperDosGetFree CLRA TFR X,U BSR LDABF LDX #DDAD4 JMP >BasPrintStr LDAB2 LDA ,X+ BNE LDAB8 LDA #$20 LDAB8 JSR >$B54A DECB BNE LDAB2 RTS LDABF JSR >LDD9B JMP >$9582 DosHookReadInput PSHS D,X,U LDX #$837D CMPX 8,S BNE LDAD3 JSR >DosHookCloseSingle BRA LDB2D DDAD4 EQU *+1 LDAD3 PULS D,X,U,PC FCC / BYTES FREE/ FCB $0D FCB $00 FCB $00 FCB $00 FCB $00 ; ; Auto command dispatch routine ; ; Syntax : ; ; AUTO startline,increment ; CmdAuto LDX <BasCurrentLine ; Get current line number LEAX 1,X ; Increment it LBNE BasFCError ; to big : ?FC error LDX #$000A ; Default line no increment 10 TFR X,D PSHS D,X ; make room on stack & setup default start and increment JSR <BasChrGetCurr ; Fetch current char pointed to by basic BEQ CmdAutoDoAuto ; Last char : yes proceed JSR >VarGet16Bit ; get start line no LDD <$52 ; check for error STD 2,S JSR <BasChrGetCurr ; Fetch current char pointed to by basic BEQ CmdAutoDoAuto ; Last char : yes proceed JSR >VarCKComma ; check for comma JSR >VarGet16Bit ; Get Line increment LDD <$52 BEQ CmdAutoErrorExit STD ,S JSR <BasChrGetCurr ; Fetch current char pointed to by basic BEQ CmdAutoDoAuto ; Last char : yes proceed CmdAutoErrorExit JMP >BasSNError ; More chars left, SN? error CmdAutoDoAuto ORCC #$50 ; Disable inturrupts ??? LDD ,S++ ; Get Increment off stack STD DosAutoInc LDD ,S++ ; Get start line off stack SUBD $060F ; Subtrack increment STD DosAutoCurrent ; Save in current LDA #AutoFlag ; Flag in AUTO mode STA DosAutoFlag RTS FCB $34 FCB $56 LDB2D TST $0613 BNE LDB34 LDB32 PULS D,X,U,PC LDB34 LDD $060D ADDD $060F CMPD #$F9FF BHI LDB32 STD ,S JSR >$957A LDA #$20 JSR >$B54A LDU #$03DA LDD ,S STD $060D LDX #$02DD CLRB LDB56 LDA ,U+ BEQ LDB5F STA ,X+ INCB BRA LDB56 LDB5F LDA #$20 STA ,X+ INCB LDB64 JSR >$B505 CMPA #$0D BEQ LDB6F CMPA #$03 BNE LDB85 LDB6F CLR $0613 LDA #$0D JSR >$B54A LEAS 8,S CLR <$85 LDX #$02DD LDA #$0D LDB #$01 JMP >$B5D3 LDB85 CMPA #$20 BCS LDB64 CMPA #$7B BCC LDB64 LEAS 8,S CLR <$85 JMP >$B5D3 LDB94 CLRA ; A=0 LDX #$0008 ; Repeat 8 times LDB98 JSR >CasByteOut ; Output A to cassette LEAX -1,X ; Decrement count BNE LDB98 ; Loop again if all not done RTS ; ; Beep command dispatch routine ; ; Syntax : ; BEEP nobeeps ; CmdBeep BEQ LDBA6 ; if no params, default to 1 beep JSR >Get8BitorError ; get beep count LDBA6 EQU *+1 CMPX #$C601 ; LDB #$01 (default beep count) PSHS B ; save count on stack CLRB JSR >SndDTOAOn ; switch dound to D to A LDBAE BSR LDB94 JSR >$851B DEC ,S ; decrement beep count BEQ LDBC1 ; done all : restore and exit LDY #$6000 ; wait a short while LDBBB LEAY -1,Y BEQ LDBAE ; loop back and do next beep BRA LDBBB LDBC1 PULS B,PC ; restore and return ; ; Wait command dispatch routine. ; ; Syntax : ; WAIT miliseconds ; CmdWait BEQ LDBD6 JSR >$8E83 LDX <$52 LDBCA JSR >$851B LDB #$A0 LDBCF DECB BNE LDBCF LEAX -1,X BNE LDBCA LDBD6 RTS ; ; Swap command dispatch routine. ; ; Syntax : ; SWAP var1,var2 ; CmdSwap JSR >$8A94 LDX <$39 LDA <$06 PSHS A,X JSR >$89AA JSR >$8A94 PULS A,Y CMPA <$06 LBNE $8882 LDU <$39 LDX #$0005 LDBF3 LDA ,U LDB ,Y STB ,U+ STA ,Y+ LEAX -1,X BNE LDBF3 RTS LDC00 LDB #$8E LDC02 TST <$71 NOP LBRA DosHookSysError LDC08 LDA #$55 STA <$71 RTS ; ; If assembling for the DragonDos cartrage, this is the dispatch for ; the boot command, if assembling for the dragon Alpha, I have used ; the space occupied by the boot command to store the code used to ; activate the Alpha's drive selects and motor on, this is reasonable ; because the Alpha has a graphical boot menu, which allows it to boot ; from disk, so this routine seemed expendable. ; ifne DragonAlpha ; Translate DragonDos Drive select mechinisim to work on Alpha ; Takes byte that would be output to $FF48, reformats it and ; outputs to Alpha AY-8912's IO port, which is connected to ; Drive selects, motor on and enable precomp. ; We do not need to preserve the ROM select bit as this code ; operates in RAM only mode. AlphaDskCtl PSHS x,A,B,CC,DP pshs a ; Convert drives anda #%00000011 ; mask out drive number leax ADriveTab,pcr ; point at table lda a,x ; get bitmap ldb ,s andb #%11111100 ; mask out drive number stb ,s ora ,s ; recombine bita #MotorOn ; test motor on ? bne MotorRunning clra ; No, turn off other bits. MotorRunning anda #KnownBits ; Mask out bits we do not know the function of sta ,s lda #AYIOREG ; AY-8912 IO register sta PIA2DB ; Output to PIA ldb #AYREGLatch ; Latch register to modify stb PIA2DA clr PIA2DA ; Idle AY lda ,s+ ; Fetch saved Drive Selects sta PIA2DB ; output to PIA ldb #AYWriteReg ; Write value to latched register stb PIA2DA ; Set register clr PIA2DA ; Idle AY PULS dp,x,A,B,CC,pc else ; ; Boot command dispatch routine (DragonDos only). ; ; Syntax : ; BOOT drivenum ; CmdBoot BEQ LDC14 ; No drive supplied, use default JSR >GetDriveNoInB ; Get drive number BRA LDC17 LDC14 LDB DosDefDriveNo ; use default drive no LDC17 LDA #BootFirstSector; Read boot sector STA <DskSectorNo STB <LastActiveDrv ; Set drive number JSR >DosDoRestore ; Restore to track 0 BCS LDC02 ; Error : exit JSR >DosDoReadSec2 ; Read first 2 chars of boot sec BCS LDC02 ; error : exit LDD #BootSignature ; Boot signature found ? CMPD <$4F BNE LDC00 ; no : error LDD #BootLoadAddr ; start at boot load address STD <DiskBuffPtr ; Set disk buffer to point there LDC34 JSR >DosDoReadSec ; Read a sector BCS LDC02 ; Error : exit INC <DiskBuffPtr ; increment page of buffer pointer INC <DskSectorNo ; increment sector number LDA <DskSectorNo ; get sector number CMPA #BootLastSector ; Read the whole boot area ? BLS LDC34 ; no : read next sector JMP >BootEntryAddr ; jump to loaded boot code endc org $DC46 ; ;Drive command dispatch routine. ; ; Syntax : ; DRIVE drivenum ; CmdDrive BEQ LDC4F JSR >GetDriveNoInB STB $060A RTS LDC4F JMP >BasSNError ; ; Error command dispatch routine. ; ; Syntax : ; ERROR GOTO lineno ; CmdError2 CMPA #$81 BNE LDC4F JSR <$9F CMPA #$BC BNE LDC4F JSR <$9F JSR >$869A LDX <$2B CMPX #$F9FF LBHI BasFCError STX $0615 BEQ LDC75 LDA #$FF STA $0614 RTS LDC75 CLR $0614 RTS LDC79 JSR >$89AA JSR >$8A94 JMP >$8877 ; ;Sread command dispatch routine. ; ; Syntax : ; SREAD driveno,trackno,secno,part1$,part2$ ; CmdSread JSR >LDD21 BSR LDC79 PSHS X BSR LDC79 PSHS X LDB #$FF STB <$F6 JSR >LD2A2 BNE LDCBA CLR 2,X LDX 5,X STX <$EE JSR >DosDoReadSec STB $0603 LDU <$EE LEAU $0080,U PULS X BSR LDCBD LDU <$EE PULS X BSR LDCBD CLR <$F6 LDB $0603 BNE LDCBA RTS LDCBA JMP >DosHookSysError LDCBD PSHS X,U LDB #$80 JSR >$8C52 LEAU ,X PULS X STB ,X STU 2,X PULS X JMP >UtilCopyBXtoU ; ; Swrite command dispatch routine. ; ; Syntax : ; SWRITE driveno,side,sector,part1$,part2$ ; CmdSwrite BSR LDD21 BSR LDD1B JSR >$8877 LDX <$52 PSHS X BSR LDD1B JSR >$8D9A PSHS B,X LDB #$FF STB <$F6 JSR >LD2A2 BNE LDCBA CLR 2,X LDX 5,X STX <$EE CLRB LDCF3 CLR ,X+ DECB BNE LDCF3 PULS B,X LDU <$EE LEAU $0080,U TSTB BEQ LDD06 JSR >UtilCopyBXtoU LDD06 PULS X JSR >$8D9F LDU <$EE TSTB BEQ LDD13 JSR UtilCopyBXtoU LDD13 JSR >DosDoWriteSec BCS LDCBA CLR <$F6 RTS LDD1B JSR $89AA JMP >$8887 LDD21 BNE LDD26 JMP >BasSNError LDD26 JSR GetDriveNoInB STB <$EB JSR $8E7E CMPB #$4F BHI LDD3A STB <$EC JSR $8E7E STB <$ED LDD39 RTS LDD3A JMP >BasFCError ; ; Verify command dispatch routine. ; ; Syntax : ; VERIFY ON ; VERIFY OFF ; CmdVerify BEQ LDD4D CMPA #$C2 BNE LDD46 CLRB BRA LDD4F LDD46 CMPA #$88 BEQ LDD4D JMP >BasSNError LDD4D LDB #$FF LDD4F STB $0608 JMP <$9F DosHookEOF TST <$06 BEQ LDD39 CLR <$06 LEAS 2,S LDY #DosExtDat JSR LD6DF BNE LDD7E JSR SuperDosGetFLen BNE LDD7E JSR DosFCBNoToAddr CMPU 12,X BHI LDD76 CMPA 14,X BLS LDD78 LDD76 CLRA LDD78 EQU *+1 CMPX #$8601 LDU <Zero16Bit BRA LDD99 LDD7E JMP >DosHookSysError FuncLoc JSR LD6C5 BNE LDD7E JSR DosFCBNoToAddr LDU 12,X LDA 14,X BRA LDD99 FuncLof JSR LD6C5 BNE LDD7E JSR SuperDosGetFLen BNE LDD7E LDD99 CLR <$06 LDD9B CLRB STU <$51 STD <$53 CLR <$63 LDA #$A0 STD <$4F JMP >$9165 FuncFree JSR <$A5 BEQ LDDB2 JSR GetDriveNoInB BRA LDDB5 LDDB2 LDB $060A LDDB5 STB <$EB JSR SuperDosGetFree BNE LDD7E TFR X,U CLRA BRA LDD99 FuncErl LDD $0617 LDDC4 JMP >$8C37 FuncErr CLRA LDB $0619 BRA LDDC4 FuncHimem LDD <$27 BRA LDDC4 FuncFres JSR $8CD7 LDD <$23 SUBD <$21 BRA LDDC4 ; ; The actual core disk IO routine, accepts a function code $00..$07 ; these are dispatched through this table ; DosFunctionTable FDB DosFunctionRestore ; Restore to track 0 FDB DosFunctionSeek ; Seek to a track FDB DosFunctionReadSec ; Read a sector FDB DosFunctionWriteSec ; Write a sector FDB DosFunctionWriteSec2 FDB DosFunctionWriteTrack ; Write (format) track FDB DosFunctionReadAddr ; Read address mark FDB DosFunctionReadSec2 ; Read first two bytes of a sector ; ; Data table for Format ? ; DDDEA FCB $01 FCB $0A FCB $02 FCB $0B FCB $03 FCB $0C FCB $04 FCB $0D FCB $05 FCB $0E FCB $06 FCB $0F FCB $07 FCB $10 FCB $08 FCB $11 FCB $09 FCB $12 FCB $00 DDDFD FCC /5NN/ FCB $08 FCB $00 FCB $00 FCB $03 FCB $F6 FCB $FC FCB $1F FCB $4E FCB $4E DDE09 FCB $07 FCB $00 FCB $00 FCB $03 FCB $F5 FCB $FE FCB $01 FCB $F7 FCB $4E FCB $14 FCB $4E FCB $4E FCB $0B FCB $00 FCB $00 FCB $03 FCB $F5 FCB $FB FCB $00 FCB $E5 FCB $F7 FCB $17 FCB $4E FCB $4E FCB $00 FCB $4E FCB $4E ; ; Data copied into low ram at init, inturrupt vectors etc ; DDE24 FCB $09 ; No bytes FDB $0109 ; address to copy ; Inturrupt vectors LDE27 JMP >NMISrv LDE2A JMP >IRQSrv LDE2D JMP >FIRQSrv ; Dos vars, step rates for drives ? FCB $04 ; No bytes FDB $069F ; address to copy FCB $02 FCB $02 FCB $02 FCB $02 ; New basic dispatch stub FCB $1E ; No bytes FDB $012A ; address to copy FCB $1A FDB DDEDA FDB LC670 FCB $07 FDB DDEC1 FDB LC68B FCB $00 FDB $0000 FDB BasSNError FCB $00 FDB $0000 FDB BasSNError FCB $00 FCB $00 FCB $00 FCB $00 FCB $00 FCB $00 FCB $00 FCB $00 FCB $00 FCB $00 ; No bytes : terminate FCB $00 CommandDispatchTable FDB CmdAuto ; Commented FDB CmdBackup FDB CmdBeep ifne DragonAlpha FDB BasSNError ; If assembling for Alpha, just redirect to ?SN error else FDB CmdBoot ; Else, if dragondos, boot command endc FDB CmdChain FDB CmdCopy FDB CmdCreate FDB CmdDir FDB CmdDrive FDB CmdDskInit FDB CmdFRead FDB CmdFWrite FDB CmdError2 FDB CmdKill FDB CmdLoad FDB CmdMerge FDB CmdProtect FDB CmdWait FDB CmdRename FDB CmdSave FDB CmdSread FDB CmdSwrite FDB CmdVerify FDB BasSNError FDB CmdFLRead FDB CmdSwap FunctionDipatchTable FDB FuncLof FDB FuncFree FDB FuncErl FDB FuncErr FDB FuncHimem FDB FuncLoc FDB FuncFres ; ; New ram hook table copied into low ram ; RamHookTable FDB DosHookOpenDev ; open dev/file FDB DosHookCheckIONum ; check io num FDB DosHookRetDevParam ; return dev parameters FDB DosHookCharOut ; char output FDB DosHookRetDevParam ; char input FDB DosHookRetDevParam ; check dev open for input FDB DosHookRetDevParam ; check dev open for output FDB DosHookRetDevParam ; close all devs and files FDB DosHookCloseSingle ; close single dev/file FDB DosHookRetDevParam ; first char of new statement FDB DosHookDiskItem ; Disk file item scanner FDB DosHookRetDevParam ; poll for break FDB DosHookReadInput ; read line of input FDB DosHookRetDevParam ; finish loading ASCII program FDB DosHookEOF ; EOF function FDB DosHookRetDevParam ; Eval expression FDB DosHookRetDevParam ; User error trap FDB DosHookSysError ; System error trap FDB DosHookRun ; run statement DDEC1 FCC /LO/ FCB $C6 FCC /FRE/ FCB $C5 FCC /ER/ FCB $CC FCC /ER/ FCB $D2 FCC /HIME/ FCB $CD FCC /LO/ FCB $C3 FCC /FRE/ FCB $A4 DDEDA FCC /AUT/ FCB $CF FCC /BACKU/ FCB $D0 FCC /BEE/ FCB $D0 FCC /BOO/ FCB $D4 FCC /CHAI/ FCB $CE FCC /COP/ FCB $D9 FCC /CREAT/ FCB $C5 FCC /DI/ FCB $D2 FCC /DRIV/ FCB $C5 FCC /DSKINI/ FCB $D4 FCC /FREA/ FCB $C4 FCC /FWRIT/ FCB $C5 FCC /ERRO/ FCB $D2 FCC /KIL/ FCB $CC FCC /LOA/ FCB $C4 FCC /MERG/ FCB $C5 DDF2A EQU *+3 FCC /PROTEC/ FCB $D4 FCC /WAI/ FCB $D4 FCC /RENAM/ FCB $C5 FCC /SAV/ FCB $C5 FCC /SREA/ FCB $C4 FCC /SWRIT/ FCB $C5 FCC /VERIF/ FCB $D9 FCC /FRO/ FCB $CD FCC /FLREA/ FCB $C4 FCC /SWA/ FCB $D0 FCC /INSERT SOURCE / FCB $0D FCB $00 FCC /INSERT DESTINATION / FCB $0D MessPressAnyKey FCB $00 FCC /PRESS ANY KEY / FCB $0D FCB $00 DosExtBas FCC /BAS/ DosExtDat FCC /DAT/ DosExtBin FCC /BIN/ DosErrorCodeTable FCC / NRSKWPRTRFCCLDBTIVFDDFFSPTPEF/ FCC /FFENETFPR?/ DosSignonMess ifne DragonAlpha FCC /?SUPERDOS E7a/ else FCC /?SUPERDOS E6 / endc FCB $0D FCB $00 DDFE0 FCB $00 FCC / MORE:/ FCB $00 FCB $00 ifne DragonAlpha FCC / / ADriveTab FCB Drive0,Drive1,Drive2,Drive3 else FCC / / endc LDFF3 LDA 2,X DECA BNE LDFFA STA 2,X LDFFA LDX $066F RTS FCB $61 FCB $34 ;DE000 END