home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / sysutl / ykey21.lbr / YK-EXAMP.LBR / USER201.ZZZ / USER201.AZM
Text File  |  1987-12-11  |  13KB  |  413 lines

  1. ; ***********************************************
  2. ;     PART III  -  THE NEW BIOS CODE
  3. ; ***********************************************
  4.  
  5. ; LOADUSER.AZM          (loads USER20.AZM)       11-24-87
  6. ; A replacement USER.ASM for N* Adv by R. Gaspari
  7.  
  8. UCODE: 
  9. OU       EQU    USORG-UCODE      ; offset 
  10.  
  11. ROW    EQU    0            
  12. COL    EQU    50        ; location of pop-up clock display
  13.                 
  14. CA1    EQU    1BH        ; cursor addressing sequence
  15. CA2    EQU    '='        
  16. CA3    EQU    ROW+20H        
  17. CA4    EQU    COL+20H        
  18.                     
  19. CI1    EQU    19H        ; make cursor invisible (byte 1)
  20. CI2    EQU    01H        ;                 byte 2
  21. CV1    EQU    18H        ; cursor visible code   (byte 1)
  22. CV2    EQU    02H        ;             byte 2
  23.  
  24. ;
  25. ; JUMP VECTOR (SEMI-TRADITIONAL)
  26. ;
  27. USERORG EQU    $+OU        ; ORIGIN FOR REFERENCE
  28.     JP    INIT        ; INITIALIZATION CODE
  29.     JP    CONST        ; CONSOLE READY TEST
  30.     JP    CONIN        ; CONSOLE INPUT
  31.     JP    CONOUT        ; CONSOLE OUTPUT
  32.     JP    LIST        ; LIST DEVICE
  33.     JP    LIST        ; PUNCH ## (deleted to make room)
  34.     JP    TIME        ; READER   (deleted, used for time)
  35.     JP    LISTST        ; LIST DEVICE READINESS TEST
  36. ;
  37. ; CONCLUDE VECTOR WITH BAUD RATES
  38. ; THE PRINTER RATE (BAUDA) IS ALTERED BY CPMGEN
  39. BAUDA   EQU     $+OU        ; Start-up baud rate for Adv slot 1
  40.         DEFB    112        ; 112 = 1200 baud 
  41. BAUDB   EQU     $+OU        ; Start-up baud rate for slot 2
  42.         DEFB    126        ; 126 = 9600 baud 
  43. BAUDC   EQU     $+OU        ; Startup for slot 3
  44.         DEFB    120        ; 127=19200; 124=4800; 120=2400; 96=600
  45. ;
  46. ; ********** END OF VECTOR ***********************
  47. ENDVECT EQU    $        ; MARK FOR LATER ORIGIN
  48. ;
  49. ;
  50. ; *****    ENTRY POINTS INTO "UPPER" BIOS ***********************
  51. ;
  52. ;    ORG    USERORG+200H    ; JUST BEYOND USER AREA
  53. ; ACTUAL CONSOLE ROUTINES ARE ENTERED ABOVE USER AREA
  54. CONSLI    EQU   USERORG+200H    ; ACTUAL KEYBOARD INPUT  ROUTINE
  55. CONSLO    EQU   USERORG+200H+3    ; ACTUAL KEYBOARD OUTPUT ROUTINE
  56. ;         
  57. ; MACHINE REGISTERS MAP0,MAP1,MAP2,CONTROL,TOP-SCAN-LINE
  58. ;     ARE MANAGED THROUGH THE ROUTINES BELOW:
  59. ;     ENTER WITH REG C=REG# 0 TO 4 RESPECTIVELY
  60. ;     VALUE RETURNED/SUPPLIED IN REG B
  61. RDREG    EQU   USERORG+200H+6   ; READ  MACHINE REGISTER
  62. WRREG    EQU   USERORG+200H+9   ; WRITE MACHINE REGISTER
  63. ;         
  64. ; MUST SERVICE OFTEN WHILE HUNG IN I/O WAIT LOOPS:
  65. OFTENS    EQU   USERORG+200H+12    ; CALL TO SERVICE OFTEN
  66. ; ROUTINE TOGGLES SPEAKER CONE
  67. SPTOG    EQU    USERORG+200H+15    ; TOGGLE SPEAKER
  68. ;
  69. ;
  70. ; ************ BOARDLET I/O PORT DEFINITIONS ***********
  71. ;
  72. ; THE CP/M LIST DEVICE IS DEFINED AS PORT "A"
  73. ; IT IS HERE ASSIGNED TO BOARDLET 1
  74. PORTAB    EQU    1        ; BOARDLET 1
  75. PORTA    EQU    (6-PORTAB)*16    ; BEGINNING OF BLOCK
  76. PORTAT    EQU    76H-PORTAB    ; INTERROGATE FOR TYPE
  77. ;
  78. ; THIS INITIALIZES ADVANTAGE SLOT 2
  79. PORTBB    EQU    2        ; BOARDLET 2
  80. PORTB    EQU    (6-PORTBB)*16    ; BEGINNING OF BLOCK
  81. PORTBT    EQU    76H-PORTBB    ; SERIAL OR PARALLEL?
  82. ;
  83. ; THIS INITIALIZES ADVANTAGE SLOT 3
  84. PORTCB    EQU    3        ; BOARDLET 3
  85. PORTC    EQU    (6-PORTCB)*16    ; FIRST PORT IN BOARDLET
  86. PORTCT    EQU    76H-PORTCB    ; DETERMINES BOARLET TYPE
  87. ;
  88. ;
  89. ; WHEN THE PORT TYPE IS INTERROGATED, VALUES INPUT ARE:
  90. BLTSER    EQU    0F7H        ; BOARDLET IS SERIAL
  91. BLTPAR    EQU    0DBH        ; BOARDLET IS PARALLEL
  92. ; *******************************************************
  93. ;
  94.     ORG    ENDVECT        ; RESUME AT ABOVE MARKED LOCATION
  95. ;
  96. ;
  97. ;
  98. ; *** CONSOLE STATUS TEST FOR DATA READY
  99. CONST   EQU     $+OU
  100.     CALL    CLKPOP        ; if pop-up clk in effect, display it 
  101.     CALL    0F60Ch        ; SERVICE OFTEN FOR SCROLL, ETC.
  102.     IN    A,(0D0H)    ; INTERROGATE KEYBOARD STATUS
  103.     AND    040H        ; TEST KEYBOARD READY BIT
  104.     RET    Z        ; NO DATA, RETURN WITH A=0
  105. CONS2:  LD    A,0FFH        ; DATA WAITING, SEND FF
  106.     RET
  107. CLKPOP    EQU    $+OU
  108.     LD    A,(CLKFLG)    ; see if pop-up flag is set 
  109.     OR    A        
  110.     RET    Z        ; if no, return to call clkpop
  111.     LD    HL,CLKCTR    ; if yes, get the delay counter
  112.     INC    (HL)        ; display clk only every 256 iterations
  113.     RET    NZ        ; if NZ, go back to call clkpop
  114.     JP    CDSP         ; otherwise, display clock 
  115. CLKFLG    EQU    $+OU
  116.     DB    0        ; set 0FFh for continuous pop-up display
  117. CLKCTR    EQU    $+OU
  118.     DB    0        ; temp storage for 256 state counter
  119.  
  120. ; *** CONSOLE INPUT  ## Complete overhaul of CONIN routine. ##
  121. CONIN   EQU     $+OU        ; relocated conin, coninl is local
  122. CONINL: CALL    CONST        ; check status (again)
  123.     JR    Z,CONINL    ; loop until status says we're ready
  124.     CALL    0F600H         ; get the byte using upper bios
  125. ;       CP    9BH        ; see if it's CMND-F1 
  126. ;    JR    NZ,CN9B       ;    (single pop-up clock request)
  127. ;    CALL    CDSP        ;    if yes, display clock
  128. ;    JR     CONINL        ;    and go back for next input
  129. CN9B:    CP    9BH        ; see if it's CMND-F1 
  130.     JR    NZ,CN9C      ;    (continuous pop-up clk display)
  131.     LD    A,(CLKFLG)    ; prepare to toggle the pop-up flag
  132.     CPL            ; complement the accumulator
  133.     LD    (CLKFLG),A    ; store the toggled flag
  134.     JR    CONINL        ; go back for next input
  135. CN9C:    CP    7FH        ; see if it's a "delete"
  136.     RET    NZ        ; if not, return with it the input byte
  137.     LD    A,7FH        ; if yes, get the 7F replacement
  138.     RET            ; and return with it
  139.  
  140.  
  141.  
  142. ; *** CONSOLE OUTPUT
  143. CONOUT  EQU     $+OU
  144.     JP    0F603H        ; SO SEND CHAR TO CONSOLE
  145. ;
  146. ;
  147. ; *****  BOARDLET I/O HANDLING **************************
  148. ; *****    CP/M'S "LIST" DEVICE - USES "PORTA" DEFINED ABOVE
  149. ;
  150. LIST    EQU     $+OU
  151. LISTX:    CALL    LISTST        ; USE STATUS TEST BELOW
  152.     JR    Z,LISTX        ; LOOP UNTIL READY
  153.     IN    A,(PORTAT)    ; DETERMINE TYPE OF PORT
  154.     CP    BLTSER        ; SEE IF SERIAL
  155.     JR    Z,LISTSER    ; YES, SKIP INSTRUCTION BELOW
  156.     OUT    (PORTA+4),A    ; RESET PO-FLAG 
  157. LISTSER: LD    A,C        ; STAGE BYTE INTO A
  158.     OUT    (PORTA),A    ; SEND IT
  159.     RET            ; AND EXIT
  160. ;
  161. ; *** LIST DEVICE STATUS TEST *** USES PORTA
  162. LISTST  EQU     $+OU
  163.     CALL    OFTENS        ; SERVICE OFTEN FOR SCROLL
  164.     LD    B,1        ; READY BIT FOR SERIAL PORT
  165.     IN    A,(PORTAT)    ; DETERMINE TYPE OF PORT A
  166.     CP    BLTSER        ; SEE IF SERIAL
  167.     JR    Z,LTTSER    ; YES SKIP NEXT INSTR
  168.     LD    B,4        ; PARALLEL PORT READY MASK
  169. LTTSER: IN    A,(PORTA+1)    ; INTERROGATE CONTROL PORT
  170.     AND    B        ; VS. READY MASK
  171.     RET    Z        ; DONE, Z=NOT READY
  172.     OR    0FFH        ; READY, MAKE ALL ONES
  173.     RET
  174.  
  175. ;
  176. ;*****    CP/M'S "READER" DEVICE - Code deleted to make room 
  177. ;READER    
  178. ;
  179. ;*****    CP/M "PUNCH" DEVICE - Code deleted to make room 
  180. ;PUNCH    
  181. ;
  182. ; ****** INITIALIZATION ROUTINE *******************
  183.  
  184. INIT    EQU    $+OU        ; INITIALIZATION
  185.     XOR    A        ; INITIALIZE BYTE 3 & 4
  186.     LD    (3),A        ; SET THE "IOBYTE" TO "STANDARD"
  187.     LD    (4),A        ; SET CURRENT DISK TO A: & USER=0
  188.  
  189. ; INITIALIZE "BOARDLET"S FOR SERIAL OR PARALLEL I/O
  190. ; START WITH PORT A - NORMALLY THE PRINTER
  191.     LD    A,(BAUDA)    ; STAGE BAUD RATE IN CASE SERIAL
  192.     LD    D,A        ; IN D REGISTER
  193.     IN    A,(PORTAT)    ; TEST PORT A TYPE
  194.     LD    HL,INITAS    ; SERIAL INIT STRING
  195.     LD    BC,5*256+PORTA+1 ; B=5 COUNT, C=UART CMD PORT
  196.     CALL    INITCOM        ; USE COMMON ROUTINE
  197.     IN    A,(PORTA)    ; CLEAR ANY JUNK
  198.     JR    NZ,INITB0    ; DONE IF NOT PARALLEL
  199.     OUT    (PORTA+5),A    ; SET PO-FLAG FOR PARALLEL PORT
  200. ;
  201. ; INITIALIZE ADV SLOT 2
  202. INITB0:    LD    A,(BAUDB)    ; STAGE BAUD RATE IN CASE SERIAL
  203.     LD    D,A        ; IN D REGISTER
  204.     IN    A,(PORTBT)    ; GET BOARD TYPE
  205.     LD    HL,INITBS    ; SERIAL INIT STRING
  206.     LD    BC,5*256+PORTB+1 ; B=5 COUNT, C=UART CMD PORT
  207.     CALL    INITCOM
  208.     IN    A,(PORTB)    ; CLEAR ANY JUNK
  209.     JR    NZ,INITC0    ; DONE IF NOT PARALLEL
  210.     OUT    (PORTB+6),A    ; RESET PI-FLAG 
  211.  
  212. ; INITIALIZE ADV SLOT 3
  213. INITC0:    LD    A,(BAUDC)    ; STAGE BAUD RATE IN CASE SERIAL
  214.     LD    D,A        ; IN D REGISTER
  215.     IN    A,(PORTCT)    ; GET PORT C TYPE
  216.     LD    HL,INITCS    ; SERIAL INIT STRING
  217.     LD    BC,5*256+PORTC+1 ; B=5 COUNT, C=UART CMD PORT
  218.     CALL    INITCOM
  219.     IN    A,(PORTC)    ; CLEAR ANY JUNK
  220.     JR    NZ,INITC9    ; DONE IF NOT PARALLEL
  221.     OUT    (PORTC+5),A    ; INIT PO-FLAG ON AS IF JUST ACK'ED
  222.  
  223. INITC9: RET                ; END OF BOARDLET INITIALIZATION
  224.  
  225.  
  226. ; COMMON SUBROUTINE TO TEST BOARDLET TYPE   ## Patch to known board type 
  227. ; IF SERIAL, OUTPUT INITIALIZATION STRING
  228. ; REGS MUST BE: A=BOARDLET-TYPE, B=INITSTRING-LENGTH, C=COMMAND PORT
  229. ;           D=BAUD-RATE-FACTOR, HL@INITSTRING
  230. INITCOM EQU     $+OU
  231.         CP    BLTSER        ; SEE IF SERIAL PORT
  232.      JR    NZ,INITCP    ; NOT SERIAL, GO TEST IF PARALLEL
  233.     DEFB    0EDH,0B3H    ; Z80 OTIR INSTRUCTION, SENDS INIT STR
  234.     LD    A,C        ; NOW CHANGE I/O PORT
  235.     ADD    A,7        ; FROM UART COMMAND TO BAUD RATE
  236.     LD    C,A        ; C=BAUD RATE PORT
  237.     DEFB    0EDH,51H    ; Z80 OUT (C),D  (BAUD RATE FROM D)
  238.     RET            ; EXIT (NOTE Z FLAG IS OFF)
  239.  
  240. INITCP:    CP    BLTPAR        ; SEE IF PARALLEL PORT
  241.      RET            ; SO Z ON IFF PARALLEL PORT
  242.  
  243. ; INITIALIZATION STRINGS FOR 8251 USARTS ON SERIAL BOARDLETS
  244. INITAS   EQU     $+OU
  245. INITBS   EQU     $+OU
  246. INITCS   EQU     $+OU
  247.          DEFB    80H,80H        ; FILLERS TO INSURE KNOWN STATE
  248.      DEFB    40H        ; INTERNAL RESET COMMAND
  249.      DEFB    0CEH        ; 2 STOPS, NO PARITY, 8 DATA BITS, 16X CLK
  250.      DEFB    37H        ; RTS, ER, RXE, DTR, TXE COMMAND
  251. ;INITBS: DEFB    80H,80H,40H,0CEH,37H ; SAME AS FOR A
  252. ;INITCS: DEFB    80H,80H,40H,0CEH,37H ; SAME AS FOR A
  253.          
  254. CSTACK    EQU    $+OU        ; stack grows into init area above
  255.     DW    0        ; storage for old stack pointer
  256.  
  257.  
  258. ; ****************************************
  259. ;    PART IIIb  -  CLOCK READ ROUTINE
  260. ; ****************************************
  261.  
  262.  
  263. TIME    EQU    $+OU        ; routine returns with pointer in HL
  264.     DI            
  265.     PUSH    IX        ; find addr of current fcb
  266.     POP    HL        ; put it in accum
  267.     LD    A,H        
  268.     CP    40H        ; see if fcb located above 4000h
  269.     PUSH    AF        ; @2 save carry flag
  270.     LD    A,84H        
  271.     JR    C,TSKIP        ; if below 4000h, map high
  272.     OUT    0A0H,A        ; otherwise, map PROM onto 0000 - 4000h
  273.     LD    DE,0004H    ; & read memory in the PROM space
  274.     JR    TDONE        
  275. TSKIP:    OUT    0A1H,A        ; map PROM onto 4000h - 8000h
  276.     LD    DE,4004H    ; & read memory in the PROM space
  277. TDONE:    LD    A,(DE)        ; the first read is just for a reset
  278.     DEC    DE        ; enable done with 0003h & 0002h
  279.  
  280.     LD    HL,TIMREG    ; 1. - CLOCK ENABLE routine
  281.     LD    A,(HL)        ; get first byte of recog sequence
  282. TIEBYT: LD    B,A        ; b contains byte
  283.     LD    C,8        ; do this for 8 bits
  284. TIEBIT:    SRL    B        ; 0->b7...b0->carry
  285.     JR    NC,TIEX1
  286.     LD    A,(DE)        ; WRITE with bit A2 low & bit A0 high
  287.     JR    TIEX2        
  288. TIEX1:    DEC    DE
  289.     LD    A,(DE)        ; WRITE with bit A2 low & bit A0 low
  290.     INC    DE
  291. TIEX2:    DEC    C
  292.     JR    NZ,TIEBIT     ; do all 8 bits
  293.     INC    HL        ; point to next byte
  294.     LD    A,(HL)        ; get next byte
  295.     OR    A        ; set zero flag
  296.     JR    NZ,TIEBYT     ; do next byte til code enable complete
  297. TIREAD:    INC    DE        ; 2. - CLOCK READ routine
  298.     LD    HL,TIBUF+7    ; set up buffer
  299.     LD    C,8        ; do 8 bytes
  300. TIRBYT:    LD    B,8        ; do 8 bits
  301. TIRBIT:    LD    A,(DE)
  302.     SRL    A        ; shift bit into carry
  303.     RR    (HL)        ; shift bit into (hl)
  304.     DEC    B        ; dec bit counter
  305.     JR    NZ,TIRBIT    ; read next bit
  306.     DEC    HL        ; point to next buf location
  307.     DEC    C        ; dec byte counter
  308.     JR    NZ,TIRBYT    ; read next byte
  309.  
  310.     LD    DE,TIBUF+3    ; point to weekday
  311.     INC    HL        ; point to year
  312.     LD    A,(DE)        ; get weekday
  313.     LD    B,(HL)        ; get year 
  314.     LD    (HL),A        ; overwrite weekday onto year 
  315.     LD    A,B        ; get year 
  316.     LD    (DE),A        ; write year onto weekday
  317.     LD     HL,TIBUF+1    ; point to "month" before RET
  318.     POP    AF        ; @2 get carry flag back again
  319.     LD    A,0         
  320.     JR    C,TSKP2        ;
  321.     OUT    0A0H,A        ; map normal RAM onto 0000h - 4000h
  322.     JR    TDON2
  323. TSKP2:    INC    A        ; set A=1
  324.     OUT    0A1H,A        ; map normal RAM onto 4000h - 8000h
  325. TDON2:    EI            
  326.       RET             ; and return from TIME
  327.  
  328. TIMREG    EQU    $+OU
  329.     DB    0c5h,3ah,0a3h,5ch    ; comparison reg
  330.     DB    0c5h,3ah,0a3h,5ch,0    ; definition
  331.  
  332. TIBUF    EQU    $+OU        ; (example) Tues 10/20/87 5:15pm
  333.     DB    0          ; year       (87h)
  334.     DB    0        ; month      (10h)
  335.     DB    0        ; day         (20h)
  336.     DB    0        ; weekday       (03h) [year]
  337.     DB    0        ; hour        (17h)
  338.     DB    0        ; minutes    (15h)
  339.     DB    0,0        ; seconds    (0000) 
  340.  
  341. ; ****************************************
  342. ;    PART IIIc  -  POP-UP CLOCK DISPLAY 
  343. ; ****************************************
  344.  
  345. BIOSOUT EQU    USORG+0203H    ; bios conout for Northstar Adv
  346. BIOSCUR EQU    USORG+021EH    ; current cursor location x & y
  347.  
  348. CDSP       EQU    $+OU        ; clock display code
  349.     LD    (CSTACK),SP    ; save orig stack pointer
  350.     LD    SP,CSTACK    ; point to local stack
  351.     LD    HL,(BIOSCUR)    ; get current cursor location
  352.     PUSH    HL        ; save it (@1)
  353.     CALL    TIME         ; call TIME & retn with pointer
  354.  
  355.     LD    B,6        ; convert 6 bcd bytes to ascii
  356.     LD    DE,CDABUF+7     ; point to start of ascii data buffer
  357. CDS2:    LD    A,(HL)        ; get the bcd data byte
  358.     CALL    CDASC        ; convert it & store at DE & DE+1
  359.     INC    HL        ; point to next bcd data
  360.     INC    DE        ; point to next ascii buffer loc
  361.     DEC    B        ; countdown 6 bcd bytes 
  362.     JR    NZ,CDS2        ;      
  363.             
  364.     LD    HL,CDABUF    ; point HL to start of cdabuf
  365.     LD    B,25        ; count 25 bytes to send out
  366. CDS4:    LD    C,(HL)        ; get the byte to send to console
  367.     CALL    BIOSOUT       ; send out via bios conout
  368.     INC    HL        ; point to next loc
  369.     DEC    B        ; continue for all 25 bytes 
  370.     JR    NZ,CDS4
  371.  
  372.     POP    HL        ; get orig cursor location
  373.     LD    (BIOSCUR),HL    ; put cursor back in bios
  374.     LD    C,CV1        ; code to make cursor visible again
  375.     CALL    BIOSOUT        ; send it out via bios
  376.     LD    C,CV2        ;     byte 2 of "cursor visible"
  377.     CALL    BIOSOUT        ;    send it out
  378.     LD    SP,(CSTACK)    ; restore orig stack
  379.     XOR    A        ; load 0 into A before ret
  380.     RET             ; normal retn from CDSP 
  381.         
  382. CDABUF    EQU    $+OU
  383.     DB    CI1,CI2        ; make cursor invisible
  384.     DB    CA1,CA2,CA3,CA4    ; move to location row & col
  385.     DB    ' '        ; 
  386.     DB    0,0,'/'        ; month    ascii
  387.     DB    0,0,'/'        ; day    ascii
  388.     DB    0,0,' '        ; year    ascii
  389.     DB    0,0,':'        ; hour    ascii
  390.     DB    0,0,':'        ; min    ascii
  391.     DB    0,0,' '        ; sec    ascii
  392.         
  393. CDASC    EQU    $+OU        ; bcd to ascii conversion
  394.     LD    C,A        ; save incoming byte for later
  395.     RLCA             ; shift right 4 times
  396.     RLCA            ; (or left 4 times)
  397.     RLCA            ;
  398.     RLCA            ;
  399.     CALL    CDAS2        ; convert and store
  400.     LD    A,C        ; get byte back
  401. CDAS2    EQU    $+OU
  402.     AND    0FH        ; mask lower nibble
  403.     OR    30H        ; convert to ascii
  404.     LD    (DE),A        ; store it
  405.     INC    DE        ; move to next loc for next nibble
  406.     RET            ; retn CDAS2 & retn CDASC
  407.  
  408.  
  409.  
  410. UREF1    EQU    $        ; location of end of code (local)
  411. UREF2    EQU    $+OU        ; location of end (after it's moved)
  412. USIZE   EQU     $-UCODE         ; the size of code to be moved
  413.