home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d1xx / d165 / cpm.lha / CPM / DriveA / spiral.mac < prev    next >
Text File  |  1988-11-22  |  4KB  |  213 lines

  1. .Z80
  2. ;    841002 ULF NORDQUIST
  3.  
  4. CPM        EQU    0
  5. BDOS        EQU    0005H
  6.  
  7. DIRCIO        EQU    06H        ;DIRECT CONSOLE I/O
  8. LF        EQU    10
  9. CR        EQU    13
  10. ESC        EQU    1BH
  11. CURPOS        EQU    3DH        ;CURSOR POSITIONING COMMAND
  12. IVMIN        EQU    0        ;INIT MIN VERT COUNT
  13. IVMAX        EQU    23        ;INIT MAX VERT COUNT
  14. IHMIN        EQU    0        ;INIT MIN HORIZ COUNT
  15. IHMAX        EQU    78        ;INIT MAX HORIZ COUNT
  16. ICHAR        EQU    21H        ;INIT CHARACTER
  17.  
  18. SPIRAL:     LD    (SPSAVE),SP
  19.         LD    SP,STACK    ;INIT SP
  20.         LD    A,ESC
  21.         CALL    CRT
  22.         LD    A,4CH
  23.         CALL    CRT        ;CLEAR AND HOME
  24. SPIRAL13:    LD    A,ICHAR
  25.         LD    (CHAR),A        ;INIT CHARACTER
  26. SPIRAL11:    LD    A,IHMIN
  27.         LD    (HPOS),A        ;INIT CURSOR HORIZ
  28.         LD    (HMIN),A        ;INIT MIN HORIZ
  29.         LD    A,IHMAX
  30.         LD    (HMAX),A        ;INIT MAX HORIZ
  31.         LD    A,IVMIN
  32.         LD    (VPOS),A        ;INIT CURSOR VERT
  33.         LD    (VMIN),A        ;INIT MIN VERT
  34.         LD    A,IVMAX
  35.         LD    (VMAX),A        ;INIT MAX VERT
  36.         CALL    CURSOR        ;POS CURSOR
  37.         LD    A,(CHAR)
  38.         CALL    CRT        ;SEND CHAR
  39.  
  40. ;    GO RIGHT TO HMAX
  41.  
  42. SPIRAL8:    LD    A,(VMIN)
  43.         LD    B,A
  44.         LD    A,(VMAX)
  45.         CP    B
  46.         JR    Z,SPIRAL2    ;IF VMAX=VMIN, CONT
  47.         INC    B        ;INC VMIN
  48.         LD    A,B
  49.         LD    (VMIN),A        ;UPDATE VMIN
  50. SPIRAL2:    LD    A,(HMAX)
  51.         LD    B,A
  52.         LD    A,(HPOS)
  53.         CP    B
  54.         JR    Z,SPIRAL1    ;IF AT HMAX=HPOS CONT AT NXT
  55.         INC    A
  56.         LD    (HPOS),A        ;UPDATE HPOS
  57.         CALL    CURSOR        ;POS CURSOR
  58.         LD    A,(CHAR)
  59.         CALL    CRT        ;SEND CHAR
  60.         JR    SPIRAL2
  61.  
  62. ;    GO DOWN TO VMAX
  63.  
  64. SPIRAL1:    LD    A,(HMIN)
  65.         CP    B
  66.         JR    Z,SPIRAL4    ;IF HMAX=HMIN CONT
  67.         DEC    B        ;DEC HMAX
  68.         LD    A,B
  69.         LD    (HMAX),A        ;UPDATE HMAX
  70. SPIRAL4:    LD    A,(VMAX)
  71.         LD    B,A
  72.         LD    A,(VPOS)
  73.         CP    B
  74.         JR    Z,SPIRAL3    ;IF VPOS=VMAX CONT AT NXT
  75.         INC    A
  76.         LD    (VPOS),A        ;UPDATE VPOS
  77.         CALL    CURSOR        ;POS CURSOR
  78.         LD    A,(CHAR)
  79.         CALL    CRT        ;SEND CHAR
  80.         JR    SPIRAL4
  81.  
  82. ;    GO LEFT TO HMIN
  83.  
  84. SPIRAL3:    LD    A,(VMIN)
  85.         CP    B
  86.         JR    Z,SPIRAL5    ;IF VMAX=VMIN
  87.         DEC    B        ;DEC VMAX
  88.         LD    A,B
  89.         LD    (VMAX),A        ;UPDATE VMAX
  90. SPIRAL5:    LD    A,(HMIN)
  91.         LD    B,A
  92.         LD    A,(HPOS)
  93.         CP    B
  94.         JR    Z,SPIRAL6    ;IF HPOS=HMIN
  95.         DEC    A
  96.         LD    (HPOS),A        ;UPDATE VPOS
  97.         CALL    CURSOR        ;POS CURSOR
  98.         LD    A,(CHAR)
  99.         CALL    CRT        ;SEND CHAR
  100.         JR    SPIRAL5
  101.  
  102. ;    GO UP TO VMIN
  103.  
  104. SPIRAL6:    LD    A,(HMAX)
  105.         CP    B
  106.         JR    Z,SPIRAL7    ;IF HMAX=HMIN
  107.         INC    B        ;INC HMIN
  108.         LD    A,B
  109.         LD    (HMIN),A        ;UPDATE VMAX
  110. SPIRAL7:    LD    A,(VMIN)
  111.         LD    B,A
  112.         LD    A,(VPOS)
  113.         CP    B
  114.         JP    Z,SPIRAL9    ;IF VPOS=VMIN
  115.         DEC    A
  116.         LD    (VPOS),A        ;UPDATE VPOS
  117.         CALL    CURSOR        ;POS CURSOR
  118.         LD    A,(CHAR)
  119.         CALL    CRT        ;SEND CHAR
  120.         JR    SPIRAL7
  121.  
  122. ;    CHECK IF SCREEN IS FILLED
  123.  
  124. SPIRAL9:    LD    A,(VMAX)
  125.         CP    B
  126.         JR    NZ,SPIRAL10    ;IF VMIN<>VMAX
  127. SPIRAL12:    LD    A,(CHAR)
  128.         CP    7FH
  129.         JP    Z,SPIRAL13    ;START OVER
  130.         INC    A
  131.         LD    (CHAR),A        ;UPDATE CHAR
  132.         JP    SPIRAL11    ;START NEW SPIRAL
  133. SPIRAL10:    LD    A,(HMIN)
  134.         LD    B,A
  135.         LD    A,(HMAX)
  136.         CP    B
  137.         JP    NZ,SPIRAL8    ;CONT SPIRAL
  138.         JR    SPIRAL12
  139.  
  140. ;    SUBROUTINE --- CURSOR ---
  141. ;    POSITIONS CURSOR AT CURRENT VPOS AND HPOS
  142. ;    ENTRY : HPOS & VPOS UPDATED
  143. ;    CHANGES : -
  144.  
  145. CURSOR:     PUSH    AF
  146.         PUSH    BC
  147.         PUSH    DE
  148.         PUSH    HL
  149.         LD    A,ESC
  150.         CALL    CRT        ;OUTPUT ESCAPE
  151.         LD    A,CURPOS
  152.         CALL    CRT        ;OUTPUT CUR POS CMD
  153.         LD    A,(VPOS)
  154.         ADD    A,20H        ;OFFSET
  155.         CALL    CRT        ;SEND LINE NO
  156.         LD    A,(HPOS)
  157.         ADD    A,20H
  158.         CALL    CRT        ;SEND COL NO
  159.         LD    E,0FFH        ;FLAG FOR INPUT
  160.         LD    C,DIRCIO
  161.         CALL    BDOS        ;GET CHR FROM CONSOLE
  162.         OR    A
  163.         JR    Z,CURSOR1    ;IF NO DATA
  164.         LD    A,23
  165.         LD    (VPOS),A
  166.         XOR    A
  167.         LD    (HPOS),A
  168.         CALL    CURSOR        ;LOWER LEFT CORNER
  169.         LD    A,CR
  170.         CALL    CRT
  171.         LD    A,LF
  172.         CALL    CRT        ;NEW LINE
  173.         LD    SP,(SPSAVE)
  174.         RET            ;EXIT TO CPM
  175. CURSOR1:    POP    HL
  176.         POP    DE
  177.         POP    BC
  178.         POP    AF
  179.         RET
  180.  
  181. ;    SUBROUTINE --- CRT ---
  182. ;    ENTRY : A=DATA TO SEND TO CONSOLE
  183. ;    CHANGES : -
  184.  
  185. CRT:        PUSH    AF
  186.         PUSH    BC
  187.         PUSH    DE
  188.         PUSH    HL
  189.         LD    E,A        ;DATA TO SEND
  190.         LD    C,DIRCIO
  191.         CALL    BDOS
  192.         POP    HL
  193.         POP    DE
  194.         POP    BC
  195.         POP    AF
  196.         RET
  197.  
  198. ;    STORAGE
  199.  
  200. VPOS        EQU    0A000H        ;CURRENT VERT POS
  201. HPOS        EQU    0A001H        ;CURRENT HOR POS
  202. VMAX        EQU    0A002H        ;CURRENT VERT MAX
  203. HMAX        EQU    0A003H        ;CURRENT HOR MAX
  204. VMIN        EQU    0A004H        ;CURRENT VERT MIN
  205. HMIN        EQU    0A005H        ;CURRENT HOR MIN
  206. CHAR        EQU    0A006H        ;CURRENT CHARACTER
  207. SPSAVE        EQU    0A007H        ;SAVE ENTRY SP
  208.  
  209. STACK        EQU    0A100H        ;TOP OF STACK
  210.  
  211.         END
  212.  
  213.