home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol073 / vdm-112.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  9.3 KB  |  420 lines

  1. ;*******************************************************
  2. ;         MEMORY MAPPED VIDEO DRIVER
  3. ;*******************************************************
  4. ;
  5. ;        By    Bill Bolton
  6. ;        Software Tools
  7. ;        P.O. Box 80
  8. ;        Newport Beach
  9. ;        NSW, 2106
  10. ;        AUSTRALIA
  11. ;
  12. ;****** DATE OF THIS VERSION 15th February, 1980 *******
  13. ;
  14. ;    Version    1.12
  15. ;
  16. MPAGE    EQU    0CC00H        ;VDM-1 MEMORY ADDR.
  17. SCREEN    EQU    0400H        ;VDM-1 MEMORY SIZE = 1K
  18. FINIS    EQU    004FH        ;END OF CP/M SCRATCH RAM
  19. LB    EQU    0FFH        ;MASK  LOW 8 ADDR BITS
  20. SPACE    EQU    20H        ;ASCII SPACE
  21. DELETE    EQU    7FH        ;ASCII DEL
  22. FLAG    EQU    0FFH        ;FLAG SET
  23. OFFSET    EQU    SPACE        ;OFFSET TO GET ABOVE
  24.                 ;CONTROL CODES
  25. HORIZ    EQU    64        ;NO. OF CHARACTERS/LINE
  26. VERT    EQU    16        ;NO. OF LINES/PAGE
  27. ;
  28.     ORG    0F000H
  29. ;
  30. ;
  31. ;*******JUMPS MUST REMAIN HERE IN THE SAME ORDER*******
  32. ;
  33. ;
  34. ENTRY:
  35.     JMP    VIDEO        ;PROCESS A CHARACTER
  36.     JMP    INITIAL        ;INITIALISE RAM
  37. ;
  38. ;
  39.     DB    'VIDEODRV '
  40.     DB    'VERSION 1.12 '
  41.     DB    'COPYRIGHT (C) '
  42.     DB    '1977/80 BILL BOLTON '
  43. ;
  44. ;
  45. VIDEO:
  46.     CALL    LIFTCUR        ;GET CURSOR LOCATION
  47.     LDA    ESCFLAG        ;ESC SEQUENCE IN,
  48.     CPI    0        ;PROGRESS ?
  49.     JNZ    ESCAPE        ;YES, GO TO IT
  50.     MOV    A,C        ;GET CHAR INTO A
  51.     ANI    07FH        ;MASK OUT BIT 7 TO MAKE ASCII
  52.     CPI    DELETE        ;IS IT A DELETE ?
  53.     JZ    EXIT        ;YES, IGNORE IT
  54.     CPI    OFFSET        ;ASCII PRINTING CHAR ?
  55.     JP    PRINT        ;YES, PUT ONTO SCREEN
  56.                 ;NO, MUST BE CONTROL CHARACTER
  57.     ;
  58.     ;CONTROL CHARACTER TABLE PROCESSING ROUTINE
  59.     ;
  60.     PUSH    H        ;SAVE CURRENT SCREEN LOC.
  61.     LXI    H,VDUTBLE    ;GET START OF TABLE
  62.     ADD    L        ;ADD LOW ADDR BYTE TO A
  63.     MOV    L,A        ;PUT RESULT BACK INTO L
  64.     MOV    L,M        ;GET VALUE IN MEMORY,
  65.     XTHL            ;POINTED TO BY HL INTO L,
  66.     RET            ;PUT ONTO STACK AND JUMP,
  67.                 ;TO IT, ALSO RESTORE
  68.                 ;CURSOR ADDR TO HL
  69.     ;
  70. VDUTBLE:
  71.     DB    EXIT AND LB    ;^@
  72.     DB    EXIT AND LB    ;^A
  73.     DB    EXIT AND LB    ;^B
  74.     DB    EXIT AND LB    ;^C
  75.     DB    EXIT AND LB    ;^D 
  76.     DB    EXIT AND LB    ;^E
  77.     DB    EXIT AND LB    ;^F
  78.     DB    PRINT AND LB    ;^G BELL
  79.     DB    BACKSP AND LB    ;^H CURSOR LEFT
  80.     DB    EXIT AND LB    ;^I 
  81.     DB    LINEF AND LB    ;^J LINE FEED
  82.     DB    CURSUP AND LB    ;^K CURSOR UP
  83.     DB    EOL AND LB    ;^L CURSOR RIGHT
  84.     DB    CRET AND LB    ;^M CARRIAGE RETURN
  85.     DB    EXIT AND LB    ;^N
  86.     DB    EXIT AND LB    ;^O
  87.     DB    EXIT AND LB    ;^P
  88.     DB    EXIT AND LB    ;^Q
  89.     DB    EXIT AND LB    ;^R
  90.     DB    EXIT AND LB    ;^S
  91.     DB    EXIT AND LB    ;^T
  92.     DB    EXIT AND LB    ;^U
  93.     DB    EXIT AND LB    ;^V
  94.     DB    EXIT AND LB    ;^W
  95.     DB    EXIT AND LB    ;^X
  96.     DB    EXIT AND LB    ;^Y
  97.     DB    FORM AND LB    ;^Z CLEAR SCREEN
  98.     DB    ESCF AND LB    ;^[ ESCAPE
  99.     DB    EXIT AND LB    ;^\
  100.     DB    EXIT AND LB    ;^]
  101.     DB    HOME AND LB    ;^^ HOME CURSOR
  102.     DB    CRLF AND LB    ;^- NEW LINE
  103.     ;
  104.     ;PRINT THE CHARACTER ON THE SCREEN
  105.     ;
  106. PRINT:
  107.     MOV    C,A        ;PUT ASCII CHAR BACK
  108.     LDA    VFL        ;GET REV VIDEO FLAG
  109.     XRA    C        ;XOR WITH CHARACTER
  110.     MOV    M,A        ;PUT RESULT ONTO SCREEN
  111.     ;
  112.     ;E0L CHECKS THE CURSOR POSITION FOR END OF LINE
  113.     ;
  114. EOL:
  115.     LDA    CURPOS        ;GET CURSOR POSITION
  116.     INR    A        ;CURSOR=CURSOR+1
  117.     CPI    HORIZ        ;MAX LINE LENGTH ?
  118.     JC    TABRET        ;NO,STORE NEW CURPOS
  119. CRLF:
  120.     XRA    A        ;RESET A TO LINE START
  121.     STA    CURPOS        ;SAVE CURSOR POSITION
  122.     ;
  123.     ;MOVE DOWN ONE LINE
  124.     ;
  125. LINEF:
  126.     LDA    LINENO        ;GET CURRENT LINE NO.
  127.     CPI    VERT-1        ;AT THE BOTTOM ?
  128.     JNZ    NOSCRL        ;NO, DONT SCROLL UP
  129.     ;
  130.     ;SCROLL UP ONE LINE
  131.     ;
  132. SCROLL:
  133.     LXI    H,MPAGE+HORIZ    ;YES, HL= LINE N+1
  134.     LXI    D,MPAGE        ;DE= LINE N
  135.     LXI    B,(VERT*(HORIZ/2))-(HORIZ/2)    ;CHAR COUNT
  136. SCRL:
  137.     MOV    A,M        ;GET CHAR FROM LINE N+1
  138.     STAX    D        ;PUT IT INTO LINE N
  139.     INX    D        ;BUMP D TO NEXT CHAR POS
  140.     INX    H        ;BUMP H DITTO
  141.     MOV    A,M        ;GET IT
  142.     STAX    D        ;STORE A
  143.     INX    H        ;BUMP H
  144.     INX    D        ;BUMP D
  145.     DCX    B        ;DECR CHAR COUNT EVERY 2 MOVES
  146.     MOV    A,B        ;GET HI BYTE OF COUNT
  147.     ORA    C        ;IS COUNT = 0 ?
  148.     JNZ    SCRL        ;NOT FINISHED, DO IT AGAIN
  149.     LDA    LINENO        ;YES, GET CURRENT LINE NO.
  150.     ;
  151.     ;ERASE BOTTOM LINE (DE POINTS TO START OF LINE)
  152.     ;
  153. EBOTL:
  154.     XCHG            ;START OF LINE INTO HL
  155.     MVI    B,HORIZ        ;SET UP CHAR COUNT
  156.     CALL    ELOP        ;DO THE ERASE
  157.     DCR    A        ;SET UP TO ENTER NOSCRL
  158. NOSCRL:
  159.     INR    A        ;LINE = LINE + 1
  160.     STA    LINENO        ;SAVE LINE NO.
  161.     JMP    EXIT
  162.     ;
  163. ELOP:
  164.     MVI    M,SPACE        ;SPACE TO OVERWRITE
  165.     INX    H        ;BUMP H TO NEXT CHAR
  166.     DCR    B        ;B=0 IS END OF LINE
  167.     JNZ    ELOP        ;NO, DO IT AGAIN
  168.     RET
  169.     ;
  170.     ;BACKSPACE
  171.     ;
  172. BACKSP:
  173.     LDA    CURPOS        ;GET CURRENT CURSOR
  174.     DCR    A        ;CURSOR=CURSOR-1
  175.     JP    TABRET        ;STORE NEW CURPOS
  176.     JMP    CRET         ;GONE BACK PAST START
  177.                 ;OF LINE SO RESET
  178.     ;
  179.     ;CLEAR THE SCREEN AND HOME CURSOR
  180.     ;
  181. FORM:
  182.     CALL    CLEAR
  183. HOME:
  184.     XRA    A        ;RESET A TO 0
  185.     STA    LINENO        ;LINENO.=0
  186.     STA    VFL        ;VFL=0
  187.     ;
  188.     ;CARRIAGE RETURN
  189.     ;
  190. CRET:
  191.     XRA    A        ;RESET CURSOR TO LINE START
  192. TABRET:
  193.     STA    CURPOS
  194.     ;
  195.     ;RETURN TO THE CALLING ROUTINE
  196.     ;
  197. EXIT:
  198.     CALL    LIFTCUR        ;CURSOR BACK ON SCREEN
  199.     RET            ;BACK TO CALLING ROUTINE
  200.     ;
  201.     ;MOVE CURSOR UP
  202.     ;
  203. CURSUP:
  204.     LDA    LINENO        ;LINE NUMBER = N
  205.     ANA    A        ;AT TOP (N=0) ?
  206.     JZ    EXIT        ;YES, DO NOTHING
  207.     DCR    A        ;LINENO=LINENO-1
  208.     STA    LINENO        ;SAVE LINE NUMBER
  209.     JMP    EXIT
  210.     ;
  211.     ;CLEAR THE SCREEN
  212.     ;
  213. CLEAR:
  214.     LXI    H,MPAGE        ;GET SCREEN START ADDR.
  215. WRSPC:
  216.     MVI    M,SPACE        ;PUT SPACE ONTO SCREEN 
  217.     INX    H        ;NEXT SCREEN LOCATION
  218.     MOV    A,H        ;GET SCREEN POS. IN A
  219.     CPI    (MPAGE+SCREEN)/256 ;END OF SCREEN ?
  220.     JNZ    WRSPC        ;NO, WIPE NEXT SCREEN POS.
  221.     RET
  222.     ;
  223.     ;SET ESCAPE FLAG
  224.     ;
  225. ESCF:
  226.     MVI    A,FLAG        ;GET FLAG INTO A
  227.     STA    ESCFLAG        ;STORE ESC SEQUENCE FLAG
  228.     JMP    EXIT
  229.     ;
  230.     ;CALCULATE MEMORY ADDRESS FROM CURSOR POSITION
  231.     ;
  232. LIFTCUR:
  233.     LXI    H,MPAGE-HORIZ    ;SCREEN START - 1 LINE
  234.     LXI    D,HORIZ        ;CHARACTERS/LINE
  235.     LDA    LINENO        ;GET CURRENT LINE NUMBER
  236.     INR    A        ;SET UP TO ENTER CLOP
  237. CLOP:
  238.     DAD    D        ;HL=CHAR PER LINE * NUMBER
  239.                 ;OF LINES
  240.     DCR    A        ;LINENO.= LINENO.-1
  241.     JNZ    CLOP        ;LINENO.= 0 ?
  242. CFIN:
  243.     MOV    D,A        ;YES, RESET D TO 0
  244.     LDA    CURPOS        ;GET CURSOR POSITION
  245.     MOV    E,A        ;PUT IT INTO E
  246.     DAD    D        ;ADD CHAR POS IN CURRENT
  247.                 ;LINE TO TOTAL IN HL
  248.     ;
  249.     ;REVERSE THE VIDEO
  250.     ;
  251.     MOV    A,M        ;GET SCREEN POS CONTENTS
  252.     XRI    80H        ;COMPLEMENT BIT 8
  253.     MOV    M,A        ;PUT IT BACK ONTO SCREEN
  254.     RET
  255.     ;
  256.     ;
  257.     ;SET UP ALL THE INITIAL ENTRY PARAMETERS ON
  258.     ;POWERING UP. INTENDED TO BE CALLED FROM THE
  259.     ;OPERATING SYSTEM
  260.     ;
  261.     ;
  262. INITIAL:
  263.     MVI    A,0        ;INITIALISE VDM HARDWARE
  264.     OUT    0C8H        ;VDM-1 PORT
  265.     LXI    H,SCRATCH    ;SCRATCHPAD RAM AREA
  266. ILOOP:
  267.     MVI    M,00        ;CLEAR ONE LOCATION
  268.     INX    H        ;NEXT LOCATION
  269.     MOV    A,L        ;GET LOW ADDRES BYTE
  270.     CPI    FINIS        ;AT THE END YET?
  271.     JNZ    ILOOP        ;NO, CLEAR NEXT BYTE
  272.     JMP    FORM        ;CLEAR THE SCREEN AND
  273.                 ;SET UP THE CURSOR    
  274.     ;
  275.     ;TEST FOR WHICH CHARACTER IN ESC SEQUENCE
  276.     ;
  277. ESCAPE:
  278.     LDA    ESCFLAG        ;FLAG DOUBLES AS COUNT
  279.     CPI    0FFH        ;1st CHARACTER ?
  280.     JZ    ESCAPE1        ;YES
  281.     CPI    0FEH        ;2nd CHARACTER ?
  282.     JZ    ESCAPE2        ;YES
  283.     CPI    0FDH        ;3rd CHARACTER ?
  284.     JZ    ESCAPE3        ;YES
  285.     JMP    ESCEND        ;NO MATCH SO END SEQ
  286.     ;
  287.     ;PROCESS FIRST CHARACTER OF ESCAPE SEQUENCE
  288.     ;
  289. ESCAPE1:
  290.     MOV    A,C        ;GET CHAR INTO A
  291.     CPI    '='        ;IS IT '=' ?
  292.     JZ    POSIT        ;YES, SET POSFLAG
  293.     CPI    '*'        ;IS IT '*' ?
  294.     JZ    FORM        ;YES, CLEAR SCREEN
  295.     CPI    'G'        ;IS IT 'G' ?
  296.     JZ    ATTRIB        ;YES, VIDEO ATTRIB
  297.     CPI    'T'        ;IS IT 'T'
  298.     JZ    ERASE        ;YES, ERASE TO END OF LINE
  299.     JMP    ESCEND        ;NO MATCH SO END SEQ
  300.     ;
  301.     ;SET FLAG TO INDICATE POSITIONING SEQUENCE
  302.     ;
  303. POSIT:
  304.     MVI    A,FLAG        ;SET UP POSITION FLAG
  305.     STA    POSFLAG        ;STORE IT
  306. DECR:
  307.     LDA    ESCFLAG        ;GET ESC SEQ CHAR COUNT
  308.     DCR    A        ;COUNT = COUNT-1
  309.     STA    ESCFLAG        ;STORE IT
  310.     JMP    EXIT
  311.     ;
  312.     ;SET FLAG TO INDICATE VIDEO ATTRIBUTE SEQUENCE
  313.     ;
  314. ATTRIB:
  315.     MVI    A,FLAG        ;SET UP ATTRIBUTE FLAG
  316.     STA    ATTFLAG        ;STORE IT
  317.     JMP    DECR        ;DECREMENT ESCFLAG
  318.     ;
  319. ERASE:
  320.     MOV    A,L        ;GET LOW BYTE OF SCREEN
  321.     ORI    HORIZ-1        ;SET A TO END OF LINE-1
  322.     INR    A        ;BUMP A TO EOL
  323.     SUB    L        ;SUBTRACT CURSOR LOCATION
  324.                 ;FROM END OF LINE COUNT
  325.                 ;TO GET NUMBER OF CHARS
  326.                 ;TO ERASE
  327.     MOV    B,A        ;PUT INTO B FOR ELOP
  328.     CALL    ELOP        ;DO THE ERASE
  329.     JMP    ESCEND        ;EXIT
  330.     ;
  331.     ;PROCESS 2nd CHARACTER OF ESCAPE SEQUENCE
  332.     ;
  333. ESCAPE2:
  334.     LDA    POSFLAG        ;GET POSITION FLAG
  335.     CPI    FLAG        ;IS IT SET ?
  336.     JZ    NEWLINE        ;YES, SET NEW LINE
  337.     LDA    ATTFLAG        ;GET ATTRIBUTE FLAG
  338.     CPI    FLAG        ;IS IT SET ?
  339.     JZ    ATTRIB2        ;YES, PROCESS IT
  340.     JMP    ESCEND
  341.     ;
  342.     ;SET CURSOR TO NEW LINE POSITION
  343.     ;
  344. NEWLINE:
  345.     MOV    A,C        ;GET CHAR INTO A
  346.     SUI    OFFSET        ;REMOVE OFFSET
  347.     CPI    VERT        ;LARGER THAN NO. LINES ?
  348.     JM    CONT1        ;NO
  349.     MVI    A,VERT-1    ;GET MAX. LINE NUMBER
  350. CONT1:
  351.     STA    LINENO        ;STORE NEW LINE NO.
  352.     JMP    DECR        ;DECREMENT ESC COUNT
  353.     ;
  354.     ;SET VIDEO ATTRIBUTE
  355.     ;
  356. ATTRIB2:
  357.     MOV    A,C        ;GET CHAR INTO A
  358.     CPI    '0'        ;IS IT ATTRIBUTE OFF?
  359.     JZ    NORMAL        ;YES, RESET VIDEO FLAG
  360.     CPI    '4'        ;IS IT REV VIDEO ON?
  361.     JZ    REVERSE        ;YES, REVERSE VIDEO FLAG
  362.     CPI    '6'        ;IS IT BLINK/REV VIDEO ON?
  363.     JZ    REVERSE        ;CANT BLINK BUT CAN REVERSE
  364.     JMP    ESCEND
  365.     ;
  366.     ;VIDEO FLAG ROUTINES
  367.     ;
  368. NORMAL:
  369.     XRA    A        ;RESET VIDEO FLAG
  370.     JMP    VFLSTOR        ;SAVE IT
  371.     ;
  372. REVERSE:
  373.     MVI    A,80H        ;SET VIDEO FLAG
  374. VFLSTOR:
  375.     STA    VFL        ;SAVE IT
  376.     JMP    ESCEND
  377.     ;
  378.     ;PROCESS THIRD CHARACTER OF ESCAPE SEQUENCE
  379.     ;
  380. ESCAPE3:
  381.     LDA    POSFLAG        ;GET POSITION FLAG
  382.     CPI    FLAG        ;IS IT SET ?
  383.     JZ    NEWCHAR        ;YES, SET NEW CHAR POS
  384.     JMP    ESCEND
  385.     ;
  386.     ;SET NEW CURSOR CHARACTER POSITION
  387.     ;
  388. NEWCHAR:
  389.     MOV    A,C        ;GET CHAR INTO A
  390.     SUI    OFFSET        ;REMOVE OFFSET
  391.     CPI    HORIZ        ;LARGER THAN LINE LENGTH ?
  392.     JM    CONT2        ;NO
  393.     MVI    A,HORIZ-1    ;GET MAX. CHAR COUNT
  394. CONT2:
  395.     STA    CURPOS        ;SAVE NEW CHAR POS
  396.     JMP    ESCEND
  397.     ;
  398.     ;EXIT FROM ESCAPE SEQUENCE
  399.     ;
  400. ESCEND:
  401.     XRA    A        ;RESET A TO 0
  402.     STA    ESCFLAG        ;RESET FLAGS
  403.     STA    POSFLAG
  404.     STA    ATTFLAG
  405.     JMP    EXIT
  406.     ;
  407.     ;CURSOR STORAGE LOCATIONS
  408.     ;
  409.     ORG    0040H        ;Or some other RAM scratch area
  410. ;
  411. SCRATCH:DS    6        ;THIS AREA MUST BE RAM
  412. CURPOS:    EQU    SCRATCH        ;POSITION ON LINE
  413. LINENO:    EQU    SCRATCH+1    ;LINE ON SCREEN
  414. VFL:    EQU    SCRATCH+2    ;REVERSE VIDEO FLAG
  415. ESCFLAG:EQU    SCRATCH+3    ;ESCAPE SEQUENCE FLAG
  416. POSFLAG:EQU    SCRATCH+4    ;CURSOR POSITIONING FLAG
  417. ATTFLAG:EQU    SCRATCH+5    ;VIDEO ATTRIBUTE FLAG
  418.     ;
  419.     END    ENTRY
  420.