home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol115 / fprint.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  6.2 KB  |  428 lines

  1.     NAME FPRINT
  2. ;FORMATTED PRINT ROUTINE
  3. ;RUSS BAKKE
  4. ;03-06-83
  5. ;
  6.     ORG 100H    ;NORMAL START
  7. START    LD SP,0D100H
  8.     LD DE,MSG1    ;BANNER
  9.     CALL MSG
  10.     LD HL,DISST
  11.     LD (FILEN),HL    ;INIT
  12.     LD IX,FLAGS
  13.     LD (IX),0
  14.     LD (IX+1),0
  15.     LD HL,DBUFF    ;SEE IF OPTIONS PASSED
  16.     LD A,(HL)        ;# OF CHARS
  17.     CP 0
  18.     JR Z,CONT3    ;NO OPTIONS PASSED
  19. CONT1    INC HL        ;SEARCH FOR / & #
  20.     LD A,(HL)
  21.     CP '/'
  22.     JR Z,CONT2    ;FOUND IT
  23.     CP '#'
  24.     JR Z,CONT2A    ;FOUND IT
  25.     CP 0        ;NULL?
  26.     JR NZ,CONT1    ;NO, CONTINUE
  27.     JR CONT3
  28. ;
  29. CONT2    INC HL        ;ADJUST FOR /
  30.     CALL SETFLG
  31.     LD A,(HL)    ;AT NULL?
  32.     CP 0
  33.     JR Z,CONT3    ;YES, QUIT
  34.     BIT 7,(IX+1)    ;COUNT SET?
  35.     JR Z,CONT1    ;NO, CONTINUE
  36.     JR CONT3    ;YES
  37. ;
  38. ;CONT2A-# FOUND
  39. CONT2A    INC HL
  40.     CALL GETCNT
  41.     LD A,(HL)    ;AT NULL?
  42.     CP 0
  43.     JR Z,CONT3    ;YES, QUIT
  44.     BIT 7,(IX)    ;OPTIONS SET?
  45.     JR Z,CONT1    ;NO, CONTINUE
  46. ;
  47. ;SEE IF AN FCB WAS PASSED
  48. CONT3    LD HL,DBUFF
  49.     LD A,(HL)    ;LENGTH OF COMD LINE
  50.     OR A        ;SET FLAGS
  51.     CALL Z,GETFN
  52.     CALL GETFL    ;LOAD FILE
  53.     BIT 7,(IX)
  54.     JR NZ,CONT4    ;OPTIONS ALREADY SET
  55. CONT3A    LD DE,MSG3    ;OPTIONS?
  56.     CALL MSG
  57.     LD DE,DBUFF
  58.     LD A,7FH    ;BUFFER LENGTH
  59.     LD (DE),A
  60.     LD C,10        ;GET LINE
  61.     CALL DOS
  62.     CALL LF
  63.     LD HL,DBUFF+2
  64.     CALL SETFLG
  65.     BIT 7,(IX)    ;SUCCESSFUL?
  66.     JR Z,CONT3A    ;NO, TRY AGAIN
  67. CONT4    BIT 7,(IX+1)
  68.     JR NZ,CONT5    ;SET
  69. CONT4A    LD DE,MSG3A
  70.     CALL MSG
  71.     LD DE,DBUFF
  72.     LD A,7FH    ;BUFFER LENGTH
  73.     LD (DE),A
  74.     LD C,10        ;GET LINE
  75.     CALL DOS
  76.     CALL LF    ;ECHO LF
  77.     LD HL,DBUFF+2
  78.     CALL GETCNT
  79.     BIT 7,(IX+1)    ;SUCCESSFUL?
  80.     JR Z,CONT4A    ;NO, TRY AGAIN
  81. ;
  82. CONT5    LD A,(COUNT)
  83.     LD C,A
  84. CONT5A    PUSH BC        ;SAVE COUNT
  85.     BIT 1,(IX)
  86.     JR Z,MORE2
  87.     LD E,9 ;HT
  88.     CALL PRNTR
  89. MORE2    LD HL,DISST
  90.     CALL PRINT
  91.     CALL FORM
  92.     POP BC
  93.     DEC C
  94.     JP Z,0    ;RET TO OS
  95.     BIT 3,(IX)    ;BOTTOM OF PAGE PROMPT?
  96.     JR Z,MORE3    ;NO
  97.     PUSH BC
  98.     LD DE,MSG8
  99.     JR MORE4
  100. ;
  101. MORE3    BIT 4,(IX)    ;END OF TEXT PROMPT?
  102.     JR Z,CONT5A    ;NO
  103.     PUSH BC
  104.     LD DE,MSG9
  105. MORE4    CALL MSG
  106.     LD C,1    ;GET CHAR
  107.     CALL DOS
  108.     CALL CRLF
  109.     POP BC
  110.     JR CONT5A
  111. ;
  112. GETFN    LD DE,MSG2    ;"FILE NAME"
  113.     CALL MSG
  114.     LD DE,DBUFF
  115.     LD A,7FH    ;BUFFER LENGTH
  116.     LD (DE),A
  117.     LD C,10        ;GET LINE
  118.     CALL DOS
  119.     CALL LF
  120.     LD HL,DBUFF+2
  121.     LD DE,FCB
  122.     LD C,86H    ;FORMAT FCB REQ
  123.     CALL DOS
  124.     RET
  125. ;
  126. GETFL    LD C,15        ;OPEN
  127.     LD DE,FCB
  128.     CALL DOS
  129.     CP -1        ;RETS -1 IF NOT FOUND
  130.     JR Z,NOTFND
  131. ;NOW READ FILE
  132. READ1    LD DE,FCB
  133.     LD C,20        ;READ BLOCK
  134.     CALL DOS
  135.     PUSH AF
  136.     LD DE,(FILEN)
  137.     LD HL,DBUFF
  138.     LD BC,80H    ;#BYTES READ
  139.     LDIR        ;COPY
  140.     LD BC,80H
  141.     LD HL,(FILEN)
  142.     ADD HL,BC    ;ADJUST FILEN
  143.     LD (FILEN),HL
  144.     POP AF        ;RECOVER ERROR CODE
  145.     OR A        ;SET FLAGS
  146.     JR Z,READ1    ;OK, READ NEXT
  147.     CP 1        ;EOF?
  148.     JR NZ,DSKERR    ;NO, ERROR
  149.     LD C,16        ;CLOSE
  150.     LD DE,FCB
  151.     CALL DOS
  152.     CP -1
  153.     JR Z,DSKERR
  154. ;NOW FIND END OF DATA
  155.     LD HL,DISST
  156.     LD B,1AH    ;EOF
  157.     LD DE,(FILEN)
  158. MARK1    LD A,(HL)
  159.     CP B
  160.     JR Z,MARK2
  161.     CALL H1ED
  162.     JR NZ,MARK1
  163. ;HIT FILEN BEFORE EOF
  164.     LD A,0DH    ;NOW FIND LAST CHAR
  165. MARK1A    CP (HL)
  166.     JR NZ,MARK1B
  167.     DEC HL
  168.     JR MARK1A
  169. MARK1B    INC HL
  170.     LD (HL),1AH    ;MARK EOF
  171. ;HAVE EOF
  172. MARK2    INC HL
  173.     LD (FILEN),HL    ;SAVE IT
  174.     RET
  175. ;
  176. DSKERR    LD DE,MSG6
  177. DSKER1    CALL MSG
  178.     RST 0        ;RET TO OS
  179. ;
  180. NOTFND    LD DE,MSG5
  181.     JR DSKER1
  182. ;
  183. ;GETCNT-GET # OF COPIES (DEFAULT 1)
  184. ;FIRST, GET # OF CHARS
  185. ;(MAY END WITH SPACE OR B=0)
  186. GETCNT    LD C,0
  187. GETC1    LD A,(HL)
  188.     CP ' '
  189.     JR Z,GETC2    ;DONE
  190.     CP 0
  191.     JR Z,GETC2    ;DONE
  192.     INC C
  193.     INC HL
  194.     JR GETC1
  195. ;NOW DECODE CHARS
  196. GETC2    LD A,C
  197.     CP 0        ;0 CHARS?
  198.     JR Z,DEFLT    ;YES, DEFAULT
  199.     PUSH HL        ;HL NOW POINTS TO SPACE
  200.     CALL DIGIT
  201.     LD E,A
  202.     DEC C
  203.     JR Z,DONE
  204.     CALL DIGIT
  205.     CP 0
  206.     JR Z,MORE
  207.     LD B,A
  208.     LD A,E
  209. SUM    ADD A,10
  210.     DJNZ SUM
  211.     LD E,A
  212. MORE    DEC C
  213.     JR Z,DONE
  214.     CALL DIGIT
  215.     CP 0
  216.     JR Z,DONE
  217.     CP 2
  218.     JP C,NOVAL
  219.     LD B,A
  220.     LD A,E
  221. SUM1    ADD A,100
  222.     DJNZ SUM1
  223.     LD E,A
  224. DONE    POP HL
  225. DONE1    LD A,E
  226.     LD (COUNT),A
  227.     SET 7,(IX+1)    ;SET DONE FLAG
  228.     RET
  229. ;
  230. DEFLT    LD E,1
  231.     JR DONE1
  232. ;
  233. ;NOVAL--A NON-VALID DECIMAL CHAR WAS ENTERRED
  234. NOVAL    LD DE,MSG4
  235.     CALL MSG
  236.     POP HL
  237.     RET
  238. ;
  239. DIGIT    DEC HL
  240.     LD A,(HL)
  241.     SUB 30H        ;CONVERT TO BIN
  242.     JR C,NOVAL
  243.     CP 9
  244.     JR NC,NOVAL
  245.     RET
  246. ;
  247. ;SETFLG--DECODES OPTION STRING AT HL, SETS FLAGS
  248. SETFLG    LD (IX),80H
  249.     LD (IX+3),5    ;DEFAULT TO LST:
  250.     LD A,(HL)
  251.     CP ' '        ;NO CHARS?
  252.     RET Z
  253.     CP 0
  254.     RET Z
  255. ;
  256. SETFL1    LD A,(HL)
  257.     CP ' '
  258.     RET Z
  259.     CP 0
  260.     RET Z
  261.     CP 'B'
  262.     JR Z,SETB
  263.     CP 'D'
  264.     JR Z,SETD
  265.     CP 'E'
  266.     JR Z,SETE
  267.     CP 'M'
  268.     JR Z,SETM
  269.     CP 'P'
  270.     JR Z,SETP
  271.     CP 'U'
  272.     JR Z,SETU
  273.     LD (IX),0    ;CLEAR "SET" FLAG
  274.     LD DE,MSG7    ;ERROR
  275.     CALL MSG
  276. ;
  277. SETFL2    INC HL
  278.     JR SETFL1
  279. ;
  280. SETB    SET 3,(IX)
  281.     JR SETFL2
  282. ;
  283. SETD    SET 0,(IX)
  284.     JR SETFL2
  285. ;
  286. SETE    SET 4,(IX)
  287.     JR SETFL2
  288. ;
  289. SETM    SET 1,(IX)
  290.     JR SETFL2
  291. ;
  292. SETP    SET 5,(IX)
  293.     LD (IX+3),4    ;SELECT PUN:
  294.     JR SETFL2
  295. ;
  296. SETU    SET 2,(IX)
  297.     JR SETFL2
  298. ;
  299. ;PRINT SUB
  300. ;ENTER WITH START IN HL
  301. ;USES A,B,E
  302. PRINT    LD (IX+2),0    ;INIT LINE COUNT
  303. PRINT0    LD A,(HL)
  304.     CP 26        ;EOF?
  305.     RET Z        ;YES
  306.     LD E,A
  307.     BIT 2,(IX)
  308.     JR Z,PROK
  309.     LD A,E
  310.     CP 'a'
  311.     JR C,PROK
  312.     CP 'z'+1
  313.     JR NC,PROK
  314.     XOR 20H        ;CONVERT TO UPPER CASE
  315.     LD E,A
  316. PROK    PUSH HL
  317.     CALL PRNTR
  318.     LD A,E        ;RECOVER CHAR
  319.     CP 0CH    ;FF?
  320.     JR Z,PRIN0A
  321.     CP 0DH    ;C/R?
  322.     JR NZ,PRIN1
  323.     INC (IX+2)    ;LINE COUNTER
  324.     BIT 0,(IX)    ;DOUBLE SP?
  325.     JR Z,PRIN0Z    ;NO
  326.     CALL PRNTR
  327.     INC (IX+2)
  328. ;IF COUNT>=58, CHECK FOR PAGE PROMPT
  329. PRIN0Z    LD A,(IX+2)
  330.     CP 58-1
  331.     JR C,PRIN0B
  332. PRIN0A    BIT 3,(IX)
  333.     JR Z,PRIN0B
  334.  
  335.     LD DE,MSG8
  336.     CALL MSG
  337.     LD C,1    ;GET CHAR
  338.     CALL DOS
  339.     CALL CRLF
  340.     LD (IX+2),0    ;RESET COUNTER
  341. PRIN0B    BIT 1,(IX)    ;MARGIN?
  342.     JR Z,PRIN1
  343.     LD E,9 ;HT
  344.     CALL PRNTR
  345. PRIN1    POP HL
  346.     INC HL
  347.     JR PRINT
  348. ;
  349. MSG    LD C,9
  350.     JP DOS
  351. ;
  352. ;H1ED--INC HL, CMP TO DE, RETS C IF >
  353. H1ED    INC HL
  354.     LD A,D
  355.     SUB H
  356.     RET NZ
  357.     LD A,E
  358.     SUB L
  359.     RET
  360. ;
  361. CRLF    LD C,2
  362.     LD E,0DH    ;C/R
  363.     CALL DOS
  364. ;
  365. LF    LD C,2
  366.     LD E,0AH    ;LF
  367.     JP DOS
  368. ;
  369. FORM    LD E,0CH    ;FORM FEED
  370. PRNTR    LD C,(IX+3)    ;SEND CHAR IN E TO SELECTED DEVICE
  371.     JP DOS
  372. ;
  373. ;
  374. MSG1    DEFM 'FORMATTED PRINT ROUTINE V1.3'
  375.     DEFW 0A0DH
  376.     DEFM '$'    ;EOM
  377. ;
  378. MSG2    DEFM 'File name? $'
  379. ;
  380. MSG3    DEFM 'Options? [B(ottom of page prompt,'
  381.     DEFW 0A0DH
  382.     DEFM 'D(ouble spaced, E(nd of text prompt,'
  383.     DEFW 0A0DH
  384.     DEFM 'left M(argin, P(unch device,'
  385.     DEFW 0A0DH
  386.     DEFM 'U(pper case only]? $'
  387. ;
  388. MSG3A    DEFW 0A0DH
  389.     DEFM 'HOW MANY COPIES? (MAX 255) $'
  390. ;
  391. MSG4    DEFM 'INVALID DECIMAL NUMBER'
  392.     DEFW 0A0DH
  393.     DEFM '$'
  394. ;
  395. MSG5    DEFM 'FILE NOT FOUND'
  396.     DEFW 0A0DH
  397.     DEFM '$'
  398. ;
  399. MSG6    DEFM 'DISK ERROR'
  400.     DEFW 0A0DH
  401.     DEFM '$'
  402. ;
  403. MSG7    DEFM 'INVALID OPTION'
  404.     DEFW 0A0DH
  405.     DEFM '$'
  406. ;
  407. MSG8    DEFM 'INSERT NEXT SHEET AND PRESS ANY KEY $'
  408. ;
  409. MSG9    DEFM 'VERIFY PAPER ALIGNMENT AND PRESS ANY KEY $'
  410. ;
  411. ;
  412. FLAGS    DEFS 4
  413. ;FIRST BYTE:
  414. ;BIT 0=DOUBLE SP, 1=MARGIN, 2=UPPER CASE ONLY
  415. ;BIT 3=BOTTOM OF PAGE PROMPT, 4=END OF TEXT PROMPT,
  416. ;BIT 5=PUNCH DEVICE, 7=SET
  417. ;SECOND BYTE: BIT 7=COUNT SET
  418. ;THIRD BYTE: LINE COUNT
  419. ;FOURTH BYTE:  DEVICE SELECTION (4=PUN:, 5=LST:)
  420. ;
  421. COUNT    DEFS 1
  422. FILEN    DEFS 2
  423. DISST    DEFS 1        ;DUMMY
  424. DBUFF    EQU 80H
  425. FCB    EQU 5CH        ;FILE CONTROL BLOCK
  426. DOS    EQU 5        ;DOS CALL
  427.     END
  428.