[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]
00001 ;Filter for LDOS 6.x for intnl daisy-wheel operation
00002 ;
0000 00003 *GET SVCMAC
00004 ;SVCMAC/ASM - LS-DOS Version VI
00005 *LIST OFF
00397 *LIST ON
00399 ; General EQUates...
000A 00400 LF EQU 10 ;Linefeed character
000D 00401 CR EQU 13 ;Carriage return
0008 00402 BKSP EQU 8 ;Backspace
00403 ;
00404 ; LDOS 'SET' command handler for 6.x
00405 ;
2600 00406 ORG 2600H
2600 D5 00407 BEGIN PUSH DE ;Put DCB pointer
2601 DDE1 00408 POP IX ;Into IX register
2603 219426 00409 LD HL,SIGNON ;=>Signon message
2606 00410 @@DSPLY ;Print it
00411 IFEQ 00H,1
00412 LD HL,
00413 ENDIF
2606+3E0A 00414 LD A,10
2608+EF 00415 RST 40
2609 00416 @@FLAGS ;Point IY to flag table
2609+3E65 00417 LD A,101
260B+EF 00418 RST 40
260C FDCB025E 00419 BIT 3,(IY+2) ;System request?
2610 CA8526 00420 JP Z,NOTSET ;Must install with SET cmd
00421 ; check if memory available
2613 FDCB0246 00422 BIT 0,(IY+2) ;HIGH$ frozen?
2617 C28026 00423 JP NZ,NOROOM ;Quit if so
261A FDE5 00424 PUSH IY
261C D1 00425 POP DE
261D 210800 00426 LD HL,'I'-'A' ;Offset to IFLAG$
2620 19 00427 ADD HL,DE
2621 226427 00428 LD (IFLG),HL ;Store in code
2624 226F27 00429 LD (IFLG2),HL
00430 ;Is it already in memory?
2627 112D27 00431 LD DE,FLTNAM
262A 00432 @@GTMOD
262A+3E53 00433 LD A,83
262C+EF 00434 RST 40
262D CA8A26 00435 JP Z,ISRES
00436 ; find available high memory
2630 210000 00437 LD HL,0
2633 45 00438 LD B,L ;B=0
2634 00439 @@HIGH$ ;Find top of avaliable memory
2634+3E64 00440 LD A,100
2636+EF 00441 RST 40
2637 223227 00442 LD (OLDMEM),HL ;Save in filter header
263A E5 00443 PUSH HL ;Save HIGH$
263B DD223727 00444 LD (DCBADD),IX ;Put DCB address in header
00445 ; relocate JP, CALL and LD addresses in filter
263F 112328 00446 LD DE,LAST ;End of code now..
2642 B7 00447 OR A ;Clear carry flag
2643 ED52 00448 SBC HL,DE ;Offset of move
2645 EB 00449 EX DE,HL ;Into DE
2646 2A3E27 00450 LD HL,(REL1) ;Fix absolute memory
2649 19 00451 ADD HL,DE ;References
264A 223E27 00452 LD (REL1),HL ;In filter
264D 2A4627 00453 LD HL,(REL2)
2650 19 00454 ADD HL,DE
2651 224627 00455 LD (REL2),HL
2654 2A7927 00456 LD HL,(REL3)
2657 19 00457 ADD HL,DE
2658 227927 00458 LD (REL3),HL
265B 2A7E27 00459 LD HL,(REL4)
265E 19 00460 ADD HL,DE
265F 227E27 00461 LD (REL4),HL
00462 ; move into high memory
2662 212328 00463 LD HL,LAST ;=>end of relocated code
2665 D1 00464 POP DE ;Old HIGH$=destination
2666 01F400 00465 LD BC,LAST-FENTRY+1 ;Length of relocated code
2669 EDB8 00466 LDDR ;Move it, leaving DE..
266B EB 00467 EX DE,HL ;=>new HIGH$
266C E5 00468 PUSH HL
266D 00469 @@HIGH$ ;Set new HIGH$
266D+3E64 00470 LD A,100
266F+EF 00471 RST 40
2670 E1 00472 POP HL
2671 23 00473 INC HL ;Point to filter entry point
00474 ; set up new in DCB
2672 DD360047 00475 LD (IX+0),01000111B ;Filter/get/put/ctl bits
2676 DD7501 00476 LD (IX+1),L ;Set new address in DCB
2679 DD7402 00477 LD (IX+2),H ;For the new Device/filter
00478 ;*=*=*
267C 210000 00479 LD HL,0 ;Indicate no error
267F C9 00480 RET
00481 ;*=*=*
00482 ; Error handling
00483 ;*=*=*
2680 211927 00484 NOROOM LD HL,NOROOM$
2683 1808 00485 JR ERROUT
2685 21E426 00486 NOTSET LD HL,NTSET$
2688 1803 00487 JR ERROUT
268A 210227 00488 ISRES LD HL,ISRES$
268D 00489 ERROUT @@LOGOT ;Display and log
00490 IFEQ 00H,1
00491 LD HL,
00492 ENDIF
268D+3E0C 00493 LD A,12
268F+EF 00494 RST 40
2690 21FFFF 00495 LD HL,0FFFFH ;Indicate error
2693 C9 00496 RET
00497 ;*=*=*
00498 ; Data area
00499 ;*=*=*
2694 49 00500 SIGNON DB 'International Daisy Wheel printer filter.',LF
6E 74 65 72 6E 61 74 69
6F 6E 61 6C 20 44 61 69
73 79 20 57 68 65 65 6C
20 70 72 69 6E 74 65 72
20 66 69 6C 74 65 72 2E
0A
26BE 43 00501 DB 'Copyright 1983 Logical Systems, Inc.'
6F 70 79 72 69 67 68 74
20 31 39 38 33 20 4C 6F
67 69 63 61 6C 20 53 79
73 74 65 6D 73 2C 20 49
6E 63 2E
26E2 0A 00502 DB LF,CR
0D
26E4 4D 00503 NTSET$ DB 'Must install with SET command',CR
75 73 74 20 69 6E 73 74
61 6C 6C 20 77 69 74 68
20 53 45 54 20 63 6F 6D
6D 61 6E 64 0D
2702 46 00504 ISRES$ DB 'Filter already loaded.',CR
69 6C 74 65 72 20 61 6C
72 65 61 64 79 20 6C 6F
61 64 65 64 2E 0D
2719 4E 00505 NOROOM$ DB 'No memory available',CR
6F 20 6D 65 6D 6F 72 79
20 61 76 61 69 6C 61 62
6C 65 0D
00506 ;
00507 ;
272D 44 00508 FLTNAM DB 'DW',3 ;Name terminated for @GTMOD
57 03
00509 ;*=*=*
00510 ; Actual filter moved to high memory
00511 ; LDOS style header...
00512 ;*=*=*
2730 180A 00513 FENTRY JR START ;Branch around linkage
2732 0000 00514 DW $-$ ;Last byte used
2732 00515 OLDMEM EQU $-2 ;<=previous HIGH$ value
00516 ;
2734 02 00517 DB 2,'DW'
44 57
2737 0000 00518 DCBADD DW $-$ ;DCB using filter
2739 0000 00519 SPARE DW 0
273B 00 00520 TOGGLE DB 0 ;On/off switch
00521 ;
00522 ;*=*=*
00523 ; Driver code
00524 ;*=*=*
273C DD2A3727 00525 START LD IX,(DCBADD)
273E 00526 REL1 EQU $-2
2740 3E14 00527 LD A,14H ;@chnio
2742 C24000 00528 JP NZ,40H ;Go if input/ctl
00529 ;
00530 ;Check input character against tables
2745 218927 00531 CKCHR LD HL,TABLE1-1
2746 00532 REL2 EQU $-2
2748 23 00533 CKCHR1 INC HL ;Bump to match char
2749 7E 00534 LD A,(HL) ;Check it
274A B9 00535 CP C
274B 23 00536 INC HL ;Bump to xlate char
274C 2833 00537 JR Z,ISCHR1 ;Go if found
274E B7 00538 OR A ;Else test for end
274F 20F7 00539 JR NZ,CKCHR1 ;Continue if not end
00540 ;HL => 2nd table
00541 ;Second table is char + two xlates
2751 7E 00542 CKCHR2 LD A,(HL)
2752 B9 00543 CP C
2753 23 00544 INC HL ;Bump to 1st sub
2754 2821 00545 JR Z,ISCHR2
2756 23 00546 INC HL ;2nd sub posn
2757 23 00547 INC HL ;Next match chr
2758 B7 00548 OR A ;Done?
2759 20F6 00549 JR NZ,CKCHR2 ;Continue if not
275B 79 00550 LD A,C ;No match, same chr
00551 ;
275C C5 00552 SCHR PUSH BC
275D 4F 00553 LD C,A ;Character
275E 0602 00554 LD B,2 ;Output
2760 E5 00555 PUSH HL
2761 DDE5 00556 PUSH IX
2763 210000 00557 LD HL,$-$
2764 00558 IFLG EQU $-2
2766 7E 00559 LD A,(HL) ;Get IFLAG$
2767 F5 00560 PUSH AF ;Save it
2768 CBB6 00561 RES 6,(HL) ;Turn off dvr xlates
276A 00562 @@CHNIO ;Send char
276A+3E14 00563 LD A,20
276C+EF 00564 RST 40
276D F1 00565 POP AF ;Prev IFLAG$
276E 320000 00566 LD ($-$),A ; restore pr dvr state
276F 00567 IFLG2 EQU $-2
2771 DDE1 00568 POP IX
2773 E1 00569 POP HL
2774 C1 00570 POP BC
2775 79 00571 LD A,C ;Restore original char
2776 C9 00572 RET
00573 ;
2777 7E 00574 ISCHR2 LD A,(HL) ;Get 1st sub
2778 CD5C27 00575 CALL SCHR ;Print it
2779 00576 REL3 EQU $-2
277B 3E08 00577 LD A,BKSP ;Then back up
277D CD5C27 00578 CALL SCHR ;Printer
277E 00579 REL4 EQU $-2
2780 23 00580 INC HL ;Get next sub char
2781 7E 00581 ISCHR1 LD A,(HL)
2782 18D8 00582 JR SCHR ;Send and return
00583 ;
00584 ; patch space for table 1:
2784 00 00585 DB 0,0,0,0,0,0
00 00 00 00 00
00586 ; table 1 = match char / sub char
278A C0 00587 TABLE1 DB 0C0H,0A7H
A7
278C C1 00588 DB 0C1H,080H
80
278E C2 00589 DB 0C2H,09CH
9C
2790 C3 00590 DB 0C3H,0A3H
A3
2792 C4 00591 DB 0C4H,060H
60
2794 C5 00592 DB 0C5H,0A5H
A5
2796 C6 00593 DB 0C6H,0A6H
A6
2798 C7 00594 DB 0C7H,0BEH
BE
279A C8 00595 DB 0C8H,0A8H
A8
279C C9 00596 DB 0C9H,0C0H
C0
279E CA 00597 DB 0CAH,0AAH
AA
27A0 CB 00598 DB 0CBH,0ABH
AB
27A2 CC 00599 DB 0CCH,0ACH
AC
27A4 CD 00600 DB 0CDH,0ADH
AD
27A6 CE 00601 DB 0CEH,0AEH
AE
27A8 CF 00602 DB 0CFH,0AFH
AF
27AA D0 00603 DB 0D0H,0CCH
CC
27AC D1 00604 DB 0D1H,0DBH
DB
27AE D2 00605 DB 0D2H,0DCH
DC
27B0 D3 00606 DB 0D3H,0DDH
DD
27B2 D4 00607 DB 0D4H,0DEH
DE
27B4 D5 00608 DB 0D5H,07EH
7E
27B6 D6 00609 DB 0D6H,0FBH
FB
27B8 D7 00610 DB 0D7H,0FCH
FC
27BA D8 00611 DB 0D8H,0FDH
FD
27BC D9 00612 DB 0D9H,0FEH
FE
27BE DA 00613 DB 0DAH,0A9H
A9
27C0 DB 00614 DB 0DBH,0BBH
BB
27C2 DC 00615 DB 0DCH,0BCH
BC
27C4 DD 00616 DB 0DDH,0BDH
BD
27C6 DE 00617 DB 0DEH,0BEH
BE
27C8 DF 00618 DB 0DFH,0BFH
BF
00619 ;
27CA E5 00620 DB 0E5H,05EH
5E
00621 ;
27CC F0 00622 DB 0F0H,041H
41
27CE F1 00623 DB 0F1H,061H
61
27D0 F2 00624 DB 0F2H,041H
41
27D2 F3 00625 DB 0F3H,061H
61
00626 ;
27D4 F7 00627 DB 0F7H,045H
45
27D6 F8 00628 DB 0F8H,041H
41
27D8 F9 00629 DB 0F9H,049H
49
27DA FA 00630 DB 0FAH,04FH
4F
27DC FB 00631 DB 0FBH,055H
55
27DE FC 00632 DB 0FCH,020H
20
27E0 FD 00633 DB 0FDH,055H
55
27E2 FE 00634 DB 0FEH,045H
45
27E4 FF 00635 DB 0FFH,041H
41
27E6 00 00636 DB 0
00637 ;Table2: match char / sub char1 / sub char2
00638 ;
27E7 E0 00639 DB 0E0H,061H,05EH
61 5E
27EA E1 00640 DB 0E1H,065H,05EH
65 5E
27ED E2 00641 DB 0E2H,069H,05EH
69 5E
27F0 E3 00642 DB 0E3H,06FH,05EH
6F 5E
27F3 E4 00643 DB 0E4H,075H,05EH
75 5E
00644 ;
27F6 E6 00645 DB 0E6H,065H,0BEH
65 BE
27F9 E7 00646 DB 0E7H,069H,0BEH
69 BE
27FC E8 00647 DB 0E8H,061H,0A7H
61 A7
27FF E9 00648 DB 0E9H,069H,0A7H
69 A7
2802 EA 00649 DB 0EAH,06FH,0A7H
6F A7
2805 EB 00650 DB 0EBH,075H,0A7H
75 A7
00651 ;
2808 ED 00652 DB 0EDH,06EH,07EH
6E 7E
280B EE 00653 DB 0EEH,061H,07EH
61 7E
280E EF 00654 DB 0EFH,075H,07EH
75 7E
00655 ;
2811 F4 00656 DB 0F4H,04FH,02FH
4F 2F
2814 F5 00657 DB 0F5H,06FH,02FH
6F 2F
2817 F6 00658 DB 0F6H,06EH,07EH
6E 7E
281A 00 00659 DB 0,0,0,0,0,0,0,0,0
00 00 00 00 00 00 00 00
2823 00 00660 DB 0
00661 ;
2823 00662 LAST EQU $-1 ;Used for length calculation
00663 ;
2600 00664 END BEGIN
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 at nemesis.lonestar.org]