CDL Z80 MACRO III Assembler C12012- 414X Page 1 85/12/04 15:33:00 High Bios For Turbo-ROM 1-1 Macros and Constants 4 5 6 .phex 7 .xlink 8 9 ;****************************************************** 10 ; UNIVERSAL HIGH-BIOS FOR TURBO ROM 11 ; 12 ; Copyright 1985 (c), Plu*Perfect Systems 13 ; P.O. Box 1494 14 ; Idyllwild, California 92349 15 ; 16 ;****************************************************** 17 18 .remark " 19 This code is provided for the use of owners of the 20 Advent Products Turbo ROM (Kaypro versions). It 21 relies heavily on the presence of the Turbo ROM 22 and will not work without it" 23 24 ;********************************************** 25 ;fill memory up to address with nulls 26 .define PADBYT[addr]=[ 34 .define XENTRY[name]=[ 0000 42 xcount = 0 0000 43 xstart == xcount ;Restart Computer 44 .slist 3 46 XENTRY xdskrst ;(de-activate HOST buffer) 6 47 XENTRY xcrtnit ;initialise video driver 9 48 XENTRY xdevnit ;(initialise unit record hardware) C 49 XENTRY xhome ;(de-activate HOST buffer only if not written) F 50 XENTRY xseldsk ;Select disk for next access 2 51 XENTRY xsettrk ;Set track for next disk access 5 52 XENTRY xsetsec ;Set sector for next disk access 8 53 XENTRY xsetdma ;Set DMA Address for next disk access B 54 XENTRY xread ;Read Sector E 55 XENTRY xwrite ;Write Sector 1 56 XENTRY xsctrn ;Sector Translation (Dummy) 4 57 XENTRY xdskon ;Trun on Floppy motors 7 58 XENTRY xdskoff ;Turn off/deselect drives and flush deblocking A 59 XENTRY xcrtsta ;Standard Keyboard input status D 60 XENTRY xcrtin ;Standard Keyboard input 0 61 XENTRY xkbdout ;Keyboard Serial output (Use with Caution) 3 62 XENTRY xttysta ;TTY input status 6 63 XENTRY xttyin ;get char from TTY 9 64 XENTRY xttyout ;send (C) to TTY C 65 XENTRY xlptsta ;Centronics output status F 66 XENTRY xlptout ;send (C) to Centronics 2 67 XENTRY xttosta ;TTY output status 5 68 XENTRY xcrtout ;send (C) to video screen 8 69 XENTRY xtmsec ;delay (A) ten millseconds B 70 XENTRY xul1sta ;User List input status E 71 XENTRY xul1in ;User List input 1 72 XENTRY xul1out ;User List output CDL Z80 MACRO III Assembler C12012- 414X Page 2 85/12/04 15:33:00 High Bios For Turbo-ROM 1-2 Macros and Constants 4 73 XENTRY xul1ost ;User List output status 7 74 XENTRY xldsys ;reload system A 75 XENTRY xgetscr ;return next screen char D 76 XENTRY xdefcur ;set cursor to (A) 0 77 XENTRY xmsec ;delay (A) msec 79 0006 80 sioAcommand = 06H ;TTY command port 0007 81 sioBcommand = 07H ;Keyboard command port 0007 82 sioBstatus = 07H ;keyboard status port 0005 83 sioBdata = 05H ;Keyboard data 000E 84 sioCcommand = 0EH ;UL1 command port 85 0000 86 bauda = 0 ;tty baud rate 0008 87 baudb = 8 ;serial printer (84 only) 88 0000 89 topmem = 0 FFF8 90 romid = topmem - 8 ;start of ROM identifing sequence FFF0 91 vecptr = topmem - 16 ;pointer to base of interrupt vectors FFEC 92 hrdptr = topmem - 20 ;pointer to winchester parameters 93 0028 94 beldly = 40 ;delay before sending bell to keyboard 000D 95 CR = 0DH 000A 96 LF = 0AH 97 CDL Z80 MACRO III Assembler C12012- 414X Page 3 85/12/04 15:33:00 High Bios For Turbo-ROM 2-1 Load Parameter Sector (Config. Tables) 101 ;********************************************** 102 ;load parameter sector (standard Kaypro) 103 ;This sector is loaded by the Turbo Rom into the 104 ;CP/M directory buffer where it remains through the 105 ;cold boot. It also contains the configuration information. 106 ;************************************************ 107 0000 108 syssiz =\ "Enter System Size (K) - (0 generates relocatable version)" 109 0000' 18FE 116 ldparm: jmpr ldparm ;ID and safety 0002' 0080' 117 .word bootcd ;start loading 0004' 0080' 118 .word bootcd ;cold boot entry 0006' 0033 119 .word syssct ;number of sectors to load 120 ;------------------------------------------ 121 ;sign-on message, placed here so relocator can patch in 122 ;displayable system size 123 0008' 1A07 124 sign: .byte 01AH,07 ;clear screen and ring bell 000A' 30302E3030 130 .ascii '00.00' ;patched by relocator 000F' 4B2043502F 132 .ascii "K CP/M" 0015' 202D205455 133 .ascii " - TURBO-BIOS$" 0023' 2020202020 134 .ascii " " 135 ;------------------------------------------ 136 ;offsets from start of code to other configurable parameters 137 ;that are set by TURBO CONFIG program 002D' 1834 138 .word schar - bootcd ;screen dump trigger 002F' 17B3 139 .word iflag - bootcd ;interrupt flag (& func keys) 0031' 192B 140 .word motcns - bootcd ;motor off time constant 0033' 17D2 141 .word rbtdrv - bootcd ;warm boot drive 0035' 17F3 142 .word wptr0 - bootcd ;pointer to warm boot message 0037' 00D2 143 .word wptr1 - bootcd ;pointer " " " " 144 ;------------------------------------------ 145 ;Configuration Data Structure 146 147 ;miscellaneous options 148 0039' 81 149 iiobyt: .byte 81H ;initial I/O byte 150 003A' FF 151 curs83: .byte 7FH + 80H ;83 cursor (flashing block) 003B' 60 152 curs84: .byte 01100000B ! 00000000B 153 ;84 cursor (slow flashing block) 003C' 00 154 clk84: .byte 0 ;84 machine clock entry in rom 155 ;(0 is no clock) 156 003D' 00 157 typena: .byte 0 ;use type ahead console 003E' 00 158 clkmsk: .byte 0 ;enable keyclicks 159 160 ;Floppy disk time constants 003F' 00 161 fflag: .byte 0 ;flag whether replacement constants valid 0040' 063219 162 ftime: .byte 6,50,25 ;floppy 0 (step rate,head load,head settle) 0043' 063219 163 .byte 6,50,25 ;floppy 1 0046' 063219 164 .byte 6,50,25 ;floppy 2 0049' 063219 165 .byte 6,50,25 ;floppy 3 166 CDL Z80 MACRO III Assembler C12012- 414X Page 4 85/12/04 15:33:00 High Bios For Turbo-ROM 2-2 Load Parameter Sector (Config. Tables) 167 168 ;Serial Ports 169 170 ; Device initialization tables 171 ; Note order of registers taken from Osborne. 172 004C' 173 devtab: 174 175 ;SIOB keyboard device 004C' 0702 176 .byte sioBcommand, 00000010B ;select WR2 004E' 07 177 .byte sioBcommand 178 ;---------------------------------------------------------------------- 004F' 00 179 ivect: .byte 0 ;patched in by init code 180 ;----------------------------------------------------------------------- 181 182 ;BAUDA 0050' 0005 183 .byte bauda, 5 ;default to 300 184 185 186 ;SIOA tty device 0052' 0614 187 .byte sioAcommand, 00010100B ;select WR4 & reset ext stat 0054' 0644 188 .byte sioAcommand, 01000100B ;x16, async 1 stop,no parity 189 0056' 0613 190 .byte sioAcommand, 00010011B ;select WR3 & reset ext stat 0058' 06E1 191 .byte sioAcommand, 11100001B ;rx 8 bits,yes hshak,enab rx 192 005A' 0605 193 .byte sioAcommand, 00000101B ;select WR5 005C' 06E8 194 .byte sioAcommand, 11101000B ;tx 8 bits,DTR assert,enab tx 195 005E' 0601 196 .byte sioAcommand, 00000001B ;select WR1 0060' 0600 197 .byte sioAcommand, 00000000B ;disable interrupts 198 199 000B 200 ilen83 = (. - devtab)/2 201 202 ;BAUDB 0062' 0805 203 .byte baudb, 5 ;default to 300 204 205 ;sioC ul1 serial printer device 0064' 0E14 206 .byte sioCcommand, 00010100B ;select WR4 & reset ext stat 0066' 0E44 207 .byte sioCcommand, 01000100B ;x16, async 1 stop,no parity 208 0068' 0E13 209 .byte sioCcommand, 00010011B ;select WR3 & reset ext stat 006A' 0EE1 210 .byte sioCcommand, 11100001B ;rx 8 bits,yes hshak,enab rx 211 006C' 0E05 212 .byte sioCcommand, 00000101B ;select WR5 006E' 0EE8 213 .byte sioCcommand, 11101000B ;tx 8 bits,DTR assert,enab tx 214 0070' 0E01 215 .byte sioCcommand, 00000001B ;select WR1 0072' 0E00 216 .byte sioCcommand, 00000000B ;disable interrupts 217 0014 218 ilen84 = (. - devtab)/2 219 220 CDL Z80 MACRO III Assembler C12012- 414X Page 5 85/12/04 15:33:00 High Bios For Turbo-ROM 2-3 Load Parameter Sector (Config. Tables) 221 ;warm boot message printed by BDOS string printer 222 ;DateStamper install moves this 0074' 0D0A576172 223 wmsg0: .ascii [0DH][0AH]'Warm Boot$' 000C 224 wmsglen = . - wmsg0 0080 225 prmlen = . - ldparm 226 CDL Z80 MACRO III Assembler C12012- 414X Page 6 85/12/04 15:33:00 High Bios For Turbo-ROM 3-1 Cold Boot Initialization Code 234 ;start of actual Cold Boot Code (note that ROM is switched in 0080' 235 .loc ldparm + 80H 0080' 236 bootcd: 237 ;must initially set up stack to use during boot, put just below 238 ;start of code 0080' 31 0080' 239 lxi sp,bootcd 240 241 ;verify presence of Turbo Rom 0083' 21 FFF8 242 lxi h,romid ;start of ID sequence 0086' E5 243 push h 0087' AF 244 xra a 0088' 0608 245 mvi b,8 008A' 86 246 ..chks: add m ;checksum 008B' 23 247 inx h 008C' 10FC 248 djnz ..chks 008E' E1 249 pop h 008F' 2027 250 jrnz xrom ;jump if wrong ROM 0091' 11 00A0' 251 lxi d,sig 0094' 0603 252 mvi b,3 0096' 1A 253 ..csig: ldax d ;now check signature 0097' BE 254 cmp m 0098' 201E 255 jrnz xrom 009A' 23 256 inx h 009B' 13 257 inx d 009C' 10F8 258 djnz ..csig 009E' 182A 259 jmpr romok 260 ;********************************* 00A0' 505053 261 sig: .ascii 'PPS' ;signature in ROM 262 ;********************************* 263 ;message for wrong ROM detected 00A3' 1A07526571 264 emsg: .ascii [1AH][07H]"Requires TURBO ROM!" 0015 265 elen = . - emsg 266 ;********************************* 267 ;use direct ROM calls to video output routine 00B8' 21 00A3' 268 xrom: lxi h,emsg 00BB' 0615 269 mvi b,elen 00BD' 4E 270 ..loop: mov c,m 00BE' 23 271 inx h 00BF' E5 272 push h 00C0' C5 273 push b 00C1' CD 0045 274 call xcrtout 00C4' C1 275 pop b 00C5' E1 276 pop h 00C6' 10F5 277 djnz ..loop 00C8' F3 278 ..hang: di 00C9' 76 279 hlt 280 ;************************************** 281 ;find DIRBUF to get initialization tables 00CA' 0E00 282 romok: mvi c,0 ;select drive 0 to get DPH ptr 00CC' 1E01 283 mvi e,1 ;don't bother redetermining 00CE' CD 000F 284 call xseldsk ;direct ROM call 00D1' 11 0008 285 lxi d,8 00D4' 19 286 dad d ;now have pointer to pointer 00D5' 5E 287 mov e,m CDL Z80 MACRO III Assembler C12012- 414X Page 7 85/12/04 15:33:00 High Bios For Turbo-ROM 3-2 Cold Boot Initialization Code 00D6' 23 288 inx h 00D7' 56 289 mov d,m 00D8' D5 290 push d 00D9' DDE1 291 pop x ;index register points to buffer 292 293 ;********************************* 294 ;initialise timer interrupts in case they are later 295 ;enabled 296 00DB' 2A FFF0 297 lhld vecptr ;get pointer to interrupt vector base 298 ;poke low order to write register 2 299 00DE' 7C 300 mov a,h ;set up CPU interrupt vector 00DF' ED47 301 stai 00E1' ED5E 302 im2 ;make sure in Mode 2 303 00E3' DD754F 304 mov (ivect - ldparm)(x),l 00E6' 11 19D0' 305 lxi d,timer ;note that tx interrupt is base 00E9' 73 306 mov m,e 00EA' 23 307 inx h 00EB' 72 308 mov m,d ;put vector in place 309 310 ;initialise any unit record devices 311 ;find which machine 00EC' 3A FFFB 312 lda 0FFFBH ;get version byte 00EF' 07 313 rlc ;move machine bit to cy 00F0' F5 314 push psw ;save machine 00F1' DDE5 315 push x 00F3' E1 316 pop h 00F4' 11 004C 317 lxi d,devtab - ldparm 00F7' 19 318 dad d 00F8' EB 319 xchg ;table in DE 00F9' F1 320 pop psw 00FA' F5 321 push psw ;get cy 00FB' 3E0B 322 mvi a,ilen83 00FD' 3002 323 jrnc ..do83 00FF' 3E14 324 mvi a,ilen84 0101' 2E09 325 ..do83: mvi l,xdevnit ;rom device initialize 0103' CD 1953' 326 call calrom ;use ROM function (switch in RAM) 327 328 ;now do other config options like cursor, bell, keyboard type-ahead 329 ;interrupt motor turn off, motor deselect time constant, screen dump 330 ;character 331 ;----------------- 332 ;cursor definition 0106' F1 333 pop psw ;get back machine 0107' DD7E3A 334 mov a,(curs83 - ldparm)(x) 010A' 3009 335 jrnc ..cu83 336 ;for 84 must set up display clock address 010C' DD7E3C 337 mov a,(clk84 - ldparm)(x) 010F' 32 FFE6 338 sta 0FFE6H ;entry point in high memory 0112' DD7E3B 339 mov a,(curs84 - ldparm)(x) 0115' 2E5D 340 ..cu83: mvi l,xdefcur 0117' CD 1953' 341 call calrom ;define the cursor CDL Z80 MACRO III Assembler C12012- 414X Page 8 85/12/04 15:33:00 High Bios For Turbo-ROM 3-3 Cold Boot Initialization Code 342 ;----------------- 343 ;keyboard type ahead and key clicks 011A' 2A FFEC 344 lhld hrdptr ;get pointer to hard disk area 345 ;point to type ahead flag 011D' 2B 346 dcx h 011E' DD7E3D 347 mov a,(typena - ldparm)(x) 0121' 77 348 mov m,a 349 0122' 2B 350 dcx h ;point to ROM bell character 0123' DD7E3E 351 mov a,(clkmsk - ldparm)(x) 0126' 32 19E1' 352 sta txchar ;set bell used by interrupt time out 0129' 32 1981' 353 sta click0 012C' B6 354 ora m 012D' 77 355 mov m,a ;set ROM character 356 357 358 ;move floppy timing 012E' DD7E3F 359 mov a,(fflag - ldparm)(x) 0131' B7 360 ora a ;test if floppy timing data valid 0132' 2816 361 jrz ..nflp 0134' 2A FFEC 362 lhld hrdptr 0137' 11 0010 363 lxi d,16 ;offset to high memory area 013A' 19 364 dad d ;point to destination 013B' EB 365 xchg 013C' D5 366 push d 367 013D' DDE5 368 push x 013F' E1 369 pop h 0140' 11 0040 370 lxi d,ftime - ldparm 0143' 19 371 dad d 0144' D1 372 pop d 0145' 01 000C 373 lxi b,12 0148' EDB0 374 ldir ;move 12 time constants 375 376 ;move warm boot message into position 014A' DDE5 377 ..nflp: push x 014C' E1 378 pop h 014D' 11 0074 379 lxi d,(wmsg0 - ldparm) 0150' 19 380 dad d 0152' 381 wptr1 = . + 1 ;for patching by DateStamper Install 0151' 11 1A00' 382 lxi d,wmsg 0154' 01 000C 383 lxi b,wmsglen 0157' EDB0 384 ldir 385 386 ;***************************************************** 387 ;Note ROM calls above switched RAM back on exit so we can set up 388 ;page zero 389 390 ;set up initial IOBYTE and Logged on drive 0159' 21 0003 391 lxi h,3 015C' DD7E39 392 mov a,(iiobyt - ldparm)(x) ;get initial IOBYTE 015F' 77 393 mov m,a 0160' 23 394 inx h 0161' 3600 395 mvi m,0 ;start with A0: CDL Z80 MACRO III Assembler C12012- 414X Page 9 85/12/04 15:33:00 High Bios For Turbo-ROM 3-4 Cold Boot Initialization Code 396 397 ;now set rest of page zero 0163' 3EC3 398 mvi a,jmp 0165' 32 0000 399 sta 0 0168' 32 0005 400 sta bdos ;set up BIOS/BDOS jumps 016B' 21 1803' 401 lxi h,cboot+3 016E' 22 0001 402 shld 1 ;BIOS wm boot ptr 0171' 21 0A06' 403 lxi h,ccpentry + 0806H 0174' 22 0006 404 shld bdos+1 ;BDOS ptr 405 406 ;********************************************************************** 407 ;now print sign on message (can use BDOS as everything else is set up) 0177' DDE5 408 push x 0179' E1 409 pop h 017A' 11 0008 410 lxi d,(sign - ldparm) 017D' 19 411 dad d 017E' EB 412 xchg ;point to message 017F' 0E09 413 mvi c,9 0181' CD 0005 414 call bdos 415 ;********************************************************************** 416 ;set up drive to pass to CCP, if extra init code added then this 417 ;function must be preserved 0184' AF 418 xra a 0185' 4F 419 mov c,a ;always set up correct drive 0186' 420 endcode: 421 ;pad rest of sector with NOP so we fall through to CCP, additional 422 ;init code could be patched in here 423 424 .slist 798 ;---------------------------------------------- 799 ;start of command processor, on sector boundary 0004 800 ccpsct = 4 801 0200' 802 .loc ldparm + 128*ccpsct 0200' 803 ccpentry: 804 805 ;compute space remaining on previous sector 007A 806 spare = ccpentry - endcode 807 ;*********************************************** 808 ; fix BDOS reset disk function in case we are 809 ;installing on top of Plu*Perfect Systems enhancements 810 ;because ROM now handles new logins correctly 811 0A00' 812 bdoslc = ccpentry + 0800H 813 1683' 814 .loc bdoslc + 0C83H 1683' 21 0000 815 lxi h,0000 816 817 818 ;*********************************************** 819 CDL Z80 MACRO III Assembler C12012- 414X Page 10 85/12/04 15:33:00 High Bios For Turbo-ROM 4-1 BIOS Proper 823 1800' 824 .loc ccpentry + 1600H 1800' C3 1849' 825 cboot: jmp boot 1803' C3 184E' 826 jmp wboot 1806' C3 1886' 827 jmp consta 1809' C3 18EC' 828 jmp conin 180C' C3 1910' 829 jmp conout 180F' C3 192F' 830 jmp list 1812' C3 1951' 831 jmp punch 1815' C3 1990' 832 jmp reader 1818' C3 1994' 833 jmp home 181B' C3 1998' 834 jmp seldsk 181E' C3 199C' 835 jmp settrk 1821' C3 19A0' 836 jmp setsec 1824' C3 19A4' 837 jmp setdma 1827' C3 19A8' 838 jmp read 182A' C3 19B3' 839 jmp write 182D' C3 19B7' 840 jmp listst 1830' C3 1949' 841 jmp sectrn 842 843 ;********************************************* 1833' 00 844 iflag: .byte 0 ;motor interrupt flag 1834' 00 845 bsflag: .byte 0 ;flags used by BIOS 846 ;bit 7 (raw/decoded function keys) 847 ;bit 6 (foreign language Kaypros only) 848 ;bit 5 (foreign language Kaypros only) 849 ;bit 4 (foreign language Kaypros only) 850 ;bit 3 unused 851 ;bit 2 unused 852 ;bit 1 unused 853 ;bit 0 Write Safe flag (Old ROMs only) 854 ;******************************************** 855 ;standard Kaypro layout of function keys (Pre - Universal ROM) 1835' 0B0A080C 856 akeys: .byte 0BH,0AH,08H,0CH ;standard ADM 3A cursor keys 1839' 3031323334 857 keypad: .ascii '0123456789-,' ;numeric keypad normal definition 1845' 0D 858 .byte 0DH 1846' 2E 859 .ascii '.' 860 ;******************************************************** 861 ;motor delay used in count down offset preserved 862 ;(any program can zero this if it wants control of motor) 863 1847' 0000 864 mcnter: .word 0 ;interrupt version only uses 865 ;first byte 866 ;******************************************** 867 ;TRUE cold boot entry which cause system restart 868 ;NOTE -- this is different from Kaypro Use 869 ; 1849' 2E00 870 boot: mvi l,xstart 184B' C3 1953' 871 xcalrm: jmp calrom 872 ;******************************************* 0003 873 iobyte = 3 ;page zero address 0004 874 cdrive = 4 ;page zero address 0005 875 bdos = 5 ;page zero address 876 CDL Z80 MACRO III Assembler C12012- 414X Page 11 85/12/04 15:33:00 High Bios For Turbo-ROM 4-2 BIOS Proper 184E' 31 0100 877 wboot: lxi sp,0100H ;make sure we have good stack 1852' 878 rbtdrv = . + 1 ;location to patch for different boot 1851' 3E00 879 mvi a,0 ;default is to reboot from A 1853' 11 0200' 880 lxi d,ccpentry ;location to load at 881 ;number of sectors and starting sector 1856' 01 2C04 882 lxi b,(1600H/80H)*256 + ccpsct 1859' 2E57 883 mvi l,57H ;ROM warm boot entry 185B' CD 1953' 884 call calrom 185E' 3EC3 885 mvi a,jmp 1860' 32 0000 886 sta 0 1863' 32 0005 887 sta bdos ;set up BIOS/BDOS jumps 1866' 21 1803' 888 lxi h,cboot+3 1869' 22 0001 889 shld 1 ;BIOS wm boot ptr 186C' 21 0A06' 890 lxi h,ccpentry + 0806H 186F' 22 0006 891 shld bdos+1 ;BDOS ptr 892 1873' 893 wptr0 = . + 1 ;for patching by DateStamper Install 1872' 11 1A00' 894 lxi d,wmsg ;pointer to warm boot message 1875' 0E09 895 mvi c,9 1877' CD 0005 896 call bdos ;use bdos string printer 897 187A' 21 1834' 898 lxi h,bsflag ;point at BIOS flag 187D' CBBE 899 res 7,m ;make sure function keys not 'raw' 900 187F' 3A 0004 901 lda cdrive 1882' 4F 902 mov c,a ;get logged in drive/user 1883' C3 0203' 903 jmp ccpentry + 3 904 ;****************************************** 905 ;console status 1886' 3A 1833' 906 consta: lda iflag 1889' B7 907 ora a ;test if using interrupts 188A' 200F 908 jrnz ..ncnt ;skip if we are 909 ;----------------------------------------- 910 ;CONSTAT polling motor count down 188C' 21 1848' 911 lxi h,mcnter + 1 188F' B6 912 ora m ;test for count down (high byte only) 1890' 2809 913 jrz ..ncnt 1892' 2B 914 dcx h 1893' 35 915 dcr m ;decrement low byte 1894' 2005 916 jrnz ..ncnt 1896' 23 917 inx h 1897' 35 918 dcr m 1898' CC 194D' 919 cz motoff 920 ;------------------------------------------ 189B' 3A 0003 921 ..ncnt: lda iobyte 189E' 0F 922 rrc ;test for CRT/TTY 189F' 2E33 923 mvi l,xttysta 18A1' 30A8 924 jrnc xcalrm ;No buffering from TTY 925 18A4' 926 bufclr = . + 1 18A3' 3E00 927 mvi a,0 ;buffer clear flag 18A5' B7 928 ora a 18A6' C0 929 rnz ;return if not 930 CDL Z80 MACRO III Assembler C12012- 414X Page 12 85/12/04 15:33:00 High Bios For Turbo-ROM 4-3 BIOS Proper 931 18A7' 2E2A 932 mvi l,xcrtsta ;go see if anything new 18A9' CD 1953' 933 call calrom 18AC' C8 934 rz ;return if no character 935 936 ;else fetch it 18AD' 2E2D 937 mvi l,xcrtin 18AF' CD 1953' 938 call calrom 939 ;****************************************** 940 ;Check for Screen Dump pressed 18B2' 4F 941 mov c,a ;save character 18B4' 942 schar = . + 1 ;location of trigger character 18B3' 3E00 943 mvi a,0 ;get screen dump flag (00 = no) 18B5' B7 944 ora a 18B6' 282A 945 jrz putchr ;save character 18B8' B9 946 cmp c ;actual trigger character 18B9' 2027 947 jrnz putchr 948 ;---------------------------------------- 949 ;Screen Dump Function (we don't have room to speed up short lines) 950 ;first home the dump cursor 18BB' 0EFF 951 mvi c,0FFH 18BD' 2E5A 952 ..loop: mvi l,xgetscr ;screen dump ROM entry 18BF' CD 1953' 953 call calrom 18C2' F5 954 push psw ;save character 18C3' 7D 955 mov a,l ;test for end of line 18C4' E67F 956 ani 07FH ;mask column 18C6' 200A 957 jrnz ..not0 ;jump if not column zero 18C8' 0E0D 958 mvi c,CR ;start new line 18CA' CD 192F' 959 call list 18CD' 0E0A 960 mvi c,LF 18CF' CD 192F' 961 call list 18D2' F1 962 ..not0: pop psw ;get character 18D3' 280B 963 jrz endscr ;dump ends with zero return 18D5' 0E20 964 mvi c,' ' ;skip greek/foreign characters 18D7' B9 965 cmp c 18D8' 3801 966 jrc ..grph 18DA' 4F 967 mov c,a ;get character to print 18DB' CD 192F' 968 ..grph: call list ;send it to the printer 18DE' 18DD 969 jmpr ..loop 18E0' AF 970 endscr: xra a ;return with status false 18E1' C9 971 ret 972 ;------------------------ 18E2' 79 973 putchr: mov a,c 18E3' 32 18F9' 974 sta bufchr ;store character in buffer 18E6' AF 975 xra a 18E7' 3D 976 dcr a 18E8' 32 18A4' 977 sta bufclr ;set flag 18EB' C9 978 ret ;set non zero 979 ;***************************************** 980 ;console input 18EC' CD 1886' 981 conin: call consta 18EF' 28FB 982 jrz conin ;loop out of ROM 18F1' 3A 0003 983 lda iobyte 18F4' 0F 984 rrc CDL Z80 MACRO III Assembler C12012- 414X Page 13 85/12/04 15:33:00 High Bios For Turbo-ROM 4-4 BIOS Proper 18F5' D2 1990' 985 jnc reader ;no screen dump or 986 ;function keys with TTY 987 18F9' 988 bufchr = . + 1 ;one character look-ahead where constat 989 ;places character 18F8' 3E00 990 mvi a,0 18FA' 21 18A4' 991 lxi h,bufclr 18FD' 3600 992 mvi m,0 ;clear buffer flag 993 ;now must map any function keys 18FF' B7 994 mapfnc: ora a 1900' F0 995 rp ;if no high bit then return 1901' 21 1834' 996 lxi h,bsflag ;see if we are to map 1904' CB7E 997 bit 7,m 1906' C0 998 rnz ;return raw function if set 1907' 21 1835' 999 lxi h,akeys ;point to mapping table 190A' E61F 1000 ani 1FH ;crunch hi bits 190C' 85 1001 add l 190D' 6F 1002 mov l,a ;get offset, (always in first page) 190E' 7E 1003 mov a,m 190F' C9 1004 ret 1005 ;**************************************** 1006 ;console output 1910' 3A 0003 1007 conout: lda iobyte 1913' 0F 1008 rrc 1914' 303B 1009 jrnc punch ;Send to TTY 1010 ;must trap bell character if interrupt timer being used 1916' 2E45 1011 crtout: mvi l,xcrtout 1918' 3A 1833' 1012 lda iflag ;are we using interrupts 191B' B7 1013 ora a 191C' 2835 1014 jrz calrom 191E' 3A 1847' 1015 lda mcnter ;is motor still running 1921' B7 1016 ora a 1922' 282F 1017 jrz calrom 1924' 79 1018 mov a,c 1925' FE07 1019 cpi 7 ;test for bell 1927' 202A 1020 jrnz calrom 1929' 21 19E1' 1021 lxi h,txchar 192C' CBD6 1022 set 2,m ;set bell bit 192E' C9 1023 ret 1024 1025 ;***************************************** 1026 ;list device 192F' CD 19B7' 1027 list: call listst ;loop till ready in hi memory 1932' 28FB 1028 jrz list 1934' 3A 0003 1029 lda iobyte 1937' E6C0 1030 ani 0C0H ;isolate list device 1939' 2816 1031 jrz punch 193B' 07 1032 rlc 193C' 07 1033 rlc 193D' 3D 1034 dcr a ;test for CRT 193E' 28D6 1035 jrz crtout 1940' 3D 1036 dcr a 1941' 2E3F 1037 mvi l,xlptout 1943' 280E 1038 jrz calrom CDL Z80 MACRO III Assembler C12012- 414X Page 14 85/12/04 15:33:00 High Bios For Turbo-ROM 4-5 BIOS Proper 1945' 2E51 1039 mvi l,xul1out 1947' 180A 1040 jmpr calrom 1041 ;************************************* 1042 ;sector translation routine 1949' 2E21 1043 sectrn: mvi l,xsctrn 194B' 1806 1044 jmpr calrom 1045 ;************************************ 1046 ;turn off floppy motor and deselect hard disk 194D' 2E27 1047 motoff: mvi l,xdskoff 194F' 1802 1048 jmpr calrom ;jump to ROM 1049 ;**************************************** 1050 ;punch device (always TTY) 1951' 2E39 1051 punch: mvi l,xttyout 1052 1053 ;****************************************** 1054 ;main entry to ROM 1953' F5 1055 calrom: push psw ;save A 1056 1057 ;disable SIO status interrupts 1954' 3A 1833' 1058 lda iflag 1957' B7 1059 ora a 1958' 2809 1060 jrz ..skip 195A' F3 1061 di ;make sure we are not hit 195B' 3E01 1062 mvi a,1 ;select write reg 1 195D' D307 1063 out sioBcommand 195F' AF 1064 xra a ;disable all interrupts 1960' D307 1065 out sioBcommand 1962' FB 1066 ei 1963' F1 1067 ..skip: pop psw 1964' CD FFFC 1068 call 0FFFCH ;fixed ROM entry point 1967' E5 1069 push h 1968' F5 1070 push psw 1071 ;check if motor counter needs reset 1969' 3A 1833' 1072 lda iflag 196C' B7 1073 ora a 196D' 281E 1074 jrz notint 196F' 21 1847' 1075 lxi h,mcnter ;point to current motor counter (lo byte only 1076 ;used by interrupt counter) 1972' A6 1077 ana m ;test for zero 1973' 2818 1078 jrz notint 1079 1080 ;now reinitialize SIO status interrupts 1975' F3 1081 di 1976' DB07 1082 in sioBstatus ;check if buffer empty 1978' CB57 1083 bit 2,a 197A' 2808 1084 jrz nempty 197C' 35 1085 dcr m ;decrement count 197D' 2001 1086 jrnz not0 197F' 34 1087 inr m ;make sure we are non zero 1088 ;only time-out in actual interrupt routine 1981' 1089 click0 = . + 1 1980' 3E00 1090 not0: mvi a,0 1982' D305 1091 out sioBdata ;restart timer 1092 CDL Z80 MACRO III Assembler C12012- 414X Page 15 85/12/04 15:33:00 High Bios For Turbo-ROM 4-6 BIOS Proper 1984' 3E01 1093 nempty: mvi a,1 1986' D307 1094 out sioBcommand ;select register 1 1988' 3E06 1095 mvi a,00000110B ;enable vectord TX empty interrupts 198A' D307 1096 out sioBcommand 198C' FB 1097 ei 198D' F1 1098 notint: pop psw 198E' E1 1099 pop h 198F' C9 1100 ret 1101 1102 ;**************************************** 1103 ;reader device (always TTY) 1990' 2E36 1104 reader: mvi l,xttyin 1992' 18BF 1105 jmpr calrom 1106 ;**************************************** 1107 ;home selected disk drive 1994' 2E0C 1108 home: mvi l,xhome 1996' 18BB 1109 jmpr calrom 1110 ;**************************************** 1111 ;select disk 1998' 2E0F 1112 seldsk: mvi l,xseldsk 199A' 18B7 1113 jmpr calrom 1114 ;*************************************** 1115 ;set desired track 199C' 2E12 1116 settrk: mvi l,xsettrk 199E' 18B3 1117 jmpr calrom 1118 ;*************************************** 1119 ;set desired sector 19A0' 2E15 1120 setsec: mvi l,xsetsec 19A2' 18AF 1121 jmpr calrom 1122 ;*************************************** 1123 ;set DMA address for transfer of next sector 19A4' 2E18 1124 setdma: mvi l,xsetdma 19A6' 18AB 1125 jmpr calrom 1126 ;*************************************** 1127 ;read specified sector 19A8' 061B 1128 read: mvi b,xread 1129 1130 ;common read/write entry 19AB' 1131 motcns = . + 1 19AA' 21 7FFF 1132 stime: lxi h,7FFFH ;reset motor off timer 19AD' 22 1847' 1133 shld mcnter 19B0' 68 1134 mov l,b ;get function set up 19B1' 18A0 1135 jmpr calrom 1136 ;*************************************** 1137 ;write specified sector 19B3' 061E 1138 write: mvi b,xwrite 19B5' 18F3 1139 jmpr stime 1140 ;************************************** 1141 ;list output status 19B7' 3A 0003 1142 listst: lda iobyte 19BA' E6C0 1143 ani 0C0H ;mask out list bits 19BC' 2E42 1144 mvi l,xttosta 19BE' 2893 1145 jrz calrom ;TTY used 19C0' 07 1146 rlc CDL Z80 MACRO III Assembler C12012- 414X Page 16 85/12/04 15:33:00 High Bios For Turbo-ROM 4-7 BIOS Proper 19C1' 07 1147 rlc ;moveinto low bits 19C2' 3D 1148 dcr a ;test for CRT, always ready 19C3' 2809 1149 jrz ..true 19C5' 3D 1150 dcr a 19C6' 2E3C 1151 mvi l,xlptsta 19C8' 2889 1152 jrz calrom ;use Centronics 19CA' 2E54 1153 mvi l,xul1ost 19CC' 1885 1154 jmpr calrom 19CE' 3D 1155 ..true: dcr a 19CF' C9 1156 ret ;always ready 1157 ;************************************ 1158 ;Interrupt driven motor/deselect timer 1159 ; 1160 ;This interrupt driven timer uses the Keyboard TX buffer empty 1161 ;which interrupts at 30 HZ rate. If IFLAG enabled then type-ahead 1162 ;keyboard must also be enabled, so that occassional framing errors 1163 ;generated by keyboard firmware bug can be corrected. Note that 1164 ;some very early SMK keyboards with 8749 (cf 8049 in later) have 1165 ;serious bug that makes operation with interrupts impossible, 1166 ;symptoms of this problem are ^@'s appearing on console when a 1167 ;key is pressed. Maximum timing delay is 8.3 seconds. 1168 ;------------------------------------------------- 19D0' ED73 1A40'1169 timer: sspd timstk ;save current stack 19D4' 31 1A40' 1170 lxi sp,timstk ;set up new local stack 19D7' F5 1171 push psw 19D8' E5 1172 push h 19D9' 21 1847' 1173 lxi h,mcnter ;point to counter 19DC' 35 1174 dcr m ;decrement 19DD' CC 194D' 1175 cz motoff ;deselect and flush if needed 19E1' 1176 txchar = .+1 ;clicks and bell 19E0' 3E00 1177 mvi a,0 ;character to send to keyboard 19E2' CB57 1178 bit 2,a ;is bell bit set 19E4' 2808 1179 jrz ..nbel ;skip if no bell 19E6' 2628 1180 mvi h,beldly ;need to delay 19E8' 2D 1181 ..lp: dcr l 19E9' 20FD 1182 jrnz ..lp 19EB' 25 1183 dcr h 19EC' 20FA 1184 jrnz ..lp ;delay befor bell 19EE' D305 1185 ..nbel: out sioBdata ;send character 19F0' CB97 1186 res 2,a ;clear bell bit 19F2' 32 19E1' 1187 sta txchar 19F5' E1 1188 pop h ;Note motoff saves additional reg. used 19F6' F1 1189 pop psw 19F7' ED7B 1A40'1190 lspd timstk ;get back old stack pointer 19FB' FB 1191 ei 19FC' ED4D 1192 reti 1193 ;*********************************************************** 1194 ;compute total length of system in sectors for bootloader 0032 1195 syssct = (. - bootcd)/128 0033 1197 syssct = syssct + 1 1A00' 1208 .loc cboot + 4*128 1A00' 1209 wmsg: .blkb 12 1210 1A40' 1211 .loc cboot + 4*128 + 64 CDL Z80 MACRO III Assembler C12012- 414X Page 17 85/12/04 15:33:00 High Bios For Turbo-ROM 4-8 BIOS Proper 1212 ;interrupt stack compatible with Plu*Perfect DateStamper 1A40' 1213 timstk: .blkw 2 ;word to save stack during int. 1214 1215 1216 .end CDL Z80 MACRO III Assembler C12012- 414X Page 18 85/12/04 15:33:00 High Bios For Turbo-ROM 4-9 +++++ Symbol Table +++++ AKEYS 1835' BAUDA 0000 BAUDB 0008 BDOS 0005 BDOSLC 0A00' BELDLY 0028 BOOT 1849' BOOTCD 0080' BSFLAG 1834' BUFCHR 18F9' BUFCLR 18A4' CALROM 1953' CBOOT 1800' CCPENT 0200' CCPSCT 0004 CDRIVE 0004 CLICK0 1981' CLK84 003C' CLKMSK 003E' CONIN 18EC' CONOUT 1910' CONSTA 1886' CR 000D CRTOUT 1916' CURS83 003A' CURS84 003B' DEVTAB 004C' ELEN 0015 EMSG 00A3' ENDCOD 0186' ENDSCR 18E0' FFLAG 003F' FTIME 0040' HOME 1994' HRDPTR FFEC IFLAG 1833' IIOBYT 0039' ILEN83 000B ILEN84 0014 IOBYTE 0003 IVECT 004F' KEYPAD 1839' LDPARM 0000' LF 000A LIST 192F' LISTST 19B7' MAPFNC 18FF' MCNTER 1847' MOTCNS 19AB' MOTOFF 194D' NEMPTY 1984' NOT0 1980' NOTINT 198D' PRMLEN 0080 PUNCH 1951' PUTCHR 18E2' RBTDRV 1852' READ 19A8' READER 1990' ROMID FFF8 ROMOK 00CA' SCHAR 18B4' SECTRN 1949' SELDSK 1998' SETDMA 19A4' SETSEC 19A0' SETTRK 199C' SIG 00A0' SIGN 0008' SIOACO 0006 SIOBCO 0007 SIOBDA 0005 SIOBST 0007 SIOCCO 000E SPARE 007A STIME 19AA' SYSSCT 0033 SYSSIZ 0000 TIMER 19D0' TIMSTK 1A40' TOPMEM 0000 TXCHAR 19E1' TYPENA 003D' VECPTR FFF0 WBOOT 184E' WMSG 1A00' WMSG0 0074' WMSGLE 000C WPTR0 1873' WPTR1 0152' WRITE 19B3' XCALRM 184B' XCOUNT 0060 XCRTIN 002D XCRTNI 0006 XCRTOU 0045 XCRTST 002A XDEFCU 005D XDEVNI 0009 XDSKOF 0027 XDSKON 0024 XDSKRS 0003 XGETSC 005A XHOME 000C XKBDOU 0030 XLDSYS 0057 XLPTOU 003F XLPTST 003C XMSEC 0060 XREAD 001B XROM 00B8' XSCTRN 0021 XSELDS 000F XSETDM 0018 XSETSE 0015 XSETTR 0012 XSTART 0000 XTMSEC 0048 XTTOST 0042 XTTYIN 0036 XTTYOU 0039 XTTYST 0033 XUL1IN 004E XUL1OS 0054 XUL1OU 0051 XUL1ST 004B XWRITE 001E