[Copyright 1999,2002 Frank Durda IV, All Rights Reserved. Mirroring of any material on this page in any form is expressly prohibited. The official web site for this material is: http://nemesis.lonestar.org Contact this address for use clearances: clearance at nemesis.lonestar.org Comments and queries to this address: web_software_2011 at nemesis.lonestar.org]
MISOSYS EDAS-4.3 04/11/99 22:06:16 TAPE100 - LS-DOS 6.2 Page 00001 00001 ;TAPE100 - Tape/Disk & Disk/Tape Xfer Utility 00003 ; F440 00004 BREAKLC EQU 0F440H ;key location 003A 00005 LOADA EQU 3AH ; LD A,(nnnn) opcode 0016 00006 WRMASK EQU 'W'-'A' ;WRINTMASK port mask byte 000C 00007 MODMASK EQU 'M'-'A' ;MODOUT port mask byte 00008 ; 003A 00009 @INIT EQU 58 ;@INIT SVC # 003B 00010 @OPEN EQU 59 ;@OPEN SVC # 00011 ; 00E0 00012 PORTE0 EQU 0E0H 00EC 00013 MODOUT EQU 0ECH 00FF 00014 PORTFF EQU 0FFH 0078 00015 OPREG$ EQU 78H ;Operating Register 0084 00016 @OPREG EQU 84H ;Video/Keyboard Control Port F800 00017 VIDEO EQU 0F800H ;Start of Video RAM 00018 ; 0022 00019 WHICH1 EQU 22H ;Which one - 0 or 1 ? 000F 00020 TOOSHRT EQU 0FH ;Pulse too Short ? 003E 00021 TOOLONG EQU 3EH ;Pulse too Long ? 0006 00022 ROUTOFF EQU 6 ;Interrupt rout offset 000D 00023 DIFFER EQU 0DH ;Difference between 2 pulses 2B2F 00024 DELAY0 EQU 2B2FH ;Bit = 0 Delay count 1217 00025 DELAY1 EQU 1217H ;Bit = 1 Delay count 00026 ; 000E 00027 CURON EQU 14 ;Cursor on 000F 00028 CUROFF EQU 15 ;Cursor off 00029 ; 0000 00030 *GET SVCMAC:3 ;SVC Macro equivalents 00031 ;SVCMAC/ASM - LS-DOS Version VI 00032 *LIST OFF 00424 *LIST ON 0000 00426 *GET VALUES:3 ;Misc. equates 00427 ;VALUES/ASM - Version 6 00428 *LIST OFF 00455 *LIST ON 0000 00456 *GET COPYCOM:3 ;Copyright message 00457 ; COPYCOM - File for Copyright COMment block 00458 ; 0000 00459 *GET BUILDVER/ASM:3 00460 ; 00461 ; Buildver/asm is a bit of a kludge since not all utilities can load 00462 ; equates from LDOS60 and still compile. LOWCORE and everybody else 00463 ; relies on this setting, and it eventually ends up in LDOS60/EQU 00464 ; for programs that can use that. 00465 ; FFFF 00466 @BLD631 EQU -1 ;<631>Build 631 distribution (LEVEL 1B) 00467 ; These switches activate patches made since the 1B release. 00468 ; It is important that all earlier patches be enabled when a higher 00469 ; patch is enabled. 00470 ; Patches C thru F were published in TMQ IV.iv, page 32 (NOTE: the 00471 ; patch addresses listed for SPOOL in SPOOL1/FIX are 19H high.) FFFF 00472 @BLD631C EQU -1 ;<631>Apply 1C patches (SETKI) FFFF 00473 @BLD631D EQU -1 ;<631>Apply 1D patches (DIR) FFFF 00474 @BLD631E EQU -1 ;<631>Apply 1E patches (DIR & MEMDISK/DCT) FFFF 00475 @BLD631F EQU -1 ;<631>Apply 1F patches (SPOOL) 00476 ; Patches G and H were published in TMQ V.i, pages 10 and 18/19. FFFF 00477 @BLD631G EQU -1 ;<631>Apply 1G patches (//KEYIN,DIR,DO *) FFFF 00478 @BLD631H EQU -1 ;<631>Apply 1H patches (MEMORY) 00479 ; 00480 ;End of BUILDVER/ASM 00481 IF @BLD631 00483 ELSE 00484 COM '<*(C) 1982,3,4,6 by LSI*>' 00485 ENDIF 00486 ; 2600 00487 ORG 2600H 00488 ; 00489 START 2600 00490 @@CKBRKC ;Check for break 2600+3E6A 00491 LD A,106 2602+EF 00492 RST 40 2603 2804 00493 JR Z,STARTA ;Continue if not 2605 21FFFF 00494 LD HL,-1 ; else abort 2608 C9 00495 RET 00496 ; 2609 ED735C27 00497 STARTA LD (OLDSP+1),SP ;Save entry stack 260D CDC727 00498 CALL DOINIT ;Do initialization 00499 ; 00500 ; Was READ or WRITE entered ? 00501 ; 2610 3AD729 00502 LD A,(RRESP) ;P/u read response 2613 47 00503 LD B,A ;Xfer to B 2614 3ACF29 00504 LD A,(WRESP) ;P/u write response 2617 A8 00505 XOR B ;Are both the same ? 2618 2807 00506 JR Z,INP_R_W ;Yes - prompt 00507 ; 00508 ; Both weren't entered - which one was 00509 ; 261A 04 00510 CHKPRM INC B ;READ entered ? 261B 05 00511 DEC B 261C 281C 00512 JR Z,WRTAPE ; rite a tapefile 261E C3B126 00513 JP RDTAPE ; ead a tapefile 00514 ; 00515 ; Prompt for READ or WRITE 00516 ; 2621 E5 00517 INP_R_W PUSH HL ;Save command ptr 00518 ; 2622 21DB28 00519 LD HL,RDORWR ;"Read or Write" 2625 CD4928 00520 CALL DSPLY 00521 ; 00522 ; Input R (Read) or W (Write) 00523 ; 2628 0601 00524 LD B,1 ;Take input, 1 char 262A CD3528 00525 CALL INPUT 262D 7E 00526 LD A,(HL) ;P/u first char 262E E1 00527 POP HL ;Recover command ptr 262F CBAF 00528 RES 5,A ;Convert to U/C 2631 FE52 00529 CP 'R' ; ead ? 2633 CAB126 00530 JP Z,RDTAPE 2636 FE57 00531 CP 'W' ; rite ? 2638 20E7 00532 JR NZ,INP_R_W ;No - re-prompt 00533 ; 00534 ; WRITE diskfile to tapefile 00535 ; 263A 11F12D 00536 WRTAPE LD DE,FCB1 ;DE => Source FCB 263D 00537 @@FSPEC ;If a bad spec, 263D+3E4E 00538 LD A,78 263F+EF 00539 RST 40 2640 C40828 00540 CALL NZ,PRSOUR ; prompt for source 00541 ; 00542 ; WRITE - check if destination filespec input 00543 ; 2643 11112E 00544 WRTAPE2 LD DE,FCB2 ;DE => Destination FCB 2646 00545 @@FSPEC 2646+3E4E 00546 LD A,78 2648+EF 00547 RST 40 2649 C41028 00548 CALL NZ,PRDEST ;Prompt for destination 264C CDAC27 00549 CALL GTFILE ;Xfer into Filename 00550 ; 00551 ; Open Disk Source file 00552 ; 264F 11F12D 00553 OPDSRC LD DE,FCB1 ;DE => Source 2652 CDCF2C 00554 CALL OPEN 2655 C24627 00555 JP NZ,IOERR ;NZ - abort 00556 ; 00557 ; Can this disk file fit into memory ? 00558 ; 2658 2AFD2D 00559 LD HL,(FCB1+12) ;P/u ERN 265B 24 00560 INC H ;Too big ? 265C 25 00561 DEC H 265D C2BF29 00562 JP NZ,TOOBIG ;Yes - forget it 2660 3E00 00563 ENUF LD A,$-$ ;Enough memory ? 2662 C630 00564 ADD A,MEM<-8 ;Add mem start 2664 BD 00565 CP L 2665 DABF29 00566 JP C,TOOBIG ;No - forget it 00567 ; 00568 ; Read in Disk file & Write to tape 00569 ; 2668 CD3B2A 00570 CALL PRTAPE ;Display "Ready Tape" 266B CDBC2C 00571 CALL CURSOFF ;Turn of cursor 266E 217B27 00572 LD HL,READING ;Init "Reading : " 2671 CD4928 00573 CALL DSPLY ;Display line 2674 219D27 00574 LD HL,DFBUF ;HL => Disk Filename 2677 CD4928 00575 CALL DSPLY 267A CD692D 00576 CALL READSRC ;Read the source file 267D CDCA2D 00577 CALL GETPOS ;Get new cursor pos 2680 CD9B2D 00578 CALL ENDOKI ;Bring in Video 2683 218527 00579 LD HL,WRITING ;Display "Writing : " 2686 CD802C 00580 CALL DISPSTR 2689 219027 00581 LD HL,FILENM ;"filenm" 268C CD802C 00582 CALL DISPSTR 268F CD1A2A 00583 CALL CASSON ;Turn on cassette 2692 0680 00584 LD B,80H ;Pause a bit 2694 00585 @@PAUSE 2694+3E10 00586 LD A,16 2696+EF 00587 RST 40 2697 CDEC2B 00588 CALL WRHEAD ;Write Header 269A CD192C 00589 CALL WRDAT ;Write Data 269D 2A6627 00590 LD HL,(CURPOS) ;P/u new cursor pos 26A0 CDE32D 00591 CALL GETCRS 26A3 0603 00592 LD B,3 ;Give to system 26A5 00593 @@VDCTL 26A5+3E0F 00594 LD A,15 26A7+EF 00595 RST 40 26A8 CDA92D 00596 CALL DISDOKI ;Restore video 26AB CD2B2A 00597 CALL CASSOFF ;Turn off cassette 26AE C35827 00598 JP EXIT ;Clean exit 00599 ; 00600 ; Get Source & Destination for READ 00601 ; 26B1 11F12D 00602 RDTAPE LD DE,FCB1 ;First filespec legal ? 26B4 00603 @@FSPEC 26B4+3E4E 00604 LD A,78 26B6+EF 00605 RST 40 26B7 280D 00606 JR Z,CHKSEC ;Yes - check for second 00607 ; 00608 ; Accept first filename on tape 00609 ; 26B9 3EC9 00610 LD A,0C9H 26BB 320D2B 00611 LD (CORRECT),A 26BE 11112E 00612 LD DE,FCB2 ;Prompt for dest filename 26C1 CD2D28 00613 CALL PRDEST2 ;Prompt for dest 26C4 1825 00614 JR READFIL ; and read file 00615 ; 00616 ; Copy source FCB into destination 00617 ; 26C6 E5 00618 CHKSEC PUSH HL ;Save comm ptr 26C7 EB 00619 EX DE,HL 26C8 11112E 00620 LD DE,FCB2 ;DE => Disk FCB 26CB 012000 00621 LD BC,32 26CE D5 00622 PUSH DE ;Save dest FCB 26CF EDB0 00623 LDIR 26D1 D1 00624 POP DE 26D2 E1 00625 POP HL 00626 ; 00627 ; P/u destination filespec 00628 ; 26D3 2B 00629 DEC HL ;Skip leading spaces 26D4 23 00630 SKPSPC INC HL 26D5 7E 00631 LD A,(HL) ;P/u char 26D6 FE20 00632 CP ' ' ;Space ? 26D8 28FA 00633 JR Z,SKPSPC 26DA FE0E 00634 CP CR+1 ;Eol ? 26DC 3807 00635 JR C,GTFILE2 ;Yes - use default 26DE FE28 00636 CP '(' ;Eol ? 26E0 2803 00637 JR Z,GTFILE2 26E2 00638 @@FSPEC ;Xfer in if legal 26E2+3E4E 00639 LD A,78 26E4+EF 00640 RST 40 00641 ; 00642 ; Transfer filename into buffer left just'd 00643 ; 26E5 11F12D 00644 GTFILE2 LD DE,FCB1 ;DE => Source 26E8 CDAC27 00645 CALL GTFILE ;Stuff Filename into buff 00646 ; 00647 ; Read in Tape Source file 00648 ; 26EB 11112E 00649 READFIL LD DE,FCB2 ;@INIT the dest file 26EE CDCB2C 00650 CALL INIT 26F1 C24627 00651 JP NZ,IOERR 26F4 DD4E06 00652 LD C,(IX+6) ;P/u drive # 26F7 00653 @@CKDRV ;Write protected ? 26F7+3E21 00654 LD A,33 26F9+EF 00655 RST 40 26FA 3E0F 00656 LD A,15 ;Write Protected Disk 26FC DA4627 00657 JP C,IOERR ;Good bye 26FF CD3B2A 00658 CALL PRTAPE ;"Ready Cassette" 2702 CDBC2C 00659 CALL CURSOFF 2705 CD9B2D 00660 CALL ENDOKI ;Bring in KI & DO RAM 2708 CDCA2D 00661 CALL GETPOS ;Calculate cursor posn 270B 217B27 00662 LD HL,READING ;Display "Reading : " 270E CD802C 00663 CALL DISPSTR 2711 CD1A2A 00664 CALL CASSON ;Turn on cassette 2714 CDD82A 00665 CALL RDHEAD ;Search for header 2717 CD492A 00666 CALL RDDAT ;Read in Data 271A F3 00667 DI ;Make sure off 271B CD2B2A 00668 CALL CASSOFF ;Turn off cassette 271E 218527 00669 LD HL,WRITING ;Display "Writing : " 2721 CD802C 00670 CALL DISPSTR ; 2724 219D27 00671 LD HL,DFBUF ;HL => Destination 2727 CD802C 00672 CALL DISPSTR ; 272A 2A6627 00673 LD HL,(CURPOS) ;P/u new cursor position 272D CDE32D 00674 CALL GETCRS ;Convert to Row, Column 2730 0603 00675 LD B,3 ;Give system new cursor 2732 00676 @@VDCTL ; 2732+3E0F 00677 LD A,15 2734+EF 00678 RST 40 2735 CDA92D 00679 CALL DISDOKI ;Enable real RAM 2738 1806 00680 JR WRTDES2 ; 273A CDA92D 00681 FORNOW CALL DISDOKI ;Enable real RAM 273D CD2B2A 00682 CALL CASSOFF ;Turn off cassette 2740 CD512D 00683 WRTDES2 CALL WRTDEST ;Write Destination file 2743 C35827 00684 JP EXIT ;Clean exit 00685 ; 00686 ; 2746 6F 00687 IOERR LD L,A ;Xfer error # to HL 2747 2600 00688 LD H,0 ; 2749 F6C0 00689 OR 0C0H ;Abbrev, return 274B 4F 00690 LD C,A 274C 00691 @@ERROR ;Display error 274C+3E1A 00692 LD A,26 274E+EF 00693 RST 40 274F 180A 00694 JR OLDSP ; and abort 00695 ; 2751 C35427 00696 ILLEGAL JP ABORT ;For now 00697 ; 2754 21FFFF 00698 ABORT LD HL,-1 ;Show error return 2757 DD 00699 DB 0DDH ;Skip LD HL,0 2758 210000 00700 EXIT LD HL,0 ;Clean exit 275B 310000 00701 OLDSP LD SP,$-$ ;P/u original SP 275E FB 00702 EI ;Re-enable interrupts 275F 00703 @@CKBRKC ;Clear Break 275F+3E6A 00704 LD A,106 2761+EF 00705 RST 40 2762 C9 00706 RET ; and RETurn 00707 ; 2763 00 00708 DLEN DB 0,0,0 00 00 2766 0000 00709 CURPOS DW 0 ;Cursor Position 2768 0A 00710 READERR DB LF,'Tape Read Error ',CR 54 61 70 65 20 52 65 61 64 20 45 72 72 6F 72 20 20 0D 277B 52 00711 READING DB 'Reading: ',ETX 65 61 64 69 6E 67 3A 20 03 2785 0A 00712 WRITING DB LF,'Writing: ',ETX 57 72 69 74 69 6E 67 3A 20 03 2790 46 00713 FILENM DB 'FILENM',CR 49 4C 45 4E 4D 0D 2797 00714 BUFFER DS 6 279D 46 00715 DFBUF DB 'Filename/ext:d',ETX 69 6C 65 6E 61 6D 65 2F 65 78 74 3A 64 03 00716 ; 00717 ; 00718 ; GTFILE - Stuff filename from FCB into buffer 00719 ; DE => FCB with filename contained 00720 ; 27AC 219027 00721 GTFILE LD HL,FILENM ;HL => Filename buffered 27AF E5 00722 PUSH HL ;Save it 27B0 0606 00723 LD B,6 ;Init to all spaces 27B2 3620 00724 CLEAN LD (HL),' ' 27B4 23 00725 INC HL 27B5 10FB 00726 DJNZ CLEAN 27B7 E1 00727 POP HL ;HL => Filename dest 27B8 0606 00728 LD B,6 ;Only accept first 6 00729 ; 27BA 1A 00730 GETFILN LD A,(DE) ;P/u char 27BB FE0E 00731 CP CR+1 ;End ? 27BD D8 00732 RET C ;Yes - done 27BE FE2E 00733 CP '.' ;Start of password? 27C0 C8 00734 RET Z ;Yes - done 27C1 77 00735 LD (HL),A ;Stuff into filename buff 27C2 23 00736 INC HL ;Bump 27C3 13 00737 INC DE 27C4 10F4 00738 DJNZ GETFILN 27C6 C9 00739 RET ;Done - RETurn 00740 ; 00741 ; DOINIT - Do initialization 00742 ; 27C7 00743 DOINIT @@FLAGS ;IY => System Flags 27C7+3E65 00744 LD A,101 27C9+EF 00745 RST 40 00746 ; 00747 ; Calculate highest mem address of buffer 00748 ; 27CA E5 00749 PUSH HL ;Save command line stuff 27CB 210000 00750 LD HL,0 ;P/u HIGH$ 27CE 45 00751 LD B,L 27CF FDCB024E 00752 BIT 1,(IY+CFLAG$) ;@CMNDR ? 27D3 2801 00753 JR Z,USEHI 27D5 04 00754 INC B ;Use LOW$ 27D6 00755 USEHI @@HIGH$ 27D6+3E64 00756 LD A,100 27D8+EF 00757 RST 40 27D9 23 00758 INC HL ;Set hi-mem byte 27DA 25 00759 DEC H ;Give some lee-way 27DB 25 00760 DEC H 27DC 7C 00761 LD A,H ; & stuff in R/W routines 27DD 326126 00762 LD (ENUF+1),A 00763 ; 00764 ; Display Log-on message 00765 ; 27E0 215328 00766 LD HL,HELLO$ ;Display banner 27E3 CD4928 00767 CALL DSPLY 27E6 E1 00768 POP HL ;Process parm line 00769 ; 00770 ; P/u READ or WRITE parm if entered 00771 ; 27E7 E5 00772 PUSH HL ;Save HL 27E8 2B 00773 DEC HL ;Back up one 27E9 23 00774 CKPLP INC HL ;Bump 27EA 7E 00775 LD A,(HL) ;P/u char 27EB FE0E 00776 CP CR+1 ;Eol ? 27ED 380D 00777 JR C,DUNLIN ;Yes - done 27EF FE28 00778 CP '(' ;Paramter entered ? 27F1 20F6 00779 JR NZ,CKPLP ;No - go til eol 00780 ; 00781 ; Process parameter entry 00782 ; 27F3 11C829 00783 LD DE,PARMTBL ;DE => Param table 27F6 00784 @@PARAM 27F6+3E11 00785 LD A,17 27F8+EF 00786 RST 40 27F9 C2BB29 00787 JP NZ,PRMERR ;NZ - parameter error 27FC E1 00788 DUNLIN POP HL ;Rcvr command ptr 00789 ; 00790 ; If C=N entered then use checksum 00791 ; 27FD 01FFFF 00792 CPARM LD BC,0FFFFH ;Default no checksum 2800 04 00793 INC B ;User requesting checksum? 2801 C0 00794 RET NZ ;Yes, return 2802 3EC9 00795 LD A,0C9H ;Init RET opcode 2804 32242B 00796 LD (CHKERR+1),A ;Stuff into Checksum error 2807 C9 00797 RET 00798 ; 00799 ; PRSOUR/PRDEST - Prompt for Source & Destination 00800 ; 2808 E5 00801 PRSOUR PUSH HL ;Save HL 2809 210A29 00802 LD HL,DSF ;"Disk Source Filename" 280C 0617 00803 LD B,23 ;23 chars max 280E 1806 00804 JR DOINPUT 2810 E5 00805 PRDEST PUSH HL ;Save HL 2811 212329 00806 LD HL,TDF ;"Tape Dest Filename" 2814 0606 00807 LD B,6 ;6 char max 2816 CD4928 00808 DOINPUT CALL DSPLY ;Display prompt 2819 E5 00809 PUSH HL ;Save prompt start 281A CD3528 00810 CALL INPUT ;Input 281D 00811 @@FSPEC ;Legal ? 281D+3E4E 00812 LD A,78 281F+EF 00813 RST 40 2820 E1 00814 POP HL ;HL => Prompt string 2821 20F3 00815 JR NZ,DOINPUT ;Reprompt on bad name 2823 E1 00816 POP HL ;Recover ptr 2824 C9 00817 RET ; and return 00818 ; 00819 ; PRSOUR2/PRDEST2 - Prompt for READ source/dest 00820 ; 2825 E5 00821 PRSOUR2 PUSH HL ;Save HL 2826 21F128 00822 LD HL,TSF ;"Tape Source filename" 2829 0606 00823 LD B,6 ;6 char max 282B 18E9 00824 JR DOINPUT 282D E5 00825 PRDEST2 PUSH HL ;Save HL 282E 214129 00826 LD HL,DDF ;"Disk Destination file" 2831 0617 00827 LD B,23 ;23 char max 2833 18E1 00828 JR DOINPUT 00829 ; 00830 ; INPUT - Line input routine 00831 ; 2835 D5 00832 INPUT PUSH DE ;Save DE 2836 C5 00833 PUSH BC ; and BC 2837 21312E 00834 LD HL,INBUFF ;HL => Input buffer 283A 00835 @@KEYIN ;Input line 283A+3E09 00836 LD A,9 283C+EF 00837 RST 40 283D DA5427 00838 JP C,ABORT ; abort 2840 C1 00839 POP BC ;Restore regs 2841 D1 00840 POP DE 2842 C9 00841 RET 00842 ; 2843 D5 00843 DSP PUSH DE ;Save DE 2844 00844 @@DSP ;Output char 2844+3E02 00845 LD A,2 2846+EF 00846 RST 40 2847 1804 00847 JR EXDSP 00848 ; 2849 D5 00849 DSPLY PUSH DE ;Save DE 284A 00850 @@DSPLY ;Display message 00851 IFEQ 00H,1 00852 LD HL, 00853 ENDIF 284A+3E0A 00854 LD A,10 284C+EF 00855 RST 40 284D D1 00856 EXDSP POP DE ;Rcvr DE 284E C8 00857 RET Z ;RETurn if OK 284F C34627 00858 JP IOERR ; else abort 00859 ; 2852 00 00860 COUNT DB 0 ;Count 00861 ; 2853 1C 00862 HELLO$ DB 1CH,1FH,'TAPE100' 1F 54 41 50 45 31 30 30 285C 00863 *GET CLIENT:3 00864 ;CLIENT/ASM - File to establish sign-on headers 00865 ; and version numbers. 00866 ; 00867 ; EACH STRING SHOULD CONTAIN ONLY 63 CHARACTERS !! 00868 ; 00869 IF @BLD631 00870 ; 12345678901234567890123456789012345678901234567890 285C 20 00871 DB ' - 6.3.1 - Copyright 1982/83/84/86/90 by MISOSYS, ';<631> 2D 20 36 2E 33 2E 31 20 2D 20 43 6F 70 79 72 69 67 68 74 20 31 39 38 32 2F 38 33 2F 38 34 2F 38 36 2F 39 30 20 62 79 20 4D 49 53 4F 53 59 53 2C 20 288E 49 00872 DB 'Inc., ',10 ;<631> 6E 63 2E 2C 20 20 20 20 20 20 20 0A 00873 ELSE 00874 DB ' - 6.3.0 - Copyright 1982/83/84/86 by Logical Syst' 00875 DB 'ems, Inc. ',10 00876 ENDIF 00877 ; 00878 ; DB 'All Rights Reserved. Licensed 1982/83/84 to Tandy ' 00879 ; DB 'Corporation.',10,13 00880 ; 00881 ; DB 'All Rights Reserved. Beta-TEST Level/AD, DO NOT DI' 00882 ; DB 'STRIBUTE !! ',10,13 00883 ; DB 'All Rights reserved by LSI, 8970 N. 55th St. Milwa' 00884 ; DB 'ukee, Wisc. ',10,13 289B 41 00885 DB 'All Rights Reserved. Unauthorized duplication is p' 6C 6C 20 52 69 67 68 74 73 20 52 65 73 65 72 76 65 64 2E 20 55 6E 61 75 74 68 6F 72 69 7A 65 64 20 64 75 70 6C 69 63 61 74 69 6F 6E 20 69 73 20 70 28CD 72 00886 DB 'rohibited. ',10,13 6F 68 69 62 69 74 65 64 2E 20 20 0A 0D 00887 ; 28DB 3C 00888 RDORWR DB ' ead or rite ? ',CURON,ETX 52 3E 65 61 64 20 6F 72 20 3C 57 3E 72 69 74 65 20 3F 20 0E 03 28F1 54 00889 TSF DB 'Tape Source Filespec ? ',CURON,ETX 61 70 65 20 53 6F 75 72 63 65 20 46 69 6C 65 73 70 65 63 20 3F 20 0E 03 290A 44 00890 DSF DB 'Disk Source Filespec ? ',CURON,ETX 69 73 6B 20 53 6F 75 72 63 65 20 46 69 6C 65 73 70 65 63 20 3F 20 0E 03 2923 54 00891 TDF DB 'Tape Destination Filespec ? ',CURON,ETX 61 70 65 20 44 65 73 74 69 6E 61 74 69 6F 6E 20 46 69 6C 65 73 70 65 63 20 3F 20 0E 03 2941 44 00892 DDF DB 'Disk Destination Filespec ? ',CURON,ETX 69 73 6B 20 44 65 73 74 69 6E 61 74 69 6F 6E 20 46 69 6C 65 73 70 65 63 20 3F 20 0E 03 295F 52 00893 TREADY DB 'Ready Cassette & Press ' 65 61 64 79 20 43 61 73 73 65 74 74 65 20 26 20 50 72 65 73 73 20 3C 45 4E 54 45 52 3E 297D 0E 00894 DB CURON,ETX 03 297F 50 00895 PRMERR$ DB 'Parameter error',LF,CR 61 72 61 6D 65 74 65 72 20 65 72 72 6F 72 0A 0D 2990 46 00896 TOOBIG$ DB 'File too large to fit in available ' 69 6C 65 20 74 6F 6F 20 6C 61 72 67 65 20 74 6F 20 66 69 74 20 69 6E 20 61 76 61 69 6C 61 62 6C 65 20 29B3 6D 00897 DB 'memory',LF,CR 65 6D 6F 72 79 0A 0D 00898 ; 00899 ; 00900 ; Error Exit routine 00901 ; 29BB 217F29 00902 PRMERR LD HL,PRMERR$ ;"Parameter Error" 29BE DD 00903 DB 0DDH ;Skip 29BF 219029 00904 TOOBIG LD HL,TOOBIG$ ;"File too Big" 00905 ; 29C2 00906 @@LOGOT ;Display error 00907 IFEQ 00H,1 00908 LD HL, 00909 ENDIF 29C2+3E0C 00910 LD A,12 29C4+EF 00911 RST 40 29C5 C35427 00912 JP ABORT ;Good bye 00913 ; 00914 ; Parameter Table 00915 ; 29C8 80 00916 PARMTBL DB 80H ;6.x @PARAM 29C9 55 00917 DB FLAG!ABB!5 29CA 57 00918 DB 'WRITE' 52 49 54 45 29CF 00 00919 WRESP DB 0 29D0 E629 00920 DW WPARM 00921 ; 29D2 54 00922 DB FLAG!ABB!4 29D3 52 00923 DB 'READ' 45 41 44 29D7 00 00924 RRESP DB 0 29D8 E429 00925 DW RPARM 00926 ; 29DA 54 00927 DB FLAG!ABB!4 29DB 43 00928 DB 'CHECK' 48 45 43 4B 29E0 00 00929 CRESP DB 0 29E1 FE27 00930 DW CPARM+1 00931 ; 29E3 00 00932 DB 0 00933 ; 29E4 0000 00934 RPARM DW 0 29E6 0000 00935 WPARM DW 0 00936 ; 29E8 00 00937 DC 50,0 ;Patch space 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00938 ; 2A1A 00939 *GET TAPE100A:3 00940 ;TAPE100A/ASM - Tape I/O routines 00941 ; CASSON - Turn Cassette Motor On 00942 ; 2A1A F3 00943 CASSON DI ;Disable interrupts 2A1B CDB52D 00944 CALL SWAP38 ;Grab RST 38H vector 2A1E DBE0 00945 IN A,(PORTE0) ;Clear any latches 2A20 DBEC 00946 IN A,(MODOUT) ;Clear any latches 2A22 3E02 00947 LD A,2 ;Motor on, slow speed 2A24 D3EC 00948 OUT (MODOUT),A ;Turn on motor 2A26 3E03 00949 LD A,3 ;Disable other interrupts 2A28 D3E0 00950 OUT (PORTE0),A 2A2A C9 00951 RET 00952 ; 00953 ; CASSOFF - Turn off Cassette Motor 00954 ; 2A2B FD7E16 00955 CASSOFF LD A,(IY+WRMASK) ;P/u original 2A2E D3E0 00956 OUT (PORTE0),A ;Set up R/F interrupt 2A30 DBFF 00957 IN A,(PORTFF) ;Clear 1500 bd interrupts 2A32 FD7E0C 00958 LD A,(IY+MODMASK) ;Turn off motor 2A35 D3EC 00959 OUT (MODOUT),A 2A37 CDB52D 00960 CALL SWAP38 ;Restore RST 38H vector 2A3A C9 00961 RET 00962 ; 00963 ; PRTAPE - Prompt for "Tape Ready" & turn motor on 00964 ; 2A3B 215F29 00965 PRTAPE LD HL,TREADY ;"Ready cassette & 2A3E CD4928 00966 CALL DSPLY 2A41 0601 00967 NOTENT LD B,1 ;Just 1 char 2A43 CD3528 00968 CALL INPUT ; or 2A46 C3BC2C 00969 JP CURSOFF ;Turn off Cursor & RETurn 00970 ; 00971 ; RDDAT - Read in a tape file 00972 ; 2A49 21002F 00973 RDDAT LD HL,MEM-100H ;HL => Start of file 2A4C 24 00974 RDDAT2 INC H ;Bump hi-byte 2A4D CD582A 00975 CALL RDDATA ;Read a block 2A50 C8 00976 RET Z ;Eof ? 2A51 3E00 00977 EOTF LD A,$-$ ;At top of memory ? 2A53 BC 00978 CP H 2A54 20F6 00979 JR NZ,RDDAT2 ;No 2A56 B7 00980 OR A ;Top of mem - 2A57 C9 00981 RET ;RETurn NZ 00982 ; 00983 ; RDDATA - Read in a block of Data 00984 ; HL => Destination of Block 00985 ; 2A58 CD392B 00986 RDDATA CALL RDSYNC ;Read sync field 2A5B CDA72B 00987 CALL RDBYTE ;Read a byte 2A5E FE8D 00988 CP 8DH ;Legal ? 2A60 C25127 00989 JP NZ,ILLEGAL ;No - bad news 2A63 110000 00990 LD DE,0 ;D=EOF flag, E = checksum 00991 ; 2A66 CDA72B 00992 RDLP1 CALL RDBYTE ;Read a byte 2A69 77 00993 LD (HL),A ;Stuff into buffer 00994 ; 00995 ; Check for End of File byte X'1A' 00996 ; 2A6A FE1A 00997 CP 1AH ;Eof ? 2A6C 2005 00998 JR NZ,AFTER ;No 2A6E BA 00999 CP D ;Been here before ? 2A6F 2802 01000 JR Z,AFTER ;First time ? 2A71 57 01001 LD D,A ;Set D = 1AH 2A72 45 01002 LD B,L ;Yes - set B = pos 01003 ; 01004 ; Add byte to checksum 01005 ; 2A73 83 01006 AFTER ADD A,E ;Add checksum 2A74 5F 01007 LD E,A ;Xfer back to E 2A75 2C 01008 INC L ;Bump 2A76 20EE 01009 JR NZ,RDLP1 2A78 ED44 01010 NEG ;Negate checksum 2A7A 5F 01011 LD E,A ;Stuff back in E 01012 ; 01013 ; Verify Checksum byte 01014 ; 2A7B CDA72B 01015 CALL RDBYTE ;Read in byte 2A7E BB 01016 CP E ;Checksums match ? 2A7F C4232B 01017 CALL NZ,CHKERR ;No - checksum error 01018 ; 01019 ; Stuff EOF offset byte into WRTDEST routine 01020 ; 2A82 7C 01021 LD A,H ;P/u eom 2A83 325C2D 01022 LD (EOTF2+1),A ;Stuff into WRTDEST 2A86 78 01023 LD A,B ;P/u byte 2A87 3C 01024 INC A ;Bump 2A88 32612D 01025 LD (OFFSET+1),A 01026 ; 01027 ; Read past 20 dummy zeroes 01028 ; 2A8B 0614 01029 LD B,20 2A8D CDA72B 01030 RDLP2 CALL RDBYTE 2A90 10FB 01031 DJNZ RDLP2 01032 ; 01033 ; Set Z flag if at EOF 01034 ; 2A92 7A 01035 LD A,D ;Eof ? 2A93 FE1A 01036 CP 1AH 2A95 C9 01037 RET ;Done 01038 ; 01039 ; RDBIT - Read a Bit from Cassette 01040 ; 2A96 0E00 01041 RDBIT LD C,0 ;Init count = 0 2A98 FB 01042 EI ;Back on 2A99 0C 01043 RBLP INC C ;Bump count 2A9A 3A40F4 01044 LD A,(BREAKLC) ; hit ? 2A9D E604 01045 AND 4 2A9F 28F8 01046 JR Z,RBLP ;No - wait for interrupt 01047 ; 01048 ; key hit - Abort 01049 ; 2AA1 F3 01050 DI ;Cancel next interrupt 2AA2 CDA92D 01051 CALL DISDOKI ;Put *DO & *KI back 2AA5 CD2B2A 01052 CALL CASSOFF ;Turn off cassette 2AA8 0E0D 01053 LD C,CR ;End line 2AAA CD4328 01054 CALL DSP 2AAD C35427 01055 JP ABORT ;Go to abort routine 01056 ; 01057 ; Interrupt Handler - Comes from RST 38 01058 ; 2AB0 C3B32A 01059 RST38V JP $+3 ;Wait 2AB3 F5 01060 PUSH AF ;Save status 2AB4 DBE0 01061 IN A,(PORTE0) ;Read port 2AB6 1F 01062 RRA ;Bit 0 low ? 2AB7 D2C12A 01063 JP NC,BIT0LOW 2ABA 1F 01064 RRA ;Bit 1 low ? 2ABB D2C52A 01065 JP NC,BIT1LOW 2ABE F1 01066 POP AF ;Recover status 2ABF FB 01067 EI ;Back on 2AC0 C9 01068 RET ;RETurn 01069 ; 01070 ; Set E = bit image - bit 0 or 1 01071 ; 2AC1 1E01 01072 BIT0LOW LD E,1 ;High 2AC3 1802 01073 JR BIT1LOW+2 ;Add interrupt offset 2AC5 1E00 01074 BIT1LOW LD E,0 ;Low 2AC7 3E06 01075 LD A,ROUTOFF ;Add interrupt routine 2AC9 81 01076 ADD A,C ;Offset to C 2ACA 4F 01077 LD C,A 01078 ; 01079 ; Is the Head on a valid pulse ? 01080 ; 2ACB DBFF 01081 IN A,(PORTFF) ;Read cassette level 2ACD E601 01082 AND 1 ;Mask off all but bit 0 2ACF BB 01083 CP E ;Same as given level ? 2AD0 2003 01084 JR NZ,WAITINT ;No - wait for next inter 01085 ; 01086 ; Valid pulse - Get out of interrupt routine 01087 ; 2AD2 F1 01088 POP AF ;Remove RST 38 RET addr 2AD3 F1 01089 POP AF 2AD4 C9 01090 RET 01091 ; 01092 ; Not the right interrupt - wait for next 01093 ; 2AD5 F1 01094 WAITINT POP AF ;Recover status 2AD6 FB 01095 EI ; and wait for next 2AD7 C9 01096 RET ; interrupt 01097 ; 01098 ; RDHEAD - Read a TAPE100 header 01099 ; 2AD8 2A6627 01100 RDHEAD LD HL,(CURPOS) ;P/u cursor position 2ADB 119727 01101 LD DE,BUFFER ;Buffer 2ADE CD392B 01102 CALL RDSYNC ;Read in SYNC 01103 ; 01104 ; Read in Header Type byte 01105 ; 2AE1 CDA72B 01106 CALL RDBYTE ;Read type byte 2AE4 FE9C 01107 CP 9CH ;Text type ? 2AE6 20F0 01108 JR NZ,RDHEAD ;No - try again 01109 ; 2AE8 010006 01110 LD BC,600H ;B=6 bytes, Checksum = 0 01111 ; 2AEB CDA22B 01112 RFNLP CALL RDBYTEC ;Read byte 2AEE 77 01113 LD (HL),A ;Save byte 2AEF 12 01114 LD (DE),A ;Stuff in buffer 2AF0 23 01115 INC HL ;Bump cursor pos 2AF1 13 01116 INC DE ;Bump buffer ptr 2AF2 10F7 01117 DJNZ RFNLP 01118 ; 01119 ; Next ten bytes are unused 01120 ; 2AF4 060A 01121 LD B,10 2AF6 CDA22B 01122 BOGUSLP CALL RDBYTEC ;Read byte & checksum 2AF9 10FB 01123 DJNZ BOGUSLP 01124 ; 01125 ; Negate checksum 01126 ; 2AFB 79 01127 LD A,C ;P/u checksum 2AFC ED44 01128 NEG ;Negate it 2AFE 4F 01129 LD C,A 2AFF CDA72B 01130 CALL RDBYTE ;Read in Checksum byte 2B02 B9 01131 CP C ;Match ? 2B03 C4232B 01132 CALL NZ,CHKERR ;No - checksum error 01133 ; 01134 ; Read in twenty zeros 01135 ; 2B06 0614 01136 LD B,20 2B08 CDA72B 01137 DUMBYT CALL RDBYTE 2B0B 10FB 01138 DJNZ DUMBYT 01139 ; 01140 ; Check if this is the correct filename 01141 ; 2B0D 00 01142 CORRECT NOP ;X'C9' if first filename 2B0E 119727 01143 LD DE,BUFFER ;Is this the one ? 2B11 219027 01144 LD HL,FILENM 2B14 0606 01145 LD B,6 ;6 chars in filename 01146 ; 01147 ; Loop to compare (HL) to (DE) 01148 ; 2B16 1A 01149 CKFILE LD A,(DE) ;P/u header byte 2B17 CDB32C 01150 CALL CONV_UC ;Convert to U/C 2B1A BE 01151 CP (HL) ;Match ? 2B1B 23 01152 INC HL 2B1C 13 01153 INC DE 2B1D C2D82A 01154 JP NZ,RDHEAD ;No - try again 2B20 10F4 01155 DJNZ CKFILE 2B22 C9 01156 RET ;Yes - RETurn 01157 ; 01158 ; Checksum error - Either ignore it or "C" 01159 ; 2B23 00 01160 CHKERR NOP ;RETurn or NOP 2B24 F3 01161 DI ;Disable interrupts 2B25 3E43 01162 LD A,'C' ; hecksum error 2B27 324FF8 01163 CHKERR2 LD (VIDEO+79),A 2B2A CDA92D 01164 CALL DISDOKI ;Bring back RAM 2B2D CD2B2A 01165 CALL CASSOFF ;Turn off motor 2B30 216827 01166 LD HL,READERR ;"Tape Read Error!" 2B33 CD4928 01167 CALL DSPLY 2B36 C35427 01168 JP ABORT ;Good bye 01169 ; 01170 ; RDSYNC - Read Cassette SYNC byte field 01171 ; 01172 ; Save Registers 01173 ; 2B39 E5 01174 RDSYNC PUSH HL ;Save regs 2B3A D5 01175 PUSH DE 2B3B C5 01176 PUSH BC 2B3C 3E01 01177 LD A,1 ;Set interrupt vector 2B3E D3E0 01178 OUT (PORTE0),A 01179 ; 01180 ; Read in 128 bits (16 bytes) initially 01181 ; 2B40 0680 01182 RDSYNC2 LD B,80H ;Read 128 bits (16 bytes) 2B42 CD962A 01183 RBTLP CALL RDBIT ;Read bit 2B45 79 01184 LD A,C ;P/u count value 2B46 FE0F 01185 CP TOOSHRT ;Is this a bit ? 2B48 38F6 01186 JR C,RDSYNC2 ;No - didn't find a bit 2B4A FE3E 01187 CP TOOLONG ;Is this a bit ? 2B4C 30F2 01188 JR NC,RDSYNC2 ;No - wait for bit 2B4E 10F2 01189 DJNZ RBTLP ;Legal bit - dec count 01190 ; 01191 ; Now check parity of next 128 bits 01192 ; 2B50 210000 01193 RESCNT LD HL,0 ;H = 0's count, L = 1's 2B53 0640 01194 LD B,40H 01195 ; 01196 ; Read in 3 bits 01197 ; 2B55 CD962A 01198 LOOP CALL RDBIT ;Read bit 2B58 CD962A 01199 CALL RDBIT ;Read bit 2B5B 51 01200 LD D,C ;Save count 2B5C CD962A 01201 CALL RDBIT ;Read bit 01202 ; 01203 ; Calculate Difference between last 2 bits 01204 ; 2B5F 7A 01205 LD A,D ;P/u last bit 2B60 91 01206 SUB C ;Subtract current bit 2B61 3002 01207 JR NC,ABSVAL 2B63 ED44 01208 NEG ;Change to ABS value 01209 ; 01210 ; If Value < DIFFER then Bit = 1, else Bit = 0 01211 ; 2B65 FE0D 01212 ABSVAL CP DIFFER ;Bit = 1 ? 2B67 3803 01213 JR C,BIT1 ;Yes - bump Bit 1 count 2B69 24 01214 INC H ;No - bump Bit 0 count 2B6A 1801 01215 JR DODJ ;Back to loop 2B6C 2C 01216 BIT1 INC L ;Bump Bit 1 count 2B6D 10E6 01217 DODJ DJNZ LOOP ;Dec count - go to loop 01218 ; 01219 ; Check if H (0's count) & L (1's count) = 40 01220 ; 2B6F 3E40 01221 LD A,40H ;Is H = 64 ? 2B71 BC 01222 CP H 2B72 280A 01223 JR Z,CHKMARK ;Yes - check for marker 2B74 BD 01224 CP L ;Is L = 64 ? 2B75 20D9 01225 JR NZ,RESCNT ;No - Reset count 01226 ; 01227 ; Set interrupt Vector & discard 1 bit 01228 ; 2B77 3E02 01229 LD A,2 ;Set interrupt vector 2B79 D3E0 01230 OUT (PORTE0),A 2B7B CD962A 01231 CALL RDBIT ;Read bit 01232 ; 01233 ; Rotate each bit read in D & check if = X'7F' 01234 ; 2B7E 1600 01235 CHKMARK LD D,0 ;Set byte = 0 2B80 CD962A 01236 GETBIT CALL RDBIT ;Read next bit 2B83 CD8F2B 01237 CALL ROTBYTE ;Rotate into Byte (D) 2B86 7A 01238 LD A,D ;P/u byte 2B87 FE7F 01239 CP 7FH ;Marker byte ? 2B89 20F5 01240 JR NZ,GETBIT ;No - get another bit 01241 ; 01242 ; Found marker byte - Restore Regs & RETurn 01243 ; 2B8B C1 01244 POP BC ;Restore Registers 2B8C D1 01245 POP DE 2B8D E1 01246 POP HL 2B8E C9 01247 RET ;Done 01248 ; 01249 ; ROTBYTE - Rotate bit through D & check if error 01250 ; 2B8F 79 01251 ROTBYTE LD A,C ;P/u count 2B90 FE22 01252 CP WHICH1 ;Bit = 0 or 1 ? 2B92 CB12 01253 RL D ;Set bit if Carry set 2B94 FE0F 01254 CP TOOSHRT ;Too quick ? 2B96 DA9C2B 01255 JP C,CIOERR ;Yes - I/O Error 2B99 FE3E 01256 CP TOOLONG ;Too long 2B9B D8 01257 RET C ;No - RETurn 01258 ; 01259 ; Cassette I/O Error - Display Error 01260 ; 2B9C F3 01261 CIOERR DI ;Interrupts off 2B9D 3E44 01262 LD A,'D' ;Data Error 2B9F C3272B 01263 JP CHKERR2 01264 ; 01265 ; RDBYTEC - Read byte & Add byte to Check Sum 01266 ; 2BA2 CDA72B 01267 RDBYTEC CALL RDBYTE ;Read byte 2BA5 81 01268 ADD A,C ;Add to checksum 2BA6 C9 01269 RET ;Done 01270 ; 01271 ; RDBYTE - Read a byte 01272 ; A <= Byte 01273 ; 2BA7 D5 01274 RDBYTE: PUSH DE ;Save regs 2BA8 C5 01275 PUSH BC 2BA9 CD962A 01276 CALL RDBIT ;Get bogus bit 2BAC 1600 01277 LD D,0 ;Init byte = 0 2BAE 0608 01278 LD B,8 ;8 bits to read 01279 ; 2BB0 CD962A 01280 RDBLP CALL RDBIT ;Read a bit 2BB3 CD8F2B 01281 CALL ROTBYTE ;Rotate into D 2BB6 10F8 01282 DJNZ RDBLP 01283 ; 01284 ; Add to Byte count 01285 ; 2BB8 3A5228 01286 LD A,(COUNT) ;P/u count 2BBB 3C 01287 INC A ; & inc it 2BBC E63F 01288 AND 3FH ;Ck if the 64th 2BBE 325228 01289 LD (COUNT),A ;Save the count 2BC1 2008 01290 JR NZ,NOTBLNK 01291 ; 2BC3 3A4FF8 01292 LD A,(VIDEO+79) ;Blink every 64 2BC6 EE0A 01293 XOR 0AH 2BC8 324FF8 01294 LD (VIDEO+79),A 01295 ; 2BCB 7A 01296 NOTBLNK LD A,D ;Xfer byte to A 2BCC 1800 01297 JR NEXTINS ;Timing 01298 ; 2BCE C1 01299 NEXTINS POP BC ;Restore BC & DE 2BCF D1 01300 POP DE 2BD0 C9 01301 RET ;Done 01302 ; 01303 ; WRBIT - Write a bit to Cassette 01304 ; 01305 ; Set DE = Delay Count for bit 01306 ; 2BD1 CB01 01307 WRBIT RLC C ;Get bit 2BD3 3005 01308 JR NC,NOPULS ;NC - bit 0 2BD5 111712 01309 BT1 LD DE,DELAY1 ;Delay for bit 1 2BD8 1803 01310 JR DEL_LP ;Go to delay 2BDA 112F2B 01311 NOPULS LD DE,DELAY0 ;Delay for bit=0 01312 ; 01313 ; Delay 18 counts for 1, 43 counts for 0 01314 ; 2BDD 15 01315 DEL_LP DEC D ;Dec count 2BDE 20FD 01316 JR NZ,DEL_LP 2BE0 3E02 01317 LD A,2 ;0 Volts to tape 2BE2 D3FF 01318 OUT (PORTFF),A 2BE4 1D 01319 DEL_LP2 DEC E ;Secondary delay 2BE5 20FD 01320 JR NZ,DEL_LP2 2BE7 3E01 01321 LD A,1 ;0.85 volts to tape 2BE9 D3FF 01322 OUT (PORTFF),A 2BEB C9 01323 RET ;Done 01324 ; 01325 ; WRHEAD - Write a cassette header 01326 ; 2BEC CD602C 01327 WRHEAD CALL WRSYNC ;Write SYNC pattern 01328 ; 01329 ; Write Text header type byte X'9C' 01330 ; 2BEF 1600 01331 LD D,0 ;Init checksum = 0 2BF1 0E9C 01332 LD C,9CH ;Text header type byte 2BF3 CD512C 01333 CALL WRBYTE ;Write type byte 01334 ; 01335 ; Write Filename in header block 01336 ; 2BF6 0606 01337 LD B,6 ;B = 6 chars 2BF8 219027 01338 LD HL,FILENM ;HL => Filename 2BFB 4E 01339 FILELP LD C,(HL) ;P/u filename character 2BFC CD4A2C 01340 CALL WRBYTEC ; and write it 2BFF 23 01341 INC HL ;Bump count 2C00 10F9 01342 DJNZ FILELP 01343 ; 01344 ; Write 10 filler bytes 01345 ; 2C02 060A 01346 LD B,10 2C04 CD4A2C 01347 BOGUS CALL WRBYTEC 2C07 10FB 01348 DJNZ BOGUS 01349 ; 01350 ; Write checksum byte & 20 dummy X'00' bytes 01351 ; 2C09 7A 01352 LD A,D ;P/u checksum 2C0A ED44 01353 NEG 2C0C 4F 01354 LD C,A ; & xfer to C 2C0D CD512C 01355 CALL WRBYTE ;Write Checksum byte 2C10 010014 01356 LD BC,1400H ;B = 20 bytes, C = 0 2C13 CD512C 01357 DUMMY CALL WRBYTE ;Write byte 2C16 10FB 01358 DJNZ DUMMY 2C18 C9 01359 RET ;Get back quick 01360 ; 01361 ; WRDAT - Write a chunk of data to cassette 01362 ; 2C19 210030 01363 WRDAT LD HL,MEM ;HL => Mem start 2C1C CD272C 01364 WRDAT2 CALL WRDATA ;Write Block 2C1F 24 01365 INC H 2C20 3AF52D 01366 LD A,(FCB1+4) ;Finished ? 2C23 BC 01367 CP H 2C24 20F6 01368 JR NZ,WRDAT2 ;No - write another 2C26 C9 01369 RET ;Yes - RETurn 01370 ; 01371 ; WRDATA - Write a data Block 01372 ; HL => 256 byte block of data (page boundary) 01373 ; 2C27 CD602C 01374 WRDATA CALL WRSYNC ;Write sync pattern 2C2A 0E8D 01375 LD C,8DH ;Write X'8D' type byte 2C2C CD512C 01376 CALL WRBYTE 01377 ; 01378 ; Write 256 byte block of data 01379 ; 2C2F AF 01380 XOR A ;Set checksum = 0 2C30 4E 01381 WBLP LD C,(HL) ;P/u byte 2C31 81 01382 ADD A,C ;Add checksum 2C32 F5 01383 PUSH AF ;Save A 2C33 CD512C 01384 CALL WRBYTE ;Write byte 2C36 F1 01385 POP AF ;Recover checksum 2C37 2C 01386 INC L ;Bump count 2C38 20F6 01387 JR NZ,WBLP 01388 ; 01389 ; Write checksum byte 01390 ; 2C3A ED44 01391 NEG ;Negate checksum 2C3C 4F 01392 LD C,A ;Write checksum byte 2C3D CD512C 01393 CALL WRBYTE 01394 ; 01395 ; Write 20 dummy bytes - X'00' 01396 ; 2C40 0614 01397 LD B,20 ;Write 20 dummy zeroes 2C42 0E00 01398 WDLP LD C,0 2C44 CD512C 01399 CALL WRBYTE 2C47 10F9 01400 DJNZ WDLP 2C49 C9 01401 RET ;Done 01402 ; 01403 ; WRBYTEC - Write a byte & add checksum 01404 ; 2C4A CD512C 01405 WRBYTEC CALL WRBYTE ;Write byte 2C4D 79 01406 LD A,C ;P/u byte 2C4E 82 01407 ADD A,D ;Add checksum 2C4F 57 01408 LD D,A ;New checksum 2C50 C9 01409 RET ;And RETurn 01410 ; 01411 ; WRBYTE - Write a byte to Cassette 01412 ; C => Byte to Output 01413 ; 2C51 C5 01414 WRBYTE: PUSH BC ;Save regs 2C52 D5 01415 PUSH DE 2C53 CDDA2B 01416 CALL NOPULS ;Write dummy pulse 2C56 0608 01417 LD B,8 ;8 bits to write 2C58 CDD12B 01418 WRBTLP CALL WRBIT ;Write bit 2C5B 10FB 01419 DJNZ WRBTLP 2C5D D1 01420 POP DE ;Restore regs 2C5E C1 01421 POP BC 2C5F C9 01422 RET 01423 ; 01424 ; WRSYNC - Write a SYNC pattern to Cassette 01425 ; 2C60 F3 01426 WRSYNC DI ;Disable interrupts 2C61 C5 01427 PUSH BC ;Save BC 2C62 0680 01428 LD B,80H ;Delay 2C64 01429 @@PAUSE 2C64+3E10 01430 LD A,16 2C66+EF 01431 RST 40 2C67 015500 01432 LD BC,0055H ;B = 256, C = X'55' 01433 ; 01434 ; Write SYNC bytes - X'55' 01435 ; 2C6A CD762C 01436 WR55LP CALL WRBYTE8 ;Write 8 bit byte 2C6D 10FB 01437 DJNZ WR55LP 01438 ; 01439 ; Write Marker byte - X'7F' 01440 ; 2C6F 0E7F 01441 LD C,7FH ;Write marker byte X'7F' 2C71 CD762C 01442 CALL WRBYTE8 2C74 C1 01443 POP BC ;Recover BC 2C75 C9 01444 RET ;Done 01445 ; 2C76 C5 01446 WRBYTE8 PUSH BC ;Save B 2C77 0608 01447 LD B,8 ;8 bits long 2C79 CDD12B 01448 WB8LP CALL WRBIT ;Write bit 2C7C 10FB 01449 DJNZ WB8LP 2C7E C1 01450 POP BC 2C7F C9 01451 RET 2C80 01452 *GET TAPE100B:3 01453 ;TAPE100B/ASM - Disk I/O & other routines 01454 ; 01455 ; DISPSTR - Display String 01456 ; 2C80 D5 01457 DISPSTR PUSH DE ;Save DE 2C81 ED5B6627 01458 LD DE,(CURPOS) ;P/u cursor position 2C85 7E 01459 DSLP LD A,(HL) ;P/u source char 2C86 FE03 01460 CP ETX ;Done ? 2C88 2815 01461 JR Z,EXIT1 ;Yes - exit 2C8A FE0D 01462 CP CR ;Done ? 2C8C 280E 01463 JR Z,EXIT2 ;Yes - exit 2C8E FE0A 01464 CP LF ;Line feed ? 2C90 2005 01465 JR NZ,STUFCHR ;No - stuff character 2C92 CDA52C 01466 CALL NEXTLIN ;Get next line 2C95 1802 01467 JR BUMPIT 2C97 12 01468 STUFCHR LD (DE),A ;Output to video 2C98 13 01469 INC DE 2C99 23 01470 BUMPIT INC HL ;No - bump count 2C9A 18E9 01471 JR DSLP 2C9C CDA52C 01472 EXIT2 CALL NEXTLIN ;Next one down 2C9F ED536627 01473 EXIT1 LD (CURPOS),DE ;Save cursor position 2CA3 D1 01474 POP DE ;Restore DE 2CA4 C9 01475 RET 01476 ; 01477 ; NEXTLIN - Position to next line on video 01478 ; DE => RAM location 01479 ; 2CA5 E5 01480 NEXTLIN PUSH HL ;Save regs 2CA6 EB 01481 EX DE,HL ;Xfer # to HL 2CA7 CDE32D 01482 CALL GETCRS ;Calculate X,Y 2CAA 24 01483 INC H ;Bump row # 2CAB 2E00 01484 LD L,0 ; and start @ beginning 2CAD CDCF2D 01485 CALL GETPOS2 ;Convert to RAM location 2CB0 EB 01486 EX DE,HL ;Stuff into DE 2CB1 E1 01487 POP HL 2CB2 C9 01488 RET 01489 ; 01490 ; CONV_UC - Convert A to upper case 01491 ; 2CB3 FE61 01492 CONV_UC CP 'a' ;Lower case ? 2CB5 D8 01493 RET C ;No 2CB6 FE7B 01494 CP 'z'+1 ;Lower case ? 2CB8 D0 01495 RET NC ;No 2CB9 CBAF 01496 RES 5,A ;Convert to Upper Case 2CBB C9 01497 RET 01498 ; 01499 ; CURSOFF - Turn off Cursor 01500 ; 2CBC F5 01501 CURSOFF PUSH AF ;Save regs 2CBD D5 01502 PUSH DE 2CBE C5 01503 PUSH BC 2CBF 0E0F 01504 LD C,CUROFF ;Cursor off Character 2CC1 01505 @@DSP 2CC1+3E02 01506 LD A,2 2CC3+EF 01507 RST 40 2CC4 C24627 01508 JP NZ,IOERR 2CC7 C1 01509 POP BC ;Restore regs 2CC8 D1 01510 POP DE 2CC9 F1 01511 POP AF 2CCA C9 01512 RET 01513 ; 01514 ; INIT - Init a file 01515 ; 2CCB 3E3A 01516 INIT LD A,@INIT ;SVC # 2CCD 1806 01517 JR DOSVC ;INIT file 01518 ; 01519 ; OPEN - Open Source File 01520 ; 2CCF FDCB12C6 01521 OPEN SET 0,(IY+SFLAG$) ;Inhibit file-open bit 2CD3 3E3B 01522 LD A,@OPEN ;OPEN SVC # 01523 ; 2CD5 F5 01524 DOSVC PUSH AF 2CD6 D5 01525 PUSH DE 2CD7 219D27 01526 LD HL,DFBUF ;HL => Disk filename buf 2CDA 1A 01527 TLP LD A,(DE) ;P/u byte from FCB 2CDB 77 01528 LD (HL),A ;Xfer to TEMBUF 2CDC 23 01529 INC HL 2CDD 13 01530 INC DE 2CDE FE0E 01531 CP CR+1 ;Done ? 2CE0 3808 01532 JR C,DUN 2CE2 FE3A 01533 CP ':' 2CE4 2804 01534 JR Z,DUN 2CE6 FE2E 01535 CP '.' 2CE8 20F0 01536 JR NZ,TLP 01537 ; 01538 ; Found valid terminator - Is this a device ? 01539 ; 2CEA 2B 01540 DUN DEC HL ;Back up to term 2CEB D1 01541 POP DE ;DE => FCB+0 2CEC 1A 01542 LD A,(DE) ;Device ? 2CED FE2A 01543 CP '*' 2CEF 2807 01544 JR Z,DUN2 ;Yes - done 2CF1 363A 01545 LD (HL),':' ;No - overwrite with ":" 2CF3 23 01546 INC HL ;Bump 2CF4 22122D 01547 LD (DSPEC+1),HL ;Save drivespec location 2CF7 23 01548 INC HL ;Bump 2CF8 3603 01549 DUN2 LD (HL),ETX ;End with X'03' 2CFA F1 01550 POP AF ;A = SVC # 2CFB 32212D 01551 LD (SVCNUM+1),A ;Save SVC # 2CFE 21002F 01552 LD HL,IOBUFF ;HL => I/O Buffer 2D01 0600 01553 LD B,0 ;LRL = 256 2D03 EF 01554 RST 28H ;OPEN or INIT file 2D04 2803 01555 CHECK JR Z,CHKPROT ;Check PROTection status 01556 ; 01557 ; Ignore Error #42 - "LRL Open Fault" 01558 ; 2D06 FE2A 01559 CP 42 ;Ignore this error 2D08 C0 01560 RET NZ ;NZ - Abort 01561 ; 01562 ; Stuff Drive # into Buffer 01563 ; 2D09 D5 01564 CHKPROT PUSH DE ;P/u drivespec 2D0A DDE1 01565 POP IX ; from FCB+6 2D0C DD7E06 01566 LD A,(IX+6) 2D0F C630 01567 ADD A,'0' ;Convert to ASCII 2D11 320000 01568 DSPEC LD ($-$),A 01569 ; 01570 ; Check if File has proper Access 01571 ; 2D14 DDCB007E 01572 BIT 7,(IX) ;Is FCB open? 2D18 281F 01573 JR Z,ILLFILE ;No - Illegal Filename 2D1A DD7E01 01574 LD A,(IX+1) ;P/u protection byte 2D1D E607 01575 AND 7 2D1F 47 01576 LD B,A ;Xfer to B 01577 ; 2D20 3E00 01578 SVCNUM LD A,$-$ ;P/u SVC # 2D22 FE3A 01579 CP @INIT ;@INIT ? 2D24 78 01580 LD A,B ;P/u protection level 2D25 280C 01581 JR Z,INIT1 ;Z - Must be < 5 2D27 FE06 01582 CP 6 ;Read Access ? 2D29 380C 01583 JR C,OKYDOKY ;Yes - set Z & RETurn 01584 ; 01585 ; Illegal Access to protected file 01586 ; 2D2B 01587 ILLACC @@CLOSE ;Close File 2D2B+3E3C 01588 LD A,60 2D2D+EF 01589 RST 40 2D2E 3E19 01590 LD A,25 ;File Access Denied 2D30 C34627 01591 JP IOERR ;Error - Regardless 01592 ; 2D33 FE05 01593 INIT1 CP 5 ;Update Access ? 2D35 30F4 01594 JR NC,ILLACC ;No - Illegal Access 2D37 AF 01595 OKYDOKY XOR A ;RETurn Z 2D38 C9 01596 RET 01597 ; 2D39 3E13 01598 ILLFILE LD A,19 ;Illegal Filename 2D3B B7 01599 OR A ;Set NZ 2D3C C9 01600 RET ; 01601 ; 01602 ; CLOSE - Close the Destination File 01603 ; 2D3D 11112E 01604 CLOSE LD DE,FCB2 ;DE => FCB 2D40 01605 @@CLOSE ;Close File 2D40+3E3C 01606 LD A,60 2D42+EF 01607 RST 40 2D43 C8 01608 RET Z ;Good - RETurn 2D44 C34627 01609 JP IOERR ;Bad - Quit 01610 ; 01611 ; WRITESC - Write a Sector to Destination file 01612 ; 2D47 11112E 01613 WRITESC LD DE,FCB2 ;DE => FCB 2D4A 01614 @@WRITE ;Write Sector 2D4A+3E4B 01615 LD A,75 2D4C+EF 01616 RST 40 2D4D C24627 01617 JP NZ,IOERR ;Bad - quit 2D50 C9 01618 RET ;Good - RETurn 01619 ; 01620 ; WRTDEST - Write Destination File 01621 ; 2D51 11112E 01622 WRTDEST LD DE,FCB2 ;DE => Destination FCB 2D54 21152E 01623 WRTDES LD HL,FCB2+4 ;HL => msb of I/O buffer 2D57 34 01624 INC (HL) ;Bump 2D58 CD472D 01625 CALL WRITESC ;Write Sector 2D5B 3E00 01626 EOTF2 LD A,$-$ ;P/u # of sectors 2D5D BE 01627 CP (HL) ;Finished ? 2D5E 20F4 01628 JR NZ,WRTDES ;No - back to loop 01629 ; 01630 ; Finished Writing - Set EOF offset byte 01631 ; 2D60 3E00 01632 OFFSET LD A,$-$ ;P/u offset byte 2D62 32192E 01633 LD (FCB2+8),A ; & stuff into FCB 2D65 CD3D2D 01634 CALL CLOSE ;Close the File 2D68 C9 01635 RET 01636 ; 01637 ; READSRC - Read in chunk of Source Disk file 01638 ; 2D69 21F52D 01639 READSRC LD HL,FCB1+4 ;HL => Hi byte of I/O buf 2D6C 362F 01640 LD (HL),MEM<-8-1 ;Init FCB I/O buffer 01641 ; 01642 ; Read in Source file 01643 ; 2D6E 11F12D 01644 READSR2 LD DE,FCB1 ;Pt DE to FCB 2D71 34 01645 INC (HL) ;Bump I/O buffer 2D72 01646 @@READ ;Read a sector 2D72+3E43 01647 LD A,67 2D74+EF 01648 RST 40 2D75 28F7 01649 JR Z,READSR2 01650 ; 01651 ; Fill remainder of sector w/ X'1A's 01652 ; 2D77 F5 01653 PUSH AF ;Save Error code 2D78 3AF92D 01654 NOMORE LD A,(FCB1+8) ;P/u EOF offset byte 2D7B ED44 01655 NEG 2D7D 47 01656 LD B,A ;Xfer to B for DJNZ 2D7E 66 01657 LD H,(HL) ;P/u I/O buffer msb 2D7F 2EFF 01658 LD L,0FFH ;End of sector 2D81 2801 01659 JR Z,NULBUF ;Z - keep HL here 2D83 25 01660 DEC H ;Sector boundary 2D84 361A 01661 NULBUF LD (HL),1AH ;Fill remainder of buffer 2D86 2B 01662 DEC HL ; with zeroes 2D87 10FB 01663 DJNZ NULBUF 01664 ; 01665 ; Add a sector of 1As 01666 ; 2D89 24 01667 INC H ;Pt to next sector 2D8A 2E00 01668 LD L,0 2D8C 361A 01669 XTR1AS LD (HL),01AH ;EOF indicator 2D8E 23 01670 INC HL ;Bump 2D8F 10FB 01671 DJNZ XTR1AS 2D91 F1 01672 DONTFIL POP AF ;Recover error code 01673 ; 01674 ; I/O Error - Better be EOF error 01675 ; 2D92 FE1C 01676 CP 1CH ;EOF ? 2D94 C8 01677 RET Z ;Yes - RETurn 2D95 FE1D 01678 CP 1DH ;NRN > ERN 2D97 C8 01679 RET Z ;Yes - RETurn 2D98 C34627 01680 JP IOERR ;No - Disk Error 01681 ; 01682 ; ENDOKI - Enable Video & Keyboard 01683 ; 2D9B F5 01684 ENDOKI PUSH AF 2D9C E5 01685 PUSH HL 2D9D 3A7800 01686 LD A,(OPREG$) ;P/u port mask 2DA0 32AC2D 01687 LD (SVOPREG+1),A ; and save it for DISDOKI 2DA3 CB87 01688 RES 0,A ;Reset bit 0 2DA5 CBCF 01689 SET 1,A ;Set bit 1 2DA7 1804 01690 JR DOOPREG ;Set new assignment 01691 ; 01692 ; DISDOKI - Disable Video & Keyboard 01693 ; 2DA9 F5 01694 DISDOKI PUSH AF 2DAA E5 01695 PUSH HL 01696 ; 2DAB 3E00 01697 SVOPREG LD A,$-$ ;Restore original mask 2DAD 327800 01698 DOOPREG LD (OPREG$),A 2DB0 D384 01699 OUT (@OPREG),A ; and disable video 01700 ; 2DB2 E1 01701 POP HL ;Restore regs & RETurn 2DB3 F1 01702 POP AF 2DB4 C9 01703 RET 01704 ; 01705 ; SWAP38 - Swap 38H - 3AH with save area 01706 ; 2DB5 0603 01707 SWAP38 LD B,3 ;3 bytes to exchange 2DB7 21C72D 01708 LD HL,SWAREA ;HL => Swap Area 2DBA 113800 01709 LD DE,38H ;DE => Restart Xfer addr 2DBD 4E 01710 SWAPLP LD C,(HL) ;P/u source 2DBE 1A 01711 LD A,(DE) 2DBF EB 01712 EX DE,HL ;Swap ptrs 2DC0 71 01713 LD (HL),C ;Stuff in dest 2DC1 12 01714 LD (DE),A 2DC2 23 01715 INC HL ;Bump ptrs 2DC3 13 01716 INC DE 2DC4 10F7 01717 DJNZ SWAPLP ;3 bytes to swap 2DC6 C9 01718 RET 01719 ; 2DC7 C3B02A 01720 SWAREA JP RST38V ;JP vector 01721 ; 01722 ; GETPOS - Get current cursor position in video 01723 ; 2DCA 0604 01724 GETPOS LD B,4 ;P/u current cursor pos 2DCC 01725 @@VDCTL 2DCC+3E0F 01726 LD A,15 2DCE+EF 01727 RST 40 2DCF 4D 01728 GETPOS2 LD C,L ;Save column # 2DD0 6C 01729 LD L,H 2DD1 2600 01730 LD H,0 ;HL => Row # 2DD3 54 01731 LD D,H ;Set DE = HL 2DD4 5D 01732 LD E,L 2DD5 29 01733 ADD HL,HL ;X 2 2DD6 29 01734 ADD HL,HL ;X 4 2DD7 19 01735 ADD HL,DE ;X 5 2DD8 29 01736 ADD HL,HL ;X 10 2DD9 29 01737 ADD HL,HL ;X 20 2DDA 29 01738 ADD HL,HL ;X 40 2DDB 29 01739 ADD HL,HL ;X 80 2DDC 06F8 01740 LD B,VIDEO<-8 ;D = high byte of video 2DDE 09 01741 ADD HL,BC ;HL => Cursor location 2DDF 226627 01742 LD (CURPOS),HL ;Save cursor position 2DE2 C9 01743 RET 01744 ; 01745 ; GETCRS - Calculate row x column cursor pos 01746 ; HL => Cursor position in RAM 01747 ; HL <= Cursor position in Row (H) Column (L) 01748 ; 2DE3 1100F8 01749 GETCRS LD DE,VIDEO ;Get offset 2DE6 B7 01750 OR A 2DE7 ED52 01751 SBC HL,DE 2DE9 0E50 01752 LD C,80 ;Calculate row # 2DEB 01753 @@DIV16 2DEB+3E5E 01754 LD A,94 2DED+EF 01755 RST 40 2DEE 65 01756 LD H,L ;Set H = Row 2DEF 6F 01757 LD L,A ;Set L = Column 2DF0 C9 01758 RET 01759 ; 2DF1 01760 FCB1 DS 32 2E11 01761 FCB2 DS 32 2E31 01762 INBUFF DS 25 01763 ; 2F00 01764 ORG $<-8+1<+8 01765 ; 2F00 01766 IOBUFF DS 256 3000 01767 MEM EQU $ 01768 ; 2600 01769 END START 2600 is the transfer address 00000 Total errors
[Copyright 1999,2002 Frank Durda IV, All Rights Reserved. Mirroring of any material on this page in any form is expressly prohibited. The official web site for this material is: http://nemesis.lonestar.org Contact this address for use clearances: clearance at nemesis.lonestar.org Comments and queries to this address: web_software_2011 at nemesis.lonestar.org]