home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / debug / wadesrc.lbr / MONROM.AZM / MONROM.ASM
Assembly Source File  |  1988-06-19  |  9KB  |  559 lines

  1.     title    'System dependent routines for monitor'
  2. ;
  3. ;    Last Edited    85-04-27    Wagner
  4. ;
  5. ;       This is a sample for a ROM-based version of WADE, running on a
  6. ;       Z80 with ROM from 0000..3fff and RAM from 4000..7fff.
  7. ;       A Z80-SIO is used to communicate with the host.
  8. ;       In normal operations, the host acts as a dumb terminal.
  9. ;       For down- and uploads of code and symbols, communication 
  10. ;       switches to a block-oriented minimum protocol.
  11. ;
  12. ;       
  13. ;    Written 1984, 1985 by
  14. ;
  15. ;        Thomas Wagner
  16. ;        Patschkauer Weg 31
  17. ;        1000 Berlin 33
  18. ;        West Germany
  19. ;
  20. ;       Released to the public domain 1987
  21. ;
  22. ;
  23. ;    System dependent routines are collected in this module.
  24. ;
  25. ;    INITSYSTEM    is called upon initial entry into the monitor.
  26. ;            any hardware initialisation necessary only once
  27. ;            should be inserted here.
  28. ;            Also, this routine may initialise the default list,
  29. ;            dump, and assemble address (normally 0), and the
  30. ;            protection expression.
  31. ;
  32. ;    INITCIO        is called upon each re-entry into the monitor, i.e.
  33. ;            after a break.
  34. ;            it may be used to disable interrupts for the console
  35. ;            or to re-init console i/o.
  36. ;
  37. ;    WRCHAR        should write the character unedited to the console.
  38. ;    RDCHAR        should read a character from the console.
  39. ;    POLLCH        must return true if a character is available.
  40. ;            the character itself is not read by this routine.
  41. ;
  42. ;    JMACRO        may switch console input to a file.
  43. ;    KILLMAC        must revert input to the console.
  44. ;
  45. ;
  46. ;    READ        can read a file from the disk or via a communication
  47. ;            line. an offset or load address is passed.
  48. ;
  49. ;    WRITE        can write a file to the disk or via a communication 
  50. ;            line. a start and end address is passed.
  51. ;
  52. ;    FILE        may use the information in "string" to generate
  53. ;            a filename for read/write, or for any other purpose.
  54. ;
  55. ;    USERDEF        user defined command. jump to CMDERR if you do not
  56. ;            supply a debugger command here.
  57. ;
  58. ;
  59.     cseg
  60. ;
  61.     maclib    z80
  62.     maclib    monopt
  63.     maclib    ports
  64. ;
  65. siodata    equ    s2adata
  66. sioctl    equ    s2actl
  67. rca    equ    1
  68. tbe    equ    4
  69. ;
  70. xon    equ    'Q'-'@'
  71. xoff    equ    'S'-'@'
  72. ;
  73.     public    initsystem,initcio
  74. ;
  75.     public    rdchar,pollch
  76.     public    wrchar
  77. ;
  78.     public    jmacro,killmac
  79.     public    userdef
  80. ;
  81.     public    start,read,write,file
  82.     public    resetrst
  83. ;
  84. ;
  85.     extrn    regpc,string,regiff,regsp
  86.     extrn    break
  87.     extrn    listaddr,dumpaddr,asmaddr
  88.     IF    hilo
  89.     extrn    highval,lowval,maxval,topval
  90.     ENDIF
  91.     extrn    protexpbuf
  92.     extrn    string,getch,testch,skipsep,skipsp,isdigit,iscontrol
  93.     extrn    expression
  94.     extrn    sgetch,stestch
  95.     extrn    monent,cmderr,eocmd
  96.     extrn    wrstr,crlf
  97.     extrn    dishighlow
  98. ;
  99.     extrn    codend,stack
  100.     extrn    syminit
  101. ;
  102. ;------------------------------------------------------------------------------
  103. ;
  104. ;       The following code is entered on CPU Reset.
  105. ;       Note that this module must be linked first, as in all versions.
  106. ;
  107. ;------------------------------------------------------------------------------
  108. ;
  109. start:
  110.     di                ; 0
  111.     jmp    initialise        ; 1, 2, 3
  112. ;
  113.     dw    codend            ; 4, 5
  114.     nop                ; 6
  115.     nop                ; 7
  116. ;
  117. ;    RST 8
  118. ;
  119.     jmp    break    
  120. ;
  121. ;
  122. ;
  123. modebit    equ    0cfh
  124. ;
  125. inactive    equ    11110000B
  126. prtbit    equ    02h
  127. beepbit    equ    04h
  128. baudbit    equ    30h
  129. rembit    equ    40h
  130. ;
  131. lcddata    equ    p1bdata
  132. lcdctl    equ    p1bctl
  133. ;
  134. intctl    equ    07h
  135. intoff    equ    03h
  136. ;
  137. bitmask    equ    00001001B
  138. ;
  139. ;       Here the peripherals of the system are initialised.
  140. ;       This must be changed to reflect your target system.
  141. ;
  142. initialise:
  143. ;       Init PIO
  144.     mvi    a,inactive
  145.     out    p1adata
  146.     mvi    a,modebit
  147.     out    p1actl
  148.     mvi    a,bitmask
  149.     out    p1actl
  150. ;       Init CTC
  151.     mvi    a,43h        ; reset
  152.     out    ctc0
  153.     out    ctc1
  154.     out    ctc2
  155.     out    ctc3
  156.     mvi    a,47h        ; reset & load
  157.     out    ctc0
  158.     mvi    a,13
  159.     out    ctc0
  160.     mvi    a,47h        ; reset & load
  161.     out    ctc1
  162.     mvi    a,13
  163.     out    ctc1
  164.     mvi    a,47h        ; reset & load
  165.     out    ctc2
  166.     mvi    a,13
  167.     out    ctc2
  168.     mvi    a,47h        ; reset & load
  169.     out    ctc3
  170.     mvi    a,125
  171.     out    ctc3
  172. ;       Init second PIO
  173.     mvi    a,modebit
  174.     out    p2actl
  175.     mvi    a,0ffh
  176.     out    p2actl
  177.     mvi    a,modebit
  178.     out    p2bctl
  179.     mvi    a,0c0h
  180.     out    p2bctl
  181.     xra    a
  182.     out    p2bdata
  183. ;       Init LCD Display
  184.     mvi    a,intoff
  185.     out    lcdctl
  186.     mvi    a,intctl
  187.     out    lcdctl
  188.     mvi    a,modebit
  189.     out    lcdctl
  190.     mvi    a,0ffh
  191.     out    lcdctl
  192.     xra    a
  193.     out    lcdrs
  194.     out    lcdrw
  195.     out    lcdena
  196. ;       Init SIOs
  197.     lxi    h,s1atab
  198.     mvi    c,s1actl
  199.     mvi    b,s1alen
  200.     outir
  201.     mvi    c,s1bctl
  202.     mvi    b,s1blen
  203.     outir
  204.     mvi    c,s2actl
  205.     mvi    b,s2alen
  206.     outir
  207.     mvi    c,s2bctl
  208.     mvi    b,s2blen
  209.     outir
  210.     in    s1adata
  211.     in    s1bdata
  212.     in    s2adata
  213.     in    s2bdata
  214. ;
  215. ;-----------------------------------------------------------------------
  216. ;       Init of target system complete, go to monitor entry.
  217. ;
  218.     jmp    monent
  219. ;
  220. ;       SIO Init tables
  221. ;
  222. s1atab:
  223.     db    18h,18h
  224.     db    4,01000100B
  225.     db    3,11000001B
  226.     db    5,01101000B
  227.     db    1,00000100B
  228. ;
  229. s1alen    equ    $-s1atab
  230. ;
  231. s1btab:
  232.     db    18h,18h
  233.     db    4,01000100B
  234.     db    3,11000001B
  235.     db    5,01101000B
  236.     db    2,s1itab
  237.     db    1,00000100B
  238. ;
  239. s1blen    equ    $-s1btab
  240. ;
  241. s2atab:
  242.     db    18h,18h
  243.     db    4,01000100B
  244.     db    3,11000001B
  245.     db    5,01101000B
  246.     db    1,00000100B
  247. ;
  248. s2alen    equ    $-s2atab
  249. ;
  250. s2btab:
  251.     db    18h,18h
  252.     db    4,01000100B
  253.     db    3,11000001B
  254.     db    5,01101000B
  255.     db    2,s2itab
  256.     db    1,00000100B
  257. ;
  258. s2blen    equ    $-s2btab
  259. ;
  260. ;
  261. ;
  262. ;    initsystem:    initialise
  263. ;
  264. ;        entry:    -
  265. ;
  266. ;        exit:    -
  267. ;
  268. ;        uses:    may use all registers
  269. ;
  270. ;       Initialises all debugger variables.
  271. ;
  272. initsystem:
  273.     xra    a
  274.     sta    chrbuf
  275. ;
  276.     lxi    h,8000h
  277.     shld    listaddr
  278.     shld    dumpaddr
  279.     shld    asmaddr
  280.     IF    hilo
  281.     shld    lowval
  282.     shld    highval
  283.     shld    maxval
  284.     ENDIF
  285.     shld    regpc
  286.     lxi    h,varbase-1
  287.     shld    topval
  288.     lxi    d,0
  289.     mov    m,d
  290.     dcx    h
  291.     mov    m,e
  292.     shld    regsp        ; set sp to bottom, with retaddr = debexit
  293. ;
  294.     lxi    h,prot
  295.     lxi    d,protexpbuf
  296.     lxi    b,protl
  297.     ldir
  298.     call    syminit
  299. ;
  300.     lxi    h,hallo
  301.     call    wrstr
  302.     ret
  303. ;
  304. hallo:
  305.     db    'WADE 1.5',0
  306. ;
  307. prot:
  308.     db    'RPC<8000',0
  309. protl    equ    $-prot
  310. ;
  311. ;
  312. ;    initcio:    initialise console I/O
  313. ;
  314. ;        entry:    -
  315. ;
  316. ;        exit:    -
  317. ;
  318. ;        uses:    may use all registers
  319. ;
  320. initcio:
  321.     ret
  322. ;
  323. ;
  324. ;------------------------------------------------------------------------------
  325. ;
  326. ;
  327. ;    rdchar:        read char from console
  328. ;
  329. ;        entry:    -
  330. ;
  331. ;        exit:    A = character
  332. ;
  333. ;        uses:    -
  334. ;
  335. rdchar:
  336.     call    pollch
  337.     jrz    rdchar
  338.     lda    chrbuf
  339.     ora    a
  340.     jrz    getsio
  341.     push    psw
  342.     xra    a
  343.     sta    chrbuf
  344.     pop    psw
  345.     jr    rdcw
  346. getsio:
  347.     in    siodata
  348.     ani    7fh
  349. rdcw:
  350.     cpi    6
  351.     rnc
  352.     cpi    4
  353.     rc
  354.     call    block
  355.     jmp    rdchar
  356. ;
  357. ;
  358. ;    pollch:        test if console input available
  359. ;            (should abort macro if active and char available)
  360. ;
  361. ;        entry:    -
  362. ;
  363. ;        exit:    A <> 0 if input available, flags set
  364. ;
  365. ;        uses:    -
  366. ;
  367. pollch:
  368.     lda    chrbuf
  369.     ora    a
  370.     jrnz    pollok
  371.     in    sioctl
  372.     ani    rca
  373.     rz
  374. pollok:
  375.     ori    0ffh
  376.     ret
  377. ;
  378. ;
  379. ;    wrchar:        write char to console
  380. ;
  381. ;        entry:    A = character
  382. ;
  383. ;        exit:    -
  384. ;
  385. ;        uses:    -
  386. ;
  387. wrchar:
  388.     push    psw
  389. wrcwt:
  390.     in    sioctl
  391.     ani    tbe
  392.     jrz    wrcwt
  393. wrcwxon:
  394.     pop    psw
  395.     out    siodata
  396.     push    psw
  397.     push    h
  398. waitecho:
  399.     lxi    h,7fffh
  400. wrecho:
  401.     in    sioctl
  402.     ani    rca
  403.     jrnz    gotecho
  404.     dcx    h
  405.     mov    a,h
  406.     ora    l
  407.     jrnz    wrecho
  408.     pop    h
  409.     pop    psw
  410.     ret
  411. ;
  412. gotecho:
  413.     in    siodata
  414.     ani    7fh
  415.     cpi    1
  416.     jrnz    noecho
  417.     pop    h
  418.     pop    psw
  419.     ret
  420. ;
  421. noecho:
  422.     sta    chrbuf
  423.     jr    waitecho
  424. ;
  425. ;
  426. block:
  427.     push    b
  428.     push    h
  429.     mov    c,a
  430.     mvi    a,2
  431.     call    blkwrite
  432. ;
  433.     call    blkread
  434.     mov    l,a
  435.     call    blkread
  436.     mov    h,a
  437.     mvi    b,128
  438.     mov    a,c
  439.     cpi    5
  440.     jrz    rblock
  441. wblock:
  442.     call    blkread
  443.     mov    m,a
  444.     inx    h
  445.     djnz    wblock
  446.     pop    h
  447.     pop    b
  448.     ret
  449. ;
  450. blkread:
  451.     in    sioctl
  452.     ani    rca
  453.     jrz    blkread
  454.     in    siodata
  455.     ret
  456. ;
  457. rblock:
  458.     mov    a,m
  459.     call    wrchar
  460.     inx    h
  461.     djnz    rblock
  462.     pop    h
  463.     pop    b
  464.     ret
  465. ;
  466. blkwrite:
  467.     push    psw
  468. blkwrlp:
  469.     in    sioctl
  470.     ani    tbe
  471.     jrz    blkwrlp
  472.     pop    psw
  473.     out    siodata
  474.     ret
  475. ;
  476. ;------------------------------------------------------------------------------
  477. ;
  478. killmac:
  479. jmacro:
  480. userdef:
  481. read:
  482. write:
  483. file:
  484.     ret
  485. ;
  486. ;
  487. ;
  488. restartinst    equ    0cfh    ; RST 08
  489. restartloc    equ    08h
  490. ;
  491. ;
  492.     public    restart,rstloc
  493. ;
  494.     public    goto
  495. ;
  496. ;
  497. ;    goto:        enter program
  498. ;
  499. ;        entry:    cbank = bank
  500. ;            regpc = address to go to
  501. ;            regsp = user stack pointer
  502. ;            regiff = interrupt enable flag
  503. ;            all registers restored except SP and interrupt status
  504. ;            interrupts are disabled.
  505. ;
  506. ;        exit:    no exit
  507. ;
  508. ;        uses:    N/A
  509. ;
  510. ;    NOTE:    this routine must insert a jump to the break-entry at the
  511. ;        restart address. If the monitor is in banked memory, this
  512. ;        break-entry must be in common.
  513. ;
  514. goto:
  515.     push    psw
  516.     IF    disint
  517.     lda    regiff
  518.     ani    1
  519.     jrz    gotodi
  520.     ENDIF
  521.     pop    psw
  522.     lspd    regsp
  523.     push    h
  524.     lhld    regpc
  525.     xthl
  526.     IF    disint
  527.     EI
  528.     ret
  529. ;
  530. gotodi:
  531.     pop    psw
  532.     lspd    regsp
  533.     push    h
  534.     lhld    regpc
  535.     xthl
  536.     ENDIF
  537.     ret
  538. ;
  539. setrst:
  540. resetrst:
  541.     ret
  542. ;
  543. ;
  544. restart    db    restartinst
  545. rstloc    db    restartloc
  546. ;
  547. ;
  548. ;
  549. ;------------------------------------------------------------------------------
  550. ;
  551.     dseg
  552. ;
  553. varbase:
  554. ;
  555. chrbuf    ds    1
  556. ;
  557.     end    start
  558. 
  559.