💾 Archived View for spam.works › mirrors › textfiles › apple › DOCUMENTATION › ddd.2.1.src captured on 2023-06-16 at 21:17:06.
View Raw
More Information
-=-=-=-=-=-=-
- --------------------------------------------------------*
- Dalton's Disk Disintegrater Version 2.1 Enhanced *
- Packing algorithm by Dalton *
- Enhancement by Ziopoth of The Assembly Line - '86 *
- Disassembly by L.H.A - 04/86 *
- Commenting by Sound Wave of The LEGION - 12/86 *
- *
- Coming soon (or maybe not so soon): *
- DDD ProDOS 8 v1.0 - packs 5.25 and 3.5" disks, no fuss *
- DDD ProDOS 16 v1.0 - IIgs only (uses all memory) *
- The source code for above will be available-for free *
- --------------------------------------------------------*
H00 = $00
WNDLFT = $20
WNDTOP = $22
WNDBTM = $23
CH = $24
CV = $25
BAS = $28
BS = $88
CTRLJ = $8A
CTRLK = $8B
CR = $8D
FA = $95
ESC = $9B
SPC = $A0
IOB = $F3
IN = $0200
H0300 = $0300
RESET = $03F2
H0800 = $0800
H0900 = $0900
H0C00 = $0C00
H4C00 = $4C00
FMTSLSEC = $B5C9 File Mgr T/S List Buffer Addr
HB500 = $B500
HB521 = $B521
HB527 = $B527
HB530 = $B530
HB534 = $B534
HB535 = $B535
HB57C = $B57C
RWTS = $BD00
KEY = $C000
STROBE = $C010
VTAB = $FC22
HOME = $FC58
CLRCR = $FD8B CLREOL, CR
PRBYTE = $FDDA
PRHEX = $FDE3
COUT = $FDED
SETINV = $FE80
SETNORM = $FE84
SETKBD = $FE89
SETVID = $FE93
- -------------------------------
JSR SETKBD
JSR SETVID
JSR $03E3 Get IOB Addr in A, Y
STY IOB
STA IOB+1
LDX #2
LDY #$0E
LDA (IOB),Y ;Get volume # of last access
STA H468A,X
INY
LDA (IOB),Y
LSR
LSR
LSR
LSR
STA H4684,X ;store last used slot*16 in 4684
INY
LDA (IOB),Y ;store last used drive #
STA H4687,X
LDA FMTSLSEC ;set up t/s list for when we
STA IOB ;reconfigure
LDA FMTSLSEC+1
STA IOB+1
LDY #$1E
LDA (IOB),Y
STA H468E ;track of sector #10 of DDD file
INY
LDA (IOB),Y
STA H468F ;sector of sector #10 of DDD file
JSR H38F4 ;make sure we're in main memory
;with 80Store on...
BIT $C083 ;switch in 16k ramcard, read and
BIT $C083 ;write ram (assuming it's there)
LDX #0 ;check and see if we have at
H2F8D STX $E000 ;least 64k of memory...
CPX $E000 ;this routine COULD be a
BNE H2FCA ;little shorter...
DEX
BNE H2F8D
BIT $C082 ;back to main memory
LDA #$F8 ;make it show 64k
STA H2FDC+1
JSR H3CF9 ;clc = no //e,//c -- sec = 128k
BCC H2FD2 ;if no 128k, set some flags, leave
LDA #$FC ;else, make it show...
STA H2FDC+1 ;128k
STA $C005 ;write to aux 48k memory
LDY #0 ;store a whole page of 0's from
H2FAF LDA $B600,Y ;$B600 to $BF00. $0A pages.
H2FB2 STA $B600,Y
INY
BNE H2FAF
INC H2FAF+2
INC H2FB2+2
LDA H2FAF+2
CMP #$C0 ;have we reached the end yet?
BLT H2FAF ;no, go do the other pages.
STA $C004 ;switch in main 48k
BGE H2FDA
H2FCA LDA #$FF ;flags indicate no 64k
STA H390F ;if it has not 64k, it certainly
STA H3912 ;doesn't have 128k...
H2FD2 LDA #$FF ;flags indicate no 128k
STA H3915
STA H3918
H2FDA LDY #3
H2FDC LDA :MEMORY,Y
STA H3161,Y
DEY
BPL H2FDC
LDA $03DA Get Addr for JMP to RWTS
STA H3824+1
LDA $03DB
STA H3824+2
JMP START
:MEMORY ASC "48k 64k 128k"
- --------------------------------------------------------*
- Note: All the memory from $2000 to $3000 is claimed by *
- a buffer used when we read a track from the disk to be *
- compacted, or after we have unpacked it, write the *
- track back out. 16 pages of 256 bytes, get it? *
- All the stuff before $3000 is only executed once, and *
- is, therefore, expendable. *
- --------------------------------------------------------*
START JSR $FB2F ;Monitor INIT
JSR HOME
JSR DISPLAY ;show the following...
ASC "[ ] ::: ::: ::: :::][::: ::: ::: ::: [ ]"
ASC "|\| Dalton's Disk Disintegrater |/|"
ASC "|/| Version 2.1 Enhanced |\|"
ASC "|\| Enhancement by Ziopoth |/|"
ASC "[ ] ::: ::: ::: :::][::: ::: ::: ::: [ ]"
BRK
LDA #5 ;top line is...
STA WNDTOP ;line #5
H30D6 JSR HOME ;clear it,
JSR SHOWBTM ;put "SOURCE:" on screen
LDA #$10 ;line #16 is window bottom
STA WNDBTM
H30E0 LDX #$FF ;reset the stack
TXS
JSR FIXRESET ;fix the rest vector to reboot
JSR H38F4 ;switch in main memory...
JSR HOME
JSR H466D ;inverse SOURCE: over TARGET:
LDX #0
JSR H3221 ;go manage the screen movement...
ASL ;multiply our choice by 2
ADC #<CHTABLE ;use our choice as an index
STA IOB ;to go to the proper routine
LDA #0 ;then return to the caller at the
ADC #>CHTABLE ;main menu
STA IOB+1
LDY #0
LDA (IOB),Y
STA PNTWHERE
INY
LDA (IOB),Y
STA PNTWHERE+1
JSR DOROUT ;do whatever we need, then...
JMP H30E0 ;return to main menu
DOROUT JMP (PNTWHERE) ;go to adr pointed to by the table
RTS
PNTWHERE HEX 0000 ;pointer to wherever we're going...
CHTABLE DA PACK
DA UNPACK
DA CATALOG
DA FORMAT
DA NEWSLOT
DA RECONFIG
DA QUIT
FIXRESET LDA #0 ;make the reset routine point
STA RESET ;to $3000
LDA #$30
STA RESET+1
EOR #$A5
STA $03F4 ;Fix power-up byte
RTS
SHOWBTM JSR DISPLAY
HEX 811000
HEX 82
DCI ' ( '
ASC "SOURCE:"
BRK
LDX #0
JSR H31EE ;display slot and drives used...
JSR DISPLAY
DCI " "
ASC "AVAILABLE RAM:"
H3161 ASC "48k "
ASC ' '
ASC " TARGET:"
BRK
LDX #1
JSR H31EE ;put slot drive and volume
;assignments on screen
JSR DISPLAY ;display the following...
DCI " "
ASC " SECTOR COUNT:"
HEX 811227 ;vtab 18,htab 39
HEX 82
ASC ' *'
ASC "TRK "
ASC "1111111111111111222"
ASC ' '
ASC " 0123456789ABCDEF"
ASC "0123456789ABCDEF012"
ASC ' '
ASC "ST:"
HEX 82
DCI " #"
HEX 82
ASC ' ('
BRK
LDA #$20 ;put an inverse space somewhere
STA $07F7
RTS
H31EE JSR DISPLAY ;put an 'S' up there...
ASC "S"
BRK
LDA H4684,X ;get the current slot (src, trg)
ORA #$B0
JSR H44CD ;go print it; checking for Lcase
JSR DISPLAY ;put a 'D' up there...
ASC ",D"
BRK
LDA H4687,X ;get the current drive (scs,trg)
ORA #$B0
JSR H44CD ;go print it using Lcase filter
JSR DISPLAY ;put a 'V' up there...
ASC ",V"
BRK
LDA #0 ;high byte to br printed = $00
STA H4620
LDA H468A,X ;lo byte is the volume number
STA H461F
JSR H45DA ;convert hex # to decimal
JSR H4621 ;print decimals as hex (PRHEX)
RTS
H3221 LDA H32C1,X
STA WNDLFT ;set left edge of window
LDA #0
STA CH ;set htab=0
LDA #$18
STA WNDBTM ;vtab 24 = screen bottom
H322E JSR H3295 ;set cursor vertical
]LOOP JSR H44D7 ;wait for key, update s scroll
CMP #BS ;is it a backspace?
BEQ UP ;yes! move the highlight up
CMP #CTRLK ;is it the up arrow?
BEQ UP ;yes, move the highlight up
CMP #CTRLJ ;is it a down arrow?
BEQ DOWN ;yes, move the highlight down
CMP #FA ;is it a forward arrow?
BEQ DOWN ;yes, move the highlight down
CMP #ESC ;is it <Escape>?
BEQ ESCAPE ;yes, return to main menu
;(if not already there)
CMP #CR ;is it at carriage return?
CLC
BEQ RETURN ;yes, go service that routine
BNE ]LOOP ;no, loop back...
UP DEC H32C7,X
LDA H32C7,X
CMP H32CA,X
BPL H322E
LDA H32CD,X
STA H32C7,X
DEC H32C7,X
JMP H322E
DOWN INC H32C7,X
LDA H32C7,X
CMP H32CD,X
BMI H322E
LDA H32CA,X
STA H32C7,X
JMP H322E
ESCAPE LDA #0
STA WNDLFT
LDA #$10
STA WNDBTM ;reset the current window
JMP H30E0 ;return whence we came...
RETURN SEC
LDA H32C7,X
SBC H32CA,X
LDX #0
STX WNDLFT
LDX #$10
STX WNDBTM
RTS
H3295 LDA H32C4,X ;get index to vertical curs pos
STA CV
JSR VTAB ;set it to the vtab value
LDA H32CA,X
STA H32C0
H32A3 CMP H32C7,X ;is it the one to be inverted?
BNE H32AB ;no, don't invert it
JSR SETINV ;yes, invert it
H32AB JSR H44B4 ;go get the index then print
JSR SETNORM ;normal text
JSR $FC62 ;do linefeed
INC H32C0
LDA H32C0
CMP H32CD,X ;is it the last line?
BNE H32A3 ;no, go do some others
RTS
H32C0 BRK
H32C1 HEX 0C
HEX 02 ;indexes for left edge of window
HEX 06
H32C4 HEX 07
HEX 11 ;indexes for vertical cursor pos
HEX 09
H32C7 HEX 00
HEX 07
HEX 09
H32CA HEX 00
HEX 07
HEX 09
H32CD HEX 07
HEX 09
HEX 0D
HEX 60
H32D1 DA T:PACK
DA T:UNPACK
DA T:CAT
DA T:FORMAT
DA T:NEW
DA T:RECON
DA T:QUIT
DA T:SOURCE
DA T:TARGET
DA T:LCASE
DA T:LANG
DA T:AUXMEM
DA T:SAVE
T:PACK ASC "PACK A DISK"
BRK
T:UNPACK ASC "UNPACK A DISK"
BRK
T:CAT ASC "CATALOG A DRIVE"
BRK
T:FORMAT ASC "FORMAT A DISK"
BRK
T:NEW ASC "NEW SLOT, DRIVE, VOL"
BRK
T:RECON ASC "RECONFIGURE"
BRK
T:QUIT ASC "QUIT & REBOOT"
BRK
T:SOURCE ASC "SOURCE"
BRK
T:TARGET ASC "TARGET"
BRK
T:LCASE ASC "LOWERCASE"
BRK
T:LANG ASC "LANGUAGE CARD"
BRK
T:AUXMEM ASC "//E AUXILIARY MEM"
BRK
T:SAVE ASC "SAVE CONFIGURATION"
BRK
- -------------------------------
- Here begins the famous Dalton's
- packing routine.
- -------------------------------
PACK JSR HOME
JSR DISPLAY ;go stick all this stuff all
HEX 810612 ;over the screen at various
ASC "Pack" ;locations
HEX 810712
ASC "----"
HEX 811604
HEX 82
DCI " #"
HEX 811223
ASC "000"
HEX 810900
ASC "Filename: "
BRK
JSR H4518 ;go get the filename
CPX #0 ;is the length returned = 0?
BNE H33D3 ;no, go pack the blasted thing
RTS ;yes, go back to the menu...
H33D3 LDA #0
JSR H4630 ;put inverse "SOURCE:" on screen
JSR H46E4 ;print "insert" and proper
;designation
LDA #0
STA H3C90
STA H3C91
STA H3C92
STA H3C93
STA H3B6E
STA $F9 ;current track starts at $0
STA H37FC
JSR H388D ;$F8,$F7 point to $804 now
LDA #1
STA H373C
H33F9 LDA #0 ;zero out 2 pages of memory from
TAY ;$200 - $3FF
]LOOP STA $200,Y
STA $300,Y
INY
BNE ]LOOP
LDA #1 ;next operation by RWTS is read
STA H3805
LDA #$D2 ;go stick an 'R' on screen
JSR H3CD2 ;and switch mem banks around
JSR H3C94 ;read a WHOLE track into $2000
LDA #$C3 ;go stick a 'C' on screen for
JSR H3CD2 ;compacting; switch mem banks
JSR H3485 ;Collect # of bytes in $200-$300
LDA $F9 ;is this the first track? - $0?
BNE H342D ;no, skip over this stuff:
LDA #0 ;do this ONLY if this is the
LDY #4 ;first track...
JSR H35E6
LDA H3807
LDY #$80
JSR H35E6
H342D JSR H34DA
JSR H3527
LDA #$AE ;print a period (.) on screen
JSR H3CD2 ;indicating done w/track
INC $F9 ;increment the current track
LDA $F9 ;have we done $22 tracks yet?
CMP #$23
BNE H33F9 ;no, go do the rest...
LDA #0 ;yes, now fiddle around a little...
LDY #$80
JSR H35E6
JSR H38A6
JSR H38F4 ;set up main memory, no aux
JSR H399C
LDA #1 ;put "TARGET:" in inverse
JSR H4630
LDA H3B6A
STA H37FD
LDA H3B6A+1
STA H37FE
LDA #$B6 ;file buffer is at $B600
STA H3802
JSR H3820 ;go write it
JSR H3C66
JSR H3BC0 ;update file descriptive entry?
LDA #$11 ;track $11
STA H37FD
LDA #0 ;sector $0 - bit map
STA H37FE
LDA #$B5 ;buffer to be used is at $B500
STA H3802
JSR H3820 ;use RWTS - write bit map
JSR H3CF2 ;turn off drive
RTS ;finish and leave... hallelujah!
H3485 JSR H3884 ;$F5 and $F6 point now to $2000
LDY #0
H348A STY $FB
LDA $F6
STA $FC
LDA ($F5),Y ;$2000,Y
LDY #3
H3494 CMP ($FB),Y ;are they the same
BNE H34BF ;no,...
DEY
BNE H3494
LDY $FB
LDX $F6
CPX #$2F ;have we done all 16 pages?
BNE H34A7 ;no, go do some more...
CPY #$FD ;have done all but last 4 bytes?
BCS H34BF ;nope, go collect some more bytes
H34A7 JSR H34D0
JSR H34D0
JSR H34D0
JSR H34D0
BEQ H34CF
H34B5 CMP ($F5),Y
BNE H348A
JSR H34D0
BNE H34B5
RTS
H34BF LDY $FB
TAX
INC $200,X ;up over $FF? (inc lo byte)
BNE H34CA ;no, pop over this:
INC H0300,X ;yes, increment the high byte
H34CA JSR H34D0
BNE H348A
H34CF RTS ;leave with my sanity intact...
H34D0 INY
BNE H34D9
INC $F6
LDX $F6
CPX #$30
H34D9 RTS
H34DA LDY #0
H34DC LDA #0
STA H00,Y
STA $FB
STA $FC
TAX
H34E6 LDA H0300,X
CMP $FC
BCC H3504
BNE H34F6
LDA IN,X
CMP $FB
BCC H3504
H34F6 LDA IN,X
STA $FB
LDA H0300,X
STA $FC
TXA
STA H00,Y
H3504 INX
BNE H34E6
LDA H00,Y
PHA
STY H3526
LDY #$80
JSR H35E6
LDY H3526
PLA
TAX
LDA #0
STA IN,X
STA H0300,X
INY
CPY #$14
BNE H34DC
RTS
H3526 BRK
H3527 JSR H3884
LDY #0
H352C STY $FB
H352E LDY $FB
LDA $F6
STA $FC
LDA ($F5),Y
LDY #3
H3538 CMP ($FB),Y
BNE H358D
DEY
BNE H3538
LDY $FB
LDX $F6
CPX #$2F
BNE H354B
CPY #$FD
BCS H358D
H354B LDX #4
STX $FF
JSR H34D0
JSR H34D0
JSR H34D0
JSR H34D0
BEQ H356F
H355D CMP ($F5),Y
BNE H356F
INC $FF
BEQ H356C
JSR H34D0
BNE H355D
BEQ H356F
H356C JSR H34D0
H356F STY $FB
PHA
LDA #$97
LDY #$80
JSR H35E6
PLA
LDY #$80
JSR H35E6
LDA $FF
LDY #$80
JSR H35E6
LDA $F6
CMP #$30
BNE H352E
RTS
H358D LDY #$13
H358F CMP H00,Y
BEQ H35B0
DEY
BPL H358F
PHA
LDA #0
LDY #1
JSR H35E6
PLA
LDY #$80
JSR H35E6
H35A5 LDY $FB
JSR H34D0
BEQ H35AF
JMP H352C
H35AF RTS
H35B0 TYA
TAX
LDY H35D2,X
LDA H35BE,X
JSR H35E6
JMP H35A5
H35BE HEX 03
HEX 09
HEX 1F
HEX 0F
HEX 07
HEX 1B
HEX 0B
HEX 0D
HEX 15
HEX 37
HEX 3D
HEX 25
HEX 05
HEX B1
HEX 11
HEX 21
HEX 01
HEX 57
HEX 5D
HEX 1D
H35D2 HEX 08
HEX 08
HEX 10
HEX 10
HEX 10
HEX 10
HEX 10
HEX 10
HEX 10
HEX 20
HEX 20
HEX 20
HEX 20
HEX 20
HEX 20
HEX 20
HEX 20
HEX 40
HEX 40
HEX 40
H35E6 STA H373E
STY H373D
LDY #0
LDA ($F7),Y
H35F0 LSR H373E ;divide by 10 (decimal)
ROL ;
ASL H373C ;multiply it by 10 (decimal)
BCC H360B ;was lo-bit set? no, branch...
STA ($F7),Y
ROL H373C
JSR H38A2 ;check for memory full?
BNE H3609 ;evidently not full, skip over
JSR H399C ;ack! we must be full, go write
JSR H4690 ;prompt to re-insert source
H3609 LDA ($F7),Y
H360B LSR H373D ;was high bit set?
BCC H35F0 ;no, branch...
STA ($F7),Y ;yes, store shifted value, why?
RTS
- -------------------------------
- Here begins the equally famous
- Dalton's unpacking routine.
- -------------------------------
UNPACK JSR H3891 ;set up a pointer?
JSR HOME ;clear the screen
JSR H46E4 ;check for # of drives, prompt
;for source or target, etc...
JSR H40CD ;put a LOT of stuff on screen
;then handle file selection
PHA ;push the current file #
JSR HOME ;clear the screen
JSR SHOWBTM ;setup display at page bottom
LDA #0 ;go grab the current slots
JSR H4630 ;print some extra stuff
LDA #$10 ;bottom is reset to vtab 16
STA WNDBTM
JSR DISPLAY ;print the following...
HEX 810611 ;vtab 6, htab 17
ASC "Unpack"
HEX 810711 ;vtab 6, htab 17
ASC "------"
HEX 810900 ;vtab 9, htab 0
ASC "Filename: "
BRK
PLA ;get the current file # back
ASL ;multiply it by 2
TAX
LDA H0900,X ;using the (file #)*2, get a
STA IOB ;pointer to the filename...
LDA H0900+1,X
STA IOB+1
LDY #9 ;skip over the boring stuff in
;the file description,
;what we want is the filename
H3661 LDA (IOB),Y ;is this the $00 eof marker?
BEQ H366B ;yes, leave it..
JSR H44CD ;no,
INY ;are we done?
BNE H3661 ;nope, keep going...
H366B JSR DISPLAY ;show the following...
HEX 811223 ;vtab 18, htab 33
ASC "000" ;clear the sector count
BRK
LDA H0800,X
STA H37FD
LDA H0800+1,X
JSR H3948 ;get the T/S list for this file
LDA #0
STA $F9 ;current track is $0
JSR H388D
LDY #4
JSR H370C
CMP #0
BEQ H36C3
JSR DISPLAY
HEX 810C03
ASC "This file was not packed by DDD II."
HEX 8D8D
BRK
JSR H45BE
JMP H30E0
H36C3 JSR H46B2
LDY #$80
JSR H370C
JSR H3754
STA $FA
STA H37FC
LDA #$C9 ;put an 'I' on screen, also
JSR H3CD2 ;switch in main memory
LDA #4
STA H3805 ;next operation is format ($04)
JSR H3820 ;go do it with RWTS
JSR H3CEB ;keep drive running
H36E3 LDA #2
STA H3805 ;next operation is write ($02)
LDA #$C4 ;put a 'D' on screen, and
JSR H3CD2 ;switch in proper memory banks
JSR H373F
JSR H3760
LDA #$D7 ;put a 'W' on screen
JSR H3CD2 ;and switch in probably main mem
JSR H3C94 ;go write out a track from $2000
LDA #$AE ;put a period (.) on screen
JSR H3CD2 ;and switch mem banks
INC $F9 ;do next track
LDA $F9
CMP #$23 ;have we done all the tracks?
BNE H36E3 ;no, go do the next one
JSR H3CF2 ;turn off the drive
RTS ;holy nuts, we're done!
H370C STY H373D
LDY #0
STY H373E
LDA ($F7),Y
H3716 ASL
ROL H373E
ASL H373C
BCC H3731
ROL H373C
JSR H38A2
BNE H372F
JSR H391C
JSR H46B2
LDY #0
H372F LDA ($F7),Y
H3731 LSR H373D
BCC H3716
STA ($F7),Y
LDA H373E
RTS
H373C BRK
H373D BRK
H373E BRK
H373F LDX #$13
STX $19
H3743 LDY #$80
JSR H370C
JSR H3754
LDX $19
STA $00,X
DEC $19
BPL H3743
RTS
H3754 LDA #0
LDX #8
H3758 ROR H373E
ROL
DEX
BNE H3758
RTS
H3760 JSR H3884
LDY #0
H3765 STY $FB
LDY #1
JSR H370C
BNE H3780
LDY #$80
JSR H370C
JSR H3754
H3776 LDY $FB
STA ($F5),Y
JSR H34D0
BNE H3765
RTS
H3780 LDY #2
JSR H370C
STA $1D
LDA #3
STA $1C
H378B LDY #1
JSR H370C
LSR
ROL $1D
LDA $1D
LDX $1C
LDY H37F1,X
STY $1E
LDY H37F5,X
H379F CMP H37DD,Y
BNE H37AA
LDA H00,Y
JMP H3776
H37AA DEY
CPY $1E
BNE H379F
DEC $1C
BPL H378B
LDY #1
JSR H370C
LDY #$80
JSR H370C
JSR H3754
PHA
LDY #$80
JSR H370C
JSR H3754
STA $1C
PLA
LDY $FB
H37CE STA ($F5),Y
JSR H34D0
BNE H37D6
RTS
H37D6 DEC $1C
BNE H37CE
JMP H3765
H37DD HEX 1C
HEX 1D
HEX 35
HEX 00
HEX 01
HEX 02
HEX 03
HEX 08
HEX 09
HEX 0F
HEX 1B
HEX 05
HEX 06
HEX 0A
HEX 0B
HEX 0C
INV 'NOAD'
H37F1 HEX FF
HEX 02
HEX 0A
HEX 11
H37F5 HEX 02
HEX 0A
HEX 11
HEX 13
H37F9 HEX 01 ;start of RWTS parm table
H37FA HEX 60 ;slot * 16
H37FB HEX 01 ;drive
H37FC HEX 00 ;volume
H37FD HEX 00 ;track
H37FE HEX 00 ;sector
HEX 0A ;address of device char table
HEX 38 ;in this case, $380A
H3801 HEX 00 ;address of sector buffer lo
H3802 HEX 00 ;address of sector buffer hi
HEX 00 ;not used
HEX 00 ;byte count for partial sector
H3805 HEX 00 ;type of operation,$01=read
;$02=write,$03=seek,$04=format
H3806 BRK ;return code [error #]
H3807 HEX FE6001 ;last used volume, slot, drive
BRK
HEX 01EFD8 ;device chars table
H380E LDA #$11 ;operation done to track $11
STA H37FD
LDA #0 ;sector $0
STA H37FE
LDA #$B5
STA H3802 ;buffer is at $B500
JMP H3820 ;go do it.
H3820 LDY #H37F9 ;pointers to start of RWTS table
LDA #>H37F9
H3824 JSR RWTS ;go do it with RWTS
LDA #0
STA $48
BCC H3883 ;was there an error? no, return
JSR H38F4 ;switch in main memory
JSR DISPLAY
HEX 810C00
ASC " "
INV 'RWTS ERROR'
ASC " "
HEX 87
BRK
LDA H3806 ;kind of error (return code)
JSR PRBYTE ;go print it
JSR DISPLAY
ASC " on Track "
BRK
LDA H37FD ;occurring on track #XX
JSR PRBYTE
JSR DISPLAY
ASC ", Sector "
BRK
LDA H37FE
JSR PRBYTE ;sector #YY
JSR CLRCR
JSR CLRCR
JSR H45BE ;ask them to press a key...
LDA #0 ;reset lo byte of sector buffer
STA H3801
JMP START ;go restart
H3883 RTS
H3884 LDA #0 ;set up pointer to $2000
STA $F5 ;otherwise known as the
LDA #$20 ;track buffer...
STA $F6
RTS
H388D LDA #4 ;entry here-$F7 points to $804
BNE H3893
H3891 LDA #0 ;entry here-$F7 points to $800
H3893 STA $F7
LDA #8
STA $F8
LDA #0
STA H3907 ;reset memory mode to 0
STA H3908
RTS
H38A2 INC $F7
BNE H38DB
H38A6 INC $F8
LDA $F8
LDX H3908
CMP H390B,X
BNE H38DB
H38B2 INX
INX
INX
CPX #$12
BEQ H38DD
LDA H3909,X
BMI H38B2
STA H3907
LDA H390A,X
STA $F8
STX H3908
H38C9 JSR H38F4 ;set proper memory
LDA H3907 ;get "mode"?
BEQ H38DB ;is it a 0? yes...
CMP #1 ;is it a 1?
BNE H38DE ;no, go check for 2
BIT $C08B ;read and write ram $D000
BIT $C08B ;bank 1
H38DB LDA #1 ;set mode to 1?
H38DD RTS
H38DE CMP #2 ; is it a 2?
BNE H38EB ;no, go set aux
BIT $C083 ;if = 2 then read ram, $D000
BIT $C083 ;bank 2
LDA #1
RTS
H38EB STA $C003 ;read and write aux mem if
STA $C005 ;<> 2 and <> 1 and <> 0
LDA #1
RTS
H38F4 STA $C001 ;80Store is on
BIT $C054 ;turn off page 2
BIT $C057 ;Turn on Hires
STA $C002 ;read main 48k
STA $C004 ;write main 48k
BIT $C082 ;read ROM
RTS
H3907 BRK
H3908 BRK
H3909 BRK
H390A HEX 08
H390B HEX 20
HEX 00
HEX 48 ;$4800 to $B4FF-packed stuff
HEX B5
H390F HEX 01
HEX D0 ;16k ramcard bank2
HEX E0 ;$D000 to $DFFF-packed stuff
H3912 HEX 02
HEX D0 ;16kramcard bank1
HEX 00 ;$D000 to $FFFF-packed stuff
H3915 HEX 03
HEX 08 ;aux memory
HEX 20 ;$800 to $1FFF-packed stuff
H3918 HEX 03
HEX 40 ;aux memory
HEX B7 ;$4000 to $B6FF-packed stuff
H391B HEX FF
H391C JSR H38F4
JSR H3CF2
JSR H4690
LDA #1
STA H3805
LDA #0
JSR H4630
JSR H3891
H3932 JSR H38F4
INC H399B
INC H399B
BNE H395B
LDA $B600+1
BEQ H3980
STA H37FD
LDA $B600+2
H3948 STA H37FE
LDA #$B6
STA H3802
JSR H3820
JSR H3C66
LDA #$0C
STA H399B
H395B LDX H399B
LDA $B600,X
BEQ H3980
STA H37FD
INX
LDA $B600,X
STA H37FE
LDA $F8
STA H3802
JSR H38C9
JSR H3820
JSR H3C66
JSR H38A6
BNE H3932
H3980 JSR H3891
LDA #1
STA H373C
LDA #2
STA H3805
LDA $FA
STA H37FC
JSR H38F4
LDA #1
JSR H4630
RTS
H399B BRK
H399C STY H3526
JSR H38F4
JSR H3CF2
LDA #1
JSR H4630
JSR H46B2
LDA $F8
STA H3B6F
LDA H3907
STA H3B70
JSR H3891
LDA H3B6E
BNE H39F4
INC H3B6E
JSR H380E
LDA #$12
STA H3B71
STA HB530
STA H3B68
LDA #1
STA HB530+1
LDA HB535
STA H3B72
JSR H3A7F
JSR H3AA5
LDA H3B71
STA H3B6A
STA H3B6C
LDA H3B72
STA H3B6B
STA H3B6D
H39F4 JSR H3AA5
INC H3B73
INC H3B73
BNE H3A39
LDA #2
STA H3805
LDA H37FD
STA $B600+1
LDA H37FE
STA $B600+2
LDA #$B6
STA H3802
LDA H3B6A
STA H37FD
LDA H3B6B
STA H37FE
JSR H3820
LDA $B600+1
STA H3B6A
LDA $B600+2
STA H3B6B
JSR H3A7F
JSR H3C66
JMP H39F4
H3A39 JSR H3C66
LDX H3B73
LDA H37FD
STA $B600,X
LDA H37FE
STA $B600+1,X
LDA $F8
STA H3802
LDA #2
STA H3805
JSR H38C9
JSR H3820
JSR H38A6
JSR H38F4
LDA $F8
CMP H3B6F
BNE H39F4
LDA H3907
CMP H3B70
BNE H39F4
JSR H3891
LDA #0
JSR H4630
JSR H38C9
LDY H3526
RTS
H3A7F LDA #0
TAX
H3A82 STA $B600,X
INX
BNE H3A82
LDA H3C92
STA $B600+5
CLC
ADC #$7A
STA H3C92
LDA H3C93
STA $B600+6
ADC #0
STA H3C93
LDA #$0A
STA H3B73
RTS
H3AA5 DEC H3B72
BPL H3AAD
JSR H3B20
H3AAD LDA H3B72
JSR H3B78
LDA H3B71
ASL
ASL
ADC #$38
TAX
LDA HB500,X
AND H3B74
STA H3B69
LDA HB500+1,X
AND H3B75
ORA H3B69
STA H3B69
LDA HB500+2,X
AND H3B76
ORA H3B69
STA H3B69
LDA HB500+3,X
AND H3B77
ORA H3B69
BEQ H3AA5
LDA H3B74
EOR #$FF
AND HB500,X
STA HB500,X
LDA H3B75
EOR #$FF
AND HB500+1,X
STA HB500+1,X
LDA H3B76
EOR #$FF
AND HB500+2,X
STA HB500+2,X
LDA H3B77
EOR #$FF
AND HB500+3,X
STA HB500+3,X
LDA H3B71
STA H37FD
LDA H3B72
STA H37FE
RTS
H3B20 CLC
LDA HB530
ADC HB530+1
BNE H3B32
LDA #1
STA HB530+1
LDA #$12
BNE H3B3E
H3B32 CMP HB534
BCC H3B3E
LDA #$FF
STA HB530+1
LDA #$10
H3B3E CMP H3B68
BEQ H3B9B
STA HB530
STA H3B71
ASL
ASL
ADC #$38
TAX
LDA HB500,X
ORA HB500+1,X
ORA HB500+2,X
ORA HB500+3,X
BEQ H3B20
LDA HB535
STA H3B72
DEC H3B72
RTS
BRK
BRK
H3B68 BRK
H3B69 BRK
H3B6A BRK
H3B6B BRK
H3B6C BRK
H3B6D BRK
H3B6E BRK
H3B6F BRK
H3B70 BRK
H3B71 BRK
H3B72 BRK
H3B73 BRK
H3B74 BRK
H3B75 BRK
H3B76 BRK
H3B77 BRK
H3B78 TAX
LDA #0
STA H3B74
STA H3B75
STA H3B76
STA H3B77
SEC
H3B88 ROR H3B74
ROR H3B75
ROR H3B76
ROR H3B77
INX
CPX HB535
BLT H3B88
RTS
H3B9B JSR H38F4
JSR DISPLAY
HEX 810F00
INV 'ERROR!'
ASC " Disk Full."
HEX 878D8D
BRK
JSR H45BE
JMP H30E0
H3BC0 LDA HB500+1
STA H37FD
LDA HB500+2
STA H37FE
LDA #$B6
STA H3802
LDA #1
STA H3805
H3BD6 JSR H3820
LDX #$0B
H3BDB LDA $B600,X
BMI H3BFD
BEQ H3BFD
TXA
CLC
ADC #$23
TAX
BNE H3BDB
LDA $B600+1
BNE H3BF1
JMP H3B9B
H3BF1 STA H37FD
LDA $B600+2
STA H37FE
JMP H3BD6
H3BFD LDA H3B6C
STA $B600,X
INX
LDA H3B6D
STA $B600,X
INX
LDA #4
STA $B600,X
LDY #0
H3C12 INX
INY
LDA H470D+2,Y
BEQ H3C1E
STA $B600,X
BNE H3C12
H3C1E LDA #$0C
JSR H3C5D
LDA $0573
JSR H3C60
LDA $0574
JSR H3C60
LDA $0575
JSR H3C60
LDA #$0E
JSR H3C5D
LDA #SPC
H3C3C CPY #$1F
BEQ H3C47
STA $B600,X
INX
INY
BNE H3C3C
H3C47 LDA H3C90
STA $B600,X
INX
LDA H3C91
STA $B600,X
LDA #2
STA H3805
JSR H3820
RTS
H3C5D CLC
ADC #$B0
H3C60 STA $B600,X
INX
INY
RTS
H3C66 INC $0575
LDA $0575
CMP #$BA
BLT H3C87
LDA #$B0
STA $0575
INC $0574
LDA $0574
CMP #$BA
BLT H3C87
LDA #$B0
STA $0574
INC $0573
H3C87 INC H3C90
BNE H3C8F
INC H3C91
H3C8F RTS
H3C90 BRK
H3C91 BRK
H3C92 BRK
H3C93 BRK
H3C94 JSR H38F4 ;start off 80Store = on
JSR H44F8 ;was any key pressed?
BCC H3C9F ;no, keep going...
JSR H3CC1 ;check what type of key pressed
H3C9F LDA $F9
STA H37FD ;current track in RWTS table
LDA #$0F ;current sector in RWTS table
STA H37FE
H3CA9 LDA H37FE
CLC
ADC #$20 ;add $20 to current sector
STA H3802 ;becoming hi byte for file buff
JSR H3820 ;go read or write it
DEC H37FE ;do next sector
BPL H3CA9 ;did we do downto $0? no, go on
JSR H3CEB ;yes, keep the drive running
JSR H38C9 ;return us to the proper memory
;"mode"
RTS
H3CC1 CMP #ESC ;was the key <ESC>?
BNE H3CD1 ;no, go back, whew
JSR H3CF2 ;yes, nuts, shut off the drive
LDX #$FF
TXS ;reset the stack
JSR FIXRESET ;reset the reset vector
JMP H30E0 ;start almost from scratch
H3CD1 RTS
H3CD2 JSR H38F4 ;put us in main memory
STA H3CE6 ;put the character to be printed
LDA $F9
CLC
ADC #4
STA H3CE5 ;current track+4 = htab of print
JSR DISPLAY
HEX 8116
H3CE5 BRK ;htab to be modified
H3CE6 HEX AE00 ;single character to be printed
JMP H38C9 ;go exit through mem bnk switches
H3CEB LDX H37FA ;get current slot
STA $C089,X ;turn on the motor
RTS
H3CF2 LDX H37FA ;get current slot
STA $C088,X ;turn on the motor
RTS
H3CF9 LDA $FBB3 ;machine ID routine: get machID
CMP #6 ;is it a //e or //c?
BNE H3D17 ;no, clear carry, no 128k
LDA $C017 ;completely undocumented.
BMI H3D17 ;nope, no 128k
STA $C005 ;we seem to have 128k, but we're
STA $C003 ;still not sure, switch in aux
INX
H3D0C STX H0800
CPX H0C00 ;if they don't match, have 128k
BNE H3D1A
DEX
BPL H3D0C ;else, keep trying like crazy...
H3D17 CLC
BCC H3D1B ;nope, sorry, no 128k
H3D1A SEC ;yep, 128k
H3D1B STA $C004 ;switch in main memory
STA $C002
RTS
- -------------------------------
FORMAT LDX #1 ;which to format?:src or target
JSR H3221
JSR H4630 ;choose
JSR HOME
JSR DISPLAY ;stick the following on screen
HEX 810D00
ASC " Insert disk. "
ASC "Press <space> to format"
HEX 810E0A
ASC "or <esc> to abort."
BRK
H3D6F JSR H44D7 ;check for keypress & scroll >'s
JSR H3CC1 ;check for <esc>, if so, leave...
CMP #SPC ;is it a space?
BNE H3D6F ;no, go check for one again...
JSR HOME ;clear the screen
JSR DISPLAY ;put this up...
HEX 810D0C
ASC "Formatting..."
BRK
LDA #4 ;send format request to IOB table
STA H3805
LDA #$FE ;volume 254
STA H37FC
JSR H3820 ;format it
JSR H3E1C ;fill up $b500 with zeros
LDA #$11 ;track of first catalog sector
STA HB500+1 ;(building vtoc)
LDA #$0F ;sector of first catalog sector
STA HB500+2
LDA #3 ;version of dos used (3.3)
STA HB500+3
LDA #$FE ;volume #
STA HB500+6
LDA #$7A ;122 T/S pairs in a T/S list
STA HB527
LDA #$12 ;next track to allocated is $12
STA HB530
LDA #1 ;next track to be allocated = +1
STA HB530+1
LDA #$23 ;$23 tracks/disk = 35
STA HB534
LDA #$10 ;sectors per track = 16
STA HB535
LDA #$FF ;now build the free space
LDY #$3C ;bit map...
H3DD1 STA HB500,Y
STA HB500+1,Y
INY
INY
INY
INY
CPY #$C4
BLT H3DD1
LDA #0 ;mark $11 as being used
STA HB57C
STA HB57C+1
LDA #2 ;next operation is write (RWTS)
STA H3805
LDA #$11 ;done to track $11
STA H37FD
LDA #0 ;sector $0
STA H37FE
LDA #$B5 ;using the buffer at $b500
STA H3802
JSR H3820 ;go do it
JSR H3E1C ;fill up $b500 with zeros (again)
LDA #$11 ;track $11
STA HB500+1
LDA #$0E ;sector $e is next catalog sector
STA HB500+2
LDA #$0F ;written to track $11, sector $F
STA H37FE
H3E10 JSR H3820 ;build catalog sectors
DEC H37FE ;do next in sequence
DEC HB500+2
BNE H3E10 ;have we done all? no, loop...
RTS
H3E1C LDY #0 ;fill $B500 -$B5FF with zeros...
TYA
H3E1F STA HB500,Y
INY
BNE H3E1F
RTS
- -------------------------------
NEWSLOT LDX #0 ;routine to get new slot-drv-vol
H3E28 LDA H3EA5,X
STA CV
JSR VTAB
LDA #10
STA CH
LDA H4684,X
JSR H3E84
STA H4684,X
LDA #13
STA CH
LDA H4687,X
JSR H3E84
STA H4687,X
LDA #16
STA CH
LDA H468A,X
JSR H3EA7
STA H468A,X
INX
CPX #2
BLT H3E28
H3E5C LDX #0
LDA H4684
CMP H4685
BNE H3E78
LDA H4687
CMP H4688
BNE H3E78
LDA H468A
CMP H468B
BNE H3E78
LDX #$FF
H3E78 STX H468D
RTS
H3E7C JSR H3E5C
PLA
PLA
JMP H30E0
H3E84 STA H3EA4
H3E87 JSR H44DD
CMP #ESC
BEQ H3E7C
CMP #CR
BEQ H3EA0
CMP #"1"
BLT H3E87
CMP #"9"+1
BGE H3E87
JSR H44CD
AND #$0F
RTS
H3EA0 LDA H3EA4
RTS
H3EA4 BRK
H3EA5 ORA ($12),Y
H3EA7 STX H4384
STA H3EA4
LDA CH
STA H3F52
H3EB2 LDA H3F52
STA CH
LDY #3
LDA #SPC
H3EBB JSR H44CD
DEY
BNE H3EBB
LDA H3F52
STA CH
H3EC6 JSR H44DD
CMP #CR
BEQ H3F05
CMP #ESC
BNE H3ED7
JSR H3F2F
JMP H3E7C
H3ED7 CMP #BS
BNE H3EF0
CPY #0
BEQ H3EC6
DEY
JSR H44CD
LDA #SPC
JSR H44CD
LDA #BS
JSR H44CD
JMP H3EC6
H3EF0 CMP #"0"
BLT H3EC6
CMP #"9"+1
BGE H3EC6
JSR H44CD
AND #$0F
STA H3F4B,Y
INY
CPY #3
BLT H3EC6
H3F05 CPY #0
BEQ H3F2F
DEY
LDX #0
STX H3F51
H3F0F LDA H3F4B,X
BEQ H3F25
H3F14 CLC
LDA H3F4E,Y
ADC H3F51
BCS H3EB2
STA H3F51
DEC H3F4B,X
BNE H3F14
H3F25 INX
DEY
BPL H3F0F
LDA H3F51
STA H3EA4
H3F2F LDA H3F52
STA CH
LDA H3EA4
PHA
STA H461F
LDA #0
STA H4620
JSR H45DA
JSR H4621
PLA
LDX H4384
RTS
H3F4B BRK
BRK
BRK
H3F4E HEX 01 ;1
HEX 0A ;10
HEX 64 ;100 -used to hex to dec convert
H3F51 BRK
H3F52 BRK
- -------------------------------
RECONFIG JSR HOME ;start of reconfigure routine
H3F56 JSR H403B ;put the stuff on the screen
LDX #2
JSR H3221 ;go manage the screen & keypress
CMP #0 ;change lowercase?
BNE H3F75 ;no go check the other stuff
LDA H391B
CMP #$FF ;is it off?
BEQ H3F6D ;yes, change it to "on"
LDA #$FF ;no, keep it as "off"
BNE H3F6F ;go store it
H3F6D LDA #$DF ;flag to be and'ed to output
H3F6F STA H391B ;go store the flag then return
JMP H3F56
H3F75 CMP #1 ;is it a call to change lang card
BNE H3F97 ;no, go check the next option
LDA H390F
CMP #$FF ;is it already disabled?
BEQ H3F8B ;yes, then enable it
LDA #$FF ;no, disable it by replacing
STA H390F ;these two flags...
STA H3912
JMP H3F56 ;return
H3F8B LDX #1 ;store a 1 at first flag position
STX H390F ;enable $D000-$FFFF alt bank 1
INX
STX H3912 ;enable $D000-$FFFF alt bank 2
JMP H3F56 ;return
H3F97 CMP #2 ;is it a call to aux mem?
BNE H3FB8 ;no, go on to next...
LDA H3915
CMP #$FF ;is it already disabled?
BEQ H3FAD ;yes, go enable it
LDA #$FF ;no, disable it
STA H3915 ;reset flag ($900-$1FFF) *
STA H3918 ;reset flag ($400-$B6FF)
JMP H3F56 ;return
H3FAD LDX #3 ;enable it
STX H3915 ;set flag ($900-$1FFF) *
STX H3918 ;set flag ($900-$1FFF)
JMP H3F56 ;return
H3FB8 JSR HOME ;it HAS to be this option!
JSR DISPLAY ;go stick this on screen
HEX 810A00
ASC "Insert DDD 2.1 enhanced into "
BRK
LDX #2 ;stick slot, drive, vol on scrn
JSR H31EE
JSR H44D7 ;go check for keypress...
CMP #ESC ;is it <esc>?
BEQ H4035 ;yes, just exit...
LDA #2 ;go get right slot and volume...
JSR H4630
LDA #1 ;next operation to RWTS is read
STA H3805
LDA H468E ;get the proper track and sector
STA H37FD ;to read (this was stored when
LDA H468F ;the program initially started)
STA H37FE
LDA #$B5 ;buffer is at $B500
STA H3802
JSR H3820 ;go do it!
LDA HB500 ;look for the pattern:
CMP #$38 ;$38 $20 $DA at the front of
BNE H3FB8 ;the buffer. These values change
LDA HB500+1 ;as the program is reassembled
CMP #$20 ;it is also a pain if one wants
BNE H3FB8 ;to convert this to ProDOS or
LDA HB500+2 ;add functions of one's own.
CMP #$DA ;These bytes are in the front
BNE H3FB8 ;of the 10th sector
LDA #2 ;next operation is write
STA H3805
LDA #$41 ;point the RWTS buffer to $3841
STA H3801
LDA #$38
STA H3802
JSR H3820 ;go write it out
LDA #0 ;zero the lo byte of the buffer
STA H3801
H4035 JSR HOME ;clear the screen, redo screen
JMP H3F56
H403B JSR DISPLAY
HEX 81091C ;display message #9 in mess table
BRK
LDA H391B ;is it off or on?
CMP #$FF
BNE H404B ;no, go show it as "off"
LDA #0 ;yes, show it as "on"
H404B JSR H4069 ;go display either "on" or "off"
JSR DISPLAY
HEX 810A1C ;display #10 - "Language Card"
BRK
LDA H390F ;is it off or on?
JSR H4069 ;go print its status
JSR DISPLAY
HEX 810B1C ;display #11 - "//e Aux Mem"
BRK
LDA H3915
JSR H4069 ;show either "off" or "on"
RTS
H4069 BMI H4076 ;is it $80-$FF? yes, show "off"
JSR DISPLAY ;no, $00-$7F, show "on"
INV 'ON'
ASC "/OFF"
BRK
RTS
H4076 JSR DISPLAY ;show "off" in inverse
ASC "ON/"
INV 'OFF'
BRK
RTS
- -------------------------------
QUIT LDX #1 ;select source or target
JSR H3221
TAX
LDA H4684,X ;get slot to boot from
ORA #$C0 ;make a slot address from it
STA H40CA+2 ;make sure we boot from that
JSR HOME ;slot...
JSR DISPLAY ;stick this on screen
HEX 810906
ASC "Another fine program from:"
HEX 810B0A
ASC "The Assembly Line..."
BRK
H40CA JMP $C600 ;go boot-Holy Smoke we're done!
H40CD LDA #0 ;get the target slot
JSR H4630
LDA #24 ;bottom of screen is true bott
STA WNDBTM
JSR HOME
JSR DISPLAY ;stick this on screen
HEX 810611
ASC "Unpack"
HEX 810711
ASC "------"
HEX 810C00
HEX 82AD28 ;line of $28 dashes ($AD)
HEX 811600
HEX 82AD28 ;'nother line of $28 dashes
ASC " Use arrows and "
ASC "<cr> to select file"
BRK
JSR H4279 ;read catalog into $800,$900...
BNE H4153 ;there ARE file, go do routine
JSR DISPLAY ;hurray! no files!
HEX 811004
ASC "There are no files on this disk"
HEX 8D8D ;(add 2 cr's for emphasis)
BRK
JSR H45BE ;check for keypress
H4150 JMP H30D6 ;leave
H4153 LDA #0
STA CH
H4157 STA H4194 ;first filename to be inverted
JSR H4386 ;draw entire screen
H415D JSR H44D7 ;wait for keypress
CMP #FA ;is it a forward arrow?
BEQ H417C ;yes, move highlight down
CMP #CTRLJ ;is it a down arrow?
BEQ H417C ;yes, move highlight down
CMP #BS ;is it a backspace?
BEQ H4188 ;yes, move the highlight up
CMP #CTRLK ;is it an up arrow?
BEQ H4188 ;yes, move the highlight up
CMP #ESC ;is it <esc>?
BEQ H4150 ;yes, leave
CMP #CR ;is it a <cr>?
BNE H415D ;no, keep looking for keys
LDA H4194 ;get current file highlighted
RTS
H417C LDX H4194 ;which 1 is highlighted?
INX ;increment it (next down)
CPX $F2 ;are we about to hl the last 1?
BGE H415D ;yes, don't touch it, go back
TXA ;retain file # highlighted, ret
JMP H4157 ;go back, redraw ENTIRE screen
H4188 LDX H4194 ;get current file #
DEX ;decrement it (next up)
CPX #$FF ;have we gone back to the first?
BEQ H415D ;yes, don't touch it, just exit
TXA ;retain file highlighted
JMP H4157 ;redraw the ENTIRE screen
H4194 BRK ;current file highlighted
- -------------------------------
CATALOG LDX #1 ;go get source or target
JSR H3221
JSR H4630
LDA #6
STA WNDTOP
LDA #24
STA WNDBTM
JSR HOME
JSR H4279
JSR DISPLAY
ASC "Catalog of S"
BRK
LDA H37FA
LSR
LSR
LSR
LSR
ORA #$B0
JSR H44CD
JSR DISPLAY
ASC ",D"
BRK
LDA H37FB
ORA #$B0
JSR H44CD
JSR DISPLAY
ASC ",V"
BRK
LDA #0
STA H4620
LDA H3807
STA H461F
JSR H45DA
JSR H4621
JSR DISPLAY
HEX 8D8D
BRK
LDA #$0F
STA H4445
LDA #0
STA H4194
H41FC CMP $F2
BEQ H422B
ASL
TAX
LDA H0900,X
STA IOB
LDA H0900+1,X
STA IOB+1
JSR H44A7
JSR CLRCR
DEC H4445
BNE H4223
JSR H44D7
CMP #ESC
BEQ H422B
LDA #$0F
STA H4445
H4223 INC H4194
LDA H4194
BNE H41FC
H422B JSR DISPLAY
HEX 8D
ASC "Free sectors: "
BRK
LDA H4277
STA H461F
LDA H4278
STA H4620
JSR H45DA
JSR H4625
JSR H45BE
JMP H30D6
H4256 LDA #0
STA H4277
STA H4278
LDY #$38
H4260 LDA HB500,Y
LDX #8
H4265 ASL
BCC H4270
INC H4277
BNE H4270
INC H4278
H4270 DEX
BNE H4265
INY
BNE H4260
RTS
H4277 BRK
H4278 BRK
H4279 LDA #1 ;next operation by RWTS is read
STA H3805
LDA #0
STA IOB
LDA #$0A
STA IOB+1
LDA #0 ;pointer
STA $F2
JSR H380E ;read vtoc into $B500
JSR H4256 ;calculate # of free sectors
H4290 LDA HB500+1 ;track # of first catalog sector
BEQ H42DB ;is it a zero (yes! got problems)
STA H37FD ;store it here (IOB table)
LDA HB500+2 ;sector # of first catalog sector
STA H37FE ;store it in IOB table
JSR H3820 ;go get the sector
LDX #$0B ;get file descriptive entry
H42A3 STX H4383 ;store it for future fooling
LDA HB500,X ;get the track of first T/S list
BMI H42D0 ;greater than $7F, then deleted file
BEQ H42DB ;empty file entry (must be last file!)
JSR H42E1 ;go create entry in $A00 table
LDX $F2
LDA IOB
STA H0900,X
LDA IOB+1
INX
STA H0900,X
INX
STX $F2
TYA
CLC
ADC IOB
STA IOB
LDA IOB+1
ADC #0
STA IOB+1
LDA $F2 ;are we done?
BEQ H42DB ;yes, goto the end
H42D0 LDA H4383
CLC
ADC #$23 ;set up the pointer to next file
TAX ;description
BCC H42A3 ;everything is OK, get next FDE
BCS H4290 ;everything is NOT OK, reread
H42DB LDA $F2
LSR ;multiply by dec 10
STA $F2
RTS
H42E1 LDY $F2 ;file #
STA H0800,Y ;store it someplace safe
LDA HB500+1,X ;get sector of first t/s list
STA H0800+1,Y ;store it at $801, indexed with Y
LDA #$AA ;char for "*"
LDY HB500+2,X ;get file type and flags
BMI H42F5 ;oops, must be locked, use a "*"
LDA #SPC ;a space will do...(unlocked)
H42F5 LDY #0 ;store it in the $A00 buffer
STA (IOB),Y
INY
LDA HB500+2,X ;get the filetype & flags
AND #$7F ;chop off locked flag if set
LDX #$18 ;index to length of file type t
H4301 ASL ;shift, is it that type of file?
BCS H4309 ;yes, go label it in $A00
DEX ;nope, make the x-reg point at
DEX ;the next 3 letter file type
DEX
BNE H4301 ;if tried all, loop back...
H4309 LDA TYPES,X ;now, move the 3 letter descr
STA (IOB),Y ;downto the catalog buffer
INX
INY
CPY #4
BLT H4309
LDA #SPC
STA (IOB),Y ;put a space in buffer after
INY ;the file type (whew!)
LDX H4383 ;get multiple of this file
LDA HB521,X ;get lo byte of file length
STA H461F ;store it here
LDA HB521+1,X ;get hi byte of file length
STA H4620 ;store it here
JSR H45DA ;break up the file length into
;decimals in $6F,X
LDX #2
H432D LDA $6F,X
ORA #$B0
STA (IOB),Y ;put broken up file length into
INY ;$A00 buffer as decimal file
DEX ;length
BPL H432D
LDX H4383 ;get multiple of file we're on
INX
INX
INX
STX H4384
TXA
CLC
ADC #$1D
TAX
LDA #SPC
STA (IOB),Y ;put another space before file name
INY
H434A CMP HB500,X ;do we have a spc at the end of
BNE H4352 ;the filename? no, part of filenme
DEX ;no, decrement it, keep looking for
BNE H434A ;length of filename
H4352 INX
STX H4385 ;x is the length of filename
LDX H4384
H4359 LDA HB500,X ;now, fetch chars to $A00 until
STA (IOB),Y ;you reach the length of the
INY ;filename
INX
CPX H4385 ;have we reached the end?
BLT H4359 ;no, go get another char
LDA #0
STA (IOB),Y ;store a $00 as a marker...
INY ;return to sender
RTS
TYPES ASC "TXTINTBASBIN S R A B "
H4383 BRK
H4384 BRK
H4385 BRK
H4386 STA H4444 ;current highlighted file here
LDA #0 ;zero this out
STA H4443
LDA $F2 ;how many files do we have?
CMP #9
BLT H43B2 ;less than 9! don't bother with
;scrolling...
LDA H4444 ;is the highlighted item < 5?
CMP #5
BLT H43B2 ;yes, go print 'em
SEC
SBC #4 ;no subtract 4 to find #'s of the
STA H4443 ;filenames to be on screen
CLC ;is the next filename at the bottom?
ADC #9
CMP $F2
BLT H43B2 ;yes, print 'em
BEQ H43B2 ;yes, print 'em
LDA $F2 ;no, print the last 9 files.
SEC
SBC #9
STA H4443
H43B2 LDA H4444 ;# of file to be highlighted * 2
ASL
STA H4444 ;store it
LDA #9 ;file count starts at 9 works down
STA H4445
LDA H4443 ;are there any files above display?
BNE H43D0 ;yes, print "[more]"
JSR DISPLAY ;no, dash out the [more] if there
HEX 810C11
HEX 82AD06 ;print 6 dashes
BRK
JMP H43DD
H43D0 JSR DISPLAY ;stick it onscreen...
HEX 810C11
ASC "[more]"
BRK
H43DD LDA #13
STA CV
JSR VTAB
LDA #0
STA CH
H43E8 LDA H4443 ;get the # above the screen
ASL ;multiply by 2
TAX
LDA H0900,X
STA IOB
LDA H0900+1,X
STA IOB+1
CPX H4444 ;is this the one? (highlighted?)
BNE H43FF ;no, don't set inverse
JSR SETINV ;yes, invert it
H43FF JSR H44A7 ;print the file description!
JSR SETNORM ;normsl printing
JSR CLRCR
DEC H4445 ;the number to print becomes -1
BEQ H4422 ;down to 0? yes, go check [more]
INC H4443
LDA H4443 ;have we done the last filename?
CMP $F2
BLT H43E8 ;no, go print another
LDX H4445 ;have we printed last 9 filenames?
BEQ H4422 ;yes, write [more] if needed
H441C JSR CLRCR
DEX
BNE H441C
H4422 LDX H4443 ;how many filenames above display
INX
CPX $F2 ;if less than total # of files,
BLT H4435 then print [more]
JSR DISPLAY
HEX 811611 ;vtab 22, htab 17
HEX 82AD06 ;print 6 dashes over [more]
BRK
RTS
H4435 JSR DISPLAY
HEX 811611 ;vtab 22, htab 17 print "[more]
ASC "[more]"
BRK
RTS
H4443 BRK
H4444 BRK ;current highlighted file #
H4445 BRK ;9 downto 0 # of filnames so far
DISPLAY PLA ;get where we came from
STA IOB ;put it in there
PLA ;hi byte of where we were
STA IOB+1
TYA
PHA ;save the y-reg as well
H444E LDY #1
H4450 LDA (IOB),Y ;get next character in sequence
CMP #0 ;is it a $0?
BEQ H4494 ;yes, leave print routine
CMP #$81 ;is it a $81?
BEQ H4467 ;yes, continue normally
CMP #$82 ;is it an $82?
BEQ H447B ;yes, print a lot o them
JSR H44CD
H4461 JSR H44A0 ;increment the return pointer
JMP H4450 ;go get the same char, print it
H4467 JSR H44A0 ;increment the return pointer
LDA (IOB),Y ;next char is vert cursor pos
STA CV
JSR H44A0 ;increment the return pointer
LDA (IOB),Y ;next char is htab
STA CH
JSR VTAB ;go set the vtab
JMP H4461 ;check the next sequence of chars
H447B JSR H44A0 ;inc pointer to next character
LDA (IOB),Y ;grab next char-save it on stack
PHA
JSR H44A0 ;increment the pointer
LDA (IOB),Y ;get the next char
TAY ;# of these chars to print
PLA ;get the char to print
H4488 JSR H44CD ;mask it, then print it
DEY ;clear from right to abs left
BNE H4488 ;are we done? no, do another...
JSR H44A0 ;increment the pointer again
JMP H444E ;reset the y-reg, keep moving...
H4494 JSR H44A0 ;set it to go past the zero...
PLA ;get the y-reg off the stack
TAY
LDA IOB+1 ;get high byte of where we must
PHA ;return to, push it
LDA IOB ;get lo byte of return address,
PHA ;push it (becomes return address)
RTS ;go to the address we just pushed
;in this case, address after the
;00 end-of-message marker
H44A0 INC IOB ;increment the next character
BNE H44A6 ;pointer so we get the right
INC IOB+1 ;chars and return properly to
H44A6 RTS ;right after the hex 00.
H44A7 LDY #0
H44A9 LDA (IOB),Y ;get another character to print
BEQ H44B3 ;have we reached the $00 yet?
;if so, print it...
JSR H44CD ;mask it, then print it
INY ;get next character to print
BNE H44A9 ;go print it
H44B3 RTS ;leave
H44B4 ASL
TAY
LDA H32D1,Y
STA IOB
LDA H32D1+1,Y
STA IOB+1
LDY #0
H44C2 LDA (IOB),Y
BEQ H44CC
JSR H44CD
INY
BNE H44C2
H44CC RTS
H44CD CMP #$E0 ;is it already capital?
BLT H44D4 ;yes, go print it
AND H391B ;no, hopefully make it caps...
H44D4 JMP COUT ;gp print it!
H44D7 JSR H44F8 ;wait for a key press...
BCC H44D7 ;nope, none pressed...
RTS ;yes! wow!
H44DD TYA
PHA
LDY CH
LDA (BAS),Y
PHA
AND #$3F
STA (BAS),Y
JSR H44D7
STA H44F7
PLA
STA (BAS),Y
PLA
TAY
LDA H44F7
RTS
H44F7 BRK
H44F8 LDA KEY ;was a key pressed?
BMI H4511 ;yes! bly me!
INC H4516 ;no...
BNE H450F
INC H4517 ;every ($FF-$F8)*256 checks,
BNE H450F ;flash them symbols...
JSR H4564 ;keep flashing those symbols...
LDA #$F8 ;reset the counter
STA H4517
H450F CLC
RTS
H4511 STA STROBE
SEC
RTS
H4516 BRK
H4517 SED
H4518 LDX #0
H451A JSR H44DD
JSR H3CC1
CMP #CR
BEQ H4549
CMP #BS
BEQ H454F
CPX #$19
BGE H451A
CMP #CTRLJ
BNE H4534
LDA #$DB
BNE H4540
H4534 CMP #$8C
BNE H453C
LDA #$DC
BNE H4540
H453C CMP #SPC
BLT H451A
H4540 STA H4710,X
JSR H44CD
INX
BNE H451A
H4549 LDA #0
STA H4710,X
RTS
H454F CPX #0
BEQ H451A
JSR H44CD
LDA #SPC
JSR H44CD
LDA #BS
JSR H44CD
DEX
JMP H451A
H4564 PHA ;here begins the routine central
TXA ;to the moving of characters
PHA ;across the screen...
LDX #$10
H4569 LDA $0401,X
STA $0402,X
LDA $0601,X
STA $0602,X
DEX
CPX #1
BNE H4569
LDA #":" ;left scrolling character
LDX H45BD
CPX #3
BLT H4585
LDA #SPC
H4585 STA $0403
STA $0603
LDX #$16
H458D LDA $0400,X
STA $03FF,X
LDA $0600,X
STA $05FF,X
INX
CPX #$26
BNE H458D
LDA #":" ;right side scrolling character
LDX H45BD
CPX #3
BCC H45A9
LDA #SPC
H45A9 STA $0424
STA $0624
DEC H45BD
BPL H45B9
LDA #3
STA H45BD
H45B9 PLA
TAX
PLA
RTS
H45BD HEX 03
H45BE JSR DISPLAY ;put this on screen
ASC " <press a key>"
BRK
JSR H44D7 ;wait for a keypress,then return
RTS
H45DA LDA #0
LDX #4
H45DE STA $6F,X
DEX
BNE H45DE
LDX #4
BNE H45E9
H45E7 INC $6F,X
H45E9 LDA H461F ;get lo byte
STA H461D
LDA H4620 ;get hi byte
STA H461E
H45F5 SEC ;what this routine does is this:
LDA H461D ;takes a 2 byte hex # contained
SBC H4613,X ;in $461F and $4620 and converts
STA H461F ;it to a 5 digit decimal #
LDA H461E ;contained in $6F to $73
SBC H4618,X ;each hex digit in these memory
STA H4620 ;addresses represents a decimal
BCS H45E7 ;number, though...
DEX
BNE H45F5
LDA H461D
STA $6F
RTS
H4613 HEX 01 ;table for hex to dec conversion
HEX 0A ;10
HEX 64 ;100
HEX E8 ;1000
HEX 10
H4618 BRK
BRK
BRK
HEX 03
HEX 27
H461D BRK
H461E BRK
H461F BRK ;lo byte of file length
H4620 BRK ;hi byt of file length
H4621 LDX #2
BNE H4627
H4625 LDX #3
H4627 LDA $6F,X
JSR PRHEX
DEX
BPL H4627
RTS
H4630 TAX ;put device (0 or 1) in A
LDA H4684,X ;get the required slot
ASL ;now, multiply our choice by 16
ASL
ASL
ASL
STA H37FA ;store in RWTS table for slot
LDA H4687,X ;get drive
STA H37FB ;store in RWTS table for drive
LDA H468A,X ;get volume
STA H37FC ;store in RWTS table for volume
JSR H466D ;display source over target
TXA ;is it $0 (source) we want?
BNE H465B ;no! (rats) go see if it's for
JSR DISPLAY ;the target, else display source
HEX 811102 ;inverted
INV 'SOURCE'
BRK
RTS
H465B CPX #1 ;is it for the target drive?
BNE H466C ;nope, just return
JSR DISPLAY ;yes, invert it.
HEX 811202
INV 'TARGET'
BRK
H466C RTS
H466D JSR DISPLAY ;display "SOURCE:" over "TARGET"
HEX 811102
ASC "SOURCE"
HEX 811202
ASC "TARGET"
BRK
RTS
H4684 HEX 06 ;source slot
H4685 HEX 06 ;target slot
HEX 00
H4687 HEX 01 ;source drive
H4688 HEX 02 ;target drive
BRK
H468A HEX 00 ;source volume
H468B HEX 00 ;target volume
BRK
H468D BRK ;1=one drive - 0=more than one
H468E BRK
H468F BRK
H4690 LDA H468D ;do we have more than 1 drive?
BEQ H46B1 ;yes, return
JSR DISPLAY ;no, display this...
HEX 810C0A ;htab 12, vtab 10
ASC "Insert "
INV 'SOURCE'
ASC " disk"
BRK
JMP H46D0 ;go get a keypress, then return
H46B1 RTS
H46B2 LDA H468D ;do we have more than 1 drive?
BEQ H46B1 ;yes, just return
JSR DISPLAY ;nope, display this on screen
HEX 810C0A
ASC "Insert "
INV 'TARGET' ;next, get a keypress,
ASC " disk"00 ;continue on, then return
H46D0 JSR H3CF2 ;go turn off the drive
JSR H44D7 ;check for keypress, move stuff
JSR H3CC1 ;check for escape, if so, menu
JSR DISPLAY
HEX 810C05 ;vtab 12, htab 5, print
HEX 82 ;39 spaces to wipe out the line
DCI " '"
BRK
RTS
H46E4 LDA H468D
BNE H4690
JSR DISPLAY ;stick this on the screen
HEX 810C05
ASC "Insert "
INV 'SOURCE'
ASC " and "
INV 'TARGET'
ASC " disk"
BRK
H470D JMP H46D0
H4710 HEX 0000000000000000
HEX 0000000000000000
HEX 000000000000000000
LST OFF