home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / PROGRAMS / LIST / GALLERY.LBR / GALLERY.AQM / GALLERY.ASM
Assembly Source File  |  2000-06-30  |  8KB  |  587 lines

  1. ;
  2. ;
  3. ; GALLERY
  4. ;
  5. ; CALCULATES PRINTERS GALLERY
  6. ; FOR MAKING BOOKS AND NEWSLETTERS
  7. ;
  8. ; BY:    ALAN W WARREN
  9. ;    866 WILLIAMSBURY - APT 168
  10. ;    PONTIAC, MICH   48054
  11. ;
  12. ;-------------------------------;
  13.  
  14. BDOS:    EQU    0005H
  15.  
  16. CR:    EQU    0DH
  17. LF:    EQU    0AH
  18. BS:    EQU    08H
  19. ES:    EQU    24H
  20.  
  21.     ORG    100H
  22.  
  23.     LXI    H,0
  24.     DAD    SP
  25.     SHLD    OLDSP
  26.     LXI    SP,STACK
  27. ;
  28. ; CHEAP CLEAR SCREEN TRICK
  29. ;-------------------------------;
  30.  
  31.     MVI    A,50
  32.  
  33. CLR$SCREEN:
  34.     PUSH    PSW
  35.     MVI    E,CR
  36.     MVI    C,6
  37.     CALL    BDOS
  38.  
  39.     MVI    E,LF
  40.     MVI    C,6
  41.     CALL    BDOS
  42.  
  43.     POP    PSW
  44.     DCR    A
  45.     JNZ    CLR$SCREEN
  46. ;
  47.     CALL    PRINT$THIS
  48.     DB    'How many forword pages? ',ES
  49.  
  50.     CALL    GET$NMBR
  51.     PUSH    H
  52. ;
  53. ; WE WANT TO SUBTRACT NUMBER OF
  54. ; FORWORD PAGES FROM TOTAL PAGES
  55. ; LATER, SO WE DO 2'S COMPLIMENT
  56. ;-------------------------------;
  57.  
  58.     MOV    A,H
  59.     CMA
  60.     MOV    H,A
  61.  
  62.     MOV    A,L
  63.     CMA
  64.     MOV    L,A
  65.  
  66.     SHLD    INTRO        ;MINOR PROBLEM - INCREMENT NOT NEEDED
  67. ;
  68.     CALL    PRINT$THIS
  69.     DB    'How many pages of text? ',ES
  70.  
  71.     CALL    GET$NMBR
  72.     POP    D
  73.     DAD    D
  74. ;
  75. ; HL IS MINIMUM NUMBER OF PAGES
  76. ; NEEDED IN BOOK, GALLERY REQUIRES
  77. ; A MULTIPLE OF 4, AND WE NEED TO
  78. ; ROUND UP TO AVOID LOOSING PAGES
  79. ;-------------------------------;
  80.  
  81.     INX H!    INX H!    INX H    ;ADD THREE PAGES
  82.     CALL    SLASH        ;DIVIDE BY 2...
  83.     CALL    SLASH        ;... NOW BY 4
  84.     SHLD    SHEETS        ;HL IS NUMBER OF SHEETS
  85.     DAD H!    DAD H        ;SHEETS TIMES 4 IS NUMBER OF PAGES
  86. ;
  87. ;
  88. ; NOW TO PRINT WHAT GOES ON SHEETS
  89. ; BASIC FORMAT IS: (LP = LAST PAGE)
  90. ;
  91. ;    FRONT SIDE    BACK SIDE
  92. ;    LP  , PG1   ::    PG 2 , LP-1
  93. ;    LP-2, PG 3  ::    PG 4 , LP-3
  94. ;    LP-4, PG 5  ::    PG 6 , LP-5
  95. ;    ETC.
  96. ;-------------------------------;
  97.  
  98.     INX    H
  99.     SHLD    LAST        ;DECREMENTING BEFORE PRINTING
  100.  
  101. SHEET$LOOP:
  102.     CALL    PRINT$LAST
  103.     CALL    PRINT$THIS
  104.     DB    ', ',ES
  105.  
  106.     CALL    PRINT$FIRST
  107.     CALL    PRINT$THIS
  108.     DB    ' ::  ',ES
  109.  
  110.     CALL    PRINT$FIRST
  111.     CALL    PRINT$THIS
  112.     DB    ', ',ES
  113.  
  114.     CALL    PRINT$LAST
  115.     CALL    PRINT$THIS
  116.     DB    CR,LF,ES
  117.  
  118.     LHLD    SHEETS
  119.     DCX    H
  120.     SHLD    SHEETS
  121.  
  122.     MOV    A,H
  123.     ORA    L
  124.     JNZ    SHEET$LOOP
  125. ;
  126. FINISH:
  127.     CALL    PRINT$THIS
  128.     DB    CR,LF,CR,LF,ES
  129.  
  130.     LHLD    OLDSP
  131.     SPHL
  132.     RET
  133. ;
  134. ;
  135. ;    SUBROUTINES
  136. ;
  137. ;
  138.  
  139. ;
  140. ; INPUT A NUMBER FROM KEYBOARD
  141. ; RETURN WITH NUMBER ROUNDED TO
  142. ; MULTIPLE OF 2 IN HL
  143. ;-------------------------------;
  144.  
  145. GET$NMBR:
  146.     LXI    H,NUMBER
  147.     LXI    B,10        ;B=0, C=10
  148. ;
  149. ; INPUT REQUEST
  150. ;-------------------------------;
  151.  
  152. GET$DGT:
  153.     PUSH B!    PUSH H
  154.     MVI    C,1
  155.     CALL    BDOS
  156.     POP H!    POP B
  157. ;
  158. ; CHECK FOR EDIT
  159. ;-------------------------------;
  160.  
  161.     CPI    13
  162.     JZ    GOT$DGTS
  163.  
  164.     CPI    BS
  165.     JNZ    GT$DGT$NM
  166. ;
  167. ; BACKSPACE KEYED IN
  168. ; NOT ALLOWED IF AT START OF
  169. ; BUFFER (B=0)
  170. ;-------------------------------;
  171.  
  172.     MOV    A,B
  173.     ORA    A
  174.     JZ    NO$BS
  175.  
  176.     INR    C
  177.     DCR    B
  178.     DCX    H
  179.     JMP    GET$DGT
  180. ;
  181. ; BACKSPACE NOT ALLOWED, PUT
  182. ; CURSOR BACK WHERE IT BELONGS
  183. ;-------------------------------;
  184.  
  185. NO$BS:
  186.     MVI    A,' '
  187.     CALL    PCHAR
  188.     JMP    GET$DGT
  189. ;
  190. ; OPERATOR KEYED IN NON-NUMBER
  191. ; BACKUP & HIDE WHAT HE DID
  192. ; (AND DO NOT PUT IT IN BUFFER)
  193. ;-------------------------------;
  194.  
  195. DGT$ERR:
  196.     CALL    PRINT$THIS
  197.     DB    BS,' ',BS,ES
  198.  
  199.     JMP    GET$DGT
  200. ;
  201. ; MAKE SURE DIGIT KEYED IN
  202. ; IS A NUMBER
  203. ;-------------------------------;
  204.  
  205. GT$DGT$NM:
  206.     CPI    '0'
  207.     JC    DGT$ERR
  208.  
  209.     CPI    '9'+1
  210.     JNC    DGT$ERR
  211. ;
  212. ; DIGIT IS OK - PUT IN BUFFER
  213. ; AND GET NEXT
  214. ;-------------------------------;
  215.  
  216.     MOV    M,A
  217.     INX    H
  218.     INR    B
  219.     DCR    C
  220.     JNZ    GET$DGT        ;DO NOT OVER-RUN BUFFER
  221. ;
  222. ;
  223. ; DONE WITH INPUT
  224. ; NUMBER IS IN ASCII @NUMBER
  225. ; NOW WE READ IT BACK
  226. ; & CRUNCH TO BINARY
  227. ;-------------------------------;
  228.  
  229. GOT$DGTS:
  230.     CALL    PRINT$THIS
  231.     DB    CR,LF,CR,LF,ES
  232.  
  233.     LXI    H,NUMBER    ;POINT TO ASCII BUFFER
  234.     LXI    D,0        ;START WITH ZERO
  235.  
  236. GET$BINARY:
  237.     MOV    A,M
  238.     ANI    00001111B
  239.     PUSH    H
  240.  
  241.     MOV    H,D
  242.     MOV    L,E
  243.     DAD H!    DAD H
  244.     DAD D!    DAD H        ;OLD NUMBER TIMES 10
  245.  
  246.     MOV    E,A
  247.     MVI    D,0
  248.     DAD    D        ;PLUS NEW DIGIT
  249.     XCHG
  250.  
  251.     POP    H
  252.     INX    H
  253.     DCR    B        ;B CONTAINED NUMBER OF DIGITS
  254.     JNZ    GET$BINARY
  255. ;
  256. ;
  257. ; NOW FOR THE ROUND OFF
  258. ;-------------------------------;
  259.  
  260.     XCHG            ;NUMBER TO HL
  261.     INX    H        ;TO ROUND ODD NUMBERS UP
  262.     CALL    SLASH        ;DIVIDE BY 2 & TAKE INTEGER
  263.     DAD    H        ;MULTIPLY BY 2
  264.  
  265.     RET
  266. ;
  267. ;
  268. ; PRINT FIRST PAGE NUMBER
  269. ; ACTUALLY ANY PAGE NUMBER IN
  270. ; FIRST HALF OF BOOK
  271. ;-------------------------------;
  272.  
  273. PRINT$FIRST:
  274.     LHLD    FIRST
  275.     INX    H
  276.     SHLD    FIRST
  277.     JMP    PRINT$NUMBER
  278. ;
  279. ; PRINT LAST PAGE NUMBERS
  280. ; ACTUALLY ANY PAGE IN LAST HALF
  281. ;-------------------------------;
  282.  
  283. PRINT$LAST:
  284.     LHLD    LAST
  285.     DCX    H
  286.     SHLD    LAST
  287. ;
  288. ;
  289. ; PRINT NUMBER IN HL
  290. ; IF NUMBER IS LESS THAN THE NUMBER
  291. ; OF PAGES IN FORWARD, THEN PRINT
  292. ; IN LOWER CASE ROMAN NUMERALS
  293. ;
  294. ; IF NUMBER IS LARGER THAN NUMBER OF
  295. ; PAGES IN FORWARD, THEN PRINT
  296. ; DIFFERENCE IN ARABIC NUMBERALS (1,2,3,..)
  297. ;-------------------------------;
  298.  
  299. PRINT$NUMBER:
  300.     XCHG
  301.     LHLD    INTRO
  302.     DAD    D
  303.     JNC    ROMAN
  304.  
  305.     INX    H
  306.  
  307. DEC$PRT:
  308.     XRA    A        ;FOR LEAD ZERO...
  309.     STA    BLANK        ;...SUPPRESSION
  310.     MVI    B,10        ;NUMBER OF SPACES
  311.  
  312.     LXI    D,-10000
  313.     CALL    DIV$PRINT
  314.  
  315.     LXI    D,-1000
  316.     CALL    DIV$PRINT
  317.  
  318.     LXI    D,-100
  319.     CALL    DIV$PRINT
  320.  
  321.     LXI    D,-10
  322.     CALL    DIV$PRINT
  323.  
  324.     MOV    A,L
  325.     CALL    PRT$NUM
  326.  
  327.     JMP    PRT$SPACES
  328. ;
  329. ;
  330. ; DIVIDE NUMBER IN HL BY NUMBER
  331. ; IN DE & PRINT RESULTS
  332. ;-------------------------------;
  333.  
  334. DIV$PRINT:
  335.     MVI    C,255
  336.  
  337. DP$LOOP:
  338.     SHLD    NUMBER
  339.     INR    C
  340.     DAD    D
  341.     JC    DP$LOOP
  342.  
  343.     LHLD    NUMBER
  344.     MOV    A,C
  345.     ORA    A
  346.     JNZ    PRT$NUM
  347.  
  348.     LDA    BLANK
  349.     ORA    A
  350.     MOV    A,C
  351.     RZ
  352. ;
  353. ;
  354. ; CONVERT BINARY NUMBER IN A
  355. ; TO ASCII & PRINT RESULTS
  356. ;-------------------------------;
  357.  
  358. PRT$NUM:
  359.     ADI    '0'
  360.     STA    BLANK        ;KILL LEAD ZERO SUPPRESSION
  361. ;
  362. ; COUNT CHARACTERS IN B
  363. ; AS THEY ARE PRINTED
  364. ;-------------------------------;
  365.  
  366. CCHAR:
  367.     DCR    B
  368. ;
  369. ;
  370. ; PRINT BYTE IN A ON CONSOLE
  371. ;-------------------------------;
  372.  
  373. PCHAR:
  374.     PUSH B!    PUSH D!    PUSH H
  375.     MOV    E,A
  376.     MVI    C,2
  377.     CALL    BDOS
  378. ;
  379. ; CHECK FOR KILL REQUEST
  380. ; FROM CONSOLE (CTL-C)
  381. ;-------------------------------;
  382.  
  383.     MVI    E,255
  384.     MVI    C,6
  385.     CALL    BDOS
  386.  
  387.     CPI    3
  388.     JZ    0
  389.  
  390.     POP H!    POP D!    POP B
  391.     RET
  392. ;
  393. ;
  394. ; PRINT IN ROMAN NUMBERALS
  395. ; (READ THRU THIS & YOU'LL FIGURE
  396. ;  OUT WHY WE DON'T USE ROMAN
  397. ;  NUMERALS VERY MUCH)
  398. ;-------------------------------;
  399.  
  400. ROMAN:
  401.     MOV    A,D        ;UPPER BYTE TO A
  402.     ORA    A        ;WE CAN ONLY WORK
  403.     JNZ    DEC$PRT        ;WITH SMALL NUMBERS
  404.  
  405.     MVI    B,10        ;MAX NUMBER OF DIGITS
  406. ;
  407. CK100:
  408.     MOV    A,E
  409.     CPI    100
  410.     JC    CK99
  411.  
  412.     SBI    100
  413.     MOV    E,A
  414.     MVI    A,'c'
  415.     CALL    CCHAR
  416.     JMP    CK100
  417. ;
  418. CK99:
  419.     MOV    A,E
  420.     CPI    99
  421.     JNZ    CK90
  422.  
  423.     MVI    E,0
  424.     DCR B!    DCR B
  425.  
  426.     CALL    PRINT$THIS
  427.     DB    'ic',ES
  428. ;
  429. CK90:
  430.     MOV    A,E
  431.     CPI    90
  432.     JC    CK50
  433.  
  434.     SBI    90
  435.     MOV    E,A
  436.     DCR B!    DCR B
  437.  
  438.     CALL    PRINT$THIS
  439.     DB    'xc',ES
  440. ;
  441. CK50:
  442.     MOV    A,E
  443.     CPI    50
  444.     JC    CK49
  445.  
  446.     SBI    50
  447.     MOV    E,A
  448.     MVI    A,'l'
  449.     CALL    CCHAR
  450. ;
  451. CK49:
  452.     MOV    A,E
  453.     CPI    49
  454.     JNZ    CK40
  455.  
  456.     MVI    E,0
  457.     DCR B!    DCR B
  458.  
  459.     CALL    PRINT$THIS
  460.     DB    'il',ES
  461. ;
  462. CK40:
  463.     MOV    A,E
  464.     CPI    40
  465.     JC    CK10
  466.  
  467.     SBI    40
  468.     MOV    E,A
  469.     DCR B!    DCR B
  470.  
  471.     CALL    PRINT$THIS
  472.     DB    'xl',ES
  473. ;
  474. CK10:
  475.     MOV    A,E
  476.     CPI    10
  477.     JC    CK9
  478.  
  479.     SBI    10
  480.     MOV    E,A
  481.     MVI    A,'x'
  482.     CALL    CCHAR
  483.     JMP    CK10
  484. ;
  485. CK9:
  486.     MOV    A,E
  487.     CPI    9
  488.     JNZ    CK5
  489.  
  490.     MVI    E,0
  491.     DCR B!    DCR B
  492.  
  493.     CALL    PRINT$THIS
  494.     DB    'ix',ES
  495. ;
  496. CK5:
  497.     MOV    A,E
  498.     CPI    5
  499.     JC    CK4
  500.  
  501.     SBI    5
  502.     MOV    E,A
  503.     MVI    A,'v'
  504.     CALL    CCHAR
  505. ;
  506. CK4:
  507.     MOV    A,E
  508.     CPI    4
  509.     JNZ    CK1
  510.  
  511.     MVI    E,0
  512.     DCR B!    DCR B
  513.  
  514.     CALL    PRINT$THIS
  515.     DB    'iv',ES
  516. ;
  517. CK1:
  518.     MOV    A,E
  519.     CPI    0
  520.     JZ    PRT$SPACES
  521.  
  522.     DCR    E
  523.     MVI    A,'i'
  524.     CALL    CCHAR
  525.     JMP    CK1
  526. ;
  527. PRT$SPACES:
  528.     MVI    A,' '
  529.     CALL    PCHAR
  530.     DCR    B
  531.     JNZ    PRT$SPACES
  532.  
  533.     RET
  534. ;
  535. ;
  536. ; PRINT STRING FOLLOWING CALLER
  537. ;-------------------------------;
  538.  
  539. PRINT$THIS:
  540.     XTHL
  541.     CALL    STRING
  542.     XTHL
  543.     RET
  544. ;
  545. STRING:
  546.     MOV    A,M
  547.     INX    H
  548.     CPI    ES
  549.     RZ
  550.  
  551.     CALL    PCHAR
  552.     JMP    STRING
  553. ;
  554. ;
  555. ; INTEGER DIVISION BY 2
  556. ;-------------------------------;
  557.  
  558. SLASH:
  559.     XRA    A        ;CLEAR CARRY
  560.  
  561.     MOV    A,H        ;UPPER BYTE TO A
  562.     RAR            ;DIVIDE BY 2, CARRY SET BY LOW BIT
  563.     MOV    H,A        ;BACK TO UPPER
  564.  
  565.     MOV    A,L        ;LOW BYTE TO A
  566.     RAR            ;DIVIDE BY 2, OLD CARRY IS UPPER BIT
  567.     MOV    L,A        ;BACK TO LOW BYTE
  568.  
  569.     RET
  570. ;
  571. ;
  572. ; DATA SPACE
  573. ;
  574. ;
  575.  
  576. BLANK:    DB    0
  577. ;
  578. OLDSP:    DW    0
  579. INTRO:    DW    0
  580. LAST:    DW    0
  581. FIRST:    DW    0
  582. SHEETS:    DW    0
  583. NUMBER:    DB    0
  584. ;
  585. STACK:    EQU    $+128
  586.     END
  587.