[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 at nemesis.lonestar.org]
MISOSYS EDAS-4.3 04/11/99 01:04:16 LIST - LS-DOS 6.2 Page 00001
00001 ;LBLIST/ASM - List Command
00003 ;
0000 00004 *GET BUILDVER/ASM:3
00005 ;
00006 ; Buildver/asm is a bit of a kludge since not all utilities can load
00007 ; equates from LDOS60 and still compile. LOWCORE and everybody else
00008 ; relies on this setting, and it eventually ends up in LDOS60/EQU
00009 ; for programs that can use that.
00010 ;
FFFF 00011 @BLD631 EQU -1 ;<631>Build 631 distribution (LEVEL 1B)
00012 ; These switches activate patches made since the 1B release.
00013 ; It is important that all earlier patches be enabled when a higher
00014 ; patch is enabled.
00015 ; Patches C thru F were published in TMQ IV.iv, page 32 (NOTE: the
00016 ; patch addresses listed for SPOOL in SPOOL1/FIX are 19H high.)
FFFF 00017 @BLD631C EQU -1 ;<631>Apply 1C patches (SETKI)
FFFF 00018 @BLD631D EQU -1 ;<631>Apply 1D patches (DIR)
FFFF 00019 @BLD631E EQU -1 ;<631>Apply 1E patches (DIR & MEMDISK/DCT)
FFFF 00020 @BLD631F EQU -1 ;<631>Apply 1F patches (SPOOL)
00021 ; Patches G and H were published in TMQ V.i, pages 10 and 18/19.
FFFF 00022 @BLD631G EQU -1 ;<631>Apply 1G patches (//KEYIN,DIR,DO *)
FFFF 00023 @BLD631H EQU -1 ;<631>Apply 1H patches (MEMORY)
00024 ;
00025 ;End of BUILDVER/ASM
0000 00026 *GET SVCMAC:3 ;SVC Macro equivalents
00027 ;SVCMAC/ASM - LS-DOS Version VI
00028 *LIST OFF
00420 *LIST ON
0000 00422 *GET VALUES:3 ;Misc. equates
00423 ;VALUES/ASM - Version 6
00424 *LIST OFF
00451 *LIST ON
00452 ;
0006 00453 @PRT EQU 6
0002 00454 @DSP EQU 2
00455 ;
2400 00456 ORG 2400H
00457 ;
00458 START
2400 00459 @@CKBRKC ;Check break
2400+3E6A 00460 LD A,106
2402+EF 00461 RST 40
2403 2804 00462 JR Z,LISTA ;Continue if not
2405 21FFFF 00463 LD HL,-1 ; else abort
2408 C9 00464 RET
00465 ;
00466 ; not hit, Execute Module
00467 ;
00468 LISTA
2409 ED731124 00469 LD (SAVESP+1),SP ;Save SP
240D CD2D24 00470 CALL LIST ;List a file
2410 310000 00471 SAVESP LD SP,$-$ ;P/u SP address
2413 00472 @@CKBRKC ;Reset if user pressed break
2413+3E6A 00473 LD A,106
2415+EF 00474 RST 40
2416 C9 00475 RET ;Abort
00476 ;
00477 ; I/O Error Processing - Display & Abort
00478 ;
2417 2600 00479 IOERR LD H,0 ;Set HL = Error #
2419 6F 00480 LD L,A ;
241A F6C0 00481 OR 0C0H ;Short error message
241C 4F 00482 LD C,A ;Stuff error # in C
241D 00483 @@ERROR ;Display error
241D+3E1A 00484 LD A,26
241F+EF 00485 RST 40
2420 18EE 00486 JR SAVESP ;Abort
00487 ;
00488 ; Internal Error Message Display Routine
00489 ;
2422 214827 00490 SPCREQ LD HL,SPCREQ$ ;File spec Required
2425 00491 @@LOGOT ;Log error message
00492 IFEQ 00H,1
00493 LD HL,
00494 ENDIF
2425+3E0C 00495 LD A,12
2427+EF 00496 RST 40
2428 21FFFF 00497 ABORT LD HL,-1 ;Internal error = -1
242B 18E3 00498 JR SAVESP ;P/u stack & return
00499 ;
00500 ; LIST - List a file in hex or ASCII
00501 ;
242D CDDF26 00502 LIST CALL RESKFL ;Reset pause, & enter
00503 ;
00504 ; Find parameter entries if existent
00505 ;
2430 E5 00506 PUSH HL ;Save command ptr
2431 7E 00507 FPLP LD A,(HL) ;P/u character
2432 FE28 00508 CP '(' ;Parameter(s) ?
2434 2807 00509 JR Z,GETPRM ;Yes - go get 'em
2436 FE0E 00510 CP CR+1 ;End of line ?
2438 380C 00511 JR C,RESTPTR ;Yes - restore ptr
243A 23 00512 INC HL ;No - bump til end
243B 18F4 00513 JR FPLP ;Do til eol or "("
00514 ;
00515 ; Process any parameters entered
00516 ;
243D 117327 00517 GETPRM LD DE,PRMTBL$ ;DE => Parameter table
2440 00518 @@PARAM ;@PARAM
2440+3E11 00519 LD A,17
2442+EF 00520 RST 40
2443 C21724 00521 JP NZ,IOERR ;NZ - "Parameter Error"
2446 E1 00522 RESTPTR POP HL ;Recover ptr
00523 ;
00524 ; Skip command line blanks
00525 ;
2447 7E 00526 IGSPC LD A,(HL) ;P/u character
2448 23 00527 INC HL ;Bump ptr
2449 FE20 00528 CP ' ' ;Space ?
244B 28FA 00529 JR Z,IGSPC ;Yes - ignore them
244D 2B 00530 DEC HL ;HL => First non-space
00531 ;
00532 ; Check if the filespec is legal in format
00533 ;
244E 11CC27 00534 LD DE,FCB1 ;Fetch file spec
2451 00535 @@FSPEC ;Filespec legal ?
2451+3E4E 00536 LD A,78
2453+EF 00537 RST 40
2454 C22224 00538 JP NZ,SPCREQ ;No - filespec required
00539 ;
00540 ; If this is a device - don't LIST
00541 ;
2457 1A 00542 LD A,(DE) ;Is this a device ?
2458 FE2A 00543 CP '*' ;
245A CA2224 00544 JP Z,SPCREQ ;Yes - Filespec req
00545 ;
00546 ; Save the original filespec
00547 ;
245D EB 00548 EX DE,HL ;HL => Source FCB
245E 11EC27 00549 LD DE,FCB2 ;DE => Duplicate FCB
2461 012000 00550 LD BC,32 ;32 bytes tm xfer
2464 E5 00551 PUSH HL ;Save source ptr
2465 EDB0 00552 LDIR ;Xfer
2467 D1 00553 POP DE ;DE => Source FCB
00554 ;
00555 ; Stuff default extension of /TXT to source
00556 ;
2468 217027 00557 LD HL,TXTEXT ;HL => TXT
246B 00558 @@FEXT ;Stuff TXT if no ext
246B+3E4F 00559 LD A,79
246D+EF 00560 RST 40
00561 ;
00562 ; Open the file with LRL of 256
00563 ;
246E 0600 00564 LD B,0 ;Set LRL (B) = 256
2470 CD3A27 00565 CALL OPEN ;Open file with LRL=256
2473 2816 00566 JR Z,INITLRL ;Good - LIST it
00567 ;
00568 ; Error - Was it a "File not Found" Error ?
00569 ;
2475 FE18 00570 CP 24 ;"File not Found" ?
2477 C21724 00571 JP NZ,IOERR ;No - I/O Error
00572 ;
00573 ; OPEN original filespec instead of TXT
00574 ;
247A 0E20 00575 LD C,32 ;BC = 32 bytes to xfer
247C D5 00576 PUSH DE ;DE => FCB1
247D E5 00577 PUSH HL ;Save I/O buff ptr
247E 21EC27 00578 LD HL,FCB2 ;HL => Filespec
2481 EDB0 00579 LDIR ;Xfer original filespec
2483 E1 00580 POP HL ;HL => I/O buffer
2484 D1 00581 POP DE ;DE => unopen FCB
00582 ;
00583 ; Open Original Filespec without extension
00584 ;
2485 CD3A27 00585 CALL OPEN ;Open the file
2488 C21724 00586 JP NZ,IOERR ;I/O error - abort
00587 ;
00588 ; Pick up the DEC from the FCB
00589 ;
248B D5 00590 INITLRL PUSH DE ;Xfer fcb to IX
248C DDE1 00591 POP IX
248E DD4607 00592 LD B,(IX+7) ;P/u DEC
2491 DD4E06 00593 LD C,(IX+6) ; & drive #
2494 00594 @@DIRRD ;Read in directory record
2494+3E57 00595 LD A,87
2496+EF 00596 RST 40
00597 ;
00598 ; Was the LRL parm specified ?
00599 ;
2497 3AAB27 00600 LD A,(LRESP) ;P/u response
249A B7 00601 OR A
249B 2008 00602 JR NZ,SKIPLRL ;Go if entered
00603 ;
00604 ; No LRL parm, get from directory record
00605 ;
249D 7D 00606 LD A,L ;Position to DIR+4
249E C604 00607 ADD A,4
24A0 6F 00608 LD L,A ;HL => LRL byte (DIR+4)
00609 ;
00610 ; Pick up LRL & stuff into LRL parameter
00611 ;
24A1 7E 00612 LD A,(HL) ;P/u LRL
24A2 32AD25 00613 LD (LPARM+1),A ;Set dir LRL into parm
00614 ;
00615 ; Pick up LRL & stuff into FCB
00616 ;
24A5 3AAD25 00617 SKIPLRL LD A,(LPARM+1) ;P/u possible new LRL
24A8 DD7709 00618 LD (IX+9),A ;Put into FCB
24AB DDCB01FE 00619 SET 7,(IX+1) ;Mark for byte I/O
00620 ;
00621 ; Check if TAB (T) parm is flag or numeric
00622 ;
24AF 3AB727 00623 LD A,(TRESP) ;P/u response byte
24B2 E640 00624 AND 40H ;Flag response ?
24B4 3A4325 00625 LD A,(TPARM+1) ;P/u value
24B7 2805 00626 JR Z,NOTFLG ;No - numeric
00627 ;
00628 ; Flag Response - Is it ON (T=8) or OFF (T=1)
00629 ;
24B9 3C 00630 INC A ;Tab=OFF (NZ) or ON (Z) ?
24BA 2002 00631 JR NZ,NOTFLG ;Tab = OFF ---> TABEXP=1
24BC 3E08 00632 LD A,8 ;Tab = ON ---> TABEXP=8
00633 ;
00634 ; P/u TAB (T) parm value & stuff into routine
00635 ;
24BE 324D25 00636 NOTFLG LD (TABEXP+1),A ;Stuff away
24C1 3D 00637 DEC A ;Range can
24C2 FE20 00638 CP 32 ;Only be between 1-32.
24C4 3E2C 00639 LD A,PAR_ERR ;Greater - Parm Error
24C6 D21724 00640 JP NC,IOERR
00641 ;
00642 ; Was the P (print) parameter entered ?
00643 ;
24C9 010000 00644 PPARM LD BC,$-$ ;P/u P parameter
24CC 78 00645 LD A,B ;Was it specified ?
24CD B1 00646 OR C
24CE 2809 00647 JR Z,HPARM ;No - use @DSP
00648 IF @BLD631
24D0 ED438A26 00649 LD (SPARM+1),BC ;<631>
00650 ENDIF
00651 ;
00652 ; Stuff @PRT SVC # in output routine
00653 ;
24D4 3E06 00654 LD A,@PRT ;@PRT SVC Number
24D6 326A26 00655 LD (PUTOUT1+1),A ;Overwrite @DSP
00656 ;
00657 ; Hex Parameter Entered ?
00658 ;
24D9 010000 00659 HPARM LD BC,$-$ ;P/u Hex parm
24DC 78 00660 LD A,B ;Entered ?
24DD B1 00661 OR C
24DE C28D25 00662 JP NZ,RPARM ;Yes - check out Records
00663 ;
00664 ; Routine to LIST a file in ASCII
00665 ;
24E1 32BB27 00666 LD (BYTCTR),A ;Init counter to 0
00667 IF @BLD631
24E4 32AC26 00668 LD (L26AC),A ;<631>
24E7 3E17 00669 LD A,17H ;<631>
24E9 329026 00670 LD (L2690),A ;<631>
24EC 32AE26 00671 LD (L26AE),A ;<631>
00672 ENDIF
00673 ;
24EF 010100 00674 LINPRM LD BC,1 ;P/u start line parm
24F2 0B 00675 DEC BC ;Count down for start
24F3 78 00676 LD A,B ;Ready to list ?
24F4 B1 00677 OR C
24F5 2812 00678 JR Z,BGNLIN ;Go list/print if ready
24F7 11CC27 00679 LD DE,FCB1 ;DE => FCB
00680 ;
00681 ; Ignore all lines until specified start posn
00682 ;
24FA 00683 FND1ST @@GET ;Get a character
24FA+3E03 00684 LD A,3
24FC+EF 00685 RST 40
24FD C21724 00686 JP NZ,IOERR ;Error - abort
2500 FE0D 00687 CP CR ;End of line?
2502 20F6 00688 JR NZ,FND1ST ;Keep reading
00689 ;
00690 ; Finished with line - decrement LINE count
00691 ;
2504 0B 00692 DEC BC ;Dec line counter
2505 78 00693 LD A,B ;Finished
2506 B1 00694 OR C ;Ignoring lines ?
2507 20F1 00695 JR NZ,FND1ST ;No - loop until LINES=0
00696 ;
00697 ; Start LISTing File
00698 ;
2509 2AF024 00699 BGNLIN LD HL,(LINPRM+1) ;P/u original line #
250C 015B27 00700 LD BC,VARDOT ;Convert to Decimal ASCII
250F CDF326 00701 CALL CVTDEC ; and stuff into string
00702 ;
00703 ; Read in a character from the file
00704 ;
2512 11CC27 00705 GETCHR LD DE,FCB1 ;DE => FCB
2515 00706 @@GET ;Get a byte
2515+3E03 00707 LD A,3
2517+EF 00708 RST 40
2518 205D 00709 JR NZ,GOTERR ;Go if read error
251A 323025 00710 LD (PUCHAR+1),A ;Hang on to char
00711 ;
00712 ; Test if NUM parameter was entered
00713 ;
251D 010000 00714 NPARM LD BC,$-$ ;P/u N parameter
2520 78 00715 LD A,B ;Was it entered ?
2521 B1 00716 OR C
2522 280B 00717 JR Z,PUCHAR ;No - don't print line #
00718 ;
00719 ; N parm entered - print line # & Increment it
00720 ;
2524 215B27 00721 LD HL,VARDOT ;HL => Buffer with line #
2527 E5 00722 PUSH HL ;Save ptr
2528 CDBD26 00723 CALL PUTLINE ;Output line @ HL
252B E1 00724 POP HL ;Restore line # ptr
252C CD2927 00725 CALL INCNUM ;Increment line #
00726 ;
00727 ; Pick up character and Check if high bit set
00728 ;
252F 3E00 00729 PUCHAR LD A,$-$ ;P/u character
2531 07 00730 DLOOP RLCA ;Get HB into Carry flag
00731 ;
00732 ; Reset High bit unless A8 parameter entered
00733 ;
2532 110000 00734 A8PARM LD DE,$-$ ;P/u A8 parm
2535 14 00735 INC D ;Was it entered ?
2536 15 00736 DEC D
2537 2003 00737 JR NZ,A8BIT ;Yes - don't change byte
2539 CB3F 00738 SRL A ;Reset Bit 7
253B 1E 00739 DB 1EH ;LD E,nn instruction
253C 0F 00740 A8BIT RRCA ;Use all 8 bits
00741 ;
00742 ; Is the character a Tab ?
00743 ;
253D F5 00744 PUSH AF ;Save C flag
253E FE09 00745 CP TAB ;Was it a tab ?
2540 201B 00746 JR NZ,NOTTAB ;No - don't check TAB
00747 ;
00748 ; Character is a Tab - Was T=N specified ?
00749 ;
2542 110800 00750 TPARM LD DE,0008H ;P/u TAB parm (Default=8)
2545 1C 00751 INC E ;TAB = N ?
2546 1D 00752 DEC E
2547 2814 00753 JR Z,NOTTAB ;Yes - don't expand
00754 ;
00755 ; P/u column # & calculate # of spaces to pad
00756 ;
2549 3ABB27 00757 LD A,(BYTCTR) ;P/u column number
254C 0E08 00758 TABEXP LD C,8 ;P/u TAB expansion #
254E 91 00759 CLOOP SUB C
254F 30FD 00760 JR NC,CLOOP
2551 ED44 00761 NEG ;Subtract A from Col #
00762 ;
00763 ; Output A blank spaces for tab expansion
00764 ;
2553 47 00765 LD B,A ;Put # spaces in B
2554 3E20 00766 TP1 LD A,' ' ;Pad with a space
2556 CD6726 00767 CALL PUTOUT ;Output character
2559 10F9 00768 DJNZ TP1 ;B spaces to output
255B 1803 00769 JR WASTAB ;Check byte counter
00770 ;
00771 ; Character was not a tab, display it
00772 ;
255D CD6726 00773 NOTTAB CALL PUTOUT ;Print the character
2560 3ABB27 00774 WASTAB LD A,(BYTCTR) ;P/u byte counter
2563 B7 00775 OR A ;If C/R printed
2564 CCC726 00776 CALL Z,CKPAWS ;Then check for
00777 ;
00778 ; Check for if hi bit set on character
00779 ;
2567 F1 00780 POP AF ;Get back char
2568 DCC726 00781 CALL C,CKPAWS ;If high bit was set
00782 ;
00783 ; If character = C/R then read in another line
00784 ;
256B FE0D 00785 CP CR ;Was it C/R ?
256D 28A3 00786 JR Z,GETCHR ;Yes - get new line
00787 ;
00788 ; Get another byte from file
00789 ;
256F 11CC27 00790 LD DE,FCB1 ;DE => FCB
2572 00791 @@GET ;Get a byte
2572+3E03 00792 LD A,3
2574+EF 00793 RST 40
2575 28BA 00794 JR Z,DLOOP ;Good - check character
00795 ;
00796 ; I/O Error on @GET - Output a Carriage Return
00797 ;
2577 F5 00798 GOTERR PUSH AF ;Save error code
2578 3E0D 00799 LD A,CR ;Write end of line
257A CD6726 00800 CALL PUTOUT
257D F1 00801 POP AF ;Rcvr error code
00802 ;
00803 ; If End of File Error - Exit normally
00804 ;
257E 210000 00805 LD HL,0 ;Set HL = 0 (normal exit)
2581 FE1C 00806 CP 1CH ;EOF?
2583 CA1024 00807 GTBK JP Z,SAVESP ;Exit if so
2586 FE1D 00808 CP 1DH ;NRN > ERN?
2588 28F9 00809 JR Z,GTBK ;Yes - leave
258A C31724 00810 JP IOERR ;Other - Abort
00811 ;
00812 ; LIST a file in HEX format
00813 ;
258D 010000 00814 RPARM LD BC,$-$ ;P/u starting Record #
2590 11CC27 00815 LD DE,FCB1 ;DE => FCB
2593 00816 @@POSN ;Position to Record BC
2593+3E42 00817 LD A,66
2595+EF 00818 RST 40
2596 C21724 00819 JP NZ,IOERR ;Abort on position error
00820 ;
00821 ; Reset byte counter to Zero
00822 ;
2599 AF 00823 DOHEX XOR A ;Init byte counter to 0
259A 32B125 00824 LD (DOHEX1+1),A
00825 ;
00826 ; Stuff Record Number in Line Number buffer
00827 ;
259D ED5B8E25 00828 LD DE,(RPARM+1) ;P/u Record Number
25A1 216427 00829 LD HL,VARCLN+1 ;HL => Hex ASCII dest
25A4 00830 @@HEX16 ;Convert DE to ASCII
25A4+3E63 00831 LD A,99
25A6+EF 00832 RST 40
00833 ;
00834 ; Bump Record Number & stuff into RPARM
00835 ;
25A7 13 00836 INC DE ;Bump by one
25A8 ED538E25 00837 LD (RPARM+1),DE ; & store for next time
00838 ;
25AC 010000 00839 LPARM LD BC,$-$ ;P/u LRL
00840 ;
00841 ; Convert Byte counter to Hex & stuff in buff
00842 ;
25AF C5 00843 DISBYTE PUSH BC ;Save bytes left in Rec
25B0 0E00 00844 DOHEX1 LD C,$-$ ;P/u byte counter
25B2 216927 00845 LD HL,VAREQU ;HL => Hex ASCII dest
25B5 00846 @@HEX8 ;Cvrt C to ASCII @ HL
25B5+3E62 00847 LD A,98
25B7+EF 00848 RST 40
25B8 C1 00849 POP BC ;BC = Bytes left in Rec
00850 ;
00851 ; Display Record Number/Starting byte string
00852 ;
25B9 216327 00853 LD HL,VARCLN ;HL => Display buffer
25BC CDBD26 00854 CALL PUTLINE ;Display Rec # byte
00855 ;
00856 ; P/u byte counter & add 16 (BPL) & stuff away
00857 ;
25BF 3AB125 00858 LD A,(DOHEX1+1) ;P/u byte counter
25C2 0610 00859 LD B,16 ;Set B = 16 bytes
25C4 80 00860 ADD A,B ;Add 16 to byte count
25C5 32B125 00861 LD (DOHEX1+1),A ; & stuff into LD C inst
00862 ;
25C8 21BC27 00863 LD HL,LINBUF ;HL => Line buffer
00864 ;
00865 ; Get a byte from the File
00866 ;
25CB 11CC27 00867 DOHEX2 LD DE,FCB1 ;DE => FCB
25CE 00868 @@GET ;Get a byte
25CE+3E03 00869 LD A,3
25D0+EF 00870 RST 40
25D1 280B 00871 JR Z,DOHEX4 ;Good - stuff byte
00872 ;
00873 ; End of File Error ?
00874 ;
25D3 F5 00875 PUSH AF ;Save error code
25D4 FE1C 00876 CP 1CH ;EOF?
25D6 2805 00877 JR Z,DOHEX3 ;Yes - Okay
00878 ;
00879 ; Past End of File Error ?
00880 ;
25D8 FE1D 00881 CP 1DH ;NRN>ERN?
25DA C21724 00882 JP NZ,IOERR ;Another error
00883 ;
00884 ; Recover Flags & check type of Error
00885 ;
25DD F1 00886 DOHEX3 POP AF ;Recover error code
25DE 2018 00887 DOHEX4 JR NZ,DOHEX5 ;Bypass if at end of file
00888 ;
00889 ; Stuff Character in buffer & bump
00890 ;
25E0 77 00891 LD (HL),A ;Stuff byte in buffer
25E1 23 00892 INC HL ;Bump ptr
00893 ;
00894 ; Output byte in Hex & follow with a space
00895 ;
25E2 CD5626 00896 CALL CVTHEX ;Output the byte in hex
25E5 3E20 00897 LD A,' ' ; followed by a space
25E7 CD6726 00898 CALL PUTOUT
00899 ;
00900 ; Output an extra space if halfway in line
00901 ;
25EA 78 00902 LD A,B ;P/u byte counter
25EB FE09 00903 CP 9 ;Halfway yet?
25ED CCB926 00904 CALL Z,WR1SPA ;Yes - display space
00905 ;
00906 ; Dec Chars/Line & # of chars left in Rec
00907 ;
25F0 05 00908 DEC B ;Count down
25F1 0D 00909 DEC C ;Count down the LRL
25F2 2804 00910 JR Z,DOHEX5 ;Done - get next record
00911 ;
00912 ; Finished with Line ?
00913 ;
25F4 78 00914 LD A,B ;Done with line ?
25F5 B7 00915 OR A
25F6 20D3 00916 JR NZ,DOHEX2 ;No - do til 16 chars
00917 ;
00918 ; Finished with Line or Logical Record
00919 ;
25F8 F5 00920 DOHEX5 PUSH AF ;End the line
25F9 78 00921 LD A,B ;P/u byte counter
25FA FE10 00922 CP 16 ;Done with this line ?
25FC 2826 00923 JR Z,PRTLIN2 ;Yes - get another record
00924 ;
00925 ; Display ASCII equivalent of line
00926 ;
25FE C5 00927 PRTLIN PUSH BC ;Save counters
00928 ;
00929 ; Multiply # of chars not printed by three
00930 ;
25FF 78 00931 LD A,B ;P/u # chars not printed
2600 87 00932 ADD A,A ;X 2
2601 80 00933 ADD A,B ;X 3
2602 47 00934 LD B,A ;Stuff in B
00935 ;
00936 ; Add two extra spaces if more than halfway
00937 ;
2603 FE1B 00938 CP 27 ;Need extra space if
2605 3F 00939 CCF ;Not halfway
2606 3E01 00940 LD A,1 ;Plus 1 more space
2608 88 00941 ADC A,B ;Carry set for 3 spaces
00942 ;
00943 ; Position to ASCII portion of line
00944 ;
2609 47 00945 LD B,A ;Set loop counter
260A CDB326 00946 CALL WRSPA ;Output B spaces
260D C1 00947 POP BC ;Recover the counters
00948 ;
00949 ; Calculate # of characters to print
00950 ;
260E 3E10 00951 LD A,16 ;Get # to print
2610 90 00952 SUB B
2611 47 00953 LD B,A ;Xfer to B for DJNZ
2612 21BC27 00954 LD HL,LINBUF ;HL => Line buffer
2615 C5 00955 PUSH BC ;Save C
2616 0E08 00956 LD C,8 ;Space after 8
00957 ;
00958 ; Display ASCII part of line
00959 ;
2618 7E 00960 PRTLIN1 LD A,(HL) ;P/u character
2619 23 00961 INC HL ;Bump ptr
261A CD4A26 00962 CALL CVTDOT ;Output each char
261D 0D 00963 DEC C ;Space yet ?
261E CCB926 00964 CALL Z,WR1SPA ;Yes - display space
2621 10F5 00965 DJNZ PRTLIN1 ;Output line
2623 C1 00966 POP BC ;Recover C
00967 ;
00968 ; End of Line - Output C/R & check for EOF
00969 ;
2624 3E0D 00970 PRTLIN2 LD A,CR ;Output C/R
2626 CD6726 00971 CALL PUTOUT
2629 F1 00972 POP AF ;Recover @GET ret code
262A 3E1C 00973 LD A,1CH ;Init to EOF
262C C27725 00974 JP NZ,GOTERR ;End of file - Abort
00975 ;
262F CDC726 00976 CALL CKPAWS ; or ?
00977 ;
00978 ; Are we done with the Record ?
00979 ;
2632 79 00980 LD A,C ;P/u # of bytes left
2633 B7 00981 OR A ;Finished ?
2634 C2AF25 00982 JP NZ,DISBYTE ;No - get next line
00983 ;
00984 ; Finished with record - Output space & C/R
00985 ;
2637 3E20 00986 LD A,' ' ;Space
2639 CD6726 00987 CALL PUTOUT
263C 3E0D 00988 LD A,CR ;Carriage Return
263E CD6726 00989 CALL PUTOUT
00990 ;
00991 ; Increment Line Number
00992 ;
2641 216327 00993 LD HL,VARCLN ;HL => Line Number
2644 CD2927 00994 CALL INCNUM ;Increment
2647 C39925 00995 JP DOHEX ;Loop for more
00996 ;
00997 ; CVTDOT - Output chars & convert non-printables
00998 ;
264A FE20 00999 CVTDOT CP ' ' ;Don't print controls
264C 3804 01000 JR C,CVTDOT1
264E FE7F 01001 CP 7FH ;Print X'20' thru X'7E'
2650 3815 01002 JR C,PUTOUT
2652 3E2E 01003 CVTDOT1 LD A,'.' ;Otherwise change to "."
2654 1811 01004 JR PUTOUT
01005 ;
01006 ; CVTHEX - Convert A to Hex ASCII & Output it
01007 ;
2656 F5 01008 CVTHEX PUSH AF ;Save Lower digit
2657 0F 01009 RRCA ;Get most sig nibble
2658 0F 01010 RRCA
2659 0F 01011 RRCA
265A 0F 01012 RRCA
265B CD5F26 01013 CALL CVTH1 ;Output upper nibble
265E F1 01014 POP AF ;Recover #
01015 ;
265F E60F 01016 CVTH1 AND 0FH ;Mask off upper nibble
2661 C690 01017 ADD A,90H ;Convert to Hex digit
2663 27 01018 DAA
2664 CE40 01019 ADC A,40H
2666 27 01020 DAA ;Fall into Output byte
01021 ;
01022 ; PUTOUT - Put out a byte to *DO/*PR
01023 ;
2667 C5 01024 PUTOUT PUSH BC ;Save BC
2668 4F 01025 LD C,A ;Xfer char to C
01026 ;
01027 ; Output byte to *DO or *PR
01028 ;
2669 3E02 01029 PUTOUT1 LD A,@DSP ;@DSP or @PRT SVC #
266B EF 01030 RST 28H
266C C21724 01031 JP NZ,IOERR ;NZ - I/O Error
01032 ;
01033 ; Increment byte counter
01034 ;
266F E5 01035 PUSH HL ;Save HL
2670 21BB27 01036 LD HL,BYTCTR ;HL => Byte counter
2673 34 01037 INC (HL) ;Bump counter
01038 IF @BLD631
2674 7E 01039 LD A,(HL) ;<631>
2675 D650 01040 SUB 50H ;<631>
2677 3801 01041 JR C,L267A ;<631>
2679 77 01042 LD (HL),A ;<631>
267A 79 01043 L267A: LD A,C ;<631>
267B D60A 01044 SUB 0AH ;<631>
267D 2804 01045 JR Z,L2683 ;<631>
267F D603 01046 SUB 03H ;<631>
2681 2001 01047 JR NZ,L2684 ;<631>
2683 77 01048 L2683: LD (HL),A ;<631>
2684 34 01049 L2684: INC (HL) ;<631>
2685 35 01050 DEC (HL) ;<631>
2686 E1 01051 POP HL ;<631>
2687 C1 01052 POP BC ;<631>
2688 C0 01053 RET NZ ;<631>
2689 01054 SPARM: EQU $
2689 110000 01055 LD DE,0 ;<631>
268C 7A 01056 LD A,D ;<631>
268D B3 01057 OR E ;<631>
268E C0 01058 RET NZ ;<631>
2690 01059 L2690: EQU $+1
268F 3E11 01060 LD A,11H ;<631>
2691 3D 01061 DEC A ;<631>
2692 329026 01062 LD (L2690),A ;<631>
2695 C0 01063 RET NZ ;<631>
2696 01064 @@KEY ;<631>
2696+3E01 01065 LD A,1
2698+EF 01066 RST 40
2699 FE80 01067 CP 80H ;<631>
269B CAEB26 01068 JP Z,GOTBRK ;<631>
269E D643 01069 SUB 43H ;<631>
26A0 2804 01070 JR Z,L26A6 ;<631>
26A2 D620 01071 SUB ' ' ;<631>
26A4 2004 01072 JR NZ,L26AA ;<631>
26A6 ED538A26 01073 L26A6: LD (SPARM+1),DE ;<631>
26AA 3E69 01074 L26AA: LD A,69H ;<631>
26AC EF 01075 L26AC: RST 28H ;<631>
26AE 01076 L26AE: EQU $+1
26AD 3E11 01077 LD A,11H ;<631>
26AF 329026 01078 LD (L2690),A ;<631>
26B2 C9 01079 RET ;<631>
01080 ELSE
01081 LD A,C ;P/u byte
01082 CP CR ;End of line ?
01083 JR NZ,NOTCR ;No - rest regs & RETurn
01084 ;
01085 LD (HL),0 ;Reset byte counter
01086 NOTCR POP HL ;Restore registers
01087 POP BC
01088 RET ; & RETurn
01089 ENDIF
01090 ;
01091 ;
01092 ; Output B spaces to Display or Printer
01093 ;
26B3 CDB926 01094 WRSPA CALL WR1SPA ;Write a space
26B6 10FB 01095 DJNZ WRSPA ;Do it B times
26B8 C9 01096 RET ;RETurn
01097 ;
01098 ; Output a space to Display or Printer
01099 ;
26B9 3E20 01100 WR1SPA LD A,' ' ;Space Character
26BB 18AA 01101 JR PUTOUT ;Output byte
01102 ;
01103 ; PUTLINE - Output a line to the video or printer
01104 ; HL => Line of data to output
01105 ;
26BD 7E 01106 PUTLINE LD A,(HL) ;P/u byte
26BE 23 01107 INC HL ;Prepare for next
26BF FE03 01108 CP ETX ;Check if done none
26C1 C8 01109 RET Z ; return if so
26C2 CD6726 01110 CALL PUTOUT ;Char OK output it
01111 IF @BLD631
01112 ELSE
01113 CP CR ;Check for CR
01114 RET Z ; return if so
01115 ENDIF
26C5 18F6 01116 JR PUTLINE
01117 ;
01118 ; CKPAWS - Check for Pause (SHIFT @)
01119 ;
26C7 01120 CKPAWS @@FLAGS ;IY => System flags
26C7+3E65 01121 LD A,101
26C9+EF 01122 RST 40
01123 ;
01124 ; Was the key pressed ?
01125 ;
26CA 01126 @@CKBRKC ; hit ?
26CA+3E6A 01127 LD A,106
26CC+EF 01128 RST 40
26CD 201C 01129 JR NZ,GOTBRK ;Quit if so
01130 ;
01131 ; Was the <@> pressed ?
01132 ;
26CF FDCB0A4E 01133 BIT 1,(IY+KFLAG$) ;Is the bit set ?
26D3 C8 01134 RET Z ;Return if not <@>
01135 ;
01136 ; Pause - Wait for key to continue
01137 ;
26D4 01138 CKWAIT @@KEY ;Wait for key press
26D4+3E01 01139 LD A,1
26D6+EF 01140 RST 40
26D7 FE60 01141 CKWAIT1 CP 60H ;Was key a ?
26D9 28F9 01142 JR Z,CKWAIT ;Ignore if it was
26DB FE80 01143 CP 80H ;Was key a Break?
26DD 280C 01144 JR Z,GOTBRK ;Quit if so
01145 ;
01146 ; Reset & bits & RETurn
01147 ;
26DF 01148 RESKFL @@FLAGS ;IY => Flag Table
26DF+3E65 01149 LD A,101
26E1+EF 01150 RST 40
26E2 FD7E0A 01151 LD A,(IY+KFLAG$) ;P/u KFLAG$
26E5 E6F9 01152 AND 0F9H ;Reset Pause and Enter
26E7 FD770A 01153 LD (IY+KFLAG$),A ;Stuff into KFLAG$
26EA C9 01154 RET
01155 ;
01156 ; hit - Display C/R & Abort
01157 ;
26EB 3E0D 01158 GOTBRK LD A,CR ;Send end of line
26ED CD6726 01159 CALL PUTOUT ;Output byte
26F0 C32824 01160 JP ABORT ; and abort due to BREAK
01161 ;
01162 ; CVTDEC - Convert HL to Decimal & stuff in BC
01163 ;
26F3 111027 01164 CVTDEC LD DE,10000 ;Divide by 10000
26F6 CD0E27 01165 CALL CVD1
26F9 11E803 01166 LD DE,1000 ;Divide by 1000
26FC CD0E27 01167 CALL CVD1
26FF 116400 01168 LD DE,100 ;Divide by 100
2702 CD0E27 01169 CALL CVD1
2705 110A00 01170 LD DE,10 ;Divide by 10
2708 CD0E27 01171 CALL CVD1
270B 110100 01172 LD DE,1 ;Divide by 1
01173 ;
01174 ; Divide Quotient in HL by value in DE
01175 ;
270E AF 01176 CVD1 XOR A ;Clear carry set A=0
270F ED52 01177 CVD2 SBC HL,DE ;Subtract Divisor
2711 3803 01178 JR C,CVD3 ;Done - add back divisor
2713 3C 01179 INC A ;Bump counter
2714 18F9 01180 JR CVD2 ;Subtract until a Carry
01181 ;
01182 ; Add divisor to neg rem & cvrt A to ASCII
01183 ;
2716 19 01184 CVD3 ADD HL,DE ;HL = New quotient
2717 C630 01185 ADD A,'0' ;A = ASCII numeric digit
2719 FE30 01186 CP '0' ;Zero ?
271B 2009 01187 JR NZ,CVD4 ;No - stuff in buff (BC)
01188 ;
01189 ; Char is a Zero - use space if leading zero
01190 ;
271D 0B 01191 DEC BC ;Backspace buff ptr
271E 0A 01192 LD A,(BC) ;P/u last char
271F 03 01193 INC BC ;Bump to currentt
2720 FE20 01194 CP ' ' ;Last char a space ?
2722 2802 01195 JR Z,CVD4 ;Yes - don't use lead 0
2724 3E30 01196 LD A,'0' ;No - use zero
01197 ;
01198 ; Stuff Numeric ASCII character into buffer
01199 ;
2726 02 01200 CVD4 LD (BC),A ;Stuff char in buff
2727 03 01201 INC BC ;Bump ptr
2728 C9 01202 RET ;RETurn
01203 ;
01204 ; INCNUM - Increment Line number in buffer (HL)
01205 ;
2729 23 01206 INCNUM INC HL ;Point to lo-order digit
272A 23 01207 INC HL
272B 23 01208 INC HL
272C 23 01209 INC HL
01210 ;
01211 ; Loop to Increment digit and return if done
01212 ;
272D 7E 01213 INCNUM1 LD A,(HL) ;P/u digit
272E F630 01214 OR '0' ;Start with possible 0
2730 3C 01215 INC A ;Add 1
2731 77 01216 LD (HL),A ;Restuff
2732 D63A 01217 SUB '9'+1 ;See if went to 10
2734 D8 01218 RET C ;Ret if not
2735 3630 01219 LD (HL),'0' ;Make it 0
2737 2B 01220 DEC HL ;B/u one
2738 18F3 01221 JR INCNUM1 ; & loop
01222 ;
01223 ; OPEN - Open a file
01224 ;
273A 01225 OPEN @@FLAGS ;IY => System Flags
273A+3E65 01226 LD A,101
273C+EF 01227 RST 40
273D FDCB12C6 01228 SET 0,(IY+SFLAG$) ;P/u SFLAG$
2741 210029 01229 LD HL,IOBUFF ;HL => I/O buffer
2744 01230 @@OPEN ;Open the file
2744+3E3B 01231 LD A,59
2746+EF 01232 RST 40
2747 C9 01233 RET ; & RETurn with condition
01234 ;
2748 46 01235 SPCREQ$ DB 'File spec required',CR
69 6C 65 20 73 70 65 63
20 72 65 71 75 69 72 65
64 0D
01236 ;
01237 ;
275B 20 01238 VARDOT DB ' . ',ETX
20 20 20 20 2E 20 03
2763 20 01239 VARCLN DB ' :'
20 20 20 20 3A
2769 58 01240 VAREQU DB 'XX = ',ETX
58 20 3D 20 20 03
2770 54 01241 TXTEXT DB 'TXT'
58 54
01242 ;
01243 ;
01244 ; PARAMETER TABLE
01245 ;
2773 80 01246 PRMTBL$ DB 80H
01247 ;
01248 ; ASCII8 (A8) - Flag input only
01249 ;
2774 46 01250 DB FLAG!6
2775 41 01251 DB 'ASCII8'
53 43 49 49 38
277B 00 01252 DB 0
277C 3325 01253 DW A8PARM+1
01254 ;
277E 42 01255 DB FLAG!2
277F 41 01256 DB 'A8'
38
2781 00 01257 DB 0
2782 3325 01258 DW A8PARM+1
01259 ;
01260 ; LINE - Numeric input only
01261 ;
2784 84 01262 DB NUM!4
2785 4C 01263 DB 'LINE'
49 4E 45
2789 00 01264 DB 0
278A F024 01265 DW LINPRM+1
01266 ;
01267 IF @BLD631
01268 ; NUM (N) - Flag input only
01269 ;
278C 43 01270 DB FLAG!3 ;<631>
01271 ELSE
01272 ; NUM (N) - Flag input only
01273 ;
01274 DB FLAG!ABB!3
01275 ENDIF
278D 4E 01276 DB 'NUM'
55 4D
2790 00 01277 DB 0
2791 1E25 01278 DW NPARM+1
01279 IF @BLD631
01280 ;
01281 ; NS (N) - Flag input only
01282 ;
2793 52 01283 DB FLAG!ABB!2
2794 4E 01284 DB 'NS'
53
2796 00 01285 DB 0
2797 8A26 01286 DW SPARM+1
01287 ENDIF
01288 ;
01289 ; HEX (H) - Flag input only
01290 ;
2799 53 01291 DB FLAG!ABB!3
279A 48 01292 DB 'HEX'
45 58
279D 00 01293 DB 0
279E DA24 01294 DW HPARM+1
01295 ;
01296 ; REC (R) - Numeric input only
01297 ;
27A0 93 01298 DB NUM!ABB!3
27A1 52 01299 DB 'REC'
45 43
27A4 00 01300 DB 0
27A5 8E25 01301 DW RPARM+1
01302 ;
01303 ; LRL (L) - Numeric input only
01304 ;
27A7 93 01305 DB NUM!ABB!3
27A8 4C 01306 DB 'LRL'
52 4C
27AB 00 01307 LRESP DB 0
27AC AD25 01308 DW LPARM+1
01309 ;
01310 ; P - Flag input only
01311 ;
27AE 41 01312 DB FLAG!1
27AF 50 01313 DB 'P'
27B0 00 01314 DB 0
27B1 CA24 01315 DW PPARM+1
01316 ;
01317 ; TAB (T) - Flag input only
01318 ;
27B3 53 01319 DB FLAG!ABB!3
27B4 54 01320 DB 'TAB'
41 42
27B7 00 01321 TRESP DB 0
27B8 4325 01322 DW TPARM+1
01323 ;
27BA 00 01324 DB 0
01325 ;
01326 ;Buffer Area
01327 ;
27BB 01328 BYTCTR DS 1
27BC 01329 LINBUF DS 16
27CC 01330 FCB1 DS 32
27EC 01331 FCB2 DS 32
01332 ;
2900 01333 ORG $<-8+1<+8
2900 01334 IOBUFF DS 256
01335 ;
2400 01336 END START
2400 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 at nemesis.lonestar.org]