home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / cpmug / cpmug017.ark / DISPLAY.ASM < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  5.3 KB  |  327 lines

  1. ; DISPLAY PROCESSOR MODULE
  2. ; INITIALIZATION
  3. STACK    EQU    0FFH        ;STACK ADDR
  4. CINTC    EQU    0FFFBH        ;RTC CONTROL ADDR
  5. GSTRT    EQU    100H        ;START ADDR
  6. KINTC    EQU    0FFC0H        ;KBRD INT CONTROL ADDR
  7. TIME    EQU    3FH        ;SYSTEM TIME
  8. TOP    EQU    40H        ;DISPLAY FILE START ADDR
  9. XYOUT    EQU    0FFFCH        ;CRT OUTPUT ADDR
  10.     ORG    GSTRT
  11. INIT:    LXI    D,0        ;ZERO XY (IN DE ALWAYS)
  12.     LXI    H,TABLE
  13.     SHLD    INCPT        ;INIT INCR PTR
  14.     LXI    SP,STACK        ;INIT STACK PTR
  15.     MVI    A,10H
  16.     STA    KINTC        ;TURN ON KB INT
  17.     MVI    A,80H    
  18.     STA    CINTC        ;TURN ON RTC INT
  19.     EI
  20.     LHLD    TOP
  21.     SHLD    PNTR        ;INIT INSTRUCTION PTR
  22. ; OPCODE DECODING
  23. MLOOP:    LHLD    PNTR        ;ADDR OF OPCODE
  24.     MOV    C,M
  25.     MVI    B,0        ;OPCODE IN BC
  26.     LXI    H,JMTAB        ;BASE OF JUMP TABLE
  27.     DAD    B        ;ADD OPCODE
  28.     MOV    C,M    
  29.     INX    H
  30.     MOV    H,M
  31.     MOV    L,C        ;ADDR OF ROUTINE IN HL
  32.     PCHL            ;JUMP TO IT
  33. ; JUMP TABLE FOR OPCODE PROCESSING
  34. JMTAB:    DW    MBEAM        ;0
  35.     DW    MDISP        ;2
  36.     DW    LVEC        ;4
  37.     DW    SVEC        ;6
  38.     DW    PARAM        ;8
  39.     DW    JUMP        ;A
  40.     DW    JUMPS        ;C
  41.     DW    RETS        ;E
  42.     DW    EXEC        ;10H
  43.     DW    SYNC        ;12H
  44. ; MOVE BEAM - DON'T DIPLAY POINT
  45. MBEAM:    LHLD    PNTR
  46.     INX    H
  47.     MOV    D,M        ;GET X COORD
  48.     INX    H
  49.     MOV    E,M        ;GET Y COORD
  50.     INX    H
  51.     SHLD    PNTR        ;RESTORE PTR
  52.     JMP    MLOOP        ;GET ANOTHER INSTRUCTION
  53. ; MOVE BEAM AND DISPLAY POINT
  54. MDISP:    LHLD    PNTR
  55.     INX    H
  56.     MOV    D,M
  57.     INX    H
  58.     MOV    E,M
  59.     INX    H
  60.     SHLD    PNTR
  61.     XCHG            ;XY TO HL
  62.     SHLD    XYOUT        ;WRITE TO CRT
  63.     XCHG            ;XY TO DE
  64.     JMP    MLOOP
  65. ; SET ORIENTATION AND SCALE
  66. PARAM:    LHLD    PNTR
  67.     INX    H
  68.     MOV    C,M
  69.     INX    H
  70.     SHLD    PNTR
  71.     MOV    L,C        ;NEW ORIENT & SCALE IN HL
  72.     MVI    H,0
  73.     LXI    B,TABLE        ;ADDR OF INCR TABLE
  74.     DAD    B        ;ADD ORIENT & SCALE
  75.     SHLD    INCPT        ;STORE IN INCR PTR
  76.     JMP    MLOOP        ;GET ANOTHER INSTRUCTION
  77. ; JUMP TO A NEW LOCATION IN DISPLAY FILE
  78. JUMP:    LHLD    PNTR
  79.     INX    H
  80.     MOV    A,M        ;LSB OF ADDR
  81.     INX    H
  82.     MOV    H,M        ;MSB OF ADDR
  83.     MOV    L,A
  84.     SHLD    PNTR        ;STORE IN INSTRUCTION PTR
  85.     JMP    MLOOP
  86. ; JUMP TO SUBROUTINE
  87. JUMPS:    LHLD    PNTR
  88.     INX    H
  89.     MOV    C,M    
  90.     INX    H
  91.     MOV    B,M        ;NEW ADDR IN BC
  92.     INX    H
  93.     PUSH    H        ;STORE OLD PTR ON STACK
  94.     MOV    H,B
  95.     MOV    L,C
  96.     SHLD    PNTR        ;ADDR IN INSTRUCTION PTR
  97.     JMP    MLOOP
  98. ; RETURN FROM SUBROUTINE
  99. RETS:    POP    H        ;RESTORE PTR FROM STACK
  100.     SHLD    PNTR
  101.     JMP    MLOOP
  102. ; SHORT VECTOR MODE
  103. SVEC:    LHLD    PNTR        ;CURRENT INSTR INDEX
  104.     INX    H
  105. NEXT:    MOV    B,M        ;SHORT VECTOR INSTRUCTION
  106.     INX    H
  107.     SHLD    PNTR        ;RESTORE PTR
  108.     MOV    A,B
  109.     ANI    7H        ;MASK DIRECTION BITS
  110.     MOV    C,A        ;OFFSET IN C
  111.     MOV    A,B        ;ORIG INSTR IN A
  112.     MVI    B,0        ;ZERO IN B
  113.     LHLD    INCPT        ;INCR PTR
  114.     DAD    B        ;ADD DIRECTION OFFSET
  115.     MOV    B,M        ;X INCREMENT
  116.     INX    H
  117.     INX    H
  118.     MOV    C,M        ;Y INCREMENT
  119.     XCHG            ;XY IN HL
  120.     MOV    E,A        ;ORIGINAL INSTR
  121.     ANI    70H        ;LENGTH BITS
  122.     RRC
  123.     RRC
  124.     RRC
  125.     RRC            ;SHIFT RIGHT 4
  126.     MOV    D,A        ;IN D
  127.     MOV    A,E        ;ORIGINAL INSTR
  128.     ANI    8H        ;ON/OFF BIT
  129.     JNZ    FLOOP        ;JUMP IF "OFF"
  130.     SHLD    XYOUT        ;INITIAL DOT TO CRT
  131. NLOOP:    MOV    A,B        ;X INCREMENT
  132.     ADD    H
  133.     MOV    H,A
  134.     MOV    A,C
  135.     ADD    L
  136.     MOV    L,A        ;NEW XY IN HL
  137.     SHLD    XYOUT        ;WRITE TO CRT
  138.     DCR    D
  139.     JNZ    NLOOP        ;LOOP IF NOT DONE
  140.     JMP    CKESC        ;CHECK "ESCAPE"
  141. FLOOP:    MOV    A,B        ;X INCREMENT
  142.     ADD    H        ;ADD TO X
  143.     MOV    H,A
  144.     MOV    A,C        ;Y INCREMENT
  145.     ADD    L
  146.     MOV    L,A        ;NEW XY IN HL
  147.     DCR    D
  148.     JNZ    FLOOP        ;LOOP IF NOT DONE
  149. CKESC:    MOV    A,E        ;ORIGINAL INSTR
  150.     XCHG            ;XY TO DE
  151.     RLC            ;SET CARRY IF "ESCAPE"
  152.     JC    MLOOP        ;MAIN LOOP IF SO
  153.     LHLD    PNTR
  154.     JMP    NEXT        ;GET MORE DATA IF NOT
  155. ; LONG VECTOR MODE
  156. LVEC:    LHLD    PNTR
  157.     INX    H
  158.     MOV    B,M        ;NEW X POS
  159.     INX    H
  160.     MOV    A,M        ;NEW Y POS
  161.     INX    H
  162.     SHLD    PNTR    
  163.     MVI    C,0F8H        ;SPECIAL MASK FOR -
  164.     SUB    E        ;DEL Y IN A 
  165.     JC    PLUSY        ;TEST SIGN OF DEL
  166.     MVI    C,0        ;SPECIAL MASK FOR +
  167. PLUSY:    RLC
  168.     RLC
  169.     RLC            ;DIVIDE BY 32
  170.     MOV    H,A        ;SAVE IN H
  171.     ANI    0F8H        ;SAVE 1ST 5 BITS
  172.     MOV    L,A        ;L.O. Y INC
  173.     MOV    A,H        ;RESTORE
  174.     ANI    7        ;SAVE LAST 3 BITS
  175.     XRA    C        ;XOR SPECIAL MASK
  176.     MOV    H,A        ;H.O. Y INC
  177.     SHLD    YINC        ;STORE
  178.     MOV    A,B        ;X POS
  179.     MVI    C,0F8H
  180.     SUB    D        ;DEL X IN A
  181.     JC    PLUSX
  182.     MVI    C,0
  183. PLUSX:    RLC
  184.     RLC
  185.     RLC
  186.     MOV    H,A
  187.     ANI    0F8H
  188.     MOV    L,A        ;L.O. X INCR
  189.     MOV    A,H
  190.     ANI    7
  191.     XRA    C
  192.     MOV    H,A        ;H.O. X INCR
  193.     SHLD    XINC
  194.     MOV    B,D        ;X IN BC (H.O.)
  195.     MVI    C,0
  196.     MOV    D,E        ;Y IN DE (H.O.)
  197.     MVI    E,0
  198.     MVI    A,20H        ;32 POINTS IN VECT
  199. LLOOP:    LHLD    YINC
  200.     DAD    D
  201.     XCHG            ;NEW Y IN DE
  202.     LHLD    XINC
  203.     DAD    B
  204.     MOV    B,H        ;NEW X IN BC
  205.     MOV    C,L
  206.     MOV    L,D        ;XY IN HL (H.O.)
  207.     SHLD    XYOUT        ;WRITE TO CRT
  208.     DCR    A
  209.     JNZ    LLOOP
  210.     XCHG            ;RESTORE XY TO DE
  211.     JMP    MLOOP
  212. ; TRANSFER CONTROL TO EXECUTIVE
  213. EXEC:    LHLD    PNTR        ;BUMP PTR
  214.     INX    H
  215.     SHLD    PNTR
  216.     MVI    H,80H        ;BEAM TO SCREEN CENTER
  217.     MVI    L,80H
  218.     SHLD    XYOUT
  219.     RST    3        ;XFER TO LOC 18H
  220.     JMP    MLOOP        ;NEXT INSTRUCTION
  221. ; SYNCHRONIZE WITH REAL-TIME CLOCK
  222. SYNC:    LHLD    PNTR        ;BUMP PTR
  223.     INX    H
  224.     SHLD    PNTR
  225.     MVI    H,80H        ;BEAM TO SCREEN CENTER
  226.     MVI    L,80H
  227.     SHLD    XYOUT
  228.     LXI    H,TIME
  229.     MOV    A,M        ;OLD TIME IN A
  230. SLOOP:    CMP    M        ;OLD=NEW?
  231.     JZ    SLOOP        ;YES - KEEP TRYING
  232.     JMP    MLOOP        ;NO - NEXT INSTR
  233. ; TABLE FOR VECTOR ORIENTATION AND SCALING
  234. TABLE:    DB    0
  235.     DB    2
  236.     DB    2
  237.     DB    2
  238.     DB    0
  239.     DB    -2
  240.     DB    -2
  241.     DB    -2
  242.     DB    0
  243.     DB    2
  244.     DB    2
  245.     DB    2
  246.     DB    0
  247.     DB    -2
  248.     DB    -2
  249.     DB    -2
  250.     DB    0
  251.     DB    3
  252.     DB    3
  253.     DB    3
  254.     DB    0
  255.     DB    -3
  256.     DB    -3
  257.     DB    -3
  258.     DB    0
  259.     DB    3
  260.     DB    3
  261.     DB    3
  262.     DB    0
  263.     DB    -3
  264.     DB    -3
  265.     DB    -3
  266.     DB    0
  267.     DB    4
  268.     DB    4
  269.     DB    4
  270.     DB    0
  271.     DB    -4
  272.     DB    -4
  273.     DB    -4
  274.     DB    0
  275.     DB    4
  276.     DB    4
  277.     DB    4
  278.     DB    0
  279.     DB    -4
  280.     DB    -4
  281.     DB    -4
  282.     DB    0
  283. ; THE FOLLOWING ARE STORAGE CELLS NOT TO BE IN PROM
  284. ; WORKING STORAGE
  285. PNTR:    DW    0        ;PTR TO NEXT INSTR
  286. XINC:    DW    0        ;LVEC ONLY
  287. YINC:    DW    0        ;LVEC ONLY
  288. INCPT:    DW    0        ;PTR TO INCREMENT IN TABLE
  289.     END
  290.