[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/19/99 21:50:22 FORMS/FLT - LS-DOS 6.2 Page 00001
00001 ;FORMS/ASM - Printer Formatting Filter
00003 ;
000A 00004 LF EQU 10
000D 00005 CR EQU 13
00006 ;
0000 00007 *GET SVCMAC:3 ;SVC Macro equivalents
00008 ;SVCMAC/ASM - LS-DOS Version VI
00009 *LIST OFF
00401 *LIST ON
0000 00403 *GET COPYCOM:3 ;Copyright message
00404 ; COPYCOM - File for Copyright COMment block
00405 ;
0000 00406 *GET BUILDVER/ASM:3
00407 ;
00408 ; Buildver/asm is a bit of a kludge since not all utilities can load
00409 ; equates from LDOS60 and still compile. LOWCORE and everybody else
00410 ; relies on this setting, and it eventually ends up in LDOS60/EQU
00411 ; for programs that can use that.
00412 ;
FFFF 00413 @BLD631 EQU -1 ;<631>Build 631 distribution (LEVEL 1B)
00414 ; These switches activate patches made since the 1B release.
00415 ; It is important that all earlier patches be enabled when a higher
00416 ; patch is enabled.
00417 ; Patches C thru F were published in TMQ IV.iv, page 32 (NOTE: the
00418 ; patch addresses listed for SPOOL in SPOOL1/FIX are 19H high.)
FFFF 00419 @BLD631C EQU -1 ;<631>Apply 1C patches (SETKI)
FFFF 00420 @BLD631D EQU -1 ;<631>Apply 1D patches (DIR)
FFFF 00421 @BLD631E EQU -1 ;<631>Apply 1E patches (DIR & MEMDISK/DCT)
FFFF 00422 @BLD631F EQU -1 ;<631>Apply 1F patches (SPOOL)
00423 ; Patches G and H were published in TMQ V.i, pages 10 and 18/19.
FFFF 00424 @BLD631G EQU -1 ;<631>Apply 1G patches (//KEYIN,DIR,DO *)
FFFF 00425 @BLD631H EQU -1 ;<631>Apply 1H patches (MEMORY)
00426 ;
00427 ;End of BUILDVER/ASM
00428 IF @BLD631
00430 ELSE
00431 COM '<*(C) 1982,3,4,6 by LSI*>'
00432 ENDIF
00433 ;
2400 00434 ORG 2400H
00435 ;
00436 BEGIN
2400 00437 @@CKBRKC ;Check for break
2400+3E6A 00438 LD A,106
2402+EF 00439 RST 40
2403 2804 00440 JR Z,BEGINA ;Continue if no Break
2405 21FFFF 00441 LD HL,-1
2408 C9 00442 RET ; else abort
00443 ;
2409 D5 00444 BEGINA PUSH DE ;Save DCB address
240A DDE1 00445 POP IX ; in index reg
240C ED534426 00446 LD (PFDCB),DE ; and in filter header
2410 00447 @@DSPLY HELLO$ ;Welcome the user
00448 IFEQ 01H,1
2410+211E25 00449 LD HL,HELLO$
00450 ENDIF
2413+3E0A 00451 LD A,10
2415+EF 00452 RST 40
00453 ;
00454 ; Check if entry from SET command
00455 ;
2416 00456 @@FLAGS ;IY => flag table base
2416+3E65 00457 LD A,101
2418+EF 00458 RST 40
2419 FDCB025E 00459 BIT 3,(IY+'C'-'A') ;System request?
241D CAFE24 00460 JP Z,VIASET ;Quit if not
00461 ;
00462 ; Check if filter is already resident
00463 ;
2420 111A25 00464 LD DE,FF$ ;Check if filter is
2423 00465 @@GTMOD ; already resident
2423+3E53 00466 LD A,83
2425+EF 00467 RST 40
2426 EB 00468 EX DE,HL ;Put DCB ptr to HL
2427 201C 00469 JR NZ,NOTRES ;Go if not
00470 ;
00471 ; Make sure that the new DCB is same as the old
00472 ;
00473 IF @BLD631
2429 4E 00474 LD C,(HL) ;<631>P/u DCB pointer LSB
242A 23 00475 INC HL ;<631>
242B 46 00476 LD B,(HL) ;<631>P/u DCB pointer MSB
00477 ELSE
00478 LD BC,(PFDCB) ;Replace DCB pointer
00479 LD A,C ; with new one
00480 LD C,(HL) ;P/u DCB pointer LSB
00481 NOP
00482 INC HL
00483 LD A,B
00484 LD B,(HL) ;P/u DCB pointer MSB
00485 ENDIF
242C 210600 00486 LD HL,6 ;Get old DCB name &
242F 09 00487 ADD HL,BC ; stuff into error
2430 7E 00488 LD A,(HL) ; message in case
2431 2C 00489 INC L ; a different DCB
2432 66 00490 LD H,(HL) ; is referenced
2433 6F 00491 LD L,A
2434 22F425 00492 LD (DCBNAM$),HL ;Stuff message with spec
2437 B4 00493 OR H
2438 2876 00494 JR Z,ISRES
243A 2A4426 00495 LD HL,(PFDCB) ;P/u DCB existing DCB
243D B7 00496 OR A ; pointer
243E ED42 00497 SBC HL,BC ;Same DCB pointer?
2440 C20225 00498 JP NZ,DCBERR ;Can't install if diff
2443 186B 00499 JR ISRES
00500 ;
00501 ; Module is not resident
00502 ;
2445 114B49 00503 NOTRES LD DE,'IK'
2448 00504 @@GTDCB ;Locate low memory ptr
2448+3E52 00505 LD A,82
244A+EF 00506 RST 40
244B C21025 00507 JP NZ,IOERR ;Quit if not found
244E 2D 00508 DEC L
244F 56 00509 LD D,(HL) ;P/u pointer to
2450 2D 00510 DEC L ; start of free
2451 5E 00511 LD E,(HL) ; low core
2452 ED53A024 00512 LD (LCPTR+1),DE ;Save loc for later
2456 E5 00513 PUSH HL ;Save low core ptr
2457 210101 00514 LD HL,PFEND-PFFLT
245A 19 00515 ADD HL,DE ;Start + driver length
245B E5 00516 PUSH HL
245C 2B 00517 DEC HL ;Point to last byte
245D 22D624 00518 LD (SVEND+1),HL
2460 010013 00519 LD BC,1300H ;Max addr + 1
2463 AF 00520 XOR A
2464 ED42 00521 SBC HL,BC
2466 D1 00522 POP DE ;Rcvr new lc
2467 E1 00523 POP HL ;Rcvr low core ptr
2468 382F 00524 JR C,PUTLOW ;If room, put low
00525 ;
00526 ; Check if high memory available
00527 ;
246A 00528 @@FLAGS
246A+3E65 00529 LD A,101
246C+EF 00530 RST 40
246D FDCB0246 00531 BIT 0,(IY+'C'-'A') ;Memory frozen?
2471 C20625 00532 JP NZ,NOROOM ;"No memory...
2474 210000 00533 LD HL,0 ;Get HIGH$
2477 45 00534 LD B,L
2478 00535 @@HIGH$
2478+3E64 00536 LD A,100
247A+EF 00537 RST 40
247B 22D624 00538 LD (SVEND+1),HL ;Save for relocator
247E 5D 00539 LD E,L ;Xfer new last
247F 54 00540 LD D,H ; to reg DE
2480 AF 00541 XOR A ;Calc new start
2481 010101 00542 LD BC,PFEND-PFFLT ;BC = filter len
2484 ED42 00543 SBC HL,BC
2486 0600 00544 LD B,0
2488 00545 @@HIGH$ ;Set new HIGH$
2488+3E64 00546 LD A,100
248A+EF 00547 RST 40
248B 23 00548 INC HL ;Point to new start
248C EB 00549 EX DE,HL
248D D5 00550 PUSH DE
248E CDCF24 00551 CALL RELO ;Relocate internal references
2491 D1 00552 POP DE
2492 3EFF 00553 LD A,0FFH
2494 32C124 00554 LD (HGHFLG),A ;Flag to notify user
2497 1809 00555 JR MOVMOD ; himem used
00556 ;
00557 ; Room in low core - move driver low
00558 ;
2499 73 00559 PUTLOW LD (HL),E ;Stuff low core ptr
249A 2C 00560 INC L ; with new low
249B 72 00561 LD (HL),D
249C CDCF24 00562 CALL RELO ;Relocate vectors
249F 110000 00563 LCPTR LD DE,$-$ ;Low core pointer
00564 ;
00565 ; Move module to memory
00566 ;
24A2 D5 00567 MOVMOD PUSH DE ;Save start
24A3 213C26 00568 LD HL,PFFLT
24A6 010101 00569 LD BC,PFEND-PFFLT ;Calc driver length
24A9 EDB0 00570 LDIR
24AB D1 00571 POP DE ;Pop filter start
24AC FDCB03EE 00572 SET 5,(IY+'D'-'A') ;Set PF in DFLAG$
00573 ;
24B0 21F725 00574 ISRES LD HL,PFACT$ ;Init "FORMS installed
24B3 DD360047 00575 LD (IX),40H!7 ;Init DCB type to "C/P/G"
24B7 DD7301 00576 LD (IX+1),E ; & filter & stuff the
24BA DD7202 00577 LD (IX+2),D ; filter address
24BD 00578 @@LOGOT ;Display installation
00579 IFEQ 00H,1
00580 LD HL,
00581 ENDIF
24BD+3E0C 00582 LD A,12
24BF+EF 00583 RST 40
24C0 3E00 00584 LD A,$-$
24C1 00585 HGHFLG EQU $-1 ;Flag filter went high
24C2 B7 00586 OR A ;Skip if not set
24C3 2806 00587 JR Z,NTHGH
24C5 211426 00588 LD HL,HMEM$ ; else show "Went in himem
24C8 00589 @@LOGOT
00590 IFEQ 00H,1
00591 LD HL,
00592 ENDIF
24C8+3E0C 00593 LD A,12
24CA+EF 00594 RST 40
24CB 210000 00595 NTHGH LD HL,0 ;No error
24CE C9 00596 RET ;Done, back to user
00597 ;
00598 ; Relocate internal references in driver
00599 ;
24CF DDE5 00600 RELO PUSH IX
24D1 DD213D27 00601 LD IX,RELTAB ;Point to relocation tbl
24D5 210000 00602 SVEND LD HL,$-$ ;Find distance to move
24D8 223E26 00603 LD (PFFLT+2),HL ;Set last byte used
24DB 113C27 00604 LD DE,PFEND-1
24DE B7 00605 OR A ;Clear carry flag
24DF ED52 00606 SBC HL,DE
24E1 44 00607 LD B,H ;Move to BC
24E2 4D 00608 LD C,L
24E3 3E0E 00609 LD A,TABLEN ;Get table length
24E5 DD6E00 00610 RLOOP LD L,(IX) ;Get address to change
24E8 DD6601 00611 LD H,(IX+1)
24EB 5E 00612 LD E,(HL) ;P/U address
24EC 23 00613 INC HL
24ED 56 00614 LD D,(HL)
24EE EB 00615 EX DE,HL ;Offset it
24EF 09 00616 ADD HL,BC
24F0 EB 00617 EX DE,HL
24F1 72 00618 LD (HL),D ;Put it back
24F2 2B 00619 DEC HL
24F3 73 00620 LD (HL),E
24F4 DD23 00621 INC IX
24F6 DD23 00622 INC IX
24F8 3D 00623 DEC A
24F9 20EA 00624 JR NZ,RLOOP ;Loop till done
24FB DDE1 00625 POP IX
24FD C9 00626 RET
00627 ;
00628 ; Error exits
00629 ;
24FE 21A925 00630 VIASET LD HL,VIASET$ ;"Install with Set
2501 DD 00631 DB 0DDH
2502 21D825 00632 DCBERR LD HL,DCBERR$ ;"Filter in use
2505 DD 00633 DB 0DDH
2506 21BE25 00634 NOROOM LD HL,NOROOM$ ;"Memory frozen
2509 00635 @@LOGOT ;Show the error
00636 IFEQ 00H,1
00637 LD HL,
00638 ENDIF
2509+3E0C 00639 LD A,12
250B+EF 00640 RST 40
250C 21FFFF 00641 LD HL,-1 ;Set abort code
250F C9 00642 RET
00643 ;
2510 6F 00644 IOERR LD L,A ;Error # to HL
2511 2600 00645 LD H,0
2513 F6C0 00646 OR 0C0H ;Abbrev, return
2515 4F 00647 LD C,A ;Error code to C
2516 00648 @@ERROR ; for error display
2516+3E1A 00649 LD A,26
2518+EF 00650 RST 40
2519 C9 00651 RET
00652 ;
00653 ; Messages & Data tables
00654 ;
251A 24 00655 FF$ DB '$FF',3
46 46 03
251E 46 00656 HELLO$ DB 'FORMS Filter'
4F 52 4D 53 20 46 69 6C
74 65 72
252A 00657 *GET CLIENT:3
00658 ;CLIENT/ASM - File to establish sign-on headers
00659 ; and version numbers.
00660 ;
00661 ; EACH STRING SHOULD CONTAIN ONLY 63 CHARACTERS !!
00662 ;
00663 IF @BLD631
00664 ; 12345678901234567890123456789012345678901234567890
252A 20 00665 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
255C 49 00666 DB 'Inc., ',10 ;<631>
6E 63 2E 2C 20 20 20 20
20 20 20 0A
00667 ELSE
00668 DB ' - 6.3.0 - Copyright 1982/83/84/86 by Logical Syst'
00669 DB 'ems, Inc. ',10
00670 ENDIF
00671 ;
00672 ; DB 'All Rights Reserved. Licensed 1982/83/84 to Tandy '
00673 ; DB 'Corporation.',10,13
00674 ;
00675 ; DB 'All Rights Reserved. Beta-TEST Level/AD, DO NOT DI'
00676 ; DB 'STRIBUTE !! ',10,13
00677 ; DB 'All Rights reserved by LSI, 8970 N. 55th St. Milwa'
00678 ; DB 'ukee, Wisc. ',10,13
2569 41 00679 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
259B 72 00680 DB 'rohibited. ',10,13
6F 68 69 62 69 74 65 64
2E 20 20 0A 0D
00681 ;
25A9 4D 00682 VIASET$ DB 'Must install via SET',CR
75 73 74 20 69 6E 73 74
61 6C 6C 20 76 69 61 20
53 45 54 0D
25BE 4E 00683 NOROOM$ DB 'No memory space available',CR
6F 20 6D 65 6D 6F 72 79
20 73 70 61 63 65 20 61
76 61 69 6C 61 62 6C 65
0D
25D8 46 00684 DCBERR$ DB 'Filter already attached to *xx',CR
69 6C 74 65 72 20 61 6C
72 65 61 64 79 20 61 74
74 61 63 68 65 64 20 74
6F 20 2A 78 78 0D
25F4 00685 DCBNAM$ EQU $-3
25F7 46 00686 PFACT$ DB 'Forms filter is now resident',CR
6F 72 6D 73 20 66 69 6C
74 65 72 20 69 73 20 6E
6F 77 20 72 65 73 69 64
65 6E 74 0D
2614 0A 00687 HMEM$ DB LF,'Note: filter installed in high memory.',CR
4E 6F 74 65 3A 20 66 69
6C 74 65 72 20 69 6E 73
74 61 6C 6C 65 64 20 69
6E 20 68 69 67 68 20 6D
65 6D 6F 72 79 2E 0D
00688 ;
00689 ;
00690 ; Printer Filter - PF
00691 ; Provides hard or soft form feed, line wraparound,
00692 ; automatic form feeds between pages, tabs, blank
00693 ; lines, 1 byte translation table, left margins,
00694 ; and set-top-of-form character.
00695 ;
00696 *MOD
0003 00697 PFBIT EQU 3 ;Position in DFLAG
0000 00698 SPLBIT EQU 0 ;Position in DFLAG
000A 00699 LF EQU 10
000D 00700 CR EQU 13
00701 ;
263C 1814 00702 PFFLT JR PFBGN ;Branch around header
263E 3C27 00703 DW PFEND-1 ;Last byte used
2640 03 00704 DB 3,'$FF' ;Name length/name
24 46 46
2644 0000 00705 PFDCB DW $-$ ;Link to DCB
2646 0000 00706 DW 0
00707 ;
00708 ; Filter data area
00709 ;
2648 00710 PFDATA$ EQU $
0000 00711 PMAX EQU $-PFDATA$
2648 42 00712 DB 66 ;Page size (max lines per page)
0001 00713 LCOUNT EQU $-PFDATA$
2649 00 00714 DB 0 ;Line counter
0002 00715 LMAX EQU $-PFDATA$
264A 42 00716 DB 66 ;Max lines to print
0003 00717 CCOUNT EQU $-PFDATA$
264B 00 00718 DB 0 ;Chars per line printed
0004 00719 XL1 EQU $-PFDATA$
264C 00 00720 DB 0 ;Translate from
0005 00721 XL2 EQU $-PFDATA$
264D 00 00722 DB 0 ;Translate to
0006 00723 INDENT EQU $-PFDATA$
264E 00 00724 DB 0 ;Indent after line wraparound
0007 00725 ADDLF EQU $-PFDATA$
264F 04 00726 DB 4 ;Bit-0, LF after CR; bit-1=FF
00727 ;Bit-2, TAB expand (1)
0008 00728 CMAX EQU $-PFDATA$
2650 00 00729 DB 0 ;Max CPL before wraparound
0009 00730 MARGIN EQU $-PFDATA$
2651 00 00731 DB 0 ;Left hand margin
00732 ;
00733 ; Start of filter
00734 ;
2652 281A 00735 PFBGN JR Z,FFENTRY ;Go if @PUT
2654 11 00736 DB 011H ;Ignore next inst if not
2655 0602 00737 PFPUT LD B,2 ;Init for @PUT
2657 DDE5 00738 PUSH IX
2659 DD2A4426 00739 LD IX,(PFDCB) ;Grab the DCB vector
265B 00740 RX01 EQU $-2
265D 00741 @@CHNIO ; & chain to it
265D+3E14 00742 LD A,20
265F+EF 00743 RST 40
2660 DDE1 00744 POP IX
2662 C9 00745 RET
00746 ;
00747 ; Peform the tab function
00748 ;
2663 DD7E03 00749 DOTAB LD A,(IX+CCOUNT) ;How many spaces to
2666 E607 00750 AND 7 ; next tab stop?
2668 D608 00751 SUB 8
266A ED44 00752 NEG
266C 1867 00753 JR @INDENT ;Space over to it
00754 ;
00755 ; Filter code
00756 ;
266E DD214826 00757 FFENTRY LD IX,PFDATA$ ;Base register
2670 00758 RX02 EQU $-2
00759 ;
2672 DD7E04 00760 CKXLAT LD A,(IX+XL1) ;Get xlate in
2675 B9 00761 CP C ;Translate this char?
2676 2004 00762 JR NZ,CONT ;Go if not xlated char
2678 DD7E05 00763 LD A,(IX+XL2) ;Xlated to this
267B 4F 00764 LD C,A
267C 79 00765 CONT LD A,C ;P/u char to test
267D FE0C 00766 CP 0CH ;Form feed?
267F CA1427 00767 JP Z,DOTOF
2680 00768 RX14 EQU $-2
2682 FE06 00769 CP 6 ;SET TOF?
2684 CA3727 00770 JP Z,SETTOF
2685 00771 RX03 EQU $-2
2687 FE0D 00772 CP CR ;CR?
2689 287A 00773 JR Z,DOCRLF
268B FE0A 00774 CP LF ;LF?
268D 2876 00775 JR Z,DOCRLF
268F DD7E09 00776 LD A,(IX+MARGIN) ;Left margin to do?
2692 B7 00777 OR A
2693 280B 00778 JR Z,NOMARG ;Go if not
2695 DD3403 00779 INC (IX+CCOUNT) ;Check current char count
2698 DD3503 00780 DEC (IX+CCOUNT) ;If at newline,
269B C5 00781 PUSH BC
269C CCD526 00782 CALL Z,@INDENT ; need a margin now
269D 00783 RX13 EQU $-2
269F C1 00784 POP BC
26A0 79 00785 NOMARG LD A,C ;P/u character again
26A1 DDCB0756 00786 BIT 2,(IX+ADDLF) ;Expand tabs?
26A5 2804 00787 JR Z,CONTA
26A7 FE09 00788 CP 9 ;Tab?
26A9 28B8 00789 JR Z,DOTAB
26AB FE20 00790 CONTA CP 20H ;Other control code?
26AD 38A6 00791 JR C,PFPUT ;Pass on unchanged if so
00792 ;
00793 ; Got a character to output
00794 ;
26AF C5 00795 PUTCHAR PUSH BC ;Save character
26B0 CDB926 00796 CALL SETUP ;Setup for next char
26B1 00797 RX12 EQU $-2
26B3 C1 00798 POP BC
26B4 C0 00799 RET NZ ;Quit on error
26B5 CC5526 00800 CALL Z,PFPUT ;Now put the char
26B6 00801 RX04 EQU $-2
26B8 C9 00802 RET
00803 ;
00804 ; Do the end of line check
00805 ;
26B9 DD3403 00806 SETUP INC (IX+CCOUNT) ;Inc char counter
26BC DD7E08 00807 LD A,(IX+CMAX) ;Wraparound needed?
26BF A7 00808 AND A
26C0 C8 00809 RET Z ;Quit if feature is off
26C1 DDBE03 00810 CP (IX+CCOUNT)
26C4 3075 00811 JR NC,EXITZ ;Done if not needed
26C6 CD0527 00812 CALL DOCRLF ;Do carriage return
26C7 00813 RX05 EQU $-2
26C9 C0 00814 RET NZ
26CA DD3403 00815 INC (IX+CCOUNT) ;Adjust char counter
00816 ;
00817 ; Check on indent needed
00818 ;
26CD DD7E06 00819 LD A,(IX+INDENT) ;P/u indent
26D0 DD8609 00820 ADD A,(IX+MARGIN) ;Add in the MARGIN
26D3 B7 00821 OR A
26D4 C8 00822 RET Z ;Done if none
26D5 C5 00823 @INDENT PUSH BC ;In case of recursive
26D6 47 00824 LD B,A ; calls
26D7 0E20 00825 LD C,' ' ;Print spaces
26D9 C5 00826 SPACES PUSH BC ;Save counter
26DA AF 00827 XOR A
26DB CDAF26 00828 CALL PUTCHAR ;Put the character
26DC 00829 RX06 EQU $-2
26DE C1 00830 POP BC ;Recover counter
26DF 2002 00831 JR NZ,$+4 ;Exit on PUT error
26E1 10F6 00832 DJNZ SPACES
26E3 C1 00833 POP BC
26E4 C9 00834 RET
26E5 DDCB0746 00835 LINFEED BIT 0,(IX+ADDLF)
26E9 2808 00836 JR Z,DOWN1 ;Go if hardware auto-LF
26EB 0E0D 00837 LD C,CR ;Else do CR and LF
26ED CD5526 00838 CALL PFPUT
26EE 00839 RX11 EQU $-2
26F0 C0 00840 RET NZ
26F1 1808 00841 JR DOWNLF
26F3 DD7E03 00842 DOWN1 LD A,(IX+CCOUNT)
26F6 A7 00843 AND A ;Line empty?
26F7 0E0D 00844 LD C,CR ;Do CR if not
26F9 2002 00845 JR NZ,DOWNCR
26FB 0E0A 00846 DOWNLF LD C,LF ;Do LF if so
26FD CD5526 00847 DOWNCR CALL PFPUT
26FE 00848 RX07 EQU $-2
2700 DD360300 00849 LD (IX+CCOUNT),0 ;Starting new line
2704 C9 00850 RET
00851 ;
2705 CDE526 00852 DOCRLF CALL LINFEED ;CRLF & check if page end
2706 00853 RX08 EQU $-2
2708 C0 00854 RET NZ
00855 ;
2709 DD3401 00856 INC (IX+LCOUNT)
270C DD7E01 00857 LD A,(IX+LCOUNT) ;Time to do form feed?
270F DDBE02 00858 CP (IX+LMAX)
2712 3827 00859 JR C,EXITZ ;Return if not
00860 ;
2714 DD7E00 00861 DOTOF LD A,(IX+PMAX) ;How many lines to feed?
2717 DD9601 00862 SUB (IX+LCOUNT)
271A 281B 00863 JR Z,SETTOF ;Skip if zero
271C C5 00864 PUSH BC ;In case called by DOTAB
271D 47 00865 LD B,A
271E DDCB074E 00866 BIT 1,(IX+ADDLF) ;Hardware form feed?
2722 2807 00867 JR Z,SOFTFF ;Go if not
2724 0E0C 00868 LD C,0CH ; else load up TOF char
2726 CD5526 00869 CALL PFPUT ; and send it
2727 00870 RX09 EQU $-2
2729 180B 00871 JR FFEXIT
272B C5 00872 SOFTFF PUSH BC
272C CDE526 00873 CALL LINFEED ;Do LF's
272D 00874 RX10 EQU $-2
272F C1 00875 POP BC
2730 2802 00876 JR Z,CHRGONE ;This linefeed sent OK
2732 C1 00877 POP BC ; else clean stack
2733 C9 00878 RET ; and return error
2734 10F5 00879 CHRGONE DJNZ SOFTFF
2736 C1 00880 FFEXIT POP BC
00881 ;
00882 ; Set the top-of-form
00883 ;
2737 DD360100 00884 SETTOF LD (IX+LCOUNT),0 ;Reset line counter
273B BF 00885 EXITZ CP A
273C C9 00886 RET
00887 ;
273D 00888 PFEND EQU $
00889 ;
273D 5B26 00890 RELTAB DW RX01,RX02,RX03,RX04,RX05,RX06,RX07,RX08
7026 8526 B626 C726 DC26 FE26 0627
274D 2727 00891 DW RX09,RX10,RX11,RX12,RX13,RX14
2D27 EE26 B126 9D26 8026
000E 00892 TABLEN EQU $-RELTAB/2
00893 ;
2400 00894 END BEGIN
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]