You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

206 lines
6.3 KiB

;
;=============================================================================
; USRROM.ASM - SAMPLE CUSTOM ROM USER APPLICATION
;=============================================================================
;
; VERSION 1.1 BY - MARTINR 31-MAY-2024
;
; THIS IS AN EXAMPLE USER ROM APPLICATION THAT IS AUTOMATICALLY INCLUDED
; IN THE ROMWBW ROM. IT IS INVOKED FROM THE BOOT LOADER USING THE
; 'U' (USER APPLICATION) OPTION. YOU MAY REPLACE THIS SOURCE CODE WITH
; YOUR OWN CUSTOM CODE. IT WILL BE ASSEMBLED AND INCLUDED WITH YOUR
; CUSTOM ROM BUILD. REFER TO THE ROMWBW USER GUIDE FOR MORE INFORMATION.
;
; THANKS AND CREDIT TO MARTIN R. FOR PROVIDING THIS APPLICATION!
;
; - THE SOURCE IS ASSEMBLED WITH THE TASM ASSEMBLER.
; - THE APPLICATION MUST START (ORG) AT USR_LOC ($100)
; - THE APPLICATION MUST BE EXACTLY USR_SIZ BYTES. THIS IS AUTOMATICALLY
; ENFORCED AT THE END OF THE FILE.
; - AT EXIT, THE APPLICATION SHOULD RETURN TO THE BOOT LOADER USING THE
; HBIOS WARM RESET FUNCTION AS DEMONSTRATED BELOW.
; - THE APPLICATION MAY MAKE HBIOS FUNCTION CALLS WITHOUT RESTRICTION,
; BUT CANNOT USE ANY OS (CP/M) FUNCTIONS BECAUSE NO OS IS LOADED.
; - THE APPLICATION MAY NOT CHANGE THE INTERRUPT MODE (WHICH IS DEFINED
; IN THE ROM CONFIGURATION). THE SYSTEM'S INTERRUPT
; MODE CAN BE QUERIED BY AN HBIOS API CALL IF DESIRED.
; - THE APPLICATION MAY TEMPORARILY DISABLE INTERRUPTS BY BRACKETING
; SECTIONS OF CODE WITH DI/EI AS NEEDED. IF INTERRUPTS ARE
; TEMPORARILY DISABLED, THEY SHOULD NOT SHOULD NOT
; BE LEFT DISABLED ACROSS HBIOS API CALLS.
;
; INCLUDE STD.ASM WHICH DEFINES SOME KEY EQUATES USED BELOW. MOST
; IMPORTANT ARE USR_LOC, USR_SIZ, AND USR_END. IT ALSO DEFINES EQUATES
; FOR THE HBIOS FUNCTION CALLS.
;
#INCLUDE "std.asm"
;
.LIST
;
CR .EQU 0DH
LF .EQU 0AH
;
ROWS .EQU 8 ; NUMBER OF PIXEL ROWS PER CHARACTER
COLS .EQU 8 ; NUMBER OF PIXEL COLUMNS PER CHARACTER
;
; APPLICATION WILL WILL BE LOADED AT USR_LOC. THEREFORE, THE CODE
; MUST "ORG" AT THIS ADDRESS. TO CHANGE THE LOAD LOCATION OF THIS
; CODE, YOU CAN UPDATE USR_LOC IN STD.ASM.
;
.ORG USR_LOC
;
; PLACE STACK AT THE TOP OF AVAILABLE RAM (JUST BELOW THE HBIOS PROXY).
;
LD SP,HBX_LOC
;
;*****************************************************************************
;
; DISPLAY BANNER
;
LD A,CR
CALL COUT
LD A,LF
CALL COUT ; COUT PRESERVES AF, BC, DE, & HL
CALL COUT
CALL COUT
;
LD HL,BANNER+1 ; POINTER TO THE 8X8 CHARACTER BITMAPS
LD D,ROWS ; D=ROWS PER CHARACTER
;
NXTLIN: LD A,(BANNER) ; FETCH THE NUMBER OF CHARACTERS IN THE BANNER
LD E,A
;
NXTCHR: LD C,(HL) ; FETCH THE BIT PATTERN FOR THE CHARACTER-LINE
LD B,COLS ; 8 COLUMNS PER CHARACTER-LINE
NXTBIT: SLA C ; SHIFT-LEFT THE NEXT BIT INTO THE CARRY FLAG
JR C, DOT
LD A,' ' ; IF NO-CARRY THEN PRINT A 'SPACE'
JR GAP
DOT: LD A,'X' ; IF A CARRY THEN PRINT AN 'X'
GAP: CALL COUT ; COUT PRESERVES AF, BC, DE, & HL
DJNZ NXTBIT ; GO ROUND AND PRINT ALL 8 BITS FOR THE CHARACTER-LINE
;
INC HL ; POINT TO NEXT CHARACTER-LINE
DEC E
JR NZ,NXTCHR ; GO ROUND AND PRINT THE NEXT CHARACTER
;
LD A,CR ; REACHED THE END OF A LINE, SO PRINT CRLF
CALL COUT ; COUT PRESERVES AF, BC, DE, & HL
LD A,LF
CALL COUT
;
DEC D
JR NZ,NXTLIN ; GO ROUND AND PRINT THE NEXT LINE
;
;*****************************************************************************
;
; FINISHED DISPLAYING THE BANNER, NOW END THE 'APP' TIDILY
;
LD HL,MESSAGE ; PRINT A MESSAGE
CALL PRTSTR
CALL CIN ; AND WAIT FOR A KEYPRESS
;
LD B,BF_SYSRESET ; SYSTEM RESTART
LD C,BF_SYSRES_WARM ; WARM START
RST 08 ; CALL HBIOS (DOES NOT RETURN)
;
;*****************************************************************************
;
; SUPPORT ROUTINES
;
; PRINT A STRING OF CHARACTERS STARTING AT HL, ENDING WITH '$'
;
PRTSTR: LD A,(HL)
INC HL
CP '$'
RET Z
CALL COUT
JR PRTSTR
;
; OUTPUT CHARACTER IN A TO CONSOLE DEVICE
;
COUT: PUSH AF
PUSH BC
PUSH DE
PUSH HL
LD B,BF_CIOOUT
LD C,CIO_CONSOLE
LD E,A
RST 08
POP HL
POP DE
POP BC
POP AF
RET
;
; WAIT FOR A CHARACTER FROM THE CONSOLE DEVICE AND RETURN IT IN A
;
CIN: PUSH BC
PUSH DE
PUSH HL
LD B,BF_CIOIN
LD C,CIO_CONSOLE
RST 08
LD A,E
POP HL
POP DE
POP BC
RET
;
;*****************************************************************************
;
; DATA SECTION
;
BANNER:
.DB 6 ; THE NUMBER OF CHARACTERS IN THE BANNER
;
#IF FALSE
; UPPER CASE LOGO ("ROMWBW")
.DB %01111100, %00011100, %01000001, %01000001, %01111100, %01000001
.DB %01000010, %00100010, %01100011, %01000001, %01000010, %01000001
.DB %01000001, %01000001, %01010101, %01000001, %01000001, %01000001
.DB %01000001, %01000001, %01001001, %00100010, %01111110, %00100010
.DB %01111110, %01000001, %01000001, %00100010, %01000010, %00100010
.DB %01000100, %01000001, %01000001, %00101010, %01000001, %00101010
.DB %01000010, %00100010, %01000001, %00101010, %01000001, %00101010
.DB %01000001, %00011100, %01000001, %00010100, %01111110, %00010100
#ENDIF
;
#IF TRUE
; UPPER AND LOWER CASE LOGO ("RomWBW")
.DB %00000000, %00000000, %00000000, %00000000, %00000000, %00000000
.DB %01111000, %00000000, %00000000, %01000100, %01111000, %01000100
.DB %01000100, %00000000, %00000000, %01000100, %01000100, %01000100
.DB %01000100, %00111000, %00101000, %01000100, %01000100, %01000100
.DB %01111000, %01000100, %01010100, %01010100, %01111000, %01010100
.DB %01010000, %01000100, %01010100, %01010100, %01000100, %01010100
.DB %01001000, %01000100, %01000100, %01101100, %01000100, %01101100
.DB %01000100, %00111000, %01000100, %01000100, %01111000, %01000100
#ENDIF
;
MESSAGE:
.DB CR,LF,LF
.DB "This is an example User Application - why not create your own?",CR,LF
.DB "Please see the relevant User Guide section for more information."
.DB CR,LF,LF,LF
.DB "Press a key to return to Boot Loader.$"
;
; IT IS CRITICAL THAT THE FINAL BINARY BE EXACTLY USR_SIZ BYTES.
; THIS GENERATES FILLER AS NEEDED. IT WILL ALSO FORCE AN ASSEMBLY
; ERROR IF THE SIZE EXCEEDS THE SPACE ALLOCATED.
;
SLACK .EQU (USR_END - $)
;
#IF (SLACK < 0)
.ECHO "*** USRAPP IS TOO BIG!!!\n"
!!! ; FORCE AN ASSEMBLY ERROR
#ENDIF
;
.FILL SLACK,$00
.ECHO "User ROM space remaining: "
.ECHO SLACK
.ECHO " bytes.\n"
;
.NOLIST
;
.END