From 9635d5933efa21d50a96be71c9788dde1b778da3 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Tue, 21 Nov 2017 17:04:23 -0800 Subject: [PATCH] Finalize v2.8.6 Prerelease 0 Adds ACIA support Adds IM1 interrupt chaining Fixes IDE SETFEAT issue --- Source/Apps/Build.cmd | 3 + Source/Apps/Clean.cmd | 2 + Source/Apps/Survey.asm | 723 ++++++++++++++++++++++++++++ Source/Build.cmd | 2 +- Source/CBIOS/ver.inc | 2 +- Source/HBIOS/Config/RC_std.asm | 2 + Source/HBIOS/acia.asm | 531 ++++++++++++++++++++ Source/HBIOS/cfg_mk4.asm | 3 +- Source/HBIOS/cfg_n8.asm | 3 +- Source/HBIOS/cfg_rc.asm | 1 + Source/HBIOS/cfg_sbc.asm | 4 + Source/HBIOS/cfg_zeta.asm | 3 +- Source/HBIOS/hbios.asm | 183 +++++-- Source/HBIOS/hbios.inc | 1 + Source/HBIOS/ide.asm | 6 + Source/HBIOS/romldr.asm | 151 +++++- Source/HBIOS/sio.asm | 116 +++-- Source/HBIOS/std.asm | 12 + Source/HBIOS/ver.inc | 2 +- Source/HBIOS/z180.inc | 10 - Source/RomDsk/ROM_1024KB/SURVEY.COM | Bin 1152 -> 0 bytes Source/RomDsk/ROM_512KB/SURVEY.COM | Bin 1152 -> 0 bytes 22 files changed, 1635 insertions(+), 125 deletions(-) create mode 100644 Source/Apps/Survey.asm create mode 100644 Source/HBIOS/acia.asm delete mode 100644 Source/RomDsk/ROM_1024KB/SURVEY.COM delete mode 100644 Source/RomDsk/ROM_512KB/SURVEY.COM diff --git a/Source/Apps/Build.cmd b/Source/Apps/Build.cmd index 13737cef..be60f023 100644 --- a/Source/Apps/Build.cmd +++ b/Source/Apps/Build.cmd @@ -20,6 +20,9 @@ call :asm Mode || goto :eof zx Z80ASM -SYSGEN/F +zx MAC SURVEY.ASM -$PO +zx MLOAD25 -SURVEY.COM=SURVEY.HEX + setlocal & cd XM && call Build || exit /b 1 & endlocal setlocal & cd FDU && call Build || exit /b 1 & endlocal diff --git a/Source/Apps/Clean.cmd b/Source/Apps/Clean.cmd index cf98eb56..ad6761a3 100644 --- a/Source/Apps/Clean.cmd +++ b/Source/Apps/Clean.cmd @@ -4,6 +4,8 @@ setlocal if exist *.bin del *.bin if exist *.com del *.com if exist *.lst del *.lst +if exist *.hex del *.hex +if exist *.prn del *.prn setlocal & cd XM && call Clean || exit /b 1 & endlocal setlocal & cd FDU && call Clean || exit /b 1 & endlocal diff --git a/Source/Apps/Survey.asm b/Source/Apps/Survey.asm new file mode 100644 index 00000000..a30252e9 --- /dev/null +++ b/Source/Apps/Survey.asm @@ -0,0 +1,723 @@ +;***************************************; +; ; +; S U R V E Y ; +; ; +;***************************************; + +;By Michael Friese 9/22/79 + + +;* Lists Kbytes used and remaining plus number of files +; on all logged disks (up to 8) +;* Prints Memory map and synopsis of all machine memory +;* Lists all active I/O Ports +;* Uses disk allocation block for all disk calculations +; +;VERSION LIST - Most recent version first. +; +;06/Jul/82 - Added Godbout DISK 1 equate and added SKIP equate +; Bill Bolton - Software Tools, Australia +; +;01/Jun/82 - Tidied up and fixed port display, added display +; of contents of low memory. David Bennett - Alfred +; Hospital, Australia +; +;29/Jun/80 - Added version number test and calculations for CP/M +; version 2 compatibility. This program should now work +; properly on all versions 1.4 and later. BRR +; +;28/Jun/80 - Added IMS400 equate (prevents Industrial Micro Systems +; controller from hanging up during port scan). BRR +; +;24/Jun/80 - Removed MACLIB statement, included required macros +; in source. Bruce R. Ratoff +; + +;*******************************; +; SYSTEM MACROS ; +;*******************************; +;Increments 16 bit memory location X +INXI MACRO X + LOCAL JUST8 + PUSH H + LXI H,X + INR M + JNZ JUST8 + INX H + INR M +JUST8: + POP H + ENDM +;.............................................................. +; +; SAVE MACRO SAVE SPECIFIED REGISTERS +; +; SAVE R1,R2,R3,R4 +; +; R1-R4 MAY BE B,D,H OR PSW SAVED IN ORDER SPECIFIED +; IF REGS ARE OMITTED SAVE B,D AND H +; +SAVE MACRO R1,R2,R3,R4 + IF NOT NUL R1&R2&R3&R4 + IRP R,<,,,> + IF NUL R + EXITM + ENDIF + PUSH R + ENDM + ELSE + IRPC REG,BDH + PUSH REG + ENDM + ENDIF + ENDM +; +; . . . . . . . . . . . . . . . . . . . . . . . . . . . . +; +; RESTORE MACRO RESTORE REGISTERS (INVERSE OF SAVE) +; +; RESTORE R1,R2,R3,R4 +; +; R1-R4 MAY BE B,D,H OR PSW RESTORED IN ORDER SPECIFIED +; IF REGS OMITTED RESTORE H,D AND B +; +RESTORE MACRO R1,R2,R3,R4 + IF NOT NUL R1&R2&R3&R4 + IRP R,<,,,> + IF NUL R + EXITM + ENDIF + POP R + ENDM + ELSE + IRPC REG,HDB + POP REG + ENDM + ENDIF + ENDM +; +;.............................................................. +; +; CHAROUT MACRO CONSOLE OUTPUT FROM A +; +; CHAROUT ADDR +; +CHAROUT MACRO ADDR + IF NOT NUL ADDR + LDA ADDR + ENDIF + MVI C,2 ;;CONOUT + MOV E,A ;;CHAR TO E + CALL 5 ;;CALL BDOS + ENDM +; +; +;............................................................. +; +; DECOUT MACRO CONVERT A POSITIVE INTEGER TO DECIMAL AND OUTPUT +; TO THE CONSOLE. +; +; DECOUT ADDR +; +; IF ADDR OMITTED, NUMBER ASSUMED TO BE IN HL, ELSE LOADED TO HL +; LEADING ZEROS SUPRESSED. MAXIMUM NUMBER 65,767 +; +DECOUT MACRO ADDR + LOCAL ENDDEC,DX + JMP ENDDEC +@DECOUT: + SAVE ;;PUSH STACK + LXI B,-10 ;;RADIX FOR CONVERSION + LXI D,-1 ;;THIS BECOMES NO DIVIDED BY RADIX +DX: + DAD B ;;SUBTRACT 10 + INX D + JC DX + LXI B,10 + DAD B ;;ADD RADIX BACK IN ONCE + XCHG + MOV A,H + ORA L ;;TEST FOR ZERO + CNZ @DECOUT ;;RECURSIVE CALL + MOV A,E + ADI '0' ;;CONVERT FROM BCD TO HEX + MOV E,A ;;TO E FOR OUTPUT + CHAROUT ;;CONSOLE OUTPUT + RESTORE ;;POP STACK + RET +ENDDEC: +DECOUT MACRO ?ADDR + IF NOT NUL ?ADDR + LHLD ?ADDR + ENDIF + CALL @DECOUT ;;CALL THE SUBROUTINE + ENDM + DECOUT ADDR + ENDM +; +; +;.............................................................. +; +; HEXOUT MACRO CONVERT BINARY NO AND OUTPUT TO CONSOLE +; +; HEXOUT ADDR +; +; NUMBER ASSUMED IN A IF NO ARGUMENT +; +HEXOUT MACRO ADDR + LOCAL OUTCHR,HEXEND + JMP HEXEND +HEXPRN: + SAVE PSW + RRC + RRC + RRC + RRC ;;SHIFT RIGHT 4 + CALL OUTCHR + RESTORE PSW +OUTCHR: + ANI 0FH ;;MASK 4 BITS + ADI 90H ;;ADD OFFSET + DAA ;;DEC ADJUST + ACI 40H ;;ADD OFFSET + DAA ;;DEC ADJUST + MOV E,A ;;TO E FOR OUTPUT + MVI C,2 ;;CONOUT + JMP 5 ;;CALL BDOS +HEXEND: + +HEXOUT MACRO ?ADDR + IF NOT NUL ?ADDR + LDA ?ADDR + ENDIF + CALL HEXPRN + ENDM + HEXOUT ADDR + ENDM +; +; + +;*******************************; +; SYSTEM EQUATES ; +;*******************************; +TRUE EQU -1 +FALSE EQU NOT TRUE +TARBEL EQU FALSE ; Tarbell FDC dmb 31-may-82 +IMS400 EQU FALSE ; Industrial Micro Systems FDC +GODBOUT EQU FALSE ; Godbout Disk 1 FDC +GODBAS EQU 0C0H ; Base of Godbout FDC +TARBAS EQU 0F8H ; Base of Tarbell +SKIP EQU TARBEL OR IMS400 OR GODBOUT ; Will be true + ; if any skip needed + IF TARBEL +SKIPORT EQU TARBAS+4 ; Port # to skip if Tarbell FDC + ENDIF + IF IMS400 +SKIPORT EQU 08FH ; Port # to skip if IMS FDC + ENDIF + IF GODBOUT +SKIPORT EQU GODBAS+1 ; Port # to skip if Disk 1 FDC + ENDIF +BDOS EQU 5 ; jump to BDOS +bios equ 0 ; jump to BIOS dmb 1-jun-82 +CRLF EQU 0A0DH ; CR LF sequence +CRLFE EQU 8A0DH ; CR LF with EOL +EOL EQU 80H ; End of line +TAB EQU 'I'-40H ; Tab character +ESC EQU 1BH ; Escape character +TABS EQU 9 ; Tab columns + +;***********************; +; MAIN PROGRAM ; +;***********************; +; + ORG 100H +; +START: + LXI H,0 ; Save stack pointer + DAD SP + SHLD OLDSP + LXI SP,FINIS+64 + CALL TYPE ; Type initial CRLF + DB TAB,TAB,'*** System Survey (June 82) ***' + DW CRLF,CRLFE + +;DISK SURVEY + LXI H,8 ; Init drive counter + MVI C,24 ; Get login vector + PUSH H + CALL BDOS + POP H +ROTBIT: + RAR ; RAR login bit to C + JNC NOTLOG ; Drive not logged + PUSH PSW ; Save login + PUSH H ; and counter + +;Print drive letter + CALL TYPE + DB 'Drive' + DB ' '+EOL + MVI A,'A' ; Get ASCII bias + ADD H ; Add to drive # + MOV E,A ; Print drive letter + CALL TCHR + CALL TYPE ; and colon + DB ':',' '+EOL + POP H ; Restore drive # + PUSH H + +;Print K already allocated + MOV E,H + MVI C,14 ; Log drive + CALL BDOS + MVI C,27 ; Index allocation vect + CALL BDOS + MOV L,A ; Put in decent regs + MOV H,B + PUSH H ; save for later + MVI C,12 ; get version # + CALL BDOS + MOV A,L ; zero if version 1 + ORA A + JNZ V2X ; otherwise, use 2.x style params + LHLD BDOS+1 ; get vers 1 style params + MVI L,3CH + MOV A,M ; get block shift factor + STA BLKSHF + INX H + INX H + MOV L,M ; get max. block number + MVI H,0 + SHLD MAXALL + MVI B,32 ; assume 32 bytes in block map + JMP GETALC ; continue +V2X: + MVI A,'?' ; Use wild user # + STA FCB ; in filename search + MVI C,31 ; Get 2.x parameter block + CALL BDOS + INX H + INX H + MOV A,M ; Get and save ablock shift factor + STA BLKSHF + INX H + INX H + INX H + MOV A,M ; Get maximum block number + INX H ; (double precision) + MOV H,M + MOV L,A + SHLD MAXALL + INX H + MVI B,3 ; map size is (MAXALL+1)/8 +V2SH: + MOV A,H + ORA A ; do 16 bit right shift + RAR + MOV H,A + MOV A,L + RAR + MOV L,A + DCR B ; 3 times + JNZ V2SH + MOV B,L + LDA MAXALL ; allow for leftover bits if any + ANI 3 + JZ GETALC + INR B +GETALC: + POP H + LXI D,0 ; Init group counter +NXBYTE: + MVI C,8 ; Bit counter for byte + MOV A,M ; Get map byte +NXBIT: + RAR ; Rotate to C + JNC NOBIT ; No group allocated + INX D ; Inc group counter +NOBIT: + DCR C ; Dec bit counter + JNZ NXBIT + INX H ; Index next byte + DCR B + JNZ NXBYTE + CALL SHF16 + PUSH H + CALL BINDEC + CALL TYPE + DB 'K bytes in',' '+EOL + +;Print number of files + LXI D,FCB ; Fake file cont block + MVI C,17 ; Search for 1st file + CALL BDOS + LXI H,0 ; File counter +LOOK: + CPI 255 ; Failure + JZ PFILE + ADD A ; File offset times 2 + ADD A ; 4 + ADD A ; 8 + ADD A ; 16 + ADD A ; 32 + ADI 80H ; Make sure it's not a deleted file + MOV E,A + MVI D,0 + LDAX D + CPI 0E5H + JZ LOOK1 + INX H ; Bump file counter +LOOK1: + LXI D,FCB ; Restore FCB + MVI C,18 ; Look for addtl files + PUSH H ; Save file counter + CALL BDOS + POP H + JMP LOOK +PFILE: + CALL BINDEC ; Print # of files + CALL TYPE + DB ' files with',' '+EOL + +;Print K remaining + LHLD MAXALL ; Get number of blocks + XCHG + INX D ; Inc for actual value + CALL SHF16 + XCHG + POP H + MOV A,H ; Ones comp & move + CMA + MOV H,A + MOV A,L + CMA + MOV L,A + INX H ; Twos complement + DAD D ; and subtract + CALL BINDEC ; K remaining + CALL TYPE + DB 'K bytes remaining' + DW CRLFE + +;Set up to print next drive + POP H ; Restore bit counter + POP PSW ; and bitmap byte +NOTLOG: + INR H ; Bump drive counter + DCR L ; Dec bit counter + JNZ ROTBIT + +;MEMORY SURVEY +;Create header +MSURV: + CALL TYPE + DW CRLF + DB 'Memory map:' + DW CRLF + DB '0',TAB,'8',TAB,'16',TAB,'24',TAB,'32' + DB TAB,'40',TAB,'48',TAB,'56',TAB,'64' + DW CRLF + REPT 8 + DB '|',TAB + ENDM + DB '|' + DW CRLF + db ' ' ; dmb 31-May-82 + DB 'T'+EOL + LXI H,RAM + MVI M,LOW 1023 ; Init RAM counter + INX H + MVI M,HIGH 1023 + MVI B,4 ; Clear ROM, EMP +CLREG: + INX H + MVI M,0 + DCR B + JNZ CLREG + LXI H,1024 ; Init memory pointer + MVI C,63 ; K to be checked + +;Start of analysis loop +BEGANA: + LXI D,1024 ; Byte counter + XRA A ; Clear flag bytes + STA RAMF + STA EMPF +ANALP: + MOV A,M ; Get test byte and + MOV B,A ; store for later + CMA + MOV M,A ; Put invertd tst byte + SUB M ; Check for good write + MOV M,B ; Restore orignl data + JNZ NOTMEM ; Wasn't good write + INXI RAM ; Bump memory counter + JMP NEXT ; To next byte + +NOTMEM: + STA RAMF ; Not considered RAM + MVI A,0FFH ; Is it empty space? + SUB B + JNZ NOTEMP ; Inc ROM, set flag + LDA EMPF ; Any non empty space + ANA A ; before here? + JZ NEXT + JMP NOTEM ; To next byte +NOTEMP: + STA EMPF ; Set no empty flag +NOTEM: + INXI ROM +NEXT: + INX H ; Index next byte + DCX D ; Decrement K counter + XRA A + ORA D + ORA E + JNZ ANALP ; K counter not 0 + PUSH B + PUSH H + LDA RAMF ; Is it RAM? + ANA A + JNZ NOTRAM ; No + dcr h ; drop H to make compares right + LDA BDOS+2 ; Is it under BDOS ? + CMP H + JC NOTTPA ; No + CALL TYPE ; Yes, it's TPA + DB 'T'+EOL + JMP NEXTK +NOTTPA: + lda bios+2 ; is it under bios ? + cmp h + jc nbdos + call type ; yes, it's BDOS + db 'C'+eol + jmp nextk +nbdos: + CALL TYPE ; Assume it's BIOS + DB 'B'+EOL + JMP NEXTK +; +NOTRAM: + LDA EMPF ; Is it empty? + ANA A + JZ NOMEM ; Yes, no memory + CALL TYPE ; No, must be ROM + DB 'R'+EOL + JMP NEXTK +NOMEM: + CALL TYPE + DB ' '+EOL +NEXTK: + POP H + POP B + DCR C ; Decrement K counter + JNZ BEGANA + CALL TYPE + DW CRLF + DB 'T=TPA',TAB,'C=CPM',TAB,'B=BIOS or unassigned' + DB TAB,'R=ROM or bad' + DW CRLFE +; +; contents of first page + call type + db 'BIOS at',' '+eol + hexout bios+2 + hexout bios+1 + call type + db tab,'iobyte',' '+eol + hexout bios+3 + call type + db tab,'drive',' '+eol + hexout bios+4 + call type + db tab,'BDOS at',' '+eol + hexout bdos+2 + hexout bdos+1 + call type + dw crlf,crlfe +; +;MEMORY SYNOPSIS + LHLD RAM + PUSH H ; Save RAM + CALL BINDEC ; Type RAM + CALL TYPE + DB ' Bytes RAM',TAB,TAB+EOL + LHLD ROM + PUSH H + CALL BINDEC ; Type ROM + CALL TYPE + DB ' Bytes ROM',TAB,TAB+EOL + LHLD BDOS+1 + CALL BINDEC + CALL TYPE + DB ' Bytes in TPA' + DW CRLFE + POP D ; Get RAM + POP H ; Get RAM + DAD D ; Add 'em + PUSH H ; and save result + LXI D,0 ; Subtract from this + MOV A,H ; Complement 16 bits + CMA + MOV H,A + MOV A,L + CMA + MOV L,A ; 2s comp bias in D + DAD D ; Subtract + CALL BINDEC + CALL TYPE + DB ' Bytes Empty ',TAB+EOL + POP H ; Restore RAM+ROM + CALL BINDEC + CALL TYPE + DB ' Total Active Bytes' + DW CRLF,CRLF + +;PORT SURVEY + DB 'Active I/O ports',':'+EOL + LXI H,1000H ; DELAY SO MESSAGE OUTPUT +PDLY: + DCX H ; DOESN'T GIVE A FALSE READING + MOV A,H ; ON CONSOLE STATUS PORT + ORA L + JNZ PDLY + LXI H,0 ; Init active port counter + mvi d,0 ; Init port counter + mvi e,0ffh ; init port group variable +PORTLP: + MOV A,D + + IF SKIP ; Single port mask + CPI SKIPORT + JZ ISPORT ; Print mask port + ENDIF + + mov b,a ; save port # + STA INPORT+1 +INPORT: + IN 0 ; Modifiable code +; by trial and error, inactive port could return FF or echo port # + CPI 0FFH + JZ NEXTPT + cmp b + jz nextpt +ISPORT: + mov a,d ; got a live one, probably + ani 0f0h ; is port in same group as last ? + cmp e + jz nocrlf + call type ; no, start a new line + dw crlfe + mov a,d ; save for next time + ani 0f0h + mov e,a +nocrlf: + MOV A,D ; Get port # + PUSH D + PUSH H + HEXOUT + POP H + POP D + INX H ; count another one found + call type + db ' '+eol +NEXTPT: + INR D ; Bump port counter + JNZ PORTLP ; Not done + CALL TYPE ; Done + DW CRLFE + CALL BINDEC + CALL TYPE ; Type Active Ports + DB ' Ports active' + DW CRLFE + CCP: + LHLD OLDSP + SPHL + RET + + +;***********************; +; SUBROUTINES ; +;***********************; + +;Binary to decimal conversion +BINDEC: + DECOUT ; From LIB + RET + +;Types a string of text terminated with bit 7 high +TYPE: + XTHL ; Get string address + PUSH D +TYPELP: + MOV A,M ; Get type data + MOV D,A ; Save for later + ANI 7FH ; Mask ASCII + MOV E,A + PUSH H + PUSH D + CALL TCHR + POP D + POP H + INX H + MVI A,EOL ; End of line bit + ANA D + JP TYPELP ; Not done + POP D + XTHL ; Get return address + RET + +;Types a single character on console +TCHR: + MVI C,2 + JMP BDOS + +;Checks sectors per block and multiplies or divides block size +;Enter with data in D. Result returned in H,L +; +SHF16: + LDA BLKSHF ; Get shift factor (gives block size) + CPI 3 ; Is it 1K (std)? + JNZ NOT3 + MOV L,E ; Yes, use present # +ZH: + MVI H,0 + RET +; +NOT3: + CPI 2 ; Is it minifloppy? + JNZ NOT2 + MOV A,E ; Yes, divide by 2 + RRC + ANI 7FH + MOV L,A + JMP ZH +NOT2: + SUI 3 ; Must be something + MOV B,A ; larger like double + XCHG ; sided or double dens +BITSHF: + DAD H ; 16 bit 2^(B-1) + DCR B + JNZ BITSHF + RET + + +;***********************; +; DATA STORAGE ; +;***********************; + +FCB: DB 0,'???????????',0,0,0 ; File control block + DS 17 ; Extra FCB workspace +OLDSP: DS 2 ; Old stack pointer +RAM: DS 2 ; RAM counter +ROM: DS 2 ; ROM counter +RAMF: DS 1 ; RAM good flag +EMPF: DS 1 ; Empty so far flag +BLKSHF: DS 1 ; block shift factor +MAXALL: DS 2 ; maximum block number +FINIS EQU $ ; End of program + END + \ No newline at end of file diff --git a/Source/Build.cmd b/Source/Build.cmd index 3881bebc..2493a5a0 100644 --- a/Source/Build.cmd +++ b/Source/Build.cmd @@ -1,7 +1,7 @@ @echo off setlocal -setlocal & call BuildDoc || exit /b 1 & endlocal +REM setlocal & call BuildDoc || exit /b 1 & endlocal setlocal & call BuildHardware || exit /b 1 & endlocal setlocal & call BuildImages || exit /b 1 & endlocal setlocal & call BuildShared || exit /b 1 & endlocal diff --git a/Source/CBIOS/ver.inc b/Source/CBIOS/ver.inc index 45b2b5c7..c4a948ee 100644 --- a/Source/CBIOS/ver.inc +++ b/Source/CBIOS/ver.inc @@ -2,4 +2,4 @@ #DEFINE RMN 8 #DEFINE RUP 6 #DEFINE RTP 0 -#DEFINE BIOSVER "2.8.6" +#DEFINE BIOSVER "2.8.6-pre.0" diff --git a/Source/HBIOS/Config/RC_std.asm b/Source/HBIOS/Config/RC_std.asm index 8141b71d..1f2c5bda 100644 --- a/Source/HBIOS/Config/RC_std.asm +++ b/Source/HBIOS/Config/RC_std.asm @@ -9,5 +9,7 @@ CPUOSC .SET 7372800 ; CPU OSC FREQ DEFSERCFG .SET SER_115200_8N1 ; DEFAULT SERIAL LINE CONFIG (SHOULD MATCH ABOVE) ; SIOENABLE .SET TRUE ; TRUE FOR ZILOG SIO/2 SUPPORT +ACIAENABLE .SET TRUE ; TRUE FOR MOTOROLA 6850 ACIA SUPPORT + ; IDEENABLE .SET TRUE ; TRUE FOR IDE DEVICE SUPPORT \ No newline at end of file diff --git a/Source/HBIOS/acia.asm b/Source/HBIOS/acia.asm new file mode 100644 index 00000000..0b6e939c --- /dev/null +++ b/Source/HBIOS/acia.asm @@ -0,0 +1,531 @@ +; +;================================================================================================== +; ACIA DRIVER (SERIAL PORT) +;================================================================================================== +; +; SETUP PARAMETER WORD: +; +-------+---+-------------------+ +---+---+-----------+---+-------+ +; | |RTS| ENCODED BAUD RATE | |DTR|XON| PARITY |STP| 8/7/6 | +; +-------+---+---+---------------+ ----+---+-----------+---+-------+ +; F E D C B A 9 8 7 6 5 4 3 2 1 0 +; -- MSB (D REGISTER) -- -- LSB (E REGISTER) -- +; +; CURRENTLY ONLY SUPPORTS A SINGLE CHIP IN SYSTEM +; +ACIA_DEBUG .EQU FALSE +; +ACIA_NONE .EQU 0 +ACIA_ACIA .EQU 1 +; +; POSSIBLE BASE I/O ADDRESSES +; NOTE THAT THE ACIA ONLY QUALIFIES ADDRESS BITS 7 & 6, SO +; THE ACIA'S TWO PORTS APPEAR REPEATEDLY OVER AN ADDRESS RANGE +; OF $40 STARTING FROM THE REAL BASE PORT. +; WE TAKE ADVANTAGE OF THIS TO AVOID CONFLICTING WITH SIO +; AND COMPACT FLASH MODULES DURING DETECTION PROBES. +; +ACIAA_BASE .EQU $80 + $20 ; MODULE A +ACIAB_BASE .EQU $40 + $20 ; MODULE B +; +ACIA_RTSON .EQU %10010110 ; RCV INT, RTS ASSERTED, 8N1, CLK/64 BAUD +ACIA_RTSOFF .EQU %11010110 ; RCV INT, RTS DEASSERTED, 8N1, CLK/64 BAUD +; +; +; +ACIA_PREINIT: +; +; SETUP THE DISPATCH TABLE ENTRIES +; + LD B,ACIA_CNT ; LOOP CONTROL + LD C,0 ; PHYSICAL UNIT INDEX + XOR A ; ZERO TO ACCUM + LD (ACIA_DEV),A ; CURRENT DEVICE NUMBER +ACIA_PREINIT0: + PUSH BC ; SAVE LOOP CONTROL + LD A,C ; PHYSICAL UNIT TO A + RLCA ; MULTIPLY BY CFG TABLE ENTRY SIZE (8 BYTES) + RLCA ; ... + RLCA ; ... TO GET OFFSET INTO CFG TABLE + LD HL,ACIA_CFG ; POINT TO START OF CFG TABLE + CALL ADDHLA ; HL := ENTRY ADDRESS + PUSH HL ; SAVE IT + PUSH HL ; COPY CFG DATA PTR + POP IY ; ... TO IY + CALL ACIA_INITUNIT ; HAND OFF TO GENERIC INIT CODE + POP DE ; GET ENTRY ADDRESS BACK, BUT PUT IN DE + POP BC ; RESTORE LOOP CONTROL +; + LD A,(IY + 1) ; GET THE ACIA TYPE DETECTED + OR A ; SET FLAGS + JR Z,ACIA_PREINIT2 ; SKIP IT IF NOTHING FOUND +; + PUSH BC ; SAVE LOOP CONTROL + LD BC,ACIA_DISPATCH ; BC := DISPATCH ADDRESS + CALL NZ,CIO_ADDENT ; ADD ENTRY IF ACIA FOUND, BC:DE + POP BC ; RESTORE LOOP CONTROL +; +ACIA_PREINIT2: + INC C ; NEXT PHYSICAL UNIT + DJNZ ACIA_PREINIT0 ; LOOP UNTIL DONE +; + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +; ACIA INITIALIZATION ROUTINE +; +ACIA_INITUNIT: + CALL ACIA_DETECT ; DETERMINE ACIA TYPE + LD (IY + 1),A ; SAVE IN CONFIG TABLE + OR A ; SET FLAGS + RET Z ; ABORT IF NOTHING THERE + + ; UPDATE WORKING ACIA DEVICE NUM + LD HL,ACIA_DEV ; POINT TO CURRENT UART DEVICE NUM + LD A,(HL) ; PUT IN ACCUM + INC (HL) ; INCREMENT IT (FOR NEXT LOOP) + LD (IY),A ; UDPATE UNIT NUM + + ; ADD IM1 INT CALL LIST ENTRY + LD L,(IY+6) ; GET RCVBUF PTR + LD H,(IY+7) ; ... INTO HL + LD A,5 ; OFFSET OF INT HANDLER PTR + CALL ADDHLA ; ADD TO HL + LD A,(HL) ; DEREFERENCE + INC HL ; ... + LD H,(HL) ; ... + LD L,A ; ... + CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST + + ; SET DEFAULT CONFIG + LD DE,-1 ; LEAVE CONFIG ALONE + JP ACIA_INITDEV ; IMPLEMENT IT AND RETURN +; +; +; +ACIA_INIT: + LD B,ACIA_CNT ; COUNT OF POSSIBLE ACIA UNITS + LD C,0 ; INDEX INTO ACIA CONFIG TABLE +ACIA_INIT1: + PUSH BC ; SAVE LOOP CONTROL + + LD A,C ; PHYSICAL UNIT TO A + RLCA ; MULTIPLY BY CFG TABLE ENTRY SIZE (8 BYTES) + RLCA ; ... + RLCA ; ... TO GET OFFSET INTO CFG TABLE + LD HL,ACIA_CFG ; POINT TO START OF CFG TABLE + CALL ADDHLA ; HL := ENTRY ADDRESS + PUSH HL ; COPY CFG DATA PTR + POP IY ; ... TO IY + + LD A,(IY + 1) ; GET ACIA TYPE + OR A ; SET FLAGS + CALL NZ,ACIA_PRTCFG ; PRINT IF NOT ZERO + + POP BC ; RESTORE LOOP CONTROL + INC C ; NEXT UNIT + DJNZ ACIA_INIT1 ; LOOP TILL DONE +; + XOR A ; SIGNAL SUCCESS + RET ; DONE +; +; INTERRUPT HANDLERS +; +ACIAA_INT: + LD IY,ACIAA_CFG ; POINT TO CONFIG +; + ; CHECK FOR RECEIVE PENDING + LD C,(IY+3) ; STATUS PORT + IN A,(C) ; GET STATUS + AND $01 ; ISOLATE RECEIVE READY BIT + RET Z ; IF NOT, RETURN WITH Z SET +; +ACIAA_INT00: + ; HANDLE PENDING RECEIVE + INC C ; DATA PORT + IN A,(C) ; READ PORT + DEC C ; BACK TO CONTROL PORT + LD E,A ; SAVE BYTE READ + LD A,(ACIAA_BUFCNT) ; GET CURRENT BUFFER USED COUNT + CP ACIAA_BUFSZ ; COMPARE TO BUFFER SIZE + RET Z ; BAIL OUT IF BUFFER FULL, RCV BYTE DISCARDED + INC A ; INCREMENT THE COUNT + LD (ACIAA_BUFCNT),A ; AND SAVE IT + CP ACIAA_BUFSZ - 5 ; BUFFER GETTING FULL? + JR NZ,ACIAA_INT0 ; IF NOT, BYPASS DEASSERTING RTS + LD A,ACIA_RTSOFF ; VALUE TO DEASSERT RTS + OUT (C),A ; DO IT +ACIAA_INT0: + LD HL,(ACIAA_HD) ; GET HEAD POINTER + LD A,L ; GET LOW BYTE + CP ACIAA_BUFEND & $FF ; PAST END? + JR NZ,ACIAA_INT1 ; IF NOT, BYPASS POINTER RESET + LD HL,ACIAA_BUF ; ... OTHERWISE, RESET TO START OF BUFFER +ACIAA_INT1: + LD A,E ; RECOVER BYTE READ + LD (HL),A ; SAVE RECEIVED BYTE TO HEAD POSITION + INC HL ; INCREMENT HEAD POINTER + LD (ACIAA_HD),HL ; SAVE IT +; + ; CHECK FOR MORE PENDING... + IN A,(C) ; GET STATUS + RRA ; READY BIT TO CF + JR C,ACIAA_INT00 ; IF SET, DO SOME MORE + OR $FF ; NZ SET TO INDICATE INT HANDLED + RET ; AND RETURN +; +ACIAB_INT: + LD IY,ACIAB_CFG ; POINT TO CONFIG +; + ; CHECK FOR RECEIVE PENDING + LD C,(IY+3) ; STATUS PORT + IN A,(C) ; GET STATUS + AND $01 ; ISOLATE RECEIVE READY BIT + RET Z ; IF NOT, RETURN WITH Z SET +; +ACIAB_INT00: + ; HANDLE PENDING RECEIVE + INC C ; DATA PORT + IN A,(C) ; READ PORT + DEC C ; BACK TO CONTROL PORT + LD E,A ; SAVE BYTE READ + LD A,(ACIAB_BUFCNT) ; GET CURRENT BUFFER USED COUNT + CP ACIAB_BUFSZ ; COMPARE TO BUFFER SIZE + RET Z ; BAIL OUT IF BUFFER FULL, RCV BYTE DISCARDED + INC A ; INCREMENT THE COUNT + LD (ACIAB_BUFCNT),A ; AND SAVE IT + CP ACIAB_BUFSZ - 5 ; BUFFER GETTING FULL? + JR NZ,ACIAB_INT0 ; IF NOT, BYPASS DEASSERTING RTS + LD A,ACIA_RTSOFF ; VALUE TO DEASSERT RTS + OUT (C),A ; DO IT +ACIAB_INT0: + LD HL,(ACIAB_HD) ; GET HEAD POINTER + LD A,L ; GET LOW BYTE + CP ACIAB_BUFEND & $FF ; PAST END? + JR NZ,ACIAB_INT1 ; IF NOT, BYPASS POINTER RESET + LD HL,ACIAB_BUF ; ... OTHERWISE, RESET TO START OF BUFFER +ACIAB_INT1: + LD A,E ; RECOVER BYTE READ + LD (HL),A ; SAVE RECEIVED BYTE TO HEAD POSITION + INC HL ; INCREMENT HEAD POINTER + LD (ACIAB_HD),HL ; SAVE IT +; + ; CHECK FOR MORE PENDING... + IN A,(C) ; GET STATUS + RRA ; READY BIT TO CF + JR C,ACIAB_INT00 ; IF SET, DO SOME MORE + OR $FF ; NZ SET TO INDICATE INT HANDLED + RET ; AND RETURN +; +; +; +ACIA_DISPATCH: + ; DISPATCH TO FUNCTION HANDLER + PUSH HL ; SAVE HL FOR NOW + LD A,B ; GET FUNCTION + AND $0F ; ISOLATE LOW NIBBLE + RLCA ; X 2 FOR WORD OFFSET INTO FUNCTION TABLE + LD HL,ACIA_FTBL ; START OF FUNC TABLE + CALL ADDHLA ; HL := ADDRESS OF ADDRESS OF FUNCTION + LD A,(HL) ; DEREF HL + INC HL ; ... + LD H,(HL) ; ... + LD L,A ; ... TO GET ADDRESS OF FUNCTION + EX (SP),HL ; RESTORE HL & PUT FUNC ADDRESS -> (SP) + RET ; EFFECTIVELY A JP TO TGT ADDRESS + +ACIA_FTBL: + .DW ACIA_IN + .DW ACIA_OUT + .DW ACIA_IST + .DW ACIA_OST + .DW ACIA_INITDEV + .DW ACIA_QUERY + .DW ACIA_DEVICE +; +; +; +ACIA_IN: + LD A,(IY+2) ; GET MODULE ID + OR A ; SET FLAGS + JR Z,ACIAA_IN ; HANDLE MODULE 0 + DEC A ; TEST FOR NEXT + JR Z,ACIAB_IN ; HANDLE MODULE 1 + CALL PANIC ; ELSE FATAL ERROR + RET +; +ACIAA_IN: + CALL ACIAA_IST ; RECEIVED CHAR READY? + JR Z,ACIAA_IN ; LOOP TILL WE HAVE SOMETHING IN BUFFER + DI ; AVOID COLLIACIAN WITH INT HANDLER + LD A,(ACIAA_BUFCNT) ; GET COUNT + DEC A ; DECREMENT COUNT + LD (ACIAA_BUFCNT),A ; SAVE SAVE IT + CP 5 ; BUFFER LOW THRESHOLD + JR NZ,ACIAA_IN0 ; IF NOT, BYPASS SETTING RTS + + LD C,(IY + 3) ; C := ACIA CMD PORT + LD A,ACIA_RTSON ; ASSERT RTS + OUT (C),A ; DO IT +ACIAA_IN0: + LD HL,(ACIAA_TL) ; GET BUFFER TAIL POINTER + LD E,(HL) ; GET BYTE + INC HL ; BUMP TAIL POINTER + LD A,L ; GET LOW BYTE + CP ACIAA_BUFEND & $FF ; PAST END? + JR NZ,ACIAA_IN1 ; IF NOT, BYPASS POINTER RESET + LD HL,ACIAA_BUF ; ... OTHERWISE, RESET TO START OF BUFFER +ACIAA_IN1: + LD (ACIAA_TL),HL ; SAVE UPDATED TAIL POINTER + EI ; INTERRUPTS OK AGAIN + XOR A ; SIGNAL SUCCESS + RET ; AND DONE +; +ACIAB_IN: + CALL ACIAB_IST ; RECEIVED CHAR READY? + JR Z,ACIAB_IN ; LOOP TILL WE HAVE SOMETHING IN BUFFER + DI ; AVOID COLLIACIAN WITH INT HANDLER + LD A,(ACIAB_BUFCNT) ; GET COUNT + DEC A ; DECREMENT COUNT + LD (ACIAB_BUFCNT),A ; SAVE SAVE IT + CP 5 ; BUFFER LOW THRESHOLD + JR NZ,ACIAB_IN0 ; IF NOT, BYPASS SETTING RTS + + LD C,(IY + 3) ; C := ACIA CMD PORT + LD A,ACIA_RTSON ; ASSERT RTS + OUT (C),A ; DO IT +ACIAB_IN0: + LD HL,(ACIAB_TL) ; GET BUFFER TAIL POINTER + LD E,(HL) ; GET BYTE + INC HL ; BUMP TAIL POINTER + LD A,L ; GET LOW BYTE + CP ACIAB_BUFEND & $FF ; PAST END? + JR NZ,ACIAB_IN1 ; IF NOT, BYPASS POINTER RESET + LD HL,ACIAB_BUF ; ... OTHERWISE, RESET TO START OF BUFFER +ACIAB_IN1: + LD (ACIAB_TL),HL ; SAVE UPDATED TAIL POINTER + EI ; INTERRUPTS OK AGAIN + XOR A ; SIGNAL SUCCESS + RET ; AND DONE +; +; +; +ACIA_OUT: + CALL ACIA_OST ; READY FOR CHAR? + JR Z,ACIA_OUT ; LOOP IF NOT + LD C,(IY + 3) ; C := ACIA CMD PORT + INC C ; BUMP TO DATA PORT + OUT (C),E ; SEND CHAR FROM E + XOR A ; SIGNAL SUCCESS + RET +; +; +; +ACIA_IST: + LD A,(IY+2) ; GET MODULE ID + OR A ; SET FLAGS + JR Z,ACIAA_IST ; HANDLE MODULE 0 + DEC A ; TEST FOR NEXT + JR Z,ACIAB_IST ; HANDLE MODULE 1 + CALL PANIC ; ELSE FATAL ERROR + RET +; +ACIAA_IST: + LD A,(ACIAA_BUFCNT) ; GET BUFFER UTILIZATION COUNT + OR A ; SET FLAGS + JP Z,CIO_IDLE ; NOT READY, RETURN VIA IDLE PROCESSING + RET ; AND DONE +; +ACIAB_IST: + LD A,(ACIAB_BUFCNT) ; GET BUFFER UTILIZATION COUNT + OR A ; SET FLAGS + JP Z,CIO_IDLE ; NOT READY, RETURN VIA IDLE PROCESSING + RET ; AND DONE +; +; +; +ACIA_OST: + LD C,(IY + 3) ; CMD PORT + IN A,(C) ; GET STATUS + AND $02 ; ISOLATE BIT 2 (TX EMPTY) + JP Z,CIO_IDLE ; NOT READY, RETURN VIA IDLE PROCESSING + XOR A ; ZERO ACCUM + INC A ; ACCUM := 1 TO SIGNAL 1 BUFFER POSITION + RET ; DONE +; +; +; +ACIA_INITDEV: + HB_DI ; AVOID CONFLICTS +; + ; PROGRAM THE ACIA CHIP + LD C,(IY + 3) ; COMMAND PORT + LD A,$FF ; MASTER RESET + OUT (C),A ; DO IT + LD A,ACIA_RTSON ; NORMAL OPERATION + OUT (C),A ; DO IT +; + ; RESET THE RECEIVE BUFFER + LD E,(IY + 6) + LD D,(IY + 7) ; DE := _CNT + XOR A ; A := 0 + LD (DE),A ; _CNT = 0 + INC DE ; DE := ADR OF _HD + PUSH DE ; SAVE IT + INC DE + INC DE + INC DE + INC DE ; DE := ADR OF _BUF + POP HL ; HL := ADR OF _HD + LD (HL),E + INC HL + LD (HL),D ; _HD := _BUF + INC HL + LD (HL),E + INC HL + LD (HL),D ; _TL := _BUF +; + HB_EI ; READY FOR INTS AGAIN + XOR A ; SIGNAL SUCCESS + RET ; RETURN +; +; +; +ACIA_QUERY: + LD E,(IY + 4) ; FIRST CONFIG BYTE TO E + LD D,(IY + 5) ; SECOND CONFIG BYTE TO D + XOR A ; SIGNAL SUCCESS + RET ; DONE +; +; +; +ACIA_DEVICE: + LD D,CIODEV_ACIA ; D := DEVICE TYPE + LD E,(IY) ; E := PHYSICAL UNIT + XOR A ; SIGNAL SUCCESS + RET +; +; ACIA DETECTION ROUTINE +; +ACIA_DETECT: + ;LD C,ACIA_BASE ; BASE PORT ADDRESS + LD C,(IY+3) ; BASE PORT ADDRESS + CALL ACIA_DETECT2 ; CHECK IT + JR Z,ACIA_DETECT1 ; FOUND IT, RECORD IT + ;LD C,ACIA_ALTBASE ; ALT BASE PORT ADDRESS + ;CALL ACIA_DETECT2 ; CHECK IT + ;JR Z,ACIA_DETECT1 ; FOUND IT, RECORD IT + LD A,ACIA_NONE ; NOTHING FOUND + RET ; DONE +; +ACIA_DETECT1: + ; ACIA FOUND, RECORD IT + ;LD A,C ; BASE PORT ADDRESS TO A + ;LD (IY + 3),A ; SAVE ACTIVE BASE PORT + LD A,ACIA_ACIA ; RETURN CHIP TYPE + RET ; DONE +; +ACIA_DETECT2: + ; LOOK FOR ACIA AT PORT ADDRESS IN C + LD A,$03 ; MASTER RESET + OUT (C),A ; DO IT + IN A,(C) ; GET STATUS + OR A ; CHECK FOR ZERO + RET NZ ; RETURN IF NOT ZERO + LD A,$02 ; CLEAR MASTER RESET + OUT (C),A ; DO IT + ; CHECK FOR EXPECTED BITS: + ; TDRE=1, DCD & CTS = 0 + AND %00001110 ; BIT MASK FOR "STABLE" BITS + CP %00000010 ; EXPECTED VALUE + RET ; RETURN RESULT, Z = CHIP FOUND +; +; +; +ACIA_PRTCFG: + ; ANNOUNCE PORT + CALL NEWLINE ; FORMATTING + PRTS("ACIA$") ; FORMATTING + LD A,(IY) ; DEVICE NUM + CALL PRTDECB ; PRINT DEVICE NUM + PRTS(": IO=0x$") ; FORMATTING + LD A,(IY + 3) ; GET BASE PORT + CALL PRTHEXBYTE ; PRINT BASE PORT + + ; PRINT THE ACIA TYPE + CALL PC_SPACE ; FORMATTING + LD A,(IY + 1) ; GET ACIA TYPE BYTE + RLCA ; MAKE IT A WORD OFFSET + LD HL,ACIA_TYPE_MAP ; POINT HL TO TYPE MAP TABLE + CALL ADDHLA ; HL := ENTRY + LD E,(HL) ; DEREFERENCE + INC HL ; ... + LD D,(HL) ; ... TO GET STRING POINTER + CALL WRITESTR ; PRINT IT +; + ; ALL DONE IF NO ACIA WAS DETECTED + LD A,(IY + 1) ; GET ACIA TYPE BYTE + OR A ; SET FLAGS + RET Z ; IF ZERO, NOT PRESENT +; + PRTS(" MODE=$") ; FORMATTING + LD E,(IY + 4) ; LOAD CONFIG + LD D,(IY + 5) ; ... WORD TO DE + CALL PS_PRTSC0 ; PRINT CONFIG +; + XOR A + RET +; +; +; +ACIA_TYPE_MAP: + .DW ACIA_STR_NONE + .DW ACIA_STR_ACIA + +ACIA_STR_NONE .DB "$" +ACIA_STR_ACIA .DB "ACIA$" +; +; WORKING VARIABLES +; +ACIA_DEV .DB 0 ; DEVICE NUM USED DURING INIT +; +; RECEIVE BUFFERS +; +ACIAA_RCVBUF: +ACIAA_BUFCNT .DB 0 ; CHARACTERS IN RING BUFFER +ACIAA_HD .DW ACIAA_BUF ; BUFFER HEAD POINTER +ACIAA_TL .DW ACIAA_BUF ; BUFFER TAIL POINTER +ACIAA_INTP .DW ACIAA_INT ; INT HANDLER POINTER +ACIAA_BUF .FILL 32,0 ; RECEIVE RING BUFFER +ACIAA_BUFEND .EQU $ ; END OF BUFFER +ACIAA_BUFSZ .EQU $ - ACIAA_BUF ; SIZE OF RING BUFFER +; +ACIAB_RCVBUF: +ACIAB_BUFCNT .DB 0 ; CHARACTERS IN RING BUFFER +ACIAB_HD .DW ACIAB_BUF ; BUFFER HEAD POINTER +ACIAB_TL .DW ACIAB_BUF ; BUFFER TAIL POINTER +ACIAB_INTP .DW ACIAB_INT ; INT HANDLER POINTER +ACIAB_BUF .FILL 32,0 ; RECEIVE RING BUFFER +ACIAB_BUFEND .EQU $ ; END OF BUFFER +ACIAB_BUFSZ .EQU $ - ACIAB_BUF ; SIZE OF RING BUFFER +; +; ACIA PORT TABLE +; +ACIA_CFG: +ACIAA_CFG: + ; ACIA MODULE A CONFIG + .DB 0 ; DEVICE NUMBER (SET DURING INIT) + .DB 0 ; ACIA TYPE (SET DURING INIT) + .DB 0 ; MODULE ID + .DB ACIAA_BASE ; BASE PORT (SET DURING DETECT) + .DW DEFSERCFG ; LINE CONFIGURATION + .DW ACIAA_RCVBUF ; POINTER TO RCV BUFFER STRUCT +ACIAB_CFG: + ; ACIA MODULE B CONFIG + .DB 0 ; DEVICE NUMBER (SET DURING INIT) + .DB 0 ; ACIA TYPE (SET DURING INIT) + .DB 1 ; MODULE ID + .DB ACIAB_BASE ; BASE PORT (SET DURING DETECT) + .DW DEFSERCFG ; LINE CONFIGURATION + .DW ACIAB_RCVBUF ; POINTER TO RCV BUFFER STRUCT +; +ACIA_CNT .EQU ($ - ACIA_CFG) / 8 diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index 37643ba3..bcc0776b 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -22,7 +22,8 @@ DSRTCMODE .EQU DSRTCMODE_STD ; DSRTCMODE_STD, DSRTCMODE_MFPIC ASCIENABLE .EQU TRUE ; TRUE FOR Z180 ASCI SUPPORT UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRUE) UARTOSC .EQU 1843200 ; UART OSC FREQUENCY -SIOENABLE .EQU TRUE ; TRUE FOR ZILOG SIO/2 SUPPORT +SIOENABLE .EQU FALSE ; TRUE FOR ZILOG SIO/2 SUPPORT +ACIAENABLE .EQU FALSE ; TRUE FOR MOTOROLA 6850 ACIA SUPPORT ; VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index be33bff4..4403dfc4 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -22,7 +22,8 @@ DSRTCMODE .EQU DSRTCMODE_STD ; DSRTCMODE_STD, DSRTCMODE_MFPIC ASCIENABLE .EQU TRUE ; TRUE FOR Z180 ASCI SUPPORT UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRUE) UARTOSC .EQU 1843200 ; UART OSC FREQUENCY -SIOENABLE .EQU TRUE ; TRUE FOR ZILOG SIO/2 SUPPORT +SIOENABLE .EQU FALSE ; TRUE FOR ZILOG SIO/2 SUPPORT +ACIAENABLE .EQU FALSE ; TRUE FOR MOTOROLA 6850 ACIA SUPPORT ; VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT diff --git a/Source/HBIOS/cfg_rc.asm b/Source/HBIOS/cfg_rc.asm index b88e059b..7badf2fc 100644 --- a/Source/HBIOS/cfg_rc.asm +++ b/Source/HBIOS/cfg_rc.asm @@ -23,6 +23,7 @@ ASCIENABLE .EQU FALSE ; TRUE FOR Z180 ASCI SUPPORT UARTENABLE .EQU FALSE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRUE) UARTOSC .EQU 1843200 ; UART OSC FREQUENCY SIOENABLE .EQU TRUE ; TRUE FOR ZILOG SIO/2 SUPPORT +ACIAENABLE .EQU TRUE ; TRUE FOR MOTOROLA 6850 ACIA SUPPORT ; VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index 541495fc..660a1fd7 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -23,6 +23,7 @@ ASCIENABLE .EQU FALSE ; TRUE FOR Z180 ASCI SUPPORT UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRUE) UARTOSC .EQU 1843200 ; UART OSC FREQUENCY SIOENABLE .EQU FALSE ; TRUE FOR ZILOG SIO/2 SUPPORT +ACIAENABLE .EQU FALSE ; TRUE FOR MOTOROLA 6850 ACIA SUPPORT ; VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT @@ -64,6 +65,9 @@ PRPSDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PRPSDENA PRPCONENABLE .EQU TRUE ; TRUE FOR PROPIO CONSOLE SUPPORT (PS/2 KBD & VGA VIDEO) ; PPPENABLE .EQU FALSE ; TRUE FOR PARPORTPROP SUPPORT +PPPSDENABLE .EQU TRUE ; TRUE FOR PARPORTPROP SD SUPPORT +PPPSDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPPENABLE = TRUE) +PPPCONENABLE .EQU TRUE ; TRUE FOR PROPIO CONSOLE SUPPORT (PS/2 KBD & VGA VIDEO) ; HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE) diff --git a/Source/HBIOS/cfg_zeta.asm b/Source/HBIOS/cfg_zeta.asm index b495a9f2..0640adb9 100644 --- a/Source/HBIOS/cfg_zeta.asm +++ b/Source/HBIOS/cfg_zeta.asm @@ -22,7 +22,8 @@ DSRTCMODE .EQU DSRTCMODE_STD ; DSRTCMODE_STD, DSRTCMODE_MFPIC ASCIENABLE .EQU FALSE ; TRUE FOR Z180 ASCI SUPPORT UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRUE) UARTOSC .EQU 1843200 ; UART OSC FREQUENCY -SIOENABLE .EQU TRUE ; TRUE FOR ZILOG SIO/2 SUPPORT +SIOENABLE .EQU FALSE ; TRUE FOR ZILOG SIO/2 SUPPORT +ACIAENABLE .EQU FALSE ; TRUE FOR MOTOROLA 6850 ACIA SUPPORT ; VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index e7a63ffa..59446b4d 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -146,9 +146,6 @@ CB_SERDEV .DB 0 ; PRIMARY SERIAL UNIT IS UNIT #0 BY FIAT CB_CRTDEV .DB $FF ; PRIMARY CRT UNIT, $FF UNTIL AFTER HBIOS INIT CB_CONDEV .DB $FF ; CONSOLE UNIT, $FF UNTIL AFTER HBIOS INIT ; -;CB_CUREMU .DB VDAEMU ; CURRENT VDA TERMINAL EMULATION (DEPRECATED) -;CB_CURVDA .DB VDADEV ; CURRENT VDA TARGET FOR EMULATION (DEPRECATED) -; ; MEMORY MANAGEMENT VARIABLES START AT $20 ; .FILL (HCB + $20 - $),0 @@ -190,7 +187,7 @@ CB_BIDROMDN .DB BID_ROMDN ; ; DEFINITIONS ; -HBX_BUFSIZ .EQU $40 ; INTERBANK COPY BUFFER +HBX_BUFSIZ .EQU $40 ; INTERBANK COPY BUFFER SIZE ; ; HBIOS IDENTIFICATION DATA BLOCK ; @@ -310,8 +307,9 @@ HBX_BNKCPY: #IF (INTTYPE == IT_SIMH) HB_DI #ENDIF - LD (HBX_BC_SP),SP - LD SP,HBX_TMPSTK + + LD (HBX_BC_SP),SP ; PUT STACK + LD SP,HBX_TMPSTK ; ... IN HI MEM LD A,(HB_CURBNK) ; GET CURRENT BANK PUSH AF ; AND SAVE TO RESTORE LATER @@ -333,11 +331,13 @@ HBX_BC_LAST: ADC HL,BC ; HL := REM LEN (0 - 127) EX (SP),HL ; HL := CUR SRC, (SP) := REM LEN POP BC ; BC := REM LEN - CALL NZ,HBX_BC_ITER ; DO FINAL CHUNK, BUT ONLY IF NOT ZERO BYTES + CALL NZ,HBX_BC_ITER ; DO FINAL CHUNK, IFF > 0 BYTES POP AF ; RECOVER ORIGINAL BANK - CALL HBX_BNKSEL ; SWITCH TO CURRENT BANK AND EXIT - LD SP,$FFFF -HBX_BC_SP .EQU $ - 2 + CALL HBX_BNKSEL ; SWITCH + + LD SP,$FFFF ; RESTORE STACK +HBX_BC_SP .EQU $ - 2 ; ... TO ORIGINAL VALUE + #IF (INTTYPE == IT_SIMH) HB_EI #ENDIF @@ -442,22 +442,22 @@ HBX_STACK .EQU $ ; HBIOS INTERRUPT VECTOR TABLE (16 ENTRIES) ; HBX_IVT: - .DW INT_BAD - .DW INT_BAD - .DW INT_BAD - .DW INT_BAD - .DW INT_BAD - .DW INT_BAD - .DW INT_BAD - .DW INT_BAD - .DW INT_BAD - .DW INT_BAD - .DW INT_BAD - .DW INT_BAD - .DW INT_BAD - .DW INT_BAD - .DW INT_BAD - .DW INT_BAD + .DW INT_BAD ; IVT_INT1 + .DW INT_BAD ; IVT_INT2 + .DW INT_BAD ; IVT_TIM0 + .DW INT_BAD ; IVT_TIM1 + .DW INT_BAD ; IVT_DMA0 + .DW INT_BAD ; IVT_DMA1 + .DW INT_BAD ; IVT_CSIO + .DW INT_BAD ; IVT_SER0 + .DW INT_BAD ; IVT_SER1 + .DW INT_BAD ; + .DW INT_BAD ; + .DW INT_BAD ; + .DW INT_BAD ; + .DW INT_BAD ; + .DW INT_BAD ; + .DW INT_BAD ; ; ; INTERRUPT HANDLER STUBS ; @@ -465,6 +465,12 @@ HBX_IVT: ; INTERRUPT, SETUP A HANDLER VECTOR IN HBIOS AND THEN ; BRANCH TO THE COMMON INTERRUPT DISPATCHER ; +; +INT_IM1: + PUSH HL ; SAVE HL + LD HL,HB_IM1INT ; HL := IM1 INT HANDLER IN BIOS BANK + JR HBX_INT ; TO TO ROUTING CODE +; INT_TIMER: ; TIMER INTERRUPT HANDLER PUSH HL ; SAVE HL LD HL,HB_TIMINT ; HL := INT ADR IN BIOS @@ -476,7 +482,7 @@ INT_BAD: ; BAD INTERRUPT HANDLER JR HBX_INT ; TO TO ROUTING CODE ; #IF (SIOENABLE) -INT_SIO: ; SIO DEVICE INTERRUPT HANDLER +INT_SIO: ; SIO INTERRUPT HANDLER PUSH HL ; SAVE HL LD HL,SIO_INT ; HL := SIO INT HANDLER IN BIOS BANK JR HBX_INT ; TO TO ROUTING CODE @@ -726,6 +732,9 @@ HB_START1: ; BNKCALL ARRIVES HERE, BUT NOW RUNNING IN RAM BANK #IF (SIOENABLE) CALL SIO_PREINIT #ENDIF +#IF (ACIAENABLE) + CALL ACIA_PREINIT +#ENDIF ; ; PRIOR TO THIS POINT, CONSOLE I/O WAS DIRECTED TO HARDWARE (XIO.ASM). ; NOW THAT HBIOS IS READY, SET THE CONSOLE UNIT TO ACTIVATE CONSOLE I/O @@ -739,12 +748,39 @@ HB_START1: ; BNKCALL ARRIVES HERE, BUT NOW RUNNING IN RAM BANK CALL NEWLINE2 PRTX(STR_BANNER) ; -; WE CAN HANDLE INTERRUPTS NOW (HOPEFULLY) +; IO PORT SCAN +; +#IF 0 +PSCN: + LD C,0 ; IO PORT NUMBER + LD B,0 ; LOOP COUNTER + CALL NEWLINE +PSCN1: + CALL NEWLINE + LD A,C + CALL PRTHEXBYTE + CALL PC_COLON + CALL PC_SPACE + CALL DELAY + LD A,C + LD (PSCNX),A +PSCNX .EQU $ + 1 + IN A,(0) + CALL PRTHEXBYTE + CALL PC_COMMA + PUSH BC + LD B,0 + IN A,(C) + POP BC + CALL PRTHEXBYTE + INC C + DJNZ PSCN1 +#ENDIF +; +; SETUP INTERRUPT VECTORS, AS APPROPRIATE ; HB_DI ; START OF CRITICAL SECTION -#IF (INTTYPE != IT_NONE) -; #IF (INTTYPE == IT_SIMH) ; ; SETUP TIMER INT VECTOR VIA INT MODE 1 IN PAGE ZERO @@ -776,7 +812,7 @@ HB_START1: ; BNKCALL ARRIVES HERE, BUT NOW RUNNING IN RAM BANK ; ; SETUP Z180 TIMER0 INTERRUPT VECTOR IN IVT LD HL,INT_TIMER - LD (HBX_IVT + Z180_IVTIM0),HL + LD (HBX_IVT + IVT_TIM0),HL ; SETUP PERIODIC TIMER INTERRUPT ON TIMER 0 LD HL,(CB_CPUKHZ) ; 50HZ = 18432000 / 20 / 50 / X, SO X = CPU KHZ @@ -796,37 +832,36 @@ HB_START1: ; BNKCALL ARRIVES HERE, BUT NOW RUNNING IN RAM BANK ; #IF (INTTYPE == IT_RC) ; - ; SETUP Z80 IVT + #IF 0 + ; SETUP Z80 IVT AND INT MODE 2 LD A,HBX_IVT >> 8 ; SETUP HI BYTE OF IVT ADDRESS LD I,A ; ... AND PLACE IT IN I REGISTER -; IM 2 ; SWITCH TO INT MODE 2 ; -#IF (SIOENABLE) + #IF (SIOENABLE) ; SETUP SIO INTERRUPT VECTOR IN IVT LD HL,INT_SIO - LD (HBX_IVT + 4),HL -#ENDIF - - - - + LD (HBX_IVT + IVT_SER0),HL + #ENDIF ; -; IM 1 + #ENDIF ; -;#IF (SIOENABLE) -;; -; ; SETUP SIO INT VECTOR VIA INT MODE 1 IN PAGE ZERO -; ;LD A,$C3 ; JP OPCODE -; ;LD ($38),A ; ... AT INT VECTOR ADDRESS -; ;LD HL,INT_SIO ; ADDRESS OF SIO INT HANDLER -; ;LD ($39),HL ; ... IS TARGET OF JP -;; -;#ENDIF + #IF 1 + ; SET INT MODE 1 + IM 1 ; -#ENDIF + #IF (SIOENABLE | ACIAENABLE) + ; SETUP IM1 INT VECTOR VIA INT MODE 1 IN PAGE ZERO + LD A,$C3 ; JP OPCODE + LD ($38),A ; ... AT INT VECTOR ADDRESS + LD HL,INT_IM1 ; ADDRESS OF SIO INT HANDLER + LD ($39),HL ; ... IS TARGET OF JP + #ENDIF +; + #ENDIF ; #ENDIF +; HB_EI ; END OF CRITICAL SECTION ; ; DISPLAY PLATFORM INFORMATION @@ -991,6 +1026,9 @@ HB_INITTBL: #IF (SIOENABLE) .DW SIO_INIT #ENDIF +#IF (ACIAENABLE) + .DW ACIA_INIT +#ENDIF #IF (SIMRTCENABLE) .DW SIMRTC_INIT #ENDIF @@ -1876,6 +1914,37 @@ CIO_IDLE: POP AF ; RECOVER AF RET ; +; IM1 INTERRUPTS ARRIVE HERE AFTER BANK SWITCH TO HBIOS BANK +; LIST OF IM1 INT CALLS IS BUILT DYNAMICALLY BELOW +; SEE HB_ADDIM1 ROUTINE +; EACH ENTRY WILL LOOK LIKE: +; CALL XXXX ; CALL INT HANDLER +; RET NZ ; RETURN IF HANDLED +; +HB_IM1INT: ; IM1 DEVICE INTERRUPT HANDLER + RET ; START WITH NO ENTRIES + .FILL 4 * 8,$C9 ; ROOM FOR 8 ENTRIES +; +; ROUTINE BELOW IS USED TO ADD A NEW VECTOR TO THE IM1 +; CALL LIST ABOVE. ENTER WITH HL=VECTOR ADDRESS IN HBIOS +; +HB_ADDIM1: + EX DE,HL ; VECTOR ADDRESS TO DE + LD HL,(HB_IM1P) ; GET PTR FOR NEXT ENTRY + LD (HL),$CD ; "CALL" OPCODE + INC HL ; BUMP PTR + LD (HL),E ; ADD VECTOR ADDRESS + INC HL ; ... + LD (HL),D ; ... + INC HL ; BUMP PTR + LD (HL),$C0 ; "RET NZ" OPCODE + INC HL ; BUMP PTR + LD (HL),$C9 ; FINAL "RET" OPCODE + LD (HB_IM1P),HL ; SAVE POINTER + RET ; DONE +; +HB_IM1P .DW HB_IM1INT ; POINTER FOR NEXT IM1 ENTRY +; ; TIMER INTERRUPT ; HB_TIMINT: @@ -2068,6 +2137,15 @@ SIZ_SIO .EQU $ - ORG_SIO .ECHO " bytes.\n" #ENDIF ; +#IF (ACIAENABLE) +ORG_ACIA .EQU $ + #INCLUDE "acia.asm" +SIZ_ACIA .EQU $ - ORG_ACIA + .ECHO "ACIA occupies " + .ECHO SIZ_ACIA + .ECHO " bytes.\n" +#ENDIF +; #IF (VGAENABLE) ORG_VGA .EQU $ #INCLUDE "vga.asm" @@ -2920,7 +2998,7 @@ PS_FLPED .TEXT "ED$" ; PS_SDSTRREF: .DW PS_SDUART, PS_SDASCI, PS_SDTERM, - .DW PS_SDPRPCON, PS_SDPPPCON, PS_SDSIO + .DW PS_SDPRPCON, PS_SDPPPCON, PS_SDSIO, PS_SDACIA ; PS_SDUART .TEXT "UART$" PS_SDASCI .TEXT "ASCI$" @@ -2928,6 +3006,7 @@ PS_SDTERM .TEXT "TERM$" PS_SDPRPCON .TEXT "PRPCON$" PS_SDPPPCON .TEXT "PPPCON$" PS_SDSIO .TEXT "SIO$" +PS_SDACIA .TEXT "ACIA$" ; ; SERIAL TYPE STRINGS ; diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index ea5aeb98..f68e170d 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -84,6 +84,7 @@ CIODEV_TERM .EQU $20 CIODEV_PRPCON .EQU $30 CIODEV_PPPCON .EQU $40 CIODEV_SIO .EQU $50 +CIODEV_ACIA .EQU $60 CIODEV_CONSOLE .EQU $D0 ; ; DISK DEVICE IDS diff --git a/Source/HBIOS/ide.asm b/Source/HBIOS/ide.asm index 16af327c..b1fcec4c 100644 --- a/Source/HBIOS/ide.asm +++ b/Source/HBIOS/ide.asm @@ -959,7 +959,13 @@ IDE_INITDEV: #ENDIF CALL IDE_SETFEAT ; SET FEATURE + +#IF (IDE8BIT) + ; "REAL" IDE DRIVES MAY NOT ACCEPT THE DISABLE8BIT FEATURE COMMAND, + ; SO IT IS ONLY AN ERROR IF WE ARE ATTEMPTING TO ENABLE8BIT + ; THANKS TO ED ? FOR POINTING THIS OUT. RET NZ ; BAIL OUT ON ERROR +#ENDIF ; CALL IDE_IDENTIFY ; EXECUTE IDENTIFY COMMAND RET NZ ; BAIL OUT ON ERROR diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index 9d278216..32eeaa68 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -47,8 +47,7 @@ ZSYSIMG .EQU $5000 ; LOADER ;================================================================================================== ; - ;DI ; NO INTERRUPTS - ;IM 1 ; INTERRUPT MODE 1 + DI ; NO INTERRUPTS ; LD SP,BL_STACK ; SETUP STACK ; @@ -75,7 +74,36 @@ PHASE2: CALL DELAY_INIT #ENDIF -#IF (PLATFORM != PLT_UNA) + +#IF (PLATFORM == PLT_UNA) + ; COPY UNA BIOS PAGE ZERO TO USER BANK, LEAVE USER BANK ACTIVE + LD BC,BF_SYSSETBNK ; UNA FUNC = SET BANK + LD DE,BID_BIOS ; UBIOS_PAGE (SEE PAGES.INC) + CALL $FFFD ; DO IT (RST 08 NOT YET INSTALLED) + ;PUSH DE ; SAVE PREVIOUS BANK + + LD HL,0 ; FROM ADDRESS 0 (PAGE ZERO) + LD DE,$9000 ; USE $9000 AS BOUNCE BUFFER + LD BC,256 ; ONE PAGE IS 256 BYTES + LDIR ; DO IT + + LD BC,$01FB ; UNA FUNC = SET BANK + ;POP DE ; RECOVER OPERATING BANK + LD DE,BID_USR ; TO USER BANK + CALL $FFFD ; DO IT (RST 08 NOT YET INSTALLED) + + LD HL,$9000 ; USE $9000 AS BOUNCE BUFFER + LD DE,0 ; TO PAGE ZERO OF OPERATING BANK + LD BC,256 ; ONE PAGE IS 256 BYTES + LDIR ; DO IT + + ; INSTALL UNA INVOCATION VECTOR FOR RST 08 + ; *** IS THIS REDUNDANT? *** + LD A,$C3 ; JP INSTRUCTION + LD (8),A ; STORE AT 0x0008 + LD HL,($FFFE) ; UNA ENTRY VECTOR + LD (9),HL ; STORE AT 0x0009 +#ELSE ; PREP THE USER BANK (SETUP DEFAULT PAGE ZERO) LD B,BF_SYSSETCPY ; HBIOS FUNC: SETUP BANK COPY LD D,BID_USR ; D = DEST BANK = USER BANK @@ -86,8 +114,15 @@ PHASE2: LD HL,0 ; COPY FROM BIOS ADDRESS 0 LD DE,0 ; TO USER ADDRESS 0 RST 08 ; DO IT + + ; NOW SWITCH TO USR BANK + LD B,BF_SYSSETBNK ; HBIOS FUNC: SETBNK + LD C,BID_USR ; USER BANK + RST 08 ; DO IT #ENDIF + EI + ; RUN THE BOOT LOADER MENU JP DOBOOTMENU ; @@ -204,31 +239,101 @@ DB_INVALID: ; GOMON: CALL LDMON - LD HL,MON_SERIAL ; JUMP TO MONITOR, SERIAL ENTRY - JR EXECUSR + ;LD HL,MON_SERIAL ; JUMP TO MONITOR, SERIAL ENTRY + ;JR EXECUSR + JP MON_SERIAL ; GOMONDSKY: CALL LDMON - LD HL,MON_DSKY - JR EXECUSR + ;LD HL,MON_DSKY + ;JR EXECUSR + JP MON_DSKY ; LDMON: LD DE,STR_BOOTMON CALL WRITESTR + ;LD HL,MONIMG + ;LD DE,MON_LOC + ;LD BC,MON_SIZ + ;LDIR +#IF (PLATFORM == PLT_UNA) + DI +; + ; SET LOW MEM TO OS IMAGE BANK + LD BC,BF_SYSSETBNK ; UNA FUNC = SET BANK + LD DE,BID_OSIMG ; UBIOS_PAGE (SEE PAGES.INC) + CALL $FFFD ; DO IT (RST 08 NOT YET INSTALLED) + ; COPY MEMORY LD HL,MONIMG LD DE,MON_LOC LD BC,MON_SIZ LDIR + ; RESET LOW MEM TO USER BANK + LD BC,BF_SYSSETBNK ; UNA FUNC = SET BANK + LD DE,BID_USR ; TO USER BANK + CALL $FFFD ; DO IT (RST 08 NOT YET INSTALLED) +; + EI +#ELSE + LD B,BF_SYSSETCPY ; HBIOS FUNC: SETUP BANK COPY + LD D,BID_USR ; D = DEST BANK = USER BANK + LD E,BID_OSIMG ; E = SRC BANK = OSIMG BANK + LD HL,MON_SIZ ; HL = COPY LEN + RST 08 ; DO IT + LD B,BF_SYSBNKCPY ; HBIOS FUNC: PERFORM BANK COPY + LD HL,MONIMG ; COPY FROM MONITOR IMAGE LOCATION + LD DE,MON_LOC ; TO MONITOR EXECUTION LOCATION + RST 08 ; DO IT +#ENDIF + RET ; +GOZSYS: + LD DE,STR_BOOTZSYS + CALL WRITESTR + LD HL,ZSYSIMG + JR GOCPM2 +; GOCPM: LD DE,STR_BOOTCPM CALL WRITESTR LD HL,CPMIMG GOCPM2: + ;LD DE,CPM_LOC + ;LD BC,CPM_SIZ + ;LDIR + +#IF (PLATFORM == PLT_UNA) + DI + POP HL ; SAVE IMG LOCATION + ; SET LOW MEM TO OS IMAGE BANK + LD BC,BF_SYSSETBNK ; UNA FUNC = SET BANK + LD DE,BID_OSIMG ; UBIOS_PAGE (SEE PAGES.INC) + CALL $FFFD ; DO IT (RST 08 NOT YET INSTALLED) + ; COPY MEMORY + POP HL LD DE,CPM_LOC LD BC,CPM_SIZ LDIR + ; RESET LOW MEM TO USER BANK + LD BC,BF_SYSSETBNK ; UNA FUNC = SET BANK + LD DE,BID_USR ; TO USER BANK + CALL $FFFD ; DO IT (RST 08 NOT YET INSTALLED) + ; + EI +#ELSE + PUSH HL ; SAVE OS IMAGE ADDRESS + LD B,BF_SYSSETCPY ; HBIOS FUNC: SETUP BANK COPY + LD D,BID_USR ; D = DEST BANK = USER BANK + LD E,BID_OSIMG ; E = SRC BANK = OSIMG BANK + LD HL,CPM_SIZ ; HL = COPY LEN + RST 08 ; DO IT + LD B,BF_SYSBNKCPY ; HBIOS FUNC: PERFORM BANK COPY + POP HL ; FROM OS IMAGE ADDRESS + LD DE,CPM_LOC ; TO OS IMG EXECUTION LOCATION + RST 08 ; DO IT +#ENDIF +; #IF (PLATFORM == PLT_UNA) LD DE,-1 LD L,1 @@ -242,23 +347,17 @@ GOCPM2: LD DE,$0100 ; BOOT VOLUME (UNIT, SLICE) RST 08 #ENDIF - LD HL,CPM_ENT ; CPM ENTRY VECTOR - JR EXECUSR -; -GOZSYS: - LD DE,STR_BOOTZSYS - CALL WRITESTR - LD HL,ZSYSIMG - JR GOCPM2 -; -EXECUSR: -#IF (PLATFORM == PLT_UNA) - JP (HL) -#ELSE - LD A,BID_USR ; WITH USER BANK ACTIVE - CALL HB_BNKCALL ; GO THERE - CALL PANIC ; WE ARE NOT SUPPOSED TO RETURN -#ENDIF + ;LD HL,CPM_ENT ; CPM ENTRY VECTOR + JP CPM_ENT ; CPM ENTRY VECTOR +; +;EXECUSR: +;#IF (PLATFORM == PLT_UNA) +; JP (HL) +;#ELSE +; LD A,BID_USR ; WITH USER BANK ACTIVE +; CALL HB_BNKCALL ; GO THERE +; CALL PANIC ; WE ARE NOT SUPPOSED TO RETURN +;#ENDIF ; GOLIST: LD DE,STR_LIST @@ -375,8 +474,8 @@ BOOTDISK: ; JUMP TO COLD BOOT ENTRY CALL NEWLINE ; FORMATTING LD HL,(BB_CPMENT) ; GET THE ENTRY POINT - ;JP (HL) ; ... AND GO - JP EXECUSR ; ... AND GO + ;JP EXECUSR ; ... AND GO + JP (HL) ; ... AND GO ; ; PRINT LIST OF ALL DRIVES UNDER UNA ; diff --git a/Source/HBIOS/sio.asm b/Source/HBIOS/sio.asm index 3800c694..b559a0fe 100644 --- a/Source/HBIOS/sio.asm +++ b/Source/HBIOS/sio.asm @@ -1,5 +1,4 @@ ; -; ;================================================================================================== ; SIO DRIVER (SERIAL PORT) ;================================================================================================== @@ -60,7 +59,15 @@ SIO_PREINIT0: SIO_PREINIT2: INC C ; NEXT PHYSICAL UNIT DJNZ SIO_PREINIT0 ; LOOP UNTIL DONE -; +; + ; ADD IM1 INT CALL LIST ENTRY IF APPROPRIATE + LD A,(SIO_DEV) ; GET NEXT DEVICE NUM + OR A ; SET FLAGS + JR Z,SIO_PREINIT3 ; IF ZERO, NO SIO DEVICES + LD HL,SIO_INT ; GET INT VECTOR + CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST +; +SIO_PREINIT3: XOR A ; SIGNAL SUCCESS RET ; AND RETURN ; @@ -113,13 +120,15 @@ SIO_INIT1: ; INTERRUPT HANDLER ; SIO_INT: +SIOA_INT: ; CHECK FOR RECEIVE PENDING ON CHANNEL A XOR A ; A := 0 OUT (SIOA_CMD),A ; ADDRESS RD0 IN A,(SIOA_CMD) ; GET RD0 - RRA ; RECEIVE READY BIT TO CF - JR NC,SIOB_INT ; NOTHING HERE, TRY B CHANNEL + AND $01 ; ISOLATE RECEIVE READY BIT + JR Z,SIOB_INT ; CHECK CHANNEL B ; +SIOA_INT00: ; HANDLE CHANNEL A IN A,(SIOA_DAT) ; READ PORT LD E,A ; SAVE BYTE READ @@ -138,13 +147,21 @@ SIOA_INT0: LD HL,(SIOA_HD) ; GET HEAD POINTER LD A,L ; GET LOW BYTE CP SIOA_BUFEND & $FF ; PAST END? - JR NZ,SIO_INT1 ; IF NOT, BYPASS POINTER RESET + JR NZ,SIOA_INT1 ; IF NOT, BYPASS POINTER RESET LD HL,SIOA_BUF ; ... OTHERWISE, RESET TO START OF BUFFER -SIO_INT1: +SIOA_INT1: LD A,E ; RECOVER BYTE READ LD (HL),A ; SAVE RECEIVED BYTE TO HEAD POSITION INC HL ; INCREMENT HEAD POINTER LD (SIOA_HD),HL ; SAVE IT +; + ; CHECK FOR MORE PENDING... + XOR A ; A := 0 + OUT (SIOA_CMD),A ; ADDRESS RD0 + IN A,(SIOA_CMD) ; GET RD0 + RRA ; READY BIT TO CF + JR C,SIOA_INT00 ; IF SET, DO SOME MORE + OR $FF ; NZ SET TO INDICATE INT HANDLED RET ; AND RETURN ; SIOB_INT: @@ -152,9 +169,10 @@ SIOB_INT: XOR A ; A := 0 OUT (SIOB_CMD),A ; ADDRESS RD0 IN A,(SIOB_CMD) ; GET RD0 - RRA ; RECEIVE READY BIT TO CF - RET NC ; NOTHING HERE, GIVE UP + AND $01 ; ISOLATE RECEIVE READY BIT + RET Z ; IF NOT, RETURN WITH Z SET ; +SIOB_INT00: ; HANDLE CHANNEL B IN A,(SIOB_DAT) ; READ PORT LD E,A ; SAVE BYTE READ @@ -180,6 +198,14 @@ SIOB_INT1: LD (HL),A ; SAVE RECEIVED BYTE TO HEAD POSITION INC HL ; INCREMENT HEAD POINTER LD (SIOB_HD),HL ; SAVE IT +; + ; CHECK FOR MORE PENDING... + XOR A ; A := 0 + OUT (SIOB_CMD),A ; ADDRESS RD0 + IN A,(SIOB_CMD) ; GET RD0 + RRA ; READY BIT TO CF + JR C,SIOB_INT00 ; IF SET, DO SOME MORE + OR $FF ; NZ SET TO INDICATE INT HANDLED RET ; AND RETURN ; ; @@ -211,7 +237,7 @@ SIO_FTBL: ; ; SIO_IN: - LD A,(IY + 0) ; GET DEVICE NUMBER + LD A,(IY + 2) ; GET CHANNEL OR A ; SET FLAGS JR Z,SIOA_IN ; HANDLE CHANNEL A DEC A ; TEST FOR NEXT DEVICE @@ -256,9 +282,9 @@ SIOB_IN: CP 5 ; BUFFER LOW THRESHOLD JR NZ,SIOB_IN0 ; IF NOT, BYPASS SETTING RTS LD A,5 ; RTS IS IN WR5 - OUT (SIOA_CMD),A ; ADDRESS WR5 + OUT (SIOB_CMD),A ; ADDRESS WR5 LD A,$EA ; VALUE TO SET RTS - OUT (SIOA_CMD),A ; DO IT + OUT (SIOB_CMD),A ; DO IT SIOB_IN0: LD HL,(SIOB_TL) ; GET BUFFER TAIL POINTER LD E,(HL) ; GET BYTE @@ -278,7 +304,8 @@ SIOB_IN1: SIO_OUT: CALL SIO_OST ; READY FOR CHAR? JR Z,SIO_OUT ; LOOP IF NOT - LD C,(IY + 2) ; C := BASE SIO PORT (WHICH IS ALSO THR REG) + LD C,(IY + 3) ; C := SIO CMD PORT + INC C ; BUMP TO DATA PORT OUT (C),E ; SEND CHAR FROM E XOR A ; SIGNAL SUCCESS RET @@ -286,7 +313,7 @@ SIO_OUT: ; ; SIO_IST: - LD A,(IY + 0) ; GET DEVICE NUMBER + LD A,(IY + 2) ; GET CHANNEL OR A ; SET FLAGS JR Z,SIOA_IST ; HANDLE CHANNEL A DEC A ; TEST FOR NEXT DEVICE @@ -322,19 +349,44 @@ SIO_OST: ; ; SIO_INITDEV: + HB_DI ; AVOID CONFLICTS +; + ; PROGRAM THE SIO/2 CHIP CHANNEL LD C,(IY + 3) ; COMMAND PORT LD HL,SIO_INITVALS ; POINT TO INIT VALUES LD B,SIO_INITLEN ; COUNT OF BYTES TO WRITE OTIR ; WRITE ALL VALUES +; + ; RESET THE RECEIVE BUFFER + LD E,(IY + 6) + LD D,(IY + 7) ; DE := _CNT + XOR A ; A := 0 + LD (DE),A ; _CNT = 0 + INC DE ; DE := ADR OF _HD + PUSH DE ; SAVE IT + INC DE + INC DE + INC DE + INC DE ; DE := ADR OF _BUF + POP HL ; HL := ADR OF _HD + LD (HL),E + INC HL + LD (HL),D ; _HD := _BUF + INC HL + LD (HL),E + INC HL + LD (HL),D ; _TL := _BUF +; + HB_EI ; READY FOR INTS AGAIN XOR A ; SIGNAL SUCCESS RET ; RETURN ; +; SIO_INITVALS: .DB $00, $18 ; WR0: CHANNEL RESET .DB $04, $C4 ; WR4: CLK/64=115200 BAUD, NO PARITY, 1 STOP BIT -; .DB $01, $00 ; WR1: NO INTERRUPTS .DB $01, $18 ; WR1: INTERRUPT ON ALL RECEIVE CHARACTERS - .DB $02, $04 ; WR2: INTERRUPT VECTOR OFFSET + .DB $02, IVT_SER0 ; WR2: INTERRUPT VECTOR OFFSET .DB $03, $C1 ; WR3: 8 BIT RCV, RX ENABLE .DB $05, $EA ; WR5: DTR, 8 BITS SEND, TX ENABLE, RTS SIO_INITLEN .EQU $ - SIO_INITVALS @@ -422,38 +474,40 @@ SIO_STR_SIO .DB "SIO$" SIO_DEV .DB 0 ; DEVICE NUM USED DURING INIT ; ; CHANNEL A RECEIVE BUFFER +SIOA_RCVBUF: SIOA_CNT .DB 0 ; CHARACTERS IN RING BUFFER -SIOA_BUF .FILL 32,'%' ; RECEIVE RING BUFFER -SIOA_BUFEND .EQU $ ; END OF BUFFER -SIOA_BUFSZ .EQU $ - SIOA_BUF ; SIZE OF RING BUFFER SIOA_HD .DW SIOA_BUF ; BUFFER HEAD POINTER SIOA_TL .DW SIOA_BUF ; BUFFER TAIL POINTER +SIOA_BUF .FILL 32,0 ; RECEIVE RING BUFFER +SIOA_BUFEND .EQU $ ; END OF BUFFER +SIOA_BUFSZ .EQU $ - SIOA_BUF ; SIZE OF RING BUFFER ; ; CHANNEL B RECEIVE BUFFER +SIOB_RCVBUF: SIOB_CNT .DB 0 ; CHARACTERS IN RING BUFFER -SIOB_BUF .FILL 32,'%' ; RECEIVE RING BUFFER -SIOB_BUFEND .EQU $ ; END OF BUFFER -SIOB_BUFSZ .EQU $ - SIOB_BUF ; SIZE OF RING BUFFER SIOB_HD .DW SIOB_BUF ; BUFFER HEAD POINTER SIOB_TL .DW SIOB_BUF ; BUFFER TAIL POINTER +SIOB_BUF .FILL 32,0 ; RECEIVE RING BUFFER +SIOB_BUFEND .EQU $ ; END OF BUFFER +SIOB_BUFSZ .EQU $ - SIOB_BUF ; SIZE OF RING BUFFER ; ; SIO PORT TABLE ; SIO_CFG: ; SIO/2 CHANNEL A - .DB 0 ; DEVICE NUMBER (UPDATED DURING INIT) - .DB 0 ; SIO TYPE - .DB SIOA_DAT ; DATA PORT - .DB SIOA_CMD ; CMD PORT + .DB 0 ; DEVICE NUMBER (SET DURING INIT) + .DB 0 ; SIO TYPE (SET DURING INIT) + .DB 0 ; SIO CHANNEL (A) + .DB SIOA_CMD ; BASE PORT (CMD PORT) .DW DEFSERCFG ; LINE CONFIGURATION - .FILL 2,$FF ; FILLER + .DW SIOA_RCVBUF ; POINTER TO RCV BUFFER STRUCT ; ; SIO/2 CHANNEL B - .DB 0 ; DEVICE NUMBER (UPDATED DURING INIT) - .DB 0 ; SIO TYPE - .DB SIOB_DAT ; DATA PORT - .DB SIOB_CMD ; CMD PORT + .DB 0 ; DEVICE NUMBER (SET DURING INIT) + .DB 0 ; SIO TYPE (SET DURING INIT) + .DB 1 ; SIO CHANNEL (B) + .DB SIOB_CMD ; BASE PORT (CMD PORT) .DW DEFSERCFG ; LINE CONFIGURATION - .FILL 2,$FF ; FILLER + .DW SIOB_RCVBUF ; POINTER TO RCV BUFFER STRUCT ; SIO_CNT .EQU ($ - SIO_CFG) / 8 diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index 4d247bf7..82feb89a 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -165,6 +165,18 @@ IT_Z180 .EQU 2 IT_CTC .EQU 3 IT_RC .EQU 4 ; +; INTERRUPT VECTOR TABLE ENTRY OFFSETS (Z180 COMPATIBLE) +; +IVT_INT1 .EQU 0 +IVT_INT2 .EQU 2 +IVT_TIM0 .EQU 4 +IVT_TIM1 .EQU 6 +IVT_DMA0 .EQU 8 +IVT_DMA1 .EQU 10 +IVT_CSIO .EQU 12 +IVT_SER0 .EQU 14 +IVT_SER1 .EQU 16 +; #INCLUDE "build.inc" ; INCLUDE USER CONFIG, ADD VARIANT, TIMESTAMP, & ROMSIZE ; #IF ((PLATFORM == PLT_N8) | (PLATFORM == PLT_MK4)) diff --git a/Source/HBIOS/ver.inc b/Source/HBIOS/ver.inc index 45b2b5c7..c4a948ee 100644 --- a/Source/HBIOS/ver.inc +++ b/Source/HBIOS/ver.inc @@ -2,4 +2,4 @@ #DEFINE RMN 8 #DEFINE RUP 6 #DEFINE RTP 0 -#DEFINE BIOSVER "2.8.6" +#DEFINE BIOSVER "2.8.6-pre.0" diff --git a/Source/HBIOS/z180.inc b/Source/HBIOS/z180.inc index 615ec065..5ceb0bae 100644 --- a/Source/HBIOS/z180.inc +++ b/Source/HBIOS/z180.inc @@ -65,13 +65,3 @@ Z180_CBAR .EQU Z180_BASE + $3A ; MMU COMMON/BANK AREA REGISTER ; Z180_OMCR .EQU Z180_BASE + $3E ; OPERATION MODE CONTROL Z180_ICR .EQU $3F ; I/O CONTROL REGISTER (NOT RELOCATED!!!) -; -Z180_IVINT1 .EQU 0 -Z180_IVINT2 .EQU 2 -Z180_IVTIM0 .EQU 4 -Z180_IVTIM1 .EQU 6 -Z180_IVDMA0 .EQU 8 -Z180_IVDMA1 .EQU 10 -Z180_IVCSIO .EQU 12 -Z180_IVSER0 .EQU 14 -Z180_IVSER1 .EQU 16 diff --git a/Source/RomDsk/ROM_1024KB/SURVEY.COM b/Source/RomDsk/ROM_1024KB/SURVEY.COM deleted file mode 100644 index 2b0bf4e468b7d5b6413b89c0e121d32e9028562c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1152 zcmaJ=UuauZ7(e&Vi95l2Ype|ChB?{Q%|&M0n1y;-Q`>cvDW#)dl z>C$WuVp%}ggZO+Ap)W!~opb&HcdjiYaD|jrp}u%2H!sEFgbBVhekVy0CwMORocsO0 z-}imzyXSX82)%YPh5OdABV$6s;V_*l<_qZzom$FWO&94)Z!Bfgv_Eo&f=}@)mCzBS zKI=IcxxuXo@sS5{BRS)0+KLaomvBz-Ji6t2Z>uVB)Z;Lj?|AByu&&%?t3ud^UO8Wm zEMQH`ojH6jKZ81&fvXn$h_y4dS+L8OzqgeOXSj-q>(kUvr5H% z_`+FsUV!?Fe=MCbb48j-F6xTEm-Lgq7>Pv5s}U0ICDDFzE=FQe#a|+iJ&K<`2+iPF zQ;SJHS&JdeEHQ*+bufVB^~e<*naAbPo@*a1GDq})8D&*bi@Nr{2+nx(Hv3i7=kZ!? zU$l2cAbX)X;QYop+VSckD|&<8;x?74lz)&{Hp$?yzMU zM0pfF-&`Jzd?5eA_4$ST6}-!h-@mD?aUm-e_)aWud(fF%*8s7eVXJLVr{)AtNt3Ob z&~Xa?Rkab`*!F}!n}KGNbnooSf*+B+(w!f68`?sG*nAcvDW#)dl z>C$WuVp%}ggZO+Ap)W!~opb&HcdjiYaD|jrp}u%2H!sEFgbBVhekVy0CwMORocsO0 z-}imzyXSX82)%YPh5OdABV$6s;V_*l<_qZzom$FWO&94)Z!Bfgv_Eo&f=}@)mCzBS zKI=IcxxuXo@sS5{BRS)0+KLaomvBz-Ji6t2Z>uVB)Z;Lj?|AByu&&%?t3ud^UO8Wm zEMQH`ojH6jKZ81&fvXn$h_y4dS+L8OzqgeOXSj-q>(kUvr5H% z_`+FsUV!?Fe=MCbb48j-F6xTEm-Lgq7>Pv5s}U0ICDDFzE=FQe#a|+iJ&K<`2+iPF zQ;SJHS&JdeEHQ*+bufVB^~e<*naAbPo@*a1GDq})8D&*bi@Nr{2+nx(Hv3i7=kZ!? zU$l2cAbX)X;QYop+VSckD|&<8;x?74lz)&{Hp$?yzMU zM0pfF-&`Jzd?5eA_4$ST6}-!h-@mD?aUm-e_)aWud(fF%*8s7eVXJLVr{)AtNt3Ob z&~Xa?Rkab`*!F}!n}KGNbnooSf*+B+(w!f68`?sG*nA