*--------------------------------------------------------* * 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 ;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 ? 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 ? 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 to format" HEX 810E0A ASC "or to abort." BRK H3D6F JSR H44D7 ;check for keypress & scroll >'s JSR H3CC1 ;check for , 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 ? 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 " 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 ? BEQ H4150 ;yes, leave CMP #CR ;is it a ? 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 " " 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