mirror of
https://github.com/digarok/gslib.git
synced 2024-12-29 01:33:08 +00:00
Apple IIgs Assembly Language Crash Course, Part 1
This commit is contained in:
parent
4b0f87782a
commit
f929f312b4
14
README.md
14
README.md
@ -2,3 +2,17 @@ gslib
|
||||
=====
|
||||
|
||||
Apple IIgs Assembly Language Crash Course
|
||||
|
||||
|
||||
Source Files in "Lesson" Order
|
||||
|
||||
|
||||
quit.s Quit, Old-School simple quit program
|
||||
quit8.s Quit8.System, ProDOS8 simple quit program
|
||||
quit16.s Quit16, GSOS/P16 simple quit program
|
||||
shr1.s SHR1, Shows how to turn on SHR Graphics Mode and clear screen
|
||||
shr2.s SHR2, Adds functions to write palettes, clear screen to color, set scan-line control bytes
|
||||
font.s Font routines, this is a library you can include to draw text
|
||||
shrhello.s "Hello World", Example program showing how to use the font routines
|
||||
shrloadimg.s SHRLoadImage, Loads a PackBytes image and unpacks it to screen
|
||||
shrloadimg.m.s macros for ToolBox calls in SHRLoadImage
|
||||
|
607
source/font.s
Normal file
607
source/font.s
Normal file
@ -0,0 +1,607 @@
|
||||
****************************************
|
||||
* FONT ENGINE (v3?) *
|
||||
* *
|
||||
* Dagen Brock <dagenbrock@gmail.com> *
|
||||
* 2013-07-20 *
|
||||
****************************************
|
||||
* A= ptr to string preceded by length *
|
||||
* X= screen location *
|
||||
****************************************
|
||||
; each char:
|
||||
; draw char at loc
|
||||
; update loc
|
||||
; see if length hit - no? back to draw char
|
||||
mx %00
|
||||
]F_Length ds 2 ;length of string (only one byte currently used)
|
||||
]F_CharIdx ds 2 ;index of current character
|
||||
]F_CurrentPos ds 2 ;current top left char position
|
||||
]F_StrPtr equ $00 ;pointer to string (including length byte) / DP
|
||||
|
||||
|
||||
DrawString sta ]F_StrPtr ;store at dp 0 ($00) for indirect loads
|
||||
stx ]F_CurrentPos
|
||||
stz ]F_CharIdx
|
||||
lda (]F_StrPtr)
|
||||
and #$00ff ;strip off first char (len is only one byte)
|
||||
sta ]F_Length ;get our length byte
|
||||
|
||||
NextChar lda ]F_CharIdx
|
||||
cmp ]F_Length
|
||||
bne :notDone
|
||||
rts ;DONE! Return to caller
|
||||
|
||||
:notDone inc ]F_CharIdx
|
||||
ldy ]F_CharIdx
|
||||
lda ($00),y ;get next char!
|
||||
and #$00FF ;mask high byte
|
||||
sec
|
||||
sbc #' ' ;our table starts with space ' '
|
||||
asl ;*2
|
||||
tay
|
||||
ldx ]F_CurrentPos
|
||||
jsr :drawChar
|
||||
inc ]F_CurrentPos ;compare to addition time (?)
|
||||
inc ]F_CurrentPos
|
||||
inc ]F_CurrentPos
|
||||
inc ]F_CurrentPos ;update screen pos (2 words=8 pixels)
|
||||
bra NextChar
|
||||
|
||||
;x = TopLeft screen pos
|
||||
;y = char table offset
|
||||
:drawChar lda FontTable,y ;get real address of char data
|
||||
sec
|
||||
sbc #FontData ;pivot offset - now a is offset of fontdata
|
||||
tay ;so we'll index with that
|
||||
lda FontData,y
|
||||
stal $E12000,x
|
||||
lda FontData+2,y
|
||||
stal #2+$E12000,x
|
||||
lda FontData+4,y
|
||||
stal #160+$E12000,x
|
||||
lda FontData+6,y
|
||||
stal #160+2+$E12000,x
|
||||
lda FontData+8,y
|
||||
stal #160*2+$E12000,x
|
||||
lda FontData+10,y
|
||||
stal #160*2+2+$E12000,x
|
||||
lda FontData+12,y
|
||||
stal #160*3+$E12000,x
|
||||
lda FontData+14,y
|
||||
stal #160*3+2+$E12000,x
|
||||
lda FontData+16,y
|
||||
stal #160*4+$E12000,x
|
||||
lda FontData+18,y
|
||||
stal #160*4+2+$E12000,x
|
||||
lda FontData+20,y
|
||||
stal #160*5+$E12000,x
|
||||
lda FontData+22,y
|
||||
stal #160*5+2+$E12000,x
|
||||
rts
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
FontTable dw s_Space
|
||||
dw s_Exclaim
|
||||
dw s_Quote
|
||||
dw s_Number
|
||||
dw s_Dollar
|
||||
dw s_Percent
|
||||
dw s_Amper
|
||||
dw s_Single
|
||||
dw s_OpenParen
|
||||
dw s_CloseParen
|
||||
dw s_Asterix
|
||||
dw s_Plus
|
||||
dw s_Comma
|
||||
dw s_Minus
|
||||
dw s_Period
|
||||
dw s_Slash
|
||||
dw s_N0
|
||||
dw s_N1
|
||||
dw s_N2
|
||||
dw s_N3
|
||||
dw s_N4
|
||||
dw s_N5
|
||||
dw s_N6
|
||||
dw s_N7
|
||||
dw s_N8
|
||||
dw s_N9
|
||||
dw s_Colon
|
||||
dw s_Semi
|
||||
dw s_LAngle
|
||||
dw s_Equal
|
||||
dw s_RAngle
|
||||
dw s_Question
|
||||
dw s_At
|
||||
dw s_A
|
||||
dw s_B
|
||||
dw s_C
|
||||
dw s_D
|
||||
dw s_E
|
||||
dw s_F
|
||||
dw s_G
|
||||
dw s_H
|
||||
dw s_I
|
||||
dw s_J
|
||||
dw s_K
|
||||
dw s_L
|
||||
dw s_M
|
||||
dw s_N
|
||||
dw s_O
|
||||
dw s_P
|
||||
dw s_Q
|
||||
dw s_R
|
||||
dw s_S
|
||||
dw s_T
|
||||
dw s_U
|
||||
dw s_V
|
||||
dw s_W
|
||||
dw s_X
|
||||
dw s_Y
|
||||
dw s_Z
|
||||
dw s_LBracket
|
||||
dw s_BackSlash
|
||||
dw s_RBracket
|
||||
dw s_Carot
|
||||
dw s_UnderLine
|
||||
|
||||
FontData = *
|
||||
s_Space hex 00000000
|
||||
hex 00000000
|
||||
hex 00000000
|
||||
hex 00000000
|
||||
hex 00000000
|
||||
hex 00000000
|
||||
|
||||
s_Exclaim hex 000FF000
|
||||
hex 000FF000
|
||||
hex 000FF000
|
||||
hex 000FF000
|
||||
hex 00000000
|
||||
hex 000FF000
|
||||
|
||||
s_Quote hex 0FF00FF0
|
||||
hex 00F000F0
|
||||
hex 00000000
|
||||
hex 00000000
|
||||
hex 00000000
|
||||
hex 00000000
|
||||
|
||||
s_Number hex 00000000
|
||||
hex 00F00F00
|
||||
hex 0FFFFFF0
|
||||
hex 00F00F00
|
||||
hex 0FFFFFF0
|
||||
hex 00F00F00
|
||||
|
||||
s_Dollar hex 000F0F00
|
||||
hex 00FFFFF0
|
||||
hex 0F0F0F00
|
||||
hex 00FFFF00
|
||||
hex 000F0FF0
|
||||
hex 0FFFFF00
|
||||
|
||||
s_Percent hex 0FF000F0
|
||||
hex 00000F00
|
||||
hex 0000F000
|
||||
hex 000F0000
|
||||
hex 00F00000
|
||||
hex 0F000FF0
|
||||
|
||||
s_Amper hex 000FF000
|
||||
hex 00F00F00
|
||||
hex 0F00F000
|
||||
hex 00F000F0
|
||||
hex 0F0FFF00
|
||||
hex 00F0F000
|
||||
|
||||
s_Single hex 000FF000
|
||||
hex 0000F000
|
||||
hex 00000000
|
||||
hex 00000000
|
||||
hex 00000000
|
||||
hex 00000000
|
||||
|
||||
s_OpenParen hex 000FF000
|
||||
hex 00FF0000
|
||||
hex 0FF00000
|
||||
hex 0FF00000
|
||||
hex 00FF0000
|
||||
hex 000FF000
|
||||
|
||||
s_CloseParen hex 000FF000
|
||||
hex 0000FF00
|
||||
hex 00000FF0
|
||||
hex 00000FF0
|
||||
hex 0000FF00
|
||||
hex 000FF000
|
||||
|
||||
|
||||
s_Asterix hex 00000000
|
||||
hex 00F0F0F0
|
||||
hex 000FFF00
|
||||
hex 00FFFFF0
|
||||
hex 000FFF00
|
||||
hex 00F0F0F0
|
||||
|
||||
s_Plus hex 000F0000
|
||||
hex 000F0000
|
||||
hex 0FFFFF00
|
||||
hex 000F0000
|
||||
hex 000F0000
|
||||
hex 00000000
|
||||
|
||||
s_Comma hex 00000000
|
||||
hex 00000000
|
||||
hex 00000000
|
||||
hex 00000000
|
||||
hex 0000FF00
|
||||
hex 0000F000
|
||||
|
||||
s_Minus hex 00000000
|
||||
hex 00000000
|
||||
hex 0FFFFF00
|
||||
hex 00000000
|
||||
hex 00000000
|
||||
hex 00000000
|
||||
|
||||
|
||||
s_Period hex 00000000
|
||||
hex 00000000
|
||||
hex 00000000
|
||||
hex 00000000
|
||||
hex 0000FF00
|
||||
hex 0000FF00
|
||||
|
||||
s_Slash hex 000000F0
|
||||
hex 00000F00
|
||||
hex 0000F000
|
||||
hex 000F0000
|
||||
hex 00F00000
|
||||
hex 0F000000
|
||||
|
||||
s_N0 hex 00FFFF00
|
||||
hex 0F000FF0
|
||||
hex 0F00F0F0
|
||||
hex 0F0F00F0
|
||||
hex 0FF000F0
|
||||
hex 00FFFF00
|
||||
|
||||
s_N1 hex 000F0000
|
||||
hex 00FF0000
|
||||
hex 000F0000
|
||||
hex 000F0000
|
||||
hex 000F0000
|
||||
hex 00FFF000
|
||||
|
||||
s_N2 hex 00FFFF00
|
||||
hex 0F0000F0
|
||||
hex 00000F00
|
||||
hex 000FF000
|
||||
hex 00F00000
|
||||
hex 0FFFFFF0
|
||||
|
||||
s_N3 hex 00FFFF00
|
||||
hex 000000F0
|
||||
hex 000FFF00
|
||||
hex 000000F0
|
||||
hex 000000F0
|
||||
hex 00FFFF00
|
||||
|
||||
s_N4 hex 0000FF00
|
||||
hex 000F0F00
|
||||
hex 00F00F00
|
||||
hex 0FFFFFF0
|
||||
hex 00000F00
|
||||
hex 00000F00
|
||||
|
||||
s_N5 hex 0FFFFFF0
|
||||
hex 0F000000
|
||||
hex 0FFFFF00
|
||||
hex 000000F0
|
||||
hex 0F0000F0
|
||||
hex 00FFFF00
|
||||
|
||||
s_N6 hex 000FFF00
|
||||
hex 00F00000
|
||||
hex 0F000000
|
||||
hex 0FFFFF00
|
||||
hex 0F0000F0
|
||||
hex 00FFFFF0
|
||||
|
||||
s_N7 hex 0FFFFFF0
|
||||
hex 000000F0
|
||||
hex 00000F00
|
||||
hex 0000F000
|
||||
hex 000F0000
|
||||
hex 000F0000
|
||||
|
||||
s_N8 hex 00FFFF00
|
||||
hex 0F0000F0
|
||||
hex 00FFFF00
|
||||
hex 0F0000F0
|
||||
hex 0F0000F0
|
||||
hex 00FFFF00
|
||||
|
||||
s_N9 hex 00FFFF00
|
||||
hex 0F0000F0
|
||||
hex 00FFFF00
|
||||
hex 0000F000
|
||||
hex 000F0000
|
||||
hex 00F00000
|
||||
|
||||
s_Colon hex 000FF000
|
||||
hex 000FF000
|
||||
hex 00000000
|
||||
hex 000FF000
|
||||
hex 000FF000
|
||||
hex 00000000
|
||||
|
||||
s_Semi hex 00000000
|
||||
hex 000FF000
|
||||
hex 000FF000
|
||||
hex 00000000
|
||||
hex 000FF000
|
||||
hex 000F0000
|
||||
|
||||
s_LAngle hex 0000F000
|
||||
hex 000F0000
|
||||
hex 00F00000
|
||||
hex 000F0000
|
||||
hex 0000F000
|
||||
hex 00000000
|
||||
|
||||
s_Equal hex 00000000
|
||||
hex 00000000
|
||||
hex 0FFFFF00
|
||||
hex 00000000
|
||||
hex 0FFFFF00
|
||||
hex 00000000
|
||||
|
||||
s_RAngle hex 0000F000
|
||||
hex 00000F00
|
||||
hex 000000F0
|
||||
hex 00000F00
|
||||
hex 0000F000
|
||||
hex 00000000
|
||||
|
||||
s_Question hex 00FFF000
|
||||
hex 0F000F00
|
||||
hex 00000F00
|
||||
hex 000FF000
|
||||
hex 00000000
|
||||
hex 000FF000
|
||||
|
||||
s_At hex 00FFFF00
|
||||
hex 0F0000F0
|
||||
hex 0F00F0F0
|
||||
hex 0FFFF0F0
|
||||
hex 000000F0
|
||||
hex 0FFFFF00
|
||||
|
||||
s_A hex 000FF000
|
||||
hex 00F00F00
|
||||
hex 0F0000F0
|
||||
hex 0FFFFFF0
|
||||
hex 0F0000F0
|
||||
hex 0F0000F0
|
||||
|
||||
s_B hex 0FFFFF00
|
||||
hex 0F0000F0
|
||||
hex 0FFFFF00
|
||||
hex 0F0000F0
|
||||
hex 0F0000F0
|
||||
hex 0FFFFF00
|
||||
|
||||
s_C hex 00FFFFF0
|
||||
hex 0F000000
|
||||
hex 0F000000
|
||||
hex 0F000000
|
||||
hex 0F000000
|
||||
hex 00FFFFF0
|
||||
|
||||
s_D hex 0FFFFF00
|
||||
hex 0F0000F0
|
||||
hex 0F0000F0
|
||||
hex 0F0000F0
|
||||
hex 0F0000F0
|
||||
hex 0FFFFF00
|
||||
|
||||
s_E hex 0FFFFFF0
|
||||
hex 0F000000
|
||||
hex 0FFFF000
|
||||
hex 0F000000
|
||||
hex 0F000000
|
||||
hex 0FFFFFF0
|
||||
|
||||
s_F hex 0FFFFFF0
|
||||
hex 0F000000
|
||||
hex 0FFFF000
|
||||
hex 0F000000
|
||||
hex 0F000000
|
||||
hex 0F000000
|
||||
|
||||
s_G hex 00FFFFF0
|
||||
hex 0F000000
|
||||
hex 0F000000
|
||||
hex 0F00FFF0
|
||||
hex 0F0000F0
|
||||
hex 00FFFF00
|
||||
|
||||
s_H hex 0F0000F0
|
||||
hex 0F0000F0
|
||||
hex 0FFFFFF0
|
||||
hex 0F0000F0
|
||||
hex 0F0000F0
|
||||
hex 0F0000F0
|
||||
|
||||
s_I hex 0FFFFF00
|
||||
hex 000F0000
|
||||
hex 000F0000
|
||||
hex 000F0000
|
||||
hex 000F0000
|
||||
hex 0FFFFF00
|
||||
|
||||
s_J hex 000000F0
|
||||
hex 000000F0
|
||||
hex 000000F0
|
||||
hex 0F0000F0
|
||||
hex 0F0000F0
|
||||
hex 00FFFF00
|
||||
|
||||
s_K hex 0F000F00
|
||||
hex 0F00F000
|
||||
hex 0FFF0000
|
||||
hex 0F00F000
|
||||
hex 0F000F00
|
||||
hex 0F000F00
|
||||
|
||||
s_L hex 0F000000
|
||||
hex 0F000000
|
||||
hex 0F000000
|
||||
hex 0F000000
|
||||
hex 0F000000
|
||||
hex 0FFFFFF0
|
||||
|
||||
s_M hex 0F0000F0
|
||||
hex 0FF00FF0
|
||||
hex 0F0FF0F0
|
||||
hex 0F0000F0
|
||||
hex 0F0000F0
|
||||
hex 0F0000F0
|
||||
|
||||
s_N hex 0F0000F0
|
||||
hex 0FF000F0
|
||||
hex 0F0F00F0
|
||||
hex 0F00F0F0
|
||||
hex 0F000FF0
|
||||
hex 0F0000F0
|
||||
|
||||
s_O hex 00FFFF00
|
||||
hex 0F0000F0
|
||||
hex 0F0000F0
|
||||
hex 0F0000F0
|
||||
hex 0F0000F0
|
||||
hex 00FFFF00
|
||||
|
||||
s_P hex 0FFFFF00
|
||||
hex 0F0000F0
|
||||
hex 0FFFFF00
|
||||
hex 0F000000
|
||||
hex 0F000000
|
||||
hex 0F000000
|
||||
|
||||
s_Q hex 00FFFF00
|
||||
hex 0F0000F0
|
||||
hex 0F0000F0
|
||||
hex 0F00F0F0
|
||||
hex 0F000FF0
|
||||
hex 00FFFFF0
|
||||
|
||||
s_R hex 0FFFFF00
|
||||
hex 0F0000F0
|
||||
hex 0FFFFF00
|
||||
hex 0F000F00
|
||||
hex 0F0000F0
|
||||
hex 0F0000F0
|
||||
|
||||
s_S hex 00FFFFF0
|
||||
hex 0F000000
|
||||
hex 00FFFF00
|
||||
hex 000000F0
|
||||
hex 000000F0
|
||||
hex 0FFFFF00
|
||||
|
||||
s_T hex 0FFFFF00
|
||||
hex 000F0000
|
||||
hex 000F0000
|
||||
hex 000F0000
|
||||
hex 000F0000
|
||||
hex 000F0000
|
||||
|
||||
s_U hex 0F0000F0
|
||||
hex 0F0000F0
|
||||
hex 0F0000F0
|
||||
hex 0F0000F0
|
||||
hex 0F0000F0
|
||||
hex 00FFFF00
|
||||
|
||||
s_V hex 0F0000F0
|
||||
hex 0F0000F0
|
||||
hex 0F0000F0
|
||||
hex 0F0000F0
|
||||
hex 00F00F00
|
||||
hex 000FF000
|
||||
|
||||
s_W hex 0F0000F0
|
||||
hex 0F0000F0
|
||||
hex 0F0000F0
|
||||
hex 0F0FF0F0
|
||||
hex 0FF00FF0
|
||||
hex 0F0000F0
|
||||
|
||||
s_X hex 0F0000F0
|
||||
hex 00F00F00
|
||||
hex 000FF000
|
||||
hex 000FF000
|
||||
hex 00F00F00
|
||||
hex 0F0000F0
|
||||
|
||||
s_Y hex F00000F0
|
||||
hex 0F000F00
|
||||
hex 00F0F000
|
||||
hex 000F0000
|
||||
hex 000F0000
|
||||
hex 000F0000
|
||||
|
||||
s_Z hex 0FFFFFF0
|
||||
hex 00000F00
|
||||
hex 0000F000
|
||||
hex 000F0000
|
||||
hex 00F00000
|
||||
hex 0FFFFFF0
|
||||
|
||||
s_LBracket hex 000FFF00
|
||||
hex 000F0000
|
||||
hex 000F0000
|
||||
hex 000F0000
|
||||
hex 000F0000
|
||||
hex 000FFF00
|
||||
|
||||
s_BackSlash hex 0F000000
|
||||
hex 00F00000
|
||||
hex 000F0000
|
||||
hex 0000F000
|
||||
hex 00000F00
|
||||
hex 000000F0
|
||||
|
||||
s_RBracket hex 00FFF000
|
||||
hex 0000F000
|
||||
hex 0000F000
|
||||
hex 0000F000
|
||||
hex 0000F000
|
||||
hex 00FFF000
|
||||
|
||||
s_Carot hex 0000F000
|
||||
hex 000F0F00
|
||||
hex 00F000F0
|
||||
hex 00000000
|
||||
hex 00000000
|
||||
hex 00000000
|
||||
|
||||
s_UnderLine hex 00000000
|
||||
hex 00000000
|
||||
hex 00000000
|
||||
hex 00000000
|
||||
hex 00000000
|
||||
hex FFFFFFF0
|
||||
|
||||
s_Template hex 00000000
|
||||
hex 00000000
|
||||
hex 00000000
|
||||
hex 00000000
|
||||
hex 00000000
|
||||
hex 00000000
|
||||
|
11
source/quit.s
Normal file
11
source/quit.s
Normal file
@ -0,0 +1,11 @@
|
||||
****************************************
|
||||
* Quit *
|
||||
* *
|
||||
* Dagen Brock <dagenbrock@gmail.com> *
|
||||
* 2013-06-24 *
|
||||
****************************************
|
||||
|
||||
rts ; return from wherever we were called
|
||||
|
||||
|
||||
|
26
source/quit16.s
Normal file
26
source/quit16.s
Normal file
@ -0,0 +1,26 @@
|
||||
****************************************
|
||||
* Quit16 *
|
||||
* *
|
||||
* Dagen Brock <dagenbrock@gmail.com> *
|
||||
* 2013-06-10 *
|
||||
****************************************
|
||||
|
||||
rel ; compile as relocatable code
|
||||
dsk Quit16.l ; Save Name
|
||||
|
||||
phk ; Set Data Bank to Program Bank
|
||||
plb ; Always do this first!
|
||||
|
||||
jsl $E100A8 ; Prodos 16 entry point
|
||||
da $29 ; Quit code
|
||||
adrl QuitParm ; address of parameter table
|
||||
bcs Error ; never taken
|
||||
|
||||
Error brk ; should never get here
|
||||
|
||||
QuitParm adrl $0000 ; pointer to pathname (not used here)
|
||||
da $00 ; quit type (absolute quit)
|
||||
|
||||
|
||||
|
||||
|
29
source/quit8.s
Normal file
29
source/quit8.s
Normal file
@ -0,0 +1,29 @@
|
||||
****************************************
|
||||
* Quit8 *
|
||||
* *
|
||||
* Dagen Brock <dagenbrock@gmail.com> *
|
||||
* 2013-06-24 *
|
||||
****************************************
|
||||
|
||||
org $2000 ; start at $2000 (all ProDOS8 system files)
|
||||
dsk quit8.system ; tell compiler what name for output file
|
||||
typ $ff ; set P8 type ($ff = "SYS") for output file
|
||||
|
||||
MLI equ $bf00
|
||||
|
||||
|
||||
|
||||
Quit jsr MLI ; first actual command, call ProDOS vector
|
||||
dfb $65 ; with "quit" request ($65)
|
||||
da QuitParm
|
||||
bcs Error
|
||||
brk $00 ; shouldn't ever here!
|
||||
|
||||
QuitParm dfb 4 ; number of parameters
|
||||
dfb 0 ; standard quit type
|
||||
da $0000 ; not needed when using standard quit
|
||||
dfb 0 ; not used
|
||||
da $0000 ; not used
|
||||
|
||||
|
||||
Error brk $00 ; shouldn't be here either
|
64
source/shr1.s
Normal file
64
source/shr1.s
Normal file
@ -0,0 +1,64 @@
|
||||
****************************************
|
||||
* SHR1 *
|
||||
* *
|
||||
* Dagen Brock <dagenbrock@gmail.com> *
|
||||
* 2013-07-17 *
|
||||
****************************************
|
||||
|
||||
rel ; Compile
|
||||
dsk SHR1.l ; Save Name
|
||||
mx %00 ; Program starts in 16-bit mode
|
||||
|
||||
phk ; Set Data Bank to Program Bank
|
||||
plb ; Always do this first!
|
||||
|
||||
GraphicsOn sep #$30 ; 8-bit mode
|
||||
lda #$81
|
||||
stal $00C029 ; Turn on SHR mode
|
||||
rep #$30 ; back to 16-bit mode
|
||||
|
||||
jsr WaitKey ; pause
|
||||
|
||||
|
||||
|
||||
ClearNaive ldx #$0000 ; Start at first pixel
|
||||
lda #$0000 ; store zeros
|
||||
:clearloop stal $E12000,x ; screen location
|
||||
inx
|
||||
inx
|
||||
cpx #$8000 ; see if we've filled entire frame/colors/scbs
|
||||
bne :clearloop ; pause
|
||||
|
||||
|
||||
jsr WaitKey
|
||||
|
||||
|
||||
|
||||
ClearFaster ldx #$7FFE ; start at top this time
|
||||
lda #$0000 ; store zeros
|
||||
:clearloop stal $E12000,x ; screen location
|
||||
dex
|
||||
dex
|
||||
; avoid 16K "compare X's" for 80K cycle savings
|
||||
bne :clearloop ; loop until we've worked our way down to 0
|
||||
jsr WaitKey
|
||||
|
||||
|
||||
jsl $E100A8 ; Prodos 16 entry point
|
||||
da $29 ; Quit code
|
||||
adrl QuitParm ; address of parameter table
|
||||
bcs Error ; never taken
|
||||
|
||||
Error brk ; should never get here
|
||||
|
||||
QuitParm adrl $0000 ; pointer to pathname (not used here)
|
||||
da $00 ; quit type (absolute quite)
|
||||
|
||||
WaitKey sep #$30 ; good old apple ii key wait routine
|
||||
:wait ldal $00C000 ; but called using long addressing modes
|
||||
bpl :wait ; in 8-bit mode
|
||||
stal $00C010
|
||||
rep #$30
|
||||
rts
|
||||
|
||||
|
86
source/shr2.s
Normal file
86
source/shr2.s
Normal file
@ -0,0 +1,86 @@
|
||||
****************************************
|
||||
* SHR2 *
|
||||
* *
|
||||
* Dagen Brock <dagenbrock@gmail.com> *
|
||||
* 2013-07-17 *
|
||||
****************************************
|
||||
|
||||
rel ;Compile
|
||||
dsk SHR2.l ;Save Name
|
||||
mx %00 ;Program starts in 16-bit mode
|
||||
|
||||
phk ;Set Data Bank to Program Bank
|
||||
plb ;Always do this first!
|
||||
|
||||
lda #$0FFF ; WHITE color
|
||||
ldx #$0001 ; palette index 1 (NOT zero)
|
||||
jsr SetPaletteColor
|
||||
|
||||
lda #$0000
|
||||
jsr SetSCBs ;set all SCBs to 00 (320 mode, pal 0, no fill, no interrupt)
|
||||
jsr ClearToColor ;clear screen (fill with zeros)
|
||||
jsr GraphicsOn ;turn on SHR
|
||||
jsr WaitKey
|
||||
|
||||
lda #$1111 ;clear screen to color 1
|
||||
jsr ClearToColor
|
||||
jsr WaitKey
|
||||
|
||||
jsl $E100A8 ;Prodos 16 entry point
|
||||
da $29 ;Quit code
|
||||
adrl QuitParm ;address of parameter table
|
||||
bcs Error ;never taken
|
||||
|
||||
Error brk ;should never get here
|
||||
|
||||
QuitParm adrl $0000 ;pointer to pathname (not used here)
|
||||
da $00 ;quit type (absolute quite)
|
||||
|
||||
|
||||
****************************************
|
||||
* Turn on SHR mode *
|
||||
****************************************
|
||||
GraphicsOn sep #$30 ;8-bit mode
|
||||
lda #$81 ;%1000 0001
|
||||
stal $00C029 ;Turn on SHR mode
|
||||
rep #$30 ;back to 16-bit mode
|
||||
rts
|
||||
|
||||
****************************************
|
||||
* A= color values (0RGB) *
|
||||
* X= color/palette offset *
|
||||
* (0-F = pal0, 10-1F = pal1, etc.) *
|
||||
****************************************
|
||||
SetPaletteColor pha ;save accumulator
|
||||
txa
|
||||
asl ;X*2 = real offset to color table
|
||||
tax
|
||||
pla
|
||||
stal $E19E00,x ;palettes are stored from $E19E00-FF
|
||||
rts ;yup, that's it
|
||||
|
||||
****************************************
|
||||
* A= color values (0RGB) *
|
||||
****************************************
|
||||
ClearToColor ldx #$7D00 ;start at top of pixel data! ($2000-9D00)
|
||||
:clearloop dex
|
||||
dex
|
||||
stal $E12000,x ;screen location
|
||||
bne :clearloop ;loop until we've worked our way down to 0
|
||||
rts
|
||||
|
||||
SetSCBs ldx #$0100 ;set all $100 scbs to A
|
||||
:scbloop dex
|
||||
dex
|
||||
stal $E19D00,x
|
||||
bne :scbloop
|
||||
rts
|
||||
|
||||
WaitKey sep #$30
|
||||
:wait ldal $00C000
|
||||
bpl :wait
|
||||
stal $00C010
|
||||
rep #$30
|
||||
rts
|
||||
|
||||
|
99
source/shrhello.s
Normal file
99
source/shrhello.s
Normal file
@ -0,0 +1,99 @@
|
||||
****************************************
|
||||
* SHRHELLO *
|
||||
* *
|
||||
* Dagen Brock <dagenbrock@gmail.com> *
|
||||
* 2013-07-21 *
|
||||
****************************************
|
||||
|
||||
rel ; Compile
|
||||
dsk SHRHELLO.l ; Save Name
|
||||
mx %00
|
||||
phk ; Set Data Bank to Program Bank
|
||||
plb ; Always do this first!
|
||||
|
||||
lda #$0FFF ; WHITE color
|
||||
ldx #$000F ; palette index 1 (NOT zero)
|
||||
jsr SetPaletteColor
|
||||
lda #$0589 ; other color
|
||||
ldx #$0001 ; palette index 1 (NOT zero)
|
||||
jsr SetPaletteColor
|
||||
lda #$0000
|
||||
jsr SetSCBs ; set all SCBs to 00 (320 mode, pal 0, no fill, no interrupt)
|
||||
jsr GraphicsOn
|
||||
|
||||
|
||||
lda #$0000 ; clear screen to color 0 and turn on SHR graphics
|
||||
jsr ClearToColor
|
||||
lda #HelloStr
|
||||
ldx #60*160+30
|
||||
jsr DrawString
|
||||
jsr WaitKey
|
||||
|
||||
lda #$1111 ; clear screen to color 1
|
||||
jsr ClearToColor
|
||||
lda #HelloStr
|
||||
ldx #60*160+30
|
||||
jsr DrawString
|
||||
jsr WaitKey
|
||||
|
||||
|
||||
|
||||
jsl $E100A8 ; Prodos 16 entry point
|
||||
da $29 ; Quit code
|
||||
adrl QuitParm ; address of parameter table
|
||||
bcs Error ; never taken
|
||||
|
||||
Error brk ; should never get here
|
||||
|
||||
QuitParm adrl $0000 ; pointer to pathname (not used here)
|
||||
da $00 ; quit type (absolute quite)
|
||||
|
||||
HelloStr str 'HELLO KANSASFEST'
|
||||
|
||||
****************************************
|
||||
* Turn on SHR mode *
|
||||
****************************************
|
||||
GraphicsOn sep #$30 ;8-bit mode
|
||||
lda #$81 ;%1000 0001
|
||||
stal $00C029 ;Turn on SHR mode
|
||||
rep #$30 ;back to 16-bit mode
|
||||
rts
|
||||
|
||||
****************************************
|
||||
* A= color values (0RGB) *
|
||||
* X= color/palette offset *
|
||||
* (0-F = pal0, 10-1F = pal1, etc.) *
|
||||
****************************************
|
||||
SetPaletteColor pha ;save accumulator
|
||||
txa
|
||||
asl ;X*2 = real offset to color table
|
||||
tax
|
||||
pla
|
||||
stal $E19E00,x ;palettes are stored from $E19E00-FF
|
||||
rts ;yup, that's it
|
||||
|
||||
****************************************
|
||||
* A= color values (0RGB) *
|
||||
****************************************
|
||||
ClearToColor ldx #$7D00 ;start at top of pixel data! ($2000-9D00)
|
||||
:clearloop dex
|
||||
dex
|
||||
stal $E12000,x ;screen location
|
||||
bne :clearloop ;loop until we've worked our way down to 0
|
||||
rts
|
||||
|
||||
SetSCBs ldx #$0100 ;set all $100 scbs to A
|
||||
:scbloop dex
|
||||
dex
|
||||
stal $E19D00,x
|
||||
bne :scbloop
|
||||
rts
|
||||
|
||||
WaitKey sep #$30
|
||||
:wait ldal $00c000
|
||||
bpl :wait
|
||||
stal $00c010
|
||||
rep #$30
|
||||
rts
|
||||
|
||||
use FONT ;include our font library
|
39
source/shrloadimg.m.s
Normal file
39
source/shrloadimg.m.s
Normal file
@ -0,0 +1,39 @@
|
||||
_TLStartUp MAC
|
||||
Tool $201
|
||||
<<<
|
||||
_MMStartUp MAC
|
||||
Tool $202
|
||||
<<<
|
||||
_NewHandle MAC
|
||||
Tool $902
|
||||
<<<
|
||||
_UnPackBytes MAC
|
||||
Tool $2703
|
||||
<<<
|
||||
_TLTextMountVol MAC
|
||||
Tool $1201
|
||||
<<<
|
||||
PushLong MAC
|
||||
IF #=]1
|
||||
PushWord #^]1
|
||||
ELSE
|
||||
PushWord ]1+2
|
||||
FIN
|
||||
PushWord ]1
|
||||
<<<
|
||||
PushWord MAC
|
||||
IF #=]1
|
||||
PEA ]1
|
||||
ELSE
|
||||
IF MX/2
|
||||
LDA ]1+1
|
||||
PHA
|
||||
FIN
|
||||
LDA ]1
|
||||
PHA
|
||||
FIN
|
||||
<<<
|
||||
Tool MAC
|
||||
LDX #]1
|
||||
JSL $E10000
|
||||
<<<
|
266
source/shrloadimg.s
Normal file
266
source/shrloadimg.s
Normal file
@ -0,0 +1,266 @@
|
||||
****************************************
|
||||
* SHRLOADIMG *
|
||||
* *
|
||||
* Dagen Brock <dagenbrock@gmail.com> *
|
||||
* 2013-07-21 *
|
||||
****************************************
|
||||
|
||||
rel ; Compile
|
||||
dsk SHRLOADIMG.l ; Save Name
|
||||
use shrloadimg.m
|
||||
mx %00 ; Program starts in 16-bit mode
|
||||
|
||||
****************************************
|
||||
* Basic Error Macro *
|
||||
****************************************
|
||||
_Err mac
|
||||
bcc NoErr
|
||||
do ]0 ; (DO if true)
|
||||
jsr PgmDeath ; this is conditionally compiled if
|
||||
str ]1 ; we pass in an error statement
|
||||
else ; (ELSE)
|
||||
jmp PgmDeath0 ; we just call the simpler error handler
|
||||
fin ; (FIN)
|
||||
NoErr eom
|
||||
|
||||
|
||||
****************************************
|
||||
* Program Start *
|
||||
****************************************
|
||||
phk ; Set Data Bank to Program Bank
|
||||
plb ; Always do this first!
|
||||
|
||||
|
||||
****************************************
|
||||
* Typical tool startup *
|
||||
****************************************
|
||||
_TLStartUp ; normal tool initialization
|
||||
pha
|
||||
_MMStartUp
|
||||
_Err ; should never happen
|
||||
pla
|
||||
sta MasterId ; our master handle references the memory allocated to us
|
||||
ora #$0100 ; set auxID = $01 (valid values $01-0f)
|
||||
sta UserId ; any memory we request must use our own id
|
||||
|
||||
****************************************
|
||||
* Initialize graphics *
|
||||
****************************************
|
||||
jsr AllocOneBank ; Alloc 64KB for Load/Unpack
|
||||
sta BankLoad ; Store "Bank Pointer"
|
||||
|
||||
ldx #ImageName ; Load+Unpack Boot Picture
|
||||
jsr LoadPicture ; X=Name, A=Bank to use for loading
|
||||
|
||||
lda BankLoad ; get address of loaded/uncompressed picture
|
||||
clc
|
||||
adc #$0080 ; skip header?
|
||||
sta :copySHR+2 ; and store that over the 'ldal' address below
|
||||
ldx #$7FFE ; copy all image data
|
||||
:copySHR ldal $000000,x ; load from BankLoad we allocated
|
||||
stal $E12000,x ; store to SHR screen
|
||||
dex
|
||||
dex
|
||||
bpl :copySHR
|
||||
|
||||
jsr GraphicsOn
|
||||
|
||||
jsr WaitKey
|
||||
|
||||
bra Quit
|
||||
|
||||
ImageName strl '1/KFEST2013.PAK'
|
||||
MasterId ds 2
|
||||
UserId ds 2
|
||||
BankLoad hex 0000 ; used for Load/Unpack
|
||||
|
||||
Quit jsl $E100A8 ; Prodos 16 entry point
|
||||
da $29 ; Quit code
|
||||
adrl QuitParm ; address of parameter table
|
||||
bcs Error ; never taken
|
||||
|
||||
Error brk ; should never get here
|
||||
|
||||
QuitParm adrl $0000 ; pointer to pathname (not used here)
|
||||
da $00 ; quit type (absolute quite)
|
||||
|
||||
****************************************
|
||||
* AllocOneBank *
|
||||
* This is a custom allocation function *
|
||||
* that makes use of the fact that we *
|
||||
* request an entire locked bank and so *
|
||||
* simply returns the bank in the *
|
||||
* accumulator. (basically dereference *
|
||||
* the Handle to get the pointer) *
|
||||
****************************************
|
||||
AllocOneBank PushLong #0
|
||||
PushLong #$10000
|
||||
PushWord UserId
|
||||
PushWord #%11000000_00011100
|
||||
PushLong #0
|
||||
_NewHandle ; returns LONG Handle on stack
|
||||
plx ; base address of the new handle
|
||||
pla ; high address 00XX of the new handle (bank)
|
||||
xba ; swap accumulator bytes to XX00
|
||||
sta :bank+2 ; store as bank for next op (overwrite $XX00)
|
||||
:bank ldal $000001,X ; recover the bank address in A=XX/00
|
||||
rts
|
||||
|
||||
****************************************
|
||||
* Graphics Helpers *
|
||||
****************************************
|
||||
LoadPicture jsr LoadFile ; X=Nom Image, A=Banc de chargement XX/00
|
||||
bcc :loadOK
|
||||
brl Exit
|
||||
:loadOK jsr UnpackPicture ; A=Packed Size
|
||||
rts
|
||||
|
||||
|
||||
UnpackPicture sta UP_PackedSize ; Size of Packed Data
|
||||
lda #$8000 ; Size of output Data Buffer
|
||||
sta UP_UnPackedSize
|
||||
lda BankLoad ; Banc de chargement / Decompression
|
||||
sta UP_Packed+1 ; Packed Data
|
||||
clc
|
||||
adc #$0080
|
||||
stz UP_UnPacked ; On remet a zero car modifie par l'appel
|
||||
stz UP_UnPacked+2
|
||||
sta UP_UnPacked+1 ; Unpacked Data buffer
|
||||
|
||||
PushWord #0 ; Space for Result : Number of bytes unpacked
|
||||
PushLong UP_Packed ; Pointer to buffer containing the packed data
|
||||
PushWord UP_PackedSize ; Size of the Packed Data
|
||||
PushLong #UP_UnPacked ; Pointer to Pointer to unpacked buffer
|
||||
PushLong #UP_UnPackedSize ; Pointer to a Word containing size of unpacked data
|
||||
_UnPackBytes
|
||||
pla ; Number of byte unpacked
|
||||
rts
|
||||
|
||||
UP_Packed hex 00000000 ; Address of Packed Data
|
||||
UP_PackedSize hex 0000 ; Size of Packed Data
|
||||
UP_UnPacked hex 00000000 ; Address of Unpacked Data Buffer (modified)
|
||||
UP_UnPackedSize hex 0000 ; Size of Unpacked Data Buffer (modified)
|
||||
|
||||
****************************************
|
||||
* Turn on SHR mode *
|
||||
****************************************
|
||||
GraphicsOn sep #$30 ; 8-bit mode
|
||||
lda #$C1
|
||||
stal $00C029 ; Turn on SHR mode
|
||||
rep #$30 ; back to 16-bit mode
|
||||
rts
|
||||
|
||||
WaitKey sep #$30
|
||||
:wait ldal $00C000
|
||||
bpl :wait
|
||||
stal $00C010
|
||||
rep #$30
|
||||
rts
|
||||
|
||||
|
||||
|
||||
****************************************
|
||||
* Fatal Error Handler *
|
||||
****************************************
|
||||
PgmDeath tax
|
||||
pla
|
||||
inc
|
||||
phx
|
||||
phk
|
||||
pha
|
||||
bra ContDeath
|
||||
PgmDeath0 pha
|
||||
pea $0000
|
||||
pea $0000
|
||||
ContDeath ldx #$1503
|
||||
jsl $E10000
|
||||
|
||||
|
||||
****************************************
|
||||
* Normal GSOS Quit *
|
||||
****************************************
|
||||
Exit jsl GSOS
|
||||
dw $2029
|
||||
adrl QuitGS
|
||||
|
||||
|
||||
****************************************
|
||||
* GS/OS / ProDOS 16 File Routines *
|
||||
****************************************
|
||||
GSOS = $E100A8
|
||||
|
||||
LoadFile stx OpenGS+4 ; X=File, A=Bank/Page XX/00
|
||||
sta ReadGS+5
|
||||
|
||||
:openFile jsl GSOS ; Open File
|
||||
dw $2010
|
||||
adrl OpenGS
|
||||
bcs :openReadErr
|
||||
lda OpenGS+2
|
||||
sta GetEOFGS+2
|
||||
sta ReadGS+2
|
||||
|
||||
jsl GSOS ; Get File Size
|
||||
dw $2019
|
||||
adrl GetEOFGS
|
||||
lda GetEOFGS+4
|
||||
sta ReadGS+8
|
||||
lda GetEOFGS+6
|
||||
sta ReadGS+10
|
||||
|
||||
jsl GSOS ; Read File Content
|
||||
dw $2012
|
||||
adrl ReadGS
|
||||
bcs :openReadErr
|
||||
|
||||
:closeFile jsl GSOS ; Close File
|
||||
dw $2014
|
||||
adrl CloseGS
|
||||
clc
|
||||
lda GetEOFGS+4 ; File Size
|
||||
rts
|
||||
|
||||
:openReadErr jsr :closeFile
|
||||
nop
|
||||
nop
|
||||
|
||||
PushWord #0
|
||||
PushLong #msgLine1
|
||||
PushLong #msgLine2
|
||||
PushLong #msgLine3
|
||||
PushLong #msgLine4
|
||||
_TLTextMountVol ; actualname is TLTextMountVolume
|
||||
pla
|
||||
cmp #1
|
||||
bne :loadFileErr
|
||||
brl :openFile
|
||||
:loadFileErr sec
|
||||
rts
|
||||
|
||||
msgLine1 str 'Unable to load File'
|
||||
msgLine2 str 'Press a key :'
|
||||
msgLine3 str ' -> Return to Try Again'
|
||||
msgLine4 str ' -> Esc to Quit'
|
||||
|
||||
|
||||
OpenGS dw 2 ; pCount
|
||||
ds 2 ; refNum
|
||||
adrl ImageName ; pathname
|
||||
|
||||
GetEOFGS dw 2 ; pCount
|
||||
ds 2 ; refNum
|
||||
ds 4 ; eof
|
||||
|
||||
ReadGS dw 4 ; pCount
|
||||
ds 2 ; refNum
|
||||
ds 4 ; dataBuffer
|
||||
ds 4 ; requestCount
|
||||
ds 4 ; transferCount
|
||||
|
||||
CloseGS dw 1 ; pCount
|
||||
ds 2 ; refNum
|
||||
|
||||
QuitGS dw 2 ; pCount
|
||||
ds 4 ; pathname
|
||||
ds 2 ; flags
|
||||
|
Loading…
Reference in New Issue
Block a user