;
;                       termemu1.asm
;                       by charles shoemaker
;                       published in 4/81 byte mag.
;
;       the lear siegler adm-3 emulator for the hazeltine
;       1500 terminal.
;
       org     7fb4h   ;fix cpm outch routine to jump here
       jmp     entry
;
       org     8000h   ;put after bios
;
entry:  lda     mode    ;are we in the middle of something?
       ora     a
       mov     a,c     ;get character to send, for compares
       jz      norm    ;ordinary
       jpe     xy      ;if jump taken, norm contains either 3 or 255
       cpi     '='     ;middle of xy address sequence
       mvi     a,0     ;preset error condition
       sta     mode
       jnz     zap     ;something's wrong--print it and give up
       mvi     a,3     ;fix up
       sta     mode    ;tell us next time
       ret             ;and back
;
norm:   cpi     30      ;test for home character
       jc      nthome
       jnz     zap     ;not a control character--send it
       mvi     c,18    ;get hazel's home character
       jmp     specl   ;do it
nthome: cpi     11      ;is it up-cursor?
       jz      specl-1 ;quick trick
       cpi     12      ;is it right-cursor?
       jnz     ntrght  ;no---
       mvi     a,16    ;hazel's right-cursor
       jmp     zap
ntrght: cpi     27      ;is it escape-address cursor?
       jnz     ntesc
       mvi     a,1     ;tell us next time through
       sta     mode
       ret
;
ntesc:  cpi     26      ;is it clear screen?
       jnz     outch   ;no, must be some other control character
       inr     c       ;make 28, hazel's clear screen character
       inr     c
specl:  mvi     a,126   ;get her attention
       call    zap     ;send the first character right away
outch:  mov     a,c     ;retrieve original character
       push    psw     ;stow it away
       in      10h     ;gotta check status
       ani     2
       jz      outch+2
       pop     psw     ;get it back
zap:    out     11h     ;send it
       ret             ;finally, return to caller
;
xy:     jm      final   ;we know we have 'esc' '=' sequence
                       ;see if this is x or y character
                       ;take the jump if this is x
       mov     a,c     ;just get y character
       sta     y       ;and save it
       mvi     a,0ffh  ;let us know what to do next time
       sta     mode
       ret
;
final:  push    b       ;save x character a minute
       mvi     c,17    ;get hazel's attention
       call    specl
       pop     b       ;get'm back
       mov     a,c     ;get x coordinate
       sui     32      ;get rid of adm-3 bias
       cpi     31      ;fix hazel's bias
       jnc     sendx   ;ok as is
       adi     96      ;hazel likes this better
sendx:  call    outch+1 ;send x
       xra     a       ;fix mode up--back to normal
       sta     mode
       lda     y       ;adm-3 bias ok for hazel
       jmp     outch+1 ;send it and go home
;
mode:   db      0
y:      db      0
;
       end